Bug 1347977 - Add docs about highlighters to /devtools/docs; r=me draft
authorPatrick Brosset <pbrosset@mozilla.com>
Thu, 16 Mar 2017 18:41:06 +0100
changeset 500143 5d2d0acab72034b56c1794d3e5c2ea0205369e65
parent 500137 247642cdf2563492c1e474a74893b9b13636a4f6
child 549546 df7f07e420c09d68aa2e8b17f3426cc4860dca16
push id49622
push userbmo:pbrosset@mozilla.com
push dateThu, 16 Mar 2017 17:45:00 +0000
reviewersme
bugs1347977
milestone55.0a1
Bug 1347977 - Add docs about highlighters to /devtools/docs; r=me MozReview-Commit-ID: 7Qdi9i2iaN8
devtools/docs/SUMMARY.md
devtools/docs/highlighters.md
devtools/docs/img/box-model-highlighter-screenshot.png
devtools/docs/inspector.md
--- a/devtools/docs/SUMMARY.md
+++ b/devtools/docs/SUMMARY.md
@@ -1,13 +1,15 @@
 
 # Summary
 
 * [Tool Architectures](tools.md)
-  * [Inspector](inspector-panel.md)
+  * [Inspector](inspector.md)
+    * [Panel Architecture](inspector-panel.md)
+    * [Highlighters](highlighters.md)
   * [Memory](memory-panel.md)
   * [Debugger](debugger-panel.md)
   * [Responsive Design Mode](responsive-design-mode.md)
 * [Frontend](frontend.md)
   * [Panel SVGs](svgs.md)
   * [React](react.md)
     * [Guidelines](react-guidelines.md)
     * [Tips](react-tips.md)
new file mode 100644
--- /dev/null
+++ b/devtools/docs/highlighters.md
@@ -0,0 +1,201 @@
+# Highlighters
+
+This article provides technical documentation about DevTools highlighters.
+
+By highlighter, we mean anything that DevTools displays on top of the content page, in order to highlight an element, a set of elements or shapes to users.
+
+The most obvious form of highlighter is the box-model highlighter, whose job is to display the 4 box-model regions on top of a given element in the content page, as illustrated in the following screen capture:
+
+![Box-model highlighter](./img/box-model-highlighter-screenshot.png)
+
+But there can be a wide variety of highlighters. In particular, highlighters are a pretty good way to give detailed information about:
+
+* the exact form of a css shape,
+* how a css transform applied to an element,
+* where are the color stops of a css gradient,
+* which are all the elements that match a given selector,
+* ...
+
+## Using highlighters
+
+Highlighters run on the debuggee side, not on the toolbox side. This is so that it's possible to highlight elements on a remote device for instance. This means you need to go through the [Remote Debugging Protocol](protocol.md) to use a highlighter.
+
+### The highlighter utils
+
+The easiest way to access the highlighters from toolbox-side DevTools code is by using the highlighter utils, which is conveniently available on the toolbox object. Here is how you can access the utils:
+
+```js
+let hUtils = toolbox.highlighterUtils;
+```
+
+Since the box-model highlighter is the most used type of highlighter (for instance it's displayed when you move your mouse over nodes in the inspector), the utils provides a set of methods to interact with it:
+
+| Method                             | Description                                                                                                                                                                                                                   |
+|------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `startPicker()`                    | Starts the node picker mode which will highlight every node you hover over in the page, and will change the current node selection in the inspector on click. “picker-node-hovered” and “picker-node-picked” events are sent. |
+| `stopPicker()`                     | Stops the node picker mode.                                                                                                                                                                                                   |
+| `highlightNodeFront(nodeFront)`    | Display the box-model highlighter on a given node. NodeFront objects are what the WalkerActor return.                                                                                                                         |
+| `highlightDomValueGrip(valueGrip)` | Display the box-model highlighter on a given node, represented by a debugger object value grip.                                                                                                                               |
+| `unhighlight()`                    | Hide the box-model highlighter.                                                                                                                                                                                               |
+
+But the box-model highlighter isn't the only type of highlighter, so the highlighter utils provides the following method:
+
+| Method                           | Description                                                                                                                                                                                                                                                                                                   |
+|----------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `getHighlighterByType(typeName)` | Instantiate a new highlighter, given its type (as a String). At the time of writing, the available types of highlighters are: `BoxModelHighlighter`, `CssTransformHighlighter`, `SelectorHighlighter` and `RectHighlighter`. This returns a promise that resolves to the new instance of [protocol.js](https://wiki.mozilla.org/DevTools/protocol.js) actor. |
+
+### The highlighter API
+
+When getting a highlighter via `toolbox.highlighterUtils.getHighlighterByType(typeName)`, the right type of highlighter will be instantiated on the server-side and will be wrapped into a `CustomHighlighterActor` and that's what will be returned to the caller. This means that all types of highlighters share the same following API:
+
+| Method                                   | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
+|------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `show(NodeActor node[, Object options])` | Highlighters are hidden by default. Calling this method is what makes them visible. The first, mandatory, parameter should be a NodeActor. NodeActors are what the WalkerActor return. It's easy to get a NodeActor for an existing DOM node. For example `toolbox.walker.querySelector(toolbox.walker.rootNode, "css selector")` resolves to a NodeFront (the client-side version of the NodeActor) which can be used as the first parameter. The second, optional, parameter depends on the type of highlighter being used. |
+| `hide()`                                 | Hides the highlighter.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
+| `finalize()`                             | Destroys the highlighter.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
+
+## Creating new highlighters
+
+Before digging into how one goes about adding a new type of highlighter to the DevTools, it is worth understanding how are highlighters displayed in the page.
+
+### Inserting content in the page
+
+Highlighters use web technology themselves to display the required information on screen. For instance, the box-model highlighter uses SVG to draw the margin, border, padding and content regions over the highlighted node.
+
+This means the highlighter content needs to be inserted in the page, but in a non-intrusive way. Indeed, the DevTools should never alter the page unless the alteration was done by the user (like changing the DOM using the inspector or a CSS rule via the style-editor for example). So simply appending the highlighter's markup in the content document is not an option.
+
+Furthermore, highlighters not only need to work with Firefox Desktop, but they should work just as well on Firefox OS, Firefox for Android, and more generally anything that runs the Gecko rendering engine. Therefore appending the highlighter's markup to the browser chrome XUL structure isn't an option either.
+
+To this end, DevTools highlighters make use of a (chrome-only) API:
+
+```
+ /**
+  * Chrome document anonymous content management.
+  * This is a Chrome-only API that allows inserting fixed positioned anonymous
+  * content on top of the current page displayed in the document.
+  * The supplied content is cloned and inserted into the document's CanvasFrame.
+  * Note that this only works for HTML documents.
+  */
+ partial interface Document {
+   /**
+    * Deep-clones the provided element and inserts it into the CanvasFrame.
+    * Returns an AnonymousContent instance that can be used to manipulate the
+    * inserted element.
+    */
+   [ChromeOnly, NewObject, Throws]
+   AnonymousContent insertAnonymousContent(Element aElement);
+
+   /**
+    * Removes the element inserted into the CanvasFrame given an AnonymousContent
+    * instance.
+    */
+   [ChromeOnly, Throws]
+   void removeAnonymousContent(AnonymousContent aContent);
+ };
+```
+
+Using this API, it is possible for chrome-privileged JS to insert arbitrary DOM elements on top of the content page.
+
+Technically, the DOM element is inserted into the `CanvasFrame` of the document. The `CanvasFrame` is part of the rendered frame tree and the DOM element is part of the native anonymous elements of the `CanvasFrame`.
+
+Consider the following simple example:
+
+```js
+ let el = document.createElement("div");
+ el.textContent = "My test element";
+ let insertedEl = document.insertAnonymousContent(el);
+```
+
+In this example, the test DIV will be inserted in the page, and will be displayed on top of everything else, in a way that doesn't impact the current layout.
+
+### The AnonymousContent API
+
+In the previous example, the returned `insertedEl` object isn't a DOM node, and it certainly is not `el`. It is a new object, whose type is `AnonymousContent` ([see the WebIDL here](http://mxr.mozilla.org/mozilla-central/source/dom/webidl/AnonymousContent.webidl?force=1)).
+
+Because of the way content is inserted into the page, it isn't wanted to give consumers a direct reference to the inserted DOM node. This is why `document.insertAnonymousContent(el)` actually **clones** `el` and returns a new object whose API lets consumers make changes to the inserted element in a way that never gives back a reference to the inserted DOM node.
+
+### CanvasFrameAnonymousContentHelper
+
+In order to help with the API described in the previous section, the `CanvasFrameAnonymousContentHelper` class was introduced.
+
+Its goal is to provide a simple way for highlighters to insert their content into the page and modify it dynamically later. One of its goal is also to re-insert the highlighters' content on page navigation. Indeed, the frame tree is destroyed when the page is navigated away from since it represents the document element.
+
+Using this helper is quite simple:
+
+```js
+let helper = new CanvasFrameAnonymousContentHelper(tabActor, this.buildMarkup.bind(this));
+```
+
+It only requires a `tabActor`, which highlighters get when they are instantiated, and a callback function that will be used to create and insert the content the first time the highlighter is shown, and every time there's a page navigation.
+
+The returned object provides the following API:
+
+| Method                                    | Description                                                |
+|-------------------------------------------|------------------------------------------------------------|
+| `getTextContentForElement(id)`            | Get the textContent of an element given its ID.            |
+| `setTextContentForElement(id, text)`      | Set the textContent of an element given its ID.            |
+| `setAttributeForElement(id, name, value)` | Set an attribute value of an element given its ID.         |
+| `getAttributeForElement(id, name)`        | Get an attribute value of an element given its ID.         |
+| `removeAttributeForElement(id, name)`     | Remove an attribute of an element given its ID.            |
+| `content`                                 | This property returns the wrapped AnonymousContent object. |
+| `destroy()`                               | Destroy the helper instance.                               |
+
+  ### Creating a new highlighter class
+
+A good way to get started is by taking a look at [existing highlighters here](http://mxr.mozilla.org/mozilla-central/source/toolkit/devtools/server/actors/highlighter.js).
+
+Here is some boilerplate code for a new highlighter class:
+
+```js
+ function MyNewHighlighter(tabActor) {
+   this.doc = tabActor.window.document;
+   this.markup = new CanvasFrameAnonymousContentHelper(tabActor, this._buildMarkup.bind(this));
+ }
+
+ MyNewHighlighter.prototype = {
+   destroy: function() {
+     this.doc = null;
+     this.markup.destroy();
+   },
+
+   _buildMarkup: function() {
+     let container = this.doc.createElement("div");
+     container.innerHTML = '<div id="new-highlighted-" style="display:none;">';
+     return container;
+   },
+
+   show: function(node, options) {
+     this.markup.removeAttributeForElement("new-highlighted-el", "style");
+   },
+
+   hide: function() {
+     this.markup.setAttributeForElement("new-highlighted-el", "style", "display:none;");
+   }
+ };
+```
+
+In most situations, the `container` returned by `_buildMarkup` will be absolutely positioned, and will need to contain elements with IDs, so that these can then later be moved, resized, hidden or shown in `show` and `hide` using the AnonymousContent API.
+
+### The AutoRefreshHighlighter parent class
+
+It is worth mentioning this class as it may be a useful parent class to inherit a new highlighter from in some situations.
+
+If the new highlighter's job is to highlight an element in the DOM, then it most likely should inherit from `AutoRefreshHighlighter`.
+
+The `AutoRefreshHighlighter` class updates itself in a loop, checking if the currently highlighted node's geometry has changed since the last iteration. This is useful to make sure the highlighter **follows** the highlighted node around, in case the layout around it changes, or in case it is an animated node.
+
+Sub classes must implement the following methods:
+
+| Method      | Description                                                                         |
+|-------------|-------------------------------------------------------------------------------------|
+| `_show()`   | Called when the highlighter should be shown.                                        |
+| `_update()` | Called while the highlighter is shown and the geometry of the current node changes. |
+| `_hide()`   | Called when the highlighter should be hidden.                                       |
+
+Sub classes will have access to the following properties:
+
+| Property            | Description                               |
+|---------------------|-------------------------------------------|
+| `this.currentNode`  | The node to be shown.                     |
+| `this.currentQuads` | All of the node's box model region quads. |
+| `this.win`          | The current window                        |
new file mode 100644
index 0000000000000000000000000000000000000000..8311b62ea093d07d971d0b04d1c15cbc80accf01
GIT binary patch
literal 26168
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
HW*`3ty6Wj|
new file mode 100644
--- /dev/null
+++ b/devtools/docs/inspector.md
@@ -0,0 +1,2 @@
+
+These files provide information about the Inspector panel architecture.