2012-12-08 04:28:54 -08:00
|
|
|
/* 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/. */
|
|
|
|
|
|
|
|
function waitForCondition(condition, nextTest, errorMsg) {
|
|
|
|
var tries = 0;
|
|
|
|
var interval = setInterval(function() {
|
|
|
|
if (tries >= 30) {
|
|
|
|
ok(false, errorMsg);
|
|
|
|
moveOn();
|
|
|
|
}
|
|
|
|
if (condition()) {
|
|
|
|
moveOn();
|
|
|
|
}
|
|
|
|
tries++;
|
|
|
|
}, 100);
|
|
|
|
var moveOn = function() { clearInterval(interval); nextTest(); };
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check that a specified (string) URL hasn't been "remembered" (ie, is not
|
|
|
|
// in history, will not appear in about:newtab or auto-complete, etc.)
|
|
|
|
function ensureSocialUrlNotRemembered(url) {
|
|
|
|
let gh = Cc["@mozilla.org/browser/global-history;2"]
|
|
|
|
.getService(Ci.nsIGlobalHistory2);
|
|
|
|
let uri = Services.io.newURI(url, null, null);
|
|
|
|
ok(!gh.isVisited(uri), "social URL " + url + " should not be in global history");
|
|
|
|
}
|
|
|
|
|
|
|
|
function runSocialTestWithProvider(manifest, callback) {
|
|
|
|
let SocialService = Cu.import("resource://gre/modules/SocialService.jsm", {}).SocialService;
|
|
|
|
|
|
|
|
let manifests = Array.isArray(manifest) ? manifest : [manifest];
|
|
|
|
|
|
|
|
// Check that none of the provider's content ends up in history.
|
|
|
|
registerCleanupFunction(function () {
|
|
|
|
manifests.forEach(function (m) {
|
|
|
|
for (let what of ['sidebarURL', 'workerURL', 'iconURL']) {
|
|
|
|
if (m[what]) {
|
|
|
|
ensureSocialUrlNotRemembered(m[what]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
info("runSocialTestWithProvider: " + manifests.toSource());
|
|
|
|
|
2012-12-17 15:39:49 -08:00
|
|
|
let finishCount = 0;
|
|
|
|
function finishIfDone(callFinish) {
|
|
|
|
finishCount++;
|
|
|
|
if (finishCount == manifests.length)
|
|
|
|
finish();
|
|
|
|
}
|
|
|
|
function removeAddedProviders(cleanup) {
|
|
|
|
manifests.forEach(function (m) {
|
|
|
|
// If we're "cleaning up", don't call finish when done.
|
|
|
|
let callback = cleanup ? function () {} : finishIfDone;
|
|
|
|
// Similarly, if we're cleaning up, catch exceptions from removeProvider
|
|
|
|
let removeProvider = SocialService.removeProvider.bind(SocialService);
|
|
|
|
if (cleanup) {
|
|
|
|
removeProvider = function (origin, cb) {
|
|
|
|
try {
|
|
|
|
SocialService.removeProvider(origin, cb);
|
|
|
|
} catch (ex) {
|
|
|
|
// Ignore "provider doesn't exist" errors.
|
|
|
|
if (ex.message == "SocialService.removeProvider: no provider with this origin exists!")
|
|
|
|
return;
|
|
|
|
info("Failed to clean up provider " + origin + ": " + ex);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
removeProvider(m.origin, callback);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2012-12-08 04:28:54 -08:00
|
|
|
let providersAdded = 0;
|
|
|
|
let firstProvider;
|
2012-12-17 15:39:49 -08:00
|
|
|
|
2012-12-08 04:28:54 -08:00
|
|
|
manifests.forEach(function (m) {
|
|
|
|
SocialService.addProvider(m, function(provider) {
|
|
|
|
provider.active = true;
|
|
|
|
|
|
|
|
providersAdded++;
|
|
|
|
info("runSocialTestWithProvider: provider added");
|
|
|
|
|
|
|
|
// we want to set the first specified provider as the UI's provider
|
|
|
|
if (provider.origin == manifests[0].origin) {
|
|
|
|
firstProvider = provider;
|
|
|
|
}
|
|
|
|
|
|
|
|
// If we've added all the providers we need, call the callback to start
|
|
|
|
// the tests (and give it a callback it can call to finish them)
|
|
|
|
if (providersAdded == manifests.length) {
|
|
|
|
// Set the UI's provider and enable the feature
|
|
|
|
Social.provider = firstProvider;
|
|
|
|
Social.enabled = true;
|
|
|
|
|
2012-12-17 15:39:49 -08:00
|
|
|
function finishSocialTest(cleanup) {
|
2012-12-08 04:28:54 -08:00
|
|
|
// disable social before removing the providers to avoid providers
|
|
|
|
// being activated immediately before we get around to removing it.
|
|
|
|
Services.prefs.clearUserPref("social.enabled");
|
2012-12-17 15:39:49 -08:00
|
|
|
removeAddedProviders(cleanup);
|
2012-12-08 04:28:54 -08:00
|
|
|
}
|
2012-12-17 15:39:49 -08:00
|
|
|
registerCleanupFunction(function () {
|
|
|
|
finishSocialTest(true);
|
|
|
|
});
|
2012-12-08 04:28:54 -08:00
|
|
|
callback(finishSocialTest);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function runSocialTests(tests, cbPreTest, cbPostTest, cbFinish) {
|
|
|
|
let testIter = Iterator(tests);
|
|
|
|
|
|
|
|
if (cbPreTest === undefined) {
|
|
|
|
cbPreTest = function(cb) {cb()};
|
|
|
|
}
|
|
|
|
if (cbPostTest === undefined) {
|
|
|
|
cbPostTest = function(cb) {cb()};
|
|
|
|
}
|
|
|
|
|
|
|
|
function runNextTest() {
|
|
|
|
let name, func;
|
|
|
|
try {
|
|
|
|
[name, func] = testIter.next();
|
|
|
|
} catch (err if err instanceof StopIteration) {
|
|
|
|
// out of items:
|
|
|
|
(cbFinish || finish)();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
// We run on a timeout as the frameworker also makes use of timeouts, so
|
|
|
|
// this helps keep the debug messages sane.
|
|
|
|
executeSoon(function() {
|
|
|
|
function cleanupAndRunNextTest() {
|
|
|
|
info("sub-test " + name + " complete");
|
|
|
|
cbPostTest(runNextTest);
|
|
|
|
}
|
|
|
|
cbPreTest(function() {
|
|
|
|
info("sub-test " + name + " starting");
|
|
|
|
try {
|
|
|
|
func.call(tests, cleanupAndRunNextTest);
|
|
|
|
} catch (ex) {
|
|
|
|
ok(false, "sub-test " + name + " failed: " + ex.toString() +"\n"+ex.stack);
|
|
|
|
cleanupAndRunNextTest();
|
|
|
|
}
|
|
|
|
})
|
|
|
|
});
|
|
|
|
}
|
|
|
|
runNextTest();
|
|
|
|
}
|