/*
 * Copyright (C) 2013 Google Inc. All rights reserved.
 * Copyright (C) 2013-2016 Apple Inc. All rights reserved.
 * Copyright (C) 2014 University of Washington. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

// DO NOT EDIT THIS FILE. It is automatically generated from CombinedDomains.json
// by the script: Source/JavaScriptCore/inspector/scripts/generate-inspector-protocol-bindings.py

#pragma once

#if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)

#include "InspectorProtocolTypes.h"
#include <inspector/InspectorFrontendRouter.h>
#include <JavaScriptCore/InspectorBackendDispatcher.h>

namespace Inspector {

class AlternateBackendDispatcher {
public:
    void setBackendDispatcher(RefPtr<BackendDispatcher>&& dispatcher) { m_backendDispatcher = WTFMove(dispatcher); }
    BackendDispatcher* backendDispatcher() const { return m_backendDispatcher.get(); }
private:
    RefPtr<BackendDispatcher> m_backendDispatcher;
};


class AlternateApplicationCacheBackendDispatcher : public AlternateBackendDispatcher {
public:
    virtual ~AlternateApplicationCacheBackendDispatcher() { }
    virtual void getFramesWithManifests(long callId) = 0;
    virtual void enable(long callId) = 0;
    virtual void getManifestForFrame(long callId, const String& in_frameId) = 0;
    virtual void getApplicationCacheForFrame(long callId, const String& in_frameId) = 0;
};
class AlternateCSSBackendDispatcher : public AlternateBackendDispatcher {
public:
    virtual ~AlternateCSSBackendDispatcher() { }
    virtual void enable(long callId) = 0;
    virtual void disable(long callId) = 0;
    virtual void getMatchedStylesForNode(long callId, int in_nodeId, const bool* in_includePseudo, const bool* in_includeInherited) = 0;
    virtual void getInlineStylesForNode(long callId, int in_nodeId) = 0;
    virtual void getComputedStyleForNode(long callId, int in_nodeId) = 0;
    virtual void getAllStyleSheets(long callId) = 0;
    virtual void getStyleSheet(long callId, const String& in_styleSheetId) = 0;
    virtual void getStyleSheetText(long callId, const String& in_styleSheetId) = 0;
    virtual void setStyleSheetText(long callId, const String& in_styleSheetId, const String& in_text) = 0;
    virtual void setStyleText(long callId, const Inspector::InspectorObject& in_styleId, const String& in_text) = 0;
    virtual void setRuleSelector(long callId, const Inspector::InspectorObject& in_ruleId, const String& in_selector) = 0;
    virtual void createStyleSheet(long callId, const String& in_frameId) = 0;
    virtual void addRule(long callId, const String& in_styleSheetId, const String& in_selector) = 0;
    virtual void getSupportedCSSProperties(long callId) = 0;
    virtual void getSupportedSystemFontFamilyNames(long callId) = 0;
    virtual void forcePseudoState(long callId, int in_nodeId, const Inspector::InspectorArray& in_forcedPseudoClasses) = 0;
    virtual void getNamedFlowCollection(long callId, int in_documentNodeId) = 0;
};
class AlternateConsoleBackendDispatcher : public AlternateBackendDispatcher {
public:
    virtual ~AlternateConsoleBackendDispatcher() { }
    virtual void enable(long callId) = 0;
    virtual void disable(long callId) = 0;
    virtual void clearMessages(long callId) = 0;
    virtual void setMonitoringXHREnabled(long callId, bool in_enabled) = 0;
    virtual void addInspectedNode(long callId, int in_nodeId) = 0;
};
class AlternateDOMBackendDispatcher : public AlternateBackendDispatcher {
public:
    virtual ~AlternateDOMBackendDispatcher() { }
    virtual void getDocument(long callId) = 0;
    virtual void requestChildNodes(long callId, int in_nodeId, const int* in_depth) = 0;
    virtual void querySelector(long callId, int in_nodeId, const String& in_selector) = 0;
    virtual void querySelectorAll(long callId, int in_nodeId, const String& in_selector) = 0;
    virtual void setNodeName(long callId, int in_nodeId, const String& in_name) = 0;
    virtual void setNodeValue(long callId, int in_nodeId, const String& in_value) = 0;
    virtual void removeNode(long callId, int in_nodeId) = 0;
    virtual void setAttributeValue(long callId, int in_nodeId, const String& in_name, const String& in_value) = 0;
    virtual void setAttributesAsText(long callId, int in_nodeId, const String& in_text, const String* in_name) = 0;
    virtual void removeAttribute(long callId, int in_nodeId, const String& in_name) = 0;
    virtual void getEventListenersForNode(long callId, int in_nodeId, const String* in_objectGroup) = 0;
    virtual void getAccessibilityPropertiesForNode(long callId, int in_nodeId) = 0;
    virtual void getOuterHTML(long callId, int in_nodeId) = 0;
    virtual void setOuterHTML(long callId, int in_nodeId, const String& in_outerHTML) = 0;
    virtual void performSearch(long callId, const String& in_query, const Inspector::InspectorArray* in_nodeIds) = 0;
    virtual void getSearchResults(long callId, const String& in_searchId, int in_fromIndex, int in_toIndex) = 0;
    virtual void discardSearchResults(long callId, const String& in_searchId) = 0;
    virtual void requestNode(long callId, const String& in_objectId) = 0;
    virtual void setInspectModeEnabled(long callId, bool in_enabled, const Inspector::InspectorObject* in_highlightConfig) = 0;
    virtual void highlightRect(long callId, int in_x, int in_y, int in_width, int in_height, const Inspector::InspectorObject* in_color, const Inspector::InspectorObject* in_outlineColor, const bool* in_usePageCoordinates) = 0;
    virtual void highlightQuad(long callId, const Inspector::InspectorArray& in_quad, const Inspector::InspectorObject* in_color, const Inspector::InspectorObject* in_outlineColor, const bool* in_usePageCoordinates) = 0;
    virtual void highlightSelector(long callId, const Inspector::InspectorObject& in_highlightConfig, const String& in_selectorString, const String* in_frameId) = 0;
    virtual void highlightNode(long callId, const Inspector::InspectorObject& in_highlightConfig, const int* in_nodeId, const String* in_objectId) = 0;
    virtual void hideHighlight(long callId) = 0;
    virtual void highlightFrame(long callId, const String& in_frameId, const Inspector::InspectorObject* in_contentColor, const Inspector::InspectorObject* in_contentOutlineColor) = 0;
    virtual void pushNodeByPathToFrontend(long callId, const String& in_path) = 0;
    virtual void pushNodeByBackendIdToFrontend(long callId, int in_backendNodeId) = 0;
    virtual void releaseBackendNodeIds(long callId, const String& in_nodeGroup) = 0;
    virtual void resolveNode(long callId, int in_nodeId, const String* in_objectGroup) = 0;
    virtual void getAttributes(long callId, int in_nodeId) = 0;
    virtual void moveTo(long callId, int in_nodeId, int in_targetNodeId, const int* in_insertBeforeNodeId) = 0;
    virtual void undo(long callId) = 0;
    virtual void redo(long callId) = 0;
    virtual void markUndoableState(long callId) = 0;
    virtual void focus(long callId, int in_nodeId) = 0;
};
class AlternateDOMDebuggerBackendDispatcher : public AlternateBackendDispatcher {
public:
    virtual ~AlternateDOMDebuggerBackendDispatcher() { }
    virtual void setDOMBreakpoint(long callId, int in_nodeId, const String& in_type) = 0;
    virtual void removeDOMBreakpoint(long callId, int in_nodeId, const String& in_type) = 0;
    virtual void setEventListenerBreakpoint(long callId, const String& in_eventName) = 0;
    virtual void removeEventListenerBreakpoint(long callId, const String& in_eventName) = 0;
    virtual void setInstrumentationBreakpoint(long callId, const String& in_eventName) = 0;
    virtual void removeInstrumentationBreakpoint(long callId, const String& in_eventName) = 0;
    virtual void setXHRBreakpoint(long callId, const String& in_url) = 0;
    virtual void removeXHRBreakpoint(long callId, const String& in_url) = 0;
};
class AlternateDOMStorageBackendDispatcher : public AlternateBackendDispatcher {
public:
    virtual ~AlternateDOMStorageBackendDispatcher() { }
    virtual void enable(long callId) = 0;
    virtual void disable(long callId) = 0;
    virtual void getDOMStorageItems(long callId, const Inspector::InspectorObject& in_storageId) = 0;
    virtual void setDOMStorageItem(long callId, const Inspector::InspectorObject& in_storageId, const String& in_key, const String& in_value) = 0;
    virtual void removeDOMStorageItem(long callId, const Inspector::InspectorObject& in_storageId, const String& in_key) = 0;
};
class AlternateDatabaseBackendDispatcher : public AlternateBackendDispatcher {
public:
    virtual ~AlternateDatabaseBackendDispatcher() { }
    virtual void enable(long callId) = 0;
    virtual void disable(long callId) = 0;
    virtual void getDatabaseTableNames(long callId, const String& in_databaseId) = 0;
    virtual void executeSQL(long callId, const String& in_databaseId, const String& in_query) = 0;
};
class AlternateDebuggerBackendDispatcher : public AlternateBackendDispatcher {
public:
    virtual ~AlternateDebuggerBackendDispatcher() { }
    virtual void enable(long callId) = 0;
    virtual void disable(long callId) = 0;
    virtual void setBreakpointsActive(long callId, bool in_active) = 0;
    virtual void setBreakpointByUrl(long callId, int in_lineNumber, const String* in_url, const String* in_urlRegex, const int* in_columnNumber, const Inspector::InspectorObject* in_options) = 0;
    virtual void setBreakpoint(long callId, const Inspector::InspectorObject& in_location, const Inspector::InspectorObject* in_options) = 0;
    virtual void removeBreakpoint(long callId, const String& in_breakpointId) = 0;
    virtual void continueToLocation(long callId, const Inspector::InspectorObject& in_location) = 0;
    virtual void stepOver(long callId) = 0;
    virtual void stepInto(long callId) = 0;
    virtual void stepOut(long callId) = 0;
    virtual void pause(long callId) = 0;
    virtual void resume(long callId) = 0;
    virtual void searchInContent(long callId, const String& in_scriptId, const String& in_query, const bool* in_caseSensitive, const bool* in_isRegex) = 0;
    virtual void getScriptSource(long callId, const String& in_scriptId) = 0;
    virtual void getFunctionDetails(long callId, const String& in_functionId) = 0;
    virtual void setPauseOnExceptions(long callId, const String& in_state) = 0;
    virtual void evaluateOnCallFrame(long callId, const String& in_callFrameId, const String& in_expression, const String* in_objectGroup, const bool* in_includeCommandLineAPI, const bool* in_doNotPauseOnExceptionsAndMuteConsole, const bool* in_returnByValue, const bool* in_generatePreview, const bool* in_saveResult) = 0;
    virtual void setOverlayMessage(long callId, const String* in_message) = 0;
};
class AlternateHeapBackendDispatcher : public AlternateBackendDispatcher {
public:
    virtual ~AlternateHeapBackendDispatcher() { }
    virtual void enable(long callId) = 0;
    virtual void disable(long callId) = 0;
    virtual void gc(long callId) = 0;
    virtual void snapshot(long callId) = 0;
    virtual void startTracking(long callId) = 0;
    virtual void stopTracking(long callId) = 0;
    virtual void getPreview(long callId, int in_heapObjectId) = 0;
    virtual void getRemoteObject(long callId, int in_heapObjectId, const String* in_objectGroup) = 0;
};
class AlternateInspectorBackendDispatcher : public AlternateBackendDispatcher {
public:
    virtual ~AlternateInspectorBackendDispatcher() { }
    virtual void enable(long callId) = 0;
    virtual void disable(long callId) = 0;
    virtual void initialized(long callId) = 0;
};
class AlternateLayerTreeBackendDispatcher : public AlternateBackendDispatcher {
public:
    virtual ~AlternateLayerTreeBackendDispatcher() { }
    virtual void enable(long callId) = 0;
    virtual void disable(long callId) = 0;
    virtual void layersForNode(long callId, int in_nodeId) = 0;
    virtual void reasonsForCompositingLayer(long callId, const String& in_layerId) = 0;
};
class AlternateNetworkBackendDispatcher : public AlternateBackendDispatcher {
public:
    virtual ~AlternateNetworkBackendDispatcher() { }
    virtual void enable(long callId) = 0;
    virtual void disable(long callId) = 0;
    virtual void setExtraHTTPHeaders(long callId, const Inspector::InspectorObject& in_headers) = 0;
    virtual void getResponseBody(long callId, const String& in_requestId) = 0;
    virtual void setCacheDisabled(long callId, bool in_cacheDisabled) = 0;
    virtual void loadResource(long callId, const String& in_frameId, const String& in_url) = 0;
};
class AlternatePageBackendDispatcher : public AlternateBackendDispatcher {
public:
    virtual ~AlternatePageBackendDispatcher() { }
    virtual void enable(long callId) = 0;
    virtual void disable(long callId) = 0;
    virtual void addScriptToEvaluateOnLoad(long callId, const String& in_scriptSource) = 0;
    virtual void removeScriptToEvaluateOnLoad(long callId, const String& in_identifier) = 0;
    virtual void reload(long callId, const bool* in_ignoreCache, const String* in_scriptToEvaluateOnLoad) = 0;
    virtual void navigate(long callId, const String& in_url) = 0;
    virtual void getCookies(long callId) = 0;
    virtual void deleteCookie(long callId, const String& in_cookieName, const String& in_url) = 0;
    virtual void getResourceTree(long callId) = 0;
    virtual void getResourceContent(long callId, const String& in_frameId, const String& in_url) = 0;
    virtual void searchInResource(long callId, const String& in_frameId, const String& in_url, const String& in_query, const bool* in_caseSensitive, const bool* in_isRegex, const String* in_requestId) = 0;
    virtual void searchInResources(long callId, const String& in_text, const bool* in_caseSensitive, const bool* in_isRegex) = 0;
    virtual void setDocumentContent(long callId, const String& in_frameId, const String& in_html) = 0;
    virtual void setShowPaintRects(long callId, bool in_result) = 0;
    virtual void getScriptExecutionStatus(long callId) = 0;
    virtual void setScriptExecutionDisabled(long callId, bool in_value) = 0;
    virtual void setTouchEmulationEnabled(long callId, bool in_enabled) = 0;
    virtual void setEmulatedMedia(long callId, const String& in_media) = 0;
    virtual void getCompositingBordersVisible(long callId) = 0;
    virtual void setCompositingBordersVisible(long callId, bool in_visible) = 0;
    virtual void snapshotNode(long callId, int in_nodeId) = 0;
    virtual void snapshotRect(long callId, int in_x, int in_y, int in_width, int in_height, const String& in_coordinateSystem) = 0;
    virtual void handleJavaScriptDialog(long callId, bool in_accept, const String* in_promptText) = 0;
    virtual void archive(long callId) = 0;
};
class AlternateRuntimeBackendDispatcher : public AlternateBackendDispatcher {
public:
    virtual ~AlternateRuntimeBackendDispatcher() { }
    virtual void parse(long callId, const String& in_source) = 0;
    virtual void evaluate(long callId, const String& in_expression, const String* in_objectGroup, const bool* in_includeCommandLineAPI, const bool* in_doNotPauseOnExceptionsAndMuteConsole, const int* in_contextId, const bool* in_returnByValue, const bool* in_generatePreview, const bool* in_saveResult) = 0;
    virtual void callFunctionOn(long callId, const String& in_objectId, const String& in_functionDeclaration, const Inspector::InspectorArray* in_arguments, const bool* in_doNotPauseOnExceptionsAndMuteConsole, const bool* in_returnByValue, const bool* in_generatePreview) = 0;
    virtual void getProperties(long callId, const String& in_objectId, const bool* in_ownProperties, const bool* in_generatePreview) = 0;
    virtual void getDisplayableProperties(long callId, const String& in_objectId, const bool* in_generatePreview) = 0;
    virtual void getCollectionEntries(long callId, const String& in_objectId, const String* in_objectGroup, const int* in_startIndex, const int* in_numberToFetch) = 0;
    virtual void saveResult(long callId, const Inspector::InspectorObject& in_value, const int* in_contextId) = 0;
    virtual void releaseObject(long callId, const String& in_objectId) = 0;
    virtual void releaseObjectGroup(long callId, const String& in_objectGroup) = 0;
    virtual void enable(long callId) = 0;
    virtual void disable(long callId) = 0;
    virtual void getRuntimeTypesForVariablesAtOffsets(long callId, const Inspector::InspectorArray& in_locations) = 0;
    virtual void enableTypeProfiler(long callId) = 0;
    virtual void disableTypeProfiler(long callId) = 0;
    virtual void enableControlFlowProfiler(long callId) = 0;
    virtual void disableControlFlowProfiler(long callId) = 0;
    virtual void getBasicBlocks(long callId, const String& in_sourceID) = 0;
};
class AlternateScriptProfilerBackendDispatcher : public AlternateBackendDispatcher {
public:
    virtual ~AlternateScriptProfilerBackendDispatcher() { }
    virtual void startTracking(long callId, const bool* in_includeSamples) = 0;
    virtual void stopTracking(long callId) = 0;
};
class AlternateTimelineBackendDispatcher : public AlternateBackendDispatcher {
public:
    virtual ~AlternateTimelineBackendDispatcher() { }
    virtual void start(long callId, const int* in_maxCallStackDepth) = 0;
    virtual void stop(long callId) = 0;
    virtual void setAutoCaptureEnabled(long callId, bool in_enabled) = 0;
    virtual void setInstruments(long callId, const Inspector::InspectorArray& in_instruments) = 0;
};

} // namespace Inspector

#endif // ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
