# 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.
#
# Contributing to Chrome DevTools Protocol: https://docs.google.com/document/d/1c-COD2kaK__5iMM5SEx-PzNA7HFmgttcYfOHHX0HaOM/edit?usp=sharing

version
  major 1
  minor 3

experimental domain Accessibility
  depends on DOM

  # Unique accessibility node identifier.
  type AXNodeId extends string

  # Enum of possible property types.
  type AXValueType extends string
    enum
      boolean
      tristate
      booleanOrUndefined
      idref
      idrefList
      integer
      node
      nodeList
      number
      string
      computedString
      token
      tokenList
      domRelation
      role
      internalRole
      valueUndefined

  # Enum of possible property sources.
  type AXValueSourceType extends string
    enum
      attribute
      implicit
      style
      contents
      placeholder
      relatedElement

  # Enum of possible native property sources (as a subtype of a particular AXValueSourceType).
  type AXValueNativeSourceType extends string
    enum
      figcaption
      label
      labelfor
      labelwrapped
      legend
      tablecaption
      title
      other

  # A single source for a computed AX property.
  type AXValueSource extends object
    properties
      # What type of source this is.
      AXValueSourceType type
      # The value of this property source.
      optional AXValue value
      # The name of the relevant attribute, if any.
      optional string attribute
      # The value of the relevant attribute, if any.
      optional AXValue attributeValue
      # Whether this source is superseded by a higher priority source.
      optional boolean superseded
      # The native markup source for this value, e.g. a <label> element.
      optional AXValueNativeSourceType nativeSource
      # The value, such as a node or node list, of the native source.
      optional AXValue nativeSourceValue
      # Whether the value for this property is invalid.
      optional boolean invalid
      # Reason for the value being invalid, if it is.
      optional string invalidReason

  type AXRelatedNode extends object
    properties
      # The BackendNodeId of the related DOM node.
      DOM.BackendNodeId backendDOMNodeId
      # The IDRef value provided, if any.
      optional string idref
      # The text alternative of this node in the current context.
      optional string text

  type AXProperty extends object
    properties
      # The name of this property.
      AXPropertyName name
      # The value of this property.
      AXValue value

  # A single computed AX property.
  type AXValue extends object
    properties
      # The type of this value.
      AXValueType type
      # The computed value of this property.
      optional any value
      # One or more related nodes, if applicable.
      optional array of AXRelatedNode relatedNodes
      # The sources which contributed to the computation of this property.
      optional array of AXValueSource sources

  # Values of AXProperty name:
  # - from 'busy' to 'roledescription': states which apply to every AX node
  # - from 'live' to 'root': attributes which apply to nodes in live regions
  # - from 'autocomplete' to 'valuetext': attributes which apply to widgets
  # - from 'checked' to 'selected': states which apply to widgets
  # - from 'activedescendant' to 'owns' - relationships between elements other than parent/child/sibling.
  type AXPropertyName extends string
    enum
      busy
      disabled
      editable
      focusable
      focused
      hidden
      hiddenRoot
      invalid
      keyshortcuts
      settable
      roledescription
      live
      atomic
      relevant
      root
      autocomplete
      hasPopup
      level
      multiselectable
      orientation
      multiline
      readonly
      required
      valuemin
      valuemax
      valuetext
      checked
      expanded
      modal
      pressed
      selected
      activedescendant
      controls
      describedby
      details
      errormessage
      flowto
      labelledby
      owns

  # A node in the accessibility tree.
  type AXNode extends object
    properties
      # Unique identifier for this node.
      AXNodeId nodeId
      # Whether this node is ignored for accessibility
      boolean ignored
      # Collection of reasons why this node is hidden.
      optional array of AXProperty ignoredReasons
      # This `Node`'s role, whether explicit or implicit.
      optional AXValue role
      # The accessible name for this `Node`.
      optional AXValue name
      # The accessible description for this `Node`.
      optional AXValue description
      # The value for this `Node`.
      optional AXValue value
      # All other properties
      optional array of AXProperty properties
      # IDs for each of this node's child nodes.
      optional array of AXNodeId childIds
      # The backend ID for the associated DOM node, if any.
      optional DOM.BackendNodeId backendDOMNodeId

  # Disables the accessibility domain.
  command disable

  # Enables the accessibility domain which causes `AXNodeId`s to remain consistent between method calls.
  # This turns on accessibility for the page, which can impact performance until accessibility is disabled.
  command enable

  # Fetches the accessibility node and partial accessibility tree for this DOM node, if it exists.
  experimental command getPartialAXTree
    parameters
      # Identifier of the node to get the partial accessibility tree for.
      optional DOM.NodeId nodeId
      # Identifier of the backend node to get the partial accessibility tree for.
      optional DOM.BackendNodeId backendNodeId
      # JavaScript object id of the node wrapper to get the partial accessibility tree for.
      optional Runtime.RemoteObjectId objectId
      # Whether to fetch this nodes ancestors, siblings and children. Defaults to true.
      optional boolean fetchRelatives
    returns
      # The `Accessibility.AXNode` for this DOM node, if it exists, plus its ancestors, siblings and
      # children, if requested.
      array of AXNode nodes

  # Fetches the entire accessibility tree
  experimental command getFullAXTree
    returns
      array of AXNode nodes

experimental domain Animation
  depends on Runtime
  depends on DOM

  # Animation instance.
  type Animation extends object
    properties
      # `Animation`'s id.
      string id
      # `Animation`'s name.
      string name
      # `Animation`'s internal paused state.
      boolean pausedState
      # `Animation`'s play state.
      string playState
      # `Animation`'s playback rate.
      number playbackRate
      # `Animation`'s start time.
      number startTime
      # `Animation`'s current time.
      number currentTime
      # Animation type of `Animation`.
      enum type
        CSSTransition
        CSSAnimation
        WebAnimation
      # `Animation`'s source animation node.
      optional AnimationEffect source
      # A unique ID for `Animation` representing the sources that triggered this CSS
      # animation/transition.
      optional string cssId

  # AnimationEffect instance
  type AnimationEffect extends object
    properties
      # `AnimationEffect`'s delay.
      number delay
      # `AnimationEffect`'s end delay.
      number endDelay
      # `AnimationEffect`'s iteration start.
      number iterationStart
      # `AnimationEffect`'s iterations.
      number iterations
      # `AnimationEffect`'s iteration duration.
      number duration
      # `AnimationEffect`'s playback direction.
      string direction
      # `AnimationEffect`'s fill mode.
      string fill
      # `AnimationEffect`'s target node.
      optional DOM.BackendNodeId backendNodeId
      # `AnimationEffect`'s keyframes.
      optional KeyframesRule keyframesRule
      # `AnimationEffect`'s timing function.
      string easing

  # Keyframes Rule
  type KeyframesRule extends object
    properties
      # CSS keyframed animation's name.
      optional string name
      # List of animation keyframes.
      array of KeyframeStyle keyframes

  # Keyframe Style
  type KeyframeStyle extends object
    properties
      # Keyframe's time offset.
      string offset
      # `AnimationEffect`'s timing function.
      string easing

  # Disables animation domain notifications.
  command disable

  # Enables animation domain notifications.
  command enable

  # Returns the current time of the an animation.
  command getCurrentTime
    parameters
      # Id of animation.
      string id
    returns
      # Current time of the page.
      number currentTime

  # Gets the playback rate of the document timeline.
  command getPlaybackRate
    returns
      # Playback rate for animations on page.
      number playbackRate

  # Releases a set of animations to no longer be manipulated.
  command releaseAnimations
    parameters
      # List of animation ids to seek.
      array of string animations

  # Gets the remote object of the Animation.
  command resolveAnimation
    parameters
      # Animation id.
      string animationId
    returns
      # Corresponding remote object.
      Runtime.RemoteObject remoteObject

  # Seek a set of animations to a particular time within each animation.
  command seekAnimations
    parameters
      # List of animation ids to seek.
      array of string animations
      # Set the current time of each animation.
      number currentTime

  # Sets the paused state of a set of animations.
  command setPaused
    parameters
      # Animations to set the pause state of.
      array of string animations
      # Paused state to set to.
      boolean paused

  # Sets the playback rate of the document timeline.
  command setPlaybackRate
    parameters
      # Playback rate for animations on page
      number playbackRate

  # Sets the timing of an animation node.
  command setTiming
    parameters
      # Animation id.
      string animationId
      # Duration of the animation.
      number duration
      # Delay of the animation.
      number delay

  # Event for when an animation has been cancelled.
  event animationCanceled
    parameters
      # Id of the animation that was cancelled.
      string id

  # Event for each animation that has been created.
  event animationCreated
    parameters
      # Id of the animation that was created.
      string id

  # Event for animation that has been started.
  event animationStarted
    parameters
      # Animation that was started.
      Animation animation

experimental domain ApplicationCache

  # Detailed application cache resource information.
  type ApplicationCacheResource extends object
    properties
      # Resource url.
      string url
      # Resource size.
      integer size
      # Resource type.
      string type

  # Detailed application cache information.
  type ApplicationCache extends object
    properties
      # Manifest URL.
      string manifestURL
      # Application cache size.
      number size
      # Application cache creation time.
      number creationTime
      # Application cache update time.
      number updateTime
      # Application cache resources.
      array of ApplicationCacheResource resources

  # Frame identifier - manifest URL pair.
  type FrameWithManifest extends object
    properties
      # Frame identifier.
      Page.FrameId frameId
      # Manifest URL.
      string manifestURL
      # Application cache status.
      integer status

  # Enables application cache domain notifications.
  command enable

  # Returns relevant application cache data for the document in given frame.
  command getApplicationCacheForFrame
    parameters
      # Identifier of the frame containing document whose application cache is retrieved.
      Page.FrameId frameId
    returns
      # Relevant application cache data for the document in given frame.
      ApplicationCache applicationCache

  # Returns array of frame identifiers with manifest urls for each frame containing a document
  # associated with some application cache.
  command getFramesWithManifests
    returns
      # Array of frame identifiers with manifest urls for each frame containing a document
      # associated with some application cache.
      array of FrameWithManifest frameIds

  # Returns manifest URL for document in the given frame.
  command getManifestForFrame
    parameters
      # Identifier of the frame containing document whose manifest is retrieved.
      Page.FrameId frameId
    returns
      # Manifest URL for document in the given frame.
      string manifestURL

  event applicationCacheStatusUpdated
    parameters
      # Identifier of the frame containing document whose application cache updated status.
      Page.FrameId frameId
      # Manifest URL.
      string manifestURL
      # Updated application cache status.
      integer status

  event networkStateUpdated
    parameters
      boolean isNowOnline

# Audits domain allows investigation of page violations and possible improvements.
experimental domain Audits
  depends on Network

  # Returns the response body and size if it were re-encoded with the specified settings. Only
  # applies to images.
  command getEncodedResponse
    parameters
      # Identifier of the network request to get content for.
      Network.RequestId requestId
      # The encoding to use.
      enum encoding
        webp
        jpeg
        png
      # The quality of the encoding (0-1). (defaults to 1)
      optional number quality
      # Whether to only return the size information (defaults to false).
      optional boolean sizeOnly
    returns
      # The encoded body as a base64 string. Omitted if sizeOnly is true.
      optional binary body
      # Size before re-encoding.
      integer originalSize
      # Size after re-encoding.
      integer encodedSize

# Defines events for background web platform features.
experimental domain BackgroundService
  # The Background Service that will be associated with the commands/events.
  # Every Background Service operates independently, but they share the same
  # API.
  type ServiceName extends string
    enum
      backgroundFetch
      backgroundSync
      pushMessaging
      notifications
      paymentHandler
      periodicBackgroundSync

  # Enables event updates for the service.
  command startObserving
    parameters
      ServiceName service

  # Disables event updates for the service.
  command stopObserving
    parameters
      ServiceName service

  # Set the recording state for the service.
  command setRecording
    parameters
      boolean shouldRecord
      ServiceName service

  # Clears all stored data for the service.
  command clearEvents
    parameters
      ServiceName service

  # Called when the recording state for the service has been updated.
  event recordingStateChanged
    parameters
      boolean isRecording
      ServiceName service

  # A key-value pair for additional event information to pass along.
  type EventMetadata extends object
    properties
      string key
      string value

  type BackgroundServiceEvent extends object
    properties
      # Timestamp of the event (in seconds).
      Network.TimeSinceEpoch timestamp
      # The origin this event belongs to.
      string origin
      # The Service Worker ID that initiated the event.
      ServiceWorker.RegistrationID serviceWorkerRegistrationId
      # The Background Service this event belongs to.
      ServiceName service
      # A description of the event.
      string eventName
      # An identifier that groups related events together.
      string instanceId
      # A list of event-specific information.
      array of EventMetadata eventMetadata

  # Called with all existing backgroundServiceEvents when enabled, and all new
  # events afterwards if enabled and recording.
  event backgroundServiceEventReceived
    parameters
      BackgroundServiceEvent backgroundServiceEvent

# The Browser domain defines methods and events for browser managing.
domain Browser
  experimental type BrowserContextID extends string
  experimental type WindowID extends integer

  # The state of the browser window.
  experimental type WindowState extends string
    enum
      normal
      minimized
      maximized
      fullscreen

  # Browser window bounds information
  experimental type Bounds extends object
    properties
      # The offset from the left edge of the screen to the window in pixels.
      optional integer left
      # The offset from the top edge of the screen to the window in pixels.
      optional integer top
      # The window width in pixels.
      optional integer width
      # The window height in pixels.
      optional integer height
      # The window state. Default to normal.
      optional WindowState windowState

  experimental type PermissionType extends string
    enum
      accessibilityEvents
      audioCapture
      backgroundSync
      backgroundFetch
      clipboardRead
      clipboardWrite
      durableStorage
      flash
      geolocation
      midi
      midiSysex
      nfc
      notifications
      paymentHandler
      periodicBackgroundSync
      protectedMediaIdentifier
      sensors
      videoCapture
      idleDetection
      wakeLockScreen
      wakeLockSystem

  experimental type PermissionSetting extends string
    enum
      granted
      denied
      prompt

  # Definition of PermissionDescriptor defined in the Permissions API:
  # https://w3c.github.io/permissions/#dictdef-permissiondescriptor.
  experimental type PermissionDescriptor extends object
    properties
      # Name of permission.
      # See https://cs.chromium.org/chromium/src/third_party/blink/renderer/modules/permissions/permission_descriptor.idl for valid permission names.
      string name
      # For "midi" permission, may also specify sysex control.
      optional boolean sysex
      # For "push" permission, may specify userVisibleOnly.
      # Note that userVisibleOnly = true is the only currently supported type.
      optional boolean userVisibleOnly
      # For "wake-lock" permission, must specify type as either "screen" or "system".
      optional string type

  # Set permission settings for given origin.
  experimental command setPermission
    parameters
      # Origin the permission applies to.
      string origin
      # Descriptor of permission to override.
      PermissionDescriptor permission
      # Setting of the permission.
      PermissionSetting setting
      # Context to override. When omitted, default browser context is used.
      optional BrowserContextID browserContextId

  # Grant specific permissions to the given origin and reject all others.
  experimental command grantPermissions
    parameters
      string origin
      array of PermissionType permissions
      # BrowserContext to override permissions. When omitted, default browser context is used.
      optional BrowserContextID browserContextId

  # Reset all permission management for all origins.
  experimental command resetPermissions
    parameters
      # BrowserContext to reset permissions. When omitted, default browser context is used.
      optional BrowserContextID browserContextId


  # Close browser gracefully.
  command close

  # Crashes browser on the main thread.
  experimental command crash

  # Crashes GPU process.
  experimental command crashGpuProcess

  # Returns version information.
  command getVersion
    returns
      # Protocol version.
      string protocolVersion
      # Product name.
      string product
      # Product revision.
      string revision
      # User-Agent.
      string userAgent
      # V8 version.
      string jsVersion

  # Returns the command line switches for the browser process if, and only if
  # --enable-automation is on the commandline.
  experimental command getBrowserCommandLine
    returns
      # Commandline parameters
      array of string arguments

  # Chrome histogram bucket.
  experimental type Bucket extends object
    properties
      # Minimum value (inclusive).
      integer low
      # Maximum value (exclusive).
      integer high
      # Number of samples.
      integer count

  # Chrome histogram.
  experimental type Histogram extends object
    properties
      # Name.
      string name
      # Sum of sample values.
      integer sum
      # Total number of samples.
      integer count
      # Buckets.
      array of Bucket buckets

  # Get Chrome histograms.
  experimental command getHistograms
    parameters
      # Requested substring in name. Only histograms which have query as a
      # substring in their name are extracted. An empty or absent query returns
      # all histograms.
      optional string query
      # If true, retrieve delta since last call.
      optional boolean delta

    returns
      # Histograms.
      array of Histogram histograms

  # Get a Chrome histogram by name.
  experimental command getHistogram
    parameters
      # Requested histogram name.
      string name
      # If true, retrieve delta since last call.
      optional boolean delta
    returns
      # Histogram.
      Histogram histogram

  # Get position and size of the browser window.
  experimental command getWindowBounds
    parameters
      # Browser window id.
      WindowID windowId
    returns
      # Bounds information of the window. When window state is 'minimized', the restored window
      # position and size are returned.
      Bounds bounds

  # Get the browser window that contains the devtools target.
  experimental command getWindowForTarget
    parameters
      # Devtools agent host id. If called as a part of the session, associated targetId is used.
      optional Target.TargetID targetId
    returns
      # Browser window id.
      WindowID windowId
      # Bounds information of the window. When window state is 'minimized', the restored window
      # position and size are returned.
      Bounds bounds

  # Set position and/or size of the browser window.
  experimental command setWindowBounds
    parameters
      # Browser window id.
      WindowID windowId
      # New window bounds. The 'minimized', 'maximized' and 'fullscreen' states cannot be combined
      # with 'left', 'top', 'width' or 'height'. Leaves unspecified fields unchanged.
      Bounds bounds

  # Set dock tile details, platform-specific.
  experimental command setDockTile
    parameters
      optional string badgeLabel
      # Png encoded image.
      optional binary image

# This domain exposes CSS read/write operations. All CSS objects (stylesheets, rules, and styles)
# have an associated `id` used in subsequent operations on the related object. Each object type has
# a specific `id` structure, and those are not interchangeable between objects of different kinds.
# CSS objects can be loaded using the `get*ForNode()` calls (which accept a DOM node id). A client
# can also keep track of stylesheets via the `styleSheetAdded`/`styleSheetRemoved` events and
# subsequently load the required stylesheet contents using the `getStyleSheet[Text]()` methods.
experimental domain CSS
  depends on DOM

  type StyleSheetId extends string

  # Stylesheet type: "injected" for stylesheets injected via extension, "user-agent" for user-agent
  # stylesheets, "inspector" for stylesheets created by the inspector (i.e. those holding the "via
  # inspector" rules), "regular" for regular stylesheets.
  type StyleSheetOrigin extends string
    enum
      injected
      user-agent
      inspector
      regular

  # CSS rule collection for a single pseudo style.
  type PseudoElementMatches extends object
    properties
      # Pseudo element type.
      DOM.PseudoType pseudoType
      # Matches of CSS rules applicable to the pseudo style.
      array of RuleMatch matches

  # Inherited CSS rule collection from ancestor node.
  type InheritedStyleEntry extends object
    properties
      # The ancestor node's inline style, if any, in the style inheritance chain.
      optional CSSStyle inlineStyle
      # Matches of CSS rules matching the ancestor node in the style inheritance chain.
      array of RuleMatch matchedCSSRules

  # Match data for a CSS rule.
  type RuleMatch extends object
    properties
      # CSS rule in the match.
      CSSRule rule
      # Matching selector indices in the rule's selectorList selectors (0-based).
      array of integer matchingSelectors

  # Data for a simple selector (these are delimited by commas in a selector list).
  type Value extends object
    properties
      # Value text.
      string text
      # Value range in the underlying resource (if available).
      optional SourceRange range

  # Selector list data.
  type SelectorList extends object
    properties
      # Selectors in the list.
      array of Value selectors
      # Rule selector text.
      string text

  # CSS stylesheet metainformation.
  type CSSStyleSheetHeader extends object
    properties
      # The stylesheet identifier.
      StyleSheetId styleSheetId
      # Owner frame identifier.
      Page.FrameId frameId
      # Stylesheet resource URL.
      string sourceURL
      # URL of source map associated with the stylesheet (if any).
      optional string sourceMapURL
      # Stylesheet origin.
      StyleSheetOrigin origin
      # Stylesheet title.
      string title
      # The backend id for the owner node of the stylesheet.
      optional DOM.BackendNodeId ownerNode
      # Denotes whether the stylesheet is disabled.
      boolean disabled
      # Whether the sourceURL field value comes from the sourceURL comment.
      optional boolean hasSourceURL
      # Whether this stylesheet is created for STYLE tag by parser. This flag is not set for
      # document.written STYLE tags.
      boolean isInline
      # Line offset of the stylesheet within the resource (zero based).
      number startLine
      # Column offset of the stylesheet within the resource (zero based).
      number startColumn
      # Size of the content (in characters).
      number length
      # Line offset of the end of the stylesheet within the resource (zero based).
      number endLine
      # Column offset of the end of the stylesheet within the resource (zero based).
      number endColumn

  # CSS rule representation.
  type CSSRule extends object
    properties
      # The css style sheet identifier (absent for user agent stylesheet and user-specified
      # stylesheet rules) this rule came from.
      optional StyleSheetId styleSheetId
      # Rule selector data.
      SelectorList selectorList
      # Parent stylesheet's origin.
      StyleSheetOrigin origin
      # Associated style declaration.
      CSSStyle style
      # Media list array (for rules involving media queries). The array enumerates media queries
      # starting with the innermost one, going outwards.
      optional array of CSSMedia media

  # CSS coverage information.
  type RuleUsage extends object
    properties
      # The css style sheet identifier (absent for user agent stylesheet and user-specified
      # stylesheet rules) this rule came from.
      StyleSheetId styleSheetId
      # Offset of the start of the rule (including selector) from the beginning of the stylesheet.
      number startOffset
      # Offset of the end of the rule body from the beginning of the stylesheet.
      number endOffset
      # Indicates whether the rule was actually used by some element in the page.
      boolean used

  # Text range within a resource. All numbers are zero-based.
  type SourceRange extends object
    properties
      # Start line of range.
      integer startLine
      # Start column of range (inclusive).
      integer startColumn
      # End line of range
      integer endLine
      # End column of range (exclusive).
      integer endColumn

  type ShorthandEntry extends object
    properties
      # Shorthand name.
      string name
      # Shorthand value.
      string value
      # Whether the property has "!important" annotation (implies `false` if absent).
      optional boolean important

  type CSSComputedStyleProperty extends object
    properties
      # Computed style property name.
      string name
      # Computed style property value.
      string value

  # CSS style representation.
  type CSSStyle extends object
    properties
      # The css style sheet identifier (absent for user agent stylesheet and user-specified
      # stylesheet rules) this rule came from.
      optional StyleSheetId styleSheetId
      # CSS properties in the style.
      array of CSSProperty cssProperties
      # Computed values for all shorthands found in the style.
      array of ShorthandEntry shorthandEntries
      # Style declaration text (if available).
      optional string cssText
      # Style declaration range in the enclosing stylesheet (if available).
      optional SourceRange range

  # CSS property declaration data.
  type CSSProperty extends object
    properties
      # The property name.
      string name
      # The property value.
      string value
      # Whether the property has "!important" annotation (implies `false` if absent).
      optional boolean important
      # Whether the property is implicit (implies `false` if absent).
      optional boolean implicit
      # The full property text as specified in the style.
      optional string text
      # Whether the property is understood by the browser (implies `true` if absent).
      optional boolean parsedOk
      # Whether the property is disabled by the user (present for source-based properties only).
      optional boolean disabled
      # The entire property range in the enclosing style declaration (if available).
      optional SourceRange range

  # CSS media rule descriptor.
  type CSSMedia extends object
    properties
      # Media query text.
      string text
      # Source of the media query: "mediaRule" if specified by a @media rule, "importRule" if
      # specified by an @import rule, "linkedSheet" if specified by a "media" attribute in a linked
      # stylesheet's LINK tag, "inlineSheet" if specified by a "media" attribute in an inline
      # stylesheet's STYLE tag.
      enum source
        mediaRule
        importRule
        linkedSheet
        inlineSheet
      # URL of the document containing the media query description.
      optional string sourceURL
      # The associated rule (@media or @import) header range in the enclosing stylesheet (if
      # available).
      optional SourceRange range
      # Identifier of the stylesheet containing this object (if exists).
      optional StyleSheetId styleSheetId
      # Array of media queries.
      optional array of MediaQuery mediaList

  # Media query descriptor.
  type MediaQuery extends object
    properties
      # Array of media query expressions.
      array of MediaQueryExpression expressions
      # Whether the media query condition is satisfied.
      boolean active

  # Media query expression descriptor.
  type MediaQueryExpression extends object
    properties
      # Media query expression value.
      number value
      # Media query expression units.
      string unit
      # Media query expression feature.
      string feature
      # The associated range of the value text in the enclosing stylesheet (if available).
      optional SourceRange valueRange
      # Computed length of media query expression (if applicable).
      optional number computedLength

  # Information about amount of glyphs that were rendered with given font.
  type PlatformFontUsage extends object
    properties
      # Font's family name reported by platform.
      string familyName
      # Indicates if the font was downloaded or resolved locally.
      boolean isCustomFont
      # Amount of glyphs that were rendered with this font.
      number glyphCount

  # Properties of a web font: https://www.w3.org/TR/2008/REC-CSS2-20080411/fonts.html#font-descriptions
  type FontFace extends object
    properties
      # The font-family.
      string fontFamily
      # The font-style.
      string fontStyle
      # The font-variant.
      string fontVariant
      # The font-weight.
      string fontWeight
      # The font-stretch.
      string fontStretch
      # The unicode-range.
      string unicodeRange
      # The src.
      string src
      # The resolved platform font family
      string platformFontFamily

  # CSS keyframes rule representation.
  type CSSKeyframesRule extends object
    properties
      # Animation name.
      Value animationName
      # List of keyframes.
      array of CSSKeyframeRule keyframes

  # CSS keyframe rule representation.
  type CSSKeyframeRule extends object
    properties
      # The css style sheet identifier (absent for user agent stylesheet and user-specified
      # stylesheet rules) this rule came from.
      optional StyleSheetId styleSheetId
      # Parent stylesheet's origin.
      StyleSheetOrigin origin
      # Associated key text.
      Value keyText
      # Associated style declaration.
      CSSStyle style

  # A descriptor of operation to mutate style declaration text.
  type StyleDeclarationEdit extends object
    properties
      # The css style sheet identifier.
      StyleSheetId styleSheetId
      # The range of the style text in the enclosing stylesheet.
      SourceRange range
      # New style text.
      string text

  # Inserts a new rule with the given `ruleText` in a stylesheet with given `styleSheetId`, at the
  # position specified by `location`.
  command addRule
    parameters
      # The css style sheet identifier where a new rule should be inserted.
      StyleSheetId styleSheetId
      # The text of a new rule.
      string ruleText
      # Text position of a new rule in the target style sheet.
      SourceRange location
    returns
      # The newly created rule.
      CSSRule rule

  # Returns all class names from specified stylesheet.
  command collectClassNames
    parameters
      StyleSheetId styleSheetId
    returns
      # Class name list.
      array of string classNames

  # Creates a new special "via-inspector" stylesheet in the frame with given `frameId`.
  command createStyleSheet
    parameters
      # Identifier of the frame where "via-inspector" stylesheet should be created.
      Page.FrameId frameId
    returns
      # Identifier of the created "via-inspector" stylesheet.
      StyleSheetId styleSheetId

  # Disables the CSS agent for the given page.
  command disable

  # Enables the CSS agent for the given page. Clients should not assume that the CSS agent has been
  # enabled until the result of this command is received.
  command enable

  # Ensures that the given node will have specified pseudo-classes whenever its style is computed by
  # the browser.
  command forcePseudoState
    parameters
      # The element id for which to force the pseudo state.
      DOM.NodeId nodeId
      # Element pseudo classes to force when computing the element's style.
      array of string forcedPseudoClasses

  command getBackgroundColors
    parameters
      # Id of the node to get background colors for.
      DOM.NodeId nodeId
    returns
      # The range of background colors behind this element, if it contains any visible text. If no
      # visible text is present, this will be undefined. In the case of a flat background color,
      # this will consist of simply that color. In the case of a gradient, this will consist of each
      # of the color stops. For anything more complicated, this will be an empty array. Images will
      # be ignored (as if the image had failed to load).
      optional array of string backgroundColors
      # The computed font size for this node, as a CSS computed value string (e.g. '12px').
      optional string computedFontSize
      # The computed font weight for this node, as a CSS computed value string (e.g. 'normal' or
      # '100').
      optional string computedFontWeight

  # Returns the computed style for a DOM node identified by `nodeId`.
  command getComputedStyleForNode
    parameters
      DOM.NodeId nodeId
    returns
      # Computed style for the specified DOM node.
      array of CSSComputedStyleProperty computedStyle

  # Returns the styles defined inline (explicitly in the "style" attribute and implicitly, using DOM
  # attributes) for a DOM node identified by `nodeId`.
  command getInlineStylesForNode
    parameters
      DOM.NodeId nodeId
    returns
      # Inline style for the specified DOM node.
      optional CSSStyle inlineStyle
      # Attribute-defined element style (e.g. resulting from "width=20 height=100%").
      optional CSSStyle attributesStyle

  # Returns requested styles for a DOM node identified by `nodeId`.
  command getMatchedStylesForNode
    parameters
      DOM.NodeId nodeId
    returns
      # Inline style for the specified DOM node.
      optional CSSStyle inlineStyle
      # Attribute-defined element style (e.g. resulting from "width=20 height=100%").
      optional CSSStyle attributesStyle
      # CSS rules matching this node, from all applicable stylesheets.
      optional array of RuleMatch matchedCSSRules
      # Pseudo style matches for this node.
      optional array of PseudoElementMatches pseudoElements
      # A chain of inherited styles (from the immediate node parent up to the DOM tree root).
      optional array of InheritedStyleEntry inherited
      # A list of CSS keyframed animations matching this node.
      optional array of CSSKeyframesRule cssKeyframesRules

  # Returns all media queries parsed by the rendering engine.
  command getMediaQueries
    returns
      array of CSSMedia medias

  # Requests information about platform fonts which we used to render child TextNodes in the given
  # node.
  command getPlatformFontsForNode
    parameters
      DOM.NodeId nodeId
    returns
      # Usage statistics for every employed platform font.
      array of PlatformFontUsage fonts

  # Returns the current textual content for a stylesheet.
  command getStyleSheetText
    parameters
      StyleSheetId styleSheetId
    returns
      # The stylesheet text.
      string text

  # Find a rule with the given active property for the given node and set the new value for this
  # property
  command setEffectivePropertyValueForNode
    parameters
      # The element id for which to set property.
      DOM.NodeId nodeId
      string propertyName
      string value

  # Modifies the keyframe rule key text.
  command setKeyframeKey
    parameters
      StyleSheetId styleSheetId
      SourceRange range
      string keyText
    returns
      # The resulting key text after modification.
      Value keyText

  # Modifies the rule selector.
  command setMediaText
    parameters
      StyleSheetId styleSheetId
      SourceRange range
      string text
    returns
      # The resulting CSS media rule after modification.
      CSSMedia media

  # Modifies the rule selector.
  command setRuleSelector
    parameters
      StyleSheetId styleSheetId
      SourceRange range
      string selector
    returns
      # The resulting selector list after modification.
      SelectorList selectorList

  # Sets the new stylesheet text.
  command setStyleSheetText
    parameters
      StyleSheetId styleSheetId
      string text
    returns
      # URL of source map associated with script (if any).
      optional string sourceMapURL

  # Applies specified style edits one after another in the given order.
  command setStyleTexts
    parameters
      array of StyleDeclarationEdit edits
    returns
      # The resulting styles after modification.
      array of CSSStyle styles

  # Enables the selector recording.
  command startRuleUsageTracking

  # Stop tracking rule usage and return the list of rules that were used since last call to
  # `takeCoverageDelta` (or since start of coverage instrumentation)
  command stopRuleUsageTracking
    returns
      array of RuleUsage ruleUsage

  # Obtain list of rules that became used since last call to this method (or since start of coverage
  # instrumentation)
  command takeCoverageDelta
    returns
      array of RuleUsage coverage

  # Fires whenever a web font is updated.  A non-empty font parameter indicates a successfully loaded
  # web font
  event fontsUpdated
    parameters
      # The web font that has loaded.
      optional FontFace font

  # Fires whenever a MediaQuery result changes (for example, after a browser window has been
  # resized.) The current implementation considers only viewport-dependent media features.
  event mediaQueryResultChanged

  # Fired whenever an active document stylesheet is added.
  event styleSheetAdded
    parameters
      # Added stylesheet metainfo.
      CSSStyleSheetHeader header

  # Fired whenever a stylesheet is changed as a result of the client operation.
  event styleSheetChanged
    parameters
      StyleSheetId styleSheetId

  # Fired whenever an active document stylesheet is removed.
  event styleSheetRemoved
    parameters
      # Identifier of the removed stylesheet.
      StyleSheetId styleSheetId

experimental domain CacheStorage

  # Unique identifier of the Cache object.
  type CacheId extends string

  # type of HTTP response cached
  type CachedResponseType extends string
    enum
      basic
      cors
      default
      error
      opaqueResponse
      opaqueRedirect

  # Data entry.
  type DataEntry extends object
    properties
      # Request URL.
      string requestURL
      # Request method.
      string requestMethod
      # Request headers
      array of Header requestHeaders
      # Number of seconds since epoch.
      number responseTime
      # HTTP response status code.
      integer responseStatus
      # HTTP response status text.
      string responseStatusText
      # HTTP response type
      CachedResponseType responseType
      # Response headers
      array of Header responseHeaders

  # Cache identifier.
  type Cache extends object
    properties
      # An opaque unique id of the cache.
      CacheId cacheId
      # Security origin of the cache.
      string securityOrigin
      # The name of the cache.
      string cacheName

  type Header extends object
    properties
      string name
      string value

  # Cached response
  type CachedResponse extends object
    properties
      # Entry content, base64-encoded.
      binary body

  # Deletes a cache.
  command deleteCache
    parameters
      # Id of cache for deletion.
      CacheId cacheId

  # Deletes a cache entry.
  command deleteEntry
    parameters
      # Id of cache where the entry will be deleted.
      CacheId cacheId
      # URL spec of the request.
      string request

  # Requests cache names.
  command requestCacheNames
    parameters
      # Security origin.
      string securityOrigin
    returns
      # Caches for the security origin.
      array of Cache caches

  # Fetches cache entry.
  command requestCachedResponse
    parameters
      # Id of cache that contains the entry.
      CacheId cacheId
      # URL spec of the request.
      string requestURL
      # headers of the request.
      array of Header requestHeaders
    returns
      # Response read from the cache.
      CachedResponse response

  # Requests data from cache.
  command requestEntries
    parameters
      # ID of cache to get entries from.
      CacheId cacheId
      # Number of records to skip.
      optional integer skipCount
      # Number of records to fetch.
      optional integer pageSize
      # If present, only return the entries containing this substring in the path
      optional string pathFilter
    returns
      # Array of object store data entries.
      array of DataEntry cacheDataEntries
      # Count of returned entries from this storage. If pathFilter is empty, it
      # is the count of all entries from this storage.
      number returnCount

# A domain for interacting with Cast, Presentation API, and Remote Playback API
# functionalities.
experimental domain Cast

  type Sink extends object
    properties
      string name
      string id
      # Text describing the current session. Present only if there is an active
      # session on the sink.
      optional string session

  # Starts observing for sinks that can be used for tab mirroring, and if set,
  # sinks compatible with |presentationUrl| as well. When sinks are found, a
  # |sinksUpdated| event is fired.
  # Also starts observing for issue messages. When an issue is added or removed,
  # an |issueUpdated| event is fired.
  command enable
    parameters
      optional string presentationUrl

  # Stops observing for sinks and issues.
  command disable

  # Sets a sink to be used when the web page requests the browser to choose a
  # sink via Presentation API, Remote Playback API, or Cast SDK.
  command setSinkToUse
    parameters
      string sinkName

  # Starts mirroring the tab to the sink.
  command startTabMirroring
    parameters
      string sinkName

  # Stops the active Cast session on the sink.
  command stopCasting
    parameters
      string sinkName

  # This is fired whenever the list of available sinks changes. A sink is a
  # device or a software surface that you can cast to.
  event sinksUpdated
    parameters
      array of Sink sinks

  # This is fired whenever the outstanding issue/error message changes.
  # |issueMessage| is empty if there is no issue.
  event issueUpdated
    parameters
      string issueMessage


# This domain exposes DOM read/write operations. Each DOM Node is represented with its mirror object
# that has an `id`. This `id` can be used to get additional information on the Node, resolve it into
# the JavaScript object wrapper, etc. It is important that client receives DOM events only for the
# nodes that are known to the client. Backend keeps track of the nodes that were sent to the client
# and never sends the same node twice. It is client's responsibility to collect information about
# the nodes that were sent to the client.<p>Note that `iframe` owner elements will return
# corresponding document elements as their child nodes.</p>
domain DOM
  depends on Runtime

  # Unique DOM node identifier.
  type NodeId extends integer

  # Unique DOM node identifier used to reference a node that may not have been pushed to the
  # front-end.
  type BackendNodeId extends integer

  # Backend node with a friendly name.
  type BackendNode extends object
    properties
      # `Node`'s nodeType.
      integer nodeType
      # `Node`'s nodeName.
      string nodeName
      BackendNodeId backendNodeId

  # Pseudo element type.
  type PseudoType extends string
    enum
      first-line
      first-letter
      before
      after
      backdrop
      selection
      first-line-inherited
      scrollbar
      scrollbar-thumb
      scrollbar-button
      scrollbar-track
      scrollbar-track-piece
      scrollbar-corner
      resizer
      input-list-button

  # Shadow root type.
  type ShadowRootType extends string
    enum
      user-agent
      open
      closed

  # DOM interaction is implemented in terms of mirror objects that represent the actual DOM nodes.
  # DOMNode is a base node mirror type.
  type Node extends object
    properties
      # Node identifier that is passed into the rest of the DOM messages as the `nodeId`. Backend
      # will only push node with given `id` once. It is aware of all requested nodes and will only
      # fire DOM events for nodes known to the client.
      NodeId nodeId
      # The id of the parent node if any.
      optional NodeId parentId
      # The BackendNodeId for this node.
      BackendNodeId backendNodeId
      # `Node`'s nodeType.
      integer nodeType
      # `Node`'s nodeName.
      string nodeName
      # `Node`'s localName.
      string localName
      # `Node`'s nodeValue.
      string nodeValue
      # Child count for `Container` nodes.
      optional integer childNodeCount
      # Child nodes of this node when requested with children.
      optional array of Node children
      # Attributes of the `Element` node in the form of flat array `[name1, value1, name2, value2]`.
      optional array of string attributes
      # Document URL that `Document` or `FrameOwner` node points to.
      optional string documentURL
      # Base URL that `Document` or `FrameOwner` node uses for URL completion.
      optional string baseURL
      # `DocumentType`'s publicId.
      optional string publicId
      # `DocumentType`'s systemId.
      optional string systemId
      # `DocumentType`'s internalSubset.
      optional string internalSubset
      # `Document`'s XML version in case of XML documents.
      optional string xmlVersion
      # `Attr`'s name.
      optional string name
      # `Attr`'s value.
      optional string value
      # Pseudo element type for this node.
      optional PseudoType pseudoType
      # Shadow root type.
      optional ShadowRootType shadowRootType
      # Frame ID for frame owner elements.
      optional Page.FrameId frameId
      # Content document for frame owner elements.
      optional Node contentDocument
      # Shadow root list for given element host.
      optional array of Node shadowRoots
      # Content document fragment for template elements.
      optional Node templateContent
      # Pseudo elements associated with this node.
      optional array of Node pseudoElements
      # Import document for the HTMLImport links.
      optional Node importedDocument
      # Distributed nodes for given insertion point.
      optional array of BackendNode distributedNodes
      # Whether the node is SVG.
      optional boolean isSVG

  # A structure holding an RGBA color.
  type RGBA extends object
    properties
      # The red component, in the [0-255] range.
      integer r
      # The green component, in the [0-255] range.
      integer g
      # The blue component, in the [0-255] range.
      integer b
      # The alpha component, in the [0-1] range (default: 1).
      optional number a

  # An array of quad vertices, x immediately followed by y for each point, points clock-wise.
  type Quad extends array of number

  # Box model.
  type BoxModel extends object
    properties
      # Content box
      Quad content
      # Padding box
      Quad padding
      # Border box
      Quad border
      # Margin box
      Quad margin
      # Node width
      integer width
      # Node height
      integer height
      # Shape outside coordinates
      optional ShapeOutsideInfo shapeOutside

  # CSS Shape Outside details.
  type ShapeOutsideInfo extends object
    properties
      # Shape bounds
      Quad bounds
      # Shape coordinate details
      array of any shape
      # Margin shape bounds
      array of any marginShape

  # Rectangle.
  type Rect extends object
    properties
      # X coordinate
      number x
      # Y coordinate
      number y
      # Rectangle width
      number width
      # Rectangle height
      number height

  # Collects class names for the node with given id and all of it's child nodes.
  experimental command collectClassNamesFromSubtree
    parameters
      # Id of the node to collect class names.
      NodeId nodeId
    returns
      # Class name list.
      array of string classNames

  # Creates a deep copy of the specified node and places it into the target container before the
  # given anchor.
  experimental command copyTo
    parameters
      # Id of the node to copy.
      NodeId nodeId
      # Id of the element to drop the copy into.
      NodeId targetNodeId
      # Drop the copy before this node (if absent, the copy becomes the last child of
      # `targetNodeId`).
      optional NodeId insertBeforeNodeId
    returns
      # Id of the node clone.
      NodeId nodeId

  # Describes node given its id, does not require domain to be enabled. Does not start tracking any
  # objects, can be used for automation.
  command describeNode
    parameters
      # Identifier of the node.
      optional NodeId nodeId
      # Identifier of the backend node.
      optional BackendNodeId backendNodeId
      # JavaScript object id of the node wrapper.
      optional Runtime.RemoteObjectId objectId
      # The maximum depth at which children should be retrieved, defaults to 1. Use -1 for the
      # entire subtree or provide an integer larger than 0.
      optional integer depth
      # Whether or not iframes and shadow roots should be traversed when returning the subtree
      # (default is false).
      optional boolean pierce
    returns
      # Node description.
      Node node

  # Disables DOM agent for the given page.
  command disable

  # Discards search results from the session with the given id. `getSearchResults` should no longer
  # be called for that search.
  experimental command discardSearchResults
    parameters
      # Unique search session identifier.
      string searchId

  # Enables DOM agent for the given page.
  command enable

  # Focuses the given element.
  command focus
    parameters
      # Identifier of the node.
      optional NodeId nodeId
      # Identifier of the backend node.
      optional BackendNodeId backendNodeId
      # JavaScript object id of the node wrapper.
      optional Runtime.RemoteObjectId objectId

  # Returns attributes for the specified node.
  command getAttributes
    parameters
      # Id of the node to retrieve attibutes for.
      NodeId nodeId
    returns
      # An interleaved array of node attribute names and values.
      array of string attributes

  # Returns boxes for the given node.
  command getBoxModel
    parameters
      # Identifier of the node.
      optional NodeId nodeId
      # Identifier of the backend node.
      optional BackendNodeId backendNodeId
      # JavaScript object id of the node wrapper.
      optional Runtime.RemoteObjectId objectId
    returns
      # Box model for the node.
      BoxModel model

  # Returns quads that describe node position on the page. This method
  # might return multiple quads for inline nodes.
  experimental command getContentQuads
    parameters
      # Identifier of the node.
      optional NodeId nodeId
      # Identifier of the backend node.
      optional BackendNodeId backendNodeId
      # JavaScript object id of the node wrapper.
      optional Runtime.RemoteObjectId objectId
    returns
      # Quads that describe node layout relative to viewport.
      array of Quad quads

  # Returns the root DOM node (and optionally the subtree) to the caller.
  command getDocument
    parameters
      # The maximum depth at which children should be retrieved, defaults to 1. Use -1 for the
      # entire subtree or provide an integer larger than 0.
      optional integer depth
      # Whether or not iframes and shadow roots should be traversed when returning the subtree
      # (default is false).
      optional boolean pierce
    returns
      # Resulting node.
      Node root

  # Returns the root DOM node (and optionally the subtree) to the caller.
  command getFlattenedDocument
    parameters
      # The maximum depth at which children should be retrieved, defaults to 1. Use -1 for the
      # entire subtree or provide an integer larger than 0.
      optional integer depth
      # Whether or not iframes and shadow roots should be traversed when returning the subtree
      # (default is false).
      optional boolean pierce
    returns
      # Resulting node.
      array of Node nodes

  # Returns node id at given location. Depending on whether DOM domain is enabled, nodeId is
  # either returned or not.
  command getNodeForLocation
    parameters
      # X coordinate.
      integer x
      # Y coordinate.
      integer y
      # False to skip to the nearest non-UA shadow root ancestor (default: false).
      optional boolean includeUserAgentShadowDOM
      # Whether to ignore pointer-events: none on elements and hit test them.
      optional boolean ignorePointerEventsNone
    returns
      # Resulting node.
      BackendNodeId backendNodeId
      # Frame this node belongs to.
      Page.FrameId frameId
      # Id of the node at given coordinates, only when enabled and requested document.
      optional NodeId nodeId

  # Returns node's HTML markup.
  command getOuterHTML
    parameters
      # Identifier of the node.
      optional NodeId nodeId
      # Identifier of the backend node.
      optional BackendNodeId backendNodeId
      # JavaScript object id of the node wrapper.
      optional Runtime.RemoteObjectId objectId
    returns
      # Outer HTML markup.
      string outerHTML

  # Returns the id of the nearest ancestor that is a relayout boundary.
  experimental command getRelayoutBoundary
    parameters
      # Id of the node.
      NodeId nodeId
    returns
      # Relayout boundary node id for the given node.
      NodeId nodeId

  # Returns search results from given `fromIndex` to given `toIndex` from the search with the given
  # identifier.
  experimental command getSearchResults
    parameters
      # Unique search session identifier.
      string searchId
      # Start index of the search result to be returned.
      integer fromIndex
      # End index of the search result to be returned.
      integer toIndex
    returns
      # Ids of the search result nodes.
      array of NodeId nodeIds

  # Hides any highlight.
  command hideHighlight
    # Use 'Overlay.hideHighlight' instead
    redirect Overlay

  # Highlights DOM node.
  command highlightNode
    # Use 'Overlay.highlightNode' instead
    redirect Overlay

  # Highlights given rectangle.
  command highlightRect
    # Use 'Overlay.highlightRect' instead
    redirect Overlay

  # Marks last undoable state.
  experimental command markUndoableState

  # Moves node into the new container, places it before the given anchor.
  command moveTo
    parameters
      # Id of the node to move.
      NodeId nodeId
      # Id of the element to drop the moved node into.
      NodeId targetNodeId
      # Drop node before this one (if absent, the moved node becomes the last child of
      # `targetNodeId`).
      optional NodeId insertBeforeNodeId
    returns
      # New id of the moved node.
      NodeId nodeId

  # Searches for a given string in the DOM tree. Use `getSearchResults` to access search results or
  # `cancelSearch` to end this search session.
  experimental command performSearch
    parameters
      # Plain text or query selector or XPath search query.
      string query
      # True to search in user agent shadow DOM.
      optional boolean includeUserAgentShadowDOM
    returns
      # Unique search session identifier.
      string searchId
      # Number of search results.
      integer resultCount

  # Requests that the node is sent to the caller given its path. // FIXME, use XPath
  experimental command pushNodeByPathToFrontend
    parameters
      # Path to node in the proprietary format.
      string path
    returns
      # Id of the node for given path.
      NodeId nodeId

  # Requests that a batch of nodes is sent to the caller given their backend node ids.
  experimental command pushNodesByBackendIdsToFrontend
    parameters
      # The array of backend node ids.
      array of BackendNodeId backendNodeIds
    returns
      # The array of ids of pushed nodes that correspond to the backend ids specified in
      # backendNodeIds.
      array of NodeId nodeIds

  # Executes `querySelector` on a given node.
  command querySelector
    parameters
      # Id of the node to query upon.
      NodeId nodeId
      # Selector string.
      string selector
    returns
      # Query selector result.
      NodeId nodeId

  # Executes `querySelectorAll` on a given node.
  command querySelectorAll
    parameters
      # Id of the node to query upon.
      NodeId nodeId
      # Selector string.
      string selector
    returns
      # Query selector result.
      array of NodeId nodeIds

  # Re-does the last undone action.
  experimental command redo

  # Removes attribute with given name from an element with given id.
  command removeAttribute
    parameters
      # Id of the element to remove attribute from.
      NodeId nodeId
      # Name of the attribute to remove.
      string name

  # Removes node with given id.
  command removeNode
    parameters
      # Id of the node to remove.
      NodeId nodeId

  # Requests that children of the node with given id are returned to the caller in form of
  # `setChildNodes` events where not only immediate children are retrieved, but all children down to
  # the specified depth.
  command requestChildNodes
    parameters
      # Id of the node to get children for.
      NodeId nodeId
      # The maximum depth at which children should be retrieved, defaults to 1. Use -1 for the
      # entire subtree or provide an integer larger than 0.
      optional integer depth
      # Whether or not iframes and shadow roots should be traversed when returning the sub-tree
      # (default is false).
      optional boolean pierce

  # Requests that the node is sent to the caller given the JavaScript node object reference. All
  # nodes that form the path from the node to the root are also sent to the client as a series of
  # `setChildNodes` notifications.
  command requestNode
    parameters
      # JavaScript object id to convert into node.
      Runtime.RemoteObjectId objectId
    returns
      # Node id for given object.
      NodeId nodeId

  # Resolves the JavaScript node object for a given NodeId or BackendNodeId.
  command resolveNode
    parameters
      # Id of the node to resolve.
      optional NodeId nodeId
      # Backend identifier of the node to resolve.
      optional DOM.BackendNodeId backendNodeId
      # Symbolic group name that can be used to release multiple objects.
      optional string objectGroup
      # Execution context in which to resolve the node.
      optional Runtime.ExecutionContextId executionContextId
    returns
      # JavaScript object wrapper for given node.
      Runtime.RemoteObject object

  # Sets attribute for an element with given id.
  command setAttributeValue
    parameters
      # Id of the element to set attribute for.
      NodeId nodeId
      # Attribute name.
      string name
      # Attribute value.
      string value

  # Sets attributes on element with given id. This method is useful when user edits some existing
  # attribute value and types in several attribute name/value pairs.
  command setAttributesAsText
    parameters
      # Id of the element to set attributes for.
      NodeId nodeId
      # Text with a number of attributes. Will parse this text using HTML parser.
      string text
      # Attribute name to replace with new attributes derived from text in case text parsed
      # successfully.
      optional string name

  # Sets files for the given file input element.
  command setFileInputFiles
    parameters
      # Array of file paths to set.
      array of string files
      # Identifier of the node.
      optional NodeId nodeId
      # Identifier of the backend node.
      optional BackendNodeId backendNodeId
      # JavaScript object id of the node wrapper.
      optional Runtime.RemoteObjectId objectId

  # Sets if stack traces should be captured for Nodes. See `Node.getNodeStackTraces`. Default is disabled.
  experimental command setNodeStackTracesEnabled
    parameters
      # Enable or disable.
      boolean enable

  # Gets stack traces associated with a Node. As of now, only provides stack trace for Node creation.
  experimental command getNodeStackTraces
    parameters
      # Id of the node to get stack traces for.
      NodeId nodeId
    returns
      # Creation stack trace, if available.
      optional Runtime.StackTrace creation

  # Returns file information for the given
  # File wrapper.
  experimental command getFileInfo
    parameters
      # JavaScript object id of the node wrapper.
      Runtime.RemoteObjectId objectId
    returns
      string path

  # Enables console to refer to the node with given id via $x (see Command Line API for more details
  # $x functions).
  experimental command setInspectedNode
    parameters
      # DOM node id to be accessible by means of $x command line API.
      NodeId nodeId

  # Sets node name for a node with given id.
  command setNodeName
    parameters
      # Id of the node to set name for.
      NodeId nodeId
      # New node's name.
      string name
    returns
      # New node's id.
      NodeId nodeId

  # Sets node value for a node with given id.
  command setNodeValue
    parameters
      # Id of the node to set value for.
      NodeId nodeId
      # New node's value.
      string value

  # Sets node HTML markup, returns new node id.
  command setOuterHTML
    parameters
      # Id of the node to set markup for.
      NodeId nodeId
      # Outer HTML markup to set.
      string outerHTML

  # Undoes the last performed action.
  experimental command undo

  # Returns iframe node that owns iframe with the given domain.
  experimental command getFrameOwner
    parameters
      Page.FrameId frameId
    returns
      # Resulting node.
      BackendNodeId backendNodeId
      # Id of the node at given coordinates, only when enabled and requested document.
      optional NodeId nodeId

  # Fired when `Element`'s attribute is modified.
  event attributeModified
    parameters
      # Id of the node that has changed.
      NodeId nodeId
      # Attribute name.
      string name
      # Attribute value.
      string value

  # Fired when `Element`'s attribute is removed.
  event attributeRemoved
    parameters
      # Id of the node that has changed.
      NodeId nodeId
      # A ttribute name.
      string name

  # Mirrors `DOMCharacterDataModified` event.
  event characterDataModified
    parameters
      # Id of the node that has changed.
      NodeId nodeId
      # New text value.
      string characterData

  # Fired when `Container`'s child node count has changed.
  event childNodeCountUpdated
    parameters
      # Id of the node that has changed.
      NodeId nodeId
      # New node count.
      integer childNodeCount

  # Mirrors `DOMNodeInserted` event.
  event childNodeInserted
    parameters
      # Id of the node that has changed.
      NodeId parentNodeId
      # If of the previous siblint.
      NodeId previousNodeId
      # Inserted node data.
      Node node

  # Mirrors `DOMNodeRemoved` event.
  event childNodeRemoved
    parameters
      # Parent id.
      NodeId parentNodeId
      # Id of the node that has been removed.
      NodeId nodeId

  # Called when distrubution is changed.
  experimental event distributedNodesUpdated
    parameters
      # Insertion point where distrubuted nodes were updated.
      NodeId insertionPointId
      # Distributed nodes for given insertion point.
      array of BackendNode distributedNodes

  # Fired when `Document` has been totally updated. Node ids are no longer valid.
  event documentUpdated

  # Fired when `Element`'s inline style is modified via a CSS property modification.
  experimental event inlineStyleInvalidated
    parameters
      # Ids of the nodes for which the inline styles have been invalidated.
      array of NodeId nodeIds

  # Called when a pseudo element is added to an element.
  experimental event pseudoElementAdded
    parameters
      # Pseudo element's parent element id.
      NodeId parentId
      # The added pseudo element.
      Node pseudoElement

  # Called when a pseudo element is removed from an element.
  experimental event pseudoElementRemoved
    parameters
      # Pseudo element's parent element id.
      NodeId parentId
      # The removed pseudo element id.
      NodeId pseudoElementId

  # Fired when backend wants to provide client with the missing DOM structure. This happens upon
  # most of the calls requesting node ids.
  event setChildNodes
    parameters
      # Parent node id to populate with children.
      NodeId parentId
      # Child nodes array.
      array of Node nodes

  # Called when shadow root is popped from the element.
  experimental event shadowRootPopped
    parameters
      # Host element id.
      NodeId hostId
      # Shadow root id.
      NodeId rootId

  # Called when shadow root is pushed into the element.
  experimental event shadowRootPushed
    parameters
      # Host element id.
      NodeId hostId
      # Shadow root.
      Node root

# DOM debugging allows setting breakpoints on particular DOM operations and events. JavaScript
# execution will stop on these operations as if there was a regular breakpoint set.
domain DOMDebugger
  depends on DOM
  depends on Debugger
  depends on Runtime

  # DOM breakpoint type.
  type DOMBreakpointType extends string
    enum
      subtree-modified
      attribute-modified
      node-removed

  # Object event listener.
  type EventListener extends object
    properties
      # `EventListener`'s type.
      string type
      # `EventListener`'s useCapture.
      boolean useCapture
      # `EventListener`'s passive flag.
      boolean passive
      # `EventListener`'s once flag.
      boolean once
      # Script id of the handler code.
      Runtime.ScriptId scriptId
      # Line number in the script (0-based).
      integer lineNumber
      # Column number in the script (0-based).
      integer columnNumber
      # Event handler function value.
      optional Runtime.RemoteObject handler
      # Event original handler function value.
      optional Runtime.RemoteObject originalHandler
      # Node the listener is added to (if any).
      optional DOM.BackendNodeId backendNodeId

  # Returns event listeners of the given object.
  command getEventListeners
    parameters
      # Identifier of the object to return listeners for.
      Runtime.RemoteObjectId objectId
      # The maximum depth at which Node children should be retrieved, defaults to 1. Use -1 for the
      # entire subtree or provide an integer larger than 0.
      optional integer depth
      # Whether or not iframes and shadow roots should be traversed when returning the subtree
      # (default is false). Reports listeners for all contexts if pierce is enabled.
      optional boolean pierce
    returns
      # Array of relevant listeners.
      array of EventListener listeners

  # Removes DOM breakpoint that was set using `setDOMBreakpoint`.
  command removeDOMBreakpoint
    parameters
      # Identifier of the node to remove breakpoint from.
      DOM.NodeId nodeId
      # Type of the breakpoint to remove.
      DOMBreakpointType type

  # Removes breakpoint on particular DOM event.
  command removeEventListenerBreakpoint
    parameters
      # Event name.
      string eventName
      # EventTarget interface name.
      experimental optional string targetName

  # Removes breakpoint on particular native event.
  experimental command removeInstrumentationBreakpoint
    parameters
      # Instrumentation name to stop on.
      string eventName

  # Removes breakpoint from XMLHttpRequest.
  command removeXHRBreakpoint
    parameters
      # Resource URL substring.
      string url

  # Sets breakpoint on particular operation with DOM.
  command setDOMBreakpoint
    parameters
      # Identifier of the node to set breakpoint on.
      DOM.NodeId nodeId
      # Type of the operation to stop upon.
      DOMBreakpointType type

  # Sets breakpoint on particular DOM event.
  command setEventListenerBreakpoint
    parameters
      # DOM Event name to stop on (any DOM event will do).
      string eventName
      # EventTarget interface name to stop on. If equal to `"*"` or not provided, will stop on any
      # EventTarget.
      experimental optional string targetName

  # Sets breakpoint on particular native event.
  experimental command setInstrumentationBreakpoint
    parameters
      # Instrumentation name to stop on.
      string eventName

  # Sets breakpoint on XMLHttpRequest.
  command setXHRBreakpoint
    parameters
      # Resource URL substring. All XHRs having this substring in the URL will get stopped upon.
      string url

# This domain facilitates obtaining document snapshots with DOM, layout, and style information.
experimental domain DOMSnapshot
  depends on CSS
  depends on DOM
  depends on DOMDebugger
  depends on Page

  # A Node in the DOM tree.
  type DOMNode extends object
    properties
      # `Node`'s nodeType.
      integer nodeType
      # `Node`'s nodeName.
      string nodeName
      # `Node`'s nodeValue.
      string nodeValue
      # Only set for textarea elements, contains the text value.
      optional string textValue
      # Only set for input elements, contains the input's associated text value.
      optional string inputValue
      # Only set for radio and checkbox input elements, indicates if the element has been checked
      optional boolean inputChecked
      # Only set for option elements, indicates if the element has been selected
      optional boolean optionSelected
      # `Node`'s id, corresponds to DOM.Node.backendNodeId.
      DOM.BackendNodeId backendNodeId
      # The indexes of the node's child nodes in the `domNodes` array returned by `getSnapshot`, if
      # any.
      optional array of integer childNodeIndexes
      # Attributes of an `Element` node.
      optional array of NameValue attributes
      # Indexes of pseudo elements associated with this node in the `domNodes` array returned by
      # `getSnapshot`, if any.
      optional array of integer pseudoElementIndexes
      # The index of the node's related layout tree node in the `layoutTreeNodes` array returned by
      # `getSnapshot`, if any.
      optional integer layoutNodeIndex
      # Document URL that `Document` or `FrameOwner` node points to.
      optional string documentURL
      # Base URL that `Document` or `FrameOwner` node uses for URL completion.
      optional string baseURL
      # Only set for documents, contains the document's content language.
      optional string contentLanguage
      # Only set for documents, contains the document's character set encoding.
      optional string documentEncoding
      # `DocumentType` node's publicId.
      optional string publicId
      # `DocumentType` node's systemId.
      optional string systemId
      # Frame ID for frame owner elements and also for the document node.
      optional Page.FrameId frameId
      # The index of a frame owner element's content document in the `domNodes` array returned by
      # `getSnapshot`, if any.
      optional integer contentDocumentIndex
      # Type of a pseudo element node.
      optional DOM.PseudoType pseudoType
      # Shadow root type.
      optional DOM.ShadowRootType shadowRootType
      # Whether this DOM node responds to mouse clicks. This includes nodes that have had click
      # event listeners attached via JavaScript as well as anchor tags that naturally navigate when
      # clicked.
      optional boolean isClickable
      # Details of the node's event listeners, if any.
      optional array of DOMDebugger.EventListener eventListeners
      # The selected url for nodes with a srcset attribute.
      optional string currentSourceURL
      # The url of the script (if any) that generates this node.
      optional string originURL
      # Scroll offsets, set when this node is a Document.
      optional number scrollOffsetX
      optional number scrollOffsetY

  # Details of post layout rendered text positions. The exact layout should not be regarded as
  # stable and may change between versions.
  type InlineTextBox extends object
    properties
      # The bounding box in document coordinates. Note that scroll offset of the document is ignored.
      DOM.Rect boundingBox
      # The starting index in characters, for this post layout textbox substring. Characters that
      # would be represented as a surrogate pair in UTF-16 have length 2.
      integer startCharacterIndex
      # The number of characters in this post layout textbox substring. Characters that would be
      # represented as a surrogate pair in UTF-16 have length 2.
      integer numCharacters

  # Details of an element in the DOM tree with a LayoutObject.
  type LayoutTreeNode extends object
    properties
      # The index of the related DOM node in the `domNodes` array returned by `getSnapshot`.
      integer domNodeIndex
      # The bounding box in document coordinates. Note that scroll offset of the document is ignored.
      DOM.Rect boundingBox
      # Contents of the LayoutText, if any.
      optional string layoutText
      # The post-layout inline text nodes, if any.
      optional array of InlineTextBox inlineTextNodes
      # Index into the `computedStyles` array returned by `getSnapshot`.
      optional integer styleIndex
      # Global paint order index, which is determined by the stacking order of the nodes. Nodes
      # that are painted together will have the same index. Only provided if includePaintOrder in
      # getSnapshot was true.
      optional integer paintOrder
      # Set to true to indicate the element begins a new stacking context.
      optional boolean isStackingContext

  # A subset of the full ComputedStyle as defined by the request whitelist.
  type ComputedStyle extends object
    properties
      # Name/value pairs of computed style properties.
      array of NameValue properties

  # A name/value pair.
  type NameValue extends object
    properties
      # Attribute/property name.
      string name
      # Attribute/property value.
      string value

  # Index of the string in the strings table.
  type StringIndex extends integer

  # Index of the string in the strings table.
  type ArrayOfStrings extends array of StringIndex

  # Data that is only present on rare nodes.
  type RareStringData extends object
    properties
      array of integer index
      array of StringIndex value

  type RareBooleanData extends object
    properties
      array of integer index

  type RareIntegerData extends object
    properties
      array of integer index
      array of integer value

  type Rectangle extends array of number

  # Document snapshot.
  type DocumentSnapshot extends object
    properties
      # Document URL that `Document` or `FrameOwner` node points to.
      StringIndex documentURL
      # Document title.
      StringIndex title
      # Base URL that `Document` or `FrameOwner` node uses for URL completion.
      StringIndex baseURL
      # Contains the document's content language.
      StringIndex contentLanguage
      # Contains the document's character set encoding.
      StringIndex encodingName
      # `DocumentType` node's publicId.
      StringIndex publicId
      # `DocumentType` node's systemId.
      StringIndex systemId
      # Frame ID for frame owner elements and also for the document node.
      StringIndex frameId
      # A table with dom nodes.
      NodeTreeSnapshot nodes
      # The nodes in the layout tree.
      LayoutTreeSnapshot layout
      # The post-layout inline text nodes.
      TextBoxSnapshot textBoxes
      # Horizontal scroll offset.
      optional number scrollOffsetX
      # Vertical scroll offset.
      optional number scrollOffsetY
      # Document content width.
      optional number contentWidth
      # Document content height.
      optional number contentHeight

  # Table containing nodes.
  type NodeTreeSnapshot extends object
    properties
      # Parent node index.
      optional array of integer parentIndex
      # `Node`'s nodeType.
      optional array of integer nodeType
      # `Node`'s nodeName.
      optional array of StringIndex nodeName
      # `Node`'s nodeValue.
      optional array of StringIndex nodeValue
      # `Node`'s id, corresponds to DOM.Node.backendNodeId.
      optional array of DOM.BackendNodeId backendNodeId
      # Attributes of an `Element` node. Flatten name, value pairs.
      optional array of ArrayOfStrings attributes
      # Only set for textarea elements, contains the text value.
      optional RareStringData textValue
      # Only set for input elements, contains the input's associated text value.
      optional RareStringData inputValue
      # Only set for radio and checkbox input elements, indicates if the element has been checked
      optional RareBooleanData inputChecked
      # Only set for option elements, indicates if the element has been selected
      optional RareBooleanData optionSelected
      # The index of the document in the list of the snapshot documents.
      optional RareIntegerData contentDocumentIndex
      # Type of a pseudo element node.
      optional RareStringData pseudoType
      # Whether this DOM node responds to mouse clicks. This includes nodes that have had click
      # event listeners attached via JavaScript as well as anchor tags that naturally navigate when
      # clicked.
      optional RareBooleanData isClickable
      # The selected url for nodes with a srcset attribute.
      optional RareStringData currentSourceURL
      # The url of the script (if any) that generates this node.
      optional RareStringData originURL

  # Table of details of an element in the DOM tree with a LayoutObject.
  type LayoutTreeSnapshot extends object
    properties
      # Index of the corresponding node in the `NodeTreeSnapshot` array returned by `captureSnapshot`.
      array of integer nodeIndex
      # Array of indexes specifying computed style strings, filtered according to the `computedStyles` parameter passed to `captureSnapshot`.
      array of ArrayOfStrings styles
      # The absolute position bounding box.
      array of Rectangle bounds
      # Contents of the LayoutText, if any.
      array of StringIndex text
      # Stacking context information.
      RareBooleanData stackingContexts
      # Global paint order index, which is determined by the stacking order of the nodes. Nodes
      # that are painted together will have the same index. Only provided if includePaintOrder in
      # captureSnapshot was true.
      optional array of integer paintOrders
      # The offset rect of nodes. Only available when includeDOMRects is set to true
      optional array of Rectangle offsetRects
      # The scroll rect of nodes. Only available when includeDOMRects is set to true
      optional array of Rectangle scrollRects
      # The client rect of nodes. Only available when includeDOMRects is set to true
      optional array of Rectangle clientRects

  # Table of details of the post layout rendered text positions. The exact layout should not be regarded as
  # stable and may change between versions.
  type TextBoxSnapshot extends object
    properties
      # Index of the layout tree node that owns this box collection.
      array of integer layoutIndex
      # The absolute position bounding box.
      array of Rectangle bounds
      # The starting index in characters, for this post layout textbox substring. Characters that
      # would be represented as a surrogate pair in UTF-16 have length 2.
      array of integer start
      # The number of characters in this post layout textbox substring. Characters that would be
      # represented as a surrogate pair in UTF-16 have length 2.
      array of integer length

  # Disables DOM snapshot agent for the given page.
  command disable

  # Enables DOM snapshot agent for the given page.
  command enable

  # Returns a document snapshot, including the full DOM tree of the root node (including iframes,
  # template contents, and imported documents) in a flattened array, as well as layout and
  # white-listed computed style information for the nodes. Shadow DOM in the returned DOM tree is
  # flattened.
  deprecated command getSnapshot
    parameters
      # Whitelist of computed styles to return.
      array of string computedStyleWhitelist
      # Whether or not to retrieve details of DOM listeners (default false).
      optional boolean includeEventListeners
      # Whether to determine and include the paint order index of LayoutTreeNodes (default false).
      optional boolean includePaintOrder
      # Whether to include UA shadow tree in the snapshot (default false).
      optional boolean includeUserAgentShadowTree
    returns
      # The nodes in the DOM tree. The DOMNode at index 0 corresponds to the root document.
      array of DOMNode domNodes
      # The nodes in the layout tree.
      array of LayoutTreeNode layoutTreeNodes
      # Whitelisted ComputedStyle properties for each node in the layout tree.
      array of ComputedStyle computedStyles

  # Returns a document snapshot, including the full DOM tree of the root node (including iframes,
  # template contents, and imported documents) in a flattened array, as well as layout and
  # white-listed computed style information for the nodes. Shadow DOM in the returned DOM tree is
  # flattened.
  command captureSnapshot
    parameters
      # Whitelist of computed styles to return.
      array of string computedStyles
      # Whether to include layout object paint orders into the snapshot.
      optional boolean includePaintOrder
      # Whether to include DOM rectangles (offsetRects, clientRects, scrollRects) into the snapshot
      optional boolean includeDOMRects
    returns
      # The nodes in the DOM tree. The DOMNode at index 0 corresponds to the root document.
      array of DocumentSnapshot documents
      # Shared string table that all string properties refer to with indexes.
      array of string strings

# Query and modify DOM storage.
experimental domain DOMStorage

  # DOM Storage identifier.
  type StorageId extends object
    properties
      # Security origin for the storage.
      string securityOrigin
      # Whether the storage is local storage (not session storage).
      boolean isLocalStorage

  # DOM Storage item.
  type Item extends array of string

  command clear
    parameters
      StorageId storageId

  # Disables storage tracking, prevents storage events from being sent to the client.
  command disable

  # Enables storage tracking, storage events will now be delivered to the client.
  command enable

  command getDOMStorageItems
    parameters
      StorageId storageId
    returns
      array of Item entries

  command removeDOMStorageItem
    parameters
      StorageId storageId
      string key

  command setDOMStorageItem
    parameters
      StorageId storageId
      string key
      string value

  event domStorageItemAdded
    parameters
      StorageId storageId
      string key
      string newValue

  event domStorageItemRemoved
    parameters
      StorageId storageId
      string key

  event domStorageItemUpdated
    parameters
      StorageId storageId
      string key
      string oldValue
      string newValue

  event domStorageItemsCleared
    parameters
      StorageId storageId

experimental domain Database

  # Unique identifier of Database object.
  type DatabaseId extends string

  # Database object.
  type Database extends object
    properties
      # Database ID.
      DatabaseId id
      # Database domain.
      string domain
      # Database name.
      string name
      # Database version.
      string version

  # Database error.
  type Error extends object
    properties
      # Error message.
      string message
      # Error code.
      integer code

  # Disables database tracking, prevents database events from being sent to the client.
  command disable

  # Enables database tracking, database events will now be delivered to the client.
  command enable

  command executeSQL
    parameters
      DatabaseId databaseId
      string query
    returns
      optional array of string columnNames
      optional array of any values
      optional Error sqlError

  command getDatabaseTableNames
    parameters
      DatabaseId databaseId
    returns
      array of string tableNames

  event addDatabase
    parameters
      Database database

experimental domain DeviceOrientation

  # Clears the overridden Device Orientation.
  command clearDeviceOrientationOverride

  # Overrides the Device Orientation.
  command setDeviceOrientationOverride
    parameters
      # Mock alpha
      number alpha
      # Mock beta
      number beta
      # Mock gamma
      number gamma

# This domain emulates different environments for the page.
domain Emulation
  depends on DOM
  depends on Page
  depends on Runtime

  # Screen orientation.
  type ScreenOrientation extends object
    properties
      # Orientation type.
      enum type
        portraitPrimary
        portraitSecondary
        landscapePrimary
        landscapeSecondary
      # Orientation angle.
      integer angle

  type MediaFeature extends object
    properties
      string name
      string value

  # advance: If the scheduler runs out of immediate work, the virtual time base may fast forward to
  # allow the next delayed task (if any) to run; pause: The virtual time base may not advance;
  # pauseIfNetworkFetchesPending: The virtual time base may not advance if there are any pending
  # resource fetches.
  experimental type VirtualTimePolicy extends string
    enum
      advance
      pause
      pauseIfNetworkFetchesPending

  # Tells whether emulation is supported.
  command canEmulate
    returns
      # True if emulation is supported.
      boolean result

  # Clears the overriden device metrics.
  command clearDeviceMetricsOverride

  # Clears the overriden Geolocation Position and Error.
  command clearGeolocationOverride

  # Requests that page scale factor is reset to initial values.
  experimental command resetPageScaleFactor

  # Enables or disables simulating a focused and active page.
  experimental command setFocusEmulationEnabled
    parameters
      # Whether to enable to disable focus emulation.
      boolean enabled

  # Enables CPU throttling to emulate slow CPUs.
  experimental command setCPUThrottlingRate
    parameters
      # Throttling rate as a slowdown factor (1 is no throttle, 2 is 2x slowdown, etc).
      number rate

  # Sets or clears an override of the default background color of the frame. This override is used
  # if the content does not specify one.
  command setDefaultBackgroundColorOverride
    parameters
      # RGBA of the default background color. If not specified, any existing override will be
      # cleared.
      optional DOM.RGBA color

  # Overrides the values of device screen dimensions (window.screen.width, window.screen.height,
  # window.innerWidth, window.innerHeight, and "device-width"/"device-height"-related CSS media
  # query results).
  command setDeviceMetricsOverride
    parameters
      # Overriding width value in pixels (minimum 0, maximum 10000000). 0 disables the override.
      integer width
      # Overriding height value in pixels (minimum 0, maximum 10000000). 0 disables the override.
      integer height
      # Overriding device scale factor value. 0 disables the override.
      number deviceScaleFactor
      # Whether to emulate mobile device. This includes viewport meta tag, overlay scrollbars, text
      # autosizing and more.
      boolean mobile
      # Scale to apply to resulting view image.
      experimental optional number scale
      # Overriding screen width value in pixels (minimum 0, maximum 10000000).
      experimental optional integer screenWidth
      # Overriding screen height value in pixels (minimum 0, maximum 10000000).
      experimental optional integer screenHeight
      # Overriding view X position on screen in pixels (minimum 0, maximum 10000000).
      experimental optional integer positionX
      # Overriding view Y position on screen in pixels (minimum 0, maximum 10000000).
      experimental optional integer positionY
      # Do not set visible view size, rely upon explicit setVisibleSize call.
      experimental optional boolean dontSetVisibleSize
      # Screen orientation override.
      optional ScreenOrientation screenOrientation
      # If set, the visible area of the page will be overridden to this viewport. This viewport
      # change is not observed by the page, e.g. viewport-relative elements do not change positions.
      experimental optional Page.Viewport viewport

  experimental command setScrollbarsHidden
    parameters
      # Whether scrollbars should be always hidden.
      boolean hidden

  experimental command setDocumentCookieDisabled
    parameters
      # Whether document.coookie API should be disabled.
      boolean disabled

  experimental command setEmitTouchEventsForMouse
    parameters
      # Whether touch emulation based on mouse input should be enabled.
      boolean enabled
      # Touch/gesture events configuration. Default: current platform.
      optional enum configuration
        mobile
        desktop

  # Emulates the given media type or media feature for CSS media queries.
  command setEmulatedMedia
    parameters
      # Media type to emulate. Empty string disables the override.
      optional string media
      # Media features to emulate.
      optional array of MediaFeature features

  # Overrides the Geolocation Position or Error. Omitting any of the parameters emulates position
  # unavailable.
  command setGeolocationOverride
    parameters
      # Mock latitude
      optional number latitude
      # Mock longitude
      optional number longitude
      # Mock accuracy
      optional number accuracy

  # Overrides value returned by the javascript navigator object.
  experimental deprecated command setNavigatorOverrides
    parameters
      # The platform navigator.platform should return.
      string platform

  # Sets a specified page scale factor.
  experimental command setPageScaleFactor
    parameters
      # Page scale factor.
      number pageScaleFactor

  # Switches script execution in the page.
  command setScriptExecutionDisabled
    parameters
      # Whether script execution should be disabled in the page.
      boolean value

  # Enables touch on platforms which do not support them.
  command setTouchEmulationEnabled
    parameters
      # Whether the touch event emulation should be enabled.
      boolean enabled
      # Maximum touch points supported. Defaults to one.
      optional integer maxTouchPoints

  # Turns on virtual time for all frames (replacing real-time with a synthetic time source) and sets
  # the current virtual time policy.  Note this supersedes any previous time budget.
  experimental command setVirtualTimePolicy
    parameters
      VirtualTimePolicy policy
      # If set, after this many virtual milliseconds have elapsed virtual time will be paused and a
      # virtualTimeBudgetExpired event is sent.
      optional number budget
      # If set this specifies the maximum number of tasks that can be run before virtual is forced
      # forwards to prevent deadlock.
      optional integer maxVirtualTimeTaskStarvationCount
      # If set the virtual time policy change should be deferred until any frame starts navigating.
      # Note any previous deferred policy change is superseded.
      optional boolean waitForNavigation
      # If set, base::Time::Now will be overriden to initially return this value.
      optional Network.TimeSinceEpoch initialVirtualTime
    returns
      # Absolute timestamp at which virtual time was first enabled (up time in milliseconds).
      number virtualTimeTicksBase

  # Overrides default host system timezone with the specified one.
  experimental command setTimezoneOverride
    parameters
      # The timezone identifier. If empty, disables the override and
      # restores default host system timezone.
      string timezoneId

  # Resizes the frame/viewport of the page. Note that this does not affect the frame's container
  # (e.g. browser window). Can be used to produce screenshots of the specified size. Not supported
  # on Android.
  experimental deprecated command setVisibleSize
    parameters
      # Frame width (DIP).
      integer width
      # Frame height (DIP).
      integer height

  # Notification sent after the virtual time budget for the current VirtualTimePolicy has run out.
  experimental event virtualTimeBudgetExpired

  # Allows overriding user agent with the given string.
  command setUserAgentOverride
    parameters
      # User agent to use.
      string userAgent
      # Browser langugage to emulate.
      optional string acceptLanguage
      # The platform navigator.platform should return.
      optional string platform

# This domain provides experimental commands only supported in headless mode.
experimental domain HeadlessExperimental
  depends on Page
  depends on Runtime

  # Encoding options for a screenshot.
  type ScreenshotParams extends object
    properties
      # Image compression format (defaults to png).
      optional enum format
        jpeg
        png
      # Compression quality from range [0..100] (jpeg only).
      optional integer quality

  # Sends a BeginFrame to the target and returns when the frame was completed. Optionally captures a
  # screenshot from the resulting frame. Requires that the target was created with enabled
  # BeginFrameControl. Designed for use with --run-all-compositor-stages-before-draw, see also
  # https://goo.gl/3zHXhB for more background.
  command beginFrame
    parameters
      # Timestamp of this BeginFrame in Renderer TimeTicks (milliseconds of uptime). If not set,
      # the current time will be used.
      optional number frameTimeTicks
      # The interval between BeginFrames that is reported to the compositor, in milliseconds.
      # Defaults to a 60 frames/second interval, i.e. about 16.666 milliseconds.
      optional number interval
      # Whether updates should not be committed and drawn onto the display. False by default. If
      # true, only side effects of the BeginFrame will be run, such as layout and animations, but
      # any visual updates may not be visible on the display or in screenshots.
      optional boolean noDisplayUpdates
      # If set, a screenshot of the frame will be captured and returned in the response. Otherwise,
      # no screenshot will be captured. Note that capturing a screenshot can fail, for example,
      # during renderer initialization. In such a case, no screenshot data will be returned.
      optional ScreenshotParams screenshot
    returns
      # Whether the BeginFrame resulted in damage and, thus, a new frame was committed to the
      # display. Reported for diagnostic uses, may be removed in the future.
      boolean hasDamage
      # Base64-encoded image data of the screenshot, if one was requested and successfully taken.
      optional binary screenshotData

  # Disables headless events for the target.
  command disable

  # Enables headless events for the target.
  command enable

  # Issued when the target starts or stops needing BeginFrames.
  # Deprecated. Issue beginFrame unconditionally instead and use result from
  # beginFrame to detect whether the frames were suppressed.
  deprecated event needsBeginFramesChanged
    parameters
      # True if BeginFrames are needed, false otherwise.
      boolean needsBeginFrames

# Input/Output operations for streams produced by DevTools.
domain IO

  # This is either obtained from another method or specifed as `blob:&lt;uuid&gt;` where
  # `&lt;uuid&gt` is an UUID of a Blob.
  type StreamHandle extends string

  # Close the stream, discard any temporary backing storage.
  command close
    parameters
      # Handle of the stream to close.
      StreamHandle handle

  # Read a chunk of the stream
  command read
    parameters
      # Handle of the stream to read.
      StreamHandle handle
      # Seek to the specified offset before reading (if not specificed, proceed with offset
      # following the last read). Some types of streams may only support sequential reads.
      optional integer offset
      # Maximum number of bytes to read (left upon the agent discretion if not specified).
      optional integer size
    returns
      # Set if the data is base64-encoded
      optional boolean base64Encoded
      # Data that were read.
      string data
      # Set if the end-of-file condition occured while reading.
      boolean eof

  # Return UUID of Blob object specified by a remote object id.
  command resolveBlob
    parameters
      # Object id of a Blob object wrapper.
      Runtime.RemoteObjectId objectId
    returns
      # UUID of the specified Blob.
      string uuid

experimental domain IndexedDB
  depends on Runtime

  # Database with an array of object stores.
  type DatabaseWithObjectStores extends object
    properties
      # Database name.
      string name
      # Database version (type is not 'integer', as the standard
      # requires the version number to be 'unsigned long long')
      number version
      # Object stores in this database.
      array of ObjectStore objectStores

  # Object store.
  type ObjectStore extends object
    properties
      # Object store name.
      string name
      # Object store key path.
      KeyPath keyPath
      # If true, object store has auto increment flag set.
      boolean autoIncrement
      # Indexes in this object store.
      array of ObjectStoreIndex indexes

  # Object store index.
  type ObjectStoreIndex extends object
    properties
      # Index name.
      string name
      # Index key path.
      KeyPath keyPath
      # If true, index is unique.
      boolean unique
      # If true, index allows multiple entries for a key.
      boolean multiEntry

  # Key.
  type Key extends object
    properties
      # Key type.
      enum type
        number
        string
        date
        array
      # Number value.
      optional number number
      # String value.
      optional string string
      # Date value.
      optional number date
      # Array value.
      optional array of Key array

  # Key range.
  type KeyRange extends object
    properties
      # Lower bound.
      optional Key lower
      # Upper bound.
      optional Key upper
      # If true lower bound is open.
      boolean lowerOpen
      # If true upper bound is open.
      boolean upperOpen

  # Data entry.
  type DataEntry extends object
    properties
      # Key object.
      Runtime.RemoteObject key
      # Primary key object.
      Runtime.RemoteObject primaryKey
      # Value object.
      Runtime.RemoteObject value

  # Key path.
  type KeyPath extends object
    properties
      # Key path type.
      enum type
        null
        string
        array
      # String value.
      optional string string
      # Array value.
      optional array of string array

  # Clears all entries from an object store.
  command clearObjectStore
    parameters
      # Security origin.
      string securityOrigin
      # Database name.
      string databaseName
      # Object store name.
      string objectStoreName

  # Deletes a database.
  command deleteDatabase
    parameters
      # Security origin.
      string securityOrigin
      # Database name.
      string databaseName

  # Delete a range of entries from an object store
  command deleteObjectStoreEntries
    parameters
      string securityOrigin
      string databaseName
      string objectStoreName
      # Range of entry keys to delete
      KeyRange keyRange

  # Disables events from backend.
  command disable

  # Enables events from backend.
  command enable

  # Requests data from object store or index.
  command requestData
    parameters
      # Security origin.
      string securityOrigin
      # Database name.
      string databaseName
      # Object store name.
      string objectStoreName
      # Index name, empty string for object store data requests.
      string indexName
      # Number of records to skip.
      integer skipCount
      # Number of records to fetch.
      integer pageSize
      # Key range.
      optional KeyRange keyRange
    returns
      # Array of object store data entries.
      array of DataEntry objectStoreDataEntries
      # If true, there are more entries to fetch in the given range.
      boolean hasMore

  # Gets metadata of an object store
  command getMetadata
    parameters
      # Security origin.
      string securityOrigin
      # Database name.
      string databaseName
      # Object store name.
      string objectStoreName
    returns
      # the entries count
      number entriesCount
      # the current value of key generator, to become the next inserted
      # key into the object store. Valid if objectStore.autoIncrement
      # is true.
      number keyGeneratorValue

  # Requests database with given name in given frame.
  command requestDatabase
    parameters
      # Security origin.
      string securityOrigin
      # Database name.
      string databaseName
    returns
      # Database with an array of object stores.
      DatabaseWithObjectStores databaseWithObjectStores

  # Requests database names for given security origin.
  command requestDatabaseNames
    parameters
      # Security origin.
      string securityOrigin
    returns
      # Database names for origin.
      array of string databaseNames

domain Input

  type TouchPoint extends object
    properties
      # X coordinate of the event relative to the main frame's viewport in CSS pixels.
      number x
      # Y coordinate of the event relative to the main frame's viewport in CSS pixels. 0 refers to
      # the top of the viewport and Y increases as it proceeds towards the bottom of the viewport.
      number y
      # X radius of the touch area (default: 1.0).
      optional number radiusX
      # Y radius of the touch area (default: 1.0).
      optional number radiusY
      # Rotation angle (default: 0.0).
      optional number rotationAngle
      # Force (default: 1.0).
      optional number force
      # Identifier used to track touch sources between events, must be unique within an event.
      optional number id

  experimental type GestureSourceType extends string
    enum
      default
      touch
      mouse

  # UTC time in seconds, counted from January 1, 1970.
  type TimeSinceEpoch extends number

  # Dispatches a key event to the page.
  command dispatchKeyEvent
    parameters
      # Type of the key event.
      enum type
        keyDown
        keyUp
        rawKeyDown
        char
      # Bit field representing pressed modifier keys. Alt=1, Ctrl=2, Meta/Command=4, Shift=8
      # (default: 0).
      optional integer modifiers
      # Time at which the event occurred.
      optional TimeSinceEpoch timestamp
      # Text as generated by processing a virtual key code with a keyboard layout. Not needed for
      # for `keyUp` and `rawKeyDown` events (default: "")
      optional string text
      # Text that would have been generated by the keyboard if no modifiers were pressed (except for
      # shift). Useful for shortcut (accelerator) key handling (default: "").
      optional string unmodifiedText
      # Unique key identifier (e.g., 'U+0041') (default: "").
      optional string keyIdentifier
      # Unique DOM defined string value for each physical key (e.g., 'KeyA') (default: "").
      optional string code
      # Unique DOM defined string value describing the meaning of the key in the context of active
      # modifiers, keyboard layout, etc (e.g., 'AltGr') (default: "").
      optional string key
      # Windows virtual key code (default: 0).
      optional integer windowsVirtualKeyCode
      # Native virtual key code (default: 0).
      optional integer nativeVirtualKeyCode
      # Whether the event was generated from auto repeat (default: false).
      optional boolean autoRepeat
      # Whether the event was generated from the keypad (default: false).
      optional boolean isKeypad
      # Whether the event was a system key event (default: false).
      optional boolean isSystemKey
      # Whether the event was from the left or right side of the keyboard. 1=Left, 2=Right (default:
      # 0).
      optional integer location

  # This method emulates inserting text that doesn't come from a key press,
  # for example an emoji keyboard or an IME.
  experimental command insertText
    parameters
      # The text to insert.
      string text

  # Dispatches a mouse event to the page.
  command dispatchMouseEvent
    parameters
      # Type of the mouse event.
      enum type
        mousePressed
        mouseReleased
        mouseMoved
        mouseWheel
      # X coordinate of the event relative to the main frame's viewport in CSS pixels.
      number x
      # Y coordinate of the event relative to the main frame's viewport in CSS pixels. 0 refers to
      # the top of the viewport and Y increases as it proceeds towards the bottom of the viewport.
      number y
      # Bit field representing pressed modifier keys. Alt=1, Ctrl=2, Meta/Command=4, Shift=8
      # (default: 0).
      optional integer modifiers
      # Time at which the event occurred.
      optional TimeSinceEpoch timestamp
      # Mouse button (default: "none").
      optional enum button
        none
        left
        middle
        right
        back
        forward
      # A number indicating which buttons are pressed on the mouse when a mouse event is triggered.
      # Left=1, Right=2, Middle=4, Back=8, Forward=16, None=0.
      optional integer buttons
      # Number of times the mouse button was clicked (default: 0).
      optional integer clickCount
      # X delta in CSS pixels for mouse wheel event (default: 0).
      optional number deltaX
      # Y delta in CSS pixels for mouse wheel event (default: 0).
      optional number deltaY
      # Pointer type (default: "mouse").
      optional enum pointerType
        mouse
        pen

  # Dispatches a touch event to the page.
  command dispatchTouchEvent
    parameters
      # Type of the touch event. TouchEnd and TouchCancel must not contain any touch points, while
      # TouchStart and TouchMove must contains at least one.
      enum type
        touchStart
        touchEnd
        touchMove
        touchCancel
      # Active touch points on the touch device. One event per any changed point (compared to
      # previous touch event in a sequence) is generated, emulating pressing/moving/releasing points
      # one by one.
      array of TouchPoint touchPoints
      # Bit field representing pressed modifier keys. Alt=1, Ctrl=2, Meta/Command=4, Shift=8
      # (default: 0).
      optional integer modifiers
      # Time at which the event occurred.
      optional TimeSinceEpoch timestamp

  # Emulates touch event from the mouse event parameters.
  experimental command emulateTouchFromMouseEvent
    parameters
      # Type of the mouse event.
      enum type
        mousePressed
        mouseReleased
        mouseMoved
        mouseWheel
      # X coordinate of the mouse pointer in DIP.
      integer x
      # Y coordinate of the mouse pointer in DIP.
      integer y
      # Mouse button.
      enum button
        none
        left
        middle
        right
      # Time at which the event occurred (default: current time).
      optional TimeSinceEpoch timestamp
      # X delta in DIP for mouse wheel event (default: 0).
      optional number deltaX
      # Y delta in DIP for mouse wheel event (default: 0).
      optional number deltaY
      # Bit field representing pressed modifier keys. Alt=1, Ctrl=2, Meta/Command=4, Shift=8
      # (default: 0).
      optional integer modifiers
      # Number of times the mouse button was clicked (default: 0).
      optional integer clickCount

  # Ignores input events (useful while auditing page).
  command setIgnoreInputEvents
    parameters
      # Ignores input events processing when set to true.
      boolean ignore

  # Synthesizes a pinch gesture over a time period by issuing appropriate touch events.
  experimental command synthesizePinchGesture
    parameters
      # X coordinate of the start of the gesture in CSS pixels.
      number x
      # Y coordinate of the start of the gesture in CSS pixels.
      number y
      # Relative scale factor after zooming (>1.0 zooms in, <1.0 zooms out).
      number scaleFactor
      # Relative pointer speed in pixels per second (default: 800).
      optional integer relativeSpeed
      # Which type of input events to be generated (default: 'default', which queries the platform
      # for the preferred input type).
      optional GestureSourceType gestureSourceType

  # Synthesizes a scroll gesture over a time period by issuing appropriate touch events.
  experimental command synthesizeScrollGesture
    parameters
      # X coordinate of the start of the gesture in CSS pixels.
      number x
      # Y coordinate of the start of the gesture in CSS pixels.
      number y
      # The distance to scroll along the X axis (positive to scroll left).
      optional number xDistance
      # The distance to scroll along the Y axis (positive to scroll up).
      optional number yDistance
      # The number of additional pixels to scroll back along the X axis, in addition to the given
      # distance.
      optional number xOverscroll
      # The number of additional pixels to scroll back along the Y axis, in addition to the given
      # distance.
      optional number yOverscroll
      # Prevent fling (default: true).
      optional boolean preventFling
      # Swipe speed in pixels per second (default: 800).
      optional integer speed
      # Which type of input events to be generated (default: 'default', which queries the platform
      # for the preferred input type).
      optional GestureSourceType gestureSourceType
      # The number of times to repeat the gesture (default: 0).
      optional integer repeatCount
      # The number of milliseconds delay between each repeat. (default: 250).
      optional integer repeatDelayMs
      # The name of the interaction markers to generate, if not empty (default: "").
      optional string interactionMarkerName

  # Synthesizes a tap gesture over a time period by issuing appropriate touch events.
  experimental command synthesizeTapGesture
    parameters
      # X coordinate of the start of the gesture in CSS pixels.
      number x
      # Y coordinate of the start of the gesture in CSS pixels.
      number y
      # Duration between touchdown and touchup events in ms (default: 50).
      optional integer duration
      # Number of times to perform the tap (e.g. 2 for double tap, default: 1).
      optional integer tapCount
      # Which type of input events to be generated (default: 'default', which queries the platform
      # for the preferred input type).
      optional GestureSourceType gestureSourceType

experimental domain Inspector

  # Disables inspector domain notifications.
  command disable

  # Enables inspector domain notifications.
  command enable

  # Fired when remote debugging connection is about to be terminated. Contains detach reason.
  event detached
    parameters
      # The reason why connection has been terminated.
      string reason

  # Fired when debugging target has crashed
  event targetCrashed

  # Fired when debugging target has reloaded after crash
  event targetReloadedAfterCrash

experimental domain LayerTree
  depends on DOM

  # Unique Layer identifier.
  type LayerId extends string

  # Unique snapshot identifier.
  type SnapshotId extends string

  # Rectangle where scrolling happens on the main thread.
  type ScrollRect extends object
    properties
      # Rectangle itself.
      DOM.Rect rect
      # Reason for rectangle to force scrolling on the main thread
      enum type
        RepaintsOnScroll
        TouchEventHandler
        WheelEventHandler

  # Sticky position constraints.
  type StickyPositionConstraint extends object
    properties
      # Layout rectangle of the sticky element before being shifted
      DOM.Rect stickyBoxRect
      # Layout rectangle of the containing block of the sticky element
      DOM.Rect containingBlockRect
      # The nearest sticky layer that shifts the sticky box
      optional LayerId nearestLayerShiftingStickyBox
      # The nearest sticky layer that shifts the containing block
      optional LayerId nearestLayerShiftingContainingBlock

  # Serialized fragment of layer picture along with its offset within the layer.
  type PictureTile extends object
    properties
      # Offset from owning layer left boundary
      number x
      # Offset from owning layer top boundary
      number y
      # Base64-encoded snapshot data.
      binary picture

  # Information about a compositing layer.
  type Layer extends object
    properties
      # The unique id for this layer.
      LayerId layerId
      # The id of parent (not present for root).
      optional LayerId parentLayerId
      # The backend id for the node associated with this layer.
      optional DOM.BackendNodeId backendNodeId
      # Offset from parent layer, X coordinate.
      number offsetX
      # Offset from parent layer, Y coordinate.
      number offsetY
      # Layer width.
      number width
      # Layer height.
      number height
      # Transformation matrix for layer, default is identity matrix
      optional array of number transform
      # Transform anchor point X, absent if no transform specified
      optional number anchorX
      # Transform anchor point Y, absent if no transform specified
      optional number anchorY
      # Transform anchor point Z, absent if no transform specified
      optional number anchorZ
      # Indicates how many time this layer has painted.
      integer paintCount
      # Indicates whether this layer hosts any content, rather than being used for
      # transform/scrolling purposes only.
      boolean drawsContent
      # Set if layer is not visible.
      optional boolean invisible
      # Rectangles scrolling on main thread only.
      optional array of ScrollRect scrollRects
      # Sticky position constraint information
      optional StickyPositionConstraint stickyPositionConstraint

  # Array of timings, one per paint step.
  type PaintProfile extends array of number

  # Provides the reasons why the given layer was composited.
  command compositingReasons
    parameters
      # The id of the layer for which we want to get the reasons it was composited.
      LayerId layerId
    returns
      # A list of strings specifying reasons for the given layer to become composited.
      array of string compositingReasons

  # Disables compositing tree inspection.
  command disable

  # Enables compositing tree inspection.
  command enable

  # Returns the snapshot identifier.
  command loadSnapshot
    parameters
      # An array of tiles composing the snapshot.
      array of PictureTile tiles
    returns
      # The id of the snapshot.
      SnapshotId snapshotId

  # Returns the layer snapshot identifier.
  command makeSnapshot
    parameters
      # The id of the layer.
      LayerId layerId
    returns
      # The id of the layer snapshot.
      SnapshotId snapshotId

  command profileSnapshot
    parameters
      # The id of the layer snapshot.
      SnapshotId snapshotId
      # The maximum number of times to replay the snapshot (1, if not specified).
      optional integer minRepeatCount
      # The minimum duration (in seconds) to replay the snapshot.
      optional number minDuration
      # The clip rectangle to apply when replaying the snapshot.
      optional DOM.Rect clipRect
    returns
      # The array of paint profiles, one per run.
      array of PaintProfile timings

  # Releases layer snapshot captured by the back-end.
  command releaseSnapshot
    parameters
      # The id of the layer snapshot.
      SnapshotId snapshotId

  # Replays the layer snapshot and returns the resulting bitmap.
  command replaySnapshot
    parameters
      # The id of the layer snapshot.
      SnapshotId snapshotId
      # The first step to replay from (replay from the very start if not specified).
      optional integer fromStep
      # The last step to replay to (replay till the end if not specified).
      optional integer toStep
      # The scale to apply while replaying (defaults to 1).
      optional number scale
    returns
      # A data: URL for resulting image.
      string dataURL

  # Replays the layer snapshot and returns canvas log.
  command snapshotCommandLog
    parameters
      # The id of the layer snapshot.
      SnapshotId snapshotId
    returns
      # The array of canvas function calls.
      array of object commandLog

  event layerPainted
    parameters
      # The id of the painted layer.
      LayerId layerId
      # Clip rectangle.
      DOM.Rect clip

  event layerTreeDidChange
    parameters
      # Layer tree, absent if not in the comspositing mode.
      optional array of Layer layers

# Provides access to log entries.
domain Log
  depends on Runtime
  depends on Network

  # Log entry.
  type LogEntry extends object
    properties
      # Log entry source.
      enum source
        xml
        javascript
        network
        storage
        appcache
        rendering
        security
        deprecation
        worker
        violation
        intervention
        recommendation
        other
      # Log entry severity.
      enum level
        verbose
        info
        warning
        error
      # Logged text.
      string text
      # Timestamp when this entry was added.
      Runtime.Timestamp timestamp
      # URL of the resource if known.
      optional string url
      # Line number in the resource.
      optional integer lineNumber
      # JavaScript stack trace.
      optional Runtime.StackTrace stackTrace
      # Identifier of the network request associated with this entry.
      optional Network.RequestId networkRequestId
      # Identifier of the worker associated with this entry.
      optional string workerId
      # Call arguments.
      optional array of Runtime.RemoteObject args

  # Violation configuration setting.
  type ViolationSetting extends object
    properties
      # Violation type.
      enum name
        longTask
        longLayout
        blockedEvent
        blockedParser
        discouragedAPIUse
        handler
        recurringHandler
      # Time threshold to trigger upon.
      number threshold

  # Clears the log.
  command clear

  # Disables log domain, prevents further log entries from being reported to the client.
  command disable

  # Enables log domain, sends the entries collected so far to the client by means of the
  # `entryAdded` notification.
  command enable

  # start violation reporting.
  command startViolationsReport
    parameters
      # Configuration for violations.
      array of ViolationSetting config

  # Stop violation reporting.
  command stopViolationsReport

  # Issued when new message was logged.
  event entryAdded
    parameters
      # The entry.
      LogEntry entry

experimental domain Memory

  # Memory pressure level.
  type PressureLevel extends string
    enum
      moderate
      critical

  command getDOMCounters
    returns
      integer documents
      integer nodes
      integer jsEventListeners

  command prepareForLeakDetection

  # Simulate OomIntervention by purging V8 memory.
  command forciblyPurgeJavaScriptMemory

  # Enable/disable suppressing memory pressure notifications in all processes.
  command setPressureNotificationsSuppressed
    parameters
      # If true, memory pressure notifications will be suppressed.
      boolean suppressed

  # Simulate a memory pressure notification in all processes.
  command simulatePressureNotification
    parameters
      # Memory pressure level of the notification.
      PressureLevel level

  # Start collecting native memory profile.
  command startSampling
    parameters
      # Average number of bytes between samples.
      optional integer samplingInterval
      # Do not randomize intervals between samples.
      optional boolean suppressRandomness

  # Stop collecting native memory profile.
  command stopSampling

  # Retrieve native memory allocations profile
  # collected since renderer process startup.
  command getAllTimeSamplingProfile
    returns
      SamplingProfile profile

  # Retrieve native memory allocations profile
  # collected since browser process startup.
  command getBrowserSamplingProfile
    returns
      SamplingProfile profile

  # Retrieve native memory allocations profile collected since last
  # `startSampling` call.
  command getSamplingProfile
    returns
      SamplingProfile profile

  # Heap profile sample.
  type SamplingProfileNode extends object
    properties
      # Size of the sampled allocation.
      number size
      # Total bytes attributed to this sample.
      number total
      # Execution stack at the point of allocation.
      array of string stack

  # Array of heap profile samples.
  type SamplingProfile extends object
    properties
      array of SamplingProfileNode samples
      array of Module modules

  # Executable module information
  type Module extends object
    properties
      # Name of the module.
      string name
      # UUID of the module.
      string uuid
      # Base address where the module is loaded into memory. Encoded as a decimal
      # or hexadecimal (0x prefixed) string.
      string baseAddress
      # Size of the module in bytes.
      number size

# Network domain allows tracking network activities of the page. It exposes information about http,
# file, data and other requests and responses, their headers, bodies, timing, etc.
domain Network
  depends on Debugger
  depends on Runtime
  depends on Security

  # Resource type as it was perceived by the rendering engine.
  type ResourceType extends string
    enum
      Document
      Stylesheet
      Image
      Media
      Font
      Script
      TextTrack
      XHR
      Fetch
      EventSource
      WebSocket
      Manifest
      SignedExchange
      Ping
      CSPViolationReport
      Other

  # Unique loader identifier.
  type LoaderId extends string

  # Unique request identifier.
  type RequestId extends string

  # Unique intercepted request identifier.
  type InterceptionId extends string

  # Network level fetch failure reason.
  type ErrorReason extends string
    enum
      Failed
      Aborted
      TimedOut
      AccessDenied
      ConnectionClosed
      ConnectionReset
      ConnectionRefused
      ConnectionAborted
      ConnectionFailed
      NameNotResolved
      InternetDisconnected
      AddressUnreachable
      BlockedByClient
      BlockedByResponse

  # UTC time in seconds, counted from January 1, 1970.
  type TimeSinceEpoch extends number

  # Monotonically increasing time in seconds since an arbitrary point in the past.
  type MonotonicTime extends number

  # Request / response headers as keys / values of JSON object.
  type Headers extends object

  # The underlying connection technology that the browser is supposedly using.
  type ConnectionType extends string
    enum
      none
      cellular2g
      cellular3g
      cellular4g
      bluetooth
      ethernet
      wifi
      wimax
      other

  # Represents the cookie's 'SameSite' status:
  # https://tools.ietf.org/html/draft-west-first-party-cookies
  type CookieSameSite extends string
    enum
      Strict
      Lax
      None

  # Timing information for the request.
  type ResourceTiming extends object
    properties
      # Timing's requestTime is a baseline in seconds, while the other numbers are ticks in
      # milliseconds relatively to this requestTime.
      number requestTime
      # Started resolving proxy.
      number proxyStart
      # Finished resolving proxy.
      number proxyEnd
      # Started DNS address resolve.
      number dnsStart
      # Finished DNS address resolve.
      number dnsEnd
      # Started connecting to the remote host.
      number connectStart
      # Connected to the remote host.
      number connectEnd
      # Started SSL handshake.
      number sslStart
      # Finished SSL handshake.
      number sslEnd
      # Started running ServiceWorker.
      experimental number workerStart
      # Finished Starting ServiceWorker.
      experimental number workerReady
      # Started sending request.
      number sendStart
      # Finished sending request.
      number sendEnd
      # Time the server started pushing request.
      experimental number pushStart
      # Time the server finished pushing request.
      experimental number pushEnd
      # Finished receiving response headers.
      number receiveHeadersEnd

  # Loading priority of a resource request.
  type ResourcePriority extends string
    enum
      VeryLow
      Low
      Medium
      High
      VeryHigh

  # HTTP request data.
  type Request extends object
    properties
      # Request URL (without fragment).
      string url
      # Fragment of the requested URL starting with hash, if present.
      optional string urlFragment
      # HTTP request method.
      string method
      # HTTP request headers.
      Headers headers
      # HTTP POST request data.
      optional string postData
      # True when the request has POST data. Note that postData might still be omitted when this flag is true when the data is too long.
      optional boolean hasPostData
      # The mixed content type of the request.
      optional Security.MixedContentType mixedContentType
      # Priority of the resource request at the time request is sent.
      ResourcePriority initialPriority
      # The referrer policy of the request, as defined in https://www.w3.org/TR/referrer-policy/
      enum referrerPolicy
        unsafe-url
        no-referrer-when-downgrade
        no-referrer
        origin
        origin-when-cross-origin
        same-origin
        strict-origin
        strict-origin-when-cross-origin
      # Whether is loaded via link preload.
      optional boolean isLinkPreload

  # Details of a signed certificate timestamp (SCT).
  type SignedCertificateTimestamp extends object
    properties
      # Validation status.
      string status
      # Origin.
      string origin
      # Log name / description.
      string logDescription
      # Log ID.
      string logId
      # Issuance date.
      TimeSinceEpoch timestamp
      # Hash algorithm.
      string hashAlgorithm
      # Signature algorithm.
      string signatureAlgorithm
      # Signature data.
      string signatureData

  # Security details about a request.
  type SecurityDetails extends object
    properties
      # Protocol name (e.g. "TLS 1.2" or "QUIC").
      string protocol
      # Key Exchange used by the connection, or the empty string if not applicable.
      string keyExchange
      # (EC)DH group used by the connection, if applicable.
      optional string keyExchangeGroup
      # Cipher name.
      string cipher
      # TLS MAC. Note that AEAD ciphers do not have separate MACs.
      optional string mac
      # Certificate ID value.
      Security.CertificateId certificateId
      # Certificate subject name.
      string subjectName
      # Subject Alternative Name (SAN) DNS names and IP addresses.
      array of string sanList
      # Name of the issuing CA.
      string issuer
      # Certificate valid from date.
      TimeSinceEpoch validFrom
      # Certificate valid to (expiration) date
      TimeSinceEpoch validTo
      # List of signed certificate timestamps (SCTs).
      array of SignedCertificateTimestamp signedCertificateTimestampList
      # Whether the request complied with Certificate Transparency policy
      CertificateTransparencyCompliance certificateTransparencyCompliance

  # Whether the request complied with Certificate Transparency policy.
  type CertificateTransparencyCompliance extends string
    enum
      unknown
      not-compliant
      compliant

  # The reason why request was blocked.
  type BlockedReason extends string
    enum
      other
      csp
      mixed-content
      origin
      inspector
      subresource-filter
      content-type
      collapsed-by-client

  # HTTP response data.
  type Response extends object
    properties
      # Response URL. This URL can be different from CachedResource.url in case of redirect.
      string url
      # HTTP response status code.
      integer status
      # HTTP response status text.
      string statusText
      # HTTP response headers.
      Headers headers
      # HTTP response headers text.
      optional string headersText
      # Resource mimeType as determined by the browser.
      string mimeType
      # Refined HTTP request headers that were actually transmitted over the network.
      optional Headers requestHeaders
      # HTTP request headers text.
      optional string requestHeadersText
      # Specifies whether physical connection was actually reused for this request.
      boolean connectionReused
      # Physical connection id that was actually used for this request.
      number connectionId
      # Remote IP address.
      optional string remoteIPAddress
      # Remote port.
      optional integer remotePort
      # Specifies that the request was served from the disk cache.
      optional boolean fromDiskCache
      # Specifies that the request was served from the ServiceWorker.
      optional boolean fromServiceWorker
      # Specifies that the request was served from the prefetch cache.
      optional boolean fromPrefetchCache
      # Total number of bytes received for this request so far.
      number encodedDataLength
      # Timing information for the given request.
      optional ResourceTiming timing
      # Protocol used to fetch this request.
      optional string protocol
      # Security state of the request resource.
      Security.SecurityState securityState
      # Security details for the request.
      optional SecurityDetails securityDetails

  # WebSocket request data.
  type WebSocketRequest extends object
    properties
      # HTTP request headers.
      Headers headers

  # WebSocket response data.
  type WebSocketResponse extends object
    properties
      # HTTP response status code.
      integer status
      # HTTP response status text.
      string statusText
      # HTTP response headers.
      Headers headers
      # HTTP response headers text.
      optional string headersText
      # HTTP request headers.
      optional Headers requestHeaders
      # HTTP request headers text.
      optional string requestHeadersText

  # WebSocket message data. This represents an entire WebSocket message, not just a fragmented frame as the name suggests.
  type WebSocketFrame extends object
    properties
      # WebSocket message opcode.
      number opcode
      # WebSocket message mask.
      boolean mask
      # WebSocket message payload data.
      # If the opcode is 1, this is a text message and payloadData is a UTF-8 string.
      # If the opcode isn't 1, then payloadData is a base64 encoded string representing binary data.
      string payloadData

  # Information about the cached resource.
  type CachedResource extends object
    properties
      # Resource URL. This is the url of the original network request.
      string url
      # Type of this resource.
      ResourceType type
      # Cached response data.
      optional Response response
      # Cached response body size.
      number bodySize

  # Information about the request initiator.
  type Initiator extends object
    properties
      # Type of this initiator.
      enum type
        parser
        script
        preload
        SignedExchange
        other
      # Initiator JavaScript stack trace, set for Script only.
      optional Runtime.StackTrace stack
      # Initiator URL, set for Parser type or for Script type (when script is importing module) or for SignedExchange type.
      optional string url
      # Initiator line number, set for Parser type or for Script type (when script is importing
      # module) (0-based).
      optional number lineNumber

  # Cookie object
  type Cookie extends object
    properties
      # Cookie name.
      string name
      # Cookie value.
      string value
      # Cookie domain.
      string domain
      # Cookie path.
      string path
      # Cookie expiration date as the number of seconds since the UNIX epoch.
      number expires
      # Cookie size.
      integer size
      # True if cookie is http-only.
      boolean httpOnly
      # True if cookie is secure.
      boolean secure
      # True in case of session cookie.
      boolean session
      # Cookie SameSite type.
      optional CookieSameSite sameSite

  # Types of reasons why a cookie may not be stored from a response.
  experimental type SetCookieBlockedReason extends string
    enum
      # The cookie had the "Secure" attribute but was not received over a secure connection.
      SecureOnly
      # The cookie had the "SameSite=Strict" attribute but came from a cross-origin response.
      # This includes navigation requests intitiated by other origins.
      SameSiteStrict
      # The cookie had the "SameSite=Lax" attribute but came from a cross-origin response.
      SameSiteLax
      # The cookie didn't specify a "SameSite" attribute and was defaulted to "SameSite=Lax" and
      # broke the same rules specified in the SameSiteLax value.
      SameSiteUnspecifiedTreatedAsLax
      # The cookie had the "SameSite=None" attribute but did not specify the "Secure" attribute,
      # which is required in order to use "SameSite=None".
      SameSiteNoneInsecure
      # The cookie was not stored due to user preferences.
      UserPreferences
      # The syntax of the Set-Cookie header of the response was invalid.
      SyntaxError
      # The scheme of the connection is not allowed to store cookies.
      SchemeNotSupported
      # The cookie was not sent over a secure connection and would have overwritten a cookie with
      # the Secure attribute.
      OverwriteSecure
      # The cookie's domain attribute was invalid with regards to the current host url.
      InvalidDomain
      # The cookie used the "__Secure-" or "__Host-" prefix in its name and broke the additional
      # rules applied to cookies with these prefixes as defined in
      # https://tools.ietf.org/html/draft-west-cookie-prefixes-05
      InvalidPrefix
      # An unknown error was encountered when trying to store this cookie.
      UnknownError

  # Types of reasons why a cookie may not be sent with a request.
  experimental type CookieBlockedReason extends string
    enum
      # The cookie had the "Secure" attribute and the connection was not secure.
      SecureOnly
      # The cookie's path was not within the request url's path.
      NotOnPath
      # The cookie's domain is not configured to match the request url's domain, even though they
      # share a common TLD+1 (TLD+1 of foo.bar.example.com is example.com).
      DomainMismatch
      # The cookie had the "SameSite=Strict" attribute and the request was made on on a different
      # site. This includes navigation requests initiated by other sites.
      SameSiteStrict
      # The cookie had the "SameSite=Lax" attribute and the request was made on a different site.
      # This does not include navigation requests initiated by other sites.
      SameSiteLax
      # The cookie didn't specify a SameSite attribute when it was stored and was defaulted to
      # "SameSite=Lax" and broke the same rules specified in the SameSiteLax value. The cookie had
      # to have been set with "SameSite=None" to enable third-party usage.
      SameSiteUnspecifiedTreatedAsLax
      # The cookie had the "SameSite=None" attribute and the connection was not secure. Cookies
      # without SameSite restrictions must be sent over a secure connection.
      SameSiteNoneInsecure
      # The cookie was not sent due to user preferences.
      UserPreferences
      # An unknown error was encountered when trying to send this cookie.
      UnknownError

  # A cookie which was not stored from a response with the corresponding reason.
  experimental type BlockedSetCookieWithReason extends object
    properties
      # The reason(s) this cookie was blocked.
      array of SetCookieBlockedReason blockedReasons
      # The string representing this individual cookie as it would appear in the header.
      # This is not the entire "cookie" or "set-cookie" header which could have multiple cookies.
      string cookieLine
      # The cookie object which represents the cookie which was not stored. It is optional because
      # sometimes complete cookie information is not available, such as in the case of parsing
      # errors.
      optional Cookie cookie

  # A cookie with was not sent with a request with the corresponding reason.
  experimental type BlockedCookieWithReason extends object
    properties
      # The reason(s) the cookie was blocked.
      array of CookieBlockedReason blockedReasons
      # The cookie object representing the cookie which was not sent.
      Cookie cookie

  # Cookie parameter object
  type CookieParam extends object
    properties
      # Cookie name.
      string name
      # Cookie value.
      string value
      # The request-URI to associate with the setting of the cookie. This value can affect the
      # default domain and path values of the created cookie.
      optional string url
      # Cookie domain.
      optional string domain
      # Cookie path.
      optional string path
      # True if cookie is secure.
      optional boolean secure
      # True if cookie is http-only.
      optional boolean httpOnly
      # Cookie SameSite type.
      optional CookieSameSite sameSite
      # Cookie expiration date, session cookie if not set
      optional TimeSinceEpoch expires

  # Authorization challenge for HTTP status code 401 or 407.
  experimental type AuthChallenge extends object
    properties
      # Source of the authentication challenge.
      optional enum source
        Server
        Proxy
      # Origin of the challenger.
      string origin
      # The authentication scheme used, such as basic or digest
      string scheme
      # The realm of the challenge. May be empty.
      string realm

  # Response to an AuthChallenge.
  experimental type AuthChallengeResponse extends object
    properties
      # The decision on what to do in response to the authorization challenge.  Default means
      # deferring to the default behavior of the net stack, which will likely either the Cancel
      # authentication or display a popup dialog box.
      enum response
        Default
        CancelAuth
        ProvideCredentials
      # The username to provide, possibly empty. Should only be set if response is
      # ProvideCredentials.
      optional string username
      # The password to provide, possibly empty. Should only be set if response is
      # ProvideCredentials.
      optional string password

  # Stages of the interception to begin intercepting. Request will intercept before the request is
  # sent. Response will intercept after the response is received.
  experimental type InterceptionStage extends string
    enum
      Request
      HeadersReceived

  # Request pattern for interception.
  experimental type RequestPattern extends object
    properties
      # Wildcards ('*' -> zero or more, '?' -> exactly one) are allowed. Escape character is
      # backslash. Omitting is equivalent to "*".
      optional string urlPattern
      # If set, only requests for matching resource types will be intercepted.
      optional ResourceType resourceType
      # Stage at wich to begin intercepting requests. Default is Request.
      optional InterceptionStage interceptionStage

  # Information about a signed exchange signature.
  # https://wicg.github.io/webpackage/draft-yasskin-httpbis-origin-signed-exchanges-impl.html#rfc.section.3.1
  experimental type SignedExchangeSignature extends object
    properties
      # Signed exchange signature label.
      string label
      # The hex string of signed exchange signature.
      string signature
      # Signed exchange signature integrity.
      string integrity
      # Signed exchange signature cert Url.
      optional string certUrl
      # The hex string of signed exchange signature cert sha256.
      optional string certSha256
      # Signed exchange signature validity Url.
      string validityUrl
      # Signed exchange signature date.
      integer date
      # Signed exchange signature expires.
      integer expires
      # The encoded certificates.
      optional array of string certificates

  # Information about a signed exchange header.
  # https://wicg.github.io/webpackage/draft-yasskin-httpbis-origin-signed-exchanges-impl.html#cbor-representation
  experimental type SignedExchangeHeader extends object
    properties
      # Signed exchange request URL.
      string requestUrl
      # Signed exchange response code.
      integer responseCode
      # Signed exchange response headers.
      Headers responseHeaders
      # Signed exchange response signature.
      array of SignedExchangeSignature signatures
      # Signed exchange header integrity hash in the form of "sha256-<base64-hash-value>".
      string headerIntegrity

  # Field type for a signed exchange related error.
  experimental type SignedExchangeErrorField extends string
    enum
      signatureSig
      signatureIntegrity
      signatureCertUrl
      signatureCertSha256
      signatureValidityUrl
      signatureTimestamps

  # Information about a signed exchange response.
  experimental type SignedExchangeError extends object
    properties
      # Error message.
      string message
      # The index of the signature which caused the error.
      optional integer signatureIndex
      # The field which caused the error.
      optional SignedExchangeErrorField errorField

  # Information about a signed exchange response.
  experimental type SignedExchangeInfo extends object
    properties
      # The outer response of signed HTTP exchange which was received from network.
      Response outerResponse
      # Information about the signed exchange header.
      optional SignedExchangeHeader header
      # Security details for the signed exchange header.
      optional SecurityDetails securityDetails
      # Errors occurred while handling the signed exchagne.
      optional array of SignedExchangeError errors

  # Tells whether clearing browser cache is supported.
  deprecated command canClearBrowserCache
    returns
      # True if browser cache can be cleared.
      boolean result

  # Tells whether clearing browser cookies is supported.
  deprecated command canClearBrowserCookies
    returns
      # True if browser cookies can be cleared.
      boolean result

  # Tells whether emulation of network conditions is supported.
  deprecated command canEmulateNetworkConditions
    returns
      # True if emulation of network conditions is supported.
      boolean result

  # Clears browser cache.
  command clearBrowserCache

  # Clears browser cookies.
  command clearBrowserCookies

  # Response to Network.requestIntercepted which either modifies the request to continue with any
  # modifications, or blocks it, or completes it with the provided response bytes. If a network
  # fetch occurs as a result which encounters a redirect an additional Network.requestIntercepted
  # event will be sent with the same InterceptionId.
  # Deprecated, use Fetch.continueRequest, Fetch.fulfillRequest and Fetch.failRequest instead.
  experimental deprecated command continueInterceptedRequest
    parameters
      InterceptionId interceptionId
      # If set this causes the request to fail with the given reason. Passing `Aborted` for requests
      # marked with `isNavigationRequest` also cancels the navigation. Must not be set in response
      # to an authChallenge.
      optional ErrorReason errorReason
      # If set the requests completes using with the provided base64 encoded raw response, including
      # HTTP status line and headers etc... Must not be set in response to an authChallenge.
      optional binary rawResponse
      # If set the request url will be modified in a way that's not observable by page. Must not be
      # set in response to an authChallenge.
      optional string url
      # If set this allows the request method to be overridden. Must not be set in response to an
      # authChallenge.
      optional string method
      # If set this allows postData to be set. Must not be set in response to an authChallenge.
      optional string postData
      # If set this allows the request headers to be changed. Must not be set in response to an
      # authChallenge.
      optional Headers headers
      # Response to a requestIntercepted with an authChallenge. Must not be set otherwise.
      optional AuthChallengeResponse authChallengeResponse

  # Deletes browser cookies with matching name and url or domain/path pair.
  command deleteCookies
    parameters
      # Name of the cookies to remove.
      string name
      # If specified, deletes all the cookies with the given name where domain and path match
      # provided URL.
      optional string url
      # If specified, deletes only cookies with the exact domain.
      optional string domain
      # If specified, deletes only cookies with the exact path.
      optional string path

  # Disables network tracking, prevents network events from being sent to the client.
  command disable

  # Activates emulation of network conditions.
  command emulateNetworkConditions
    parameters
      # True to emulate internet disconnection.
      boolean offline
      # Minimum latency from request sent to response headers received (ms).
      number latency
      # Maximal aggregated download throughput (bytes/sec). -1 disables download throttling.
      number downloadThroughput
      # Maximal aggregated upload throughput (bytes/sec).  -1 disables upload throttling.
      number uploadThroughput
      # Connection type if known.
      optional ConnectionType connectionType

  # Enables network tracking, network events will now be delivered to the client.
  command enable
    parameters
      # Buffer size in bytes to use when preserving network payloads (XHRs, etc).
      experimental optional integer maxTotalBufferSize
      # Per-resource buffer size in bytes to use when preserving network payloads (XHRs, etc).
      experimental optional integer maxResourceBufferSize
      # Longest post body size (in bytes) that would be included in requestWillBeSent notification
      optional integer maxPostDataSize

  # Returns all browser cookies. Depending on the backend support, will return detailed cookie
  # information in the `cookies` field.
  command getAllCookies
    returns
      # Array of cookie objects.
      array of Cookie cookies

  # Returns the DER-encoded certificate.
  experimental command getCertificate
    parameters
      # Origin to get certificate for.
      string origin
    returns
      array of string tableNames

  # Returns all browser cookies for the current URL. Depending on the backend support, will return
  # detailed cookie information in the `cookies` field.
  command getCookies
    parameters
      # The list of URLs for which applicable cookies will be fetched
      optional array of string urls
    returns
      # Array of cookie objects.
      array of Cookie cookies

  # Returns content served for the given request.
  command getResponseBody
    parameters
      # Identifier of the network request to get content for.
      RequestId requestId
    returns
      # Response body.
      string body
      # True, if content was sent as base64.
      boolean base64Encoded

  # Returns post data sent with the request. Returns an error when no data was sent with the request.
  command getRequestPostData
    parameters
      # Identifier of the network request to get content for.
      RequestId requestId
    returns
      # Request body string, omitting files from multipart requests
      string postData

  # Returns content served for the given currently intercepted request.
  experimental command getResponseBodyForInterception
    parameters
      # Identifier for the intercepted request to get body for.
      InterceptionId interceptionId
    returns
      # Response body.
      string body
      # True, if content was sent as base64.
      boolean base64Encoded

  # Returns a handle to the stream representing the response body. Note that after this command,
  # the intercepted request can't be continued as is -- you either need to cancel it or to provide
  # the response body. The stream only supports sequential read, IO.read will fail if the position
  # is specified.
  experimental command takeResponseBodyForInterceptionAsStream
    parameters
      InterceptionId interceptionId
    returns
      IO.StreamHandle stream

  # This method sends a new XMLHttpRequest which is identical to the original one. The following
  # parameters should be identical: method, url, async, request body, extra headers, withCredentials
  # attribute, user, password.
  experimental command replayXHR
    parameters
      # Identifier of XHR to replay.
      RequestId requestId

  # Searches for given string in response content.
  experimental command searchInResponseBody
    parameters
      # Identifier of the network response to search.
      RequestId requestId
      # 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 Debugger.SearchMatch result

  # Blocks URLs from loading.
  experimental command setBlockedURLs
    parameters
      # URL patterns to block. Wildcards ('*') are allowed.
      array of string urls

  # Toggles ignoring of service worker for each request.
  experimental command setBypassServiceWorker
    parameters
      # Bypass service worker and load from network.
      boolean bypass

  # Toggles ignoring cache for each request. If `true`, cache will not be used.
  command setCacheDisabled
    parameters
      # Cache disabled state.
      boolean cacheDisabled

  # Sets a cookie with the given cookie data; may overwrite equivalent cookies if they exist.
  command setCookie
    parameters
      # Cookie name.
      string name
      # Cookie value.
      string value
      # The request-URI to associate with the setting of the cookie. This value can affect the
      # default domain and path values of the created cookie.
      optional string url
      # Cookie domain.
      optional string domain
      # Cookie path.
      optional string path
      # True if cookie is secure.
      optional boolean secure
      # True if cookie is http-only.
      optional boolean httpOnly
      # Cookie SameSite type.
      optional CookieSameSite sameSite
      # Cookie expiration date, session cookie if not set
      optional TimeSinceEpoch expires
    returns
      # True if successfully set cookie.
      boolean success

  # Sets given cookies.
  command setCookies
    parameters
      # Cookies to be set.
      array of CookieParam cookies

  # For testing.
  experimental command setDataSizeLimitsForTest
    parameters
      # Maximum total buffer size.
      integer maxTotalSize
      # Maximum per-resource size.
      integer maxResourceSize

  # Specifies whether to always send extra HTTP headers with the requests from this page.
  command setExtraHTTPHeaders
    parameters
      # Map with extra HTTP headers.
      Headers headers

  # Sets the requests to intercept that match the provided patterns and optionally resource types.
  # Deprecated, please use Fetch.enable instead.
  experimental deprecated command setRequestInterception
    parameters
      # Requests matching any of these patterns will be forwarded and wait for the corresponding
      # continueInterceptedRequest call.
      array of RequestPattern patterns

  # Allows overriding user agent with the given string.
  command setUserAgentOverride
    redirect Emulation
    parameters
      # User agent to use.
      string userAgent
      # Browser langugage to emulate.
      optional string acceptLanguage
      # The platform navigator.platform should return.
      optional string platform

  # Fired when data chunk was received over the network.
  event dataReceived
    parameters
      # Request identifier.
      RequestId requestId
      # Timestamp.
      MonotonicTime timestamp
      # Data chunk length.
      integer dataLength
      # Actual bytes received (might be less than dataLength for compressed encodings).
      integer encodedDataLength

  # Fired when EventSource message is received.
  event eventSourceMessageReceived
    parameters
      # Request identifier.
      RequestId requestId
      # Timestamp.
      MonotonicTime timestamp
      # Message type.
      string eventName
      # Message identifier.
      string eventId
      # Message content.
      string data

  # Fired when HTTP request has failed to load.
  event loadingFailed
    parameters
      # Request identifier.
      RequestId requestId
      # Timestamp.
      MonotonicTime timestamp
      # Resource type.
      ResourceType type
      # User friendly error message.
      string errorText
      # True if loading was canceled.
      optional boolean canceled
      # The reason why loading was blocked, if any.
      optional BlockedReason blockedReason

  # Fired when HTTP request has finished loading.
  event loadingFinished
    parameters
      # Request identifier.
      RequestId requestId
      # Timestamp.
      MonotonicTime timestamp
      # Total number of bytes received for this request.
      number encodedDataLength
      # Set when 1) response was blocked by Cross-Origin Read Blocking and also
      # 2) this needs to be reported to the DevTools console.
      optional boolean shouldReportCorbBlocking

  # Details of an intercepted HTTP request, which must be either allowed, blocked, modified or
  # mocked.
  # Deprecated, use Fetch.requestPaused instead.
  experimental deprecated event requestIntercepted
    parameters
      # Each request the page makes will have a unique id, however if any redirects are encountered
      # while processing that fetch, they will be reported with the same id as the original fetch.
      # Likewise if HTTP authentication is needed then the same fetch id will be used.
      InterceptionId interceptionId
      Request request
      # The id of the frame that initiated the request.
      Page.FrameId frameId
      # How the requested resource will be used.
      ResourceType resourceType
      # Whether this is a navigation request, which can abort the navigation completely.
      boolean isNavigationRequest
      # Set if the request is a navigation that will result in a download.
      # Only present after response is received from the server (i.e. HeadersReceived stage).
      optional boolean isDownload
      # Redirect location, only sent if a redirect was intercepted.
      optional string redirectUrl
      # Details of the Authorization Challenge encountered. If this is set then
      # continueInterceptedRequest must contain an authChallengeResponse.
      optional AuthChallenge authChallenge
      # Response error if intercepted at response stage or if redirect occurred while intercepting
      # request.
      optional ErrorReason responseErrorReason
      # Response code if intercepted at response stage or if redirect occurred while intercepting
      # request or auth retry occurred.
      optional integer responseStatusCode
      # Response headers if intercepted at the response stage or if redirect occurred while
      # intercepting request or auth retry occurred.
      optional Headers responseHeaders
      # If the intercepted request had a corresponding requestWillBeSent event fired for it, then
      # this requestId will be the same as the requestId present in the requestWillBeSent event.
      optional RequestId requestId

  # Fired if request ended up loading from cache.
  event requestServedFromCache
    parameters
      # Request identifier.
      RequestId requestId

  # Fired when page is about to send HTTP request.
  event requestWillBeSent
    parameters
      # Request identifier.
      RequestId requestId
      # Loader identifier. Empty string if the request is fetched from worker.
      LoaderId loaderId
      # URL of the document this request is loaded for.
      string documentURL
      # Request data.
      Request request
      # Timestamp.
      MonotonicTime timestamp
      # Timestamp.
      TimeSinceEpoch wallTime
      # Request initiator.
      Initiator initiator
      # Redirect response data.
      optional Response redirectResponse
      # Type of this resource.
      optional ResourceType type
      # Frame identifier.
      optional Page.FrameId frameId
      # Whether the request is initiated by a user gesture. Defaults to false.
      optional boolean hasUserGesture

  # Fired when resource loading priority is changed
  experimental event resourceChangedPriority
    parameters
      # Request identifier.
      RequestId requestId
      # New priority
      ResourcePriority newPriority
      # Timestamp.
      MonotonicTime timestamp

  # Fired when a signed exchange was received over the network
  experimental event signedExchangeReceived
    parameters
      # Request identifier.
      RequestId requestId
      # Information about the signed exchange response.
      SignedExchangeInfo info

  # Fired when HTTP response is available.
  event responseReceived
    parameters
      # Request identifier.
      RequestId requestId
      # Loader identifier. Empty string if the request is fetched from worker.
      LoaderId loaderId
      # Timestamp.
      MonotonicTime timestamp
      # Resource type.
      ResourceType type
      # Response data.
      Response response
      # Frame identifier.
      optional Page.FrameId frameId

  # Fired when WebSocket is closed.
  event webSocketClosed
    parameters
      # Request identifier.
      RequestId requestId
      # Timestamp.
      MonotonicTime timestamp

  # Fired upon WebSocket creation.
  event webSocketCreated
    parameters
      # Request identifier.
      RequestId requestId
      # WebSocket request URL.
      string url
      # Request initiator.
      optional Initiator initiator

  # Fired when WebSocket message error occurs.
  event webSocketFrameError
    parameters
      # Request identifier.
      RequestId requestId
      # Timestamp.
      MonotonicTime timestamp
      # WebSocket error message.
      string errorMessage

  # Fired when WebSocket message is received.
  event webSocketFrameReceived
    parameters
      # Request identifier.
      RequestId requestId
      # Timestamp.
      MonotonicTime timestamp
      # WebSocket response data.
      WebSocketFrame response

  # Fired when WebSocket message is sent.
  event webSocketFrameSent
    parameters
      # Request identifier.
      RequestId requestId
      # Timestamp.
      MonotonicTime timestamp
      # WebSocket response data.
      WebSocketFrame response

  # Fired when WebSocket handshake response becomes available.
  event webSocketHandshakeResponseReceived
    parameters
      # Request identifier.
      RequestId requestId
      # Timestamp.
      MonotonicTime timestamp
      # WebSocket response data.
      WebSocketResponse response

  # Fired when WebSocket is about to initiate handshake.
  event webSocketWillSendHandshakeRequest
    parameters
      # Request identifier.
      RequestId requestId
      # Timestamp.
      MonotonicTime timestamp
      # UTC Timestamp.
      TimeSinceEpoch wallTime
      # WebSocket request data.
      WebSocketRequest request

  # Fired when additional information about a requestWillBeSent event is available from the
  # network stack. Not every requestWillBeSent event will have an additional
  # requestWillBeSentExtraInfo fired for it, and there is no guarantee whether requestWillBeSent
  # or requestWillBeSentExtraInfo will be fired first for the same request.
  experimental event requestWillBeSentExtraInfo
    parameters
      # Request identifier. Used to match this information to an existing requestWillBeSent event.
      RequestId requestId
      # A list of cookies which will not be sent with this request along with corresponding reasons
      # for blocking.
      array of BlockedCookieWithReason blockedCookies
      # Raw request headers as they will be sent over the wire.
      Headers headers

  # Fired when additional information about a responseReceived event is available from the network
  # stack. Not every responseReceived event will have an additional responseReceivedExtraInfo for
  # it, and responseReceivedExtraInfo may be fired before or after responseReceived.
  experimental event responseReceivedExtraInfo
    parameters
      # Request identifier. Used to match this information to another responseReceived event.
      RequestId requestId
      # A list of cookies which were not stored from the response along with the corresponding
      # reasons for blocking. The cookies here may not be valid due to syntax errors, which
      # are represented by the invalid cookie line string instead of a proper cookie.
      array of BlockedSetCookieWithReason blockedCookies
      # Raw response headers as they were received over the wire.
      Headers headers
      # Raw response header text as it was received over the wire. The raw text may not always be
      # available, such as in the case of HTTP/2 or QUIC.
      optional string headersText

# This domain provides various functionality related to drawing atop the inspected page.
experimental domain Overlay
  depends on DOM
  depends on Page
  depends on Runtime

  # Configuration data for the highlighting of page elements.
  type HighlightConfig extends object
    properties
      # Whether the node info tooltip should be shown (default: false).
      optional boolean showInfo
      # Whether the node styles in the tooltip (default: false).
      optional boolean showStyles
      # Whether the rulers should be shown (default: false).
      optional boolean showRulers
      # Whether the extension lines from node to the rulers should be shown (default: false).
      optional boolean showExtensionLines
      # The content box highlight fill color (default: transparent).
      optional DOM.RGBA contentColor
      # The padding highlight fill color (default: transparent).
      optional DOM.RGBA paddingColor
      # The border highlight fill color (default: transparent).
      optional DOM.RGBA borderColor
      # The margin highlight fill color (default: transparent).
      optional DOM.RGBA marginColor
      # The event target element highlight fill color (default: transparent).
      optional DOM.RGBA eventTargetColor
      # The shape outside fill color (default: transparent).
      optional DOM.RGBA shapeColor
      # The shape margin fill color (default: transparent).
      optional DOM.RGBA shapeMarginColor
      # The grid layout color (default: transparent).
      optional DOM.RGBA cssGridColor

  type InspectMode extends string
    enum
      searchForNode
      searchForUAShadowDOM
      captureAreaScreenshot
      showDistances
      none

  # Disables domain notifications.
  command disable

  # Enables domain notifications.
  command enable

  # For testing.
  command getHighlightObjectForTest
    parameters
      # Id of the node to get highlight object for.
      DOM.NodeId nodeId
      # Whether to include distance info.
      optional boolean includeDistance
      # Whether to include style info.
      optional boolean includeStyle
    returns
      # Highlight data for the node.
      object highlight

  # Hides any highlight.
  command hideHighlight

  # Highlights owner element of the frame with given id.
  command highlightFrame
    parameters
      # Identifier of the frame to highlight.
      Page.FrameId frameId
      # The content box highlight fill color (default: transparent).
      optional DOM.RGBA contentColor
      # The content box highlight outline color (default: transparent).
      optional DOM.RGBA contentOutlineColor

  # Highlights DOM node with given id or with the given JavaScript object wrapper. Either nodeId or
  # objectId must be specified.
  command highlightNode
    parameters
      # A descriptor for the highlight appearance.
      HighlightConfig highlightConfig
      # Identifier of the node to highlight.
      optional DOM.NodeId nodeId
      # Identifier of the backend node to highlight.
      optional DOM.BackendNodeId backendNodeId
      # JavaScript object id of the node to be highlighted.
      optional Runtime.RemoteObjectId objectId
      # Selectors to highlight relevant nodes.
      optional string selector

  # Highlights given quad. Coordinates are absolute with respect to the main frame viewport.
  command highlightQuad
    parameters
      # Quad to highlight
      DOM.Quad quad
      # The highlight fill color (default: transparent).
      optional DOM.RGBA color
      # The highlight outline color (default: transparent).
      optional DOM.RGBA outlineColor

  # Highlights given rectangle. Coordinates are absolute with respect to the main frame viewport.
  command highlightRect
    parameters
      # X coordinate
      integer x
      # Y coordinate
      integer y
      # Rectangle width
      integer width
      # Rectangle height
      integer height
      # The highlight fill color (default: transparent).
      optional DOM.RGBA color
      # The highlight outline color (default: transparent).
      optional DOM.RGBA outlineColor

  # Enters the 'inspect' mode. In this mode, elements that user is hovering over are highlighted.
  # Backend then generates 'inspectNodeRequested' event upon element selection.
  command setInspectMode
    parameters
      # Set an inspection mode.
      InspectMode mode
      # A descriptor for the highlight appearance of hovered-over nodes. May be omitted if `enabled
      # == false`.
      optional HighlightConfig highlightConfig

  # Highlights owner element of all frames detected to be ads.
  command setShowAdHighlights
    parameters
      # True for showing ad highlights
      boolean show

  command setPausedInDebuggerMessage
    parameters
      # The message to display, also triggers resume and step over controls.
      optional string message

  # Requests that backend shows debug borders on layers
  command setShowDebugBorders
    parameters
      # True for showing debug borders
      boolean show

  # Requests that backend shows the FPS counter
  command setShowFPSCounter
    parameters
      # True for showing the FPS counter
      boolean show

  # Requests that backend shows paint rectangles
  command setShowPaintRects
    parameters
      # True for showing paint rectangles
      boolean result

  # Requests that backend shows layout shift regions
  command setShowLayoutShiftRegions
    parameters
      # True for showing layout shift regions
      boolean result

  # Requests that backend shows scroll bottleneck rects
  command setShowScrollBottleneckRects
    parameters
      # True for showing scroll bottleneck rects
      boolean show

  # Requests that backend shows hit-test borders on layers
  command setShowHitTestBorders
    parameters
      # True for showing hit-test borders
      boolean show

  # Paints viewport size upon main frame resize.
  command setShowViewportSizeOnResize
    parameters
      # Whether to paint size or not.
      boolean show

  # Fired when the node should be inspected. This happens after call to `setInspectMode` or when
  # user manually inspects an element.
  event inspectNodeRequested
    parameters
      # Id of the node to inspect.
      DOM.BackendNodeId backendNodeId

  # Fired when the node should be highlighted. This happens after call to `setInspectMode`.
  event nodeHighlightRequested
    parameters
      DOM.NodeId nodeId

  # Fired when user asks to capture screenshot of some area on the page.
  event screenshotRequested
    parameters
      # Viewport to capture, in device independent pixels (dip).
      Page.Viewport viewport

  # Fired when user cancels the inspect mode.
  event inspectModeCanceled

# Actions and events related to the inspected page belong to the page domain.
domain Page
  depends on Debugger
  depends on DOM
  depends on IO
  depends on Network
  depends on Runtime

  # Unique frame identifier.
  type FrameId extends string

  # Information about the Frame on the page.
  type Frame extends object
    properties
      # Frame unique identifier.
      FrameId id
      # Parent frame identifier.
      optional string parentId
      # Identifier of the loader associated with this frame.
      Network.LoaderId loaderId
      # Frame's name as specified in the tag.
      optional string name
      # Frame document's URL without fragment.
      string url
      # Frame document's URL fragment including the '#'.
      experimental optional string urlFragment
      # Frame document's security origin.
      string securityOrigin
      # Frame document's mimeType as determined by the browser.
      string mimeType
      # If the frame failed to load, this contains the URL that could not be loaded. Note that unlike url above, this URL may contain a fragment.
      experimental optional string unreachableUrl

  # Information about the Resource on the page.
  experimental type FrameResource extends object
    properties
      # Resource URL.
      string url
      # Type of this resource.
      Network.ResourceType type
      # Resource mimeType as determined by the browser.
      string mimeType
      # last-modified timestamp as reported by server.
      optional Network.TimeSinceEpoch lastModified
      # Resource content size.
      optional number contentSize
      # True if the resource failed to load.
      optional boolean failed
      # True if the resource was canceled during loading.
      optional boolean canceled

  # Information about the Frame hierarchy along with their cached resources.
  experimental type FrameResourceTree extends object
    properties
      # Frame information for this tree item.
      Frame frame
      # Child frames.
      optional array of FrameResourceTree childFrames
      # Information about frame resources.
      array of FrameResource resources

  # Information about the Frame hierarchy.
  type FrameTree extends object
    properties
      # Frame information for this tree item.
      Frame frame
      # Child frames.
      optional array of FrameTree childFrames

  # Unique script identifier.
  type ScriptIdentifier extends string

  # Transition type.
  type TransitionType extends string
    enum
      link
      typed
      address_bar
      auto_bookmark
      auto_subframe
      manual_subframe
      generated
      auto_toplevel
      form_submit
      reload
      keyword
      keyword_generated
      other

  # Navigation history entry.
  type NavigationEntry extends object
    properties
      # Unique id of the navigation history entry.
      integer id
      # URL of the navigation history entry.
      string url
      # URL that the user typed in the url bar.
      string userTypedURL
      # Title of the navigation history entry.
      string title
      # Transition type.
      TransitionType transitionType

  # Screencast frame metadata.
  experimental type ScreencastFrameMetadata extends object
    properties
      # Top offset in DIP.
      number offsetTop
      # Page scale factor.
      number pageScaleFactor
      # Device screen width in DIP.
      number deviceWidth
      # Device screen height in DIP.
      number deviceHeight
      # Position of horizontal scroll in CSS pixels.
      number scrollOffsetX
      # Position of vertical scroll in CSS pixels.
      number scrollOffsetY
      # Frame swap timestamp.
      optional Network.TimeSinceEpoch timestamp

  # Javascript dialog type.
  type DialogType extends string
    enum
      alert
      confirm
      prompt
      beforeunload

  # Error while paring app manifest.
  type AppManifestError extends object
    properties
      # Error message.
      string message
      # If criticial, this is a non-recoverable parse error.
      integer critical
      # Error line.
      integer line
      # Error column.
      integer column

  # Layout viewport position and dimensions.
  type LayoutViewport extends object
    properties
      # Horizontal offset relative to the document (CSS pixels).
      integer pageX
      # Vertical offset relative to the document (CSS pixels).
      integer pageY
      # Width (CSS pixels), excludes scrollbar if present.
      integer clientWidth
      # Height (CSS pixels), excludes scrollbar if present.
      integer clientHeight

  # Visual viewport position, dimensions, and scale.
  type VisualViewport extends object
    properties
      # Horizontal offset relative to the layout viewport (CSS pixels).
      number offsetX
      # Vertical offset relative to the layout viewport (CSS pixels).
      number offsetY
      # Horizontal offset relative to the document (CSS pixels).
      number pageX
      # Vertical offset relative to the document (CSS pixels).
      number pageY
      # Width (CSS pixels), excludes scrollbar if present.
      number clientWidth
      # Height (CSS pixels), excludes scrollbar if present.
      number clientHeight
      # Scale relative to the ideal viewport (size at width=device-width).
      number scale
      # Page zoom factor (CSS to device independent pixels ratio).
      optional number zoom

  # Viewport for capturing screenshot.
  type Viewport extends object
    properties
      # X offset in device independent pixels (dip).
      number x
      # Y offset in device independent pixels (dip).
      number y
      # Rectangle width in device independent pixels (dip).
      number width
      # Rectangle height in device independent pixels (dip).
      number height
      # Page scale factor.
      number scale

  # Generic font families collection.
  experimental type FontFamilies extends object
    properties
      # The standard font-family.
      optional string standard
      # The fixed font-family.
      optional string fixed
      # The serif font-family.
      optional string serif
      # The sansSerif font-family.
      optional string sansSerif
      # The cursive font-family.
      optional string cursive
      # The fantasy font-family.
      optional string fantasy
      # The pictograph font-family.
      optional string pictograph

  # Default font sizes.
  experimental type FontSizes extends object
    properties
      # Default standard font size.
      optional integer standard
      # Default fixed font size.
      optional integer fixed

  experimental type ClientNavigationReason extends string
    enum
      formSubmissionGet
      formSubmissionPost
      httpHeaderRefresh
      scriptInitiated
      metaTagRefresh
      pageBlockInterstitial
      reload

  # Deprecated, please use addScriptToEvaluateOnNewDocument instead.
  experimental deprecated command addScriptToEvaluateOnLoad
    parameters
      string scriptSource
    returns
      # Identifier of the added script.
      ScriptIdentifier identifier

  # Evaluates given script in every frame upon creation (before loading frame's scripts).
  command addScriptToEvaluateOnNewDocument
    parameters
      string source
      # If specified, creates an isolated world with the given name and evaluates given script in it.
      # This world name will be used as the ExecutionContextDescription::name when the corresponding
      # event is emitted.
      experimental optional string worldName
    returns
      # Identifier of the added script.
      ScriptIdentifier identifier

  # Brings page to front (activates tab).
  command bringToFront

  # Capture page screenshot.
  command captureScreenshot
    parameters
      # Image compression format (defaults to png).
      optional enum format
        jpeg
        png
      # Compression quality from range [0..100] (jpeg only).
      optional integer quality
      # Capture the screenshot of a given region only.
      optional Viewport clip
      # Capture the screenshot from the surface, rather than the view. Defaults to true.
      experimental optional boolean fromSurface
    returns
      # Base64-encoded image data.
      binary data

  # Returns a snapshot of the page as a string. For MHTML format, the serialization includes
  # iframes, shadow DOM, external resources, and element-inline styles.
  experimental command captureSnapshot
    parameters
      # Format (defaults to mhtml).
      optional enum format
        mhtml
    returns
      # Serialized page data.
      string data

  # Clears the overriden device metrics.
  experimental deprecated command clearDeviceMetricsOverride
    # Use 'Emulation.clearDeviceMetricsOverride' instead
    redirect Emulation

  # Clears the overridden Device Orientation.
  experimental deprecated command clearDeviceOrientationOverride
    # Use 'DeviceOrientation.clearDeviceOrientationOverride' instead
    redirect DeviceOrientation

  # Clears the overriden Geolocation Position and Error.
  deprecated command clearGeolocationOverride
    # Use 'Emulation.clearGeolocationOverride' instead
    redirect Emulation

  # Creates an isolated world for the given frame.
  command createIsolatedWorld
    parameters
      # Id of the frame in which the isolated world should be created.
      FrameId frameId
      # An optional name which is reported in the Execution Context.
      optional string worldName
      # Whether or not universal access should be granted to the isolated world. This is a powerful
      # option, use with caution.
      optional boolean grantUniveralAccess
    returns
      # Execution context of the isolated world.
      Runtime.ExecutionContextId executionContextId

  # Deletes browser cookie with given name, domain and path.
  experimental deprecated command deleteCookie
    # Use 'Network.deleteCookie' instead
    redirect Network
    parameters
      # Name of the cookie to remove.
      string cookieName
      # URL to match cooke domain and path.
      string url

  # Disables page domain notifications.
  command disable

  # Enables page domain notifications.
  command enable

  command getAppManifest
    returns
      # Manifest location.
      string url
      array of AppManifestError errors
      # Manifest content.
      optional string data

  experimental command getInstallabilityErrors
    returns
      array of string errors

  # Returns all browser cookies. Depending on the backend support, will return detailed cookie
  # information in the `cookies` field.
  experimental deprecated command getCookies
    # Use 'Network.getCookies' instead
    redirect Network
    returns
      # Array of cookie objects.
      array of Network.Cookie cookies

  # Returns present frame tree structure.
  command getFrameTree
    returns
      # Present frame tree structure.
      FrameTree frameTree

  # Returns metrics relating to the layouting of the page, such as viewport bounds/scale.
  command getLayoutMetrics
    returns
      # Metrics relating to the layout viewport.
      LayoutViewport layoutViewport
      # Metrics relating to the visual viewport.
      VisualViewport visualViewport
      # Size of scrollable area.
      DOM.Rect contentSize

  # Returns navigation history for the current page.
  command getNavigationHistory
    returns
      # Index of the current navigation history entry.
      integer currentIndex
      # Array of navigation history entries.
      array of NavigationEntry entries

  # Resets navigation history for the current page.
  command resetNavigationHistory

  # Returns content of the given resource.
  experimental command getResourceContent
    parameters
      # Frame id to get resource for.
      FrameId frameId
      # URL of the resource to get content for.
      string url
    returns
      # Resource content.
      string content
      # True, if content was served as base64.
      boolean base64Encoded

  # Returns present frame / resource tree structure.
  experimental command getResourceTree
    returns
      # Present frame / resource tree structure.
      FrameResourceTree frameTree

  # Accepts or dismisses a JavaScript initiated dialog (alert, confirm, prompt, or onbeforeunload).
  command handleJavaScriptDialog
    parameters
      # Whether to accept or dismiss the dialog.
      boolean accept
      # The text to enter into the dialog prompt before accepting. Used only if this is a prompt
      # dialog.
      optional string promptText

  # Navigates current page to the given URL.
  command navigate
    parameters
      # URL to navigate the page to.
      string url
      # Referrer URL.
      optional string referrer
      # Intended transition type.
      optional TransitionType transitionType
      # Frame id to navigate, if not specified navigates the top frame.
      optional FrameId frameId
    returns
      # Frame id that has navigated (or failed to navigate)
      FrameId frameId
      # Loader identifier.
      optional Network.LoaderId loaderId
      # User friendly error message, present if and only if navigation has failed.
      optional string errorText

  # Navigates current page to the given history entry.
  command navigateToHistoryEntry
    parameters
      # Unique id of the entry to navigate to.
      integer entryId

  # Print page as PDF.
  command printToPDF
    parameters
      # Paper orientation. Defaults to false.
      optional boolean landscape
      # Display header and footer. Defaults to false.
      optional boolean displayHeaderFooter
      # Print background graphics. Defaults to false.
      optional boolean printBackground
      # Scale of the webpage rendering. Defaults to 1.
      optional number scale
      # Paper width in inches. Defaults to 8.5 inches.
      optional number paperWidth
      # Paper height in inches. Defaults to 11 inches.
      optional number paperHeight
      # Top margin in inches. Defaults to 1cm (~0.4 inches).
      optional number marginTop
      # Bottom margin in inches. Defaults to 1cm (~0.4 inches).
      optional number marginBottom
      # Left margin in inches. Defaults to 1cm (~0.4 inches).
      optional number marginLeft
      # Right margin in inches. Defaults to 1cm (~0.4 inches).
      optional number marginRight
      # Paper ranges to print, e.g., '1-5, 8, 11-13'. Defaults to the empty string, which means
      # print all pages.
      optional string pageRanges
      # Whether to silently ignore invalid but successfully parsed page ranges, such as '3-2'.
      # Defaults to false.
      optional boolean ignoreInvalidPageRanges
      # HTML template for the print header. Should be valid HTML markup with following
      # classes used to inject printing values into them:
      # - `date`: formatted print date
      # - `title`: document title
      # - `url`: document location
      # - `pageNumber`: current page number
      # - `totalPages`: total pages in the document
      #
      # For example, `<span class=title></span>` would generate span containing the title.
      optional string headerTemplate
      # HTML template for the print footer. Should use the same format as the `headerTemplate`.
      optional string footerTemplate
      # Whether or not to prefer page size as defined by css. Defaults to false,
      # in which case the content will be scaled to fit the paper size.
      optional boolean preferCSSPageSize
      # return as stream
      experimental optional enum transferMode
        ReturnAsBase64
        ReturnAsStream
    returns
      # Base64-encoded pdf data. Empty if |returnAsStream| is specified.
      binary data
      # A handle of the stream that holds resulting PDF data.
      experimental optional IO.StreamHandle stream

  # Reloads given page optionally ignoring the cache.
  command reload
    parameters
      # If true, browser cache is ignored (as if the user pressed Shift+refresh).
      optional boolean ignoreCache
      # If set, the script will be injected into all frames of the inspected page after reload.
      # Argument will be ignored if reloading dataURL origin.
      optional string scriptToEvaluateOnLoad

  # Deprecated, please use removeScriptToEvaluateOnNewDocument instead.
  experimental deprecated command removeScriptToEvaluateOnLoad
    parameters
      ScriptIdentifier identifier

  # Removes given script from the list.
  command removeScriptToEvaluateOnNewDocument
    parameters
      ScriptIdentifier identifier

  # Acknowledges that a screencast frame has been received by the frontend.
  experimental command screencastFrameAck
    parameters
      # Frame number.
      integer sessionId

  # Searches for given string in resource content.
  experimental command searchInResource
    parameters
      # Frame id for resource to search in.
      FrameId frameId
      # URL of the resource to search in.
      string url
      # 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 Debugger.SearchMatch result

  # Enable Chrome's experimental ad filter on all sites.
  experimental command setAdBlockingEnabled
    parameters
      # Whether to block ads.
      boolean enabled

  # Enable page Content Security Policy by-passing.
  experimental command setBypassCSP
    parameters
      # Whether to bypass page CSP.
      boolean enabled

  # Overrides the values of device screen dimensions (window.screen.width, window.screen.height,
  # window.innerWidth, window.innerHeight, and "device-width"/"device-height"-related CSS media
  # query results).
  experimental deprecated command setDeviceMetricsOverride
    # Use 'Emulation.setDeviceMetricsOverride' instead
    redirect Emulation
    parameters
      # Overriding width value in pixels (minimum 0, maximum 10000000). 0 disables the override.
      integer width
      # Overriding height value in pixels (minimum 0, maximum 10000000). 0 disables the override.
      integer height
      # Overriding device scale factor value. 0 disables the override.
      number deviceScaleFactor
      # Whether to emulate mobile device. This includes viewport meta tag, overlay scrollbars, text
      # autosizing and more.
      boolean mobile
      # Scale to apply to resulting view image.
      optional number scale
      # Overriding screen width value in pixels (minimum 0, maximum 10000000).
      optional integer screenWidth
      # Overriding screen height value in pixels (minimum 0, maximum 10000000).
      optional integer screenHeight
      # Overriding view X position on screen in pixels (minimum 0, maximum 10000000).
      optional integer positionX
      # Overriding view Y position on screen in pixels (minimum 0, maximum 10000000).
      optional integer positionY
      # Do not set visible view size, rely upon explicit setVisibleSize call.
      optional boolean dontSetVisibleSize
      # Screen orientation override.
      optional Emulation.ScreenOrientation screenOrientation
      # The viewport dimensions and scale. If not set, the override is cleared.
      optional Viewport viewport

  # Overrides the Device Orientation.
  experimental deprecated command setDeviceOrientationOverride
    # Use 'DeviceOrientation.setDeviceOrientationOverride' instead
    redirect DeviceOrientation
    parameters
      # Mock alpha
      number alpha
      # Mock beta
      number beta
      # Mock gamma
      number gamma

  # Set generic font families.
  experimental command setFontFamilies
    parameters
      # Specifies font families to set. If a font family is not specified, it won't be changed.
      FontFamilies fontFamilies

  # Set default font sizes.
  experimental command setFontSizes
    parameters
      # Specifies font sizes to set. If a font size is not specified, it won't be changed.
      FontSizes fontSizes

  # Sets given markup as the document's HTML.
  command setDocumentContent
    parameters
      # Frame id to set HTML for.
      FrameId frameId
      # HTML content to set.
      string html

  # Set the behavior when downloading a file.
  experimental command setDownloadBehavior
    parameters
      # Whether to allow all or deny all download requests, or use default Chrome behavior if
      # available (otherwise deny).
      enum behavior
        deny
        allow
        default
      # The default path to save downloaded files to. This is requred if behavior is set to 'allow'
      optional string downloadPath

  # Overrides the Geolocation Position or Error. Omitting any of the parameters emulates position
  # unavailable.
  deprecated command setGeolocationOverride
    # Use 'Emulation.setGeolocationOverride' instead
    redirect Emulation
    parameters
      # Mock latitude
      optional number latitude
      # Mock longitude
      optional number longitude
      # Mock accuracy
      optional number accuracy

  # Controls whether page will emit lifecycle events.
  experimental command setLifecycleEventsEnabled
    parameters
      # If true, starts emitting lifecycle events.
      boolean enabled

  # Toggles mouse event-based touch event emulation.
  experimental deprecated command setTouchEmulationEnabled
    # Use 'Emulation.setTouchEmulationEnabled' instead
    redirect Emulation
    parameters
      # Whether the touch event emulation should be enabled.
      boolean enabled
      # Touch/gesture events configuration. Default: current platform.
      optional enum configuration
        mobile
        desktop

  # Starts sending each frame using the `screencastFrame` event.
  experimental command startScreencast
    parameters
      # Image compression format.
      optional enum format
        jpeg
        png
      # Compression quality from range [0..100].
      optional integer quality
      # Maximum screenshot width.
      optional integer maxWidth
      # Maximum screenshot height.
      optional integer maxHeight
      # Send every n-th frame.
      optional integer everyNthFrame

  # Force the page stop all navigations and pending resource fetches.
  command stopLoading

  # Crashes renderer on the IO thread, generates minidumps.
  experimental command crash

  # Tries to close page, running its beforeunload hooks, if any.
  experimental command close

  # Tries to update the web lifecycle state of the page.
  # It will transition the page to the given state according to:
  # https://github.com/WICG/web-lifecycle/
  experimental command setWebLifecycleState
    parameters
      # Target lifecycle state
      enum state
        frozen
        active

  # Stops sending each frame in the `screencastFrame`.
  experimental command stopScreencast

  # Forces compilation cache to be generated for every subresource script.
  experimental command setProduceCompilationCache
    parameters
      boolean enabled

  # Seeds compilation cache for given url. Compilation cache does not survive
  # cross-process navigation.
  experimental command addCompilationCache
    parameters
      string url
      # Base64-encoded data
      binary data

  # Clears seeded compilation cache.
  experimental command clearCompilationCache

  # Generates a report for testing.
  experimental command generateTestReport
    parameters
      # Message to be displayed in the report.
      string message
      # Specifies the endpoint group to deliver the report to.
      optional string group

  # Pauses page execution. Can be resumed using generic Runtime.runIfWaitingForDebugger.
  experimental command waitForDebugger

  # Intercept file chooser requests and transfer control to protocol clients.
  # When file chooser interception is enabled, native file chooser dialog is not shown.
  # Instead, a protocol event `Page.fileChooserOpened` is emitted.
  experimental command setInterceptFileChooserDialog
    parameters
      boolean enabled

  event domContentEventFired
    parameters
      Network.MonotonicTime timestamp

  # Emitted only when `page.interceptFileChooser` is enabled.
  event fileChooserOpened
    parameters
      # Id of the frame containing input node.
      experimental FrameId frameId
      # Input node id.
      experimental DOM.BackendNodeId backendNodeId
      # Input mode.
      enum mode
        selectSingle
        selectMultiple

  # Fired when frame has been attached to its parent.
  event frameAttached
    parameters
      # Id of the frame that has been attached.
      FrameId frameId
      # Parent frame identifier.
      FrameId parentFrameId
      # JavaScript stack trace of when frame was attached, only set if frame initiated from script.
      optional Runtime.StackTrace stack

  # Fired when frame no longer has a scheduled navigation.
  deprecated event frameClearedScheduledNavigation
    parameters
      # Id of the frame that has cleared its scheduled navigation.
      FrameId frameId

  # Fired when frame has been detached from its parent.
  event frameDetached
    parameters
      # Id of the frame that has been detached.
      FrameId frameId

  # Fired once navigation of the frame has completed. Frame is now associated with the new loader.
  event frameNavigated
    parameters
      # Frame object.
      Frame frame

  experimental event frameResized

  # Fired when a renderer-initiated navigation is requested.
  # Navigation may still be cancelled after the event is issued.
  experimental event frameRequestedNavigation
    parameters
      # Id of the frame that is being navigated.
      FrameId frameId
      # The reason for the navigation.
      ClientNavigationReason reason
      # The destination URL for the requested navigation.
      string url

  # Fired when frame schedules a potential navigation.
  deprecated event frameScheduledNavigation
    parameters
      # Id of the frame that has scheduled a navigation.
      FrameId frameId
      # Delay (in seconds) until the navigation is scheduled to begin. The navigation is not
      # guaranteed to start.
      number delay
      # The reason for the navigation.
      enum reason
        formSubmissionGet
        formSubmissionPost
        httpHeaderRefresh
        scriptInitiated
        metaTagRefresh
        pageBlockInterstitial
        reload
      # The destination URL for the scheduled navigation.
      string url

  # Fired when frame has started loading.
  experimental event frameStartedLoading
    parameters
      # Id of the frame that has started loading.
      FrameId frameId

  # Fired when frame has stopped loading.
  experimental event frameStoppedLoading
    parameters
      # Id of the frame that has stopped loading.
      FrameId frameId

  # Fired when page is about to start a download.
  experimental event downloadWillBegin
    parameters
      # Id of the frame that caused download to begin.
      FrameId frameId
      # URL of the resource being downloaded.
      string url

  # Fired when interstitial page was hidden
  event interstitialHidden

  # Fired when interstitial page was shown
  event interstitialShown

  # Fired when a JavaScript initiated dialog (alert, confirm, prompt, or onbeforeunload) has been
  # closed.
  event javascriptDialogClosed
    parameters
      # Whether dialog was confirmed.
      boolean result
      # User input in case of prompt.
      string userInput

  # Fired when a JavaScript initiated dialog (alert, confirm, prompt, or onbeforeunload) is about to
  # open.
  event javascriptDialogOpening
    parameters
      # Frame url.
      string url
      # Message that will be displayed by the dialog.
      string message
      # Dialog type.
      DialogType type
      # True iff browser is capable showing or acting on the given dialog. When browser has no
      # dialog handler for given target, calling alert while Page domain is engaged will stall
      # the page execution. Execution can be resumed via calling Page.handleJavaScriptDialog.
      boolean hasBrowserHandler
      # Default dialog prompt.
      optional string defaultPrompt

  # Fired for top level page lifecycle events such as navigation, load, paint, etc.
  event lifecycleEvent
    parameters
      # Id of the frame.
      FrameId frameId
      # Loader identifier. Empty string if the request is fetched from worker.
      Network.LoaderId loaderId
      string name
      Network.MonotonicTime timestamp

  event loadEventFired
    parameters
      Network.MonotonicTime timestamp

  # Fired when same-document navigation happens, e.g. due to history API usage or anchor navigation.
  experimental event navigatedWithinDocument
    parameters
      # Id of the frame.
      FrameId frameId
      # Frame's new url.
      string url

  # Compressed image data requested by the `startScreencast`.
  experimental event screencastFrame
    parameters
      # Base64-encoded compressed image.
      binary data
      # Screencast frame metadata.
      ScreencastFrameMetadata metadata
      # Frame number.
      integer sessionId

  # Fired when the page with currently enabled screencast was shown or hidden `.
  experimental event screencastVisibilityChanged
    parameters
      # True if the page is visible.
      boolean visible

  # Fired when a new window is going to be opened, via window.open(), link click, form submission,
  # etc.
  event windowOpen
    parameters
      # The URL for the new window.
      string url
      # Window name.
      string windowName
      # An array of enabled window features.
      array of string windowFeatures
      # Whether or not it was triggered by user gesture.
      boolean userGesture

  # Issued for every compilation cache generated. Is only available
  # if Page.setGenerateCompilationCache is enabled.
  experimental event compilationCacheProduced
    parameters
      string url
      # Base64-encoded data
      binary data

domain Performance

  # Run-time execution metric.
  type Metric extends object
    properties
      # Metric name.
      string name
      # Metric value.
      number value

  # Disable collecting and reporting metrics.
  command disable

  # Enable collecting and reporting metrics.
  command enable

  # Sets time domain to use for collecting and reporting duration metrics.
  # Note that this must be called before enabling metrics collection. Calling
  # this method while metrics collection is enabled returns an error.
  experimental command setTimeDomain
    parameters
      # Time domain
      enum timeDomain
        # Use monotonically increasing abstract time (default).
        timeTicks
        # Use thread running time.
        threadTicks

  # Retrieve current values of run-time metrics.
  command getMetrics
    returns
      # Current values for run-time metrics.
      array of Metric metrics

  # Current values of the metrics.
  event metrics
    parameters
      # Current values of the metrics.
      array of Metric metrics
      # Timestamp title.
      string title

# Security
domain Security

  # An internal certificate ID value.
  type CertificateId extends integer

  # A description of mixed content (HTTP resources on HTTPS pages), as defined by
  # https://www.w3.org/TR/mixed-content/#categories
  type MixedContentType extends string
    enum
      blockable
      optionally-blockable
      none

  # The security level of a page or resource.
  type SecurityState extends string
    enum
      unknown
      neutral
      insecure
      secure
      info
      insecure-broken

  # Details about the security state of the page certificate.
  experimental type CertificateSecurityState extends object
    properties
      # Protocol name (e.g. "TLS 1.2" or "QUIC").
      string protocol
      # Key Exchange used by the connection, or the empty string if not applicable.
      string keyExchange
      # (EC)DH group used by the connection, if applicable.
      optional string keyExchangeGroup
      # Cipher name.
      string cipher
      # TLS MAC. Note that AEAD ciphers do not have separate MACs.
      optional string mac
      # Page certificate.
      array of string certificate
      # Certificate subject name.
      string subjectName
      # Name of the issuing CA.
      string issuer
      # Certificate valid from date.
      Network.TimeSinceEpoch validFrom
      # Certificate valid to (expiration) date
      Network.TimeSinceEpoch validTo
      # The highest priority network error code, if the certificate has an error.
      optional string certificateNetworkError
      # True if the certificate uses a weak signature aglorithm.
      boolean certificateHasWeakSignature
      # True if the certificate has a SHA1 signature in the chain.
      boolean certificateHasSha1Signature
      # True if modern SSL
      boolean modernSSL
      # True if the connection is using an obsolete SSL protocol.
      boolean obsoleteSslProtocol
      # True if the connection is using an obsolete SSL key exchange.
      boolean obsoleteSslKeyExchange
      # True if the connection is using an obsolete SSL cipher.
      boolean obsoleteSslCipher
      # True if the connection is using an obsolete SSL signature.
      boolean obsoleteSslSignature

  experimental type SafetyTipStatus extends string
    enum
      badReputation
      lookalike

  experimental type SafetyTipInfo extends object
    properties
      # Describes whether the page triggers any safety tips or reputation warnings. Default is unknown.
      SafetyTipStatus safetyTipStatus
      # The URL the safety tip suggested ("Did you mean?"). Only filled in for lookalike matches.
      optional string safeUrl

  # Security state information about the page.
  experimental type VisibleSecurityState extends object
    properties
      # The security level of the page.
      SecurityState securityState
      # Security state details about the page certificate.
      optional CertificateSecurityState certificateSecurityState
      # The type of Safety Tip triggered on the page. Note that this field will be set even if the Safety Tip UI was not actually shown.
      optional SafetyTipInfo safetyTipInfo
      # Array of security state issues ids.
      array of string securityStateIssueIds

  # An explanation of an factor contributing to the security state.
  type SecurityStateExplanation extends object
    properties
      # Security state representing the severity of the factor being explained.
      SecurityState securityState
      # Title describing the type of factor.
      string title
      # Short phrase describing the type of factor.
      string summary
      # Full text explanation of the factor.
      string description
      # The type of mixed content described by the explanation.
      MixedContentType mixedContentType
      # Page certificate.
      array of string certificate
      # Recommendations to fix any issues.
      optional array of string recommendations

  # Information about insecure content on the page.
  deprecated type InsecureContentStatus extends object
    properties
      # Always false.
      boolean ranMixedContent
      # Always false.
      boolean displayedMixedContent
      # Always false.
      boolean containedMixedForm
      # Always false.
      boolean ranContentWithCertErrors
      # Always false.
      boolean displayedContentWithCertErrors
      # Always set to unknown.
      SecurityState ranInsecureContentStyle
      # Always set to unknown.
      SecurityState displayedInsecureContentStyle

  # The action to take when a certificate error occurs. continue will continue processing the
  # request and cancel will cancel the request.
  type CertificateErrorAction extends string
    enum
      continue
      cancel

  # Disables tracking security state changes.
  command disable

  # Enables tracking security state changes.
  command enable

  # Enable/disable whether all certificate errors should be ignored.
  experimental command setIgnoreCertificateErrors
    parameters
      # If true, all certificate errors will be ignored.
      boolean ignore

  # Handles a certificate error that fired a certificateError event.
  deprecated command handleCertificateError
    parameters
      # The ID of the event.
      integer eventId
      # The action to take on the certificate error.
      CertificateErrorAction action

  # Enable/disable overriding certificate errors. If enabled, all certificate error events need to
  # be handled by the DevTools client and should be answered with `handleCertificateError` commands.
  deprecated command setOverrideCertificateErrors
    parameters
      # If true, certificate errors will be overridden.
      boolean override

  # There is a certificate error. If overriding certificate errors is enabled, then it should be
  # handled with the `handleCertificateError` command. Note: this event does not fire if the
  # certificate error has been allowed internally. Only one client per target should override
  # certificate errors at the same time.
  deprecated event certificateError
    parameters
      # The ID of the event.
      integer eventId
      # The type of the error.
      string errorType
      # The url that was requested.
      string requestURL

  # The security state of the page changed.
  experimental event visibleSecurityStateChanged
    parameters
      # Security state information about the page.
      VisibleSecurityState visibleSecurityState

  # The security state of the page changed.
  event securityStateChanged
    parameters
      # Security state.
      SecurityState securityState
      # True if the page was loaded over cryptographic transport such as HTTPS.
      deprecated boolean schemeIsCryptographic
      # List of explanations for the security state. If the overall security state is `insecure` or
      # `warning`, at least one corresponding explanation should be included.
      array of SecurityStateExplanation explanations
      # Information about insecure content on the page.
      deprecated InsecureContentStatus insecureContentStatus
      # Overrides user-visible description of the state.
      optional string summary

experimental domain ServiceWorker
  type RegistrationID extends string

  # ServiceWorker registration.
  type ServiceWorkerRegistration extends object
    properties
      RegistrationID registrationId
      string scopeURL
      boolean isDeleted

  type ServiceWorkerVersionRunningStatus extends string
    enum
      stopped
      starting
      running
      stopping

  type ServiceWorkerVersionStatus extends string
    enum
      new
      installing
      installed
      activating
      activated
      redundant

  # ServiceWorker version.
  type ServiceWorkerVersion extends object
    properties
      string versionId
      RegistrationID registrationId
      string scriptURL
      ServiceWorkerVersionRunningStatus runningStatus
      ServiceWorkerVersionStatus status
      # The Last-Modified header value of the main script.
      optional number scriptLastModified
      # The time at which the response headers of the main script were received from the server.
      # For cached script it is the last time the cache entry was validated.
      optional number scriptResponseTime
      optional array of Target.TargetID controlledClients
      optional Target.TargetID targetId

  # ServiceWorker error message.
  type ServiceWorkerErrorMessage extends object
    properties
      string errorMessage
      RegistrationID registrationId
      string versionId
      string sourceURL
      integer lineNumber
      integer columnNumber

  command deliverPushMessage
    parameters
      string origin
      RegistrationID registrationId
      string data

  command disable

  command dispatchSyncEvent
    parameters
      string origin
      RegistrationID registrationId
      string tag
      boolean lastChance

  command dispatchPeriodicSyncEvent
    parameters
      string origin
      RegistrationID registrationId
      string tag

  command enable

  command inspectWorker
    parameters
      string versionId

  command setForceUpdateOnPageLoad
    parameters
      boolean forceUpdateOnPageLoad

  command skipWaiting
    parameters
      string scopeURL

  command startWorker
    parameters
      string scopeURL

  command stopAllWorkers

  command stopWorker
    parameters
      string versionId

  command unregister
    parameters
      string scopeURL

  command updateRegistration
    parameters
      string scopeURL

  event workerErrorReported
    parameters
      ServiceWorkerErrorMessage errorMessage

  event workerRegistrationUpdated
    parameters
      array of ServiceWorkerRegistration registrations

  event workerVersionUpdated
    parameters
      array of ServiceWorkerVersion versions

experimental domain Storage
  depends on Browser
  depends on Network

  # Enum of possible storage types.
  type StorageType extends string
    enum
      appcache
      cookies
      file_systems
      indexeddb
      local_storage
      shader_cache
      websql
      service_workers
      cache_storage
      all
      other

  # Usage for a storage type.
  type UsageForType extends object
    properties
      # Name of storage type.
      StorageType storageType
      # Storage usage (bytes).
      number usage

  # Clears storage for origin.
  command clearDataForOrigin
    parameters
      # Security origin.
      string origin
      # Comma separated list of StorageType to clear.
      string storageTypes

  # Returns all browser cookies.
  command getCookies
    parameters
      # Browser context to use when called on the browser endpoint.
      optional Browser.BrowserContextID browserContextId
    returns
      # Array of cookie objects.
      array of Network.Cookie cookies

  # Sets given cookies.
  command setCookies
    parameters
      # Cookies to be set.
      array of Network.CookieParam cookies
      # Browser context to use when called on the browser endpoint.
      optional Browser.BrowserContextID browserContextId

  # Clears cookies.
  command clearCookies
    parameters
      # Browser context to use when called on the browser endpoint.
      optional Browser.BrowserContextID browserContextId

  # Returns usage and quota in bytes.
  command getUsageAndQuota
    parameters
      # Security origin.
      string origin
    returns
      # Storage usage (bytes).
      number usage
      # Storage quota (bytes).
      number quota
      # Storage usage per type (bytes).
      array of UsageForType usageBreakdown

  # Registers origin to be notified when an update occurs to its cache storage list.
  command trackCacheStorageForOrigin
    parameters
      # Security origin.
      string origin

  # Registers origin to be notified when an update occurs to its IndexedDB.
  command trackIndexedDBForOrigin
    parameters
      # Security origin.
      string origin

  # Unregisters origin from receiving notifications for cache storage.
  command untrackCacheStorageForOrigin
    parameters
      # Security origin.
      string origin

  # Unregisters origin from receiving notifications for IndexedDB.
  command untrackIndexedDBForOrigin
    parameters
      # Security origin.
      string origin

  # A cache's contents have been modified.
  event cacheStorageContentUpdated
    parameters
      # Origin to update.
      string origin
      # Name of cache in origin.
      string cacheName

  # A cache has been added/deleted.
  event cacheStorageListUpdated
    parameters
      # Origin to update.
      string origin

  # The origin's IndexedDB object store has been modified.
  event indexedDBContentUpdated
    parameters
      # Origin to update.
      string origin
      # Database to update.
      string databaseName
      # ObjectStore to update.
      string objectStoreName

  # The origin's IndexedDB database list has been modified.
  event indexedDBListUpdated
    parameters
      # Origin to update.
      string origin

# The SystemInfo domain defines methods and events for querying low-level system information.
experimental domain SystemInfo

  # Describes a single graphics processor (GPU).
  type GPUDevice extends object
    properties
      # PCI ID of the GPU vendor, if available; 0 otherwise.
      number vendorId
      # PCI ID of the GPU device, if available; 0 otherwise.
      number deviceId
      # Sub sys ID of the GPU, only available on Windows.
      optional number subSysId
      # Revision of the GPU, only available on Windows.
      optional number revision
      # String description of the GPU vendor, if the PCI ID is not available.
      string vendorString
      # String description of the GPU device, if the PCI ID is not available.
      string deviceString
      # String description of the GPU driver vendor.
      string driverVendor
      # String description of the GPU driver version.
      string driverVersion

  # Describes the width and height dimensions of an entity.
  type Size extends object
    properties
      # Width in pixels.
      integer width
      # Height in pixels.
      integer height

  # Describes a supported video decoding profile with its associated minimum and
  # maximum resolutions.
  type VideoDecodeAcceleratorCapability extends object
    properties
      # Video codec profile that is supported, e.g. VP9 Profile 2.
      string profile
      # Maximum video dimensions in pixels supported for this |profile|.
      Size maxResolution
      # Minimum video dimensions in pixels supported for this |profile|.
      Size minResolution

  # Describes a supported video encoding profile with its associated maximum
  # resolution and maximum framerate.
  type VideoEncodeAcceleratorCapability extends object
    properties
      # Video codec profile that is supported, e.g H264 Main.
      string profile
      # Maximum video dimensions in pixels supported for this |profile|.
      Size maxResolution
      # Maximum encoding framerate in frames per second supported for this
      # |profile|, as fraction's numerator and denominator, e.g. 24/1 fps,
      # 24000/1001 fps, etc.
      integer maxFramerateNumerator
      integer maxFramerateDenominator

  # YUV subsampling type of the pixels of a given image.
  type SubsamplingFormat extends string
    enum
      yuv420
      yuv422
      yuv444

  # Image format of a given image.
  type ImageType extends string
    enum
      jpeg
      webp
      unknown

  # Describes a supported image decoding profile with its associated minimum and
  # maximum resolutions and subsampling.
  type ImageDecodeAcceleratorCapability extends object
    properties
      # Image coded, e.g. Jpeg.
      ImageType imageType
      # Maximum supported dimensions of the image in pixels.
      Size maxDimensions
      # Minimum supported dimensions of the image in pixels.
      Size minDimensions
      # Optional array of supported subsampling formats, e.g. 4:2:0, if known.
      array of SubsamplingFormat subsamplings

  # Provides information about the GPU(s) on the system.
  type GPUInfo extends object
    properties
      # The graphics devices on the system. Element 0 is the primary GPU.
      array of GPUDevice devices
      # An optional dictionary of additional GPU related attributes.
      optional object auxAttributes
      # An optional dictionary of graphics features and their status.
      optional object featureStatus
      # An optional array of GPU driver bug workarounds.
      array of string driverBugWorkarounds
      # Supported accelerated video decoding capabilities.
      array of VideoDecodeAcceleratorCapability videoDecoding
      # Supported accelerated video encoding capabilities.
      array of VideoEncodeAcceleratorCapability videoEncoding
      # Supported accelerated image decoding capabilities.
      array of ImageDecodeAcceleratorCapability imageDecoding

  # Represents process info.
  type ProcessInfo extends object
    properties
      # Specifies process type.
      string type
      # Specifies process id.
      integer id
      # Specifies cumulative CPU usage in seconds across all threads of the
      # process since the process start.
      number cpuTime

  # Returns information about the system.
  command getInfo
    returns
      # Information about the GPUs on the system.
      GPUInfo gpu
      # A platform-dependent description of the model of the machine. On Mac OS, this is, for
      # example, 'MacBookPro'. Will be the empty string if not supported.
      string modelName
      # A platform-dependent description of the version of the machine. On Mac OS, this is, for
      # example, '10.1'. Will be the empty string if not supported.
      string modelVersion
      # The command line string used to launch the browser. Will be the empty string if not
      # supported.
      string commandLine

  # Returns information about all running processes.
  command getProcessInfo
    returns
      # An array of process info blocks.
      array of ProcessInfo processInfo

# Supports additional targets discovery and allows to attach to them.
domain Target

  type TargetID extends string

  # Unique identifier of attached debugging session.
  type SessionID extends string

  type TargetInfo extends object
    properties
      TargetID targetId
      string type
      string title
      string url
      # Whether the target has an attached client.
      boolean attached
      # Opener target Id
      optional TargetID openerId
      experimental optional Browser.BrowserContextID browserContextId

  experimental type RemoteLocation extends object
    properties
      string host
      integer port

  # Activates (focuses) the target.
  command activateTarget
    parameters
      TargetID targetId

  # Attaches to the target with given id.
  command attachToTarget
    parameters
      TargetID targetId
      # Enables "flat" access to the session via specifying sessionId attribute in the commands.
      # We plan to make this the default, deprecate non-flattened mode,
      # and eventually retire it. See crbug.com/991325.
      optional boolean flatten
    returns
      # Id assigned to the session.
      SessionID sessionId

  # Attaches to the browser target, only uses flat sessionId mode.
  experimental command attachToBrowserTarget
    returns
      # Id assigned to the session.
      SessionID sessionId

  # Closes the target. If the target is a page that gets closed too.
  command closeTarget
    parameters
      TargetID targetId
    returns
      boolean success

  # Inject object to the target's main frame that provides a communication
  # channel with browser target.
  #
  # Injected object will be available as `window[bindingName]`.
  #
  # The object has the follwing API:
  # - `binding.send(json)` - a method to send messages over the remote debugging protocol
  # - `binding.onmessage = json => handleMessage(json)` - a callback that will be called for the protocol notifications and command responses.
  experimental command exposeDevToolsProtocol
    parameters
      TargetID targetId
      # Binding name, 'cdp' if not specified.
      optional string bindingName

  # Creates a new empty BrowserContext. Similar to an incognito profile but you can have more than
  # one.
  experimental command createBrowserContext
    returns
      # The id of the context created.
      Browser.BrowserContextID browserContextId

  # Returns all browser contexts created with `Target.createBrowserContext` method.
  experimental command getBrowserContexts
    returns
      # An array of browser context ids.
      array of Browser.BrowserContextID browserContextIds

  # Creates a new page.
  command createTarget
    parameters
      # The initial URL the page will be navigated to.
      string url
      # Frame width in DIP (headless chrome only).
      optional integer width
      # Frame height in DIP (headless chrome only).
      optional integer height
      # The browser context to create the page in.
      optional Browser.BrowserContextID browserContextId
      # Whether BeginFrames for this target will be controlled via DevTools (headless chrome only,
      # not supported on MacOS yet, false by default).
      experimental optional boolean enableBeginFrameControl
      # Whether to create a new Window or Tab (chrome-only, false by default).
      optional boolean newWindow
      # Whether to create the target in background or foreground (chrome-only,
      # false by default).
      optional boolean background
    returns
      # The id of the page opened.
      TargetID targetId

  # Detaches session with given id.
  command detachFromTarget
    parameters
      # Session to detach.
      optional SessionID sessionId
      # Deprecated.
      deprecated optional TargetID targetId

  # Deletes a BrowserContext. All the belonging pages will be closed without calling their
  # beforeunload hooks.
  experimental command disposeBrowserContext
    parameters
      Browser.BrowserContextID browserContextId

  # Returns information about a target.
  experimental command getTargetInfo
    parameters
      optional TargetID targetId
    returns
      TargetInfo targetInfo

  # Retrieves a list of available targets.
  command getTargets
    returns
      # The list of targets.
      array of TargetInfo targetInfos

  # Sends protocol message over session with given id.
  # Consider using flat mode instead; see commands attachToTarget, setAutoAttach,
  # and crbug.com/991325.
  deprecated command sendMessageToTarget
    parameters
      string message
      # Identifier of the session.
      optional SessionID sessionId
      # Deprecated.
      deprecated optional TargetID targetId

  # Controls whether to automatically attach to new targets which are considered to be related to
  # this one. When turned on, attaches to all existing related targets as well. When turned off,
  # automatically detaches from all currently attached targets.
  experimental command setAutoAttach
    parameters
      # Whether to auto-attach to related targets.
      boolean autoAttach
      # Whether to pause new targets when attaching to them. Use `Runtime.runIfWaitingForDebugger`
      # to run paused targets.
      boolean waitForDebuggerOnStart
      # Enables "flat" access to the session via specifying sessionId attribute in the commands.
      # We plan to make this the default, deprecate non-flattened mode,
      # and eventually retire it. See crbug.com/991325.
      optional boolean flatten
      # Auto-attach to the targets created via window.open from current target.
      experimental optional boolean windowOpen

  # Controls whether to discover available targets and notify via
  # `targetCreated/targetInfoChanged/targetDestroyed` events.
  command setDiscoverTargets
    parameters
      # Whether to discover available targets.
      boolean discover

  # Enables target discovery for the specified locations, when `setDiscoverTargets` was set to
  # `true`.
  experimental command setRemoteLocations
    parameters
      # List of remote locations.
      array of RemoteLocation locations

  # Issued when attached to target because of auto-attach or `attachToTarget` command.
  experimental event attachedToTarget
    parameters
      # Identifier assigned to the session used to send/receive messages.
      SessionID sessionId
      TargetInfo targetInfo
      boolean waitingForDebugger

  # Issued when detached from target for any reason (including `detachFromTarget` command). Can be
  # issued multiple times per target if multiple sessions have been attached to it.
  experimental event detachedFromTarget
    parameters
      # Detached session identifier.
      SessionID sessionId
      # Deprecated.
      deprecated optional TargetID targetId

  # Notifies about a new protocol message received from the session (as reported in
  # `attachedToTarget` event).
  event receivedMessageFromTarget
    parameters
      # Identifier of a session which sends a message.
      SessionID sessionId
      string message
      # Deprecated.
      deprecated optional TargetID targetId

  # Issued when a possible inspection target is created.
  event targetCreated
    parameters
      TargetInfo targetInfo

  # Issued when a target is destroyed.
  event targetDestroyed
    parameters
      TargetID targetId

  # Issued when a target has crashed.
  event targetCrashed
    parameters
      TargetID targetId
      # Termination status type.
      string status
      # Termination error code.
      integer errorCode

  # Issued when some information about a target has changed. This only happens between
  # `targetCreated` and `targetDestroyed`.
  event targetInfoChanged
    parameters
      TargetInfo targetInfo

# The Tethering domain defines methods and events for browser port binding.
experimental domain Tethering

  # Request browser port binding.
  command bind
    parameters
      # Port number to bind.
      integer port

  # Request browser port unbinding.
  command unbind
    parameters
      # Port number to unbind.
      integer port

  # Informs that port was successfully bound and got a specified connection id.
  event accepted
    parameters
      # Port number that was successfully bound.
      integer port
      # Connection id to be used.
      string connectionId

experimental domain Tracing
  depends on IO

  # Configuration for memory dump. Used only when "memory-infra" category is enabled.
  type MemoryDumpConfig extends object

  type TraceConfig extends object
    properties
      # Controls how the trace buffer stores data.
      optional enum recordMode
        recordUntilFull
        recordContinuously
        recordAsMuchAsPossible
        echoToConsole
      # Turns on JavaScript stack sampling.
      optional boolean enableSampling
      # Turns on system tracing.
      optional boolean enableSystrace
      # Turns on argument filter.
      optional boolean enableArgumentFilter
      # Included category filters.
      optional array of string includedCategories
      # Excluded category filters.
      optional array of string excludedCategories
      # Configuration to synthesize the delays in tracing.
      optional array of string syntheticDelays
      # Configuration for memory dump triggers. Used only when "memory-infra" category is enabled.
      optional MemoryDumpConfig memoryDumpConfig

  # Data format of a trace. Can be either the legacy JSON format or the
  # protocol buffer format. Note that the JSON format will be deprecated soon.
  type StreamFormat extends string
    enum
      json
      proto

  # Compression type to use for traces returned via streams.
  type StreamCompression extends string
    enum
      none
      gzip

  # Stop trace events collection.
  command end

  # Gets supported tracing categories.
  command getCategories
    returns
      # A list of supported tracing categories.
      array of string categories

  # Record a clock sync marker in the trace.
  command recordClockSyncMarker
    parameters
      # The ID of this clock sync marker
      string syncId

  # Request a global memory dump.
  command requestMemoryDump
    parameters
      # Enables more deterministic results by forcing garbage collection
      optional boolean deterministic
    returns
      # GUID of the resulting global memory dump.
      string dumpGuid
      # True iff the global memory dump succeeded.
      boolean success

  # Start trace events collection.
  command start
    parameters
      # Category/tag filter
      deprecated optional string categories
      # Tracing options
      deprecated optional string options
      # If set, the agent will issue bufferUsage events at this interval, specified in milliseconds
      optional number bufferUsageReportingInterval
      # Whether to report trace events as series of dataCollected events or to save trace to a
      # stream (defaults to `ReportEvents`).
      optional enum transferMode
        ReportEvents
        ReturnAsStream
      # Trace data format to use. This only applies when using `ReturnAsStream`
      # transfer mode (defaults to `json`).
      optional StreamFormat streamFormat
      # Compression format to use. This only applies when using `ReturnAsStream`
      # transfer mode (defaults to `none`)
      optional StreamCompression streamCompression
      optional TraceConfig traceConfig

  event bufferUsage
    parameters
      # A number in range [0..1] that indicates the used size of event buffer as a fraction of its
      # total size.
      optional number percentFull
      # An approximate number of events in the trace log.
      optional number eventCount
      # A number in range [0..1] that indicates the used size of event buffer as a fraction of its
      # total size.
      optional number value

  # Contains an bucket of collected trace events. When tracing is stopped collected events will be
  # send as a sequence of dataCollected events followed by tracingComplete event.
  event dataCollected
    parameters
      array of object value

  # Signals that tracing is stopped and there is no trace buffers pending flush, all data were
  # delivered via dataCollected events.
  event tracingComplete
    parameters
      # Indicates whether some trace data is known to have been lost, e.g. because the trace ring
      # buffer wrapped around.
      boolean dataLossOccurred
      # A handle of the stream that holds resulting trace data.
      optional IO.StreamHandle stream
      # Trace data format of returned stream.
      optional StreamFormat traceFormat
      # Compression format of returned stream.
      optional StreamCompression streamCompression

# A domain for letting clients substitute browser's network layer with client code.
experimental domain Fetch
  depends on Network
  depends on IO
  depends on Page

  # Unique request identifier.
  type RequestId extends string

  # Stages of the request to handle. Request will intercept before the request is
  # sent. Response will intercept after the response is received (but before response
  # body is received.
  experimental type RequestStage extends string
    enum
      Request
      Response

  experimental type RequestPattern extends object
    properties
      # Wildcards ('*' -> zero or more, '?' -> exactly one) are allowed. Escape character is
      # backslash. Omitting is equivalent to "*".
      optional string urlPattern
      # If set, only requests for matching resource types will be intercepted.
      optional Network.ResourceType resourceType
      # Stage at wich to begin intercepting requests. Default is Request.
      optional RequestStage requestStage

  # Response HTTP header entry
  type HeaderEntry extends object
    properties
      string name
      string value

  # Authorization challenge for HTTP status code 401 or 407.
  experimental type AuthChallenge extends object
    properties
      # Source of the authentication challenge.
      optional enum source
        Server
        Proxy
      # Origin of the challenger.
      string origin
      # The authentication scheme used, such as basic or digest
      string scheme
      # The realm of the challenge. May be empty.
      string realm

  # Response to an AuthChallenge.
  experimental type AuthChallengeResponse extends object
    properties
      # The decision on what to do in response to the authorization challenge.  Default means
      # deferring to the default behavior of the net stack, which will likely either the Cancel
      # authentication or display a popup dialog box.
      enum response
        Default
        CancelAuth
        ProvideCredentials
      # The username to provide, possibly empty. Should only be set if response is
      # ProvideCredentials.
      optional string username
      # The password to provide, possibly empty. Should only be set if response is
      # ProvideCredentials.
      optional string password

  # Disables the fetch domain.
  command disable

  # Enables issuing of requestPaused events. A request will be paused until client
  # calls one of failRequest, fulfillRequest or continueRequest/continueWithAuth.
  command enable
    parameters
      # If specified, only requests matching any of these patterns will produce
      # fetchRequested event and will be paused until clients response. If not set,
      # all requests will be affected.
      optional array of RequestPattern patterns
      # If true, authRequired events will be issued and requests will be paused
      # expecting a call to continueWithAuth.
      optional boolean handleAuthRequests

  # Causes the request to fail with specified reason.
  command failRequest
    parameters
      # An id the client received in requestPaused event.
      RequestId requestId
      # Causes the request to fail with the given reason.
      Network.ErrorReason errorReason

  # Provides response to the request.
  command fulfillRequest
    parameters
      # An id the client received in requestPaused event.
      RequestId requestId
      # An HTTP response code.
      integer responseCode
      # Response headers.
      optional array of HeaderEntry responseHeaders
      # Alternative way of specifying response headers as a \0-separated
      # series of name: value pairs. Prefer the above method unless you
      # need to represent some non-UTF8 values that can't be transmitted
      # over the protocol as text.
      optional binary binaryResponseHeaders
      # A response body.
      optional binary body
      # A textual representation of responseCode.
      # If absent, a standard phrase matching responseCode is used.
      optional string responsePhrase

  # Continues the request, optionally modifying some of its parameters.
  command continueRequest
    parameters
      # An id the client received in requestPaused event.
      RequestId requestId
      # If set, the request url will be modified in a way that's not observable by page.
      optional string url
      # If set, the request method is overridden.
      optional string method
      # If set, overrides the post data in the request.
      optional string postData
      # If set, overrides the request headrts.
      optional array of HeaderEntry headers

  # Continues a request supplying authChallengeResponse following authRequired event.
  command continueWithAuth
    parameters
      # An id the client received in authRequired event.
      RequestId requestId
      # Response to  with an authChallenge.
      AuthChallengeResponse authChallengeResponse

  # Causes the body of the response to be received from the server and
  # returned as a single string. May only be issued for a request that
  # is paused in the Response stage and is mutually exclusive with
  # takeResponseBodyForInterceptionAsStream. Calling other methods that
  # affect the request or disabling fetch domain before body is received
  # results in an undefined behavior.
  command getResponseBody
    parameters
      # Identifier for the intercepted request to get body for.
      RequestId requestId
    returns
      # Response body.
      string body
      # True, if content was sent as base64.
      boolean base64Encoded

  # Returns a handle to the stream representing the response body.
  # The request must be paused in the HeadersReceived stage.
  # Note that after this command the request can't be continued
  # as is -- client either needs to cancel it or to provide the
  # response body.
  # The stream only supports sequential read, IO.read will fail if the position
  # is specified.
  # This method is mutually exclusive with getResponseBody.
  # Calling other methods that affect the request or disabling fetch
  # domain before body is received results in an undefined behavior.
  command takeResponseBodyAsStream
    parameters
      RequestId requestId
    returns
      IO.StreamHandle stream

  # Issued when the domain is enabled and the request URL matches the
  # specified filter. The request is paused until the client responds
  # with one of continueRequest, failRequest or fulfillRequest.
  # The stage of the request can be determined by presence of responseErrorReason
  # and responseStatusCode -- the request is at the response stage if either
  # of these fields is present and in the request stage otherwise.
  event requestPaused
    parameters
      # Each request the page makes will have a unique id.
      RequestId requestId
      # The details of the request.
      Network.Request request
      # The id of the frame that initiated the request.
      Page.FrameId frameId
      # How the requested resource will be used.
      Network.ResourceType resourceType
      # Response error if intercepted at response stage.
      optional Network.ErrorReason responseErrorReason
      # Response code if intercepted at response stage.
      optional integer responseStatusCode
      # Response headers if intercepted at the response stage.
      optional array of HeaderEntry responseHeaders
      # If the intercepted request had a corresponding Network.requestWillBeSent event fired for it,
      # then this networkId will be the same as the requestId present in the requestWillBeSent event.
      optional RequestId networkId

  # Issued when the domain is enabled with handleAuthRequests set to true.
  # The request is paused until client responds with continueWithAuth.
  event authRequired
    parameters
      # Each request the page makes will have a unique id.
      RequestId requestId
      # The details of the request.
      Network.Request request
      # The id of the frame that initiated the request.
      Page.FrameId frameId
      # How the requested resource will be used.
      Network.ResourceType resourceType
      # Details of the Authorization Challenge encountered.
      # If this is set, client should respond with continueRequest that
      # contains AuthChallengeResponse.
      AuthChallenge authChallenge

# This domain allows inspection of Web Audio API.
# https://webaudio.github.io/web-audio-api/
experimental domain WebAudio

  # An unique ID for a graph object (AudioContext, AudioNode, AudioParam) in Web Audio API
  type GraphObjectId extends string

  # Enum of BaseAudioContext types
  type ContextType extends string
    enum
      realtime
      offline

  # Enum of AudioContextState from the spec
  type ContextState extends string
    enum
      suspended
      running
      closed

  # Enum of AudioNode types
  type NodeType extends string

  # Enum of AudioNode::ChannelCountMode from the spec
  type ChannelCountMode extends string
    enum
      clamped-max
      explicit
      max

  # Enum of AudioNode::ChannelInterpretation from the spec
  type ChannelInterpretation extends string
    enum
      discrete
      speakers

  # Enum of AudioParam types
  type ParamType extends string

  # Enum of AudioParam::AutomationRate from the spec
  type AutomationRate extends string
    enum
      a-rate
      k-rate

  # Fields in AudioContext that change in real-time.
  type ContextRealtimeData extends object
    properties
      # The current context time in second in BaseAudioContext.
      number currentTime
      # The time spent on rendering graph divided by render qunatum duration,
      # and multiplied by 100. 100 means the audio renderer reached the full
      # capacity and glitch may occur.
      number renderCapacity
      # A running mean of callback interval.
      number callbackIntervalMean
      # A running variance of callback interval.
      number callbackIntervalVariance

  # Protocol object for BaseAudioContext
  type BaseAudioContext extends object
    properties
      GraphObjectId contextId
      ContextType contextType
      ContextState contextState
      optional ContextRealtimeData realtimeData
      # Platform-dependent callback buffer size.
      number callbackBufferSize
      # Number of output channels supported by audio hardware in use.
      number maxOutputChannelCount
      # Context sample rate.
      number sampleRate

# Protocol object for AudioListner
  type AudioListener extends object
    properties
      GraphObjectId listenerId
      GraphObjectId contextId

  # Protocol object for AudioNode
  type AudioNode extends object
    properties
      GraphObjectId nodeId
      GraphObjectId contextId
      NodeType nodeType
      number numberOfInputs
      number numberOfOutputs
      number channelCount
      ChannelCountMode channelCountMode
      ChannelInterpretation channelInterpretation

  # Protocol object for AudioParam
  type AudioParam extends object
    properties
      GraphObjectId paramId
      GraphObjectId nodeId
      GraphObjectId contextId
      ParamType paramType
      AutomationRate rate
      number defaultValue
      number minValue
      number maxValue

  # Enables the WebAudio domain and starts sending context lifetime events.
  command enable

  # Disables the WebAudio domain.
  command disable

  # Fetch the realtime data from the registered contexts.
  command getRealtimeData
    parameters
      GraphObjectId contextId
    returns
      ContextRealtimeData realtimeData

  # Notifies that a new BaseAudioContext has been created.
  event contextCreated
    parameters
      BaseAudioContext context

  # Notifies that an existing BaseAudioContext will be destroyed.
  event contextWillBeDestroyed
    parameters
      GraphObjectId contextId

  # Notifies that existing BaseAudioContext has changed some properties (id stays the same)..
  event contextChanged
    parameters
      BaseAudioContext context

# Notifies that the construction of an AudioListener has finished.
  event audioListenerCreated
    parameters
      AudioListener listener

  # Notifies that a new AudioListener has been created.
  event audioListenerWillBeDestroyed
    parameters
      GraphObjectId contextId
      GraphObjectId listenerId

  # Notifies that a new AudioNode has been created.
  event audioNodeCreated
    parameters
      AudioNode node

  # Notifies that an existing AudioNode has been destroyed.
  event audioNodeWillBeDestroyed
    parameters
      GraphObjectId contextId
      GraphObjectId nodeId

  # Notifies that a new AudioParam has been created.
  event audioParamCreated
    parameters
      AudioParam param

  # Notifies that an existing AudioParam has been destroyed.
  event audioParamWillBeDestroyed
    parameters
      GraphObjectId contextId
      GraphObjectId nodeId
      GraphObjectId paramId

  # Notifies that two AudioNodes are connected.
  event nodesConnected
    parameters
      GraphObjectId contextId
      GraphObjectId sourceId
      GraphObjectId destinationId
      optional number sourceOutputIndex
      optional number destinationInputIndex

  # Notifies that AudioNodes are disconnected. The destination can be null, and it means all the outgoing connections from the source are disconnected.
  event nodesDisconnected
    parameters
      GraphObjectId contextId
      GraphObjectId sourceId
      GraphObjectId destinationId
      optional number sourceOutputIndex
      optional number destinationInputIndex

  # Notifies that an AudioNode is connected to an AudioParam.
  event nodeParamConnected
    parameters
      GraphObjectId contextId
      GraphObjectId sourceId
      GraphObjectId destinationId
      optional number sourceOutputIndex

  # Notifies that an AudioNode is disconnected to an AudioParam.
  event nodeParamDisconnected
    parameters
      GraphObjectId contextId
      GraphObjectId sourceId
      GraphObjectId destinationId
      optional number sourceOutputIndex

# This domain allows configuring virtual authenticators to test the WebAuthn
# API.
experimental domain WebAuthn
  type AuthenticatorId extends string

  type AuthenticatorProtocol extends string
    enum
      # Universal 2nd Factor.
      u2f
      # Client To Authenticator Protocol 2.
      ctap2

  type AuthenticatorTransport extends string
    enum
      # Cross-Platform authenticator attachments:
      usb
      nfc
      ble
      cable
      # Platform authenticator attachment:
      internal

  type VirtualAuthenticatorOptions extends object
    properties
      AuthenticatorProtocol protocol
      AuthenticatorTransport transport
      # Defaults to false.
      optional boolean hasResidentKey
      # Defaults to false.
      optional boolean hasUserVerification
      # If set to true, tests of user presence will succeed immediately.
      # Otherwise, they will not be resolved. Defaults to true.
      optional boolean automaticPresenceSimulation
      # Sets whether User Verification succeeds or fails for an authenticator.
      # Defaults to false.
      optional boolean isUserVerified

  type Credential extends object
    properties
      binary credentialId
      boolean isResidentCredential
      # Relying Party ID the credential is scoped to. Must be set when adding a
      # credential.
      optional string rpId
      # The ECDSA P-256 private key in PKCS#8 format.
      binary privateKey
      # An opaque byte sequence with a maximum size of 64 bytes mapping the
      # credential to a specific user.
      optional binary userHandle
      # Signature counter. This is incremented by one for each successful
      # assertion.
      # See https://w3c.github.io/webauthn/#signature-counter
      integer signCount

  # Enable the WebAuthn domain and start intercepting credential storage and
  # retrieval with a virtual authenticator.
  command enable

  # Disable the WebAuthn domain.
  command disable

  # Creates and adds a virtual authenticator.
  command addVirtualAuthenticator
    parameters
      VirtualAuthenticatorOptions options
    returns
      AuthenticatorId authenticatorId

  # Removes the given authenticator.
  command removeVirtualAuthenticator
    parameters
      AuthenticatorId authenticatorId

  # Adds the credential to the specified authenticator.
  command addCredential
    parameters
      AuthenticatorId authenticatorId
      Credential credential

  # Returns a single credential stored in the given virtual authenticator that
  # matches the credential ID.
  command getCredential
    parameters
      AuthenticatorId authenticatorId
      binary credentialId
    returns
      Credential credential

  # Returns all the credentials stored in the given virtual authenticator.
  command getCredentials
    parameters
      AuthenticatorId authenticatorId
    returns
      array of Credential credentials

  # Removes a credential from the authenticator.
  command removeCredential
    parameters
      AuthenticatorId authenticatorId
      binary credentialId

  # Clears all the credentials from the specified device.
  command clearCredentials
    parameters
      AuthenticatorId authenticatorId

  # Sets whether User Verification succeeds or fails for an authenticator.
  # The default is true.
  command setUserVerified
    parameters
      AuthenticatorId authenticatorId
      boolean isUserVerified

# This domain allows detailed inspection of media elements
experimental domain Media

  # Players will get an ID that is unique within the agent context.
  type PlayerId extends string

  type Timestamp extends number

  # Player Property type
  type PlayerProperty extends object
    properties
      string name
      optional string value

  # Break out events into different types
  type PlayerEventType extends string
    enum
      playbackEvent
      systemEvent
      messageEvent

  type PlayerEvent extends object
    properties
      PlayerEventType type
      # Events are timestamped relative to the start of the player creation
      # not relative to the start of playback.
      Timestamp timestamp
      string name
      string value

  # This can be called multiple times, and can be used to set / override /
  # remove player properties. A null propValue indicates removal.
  event playerPropertiesChanged
    parameters
      PlayerId playerId
      array of PlayerProperty properties

  # Send events as a list, allowing them to be batched on the browser for less
  # congestion. If batched, events must ALWAYS be in chronological order.
  event playerEventsAdded
    parameters
      PlayerId playerId
      array of PlayerEvent events

  # Called whenever a player is created, or when a new agent joins and recieves
  # a list of active players. If an agent is restored, it will recieve the full
  # list of player ids and all events again.
  event playersCreated
    parameters
      array of PlayerId players

  # Enables the Media domain
  command enable

  # Disables the Media domain.
  command disable
