From a178aa5e686b61580c3914b73eb62b2d8d27660a Mon Sep 17 00:00:00 2001 From: Andreas Gal Date: Mon, 7 Feb 2011 23:18:18 -0800 Subject: [PATCH] Expose console and InstallTrigger as content objects (bug 631225, r=dtownsend). --- dom/base/ConsoleAPI.js | 30 ++++++++++++++++--- .../console/hudservice/HUDService.jsm | 15 ++-------- .../extensions/content/extensions-content.js | 26 +++++++++++++--- 3 files changed, 50 insertions(+), 21 deletions(-) diff --git a/dom/base/ConsoleAPI.js b/dom/base/ConsoleAPI.js index 3403d2ad9c5..8fcd9ca0238 100644 --- a/dom/base/ConsoleAPI.js +++ b/dom/base/ConsoleAPI.js @@ -62,7 +62,7 @@ ConsoleAPI.prototype = { } let self = this; - return { + let chromeObject = { // window.console API log: function CA_log() { self.notifyObservers(id, "log", arguments); @@ -76,10 +76,32 @@ ConsoleAPI.prototype = { error: function CA_error() { self.notifyObservers(id, "error", arguments); }, - // many flavors of console objects exist on the web, so calling - // unimplemented methods shouldn't be fatal. See bug 614350 - __noSuchMethod__: function CA_nsm() {} + __exposedProps__: { + log: "r", + info: "r", + warn: "r", + error: "r" + } }; + + // We need to return an actual content object here, instead of a wrapped + // chrome object. This allows things like console.log.bind() to work. + let sandbox = Cu.Sandbox(aWindow); + let contentObject = Cu.evalInSandbox( + "(function(x) {\ + var bind = Function.bind;\ + var obj = {\ + log: bind.call(x.log, x),\ + info: bind.call(x.info, x),\ + warn: bind.call(x.warn, x),\ + error: bind.call(x.error, x),\ + __noSuchMethod__: function() {}\ + };\ + Object.defineProperty(obj, '__mozillaConsole__', { value: true });\ + return obj;\ + })", sandbox)(chromeObject); + + return contentObject; }, /** diff --git a/toolkit/components/console/hudservice/HUDService.jsm b/toolkit/components/console/hudservice/HUDService.jsm index ffd94a3dd1f..eb230fd5140 100644 --- a/toolkit/components/console/hudservice/HUDService.jsm +++ b/toolkit/components/console/hudservice/HUDService.jsm @@ -2696,20 +2696,9 @@ HUD_SERVICE.prototype = } } - // Need to detect that the console component has been paved over. Do this by - // checking whether its global object is equal to that of an object - // returned by our native ConsoleAPI nsIDOMGlobalPropertyInitializer. + // Need to detect that the console component has been paved over. let consoleObject = unwrap(aContentWindow).console; - let consoleGlobal = Cu.getGlobalForObject(consoleObject); - - let nativeConsoleObj = Cc["@mozilla.org/console-api;1"]. - createInstance(Ci.nsIDOMGlobalPropertyInitializer). - init(aContentWindow); - let nativeConsoleGlobal = Cu.getGlobalForObject(nativeConsoleObj); - - // Need a "===" comparison because backstagepass objects have strange - // behavior with == - if (consoleGlobal !== nativeConsoleGlobal) + if (!("__mozillaConsole__" in consoleObject)) this.logWarningAboutReplacedAPI(hudId); // register the controller to handle "select all" properly diff --git a/toolkit/mozapps/extensions/content/extensions-content.js b/toolkit/mozapps/extensions/content/extensions-content.js index bc065d323dc..04dcb5a8663 100644 --- a/toolkit/mozapps/extensions/content/extensions-content.js +++ b/toolkit/mozapps/extensions/content/extensions-content.js @@ -49,7 +49,7 @@ var gIoService = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService); function createInstallTrigger(window) { - return { + let chromeObject = { window: window, __exposedProps__: { @@ -61,9 +61,7 @@ function createInstallTrigger(window) { updateEnabled: "r", install: "r", installChrome: "r", - startSoftwareUpdate: "r", - toString: "r", - toSource: "r", // XXX workaround for bug 582100 + startSoftwareUpdate: "r" }, // == Public interface == @@ -188,6 +186,26 @@ function createInstallTrigger(window) { } } }; + + let sandbox = Cu.Sandbox(window); + let obj = Cu.evalInSandbox( + "(function (x) {\ + var bind = Function.bind;\ + return {\ + enabled: bind.call(x.enabled, x),\ + updateEnabled: bind.call(x.updateEnabled, x),\ + install: bind.call(x.install, x),\ + installChrome: bind.call(x.installChrome, x),\ + startSoftwareUpdate: bind.call(x.startSoftwareUpdate, x)\ + };\ + })", sandbox)(chromeObject); + + obj.SKIN = chromeObject.SKIN; + obj.LOCALE = chromeObject.LOCALE; + obj.CONTENT = chromeObject.CONTENT; + obj.PACKAGE = chromeObject.PACKAGE; + + return obj; }; /**