Created
October 9, 2018 05:56
-
-
Save juliandescottes/0958bf210cbe3d599cc812c3b3b68f2e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# HG changeset patch | |
# User David Walsh <[email protected]> | |
# Date 1539048226 18000 | |
# Mon Oct 08 20:23:46 2018 -0500 | |
# Node ID 7931d57e3eae80a92ee485f9277762c713f37e6c | |
# Parent b37cb2cbe0872efd25c46050302a28a51efd5dc5 | |
Bug 1314057 - Move worker actor and console tests to shared | |
diff --git a/devtools/client/debugger/test/mochitest/browser2.ini b/devtools/client/debugger/test/mochitest/browser2.ini | |
--- a/devtools/client/debugger/test/mochitest/browser2.ini | |
+++ b/devtools/client/debugger/test/mochitest/browser2.ini | |
@@ -159,23 +159,11 @@ skip-if = true # Bug 1288348 - previousl | |
[browser_dbg_terminate-on-tab-close.js] | |
uses-unsafe-cpows = true | |
skip-if = e10s && debug | |
-[browser_dbg_worker-console-01.js] | |
-skip-if = true # bug 1368569 | |
-[browser_dbg_worker-console-02.js] | |
-skip-if = e10s && debug | |
-[browser_dbg_worker-console-03.js] | |
-skip-if = debug # bug 1334683 | |
-[browser_dbg_worker-console-04.js] | |
-skip-if = e10s && debug | |
[browser_dbg_worker-source-map.js] | |
uses-unsafe-cpows = true | |
skip-if = e10s && debug | |
[browser_dbg_worker-window.js] | |
skip-if = (e10s && debug) || true # Bug 1486974 | |
-[browser_dbg_WorkerTargetActor.attach.js] | |
-skip-if = e10s && debug | |
-[browser_dbg_WorkerTargetActor.attachThread.js] | |
-skip-if = e10s && debug | |
[browser_dbg_split-console-keypress.js] | |
uses-unsafe-cpows = true | |
skip-if = (debug || os == "linux") # Bug 1214439 | |
diff --git a/devtools/client/shared/test/browser.ini b/devtools/client/shared/test/browser.ini | |
--- a/devtools/client/shared/test/browser.ini | |
+++ b/devtools/client/shared/test/browser.ini | |
@@ -5,6 +5,9 @@ support-files = | |
addon1.xpi | |
addon2.xpi | |
browser_devices.json | |
+ code_WorkerTargetActor.attach-worker1.js | |
+ code_WorkerTargetActor.attach-worker2.js | |
+ code_WorkerTargetActor.attachThread-worker.js | |
doc_cubic-bezier-01.html | |
doc_cubic-bezier-02.html | |
doc_empty-tab-01.html | |
@@ -32,12 +35,16 @@ support-files = | |
doc_tableWidget_keyboard_interaction.xul | |
doc_tableWidget_mouse_interaction.xul | |
doc_templater_basic.html | |
+ doc_WorkerTargetActor.attach-tab1.html | |
+ doc_WorkerTargetActor.attach-tab2.html | |
+ doc_WorkerTargetActor.attachThread-tab.html | |
dummy.html | |
frame-script-utils.js | |
head.js | |
helper_color_data.js | |
helper_html_tooltip.js | |
helper_inplace_editor.js | |
+ helper_workers.js | |
leakhunt.js | |
shared-head.js | |
shared-redux-head.js | |
@@ -225,4 +232,16 @@ skip-if = e10s && debug | |
[browser_dbg_navigation.js] | |
skip-if = e10s && debug | |
[browser_dbg_target-scoped-actor-01.js] | |
-[browser_dbg_target-scoped-actor-02.js] | |
\ No newline at end of file | |
+[browser_dbg_target-scoped-actor-02.js] | |
+[browser_dbg_worker-console-01.js] | |
+skip-if = true # bug 1368569 | |
+[browser_dbg_worker-console-02.js] | |
+skip-if = e10s && debug | |
+[browser_dbg_worker-console-03.js] | |
+skip-if = debug # bug 1334683 | |
+[browser_dbg_worker-console-04.js] | |
+skip-if = e10s && debug | |
+[browser_dbg_WorkerTargetActor.attach.js] | |
+skip-if = e10s && debug | |
+[browser_dbg_WorkerTargetActor.attachThread.js] | |
+skip-if = e10s && debug | |
\ No newline at end of file | |
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg_WorkerTargetActor.attach.js b/devtools/client/shared/test/browser_dbg_WorkerTargetActor.attach.js | |
rename from devtools/client/debugger/test/mochitest/browser_dbg_WorkerTargetActor.attach.js | |
rename to devtools/client/shared/test/browser_dbg_WorkerTargetActor.attach.js | |
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg_WorkerTargetActor.attachThread.js b/devtools/client/shared/test/browser_dbg_WorkerTargetActor.attachThread.js | |
rename from devtools/client/debugger/test/mochitest/browser_dbg_WorkerTargetActor.attachThread.js | |
rename to devtools/client/shared/test/browser_dbg_WorkerTargetActor.attachThread.js | |
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg_worker-console-01.js b/devtools/client/shared/test/browser_dbg_worker-console-01.js | |
rename from devtools/client/debugger/test/mochitest/browser_dbg_worker-console-01.js | |
rename to devtools/client/shared/test/browser_dbg_worker-console-01.js | |
--- a/devtools/client/debugger/test/mochitest/browser_dbg_worker-console-01.js | |
+++ b/devtools/client/shared/test/browser_dbg_worker-console-01.js | |
@@ -1,6 +1,18 @@ | |
+"use strict"; | |
+ | |
+requestLongerTimeout(10); | |
+ | |
// Check to make sure that a worker can be attached to a toolbox | |
// and that the console works. | |
+var { DebuggerServer } = require("devtools/server/main"); | |
+var { DebuggerClient } = require("devtools/shared/client/debugger-client"); | |
+ | |
+// Import helpers for the workers | |
+Services.scriptloader.loadSubScript( | |
+ "chrome://mochitests/content/browser/devtools/client/shared/test/helper_workers.js", | |
+ this); | |
+ | |
var TAB_URL = EXAMPLE_URL + "doc_WorkerTargetActor.attachThread-tab.html"; | |
var WORKER_URL = "code_WorkerTargetActor.attachThread-worker.js"; | |
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg_worker-console-02.js b/devtools/client/shared/test/browser_dbg_worker-console-02.js | |
rename from devtools/client/debugger/test/mochitest/browser_dbg_worker-console-02.js | |
rename to devtools/client/shared/test/browser_dbg_worker-console-02.js | |
--- a/devtools/client/debugger/test/mochitest/browser_dbg_worker-console-02.js | |
+++ b/devtools/client/shared/test/browser_dbg_worker-console-02.js | |
@@ -1,3 +1,18 @@ | |
+"use strict"; | |
+ | |
+requestLongerTimeout(10); | |
+ | |
+// Check to make sure that a worker can be attached to a toolbox | |
+// and that the console works. | |
+ | |
+var { DebuggerServer } = require("devtools/server/main"); | |
+var { DebuggerClient } = require("devtools/shared/client/debugger-client"); | |
+ | |
+// Import helpers for the workers | |
+Services.scriptloader.loadSubScript( | |
+ "chrome://mochitests/content/browser/devtools/client/shared/test/helper_workers.js", | |
+ this); | |
+ | |
// Check to make sure that a worker can be attached to a toolbox | |
// and that the console works. | |
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg_worker-console-03.js b/devtools/client/shared/test/browser_dbg_worker-console-03.js | |
rename from devtools/client/debugger/test/mochitest/browser_dbg_worker-console-03.js | |
rename to devtools/client/shared/test/browser_dbg_worker-console-03.js | |
--- a/devtools/client/debugger/test/mochitest/browser_dbg_worker-console-03.js | |
+++ b/devtools/client/shared/test/browser_dbg_worker-console-03.js | |
@@ -1,3 +1,18 @@ | |
+"use strict"; | |
+ | |
+requestLongerTimeout(10); | |
+ | |
+// Check to make sure that a worker can be attached to a toolbox | |
+// and that the console works. | |
+ | |
+var { DebuggerServer } = require("devtools/server/main"); | |
+var { DebuggerClient } = require("devtools/shared/client/debugger-client"); | |
+ | |
+// Import helpers for the workers | |
+Services.scriptloader.loadSubScript( | |
+ "chrome://mochitests/content/browser/devtools/client/shared/test/helper_workers.js", | |
+ this); | |
+ | |
// Check to make sure that a worker can be attached to a toolbox | |
// and that the console works. | |
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg_worker-console-04.js b/devtools/client/shared/test/browser_dbg_worker-console-04.js | |
rename from devtools/client/debugger/test/mochitest/browser_dbg_worker-console-04.js | |
rename to devtools/client/shared/test/browser_dbg_worker-console-04.js | |
--- a/devtools/client/debugger/test/mochitest/browser_dbg_worker-console-04.js | |
+++ b/devtools/client/shared/test/browser_dbg_worker-console-04.js | |
@@ -1,3 +1,18 @@ | |
+"use strict"; | |
+ | |
+requestLongerTimeout(10); | |
+ | |
+// Check to make sure that a worker can be attached to a toolbox | |
+// and that the console works. | |
+ | |
+var { DebuggerServer } = require("devtools/server/main"); | |
+var { DebuggerClient } = require("devtools/shared/client/debugger-client"); | |
+ | |
+// Import helpers for the workers | |
+Services.scriptloader.loadSubScript( | |
+ "chrome://mochitests/content/browser/devtools/client/shared/test/helper_workers.js", | |
+ this); | |
+ | |
// Check that the date and regexp previewers work in the console of a worker debugger. | |
"use strict"; | |
diff --git a/devtools/client/debugger/test/mochitest/code_WorkerTargetActor.attach-worker1.js b/devtools/client/shared/test/code_WorkerTargetActor.attach-worker1.js | |
copy from devtools/client/debugger/test/mochitest/code_WorkerTargetActor.attach-worker1.js | |
copy to devtools/client/shared/test/code_WorkerTargetActor.attach-worker1.js | |
diff --git a/devtools/client/debugger/test/mochitest/code_WorkerTargetActor.attach-worker2.js b/devtools/client/shared/test/code_WorkerTargetActor.attach-worker2.js | |
copy from devtools/client/debugger/test/mochitest/code_WorkerTargetActor.attach-worker2.js | |
copy to devtools/client/shared/test/code_WorkerTargetActor.attach-worker2.js | |
diff --git a/devtools/client/debugger/test/mochitest/code_WorkerTargetActor.attachThread-worker.js b/devtools/client/shared/test/code_WorkerTargetActor.attachThread-worker.js | |
copy from devtools/client/debugger/test/mochitest/code_WorkerTargetActor.attachThread-worker.js | |
copy to devtools/client/shared/test/code_WorkerTargetActor.attachThread-worker.js | |
diff --git a/devtools/client/debugger/test/mochitest/doc_WorkerTargetActor.attach-tab1.html b/devtools/client/shared/test/doc_WorkerTargetActor.attach-tab1.html | |
copy from devtools/client/debugger/test/mochitest/doc_WorkerTargetActor.attach-tab1.html | |
copy to devtools/client/shared/test/doc_WorkerTargetActor.attach-tab1.html | |
diff --git a/devtools/client/debugger/test/mochitest/doc_WorkerTargetActor.attach-tab2.html b/devtools/client/shared/test/doc_WorkerTargetActor.attach-tab2.html | |
copy from devtools/client/debugger/test/mochitest/doc_WorkerTargetActor.attach-tab2.html | |
copy to devtools/client/shared/test/doc_WorkerTargetActor.attach-tab2.html | |
diff --git a/devtools/client/debugger/test/mochitest/doc_WorkerTargetActor.attachThread-tab.html b/devtools/client/shared/test/doc_WorkerTargetActor.attachThread-tab.html | |
copy from devtools/client/debugger/test/mochitest/doc_WorkerTargetActor.attachThread-tab.html | |
copy to devtools/client/shared/test/doc_WorkerTargetActor.attachThread-tab.html | |
diff --git a/devtools/client/shared/test/helper_workers.js b/devtools/client/shared/test/helper_workers.js | |
new file mode 100644 | |
--- /dev/null | |
+++ b/devtools/client/shared/test/helper_workers.js | |
@@ -0,0 +1,362 @@ | |
+const FRAME_SCRIPT_URL = getRootDirectory(gTestPath) + "code_frame-script.js"; | |
+const CHROME_URL = "chrome://mochitests/content/browser/devtools/client/shared/test/"; | |
+const CHROME_URI = Services.io.newURI(CHROME_URL); | |
+ | |
+// Override promise with deprecated-sync-thenables | |
+promise = require("devtools/shared/deprecated-sync-thenables"); | |
+ | |
+var nextId = 0; | |
+ | |
+function jsonrpc(tab, method, params) { | |
+ return new Promise(function (resolve, reject) { | |
+ let currentId = nextId++; | |
+ let messageManager = tab.linkedBrowser.messageManager; | |
+ messageManager.sendAsyncMessage("jsonrpc", { | |
+ method: method, | |
+ params: params, | |
+ id: currentId | |
+ }); | |
+ messageManager.addMessageListener("jsonrpc", function listener(res) { | |
+ const { data: { result, error, id } } = res; | |
+ if (id !== currentId) { | |
+ return; | |
+ } | |
+ | |
+ messageManager.removeMessageListener("jsonrpc", listener); | |
+ if (error != null) { | |
+ reject(error); | |
+ } | |
+ | |
+ resolve(result); | |
+ }); | |
+ }); | |
+} | |
+ | |
+function callInTab(tab, name) { | |
+ info("Calling function with name '" + name + "' in tab."); | |
+ | |
+ return jsonrpc(tab, "call", [name, Array.prototype.slice.call(arguments, 2)]); | |
+} | |
+ | |
+function evalInTab(tab, string) { | |
+ info("Evalling string in tab."); | |
+ | |
+ return jsonrpc(tab, "_eval", [string]); | |
+} | |
+ | |
+function createWorkerInTab(tab, url) { | |
+ info("Creating worker with url '" + url + "' in tab."); | |
+ | |
+ return jsonrpc(tab, "createWorker", [url]); | |
+} | |
+ | |
+function terminateWorkerInTab(tab, url) { | |
+ info("Terminating worker with url '" + url + "' in tab."); | |
+ | |
+ return jsonrpc(tab, "terminateWorker", [url]); | |
+} | |
+ | |
+function postMessageToWorkerInTab(tab, url, message) { | |
+ info("Posting message to worker with url '" + url + "' in tab."); | |
+ | |
+ return jsonrpc(tab, "postMessageToWorker", [url, message]); | |
+} | |
+ | |
+function generateMouseClickInTab(tab, path) { | |
+ info("Generating mouse click in tab."); | |
+ | |
+ return jsonrpc(tab, "generateMouseClick", [path]); | |
+} | |
+ | |
+function connect(client) { | |
+ info("Connecting client."); | |
+ return client.connect(); | |
+} | |
+ | |
+function close(client) { | |
+ info("Waiting for client to close.\n"); | |
+ return client.close(); | |
+} | |
+ | |
+function listTabs(client) { | |
+ info("Listing tabs."); | |
+ return client.listTabs(); | |
+} | |
+ | |
+function findTab(tabs, url) { | |
+ info("Finding tab with url '" + url + "'."); | |
+ for (let tab of tabs) { | |
+ if (tab.url === url) { | |
+ return tab; | |
+ } | |
+ } | |
+ return null; | |
+} | |
+ | |
+function attachTarget(client, tab) { | |
+ info("Attaching to tab with url '" + tab.url + "'."); | |
+ return client.attachTarget(tab.actor); | |
+} | |
+ | |
+function listWorkers(tabClient) { | |
+ info("Listing workers."); | |
+ return tabClient.listWorkers(); | |
+} | |
+ | |
+function findWorker(workers, url) { | |
+ info("Finding worker with url '" + url + "'."); | |
+ for (let worker of workers) { | |
+ if (worker.url === url) { | |
+ return worker; | |
+ } | |
+ } | |
+ return null; | |
+} | |
+ | |
+function attachWorker(tabClient, worker) { | |
+ info("Attaching to worker with url '" + worker.url + "'."); | |
+ return tabClient.attachWorker(worker.actor); | |
+} | |
+ | |
+function waitForWorkerListChanged(tabClient) { | |
+ info("Waiting for worker list to change."); | |
+ return new Promise(function (resolve) { | |
+ tabClient.addListener("workerListChanged", function listener() { | |
+ tabClient.removeListener("workerListChanged", listener); | |
+ resolve(); | |
+ }); | |
+ }); | |
+} | |
+ | |
+function attachThread(workerClient, options) { | |
+ info("Attaching to thread."); | |
+ return workerClient.attachThread(options); | |
+} | |
+ | |
+function waitForWorkerClose(workerClient) { | |
+ info("Waiting for worker to close."); | |
+ return new Promise(function (resolve) { | |
+ workerClient.addOneTimeListener("close", function () { | |
+ info("Worker did close."); | |
+ resolve(); | |
+ }); | |
+ }); | |
+} | |
+ | |
+function resume(threadClient) { | |
+ info("Resuming thread."); | |
+ return threadClient.resume(); | |
+} | |
+ | |
+function findSource(sources, url) { | |
+ info("Finding source with url '" + url + "'.\n"); | |
+ for (let source of sources) { | |
+ if (source.url === url) { | |
+ return source; | |
+ } | |
+ } | |
+ return null; | |
+} | |
+ | |
+function waitForEvent(client, type, predicate) { | |
+ return new Promise(function (resolve) { | |
+ function listener(type, packet) { | |
+ if (!predicate(packet)) { | |
+ return; | |
+ } | |
+ client.removeListener(listener); | |
+ resolve(packet); | |
+ } | |
+ | |
+ if (predicate) { | |
+ client.addListener(type, listener); | |
+ } else { | |
+ client.addOneTimeListener(type, function (type, packet) { | |
+ resolve(packet); | |
+ }); | |
+ } | |
+ }); | |
+} | |
+ | |
+function waitForPause(threadClient) { | |
+ info("Waiting for pause.\n"); | |
+ return waitForEvent(threadClient, "paused"); | |
+} | |
+ | |
+function setBreakpoint(sourceClient, location) { | |
+ info("Setting breakpoint.\n"); | |
+ return sourceClient.setBreakpoint(location); | |
+} | |
+ | |
+function source(sourceClient) { | |
+ info("Getting source.\n"); | |
+ return sourceClient.source(); | |
+} | |
+ | |
+// Return a promise with a reference to jsterm, opening the split | |
+// console if necessary. This cleans up the split console pref so | |
+// it won't pollute other tests. | |
+function getSplitConsole(toolbox, win) { | |
+ if (!win) { | |
+ win = toolbox.win; | |
+ } | |
+ | |
+ if (!toolbox.splitConsole) { | |
+ EventUtils.synthesizeKey("VK_ESCAPE", {}, win); | |
+ } | |
+ | |
+ return new Promise(resolve => { | |
+ toolbox.getPanelWhenReady("webconsole").then(() => { | |
+ ok(toolbox.splitConsole, "Split console is shown."); | |
+ let jsterm = toolbox.getPanel("webconsole").hud.jsterm; | |
+ resolve(jsterm); | |
+ }); | |
+ }); | |
+} | |
+ | |
+// navigation | |
+ | |
+function waitForNavigation(gPanel) { | |
+ const target = gPanel.panelWin.gTarget; | |
+ const deferred = promise.defer(); | |
+ target.once("navigate", () => { | |
+ deferred.resolve(); | |
+ }); | |
+ info("Waiting for navigation..."); | |
+ return deferred.promise; | |
+} | |
+ | |
+// actions | |
+ | |
+function bindActionCreators(panel) { | |
+ const win = panel.panelWin; | |
+ const dispatch = win.DebuggerController.dispatch; | |
+ const { bindActionCreators } = win.require("devtools/client/shared/vendor/redux"); | |
+ return bindActionCreators(win.actions, dispatch); | |
+} | |
+ | |
+// Wait until an action of `type` is dispatched. This is different | |
+// then `_afterDispatchDone` because it doesn't wait for async actions | |
+// to be done/errored. Use this if you want to listen for the "start" | |
+// action of an async operation (somewhat rare). | |
+function waitForNextDispatch(store, type) { | |
+ return new Promise(resolve => { | |
+ store.dispatch({ | |
+ // Normally we would use `services.WAIT_UNTIL`, but use the | |
+ // internal name here so tests aren't forced to always pass it | |
+ // in | |
+ type: "@@service/waitUntil", | |
+ predicate: action => action.type === type, | |
+ run: (dispatch, getState, action) => { | |
+ resolve(action); | |
+ } | |
+ }); | |
+ }); | |
+} | |
+ | |
+// Wait until an action of `type` is dispatched. If it's part of an | |
+// async operation, wait until the `status` field is "done" or "error" | |
+function _afterDispatchDone(store, type) { | |
+ return new Promise(resolve => { | |
+ store.dispatch({ | |
+ // Normally we would use `services.WAIT_UNTIL`, but use the | |
+ // internal name here so tests aren't forced to always pass it | |
+ // in | |
+ type: "@@service/waitUntil", | |
+ predicate: action => { | |
+ if (action.type === type) { | |
+ return action.status ? | |
+ (action.status === "done" || action.status === "error") : | |
+ true; | |
+ } | |
+ }, | |
+ run: (dispatch, getState, action) => { | |
+ resolve(action); | |
+ } | |
+ }); | |
+ }); | |
+} | |
+ | |
+function waitForDispatch(panel, type, eventRepeat = 1) { | |
+ const controller = panel.panelWin.DebuggerController; | |
+ const actionType = panel.panelWin.constants[type]; | |
+ let count = 0; | |
+ | |
+ return Task.spawn(function* () { | |
+ info("Waiting for " + type + " to dispatch " + eventRepeat + " time(s)"); | |
+ while (count < eventRepeat) { | |
+ yield _afterDispatchDone(controller, actionType); | |
+ count++; | |
+ info(type + " dispatched " + count + " time(s)"); | |
+ } | |
+ }); | |
+} | |
+ | |
+async function initWorkerDebugger(TAB_URL, WORKER_URL) { | |
+ DebuggerServer.init(); | |
+ DebuggerServer.registerAllActors(); | |
+ | |
+ let client = new DebuggerClient(DebuggerServer.connectPipe()); | |
+ await connect(client); | |
+ | |
+ let tab = await addTab(TAB_URL); | |
+ let { tabs } = await listTabs(client); | |
+ let [, tabClient] = await attachTarget(client, findTab(tabs, TAB_URL)); | |
+ | |
+ await createWorkerInTab(tab, WORKER_URL); | |
+ | |
+ let { workers } = await listWorkers(tabClient); | |
+ let [, workerClient] = await attachWorker(tabClient, | |
+ findWorker(workers, WORKER_URL)); | |
+ | |
+ let toolbox = await gDevTools.showToolbox(TargetFactory.forWorker(workerClient), | |
+ "jsdebugger", | |
+ Toolbox.HostType.WINDOW); | |
+ | |
+ let debuggerPanel = toolbox.getCurrentPanel(); | |
+ let gDebugger = debuggerPanel.panelWin; | |
+ | |
+ return {client, tab, tabClient, workerClient, toolbox, gDebugger}; | |
+} | |
+ | |
+// Override addTab/removeTab as defined by shared-head, since these have | |
+// an extra window parameter and add a frame script | |
+this.addTab = function addTab(aUrl, aWindow) { | |
+ info("Adding tab: " + aUrl); | |
+ | |
+ let deferred = promise.defer(); | |
+ let targetWindow = aWindow || window; | |
+ let targetBrowser = targetWindow.gBrowser; | |
+ | |
+ targetWindow.focus(); | |
+ let tab = targetBrowser.selectedTab = BrowserTestUtils.addTab(targetBrowser, aUrl); | |
+ let linkedBrowser = tab.linkedBrowser; | |
+ | |
+ info("Loading frame script with url " + FRAME_SCRIPT_URL + "."); | |
+ linkedBrowser.messageManager.loadFrameScript(FRAME_SCRIPT_URL, false); | |
+ | |
+ BrowserTestUtils.browserLoaded(linkedBrowser) | |
+ .then(function () { | |
+ info("Tab added and finished loading: " + aUrl); | |
+ deferred.resolve(tab); | |
+ }); | |
+ | |
+ return deferred.promise; | |
+}; | |
+ | |
+this.removeTab = function removeTab(aTab, aWindow) { | |
+ info("Removing tab."); | |
+ | |
+ let deferred = promise.defer(); | |
+ let targetWindow = aWindow || window; | |
+ let targetBrowser = targetWindow.gBrowser; | |
+ let tabContainer = targetBrowser.tabContainer; | |
+ | |
+ tabContainer.addEventListener("TabClose", function (aEvent) { | |
+ info("Tab removed and finished closing."); | |
+ deferred.resolve(); | |
+ }, {once: true}); | |
+ | |
+ targetBrowser.removeTab(aTab); | |
+ return deferred.promise; | |
+}; | |
\ No newline at end of file |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment