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

version
  major 1
  minor 3

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
      hidden
      hiddenRoot
      invalid
      keyshortcuts
      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

  # Fetches the accessibility node and partial accessibility tree for this DOM node, if it exists.
  experimental command getPartialAXTree
    parameters
      # ID of node to get the partial accessibility tree for.
      DOM.NodeId nodeId
      # 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

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 string body
      # Size before re-encoding.
      integer originalSize
      # Size after re-encoding.
      integer encodedSize

# The Browser domain defines methods and events for browser managing.
domain Browser

  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

  # Close browser gracefully.
  command close

  # 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

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

# 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

  # 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

  # 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
      # The computed font size for the document body, as a computed CSS value string (e.g. '16px').
      optional string computedBodyFontSize

  # 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 and the URL 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

  # The list of rules with an indication of whether these were used
  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 gets loaded.
  event fontsUpdated

  # 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

  # 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
      # 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.
      string 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 enty.
      CacheId cacheId
      # URL spec of the request.
      string requestURL
    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.
      integer skipCount
      # Number of records to fetch.
      integer pageSize
    returns
      # Array of object store data entries.
      array of DataEntry cacheDataEntries
      # If true, there are more entries to fetch in the given range.
      boolean hasMore

# 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 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.
  experimental 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
    returns
      # Id of the node at given coordinates.
      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
    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

  # 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

  # 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

  # 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 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
      # Index of the imported document's node of a link element in the `domNodes` array returned by
      # `getSnapshot`, if any.
      optional integer importedDocumentIndex
      # Index of the content node of a template element in the `domNodes` array returned by
      # `getSnapshot`.
      optional integer templateContentIndex
      # Type of a pseudo element node.
      optional DOM.PseudoType 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 boolean isClickable

  # 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 absolute position bounding box.
      DOM.Rect boundingBox
      # The starting index in characters, for this post layout textbox substring.
      integer startCharacterIndex
      # The number of characters in this post layout textbox substring.
      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 absolute position bounding box.
      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

  # 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

  # 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 getSnapshot
    parameters
      # Whitelist of computed styles to return.
      array of string computedStyleWhitelist
    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

# 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

  # 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 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 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 for CSS media queries.
  command setEmulatedMedia
    parameters
      # Media type to emulate. Empty string disables the override.
      string media

  # 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 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
    returns
      # Absolute timestamp at which virtual time was first enabled (milliseconds since epoch).
      Runtime.Timestamp virtualTimeBase

  # 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 has advanced.
  experimental event virtualTimeAdvanced
    parameters
      # The amount of virtual time that has elapsed in milliseconds since virtual time was first
      # enabled.
      number virtualTimeElapsed

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

  # Notification sent after the virtual time has paused.
  experimental event virtualTimePaused
    parameters
      # The amount of virtual time that has elapsed in milliseconds since virtual time was first
      # enabled.
      number virtualTimeElapsed

# 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.
  command beginFrame
    parameters
      # Timestamp of this BeginFrame (milliseconds since epoch). If not set, the current time will
      # be used.
      optional Runtime.Timestamp frameTime
      # Deadline of this BeginFrame (milliseconds since epoch). If not set, the deadline will be
      # calculated from the frameTime and interval.
      optional Runtime.Timestamp deadline
      # 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
      # If set, a screenshot of the frame will be captured and returned in the response. Otherwise,
      # no screenshot will be captured.
      optional ScreenshotParams screenshot
    returns
      # Whether the BeginFrame resulted in damage and, thus, a new frame was committed to the
      # display.
      boolean hasDamage
      # Whether the main frame submitted a new display frame in response to this BeginFrame.
      boolean mainFrameContentUpdated
      # Base64-encoded image data of the screenshot, if one was requested and successfully taken.
      optional string screenshotData

  # Disables headless events for the target.
  command disable

  # Enables headless events for the target.
  command enable

  # Issued when the main frame has first submitted a frame to the browser. May only be fired while a
  # BeginFrame is in flight. Before this event, screenshotting requests may fail.
  event mainFrameReadyForScreenshots

  # Issued when the target starts or stops needing BeginFrames.
  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).
      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.
      integer 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

  # 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

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

  # 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
      # Time at which the event occurred.
      TimeSinceEpoch timestamp
      # Mouse button.
      enum button
        none
        left
        middle
        right
      # 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

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

  # 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

# 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

  # 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

  # 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

  # 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.
      string url
      # HTTP request method.
      string method
      # HTTP request headers.
      Headers headers
      # HTTP POST request data.
      optional string postData
      # 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

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

  # 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
      # 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 frame data.
  type WebSocketFrame extends object
    properties
      # WebSocket frame opcode.
      number opcode
      # WebSocke frame mask.
      boolean mask
      # WebSocke frame payload 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.
      Page.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
        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).
      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

  # 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 Page.ResourceType resourceType
      # Stage at wich to begin intercepting requests. Default is Request.
      optional InterceptionStage interceptionStage

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

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

  # 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 a the provided patterns and optionally resource types.
  experimental 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
    parameters
      # User agent to use.
      string userAgent

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

  # Details of an intercepted HTTP request, which must be either allowed, blocked, modified or
  # mocked.
  experimental 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.
      Page.ResourceType resourceType
      # Whether this is a navigation request, which can abort the navigation completely.
      boolean isNavigationRequest
      # 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

  # 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 Page.ResourceType type
      # Frame identifier.
      optional Page.FrameId frameId

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

  # 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.
      Page.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 frame error occurs.
  event webSocketFrameError
    parameters
      # Request identifier.
      RequestId requestId
      # Timestamp.
      MonotonicTime timestamp
      # WebSocket frame error message.
      string errorMessage

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

  # Fired when WebSocket frame 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

# 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 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
      optional boolean displayAsMaterial
      # 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
      # Selectors to highlight relevant nodes.
      optional string selectorList
      # The grid layout color (default: transparent).
      optional DOM.RGBA cssGridColor

  type InspectMode extends string
    enum
      searchForNode
      searchForUAShadowDOM
      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
    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

  # 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

  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 scroll bottleneck rects
  command setShowScrollBottleneckRects
    parameters
      # True for showing scroll bottleneck rects
      boolean show

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

  command setSuspended
    parameters
      # Whether overlay should be suspended and not consume any resources until resumed.
      boolean suspended

  # 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 CSS.
      Page.Viewport viewport

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

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

  # Unique frame identifier.
  type FrameId extends string

  # Information about the Frame on the page.
  type Frame extends object
    properties
      # Frame unique identifier.
      string 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.
      string url
      # 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.
      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.
      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
      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

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

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

  # 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

  # 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
    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
    returns
      # Base64-encoded pdf data.
      string data

  # 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

  experimental command requestAppBanner

  # 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

  # Controls whether browser will open a new inspector window for connected pages.
  experimental command setAutoAttachToCreatedPages
    parameters
      # If true, browser will open a new inspector window for every page created from this one.
      boolean autoAttach

  # 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

  # 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

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

  event domContentEventFired
    parameters
      Network.MonotonicTime timestamp

  # 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.
  experimental 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 frame schedules a potential navigation.
  experimental 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 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
      # 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

  # Compressed image data requested by the `startScreencast`.
  experimental event screencastFrame
    parameters
      # Base64-encoded compressed image.
      string 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

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

  # 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

  # 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

  # Information about insecure content on the page.
  type InsecureContentStatus extends object
    properties
      # True if the page was loaded over HTTPS and ran mixed (HTTP) content such as scripts.
      boolean ranMixedContent
      # True if the page was loaded over HTTPS and displayed mixed (HTTP) content such as images.
      boolean displayedMixedContent
      # True if the page was loaded over HTTPS and contained a form targeting an insecure url.
      boolean containedMixedForm
      # True if the page was loaded over HTTPS without certificate errors, and ran content such as
      # scripts that were loaded with certificate errors.
      boolean ranContentWithCertErrors
      # True if the page was loaded over HTTPS without certificate errors, and displayed content
      # such as images that were loaded with certificate errors.
      boolean displayedContentWithCertErrors
      # Security state representing a page that ran insecure content.
      SecurityState ranInsecureContentStyle
      # Security state representing a page that displayed insecure content.
      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.
  event securityStateChanged
    parameters
      # Security state.
      SecurityState securityState
      # True if the page was loaded over cryptographic transport such as HTTPS.
      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.
      InsecureContentStatus insecureContentStatus
      # Overrides user-visible description of the state.
      optional string summary

experimental domain ServiceWorker

  # ServiceWorker registration.
  type ServiceWorkerRegistration extends object
    properties
      string 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
      string 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
      string registrationId
      string versionId
      string sourceURL
      integer lineNumber
      integer columnNumber

  command deliverPushMessage
    parameters
      string origin
      string registrationId
      string data

  command disable

  command dispatchSyncEvent
    parameters
      string origin
      string registrationId
      string tag
      boolean lastChance

  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

  # 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 origin names.
      string storageTypes

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

  # 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

  # 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

# 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

  experimental type BrowserContextID 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 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
    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

  # 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.
      BrowserContextID browserContextId

  # 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 (headless chrome only).
      optional 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
    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, will fail of any open page uses it.
  experimental command disposeBrowserContext
    parameters
      BrowserContextID browserContextId
    returns
      boolean success

  # Returns information about a target.
  experimental command getTargetInfo
    parameters
      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.
  command sendMessageToTarget
    parameters
      string message
      # Identifier of the session.
      optional SessionID sessionId
      # Deprecated.
      deprecated optional TargetID targetId

  experimental command setAttachToFrames
    parameters
      # Whether to attach to frames.
      boolean value

  # 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

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

  # 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
    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
      # 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
      # A handle of the stream that holds resulting trace data.
      optional IO.StreamHandle stream
      # Compression format of returned stream.
      optional StreamCompression streamCompression
