Source code

Revision control

Copy as Markdown

Other Tools

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
const {
Arg,
Option,
RetVal,
generateActorSpec,
types,
} = require("resource://devtools/shared/protocol.js");
types.addDictType("dommutation", {});
types.addDictType("searchresult", {
list: "domnodelist",
// Right now there is isn't anything required for metadata,
// but it's json so it can be extended with extra data.
metadata: "array:json",
});
// Some common request/response templates for the dom walker
var nodeArrayMethod = {
request: {
node: Arg(0, "domnode"),
maxNodes: Option(1),
center: Option(1, "domnode"),
start: Option(1, "domnode"),
},
response: RetVal(
types.addDictType("domtraversalarray", {
nodes: "array:domnode",
})
),
};
var traversalMethod = {
request: {
node: Arg(0, "domnode"),
},
response: {
node: RetVal("nullable:domnode"),
},
};
const walkerSpec = generateActorSpec({
typeName: "domwalker",
events: {
"new-mutations": {
type: "newMutations",
},
"root-available": {
type: "root-available",
node: Arg(0, "nullable:domnode"),
},
"root-destroyed": {
type: "root-destroyed",
node: Arg(0, "nullable:domnode"),
},
"picker-node-picked": {
type: "pickerNodePicked",
node: Arg(0, "disconnectedNode"),
},
"picker-node-previewed": {
type: "pickerNodePreviewed",
node: Arg(0, "disconnectedNode"),
},
"picker-node-hovered": {
type: "pickerNodeHovered",
node: Arg(0, "disconnectedNode"),
},
"picker-node-canceled": {
type: "pickerNodeCanceled",
},
"display-change": {
type: "display-change",
nodes: Arg(0, "array:domnode"),
},
"scrollable-change": {
type: "scrollable-change",
nodes: Arg(0, "array:domnode"),
},
"overflow-change": {
type: "overflow-change",
nodes: Arg(0, "array:domnode"),
},
"container-type-change": {
type: "container-type-change",
nodes: Arg(0, "array:domnode"),
},
// The walker actor emits a useful "resize" event to its front to let
// clients know when the browser window gets resized. This may be useful
// for refreshing a DOM node's styles for example, since those may depend on
// media-queries.
resize: {
type: "resize",
},
},
methods: {
release: {
release: true,
},
document: {
request: { node: Arg(0, "nullable:domnode") },
response: { node: RetVal("domnode") },
},
documentElement: {
request: { node: Arg(0, "nullable:domnode") },
response: { node: RetVal("domnode") },
},
retainNode: {
request: { node: Arg(0, "domnode") },
response: {},
},
unretainNode: {
request: { node: Arg(0, "domnode") },
response: {},
},
releaseNode: {
request: {
node: Arg(0, "domnode"),
force: Option(1),
},
},
children: nodeArrayMethod,
nextSibling: traversalMethod,
previousSibling: traversalMethod,
findInspectingNode: {
request: {},
response: RetVal("disconnectedNode"),
},
querySelector: {
request: {
node: Arg(0, "domnode"),
selector: Arg(1),
},
response: RetVal("disconnectedNode"),
},
getIdrefNode: {
request: {
node: Arg(0, "domnode"),
id: Arg(1),
},
response: RetVal("disconnectedNode"),
},
querySelectorAll: {
request: {
node: Arg(0, "domnode"),
selector: Arg(1),
},
response: {
list: RetVal("domnodelist"),
},
},
search: {
request: {
query: Arg(0),
},
response: {
list: RetVal("searchresult"),
},
},
getSuggestionsForQuery: {
request: {
query: Arg(0),
completing: Arg(1),
selectorState: Arg(2),
},
response: {
list: RetVal("array:array:string"),
},
},
addPseudoClassLock: {
request: {
node: Arg(0, "domnode"),
pseudoClass: Arg(1),
parents: Option(2),
enabled: Option(2, "boolean"),
},
response: {},
},
hideNode: {
request: { node: Arg(0, "domnode") },
},
unhideNode: {
request: { node: Arg(0, "domnode") },
},
removePseudoClassLock: {
request: {
node: Arg(0, "domnode"),
pseudoClass: Arg(1),
parents: Option(2),
},
response: {},
},
clearPseudoClassLocks: {
request: {
node: Arg(0, "nullable:domnode"),
},
response: {},
},
innerHTML: {
request: {
node: Arg(0, "domnode"),
},
response: {
value: RetVal("longstring"),
},
},
setInnerHTML: {
request: {
node: Arg(0, "domnode"),
value: Arg(1, "string"),
},
response: {},
},
outerHTML: {
request: {
node: Arg(0, "domnode"),
},
response: {
value: RetVal("longstring"),
},
},
setOuterHTML: {
request: {
node: Arg(0, "domnode"),
value: Arg(1, "string"),
},
response: {},
},
insertAdjacentHTML: {
request: {
node: Arg(0, "domnode"),
position: Arg(1, "string"),
value: Arg(2, "string"),
},
response: RetVal("disconnectedNodeArray"),
},
duplicateNode: {
request: {
node: Arg(0, "domnode"),
},
response: {},
},
removeNode: {
request: {
node: Arg(0, "domnode"),
},
response: {
nextSibling: RetVal("nullable:domnode"),
},
},
removeNodes: {
request: {
node: Arg(0, "array:domnode"),
},
response: {},
},
insertBefore: {
request: {
node: Arg(0, "domnode"),
parent: Arg(1, "domnode"),
sibling: Arg(2, "nullable:domnode"),
},
response: {},
},
editTagName: {
request: {
node: Arg(0, "domnode"),
tagName: Arg(1, "string"),
},
response: {},
},
getMutations: {
request: {
cleanup: Option(0),
},
response: {
mutations: RetVal("array:dommutation"),
},
},
isInDOMTree: {
request: { node: Arg(0, "domnode") },
response: { attached: RetVal("boolean") },
},
getNodeActorFromWindowID: {
request: {
windowID: Arg(0, "string"),
},
response: {
nodeFront: RetVal("nullable:disconnectedNode"),
},
},
getNodeActorFromContentDomReference: {
request: {
contentDomReference: Arg(0, "json"),
},
response: {
nodeFront: RetVal("nullable:disconnectedNode"),
},
},
getStyleSheetOwnerNode: {
request: {
styleSheetActorID: Arg(0, "string"),
},
response: {
ownerNode: RetVal("nullable:disconnectedNode"),
},
},
getNodeFromActor: {
request: {
actorID: Arg(0, "string"),
path: Arg(1, "array:string"),
},
response: {
node: RetVal("nullable:disconnectedNode"),
},
},
getLayoutInspector: {
request: {},
response: {
actor: RetVal("layout"),
},
},
getParentGridNode: {
request: {
node: Arg(0, "nullable:domnode"),
},
response: {
node: RetVal("nullable:domnode"),
},
},
getOffsetParent: {
request: {
node: Arg(0, "nullable:domnode"),
},
response: {
node: RetVal("nullable:domnode"),
},
},
setMutationBreakpoints: {
request: {
node: Arg(0, "nullable:domnode"),
subtree: Option(1, "nullable:boolean"),
removal: Option(1, "nullable:boolean"),
attribute: Option(1, "nullable:boolean"),
},
response: {},
},
getEmbedderElement: {
request: {
browsingContextID: Arg(0, "string"),
},
response: {
nodeFront: RetVal("disconnectedNode"),
},
},
pick: {
request: {
doFocus: Arg(0, "nullable:boolean"),
isLocalTab: Arg(1, "nullable:boolean"),
},
},
cancelPick: {
request: {},
response: {},
},
clearPicker: {
request: {},
oneway: true,
},
watchRootNode: {
request: {},
response: {},
},
getOverflowCausingElements: {
request: {
node: Arg(0, "domnode"),
},
response: {
list: RetVal("disconnectedNodeArray"),
},
},
getScrollableAncestorNode: {
request: {
node: Arg(0, "domnode"),
},
response: {
node: RetVal("nullable:domnode"),
},
},
},
});
exports.walkerSpec = walkerSpec;