summaryrefslogtreecommitdiffstats
path: root/browser/components/urlbar/tests/browser/browser_stop_pending.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/urlbar/tests/browser/browser_stop_pending.js')
-rw-r--r--browser/components/urlbar/tests/browser/browser_stop_pending.js459
1 files changed, 459 insertions, 0 deletions
diff --git a/browser/components/urlbar/tests/browser/browser_stop_pending.js b/browser/components/urlbar/tests/browser/browser_stop_pending.js
new file mode 100644
index 0000000000..2e7056e972
--- /dev/null
+++ b/browser/components/urlbar/tests/browser/browser_stop_pending.js
@@ -0,0 +1,459 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/* eslint-disable mozilla/no-arbitrary-setTimeout */
+"use strict";
+
+const SLOW_PAGE =
+ getRootDirectory(gTestPath).replace(
+ "chrome://mochitests/content",
+ "http://www.example.com"
+ ) + "slow-page.sjs";
+const SLOW_PAGE2 =
+ getRootDirectory(gTestPath).replace(
+ "chrome://mochitests/content",
+ "http://mochi.test:8888"
+ ) + "slow-page.sjs?faster";
+
+/**
+ * Check that if we:
+ * 1) have a loaded page
+ * 2) load a separate URL
+ * 3) before the URL for step 2 has finished loading, load a third URL
+ * we don't revert to the URL from (1).
+ */
+add_task(async function () {
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "http://example.com",
+ true,
+ true
+ );
+
+ let initialValue = gURLBar.untrimmedValue;
+ let expectedURLBarChange = SLOW_PAGE;
+ let sawChange = false;
+ let handler = () => {
+ isnot(
+ gURLBar.untrimmedValue,
+ initialValue,
+ "Should not revert URL bar value!"
+ );
+ if (gURLBar.getAttribute("pageproxystate") == "valid") {
+ sawChange = true;
+ is(
+ gURLBar.untrimmedValue,
+ expectedURLBarChange,
+ "Should set expected URL bar value!"
+ );
+ }
+ };
+
+ let obs = new MutationObserver(handler);
+
+ obs.observe(gURLBar.textbox, { attributes: true });
+ gURLBar.value = SLOW_PAGE;
+ gURLBar.handleCommand();
+
+ // If this ever starts going intermittent, we've broken this.
+ await new Promise(resolve => setTimeout(resolve, 200));
+ expectedURLBarChange = SLOW_PAGE2;
+ let pageLoadPromise = BrowserTestUtils.browserLoaded(tab.linkedBrowser);
+ gURLBar.value = expectedURLBarChange;
+ gURLBar.handleCommand();
+ is(
+ gURLBar.untrimmedValue,
+ expectedURLBarChange,
+ "Should not have changed URL bar value synchronously."
+ );
+ await pageLoadPromise;
+ ok(
+ sawChange,
+ "The URL bar change handler should have been called by the time the page was loaded"
+ );
+ obs.disconnect();
+ obs = null;
+ BrowserTestUtils.removeTab(tab);
+});
+
+/**
+ * Check that if we:
+ * 1) middle-click a link to a separate page whose server doesn't respond
+ * 2) we switch to that tab and stop the request
+ *
+ * The URL bar continues to contain the URL of the page we wanted to visit.
+ */
+add_task(async function () {
+ let socket = Cc["@mozilla.org/network/server-socket;1"].createInstance(
+ Ci.nsIServerSocket
+ );
+ socket.init(-1, true, -1);
+ const PORT = socket.port;
+ registerCleanupFunction(() => {
+ socket.close();
+ });
+
+ const BASE_PAGE = TEST_BASE_URL + "dummy_page.html";
+ const SLOW_HOST = `https://localhost:${PORT}/`;
+ info("Using URLs: " + SLOW_HOST);
+ let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, BASE_PAGE);
+ info("opened tab");
+ await SpecialPowers.spawn(tab.linkedBrowser, [SLOW_HOST], URL => {
+ let link = content.document.createElement("a");
+ link.href = URL;
+ link.textContent = "click me to open a slow page";
+ link.id = "clickme";
+ content.document.body.appendChild(link);
+ });
+ info("added link");
+ let newTabPromise = BrowserTestUtils.waitForEvent(
+ gBrowser.tabContainer,
+ "TabOpen"
+ );
+ // Middle click the link:
+ await BrowserTestUtils.synthesizeMouseAtCenter(
+ "#clickme",
+ { button: 1 },
+ tab.linkedBrowser
+ );
+ // get new tab, switch to it
+ let newTab = (await newTabPromise).target;
+ await BrowserTestUtils.switchTab(gBrowser, newTab);
+ is(gURLBar.untrimmedValue, SLOW_HOST, "Should have slow page in URL bar");
+ let browserStoppedPromise = BrowserTestUtils.browserStopped(
+ newTab.linkedBrowser,
+ null,
+ true
+ );
+ BrowserStop();
+ await browserStoppedPromise;
+
+ is(
+ gURLBar.untrimmedValue,
+ SLOW_HOST,
+ "Should still have slow page in URL bar after stop"
+ );
+ BrowserTestUtils.removeTab(newTab);
+ BrowserTestUtils.removeTab(tab);
+});
+/**
+ * Check that if we:
+ * 1) middle-click a link to a separate page whose server doesn't respond
+ * 2) we alter the URL on that page to some other server that doesn't respond
+ * 3) we stop the request
+ *
+ * The URL bar continues to contain the second URL.
+ */
+add_task(async function () {
+ let socket = Cc["@mozilla.org/network/server-socket;1"].createInstance(
+ Ci.nsIServerSocket
+ );
+ socket.init(-1, true, -1);
+ const PORT1 = socket.port;
+ let socket2 = Cc["@mozilla.org/network/server-socket;1"].createInstance(
+ Ci.nsIServerSocket
+ );
+ socket2.init(-1, true, -1);
+ const PORT2 = socket2.port;
+ registerCleanupFunction(() => {
+ socket.close();
+ socket2.close();
+ });
+
+ const BASE_PAGE = TEST_BASE_URL + "dummy_page.html";
+ const SLOW_HOST1 = `https://localhost:${PORT1}/`;
+ const SLOW_HOST2 = `https://localhost:${PORT2}/`;
+ info("Using URLs: " + SLOW_HOST1 + " and " + SLOW_HOST2);
+ let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, BASE_PAGE);
+ info("opened tab");
+ await SpecialPowers.spawn(tab.linkedBrowser, [SLOW_HOST1], URL => {
+ let link = content.document.createElement("a");
+ link.href = URL;
+ link.textContent = "click me to open a slow page";
+ link.id = "clickme";
+ content.document.body.appendChild(link);
+ });
+ info("added link");
+ let newTabPromise = BrowserTestUtils.waitForEvent(
+ gBrowser.tabContainer,
+ "TabOpen"
+ );
+ // Middle click the link:
+ await BrowserTestUtils.synthesizeMouseAtCenter(
+ "#clickme",
+ { button: 1 },
+ tab.linkedBrowser
+ );
+ // get new tab, switch to it
+ let newTab = (await newTabPromise).target;
+ await BrowserTestUtils.switchTab(gBrowser, newTab);
+ is(gURLBar.untrimmedValue, SLOW_HOST1, "Should have slow page in URL bar");
+ let browserStoppedPromise = BrowserTestUtils.browserStopped(
+ newTab.linkedBrowser,
+ null,
+ true
+ );
+ gURLBar.value = SLOW_HOST2;
+ gURLBar.handleCommand();
+ await browserStoppedPromise;
+
+ is(
+ gURLBar.untrimmedValue,
+ SLOW_HOST2,
+ "Should have second slow page in URL bar"
+ );
+ browserStoppedPromise = BrowserTestUtils.browserStopped(
+ newTab.linkedBrowser,
+ null,
+ true
+ );
+ BrowserStop();
+ await browserStoppedPromise;
+
+ is(
+ gURLBar.untrimmedValue,
+ SLOW_HOST2,
+ "Should still have second slow page in URL bar after stop"
+ );
+ BrowserTestUtils.removeTab(newTab);
+ BrowserTestUtils.removeTab(tab);
+});
+
+/**
+ * 1) Try to load page 0 and wait for it to finish loading.
+ * 2) Try to load page 1 and wait for it to finish loading.
+ * 3) Try to load SLOW_PAGE, and then before it finishes loading, navigate back.
+ * - We should be taken to page 0.
+ */
+add_task(async function testCorrectUrlBarAfterGoingBackDuringAnotherLoad() {
+ // Load example.org
+ let page0 = "http://example.org/";
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ page0,
+ true,
+ true
+ );
+
+ // Load example.com in the same browser
+ let page1 = "http://example.com/";
+ let loaded = BrowserTestUtils.browserLoaded(tab.linkedBrowser, false, page1);
+ BrowserTestUtils.loadURIString(tab.linkedBrowser, page1);
+ await loaded;
+
+ let initialValue = gURLBar.untrimmedValue;
+ let expectedURLBarChange = SLOW_PAGE;
+ let sawChange = false;
+ let goneBack = false;
+ let handler = () => {
+ if (!goneBack) {
+ isnot(
+ gURLBar.untrimmedValue,
+ initialValue,
+ `Should not revert URL bar value to ${initialValue}`
+ );
+ }
+
+ if (gURLBar.getAttribute("pageproxystate") == "valid") {
+ sawChange = true;
+ is(
+ gURLBar.untrimmedValue,
+ expectedURLBarChange,
+ `Should set expected URL bar value - ${expectedURLBarChange}`
+ );
+ }
+ };
+
+ let obs = new MutationObserver(handler);
+
+ obs.observe(gURLBar.textbox, { attributes: true });
+ // Set the value of url bar to SLOW_PAGE
+ gURLBar.value = SLOW_PAGE;
+ gURLBar.handleCommand();
+
+ // Copied from the first test case:
+ // If this ever starts going intermittent, we've broken this.
+ await new Promise(resolve => setTimeout(resolve, 200));
+
+ expectedURLBarChange = page0;
+ let pageLoadPromise = BrowserTestUtils.browserStopped(
+ tab.linkedBrowser,
+ page0
+ );
+
+ // Wait until we can go back
+ await TestUtils.waitForCondition(() => tab.linkedBrowser.canGoBack);
+ ok(tab.linkedBrowser.canGoBack, "can go back");
+
+ // Navigate back from SLOW_PAGE. We should be taken to page 0 now.
+ tab.linkedBrowser.goBack();
+ goneBack = true;
+ is(
+ gURLBar.untrimmedValue,
+ SLOW_PAGE,
+ "Should not have changed URL bar value synchronously."
+ );
+ // Wait until page 0 have finished loading.
+ await pageLoadPromise;
+ is(
+ gURLBar.untrimmedValue,
+ page0,
+ "Should not have changed URL bar value synchronously."
+ );
+ ok(
+ sawChange,
+ "The URL bar change handler should have been called by the time the page was loaded"
+ );
+ obs.disconnect();
+ obs = null;
+ BrowserTestUtils.removeTab(tab);
+});
+
+/**
+ * 1) Try to load page 1 and wait for it to finish loading.
+ * 2) Start loading SLOW_PAGE (it won't finish loading)
+ * 3) Reload the page. We should have loaded page 1 now.
+ */
+add_task(async function testCorrectUrlBarAfterReloadingDuringSlowPageLoad() {
+ // Load page 1 - example.com
+ let page1 = "http://example.com/";
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ page1,
+ true,
+ true
+ );
+
+ let initialValue = gURLBar.untrimmedValue;
+ let expectedURLBarChange = SLOW_PAGE;
+ let sawChange = false;
+ let hasReloaded = false;
+ let handler = () => {
+ if (!hasReloaded) {
+ isnot(
+ gURLBar.untrimmedValue,
+ initialValue,
+ "Should not revert URL bar value!"
+ );
+ }
+ if (gURLBar.getAttribute("pageproxystate") == "valid") {
+ sawChange = true;
+ is(
+ gURLBar.untrimmedValue,
+ expectedURLBarChange,
+ "Should set expected URL bar value!"
+ );
+ }
+ };
+
+ let obs = new MutationObserver(handler);
+
+ obs.observe(gURLBar.textbox, { attributes: true });
+ // Start loading SLOW_PAGE
+ gURLBar.value = SLOW_PAGE;
+ gURLBar.handleCommand();
+
+ // Copied from the first test: If this ever starts going intermittent,
+ // we've broken this.
+ await new Promise(resolve => setTimeout(resolve, 200));
+
+ expectedURLBarChange = page1;
+ let pageLoadPromise = BrowserTestUtils.browserLoaded(
+ tab.linkedBrowser,
+ false,
+ page1
+ );
+ // Reload the page
+ tab.linkedBrowser.reload();
+ hasReloaded = true;
+ is(
+ gURLBar.untrimmedValue,
+ SLOW_PAGE,
+ "Should not have changed URL bar value synchronously."
+ );
+ // Wait for page1 to be loaded due to a reload while the slow page was still loading
+ await pageLoadPromise;
+ ok(
+ sawChange,
+ "The URL bar change handler should have been called by the time the page was loaded"
+ );
+ obs.disconnect();
+ obs = null;
+ BrowserTestUtils.removeTab(tab);
+});
+
+/**
+ * 1) Try to load example.com and wait for it to finish loading.
+ * 2) Start loading SLOW_PAGE and then stop the load before the load completes
+ * 3) Check that example.com has been loaded as a result of stopping SLOW_PAGE
+ * load.
+ */
+add_task(async function testCorrectUrlBarAfterStoppingTheLoad() {
+ // Load page 1
+ let page1 = "http://example.com/";
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ page1,
+ true,
+ true
+ );
+
+ let initialValue = gURLBar.untrimmedValue;
+ let expectedURLBarChange = SLOW_PAGE;
+ let sawChange = false;
+ let hasStopped = false;
+ let handler = () => {
+ if (!hasStopped) {
+ isnot(
+ gURLBar.untrimmedValue,
+ initialValue,
+ "Should not revert URL bar value!"
+ );
+ }
+ if (gURLBar.getAttribute("pageproxystate") == "valid") {
+ sawChange = true;
+ is(
+ gURLBar.untrimmedValue,
+ expectedURLBarChange,
+ "Should set expected URL bar value!"
+ );
+ }
+ };
+
+ let obs = new MutationObserver(handler);
+
+ obs.observe(gURLBar.textbox, { attributes: true });
+ // Start loading SLOW_PAGE
+ gURLBar.value = SLOW_PAGE;
+ gURLBar.handleCommand();
+
+ // Copied from the first test case:
+ // If this ever starts going intermittent, we've broken this.
+ await new Promise(resolve => setTimeout(resolve, 200));
+
+ // We expect page 1 to be loaded after the SLOW_PAGE load is stopped.
+ expectedURLBarChange = page1;
+ let pageLoadPromise = BrowserTestUtils.browserStopped(
+ tab.linkedBrowser,
+ SLOW_PAGE,
+ true
+ );
+ // Stop the SLOW_PAGE load
+ tab.linkedBrowser.stop();
+ hasStopped = true;
+ is(
+ gURLBar.untrimmedValue,
+ SLOW_PAGE,
+ "Should not have changed URL bar value synchronously."
+ );
+ // Wait for SLOW_PAGE load to stop
+ await pageLoadPromise;
+
+ ok(
+ sawChange,
+ "The URL bar change handler should have been called by the time the page was loaded"
+ );
+ obs.disconnect();
+ obs = null;
+ BrowserTestUtils.removeTab(tab);
+});