# 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

  # 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
      # 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

  # 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.
      string scriptSource

  # 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 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

  # 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 issue additional Debugger.paused notification if any async task is scheduled
      # before next pause.
      experimental optional boolean breakOnAsyncCall

  # Steps out of the function call.
  command stepOut

  # Steps over the statement.
  command stepOver

  # 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
      # Just scheduled async call will have this stack trace as parent stack during async execution.
      # This field is available only after `Debugger.stepInto` call with `breakOnAsynCall` flag.
      experimental optional Runtime.StackTraceId asyncCallStackTraceId

  # Fired when the virtual machine resumed execution.
  event resumed

  # 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

  # 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

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

  command takeHeapSnapshot
    parameters
      # If true 'reportHeapSnapshotProgress' events will be generated while snapshot is being taken.
      optional boolean reportProgress

  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

  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

  # 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

  # Collect type profile.
  experimental command takeTypeProfile
    returns
      # Type profile for all scripts since startTypeProfile() was turned on.
      array of ScriptTypeProfile 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

# 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
      # Object subtype hint. Specified for `object` type values only.
      optional enum subtype
        array
        null
        node
        regexp
        date
        map
        set
        weakmap
        weakset
        iterator
        generator
        error
        proxy
        promise
        typedarray
        arraybuffer
        dataview
      # 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.
      RemoteObject value

  # 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.
      experimental optional boolean throwOnSideEffect
      # Terminate execution after timing out (number of milliseconds).
      experimental optional TimeDelta timeout
    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
