js/src/tests/ecma_6/shell.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
     3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 if (typeof assertThrowsInstanceOf === 'undefined') {
     7     var assertThrowsInstanceOf = function assertThrowsInstanceOf(f, ctor, msg) {
     8         var fullmsg;
     9         try {
    10             f();
    11         } catch (exc) {
    12             if (exc instanceof ctor)
    13                 return;
    14             fullmsg = "Assertion failed: expected exception " + ctor.name + ", got " + exc;
    15         }
    16         if (fullmsg === undefined)
    17             fullmsg = "Assertion failed: expected exception " + ctor.name + ", no exception thrown";
    18         if (msg !== undefined)
    19             fullmsg += " - " + msg;
    20         throw new Error(fullmsg);
    21     };
    22 }
    24 if (typeof assertThrowsValue === 'undefined') {
    25     var assertThrowsValue = function assertThrowsValue(f, val, msg) {
    26         var fullmsg;
    27         try {
    28             f();
    29         } catch (exc) {
    30             if ((exc === val) === (val === val) && (val !== 0 || 1 / exc === 1 / val))
    31                 return;
    32             fullmsg = "Assertion failed: expected exception " + val + ", got " + exc;
    33         }
    34         if (fullmsg === undefined)
    35             fullmsg = "Assertion failed: expected exception " + val + ", no exception thrown";
    36         if (msg !== undefined)
    37             fullmsg += " - " + msg;
    38         throw new Error(fullmsg);
    39     };
    40 }
    42 if (typeof assertDeepEq === 'undefined') {
    43     var assertDeepEq = (function(){
    44         var call = Function.prototype.call,
    45             Map_ = Map,
    46             Error_ = Error,
    47             Map_has = call.bind(Map.prototype.has),
    48             Map_get = call.bind(Map.prototype.get),
    49             Map_set = call.bind(Map.prototype.set),
    50             Object_toString = call.bind(Object.prototype.toString),
    51             Function_toString = call.bind(Function.prototype.toString),
    52             Object_getPrototypeOf = Object.getPrototypeOf,
    53             Object_hasOwnProperty = call.bind(Object.prototype.hasOwnProperty),
    54             Object_getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor,
    55             Object_isExtensible = Object.isExtensible,
    56             Object_getOwnPropertyNames = Object.getOwnPropertyNames,
    57             uneval_ = uneval;
    59         // Return true iff ES6 Type(v) isn't Object.
    60         // Note that `typeof document.all === "undefined"`.
    61         function isPrimitive(v) {
    62             return (v === null ||
    63                     v === undefined ||
    64                     typeof v === "boolean" ||
    65                     typeof v === "number" ||
    66                     typeof v === "string" ||
    67                     typeof v === "symbol");
    68         }
    70         function assertSameValue(a, b, msg) {
    71             try {
    72                 assertEq(a, b);
    73             } catch (exc) {
    74                 throw new Error(exc.message + (msg ? " " + msg : ""));
    75             }
    76         }
    78         function assertSameClass(a, b, msg) {
    79             var ac = Object_toString(a), bc = Object_toString(b);
    80             assertSameValue(ac, bc, msg);
    81             switch (ac) {
    82             case "[object Function]":
    83                 assertSameValue(Function_toString(a), Function_toString(b), msg);
    84             }
    85         }
    87         function at(prevmsg, segment) {
    88             return prevmsg ? prevmsg + segment : "at _" + segment;
    89         }
    91         // Assert that the arguments a and b are thoroughly structurally equivalent.
    92         //
    93         // For the sake of speed, we cut a corner:
    94         //        var x = {}, y = {}, ax = [x];
    95         //        assertDeepEq([ax, x], [ax, y]);  // passes (?!)
    96         //
    97         // Technically this should fail, since the two object graphs are different.
    98         // (The graph of [ax, y] contains one more object than the graph of [ax, x].)
    99         //
   100         // To get technically correct behavior, pass {strictEquivalence: true}.
   101         // This is slower because we have to walk the entire graph, and Object.prototype
   102         // is big.
   103         //
   104         return function assertDeepEq(a, b, options) {
   105             var strictEquivalence = options ? options.strictEquivalence : false;
   107             function assertSameProto(a, b, msg) {
   108                 check(Object_getPrototypeOf(a), Object_getPrototypeOf(b), at(msg, ".__proto__"));
   109             }
   111             function failPropList(na, nb, msg) {
   112                 throw Error_("got own properties " + uneval_(na) + ", expected " + uneval_(nb) +
   113                              (msg ? " " + msg : ""));
   114             }
   116             function assertSameProps(a, b, msg) {
   117                 var na = Object_getOwnPropertyNames(a),
   118                     nb = Object_getOwnPropertyNames(b);
   119                 if (na.length !== nb.length)
   120                     failPropList(na, nb, msg);
   121                 for (var i = 0; i < na.length; i++) {
   122                     var name = na[i];
   123                     if (name !== nb[i])
   124                         failPropList(na, nb, msg);
   125                     var da = Object_getOwnPropertyDescriptor(a, name),
   126                         db = Object_getOwnPropertyDescriptor(b, name);
   127                     var pmsg = at(msg, /^[_$A-Za-z0-9]+$/.test(name)
   128                                        ? /0|[1-9][0-9]*/.test(name) ? "[" + name + "]" : "." + name
   129                                        : "[" + uneval_(name) + "]");
   130                     assertSameValue(da.configurable, db.configurable, at(pmsg, ".[[Configurable]]"));
   131                     assertSameValue(da.enumerable, db.enumerable, at(pmsg, ".[[Enumerable]]"));
   132                     if (Object_hasOwnProperty(da, "value")) {
   133                         if (!Object_hasOwnProperty(db, "value"))
   134                             throw Error_("got data property, expected accessor property" + pmsg);
   135                         check(da.value, db.value, pmsg);
   136                     } else {
   137                         if (Object_hasOwnProperty(db, "value"))
   138                             throw Error_("got accessor property, expected data property" + pmsg);
   139                         check(da.get, db.get, at(pmsg, ".[[Get]]"));
   140                         check(da.set, db.set, at(pmsg, ".[[Set]]"));
   141                     }
   142                 }
   143             };
   145             var ab = Map_();
   146             var bpath = Map_();
   148             function check(a, b, path) {
   149                 if (isPrimitive(a)) {
   150                     assertSameValue(a, b, path);
   151                 } else if (isPrimitive(b)) {
   152                     throw Error_("got " + Object_toString(a) + ", expected " + uneval_(b) + " " + path);
   153                 } else if (Map_has(ab, a)) {
   154                     assertSameValue(Map_get(ab, a), b, path);
   155                 } else if (Map_has(bpath, b)) {
   156                     var bPrevPath = Map_get(bpath, b) || "_";
   157                     throw Error_("got distinct objects " + at(path, "") + " and " + at(bPrevPath, "") +
   158                                  ", expected the same object both places");
   159                 } else {
   160                     Map_set(ab, a, b);
   161                     Map_set(bpath, b, path);
   162                     if (a !== b || strictEquivalence) {
   163                         assertSameClass(a, b, path);
   164                         assertSameProto(a, b, path);
   165                         assertSameProps(a, b, path);
   166                         assertSameValue(Object_isExtensible(a),
   167                                         Object_isExtensible(b),
   168                                         at(path, ".[[Extensible]]"));
   169                     }
   170                 }
   171             }
   173             check(a, b, "");
   174         };
   175     })();
   176 }

mercurial