[Pkg-mozext-commits] [adblock-plus-element-hiding-helper] 10/10: Issue 2816 - Restore Preview functionality

David Prévot taffit at moszumanska.debian.org
Fri Jan 22 01:02:31 UTC 2016


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to tag pre-hg-git-0.8
in repository adblock-plus-element-hiding-helper.

commit b8387483c733bfcf355cb3f69166caea255151b6
Author: Wladimir Palant <trev at adblockplus.org>
Date:   Thu Jul 30 14:10:20 2015 +0200

    Issue 2816 - Restore Preview functionality
---
 chrome/content/actor.jsm      | 91 ++++++++++++++++++++++++++++++++++++-------
 chrome/content/composer.js    | 40 ++++++-------------
 chrome/content/composer.xul   |  6 +--
 chrome/content/frameScript.js | 15 +++++--
 lib/aardvark.js               |  9 +++--
 lib/inspectorObserver.js      |  3 +-
 6 files changed, 110 insertions(+), 54 deletions(-)

diff --git a/chrome/content/actor.jsm b/chrome/content/actor.jsm
index b3de0e7..f5b1e6f 100644
--- a/chrome/content/actor.jsm
+++ b/chrome/content/actor.jsm
@@ -4,13 +4,20 @@
  * http://mozilla.org/MPL/2.0/.
  */
 
-let EXPORTED_SYMBOLS = ["shutdown", "getNodeInfo"];
+let EXPORTED_SYMBOLS = ["shutdown", "getNodeInfo", "togglePreview",
+                        "forgetNode"];
 
 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 {Services} = Cu.import("resource://gre/modules/Services.jsm", {});
+
+let processID = Services.appinfo.processID;
+let maxNodeID = 0;
+let nodes = new Map();
+
 let name = "elemhidehelper";
 let actor = {
   constructorFun: Actor,
@@ -26,8 +33,19 @@ let shutdown = (function()
   return function()
   {
     if (!executed)
-      DebuggerServer.removeTabActor(actor);
-    executed = true;
+    {
+      executed = true;
+      try
+      {
+        DebuggerServer.removeTabActor(actor);
+      }
+      catch (e)
+      {
+        // The call above will throw in the content process despite succeeding,
+        // see https://bugzilla.mozilla.org/show_bug.cgi?id=1189780.
+        Cu.reportError(e);
+      }
+    }
   }
 })();
 
@@ -40,28 +58,31 @@ Actor.prototype = {
     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);
+      return getNodeInfo(nodeActor ? nodeActor.rawNode: null);
     }
   }
 };
 
 function getNodeInfo(node)
 {
-  return {
-    host: node.ownerDocument.defaultView.location.hostname,
-    nodeData: getNodeData(node)
-  };
+  let nodeData = getNodeData(node);
+  if (nodeData)
+  {
+    let nodeID = processID + "-" + (++maxNodeID);
+    nodes.set(nodeID, {document: node.ownerDocument, style: null});
+    return {
+      host: node.ownerDocument.defaultView.location.hostname,
+      nodeData: nodeData,
+      nodeID: nodeID
+    };
+  }
+
+  return {};
 }
 
 function getNodeData(node, parentNode)
 {
-  if (!node)
+  if (!node || node.nodeType != Ci.nsIDOMNode.ELEMENT_NODE)
     return null;
 
   let result = {};
@@ -108,3 +129,43 @@ function getNodeData(node, parentNode)
   result.customCSS = {selected: "", checked: false};
   return result;
 }
+
+function togglePreview(nodeID, stylesheetData)
+{
+  let context = nodes.get(nodeID);
+  if (!context)
+    return;
+
+  if (stylesheetData)
+  {
+    if (!context.style || !context.style.parentNode)
+    {
+      context.style = context.document.createElementNS(
+          "http://www.w3.org/1999/xhtml", "style");
+      context.style.setAttribute("type", "text/css");
+      context.document.documentElement.appendChild(context.style);
+    }
+    context.style.textContent = stylesheetData;
+  }
+  else
+  {
+    try
+    {
+      if (context.style && context.style.parentNode)
+        context.style.parentNode.removeChild(context.style);
+      context.style = null;
+    }
+    catch (e)
+    {
+      // If the window was closed (reloaded) we end up with a dead object
+      // reference (https://bugzilla.mozilla.org/show_bug.cgi?id=695480). Just
+      // forget this node then.
+      forgetNode(nodeID);
+    }
+  }
+}
+
+function forgetNode(nodeID)
+{
+  nodes.delete(nodeID);
+}
diff --git a/chrome/content/composer.js b/chrome/content/composer.js
index 1b8c5e9..a04e8a7 100644
--- a/chrome/content/composer.js
+++ b/chrome/content/composer.js
@@ -8,12 +8,12 @@ let {Prefs} = require("prefs");
 
 let domainData;
 let nodeData;
+let nodeID;
 let selectedNode = null;
 let advancedMode = false;
 let treeView = null;
 let stylesheetData;
 let previewStyle = null;
-let doc;
 
 let abpURL = Cc["@adblockplus.org/abp/public;1"].getService(Ci.nsIURI);
 Cu.import(abpURL.spec);
@@ -84,8 +84,8 @@ function TreeView_getCellProperties(row, col) {
 
 function init()
 {
-  nodeData = window.arguments[0];
-  let host = window.arguments[1];
+  let host;
+  ({host, nodeData, nodeID} = window.arguments[0]);
 
   // Check whether element hiding group is disabled
   let subscription = AdblockPlus.getSubscription("~eh~");
@@ -311,8 +311,8 @@ function updateExpression()
   if (tree.view && tree.view.selection)
     tree.treeBoxObject.invalidateRow(tree.view.selection.currentIndex);
 
-  if (previewStyle)
-    previewStyle.textContent = stylesheetData;
+  if (document.getElementById("preview").checked)
+    togglePreview(true);
 }
 
 function escapeChar(dummy, match)
@@ -491,29 +491,13 @@ function fillAttributes(nodeData)
   }
 }
 
-function togglePreview(preview) {
-  if (preview) {
-    if (!previewStyle || !previewStyle.parentNode) {
-      previewStyle = doc.createElementNS("http://www.w3.org/1999/xhtml", "style");
-      previewStyle.setAttribute("type", "text/css");
-      doc.documentElement.appendChild(previewStyle);
-    }
-    previewStyle.textContent = stylesheetData;
-  }
-  else {
-    try
-    {
-      if (previewStyle && previewStyle.parentNode)
-        previewStyle.parentNode.removeChild(previewStyle);
-    }
-    catch (e)
-    {
-      // if the window was closed (reloaded) we end up with dead object reference
-      // https://bugzilla.mozilla.org/show_bug.cgi?id=695480
-      // just ignore this case
-    }
-    previewStyle = null;
-  }
+function togglePreview(preview, forgetNode)
+{
+  Services.mm.broadcastAsyncMessage("ElemHideHelper:Preview", {
+    nodeID: nodeID,
+    stylesheetData: preview ? stylesheetData : null,
+    forgetNode: !!forgetNode
+  });
 }
 
 function changeDomain(node) {
diff --git a/chrome/content/composer.xul b/chrome/content/composer.xul
index 4e57dbc..548571f 100644
--- a/chrome/content/composer.xul
+++ b/chrome/content/composer.xul
@@ -12,10 +12,10 @@
 <dialog id="ehh-composer"
     xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
     title="&dialog.title;"
-    onload="init()"
+    onload="init();"
     ondialogaccept="addExpression();"
     ondialogdisclosure="setAdvancedMode(!advancedMode);"
-    onunload="togglePreview(false);"
+    onunload="togglePreview(false, true);"
     buttons="accept,cancel,disclosure"
     width="600px"
     height="400px"
@@ -28,7 +28,7 @@
     windowtype="ehh:composer">
   <script type="application/x-javascript;version=1.7" src="common.js"/>
   <script type="application/x-javascript;version=1.7" src="composer.js"/>
-  
+
   <description id="groupDisabledWarning" hidden="true">&groupDisabled.warning;</description>
 
   <vbox id="expressionBox">
diff --git a/chrome/content/frameScript.js b/chrome/content/frameScript.js
index 7763553..8522e70 100644
--- a/chrome/content/frameScript.js
+++ b/chrome/content/frameScript.js
@@ -10,10 +10,11 @@
 
   let rand = Components.stack.filename.replace(/.*\?/, "");
   let module = "chrome://elemhidehelper/content/actor.jsm?" + rand;
-  let {shutdown, getNodeInfo} = Cu.import(module, {});
+  let {shutdown, getNodeInfo, togglePreview, forgetNode} = Cu.import(module, {});
 
   addMessageListener("ElemHideHelper:Shutdown", onShutdown);
   addMessageListener("ElemHideHelper:GetNodeInfo", onGetNodeInfo);
+  addMessageListener("ElemHideHelper:Preview", onTogglePreview);
 
   function onShutdown()
   {
@@ -21,11 +22,19 @@
     Cu.unload(module);
     removeMessageListener("ElemHideHelper:Shutdown", onShutdown);
     removeMessageListener("ElemHideHelper:GetNodeInfo", onGetNodeInfo);
+    removeMessageListener("ElemHideHelper:Preview", onTogglePreview);
   }
 
   function onGetNodeInfo(message)
   {
-    let info = getNodeInfo(message.objects.element);
-    message.objects.callback(info.nodeData, info.host);
+    let nodeInfo = getNodeInfo(message.objects.element);
+    message.objects.callback(JSON.stringify(nodeInfo));
+  }
+
+  function onTogglePreview(message)
+  {
+    togglePreview(message.data.nodeID, message.data.stylesheetData);
+    if (message.data.forgetNode)
+      forgetNode(message.data.nodeID);
   }
 })();
diff --git a/lib/aardvark.js b/lib/aardvark.js
index 2ed4add..f94d7d3 100644
--- a/lib/aardvark.js
+++ b/lib/aardvark.js
@@ -577,11 +577,14 @@ let Aardvark = exports.Aardvark =
       null,
       {
         element: elem,
-        callback: (nodeData, host) =>
+        callback: (response) =>
         {
+          response = JSON.parse(response);
+          if (!response.nodeData)
+            return;
+
           this.window.openDialog("chrome://elemhidehelper/content/composer.xul",
-              "_blank", "chrome,centerscreen,resizable,dialog=no", nodeData,
-              host);
+              "_blank", "chrome,centerscreen,resizable,dialog=no", response);
           this.quit();
         }
       }
diff --git a/lib/inspectorObserver.js b/lib/inspectorObserver.js
index c07d659..4dd53a9 100644
--- a/lib/inspectorObserver.js
+++ b/lib/inspectorObserver.js
@@ -65,8 +65,7 @@ let InspectorObserver =
             return;
 
           panelWindow.openDialog("chrome://elemhidehelper/content/composer.xul",
-              "_blank", "chrome,centerscreen,resizable,dialog=no",
-              response.nodeData, response.host);
+              "_blank", "chrome,centerscreen,resizable,dialog=no", response);
         });
       }
     }, false);

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mozext/adblock-plus-element-hiding-helper.git



More information about the Pkg-mozext-commits mailing list