/* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ var SocialService = Cu.import("resource:///modules/SocialService.jsm", {}).SocialService; XPCOMUtils.defineLazyModuleGetter(this, "Task", "resource://gre/modules/Task.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "AboutHomeUtils", "resource:///modules/AboutHome.jsm"); var snippet = ' ' + '
' + ' ' + '
'; // enable one-click activation var snippet2 = ' ' + '
' + ' ' + '
'; var gTests = [ { desc: "Test activation with enable panel", snippet: snippet, panel: true }, { desc: "Test activation bypassing enable panel", snippet: snippet2, panel: false } ]; function test() { waitForExplicitFinish(); requestLongerTimeout(2); ignoreAllUncaughtExceptions(); PopupNotifications.panel.setAttribute("animate", "false"); registerCleanupFunction(function () { PopupNotifications.panel.removeAttribute("animate"); }); Task.spawn(function* () { for (let test of gTests) { info(test.desc); // Create a tab to run the test. let tab = gBrowser.selectedTab = gBrowser.addTab("about:blank"); // Add an event handler to modify the snippets map once it's ready. let snippetsPromise = promiseSetupSnippetsMap(tab, test.snippet); // Start loading about:home and wait for it to complete, snippets should be loaded yield promiseTabLoadEvent(tab, "about:home", "AboutHomeLoadSnippetsCompleted"); yield snippetsPromise; // ensure our activation snippet is indeed available yield ContentTask.spawn(tab.linkedBrowser, {}, function*(arg) { ok(!!content.document.getElementById("snippets"), "Found snippets element"); ok(!!content.document.getElementById("activationSnippet"), "The snippet is present."); }); yield new Promise(resolve => { activateProvider(tab, test.panel).then(() => { checkSocialUI(); SocialService.uninstallProvider("https://example.com", function () { info("provider uninstalled"); resolve(); }); }); }); // activation opened a post-activation info tab, close it. yield BrowserTestUtils.removeTab(gBrowser.selectedTab); yield BrowserTestUtils.removeTab(tab); } }).then(finish, ex => { ok(false, "Unexpected Exception: " + ex); finish(); }); } /** * Starts a load in an existing tab and waits for it to finish (via some event). * * @param aTab * The tab to load into. * @param aUrl * The url to load. * @param aEvent * The load event type to wait for. Defaults to "load". * @return {Promise} resolved when the event is handled. */ function promiseTabLoadEvent(aTab, aURL, aEventType="load") { return new Promise(resolve => { info("Wait tab event: " + aEventType); aTab.linkedBrowser.addEventListener(aEventType, function load(event) { if (event.originalTarget != aTab.linkedBrowser.contentDocument || event.target.location.href == "about:blank") { info("skipping spurious load event"); return; } aTab.linkedBrowser.removeEventListener(aEventType, load, true); info("Tab event received: " + aEventType); resolve(); }, true, true); aTab.linkedBrowser.loadURI(aURL); }); } /** * Cleans up snippets and ensures that by default we don't try to check for * remote snippets since that may cause network bustage or slowness. * * @param aTab * The tab containing about:home. * @param aSetupFn * The setup function to be run. * @return {Promise} resolved when the snippets are ready. Gets the snippets map. */ function promiseSetupSnippetsMap(aTab, aSnippet) { info("Waiting for snippets map"); return ContentTask.spawn(aTab.linkedBrowser, {snippetsVersion: AboutHomeUtils.snippetsVersion, snippet: aSnippet}, function*(arg) { return new Promise(resolve => { addEventListener("AboutHomeLoadSnippets", function load(event) { removeEventListener("AboutHomeLoadSnippets", load, true); let cw = content.window.wrappedJSObject; // The snippets should already be ready by this point. Here we're // just obtaining a reference to the snippets map. cw.ensureSnippetsMapThen(function (aSnippetsMap) { aSnippetsMap = Cu.waiveXrays(aSnippetsMap); console.log("Got snippets map: " + "{ last-update: " + aSnippetsMap.get("snippets-last-update") + ", cached-version: " + aSnippetsMap.get("snippets-cached-version") + " }"); // Don't try to update. aSnippetsMap.set("snippets-last-update", Date.now()); aSnippetsMap.set("snippets-cached-version", arg.snippetsVersion); // Clear snippets. aSnippetsMap.delete("snippets"); aSnippetsMap.set("snippets", arg.snippet); resolve(); }); }, true, true); }); }); } function sendActivationEvent(tab) { // hack Social.lastEventReceived so we don't hit the "too many events" check. Social.lastEventReceived = 0; let doc = tab.linkedBrowser.contentDocument; // if our test has a frame, use it if (doc.defaultView.frames[0]) doc = doc.defaultView.frames[0].document; let button = doc.getElementById("activationSnippet"); BrowserTestUtils.synthesizeMouseAtCenter(button, {}, tab.linkedBrowser); } function activateProvider(tab, expectPanel, aCallback) { return new Promise(resolve => { if (expectPanel) { BrowserTestUtils.waitForEvent(PopupNotifications.panel, "popupshown").then(() => { let panel = document.getElementById("servicesInstall-notification"); panel.button.click(); }); } waitForProviderLoad().then(() => { checkSocialUI(); resolve(); }); sendActivationEvent(tab); }); } function waitForProviderLoad(cb) { return Promise.all([ promiseObserverNotified("social:provider-enabled"), ensureFrameLoaded(gBrowser, "https://example.com/browser/browser/base/content/test/social/social_postActivation.html"), ]); }