42 lines
1.4 KiB
JavaScript
42 lines
1.4 KiB
JavaScript
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||
|
"use strict";
|
||
|
|
||
|
const {Cc, Ci, Cu} = require("chrome");
|
||
|
const {readURISync} = require("sdk/net/url");
|
||
|
|
||
|
const systemPrincipal = Cc["@mozilla.org/systemprincipal;1"].
|
||
|
createInstance(Ci.nsIPrincipal);
|
||
|
|
||
|
|
||
|
const FakeCu = function() {
|
||
|
const sandbox = Cu.Sandbox(systemPrincipal, {wantXrays: false});
|
||
|
sandbox.toString = function() {
|
||
|
return "[object BackstagePass]";
|
||
|
}
|
||
|
this.sandbox = sandbox;
|
||
|
}
|
||
|
FakeCu.prototype = {
|
||
|
["import"](url, scope) {
|
||
|
const {sandbox} = this;
|
||
|
sandbox.__URI__ = url;
|
||
|
const target = Cu.createObjectIn(sandbox);
|
||
|
target.toString = sandbox.toString;
|
||
|
Cu.evalInSandbox(`(function(){` + readURISync(url) + `\n})`,
|
||
|
sandbox, "1.8", url).call(target);
|
||
|
// Borrowed from mozJSComponentLoader.cpp to match errors closer.
|
||
|
// https://github.com/mozilla/gecko-dev/blob/f6ca65e8672433b2ce1a0e7c31f72717930b5e27/js/xpconnect/loader/mozJSComponentLoader.cpp#L1205-L1208
|
||
|
if (!Array.isArray(target.EXPORTED_SYMBOLS)) {
|
||
|
throw Error("EXPORTED_SYMBOLS is not an array.");
|
||
|
}
|
||
|
|
||
|
for (let key of target.EXPORTED_SYMBOLS) {
|
||
|
scope[key] = target[key];
|
||
|
}
|
||
|
|
||
|
return target;
|
||
|
}
|
||
|
};
|
||
|
exports.FakeCu = FakeCu;
|