browser_aboutRestartrequired_noRestore.js (3973B)
1 "use strict"; 2 3 function isEntriesMatchingOnURL(A, B) { 4 const AUrls = A.entries.map(e => e.url); 5 const BUrls = B.entries.map(e => e.url); 6 7 if (AUrls.entries.length !== BUrls.entries.length) { 8 return false; 9 } 10 11 for (let url of AUrls) { 12 if (!BUrls.includes(url)) { 13 return false; 14 } 15 } 16 17 return true; 18 } 19 20 function setState(aTab, aState) { 21 // Prepare the tab state. 22 let promise = promiseTabRestoring(aTab); 23 // setTabState will go through TabState.copyFromCache() from 24 // TabState.collect() triggered by saveStateAsyncWhenIdle() 25 ss.setTabState(aTab, JSON.stringify(aState)); 26 return promise; 27 } 28 29 async function cleanup(aBrowser, aTab) { 30 // Flush to ensure the parent has all data. 31 await TabStateFlusher.flush(aBrowser); 32 33 // Cleanup. 34 gBrowser.removeTab(aTab); 35 } 36 37 async function getBrowserTab() { 38 // Create a background tab. 39 let tab = BrowserTestUtils.addTab(gBrowser, "about:blank"); 40 let browser = tab.linkedBrowser; 41 await BrowserTestUtils.browserLoaded(browser, { wantLoad: "about:blank" }); 42 return [tab, browser]; 43 } 44 45 add_setup(async function () { 46 // The tab shouldn't be restored right away. 47 Services.prefs.setBoolPref("browser.sessionstore.restore_on_demand", true); 48 }); 49 50 add_task(async function only_about_restartrequired() { 51 const TAB_STATE = { 52 entries: [{ url: "about:restartrequired", triggeringPrincipal_base64 }], 53 }; 54 55 let [tab, browser] = await getBrowserTab(); 56 57 const previousTabState = TabState.collect( 58 tab, 59 ss.getInternalObjectState(tab) 60 ); 61 is(previousTabState.entries.length, 0, "No entries before"); 62 63 await setState(tab, TAB_STATE); 64 65 const collectedTabState = TabState.collect( 66 tab, 67 ss.getInternalObjectState(tab) 68 ); 69 is(collectedTabState.entries.length, 0, "No entry found"); 70 71 await cleanup(browser, tab); 72 }); 73 74 add_task(async function one_and_about_restartrequired() { 75 const TAB_STATE = { 76 entries: [ 77 { url: "https://www.mozilla.org", triggeringPrincipal_base64 }, 78 { url: "about:restartrequired", triggeringPrincipal_base64 }, 79 ], 80 }; 81 82 let [tab, browser] = await getBrowserTab(); 83 84 const previousTabState = TabState.collect( 85 tab, 86 ss.getInternalObjectState(tab) 87 ); 88 is(previousTabState.entries.length, 0, "No entries before"); 89 90 await setState(tab, TAB_STATE); 91 92 const collectedTabState = TabState.collect( 93 tab, 94 ss.getInternalObjectState(tab) 95 ); 96 is( 97 collectedTabState.entries[0].url, 98 "https://www.mozilla.org", 99 "One entry found" 100 ); 101 102 await cleanup(browser, tab); 103 }); 104 105 add_task(async function about_restartrequired_with_params() { 106 const TAB_STATE = { 107 entries: [ 108 { 109 url: "about:restartrequired?e=restartrequired&u=about%3Asupport&c=UTF-8&d=%20", 110 triggeringPrincipal_base64, 111 }, 112 ], 113 }; 114 115 let [tab, browser] = await getBrowserTab(); 116 117 const previousTabState = TabState.collect( 118 tab, 119 ss.getInternalObjectState(tab) 120 ); 121 is(previousTabState.entries.length, 0, "No entries before"); 122 123 await setState(tab, TAB_STATE); 124 125 const collectedTabState = TabState.collect( 126 tab, 127 ss.getInternalObjectState(tab) 128 ); 129 is(collectedTabState.entries[0].url, "about:support", "One entry found"); 130 131 await cleanup(browser, tab); 132 }); 133 134 add_task(async function about_restartrequired_evil() { 135 const TAB_STATE = { 136 entries: [ 137 { 138 url: "https://www.mozilla.org/?u=http://evil.example.org&someParam=about:restartrequired", 139 triggeringPrincipal_base64, 140 }, 141 ], 142 }; 143 144 let [tab, browser] = await getBrowserTab(); 145 146 const previousTabState = TabState.collect( 147 tab, 148 ss.getInternalObjectState(tab) 149 ); 150 is(previousTabState.entries.length, 0, "No entries before"); 151 152 await setState(tab, TAB_STATE); 153 154 const collectedTabState = TabState.collect( 155 tab, 156 ss.getInternalObjectState(tab) 157 ); 158 is( 159 collectedTabState.entries[0].url, 160 TAB_STATE.entries[0].url, 161 "Original URL found" 162 ); 163 164 await cleanup(browser, tab); 165 });