browser_cleaner.js (6884B)
1 /* Any copyright is dedicated to the Public Domain. 2 * http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 /* 5 * This test ensures that Session Restore eventually forgets about 6 * tabs and windows that have been closed a long time ago. 7 */ 8 9 "use strict"; 10 11 const LONG_TIME_AGO = 1; 12 13 const URL_TAB1 = 14 "http://example.com/browser_cleaner.js?newtab1=" + Math.random(); 15 const URL_TAB2 = 16 "http://example.com/browser_cleaner.js?newtab2=" + Math.random(); 17 const URL_NEWGROUP = 18 "http://example.com/browser_cleaner.js?newgroup=" + Math.random(); 19 const URL_NEWWIN = 20 "http://example.com/browser_cleaner.js?newwin=" + Math.random(); 21 22 function isRecent(stamp) { 23 is(typeof stamp, "number", "This is a timestamp"); 24 return Date.now() - stamp <= 60000; 25 } 26 27 function promiseCleanup() { 28 info("Cleaning up browser"); 29 30 return promiseBrowserState(getClosedState()); 31 } 32 33 function getClosedState() { 34 return Cu.cloneInto(CLOSED_STATE, {}); 35 } 36 37 var CLOSED_STATE; 38 39 add_setup(async function () { 40 forgetClosedWindows(); 41 forgetClosedTabs(window); 42 forgetClosedTabGroups(window); 43 }); 44 45 add_task(async function test_open_and_close() { 46 let newTab1 = BrowserTestUtils.addTab(gBrowser, URL_TAB1); 47 await promiseBrowserLoaded(newTab1.linkedBrowser); 48 49 let newTab2 = BrowserTestUtils.addTab(gBrowser, URL_TAB2); 50 await promiseBrowserLoaded(newTab2.linkedBrowser); 51 52 let newGroupTab = BrowserTestUtils.addTab(gBrowser, URL_NEWGROUP); 53 await promiseBrowserLoaded(newGroupTab.linkedBrowser); 54 let newGroup = gBrowser.addTabGroup([newGroupTab]); 55 56 let newWin = await promiseNewWindowLoaded(); 57 let tab = BrowserTestUtils.addTab(newWin.gBrowser, URL_NEWWIN); 58 59 await promiseBrowserLoaded(tab.linkedBrowser); 60 61 await TabStateFlusher.flushWindow(window); 62 await TabStateFlusher.flushWindow(newWin); 63 64 info("1. Making sure that before closing, we don't have closedAt"); 65 // For the moment, no "closedAt" 66 let state = JSON.parse(ss.getBrowserState()); 67 is( 68 state.windows[0].closedAt || false, 69 false, 70 "1. Main window doesn't have closedAt" 71 ); 72 is( 73 state.windows[1].closedAt || false, 74 false, 75 "1. Second window doesn't have closedAt" 76 ); 77 is( 78 state.windows[0].tabs[0].closedAt || false, 79 false, 80 "1. First tab doesn't have closedAt" 81 ); 82 is( 83 state.windows[0].tabs[1].closedAt || false, 84 false, 85 "1. Second tab doesn't have closedAt" 86 ); 87 is( 88 state.windows[0].tabs[2].closedAt || false, 89 false, 90 "1. Grouped tab doesn't have closedAt" 91 ); 92 is( 93 state.windows[0].groups[0].closedAt || false, 94 false, 95 "1. Group doesn't have closedAt" 96 ); 97 98 info("2. Making sure that after closing, we have closedAt"); 99 100 // Now close stuff, this should add closeAt 101 await BrowserTestUtils.closeWindow(newWin); 102 await promiseRemoveTabAndSessionState(newTab1); 103 await promiseRemoveTabAndSessionState(newTab2); 104 105 let removePromise = BrowserTestUtils.waitForEvent( 106 newGroup, 107 "TabGroupRemoved" 108 ); 109 gBrowser.removeTabGroup(newGroup); 110 await removePromise; 111 112 state = CLOSED_STATE = JSON.parse(ss.getBrowserState()); 113 114 is( 115 state.windows[0].closedAt || false, 116 false, 117 "2. Main window doesn't have closedAt" 118 ); 119 ok( 120 isRecent(state._closedWindows[0].closedAt), 121 "2. Second window was closed recently" 122 ); 123 ok( 124 isRecent(state.windows[0]._closedTabs[0].closedAt), 125 "2. First tab was closed recently" 126 ); 127 ok( 128 isRecent(state.windows[0]._closedTabs[1].closedAt), 129 "2. Second tab was closed recently" 130 ); 131 ok( 132 isRecent(state.windows[0].closedGroups[0].closedAt), 133 "2. Group was closed recently" 134 ); 135 }); 136 137 add_task(async function test_restore() { 138 info("3. Making sure that after restoring, we don't have closedAt"); 139 await promiseBrowserState(CLOSED_STATE); 140 141 let newWin = ss.undoCloseWindow(0); 142 await promiseDelayedStartupFinished(newWin); 143 144 let newTab2 = ss.undoCloseTab(window, 0, window); 145 await promiseTabRestored(newTab2); 146 147 let newTab1 = ss.undoCloseTab(window, 0, window); 148 await promiseTabRestored(newTab1); 149 150 let state = JSON.parse(ss.getBrowserState()); 151 is( 152 state.windows[0].closedAt || false, 153 false, 154 "3. Main window doesn't have closedAt" 155 ); 156 is( 157 state.windows[1].closedAt || false, 158 false, 159 "3. Second window doesn't have closedAt" 160 ); 161 is( 162 state.windows[0].tabs[0].closedAt || false, 163 false, 164 "3. First tab doesn't have closedAt" 165 ); 166 is( 167 state.windows[0].tabs[1].closedAt || false, 168 false, 169 "3. Second tab doesn't have closedAt" 170 ); 171 172 await BrowserTestUtils.closeWindow(newWin); 173 gBrowser.removeTab(newTab1); 174 gBrowser.removeTab(newTab2); 175 }); 176 177 add_task(async function test_old_data() { 178 info( 179 "4. Removing closedAt from the sessionstore, making sure that it is added upon idle-daily" 180 ); 181 182 let state = getClosedState(); 183 delete state._closedWindows[0].closedAt; 184 delete state.windows[0]._closedTabs[0].closedAt; 185 delete state.windows[0]._closedTabs[1].closedAt; 186 delete state.windows[0].closedGroups[0].closedAt; 187 await promiseBrowserState(state); 188 189 info("Sending idle-daily"); 190 Services.obs.notifyObservers(null, "idle-daily"); 191 info("Sent idle-daily"); 192 193 state = JSON.parse(ss.getBrowserState()); 194 is( 195 state.windows[0].closedAt || false, 196 false, 197 "4. Main window doesn't have closedAt" 198 ); 199 ok( 200 isRecent(state._closedWindows[0].closedAt), 201 "4. Second window was closed recently" 202 ); 203 ok( 204 isRecent(state.windows[0]._closedTabs[0].closedAt), 205 "4. First tab was closed recently" 206 ); 207 ok( 208 isRecent(state.windows[0]._closedTabs[1].closedAt), 209 "4. Second tab was closed recently" 210 ); 211 ok( 212 isRecent(state.windows[0].closedGroups[0].closedAt), 213 "4. Group was closed recently" 214 ); 215 await promiseCleanup(); 216 }); 217 218 add_task(async function test_cleanup() { 219 info( 220 "5. Altering closedAt to an old date, making sure that stuff gets collected, eventually" 221 ); 222 await promiseCleanup(); 223 224 let state = getClosedState(); 225 state._closedWindows[0].closedAt = LONG_TIME_AGO; 226 state.windows[0]._closedTabs[0].closedAt = LONG_TIME_AGO; 227 state.windows[0].closedGroups[0].closedAt = LONG_TIME_AGO; 228 state.windows[0]._closedTabs[1].closedAt = Date.now(); 229 let url = state.windows[0]._closedTabs[1].state.entries[0].url; 230 231 await promiseBrowserState(state); 232 233 info("Sending idle-daily"); 234 Services.obs.notifyObservers(null, "idle-daily"); 235 info("Sent idle-daily"); 236 237 state = JSON.parse(ss.getBrowserState()); 238 is(state._closedWindows[0], undefined, "5. Second window was forgotten"); 239 is(state.windows[0].closedGroups[0], undefined, "5. Tab group was forgotten"); 240 241 is(state.windows[0]._closedTabs.length, 1, "5. Only one closed tab left"); 242 is( 243 state.windows[0]._closedTabs[0].state.entries[0].url, 244 url, 245 "5. The second tab is still here" 246 ); 247 248 await promiseCleanup(); 249 250 // Cleanup closed tab group 251 forgetClosedTabGroups(window); 252 });