toolkit/components/social/test/xpcshell/head.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 /* 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 file,
     3  * You can obtain one at http://mozilla.org/MPL/2.0/. */
     5 const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
     6 Cu.import("resource://gre/modules/Services.jsm");
     7 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
     9 XPCOMUtils.defineLazyModuleGetter(this, "Promise",
    10   "resource://gre/modules/Promise.jsm");
    11 XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils",
    12   "resource://gre/modules/PlacesUtils.jsm");
    14 const MANIFEST_PREFS = Services.prefs.getBranch("social.manifest.");
    15 const gProfD = do_get_profile();
    17 const XULAPPINFO_CONTRACTID = "@mozilla.org/xre/app-info;1";
    18 const XULAPPINFO_CID = Components.ID("{c763b610-9d49-455a-bbd2-ede71682a1ac}");
    20 function createAppInfo(id, name, version, platformVersion) {
    21   gAppInfo = {
    22     // nsIXULAppInfo
    23     vendor: "Mozilla",
    24     name: name,
    25     ID: id,
    26     version: version,
    27     appBuildID: "2007010101",
    28     platformVersion: platformVersion ? platformVersion : "1.0",
    29     platformBuildID: "2007010101",
    31     // nsIXULRuntime
    32     inSafeMode: false,
    33     logConsoleErrors: true,
    34     OS: "XPCShell",
    35     XPCOMABI: "noarch-spidermonkey",
    36     invalidateCachesOnRestart: function invalidateCachesOnRestart() {
    37       // Do nothing
    38     },
    40     // nsICrashReporter
    41     annotations: {},
    43     annotateCrashReport: function(key, data) {
    44       this.annotations[key] = data;
    45     },
    47     QueryInterface: XPCOMUtils.generateQI([Ci.nsIXULAppInfo,
    48                                            Ci.nsIXULRuntime,
    49                                            Ci.nsICrashReporter,
    50                                            Ci.nsISupports])
    51   };
    53   var XULAppInfoFactory = {
    54     createInstance: function (outer, iid) {
    55       if (outer != null)
    56         throw Components.results.NS_ERROR_NO_AGGREGATION;
    57       return gAppInfo.QueryInterface(iid);
    58     }
    59   };
    60   var registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
    61   registrar.registerFactory(XULAPPINFO_CID, "XULAppInfo",
    62                             XULAPPINFO_CONTRACTID, XULAppInfoFactory);
    63 }
    65 function initApp() {
    66   createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9");
    67   // prepare a blocklist file for the blocklist service
    68   var blocklistFile = gProfD.clone();
    69   blocklistFile.append("blocklist.xml");
    70   if (blocklistFile.exists())
    71     blocklistFile.remove(false);
    72   var source = do_get_file("blocklist.xml");
    73   source.copyTo(gProfD, "blocklist.xml");
    74   blocklistFile.lastModifiedTime = Date.now();
    75 }
    77 function AsyncRunner() {
    78   do_test_pending();
    79   do_register_cleanup((function () this.destroy()).bind(this));
    81   this._callbacks = {
    82     done: do_test_finished,
    83     error: function (err) {
    84       // xpcshell test functions like do_check_eq throw NS_ERROR_ABORT on
    85       // failure.  Ignore those so they aren't rethrown here.
    86       if (err !== Cr.NS_ERROR_ABORT) {
    87         if (err.stack) {
    88           err = err + " - See following stack:\n" + err.stack +
    89                       "\nUseless do_throw stack";
    90         }
    91         do_throw(err);
    92       }
    93     },
    94     consoleError: function (scriptErr) {
    95       // Try to ensure the error is related to the test.
    96       let filename = scriptErr.sourceName || scriptErr.toString() || "";
    97       if (filename.indexOf("/toolkit/components/social/") >= 0)
    98         do_throw(scriptErr);
    99     },
   100   };
   101   this._iteratorQueue = [];
   103   // This catches errors reported to the console, e.g., via Cu.reportError, but
   104   // not on the runner's stack.
   105   Cc["@mozilla.org/consoleservice;1"].
   106     getService(Ci.nsIConsoleService).
   107     registerListener(this);
   108 }
   110 AsyncRunner.prototype = {
   112   appendIterator: function appendIterator(iter) {
   113     this._iteratorQueue.push(iter);
   114   },
   116   next: function next(/* ... */) {
   117     if (!this._iteratorQueue.length) {
   118       this.destroy();
   119       this._callbacks.done();
   120       return;
   121     }
   123     // send() discards all arguments after the first, so there's no choice here
   124     // but to send only one argument to the yielder.
   125     let args = [arguments.length <= 1 ? arguments[0] : Array.slice(arguments)];
   126     try {
   127       var val = this._iteratorQueue[0].send.apply(this._iteratorQueue[0], args);
   128     }
   129     catch (err if err instanceof StopIteration) {
   130       this._iteratorQueue.shift();
   131       this.next();
   132       return;
   133     }
   134     catch (err) {
   135       this._callbacks.error(err);
   136     }
   138     // val is an iterator => prepend it to the queue and start on it
   139     // val is otherwise truthy => call next
   140     if (val) {
   141       if (typeof(val) != "boolean")
   142         this._iteratorQueue.unshift(val);
   143       this.next();
   144     }
   145   },
   147   destroy: function destroy() {
   148     Cc["@mozilla.org/consoleservice;1"].
   149       getService(Ci.nsIConsoleService).
   150       unregisterListener(this);
   151     this.destroy = function alreadyDestroyed() {};
   152   },
   154   observe: function observe(msg) {
   155     if (msg instanceof Ci.nsIScriptError &&
   156         !(msg.flags & Ci.nsIScriptError.warningFlag))
   157     {
   158       this._callbacks.consoleError(msg);
   159     }
   160   },
   161 };
   164 function promiseAddVisits(aPlaceInfo)
   165 {
   166   let deferred = Promise.defer();
   167   let places = [];
   168   if (aPlaceInfo instanceof Ci.nsIURI) {
   169     places.push({ uri: aPlaceInfo });
   170   }
   171   else if (Array.isArray(aPlaceInfo)) {
   172     places = places.concat(aPlaceInfo);
   173   } else {
   174     places.push(aPlaceInfo)
   175   }
   177   // Create mozIVisitInfo for each entry.
   178   let now = Date.now();
   179   for (let i = 0; i < places.length; i++) {
   180     if (!places[i].title) {
   181       places[i].title = "test visit for " + places[i].uri.spec;
   182     }
   183     places[i].visits = [{
   184       transitionType: places[i].transition === undefined ? Ci.nsINavHistoryService.TRANSITION_LINK
   185                                                          : places[i].transition,
   186       visitDate: places[i].visitDate || (now++) * 1000,
   187       referrerURI: places[i].referrer
   188     }];
   189   }
   191   PlacesUtils.asyncHistory.updatePlaces(
   192     places,
   193     {
   194       handleError: function handleError(aResultCode, aPlaceInfo) {
   195         let ex = new Components.Exception("Unexpected error in adding visits.",
   196                                           aResultCode);
   197         deferred.reject(ex);
   198       },
   199       handleResult: function () {},
   200       handleCompletion: function handleCompletion() {
   201         deferred.resolve();
   202       }
   203     }
   204   );
   206   return deferred.promise;
   207 }
   209 function promiseTopicObserved(aTopic)
   210 {
   211   let deferred = Promise.defer();
   213   Services.obs.addObserver(
   214     function PTO_observe(aSubject, aTopic, aData) {
   215       Services.obs.removeObserver(PTO_observe, aTopic);
   216       deferred.resolve([aSubject, aData]);
   217     }, aTopic, false);
   219   return deferred.promise;
   220 }
   222 function promiseClearHistory() {
   223   let promise = promiseTopicObserved(PlacesUtils.TOPIC_EXPIRATION_FINISHED);
   224   do_execute_soon(function() PlacesUtils.bhistory.removeAllPages());
   225   return promise;
   226 }

mercurial