| Index: chrome/content/actor.jsm |
| =================================================================== |
| new file mode 100644 |
| --- /dev/null |
| +++ b/chrome/content/actor.jsm |
| @@ -0,0 +1,110 @@ |
| +/* |
| + * This Source Code is subject to the terms of the Mozilla Public License |
| + * version 2.0 (the "License"). You can obtain a copy of the License at |
| + * http://mozilla.org/MPL/2.0/. |
| + */ |
| + |
| +let EXPORTED_SYMBOLS = ["shutdown", "getNodeInfo"]; |
| + |
| +const Ci = Components.interfaces; |
| +const Cu = Components.utils; |
| + |
| +let {console} = Cu.import("resource://gre/modules/devtools/Console.jsm", {}); |
| +let {DebuggerServer} = Cu.import("resource://gre/modules/devtools/dbg-server.jsm", {}); |
| +let name = "elemhidehelper"; |
| +let actor = { |
| + constructorFun: Actor, |
| + constructorName: name, |
| + name: name |
| +}; |
| + |
| +DebuggerServer.addTabActor(actor, name); |
| + |
| +let shutdown = (function() |
| +{ |
| + let executed = false; |
| + return function() |
| + { |
| + if (!executed) |
| + DebuggerServer.removeTabActor(actor); |
| + executed = true; |
| + } |
| +})(); |
| + |
| +function Actor(connection, tabActor) |
| +{ |
| +} |
| + |
| +Actor.prototype = { |
| + requestTypes: { |
| + nodeinfo: function(request, connection) |
| + { |
| + let nodeActor = connection.getActor(request.nodeActor); |
| + if (!nodeActor || !nodeActor.rawNode || |
| + nodeActor.rawNode.nodeType != Ci.nsIDOMNode.ELEMENT_NODE) |
| + { |
| + return {}; |
| + } |
| + |
| + return getNodeInfo(nodeActor.rawNode); |
| + } |
| + } |
| +}; |
| + |
| +function getNodeInfo(node) |
| +{ |
| + return { |
| + host: node.ownerDocument.defaultView.location.hostname, |
| + nodeData: getNodeData(node) |
| + }; |
| +} |
| + |
| +function getNodeData(node, parentNode) |
| +{ |
| + if (!node) |
| + return null; |
| + |
| + let result = {}; |
| + result.tagName = {value: node.tagName, checked: false}; |
| + |
| + if (typeof parentNode != "undefined") |
| + result.parentNode = parentNode; |
| + else |
| + result.parentNode = getNodeData(node.parentElement); |
| + |
| + let prevSibling = node.previousElementSibling; |
| + result.prevSibling = getNodeData(prevSibling, result.parentNode); |
| + |
| + if (result.parentNode && !prevSibling) |
| + result.firstChild = {checked: false}; |
| + |
| + let nextSibling = node.nextElementSibling; |
| + if (result.parentNode && !nextSibling) |
| + result.lastChild = {checked: false}; |
| + |
| + result.attributes = []; |
| + for (let attribute of node.attributes) |
| + { |
| + let data = { |
| + name: attribute.name, |
| + value: attribute.value, |
| + selected: attribute.value, |
| + checked: false |
| + }; |
| + if (data.name == "id" || data.name == "class") |
| + result.attributes.unshift(data); |
| + else |
| + result.attributes.push(data); |
| + } |
| + |
| + if (result.attributes.length >= 2 && result.attributes[1].name == "id") |
| + { |
| + // Make sure ID attribute comes first |
| + let tmp = result.attributes[1]; |
| + result.attributes[1] = result.attributes[0]; |
| + result.attributes[0] = tmp; |
| + } |
| + |
| + result.customCSS = {selected: "", checked: false}; |
| + return result; |
| +} |