Command = { id: js-uint, CommandData, Extensible, } CommandData = ( BrowserCommand // BrowsingContextCommand // InputCommand // NetworkCommand // ScriptCommand // SessionCommand ) EmptyParams = { Extensible } Message = ( CommandResponse / ErrorResponse / Event ) CommandResponse = { type: "success", id: js-uint, result: ResultData, Extensible } ErrorResponse = { type: "error", id: js-uint / null, error: ErrorCode, message: text, ? stacktrace: text, Extensible } ResultData = ( BrowsingContextResult / EmptyResult / NetworkResult / ScriptResult / SessionResult ) EmptyResult = { Extensible } Event = { type: "event", EventData, Extensible } EventData = ( BrowsingContextEvent // LogEvent // NetworkEvent // ScriptEvent ) Extensible = (*text => any) js-int = -9007199254740991..9007199254740991 js-uint = 0..9007199254740991 ErrorCode = "invalid argument" / "invalid session id" / "move target out of bounds" / "no such alert" / "no such element" / "no such frame" / "no such handle" / "no such history entry" / "no such intercept" / "no such node" / "no such request" / "no such script" / "session not created" / "unable to capture screen" / "unable to close browser" / "unknown command" / "unknown error" / "unsupported operation" SessionCommand = ( session.End // session.New // session.Status // session.Subscribe // session.Unsubscribe ) SessionResult = ( session.NewResult / session.StatusResult ) session.CapabilitiesRequest = { ? alwaysMatch: session.CapabilityRequest, ? firstMatch: [*session.CapabilityRequest] } session.CapabilityRequest = { ? acceptInsecureCerts: bool, ? browserName: text, ? browserVersion: text, ? platformName: text, ? proxy: session.ProxyConfiguration, ? webSocketUrl: bool, Extensible }; session.ProxyConfiguration = { session.AutodetectProxyConfiguration // session.DirectProxyConfiguration // session.ManualProxyConfiguration // session.PacProxyConfiguration // session.SystemProxyConfiguration // } session.AutodetectProxyConfiguration = ( ; Indicates that the proxy to use should be detected in an ; implementation-specific way. proxyType: "autodetect" Extensible ) session.DirectProxyConfiguration = ( ; Indicates that the browser should not use a proxy at all. proxyType: "direct" Extensible ) session.ManualProxyConfiguration = ( ; Indicates a manual proxy configuration. proxyType: "manual", ; Defines the proxy host for FTP traffic. ? ftpProxy: text, ; Defines the proxy host for HTTP traffic. ? httpProxy: text, ; Defines the proxy host for encrypted TLS traffic. ? sslProxy: text, ; Defines the proxy host for a SOCKS proxy. ? session.SocksProxyConfiguration ; Lists the address for which the proxy should be bypassed. ? noProxy: [*text], Extensible ) session.SocksProxyConfiguration = ( ; Defines the proxy host for a SOCKS proxy. socksProxy: text, ; Defines the SOCKS proxy version. socksVersion: 0..255, ) session.PacProxyConfiguration = ( ; Indicates that the proxy to use is defined by the proxyAutoconfigUrl. proxyType: "pac", ; Defines the URL for a proxy auto-config file proxyAutoconfigUrl: text, Extensible ) session.SystemProxyConfiguration = ( ; Indicates that the browser should use the various proxies configured ; for the underlying Operating System. proxyType: "system" Extensible ) session.SubscriptionRequest = { events: [*text], ? contexts: [*browsingContext.BrowsingContext], } session.Status = ( method: "session.status", params: EmptyParams, ) session.StatusResult = { ready: bool, message: text, } session.New = ( method: "session.new", params: session.NewParameters ) session.NewParameters = { capabilities: session.CapabilitiesRequest } session.NewResult = { sessionId: text, capabilities: { ; Initially set to false, indicates the session will not implicitly ; trust untrusted or self-signed TLS certificates on navigation. acceptInsecureCerts: bool, ; ASCII Lowercase name of the user agent as a string. browserName: text, ; The user agent version, as a string. browserVersion: text, ; ASCII Lowercase name of the current platform as a string. platformName: text, ; Indicates whether the remote end supports all of the resizing and ; positioning commands. setWindowRect: bool, ; Defined when the request defines a "proxy". ? proxy: session.ProxyConfiguration, ; Defined when the request defined a "webSocketUrl" ? webSocketUrl: bool, Extensible } } session.End = ( method: "session.end", params: EmptyParams ) session.Subscribe = ( method: "session.subscribe", params: session.SubscriptionRequest ) session.Unsubscribe = ( method: "session.unsubscribe", params: session.SubscriptionRequest ) BrowserCommand = ( browser.Close ) browser.Close = ( method: "browser.close", params: EmptyParams, ) BrowsingContextCommand = ( browsingContext.Activate // browsingContext.CaptureScreenshot // browsingContext.Close // browsingContext.Create // browsingContext.GetTree // browsingContext.HandleUserPrompt // browsingContext.LocateNodes // browsingContext.Navigate // browsingContext.Print // browsingContext.Reload // browsingContext.SetViewport // browsingContext.TraverseHistory ) BrowsingContextResult = ( browsingContext.CaptureScreenshotResult / browsingContext.CreateResult / browsingContext.GetTreeResult / browsingContext.LocateNodesResult / browsingContext.NavigateResult / browsingContext.PrintResult / browsingContext.TraverseHistoryResult ) BrowsingContextEvent = ( browsingContext.ContextCreated // browsingContext.ContextDestroyed // browsingContext.DomContentLoaded // browsingContext.DownloadWillBegin // browsingContext.FragmentNavigated // browsingContext.Load // browsingContext.NavigationAborted // browsingContext.NavigationFailed // browsingContext.NavigationStarted // browsingContext.UserPromptClosed // browsingContext.UserPromptOpened ) browsingContext.BrowsingContext = text; browsingContext.InfoList = [*browsingContext.Info] browsingContext.Info = { context: browsingContext.BrowsingContext, url: text, children: browsingContext.InfoList / null ? parent: browsingContext.BrowsingContext / null, } browsingContext.Locator = ( browsingContext.CssLocator / browsingContext.InnerTextLocator / browsingContext.XPathLocator ) browsingContext.CssLocator = { type: "css", value: text } browsingContext.InnerTextLocator = { type: "innerText", value: text, ? ignoreCase: bool ? matchType: "full" / "partial", ? maxDepth: js-uint, } browsingContext.XPathLocator = { type: "xpath", value: text } browsingContext.Navigation = text; browsingContext.NavigationInfo = { context: browsingContext.BrowsingContext, navigation: browsingContext.Navigation / null, timestamp: js-uint, url: text, } browsingContext.ReadinessState = "none" / "interactive" / "complete" browsingContext.Activate = ( method: "browsingContext.activate", params: browsingContext.ActivateParameters ) browsingContext.ActivateParameters = { context: browsingContext.BrowsingContext } browsingContext.CaptureScreenshot = ( method: "browsingContext.captureScreenshot", params: browsingContext.CaptureScreenshotParameters ) browsingContext.CaptureScreenshotParameters = { context: browsingContext.BrowsingContext, ? origin: ("viewport" / "document") .default "viewport", ? format: browsingContext.ImageFormat, ? clip: browsingContext.ClipRectangle, } browsingContext.ImageFormat = { type: text, ? quality: 0.0..1.0, } browsingContext.ClipRectangle = ( browsingContext.BoxClipRectangle / browsingContext.ElementClipRectangle ) browsingContext.ElementClipRectangle = { type: "element", element: script.SharedReference } browsingContext.BoxClipRectangle = { type: "box", x: float, y: float, width: float, height: float } browsingContext.CaptureScreenshotResult = { data: text } browsingContext.Close = ( method: "browsingContext.close", params: browsingContext.CloseParameters ) browsingContext.CloseParameters = { context: browsingContext.BrowsingContext, ? promptUnload: bool .default false } browsingContext.Create = ( method: "browsingContext.create", params: browsingContext.CreateParameters ) browsingContext.CreateType = "tab" / "window" browsingContext.CreateParameters = { type: browsingContext.CreateType, ? referenceContext: browsingContext.BrowsingContext, ? background: bool .default false } browsingContext.CreateResult = { context: browsingContext.BrowsingContext } browsingContext.GetTree = ( method: "browsingContext.getTree", params: browsingContext.GetTreeParameters ) browsingContext.GetTreeParameters = { ? maxDepth: js-uint, ? root: browsingContext.BrowsingContext, } browsingContext.GetTreeResult = { contexts: browsingContext.InfoList } browsingContext.HandleUserPrompt = ( method: "browsingContext.handleUserPrompt", params: browsingContext.HandleUserPromptParameters ) browsingContext.HandleUserPromptParameters = { context: browsingContext.BrowsingContext, ? accept: bool, ? userText: text, } browsingContext.LocateNodes = ( method: "browsingContext.locateNodes", params: browsingContext.LocateNodesParameters ) browsingContext.LocateNodesParameters = { context: browsingContext.BrowsingContext, locator: browsingContext.Locator, ? maxNodeCount: (js-uint .ge 1), ? ownership: script.ResultOwnership, ? sandbox: text, ? serializationOptions: script.SerializationOptions, ? startNodes: [ + script.SharedReference ] } browsingContext.LocateNodesResult = { nodes: [ * script.NodeRemoteValue ] } browsingContext.Navigate = ( method: "browsingContext.navigate", params: browsingContext.NavigateParameters ) browsingContext.NavigateParameters = { context: browsingContext.BrowsingContext, url: text, ? wait: browsingContext.ReadinessState, } browsingContext.NavigateResult = { navigation: browsingContext.Navigation / null, url: text, } browsingContext.Print = ( method: "browsingContext.print", params: browsingContext.PrintParameters ) browsingContext.PrintParameters = { context: browsingContext.BrowsingContext, ? background: bool .default false, ? margin: browsingContext.PrintMarginParameters, ? orientation: ("portrait" / "landscape") .default "portrait", ? page: browsingContext.PrintPageParameters, ? pageRanges: [*(js-uint / text)], ? scale: (0.1..2.0) .default 1.0, ? shrinkToFit: bool .default true, } browsingContext.PrintMarginParameters = { ? bottom: (float .ge 0.0) .default 1.0, ? left: (float .ge 0.0) .default 1.0, ? right: (float .ge 0.0) .default 1.0, ? top: (float .ge 0.0) .default 1.0, } ; Minimum size is 1pt x 1pt. Conversion follows from ; https://www.w3.org/TR/css3-values/#absolute-lengths browsingContext.PrintPageParameters = { ? height: (float .ge 0.0352) .default 27.94, ? width: (float .ge 0.0352) .default 21.59, } browsingContext.PrintResult = { data: text } browsingContext.Reload = ( method: "browsingContext.reload", params: browsingContext.ReloadParameters ) browsingContext.ReloadParameters = { context: browsingContext.BrowsingContext, ? ignoreCache: bool, ? wait: browsingContext.ReadinessState, } browsingContext.SetViewport = ( method: "browsingContext.setViewport", params: browsingContext.SetViewportParameters ) browsingContext.SetViewportParameters = { context: browsingContext.BrowsingContext, ? viewport: browsingContext.Viewport / null, ? devicePixelRatio: (float .gt 0.0) / null, } browsingContext.Viewport = { width: js-uint, height: js-uint, } browsingContext.TraverseHistory = ( method: "browsingContext.traverseHistory", params: browsingContext.TraverseHistoryParameters ) browsingContext.TraverseHistoryParameters = { context: browsingContext.BrowsingContext, delta: js-int, } browsingContext.TraverseHistoryResult = { } browsingContext.ContextCreated = ( method: "browsingContext.contextCreated", params: browsingContext.Info ) browsingContext.ContextDestroyed = ( method: "browsingContext.contextDestroyed", params: browsingContext.Info ) browsingContext.NavigationStarted = ( method: "browsingContext.navigationStarted", params: browsingContext.NavigationInfo ) browsingContext.FragmentNavigated = ( method: "browsingContext.fragmentNavigated", params: browsingContext.NavigationInfo ) browsingContext.DomContentLoaded = ( method: "browsingContext.domContentLoaded", params: browsingContext.NavigationInfo ) browsingContext.Load = ( method: "browsingContext.load", params: browsingContext.NavigationInfo ) browsingContext.DownloadWillBegin = ( method: "browsingContext.downloadWillBegin", params: browsingContext.NavigationInfo ) browsingContext.NavigationAborted = ( method: "browsingContext.navigationAborted", params: browsingContext.NavigationInfo ) browsingContext.NavigationFailed = ( method: "browsingContext.navigationFailed", params: browsingContext.NavigationInfo ) browsingContext.UserPromptClosed = ( method: "browsingContext.userPromptClosed", params: browsingContext.UserPromptClosedParameters ) browsingContext.UserPromptClosedParameters = { context: browsingContext.BrowsingContext, accepted: bool, ? userText: text } browsingContext.UserPromptOpened = ( method: "browsingContext.userPromptOpened", params: browsingContext.UserPromptOpenedParameters ) browsingContext.UserPromptOpenedParameters = { context: browsingContext.BrowsingContext, type: "alert" / "confirm" / "prompt" / "beforeunload", message: text, ? defaultValue: text } NetworkCommand = ( network.AddIntercept // network.ContinueRequest // network.ContinueResponse // network.ContinueWithAuth // network.FailRequest // network.ProvideResponse // network.RemoveIntercept ) NetworkResult = ( network.AddInterceptResult ) NetworkEvent = ( network.AuthRequired // network.BeforeRequestSent // network.FetchError // network.ResponseCompleted // network.ResponseStarted ) network.AuthChallenge = { scheme: text, realm: text, } network.AuthCredentials = { type: "password", username: text, password: text, } network.BaseParameters = ( context: browsingContext.BrowsingContext / null, isBlocked: bool, navigation: browsingContext.Navigation / null, redirectCount: js-uint, request: network.RequestData, timestamp: js-uint, ? intercepts: [+network.Intercept] ) network.BytesValue = network.StringValue / network.Base64Value; network.StringValue = { type: "string", value: text, } network.Base64Value = { type: "base64", value: text, } network.Cookie = { name: text, value: network.BytesValue, domain: text, path: text, size: js-uint, httpOnly: bool, secure: bool, sameSite: "strict" / "lax" / "none", ? expires: js-uint, }; network.CookieHeader = { name: text, value: network.BytesValue, }; network.FetchTimingInfo = { timeOrigin: float, requestTime: float, redirectStart: float, redirectEnd: float, fetchStart: float, dnsStart: float, dnsEnd: float, connectStart: float, connectEnd: float, tlsStart: float, requestStart: float, responseStart: float, responseEnd: float, }; network.Header = { name: text, value: network.BytesValue, } network.Initiator = { type: "parser" / "script" / "preflight" / "other", ? columnNumber: js-uint, ? lineNumber: js-uint, ? stackTrace: script.StackTrace, ? request: network.Request }; network.Intercept = text network.Request = text; network.RequestData = { request: network.Request, url: text, method: text, headers: [*network.Header], cookies: [*network.Cookie], headersSize: js-uint, bodySize: js-uint / null, timings: network.FetchTimingInfo, }; network.ResponseContent = { size: js-uint }; network.ResponseData = { url: text, protocol: text, status: js-uint, statusText: text, fromCache: bool, headers: [*network.Header], mimeType: text, bytesReceived: js-uint, headersSize: js-uint / null, bodySize: js-uint / null, content: network.ResponseContent, ?authChallenge: network.AuthChallenge, }; network.SetCookieHeader = { name: text, value: network.BytesValue, ? domain: text, ? httpOnly: bool, ? expires: text, ? maxAge: js-int, ? path: text, ? sameSite: "strict" / "lax" / "none", ? secure: bool, } network.UrlPattern = ( network.UrlPatternPattern / network.UrlPatternString ) network.UrlPatternPattern = { type: "pattern", ?protocol: text, ?hostname: text, ?port: text, ?pathname: text, ?search: text, } network.UrlPatternString = { type: "string", pattern: text, } network.AddIntercept = ( method: "network.addIntercept", params: network.AddInterceptParameters ) network.AddInterceptParameters = { phases: [+network.InterceptPhase], ? urlPatterns: [*network.UrlPattern], } network.InterceptPhase = "beforeRequestSent" / "responseStarted" / "authRequired" network.AddInterceptResult = { intercept: network.Intercept } network.ContinueRequest = ( method: "network.continueRequest", params: network.ContinueRequestParameters ) network.ContinueRequestParameters = { request: network.Request, ?body: network.BytesValue, ?cookies: [*network.CookieHeader], ?headers: [*network.Header], ?method: text, ?url: text, } network.ContinueResponse = ( method: "network.continueResponse", params: network.ContinueResponseParameters ) network.ContinueResponseParameters = { request: network.Request, ?cookies: [*network.SetCookieHeader] ?credentials: network.AuthCredentials, ?headers: [*network.Header], ?reasonPhrase: text, ?statusCode: js-uint, } network.ContinueWithAuth = ( method: "network.continueWithAuth", params: network.ContinueWithAuthParameters ) network.ContinueWithAuthParameters = { request: network.Request, (network.ContinueWithAuthCredentials // network.ContinueWithAuthNoCredentials) } network.ContinueWithAuthCredentials = ( action: "provideCredentials", credentials: network.AuthCredentials ) network.ContinueWithAuthNoCredentials = ( action: "default" / "cancel" ) network.FailRequest = ( method: "network.failRequest", params: network.FailRequestParameters ) network.FailRequestParameters = { request: network.Request, } network.ProvideResponse = ( method: "network.provideResponse", params: network.ProvideResponseParameters ) network.ProvideResponseParameters = { request: network.Request, ?body: network.BytesValue, ?cookies: [*network.SetCookieHeader], ?headers: [*network.Header], ?reasonPhrase: text, ?statusCode: js-uint, } network.RemoveIntercept = ( method: "network.removeIntercept", params: network.RemoveInterceptParameters ) network.RemoveInterceptParameters = { intercept: network.Intercept } network.AuthRequired = ( method: "network.authRequired", params: network.AuthRequiredParameters ) network.AuthRequiredParameters = { network.BaseParameters, response: network.ResponseData } network.BeforeRequestSent = ( method: "network.beforeRequestSent", params: network.BeforeRequestSentParameters ) network.BeforeRequestSentParameters = { network.BaseParameters, initiator: network.Initiator, } network.FetchError = ( method: "network.fetchError", params: network.FetchErrorParameters ) network.FetchErrorParameters = { network.BaseParameters, errorText: text, } network.ResponseCompleted = ( method: "network.responseCompleted", params: network.ResponseCompletedParameters ) network.ResponseCompletedParameters = { network.BaseParameters, response: network.ResponseData, } network.ResponseStarted = ( method: "network.responseStarted", params: network.ResponseStartedParameters ) network.ResponseStartedParameters = { network.BaseParameters, response: network.ResponseData, } ScriptCommand = ( script.AddPreloadScript // script.CallFunction // script.Disown // script.Evaluate // script.GetRealms // script.RemovePreloadScript ) ScriptResult = ( script.AddPreloadScriptResult / script.EvaluateResult / script.GetRealmsResult ) ScriptEvent = ( script.Message // script.RealmCreated // script.RealmDestroyed ) script.Channel = text; script.ChannelValue = { type: "channel", value: script.ChannelProperties, }; script.ChannelProperties = { channel: script.Channel, ? serializationOptions: script.SerializationOptions, ? ownership: script.ResultOwnership, } script.EvaluateResult = ( script.EvaluateResultSuccess / script.EvaluateResultException ) script.EvaluateResultSuccess = { type: "success", result: script.RemoteValue, realm: script.Realm } script.EvaluateResultException = { type: "exception", exceptionDetails: script.ExceptionDetails realm: script.Realm } script.ExceptionDetails = { columnNumber: js-uint, exception: script.RemoteValue, lineNumber: js-uint, stackTrace: script.StackTrace, text: text, }; script.Handle = text; script.InternalId = text; script.LocalValue = ( script.RemoteReference / script.PrimitiveProtocolValue / script.ChannelValue / script.ArrayLocalValue / script.DateLocalValue / script.MapLocalValue / script.ObjectLocalValue / script.RegExpLocalValue / script.SetLocalValue ) script.ListLocalValue = [*script.LocalValue]; script.ArrayLocalValue = { type: "array", value: script.ListLocalValue, } script.DateLocalValue = { type: "date", value: text } script.MappingLocalValue = [*[(script.LocalValue / text), script.LocalValue]]; script.MapLocalValue = { type: "map", value: script.MappingLocalValue, } script.ObjectLocalValue = { type: "object", value: script.MappingLocalValue, } script.RegExpValue = { pattern: text, ? flags: text, } script.RegExpLocalValue = { type: "regexp", value: script.RegExpValue, } script.SetLocalValue = { type: "set", value: script.ListLocalValue, } script.PreloadScript = text; script.Realm = text; script.PrimitiveProtocolValue = ( script.UndefinedValue / script.NullValue / script.StringValue / script.NumberValue / script.BooleanValue / script.BigIntValue ) script.UndefinedValue = { type: "undefined", } script.NullValue = { type: "null", } script.StringValue = { type: "string", value: text, } script.SpecialNumber = "NaN" / "-0" / "Infinity" / "-Infinity"; script.NumberValue = { type: "number", value: number / script.SpecialNumber, } script.BooleanValue = { type: "boolean", value: bool, } script.BigIntValue = { type: "bigint", value: text, } script.RealmInfo = ( script.WindowRealmInfo / script.DedicatedWorkerRealmInfo / script.SharedWorkerRealmInfo / script.ServiceWorkerRealmInfo / script.WorkerRealmInfo / script.PaintWorkletRealmInfo / script.AudioWorkletRealmInfo / script.WorkletRealmInfo ) script.BaseRealmInfo = ( realm: script.Realm, origin: text ) script.WindowRealmInfo = { script.BaseRealmInfo, type: "window", context: browsingContext.BrowsingContext, ? sandbox: text } script.DedicatedWorkerRealmInfo = { script.BaseRealmInfo, type: "dedicated-worker" } script.SharedWorkerRealmInfo = { script.BaseRealmInfo, type: "shared-worker" } script.ServiceWorkerRealmInfo = { script.BaseRealmInfo, type: "service-worker" } script.WorkerRealmInfo = { script.BaseRealmInfo, type: "worker" } script.PaintWorkletRealmInfo = { script.BaseRealmInfo, type: "paint-worklet" } script.AudioWorkletRealmInfo = { script.BaseRealmInfo, type: "audio-worklet" } script.WorkletRealmInfo = { script.BaseRealmInfo, type: "worklet" } script.RealmType = "window" / "dedicated-worker" / "shared-worker" / "service-worker" / "worker" / "paint-worklet" / "audio-worklet" / "worklet" script.RemoteReference = ( script.SharedReference / script.RemoteObjectReference ) script.SharedReference = { sharedId: script.SharedId ? handle: script.Handle, Extensible } script.RemoteObjectReference = { handle: script.Handle, ? sharedId: script.SharedId Extensible } script.RemoteValue = ( script.PrimitiveProtocolValue / script.SymbolRemoteValue / script.ArrayRemoteValue / script.ObjectRemoteValue / script.FunctionRemoteValue / script.RegExpRemoteValue / script.DateRemoteValue / script.MapRemoteValue / script.SetRemoteValue / script.WeakMapRemoteValue / script.WeakSetRemoteValue / script.IteratorRemoteValue / script.GeneratorRemoteValue / script.ErrorRemoteValue / script.ProxyRemoteValue / script.PromiseRemoteValue / script.TypedArrayRemoteValue / script.ArrayBufferRemoteValue / script.NodeListRemoteValue / script.HTMLCollectionRemoteValue / script.NodeRemoteValue / script.WindowProxyRemoteValue ) script.ListRemoteValue = [*script.RemoteValue]; script.MappingRemoteValue = [*[(script.RemoteValue / text), script.RemoteValue]]; script.SymbolRemoteValue = { type: "symbol", ? handle: script.Handle, ? internalId: script.InternalId, } script.ArrayRemoteValue = { type: "array", ? handle: script.Handle, ? internalId: script.InternalId, ? value: script.ListRemoteValue, } script.ObjectRemoteValue = { type: "object", ? handle: script.Handle, ? internalId: script.InternalId, ? value: script.MappingRemoteValue, } script.FunctionRemoteValue = { type: "function", ? handle: script.Handle, ? internalId: script.InternalId, } script.RegExpRemoteValue = { ? handle: script.Handle, ? internalId: script.InternalId, } .and script.RegExpLocalValue script.DateRemoteValue = { ? handle: script.Handle, ? internalId: script.InternalId, } .and script.DateLocalValue script.MapRemoteValue = { type: "map", ? handle: script.Handle, ? internalId: script.InternalId, ? value: script.MappingRemoteValue, } script.SetRemoteValue = { type: "set", ? handle: script.Handle, ? internalId: script.InternalId, ? value: script.ListRemoteValue } script.WeakMapRemoteValue = { type: "weakmap", ? handle: script.Handle, ? internalId: script.InternalId, } script.WeakSetRemoteValue = { type: "weakset", ? handle: script.Handle, ? internalId: script.InternalId, } script.IteratorRemoteValue = { type: "iterator", ? handle: script.Handle, ? internalId: script.InternalId, } script.GeneratorRemoteValue = { type: "generator", ? handle: script.Handle, ? internalId: script.InternalId, } script.ErrorRemoteValue = { type: "error", ? handle: script.Handle, ? internalId: script.InternalId, } script.ProxyRemoteValue = { type: "proxy", ? handle: script.Handle, ? internalId: script.InternalId, } script.PromiseRemoteValue = { type: "promise", ? handle: script.Handle, ? internalId: script.InternalId, } script.TypedArrayRemoteValue = { type: "typedarray", ? handle: script.Handle, ? internalId: script.InternalId, } script.ArrayBufferRemoteValue = { type: "arraybuffer", ? handle: script.Handle, ? internalId: script.InternalId, } script.NodeListRemoteValue = { type: "nodelist", ? handle: script.Handle, ? internalId: script.InternalId, ? value: script.ListRemoteValue, } script.HTMLCollectionRemoteValue = { type: "htmlcollection", ? handle: script.Handle, ? internalId: script.InternalId, ? value: script.ListRemoteValue, } script.NodeRemoteValue = { type: "node", ? sharedId: script.SharedId, ? handle: script.Handle, ? internalId: script.InternalId, ? value: script.NodeProperties, } script.NodeProperties = { nodeType: js-uint, childNodeCount: js-uint, ? attributes: {*text => text}, ? children: [*script.NodeRemoteValue], ? localName: text, ? mode: "open" / "closed", ? namespaceURI: text, ? nodeValue: text, ? shadowRoot: script.NodeRemoteValue / null, } script.WindowProxyRemoteValue = { type: "window", value: script.WindowProxyProperties, ? handle: script.Handle, ? internalId: script.InternalId } script.WindowProxyProperties = { context: browsingContext.BrowsingContext } script.ResultOwnership = "root" / "none" script.SerializationOptions = { ? maxDomDepth: (js-uint / null) .default 0, ? maxObjectDepth: (js-uint / null) .default null, ? includeShadowTree: ("none" / "open" / "all") .default "none", } script.SharedId = text; script.StackFrame = { columnNumber: js-uint, functionName: text, lineNumber: js-uint, url: text, } script.StackTrace = { callFrames: [*script.StackFrame], } script.Source = { realm: script.Realm, ? context: browsingContext.BrowsingContext } script.RealmTarget = { realm: script.Realm }; script.ContextTarget = { context: browsingContext.BrowsingContext, ? sandbox: text } script.Target = ( script.RealmTarget / script.ContextTarget ); script.AddPreloadScript = ( method: "script.addPreloadScript", params: script.AddPreloadScriptParameters ) script.AddPreloadScriptParameters = { functionDeclaration: text, ? arguments: [*script.ChannelValue], ? contexts: [+browsingContext.BrowsingContext], ? sandbox: text } script.AddPreloadScriptResult = { script: script.PreloadScript } script.Disown = ( method: "script.disown", params: script.DisownParameters ) script.DisownParameters = { handles: [*script.Handle] target: script.Target; } script.CallFunction = ( method: "script.callFunction", params: script.CallFunctionParameters ) script.CallFunctionParameters = { functionDeclaration: text, awaitPromise: bool, target: script.Target, ? arguments: [*script.LocalValue], ? resultOwnership: script.ResultOwnership, ? serializationOptions: script.SerializationOptions, ? this: script.LocalValue, ? userActivation: bool .default false, } script.Evaluate = ( method: "script.evaluate", params: script.EvaluateParameters ) script.EvaluateParameters = { expression: text, target: script.Target, awaitPromise: bool, ? resultOwnership: script.ResultOwnership, ? serializationOptions: script.SerializationOptions, ? userActivation: bool .default false, } script.GetRealms = ( method: "script.getRealms", params: script.GetRealmsParameters ) script.GetRealmsParameters = { ? context: browsingContext.BrowsingContext, ? type: script.RealmType, } script.GetRealmsResult = { realms: [*script.RealmInfo] } script.RemovePreloadScript = ( method: "script.removePreloadScript", params: script.RemovePreloadScriptParameters ) script.RemovePreloadScriptParameters = { script: script.PreloadScript } script.Message = ( method: "script.message", params: script.MessageParameters ) script.MessageParameters = { channel: script.Channel, data: script.RemoteValue, source: script.Source, } script.RealmCreated = ( method: "script.realmCreated", params: script.RealmInfo ) script.RealmDestroyed = ( method: "script.realmDestroyed", params: script.RealmDestroyedParameters ) script.RealmDestroyedParameters = { realm: script.Realm } LogEvent = ( log.EntryAdded ) log.Level = "debug" / "info" / "warn" / "error" log.Entry = ( log.GenericLogEntry / log.ConsoleLogEntry / log.JavascriptLogEntry ) log.BaseLogEntry = ( level: log.Level, source: script.Source, text: text / null, timestamp: js-uint, ? stackTrace: script.StackTrace, ) log.GenericLogEntry = { log.BaseLogEntry, type: text, } log.ConsoleLogEntry = { log.BaseLogEntry, type: "console", method: text, args: [*script.RemoteValue], } log.JavascriptLogEntry = { log.BaseLogEntry, type: "javascript", } log.EntryAdded = ( method: "log.entryAdded", params: log.Entry, ) InputCommand = ( input.PerformActions // input.ReleaseActions ) input.ElementOrigin = { type: "element", element: script.SharedReference } input.PerformActions = ( method: "input.performActions", params: input.PerformActionsParameters ) input.PerformActionsParameters = { context: browsingContext.BrowsingContext, actions: [*input.SourceActions] } input.SourceActions = ( input.NoneSourceActions / input.KeySourceActions / input.PointerSourceActions / input.WheelSourceActions ) input.NoneSourceActions = { type: "none", id: text, actions: [*input.NoneSourceAction] } input.NoneSourceAction = input.PauseAction input.KeySourceActions = { type: "key", id: text, actions: [*input.KeySourceAction] } input.KeySourceAction = ( input.PauseAction / input.KeyDownAction / input.KeyUpAction ) input.PointerSourceActions = { type: "pointer", id: text, ? parameters: input.PointerParameters, actions: [*input.PointerSourceAction] } input.PointerType = "mouse" / "pen" / "touch" input.PointerParameters = { ? pointerType: input.PointerType .default "mouse" } input.PointerSourceAction = ( input.PauseAction / input.PointerDownAction / input.PointerUpAction / input.PointerMoveAction ) input.WheelSourceActions = { type: "wheel", id: text, actions: [*input.WheelSourceAction] } input.WheelSourceAction = ( input.PauseAction / input.WheelScrollAction ) input.PauseAction = { type: "pause", ? duration: js-uint } input.KeyDownAction = { type: "keyDown", value: text } input.KeyUpAction = { type: "keyUp", value: text } input.PointerUpAction = { type: "pointerUp", button: js-uint, input.PointerCommonProperties } input.PointerDownAction = { type: "pointerDown", button: js-uint, input.PointerCommonProperties } input.PointerMoveAction = { type: "pointerMove", x: js-int, y: js-int, ? duration: js-uint, ? origin: input.Origin, input.PointerCommonProperties } input.WheelScrollAction = { type: "scroll", x: js-int, y: js-int, deltaX: js-int, deltaY: js-int, ? duration: js-uint, ? origin: input.Origin .default "viewport", } input.PointerCommonProperties = ( ? width: js-uint .default 1, ? height: js-uint .default 1, ? pressure: float .default 0.0, ? tangentialPressure: float .default 0.0, ? twist: (0..359) .default 0, ; 0 .. Math.PI / 2 ? altitudeAngle: (0.0..1.5707963267948966) .default 0.0, ; 0 .. 2 * Math.PI ? azimuthAngle: (0.0..6.283185307179586) .default 0.0, ) input.Origin = "viewport" / "pointer" / input.ElementOrigin input.ReleaseActions = ( method: "input.releaseActions", params: input.ReleaseActionsParameters ) input.ReleaseActionsParameters = { context: browsingContext.BrowsingContext, }