summaryrefslogtreecommitdiffstats
path: root/browser/components/extensions/test/browser/browser_ext_tabs_executeScript_no_create.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/extensions/test/browser/browser_ext_tabs_executeScript_no_create.js')
-rw-r--r--browser/components/extensions/test/browser/browser_ext_tabs_executeScript_no_create.js80
1 files changed, 80 insertions, 0 deletions
diff --git a/browser/components/extensions/test/browser/browser_ext_tabs_executeScript_no_create.js b/browser/components/extensions/test/browser/browser_ext_tabs_executeScript_no_create.js
new file mode 100644
index 0000000000..e8e1f1255f
--- /dev/null
+++ b/browser/components/extensions/test/browser/browser_ext_tabs_executeScript_no_create.js
@@ -0,0 +1,80 @@
+/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set sts=2 sw=2 et tw=80: */
+"use strict";
+
+add_task(async function testExecuteScriptAtOnUpdated() {
+ const BASE =
+ "http://mochi.test:8888/browser/browser/components/extensions/test/browser/";
+ const URL = BASE + "file_iframe_document.html";
+ // This is a regression test for bug 1325830.
+ // The bug (executeScript not completing any more) occurred when executeScript
+ // was called early at the onUpdated event, unless the tabs.create method is
+ // called. So this test does not use tabs.create to open new tabs.
+ // Note that if this test is run together with other tests that do call
+ // tabs.create, then this test case does not properly test the conditions of
+ // the regression any more. To verify that the regression has been resolved,
+ // this test must be run in isolation.
+
+ function background() {
+ // Using variables to prevent listeners from running more than once, instead
+ // of removing the listener. This is to minimize any IPC, since the bug that
+ // is being tested is sensitive to timing.
+ let ignore = false;
+ let url;
+ browser.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
+ if (ignore) {
+ return;
+ }
+ if (url && changeInfo.status === "loading" && tab.url === url) {
+ ignore = true;
+ browser.tabs
+ .executeScript(tabId, {
+ code: "document.URL",
+ })
+ .then(
+ results => {
+ browser.test.assertEq(
+ url,
+ results[0],
+ "Content script should run"
+ );
+ browser.test.notifyPass("executeScript-at-onUpdated");
+ },
+ error => {
+ browser.test.fail(`Unexpected error: ${error} :: ${error.stack}`);
+ browser.test.notifyFail("executeScript-at-onUpdated");
+ }
+ );
+ // (running this log call after executeScript to minimize IPC between
+ // onUpdated and executeScript.)
+ browser.test.log(`Found expected navigation to ${url}`);
+ } else {
+ // The bug occurs when executeScript is called before a tab is
+ // initialized.
+ browser.tabs.executeScript(tabId, { code: "" });
+ }
+ });
+ browser.test.onMessage.addListener(testUrl => {
+ url = testUrl;
+ browser.test.sendMessage("open-test-tab");
+ });
+ }
+
+ let extension = ExtensionTestUtils.loadExtension({
+ manifest: {
+ permissions: ["http://mochi.test/", "tabs"],
+ },
+ background,
+ });
+
+ await extension.startup();
+ extension.sendMessage(URL);
+ await extension.awaitMessage("open-test-tab");
+ let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, URL, true);
+
+ await extension.awaitFinish("executeScript-at-onUpdated");
+
+ await extension.unload();
+
+ BrowserTestUtils.removeTab(tab);
+});