| 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) | 
| { |