162 lines
4.9 KiB
JavaScript
162 lines
4.9 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
|
|
Cu.import("resource://gre/modules/Services.jsm");
|
|
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
|
|
|
XPCOMUtils.defineLazyModuleGetter(this, "Promise",
|
|
"resource://gre/modules/Promise.jsm");
|
|
XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils",
|
|
"resource://gre/modules/PlacesUtils.jsm");
|
|
|
|
const MANIFEST_PREFS = Services.prefs.getBranch("social.manifest.");
|
|
const gProfD = do_get_profile();
|
|
|
|
const XULAPPINFO_CONTRACTID = "@mozilla.org/xre/app-info;1";
|
|
const XULAPPINFO_CID = Components.ID("{c763b610-9d49-455a-bbd2-ede71682a1ac}");
|
|
|
|
function createAppInfo(id, name, version, platformVersion) {
|
|
gAppInfo = {
|
|
// nsIXULAppInfo
|
|
vendor: "Mozilla",
|
|
name: name,
|
|
ID: id,
|
|
version: version,
|
|
appBuildID: "2007010101",
|
|
platformVersion: platformVersion ? platformVersion : "1.0",
|
|
platformBuildID: "2007010101",
|
|
|
|
// nsIXULRuntime
|
|
inSafeMode: false,
|
|
logConsoleErrors: true,
|
|
OS: "XPCShell",
|
|
XPCOMABI: "noarch-spidermonkey",
|
|
invalidateCachesOnRestart: function invalidateCachesOnRestart() {
|
|
// Do nothing
|
|
},
|
|
|
|
// nsICrashReporter
|
|
annotations: {},
|
|
|
|
annotateCrashReport: function(key, data) {
|
|
this.annotations[key] = data;
|
|
},
|
|
|
|
QueryInterface: XPCOMUtils.generateQI([Ci.nsIXULAppInfo,
|
|
Ci.nsIXULRuntime,
|
|
Ci.nsICrashReporter,
|
|
Ci.nsISupports])
|
|
};
|
|
|
|
var XULAppInfoFactory = {
|
|
createInstance: function (outer, iid) {
|
|
if (outer != null)
|
|
throw Components.results.NS_ERROR_NO_AGGREGATION;
|
|
return gAppInfo.QueryInterface(iid);
|
|
}
|
|
};
|
|
var registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
|
|
registrar.registerFactory(XULAPPINFO_CID, "XULAppInfo",
|
|
XULAPPINFO_CONTRACTID, XULAppInfoFactory);
|
|
}
|
|
|
|
function initApp() {
|
|
createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9");
|
|
// prepare a blocklist file for the blocklist service
|
|
var blocklistFile = gProfD.clone();
|
|
blocklistFile.append("blocklist.xml");
|
|
if (blocklistFile.exists())
|
|
blocklistFile.remove(false);
|
|
var source = do_get_file("blocklist.xml");
|
|
source.copyTo(gProfD, "blocklist.xml");
|
|
blocklistFile.lastModifiedTime = Date.now();
|
|
}
|
|
|
|
function AsyncRunner() {
|
|
do_test_pending();
|
|
do_register_cleanup(() => this.destroy());
|
|
|
|
this._callbacks = {
|
|
done: do_test_finished,
|
|
error: function (err) {
|
|
// xpcshell test functions like do_check_eq throw NS_ERROR_ABORT on
|
|
// failure. Ignore those so they aren't rethrown here.
|
|
if (err !== Cr.NS_ERROR_ABORT) {
|
|
if (err.stack) {
|
|
err = err + " - See following stack:\n" + err.stack +
|
|
"\nUseless do_throw stack";
|
|
}
|
|
do_throw(err);
|
|
}
|
|
},
|
|
consoleError: function (scriptErr) {
|
|
// Try to ensure the error is related to the test.
|
|
let filename = scriptErr.sourceName || scriptErr.toString() || "";
|
|
if (filename.indexOf("/toolkit/components/social/") >= 0)
|
|
do_throw(scriptErr);
|
|
},
|
|
};
|
|
this._iteratorQueue = [];
|
|
|
|
// This catches errors reported to the console, e.g., via Cu.reportError, but
|
|
// not on the runner's stack.
|
|
Cc["@mozilla.org/consoleservice;1"].
|
|
getService(Ci.nsIConsoleService).
|
|
registerListener(this);
|
|
}
|
|
|
|
AsyncRunner.prototype = {
|
|
|
|
appendIterator: function appendIterator(iter) {
|
|
this._iteratorQueue.push(iter);
|
|
},
|
|
|
|
next: function next(/* ... */) {
|
|
if (!this._iteratorQueue.length) {
|
|
this.destroy();
|
|
this._callbacks.done();
|
|
return;
|
|
}
|
|
|
|
// send() discards all arguments after the first, so there's no choice here
|
|
// but to send only one argument to the yielder.
|
|
let args = [arguments.length <= 1 ? arguments[0] : Array.slice(arguments)];
|
|
try {
|
|
var val = this._iteratorQueue[0].send.apply(this._iteratorQueue[0], args);
|
|
}
|
|
catch (err if err instanceof StopIteration) {
|
|
this._iteratorQueue.shift();
|
|
this.next();
|
|
return;
|
|
}
|
|
catch (err) {
|
|
this._callbacks.error(err);
|
|
}
|
|
|
|
// val is an iterator => prepend it to the queue and start on it
|
|
// val is otherwise truthy => call next
|
|
if (val) {
|
|
if (typeof(val) != "boolean")
|
|
this._iteratorQueue.unshift(val);
|
|
this.next();
|
|
}
|
|
},
|
|
|
|
destroy: function destroy() {
|
|
Cc["@mozilla.org/consoleservice;1"].
|
|
getService(Ci.nsIConsoleService).
|
|
unregisterListener(this);
|
|
this.destroy = function alreadyDestroyed() {};
|
|
},
|
|
|
|
observe: function observe(msg) {
|
|
if (msg instanceof Ci.nsIScriptError &&
|
|
!(msg.flags & Ci.nsIScriptError.warningFlag))
|
|
{
|
|
this._callbacks.consoleError(msg);
|
|
}
|
|
},
|
|
};
|