forked from mirrors/gecko-dev
		
	This should make a bit clearer that it is only starting the load, not waiting for its completion. Differential Revision: https://phabricator.services.mozilla.com/D188213
		
			
				
	
	
		
			174 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* Any copyright is dedicated to the Public Domain.
 | 
						|
   http://creativecommons.org/publicdomain/zero/1.0/ */
 | 
						|
 | 
						|
"use strict";
 | 
						|
 | 
						|
const TEST_ROOT_CHROME = getRootDirectory(gTestPath);
 | 
						|
const TEST_DIALOG_PATH = TEST_ROOT_CHROME + "subdialog.xhtml";
 | 
						|
 | 
						|
/**
 | 
						|
 * Tests that all tab dialogs are closed on navigation.
 | 
						|
 */
 | 
						|
add_task(async function test_tabdialogbox_multiple_close_on_nav() {
 | 
						|
  await BrowserTestUtils.withNewTab(
 | 
						|
    "https://example.com",
 | 
						|
    async function (browser) {
 | 
						|
      // Open two dialogs and wait for them to be ready.
 | 
						|
      let dialogBox = gBrowser.getTabDialogBox(browser);
 | 
						|
      let closedPromises = [
 | 
						|
        dialogBox.open(TEST_DIALOG_PATH).closedPromise,
 | 
						|
        dialogBox.open(TEST_DIALOG_PATH).closedPromise,
 | 
						|
      ];
 | 
						|
 | 
						|
      let dialogs = dialogBox.getTabDialogManager()._dialogs;
 | 
						|
 | 
						|
      is(dialogs.length, 2, "Dialog manager has two dialogs.");
 | 
						|
 | 
						|
      info("Waiting for dialogs to open.");
 | 
						|
      await Promise.all(dialogs.map(dialog => dialog._dialogReady));
 | 
						|
 | 
						|
      // Navigate to a different page
 | 
						|
      BrowserTestUtils.startLoadingURIString(browser, "https://example.org");
 | 
						|
 | 
						|
      info("Waiting for dialogs to close.");
 | 
						|
      await closedPromises;
 | 
						|
 | 
						|
      ok(true, "All open dialogs should close on navigation");
 | 
						|
    }
 | 
						|
  );
 | 
						|
});
 | 
						|
 | 
						|
/**
 | 
						|
 * Tests dialog close on navigation triggered by web content.
 | 
						|
 */
 | 
						|
add_task(async function test_tabdialogbox_close_on_content_nav() {
 | 
						|
  await BrowserTestUtils.withNewTab(
 | 
						|
    "https://example.com",
 | 
						|
    async function (browser) {
 | 
						|
      // Open a dialog and wait for it to be ready
 | 
						|
      let dialogBox = gBrowser.getTabDialogBox(browser);
 | 
						|
      let { closedPromise } = dialogBox.open(TEST_DIALOG_PATH);
 | 
						|
 | 
						|
      let dialog = dialogBox.getTabDialogManager()._topDialog;
 | 
						|
 | 
						|
      is(
 | 
						|
        dialogBox.getTabDialogManager()._dialogs.length,
 | 
						|
        1,
 | 
						|
        "Dialog manager has one dialog."
 | 
						|
      );
 | 
						|
 | 
						|
      info("Waiting for dialog to open.");
 | 
						|
      await dialog._dialogReady;
 | 
						|
 | 
						|
      // Trigger a same origin navigation by the content
 | 
						|
      await ContentTask.spawn(browser, {}, () => {
 | 
						|
        // eslint-disable-next-line @microsoft/sdl/no-insecure-url
 | 
						|
        content.location = "http://example.com/1";
 | 
						|
      });
 | 
						|
 | 
						|
      info("Waiting for dialog to close.");
 | 
						|
      await closedPromise;
 | 
						|
      ok(
 | 
						|
        true,
 | 
						|
        "Dialog should close for same origin navigation by the content."
 | 
						|
      );
 | 
						|
 | 
						|
      // Open a new dialog
 | 
						|
      closedPromise = dialogBox.open(TEST_DIALOG_PATH, {
 | 
						|
        keepOpenSameOriginNav: true,
 | 
						|
      }).closedPromise;
 | 
						|
 | 
						|
      info("Waiting for dialog to open.");
 | 
						|
      await dialog._dialogReady;
 | 
						|
 | 
						|
      SimpleTest.requestFlakyTimeout("Waiting to ensure dialog does not close");
 | 
						|
      let race = Promise.race([
 | 
						|
        closedPromise,
 | 
						|
        // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
 | 
						|
        new Promise(resolve => setTimeout(() => resolve("success"), 1000)),
 | 
						|
      ]);
 | 
						|
 | 
						|
      // Trigger a same origin navigation by the content
 | 
						|
      await ContentTask.spawn(browser, {}, () => {
 | 
						|
        // eslint-disable-next-line @microsoft/sdl/no-insecure-url
 | 
						|
        content.location = "http://example.com/test";
 | 
						|
      });
 | 
						|
 | 
						|
      is(
 | 
						|
        await race,
 | 
						|
        "success",
 | 
						|
        "Dialog should not close for same origin navigation by the content."
 | 
						|
      );
 | 
						|
 | 
						|
      // Trigger a cross origin navigation by the content
 | 
						|
      await ContentTask.spawn(browser, {}, () => {
 | 
						|
        // eslint-disable-next-line @microsoft/sdl/no-insecure-url
 | 
						|
        content.location = "http://example.org/test2";
 | 
						|
      });
 | 
						|
 | 
						|
      info("Waiting for dialog to close");
 | 
						|
      await closedPromise;
 | 
						|
 | 
						|
      ok(
 | 
						|
        true,
 | 
						|
        "Dialog should close for cross origin navigation by the content."
 | 
						|
      );
 | 
						|
    }
 | 
						|
  );
 | 
						|
});
 | 
						|
 | 
						|
/**
 | 
						|
 * Hides a dialog stack and tests that behavior doesn't change. Ensures
 | 
						|
 * navigation triggered by web content still closes all dialogs.
 | 
						|
 */
 | 
						|
add_task(async function test_tabdialogbox_hide() {
 | 
						|
  await BrowserTestUtils.withNewTab(
 | 
						|
    "https://example.com",
 | 
						|
    async function (browser) {
 | 
						|
      // Open a dialog and wait for it to be ready
 | 
						|
      let dialogBox = gBrowser.getTabDialogBox(browser);
 | 
						|
      let dialogBoxManager = dialogBox.getTabDialogManager();
 | 
						|
      let closedPromises = [
 | 
						|
        dialogBox.open(TEST_DIALOG_PATH).closedPromise,
 | 
						|
        dialogBox.open(TEST_DIALOG_PATH).closedPromise,
 | 
						|
      ];
 | 
						|
 | 
						|
      let dialogs = dialogBox.getTabDialogManager()._dialogs;
 | 
						|
 | 
						|
      is(
 | 
						|
        dialogBox.getTabDialogManager()._dialogs.length,
 | 
						|
        2,
 | 
						|
        "Dialog manager has two dialogs."
 | 
						|
      );
 | 
						|
 | 
						|
      info("Waiting for dialogs to open.");
 | 
						|
      await Promise.all(dialogs.map(dialog => dialog._dialogReady));
 | 
						|
 | 
						|
      ok(
 | 
						|
        !BrowserTestUtils.is_hidden(dialogBoxManager._dialogStack),
 | 
						|
        "Dialog stack is showing"
 | 
						|
      );
 | 
						|
 | 
						|
      dialogBoxManager.hideDialog(browser);
 | 
						|
 | 
						|
      is(
 | 
						|
        dialogBoxManager._dialogs.length,
 | 
						|
        2,
 | 
						|
        "Dialog manager still has two dialogs."
 | 
						|
      );
 | 
						|
 | 
						|
      ok(
 | 
						|
        BrowserTestUtils.is_hidden(dialogBoxManager._dialogStack),
 | 
						|
        "Dialog stack is hidden"
 | 
						|
      );
 | 
						|
 | 
						|
      // Navigate to a different page
 | 
						|
      BrowserTestUtils.startLoadingURIString(browser, "https://example.org");
 | 
						|
 | 
						|
      info("Waiting for dialogs to close.");
 | 
						|
      await closedPromises;
 | 
						|
 | 
						|
      ok(true, "All open dialogs should still close on navigation");
 | 
						|
    }
 | 
						|
  );
 | 
						|
});
 |