1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/browser/base/content/test/social/browser_addons.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,350 @@ 1.4 + 1.5 + 1.6 +let AddonManager = Cu.import("resource://gre/modules/AddonManager.jsm", {}).AddonManager; 1.7 +let SocialService = Cu.import("resource://gre/modules/SocialService.jsm", {}).SocialService; 1.8 + 1.9 +const ADDON_TYPE_SERVICE = "service"; 1.10 +const ID_SUFFIX = "@services.mozilla.org"; 1.11 +const STRING_TYPE_NAME = "type.%ID%.name"; 1.12 +const XPINSTALL_URL = "chrome://mozapps/content/xpinstall/xpinstallConfirm.xul"; 1.13 + 1.14 +let manifest = { // builtin provider 1.15 + name: "provider 1", 1.16 + origin: "https://example.com", 1.17 + sidebarURL: "https://example.com/browser/browser/base/content/test/social/social_sidebar.html", 1.18 + workerURL: "https://example.com/browser/browser/base/content/test/social/social_worker.js", 1.19 + iconURL: "https://example.com/browser/browser/base/content/test/general/moz.png" 1.20 +}; 1.21 +let manifest2 = { // used for testing install 1.22 + name: "provider 2", 1.23 + origin: "https://test1.example.com", 1.24 + sidebarURL: "https://test1.example.com/browser/browser/base/content/test/social/social_sidebar.html", 1.25 + workerURL: "https://test1.example.com/browser/browser/base/content/test/social/social_worker.js", 1.26 + iconURL: "https://test1.example.com/browser/browser/base/content/test/general/moz.png", 1.27 + version: 1 1.28 +}; 1.29 + 1.30 +function test() { 1.31 + waitForExplicitFinish(); 1.32 + 1.33 + let prefname = getManifestPrefname(manifest); 1.34 + setBuiltinManifestPref(prefname, manifest); 1.35 + // ensure that manifest2 is NOT showing as builtin 1.36 + is(SocialService.getOriginActivationType(manifest.origin), "builtin", "manifest is builtin"); 1.37 + is(SocialService.getOriginActivationType(manifest2.origin), "foreign", "manifest2 is not builtin"); 1.38 + 1.39 + Services.prefs.setBoolPref("social.remote-install.enabled", true); 1.40 + runSocialTests(tests, undefined, undefined, function () { 1.41 + Services.prefs.clearUserPref("social.remote-install.enabled"); 1.42 + // clear our builtin pref 1.43 + ok(!Services.prefs.prefHasUserValue(prefname), "manifest is not in user-prefs"); 1.44 + resetBuiltinManifestPref(prefname); 1.45 + // just in case the tests failed, clear these here as well 1.46 + Services.prefs.clearUserPref("social.whitelist"); 1.47 + Services.prefs.clearUserPref("social.directories"); 1.48 + finish(); 1.49 + }); 1.50 +} 1.51 + 1.52 +function installListener(next, aManifest) { 1.53 + let expectEvent = "onInstalling"; 1.54 + let prefname = getManifestPrefname(aManifest); 1.55 + // wait for the actual removal to call next 1.56 + SocialService.registerProviderListener(function providerListener(topic, origin, providers) { 1.57 + if (topic == "provider-disabled") { 1.58 + SocialService.unregisterProviderListener(providerListener); 1.59 + is(origin, aManifest.origin, "provider disabled"); 1.60 + executeSoon(next); 1.61 + } 1.62 + }); 1.63 + 1.64 + return { 1.65 + onInstalling: function(addon) { 1.66 + is(expectEvent, "onInstalling", "install started"); 1.67 + is(addon.manifest.origin, aManifest.origin, "provider about to be installed"); 1.68 + ok(!Services.prefs.prefHasUserValue(prefname), "manifest is not in user-prefs"); 1.69 + expectEvent = "onInstalled"; 1.70 + }, 1.71 + onInstalled: function(addon) { 1.72 + is(addon.manifest.origin, aManifest.origin, "provider installed"); 1.73 + ok(addon.installDate.getTime() > 0, "addon has installDate"); 1.74 + ok(addon.updateDate.getTime() > 0, "addon has updateDate"); 1.75 + ok(Services.prefs.prefHasUserValue(prefname), "manifest is in user-prefs"); 1.76 + expectEvent = "onUninstalling"; 1.77 + }, 1.78 + onUninstalling: function(addon) { 1.79 + is(expectEvent, "onUninstalling", "uninstall started"); 1.80 + is(addon.manifest.origin, aManifest.origin, "provider about to be uninstalled"); 1.81 + ok(Services.prefs.prefHasUserValue(prefname), "manifest is in user-prefs"); 1.82 + expectEvent = "onUninstalled"; 1.83 + }, 1.84 + onUninstalled: function(addon) { 1.85 + is(expectEvent, "onUninstalled", "provider has been uninstalled"); 1.86 + is(addon.manifest.origin, aManifest.origin, "provider uninstalled"); 1.87 + ok(!Services.prefs.prefHasUserValue(prefname), "manifest is not in user-prefs"); 1.88 + AddonManager.removeAddonListener(this); 1.89 + } 1.90 + }; 1.91 +} 1.92 + 1.93 +var tests = { 1.94 + testAddonEnableToggle: function(next) { 1.95 + let expectEvent; 1.96 + let prefname = getManifestPrefname(manifest); 1.97 + let listener = { 1.98 + onEnabled: function(addon) { 1.99 + is(expectEvent, "onEnabled", "provider onEnabled"); 1.100 + ok(!addon.userDisabled, "provider enabled"); 1.101 + executeSoon(function() { 1.102 + expectEvent = "onDisabling"; 1.103 + addon.userDisabled = true; 1.104 + }); 1.105 + }, 1.106 + onEnabling: function(addon) { 1.107 + is(expectEvent, "onEnabling", "provider onEnabling"); 1.108 + expectEvent = "onEnabled"; 1.109 + }, 1.110 + onDisabled: function(addon) { 1.111 + is(expectEvent, "onDisabled", "provider onDisabled"); 1.112 + ok(addon.userDisabled, "provider disabled"); 1.113 + AddonManager.removeAddonListener(listener); 1.114 + // clear the provider user-level pref 1.115 + Services.prefs.clearUserPref(prefname); 1.116 + executeSoon(next); 1.117 + }, 1.118 + onDisabling: function(addon) { 1.119 + is(expectEvent, "onDisabling", "provider onDisabling"); 1.120 + expectEvent = "onDisabled"; 1.121 + } 1.122 + }; 1.123 + AddonManager.addAddonListener(listener); 1.124 + 1.125 + // we're only testing enable disable, so we quickly set the user-level pref 1.126 + // for this provider and test enable/disable toggling 1.127 + setManifestPref(prefname, manifest); 1.128 + ok(Services.prefs.prefHasUserValue(prefname), "manifest is in user-prefs"); 1.129 + AddonManager.getAddonsByTypes([ADDON_TYPE_SERVICE], function(addons) { 1.130 + for (let addon of addons) { 1.131 + if (addon.userDisabled) { 1.132 + expectEvent = "onEnabling"; 1.133 + addon.userDisabled = false; 1.134 + // only test with one addon 1.135 + return; 1.136 + } 1.137 + } 1.138 + ok(false, "no addons toggled"); 1.139 + next(); 1.140 + }); 1.141 + }, 1.142 + testProviderEnableToggle: function(next) { 1.143 + // enable and disabel a provider from the SocialService interface, check 1.144 + // that the addon manager is updated 1.145 + 1.146 + let expectEvent; 1.147 + let prefname = getManifestPrefname(manifest); 1.148 + 1.149 + let listener = { 1.150 + onEnabled: function(addon) { 1.151 + is(expectEvent, "onEnabled", "provider onEnabled"); 1.152 + is(addon.manifest.origin, manifest.origin, "provider enabled"); 1.153 + ok(!addon.userDisabled, "provider !userDisabled"); 1.154 + }, 1.155 + onEnabling: function(addon) { 1.156 + is(expectEvent, "onEnabling", "provider onEnabling"); 1.157 + is(addon.manifest.origin, manifest.origin, "provider about to be enabled"); 1.158 + expectEvent = "onEnabled"; 1.159 + }, 1.160 + onDisabled: function(addon) { 1.161 + is(expectEvent, "onDisabled", "provider onDisabled"); 1.162 + is(addon.manifest.origin, manifest.origin, "provider disabled"); 1.163 + ok(addon.userDisabled, "provider userDisabled"); 1.164 + }, 1.165 + onDisabling: function(addon) { 1.166 + is(expectEvent, "onDisabling", "provider onDisabling"); 1.167 + is(addon.manifest.origin, manifest.origin, "provider about to be disabled"); 1.168 + expectEvent = "onDisabled"; 1.169 + } 1.170 + }; 1.171 + AddonManager.addAddonListener(listener); 1.172 + 1.173 + expectEvent = "onEnabling"; 1.174 + setManifestPref(prefname, manifest); 1.175 + SocialService.addBuiltinProvider(manifest.origin, function(provider) { 1.176 + expectEvent = "onDisabling"; 1.177 + SocialService.removeProvider(provider.origin, function() { 1.178 + AddonManager.removeAddonListener(listener); 1.179 + Services.prefs.clearUserPref(prefname); 1.180 + next(); 1.181 + }); 1.182 + }); 1.183 + }, 1.184 + testForeignInstall: function(next) { 1.185 + AddonManager.addAddonListener(installListener(next, manifest2)); 1.186 + 1.187 + // we expect the addon install dialog to appear, we need to accept the 1.188 + // install from the dialog. 1.189 + info("Waiting for install dialog"); 1.190 + let panel = document.getElementById("servicesInstall-notification"); 1.191 + PopupNotifications.panel.addEventListener("popupshown", function onpopupshown() { 1.192 + PopupNotifications.panel.removeEventListener("popupshown", onpopupshown); 1.193 + info("servicesInstall-notification panel opened"); 1.194 + panel.button.click(); 1.195 + }) 1.196 + 1.197 + let activationURL = manifest2.origin + "/browser/browser/base/content/test/social/social_activate.html" 1.198 + addTab(activationURL, function(tab) { 1.199 + let doc = tab.linkedBrowser.contentDocument; 1.200 + let installFrom = doc.nodePrincipal.origin; 1.201 + Services.prefs.setCharPref("social.whitelist", ""); 1.202 + is(SocialService.getOriginActivationType(installFrom), "foreign", "testing foriegn install"); 1.203 + Social.installProvider(doc, manifest2, function(addonManifest) { 1.204 + Services.prefs.clearUserPref("social.whitelist"); 1.205 + SocialService.addBuiltinProvider(addonManifest.origin, function(provider) { 1.206 + Social.uninstallProvider(addonManifest.origin); 1.207 + gBrowser.removeTab(tab); 1.208 + }); 1.209 + }); 1.210 + }); 1.211 + }, 1.212 + testBuiltinInstallWithoutManifest: function(next) { 1.213 + // send installProvider null for the manifest 1.214 + AddonManager.addAddonListener(installListener(next, manifest)); 1.215 + let panel = document.getElementById("servicesInstall-notification"); 1.216 + PopupNotifications.panel.addEventListener("popupshown", function onpopupshown() { 1.217 + PopupNotifications.panel.removeEventListener("popupshown", onpopupshown); 1.218 + info("servicesInstall-notification panel opened"); 1.219 + panel.button.click(); 1.220 + }); 1.221 + 1.222 + let prefname = getManifestPrefname(manifest); 1.223 + let activationURL = manifest.origin + "/browser/browser/base/content/test/social/social_activate.html" 1.224 + addTab(activationURL, function(tab) { 1.225 + let doc = tab.linkedBrowser.contentDocument; 1.226 + let installFrom = doc.nodePrincipal.origin; 1.227 + is(SocialService.getOriginActivationType(installFrom), "builtin", "testing builtin install"); 1.228 + ok(!Services.prefs.prefHasUserValue(prefname), "manifest is not in user-prefs"); 1.229 + Social.installProvider(doc, null, function(addonManifest) { 1.230 + ok(Services.prefs.prefHasUserValue(prefname), "manifest is in user-prefs"); 1.231 + SocialService.addBuiltinProvider(addonManifest.origin, function(provider) { 1.232 + Social.uninstallProvider(addonManifest.origin); 1.233 + gBrowser.removeTab(tab); 1.234 + }); 1.235 + }); 1.236 + }); 1.237 + }, 1.238 + testBuiltinInstall: function(next) { 1.239 + // send installProvider a json object for the manifest 1.240 + AddonManager.addAddonListener(installListener(next, manifest)); 1.241 + let panel = document.getElementById("servicesInstall-notification"); 1.242 + PopupNotifications.panel.addEventListener("popupshown", function onpopupshown() { 1.243 + PopupNotifications.panel.removeEventListener("popupshown", onpopupshown); 1.244 + info("servicesInstall-notification panel opened"); 1.245 + panel.button.click(); 1.246 + }); 1.247 + 1.248 + let prefname = getManifestPrefname(manifest); 1.249 + let activationURL = manifest.origin + "/browser/browser/base/content/test/social/social_activate.html" 1.250 + addTab(activationURL, function(tab) { 1.251 + let doc = tab.linkedBrowser.contentDocument; 1.252 + let installFrom = doc.nodePrincipal.origin; 1.253 + is(SocialService.getOriginActivationType(installFrom), "builtin", "testing builtin install"); 1.254 + ok(!Services.prefs.prefHasUserValue(prefname), "manifest is not in user-prefs"); 1.255 + Social.installProvider(doc, manifest, function(addonManifest) { 1.256 + ok(Services.prefs.prefHasUserValue(prefname), "manifest is in user-prefs"); 1.257 + SocialService.addBuiltinProvider(addonManifest.origin, function(provider) { 1.258 + Social.uninstallProvider(addonManifest.origin); 1.259 + gBrowser.removeTab(tab); 1.260 + }); 1.261 + }); 1.262 + }); 1.263 + }, 1.264 + testWhitelistInstall: function(next) { 1.265 + AddonManager.addAddonListener(installListener(next, manifest2)); 1.266 + let panel = document.getElementById("servicesInstall-notification"); 1.267 + PopupNotifications.panel.addEventListener("popupshown", function onpopupshown() { 1.268 + PopupNotifications.panel.removeEventListener("popupshown", onpopupshown); 1.269 + info("servicesInstall-notification panel opened"); 1.270 + panel.button.click(); 1.271 + }); 1.272 + 1.273 + let activationURL = manifest2.origin + "/browser/browser/base/content/test/social/social_activate.html" 1.274 + addTab(activationURL, function(tab) { 1.275 + let doc = tab.linkedBrowser.contentDocument; 1.276 + let installFrom = doc.nodePrincipal.origin; 1.277 + Services.prefs.setCharPref("social.whitelist", installFrom); 1.278 + is(SocialService.getOriginActivationType(installFrom), "whitelist", "testing whitelist install"); 1.279 + Social.installProvider(doc, manifest2, function(addonManifest) { 1.280 + Services.prefs.clearUserPref("social.whitelist"); 1.281 + SocialService.addBuiltinProvider(addonManifest.origin, function(provider) { 1.282 + Social.uninstallProvider(addonManifest.origin); 1.283 + gBrowser.removeTab(tab); 1.284 + }); 1.285 + }); 1.286 + }); 1.287 + }, 1.288 + testDirectoryInstall: function(next) { 1.289 + AddonManager.addAddonListener(installListener(next, manifest2)); 1.290 + let panel = document.getElementById("servicesInstall-notification"); 1.291 + PopupNotifications.panel.addEventListener("popupshown", function onpopupshown() { 1.292 + PopupNotifications.panel.removeEventListener("popupshown", onpopupshown); 1.293 + info("servicesInstall-notification panel opened"); 1.294 + panel.button.click(); 1.295 + }); 1.296 + 1.297 + let activationURL = manifest2.origin + "/browser/browser/base/content/test/social/social_activate.html" 1.298 + addTab(activationURL, function(tab) { 1.299 + let doc = tab.linkedBrowser.contentDocument; 1.300 + let installFrom = doc.nodePrincipal.origin; 1.301 + Services.prefs.setCharPref("social.directories", installFrom); 1.302 + is(SocialService.getOriginActivationType(installFrom), "directory", "testing directory install"); 1.303 + Social.installProvider(doc, manifest2, function(addonManifest) { 1.304 + Services.prefs.clearUserPref("social.directories"); 1.305 + SocialService.addBuiltinProvider(addonManifest.origin, function(provider) { 1.306 + Social.uninstallProvider(addonManifest.origin); 1.307 + gBrowser.removeTab(tab); 1.308 + }); 1.309 + }); 1.310 + }); 1.311 + }, 1.312 + testUpgradeProviderFromWorker: function(next) { 1.313 + // add the provider, change the pref, add it again. The provider at that 1.314 + // point should be upgraded 1.315 + let activationURL = manifest2.origin + "/browser/browser/base/content/test/social/social_activate.html" 1.316 + let panel = document.getElementById("servicesInstall-notification"); 1.317 + PopupNotifications.panel.addEventListener("popupshown", function onpopupshown() { 1.318 + PopupNotifications.panel.removeEventListener("popupshown", onpopupshown); 1.319 + info("servicesInstall-notification panel opened"); 1.320 + panel.button.click(); 1.321 + }); 1.322 + 1.323 + addTab(activationURL, function(tab) { 1.324 + let doc = tab.linkedBrowser.contentDocument; 1.325 + let installFrom = doc.nodePrincipal.origin; 1.326 + Services.prefs.setCharPref("social.whitelist", installFrom); 1.327 + Social.installProvider(doc, manifest2, function(addonManifest) { 1.328 + SocialService.addBuiltinProvider(addonManifest.origin, function(provider) { 1.329 + is(provider.manifest.version, 1, "manifest version is 1"); 1.330 + 1.331 + // watch for the provider-update and test the new version 1.332 + SocialService.registerProviderListener(function providerListener(topic, origin, providers) { 1.333 + if (topic != "provider-update") 1.334 + return; 1.335 + is(origin, addonManifest.origin, "provider updated") 1.336 + SocialService.unregisterProviderListener(providerListener); 1.337 + Services.prefs.clearUserPref("social.whitelist"); 1.338 + let provider = Social._getProviderFromOrigin(origin); 1.339 + is(provider.manifest.version, 2, "manifest version is 2"); 1.340 + Social.uninstallProvider(origin, function() { 1.341 + gBrowser.removeTab(tab); 1.342 + next(); 1.343 + }); 1.344 + }); 1.345 + 1.346 + let port = provider.getWorkerPort(); 1.347 + port.postMessage({topic: "worker.update", data: true}); 1.348 + 1.349 + }); 1.350 + }); 1.351 + }); 1.352 + } 1.353 +}