diff options
Diffstat (limited to 'devtools/server/actors/layout.js')
-rw-r--r-- | devtools/server/actors/layout.js | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/devtools/server/actors/layout.js b/devtools/server/actors/layout.js new file mode 100644 index 000000000..0b9242b5f --- /dev/null +++ b/devtools/server/actors/layout.js @@ -0,0 +1,131 @@ +/* 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 { Actor, ActorClassWithSpec } = require("devtools/shared/protocol"); +const { gridSpec, layoutSpec } = require("devtools/shared/specs/layout"); +const { getStringifiableFragments } = require("devtools/server/actors/utils/css-grid-utils"); + +/** + * Set of actors the expose the CSS layout information to the devtools protocol clients. + * + * The |Layout| actor is the main entry point. It is used to get various CSS + * layout-related information from the document. + * + * The |Grid| actor provides the grid fragment information to inspect the grid container. + */ + +/** + * The GridActor provides information about a given grid's fragment data. + */ +var GridActor = ActorClassWithSpec(gridSpec, { + /** + * @param {LayoutActor} layoutActor + * The LayoutActor instance. + * @param {DOMNode} containerEl + * The grid container element. + */ + initialize: function (layoutActor, containerEl) { + Actor.prototype.initialize.call(this, layoutActor.conn); + + this.containerEl = containerEl; + this.walker = layoutActor.walker; + }, + + destroy: function () { + Actor.prototype.destroy.call(this); + + this.containerEl = null; + this.gridFragments = null; + this.walker = null; + }, + + form: function (detail) { + if (detail === "actorid") { + return this.actorID; + } + + // Seralize the grid fragment data into JSON so protocol.js knows how to write + // and read the data. + let gridFragments = this.containerEl.getGridFragments(); + this.gridFragments = getStringifiableFragments(gridFragments); + + let form = { + actor: this.actorID, + gridFragments: this.gridFragments + }; + + return form; + }, +}); + +/** + * The CSS layout actor provides layout information for the given document. + */ +var LayoutActor = ActorClassWithSpec(layoutSpec, { + initialize: function (conn, tabActor, walker) { + Actor.prototype.initialize.call(this, conn); + + this.tabActor = tabActor; + this.walker = walker; + }, + + destroy: function () { + Actor.prototype.destroy.call(this); + + this.tabActor = null; + this.walker = null; + }, + + /** + * Returns an array of GridActor objects for all the grid containers found by iterating + * below the given rootNode. + * + * @param {Node|NodeActor} rootNode + * The root node to start iterating at. + * @return {Array} An array of GridActor objects. + */ + getGrids: function (rootNode) { + let grids = []; + + let treeWalker = this.walker.getDocumentWalker(rootNode); + while (treeWalker.nextNode()) { + let currentNode = treeWalker.currentNode; + + if (currentNode.getGridFragments && currentNode.getGridFragments().length > 0) { + let gridActor = new GridActor(this, currentNode); + grids.push(gridActor); + } + } + + return grids; + }, + + /** + * Returns an array of GridActor objects for all existing grid containers found by + * iterating below the given rootNode and optionally including nested frames. + * + * @param {NodeActor} rootNode + * @param {Boolean} traverseFrames + * Whether or not we should iterate through nested frames. + * @return {Array} An array of GridActor objects. + */ + getAllGrids: function (rootNode, traverseFrames) { + if (!traverseFrames) { + return this.getGridActors(rootNode); + } + + let grids = []; + for (let {document} of this.tabActor.windows) { + grids = [...grids, ...this.getGrids(document.documentElement)]; + } + + return grids; + }, + +}); + +exports.GridActor = GridActor; +exports.LayoutActor = LayoutActor; |