mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-19 16:25:38 +00:00
Bug 1050691 - Click on a function on the console should go to the debugger. r=jlongster
This commit is contained in:
parent
df467ff0d5
commit
1c7eb5ac99
@ -1543,7 +1543,7 @@ Scope.prototype = {
|
||||
*
|
||||
* @param string a
|
||||
* @param string b
|
||||
* @return number
|
||||
* @return number
|
||||
* -1 if a is less than b, 0 if no change in order, +1 if a is greater than 0
|
||||
*/
|
||||
_naturalSort: function(a,b) {
|
||||
|
@ -342,6 +342,10 @@ ConsoleOutput.prototype = {
|
||||
this.owner.owner.openLink.apply(this.owner.owner, arguments);
|
||||
},
|
||||
|
||||
openLocationInDebugger: function ({url, line}) {
|
||||
return this.owner.owner.viewSourceInDebugger(url, line);
|
||||
},
|
||||
|
||||
/**
|
||||
* Open the variables view to inspect an object actor.
|
||||
* @see JSTerm.openVariablesView() in webconsole.js
|
||||
@ -2496,6 +2500,8 @@ Widgets.JSObject.prototype = Heritage.extend(Widgets.BaseWidget.prototype,
|
||||
options.onClick = options.href ? this._onClickAnchor : this._onClick;
|
||||
}
|
||||
|
||||
options.onContextMenu = options.onContextMenu || this._onContextMenu;
|
||||
|
||||
let anchor = this.el("a", {
|
||||
class: options.className,
|
||||
draggable: false,
|
||||
@ -2504,6 +2510,8 @@ Widgets.JSObject.prototype = Heritage.extend(Widgets.BaseWidget.prototype,
|
||||
|
||||
this.message._addLinkCallback(anchor, options.onClick);
|
||||
|
||||
anchor.addEventListener("contextmenu", options.onContextMenu.bind(this));
|
||||
|
||||
if (options.appendTo) {
|
||||
options.appendTo.appendChild(anchor);
|
||||
} else if (!("appendTo" in options) && this.element) {
|
||||
@ -2513,16 +2521,38 @@ Widgets.JSObject.prototype = Heritage.extend(Widgets.BaseWidget.prototype,
|
||||
return anchor;
|
||||
},
|
||||
|
||||
openObjectInVariablesView: function()
|
||||
{
|
||||
this.output.openVariablesView({
|
||||
label: VariablesView.getString(this.objectActor, { concise: true }),
|
||||
objectActor: this.objectActor,
|
||||
autofocus: true,
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* The click event handler for objects shown inline.
|
||||
* @private
|
||||
*/
|
||||
_onClick: function()
|
||||
{
|
||||
this.output.openVariablesView({
|
||||
label: VariablesView.getString(this.objectActor, { concise: true }),
|
||||
objectActor: this.objectActor,
|
||||
autofocus: true,
|
||||
this.openObjectInVariablesView();
|
||||
},
|
||||
|
||||
_onContextMenu: function(ev) {
|
||||
// TODO offer a nice API for the context menu.
|
||||
// Probably worth to take a look at Firebug's way
|
||||
// https://github.com/firebug/firebug/blob/master/extension/content/firebug/chrome/menu.js
|
||||
let doc = ev.target.ownerDocument;
|
||||
let cmPopup = doc.getElementById("output-contextmenu");
|
||||
let openInVarViewCmd = doc.getElementById("menu_openInVarView");
|
||||
let openVarView = this.openObjectInVariablesView.bind(this);
|
||||
openInVarViewCmd.addEventListener("command", openVarView);
|
||||
openInVarViewCmd.removeAttribute("disabled");
|
||||
cmPopup.addEventListener("popuphiding", function onPopupHiding() {
|
||||
cmPopup.removeEventListener("popuphiding", onPopupHiding);
|
||||
openInVarViewCmd.removeEventListener("command", openVarView);
|
||||
openInVarViewCmd.setAttribute("disabled", "true");
|
||||
});
|
||||
},
|
||||
|
||||
@ -2690,6 +2720,16 @@ Widgets.ObjectRenderers.add({
|
||||
|
||||
this._text(")");
|
||||
},
|
||||
|
||||
_onClick: function () {
|
||||
let location = this.objectActor.location;
|
||||
if (location) {
|
||||
this.output.openLocationInDebugger(location);
|
||||
}
|
||||
else {
|
||||
this.openObjectInVariablesView();
|
||||
}
|
||||
}
|
||||
}); // Widgets.ObjectRenderers.byClass.Function
|
||||
|
||||
/**
|
||||
|
@ -124,6 +124,8 @@ support-files =
|
||||
test-bug-609872-cd-iframe-parent.html
|
||||
test-bug-609872-cd-iframe-child.html
|
||||
test-bug-989025-iframe-parent.html
|
||||
test-bug_1050691_click_function_to_source.html
|
||||
test-bug_1050691_click_function_to_source.js
|
||||
test-console-api-stackframe.html
|
||||
test_bug_1010953_cspro.html^headers^
|
||||
test_bug_1010953_cspro.html
|
||||
@ -387,3 +389,5 @@ skip-if = e10s # Bug 1042253 - webconsole e10s tests (Linux debug timeout)
|
||||
[browser_webconsole_bug_922212_console_dirxml.js]
|
||||
[browser_webconsole_shows_reqs_in_netmonitor.js]
|
||||
[browser_netmonitor_shows_reqs_in_webconsole.js]
|
||||
[browser_webconsole_bug_1050691_click_function_to_source.js]
|
||||
[browser_webconsole_context_menu_open_in_var_view.js]
|
||||
|
@ -0,0 +1,60 @@
|
||||
/* vim:set ts=2 sw=2 sts=2 et: */
|
||||
/* 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/. */
|
||||
|
||||
// Tests that clicking on a function displays its source in the debugger.
|
||||
|
||||
"use strict";
|
||||
|
||||
const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-bug_1050691_click_function_to_source.html";
|
||||
|
||||
let test = asyncTest(function*() {
|
||||
yield loadTab(TEST_URI);
|
||||
let hud = yield openConsole();
|
||||
|
||||
yield testWithoutDebuggerOpen(hud);
|
||||
|
||||
// Open the Debugger panel.
|
||||
let debuggerPanel = yield openDebugger();
|
||||
// And right after come back to the Console panel.
|
||||
yield openConsole();
|
||||
yield testWithDebuggerOpen(hud, debuggerPanel);
|
||||
});
|
||||
|
||||
function* testWithoutDebuggerOpen(hud) {
|
||||
let clickable = yield printFunction(hud);
|
||||
let onVariablesViewOpen = hud.jsterm.once("variablesview-fetched");
|
||||
synthesizeClick(clickable, hud);
|
||||
return onVariablesViewOpen;
|
||||
}
|
||||
|
||||
function* testWithDebuggerOpen(hud, debuggerPanel) {
|
||||
let clickable = yield printFunction(hud);
|
||||
let panelWin = debuggerPanel.panelWin;
|
||||
let onEditorLocationSet = panelWin.once(panelWin.EVENTS.EDITOR_LOCATION_SET);
|
||||
synthesizeClick(clickable, hud);
|
||||
yield onEditorLocationSet;
|
||||
ok(isDebuggerCaretPos(debuggerPanel, 7),
|
||||
"Clicking on a function should go to its source in the debugger view");
|
||||
}
|
||||
|
||||
function synthesizeClick(clickable, hud) {
|
||||
EventUtils.synthesizeMouse(clickable, 2, 2, {}, hud.iframeWindow);
|
||||
}
|
||||
|
||||
let printFunction = Task.async(function* (hud) {
|
||||
hud.jsterm.clearOutput();
|
||||
content.wrappedJSObject.foo();
|
||||
let [result] = yield waitForMessages({
|
||||
webconsole: hud,
|
||||
messages: [{
|
||||
category: CATEGORY_WEBDEV,
|
||||
severity: SEVERITY_LOG,
|
||||
}],
|
||||
});
|
||||
let msg = [...result.matched][0];
|
||||
let clickable = msg.querySelector("a");
|
||||
ok(clickable, "clickable item for object should exist");
|
||||
return clickable;
|
||||
});
|
@ -39,7 +39,7 @@ function test()
|
||||
|
||||
return deferred.promise;
|
||||
});
|
||||
})
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@ -65,7 +65,15 @@ function onExecuteGetName(aResults)
|
||||
ok(clickable, "clickable object found");
|
||||
|
||||
gJSTerm.once("variablesview-fetched", onGetNameFetch);
|
||||
EventUtils.synthesizeMouse(clickable, 2, 2, {}, gWebConsole.iframeWindow);
|
||||
let contextMenu =
|
||||
gWebConsole.iframeWindow.document.getElementById("output-contextmenu");
|
||||
waitForContextMenu(contextMenu, clickable, () => {
|
||||
let openInVarView = contextMenu.querySelector("#menu_openInVarView");
|
||||
ok(openInVarView.disabled === false,
|
||||
"the \"Open In Variables View\" context menu item should be clickable");
|
||||
// EventUtils.synthesizeMouseAtCenter seems to fail here in Mac OSX
|
||||
openInVarView.click();
|
||||
});
|
||||
}
|
||||
|
||||
function onGetNameFetch(aEvent, aVar)
|
||||
|
@ -0,0 +1,51 @@
|
||||
/* vim:set ts=2 sw=2 sts=2 et: */
|
||||
/* 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/. */
|
||||
|
||||
// Tests that the "Open in Variables View" context menu item is enabled
|
||||
// only for objects.
|
||||
|
||||
"use strict";
|
||||
|
||||
const TEST_URI = `data:text/html,<script>
|
||||
console.log("foo");
|
||||
console.log("foo", window);
|
||||
</script>`;
|
||||
|
||||
let test = asyncTest(function*() {
|
||||
yield loadTab(TEST_URI);
|
||||
let hud = yield openConsole();
|
||||
|
||||
let [result] = yield waitForMessages({
|
||||
webconsole: hud,
|
||||
messages: [{
|
||||
category: CATEGORY_WEBDEV,
|
||||
severity: SEVERITY_LOG,
|
||||
count: 2,
|
||||
text: /foo/
|
||||
}],
|
||||
});
|
||||
|
||||
let [msgWithText, msgWithObj] = [...result.matched];
|
||||
ok(msgWithText && msgWithObj, "Two messages should have appeared");
|
||||
|
||||
let contextMenu = hud.iframeWindow.
|
||||
document.getElementById("output-contextmenu");
|
||||
let openInVarViewItem = contextMenu.querySelector("#menu_openInVarView");
|
||||
let obj = msgWithObj.querySelector(".cm-variable");
|
||||
let text = msgWithText.querySelector(".console-string");
|
||||
|
||||
yield waitForContextMenu(contextMenu, obj, () => {
|
||||
ok(openInVarViewItem.disabled === false, "The \"Open In Variables View\" " +
|
||||
"context menu item should be available for objects");
|
||||
}, () => {
|
||||
ok(openInVarViewItem.disabled === true, "The \"Open In Variables View\" " +
|
||||
"context menu item should be disabled on popup hiding");
|
||||
});
|
||||
|
||||
yield waitForContextMenu(contextMenu, text, () => {
|
||||
ok(openInVarViewItem.disabled === true, "The \"Open In Variables View\" " +
|
||||
"context menu item should be disabled for texts");
|
||||
});
|
||||
});
|
@ -226,6 +226,8 @@ let closeConsole = Task.async(function* (aTab) {
|
||||
*/
|
||||
function waitForContextMenu(aPopup, aButton, aOnShown, aOnHidden)
|
||||
{
|
||||
let deferred = promise.defer();
|
||||
|
||||
function onPopupShown() {
|
||||
info("onPopupShown");
|
||||
aPopup.removeEventListener("popupshown", onPopupShown);
|
||||
@ -245,11 +247,10 @@ function waitForContextMenu(aPopup, aButton, aOnShown, aOnHidden)
|
||||
deferred.resolve(aPopup);
|
||||
}
|
||||
|
||||
let deferred = promise.defer();
|
||||
aPopup.addEventListener("popupshown", onPopupShown);
|
||||
|
||||
info("wait for the context menu to open");
|
||||
let eventDetails = { type: "contextmenu", button: 2};
|
||||
let eventDetails = {type: "contextmenu", button: 2};
|
||||
EventUtils.synthesizeMouse(aButton, 2, 2, eventDetails,
|
||||
aButton.ownerDocument.defaultView);
|
||||
return deferred.promise;
|
||||
@ -825,7 +826,7 @@ function openDebugger(aOptions = {})
|
||||
|
||||
let target = TargetFactory.forTab(aOptions.tab);
|
||||
let toolbox = gDevTools.getToolbox(target);
|
||||
let dbgPanelAlreadyOpen = toolbox.getPanel("jsdebugger");
|
||||
let dbgPanelAlreadyOpen = toolbox && toolbox.getPanel("jsdebugger");
|
||||
|
||||
gDevTools.showToolbox(target, "jsdebugger").then(function onSuccess(aToolbox) {
|
||||
let panel = aToolbox.getCurrentPanel();
|
||||
@ -856,6 +857,24 @@ function openDebugger(aOptions = {})
|
||||
return deferred.promise;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the caret in the debugger editor is placed at the specified
|
||||
* position.
|
||||
* @param aPanel The debugger panel.
|
||||
* @param {number} aLine The line number.
|
||||
* @param {number} [aCol] The column number.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
function isDebuggerCaretPos(aPanel, aLine, aCol = 1) {
|
||||
let editor = aPanel.panelWin.DebuggerView.editor;
|
||||
let cursor = editor.getCursor();
|
||||
|
||||
// Source editor starts counting line and column numbers from 0.
|
||||
info("Current editor caret position: " + (cursor.line + 1) + ", " +
|
||||
(cursor.ch + 1));
|
||||
return cursor.line == (aLine - 1) && cursor.ch == (aCol - 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait for messages in the Web Console output.
|
||||
*
|
||||
|
@ -0,0 +1,11 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html dir="ltr" xml:lang="en-US" lang="en-US">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Click on function should point to source</title>
|
||||
<!-- Any copyright is dedicated to the Public Domain.
|
||||
- http://creativecommons.org/publicdomain/zero/1.0/ -->
|
||||
<script type="text/javascript" src="test-bug_1050691_click_function_to_source.js"></script>
|
||||
</head>
|
||||
<body></body>
|
||||
</html>
|
@ -0,0 +1,10 @@
|
||||
/**
|
||||
* this
|
||||
* is
|
||||
* a
|
||||
* function
|
||||
*/
|
||||
function foo() {
|
||||
console.log(foo);
|
||||
}
|
||||
|
@ -76,6 +76,8 @@ function goUpdateConsoleCommands() {
|
||||
<menuitem id="menu_copyURL" label="©URLCmd.label;"
|
||||
accesskey="©URLCmd.accesskey;" command="consoleCmd_copyURL"
|
||||
selection="network" selectionType="single"/>
|
||||
<menuitem id="menu_openInVarView" label="&openInVarViewCmd.label;"
|
||||
accesskey="&openInVarViewCmd.accesskey;" disabled="true"/>
|
||||
<menuitem id="cMenu_copy"/>
|
||||
<menuitem id="cMenu_selectAll"/>
|
||||
</menupopup>
|
||||
|
@ -107,3 +107,5 @@
|
||||
<!ENTITY closeCmd.key "W">
|
||||
<!ENTITY findCmd.key "F">
|
||||
<!ENTITY clearOutputCtrl.key "L">
|
||||
<!ENTITY openInVarViewCmd.label "Open in Variables View">
|
||||
<!ENTITY openInVarViewCmd.accesskey "V">
|
||||
|
@ -25,7 +25,7 @@ function BrowserAddonActor(aConnection, aAddon) {
|
||||
this._addon = aAddon;
|
||||
this._contextPool = new ActorPool(this.conn);
|
||||
this.conn.addActorPool(this._contextPool);
|
||||
this._threadActor = null;
|
||||
this.threadActor = null;
|
||||
this._global = null;
|
||||
|
||||
this._shouldAddNewGlobalAsDebuggee = this._shouldAddNewGlobalAsDebuggee.bind(this);
|
||||
@ -55,7 +55,7 @@ BrowserAddonActor.prototype = {
|
||||
},
|
||||
|
||||
get attached() {
|
||||
return this._threadActor;
|
||||
return this.threadActor;
|
||||
},
|
||||
|
||||
get global() {
|
||||
@ -65,7 +65,7 @@ BrowserAddonActor.prototype = {
|
||||
get sources() {
|
||||
if (!this._sources) {
|
||||
dbg_assert(this.threadActor, "threadActor should exist when creating sources.");
|
||||
this._sources = new TabSources(this._threadActor, this._allowSource);
|
||||
this._sources = new TabSources(this.threadActor, this._allowSource);
|
||||
}
|
||||
return this._sources;
|
||||
},
|
||||
@ -135,11 +135,11 @@ BrowserAddonActor.prototype = {
|
||||
}
|
||||
|
||||
if (!this.attached) {
|
||||
this._threadActor = new AddonThreadActor(this.conn, this);
|
||||
this._contextPool.addActor(this._threadActor);
|
||||
this.threadActor = new AddonThreadActor(this.conn, this);
|
||||
this._contextPool.addActor(this.threadActor);
|
||||
}
|
||||
|
||||
return { type: "tabAttached", threadActor: this._threadActor.actorID };
|
||||
return { type: "tabAttached", threadActor: this.threadActor.actorID };
|
||||
},
|
||||
|
||||
onDetach: function BAA_onDetach() {
|
||||
@ -147,9 +147,9 @@ BrowserAddonActor.prototype = {
|
||||
return { error: "wrongState" };
|
||||
}
|
||||
|
||||
this._contextPool.removeActor(this._threadActor);
|
||||
this._contextPool.removeActor(this.threadActor);
|
||||
|
||||
this._threadActor = null;
|
||||
this.threadActor = null;
|
||||
this._sources = null;
|
||||
|
||||
return { type: "detached" };
|
||||
|
@ -18,7 +18,7 @@ function ChildProcessActor(aConnection) {
|
||||
this.conn = aConnection;
|
||||
this._contextPool = new ActorPool(this.conn);
|
||||
this.conn.addActorPool(this._contextPool);
|
||||
this._threadActor = null;
|
||||
this.threadActor = null;
|
||||
|
||||
// Use a see-everything debugger
|
||||
this.makeDebugger = makeDebugger.bind(null, {
|
||||
@ -56,8 +56,8 @@ ChildProcessActor.prototype = {
|
||||
|
||||
get sources() {
|
||||
if (!this._sources) {
|
||||
dbg_assert(this._threadActor, "threadActor should exist when creating sources.");
|
||||
this._sources = new TabSources(this._threadActor);
|
||||
dbg_assert(this.threadActor, "threadActor should exist when creating sources.");
|
||||
this._sources = new TabSources(this.threadActor);
|
||||
}
|
||||
return this._sources;
|
||||
},
|
||||
@ -68,9 +68,9 @@ ChildProcessActor.prototype = {
|
||||
this._contextPool.addActor(this._consoleActor);
|
||||
}
|
||||
|
||||
if (!this._threadActor) {
|
||||
this._threadActor = new ChromeDebuggerActor(this.conn, this);
|
||||
this._contextPool.addActor(this._threadActor);
|
||||
if (!this.threadActor) {
|
||||
this.threadActor = new ChromeDebuggerActor(this.conn, this);
|
||||
this._contextPool.addActor(this.threadActor);
|
||||
}
|
||||
|
||||
return {
|
||||
@ -78,7 +78,7 @@ ChildProcessActor.prototype = {
|
||||
name: "Content process",
|
||||
|
||||
consoleActor: this._consoleActor.actorID,
|
||||
chromeDebugger: this._threadActor.actorID,
|
||||
chromeDebugger: this.threadActor.actorID,
|
||||
|
||||
traits: {
|
||||
highlightable: false,
|
||||
|
@ -42,6 +42,8 @@ const OBJECT_PREVIEW_MAX_ITEMS = 10;
|
||||
* Increment the actor's grip depth
|
||||
* - decrementGripDepth
|
||||
* Decrement the actor's grip depth
|
||||
* - globalDebugObject
|
||||
* The Debuggee Global Object as given by the ThreadActor
|
||||
*/
|
||||
function ObjectActor(obj, {
|
||||
createValueGrip,
|
||||
@ -49,7 +51,8 @@ function ObjectActor(obj, {
|
||||
createEnvironmentActor,
|
||||
getGripDepth,
|
||||
incrementGripDepth,
|
||||
decrementGripDepth
|
||||
decrementGripDepth,
|
||||
getGlobalDebugObject
|
||||
}) {
|
||||
dbg_assert(!obj.optimizedOut,
|
||||
"Should not create object actors for optimized out values!");
|
||||
@ -60,7 +63,8 @@ function ObjectActor(obj, {
|
||||
createEnvironmentActor,
|
||||
getGripDepth,
|
||||
incrementGripDepth,
|
||||
decrementGripDepth
|
||||
decrementGripDepth,
|
||||
getGlobalDebugObject
|
||||
};
|
||||
this.iterators = new Set();
|
||||
}
|
||||
@ -804,6 +808,17 @@ DebuggerServer.ObjectActorPreviewers = {
|
||||
grip.userDisplayName = hooks.createValueGrip(userDisplayName.value);
|
||||
}
|
||||
|
||||
let dbgGlobal = hooks.getGlobalDebugObject();
|
||||
if (dbgGlobal) {
|
||||
let script = dbgGlobal.makeDebuggeeValue(obj.unsafeDereference()).script;
|
||||
if (script) {
|
||||
grip.location = {
|
||||
url: script.url,
|
||||
line: script.startLine
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}],
|
||||
|
||||
|
@ -145,7 +145,9 @@ let PromisesActor = protocol.ActorClass({
|
||||
sources: () => DevToolsUtils.reportException("PromisesActor",
|
||||
Error("sources not yet implemented")),
|
||||
createEnvironmentActor: () => DevToolsUtils.reportException(
|
||||
"PromisesActor", Error("createEnvironmentActor not yet implemented"))
|
||||
"PromisesActor", Error("createEnvironmentActor not yet implemented")),
|
||||
getGlobalDebugObject: () => DevToolsUtils.reportException(
|
||||
"PromisesActor", Error("getGlobalDebugObject not yet implemented")),
|
||||
});
|
||||
|
||||
this._navigationLifetimePool.addActor(actor);
|
||||
|
@ -1676,7 +1676,8 @@ ThreadActor.prototype = {
|
||||
this.createEnvironmentActor(env, pool),
|
||||
promote: () => this.threadObjectGrip(actor),
|
||||
isThreadLifetimePool: () =>
|
||||
actor.registeredPool !== this.threadLifetimePool
|
||||
actor.registeredPool !== this.threadLifetimePool,
|
||||
getGlobalDebugObject: () => this.globalDebugObject
|
||||
});
|
||||
aPool.addActor(actor);
|
||||
aPool.objectActors.set(aValue, actor);
|
||||
|
@ -305,6 +305,10 @@ WebConsoleActor.prototype =
|
||||
|
||||
actorPrefix: "console",
|
||||
|
||||
get globalDebugObject() {
|
||||
return this.parentActor.threadActor.globalDebugObject;
|
||||
},
|
||||
|
||||
grip: function WCA_grip()
|
||||
{
|
||||
return { actor: this.actorID };
|
||||
@ -450,7 +454,8 @@ WebConsoleActor.prototype =
|
||||
createValueGrip: v => this.createValueGrip(v),
|
||||
sources: () => DevToolsUtils.reportException("WebConsoleActor",
|
||||
Error("sources not yet implemented")),
|
||||
createEnvironmentActor: (env) => this.createEnvironmentActor(env)
|
||||
createEnvironmentActor: (env) => this.createEnvironmentActor(env),
|
||||
getGlobalDebugObject: () => this.globalDebugObject
|
||||
});
|
||||
aPool.addActor(actor);
|
||||
return actor.grip();
|
||||
|
@ -95,7 +95,7 @@ TestTabActor.prototype = {
|
||||
actorPrefix: "TestTabActor",
|
||||
|
||||
get window() {
|
||||
return { wrappedJSObject: this._global };
|
||||
return this._global;
|
||||
},
|
||||
|
||||
get url() {
|
||||
|
Loading…
Reference in New Issue
Block a user