Bug 1507844 - Push the devtools.inspector.flexboxHighlighter.enabled pref in browser_...
[gecko.git] / browser / actors / PageStyleChild.jsm
blob30c6deaa614398d9730d9106b73600205f542328
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/. */
5 ChromeUtils.import("resource://gre/modules/Services.jsm");
7 var EXPORTED_SYMBOLS = ["PageStyleChild"];
9 ChromeUtils.import("resource://gre/modules/ActorChild.jsm");
11 class PageStyleChild extends ActorChild {
12   getViewer(content) {
13     return content.docShell.contentViewer;
14   }
16   sendStyleSheetInfo(mm) {
17     let content = mm.content;
18     let filteredStyleSheets = this._filterStyleSheets(this.getAllStyleSheets(content), content);
20     mm.sendAsyncMessage("PageStyle:StyleSheets", {
21       filteredStyleSheets,
22       authorStyleDisabled: this.getViewer(content).authorStyleDisabled,
23       preferredStyleSheetSet: content.document.preferredStyleSheetSet,
24     });
25   }
27   getAllStyleSheets(frameset) {
28     let selfSheets = Array.slice(frameset.document.styleSheets);
29     let subSheets = Array.map(frameset.frames, frame => this.getAllStyleSheets(frame));
30     return selfSheets.concat(...subSheets);
31   }
33   receiveMessage(msg) {
34     let content = msg.target.content;
35     switch (msg.name) {
36       case "PageStyle:Switch":
37         this.getViewer(content).authorStyleDisabled = false;
38         this._stylesheetSwitchAll(content, msg.data.title);
39         break;
41       case "PageStyle:Disable":
42         this.getViewer(content).authorStyleDisabled = true;
43         break;
44     }
46     this.sendStyleSheetInfo(msg.target);
47   }
49   handleEvent(event) {
50     let win = event.target.ownerGlobal;
51     if (win != win.top) {
52       return;
53     }
55     let mm = win.docShell.messageManager;
56     this.sendStyleSheetInfo(mm);
57   }
59   _stylesheetSwitchAll(frameset, title) {
60     if (!title || this._stylesheetInFrame(frameset, title)) {
61       this._stylesheetSwitchFrame(frameset, title);
62     }
64     for (let i = 0; i < frameset.frames.length; i++) {
65       // Recurse into sub-frames.
66       this._stylesheetSwitchAll(frameset.frames[i], title);
67     }
68   }
70   _stylesheetSwitchFrame(frame, title) {
71     var docStyleSheets = frame.document.styleSheets;
73     for (let i = 0; i < docStyleSheets.length; ++i) {
74       let docStyleSheet = docStyleSheets[i];
75       if (docStyleSheet.title) {
76         docStyleSheet.disabled = (docStyleSheet.title != title);
77       } else if (docStyleSheet.disabled) {
78         docStyleSheet.disabled = false;
79       }
80     }
81   }
83   _stylesheetInFrame(frame, title) {
84     return Array.some(frame.document.styleSheets, (styleSheet) => styleSheet.title == title);
85   }
87   _filterStyleSheets(styleSheets, content) {
88     let result = [];
90     for (let currentStyleSheet of styleSheets) {
91       if (!currentStyleSheet.title)
92         continue;
94       // Skip any stylesheets that don't match the screen media type.
95       if (currentStyleSheet.media.length > 0) {
96         let mediaQueryList = currentStyleSheet.media.mediaText;
97         if (!content.matchMedia(mediaQueryList).matches) {
98           continue;
99         }
100       }
102       let URI;
103       try {
104         if (!currentStyleSheet.ownerNode ||
105             // special-case style nodes, which have no href
106             currentStyleSheet.ownerNode.nodeName.toLowerCase() != "style") {
107           URI = Services.io.newURI(currentStyleSheet.href);
108         }
109       } catch (e) {
110         if (e.result != Cr.NS_ERROR_MALFORMED_URI) {
111           throw e;
112         }
113         continue;
114       }
116       // We won't send data URIs all of the way up to the parent, as these
117       // can be arbitrarily large.
118       let sentURI = (!URI || URI.scheme == "data") ? null : URI.spec;
120       result.push({
121         title: currentStyleSheet.title,
122         disabled: currentStyleSheet.disabled,
123         href: sentURI,
124       });
125     }
127     return result;
128   }