browser_590563.js (3267B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 add_task(async function () { 5 let sessionData = { 6 windows: [ 7 { 8 tabs: [ 9 { 10 entries: [{ url: "about:mozilla", triggeringPrincipal_base64 }], 11 hidden: true, 12 }, 13 { 14 entries: [{ url: "about:blank", triggeringPrincipal_base64 }], 15 hidden: false, 16 }, 17 ], 18 }, 19 ], 20 }; 21 let url = "about:sessionrestore"; 22 let formdata = { id: { sessionData }, url }; 23 let state = { 24 windows: [ 25 { tabs: [{ entries: [{ url, triggeringPrincipal_base64 }], formdata }] }, 26 ], 27 }; 28 29 let win = await newWindowWithState(state); 30 31 registerCleanupFunction(() => BrowserTestUtils.closeWindow(win)); 32 33 is(gBrowser.tabs.length, 1, "The total number of tabs should be 1"); 34 is( 35 gBrowser.visibleTabs.length, 36 1, 37 "The total number of visible tabs should be 1" 38 ); 39 40 await new Promise(resolve => executeSoon(resolve)); 41 await new Promise(resolve => waitForFocus(resolve, win)); 42 await middleClickTest(win); 43 }); 44 45 async function middleClickTest(win) { 46 let browser = win.gBrowser.selectedBrowser; 47 let tabsToggle = browser.contentDocument.getElementById("tabsToggle"); 48 EventUtils.synthesizeMouseAtCenter( 49 tabsToggle, 50 { button: 0 }, 51 browser.contentWindow 52 ); 53 let tree = browser.contentDocument.getElementById("tabList"); 54 await BrowserTestUtils.waitForCondition(() => !tree.hasAttribute("hidden")); 55 // Force a layout flush before accessing coordinates. 56 tree.getBoundingClientRect(); 57 58 is(tree.view.rowCount, 3, "There should be three items"); 59 60 // click on the first tab item 61 var rect = tree.getCoordsForCellItem(1, tree.columns[1], "text"); 62 EventUtils.synthesizeMouse( 63 tree.body, 64 rect.x, 65 rect.y, 66 { button: 1 }, 67 browser.contentWindow 68 ); 69 // click on the second tab item 70 rect = tree.getCoordsForCellItem(2, tree.columns[1], "text"); 71 EventUtils.synthesizeMouse( 72 tree.body, 73 rect.x, 74 rect.y, 75 { button: 1 }, 76 browser.contentWindow 77 ); 78 79 is( 80 win.gBrowser.tabs.length, 81 3, 82 "The total number of tabs should be 3 after restoring 2 tabs by middle click." 83 ); 84 is( 85 win.gBrowser.visibleTabs.length, 86 3, 87 "The total number of visible tabs should be 3 after restoring 2 tabs by middle click" 88 ); 89 } 90 91 async function newWindowWithState(state) { 92 let opts = "chrome,all,dialog=no,height=800,width=800"; 93 let win = window.openDialog(AppConstants.BROWSER_CHROME_URL, "_blank", opts); 94 95 await BrowserTestUtils.waitForEvent(win, "load"); 96 97 // The form data will be restored before SSTabRestored, so we want to listen 98 // for that on the currently selected tab 99 await new Promise(resolve => { 100 win.gBrowser.tabContainer.addEventListener( 101 "SSTabRestored", 102 function onSSTabRestored(event) { 103 let tab = event.target; 104 if (tab.selected) { 105 win.gBrowser.tabContainer.removeEventListener( 106 "SSTabRestored", 107 onSSTabRestored, 108 true 109 ); 110 resolve(); 111 } 112 }, 113 true 114 ); 115 116 executeSoon(() => ss.setWindowState(win, JSON.stringify(state), true)); 117 }); 118 119 return win; 120 }