| Index: ext/content.js |
| =================================================================== |
| --- a/ext/content.js |
| +++ b/ext/content.js |
| @@ -12,40 +12,81 @@ |
| * 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/>. |
| */ |
| (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 |
| var stringBundle = Services.strings.createBundle("chrome://adblockplus/locale/" + pageName + |
| ".properties?" + Math.random()); |
| function getI18nMessage(key) |
| { |