Expose console and InstallTrigger as content objects (bug 631225, r=dtownsend). a=blocker

This commit is contained in:
Andreas Gal 2011-02-07 23:18:18 -08:00
parent ae33a28f03
commit 3222023138
3 changed files with 50 additions and 21 deletions

View File

@ -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;
},
/**

View File

@ -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

View File

@ -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;
};
/**