summaryrefslogtreecommitdiffstats
path: root/browser/base/content/test/social/browser_aboutHome_activation.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/base/content/test/social/browser_aboutHome_activation.js')
-rw-r--r--browser/base/content/test/social/browser_aboutHome_activation.js229
1 files changed, 229 insertions, 0 deletions
diff --git a/browser/base/content/test/social/browser_aboutHome_activation.js b/browser/base/content/test/social/browser_aboutHome_activation.js
new file mode 100644
index 000000000..37cca53d2
--- /dev/null
+++ b/browser/base/content/test/social/browser_aboutHome_activation.js
@@ -0,0 +1,229 @@
+/* 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 =
+' <script>' +
+' var manifest = {' +
+' "name": "Demo Social Service",' +
+' "origin": "https://example.com",' +
+' "iconURL": "chrome://branding/content/icon16.png",' +
+' "icon32URL": "chrome://branding/content/icon32.png",' +
+' "icon64URL": "chrome://branding/content/icon64.png",' +
+' "shareURL": "https://example.com/browser/browser/base/content/test/social/social_share.html",' +
+' "postActivationURL": "https://example.com/browser/browser/base/content/test/social/social_postActivation.html",' +
+' };' +
+' function activateProvider(node) {' +
+' node.setAttribute("data-service", JSON.stringify(manifest));' +
+' var event = new CustomEvent("ActivateSocialFeature");' +
+' node.dispatchEvent(event);' +
+' }' +
+' </script>' +
+' <div id="activationSnippet" onclick="activateProvider(this)">' +
+' <img src="chrome://branding/content/icon32.png"></img>' +
+' </div>';
+
+// enable one-click activation
+var snippet2 =
+' <script>' +
+' var manifest = {' +
+' "name": "Demo Social Service",' +
+' "origin": "https://example.com",' +
+' "iconURL": "chrome://branding/content/icon16.png",' +
+' "icon32URL": "chrome://branding/content/icon32.png",' +
+' "icon64URL": "chrome://branding/content/icon64.png",' +
+' "shareURL": "https://example.com/browser/browser/base/content/test/social/social_share.html",' +
+' "postActivationURL": "https://example.com/browser/browser/base/content/test/social/social_postActivation.html",' +
+' "oneclick": true' +
+' };' +
+' function activateProvider(node) {' +
+' node.setAttribute("data-service", JSON.stringify(manifest));' +
+' var event = new CustomEvent("ActivateSocialFeature");' +
+' node.dispatchEvent(event);' +
+' }' +
+' </script>' +
+' <div id="activationSnippet" onclick="activateProvider(this)">' +
+' <img src="chrome://branding/content/icon32.png"></img>' +
+' </div>';
+
+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"),
+ ]);
+}