walker.js (9060B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 "use strict"; 5 6 const { 7 Arg, 8 Option, 9 RetVal, 10 generateActorSpec, 11 types, 12 } = require("resource://devtools/shared/protocol.js"); 13 14 types.addDictType("dommutation", {}); 15 16 types.addDictType("searchresult", { 17 list: "domnodelist", 18 // Right now there is isn't anything required for metadata, 19 // but it's json so it can be extended with extra data. 20 metadata: "array:json", 21 }); 22 23 // Some common request/response templates for the dom walker 24 25 var nodeArrayMethod = { 26 request: { 27 node: Arg(0, "domnode"), 28 maxNodes: Option(1), 29 center: Option(1, "domnode"), 30 start: Option(1, "domnode"), 31 }, 32 response: RetVal( 33 types.addDictType("domtraversalarray", { 34 nodes: "array:domnode", 35 }) 36 ), 37 }; 38 39 var traversalMethod = { 40 request: { 41 node: Arg(0, "domnode"), 42 }, 43 response: { 44 node: RetVal("nullable:domnode"), 45 }, 46 }; 47 48 const walkerSpec = generateActorSpec({ 49 typeName: "domwalker", 50 51 events: { 52 "new-mutations": { 53 type: "newMutations", 54 }, 55 "root-available": { 56 type: "root-available", 57 node: Arg(0, "nullable:domnode"), 58 }, 59 "root-destroyed": { 60 type: "root-destroyed", 61 node: Arg(0, "nullable:domnode"), 62 }, 63 "picker-node-picked": { 64 type: "pickerNodePicked", 65 node: Arg(0, "disconnectedNode"), 66 }, 67 "picker-node-previewed": { 68 type: "pickerNodePreviewed", 69 node: Arg(0, "disconnectedNode"), 70 }, 71 "picker-node-hovered": { 72 type: "pickerNodeHovered", 73 node: Arg(0, "disconnectedNode"), 74 }, 75 "picker-node-canceled": { 76 type: "pickerNodeCanceled", 77 }, 78 "display-change": { 79 type: "display-change", 80 nodes: Arg(0, "array:domnode"), 81 }, 82 "scrollable-change": { 83 type: "scrollable-change", 84 nodes: Arg(0, "array:domnode"), 85 }, 86 "overflow-change": { 87 type: "overflow-change", 88 nodes: Arg(0, "array:domnode"), 89 }, 90 "container-type-change": { 91 type: "container-type-change", 92 nodes: Arg(0, "array:domnode"), 93 }, 94 "anchor-name-change": { 95 type: "anchor-name-change", 96 nodes: Arg(0, "array:domnode"), 97 }, 98 // The walker actor emits a useful "resize" event to its front to let 99 // clients know when the browser window gets resized. This may be useful 100 // for refreshing a DOM node's styles for example, since those may depend on 101 // media-queries. 102 resize: { 103 type: "resize", 104 }, 105 }, 106 107 methods: { 108 release: { 109 release: true, 110 }, 111 document: { 112 request: { node: Arg(0, "nullable:domnode") }, 113 response: { node: RetVal("domnode") }, 114 }, 115 documentElement: { 116 request: { node: Arg(0, "nullable:domnode") }, 117 response: { node: RetVal("domnode") }, 118 }, 119 retainNode: { 120 request: { node: Arg(0, "domnode") }, 121 response: {}, 122 }, 123 unretainNode: { 124 request: { node: Arg(0, "domnode") }, 125 response: {}, 126 }, 127 releaseNode: { 128 request: { 129 node: Arg(0, "domnode"), 130 force: Option(1), 131 }, 132 }, 133 children: nodeArrayMethod, 134 nextSibling: traversalMethod, 135 previousSibling: traversalMethod, 136 findInspectingNode: { 137 request: {}, 138 response: RetVal("disconnectedNode"), 139 }, 140 querySelector: { 141 request: { 142 node: Arg(0, "domnode"), 143 selector: Arg(1), 144 }, 145 response: RetVal("disconnectedNode"), 146 }, 147 getIdrefNode: { 148 request: { 149 node: Arg(0, "domnode"), 150 id: Arg(1), 151 }, 152 response: RetVal("disconnectedNode"), 153 }, 154 querySelectorAll: { 155 request: { 156 node: Arg(0, "domnode"), 157 selector: Arg(1), 158 }, 159 response: { 160 list: RetVal("domnodelist"), 161 }, 162 }, 163 search: { 164 request: { 165 query: Arg(0), 166 }, 167 response: { 168 list: RetVal("searchresult"), 169 }, 170 }, 171 getSuggestionsForQuery: { 172 request: { 173 query: Arg(0), 174 completing: Arg(1), 175 selectorState: Arg(2), 176 }, 177 response: { 178 list: RetVal("array:array:string"), 179 }, 180 }, 181 addPseudoClassLock: { 182 request: { 183 node: Arg(0, "domnode"), 184 pseudoClass: Arg(1), 185 parents: Option(2), 186 enabled: Option(2, "boolean"), 187 }, 188 response: {}, 189 }, 190 hideNode: { 191 request: { node: Arg(0, "domnode") }, 192 }, 193 unhideNode: { 194 request: { node: Arg(0, "domnode") }, 195 }, 196 removePseudoClassLock: { 197 request: { 198 node: Arg(0, "domnode"), 199 pseudoClass: Arg(1), 200 parents: Option(2), 201 }, 202 response: {}, 203 }, 204 clearPseudoClassLocks: { 205 request: { 206 node: Arg(0, "nullable:domnode"), 207 }, 208 response: {}, 209 }, 210 innerHTML: { 211 request: { 212 node: Arg(0, "domnode"), 213 }, 214 response: { 215 value: RetVal("longstring"), 216 }, 217 }, 218 setInnerHTML: { 219 request: { 220 node: Arg(0, "domnode"), 221 value: Arg(1, "string"), 222 }, 223 response: {}, 224 }, 225 outerHTML: { 226 request: { 227 node: Arg(0, "domnode"), 228 }, 229 response: { 230 value: RetVal("longstring"), 231 }, 232 }, 233 setOuterHTML: { 234 request: { 235 node: Arg(0, "domnode"), 236 value: Arg(1, "string"), 237 }, 238 response: {}, 239 }, 240 insertAdjacentHTML: { 241 request: { 242 node: Arg(0, "domnode"), 243 position: Arg(1, "string"), 244 value: Arg(2, "string"), 245 }, 246 response: RetVal("disconnectedNodeArray"), 247 }, 248 duplicateNode: { 249 request: { 250 node: Arg(0, "domnode"), 251 }, 252 response: {}, 253 }, 254 removeNode: { 255 request: { 256 node: Arg(0, "domnode"), 257 }, 258 response: { 259 nextSibling: RetVal("nullable:domnode"), 260 }, 261 }, 262 removeNodes: { 263 request: { 264 node: Arg(0, "array:domnode"), 265 }, 266 response: {}, 267 }, 268 insertBefore: { 269 request: { 270 node: Arg(0, "domnode"), 271 parent: Arg(1, "domnode"), 272 sibling: Arg(2, "nullable:domnode"), 273 }, 274 response: {}, 275 }, 276 editTagName: { 277 request: { 278 node: Arg(0, "domnode"), 279 tagName: Arg(1, "string"), 280 }, 281 response: {}, 282 }, 283 getMutations: { 284 request: { 285 cleanup: Option(0), 286 }, 287 response: { 288 mutations: RetVal("array:dommutation"), 289 }, 290 }, 291 isInDOMTree: { 292 request: { node: Arg(0, "domnode") }, 293 response: { attached: RetVal("boolean") }, 294 }, 295 getNodeActorFromWindowID: { 296 request: { 297 windowID: Arg(0, "string"), 298 }, 299 response: { 300 nodeFront: RetVal("nullable:disconnectedNode"), 301 }, 302 }, 303 getNodeActorFromContentDomReference: { 304 request: { 305 contentDomReference: Arg(0, "json"), 306 }, 307 response: { 308 nodeFront: RetVal("nullable:disconnectedNode"), 309 }, 310 }, 311 getStyleSheetOwnerNode: { 312 request: { 313 styleSheetActorID: Arg(0, "string"), 314 }, 315 response: { 316 ownerNode: RetVal("nullable:disconnectedNode"), 317 }, 318 }, 319 getNodeFromActor: { 320 request: { 321 actorID: Arg(0, "string"), 322 path: Arg(1, "array:string"), 323 }, 324 response: { 325 node: RetVal("nullable:disconnectedNode"), 326 }, 327 }, 328 getLayoutInspector: { 329 request: {}, 330 response: { 331 actor: RetVal("layout"), 332 }, 333 }, 334 getParentGridNode: { 335 request: { 336 node: Arg(0, "nullable:domnode"), 337 }, 338 response: { 339 node: RetVal("nullable:domnode"), 340 }, 341 }, 342 getOffsetParent: { 343 request: { 344 node: Arg(0, "nullable:domnode"), 345 }, 346 response: { 347 node: RetVal("nullable:domnode"), 348 }, 349 }, 350 setMutationBreakpoints: { 351 request: { 352 node: Arg(0, "nullable:domnode"), 353 subtree: Option(1, "nullable:boolean"), 354 removal: Option(1, "nullable:boolean"), 355 attribute: Option(1, "nullable:boolean"), 356 }, 357 response: {}, 358 }, 359 getEmbedderElement: { 360 request: { 361 browsingContextID: Arg(0, "string"), 362 }, 363 response: { 364 nodeFront: RetVal("disconnectedNode"), 365 }, 366 }, 367 pick: { 368 request: { 369 doFocus: Arg(0, "nullable:boolean"), 370 isLocalTab: Arg(1, "nullable:boolean"), 371 }, 372 }, 373 cancelPick: { 374 request: {}, 375 response: {}, 376 }, 377 clearPicker: { 378 request: {}, 379 oneway: true, 380 }, 381 watchRootNode: { 382 request: {}, 383 response: {}, 384 }, 385 getOverflowCausingElements: { 386 request: { 387 node: Arg(0, "domnode"), 388 }, 389 response: { 390 list: RetVal("disconnectedNodeArray"), 391 }, 392 }, 393 getScrollableAncestorNode: { 394 request: { 395 node: Arg(0, "domnode"), 396 }, 397 response: { 398 node: RetVal("nullable:domnode"), 399 }, 400 }, 401 }, 402 }); 403 404 exports.walkerSpec = walkerSpec;