setTimeout(() => { for (let uri of Object.keys(loader.sandboxes)) { try { Cu.nukeSandbox(loader.sandboxes[uri]); } catch (e) { // This will throw for shared sandboxes. } delete loader.sandboxes[uri]; delete loader.modules[uri]; } try { Cu.nukeSandbox(loader.sharedGlobalSandbox); } catch (e) { Cu.reportError(e); } resolve(); }, 1000);
dispose: function () { if (!this.sandbox) { return; } for (var p in this.sandbox) { if (this.sandbox.hasOwnProperty(p)) { delete this.sandbox[p]; } } if (typeof Cu.nukeSandbox === "function") { Cu.nukeSandbox(this.sandbox); } this.sandbox = null; }
destroy: function (onError) { // evaluate queue unload methods if any while (this._sandboxOnUnloadQueue && this._sandboxOnUnloadQueue.length > 0) { let cb = this._sandboxOnUnloadQueue.pop(); try { cb(); } catch (e) { console.error("Exception on DirectorScript Sandbox destroy", e); onError(e); } } Cu.nukeSandbox(this._sandbox); }
exec: function(args, context) { let numDebuggers = chromeDebuggers.length; if (numDebuggers == 0) { return l10n.lookup("calllogChromeStopNoLogging"); } for (let dbg of chromeDebuggers) { dbg.onEnterFrame = undefined; dbg.enabled = false; } for (let sandbox of sandboxes) { Cu.nukeSandbox(sandbox); } chromeDebuggers = []; sandboxes = []; return l10n.lookupFormat("calllogChromeStopReply", [ numDebuggers ]); }
exec: function(args, context) { let globalObj; let contentWindow = context.environment.window; if (args.sourceType == "jsm") { try { globalObj = Cu.import(args.source); } catch (e) { return l10n.lookup("callLogChromeInvalidJSM"); } } else if (args.sourceType == "content-variable") { if (args.source in contentWindow) { globalObj = Cu.getGlobalForObject(contentWindow[args.source]); } else { throw new Error(l10n.lookup("callLogChromeVarNotFoundContent")); } } else if (args.sourceType == "chrome-variable") { let chromeWin = context.environment.chromeDocument.defaultView; if (args.source in chromeWin) { globalObj = Cu.getGlobalForObject(chromeWin[args.source]); } else { return l10n.lookup("callLogChromeVarNotFoundChrome"); } } else { let chromeWin = context.environment.chromeDocument.defaultView; let sandbox = new Cu.Sandbox(chromeWin, { sandboxPrototype: chromeWin, wantXrays: false, sandboxName: "gcli-cmd-calllog-chrome" }); let returnVal; try { returnVal = Cu.evalInSandbox(args.source, sandbox, "ECMAv5"); sandboxes.push(sandbox); } catch(e) { // We need to save the message before cleaning up else e contains a dead // object. let msg = l10n.lookup("callLogChromeEvalException") + ": " + e; Cu.nukeSandbox(sandbox); return msg; } if (typeof returnVal == "undefined") { return l10n.lookup("callLogChromeEvalNeedsObject"); } globalObj = Cu.getGlobalForObject(returnVal); } let dbg = new Debugger(globalObj); chromeDebuggers.push(dbg); dbg.onEnterFrame = function(frame) { // BUG 773652 - Make the output from the GCLI calllog command nicer contentWindow.console.log(l10n.lookup("callLogChromeMethodCall") + ": " + this.callDescription(frame)); }.bind(this); let gBrowser = context.environment.chromeDocument.defaultView.gBrowser; let target = TargetFactory.forTab(gBrowser.selectedTab); gDevTools.showToolbox(target, "webconsole"); return l10n.lookup("calllogChromeStartReply"); },
after(exports, () => { driver = null; Cu.nukeSandbox(sandbox); });