| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * This Source Code is subject to the terms of the Mozilla Public License | 2  * This Source Code is subject to the terms of the Mozilla Public License | 
| 3  * version 2.0 (the "License"). You can obtain a copy of the License at | 3  * version 2.0 (the "License"). You can obtain a copy of the License at | 
| 4  * http://mozilla.org/MPL/2.0/. | 4  * http://mozilla.org/MPL/2.0/. | 
| 5  */ | 5  */ | 
| 6 | 6 | 
| 7 const Ci = Components.interfaces; | 7 "use strict"; | 
| 8 const Cu = Components.utils; |  | 
| 9 | 8 | 
| 10 let console; | 9 let messageManager = require("messageManager"); | 
| 11 try | 10 let {forgetNode, getNodeById} = require("./nodeInfo"); | 
|  | 11 | 
|  | 12 messageManager.addMessageListener("ElemHideHelper:Preview", onTogglePreview); | 
|  | 13 onShutdown.add(() => | 
| 12 { | 14 { | 
| 13   // Gecko 44+ | 15   messageManager.removeMessageListener("ElemHideHelper:Preview", onTogglePreview
     ); | 
| 14   ({console} = Cu.import("resource://gre/modules/Console.jsm", {})); | 16 }); | 
| 15 } |  | 
| 16 catch (e) |  | 
| 17 { |  | 
| 18   ({console} = Cu.import("resource://gre/modules/devtools/Console.jsm", {})); |  | 
| 19 } |  | 
| 20 |  | 
| 21 let DebuggerServer; |  | 
| 22 try |  | 
| 23 { |  | 
| 24   // Firefox 44+ |  | 
| 25   let {require} = Cu.import("resource://devtools/shared/Loader.jsm", {}); |  | 
| 26   ({DebuggerServer} = require("devtools/server/main")); |  | 
| 27 } |  | 
| 28 catch (e) |  | 
| 29 { |  | 
| 30   ({DebuggerServer} = Cu.import("resource://gre/modules/devtools/dbg-server.jsm"
     , {})); |  | 
| 31 } |  | 
| 32 |  | 
| 33 let {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); |  | 
| 34 |  | 
| 35 let processID = Services.appinfo.processID; |  | 
| 36 let maxNodeID = 0; |  | 
| 37 let nodes = new Map(); |  | 
| 38 |  | 
| 39 let name = "elemhidehelper"; |  | 
| 40 let actor = { |  | 
| 41   constructorFun: Actor, |  | 
| 42   constructorName: name, |  | 
| 43   name: name |  | 
| 44 }; |  | 
| 45 |  | 
| 46 addMessageListener("ElemHideHelper:Shutdown", onShutdown); |  | 
| 47 addMessageListener("ElemHideHelper:GetNodeInfo", onGetNodeInfo); |  | 
| 48 addMessageListener("ElemHideHelper:Preview", onTogglePreview); |  | 
| 49 |  | 
| 50 DebuggerServer.addTabActor(actor, name); |  | 
| 51 |  | 
| 52 function onShutdown() |  | 
| 53 { |  | 
| 54   removeMessageListener("ElemHideHelper:Shutdown", onShutdown); |  | 
| 55   removeMessageListener("ElemHideHelper:GetNodeInfo", onGetNodeInfo); |  | 
| 56   removeMessageListener("ElemHideHelper:Preview", onTogglePreview); |  | 
| 57 |  | 
| 58   try |  | 
| 59   { |  | 
| 60     DebuggerServer.removeTabActor(actor); |  | 
| 61   } |  | 
| 62   catch (e) |  | 
| 63   { |  | 
| 64     // The call above will throw in the content process despite succeeding, |  | 
| 65     // see https://bugzilla.mozilla.org/show_bug.cgi?id=1189780. |  | 
| 66     Cu.reportError(e); |  | 
| 67   } |  | 
| 68 } |  | 
| 69 |  | 
| 70 function onGetNodeInfo(message) |  | 
| 71 { |  | 
| 72   if (Cu.isCrossProcessWrapper(message.objects.element)) |  | 
| 73     return; |  | 
| 74 |  | 
| 75   let nodeInfo = getNodeInfo(message.objects.element); |  | 
| 76   nodeInfo.messageId = message.data; |  | 
| 77   sendAsyncMessage("ElemHideHelper:GetNodeInfo:Response", nodeInfo); |  | 
| 78 } |  | 
| 79 | 17 | 
| 80 function onTogglePreview(message) | 18 function onTogglePreview(message) | 
| 81 { | 19 { | 
| 82   togglePreview(message.data.nodeID, message.data.stylesheetData); | 20   togglePreview(message.data.nodeID, message.data.stylesheetData); | 
| 83   if (message.data.forgetNode) | 21   if (message.data.forgetNode) | 
| 84     forgetNode(message.data.nodeID); | 22     forgetNode(message.data.nodeID); | 
| 85 } | 23 } | 
| 86 | 24 | 
| 87 function Actor(connection, tabActor) |  | 
| 88 { |  | 
| 89 } |  | 
| 90 |  | 
| 91 Actor.prototype = { |  | 
| 92   requestTypes: { |  | 
| 93     nodeinfo: function(request, connection) |  | 
| 94     { |  | 
| 95       let nodeActor = connection.getActor(request.nodeActor); |  | 
| 96       return getNodeInfo(nodeActor ? nodeActor.rawNode: null); |  | 
| 97     } |  | 
| 98   } |  | 
| 99 }; |  | 
| 100 |  | 
| 101 function getNodeInfo(node) |  | 
| 102 { |  | 
| 103   let nodeData = getNodeData(node); |  | 
| 104   if (nodeData) |  | 
| 105   { |  | 
| 106     let nodeID = processID + "-" + (++maxNodeID); |  | 
| 107     nodes.set(nodeID, {document: node.ownerDocument, style: null}); |  | 
| 108     return { |  | 
| 109       host: node.ownerDocument.defaultView.location.hostname, |  | 
| 110       nodeData: nodeData, |  | 
| 111       nodeID: nodeID |  | 
| 112     }; |  | 
| 113   } |  | 
| 114 |  | 
| 115   return {}; |  | 
| 116 } |  | 
| 117 |  | 
| 118 function getNodeData(node, parentNode) |  | 
| 119 { |  | 
| 120   if (!node || node.nodeType != Ci.nsIDOMNode.ELEMENT_NODE) |  | 
| 121     return null; |  | 
| 122 |  | 
| 123   let result = {}; |  | 
| 124   result.tagName = {value: node.tagName, checked: false}; |  | 
| 125 |  | 
| 126   if (typeof parentNode != "undefined") |  | 
| 127     result.parentNode = parentNode; |  | 
| 128   else |  | 
| 129     result.parentNode = getNodeData(node.parentElement); |  | 
| 130 |  | 
| 131   let prevSibling = node.previousElementSibling; |  | 
| 132   result.prevSibling = getNodeData(prevSibling, result.parentNode); |  | 
| 133 |  | 
| 134   if (result.parentNode && !prevSibling) |  | 
| 135     result.firstChild = {checked: false}; |  | 
| 136 |  | 
| 137   let nextSibling = node.nextElementSibling; |  | 
| 138   if (result.parentNode && !nextSibling) |  | 
| 139     result.lastChild = {checked: false}; |  | 
| 140 |  | 
| 141   result.attributes = []; |  | 
| 142   for (let attribute of node.attributes) |  | 
| 143   { |  | 
| 144     let data = { |  | 
| 145       name: attribute.name, |  | 
| 146       value: attribute.value, |  | 
| 147       selected: attribute.value, |  | 
| 148       checked: false |  | 
| 149     }; |  | 
| 150     if (data.name == "id" || data.name == "class") |  | 
| 151       result.attributes.unshift(data); |  | 
| 152     else |  | 
| 153       result.attributes.push(data); |  | 
| 154   } |  | 
| 155 |  | 
| 156   if (result.attributes.length >= 2 && result.attributes[1].name == "id") |  | 
| 157   { |  | 
| 158     // Make sure ID attribute comes first |  | 
| 159     let tmp = result.attributes[1]; |  | 
| 160     result.attributes[1] = result.attributes[0]; |  | 
| 161     result.attributes[0] = tmp; |  | 
| 162   } |  | 
| 163 |  | 
| 164   result.customCSS = {selected: "", checked: false}; |  | 
| 165   return result; |  | 
| 166 } |  | 
| 167 |  | 
| 168 function togglePreview(nodeID, stylesheetData) | 25 function togglePreview(nodeID, stylesheetData) | 
| 169 { | 26 { | 
| 170   let context = nodes.get(nodeID); | 27   let context = getNodeById(nodeID); | 
| 171   if (!context) | 28   if (!context) | 
| 172     return; | 29     return; | 
| 173 | 30 | 
| 174   if (stylesheetData) | 31   if (stylesheetData) | 
| 175   { | 32   { | 
| 176     if (!context.style || !context.style.parentNode) | 33     if (!context.style || !context.style.parentNode) | 
| 177     { | 34     { | 
| 178       context.style = context.document.createElementNS( | 35       context.style = context.document.createElementNS( | 
| 179           "http://www.w3.org/1999/xhtml", "style"); | 36           "http://www.w3.org/1999/xhtml", "style"); | 
| 180       context.style.setAttribute("type", "text/css"); | 37       context.style.setAttribute("type", "text/css"); | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 192     } | 49     } | 
| 193     catch (e) | 50     catch (e) | 
| 194     { | 51     { | 
| 195       // If the window was closed (reloaded) we end up with a dead object | 52       // If the window was closed (reloaded) we end up with a dead object | 
| 196       // reference (https://bugzilla.mozilla.org/show_bug.cgi?id=695480). Just | 53       // reference (https://bugzilla.mozilla.org/show_bug.cgi?id=695480). Just | 
| 197       // forget this node then. | 54       // forget this node then. | 
| 198       forgetNode(nodeID); | 55       forgetNode(nodeID); | 
| 199     } | 56     } | 
| 200   } | 57   } | 
| 201 } | 58 } | 
| 202 |  | 
| 203 function forgetNode(nodeID) |  | 
| 204 { |  | 
| 205   nodes.delete(nodeID); |  | 
| 206 } |  | 
| OLD | NEW | 
|---|