forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			61 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* Any copyright is dedicated to the Public Domain.
 | 
						|
   http://creativecommons.org/publicdomain/zero/1.0/ */
 | 
						|
 | 
						|
"use strict";
 | 
						|
 | 
						|
add_task(async function test_multiple_dialog_navigation() {
 | 
						|
  await BrowserTestUtils.withNewTab(
 | 
						|
    "https://example.com/gone",
 | 
						|
    async browser => {
 | 
						|
      let firstDialogPromise = BrowserTestUtils.promiseAlertDialogOpen();
 | 
						|
      // We're gonna queue up some dialogs, and navigate. The tasks queueing the dialog
 | 
						|
      // are going to get aborted when the navigation happened, but that's OK because by
 | 
						|
      // that time they will have done their job. Detect and swallow that specific
 | 
						|
      // exception:
 | 
						|
      let navigationCatcher = e => {
 | 
						|
        if (e.name == "AbortError" && e.message.includes("destroyed before")) {
 | 
						|
          return;
 | 
						|
        }
 | 
						|
        throw e;
 | 
						|
      };
 | 
						|
      // Queue up 2 dialogs
 | 
						|
      let firstTask = SpecialPowers.spawn(browser, [], async function() {
 | 
						|
        content.eval(`alert('hi');`);
 | 
						|
      }).catch(navigationCatcher);
 | 
						|
      let secondTask = SpecialPowers.spawn(browser, [], async function() {
 | 
						|
        content.eval(`alert('hi again');`);
 | 
						|
      }).catch(navigationCatcher);
 | 
						|
      info("Waiting for first dialog.");
 | 
						|
      let dialogWin = await firstDialogPromise;
 | 
						|
 | 
						|
      let secondDialogPromise = BrowserTestUtils.promiseAlertDialogOpen();
 | 
						|
      dialogWin.document
 | 
						|
        .getElementById("commonDialog")
 | 
						|
        .getButton("accept")
 | 
						|
        .click();
 | 
						|
      dialogWin = null;
 | 
						|
 | 
						|
      info("Wait for second dialog to appear.");
 | 
						|
      let secondDialogWin = await secondDialogPromise;
 | 
						|
      let closedPromise = BrowserTestUtils.waitForEvent(
 | 
						|
        secondDialogWin,
 | 
						|
        "unload"
 | 
						|
      );
 | 
						|
      let loadedOtherPage = BrowserTestUtils.waitForLocationChange(
 | 
						|
        gBrowser,
 | 
						|
        "https://example.org/gone"
 | 
						|
      );
 | 
						|
      BrowserTestUtils.loadURI(browser, "https://example.org/gone");
 | 
						|
      info("Waiting for the next page to load.");
 | 
						|
      await loadedOtherPage;
 | 
						|
      info(
 | 
						|
        "Waiting for second dialog to close. If we time out here that's a bug!"
 | 
						|
      );
 | 
						|
      await closedPromise;
 | 
						|
      is(secondDialogWin.closed, true, "Should have closed second dialog.");
 | 
						|
      info("Ensure content tasks are done");
 | 
						|
      await secondTask;
 | 
						|
      await firstTask;
 | 
						|
    }
 | 
						|
  );
 | 
						|
});
 |