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 = \
head.js \
blocklist.xml \
blocklistEmpty.xml \
browser_blocklist.js \
browser_defaults.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");
let provider = Social._getProviderFromOrigin(addonManifest.origin);
is(provider.manifest.version, 2, "manifest version is 2");
Social.uninstallProvider(addonManifest.origin);
gBrowser.removeTab(tab);
next();
Social.uninstallProvider(addonManifest.origin, function() {
gBrowser.removeTab(tab);
next();
});
});
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";
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
name: "provider ok",
@ -39,7 +38,7 @@ var tests = {
setAndUpdateBlocklist(blocklistURL, function() {
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'");
setAndUpdateBlocklist(blocklistEmpty, function() {
resetBlocklist(function() {
ok(!Services.blocklist.isAddonBlocklisted("test1.example.com@services.mozilla.org", "0", "0", "0"), "blocklist cleared");
next();
});
@ -49,7 +48,7 @@ var tests = {
function finish(isgood) {
ok(isgood, "adding non-blocked provider ok");
Services.prefs.clearUserPref("social.manifest.good");
setAndUpdateBlocklist(blocklistEmpty, next);
resetBlocklist(next);
}
setManifestPref("social.manifest.good", manifest);
setAndUpdateBlocklist(blocklistURL, function() {
@ -75,7 +74,7 @@ var tests = {
function finish(good) {
ok(good, "Unable to add blocklisted provider");
Services.prefs.clearUserPref("social.manifest.blocked");
setAndUpdateBlocklist(blocklistEmpty, next);
resetBlocklist(next);
}
setManifestPref("social.manifest.blocked", manifest_bad);
setAndUpdateBlocklist(blocklistURL, function() {
@ -85,7 +84,7 @@ var tests = {
finish(false);
});
} catch(e) {
ok(true, "SocialService.addProvider should throw blocklist exception");
ok(true, "SocialService.addProvider should throw blocklist exception: " + e);
finish(true);
}
});
@ -94,7 +93,7 @@ var tests = {
function finish(good) {
ok(good, "Unable to add blocklisted provider");
Services.prefs.clearUserPref("social.whitelist");
setAndUpdateBlocklist(blocklistEmpty, next);
resetBlocklist(next);
}
let activationURL = manifest_bad.origin + "/browser/browser/base/content/test/social/social_activate.html"
addTab(activationURL, function(tab) {
@ -119,29 +118,62 @@ var tests = {
});
},
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) {
win.close();
ok(true, "window closed");
});
let listener = {
_window: null,
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);
SocialService.addProvider(manifest_bad, function(provider) {
if (provider) {
try {
SocialService.addProvider(manifest_bad, function(provider) {
// the act of blocking should cause a 'provider-removed' notification
// from SocialService.
SocialService.registerProviderListener(function providerListener() {
SocialService.registerProviderListener(function providerListener(topic) {
if (topic != "provider-removed")
return;
SocialService.unregisterProviderListener(providerListener);
SocialService.getProvider(provider.origin, function(p) {
ok(p==null, "blocklisted provider removed");
Services.prefs.clearUserPref("social.manifest.blocked");
setAndUpdateBlocklist(blocklistEmpty, next);
resetBlocklist(finish);
});
});
// no callback - the act of updating should cause the listener above
// to fire.
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) {
// out of items:
(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;
}
// 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");
}
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) {
let tab = gBrowser.selectedTab = gBrowser.addTab(url, {skipAnimation: true});
tab.linkedBrowser.addEventListener("load", function tabLoad(event) {

View File

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

View File

@ -676,10 +676,10 @@ this.SocialService = {
},
uninstallProvider: function(origin) {
uninstallProvider: function(origin, aCallback) {
let manifest = SocialServiceInternal.getManifestByOrigin(origin);
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)]);
},
removeAddon: function(aAddon) {
removeAddon: function(aAddon, aCallback) {
AddonManagerPrivate.callAddonListeners("onUninstalling", aAddon, false);
aAddon.pendingOperations |= AddonManager.PENDING_UNINSTALL;
Services.prefs.clearUserPref(getPrefnameFromOrigin(aAddon.manifest.origin));
aAddon.pendingOperations -= AddonManager.PENDING_UNINSTALL;
AddonManagerPrivate.callAddonListeners("onUninstalled", aAddon);
if (aCallback)
schedule(aCallback);
}
}
@ -1245,16 +1247,18 @@ AddonWrapper.prototype = {
return val;
},
uninstall: function() {
uninstall: function(aCallback) {
let prefName = getPrefnameFromOrigin(this.manifest.origin);
if (Services.prefs.prefHasUserValue(prefName)) {
if (ActiveProviders.has(this.manifest.origin)) {
SocialService.removeProvider(this.manifest.origin, function() {
SocialAddonProvider.removeAddon(this);
SocialAddonProvider.removeAddon(this, aCallback);
}.bind(this));
} else {
SocialAddonProvider.removeAddon(this);
SocialAddonProvider.removeAddon(this, aCallback);
}
} else {
schedule(aCallback);
}
},