Mypal/devtools/shared/specs/inspector.js

446 lines
9.6 KiB
JavaScript

/* 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("devtools/shared/protocol");
const { nodeSpec } = require("devtools/shared/specs/node");
require("devtools/shared/specs/styles");
require("devtools/shared/specs/highlighters");
require("devtools/shared/specs/layout");
exports.nodeSpec = nodeSpec;
/**
* Returned from any call that might return a node that isn't connected to root
* by nodes the child has seen, such as querySelector.
*/
types.addDictType("disconnectedNode", {
// The actual node to return
node: "domnode",
// Nodes that are needed to connect the node to a node the client has already
// seen
newParents: "array:domnode"
});
types.addDictType("disconnectedNodeArray", {
// The actual node list to return
nodes: "array:domnode",
// Nodes that are needed to connect those nodes to the root.
newParents: "array:domnode"
});
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"
});
const nodeListSpec = generateActorSpec({
typeName: "domnodelist",
methods: {
item: {
request: { item: Arg(0) },
response: RetVal("disconnectedNode")
},
items: {
request: {
start: Arg(0, "nullable:number"),
end: Arg(1, "nullable:number")
},
response: RetVal("disconnectedNodeArray")
},
release: {
release: true
}
}
});
exports.nodeListSpec = nodeListSpec;
// 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"),
whatToShow: Option(1)
},
response: RetVal(types.addDictType("domtraversalarray", {
nodes: "array:domnode"
}))
};
var traversalMethod = {
request: {
node: Arg(0, "domnode"),
whatToShow: Option(1)
},
response: {
node: RetVal("nullable:domnode")
}
};
const walkerSpec = generateActorSpec({
typeName: "domwalker",
events: {
"new-mutations": {
type: "newMutations"
},
"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"
},
"highlighter-ready": {
type: "highlighter-ready"
},
"highlighter-hide": {
type: "highlighter-hide"
},
"display-change": {
type: "display-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
},
pick: {
request: {},
response: RetVal("disconnectedNode")
},
cancelPick: {},
highlight: {
request: {node: Arg(0, "nullable:domnode")}
},
document: {
request: { node: Arg(0, "nullable:domnode") },
response: { node: RetVal("domnode") },
},
documentElement: {
request: { node: Arg(0, "nullable:domnode") },
response: { node: RetVal("domnode") },
},
parents: {
request: {
node: Arg(0, "domnode"),
sameDocument: Option(1),
sameTypeRootTreeItem: Option(1)
},
response: {
nodes: RetVal("array: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,
siblings: nodeArrayMethod,
nextSibling: traversalMethod,
previousSibling: traversalMethod,
findInspectingNode: {
request: {},
response: RetVal("disconnectedNode")
},
querySelector: {
request: {
node: Arg(0, "domnode"),
selector: Arg(1)
},
response: RetVal("disconnectedNode")
},
querySelectorAll: {
request: {
node: Arg(0, "domnode"),
selector: Arg(1)
},
response: {
list: RetVal("domnodelist")
}
},
multiFrameQuerySelectorAll: {
request: {
selector: Arg(0)
},
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)
},
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") }
},
getNodeActorFromObjectActor: {
request: {
objectActorID: Arg(0, "string")
},
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")
}
}
}
});
exports.walkerSpec = walkerSpec;
const inspectorSpec = generateActorSpec({
typeName: "inspector",
events: {
"color-picked": {
type: "colorPicked",
color: Arg(0, "string")
},
"color-pick-canceled": {
type: "colorPickCanceled"
}
},
methods: {
getWalker: {
request: {
options: Arg(0, "nullable:json")
},
response: {
walker: RetVal("domwalker")
}
},
getPageStyle: {
request: {},
response: {
pageStyle: RetVal("pagestyle")
}
},
getHighlighter: {
request: {
autohide: Arg(0, "boolean")
},
response: {
highligter: RetVal("highlighter")
}
},
getHighlighterByType: {
request: {
typeName: Arg(0)
},
response: {
highlighter: RetVal("nullable:customhighlighter")
}
},
getImageDataFromURL: {
request: {url: Arg(0), maxDim: Arg(1, "nullable:number")},
response: RetVal("imageData")
},
resolveRelativeURL: {
request: {url: Arg(0, "string"), node: Arg(1, "nullable:domnode")},
response: {value: RetVal("string")}
},
pickColorFromPage: {
request: {options: Arg(0, "nullable:json")},
response: {}
},
cancelPickColorFromPage: {
request: {},
response: {}
}
}
});
exports.inspectorSpec = inspectorSpec;