Sat, 03 Jan 2015 20:18:00 +0100
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.
michael@0 | 1 | // Tests for the assertEqual function in jit-test/lib/asserts.js |
michael@0 | 2 | |
michael@0 | 3 | load(libdir + "asserts.js"); |
michael@0 | 4 | |
michael@0 | 5 | function assertNotDeepEq(a, b, options) { |
michael@0 | 6 | assertThrowsInstanceOf(() => assertDeepEq(a, b, options), Error); |
michael@0 | 7 | } |
michael@0 | 8 | |
michael@0 | 9 | // primitives |
michael@0 | 10 | assertDeepEq(undefined, undefined); |
michael@0 | 11 | assertDeepEq("1", "1"); |
michael@0 | 12 | assertNotDeepEq(1, "1"); |
michael@0 | 13 | assertNotDeepEq(undefined, null); |
michael@0 | 14 | assertNotDeepEq({}, null); |
michael@0 | 15 | |
michael@0 | 16 | // objects |
michael@0 | 17 | assertDeepEq({}, {}); |
michael@0 | 18 | assertDeepEq({one: 1, two: 2}, {one: 1, two: 2}); |
michael@0 | 19 | assertNotDeepEq(Object.freeze({}), {}); |
michael@0 | 20 | assertDeepEq(Object.create(null), Object.create(null)); |
michael@0 | 21 | assertNotDeepEq(Object.create(null, {a: {configurable: false, value: 3}}), |
michael@0 | 22 | Object.create(null, {a: {configurable: true, value: 3}})); |
michael@0 | 23 | assertNotDeepEq({one: 1}, {one: 1, two: 2}); |
michael@0 | 24 | assertNotDeepEq({yes: true}, {oui: true}); |
michael@0 | 25 | assertNotDeepEq({zero: 0}, {zero: "0"}); |
michael@0 | 26 | |
michael@0 | 27 | // test the comment |
michael@0 | 28 | var x = {}, y = {}, ax = [x]; |
michael@0 | 29 | assertDeepEq([ax, x], [ax, y]); // passes (bogusly) |
michael@0 | 30 | assertNotDeepEq([ax, x], [ax, y], {strictEquivalence: true}); |
michael@0 | 31 | assertDeepEq([x, ax], [y, ax]); // passes (bogusly) |
michael@0 | 32 | assertNotDeepEq([x, ax], [y, ax], {strictEquivalence: true}); |
michael@0 | 33 | |
michael@0 | 34 | // object identity |
michael@0 | 35 | assertNotDeepEq([x, y], [x, x]); |
michael@0 | 36 | assertDeepEq([x, y], [x, y]); |
michael@0 | 37 | assertDeepEq([y, x], [x, y]); |
michael@0 | 38 | |
michael@0 | 39 | // proto chain |
michael@0 | 40 | var x = {}; |
michael@0 | 41 | assertDeepEq(Object.create(x), Object.create(x)); |
michael@0 | 42 | assertDeepEq(Object.create({}), Object.create({})); // equivalent but not identical proto objects |
michael@0 | 43 | |
michael@0 | 44 | // arrays |
michael@0 | 45 | assertDeepEq([], []); |
michael@0 | 46 | assertNotDeepEq([], [1]); |
michael@0 | 47 | assertDeepEq([1], [1]); |
michael@0 | 48 | assertNotDeepEq([0], [1]); |
michael@0 | 49 | assertDeepEq([1, 2, 3], [1, 2, 3]); |
michael@0 | 50 | assertNotDeepEq([1, , 3], [1, undefined, 3]); |
michael@0 | 51 | var p = [], q = []; |
michael@0 | 52 | p.prop = 1; |
michael@0 | 53 | assertNotDeepEq(p, q); |
michael@0 | 54 | assertNotDeepEq(q, p); |
michael@0 | 55 | q.prop = 1; |
michael@0 | 56 | assertDeepEq(q, p); |
michael@0 | 57 | |
michael@0 | 58 | // functions |
michael@0 | 59 | assertNotDeepEq(() => 1, () => 2); |
michael@0 | 60 | assertNotDeepEq((...x) => 1, x => 1); |
michael@0 | 61 | assertNotDeepEq(function f(){}, function g(){}); |
michael@0 | 62 | var f1 = function () {}, f2 = function () {}; |
michael@0 | 63 | assertDeepEq(f1, f1); |
michael@0 | 64 | assertDeepEq(f1, f2); // same text, close enough |
michael@0 | 65 | f1.prop = 1; |
michael@0 | 66 | assertNotDeepEq(f1, f2); |
michael@0 | 67 | f2.prop = 1; |
michael@0 | 68 | assertDeepEq(f1, f2); |
michael@0 | 69 | |
michael@0 | 70 | // recursion |
michael@0 | 71 | var a = [], b = []; |
michael@0 | 72 | a[0] = a; |
michael@0 | 73 | b[0] = b; |
michael@0 | 74 | assertDeepEq(a, b); |
michael@0 | 75 | a[0] = b; |
michael@0 | 76 | assertNotDeepEq(a, b); // [#1=[#1#]] is not structurally equivalent to #1=[[#1#]] |
michael@0 | 77 | b[0] = a; |
michael@0 | 78 | assertDeepEq(a, b); |
michael@0 | 79 | b[0] = [a]; // a[0] === b, b[0] === c, c[0] === a |
michael@0 | 80 | assertDeepEq(a, b); |
michael@0 | 81 | |
michael@0 | 82 | // objects that merge |
michael@0 | 83 | var x = {}; |
michael@0 | 84 | assertDeepEq({x: x}, {x: x}); |
michael@0 | 85 | var y = [x]; |
michael@0 | 86 | assertDeepEq([y], [y]); |
michael@0 | 87 | |
michael@0 | 88 | // cross-compartment |
michael@0 | 89 | var g1 = newGlobal(), g2 = newGlobal(); |
michael@0 | 90 | assertDeepEq(g1, g2); |
michael@0 | 91 | assertDeepEq(g1, g2, {strictEquivalence: true}); |
michael@0 | 92 | Object.preventExtensions(g2.Math.abs); // make some miniscule change |
michael@0 | 93 | assertNotDeepEq(g1, g2); |