michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: let SocialService = Cu.import("resource://gre/modules/SocialService.jsm", {}).SocialService; michael@0: michael@0: let tabsToRemove = []; michael@0: michael@0: function postTestCleanup(callback) { michael@0: // any tabs opened by the test. michael@0: for (let tab of tabsToRemove) michael@0: gBrowser.removeTab(tab); michael@0: tabsToRemove = []; michael@0: // theses tests use the notification panel but don't bother waiting for it michael@0: // to fully open - the end result is that the panel might stay open michael@0: //SocialUI.activationPanel.hidePopup(); michael@0: michael@0: Services.prefs.clearUserPref("social.whitelist"); michael@0: michael@0: // all providers may have had their manifests added. michael@0: for (let manifest of gProviders) michael@0: Services.prefs.clearUserPref("social.manifest." + manifest.origin); michael@0: michael@0: // all the providers may have been added. michael@0: let providers = gProviders.slice(0) michael@0: function removeProviders() { michael@0: if (providers.length < 1) { michael@0: executeSoon(function() { michael@0: is(Social.providers.length, 0, "all providers removed"); michael@0: callback(); michael@0: }); michael@0: return; michael@0: } michael@0: michael@0: let provider = providers.pop(); michael@0: try { michael@0: SocialService.removeProvider(provider.origin, removeProviders); michael@0: } catch(ex) { michael@0: removeProviders(); michael@0: } michael@0: } michael@0: removeProviders(); michael@0: } michael@0: michael@0: function addBuiltinManifest(manifest) { michael@0: let prefname = getManifestPrefname(manifest); michael@0: setBuiltinManifestPref(prefname, manifest); michael@0: return prefname; michael@0: } michael@0: michael@0: function addTab(url, callback) { michael@0: let tab = gBrowser.selectedTab = gBrowser.addTab(url, {skipAnimation: true}); michael@0: tab.linkedBrowser.addEventListener("load", function tabLoad(event) { michael@0: tab.linkedBrowser.removeEventListener("load", tabLoad, true); michael@0: tabsToRemove.push(tab); michael@0: executeSoon(function() {callback(tab)}); michael@0: }, true); michael@0: } michael@0: michael@0: function sendActivationEvent(tab, callback, nullManifest) { michael@0: // hack Social.lastEventReceived so we don't hit the "too many events" check. michael@0: Social.lastEventReceived = 0; michael@0: let doc = tab.linkedBrowser.contentDocument; michael@0: // if our test has a frame, use it michael@0: if (doc.defaultView.frames[0]) michael@0: doc = doc.defaultView.frames[0].document; michael@0: let button = doc.getElementById(nullManifest ? "activation-old" : "activation"); michael@0: EventUtils.synthesizeMouseAtCenter(button, {}, doc.defaultView); michael@0: executeSoon(callback); michael@0: } michael@0: michael@0: function activateProvider(domain, callback, nullManifest) { michael@0: let activationURL = domain+"/browser/browser/base/content/test/social/social_activate.html" michael@0: addTab(activationURL, function(tab) { michael@0: sendActivationEvent(tab, callback, nullManifest); michael@0: }); michael@0: } michael@0: michael@0: function activateIFrameProvider(domain, callback) { michael@0: let activationURL = domain+"/browser/browser/base/content/test/social/social_activate_iframe.html" michael@0: addTab(activationURL, function(tab) { michael@0: sendActivationEvent(tab, callback, false); michael@0: }); michael@0: } michael@0: michael@0: function waitForProviderLoad(cb) { michael@0: Services.obs.addObserver(function providerSet(subject, topic, data) { michael@0: Services.obs.removeObserver(providerSet, "social:provider-enabled"); michael@0: info("social:provider-enabled observer was notified"); michael@0: waitForCondition(function() { michael@0: let sbrowser = document.getElementById("social-sidebar-browser"); michael@0: let provider = SocialSidebar.provider; michael@0: let postActivation = provider && gBrowser.contentDocument.location.href == provider.origin + "/browser/browser/base/content/test/social/social_postActivation.html"; michael@0: michael@0: return provider && michael@0: provider.profile && michael@0: provider.profile.displayName && michael@0: postActivation && michael@0: sbrowser.docShellIsActive; michael@0: }, function() { michael@0: // executeSoon to let the browser UI observers run first michael@0: executeSoon(cb); michael@0: }, michael@0: "waitForProviderLoad: provider profile was not set"); michael@0: }, "social:provider-enabled", false); michael@0: } michael@0: michael@0: michael@0: function getAddonItemInList(aId, aList) { michael@0: var item = aList.firstChild; michael@0: while (item) { michael@0: if ("mAddon" in item && item.mAddon.id == aId) { michael@0: aList.ensureElementIsVisible(item); michael@0: return item; michael@0: } michael@0: item = item.nextSibling; michael@0: } michael@0: return null; michael@0: } michael@0: michael@0: function clickAddonRemoveButton(tab, aCallback) { michael@0: AddonManager.getAddonsByTypes(["service"], function(aAddons) { michael@0: let addon = aAddons[0]; michael@0: michael@0: let doc = tab.linkedBrowser.contentDocument; michael@0: let list = doc.getElementById("addon-list"); michael@0: michael@0: let item = getAddonItemInList(addon.id, list); michael@0: isnot(item, null, "Should have found the add-on in the list"); michael@0: michael@0: var button = doc.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); michael@0: isnot(button, null, "Should have a remove button"); michael@0: ok(!button.disabled, "Button should not be disabled"); michael@0: michael@0: EventUtils.synthesizeMouseAtCenter(button, { }, doc.defaultView); michael@0: michael@0: // Force XBL to apply michael@0: item.clientTop; michael@0: michael@0: is(item.getAttribute("pending"), "uninstall", "Add-on should be uninstalling"); michael@0: michael@0: executeSoon(function() { aCallback(addon); }); michael@0: }); michael@0: } michael@0: michael@0: function activateOneProvider(manifest, finishActivation, aCallback) { michael@0: let panel = document.getElementById("servicesInstall-notification"); michael@0: PopupNotifications.panel.addEventListener("popupshown", function onpopupshown() { michael@0: PopupNotifications.panel.removeEventListener("popupshown", onpopupshown); michael@0: info("servicesInstall-notification panel opened"); michael@0: if (finishActivation) michael@0: panel.button.click(); michael@0: else michael@0: panel.closebutton.click(); michael@0: }); michael@0: michael@0: activateProvider(manifest.origin, function() { michael@0: if (!finishActivation) { michael@0: ok(panel.hidden, "activation panel is not showing"); michael@0: executeSoon(aCallback); michael@0: } else { michael@0: waitForProviderLoad(function() { michael@0: is(SocialSidebar.provider.origin, manifest.origin, "new provider is active"); michael@0: ok(SocialSidebar.opened, "sidebar is open"); michael@0: checkSocialUI(); michael@0: executeSoon(aCallback); michael@0: }); michael@0: } michael@0: }); michael@0: } michael@0: michael@0: let gTestDomains = ["https://example.com", "https://test1.example.com", "https://test2.example.com"]; michael@0: let gProviders = [ michael@0: { michael@0: name: "provider 1", michael@0: origin: "https://example.com", michael@0: sidebarURL: "https://example.com/browser/browser/base/content/test/social/social_sidebar.html?provider1", michael@0: workerURL: "https://example.com/browser/browser/base/content/test/social/social_worker.js#no-profile,no-recommend", michael@0: iconURL: "chrome://branding/content/icon48.png" michael@0: }, michael@0: { michael@0: name: "provider 2", michael@0: origin: "https://test1.example.com", michael@0: sidebarURL: "https://test1.example.com/browser/browser/base/content/test/social/social_sidebar.html?provider2", michael@0: workerURL: "https://test1.example.com/browser/browser/base/content/test/social/social_worker.js#no-profile,no-recommend", michael@0: iconURL: "chrome://branding/content/icon64.png" michael@0: }, michael@0: { michael@0: name: "provider 3", michael@0: origin: "https://test2.example.com", michael@0: sidebarURL: "https://test2.example.com/browser/browser/base/content/test/social/social_sidebar.html?provider2", michael@0: workerURL: "https://test2.example.com/browser/browser/base/content/test/social/social_worker.js#no-profile,no-recommend", michael@0: iconURL: "chrome://branding/content/about-logo.png" michael@0: } michael@0: ]; michael@0: michael@0: michael@0: function test() { michael@0: waitForExplicitFinish(); michael@0: runSocialTests(tests, undefined, postTestCleanup); michael@0: } michael@0: michael@0: var tests = { michael@0: testActivationWrongOrigin: function(next) { michael@0: // At this stage none of our providers exist, so we expect failure. michael@0: Services.prefs.setBoolPref("social.remote-install.enabled", false); michael@0: activateProvider(gTestDomains[0], function() { michael@0: is(SocialUI.enabled, false, "SocialUI is not enabled"); michael@0: let panel = document.getElementById("servicesInstall-notification"); michael@0: ok(panel.hidden, "activation panel still hidden"); michael@0: checkSocialUI(); michael@0: Services.prefs.clearUserPref("social.remote-install.enabled"); michael@0: next(); michael@0: }); michael@0: }, michael@0: michael@0: testIFrameActivation: function(next) { michael@0: Services.prefs.setCharPref("social.whitelist", gTestDomains.join(",")); michael@0: activateIFrameProvider(gTestDomains[0], function() { michael@0: is(SocialUI.enabled, false, "SocialUI is not enabled"); michael@0: ok(!SocialSidebar.provider, "provider is not installed"); michael@0: let panel = document.getElementById("servicesInstall-notification"); michael@0: ok(panel.hidden, "activation panel still hidden"); michael@0: checkSocialUI(); michael@0: Services.prefs.clearUserPref("social.whitelist"); michael@0: next(); michael@0: }); michael@0: }, michael@0: michael@0: testActivationFirstProvider: function(next) { michael@0: Services.prefs.setCharPref("social.whitelist", gTestDomains.join(",")); michael@0: // first up we add a manifest entry for a single provider. michael@0: activateOneProvider(gProviders[0], false, function() { michael@0: // we deactivated leaving no providers left, so Social is disabled. michael@0: ok(!SocialSidebar.provider, "should be no provider left after disabling"); michael@0: checkSocialUI(); michael@0: Services.prefs.clearUserPref("social.whitelist"); michael@0: next(); michael@0: }); michael@0: }, michael@0: michael@0: testActivationBuiltin: function(next) { michael@0: let prefname = addBuiltinManifest(gProviders[0]); michael@0: is(SocialService.getOriginActivationType(gTestDomains[0]), "builtin", "manifest is builtin"); michael@0: // first up we add a manifest entry for a single provider. michael@0: activateOneProvider(gProviders[0], false, function() { michael@0: // we deactivated leaving no providers left, so Social is disabled. michael@0: ok(!SocialSidebar.provider, "should be no provider left after disabling"); michael@0: checkSocialUI(); michael@0: resetBuiltinManifestPref(prefname); michael@0: next(); michael@0: }); michael@0: }, michael@0: michael@0: testActivationMultipleProvider: function(next) { michael@0: // The trick with this test is to make sure that Social.providers[1] is michael@0: // the current provider when doing the undo - this makes sure that the michael@0: // Social code doesn't fallback to Social.providers[0], which it will michael@0: // do in some cases (but those cases do not include what this test does) michael@0: // first enable the 2 providers michael@0: Services.prefs.setCharPref("social.whitelist", gTestDomains.join(",")); michael@0: SocialService.addProvider(gProviders[0], function() { michael@0: SocialService.addProvider(gProviders[1], function() { michael@0: checkSocialUI(); michael@0: // activate the last provider. michael@0: let prefname = addBuiltinManifest(gProviders[2]); michael@0: activateOneProvider(gProviders[2], false, function() { michael@0: // we deactivated - the first provider should be enabled. michael@0: is(SocialSidebar.provider.origin, Social.providers[1].origin, "original provider should have been reactivated"); michael@0: checkSocialUI(); michael@0: Services.prefs.clearUserPref("social.whitelist"); michael@0: resetBuiltinManifestPref(prefname); michael@0: next(); michael@0: }); michael@0: }); michael@0: }); michael@0: }, michael@0: michael@0: testAddonManagerDoubleInstall: function(next) { michael@0: Services.prefs.setCharPref("social.whitelist", gTestDomains.join(",")); michael@0: // Create a new tab and load about:addons michael@0: let blanktab = gBrowser.addTab(); michael@0: gBrowser.selectedTab = blanktab; michael@0: BrowserOpenAddonsMgr('addons://list/service'); michael@0: michael@0: is(blanktab, gBrowser.selectedTab, "Current tab should be blank tab"); michael@0: michael@0: gBrowser.selectedBrowser.addEventListener("load", function tabLoad() { michael@0: gBrowser.selectedBrowser.removeEventListener("load", tabLoad, true); michael@0: let browser = blanktab.linkedBrowser; michael@0: is(browser.currentURI.spec, "about:addons", "about:addons should load into blank tab."); michael@0: michael@0: let prefname = addBuiltinManifest(gProviders[0]); michael@0: activateOneProvider(gProviders[0], true, function() { michael@0: info("first activation completed"); michael@0: is(gBrowser.contentDocument.location.href, gProviders[0].origin + "/browser/browser/base/content/test/social/social_postActivation.html"); michael@0: gBrowser.removeTab(gBrowser.selectedTab); michael@0: is(gBrowser.contentDocument.location.href, gProviders[0].origin + "/browser/browser/base/content/test/social/social_activate.html"); michael@0: gBrowser.removeTab(gBrowser.selectedTab); michael@0: tabsToRemove.pop(); michael@0: // uninstall the provider michael@0: clickAddonRemoveButton(blanktab, function(addon) { michael@0: checkSocialUI(); michael@0: activateOneProvider(gProviders[0], true, function() { michael@0: info("second activation completed"); michael@0: is(gBrowser.contentDocument.location.href, gProviders[0].origin + "/browser/browser/base/content/test/social/social_postActivation.html"); michael@0: gBrowser.removeTab(gBrowser.selectedTab); michael@0: michael@0: // after closing the addons tab, verify provider is still installed michael@0: gBrowser.tabContainer.addEventListener("TabClose", function onTabClose() { michael@0: gBrowser.tabContainer.removeEventListener("TabClose", onTabClose); michael@0: AddonManager.getAddonsByTypes(["service"], function(aAddons) { michael@0: is(aAddons.length, 1, "there can be only one"); michael@0: Services.prefs.clearUserPref("social.whitelist"); michael@0: resetBuiltinManifestPref(prefname); michael@0: next(); michael@0: }); michael@0: }); michael@0: michael@0: // verify only one provider in list michael@0: AddonManager.getAddonsByTypes(["service"], function(aAddons) { michael@0: is(aAddons.length, 1, "there can be only one"); michael@0: michael@0: let doc = blanktab.linkedBrowser.contentDocument; michael@0: let list = doc.getElementById("addon-list"); michael@0: is(list.childNodes.length, 1, "only one addon is displayed"); michael@0: michael@0: gBrowser.removeTab(blanktab); michael@0: }); michael@0: michael@0: }); michael@0: }); michael@0: }); michael@0: }, true); michael@0: } michael@0: }