bug 847124, bug 886300 intermittent blocklist failures

This commit is contained in:
Shane Caraveo 2013-08-27 09:18:35 -07:00
parent b03408087a
commit ce13c685bd
7 changed files with 66 additions and 55 deletions

View File

@ -13,7 +13,6 @@ include $(DEPTH)/config/autoconf.mk
MOCHITEST_BROWSER_FILES = \ MOCHITEST_BROWSER_FILES = \
head.js \ head.js \
blocklist.xml \ blocklist.xml \
blocklistEmpty.xml \
browser_blocklist.js \ browser_blocklist.js \
browser_defaults.js \ browser_defaults.js \
browser_addons.js \ browser_addons.js \

View File

@ -1,6 +0,0 @@
<?xml version="1.0"?>
<blocklist xmlns="http://www.mozilla.org/2006/addons-blocklist">
<emItems>
<emItem blockID="s2" id="nothing@services.mozilla.org"></emItem>
</emItems>
</blocklist>

View File

@ -302,9 +302,10 @@ var tests = {
Services.prefs.clearUserPref("social.whitelist"); Services.prefs.clearUserPref("social.whitelist");
let provider = Social._getProviderFromOrigin(addonManifest.origin); let provider = Social._getProviderFromOrigin(addonManifest.origin);
is(provider.manifest.version, 2, "manifest version is 2"); is(provider.manifest.version, 2, "manifest version is 2");
Social.uninstallProvider(addonManifest.origin); Social.uninstallProvider(addonManifest.origin, function() {
gBrowser.removeTab(tab); gBrowser.removeTab(tab);
next(); next();
});
}); });
let port = provider.getWorkerPort(); let port = provider.getWorkerPort();

View File

@ -8,7 +8,6 @@ let SocialService = Cu.import("resource://gre/modules/SocialService.jsm", {}).So
const URI_EXTENSION_BLOCKLIST_DIALOG = "chrome://mozapps/content/extensions/blocklist.xul"; const URI_EXTENSION_BLOCKLIST_DIALOG = "chrome://mozapps/content/extensions/blocklist.xul";
let blocklistURL = "http://test:80/browser/browser/base/content/test/social/blocklist.xml"; let blocklistURL = "http://test:80/browser/browser/base/content/test/social/blocklist.xml";
let blocklistEmpty = "http://test:80/browser/browser/base/content/test/social/blocklistEmpty.xml";
let manifest = { // normal provider let manifest = { // normal provider
name: "provider ok", name: "provider ok",
@ -39,7 +38,7 @@ var tests = {
setAndUpdateBlocklist(blocklistURL, function() { setAndUpdateBlocklist(blocklistURL, function() {
ok(Services.blocklist.isAddonBlocklisted("test1.example.com@services.mozilla.org", "0", "0", "0"), "blocking 'blocked'"); ok(Services.blocklist.isAddonBlocklisted("test1.example.com@services.mozilla.org", "0", "0", "0"), "blocking 'blocked'");
ok(!Services.blocklist.isAddonBlocklisted("example.com@services.mozilla.org", "0", "0", "0"), "not blocking 'good'"); ok(!Services.blocklist.isAddonBlocklisted("example.com@services.mozilla.org", "0", "0", "0"), "not blocking 'good'");
setAndUpdateBlocklist(blocklistEmpty, function() { resetBlocklist(function() {
ok(!Services.blocklist.isAddonBlocklisted("test1.example.com@services.mozilla.org", "0", "0", "0"), "blocklist cleared"); ok(!Services.blocklist.isAddonBlocklisted("test1.example.com@services.mozilla.org", "0", "0", "0"), "blocklist cleared");
next(); next();
}); });
@ -49,7 +48,7 @@ var tests = {
function finish(isgood) { function finish(isgood) {
ok(isgood, "adding non-blocked provider ok"); ok(isgood, "adding non-blocked provider ok");
Services.prefs.clearUserPref("social.manifest.good"); Services.prefs.clearUserPref("social.manifest.good");
setAndUpdateBlocklist(blocklistEmpty, next); resetBlocklist(next);
} }
setManifestPref("social.manifest.good", manifest); setManifestPref("social.manifest.good", manifest);
setAndUpdateBlocklist(blocklistURL, function() { setAndUpdateBlocklist(blocklistURL, function() {
@ -75,7 +74,7 @@ var tests = {
function finish(good) { function finish(good) {
ok(good, "Unable to add blocklisted provider"); ok(good, "Unable to add blocklisted provider");
Services.prefs.clearUserPref("social.manifest.blocked"); Services.prefs.clearUserPref("social.manifest.blocked");
setAndUpdateBlocklist(blocklistEmpty, next); resetBlocklist(next);
} }
setManifestPref("social.manifest.blocked", manifest_bad); setManifestPref("social.manifest.blocked", manifest_bad);
setAndUpdateBlocklist(blocklistURL, function() { setAndUpdateBlocklist(blocklistURL, function() {
@ -85,7 +84,7 @@ var tests = {
finish(false); finish(false);
}); });
} catch(e) { } catch(e) {
ok(true, "SocialService.addProvider should throw blocklist exception"); ok(true, "SocialService.addProvider should throw blocklist exception: " + e);
finish(true); finish(true);
} }
}); });
@ -94,7 +93,7 @@ var tests = {
function finish(good) { function finish(good) {
ok(good, "Unable to add blocklisted provider"); ok(good, "Unable to add blocklisted provider");
Services.prefs.clearUserPref("social.whitelist"); Services.prefs.clearUserPref("social.whitelist");
setAndUpdateBlocklist(blocklistEmpty, next); resetBlocklist(next);
} }
let activationURL = manifest_bad.origin + "/browser/browser/base/content/test/social/social_activate.html" let activationURL = manifest_bad.origin + "/browser/browser/base/content/test/social/social_activate.html"
addTab(activationURL, function(tab) { addTab(activationURL, function(tab) {
@ -119,29 +118,62 @@ var tests = {
}); });
}, },
testBlockingExistingProvider: function(next) { testBlockingExistingProvider: function(next) {
let windowWasClosed = false;
function finish() {
waitForCondition(function() windowWasClosed, function() {
Services.wm.removeListener(listener);
next();
}, "blocklist dialog was closed");
}
addWindowListener(URI_EXTENSION_BLOCKLIST_DIALOG, function(win) { let listener = {
win.close(); _window: null,
ok(true, "window closed"); onOpenWindow: function(aXULWindow) {
}); Services.wm.removeListener(this);
this._window = aXULWindow;
let domwindow = aXULWindow.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindow);
domwindow.addEventListener("unload", function _unload() {
domwindow.removeEventListener("unload", _unload, false);
windowWasClosed = true;
}, false);
info("dialog opened, waiting for focus");
waitForFocus(function() {
is(domwindow.document.location.href, URI_EXTENSION_BLOCKLIST_DIALOG, "dialog opened and focused");
executeSoon(function() {
domwindow.close();
});
}, domwindow);
},
onCloseWindow: function(aXULWindow) { },
onWindowTitleChange: function(aXULWindow, aNewTitle) { }
};
Services.wm.addListener(listener);
setManifestPref("social.manifest.blocked", manifest_bad); setManifestPref("social.manifest.blocked", manifest_bad);
SocialService.addProvider(manifest_bad, function(provider) { try {
if (provider) { SocialService.addProvider(manifest_bad, function(provider) {
// the act of blocking should cause a 'provider-removed' notification // the act of blocking should cause a 'provider-removed' notification
// from SocialService. // from SocialService.
SocialService.registerProviderListener(function providerListener() { SocialService.registerProviderListener(function providerListener(topic) {
if (topic != "provider-removed")
return;
SocialService.unregisterProviderListener(providerListener); SocialService.unregisterProviderListener(providerListener);
SocialService.getProvider(provider.origin, function(p) { SocialService.getProvider(provider.origin, function(p) {
ok(p==null, "blocklisted provider removed"); ok(p==null, "blocklisted provider removed");
Services.prefs.clearUserPref("social.manifest.blocked"); Services.prefs.clearUserPref("social.manifest.blocked");
setAndUpdateBlocklist(blocklistEmpty, next); resetBlocklist(finish);
}); });
}); });
// no callback - the act of updating should cause the listener above // no callback - the act of updating should cause the listener above
// to fire. // to fire.
setAndUpdateBlocklist(blocklistURL); setAndUpdateBlocklist(blocklistURL);
} });
}); } catch(e) {
ok(false, "unable to add provider " + e);
finish();
}
} }
} }

View File

@ -165,7 +165,8 @@ function runSocialTests(tests, cbPreTest, cbPostTest, cbFinish) {
} catch (err if err instanceof StopIteration) { } catch (err if err instanceof StopIteration) {
// out of items: // out of items:
(cbFinish || defaultFinishChecks)(); (cbFinish || defaultFinishChecks)();
info("runSocialTests: finish test run with " + Social.providers.length + " providers"); is(providersAtStart, Social.providers.length,
"runSocialTests: finish test run with " + Social.providers.length + " providers");
return; return;
} }
// We run on a timeout as the frameworker also makes use of timeouts, so // We run on a timeout as the frameworker also makes use of timeouts, so
@ -314,26 +315,6 @@ function resetBuiltinManifestPref(name) {
Services.prefs.PREF_INVALID, "default manifest removed"); Services.prefs.PREF_INVALID, "default manifest removed");
} }
function addWindowListener(aURL, aCallback) {
Services.wm.addListener({
onOpenWindow: function(aXULWindow) {
info("window opened, waiting for focus");
Services.wm.removeListener(this);
var domwindow = aXULWindow.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindow);
waitForFocus(function() {
is(domwindow.document.location.href, aURL, "window opened and focused");
executeSoon(function() {
aCallback(domwindow);
});
}, domwindow);
},
onCloseWindow: function(aXULWindow) { },
onWindowTitleChange: function(aXULWindow, aNewTitle) { }
});
}
function addTab(url, callback) { function addTab(url, callback) {
let tab = gBrowser.selectedTab = gBrowser.addTab(url, {skipAnimation: true}); let tab = gBrowser.selectedTab = gBrowser.addTab(url, {skipAnimation: true});
tab.linkedBrowser.addEventListener("load", function tabLoad(event) { tab.linkedBrowser.addEventListener("load", function tabLoad(event) {

View File

@ -262,8 +262,8 @@ this.Social = {
SocialService.installProvider(doc, data, installCallback); SocialService.installProvider(doc, data, installCallback);
}, },
uninstallProvider: function(origin) { uninstallProvider: function(origin, aCallback) {
SocialService.uninstallProvider(origin); SocialService.uninstallProvider(origin, aCallback);
}, },
// Activation functionality // Activation functionality

View File

@ -676,10 +676,10 @@ this.SocialService = {
}, },
uninstallProvider: function(origin) { uninstallProvider: function(origin, aCallback) {
let manifest = SocialServiceInternal.getManifestByOrigin(origin); let manifest = SocialServiceInternal.getManifestByOrigin(origin);
let addon = new AddonWrapper(manifest); let addon = new AddonWrapper(manifest);
addon.uninstall(); addon.uninstall(aCallback);
} }
}; };
@ -1071,12 +1071,14 @@ var SocialAddonProvider = {
aCallback([new AddonWrapper(a) for each (a in SocialServiceInternal.manifests)]); aCallback([new AddonWrapper(a) for each (a in SocialServiceInternal.manifests)]);
}, },
removeAddon: function(aAddon) { removeAddon: function(aAddon, aCallback) {
AddonManagerPrivate.callAddonListeners("onUninstalling", aAddon, false); AddonManagerPrivate.callAddonListeners("onUninstalling", aAddon, false);
aAddon.pendingOperations |= AddonManager.PENDING_UNINSTALL; aAddon.pendingOperations |= AddonManager.PENDING_UNINSTALL;
Services.prefs.clearUserPref(getPrefnameFromOrigin(aAddon.manifest.origin)); Services.prefs.clearUserPref(getPrefnameFromOrigin(aAddon.manifest.origin));
aAddon.pendingOperations -= AddonManager.PENDING_UNINSTALL; aAddon.pendingOperations -= AddonManager.PENDING_UNINSTALL;
AddonManagerPrivate.callAddonListeners("onUninstalled", aAddon); AddonManagerPrivate.callAddonListeners("onUninstalled", aAddon);
if (aCallback)
schedule(aCallback);
} }
} }
@ -1245,16 +1247,18 @@ AddonWrapper.prototype = {
return val; return val;
}, },
uninstall: function() { uninstall: function(aCallback) {
let prefName = getPrefnameFromOrigin(this.manifest.origin); let prefName = getPrefnameFromOrigin(this.manifest.origin);
if (Services.prefs.prefHasUserValue(prefName)) { if (Services.prefs.prefHasUserValue(prefName)) {
if (ActiveProviders.has(this.manifest.origin)) { if (ActiveProviders.has(this.manifest.origin)) {
SocialService.removeProvider(this.manifest.origin, function() { SocialService.removeProvider(this.manifest.origin, function() {
SocialAddonProvider.removeAddon(this); SocialAddonProvider.removeAddon(this, aCallback);
}.bind(this)); }.bind(this));
} else { } else {
SocialAddonProvider.removeAddon(this); SocialAddonProvider.removeAddon(this, aCallback);
} }
} else {
schedule(aCallback);
} }
}, },