[Pkg-mozext-commits] [adblock-plus] 53/87: Issue 3853 - Use new messaging API for the first-run page

David Prévot taffit at moszumanska.debian.org
Sat Apr 30 17:59:07 UTC 2016


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

taffit pushed a commit to branch master
in repository adblock-plus.

commit 46459d2c025b5a102271f79c3b54a1d9944dcad7
Author: Wladimir Palant <trev at adblockplus.org>
Date:   Tue Mar 22 14:54:24 2016 +0100

    Issue 3853 - Use new messaging API for the first-run page
---
 ext/background.js          |  54 +++++----------
 ext/common.js              | 160 +++++++++++++--------------------------------
 ext/content.js             |  61 ++++++++++++++---
 lib/child/cssProperties.js |   8 +--
 lib/cssProperties.js       |  47 -------------
 lib/main.js                |   1 -
 6 files changed, 114 insertions(+), 217 deletions(-)

diff --git a/ext/background.js b/ext/background.js
index 6d8e78b..d631f57 100644
--- a/ext/background.js
+++ b/ext/background.js
@@ -17,31 +17,20 @@
 
 let {XPCOMUtils} = Cu.import("resource://gre/modules/XPCOMUtils.jsm", null);
 let {Services} = Cu.import("resource://gre/modules/Services.jsm", null);
-let {
-  _MessageProxy: MessageProxy,
-  _EventTarget: EventTarget,
-  _getSender: getSender
-} = require("ext_common");
-exports.onMessage = new EventTarget();
 
-let messageProxy = new MessageProxy(
-    Cc["@mozilla.org/globalmessagemanager;1"]
-      .getService(Ci.nsIMessageListenerManager),
-    exports.onMessage);
-onShutdown.add(function()
-{
-  messageProxy._disconnect();
-});
+let {_EventTarget: EventTarget} = require("ext_common");
+let {port} = require("messaging");
+
+exports.onMessage = new EventTarget(port);
 
-function Page(sender)
+function Page(windowID)
 {
-  this._sender = sender;
+  this._windowID = windowID;
 }
 Page.prototype = {
-  sendMessage: function(message)
+  sendMessage: function(payload)
   {
-    if (this._sender)
-      this._sender.sendAsyncMessage("AdblockPlus:Message", {payload: message});
+    port.emit("ext_message", {targetID: this._windowID, payload});
   }
 };
 exports.Page = Page;
@@ -50,48 +39,35 @@ function PageMap()
 {
   this._map = new Map();
 
-  Services.obs.addObserver(this, "message-manager-disconnect", true);
-  onShutdown.add(function()
-  {
-    Services.obs.removeObserver(this, "message-manager-disconnect");
-  }.bind(this));
+  port.on("ext_disconnect", windowID => this._map.delete(windowID));
 }
 PageMap.prototype = {
-  QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
-
-  observe: function(subject, topic, data)
-  {
-    if (topic == "message-manager-disconnect")
-      this._map.delete(subject);
-  },
-
   keys: function()
   {
     let result = [];
-    for (let sender of this._map.keys())
-      result.push(new Page(sender));
+    for (let windowID of this._map.keys())
+      result.push(new Page(windowID));
     return result;
   },
 
   get: function(page)
   {
-    return this._map.get(page._sender);
+    return this._map.get(page._windowID);
   },
 
   set: function(page, value)
   {
-    if (page._sender)
-      this._map.set(page._sender, value);
+    this._map.set(page._windowID, value);
   },
 
   has: function(page)
   {
-    return this._map.has(page._sender);
+    return this._map.has(page._windowID);
   },
 
   delete: function(page)
   {
-    this._map.delete(page._sender);
+    return this._map.delete(page._windowID);
   }
 };
 exports.PageMap = PageMap;
diff --git a/ext/common.js b/ext/common.js
index 5e1d7e3..c00cfff 100644
--- a/ext/common.js
+++ b/ext/common.js
@@ -17,140 +17,68 @@
 
 (function(global)
 {
-  const Ci = Components.interfaces;
-
   if (!global.ext)
     global.ext = {};
 
-  var holder = {
-    get Page()
-    {
-      delete this.Page;
-      this.Page = (typeof require == "function" ?
-          require("ext_background").Page :
-          function() {});
-      return this.Page;
-    }
-  };
+  var wrapperSymbol = Symbol("ext-wrapper");
 
-  var getSender = global.ext._getSender = function(origin)
+  function wrapFrames(frames)
   {
-    if (origin instanceof Ci.nsIDOMXULElement)
-      return origin.messageManager;
-    else if (origin instanceof Ci.nsIMessageSender)
-      return origin;
-    else
+    if (!frames.length)
       return null;
-  };
-
-  var MessageProxy = global.ext._MessageProxy = function(messageManager, messageTarget)
-  {
-    this._messageManager = messageManager;
-    this._messageTarget = messageTarget;
-    this._callbacks = new Map();
-    this._responseCallbackCounter = 0;
-
-    this._handleRequest = this._handleRequest.bind(this);
-    this._handleResponse = this._handleResponse.bind(this);
-    this._messageManager.addMessageListener("AdblockPlus:Message", this._handleRequest);
-    this._messageManager.addMessageListener("AdblockPlus:Response", this._handleResponse);
-  };
-  MessageProxy.prototype = {
-    _disconnect: function()
-    {
-      this._messageManager.removeMessageListener("AdblockPlus:Message", this._handleRequest);
-      this._messageManager.removeMessageListener("AdblockPlus:Response", this._handleResponse);
-    },
-
-    _sendResponse: function(sender, callbackId, message)
-    {
-      var response = {
-        callbackId: callbackId
-      };
-      if (typeof response != "undefined")
-        response.payload = message;
-      sender.sendAsyncMessage("AdblockPlus:Response", response);
-    },
-
-    _handleRequest: function(message)
-    {
-      var sender = getSender(message.target);
-      var request = message.data;
-
-      var sent = false;
-      var sendResponse;
-      if (sender && "callbackId" in request)
-      {
-        sendResponse = function(message)
-        {
-          this._sendResponse(sender, request.callbackId, message);
-          sent = true;
-        }.bind(this);
-      }
-      else
-        sendResponse = function() {};
 
-      var results = this._messageTarget._dispatch(request.payload, {
-        page: new holder.Page(sender)
-      }, sendResponse);
-      if (!sent && results.indexOf(true) == -1)
-        sendResponse(undefined);
-    },
-
-    _handleResponse: function(message)
-    {
-      var response = message.data;
-      var callback = this._callbacks.get(response.callbackId);
-      if (callback)
-      {
-        this._callbacks.delete(response.callbackId);
-        if ("payload" in response)
-          callback(response.payload);
-      }
-    },
+    // We have frames as an array, non-Firefox code expects url and parent
+    // properties however.
+    Object.defineProperty(frames, "url", {
+      enumerable: true,
+      get: () => new URL(frames[0].location)
+    });
 
-    sendMessage: function(message, responseCallback)
-    {
-      if (!(this._messageManager instanceof Ci.nsIMessageSender))
-        throw new Error("Not implemented");
+    Object.defineProperty(frames, "parent", {
+      enumerable: true,
+      get: () => wrapFrames(frames.slice(1))
+    });
 
-      var request = {
-        payload: message
-      };
-      if (responseCallback)
-      {
-        request.callbackId = ++this._responseCallbackCounter;
-        this._callbacks.set(request.callbackId, responseCallback);
-      }
-
-      this._messageManager.sendAsyncMessage("AdblockPlus:Message", request);
-    }
-  };
+    return frames;
+  }
 
-  var EventTarget = global.ext._EventTarget = function()
+  var EventTarget = global.ext._EventTarget = function(port, windowID)
   {
-    this._listeners = [];
+    this._port = port;
+    this._windowID = windowID;
   };
   EventTarget.prototype = {
     addListener: function(listener)
     {
-      if (this._listeners.indexOf(listener) == -1)
-        this._listeners.push(listener);
+      var wrapper = (message, sender) =>
+      {
+        if (this._windowID && this._windowID != message.targetID)
+          return undefined;
+
+        return new Promise((resolve, reject) =>
+        {
+          var sender = {};
+          if (message.senderID)
+          {
+            // We will only get here on the background side so we can access
+            // the Page object.
+            const Page = require("ext_background").Page;
+            sender.page = new Page(message.senderID);
+          }
+          if (message.frames)
+            sender.frame = wrapFrames(message.frames);
+          if (!listener(message.payload, sender, resolve))
+            resolve(undefined);
+        });
+      };
+      listener[wrapperSymbol] = wrapper;
+      this._port.on("ext_message", wrapper);
     },
+
     removeListener: function(listener)
     {
-      var idx = this._listeners.indexOf(listener);
-      if (idx != -1)
-        this._listeners.splice(idx, 1);
-    },
-    _dispatch: function()
-    {
-      var results = [];
-
-      for (var i = 0; i < this._listeners.length; i++)
-        results.push(this._listeners[i].apply(null, arguments));
-
-      return results;
+      if (listener[wrapperSymbol])
+        this._port.off("ext_message", listener[wrapperSymbol]);
     }
   };
 
diff --git a/ext/content.js b/ext/content.js
index 42a60c2..3b84e05 100644
--- a/ext/content.js
+++ b/ext/content.js
@@ -17,30 +17,71 @@
 
 (function(global)
 {
+  const Cc = Components.classes;
   const Ci = Components.interfaces;
   const Cu = Components.utils;
 
+  var Services = Cu.import("resource://gre/modules/Services.jsm", {}).Services;
+
+  function require(/**String*/ module)
+  {
+    var result = {};
+    result.wrappedJSObject = result;
+    Services.obs.notifyObservers(result, "adblockplus-require", module);
+    return result.exports;
+  }
+
+  function getOuterWindowID()
+  {
+    if (!getOuterWindowID.result)
+    {
+      getOuterWindowID.result = window.QueryInterface(Ci.nsIInterfaceRequestor)
+                                      .getInterface(Ci.nsIDOMWindowUtils)
+                                      .outerWindowID;
+    }
+    return getOuterWindowID.result;
+  }
+
+  const Port = require("messaging").Port;
+
   if (!global.ext)
     global.ext = {};
 
   /* Message passing */
-  global.ext.onMessage = new global.ext._EventTarget();
-
-  global.ext.backgroundPage = new global.ext._MessageProxy(
-      window.QueryInterface(Ci.nsIInterfaceRequestor)
-                              .getInterface(Ci.nsIDocShell)
-                              .QueryInterface(Ci.nsIInterfaceRequestor)
-                              .getInterface(Ci.nsIContentFrameMessageManager),
-      global.ext.onMessage);
+  var port = new Port(Cc["@mozilla.org/childprocessmessagemanager;1"]
+                        .getService(Ci.nsIMessageSender));
   window.addEventListener("unload", function()
   {
-    global.ext.backgroundPage._disconnect();
+    try
+    {
+      port.emit("ext_disconnect", getOuterWindowID());
+    }
+    catch (e)
+    {
+      // This is expected to fail if Adblock Plus was disabled/uninstalled with
+      // the page still open.
+    }
+    port.disconnect();
   }, false);
 
+  global.ext.onMessage = new global.ext._EventTarget(port, getOuterWindowID());
+  global.ext.backgroundPage = {
+    sendMessage: function(payload, responseCallback)
+    {
+      var message = {
+        senderID: getOuterWindowID(),
+        payload
+      };
+      if (typeof responseCallback == "function")
+        port.emitWithResponse("ext_message", message).then(responseCallback);
+      else
+        port.emit("ext_message", message);
+    }
+  };
+
   /* i18n */
   global.ext.i18n = (function()
   {
-    var Services = Cu.import("resource://gre/modules/Services.jsm", null).Services;
     var pageName = location.pathname.replace(/.*\//, "").replace(/\..*?$/, "");
 
     // Randomize URI to work around bug 719376
diff --git a/lib/child/cssProperties.js b/lib/child/cssProperties.js
index 2a27655..72da353 100644
--- a/lib/child/cssProperties.js
+++ b/lib/child/cssProperties.js
@@ -29,13 +29,13 @@
   let scope = {
     ext: {
       backgroundPage: {
-        sendMessage: function(data, callback)
+        sendMessage: function(payload, callback)
         {
-          data = {payload: data, frames: getFrames(senderWindow)};
+          let message = {payload, frames: getFrames(senderWindow)};
           if (typeof callback == "function")
-            port.emitWithResponse("cssPropertiesRequest", data).then(callback);
+            port.emitWithResponse("ext_message", message).then(callback);
           else
-            port.emit("cssPropertiesRequest", data);
+            port.emit("ext_message", message);
         }
       }
     }
diff --git a/lib/cssProperties.js b/lib/cssProperties.js
deleted file mode 100644
index b0e878b..0000000
--- a/lib/cssProperties.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * This file is part of Adblock Plus <https://adblockplus.org/>,
- * Copyright (C) 2006-2016 Eyeo GmbH
- *
- * Adblock Plus is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3 as
- * published by the Free Software Foundation.
- *
- * Adblock Plus is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-/**
- * @fileOverview This is merely forwarding messages from the content script to
- * message responder, these will hopefully be received directly soon.
- */
-
-"use strict";
-
-let {port} = require("messaging");
-let {onMessage} = require("ext_background");
-
-port.on("cssPropertiesRequest", ({payload, frames}) =>
-{
-  let result = undefined;
-
-  // HACK: Message responder doesn't care about sender.page but it passes
-  // sender.frame to whitelisting.checkWhitelisted(). Instead of converting
-  // our frame list into the format used in Chrome we keep it as is, then our
-  // whitelisting.checkWhitelisted() implementation won't need to convert it
-  // back. We merely have to set frames.url, message responder needs it.
-  frames.url = new URL(frames[0].location);
-  let sender = {
-    page: null,
-    frame: frames
-  };
-
-  onMessage._dispatch(payload, sender, data => {
-    result = data;
-  });
-  return result;
-});
diff --git a/lib/main.js b/lib/main.js
index dadca3a..742a9fb 100644
--- a/lib/main.js
+++ b/lib/main.js
@@ -32,7 +32,6 @@ require("sync");
 require("messageResponder");
 require("ui");
 require("objectTabs");
-require("cssProperties");
 
 function bootstrapChildProcesses()
 {

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



More information about the Pkg-mozext-commits mailing list