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.
1 /* -*- Mode: Javascript; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 "use strict";
5 function assert(x, msg)
6 {
7 if (x)
8 return;
9 debugger;
10 if (msg)
11 throw "assertion failed: " + msg + "\n" + (Error().stack);
12 else
13 throw "assertion failed: " + (Error().stack);
14 }
16 function defined(x) {
17 return x !== undefined;
18 }
20 function xprint(x, padding)
21 {
22 if (!padding)
23 padding = "";
24 if (x instanceof Array) {
25 print(padding + "[");
26 for (var elem of x)
27 xprint(elem, padding + " ");
28 print(padding + "]");
29 } else if (x instanceof Object) {
30 print(padding + "{");
31 for (var prop in x) {
32 print(padding + " " + prop + ":");
33 xprint(x[prop], padding + " ");
34 }
35 print(padding + "}");
36 } else {
37 print(padding + x);
38 }
39 }
41 function sameBlockId(id0, id1)
42 {
43 if (id0.Kind != id1.Kind)
44 return false;
45 if (!sameVariable(id0.Variable, id1.Variable))
46 return false;
47 if (id0.Kind == "Loop" && id0.Loop != id1.Loop)
48 return false;
49 return true;
50 }
52 function sameVariable(var0, var1)
53 {
54 assert("Name" in var0 || var0.Kind == "This" || var0.Kind == "Return");
55 assert("Name" in var1 || var1.Kind == "This" || var1.Kind == "Return");
56 if ("Name" in var0)
57 return "Name" in var1 && var0.Name[0] == var1.Name[0];
58 return var0.Kind == var1.Kind;
59 }
61 function blockIdentifier(body)
62 {
63 if (body.BlockId.Kind == "Loop")
64 return body.BlockId.Loop;
65 assert(body.BlockId.Kind == "Function", "body.Kind should be Function, not " + body.BlockId.Kind);
66 return body.BlockId.Variable.Name[0];
67 }
69 function collectBodyEdges(body)
70 {
71 body.predecessors = [];
72 body.successors = [];
73 if (!("PEdge" in body))
74 return;
76 for (var edge of body.PEdge) {
77 var [ source, target ] = edge.Index;
78 if (!(target in body.predecessors))
79 body.predecessors[target] = [];
80 body.predecessors[target].push(edge);
81 if (!(source in body.successors))
82 body.successors[source] = [];
83 body.successors[source].push(edge);
84 }
85 }
87 function getPredecessors(body)
88 {
89 try {
90 if (!('predecessors' in body))
91 collectBodyEdges(body);
92 } catch (e) {
93 debugger;
94 printErr("body is " + body);
95 }
96 return body.predecessors;
97 }
99 function getSuccessors(body)
100 {
101 if (!('successors' in body))
102 collectBodyEdges(body);
103 return body.successors;
104 }
106 // Split apart a function from sixgill into its mangled and unmangled name. If
107 // no mangled name was given, use the unmangled name as its mangled name
108 function splitFunction(func)
109 {
110 var split = func.indexOf("|");
111 if (split == -1)
112 return [ func, func ];
113 return [ func.substr(0, split), func.substr(split+1) ];
114 }
116 function mangled(fullname)
117 {
118 var split = fullname.indexOf("|");
119 if (split == -1)
120 return fullname;
121 return fullname.substr(0, split);
122 }
124 function readable(fullname)
125 {
126 var split = fullname.indexOf("|");
127 if (split == -1)
128 return fullname;
129 return fullname.substr(split+1);
130 }
132 function xdbLibrary()
133 {
134 var lib = ctypes.open(environment['XDB']);
135 return {
136 open: lib.declare("xdb_open", ctypes.default_abi, ctypes.void_t, ctypes.char.ptr),
137 min_data_stream: lib.declare("xdb_min_data_stream", ctypes.default_abi, ctypes.int),
138 max_data_stream: lib.declare("xdb_max_data_stream", ctypes.default_abi, ctypes.int),
139 read_key: lib.declare("xdb_read_key", ctypes.default_abi, ctypes.char.ptr, ctypes.int),
140 read_entry: lib.declare("xdb_read_entry", ctypes.default_abi, ctypes.char.ptr, ctypes.char.ptr),
141 free_string: lib.declare("xdb_free", ctypes.default_abi, ctypes.void_t, ctypes.char.ptr)
142 };
143 }