browser_394759_purge.js (6279B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 let { ForgetAboutSite } = ChromeUtils.importESModule( 6 "resource://gre/modules/ForgetAboutSite.sys.mjs" 7 ); 8 9 function promiseClearHistory() { 10 return new Promise(resolve => { 11 let observer = { 12 observe() { 13 Services.obs.removeObserver( 14 this, 15 "browser:purge-session-history-for-domain" 16 ); 17 resolve(); 18 }, 19 }; 20 Services.obs.addObserver( 21 observer, 22 "browser:purge-session-history-for-domain" 23 ); 24 }); 25 } 26 27 add_task(async function () { 28 // utility functions 29 function countClosedTabsByTitle(aClosedTabList, aTitle) { 30 return aClosedTabList.filter(aData => aData.title == aTitle).length; 31 } 32 33 function countOpenTabsByTitle(aOpenTabList, aTitle) { 34 return aOpenTabList.filter(aData => 35 aData.entries.some(aEntry => aEntry.title == aTitle) 36 ).length; 37 } 38 39 // backup old state 40 let oldState = ss.getBrowserState(); 41 let oldState_wins = JSON.parse(oldState).windows.length; 42 if (oldState_wins != 1) { 43 ok( 44 false, 45 "oldState in test_purge has " + oldState_wins + " windows instead of 1" 46 ); 47 } 48 49 // create a new state for testing 50 const REMEMBER = Date.now(), 51 FORGET = Math.random(); 52 let testState = { 53 windows: [ 54 { 55 tabs: [ 56 { 57 entries: [ 58 { url: "http://example.com/", triggeringPrincipal_base64 }, 59 ], 60 }, 61 ], 62 selected: 1, 63 }, 64 ], 65 _closedWindows: [ 66 // _closedWindows[0] 67 { 68 tabs: [ 69 { 70 entries: [ 71 { 72 url: "http://example.com/", 73 triggeringPrincipal_base64, 74 title: REMEMBER, 75 }, 76 ], 77 }, 78 { 79 entries: [ 80 { 81 url: "http://mozilla.org/", 82 triggeringPrincipal_base64, 83 title: FORGET, 84 }, 85 ], 86 }, 87 ], 88 selected: 2, 89 title: "mozilla.org", 90 _closedTabs: [], 91 closedGroups: [], 92 }, 93 // _closedWindows[1] 94 { 95 tabs: [ 96 { 97 entries: [ 98 { 99 url: "http://mozilla.org/", 100 triggeringPrincipal_base64, 101 title: FORGET, 102 }, 103 ], 104 }, 105 { 106 entries: [ 107 { 108 url: "http://example.com/", 109 triggeringPrincipal_base64, 110 title: REMEMBER, 111 }, 112 ], 113 }, 114 { 115 entries: [ 116 { 117 url: "http://example.com/", 118 triggeringPrincipal_base64, 119 title: REMEMBER, 120 }, 121 ], 122 }, 123 { 124 entries: [ 125 { 126 url: "http://mozilla.org/", 127 triggeringPrincipal_base64, 128 title: FORGET, 129 }, 130 ], 131 }, 132 { 133 entries: [ 134 { 135 url: "http://example.com/", 136 triggeringPrincipal_base64, 137 title: REMEMBER, 138 }, 139 ], 140 }, 141 ], 142 selected: 5, 143 _closedTabs: [], 144 closedGroups: [], 145 }, 146 // _closedWindows[2] 147 { 148 tabs: [ 149 { 150 entries: [ 151 { 152 url: "http://example.com/", 153 triggeringPrincipal_base64, 154 title: REMEMBER, 155 }, 156 ], 157 }, 158 ], 159 selected: 1, 160 _closedTabs: [ 161 { 162 state: { 163 entries: [ 164 { 165 url: "http://mozilla.org/", 166 triggeringPrincipal_base64, 167 title: FORGET, 168 }, 169 { 170 url: "http://mozilla.org/again", 171 triggeringPrincipal_base64, 172 title: "doesn't matter", 173 }, 174 ], 175 }, 176 pos: 1, 177 title: FORGET, 178 }, 179 { 180 state: { 181 entries: [ 182 { 183 url: "http://example.com", 184 triggeringPrincipal_base64, 185 title: REMEMBER, 186 }, 187 ], 188 }, 189 title: REMEMBER, 190 }, 191 ], 192 closedGroups: [], 193 }, 194 ], 195 }; 196 197 // set browser to test state 198 ss.setBrowserState(JSON.stringify(testState)); 199 200 // purge domain & check that we purged correctly for closed windows 201 let clearHistoryPromise = promiseClearHistory(); 202 await ForgetAboutSite.removeDataFromBaseDomain("mozilla.org"); 203 await clearHistoryPromise; 204 205 let closedWindowData = ss.getClosedWindowData(); 206 207 // First set of tests for _closedWindows[0] - tests basics 208 let win = closedWindowData[0]; 209 is(win.tabs.length, 1, "1 tab was removed"); 210 is(countOpenTabsByTitle(win.tabs, FORGET), 0, "The correct tab was removed"); 211 is( 212 countOpenTabsByTitle(win.tabs, REMEMBER), 213 1, 214 "The correct tab was remembered" 215 ); 216 is(win.selected, 1, "Selected tab has changed"); 217 is(win.title, REMEMBER, "The window title was correctly updated"); 218 219 // Test more complicated case 220 win = closedWindowData[1]; 221 is(win.tabs.length, 3, "2 tabs were removed"); 222 is( 223 countOpenTabsByTitle(win.tabs, FORGET), 224 0, 225 "The correct tabs were removed" 226 ); 227 is( 228 countOpenTabsByTitle(win.tabs, REMEMBER), 229 3, 230 "The correct tabs were remembered" 231 ); 232 is(win.selected, 3, "Selected tab has changed"); 233 is(win.title, REMEMBER, "The window title was correctly updated"); 234 235 // Tests handling of _closedTabs 236 win = closedWindowData[2]; 237 is( 238 countClosedTabsByTitle(win._closedTabs, REMEMBER), 239 1, 240 "The correct number of tabs were removed, and the correct ones" 241 ); 242 is( 243 countClosedTabsByTitle(win._closedTabs, FORGET), 244 0, 245 "All tabs to be forgotten were indeed removed" 246 ); 247 248 // restore pre-test state 249 ss.setBrowserState(oldState); 250 });