toolkit/forgetaboutsite/test/unit/test_removeDataFromDomain.js

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

     1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
     2  * vim: sw=2 ts=2 sts=2
     3  * This Source Code Form is subject to the terms of the Mozilla Public
     4  * License, v. 2.0. If a copy of the MPL was not distributed with this
     5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     7 /**
     8  * Test added with bug 460086 to test the behavior of the new API that was added
     9  * to remove all traces of visiting a site.
    10  */
    12 ////////////////////////////////////////////////////////////////////////////////
    13 //// Globals
    15 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
    16 Cu.import("resource://gre/modules/Services.jsm");
    17 Cu.import("resource://gre/modules/PlacesUtils.jsm");
    18 Cu.import("resource://gre/modules/ForgetAboutSite.jsm");
    20 XPCOMUtils.defineLazyModuleGetter(this, "Promise",
    21                                   "resource://gre/modules/Promise.jsm");
    23 const COOKIE_EXPIRY = Math.round(Date.now() / 1000) + 60;
    24 const COOKIE_NAME = "testcookie";
    25 const COOKIE_PATH = "/";
    27 const LOGIN_USERNAME = "username";
    28 const LOGIN_PASSWORD = "password";
    29 const LOGIN_USERNAME_FIELD = "username_field";
    30 const LOGIN_PASSWORD_FIELD = "password_field";
    32 const PERMISSION_TYPE = "test-perm";
    33 const PERMISSION_VALUE = Ci.nsIPermissionManager.ALLOW_ACTION;
    35 const PREFERENCE_NAME = "test-pref";
    37 ////////////////////////////////////////////////////////////////////////////////
    38 //// Utility Functions
    40 /**
    41  * Creates an nsIURI object for the given string representation of a URI.
    42  *
    43  * @param aURIString
    44  *        The spec of the URI to create.
    45  * @returns an nsIURI representing aURIString.
    46  */
    47 function uri(aURIString)
    48 {
    49   return Cc["@mozilla.org/network/io-service;1"].
    50          getService(Ci.nsIIOService).
    51          newURI(aURIString, null, null);
    52 }
    54 /**
    55  * Asynchronously adds visits to a page.
    56  *
    57  * @param aPlaceInfo
    58  *        Can be an nsIURI, in such a case a single LINK visit will be added.
    59  *        Otherwise can be an object describing the visit to add, or an array
    60  *        of these objects:
    61  *          { uri: nsIURI of the page,
    62  *            transition: one of the TRANSITION_* from nsINavHistoryService,
    63  *            [optional] title: title of the page,
    64  *            [optional] visitDate: visit date in microseconds from the epoch
    65  *            [optional] referrer: nsIURI of the referrer for this visit
    66  *          }
    67  *
    68  * @return {Promise}
    69  * @resolves When all visits have been added successfully.
    70  * @rejects JavaScript exception.
    71  */
    72 function promiseAddVisits(aPlaceInfo)
    73 {
    74   let deferred = Promise.defer();
    75   let places = [];
    76   if (aPlaceInfo instanceof Ci.nsIURI) {
    77     places.push({ uri: aPlaceInfo });
    78   }
    79   else if (Array.isArray(aPlaceInfo)) {
    80     places = places.concat(aPlaceInfo);
    81   } else {
    82     places.push(aPlaceInfo)
    83   }
    85   // Create mozIVisitInfo for each entry.
    86   let now = Date.now();
    87   for (let i = 0; i < places.length; i++) {
    88     if (!places[i].title) {
    89       places[i].title = "test visit for " + places[i].uri.spec;
    90     }
    91     places[i].visits = [{
    92       transitionType: places[i].transition === undefined ? Ci.nsINavHistoryService.TRANSITION_LINK
    93                                                          : places[i].transition,
    94       visitDate: places[i].visitDate || (now++) * 1000,
    95       referrerURI: places[i].referrer
    96     }];
    97   }
    99   PlacesUtils.asyncHistory.updatePlaces(
   100     places,
   101     {
   102       handleError: function handleError(aResultCode, aPlaceInfo) {
   103         let ex = new Components.Exception("Unexpected error in adding visits.",
   104                                           aResultCode);
   105         deferred.reject(ex);
   106       },
   107       handleResult: function () {},
   108       handleCompletion: function handleCompletion() {
   109         deferred.resolve();
   110       }
   111     }
   112   );
   114   return deferred.promise;
   115 }
   118 /**
   119  * Asynchronously check a url is visited.
   120  *
   121  * @param aURI
   122  *        The URI.
   123  *
   124  * @return {Promise}
   125  * @resolves When the check has been added successfully.
   126  * @rejects JavaScript exception.
   127  */
   128 function promiseIsURIVisited(aURI)
   129 {
   130   let deferred = Promise.defer();
   131   PlacesUtils.asyncHistory.isURIVisited(aURI, function(aURI, aIsVisited) {
   132     deferred.resolve(aIsVisited);
   133   });
   135   return deferred.promise;
   136 }
   138 /**
   139  * Add a cookie to the cookie service.
   140  *
   141  * @param aDomain
   142  */
   143 function add_cookie(aDomain)
   144 {
   145   check_cookie_exists(aDomain, false);
   146   let cm = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager2);
   147   cm.add(aDomain, COOKIE_PATH, COOKIE_NAME, "", false, false, false,
   148          COOKIE_EXPIRY);
   149   check_cookie_exists(aDomain, true);
   150 }
   152 /**
   153  * Checks to ensure that a cookie exists or not for a domain.
   154  *
   155  * @param aDomain
   156  *        The domain to check for the cookie.
   157  * @param aExists
   158  *        True if the cookie should exist, false otherwise.
   159  */
   160 function check_cookie_exists(aDomain, aExists)
   161 {
   162   let cm = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager2);
   163   let cookie = {
   164     host: aDomain,
   165     name: COOKIE_NAME,
   166     path: COOKIE_PATH
   167   }
   168   let checker = aExists ? do_check_true : do_check_false;
   169   checker(cm.cookieExists(cookie));
   170 }
   172 /**
   173  * Adds a download to download history.
   174  *
   175  * @param aURIString
   176  *        The string of the URI to add.
   177  * @param aIsActive
   178  *        If it should be set to an active state in the database.  This does not
   179  *        make it show up in the list of active downloads however!
   180  */
   181 function add_download(aURIString, aIsActive)
   182 {
   183   function makeGUID() {
   184     let guid = "";
   185     for (var i = 0; i < 12; i++)
   186       guid += Math.floor(Math.random() * 10);
   187     return guid;
   188   }
   190   check_downloaded(aURIString, false);
   191   let db = Cc["@mozilla.org/download-manager;1"].
   192            getService(Ci.nsIDownloadManager).
   193            DBConnection;
   194   let stmt = db.createStatement(
   195     "INSERT INTO moz_downloads (source, state, guid) " +
   196     "VALUES (:source, :state, :guid)"
   197   );
   198   stmt.params.source = aURIString;
   199   stmt.params.state = aIsActive ? Ci.nsIDownloadManager.DOWNLOAD_DOWNLOADING :
   200                                   Ci.nsIDownloadManager.DOWNLOAD_FINISHED;
   201   stmt.params.guid = makeGUID();
   202   try {
   203     stmt.execute();
   204   }
   205   finally {
   206     stmt.finalize();
   207   }
   208   check_downloaded(aURIString, true);
   209 }
   211 /**
   212  * Checks to ensure a URI string is in download history or not.
   213  *
   214  * @param aURIString
   215  *        The string of the URI to check.
   216  * @param aIsDownloaded
   217  *        True if the URI should be downloaded, false otherwise.
   218  */
   219 function check_downloaded(aURIString, aIsDownloaded)
   220 {
   221   let db = Cc["@mozilla.org/download-manager;1"].
   222            getService(Ci.nsIDownloadManager).
   223            DBConnection;
   224   let stmt = db.createStatement(
   225     "SELECT * " +
   226     "FROM moz_downloads " +
   227     "WHERE source = :source"
   228   );
   229   stmt.params.source = aURIString;
   231   let checker = aIsDownloaded ? do_check_true : do_check_false;
   232   try {
   233     checker(stmt.executeStep());
   234   }
   235   finally {
   236     stmt.finalize();
   237   }
   238 }
   240 /**
   241  * Adds a disabled host to the login manager.
   242  *
   243  * @param aHost
   244  *        The host to add to the list of disabled hosts.
   245  */
   246 function add_disabled_host(aHost)
   247 {
   248   check_disabled_host(aHost, false);
   249   let lm = Cc["@mozilla.org/login-manager;1"].
   250            getService(Ci.nsILoginManager);
   251   lm.setLoginSavingEnabled(aHost, false);
   252   check_disabled_host(aHost, true);
   253 }
   255 /**
   256  * Checks to see if a host is disabled for storing logins or not.
   257  *
   258  * @param aHost
   259  *        The host to check if it is disabled.
   260  * @param aIsDisabled
   261  *        True if the host should be disabled, false otherwise.
   262  */
   263 function check_disabled_host(aHost, aIsDisabled)
   264 {
   265   let lm = Cc["@mozilla.org/login-manager;1"].
   266            getService(Ci.nsILoginManager);
   267   let checker = aIsDisabled ? do_check_false : do_check_true;
   268   checker(lm.getLoginSavingEnabled(aHost));
   269 }
   271 /**
   272  * Adds a login for the specified host to the login manager.
   273  *
   274  * @param aHost
   275  *        The host to add the login for.
   276  */
   277 function add_login(aHost)
   278 {
   279   check_login_exists(aHost, false);
   280   let login = Cc["@mozilla.org/login-manager/loginInfo;1"].
   281               createInstance(Ci.nsILoginInfo);
   282   login.init(aHost, "", null, LOGIN_USERNAME, LOGIN_PASSWORD,
   283              LOGIN_USERNAME_FIELD, LOGIN_PASSWORD_FIELD);
   284   let lm = Cc["@mozilla.org/login-manager;1"].
   285            getService(Ci.nsILoginManager);
   286   lm.addLogin(login);
   287   check_login_exists(aHost, true);
   288 }
   290 /**
   291  * Checks to see if a login exists for a host.
   292  *
   293  * @param aHost
   294  *        The host to check for the test login.
   295  * @param aExists
   296  *        True if the login should exist, false otherwise.
   297  */
   298 function check_login_exists(aHost, aExists)
   299 {
   300   let lm = Cc["@mozilla.org/login-manager;1"].
   301            getService(Ci.nsILoginManager);
   302   let count = { value: 0 };
   303   lm.findLogins(count, aHost, "", null);
   304   do_check_eq(count.value, aExists ? 1 : 0);
   305 }
   307 /**
   308  * Adds a permission for the specified URI to the permission manager.
   309  *
   310  * @param aURI
   311  *        The URI to add the test permission for.
   312  */
   313 function add_permission(aURI)
   314 {
   315   check_permission_exists(aURI, false);
   316   let pm = Cc["@mozilla.org/permissionmanager;1"].
   317            getService(Ci.nsIPermissionManager);
   318   let principal = Cc["@mozilla.org/scriptsecuritymanager;1"]
   319                     .getService(Ci.nsIScriptSecurityManager)
   320                     .getNoAppCodebasePrincipal(aURI);
   322   pm.addFromPrincipal(principal, PERMISSION_TYPE, PERMISSION_VALUE);
   323   check_permission_exists(aURI, true);
   324 }
   326 /**
   327  * Checks to see if a permission exists for the given URI.
   328  *
   329  * @param aURI
   330  *        The URI to check if a permission exists.
   331  * @param aExists
   332  *        True if the permission should exist, false otherwise.
   333  */
   334 function check_permission_exists(aURI, aExists)
   335 {
   336   let pm = Cc["@mozilla.org/permissionmanager;1"].
   337            getService(Ci.nsIPermissionManager);
   338   let principal = Cc["@mozilla.org/scriptsecuritymanager;1"]
   339                     .getService(Ci.nsIScriptSecurityManager)
   340                     .getNoAppCodebasePrincipal(aURI);
   342   let perm = pm.testExactPermissionFromPrincipal(principal, PERMISSION_TYPE);
   343   let checker = aExists ? do_check_eq : do_check_neq;
   344   checker(perm, PERMISSION_VALUE);
   345 }
   347 /**
   348  * Adds a content preference for the specified URI.
   349  *
   350  * @param aURI
   351  *        The URI to add a preference for.
   352  */
   353 function add_preference(aURI)
   354 {
   355   let deferred = Promise.defer();
   356   let cp = Cc["@mozilla.org/content-pref/service;1"].
   357              getService(Ci.nsIContentPrefService2);
   358   cp.set(aURI.spec, PREFERENCE_NAME, "foo", null, {
   359     handleCompletion: function() deferred.resolve()
   360   });
   361   return deferred.promise;
   362 }
   364 /**
   365  * Checks to see if a content preference exists for the given URI.
   366  *
   367  * @param aURI
   368  *        The URI to check if a preference exists.
   369  */
   370 function preference_exists(aURI)
   371 {
   372   let deferred = Promise.defer();
   373   let cp = Cc["@mozilla.org/content-pref/service;1"].
   374              getService(Ci.nsIContentPrefService2);
   375   let exists = false;
   376   cp.getByDomainAndName(aURI.spec, PREFERENCE_NAME, null, {
   377     handleResult: function() exists = true,
   378     handleCompletion: function() deferred.resolve(exists)
   379   });
   380   return deferred.promise;
   381 }
   383 ////////////////////////////////////////////////////////////////////////////////
   384 //// Test Functions
   386 // History
   387 function test_history_cleared_with_direct_match()
   388 {
   389   const TEST_URI = uri("http://mozilla.org/foo");
   390   do_check_false(yield promiseIsURIVisited(TEST_URI));
   391   yield promiseAddVisits(TEST_URI);
   392   do_check_true(yield promiseIsURIVisited(TEST_URI));
   393   ForgetAboutSite.removeDataFromDomain("mozilla.org");
   394   do_check_false(yield promiseIsURIVisited(TEST_URI));
   395 }
   397 function test_history_cleared_with_subdomain()
   398 {
   399   const TEST_URI = uri("http://www.mozilla.org/foo");
   400   do_check_false(yield promiseIsURIVisited(TEST_URI));
   401   yield promiseAddVisits(TEST_URI);
   402   do_check_true(yield promiseIsURIVisited(TEST_URI));
   403   ForgetAboutSite.removeDataFromDomain("mozilla.org");
   404   do_check_false(yield promiseIsURIVisited(TEST_URI));
   405 }
   407 function test_history_not_cleared_with_uri_contains_domain()
   408 {
   409   const TEST_URI = uri("http://ilovemozilla.org/foo");
   410   do_check_false(yield promiseIsURIVisited(TEST_URI));
   411   yield promiseAddVisits(TEST_URI);
   412   do_check_true(yield promiseIsURIVisited(TEST_URI));
   413   ForgetAboutSite.removeDataFromDomain("mozilla.org");
   414   do_check_true(yield promiseIsURIVisited(TEST_URI));
   416   // Clear history since we left something there from this test.
   417   PlacesUtils.bhistory.removeAllPages();
   418 }
   420 // Cookie Service
   421 function test_cookie_cleared_with_direct_match()
   422 {
   423   const TEST_DOMAIN = "mozilla.org";
   424   add_cookie(TEST_DOMAIN);
   425   ForgetAboutSite.removeDataFromDomain("mozilla.org");
   426   check_cookie_exists(TEST_DOMAIN, false);
   427 }
   429 function test_cookie_cleared_with_subdomain()
   430 {
   431   const TEST_DOMAIN = "www.mozilla.org";
   432   add_cookie(TEST_DOMAIN);
   433   ForgetAboutSite.removeDataFromDomain("mozilla.org");
   434   check_cookie_exists(TEST_DOMAIN, false);
   435 }
   437 function test_cookie_not_cleared_with_uri_contains_domain()
   438 {
   439   const TEST_DOMAIN = "ilovemozilla.org";
   440   add_cookie(TEST_DOMAIN);
   441   ForgetAboutSite.removeDataFromDomain("mozilla.org");
   442   check_cookie_exists(TEST_DOMAIN, true);
   443 }
   445 // Download Manager
   446 function test_download_history_cleared_with_direct_match()
   447 {
   448   if (oldDownloadManagerDisabled()) {
   449     return;
   450   }
   452   const TEST_URI = "http://mozilla.org/foo";
   453   add_download(TEST_URI, false);
   454   ForgetAboutSite.removeDataFromDomain("mozilla.org");
   455   check_downloaded(TEST_URI, false);
   456 }
   458 function test_download_history_cleared_with_subdomain()
   459 {
   460   if (oldDownloadManagerDisabled()) {
   461     return;
   462   }
   464   const TEST_URI = "http://www.mozilla.org/foo";
   465   add_download(TEST_URI, false);
   466   ForgetAboutSite.removeDataFromDomain("mozilla.org");
   467   check_downloaded(TEST_URI, false);
   468 }
   470 function test_download_history_not_cleared_with_active_direct_match()
   471 {
   472   if (oldDownloadManagerDisabled()) {
   473     return;
   474   }
   476   // Tests that downloads marked as active in the db are not deleted from the db
   477   const TEST_URI = "http://mozilla.org/foo";
   478   add_download(TEST_URI, true);
   479   ForgetAboutSite.removeDataFromDomain("mozilla.org");
   480   check_downloaded(TEST_URI, true);
   482   // Reset state
   483   let db = Cc["@mozilla.org/download-manager;1"].
   484            getService(Ci.nsIDownloadManager).
   485            DBConnection;
   486   db.executeSimpleSQL("DELETE FROM moz_downloads");
   487   check_downloaded(TEST_URI, false);
   488 }
   490 // Login Manager
   491 function test_login_manager_disabled_hosts_cleared_with_direct_match()
   492 {
   493   const TEST_HOST = "http://mozilla.org";
   494   add_disabled_host(TEST_HOST);
   495   ForgetAboutSite.removeDataFromDomain("mozilla.org");
   496   check_disabled_host(TEST_HOST, false);
   497 }
   499 function test_login_manager_disabled_hosts_cleared_with_subdomain()
   500 {
   501   const TEST_HOST = "http://www.mozilla.org";
   502   add_disabled_host(TEST_HOST);
   503   ForgetAboutSite.removeDataFromDomain("mozilla.org");
   504   check_disabled_host(TEST_HOST, false);
   505 }
   507 function test_login_manager_disabled_hosts_not_cleared_with_uri_contains_domain()
   508 {
   509   const TEST_HOST = "http://ilovemozilla.org";
   510   add_disabled_host(TEST_HOST);
   511   ForgetAboutSite.removeDataFromDomain("mozilla.org");
   512   check_disabled_host(TEST_HOST, true);
   514   // Reset state
   515   let lm = Cc["@mozilla.org/login-manager;1"].
   516            getService(Ci.nsILoginManager);
   517   lm.setLoginSavingEnabled(TEST_HOST, true);
   518   check_disabled_host(TEST_HOST, false);
   519 }
   521 function test_login_manager_logins_cleared_with_direct_match()
   522 {
   523   const TEST_HOST = "http://mozilla.org";
   524   add_login(TEST_HOST);
   525   ForgetAboutSite.removeDataFromDomain("mozilla.org");
   526   check_login_exists(TEST_HOST, false);
   527 }
   529 function test_login_manager_logins_cleared_with_subdomain()
   530 {
   531   const TEST_HOST = "http://www.mozilla.org";
   532   add_login(TEST_HOST);
   533   ForgetAboutSite.removeDataFromDomain("mozilla.org");
   534   check_login_exists(TEST_HOST, false);
   535 }
   537 function tets_login_manager_logins_not_cleared_with_uri_contains_domain()
   538 {
   539   const TEST_HOST = "http://ilovemozilla.org";
   540   add_login(TEST_HOST);
   541   ForgetAboutSite.removeDataFromDomain("mozilla.org");
   542   check_login_exists(TEST_HOST, true);
   544   let lm = Cc["@mozilla.org/login-manager;1"].
   545            getService(Ci.nsILoginManager);
   546   lm.removeAllLogins();
   547   check_login_exists(TEST_HOST, false);
   548 }
   550 // Permission Manager
   551 function test_permission_manager_cleared_with_direct_match()
   552 {
   553   const TEST_URI = uri("http://mozilla.org");
   554   add_permission(TEST_URI);
   555   ForgetAboutSite.removeDataFromDomain("mozilla.org");
   556   check_permission_exists(TEST_URI, false);
   557 }
   559 function test_permission_manager_cleared_with_subdomain()
   560 {
   561   const TEST_URI = uri("http://www.mozilla.org");
   562   add_permission(TEST_URI);
   563   ForgetAboutSite.removeDataFromDomain("mozilla.org");
   564   check_permission_exists(TEST_URI, false);
   565 }
   567 function test_permission_manager_not_cleared_with_uri_contains_domain()
   568 {
   569   const TEST_URI = uri("http://ilovemozilla.org");
   570   add_permission(TEST_URI);
   571   ForgetAboutSite.removeDataFromDomain("mozilla.org");
   572   check_permission_exists(TEST_URI, true);
   574   // Reset state
   575   let pm = Cc["@mozilla.org/permissionmanager;1"].
   576            getService(Ci.nsIPermissionManager);
   577   pm.removeAll();
   578   check_permission_exists(TEST_URI, false);
   579 }
   581 function waitForPurgeNotification() {
   582   let deferred = Promise.defer();
   584   let observer = {
   585     observe: function(aSubject, aTopic, aData)
   586     {
   587       Services.obs.removeObserver(observer, "browser:purge-domain-data");
   588       // test_storage_cleared needs this extra executeSoon because
   589       // the DOMStorage clean-up is also listening to this same observer
   590       // which is run synchronously.
   591       Services.tm.mainThread.dispatch(function() {
   592         deferred.resolve();
   593       }, Components.interfaces.nsIThread.DISPATCH_NORMAL);
   594     }
   595   };
   596   Services.obs.addObserver(observer, "browser:purge-domain-data", false);
   598   return deferred.promise;
   599 }
   601 // Content Preferences
   602 function test_content_preferences_cleared_with_direct_match()
   603 {
   604   const TEST_URI = uri("http://mozilla.org");
   605   do_check_false(yield preference_exists(TEST_URI));
   606   yield add_preference(TEST_URI);
   607   do_check_true(yield preference_exists(TEST_URI));
   608   ForgetAboutSite.removeDataFromDomain("mozilla.org");
   609   yield waitForPurgeNotification();
   610   do_check_false(yield preference_exists(TEST_URI));
   611 }
   613 function test_content_preferences_cleared_with_subdomain()
   614 {
   615   const TEST_URI = uri("http://www.mozilla.org");
   616   do_check_false(yield preference_exists(TEST_URI));
   617   yield add_preference(TEST_URI);
   618   do_check_true(yield preference_exists(TEST_URI));
   619   ForgetAboutSite.removeDataFromDomain("mozilla.org");
   620   yield waitForPurgeNotification();
   621   do_check_false(yield preference_exists(TEST_URI));
   622 }
   624 function test_content_preferences_not_cleared_with_uri_contains_domain()
   625 {
   626   const TEST_URI = uri("http://ilovemozilla.org");
   627   do_check_false(yield preference_exists(TEST_URI));
   628   yield add_preference(TEST_URI);
   629   do_check_true(yield preference_exists(TEST_URI));
   630   ForgetAboutSite.removeDataFromDomain("mozilla.org");
   631   yield waitForPurgeNotification();
   632   do_check_true(yield preference_exists(TEST_URI));
   634   // Reset state
   635   ForgetAboutSite.removeDataFromDomain("ilovemozilla.org");
   636   yield waitForPurgeNotification();
   637   do_check_false(yield preference_exists(TEST_URI));
   638 }
   640 // Cache
   641 function test_cache_cleared()
   642 {
   643   // Because this test is asynchronous, it should be the last test
   644   do_check_true(tests[tests.length - 1] == arguments.callee);
   646   // NOTE: We could be more extensive with this test and actually add an entry
   647   //       to the cache, and then make sure it is gone.  However, we trust that
   648   //       the API is well tested, and that when we get the observer
   649   //       notification, we have actually cleared the cache.
   650   // This seems to happen asynchronously...
   651   let os = Cc["@mozilla.org/observer-service;1"].
   652            getService(Ci.nsIObserverService);
   653   let observer = {
   654     observe: function(aSubject, aTopic, aData)
   655     {
   656       os.removeObserver(observer, "cacheservice:empty-cache");
   657       // Shutdown the download manager.
   658       Services.obs.notifyObservers(null, "quit-application", null);
   659       do_test_finished();
   660     }
   661   };
   662   os.addObserver(observer, "cacheservice:empty-cache", false);
   663   ForgetAboutSite.removeDataFromDomain("mozilla.org");
   664   do_test_pending();
   665 }
   667 function test_storage_cleared()
   668 {
   669   function getStorageForURI(aURI)
   670   {
   671     let principal = Cc["@mozilla.org/scriptsecuritymanager;1"].
   672                     getService(Ci.nsIScriptSecurityManager).
   673                     getNoAppCodebasePrincipal(aURI);
   674     let dsm = Cc["@mozilla.org/dom/localStorage-manager;1"].
   675               getService(Ci.nsIDOMStorageManager);
   676     return dsm.createStorage(principal, "");
   677   }
   679   let s = [
   680     getStorageForURI(uri("http://mozilla.org")),
   681     getStorageForURI(uri("http://my.mozilla.org")),
   682     getStorageForURI(uri("http://ilovemozilla.org")),
   683   ];
   685   for (let i = 0; i < s.length; ++i) {
   686     let storage = s[i];
   687     storage.setItem("test", "value" + i);
   688     do_check_eq(storage.length, 1);
   689     do_check_eq(storage.key(0), "test");
   690     do_check_eq(storage.getItem("test"), "value" + i);
   691   }
   693   ForgetAboutSite.removeDataFromDomain("mozilla.org");
   694   yield waitForPurgeNotification();
   696   do_check_eq(s[0].getItem("test"), null);
   697   do_check_eq(s[0].length, 0);
   698   do_check_eq(s[1].getItem("test"), null);
   699   do_check_eq(s[1].length, 0);
   700   do_check_eq(s[2].getItem("test"), "value2");
   701   do_check_eq(s[2].length, 1);
   702 }
   704 let tests = [
   705   // History
   706   test_history_cleared_with_direct_match,
   707   test_history_cleared_with_subdomain,
   708   test_history_not_cleared_with_uri_contains_domain,
   710   // Cookie Service
   711   test_cookie_cleared_with_direct_match,
   712   test_cookie_cleared_with_subdomain,
   713   test_cookie_not_cleared_with_uri_contains_domain,
   715   // Download Manager
   716   // Note: active downloads tested in test_removeDataFromDomain_activeDownloads.js
   717   test_download_history_cleared_with_direct_match,
   718   test_download_history_cleared_with_subdomain,
   719   test_download_history_not_cleared_with_active_direct_match,
   721   // Login Manager
   722   test_login_manager_disabled_hosts_cleared_with_direct_match,
   723   test_login_manager_disabled_hosts_cleared_with_subdomain,
   724   test_login_manager_disabled_hosts_not_cleared_with_uri_contains_domain,
   725   test_login_manager_logins_cleared_with_direct_match,
   726   test_login_manager_logins_cleared_with_subdomain,
   727   tets_login_manager_logins_not_cleared_with_uri_contains_domain,
   729   // Permission Manager
   730   test_permission_manager_cleared_with_direct_match,
   731   test_permission_manager_cleared_with_subdomain,
   732   test_permission_manager_not_cleared_with_uri_contains_domain,
   734   // Content Preferences
   735   test_content_preferences_cleared_with_direct_match,
   736   test_content_preferences_cleared_with_subdomain,
   737   test_content_preferences_not_cleared_with_uri_contains_domain,
   739   // Storage
   740   test_storage_cleared,
   742   // Cache
   743   test_cache_cleared,
   744 ];
   746 function run_test()
   747 {
   748   for (let i = 0; i < tests.length; i++)
   749     add_task(tests[i]);
   751   run_next_test();
   752 }

mercurial