tor-browser

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

browser_sanitize-offlineData.js (7645B)


      1 /* Any copyright is dedicated to the Public Domain.
      2 * http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 // Bug 380852 - Delete permission manager entries in Clear Recent History
      5 
      6 const { SiteDataTestUtils } = ChromeUtils.importESModule(
      7  "resource://testing-common/SiteDataTestUtils.sys.mjs"
      8 );
      9 const { PromiseTestUtils } = ChromeUtils.importESModule(
     10  "resource://testing-common/PromiseTestUtils.sys.mjs"
     11 );
     12 
     13 XPCOMUtils.defineLazyServiceGetter(
     14  this,
     15  "sas",
     16  "@mozilla.org/storage/activity-service;1",
     17  Ci.nsIStorageActivityService
     18 );
     19 XPCOMUtils.defineLazyServiceGetter(
     20  this,
     21  "swm",
     22  "@mozilla.org/serviceworkers/manager;1",
     23  Ci.nsIServiceWorkerManager
     24 );
     25 
     26 const oneHour = 3600000000;
     27 const fiveHours = oneHour * 5;
     28 
     29 function waitForUnregister(host) {
     30  return new Promise(resolve => {
     31    let listener = {
     32      onUnregister: registration => {
     33        if (registration.principal.host != host) {
     34          return;
     35        }
     36        swm.removeListener(listener);
     37        resolve(registration);
     38      },
     39    };
     40    swm.addListener(listener);
     41  });
     42 }
     43 
     44 function moveOriginInTime(principals, endDate, host) {
     45  for (let i = 0; i < principals.length; ++i) {
     46    let principal = principals.queryElementAt(i, Ci.nsIPrincipal);
     47    if (principal.host == host) {
     48      sas.moveOriginInTime(principal, endDate - fiveHours);
     49      return true;
     50    }
     51  }
     52  return false;
     53 }
     54 
     55 // We will be removing the ["cookies","offlineApps"] option once we remove the
     56 // old clear history dialog in Bug 1856418 - Remove all old clear data dialog boxes
     57 let prefs = [["cookiesAndStorage"], ["cookies", "offlineApps"]];
     58 
     59 for (let itemsToClear of prefs) {
     60  add_task(async function testWithRange() {
     61    // We have intermittent occurrences of NS_ERROR_ABORT being
     62    // thrown at closing database instances when using Santizer.sanitize().
     63    // This does not seem to impact cleanup, since our tests run fine anyway.
     64    PromiseTestUtils.allowMatchingRejectionsGlobally(/NS_ERROR_ABORT/);
     65 
     66    await SpecialPowers.pushPrefEnv({
     67      set: [
     68        ["dom.serviceWorkers.enabled", true],
     69        ["dom.serviceWorkers.exemptFromPerDomainMax", true],
     70        ["dom.serviceWorkers.testing.enabled", true],
     71      ],
     72    });
     73 
     74    // The service may have picked up activity from prior tests in this run.
     75    // Clear it.
     76    sas.testOnlyReset();
     77 
     78    let endDate = Date.now() * 1000;
     79    let principals = sas.getActiveOrigins(endDate - oneHour, endDate);
     80    is(principals.length, 0, "starting from clear activity state");
     81 
     82    info("sanitize: " + itemsToClear.join(", "));
     83    await Sanitizer.sanitize(itemsToClear, { ignoreTimespan: false });
     84 
     85    await createDummyDataForHost("example.org");
     86    await createDummyDataForHost("example.com");
     87 
     88    endDate = Date.now() * 1000;
     89    principals = sas.getActiveOrigins(endDate - oneHour, endDate);
     90    ok(!!principals, "We have an active origin.");
     91    Assert.greaterOrEqual(principals.length, 2, "We have an active origin.");
     92 
     93    let found = 0;
     94    for (let i = 0; i < principals.length; ++i) {
     95      let principal = principals.queryElementAt(i, Ci.nsIPrincipal);
     96      if (principal.host == "example.org" || principal.host == "example.com") {
     97        found++;
     98      }
     99    }
    100 
    101    is(found, 2, "Our origins are active.");
    102 
    103    ok(
    104      await SiteDataTestUtils.hasIndexedDB("https://example.org"),
    105      "We have indexedDB data for example.org"
    106    );
    107    ok(
    108      SiteDataTestUtils.hasServiceWorkers("https://example.org"),
    109      "We have serviceWorker data for example.org"
    110    );
    111 
    112    ok(
    113      await SiteDataTestUtils.hasIndexedDB("https://example.com"),
    114      "We have indexedDB data for example.com"
    115    );
    116    ok(
    117      SiteDataTestUtils.hasServiceWorkers("https://example.com"),
    118      "We have serviceWorker data for example.com"
    119    );
    120 
    121    // Let's move example.com in the past.
    122    ok(
    123      moveOriginInTime(principals, endDate, "example.com"),
    124      "Operation completed!"
    125    );
    126 
    127    let p = waitForUnregister("example.org");
    128 
    129    // Clear it
    130    info("sanitize: " + itemsToClear.join(", "));
    131    await Sanitizer.sanitize(itemsToClear, { ignoreTimespan: false });
    132    await p;
    133 
    134    ok(
    135      !(await SiteDataTestUtils.hasIndexedDB("https://example.org")),
    136      "We don't have indexedDB data for example.org"
    137    );
    138    ok(
    139      !SiteDataTestUtils.hasServiceWorkers("https://example.org"),
    140      "We don't have serviceWorker data for example.org"
    141    );
    142 
    143    ok(
    144      await SiteDataTestUtils.hasIndexedDB("https://example.com"),
    145      "We still have indexedDB data for example.com"
    146    );
    147    ok(
    148      SiteDataTestUtils.hasServiceWorkers("https://example.com"),
    149      "We still have serviceWorker data for example.com"
    150    );
    151 
    152    // We have to move example.com in the past because how we check IDB triggers
    153    // a storage activity.
    154    ok(
    155      moveOriginInTime(principals, endDate, "example.com"),
    156      "Operation completed!"
    157    );
    158 
    159    // Let's call the clean up again.
    160    info("sanitize again to ensure clearing doesn't expand the activity scope");
    161    await Sanitizer.sanitize(itemsToClear, { ignoreTimespan: false });
    162 
    163    ok(
    164      await SiteDataTestUtils.hasIndexedDB("https://example.com"),
    165      "We still have indexedDB data for example.com"
    166    );
    167    ok(
    168      SiteDataTestUtils.hasServiceWorkers("https://example.com"),
    169      "We still have serviceWorker data for example.com"
    170    );
    171 
    172    ok(
    173      !(await SiteDataTestUtils.hasIndexedDB("https://example.org")),
    174      "We don't have indexedDB data for example.org"
    175    );
    176    ok(
    177      !SiteDataTestUtils.hasServiceWorkers("https://example.org"),
    178      "We don't have serviceWorker data for example.org"
    179    );
    180 
    181    sas.testOnlyReset();
    182 
    183    // Clean up.
    184    await SiteDataTestUtils.clear();
    185  });
    186 
    187  add_task(async function testExceptionsOnShutdown() {
    188    await createDummyDataForHost("example.org");
    189    await createDummyDataForHost("example.com");
    190 
    191    // Set exception for example.org to not get cleaned
    192    let originALLOW = "https://example.org";
    193    PermissionTestUtils.add(
    194      originALLOW,
    195      "cookie",
    196      Ci.nsICookiePermission.ACCESS_ALLOW
    197    );
    198 
    199    ok(
    200      await SiteDataTestUtils.hasIndexedDB("https://example.org"),
    201      "We have indexedDB data for example.org"
    202    );
    203    ok(
    204      SiteDataTestUtils.hasServiceWorkers("https://example.org"),
    205      "We have serviceWorker data for example.org"
    206    );
    207 
    208    ok(
    209      await SiteDataTestUtils.hasIndexedDB("https://example.com"),
    210      "We have indexedDB data for example.com"
    211    );
    212    ok(
    213      SiteDataTestUtils.hasServiceWorkers("https://example.com"),
    214      "We have serviceWorker data for example.com"
    215    );
    216 
    217    await SpecialPowers.pushPrefEnv({
    218      set: [
    219        ["browser.sanitizer.loglevel", "All"],
    220        ["privacy.clearOnShutdown.offlineApps", true],
    221        ["privacy.sanitize.sanitizeOnShutdown", true],
    222      ],
    223    });
    224    // Clear it
    225    await Sanitizer.runSanitizeOnShutdown();
    226    // Data for example.org should not have been cleared
    227    ok(
    228      await SiteDataTestUtils.hasIndexedDB("https://example.org"),
    229      "We still have indexedDB data for example.org"
    230    );
    231    ok(
    232      SiteDataTestUtils.hasServiceWorkers("https://example.org"),
    233      "We still have serviceWorker data for example.org"
    234    );
    235    // Data for example.com should be cleared
    236    ok(
    237      !(await SiteDataTestUtils.hasIndexedDB("https://example.com")),
    238      "We don't have indexedDB data for example.com"
    239    );
    240    ok(
    241      !SiteDataTestUtils.hasServiceWorkers("https://example.com"),
    242      "We don't have serviceWorker data for example.com"
    243    );
    244 
    245    // Clean up
    246    await SiteDataTestUtils.clear();
    247    Services.perms.removeAll();
    248  });
    249 }