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 /* 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/. */
5 /*
6 * This file provides common and shared functionality to facilitate
7 * testing of the Crashes component (CrashManager.jsm).
8 */
10 "use strict";
12 const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
14 this.EXPORTED_SYMBOLS = [
15 "configureLogging",
16 "getManager",
17 "sleep",
18 "TestingCrashManager",
19 ];
21 Cu.import("resource://gre/modules/CrashManager.jsm", this);
22 Cu.import("resource://gre/modules/Log.jsm", this);
23 Cu.import("resource://gre/modules/osfile.jsm", this);
24 Cu.import("resource://gre/modules/Promise.jsm", this);
25 Cu.import("resource://gre/modules/Task.jsm", this);
26 Cu.import("resource://gre/modules/Timer.jsm", this);
28 let loggingConfigured = false;
30 this.configureLogging = function () {
31 if (loggingConfigured) {
32 return;
33 }
35 let log = Log.repository.getLogger("Crashes.CrashManager");
36 log.level = Log.Level.All;
37 let appender = new Log.DumpAppender();
38 appender.level = Log.Level.All;
39 log.addAppender(appender);
40 loggingConfigured = true;
41 };
43 this.sleep = function (wait) {
44 let deferred = Promise.defer();
46 setTimeout(() => {
47 deferred.resolve();
48 }, wait);
50 return deferred.promise;
51 };
53 this.TestingCrashManager = function (options) {
54 CrashManager.call(this, options);
55 }
57 this.TestingCrashManager.prototype = {
58 __proto__: CrashManager.prototype,
60 createDummyDump: function (submitted=false, date=new Date(), hr=false) {
61 let uuid = Cc["@mozilla.org/uuid-generator;1"]
62 .getService(Ci.nsIUUIDGenerator)
63 .generateUUID()
64 .toString();
65 uuid = uuid.substring(1, uuid.length - 1);
67 let path;
68 let mode;
69 if (submitted) {
70 if (hr) {
71 path = OS.Path.join(this._submittedDumpsDir, "bp-hr-" + uuid + ".txt");
72 } else {
73 path = OS.Path.join(this._submittedDumpsDir, "bp-" + uuid + ".txt");
74 }
75 mode = OS.Constants.libc.S_IRUSR | OS.Constants.libc.S_IWUSR |
76 OS.Constants.libc.S_IRGRP | OS.Constants.libc.S_IROTH;
77 } else {
78 path = OS.Path.join(this._pendingDumpsDir, uuid + ".dmp");
79 mode = OS.Constants.libc.S_IRUSR | OS.Constants.libc.S_IWUSR;
80 }
82 return Task.spawn(function* () {
83 let f = yield OS.File.open(path, {create: true}, {unixMode: mode});
84 yield f.setDates(date, date);
85 yield f.close();
86 dump("Created fake crash: " + path + "\n");
88 return uuid;
89 });
90 },
92 createIgnoredDumpFile: function (filename, submitted=false) {
93 let path;
94 if (submitted) {
95 path = OS.Path.join(this._submittedDumpsDir, filename);
96 } else {
97 path = OS.Path.join(this._pendingDumpsDir, filename);
98 }
100 return Task.spawn(function* () {
101 let mode = OS.Constants.libc.S_IRUSR | OS.Constants.libc.S_IWUSR;
102 yield OS.File.open(path, {create: true}, {unixMode: mode});
103 dump ("Create ignored dump file: " + path + "\n");
104 });
105 },
107 createEventsFile: function (filename, type, date, content, index=0) {
108 let path = OS.Path.join(this._eventsDirs[index], filename);
110 let data = type + "\n" +
111 Math.floor(date.getTime() / 1000) + "\n" +
112 content;
113 let encoder = new TextEncoder();
114 let array = encoder.encode(data);
116 return Task.spawn(function* () {
117 yield OS.File.writeAtomic(path, array);
118 yield OS.File.setDates(path, date, date);
119 });
120 },
122 /**
123 * Overwrite event file handling to process our test file type.
124 *
125 * We can probably delete this once we have actual events defined.
126 */
127 _handleEventFilePayload: function (store, entry, type, date, payload) {
128 if (type == "test.1") {
129 if (payload == "malformed") {
130 return this.EVENT_FILE_ERROR_MALFORMED;
131 } else if (payload == "success") {
132 return this.EVENT_FILE_SUCCESS;
133 } else {
134 return this.EVENT_FILE_ERROR_UNKNOWN_EVENT;
135 }
136 }
138 return CrashManager.prototype._handleEventFilePayload.call(this,
139 store,
140 entry,
141 type,
142 date,
143 payload);
144 },
145 };
147 let DUMMY_DIR_COUNT = 0;
149 this.getManager = function () {
150 return Task.spawn(function* () {
151 const dirMode = OS.Constants.libc.S_IRWXU;
152 let baseFile = OS.Constants.Path.profileDir;
154 function makeDir(create=true) {
155 return Task.spawn(function* () {
156 let path = OS.Path.join(baseFile, "dummy-dir-" + DUMMY_DIR_COUNT++);
158 if (!create) {
159 return path;
160 }
162 dump("Creating directory: " + path + "\n");
163 yield OS.File.makeDir(path, {unixMode: dirMode});
165 return path;
166 });
167 }
169 let pendingD = yield makeDir();
170 let submittedD = yield makeDir();
171 let eventsD1 = yield makeDir();
172 let eventsD2 = yield makeDir();
174 // Store directory is created at run-time if needed. Ensure those code
175 // paths are triggered.
176 let storeD = yield makeDir(false);
178 let m = new TestingCrashManager({
179 pendingDumpsDir: pendingD,
180 submittedDumpsDir: submittedD,
181 eventsDirs: [eventsD1, eventsD2],
182 storeDir: storeD,
183 });
185 return m;
186 });
187 };