tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 });