summaryrefslogtreecommitdiffstats
path: root/browser/components/uitour/test/browser_no_tabs.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/uitour/test/browser_no_tabs.js')
-rw-r--r--browser/components/uitour/test/browser_no_tabs.js102
1 files changed, 102 insertions, 0 deletions
diff --git a/browser/components/uitour/test/browser_no_tabs.js b/browser/components/uitour/test/browser_no_tabs.js
new file mode 100644
index 000000000..62048b156
--- /dev/null
+++ b/browser/components/uitour/test/browser_no_tabs.js
@@ -0,0 +1,102 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+var HiddenFrame = Cu.import("resource:///modules/HiddenFrame.jsm", {}).HiddenFrame;
+
+const HTML_NS = "http://www.w3.org/1999/xhtml";
+const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
+
+/**
+ * Create a frame in the |hiddenDOMWindow| to host a |browser|, then load the URL in the
+ * latter.
+ *
+ * @param aURL
+ * The URL to open in the browser.
+ **/
+function createHiddenBrowser(aURL) {
+ let frame = new HiddenFrame();
+ return new Promise(resolve =>
+ frame.get().then(aFrame => {
+ let doc = aFrame.document;
+ let browser = doc.createElementNS(XUL_NS, "browser");
+ browser.setAttribute("type", "content");
+ browser.setAttribute("disableglobalhistory", "true");
+ browser.setAttribute("src", aURL);
+
+ doc.documentElement.appendChild(browser);
+ resolve({frame: frame, browser: browser});
+ }));
+}
+
+/**
+ * Remove the browser and the HiddenFrame.
+ *
+ * @param aFrame
+ * The HiddenFrame to dismiss.
+ * @param aBrowser
+ * The browser to dismiss.
+ */
+function destroyHiddenBrowser(aFrame, aBrowser) {
+ // Dispose of the hidden browser.
+ aBrowser.remove();
+
+ // Take care of the frame holding our invisible browser.
+ aFrame.destroy();
+}
+
+/**
+ * Test that UITour works when called when no tabs are available (e.g., when using windowless
+ * browsers).
+ */
+add_task(function* test_windowless_UITour() {
+ // Get the URL for the test page.
+ let pageURL = getRootDirectory(gTestPath) + "uitour.html";
+
+ // Allow the URL to use the UITour.
+ info("Adding UITour permission to the test page.");
+ let pageURI = Services.io.newURI(pageURL, null, null);
+ Services.perms.add(pageURI, "uitour", Services.perms.ALLOW_ACTION);
+
+ // UITour's ping will resolve this promise.
+ let deferredPing = Promise.defer();
+
+ // Create a windowless browser and test that UITour works in it.
+ let browserPromise = createHiddenBrowser(pageURL);
+ browserPromise.then(frameInfo => {
+ isnot(frameInfo.browser, null, "The browser must exist and not be null.");
+
+ // Load UITour frame script.
+ frameInfo.browser.messageManager.loadFrameScript(
+ "chrome://browser/content/content-UITour.js", false);
+
+ // When the page loads, try to use UITour API.
+ frameInfo.browser.addEventListener("load", function loadListener() {
+ info("The test page was correctly loaded.");
+
+ frameInfo.browser.removeEventListener("load", loadListener, true);
+
+ // Get a reference to the UITour API.
+ info("Testing access to the UITour API.");
+ let contentWindow = Cu.waiveXrays(frameInfo.browser.contentDocument.defaultView);
+ isnot(contentWindow, null, "The content window must exist and not be null.");
+
+ let uitourAPI = contentWindow.Mozilla.UITour;
+
+ // Test the UITour API with a ping.
+ uitourAPI.ping(function() {
+ info("Ping response received from the UITour API.");
+
+ // Make sure to clean up.
+ destroyHiddenBrowser(frameInfo.frame, frameInfo.browser);
+
+ // Resolve our promise.
+ deferredPing.resolve();
+ });
+ }, true);
+ });
+
+ // Wait for the UITour ping to complete.
+ yield deferredPing.promise;
+});