# Copyright 2017 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

version
  major 1
  minor 3

# This domain is deprecated - use Runtime or Log instead.
deprecated domain Console
  depends on Runtime

  # Console message.
  type ConsoleMessage extends object
    properties
      # Message source.
      enum source
        xml
        javascript
        network
        console-api
        storage
        appcache
        rendering
        security
        other
        deprecation
        worker
      # Message severity.
      enum level
        log
        warning
        error
        debug
        info
      # Message text.
      string text
      # URL of the message origin.
      optional string url
      # Line number in the resource that generated this message (1-based).
      optional integer line
      # Column number in the resource that generated this message (1-based).
      optional integer column

  # Does nothing.
  command clearMessages

  # Disables console domain, prevents further console messages from being reported to the client.
  command disable

  # Enables console domain, sends the messages collected so far to the client by means of the
  # `messageAdded` notification.
  command enable

  # Issued when new console message is added.
  event messageAdded
    parameters
      # Console message that has been added.
      ConsoleMessage message

# Debugger domain exposes JavaScript debugging capabilities. It allows setting and removing
# breakpoints, stepping through execution, exploring stack traces, etc.
domain Debugger
  depends on Runtime

  # Breakpoint identifier.
  type BreakpointId extends string

  # Call frame identifier.
  type CallFrameId extends string

  # Location in the source code.
  type Location extends object
    properties
      # Script identifier as reported in the `Debugger.scriptParsed`.
      Runtime.ScriptId scriptId
      # Line number in the script (0-based).
      integer lineNumber
      # Column number in the script (0-based).
      optional integer columnNumber

  # Location in the source code.
  experimental type ScriptPosition extends object
    properties
      integer lineNumber
      integer columnNumber

  # Location range within one script.
  experimental type LocationRange extends object
    properties
      Runtime.ScriptId scriptId
      ScriptPosition start
      ScriptPosition end

  # JavaScript call frame. Array of call frames form the call stack.
  type CallFrame extends object
    properties
      # Call frame identifier. This identifier is only valid while the virtual machine is paused.
      CallFrameId callFrameId
      # Name of the JavaScript function called on this call frame.
      string functionName
      # Location in the source code.
      optional Location functionLocation
      # Location in the source code.
      Location location
      # JavaScript script name or url.
      string url
      # Scope chain for this call frame.
      array of Scope scopeChain
      # `this` object for this call frame.
      Runtime.RemoteObject this
      # The value being returned, if the function is at return point.
      optional Runtime.RemoteObject returnValue

  # Scope description.
  type Scope extends object
    properties
      # Scope type.
      enum type
        global
        local
        with
        closure
        catch
        block
        script
        eval
        module
        wasm-expression-stack
      # Object representing the scope. For `global` and `with` scopes it represents the actual
      # object; for the rest of the scopes, it is artificial transient object enumerating scope
      # variables as its properties.
      Runtime.RemoteObject object
      optional string name
      # Location in the source code where scope starts
      optional Location startLocation
      # Location in the source code where scope ends
      optional Location endLocation

  # Search match for resource.
  type SearchMatch extends object
    properties
      # Line number in resource content.
      number lineNumber
      # Line with match content.
      string lineContent

  type BreakLocation extends object
    properties
      # Script identifier as reported in the `Debugger.scriptParsed`.
      Runtime.ScriptId scriptId
      # Line number in the script (0-based).
      integer lineNumber
      # Column number in the script (0-based).
      optional integer columnNumber
      optional enum type
        debuggerStatement
        call
        return

  # Continues execution until specific location is reached.
  command continueToLocation
    parameters
      # Location to continue to.
      Location location
      optional enum targetCallFrames
        any
        current

  # Disables debugger for given page.
  command disable

  # Enables debugger for the given page. Clients should not assume that the debugging has been
  # enabled until the result for this command is received.
  command enable
    parameters
      # The maximum size in bytes of collected scripts (not referenced by other heap objects)
      # the debugger can hold. Puts no limit if paramter is omitted.
      experimental optional number maxScriptsCacheSize
    returns
      # Unique identifier of the debugger.
      experimental Runtime.UniqueDebuggerId debuggerId

  # Evaluates expression on a given call frame.
  command evaluateOnCallFrame
    parameters
      # Call frame identifier to evaluate on.
      CallFrameId callFrameId
      # Expression to evaluate.
      string expression
      # String object group name to put result into (allows rapid releasing resulting object handles
      # using `releaseObjectGroup`).
      optional string objectGroup
      # Specifies whether command line API should be available to the evaluated expression, defaults
      # to false.
      optional boolean includeCommandLineAPI
      # In silent mode exceptions thrown during evaluation are not reported and do not pause
      # execution. Overrides `setPauseOnException` state.
      optional boolean silent
      # Whether the result is expected to be a JSON object that should be sent by value.
      optional boolean returnByValue
      # Whether preview should be generated for the result.
      experimental optional boolean generatePreview
      # Whether to throw an exception if side effect cannot be ruled out during evaluation.
      optional boolean throwOnSideEffect
      # Terminate execution after timing out (number of milliseconds).
      experimental optional Runtime.TimeDelta timeout
    returns
      # Object wrapper for the evaluation result.
      Runtime.RemoteObject result
      # Exception details.
      optional Runtime.ExceptionDetails exceptionDetails

  # Execute a Wasm Evaluator module on a given call frame.
  experimental command executeWasmEvaluator
    parameters
      # WebAssembly call frame identifier to evaluate on.
      CallFrameId callFrameId
      # Code of the evaluator module.
      binary evaluator
      # Terminate execution after timing out (number of milliseconds).
      experimental optional Runtime.TimeDelta timeout
    returns
      # Object wrapper for the evaluation result.
      Runtime.RemoteObject result
      # Exception details.
      optional Runtime.ExceptionDetails exceptionDetails

  # Returns possible locations for breakpoint. scriptId in start and end range locations should be
  # the same.
  command getPossibleBreakpoints
    parameters
      # Start of range to search possible breakpoint locations in.
      Location start
      # End of range to search possible breakpoint locations in (excluding). When not specified, end
      # of scripts is used as end of range.
      optional Location end
      # Only consider locations which are in the same (non-nested) function as start.
      optional boolean restrictToFunction
    returns
      # List of the possible breakpoint locations.
      array of BreakLocation locations

  # Returns source for the script with given id.
  command getScriptSource
    parameters
      # Id of the script to get source for.
      Runtime.ScriptId scriptId
    returns
      # Script source (empty in case of Wasm bytecode).
      string scriptSource
      # Wasm bytecode.
      optional binary bytecode

  # This command is deprecated. Use getScriptSource instead.
  deprecated command getWasmBytecode
    parameters
      # Id of the Wasm script to get source for.
      Runtime.ScriptId scriptId
    returns
      # Script source.
      binary bytecode

  # Returns stack trace with given `stackTraceId`.
  experimental command getStackTrace
    parameters
      Runtime.StackTraceId stackTraceId
    returns
      Runtime.StackTrace stackTrace

  # Stops on the next JavaScript statement.
  command pause

  experimental deprecated command pauseOnAsyncCall
    parameters
      # Debugger will pause when async call with given stack trace is started.
      Runtime.StackTraceId parentStackTraceId

  # Removes JavaScript breakpoint.
  command removeBreakpoint
    parameters
      BreakpointId breakpointId

  # Restarts particular call frame from the beginning.
  command restartFrame
    parameters
      # Call frame identifier to evaluate on.
      CallFrameId callFrameId
    returns
      # New stack trace.
      array of CallFrame callFrames
      # Async stack trace, if any.
      optional Runtime.StackTrace asyncStackTrace
      # Async stack trace, if any.
      experimental optional Runtime.StackTraceId asyncStackTraceId

  # Resumes JavaScript execution.
  command resume
    parameters
      # Set to true to terminate execution upon resuming execution. In contrast
      # to Runtime.terminateExecution, this will allows to execute further
      # JavaScript (i.e. via evaluation) until execution of the paused code
      # is actually resumed, at which point termination is triggered.
      # If execution is currently not paused, this parameter has no effect.
      optional boolean terminateOnResume

  # Searches for given string in script content.
  command searchInContent
    parameters
      # Id of the script to search in.
      Runtime.ScriptId scriptId
      # String to search for.
      string query
      # If true, search is case sensitive.
      optional boolean caseSensitive
      # If true, treats string parameter as regex.
      optional boolean isRegex
    returns
      # List of search matches.
      array of SearchMatch result

  # Enables or disables async call stacks tracking.
  command setAsyncCallStackDepth
    parameters
      # Maximum depth of async call stacks. Setting to `0` will effectively disable collecting async
      # call stacks (default).
      integer maxDepth

  # Replace previous blackbox patterns with passed ones. Forces backend to skip stepping/pausing in
  # scripts with url matching one of the patterns. VM will try to leave blackboxed script by
  # performing 'step in' several times, finally resorting to 'step out' if unsuccessful.
  experimental command setBlackboxPatterns
    parameters
      # Array of regexps that will be used to check script url for blackbox state.
      array of string patterns

  # Makes backend skip steps in the script in blackboxed ranges. VM will try leave blacklisted
  # scripts by performing 'step in' several times, finally resorting to 'step out' if unsuccessful.
  # Positions array contains positions where blackbox state is changed. First interval isn't
  # blackboxed. Array should be sorted.
  experimental command setBlackboxedRanges
    parameters
      # Id of the script.
      Runtime.ScriptId scriptId
      array of ScriptPosition positions

  # Sets JavaScript breakpoint at a given location.
  command setBreakpoint
    parameters
      # Location to set breakpoint in.
      Location location
      # Expression to use as a breakpoint condition. When specified, debugger will only stop on the
      # breakpoint if this expression evaluates to true.
      optional string condition
    returns
      # Id of the created breakpoint for further reference.
      BreakpointId breakpointId
      # Location this breakpoint resolved into.
      Location actualLocation

  # Sets instrumentation breakpoint.
  command setInstrumentationBreakpoint
    parameters
      # Instrumentation name.
      enum instrumentation
        beforeScriptExecution
        beforeScriptWithSourceMapExecution
    returns
      # Id of the created breakpoint for further reference.
      BreakpointId breakpointId

  # Sets JavaScript breakpoint at given location specified either by URL or URL regex. Once this
  # command is issued, all existing parsed scripts will have breakpoints resolved and returned in
  # `locations` property. Further matching script parsing will result in subsequent
  # `breakpointResolved` events issued. This logical breakpoint will survive page reloads.
  command setBreakpointByUrl
    parameters
      # Line number to set breakpoint at.
      integer lineNumber
      # URL of the resources to set breakpoint on.
      optional string url
      # Regex pattern for the URLs of the resources to set breakpoints on. Either `url` or
      # `urlRegex` must be specified.
      optional string urlRegex
      # Script hash of the resources to set breakpoint on.
      optional string scriptHash
      # Offset in the line to set breakpoint at.
      optional integer columnNumber
      # Expression to use as a breakpoint condition. When specified, debugger will only stop on the
      # breakpoint if this expression evaluates to true.
      optional string condition
    returns
      # Id of the created breakpoint for further reference.
      BreakpointId breakpointId
      # List of the locations this breakpoint resolved into upon addition.
      array of Location locations

  # Sets JavaScript breakpoint before each call to the given function.
  # If another function was created from the same source as a given one,
  # calling it will also trigger the breakpoint.
  experimental command setBreakpointOnFunctionCall
    parameters
      # Function object id.
      Runtime.RemoteObjectId objectId
      # Expression to use as a breakpoint condition. When specified, debugger will
      # stop on the breakpoint if this expression evaluates to true.
      optional string condition
    returns
      # Id of the created breakpoint for further reference.
      BreakpointId breakpointId

  # Activates / deactivates all breakpoints on the page.
  command setBreakpointsActive
    parameters
      # New value for breakpoints active state.
      boolean active

  # Defines pause on exceptions state. Can be set to stop on all exceptions, uncaught exceptions or
  # no exceptions. Initial pause on exceptions state is `none`.
  command setPauseOnExceptions
    parameters
      # Pause on exceptions mode.
      enum state
        none
        uncaught
        all

  # Changes return value in top frame. Available only at return break position.
  experimental command setReturnValue
    parameters
      # New return value.
      Runtime.CallArgument newValue

  # Edits JavaScript source live.
  command setScriptSource
    parameters
      # Id of the script to edit.
      Runtime.ScriptId scriptId
      # New content of the script.
      string scriptSource
      #  If true the change will not actually be applied. Dry run may be used to get result
      # description without actually modifying the code.
      optional boolean dryRun
    returns
      # New stack trace in case editing has happened while VM was stopped.
      optional array of CallFrame callFrames
      # Whether current call stack  was modified after applying the changes.
      optional boolean stackChanged
      # Async stack trace, if any.
      optional Runtime.StackTrace asyncStackTrace
      # Async stack trace, if any.
      experimental optional Runtime.StackTraceId asyncStackTraceId
      # Exception details if any.
      optional Runtime.ExceptionDetails exceptionDetails

  # Makes page not interrupt on any pauses (breakpoint, exception, dom exception etc).
  command setSkipAllPauses
    parameters
      # New value for skip pauses state.
      boolean skip

  # Changes value of variable in a callframe. Object-based scopes are not supported and must be
  # mutated manually.
  command setVariableValue
    parameters
      # 0-based number of scope as was listed in scope chain. Only 'local', 'closure' and 'catch'
      # scope types are allowed. Other scopes could be manipulated manually.
      integer scopeNumber
      # Variable name.
      string variableName
      # New variable value.
      Runtime.CallArgument newValue
      # Id of callframe that holds variable.
      CallFrameId callFrameId

  # Steps into the function call.
  command stepInto
    parameters
      # Debugger will pause on the execution of the first async task which was scheduled
      # before next pause.
      experimental optional boolean breakOnAsyncCall
      # The skipList specifies location ranges that should be skipped on step into.
      experimental optional array of LocationRange skipList

  # Steps out of the function call.
  command stepOut

  # Steps over the statement.
  command stepOver
    parameters
      # The skipList specifies location ranges that should be skipped on step over.
      experimental optional array of LocationRange skipList

  # Fired when breakpoint is resolved to an actual script and location.
  event breakpointResolved
    parameters
      # Breakpoint unique identifier.
      BreakpointId breakpointId
      # Actual breakpoint location.
      Location location

  # Fired when the virtual machine stopped on breakpoint or exception or any other stop criteria.
  event paused
    parameters
      # Call stack the virtual machine stopped on.
      array of CallFrame callFrames
      # Pause reason.
      enum reason
        ambiguous
        assert
        debugCommand
        DOM
        EventListener
        exception
        instrumentation
        OOM
        other
        promiseRejection
        XHR
      # Object containing break-specific auxiliary properties.
      optional object data
      # Hit breakpoints IDs
      optional array of string hitBreakpoints
      # Async stack trace, if any.
      optional Runtime.StackTrace asyncStackTrace
      # Async stack trace, if any.
      experimental optional Runtime.StackTraceId asyncStackTraceId
      # Never present, will be removed.
      experimental deprecated optional Runtime.StackTraceId asyncCallStackTraceId

  # Fired when the virtual machine resumed execution.
  event resumed

  # Enum of possible script languages.
  type ScriptLanguage extends string
    enum
      JavaScript
      WebAssembly

  # Debug symbols available for a wasm script.
  type DebugSymbols extends object
    properties
      # Type of the debug symbols.
      enum type
        None
        SourceMap
        EmbeddedDWARF
        ExternalDWARF
      # URL of the external symbol source.
      optional string externalURL

  # Fired when virtual machine fails to parse the script.
  event scriptFailedToParse
    parameters
      # Identifier of the script parsed.
      Runtime.ScriptId scriptId
      # URL or name of the script parsed (if any).
      string url
      # Line offset of the script within the resource with given URL (for script tags).
      integer startLine
      # Column offset of the script within the resource with given URL.
      integer startColumn
      # Last line of the script.
      integer endLine
      # Length of the last line of the script.
      integer endColumn
      # Specifies script creation context.
      Runtime.ExecutionContextId executionContextId
      # Content hash of the script.
      string hash
      # Embedder-specific auxiliary data.
      optional object executionContextAuxData
      # URL of source map associated with script (if any).
      optional string sourceMapURL
      # True, if this script has sourceURL.
      optional boolean hasSourceURL
      # True, if this script is ES6 module.
      optional boolean isModule
      # This script length.
      optional integer length
      # JavaScript top stack frame of where the script parsed event was triggered if available.
      experimental optional Runtime.StackTrace stackTrace
      # If the scriptLanguage is WebAssembly, the code section offset in the module.
      experimental optional integer codeOffset
      # The language of the script.
      experimental optional Debugger.ScriptLanguage scriptLanguage
      # The name the embedder supplied for this script.
      experimental optional string embedderName

  # Fired when virtual machine parses script. This event is also fired for all known and uncollected
  # scripts upon enabling debugger.
  event scriptParsed
    parameters
      # Identifier of the script parsed.
      Runtime.ScriptId scriptId
      # URL or name of the script parsed (if any).
      string url
      # Line offset of the script within the resource with given URL (for script tags).
      integer startLine
      # Column offset of the script within the resource with given URL.
      integer startColumn
      # Last line of the script.
      integer endLine
      # Length of the last line of the script.
      integer endColumn
      # Specifies script creation context.
      Runtime.ExecutionContextId executionContextId
      # Content hash of the script.
      string hash
      # Embedder-specific auxiliary data.
      optional object executionContextAuxData
      # True, if this script is generated as a result of the live edit operation.
      experimental optional boolean isLiveEdit
      # URL of source map associated with script (if any).
      optional string sourceMapURL
      # True, if this script has sourceURL.
      optional boolean hasSourceURL
      # True, if this script is ES6 module.
      optional boolean isModule
      # This script length.
      optional integer length
      # JavaScript top stack frame of where the script parsed event was triggered if available.
      experimental optional Runtime.StackTrace stackTrace
      # If the scriptLanguage is WebAssembly, the code section offset in the module.
      experimental optional integer codeOffset
      # The language of the script.
      experimental optional Debugger.ScriptLanguage scriptLanguage
      # If the scriptLanguage is WebASsembly, the source of debug symbols for the module.
      experimental optional Debugger.DebugSymbols debugSymbols
      # The name the embedder supplied for this script.
      experimental optional string embedderName

experimental domain HeapProfiler
  depends on Runtime

  # Heap snapshot object id.
  type HeapSnapshotObjectId extends string

  # Sampling Heap Profile node. Holds callsite information, allocation statistics and child nodes.
  type SamplingHeapProfileNode extends object
    properties
      # Function location.
      Runtime.CallFrame callFrame
      # Allocations size in bytes for the node excluding children.
      number selfSize
      # Node id. Ids are unique across all profiles collected between startSampling and stopSampling.
      integer id
      # Child nodes.
      array of SamplingHeapProfileNode children

  # A single sample from a sampling profile.
  type SamplingHeapProfileSample extends object
    properties
      # Allocation size in bytes attributed to the sample.
      number size
      # Id of the corresponding profile tree node.
      integer nodeId
      # Time-ordered sample ordinal number. It is unique across all profiles retrieved
      # between startSampling and stopSampling.
      number ordinal

  # Sampling profile.
  type SamplingHeapProfile extends object
    properties
      SamplingHeapProfileNode head
      array of SamplingHeapProfileSample samples

  # Enables console to refer to the node with given id via $x (see Command Line API for more details
  # $x functions).
  command addInspectedHeapObject
    parameters
      # Heap snapshot object id to be accessible by means of $x command line API.
      HeapSnapshotObjectId heapObjectId

  command collectGarbage

  command disable

  command enable

  command getHeapObjectId
    parameters
      # Identifier of the object to get heap object id for.
      Runtime.RemoteObjectId objectId
    returns
      # Id of the heap snapshot object corresponding to the passed remote object id.
      HeapSnapshotObjectId heapSnapshotObjectId

  command getObjectByHeapObjectId
    parameters
      HeapSnapshotObjectId objectId
      # Symbolic group name that can be used to release multiple objects.
      optional string objectGroup
    returns
      # Evaluation result.
      Runtime.RemoteObject result

  command getSamplingProfile
    returns
      # Return the sampling profile being collected.
      SamplingHeapProfile profile

  command startSampling
    parameters
      # Average sample interval in bytes. Poisson distribution is used for the intervals. The
      # default value is 32768 bytes.
      optional number samplingInterval

  command startTrackingHeapObjects
    parameters
      optional boolean trackAllocations

  command stopSampling
    returns
      # Recorded sampling heap profile.
      SamplingHeapProfile profile

  command stopTrackingHeapObjects
    parameters
      # If true 'reportHeapSnapshotProgress' events will be generated while snapshot is being taken
      # when the tracking is stopped.
      optional boolean reportProgress
      optional boolean treatGlobalObjectsAsRoots

  command takeHeapSnapshot
    parameters
      # If true 'reportHeapSnapshotProgress' events will be generated while snapshot is being taken.
      optional boolean reportProgress
      # If true, a raw snapshot without artifical roots will be generated
      optional boolean treatGlobalObjectsAsRoots

  event addHeapSnapshotChunk
    parameters
      string chunk

  # If heap objects tracking has been started then backend may send update for one or more fragments
  event heapStatsUpdate
    parameters
      # An array of triplets. Each triplet describes a fragment. The first integer is the fragment
      # index, the second integer is a total count of objects for the fragment, the third integer is
      # a total size of the objects for the fragment.
      array of integer statsUpdate

  # If heap objects tracking has been started then backend regularly sends a current value for last
  # seen object id and corresponding timestamp. If the were changes in the heap since last event
  # then one or more heapStatsUpdate events will be sent before a new lastSeenObjectId event.
  event lastSeenObjectId
    parameters
      integer lastSeenObjectId
      number timestamp

  event reportHeapSnapshotProgress
    parameters
      integer done
      integer total
      optional boolean finished

  event resetProfiles

domain Profiler
  depends on Runtime
  depends on Debugger

  # Profile node. Holds callsite information, execution statistics and child nodes.
  type ProfileNode extends object
    properties
      # Unique id of the node.
      integer id
      # Function location.
      Runtime.CallFrame callFrame
      # Number of samples where this node was on top of the call stack.
      optional integer hitCount
      # Child node ids.
      optional array of integer children
      # The reason of being not optimized. The function may be deoptimized or marked as don't
      # optimize.
      optional string deoptReason
      # An array of source position ticks.
      optional array of PositionTickInfo positionTicks

  # Profile.
  type Profile extends object
    properties
      # The list of profile nodes. First item is the root node.
      array of ProfileNode nodes
      # Profiling start timestamp in microseconds.
      number startTime
      # Profiling end timestamp in microseconds.
      number endTime
      # Ids of samples top nodes.
      optional array of integer samples
      # Time intervals between adjacent samples in microseconds. The first delta is relative to the
      # profile startTime.
      optional array of integer timeDeltas

  # Specifies a number of samples attributed to a certain source position.
  type PositionTickInfo extends object
    properties
      # Source line number (1-based).
      integer line
      # Number of samples attributed to the source line.
      integer ticks

  # Coverage data for a source range.
  type CoverageRange extends object
    properties
      # JavaScript script source offset for the range start.
      integer startOffset
      # JavaScript script source offset for the range end.
      integer endOffset
      # Collected execution count of the source range.
      integer count

  # Coverage data for a JavaScript function.
  type FunctionCoverage extends object
    properties
      # JavaScript function name.
      string functionName
      # Source ranges inside the function with coverage data.
      array of CoverageRange ranges
      # Whether coverage data for this function has block granularity.
      boolean isBlockCoverage

  # Coverage data for a JavaScript script.
  type ScriptCoverage extends object
    properties
      # JavaScript script id.
      Runtime.ScriptId scriptId
      # JavaScript script name or url.
      string url
      # Functions contained in the script that has coverage data.
      array of FunctionCoverage functions

  # Describes a type collected during runtime.
  experimental type TypeObject extends object
    properties
      # Name of a type collected with type profiling.
      string name

  # Source offset and types for a parameter or return value.
  experimental type TypeProfileEntry extends object
    properties
      # Source offset of the parameter or end of function for return values.
      integer offset
      # The types for this parameter or return value.
      array of TypeObject types

  # Type profile data collected during runtime for a JavaScript script.
  experimental type ScriptTypeProfile extends object
    properties
      # JavaScript script id.
      Runtime.ScriptId scriptId
      # JavaScript script name or url.
      string url
      # Type profile entries for parameters and return values of the functions in the script.
      array of TypeProfileEntry entries

  # Collected counter information.
  experimental type CounterInfo extends object
    properties
      # Counter name.
      string name
      # Counter value.
      integer value

  command disable

  command enable

  # Collect coverage data for the current isolate. The coverage data may be incomplete due to
  # garbage collection.
  command getBestEffortCoverage
    returns
      # Coverage data for the current isolate.
      array of ScriptCoverage result

  # Changes CPU profiler sampling interval. Must be called before CPU profiles recording started.
  command setSamplingInterval
    parameters
      # New sampling interval in microseconds.
      integer interval

  command start

  # Enable precise code coverage. Coverage data for JavaScript executed before enabling precise code
  # coverage may be incomplete. Enabling prevents running optimized code and resets execution
  # counters.
  command startPreciseCoverage
    parameters
      # Collect accurate call counts beyond simple 'covered' or 'not covered'.
      optional boolean callCount
      # Collect block-based coverage.
      optional boolean detailed
      # Allow the backend to send updates on its own initiative
      optional boolean allowTriggeredUpdates
    returns
      # Monotonically increasing time (in seconds) when the coverage update was taken in the backend.
      number timestamp

  # Enable type profile.
  experimental command startTypeProfile

  command stop
    returns
      # Recorded profile.
      Profile profile

  # Disable precise code coverage. Disabling releases unnecessary execution count records and allows
  # executing optimized code.
  command stopPreciseCoverage

  # Disable type profile. Disabling releases type profile data collected so far.
  experimental command stopTypeProfile

  # Collect coverage data for the current isolate, and resets execution counters. Precise code
  # coverage needs to have started.
  command takePreciseCoverage
    returns
      # Coverage data for the current isolate.
      array of ScriptCoverage result
      # Monotonically increasing time (in seconds) when the coverage update was taken in the backend.
      number timestamp

  # Collect type profile.
  experimental command takeTypeProfile
    returns
      # Type profile for all scripts since startTypeProfile() was turned on.
      array of ScriptTypeProfile result

  # Enable run time call stats collection.
  experimental command enableRuntimeCallStats

  # Disable run time call stats collection.
  experimental command disableRuntimeCallStats

  # Retrieve run time call stats.
  experimental command getRuntimeCallStats
    returns
      # Collected counter information.
      array of CounterInfo result

  event consoleProfileFinished
    parameters
      string id
      # Location of console.profileEnd().
      Debugger.Location location
      Profile profile
      # Profile title passed as an argument to console.profile().
      optional string title

  # Sent when new profile recording is started using console.profile() call.
  event consoleProfileStarted
    parameters
      string id
      # Location of console.profile().
      Debugger.Location location
      # Profile title passed as an argument to console.profile().
      optional string title

  # Reports coverage delta since the last poll (either from an event like this, or from
  # `takePreciseCoverage` for the current isolate. May only be sent if precise code
  # coverage has been started. This event can be trigged by the embedder to, for example,
  # trigger collection of coverage data immediatelly at a certain point in time.
  experimental event preciseCoverageDeltaUpdate
    parameters
      # Monotonically increasing time (in seconds) when the coverage update was taken in the backend.
      number timestamp
      # Identifier for distinguishing coverage events.
      string occassion
      # Coverage data for the current isolate.
      array of ScriptCoverage result

# Runtime domain exposes JavaScript runtime by means of remote evaluation and mirror objects.
# Evaluation results are returned as mirror object that expose object type, string representation
# and unique identifier that can be used for further object reference. Original objects are
# maintained in memory unless they are either explicitly released or are released along with the
# other objects in their object group.
domain Runtime

  # Unique script identifier.
  type ScriptId extends string

  # Unique object identifier.
  type RemoteObjectId extends string

  # Primitive value which cannot be JSON-stringified. Includes values `-0`, `NaN`, `Infinity`,
  # `-Infinity`, and bigint literals.
  type UnserializableValue extends string

  # Mirror object referencing original JavaScript object.
  type RemoteObject extends object
    properties
      # Object type.
      enum type
        object
        function
        undefined
        string
        number
        boolean
        symbol
        bigint
        wasm
      # Object subtype hint. Specified for `object` or `wasm` type values only.
      optional enum subtype
        array
        null
        node
        regexp
        date
        map
        set
        weakmap
        weakset
        iterator
        generator
        error
        proxy
        promise
        typedarray
        arraybuffer
        dataview
        i32
        i64
        f32
        f64
        v128
        externref
      # Object class (constructor) name. Specified for `object` type values only.
      optional string className
      # Remote object value in case of primitive values or JSON values (if it was requested).
      optional any value
      # Primitive value which can not be JSON-stringified does not have `value`, but gets this
      # property.
      optional UnserializableValue unserializableValue
      # String representation of the object.
      optional string description
      # Unique object identifier (for non-primitive values).
      optional RemoteObjectId objectId
      # Preview containing abbreviated property values. Specified for `object` type values only.
      experimental optional ObjectPreview preview
      experimental optional CustomPreview customPreview

  experimental type CustomPreview extends object
    properties
      # The JSON-stringified result of formatter.header(object, config) call.
      # It contains json ML array that represents RemoteObject.
      string header
      # If formatter returns true as a result of formatter.hasBody call then bodyGetterId will
      # contain RemoteObjectId for the function that returns result of formatter.body(object, config) call.
      # The result value is json ML array.
      optional RemoteObjectId bodyGetterId

  # Object containing abbreviated remote object value.
  experimental type ObjectPreview extends object
    properties
      # Object type.
      enum type
        object
        function
        undefined
        string
        number
        boolean
        symbol
        bigint
      # Object subtype hint. Specified for `object` type values only.
      optional enum subtype
        array
        null
        node
        regexp
        date
        map
        set
        weakmap
        weakset
        iterator
        generator
        error
      # String representation of the object.
      optional string description
      # True iff some of the properties or entries of the original object did not fit.
      boolean overflow
      # List of the properties.
      array of PropertyPreview properties
      # List of the entries. Specified for `map` and `set` subtype values only.
      optional array of EntryPreview entries

  experimental type PropertyPreview extends object
    properties
      # Property name.
      string name
      # Object type. Accessor means that the property itself is an accessor property.
      enum type
        object
        function
        undefined
        string
        number
        boolean
        symbol
        accessor
        bigint
      # User-friendly property value string.
      optional string value
      # Nested value preview.
      optional ObjectPreview valuePreview
      # Object subtype hint. Specified for `object` type values only.
      optional enum subtype
        array
        null
        node
        regexp
        date
        map
        set
        weakmap
        weakset
        iterator
        generator
        error

  experimental type EntryPreview extends object
    properties
      # Preview of the key. Specified for map-like collection entries.
      optional ObjectPreview key
      # Preview of the value.
      ObjectPreview value

  # Object property descriptor.
  type PropertyDescriptor extends object
    properties
      # Property name or symbol description.
      string name
      # The value associated with the property.
      optional RemoteObject value
      # True if the value associated with the property may be changed (data descriptors only).
      optional boolean writable
      # A function which serves as a getter for the property, or `undefined` if there is no getter
      # (accessor descriptors only).
      optional RemoteObject get
      # A function which serves as a setter for the property, or `undefined` if there is no setter
      # (accessor descriptors only).
      optional RemoteObject set
      # True if the type of this property descriptor may be changed and if the property may be
      # deleted from the corresponding object.
      boolean configurable
      # True if this property shows up during enumeration of the properties on the corresponding
      # object.
      boolean enumerable
      # True if the result was thrown during the evaluation.
      optional boolean wasThrown
      # True if the property is owned for the object.
      optional boolean isOwn
      # Property symbol object, if the property is of the `symbol` type.
      optional RemoteObject symbol

  # Object internal property descriptor. This property isn't normally visible in JavaScript code.
  type InternalPropertyDescriptor extends object
    properties
      # Conventional property name.
      string name
      # The value associated with the property.
      optional RemoteObject value

  # Object private field descriptor.
  experimental type PrivatePropertyDescriptor extends object
    properties
      # Private property name.
      string name
      # The value associated with the private property.
      optional RemoteObject value
      # A function which serves as a getter for the private property,
      # or `undefined` if there is no getter (accessor descriptors only).
      optional RemoteObject get
      # A function which serves as a setter for the private property,
      # or `undefined` if there is no setter (accessor descriptors only).
      optional RemoteObject set

  # Represents function call argument. Either remote object id `objectId`, primitive `value`,
  # unserializable primitive value or neither of (for undefined) them should be specified.
  type CallArgument extends object
    properties
      # Primitive value or serializable javascript object.
      optional any value
      # Primitive value which can not be JSON-stringified.
      optional UnserializableValue unserializableValue
      # Remote object handle.
      optional RemoteObjectId objectId

  # Id of an execution context.
  type ExecutionContextId extends integer

  # Description of an isolated world.
  type ExecutionContextDescription extends object
    properties
      # Unique id of the execution context. It can be used to specify in which execution context
      # script evaluation should be performed.
      ExecutionContextId id
      # Execution context origin.
      string origin
      # Human readable name describing given context.
      string name
      # Embedder-specific auxiliary data.
      optional object auxData

  # Detailed information about exception (or error) that was thrown during script compilation or
  # execution.
  type ExceptionDetails extends object
    properties
      # Exception id.
      integer exceptionId
      # Exception text, which should be used together with exception object when available.
      string text
      # Line number of the exception location (0-based).
      integer lineNumber
      # Column number of the exception location (0-based).
      integer columnNumber
      # Script ID of the exception location.
      optional ScriptId scriptId
      # URL of the exception location, to be used when the script was not reported.
      optional string url
      # JavaScript stack trace if available.
      optional StackTrace stackTrace
      # Exception object if available.
      optional RemoteObject exception
      # Identifier of the context where exception happened.
      optional ExecutionContextId executionContextId

  # Number of milliseconds since epoch.
  type Timestamp extends number

  # Number of milliseconds.
  type TimeDelta extends number

  # Stack entry for runtime errors and assertions.
  type CallFrame extends object
    properties
      # JavaScript function name.
      string functionName
      # JavaScript script id.
      ScriptId scriptId
      # JavaScript script name or url.
      string url
      # JavaScript script line number (0-based).
      integer lineNumber
      # JavaScript script column number (0-based).
      integer columnNumber

  # Call frames for assertions or error messages.
  type StackTrace extends object
    properties
      # String label of this stack trace. For async traces this may be a name of the function that
      # initiated the async call.
      optional string description
      # JavaScript function name.
      array of CallFrame callFrames
      # Asynchronous JavaScript stack trace that preceded this stack, if available.
      optional StackTrace parent
      # Asynchronous JavaScript stack trace that preceded this stack, if available.
      experimental optional StackTraceId parentId

  # Unique identifier of current debugger.
  experimental type UniqueDebuggerId extends string

  # If `debuggerId` is set stack trace comes from another debugger and can be resolved there. This
  # allows to track cross-debugger calls. See `Runtime.StackTrace` and `Debugger.paused` for usages.
  experimental type StackTraceId extends object
    properties
      string id
      optional UniqueDebuggerId debuggerId

  # Add handler to promise with given promise object id.
  command awaitPromise
    parameters
      # Identifier of the promise.
      RemoteObjectId promiseObjectId
      # Whether the result is expected to be a JSON object that should be sent by value.
      optional boolean returnByValue
      # Whether preview should be generated for the result.
      optional boolean generatePreview
    returns
      # Promise result. Will contain rejected value if promise was rejected.
      RemoteObject result
      # Exception details if stack strace is available.
      optional ExceptionDetails exceptionDetails

  # Calls function with given declaration on the given object. Object group of the result is
  # inherited from the target object.
  command callFunctionOn
    parameters
      # Declaration of the function to call.
      string functionDeclaration
      # Identifier of the object to call function on. Either objectId or executionContextId should
      # be specified.
      optional RemoteObjectId objectId
      # Call arguments. All call arguments must belong to the same JavaScript world as the target
      # object.
      optional array of CallArgument arguments
      # In silent mode exceptions thrown during evaluation are not reported and do not pause
      # execution. Overrides `setPauseOnException` state.
      optional boolean silent
      # Whether the result is expected to be a JSON object which should be sent by value.
      optional boolean returnByValue
      # Whether preview should be generated for the result.
      experimental optional boolean generatePreview
      # Whether execution should be treated as initiated by user in the UI.
      optional boolean userGesture
      # Whether execution should `await` for resulting value and return once awaited promise is
      # resolved.
      optional boolean awaitPromise
      # Specifies execution context which global object will be used to call function on. Either
      # executionContextId or objectId should be specified.
      optional ExecutionContextId executionContextId
      # Symbolic group name that can be used to release multiple objects. If objectGroup is not
      # specified and objectId is, objectGroup will be inherited from object.
      optional string objectGroup
    returns
      # Call result.
      RemoteObject result
      # Exception details.
      optional ExceptionDetails exceptionDetails

  # Compiles expression.
  command compileScript
    parameters
      # Expression to compile.
      string expression
      # Source url to be set for the script.
      string sourceURL
      # Specifies whether the compiled script should be persisted.
      boolean persistScript
      # Specifies in which execution context to perform script run. If the parameter is omitted the
      # evaluation will be performed in the context of the inspected page.
      optional ExecutionContextId executionContextId
    returns
      # Id of the script.
      optional ScriptId scriptId
      # Exception details.
      optional ExceptionDetails exceptionDetails

  # Disables reporting of execution contexts creation.
  command disable

  # Discards collected exceptions and console API calls.
  command discardConsoleEntries

  # Enables reporting of execution contexts creation by means of `executionContextCreated` event.
  # When the reporting gets enabled the event will be sent immediately for each existing execution
  # context.
  command enable

  # Evaluates expression on global object.
  command evaluate
    parameters
      # Expression to evaluate.
      string expression
      # Symbolic group name that can be used to release multiple objects.
      optional string objectGroup
      # Determines whether Command Line API should be available during the evaluation.
      optional boolean includeCommandLineAPI
      # In silent mode exceptions thrown during evaluation are not reported and do not pause
      # execution. Overrides `setPauseOnException` state.
      optional boolean silent
      # Specifies in which execution context to perform evaluation. If the parameter is omitted the
      # evaluation will be performed in the context of the inspected page.
      optional ExecutionContextId contextId
      # Whether the result is expected to be a JSON object that should be sent by value.
      optional boolean returnByValue
      # Whether preview should be generated for the result.
      experimental optional boolean generatePreview
      # Whether execution should be treated as initiated by user in the UI.
      optional boolean userGesture
      # Whether execution should `await` for resulting value and return once awaited promise is
      # resolved.
      optional boolean awaitPromise
      # Whether to throw an exception if side effect cannot be ruled out during evaluation.
      # This implies `disableBreaks` below.
      experimental optional boolean throwOnSideEffect
      # Terminate execution after timing out (number of milliseconds).
      experimental optional TimeDelta timeout
      # Disable breakpoints during execution.
      experimental optional boolean disableBreaks
      # Setting this flag to true enables `let` re-declaration and top-level `await`.
      # Note that `let` variables can only be re-declared if they originate from
      # `replMode` themselves.
      experimental optional boolean replMode
      # The Content Security Policy (CSP) for the target might block 'unsafe-eval'
      # which includes eval(), Function(), setTimeout() and setInterval()
      # when called with non-callable arguments. This flag bypasses CSP for this
      # evaluation and allows unsafe-eval. Defaults to true.
      experimental optional boolean allowUnsafeEvalBlockedByCSP
    returns
      # Evaluation result.
      RemoteObject result
      # Exception details.
      optional ExceptionDetails exceptionDetails

  # Returns the isolate id.
  experimental command getIsolateId
    returns
      # The isolate id.
      string id

  # Returns the JavaScript heap usage.
  # It is the total usage of the corresponding isolate not scoped to a particular Runtime.
  experimental command getHeapUsage
    returns
      # Used heap size in bytes.
      number usedSize
      # Allocated heap size in bytes.
      number totalSize

  # Returns properties of a given object. Object group of the result is inherited from the target
  # object.
  command getProperties
    parameters
      # Identifier of the object to return properties for.
      RemoteObjectId objectId
      # If true, returns properties belonging only to the element itself, not to its prototype
      # chain.
      optional boolean ownProperties
      # If true, returns accessor properties (with getter/setter) only; internal properties are not
      # returned either.
      experimental optional boolean accessorPropertiesOnly
      # Whether preview should be generated for the results.
      experimental optional boolean generatePreview
    returns
      # Object properties.
      array of PropertyDescriptor result
      # Internal object properties (only of the element itself).
      optional array of InternalPropertyDescriptor internalProperties
      # Object private properties.
      experimental optional array of PrivatePropertyDescriptor privateProperties
      # Exception details.
      optional ExceptionDetails exceptionDetails

  # Returns all let, const and class variables from global scope.
  command globalLexicalScopeNames
    parameters
      # Specifies in which execution context to lookup global scope variables.
      optional ExecutionContextId executionContextId
    returns
      array of string names

  command queryObjects
    parameters
      # Identifier of the prototype to return objects for.
      RemoteObjectId prototypeObjectId
      # Symbolic group name that can be used to release the results.
      optional string objectGroup
    returns
      # Array with objects.
      RemoteObject objects

  # Releases remote object with given id.
  command releaseObject
    parameters
      # Identifier of the object to release.
      RemoteObjectId objectId

  # Releases all remote objects that belong to a given group.
  command releaseObjectGroup
    parameters
      # Symbolic object group name.
      string objectGroup

  # Tells inspected instance to run if it was waiting for debugger to attach.
  command runIfWaitingForDebugger

  # Runs script with given id in a given context.
  command runScript
    parameters
      # Id of the script to run.
      ScriptId scriptId
      # Specifies in which execution context to perform script run. If the parameter is omitted the
      # evaluation will be performed in the context of the inspected page.
      optional ExecutionContextId executionContextId
      # Symbolic group name that can be used to release multiple objects.
      optional string objectGroup
      # In silent mode exceptions thrown during evaluation are not reported and do not pause
      # execution. Overrides `setPauseOnException` state.
      optional boolean silent
      # Determines whether Command Line API should be available during the evaluation.
      optional boolean includeCommandLineAPI
      # Whether the result is expected to be a JSON object which should be sent by value.
      optional boolean returnByValue
      # Whether preview should be generated for the result.
      optional boolean generatePreview
      # Whether execution should `await` for resulting value and return once awaited promise is
      # resolved.
      optional boolean awaitPromise
    returns
      # Run result.
      RemoteObject result
      # Exception details.
      optional ExceptionDetails exceptionDetails

  # Enables or disables async call stacks tracking.
  command setAsyncCallStackDepth
    redirect Debugger
    parameters
      # Maximum depth of async call stacks. Setting to `0` will effectively disable collecting async
      # call stacks (default).
      integer maxDepth

  experimental command setCustomObjectFormatterEnabled
    parameters
      boolean enabled

  experimental command setMaxCallStackSizeToCapture
    parameters
      integer size

  # Terminate current or next JavaScript execution.
  # Will cancel the termination when the outer-most script execution ends.
  experimental command terminateExecution

  # If executionContextId is empty, adds binding with the given name on the
  # global objects of all inspected contexts, including those created later,
  # bindings survive reloads.
  # If executionContextId is specified, adds binding only on global object of
  # given execution context.
  # Binding function takes exactly one argument, this argument should be string,
  # in case of any other input, function throws an exception.
  # Each binding function call produces Runtime.bindingCalled notification.
  experimental command addBinding
    parameters
      string name
      optional ExecutionContextId executionContextId

  # This method does not remove binding function from global object but
  # unsubscribes current runtime agent from Runtime.bindingCalled notifications.
  experimental command removeBinding
    parameters
      string name

  # Notification is issued every time when binding is called.
  experimental event bindingCalled
    parameters
      string name
      string payload
      # Identifier of the context where the call was made.
      ExecutionContextId executionContextId

  # Issued when console API was called.
  event consoleAPICalled
    parameters
      # Type of the call.
      enum type
        log
        debug
        info
        error
        warning
        dir
        dirxml
        table
        trace
        clear
        startGroup
        startGroupCollapsed
        endGroup
        assert
        profile
        profileEnd
        count
        timeEnd
      # Call arguments.
      array of RemoteObject args
      # Identifier of the context where the call was made.
      ExecutionContextId executionContextId
      # Call timestamp.
      Timestamp timestamp
      # Stack trace captured when the call was made. The async stack chain is automatically reported for
      # the following call types: `assert`, `error`, `trace`, `warning`. For other types the async call
      # chain can be retrieved using `Debugger.getStackTrace` and `stackTrace.parentId` field.
      optional StackTrace stackTrace
      # Console context descriptor for calls on non-default console context (not console.*):
      # 'anonymous#unique-logger-id' for call on unnamed context, 'name#unique-logger-id' for call
      # on named context.
      experimental optional string context

  # Issued when unhandled exception was revoked.
  event exceptionRevoked
    parameters
      # Reason describing why exception was revoked.
      string reason
      # The id of revoked exception, as reported in `exceptionThrown`.
      integer exceptionId

  # Issued when exception was thrown and unhandled.
  event exceptionThrown
    parameters
      # Timestamp of the exception.
      Timestamp timestamp
      ExceptionDetails exceptionDetails

  # Issued when new execution context is created.
  event executionContextCreated
    parameters
      # A newly created execution context.
      ExecutionContextDescription context

  # Issued when execution context is destroyed.
  event executionContextDestroyed
    parameters
      # Id of the destroyed context
      ExecutionContextId executionContextId

  # Issued when all executionContexts were cleared in browser
  event executionContextsCleared

  # Issued when object should be inspected (for example, as a result of inspect() command line API
  # call).
  event inspectRequested
    parameters
      RemoteObject object
      object hints

# This domain is deprecated.
deprecated domain Schema

  # Description of the protocol domain.
  type Domain extends object
    properties
      # Domain name.
      string name
      # Domain version.
      string version

  # Returns supported domains.
  command getDomains
    returns
      # List of supported domains.
      array of Domain domains
