browser_async_duplicate_tab.js (2492B)
1 "use strict"; 2 3 const PATH = getRootDirectory(gTestPath).replace( 4 "chrome://mochitests/content/", 5 "http://example.com/" 6 ); 7 const URL = PATH + "file_async_duplicate_tab.html"; 8 9 add_task(async function test_duplicate() { 10 // Create new tab. 11 let tab = BrowserTestUtils.addTab(gBrowser, URL); 12 let browser = tab.linkedBrowser; 13 await promiseBrowserLoaded(browser); 14 15 // Flush to empty any queued update messages. 16 await TabStateFlusher.flush(browser); 17 18 // Click the link to navigate, this will add second shistory entry. 19 await SpecialPowers.spawn(browser, [], async function () { 20 return new Promise(resolve => { 21 docShell.chromeEventHandler.addEventListener( 22 "hashchange", 23 () => resolve(), 24 { once: true, capture: true } 25 ); 26 27 // Click the link. 28 content.document.querySelector("a").click(); 29 }); 30 }); 31 32 // Duplicate the tab. 33 let tab2 = ss.duplicateTab(window, tab); 34 35 // Wait until the tab has fully restored. 36 await promiseTabRestored(tab2); 37 await TabStateFlusher.flush(tab2.linkedBrowser); 38 39 // There should be two history entries now. 40 let { entries } = JSON.parse(ss.getTabState(tab2)); 41 is(entries.length, 2, "there are two shistory entries"); 42 43 // Cleanup. 44 BrowserTestUtils.removeTab(tab2); 45 BrowserTestUtils.removeTab(tab); 46 }); 47 48 add_task(async function test_duplicate_remove() { 49 // Create new tab. 50 let tab = BrowserTestUtils.addTab(gBrowser, URL); 51 let browser = tab.linkedBrowser; 52 await promiseBrowserLoaded(browser); 53 54 // Flush to empty any queued update messages. 55 await TabStateFlusher.flush(browser); 56 57 // Click the link to navigate, this will add second shistory entry. 58 await SpecialPowers.spawn(browser, [], async function () { 59 return new Promise(resolve => { 60 docShell.chromeEventHandler.addEventListener( 61 "hashchange", 62 () => resolve(), 63 { once: true, capture: true } 64 ); 65 66 // Click the link. 67 content.document.querySelector("a").click(); 68 }); 69 }); 70 71 // Duplicate the tab. 72 let tab2 = ss.duplicateTab(window, tab); 73 74 // Before the duplication finished, remove the tab. 75 await Promise.all([ 76 promiseRemoveTabAndSessionState(tab), 77 promiseTabRestored(tab2), 78 ]); 79 await TabStateFlusher.flush(tab2.linkedBrowser); 80 81 // There should be two history entries now. 82 let { entries } = JSON.parse(ss.getTabState(tab2)); 83 is(entries.length, 2, "there are two shistory entries"); 84 85 // Cleanup. 86 BrowserTestUtils.removeTab(tab2); 87 });