inspector.js 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  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. const {
  6. Arg,
  7. Option,
  8. RetVal,
  9. generateActorSpec,
  10. types
  11. } = require("devtools/shared/protocol");
  12. const { nodeSpec } = require("devtools/shared/specs/node");
  13. require("devtools/shared/specs/styles");
  14. require("devtools/shared/specs/highlighters");
  15. require("devtools/shared/specs/layout");
  16. exports.nodeSpec = nodeSpec;
  17. /**
  18. * Returned from any call that might return a node that isn't connected to root
  19. * by nodes the child has seen, such as querySelector.
  20. */
  21. types.addDictType("disconnectedNode", {
  22. // The actual node to return
  23. node: "domnode",
  24. // Nodes that are needed to connect the node to a node the client has already
  25. // seen
  26. newParents: "array:domnode"
  27. });
  28. types.addDictType("disconnectedNodeArray", {
  29. // The actual node list to return
  30. nodes: "array:domnode",
  31. // Nodes that are needed to connect those nodes to the root.
  32. newParents: "array:domnode"
  33. });
  34. types.addDictType("dommutation", {});
  35. types.addDictType("searchresult", {
  36. list: "domnodelist",
  37. // Right now there is isn't anything required for metadata,
  38. // but it's json so it can be extended with extra data.
  39. metadata: "array:json"
  40. });
  41. const nodeListSpec = generateActorSpec({
  42. typeName: "domnodelist",
  43. methods: {
  44. item: {
  45. request: { item: Arg(0) },
  46. response: RetVal("disconnectedNode")
  47. },
  48. items: {
  49. request: {
  50. start: Arg(0, "nullable:number"),
  51. end: Arg(1, "nullable:number")
  52. },
  53. response: RetVal("disconnectedNodeArray")
  54. },
  55. release: {
  56. release: true
  57. }
  58. }
  59. });
  60. exports.nodeListSpec = nodeListSpec;
  61. // Some common request/response templates for the dom walker
  62. var nodeArrayMethod = {
  63. request: {
  64. node: Arg(0, "domnode"),
  65. maxNodes: Option(1),
  66. center: Option(1, "domnode"),
  67. start: Option(1, "domnode"),
  68. whatToShow: Option(1)
  69. },
  70. response: RetVal(types.addDictType("domtraversalarray", {
  71. nodes: "array:domnode"
  72. }))
  73. };
  74. var traversalMethod = {
  75. request: {
  76. node: Arg(0, "domnode"),
  77. whatToShow: Option(1)
  78. },
  79. response: {
  80. node: RetVal("nullable:domnode")
  81. }
  82. };
  83. const walkerSpec = generateActorSpec({
  84. typeName: "domwalker",
  85. events: {
  86. "new-mutations": {
  87. type: "newMutations"
  88. },
  89. "picker-node-picked": {
  90. type: "pickerNodePicked",
  91. node: Arg(0, "disconnectedNode")
  92. },
  93. "picker-node-previewed": {
  94. type: "pickerNodePreviewed",
  95. node: Arg(0, "disconnectedNode")
  96. },
  97. "picker-node-hovered": {
  98. type: "pickerNodeHovered",
  99. node: Arg(0, "disconnectedNode")
  100. },
  101. "picker-node-canceled": {
  102. type: "pickerNodeCanceled"
  103. },
  104. "highlighter-ready": {
  105. type: "highlighter-ready"
  106. },
  107. "highlighter-hide": {
  108. type: "highlighter-hide"
  109. },
  110. "display-change": {
  111. type: "display-change",
  112. nodes: Arg(0, "array:domnode")
  113. },
  114. // The walker actor emits a useful "resize" event to its front to let
  115. // clients know when the browser window gets resized. This may be useful
  116. // for refreshing a DOM node's styles for example, since those may depend on
  117. // media-queries.
  118. "resize": {
  119. type: "resize"
  120. }
  121. },
  122. methods: {
  123. release: {
  124. release: true
  125. },
  126. pick: {
  127. request: {},
  128. response: RetVal("disconnectedNode")
  129. },
  130. cancelPick: {},
  131. highlight: {
  132. request: {node: Arg(0, "nullable:domnode")}
  133. },
  134. document: {
  135. request: { node: Arg(0, "nullable:domnode") },
  136. response: { node: RetVal("domnode") },
  137. },
  138. documentElement: {
  139. request: { node: Arg(0, "nullable:domnode") },
  140. response: { node: RetVal("domnode") },
  141. },
  142. parents: {
  143. request: {
  144. node: Arg(0, "domnode"),
  145. sameDocument: Option(1),
  146. sameTypeRootTreeItem: Option(1)
  147. },
  148. response: {
  149. nodes: RetVal("array:domnode")
  150. },
  151. },
  152. retainNode: {
  153. request: { node: Arg(0, "domnode") },
  154. response: {}
  155. },
  156. unretainNode: {
  157. request: { node: Arg(0, "domnode") },
  158. response: {},
  159. },
  160. releaseNode: {
  161. request: {
  162. node: Arg(0, "domnode"),
  163. force: Option(1)
  164. }
  165. },
  166. children: nodeArrayMethod,
  167. siblings: nodeArrayMethod,
  168. nextSibling: traversalMethod,
  169. previousSibling: traversalMethod,
  170. findInspectingNode: {
  171. request: {},
  172. response: RetVal("disconnectedNode")
  173. },
  174. querySelector: {
  175. request: {
  176. node: Arg(0, "domnode"),
  177. selector: Arg(1)
  178. },
  179. response: RetVal("disconnectedNode")
  180. },
  181. querySelectorAll: {
  182. request: {
  183. node: Arg(0, "domnode"),
  184. selector: Arg(1)
  185. },
  186. response: {
  187. list: RetVal("domnodelist")
  188. }
  189. },
  190. multiFrameQuerySelectorAll: {
  191. request: {
  192. selector: Arg(0)
  193. },
  194. response: {
  195. list: RetVal("domnodelist")
  196. }
  197. },
  198. search: {
  199. request: {
  200. query: Arg(0),
  201. },
  202. response: {
  203. list: RetVal("searchresult"),
  204. }
  205. },
  206. getSuggestionsForQuery: {
  207. request: {
  208. query: Arg(0),
  209. completing: Arg(1),
  210. selectorState: Arg(2)
  211. },
  212. response: {
  213. list: RetVal("array:array:string")
  214. }
  215. },
  216. addPseudoClassLock: {
  217. request: {
  218. node: Arg(0, "domnode"),
  219. pseudoClass: Arg(1),
  220. parents: Option(2)
  221. },
  222. response: {}
  223. },
  224. hideNode: {
  225. request: { node: Arg(0, "domnode") }
  226. },
  227. unhideNode: {
  228. request: { node: Arg(0, "domnode") }
  229. },
  230. removePseudoClassLock: {
  231. request: {
  232. node: Arg(0, "domnode"),
  233. pseudoClass: Arg(1),
  234. parents: Option(2)
  235. },
  236. response: {}
  237. },
  238. clearPseudoClassLocks: {
  239. request: {
  240. node: Arg(0, "nullable:domnode")
  241. },
  242. response: {}
  243. },
  244. innerHTML: {
  245. request: {
  246. node: Arg(0, "domnode")
  247. },
  248. response: {
  249. value: RetVal("longstring")
  250. }
  251. },
  252. setInnerHTML: {
  253. request: {
  254. node: Arg(0, "domnode"),
  255. value: Arg(1, "string"),
  256. },
  257. response: {}
  258. },
  259. outerHTML: {
  260. request: {
  261. node: Arg(0, "domnode")
  262. },
  263. response: {
  264. value: RetVal("longstring")
  265. }
  266. },
  267. setOuterHTML: {
  268. request: {
  269. node: Arg(0, "domnode"),
  270. value: Arg(1, "string"),
  271. },
  272. response: {}
  273. },
  274. insertAdjacentHTML: {
  275. request: {
  276. node: Arg(0, "domnode"),
  277. position: Arg(1, "string"),
  278. value: Arg(2, "string")
  279. },
  280. response: RetVal("disconnectedNodeArray")
  281. },
  282. duplicateNode: {
  283. request: {
  284. node: Arg(0, "domnode")
  285. },
  286. response: {}
  287. },
  288. removeNode: {
  289. request: {
  290. node: Arg(0, "domnode")
  291. },
  292. response: {
  293. nextSibling: RetVal("nullable:domnode")
  294. }
  295. },
  296. removeNodes: {
  297. request: {
  298. node: Arg(0, "array:domnode")
  299. },
  300. response: {}
  301. },
  302. insertBefore: {
  303. request: {
  304. node: Arg(0, "domnode"),
  305. parent: Arg(1, "domnode"),
  306. sibling: Arg(2, "nullable:domnode")
  307. },
  308. response: {}
  309. },
  310. editTagName: {
  311. request: {
  312. node: Arg(0, "domnode"),
  313. tagName: Arg(1, "string")
  314. },
  315. response: {}
  316. },
  317. getMutations: {
  318. request: {
  319. cleanup: Option(0)
  320. },
  321. response: {
  322. mutations: RetVal("array:dommutation")
  323. }
  324. },
  325. isInDOMTree: {
  326. request: { node: Arg(0, "domnode") },
  327. response: { attached: RetVal("boolean") }
  328. },
  329. getNodeActorFromObjectActor: {
  330. request: {
  331. objectActorID: Arg(0, "string")
  332. },
  333. response: {
  334. nodeFront: RetVal("nullable:disconnectedNode")
  335. }
  336. },
  337. getStyleSheetOwnerNode: {
  338. request: {
  339. styleSheetActorID: Arg(0, "string")
  340. },
  341. response: {
  342. ownerNode: RetVal("nullable:disconnectedNode")
  343. }
  344. },
  345. getNodeFromActor: {
  346. request: {
  347. actorID: Arg(0, "string"),
  348. path: Arg(1, "array:string")
  349. },
  350. response: {
  351. node: RetVal("nullable:disconnectedNode")
  352. }
  353. },
  354. getLayoutInspector: {
  355. request: {},
  356. response: {
  357. actor: RetVal("layout")
  358. }
  359. }
  360. }
  361. });
  362. exports.walkerSpec = walkerSpec;
  363. const inspectorSpec = generateActorSpec({
  364. typeName: "inspector",
  365. events: {
  366. "color-picked": {
  367. type: "colorPicked",
  368. color: Arg(0, "string")
  369. },
  370. "color-pick-canceled": {
  371. type: "colorPickCanceled"
  372. }
  373. },
  374. methods: {
  375. getWalker: {
  376. request: {
  377. options: Arg(0, "nullable:json")
  378. },
  379. response: {
  380. walker: RetVal("domwalker")
  381. }
  382. },
  383. getPageStyle: {
  384. request: {},
  385. response: {
  386. pageStyle: RetVal("pagestyle")
  387. }
  388. },
  389. getHighlighter: {
  390. request: {
  391. autohide: Arg(0, "boolean")
  392. },
  393. response: {
  394. highligter: RetVal("highlighter")
  395. }
  396. },
  397. getHighlighterByType: {
  398. request: {
  399. typeName: Arg(0)
  400. },
  401. response: {
  402. highlighter: RetVal("nullable:customhighlighter")
  403. }
  404. },
  405. getImageDataFromURL: {
  406. request: {url: Arg(0), maxDim: Arg(1, "nullable:number")},
  407. response: RetVal("imageData")
  408. },
  409. resolveRelativeURL: {
  410. request: {url: Arg(0, "string"), node: Arg(1, "nullable:domnode")},
  411. response: {value: RetVal("string")}
  412. },
  413. pickColorFromPage: {
  414. request: {options: Arg(0, "nullable:json")},
  415. response: {}
  416. },
  417. cancelPickColorFromPage: {
  418. request: {},
  419. response: {}
  420. }
  421. }
  422. });
  423. exports.inspectorSpec = inspectorSpec;