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 | load(libdir + 'iteration.js'); |
michael@0 | 2 | |
michael@0 | 3 | let makeCall = farg => Function("f", "arg", "return f(" + farg + ");"); |
michael@0 | 4 | let makeFunCall = farg => Function("f", "arg", "return f.call(null, " + farg + ");"); |
michael@0 | 5 | let makeNew = farg => Function("f", "arg", "return new f(" + farg + ").length;"); |
michael@0 | 6 | |
michael@0 | 7 | function checkLength(f, makeFn) { |
michael@0 | 8 | assertEq(makeFn("...[1, 2, 3]")(f), 3); |
michael@0 | 9 | assertEq(makeFn("1, ...[2], 3")(f), 3); |
michael@0 | 10 | assertEq(makeFn("1, ...[2], ...[3]")(f), 3); |
michael@0 | 11 | assertEq(makeFn("1, ...[2, 3]")(f), 3); |
michael@0 | 12 | assertEq(makeFn("1, ...[], 2, 3")(f), 3); |
michael@0 | 13 | |
michael@0 | 14 | assertEq(makeFn("...[1]")(f), 1); |
michael@0 | 15 | assertEq(makeFn("...[1, 2]")(f), 2); |
michael@0 | 16 | assertEq(makeFn("...[1, 2, 3, 4]")(f), 4); |
michael@0 | 17 | assertEq(makeFn("1, ...[2, 3, 4], 5")(f), 5); |
michael@0 | 18 | |
michael@0 | 19 | assertEq(makeFn("...[undefined]")(f), 1); |
michael@0 | 20 | |
michael@0 | 21 | // other iterable objects |
michael@0 | 22 | assertEq(makeFn("...arg")(f, new Int32Array([1, 2, 3])), 3); |
michael@0 | 23 | assertEq(makeFn("...arg")(f, "abc"), 3); |
michael@0 | 24 | assertEq(makeFn("...arg")(f, [1, 2, 3][std_iterator]()), 3); |
michael@0 | 25 | assertEq(makeFn("...arg")(f, Set([1, 2, 3])), 3); |
michael@0 | 26 | assertEq(makeFn("...arg")(f, Map([["a", "A"], ["b", "B"], ["c", "C"]])), 3); |
michael@0 | 27 | let itr = {}; |
michael@0 | 28 | itr[std_iterator] = function() { |
michael@0 | 29 | return { |
michael@0 | 30 | i: 1, |
michael@0 | 31 | next: function() { |
michael@0 | 32 | if (this.i < 4) |
michael@0 | 33 | return { value: this.i++, done: false }; |
michael@0 | 34 | else |
michael@0 | 35 | return { value: undefined, done: true }; |
michael@0 | 36 | } |
michael@0 | 37 | }; |
michael@0 | 38 | } |
michael@0 | 39 | assertEq(makeFn("...arg")(f, itr), 3); |
michael@0 | 40 | function* gen() { |
michael@0 | 41 | for (let i = 1; i < 4; i ++) |
michael@0 | 42 | yield i; |
michael@0 | 43 | } |
michael@0 | 44 | assertEq(makeFn("...arg")(f, gen()), 3); |
michael@0 | 45 | } |
michael@0 | 46 | |
michael@0 | 47 | checkLength(function(x) arguments.length, makeCall); |
michael@0 | 48 | checkLength(function(x) arguments.length, makeFunCall); |
michael@0 | 49 | checkLength((x) => arguments.length, makeCall); |
michael@0 | 50 | checkLength((x) => arguments.length, makeFunCall); |
michael@0 | 51 | function lengthClass(x) { |
michael@0 | 52 | this.length = arguments.length; |
michael@0 | 53 | } |
michael@0 | 54 | checkLength(lengthClass, makeNew); |