forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			58 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| 
 | |
| add_task(async function () {
 | |
|   const outer =
 | |
|     "http://mochi.test:8888/browser/docshell/test/browser/file_onbeforeunload_nested_outer.html";
 | |
|   await BrowserTestUtils.withNewTab(outer, async browser => {
 | |
|     let inner = browser.browsingContext.children[0];
 | |
| 
 | |
|     // Install a beforeunload event handler that resolves a promise.
 | |
|     await SpecialPowers.spawn(inner, [], () => {
 | |
|       let { promise, resolve } = Promise.withResolvers();
 | |
|       content.addEventListener(
 | |
|         "beforeunload",
 | |
|         e => {
 | |
|           e.preventDefault();
 | |
|           resolve();
 | |
|         },
 | |
|         {
 | |
|           once: true,
 | |
|         }
 | |
|       );
 | |
|       content.beforeunloadPromise = promise;
 | |
|     });
 | |
| 
 | |
|     // Get the promise for the beforeunload handler so we can wait for it.
 | |
|     let beforeunloadFired = SpecialPowers.spawn(
 | |
|       browser.browsingContext.children[0],
 | |
|       [],
 | |
|       () => {
 | |
|         return content.beforeunloadPromise;
 | |
|       }
 | |
|     );
 | |
| 
 | |
|     // Register whether a load has started.
 | |
|     let loaded = BrowserTestUtils.browserLoaded(browser).then(() => "loaded");
 | |
| 
 | |
|     // This is rather fragile, but we need to make sure we don't start a
 | |
|     // speculative load in the parent so let's give it the time to be done.
 | |
|     let timeout = new Promise(resolve =>
 | |
|       // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
 | |
|       setTimeout(() => resolve("timeout"), 3000)
 | |
|     );
 | |
| 
 | |
|     // Need to add some user interaction for beforeunload.
 | |
|     await BrowserTestUtils.synthesizeMouse("body", 0, 0, {}, inner, true);
 | |
| 
 | |
|     // Try to start a speculative load in the parent.
 | |
|     BrowserTestUtils.startLoadingURIString(browser, "https://example.com/");
 | |
| 
 | |
|     await beforeunloadFired;
 | |
| 
 | |
|     is(
 | |
|       await Promise.race([loaded, timeout]),
 | |
|       "timeout",
 | |
|       "Timed out because the load was blocked by beforeunload."
 | |
|     );
 | |
|   });
 | |
| });
 | 
