summaryrefslogtreecommitdiffstats
path: root/addon-sdk/source/test/test-panel.js
diff options
context:
space:
mode:
Diffstat (limited to 'addon-sdk/source/test/test-panel.js')
-rw-r--r--addon-sdk/source/test/test-panel.js1426
1 files changed, 0 insertions, 1426 deletions
diff --git a/addon-sdk/source/test/test-panel.js b/addon-sdk/source/test/test-panel.js
deleted file mode 100644
index 13776e9db..000000000
--- a/addon-sdk/source/test/test-panel.js
+++ /dev/null
@@ -1,1426 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-'use strict';
-
-module.metadata = {
- 'engines': {
- 'Firefox': '*'
- }
-};
-
-const { Cc, Ci } = require("chrome");
-const { Loader } = require('sdk/test/loader');
-const { LoaderWithHookedConsole } = require("sdk/test/loader");
-const { setTimeout } = require("sdk/timers");
-const self = require('sdk/self');
-const { open, close, focus, ready } = require('sdk/window/helpers');
-const { isPrivate } = require('sdk/private-browsing');
-const { isWindowPBSupported } = require('sdk/private-browsing/utils');
-const { defer, all } = require('sdk/core/promise');
-const { getMostRecentBrowserWindow } = require('sdk/window/utils');
-const { URL } = require('sdk/url');
-const { wait } = require('./event/helpers');
-const packaging = require('@loader/options');
-const { cleanUI, after, isTravisCI } = require("sdk/test/utils");
-const { platform } = require('sdk/system');
-
-const fixtures = require('./fixtures')
-
-const SVG_URL = fixtures.url('mofo_logo.SVG');
-
-const Isolate = fn => '(' + fn + ')()';
-
-function ignorePassingDOMNodeWarning(type, message) {
- if (type !== 'warn' || !message.startsWith('Passing a DOM node'))
- console[type](message);
-}
-
-function makeEmptyPrivateBrowserWindow(options) {
- options = options || {};
- return open('chrome://browser/content/browser.xul', {
- features: {
- chrome: true,
- toolbar: true,
- private: true
- }
- });
-}
-
-exports["test Panel"] = function(assert, done) {
- const { Panel } = require('sdk/panel');
-
- let panel = Panel({
- contentURL: "about:buildconfig",
- contentScript: "self.postMessage(1); self.on('message', () => self.postMessage(2));",
- onMessage: function (message) {
- assert.equal(this, panel, "The 'this' object is the panel.");
- switch(message) {
- case 1:
- assert.pass("The panel was loaded.");
- panel.postMessage('');
- break;
- case 2:
- assert.pass("The panel posted a message and received a response.");
- panel.destroy();
- done();
- break;
- }
- }
- });
-};
-
-exports["test Panel Emit"] = function(assert, done) {
- const { Panel } = require('sdk/panel');
-
- let panel = Panel({
- contentURL: "about:buildconfig",
- contentScript: "self.port.emit('loaded');" +
- "self.port.on('addon-to-content', " +
- " () => self.port.emit('received'));",
- });
- panel.port.on("loaded", function () {
- assert.pass("The panel was loaded and sent a first event.");
- panel.port.emit("addon-to-content");
- });
- panel.port.on("received", function () {
- assert.pass("The panel posted a message and received a response.");
- panel.destroy();
- done();
- });
-};
-
-exports["test Panel Emit Early"] = function(assert, done) {
- const { Panel } = require('sdk/panel');
-
- let panel = Panel({
- contentURL: "about:buildconfig",
- contentScript: "self.port.on('addon-to-content', " +
- " () => self.port.emit('received'));",
- });
- panel.port.on("received", function () {
- assert.pass("The panel posted a message early and received a response.");
- panel.destroy();
- done();
- });
- panel.port.emit("addon-to-content");
-};
-
-exports["test Show Hide Panel"] = function(assert, done) {
- const { Panel } = require('sdk/panel');
-
- let panel = Panel({
- contentScript: "self.postMessage('')",
- contentScriptWhen: "end",
- contentURL: "data:text/html;charset=utf-8,",
- onMessage: function (message) {
- panel.show();
- },
- onShow: function () {
- assert.pass("The panel was shown.");
- assert.equal(this, panel, "The 'this' object is the panel.");
- assert.equal(this.isShowing, true, "panel.isShowing == true.");
- panel.hide();
- },
- onHide: function () {
- assert.pass("The panel was hidden.");
- assert.equal(this, panel, "The 'this' object is the panel.");
- assert.equal(this.isShowing, false, "panel.isShowing == false.");
- panel.destroy();
- done();
- }
- });
-};
-
-exports["test Document Reload"] = function(assert, done) {
- const { Panel } = require('sdk/panel');
-
- let url2 = "data:text/html;charset=utf-8,page2";
- let content =
- "<script>" +
- "window.addEventListener('message', function({ data }) {"+
- " if (data == 'move') window.location = '" + url2 + "';" +
- '}, false);' +
- "</script>";
- let messageCount = 0;
- let panel = Panel({
- // using URL here is intentional, see bug 859009
- contentURL: URL("data:text/html;charset=utf-8," + encodeURIComponent(content)),
- contentScript: "self.postMessage(window.location.href);" +
- // initiate change to url2
- "self.port.once('move', () => document.defaultView.postMessage('move', '*'));",
- onMessage: function (message) {
- messageCount++;
- assert.notEqual(message, "about:blank", "about:blank is not a message " + messageCount);
-
- if (messageCount == 1) {
- assert.ok(/data:text\/html/.test(message), "First document had a content script; " + message);
- panel.port.emit('move');
- assert.pass('move message was sent');
- return;
- }
- else if (messageCount == 2) {
- assert.equal(message, url2, "Second document too; " + message);
- panel.destroy();
- done();
- }
- }
- });
- assert.pass('Panel was created');
-};
-
-// Test disabled because of bug 910230
-/*
-exports["test Parent Resize Hack"] = function(assert, done) {
- const { Panel } = require('sdk/panel');
-
- let browserWindow = getMostRecentBrowserWindow();
-
- let previousWidth = browserWindow.outerWidth;
- let previousHeight = browserWindow.outerHeight;
-
- let content = "<script>" +
- "function contentResize() {" +
- " resizeTo(200,200);" +
- " resizeBy(200,200);" +
- " window.postMessage('resize-attempt', '*');" +
- "}" +
- "</script>" +
- "Try to resize browser window";
-
- let panel = Panel({
- contentURL: "data:text/html;charset=utf-8," + encodeURIComponent(content),
- contentScriptWhen: "ready",
- contentScript: Isolate(() => {
- self.on('message', message => {
- if (message === 'resize') unsafeWindow.contentResize();
- });
-
- window.addEventListener('message', ({ data }) => self.postMessage(data));
- }),
- onMessage: function (message) {
- if (message !== "resize-attempt") return;
-
- assert.equal(browserWindow, getMostRecentBrowserWindow(),
- "The browser window is still the same");
- assert.equal(previousWidth, browserWindow.outerWidth,
- "Size doesn't change by calling resizeTo/By/...");
- assert.equal(previousHeight, browserWindow.outerHeight,
- "Size doesn't change by calling resizeTo/By/...");
-
- try {
- panel.destroy();
- }
- catch (e) {
- assert.fail(e);
- throw e;
- }
-
- done();
- },
- onShow: () => panel.postMessage('resize')
- });
-
- panel.show();
-}
-*/
-
-exports["test Resize Panel"] = function(assert, done) {
- const { Panel } = require('sdk/panel');
-
- // These tests fail on Linux if the browser window in which the panel
- // is displayed is not active. And depending on what other tests have run
- // before this one, it might not be (the untitled window in which the test
- // runner executes is often active). So we make sure the browser window
- // is focused by focusing it before running the tests. Then, to be the best
- // possible test citizen, we refocus whatever window was focused before we
- // started running these tests.
-
- let activeWindow = Cc["@mozilla.org/embedcomp/window-watcher;1"].
- getService(Ci.nsIWindowWatcher).
- activeWindow;
- let browserWindow = Cc["@mozilla.org/appshell/window-mediator;1"].
- getService(Ci.nsIWindowMediator).
- getMostRecentWindow("navigator:browser");
-
-
- function onFocus() {
- browserWindow.removeEventListener("focus", onFocus, true);
-
- let panel = Panel({
- contentScript: "self.postMessage('')",
- contentScriptWhen: "end",
- contentURL: "data:text/html;charset=utf-8,",
- height: 10,
- width: 10,
- onMessage: function (message) {
- // Make sure that attempting to resize a panel while it isn't
- // visible doesn't cause an error.
- panel.resize(1, 1);
-
- panel.show();
- },
- onShow: function () {
- panel.resize(100,100);
- panel.hide();
- },
- onHide: function () {
- assert.ok((panel.width == 100) && (panel.height == 100),
- "The panel was resized.");
- if (activeWindow)
- activeWindow.focus();
- done();
- }
- });
- }
-
- if (browserWindow === activeWindow) {
- onFocus();
- }
- else {
- browserWindow.addEventListener("focus", onFocus, true);
- browserWindow.focus();
- }
-};
-
-exports["test Hide Before Show"] = function(assert, done) {
- const { Panel } = require('sdk/panel');
-
- let showCalled = false;
- let hideCalled = false;
- let panel1 = Panel({
- onShow: function () {
- showCalled = true;
- },
- onHide: function () {
- hideCalled = true;
- }
- });
- panel1.show();
- panel1.hide();
-
- let panel2 = Panel({
- onShow: function () {
- if (showCalled) {
- assert.ok(hideCalled, 'should not emit show without also emitting hide');
- } else {
- assert.ok(!hideCalled, 'should not emit hide without also emitting show');
- }
- panel1.destroy();
- panel2.destroy();
- done();
- },
- });
- panel2.show();
-};
-
-exports["test Several Show Hides"] = function(assert, done) {
- const { Panel } = require('sdk/panel');
-
- let hideCalled = 0;
- let panel = Panel({
- contentURL: "about:buildconfig",
- onShow: function () {
- panel.hide();
- },
- onHide: function () {
- hideCalled++;
- if (hideCalled < 3)
- panel.show();
- else {
- assert.pass("onHide called three times as expected");
- done();
- }
- }
- });
- panel.on('error', function(e) {
- assert.fail('error was emitted:' + e.message + '\n' + e.stack);
- });
- panel.show();
-};
-
-exports["test Anchor And Arrow"] = function*(assert, done) {
- let { loader } = LoaderWithHookedConsole(module, ignorePassingDOMNodeWarning);
- let { Panel } = loader.require('sdk/panel');
-
- let count = 0;
- let url = 'data:text/html;charset=utf-8,' +
- '<html><head><title>foo</title></head><body>' +
- '</body></html>';
-
- let panel = yield new Promise(resolve => {
- let browserWindow = getMostRecentBrowserWindow();
- let anchor = browserWindow.document.getElementById("identity-box");
- let panel = Panel({
- contentURL: "data:text/html;charset=utf-8,<html><body style='padding: 0; margin: 0; " +
- "background: gray; text-align: center;'>Anchor: " +
- anchor.id + "</body></html>",
- width: 200,
- height: 100,
- onShow: () => resolve(panel)
- });
- panel.show(null, anchor);
- });
- assert.pass("All anchored panel test displayed");
-
- panel.destroy();
- assert.pass("panel was destroyed.");
-};
-
-exports["test Panel Focus True"] = function(assert, done) {
- const { Panel } = require('sdk/panel');
-
- const FM = Cc["@mozilla.org/focus-manager;1"].
- getService(Ci.nsIFocusManager);
-
- let browserWindow = Cc["@mozilla.org/appshell/window-mediator;1"].
- getService(Ci.nsIWindowMediator).
- getMostRecentWindow("navigator:browser");
-
- // Make sure there is a focused element
- browserWindow.document.documentElement.focus();
-
- // Get the current focused element
- let focusedElement = FM.focusedElement;
-
- let panel = Panel({
- contentURL: "about:buildconfig",
- focus: true,
- onShow: function () {
- assert.ok(focusedElement !== FM.focusedElement,
- "The panel takes the focus away.");
- done();
- }
- });
- panel.show();
-};
-
-exports["test Panel Focus False"] = function(assert, done) {
- const { Panel } = require('sdk/panel');
-
- const FM = Cc["@mozilla.org/focus-manager;1"].
- getService(Ci.nsIFocusManager);
-
- let browserWindow = Cc["@mozilla.org/appshell/window-mediator;1"].
- getService(Ci.nsIWindowMediator).
- getMostRecentWindow("navigator:browser");
-
- // Make sure there is a focused element
- browserWindow.document.documentElement.focus();
-
- // Get the current focused element
- let focusedElement = FM.focusedElement;
-
- let panel = Panel({
- contentURL: "about:buildconfig",
- focus: false,
- onShow: function () {
- assert.ok(focusedElement === FM.focusedElement,
- "The panel does not take the focus away.");
- done();
- }
- });
- panel.show();
-};
-
-exports["test Panel Focus Not Set"] = function(assert, done) {
- const { Panel } = require('sdk/panel');
-
- const FM = Cc["@mozilla.org/focus-manager;1"].
- getService(Ci.nsIFocusManager);
-
- let browserWindow = Cc["@mozilla.org/appshell/window-mediator;1"].
- getService(Ci.nsIWindowMediator).
- getMostRecentWindow("navigator:browser");
-
- // Make sure there is a focused element
- browserWindow.document.documentElement.focus();
-
- // Get the current focused element
- let focusedElement = FM.focusedElement;
-
- let panel = Panel({
- contentURL: "about:buildconfig",
- onShow: function () {
- assert.ok(focusedElement !== FM.focusedElement,
- "The panel takes the focus away.");
- done();
- }
- });
- panel.show();
-};
-
-exports["test Panel Text Color"] = function(assert, done) {
- const { Panel } = require('sdk/panel');
-
- let html = "<html><head><style>body {color: yellow}</style></head>" +
- "<body><p>Foo</p></body></html>";
- let panel = Panel({
- contentURL: "data:text/html;charset=utf-8," + encodeURI(html),
- contentScript: "self.port.emit('color', " +
- "window.getComputedStyle(document.body.firstChild, null). " +
- " getPropertyValue('color'));"
- });
- panel.port.on("color", function (color) {
- assert.equal(color, "rgb(255, 255, 0)",
- "The panel text color style is preserved when a style exists.");
- panel.destroy();
- done();
- });
-};
-
-// Bug 866333
-exports["test watch event name"] = function(assert, done) {
- const { Panel } = require('sdk/panel');
-
- let html = "<html><head><style>body {color: yellow}</style></head>" +
- "<body><p>Foo</p></body></html>";
-
- let panel = Panel({
- contentURL: "data:text/html;charset=utf-8," + encodeURI(html),
- contentScript: "self.port.emit('watch', 'test');"
- });
- panel.port.on("watch", function (msg) {
- assert.equal(msg, "test", 'watch event name works');
- panel.destroy();
- done();
- });
-}
-
-// Bug 696552: Ensure panel.contentURL modification support
-exports["test Change Content URL"] = function(assert, done) {
- const { Panel } = require('sdk/panel');
-
- let panel = Panel({
- contentURL: "about:blank",
- contentScript: "self.port.emit('ready', document.location.href);"
- });
-
- let count = 0;
- panel.port.on("ready", function (location) {
- count++;
- if (count == 1) {
- assert.equal(location, "about:blank");
- assert.equal(panel.contentURL, "about:blank");
- panel.contentURL = "about:buildconfig";
- }
- else {
- assert.equal(location, "about:buildconfig");
- assert.equal(panel.contentURL, "about:buildconfig");
- panel.destroy();
- done();
- }
- });
-};
-
-function makeEventOrderTest(options) {
- let expectedEvents = [];
-
- return function(assert, done) {
- const { Panel } = require('sdk/panel');
-
- let panel = Panel({ contentURL: "about:buildconfig" });
-
- function expect(event, cb) {
- expectedEvents.push(event);
- panel.on(event, function() {
- assert.equal(event, expectedEvents.shift());
- if (cb)
- setTimeout(cb, 1);
- });
- return {then: expect};
- }
-
- options.test(assert, done, expect, panel);
- }
-}
-
-exports["test Automatic Destroy"] = function(assert) {
- let loader = Loader(module);
- let panel = loader.require("sdk/panel").Panel({
- contentURL: "about:buildconfig",
- contentScript:
- "self.port.on('event', () => self.port.emit('event-back'));"
- });
-
- loader.unload();
-
- assert.throws(() => {
- panel.port.emit("event");
- }, /already have been unloaded/, "check automatic destroy");
-};
-
-exports["test Show Then Destroy"] = makeEventOrderTest({
- test: function(assert, done, expect, panel) {
- panel.show();
- expect('show', function() { panel.destroy(); }).
- then('hide', function() { done(); });
- }
-});
-
-
-// TODO: Re-enable and fix this intermittent test
-// See Bug 1111695 https://bugzilla.mozilla.org/show_bug.cgi?id=1111695
-/*
-exports["test Show Then Hide Then Destroy"] = makeEventOrderTest({
- test: function(assert, done, expect, panel) {
- panel.show();
- expect('show', function() { panel.hide(); }).
- then('hide', function() { panel.destroy(); done(); });
- }
-});
-*/
-
-exports["test Content URL Option"] = function(assert) {
- const { Panel } = require('sdk/panel');
-
- const URL_STRING = "about:buildconfig";
- const HTML_CONTENT = "<html><title>Test</title><p>This is a test.</p></html>";
- let dataURL = "data:text/html;charset=utf-8," + encodeURIComponent(HTML_CONTENT);
-
- let panel = Panel({ contentURL: URL_STRING });
- assert.pass("contentURL accepts a string URL.");
- assert.equal(panel.contentURL, URL_STRING,
- "contentURL is the string to which it was set.");
- panel.destroy();
-
- panel = Panel({ contentURL: dataURL });
- assert.pass("contentURL accepts a data: URL.");
- panel.destroy();
-
- panel = Panel({});
- assert.ok(panel.contentURL == null, "contentURL is undefined.");
- panel.destroy();
-
- assert.throws(() => Panel({ contentURL: "foo" }),
- /The `contentURL` option must be a valid URL./,
- "Panel throws an exception if contentURL is not a URL.");
-};
-
-exports["test SVG Document"] = function(assert) {
- let panel = require("sdk/panel").Panel({ contentURL: SVG_URL });
-
- panel.show();
- panel.hide();
- panel.destroy();
-
- assert.pass("contentURL accepts a svg document");
- assert.equal(panel.contentURL, SVG_URL,
- "contentURL is the string to which it was set.");
-};
-
-exports["test ContentScriptOptions Option"] = function(assert, done) {
- let loader = Loader(module);
- let panel = loader.require("sdk/panel").Panel({
- contentScript: "self.postMessage( [typeof self.options.d, self.options] );",
- contentScriptWhen: "end",
- contentScriptOptions: {a: true, b: [1,2,3], c: "string", d: function(){ return 'test'}},
- contentURL: "data:text/html;charset=utf-8,",
- onMessage: function(msg) {
- assert.equal( msg[0], 'undefined', 'functions are stripped from contentScriptOptions' );
- assert.equal( typeof msg[1], 'object', 'object as contentScriptOptions' );
- assert.equal( msg[1].a, true, 'boolean in contentScriptOptions' );
- assert.equal( msg[1].b.join(), '1,2,3', 'array and numbers in contentScriptOptions' );
- assert.equal( msg[1].c, 'string', 'string in contentScriptOptions' );
- done();
- }
- });
-};
-
-exports["test console.log in Panel"] = function(assert, done) {
- let text = 'console.log() in Panel works!';
- let html = '<script>onload = function log(){\
- console.log("' + text + '");\
- }</script>';
-
- let { loader } = LoaderWithHookedConsole(module, onMessage);
- let { Panel } = loader.require('sdk/panel');
-
- let panel = Panel({
- contentURL: 'data:text/html;charset=utf-8,' + encodeURIComponent(html)
- });
-
- panel.show();
-
- function onMessage(type, message) {
- assert.equal(type, 'log', 'console.log() works');
- assert.equal(message, text, 'console.log() works');
- panel.destroy();
- done();
- }
-};
-
-/*if (isWindowPBSupported) {
- exports.testPanelDoesNotShowInPrivateWindowNoAnchor = function(assert, done) {
- let { loader } = LoaderWithHookedConsole(module, ignorePassingDOMNodeWarning);
- let { Panel } = loader.require("sdk/panel");
- let browserWindow = getMostRecentBrowserWindow();
-
- assert.equal(isPrivate(browserWindow), false, 'open window is not private');
-
- let panel = Panel({
- contentURL: SVG_URL
- });
-
- testShowPanel(assert, panel).
- then(makeEmptyPrivateBrowserWindow).
- then(focus).
- then(function(window) {
- assert.equal(isPrivate(window), true, 'opened window is private');
- assert.pass('private window was focused');
- return window;
- }).
- then(function(window) {
- let { promise, resolve } = defer();
- let showTries = 0;
- let showCount = 0;
-
- panel.on('show', function runTests() {
- showCount++;
-
- if (showTries == 2) {
- panel.removeListener('show', runTests);
- assert.equal(showCount, 1, 'show count is correct - 1');
- resolve(window);
- }
- });
- showTries++;
- panel.show();
- showTries++;
- panel.show(null, browserWindow.gBrowser);
-
- return promise;
- }).
- then(function(window) {
- assert.equal(panel.isShowing, true, 'panel is still showing');
- panel.hide();
- assert.equal(panel.isShowing, false, 'panel is hidden');
- return window;
- }).
- then(close).
- then(function() {
- assert.pass('private window was closed');
- }).
- then(testShowPanel.bind(null, assert, panel)).
- then(done, assert.fail.bind(assert));
- }
-
- exports.testPanelDoesNotShowInPrivateWindowWithAnchor = function(assert, done) {
- let { loader } = LoaderWithHookedConsole(module, ignorePassingDOMNodeWarning);
- let { Panel } = loader.require("sdk/panel");
- let browserWindow = getMostRecentBrowserWindow();
-
- assert.equal(isPrivate(browserWindow), false, 'open window is not private');
-
- let panel = Panel({
- contentURL: SVG_URL
- });
-
- testShowPanel(assert, panel).
- then(makeEmptyPrivateBrowserWindow).
- then(focus).
- then(function(window) {
- assert.equal(isPrivate(window), true, 'opened window is private');
- assert.pass('private window was focused');
- return window;
- }).
- then(function(window) {
- let { promise, resolve } = defer();
- let showTries = 0;
- let showCount = 0;
-
- panel.on('show', function runTests() {
- showCount++;
-
- if (showTries == 2) {
- panel.removeListener('show', runTests);
- assert.equal(showCount, 1, 'show count is correct - 1');
- resolve(window);
- }
- });
- showTries++;
- panel.show(null, window.gBrowser);
- showTries++;
- panel.show(null, browserWindow.gBrowser);
-
- return promise;
- }).
- then(function(window) {
- assert.equal(panel.isShowing, true, 'panel is still showing');
- panel.hide();
- assert.equal(panel.isShowing, false, 'panel is hidden');
- return window;
- }).
- then(close).
- then(function() {
- assert.pass('private window was closed');
- }).
- then(testShowPanel.bind(null, assert, panel)).
- then(done, assert.fail.bind(assert));
- }
-}*/
-
-function testShowPanel(assert, panel) {
- let { promise, resolve } = defer();
-
- assert.ok(!panel.isShowing, 'the panel is not showing [1]');
-
- panel.once('show', function() {
- assert.ok(panel.isShowing, 'the panel is showing');
-
- panel.once('hide', function() {
- assert.ok(!panel.isShowing, 'the panel is not showing [2]');
-
- resolve(null);
- });
-
- panel.hide();
- })
- panel.show();
-
- return promise;
-}
-
-exports['test Style Applied Only Once'] = function (assert, done) {
- let loader = Loader(module);
- let panel = loader.require("sdk/panel").Panel({
- contentURL: "data:text/html;charset=utf-8,",
- contentScript:
- 'self.port.on("check",function() { self.port.emit("count", document.getElementsByTagName("style").length); });' +
- 'self.port.on("ping", function (count) { self.port.emit("pong", count); });'
- });
-
- panel.port.on('count', function (styleCount) {
- assert.equal(styleCount, 1, 'should only have one style');
- done();
- });
-
- panel.port.on('pong', function (counter) {
- panel[--counter % 2 ? 'hide' : 'show']();
- panel.port.emit(!counter ? 'check' : 'ping', counter);
- });
-
- panel.on('show', init);
- panel.show();
-
- function init () {
- panel.removeListener('show', init);
- panel.port.emit('ping', 10);
- }
-};
-
-exports['test Only One Panel Open Concurrently'] = function (assert, done) {
- const loader = Loader(module);
- const { Panel } = loader.require('sdk/panel')
-
- let panelA = Panel({
- contentURL: 'about:buildconfig'
- });
-
- let panelB = Panel({
- contentURL: 'about:buildconfig',
- onShow: function () {
- // When loading two panels simulataneously, only the second
- // should be shown, never showing the first
- assert.equal(panelA.isShowing, false, 'First panel is hidden');
- assert.equal(panelB.isShowing, true, 'Second panel is showing');
- panelC.show();
- }
- });
-
- let panelC = Panel({
- contentURL: 'about:buildconfig',
- onShow: function () {
- assert.equal(panelA.isShowing, false, 'First panel is hidden');
- assert.equal(panelB.isShowing, false, 'Second panel is hidden');
- assert.equal(panelC.isShowing, true, 'Third panel is showing');
- done();
- }
- });
-
- panelA.show();
- panelB.show();
-};
-
-exports['test passing DOM node as first argument'] = function (assert, done) {
- let warned = defer();
- let shown = defer();
-
- function onMessage(type, message) {
- if (type != 'warn') return;
-
- let warning = 'Passing a DOM node to Panel.show() method is an unsupported ' +
- 'feature that will be soon replaced. ' +
- 'See: https://bugzilla.mozilla.org/show_bug.cgi?id=878877';
-
- assert.equal(type, 'warn',
- 'the message logged is a warning');
-
- assert.equal(message, warning,
- 'the warning content is correct');
-
- warned.resolve();
- }
-
- let { loader } = LoaderWithHookedConsole(module, onMessage);
- let { Panel } = loader.require('sdk/panel');
- let { ActionButton } = loader.require('sdk/ui/button/action');
- let { getNodeView } = loader.require('sdk/view/core');
- let { document } = getMostRecentBrowserWindow();
-
- let panel = Panel({
- onShow: function() {
- let panelNode = document.getElementById('mainPopupSet').lastChild;
-
- assert.equal(panelNode.anchorNode, buttonNode,
- 'the panel is properly anchored to the button');
-
- shown.resolve();
- }
- });
-
- let button = ActionButton({
- id: 'panel-button',
- label: 'panel button',
- icon: './icon.png'
- });
-
- let buttonNode = getNodeView(button);
-
- all([warned.promise, shown.promise]).
- then(loader.unload).
- then(done, assert.fail)
-
- panel.show(buttonNode);
-};
-
-// This test is checking that `onpupshowing` events emitted by panel's children
-// are not considered.
-// See Bug 886329
-exports['test nested popups'] = function (assert, done) {
- let loader = Loader(module);
- let { Panel } = loader.require('sdk/panel');
- let { getActiveView } = loader.require('sdk/view/core');
- let url = '<select><option>1<option>2<option>3</select>';
-
- let getContentWindow = panel => {
- return getActiveView(panel).querySelector('iframe').contentWindow;
- }
-
- let panel = Panel({
- contentURL: 'data:text/html;charset=utf-8,' + encodeURIComponent(url),
- onShow: () => {
- ready(getContentWindow(panel)).then(({ window, document }) => {
- let select = document.querySelector('select');
- let event = document.createEvent('UIEvent');
-
- event.initUIEvent('popupshowing', true, true, window, null);
- select.dispatchEvent(event);
-
- assert.equal(
- select,
- getContentWindow(panel).document.querySelector('select'),
- 'select is still loaded in panel'
- );
-
- done();
- });
- }
- });
-
- panel.show();
-};
-
-exports['test emits on url changes'] = function (assert, done) {
- let loader = Loader(module);
- let { Panel } = loader.require('sdk/panel');
- let uriA = 'data:text/html;charset=utf-8,A';
- let uriB = 'data:text/html;charset=utf-8,B';
-
- let panel = Panel({
- contentURL: uriA,
- contentScript: 'new ' + function() {
- self.port.on('hi', function() {
- self.port.emit('bye', document.URL);
- });
- }
- });
-
- panel.contentURL = uriB;
- panel.port.emit('hi', 'hi')
- panel.port.on('bye', function(uri) {
- assert.equal(uri, uriB, 'message was delivered to new uri');
- loader.unload();
- done();
- });
-};
-
-exports['test panel can be constructed without any arguments'] = function (assert) {
- const { Panel } = require('sdk/panel');
-
- let panel = Panel();
- assert.ok(true, "Creating a panel with no arguments does not throw");
-};
-
-exports['test panel CSS'] = function(assert, done) {
- const { merge } = require("sdk/util/object");
-
- let loader = Loader(module, null, null, {
- modules: {
- "sdk/self": merge({}, self, {
- data: merge({}, self.data, fixtures)
- })
- }
- });
-
- const { Panel } = loader.require('sdk/panel');
-
- const { getActiveView } = loader.require('sdk/view/core');
-
- const getContentWindow = panel =>
- getActiveView(panel).querySelector('iframe').contentWindow;
-
- let panel = Panel({
- contentURL: 'data:text/html;charset=utf-8,' +
- '<div style="background: silver">css test</div>',
- contentStyle: 'div { height: 100px; }',
- contentStyleFile: [fixtures.url("include-file.css"), "./border-style.css"],
- onShow: () => {
- ready(getContentWindow(panel)).then(({ window, document }) => {
- let div = document.querySelector('div');
-
- assert.equal(div.clientHeight, 100,
- "Panel contentStyle worked");
-
- assert.equal(div.offsetHeight, 120,
- "Panel contentStyleFile worked");
-
- assert.equal(window.getComputedStyle(div).borderTopStyle, "dashed",
- "Panel contentStyleFile with relative path worked");
-
- loader.unload();
- done();
- }).then(null, assert.fail);
- }
- });
-
- panel.show();
-};
-
-exports['test panel contentScriptFile'] = function(assert, done) {
- const { merge } = require("sdk/util/object");
-
- let loader = Loader(module, null, null, {
- modules: {
- "sdk/self": merge({}, self, {
- data: merge({}, self.data, {url: fixtures.url})
- })
- }
- });
-
- const { Panel } = loader.require('sdk/panel');
- const { getActiveView } = loader.require('sdk/view/core');
-
- const getContentWindow = panel =>
- getActiveView(panel).querySelector('iframe').contentWindow;
-
- let whenMessage = defer();
- let whenShown = defer();
-
- let panel = Panel({
- contentURL: './test.html',
- contentScriptFile: "./test-contentScriptFile.js",
- onMessage: (message) => {
- assert.equal(message, "msg from contentScriptFile",
- "Panel contentScriptFile with relative path worked");
-
- whenMessage.resolve();
- },
- onShow: () => {
- ready(getContentWindow(panel)).then(({ document }) => {
- assert.equal(document.title, 'foo',
- "Panel contentURL with relative path worked");
-
- whenShown.resolve();
- });
- }
- });
-
- all([whenMessage.promise, whenShown.promise]).
- then(loader.unload).
- then(done, assert.fail);
-
- panel.show();
-};
-
-
-exports['test panel CSS list'] = function(assert, done) {
- const loader = Loader(module);
- const { Panel } = loader.require('sdk/panel');
-
- const { getActiveView } = loader.require('sdk/view/core');
-
- const getContentWindow = panel =>
- getActiveView(panel).querySelector('iframe').contentWindow;
-
- let panel = Panel({
- contentURL: 'data:text/html;charset=utf-8,' +
- '<div style="width:320px; max-width: 480px!important">css test</div>',
- contentStyleFile: [
- // Highlight evaluation order in this list
- "data:text/css;charset=utf-8,div { border: 1px solid black; }",
- "data:text/css;charset=utf-8,div { border: 10px solid black; }",
- // Highlight evaluation order between contentStylesheet & contentStylesheetFile
- "data:text/css;charset=utf-8s,div { height: 1000px; }",
- // Highlight precedence between the author and user style sheet
- "data:text/css;charset=utf-8,div { width: 200px; max-width: 640px!important}",
- ],
- contentStyle: [
- "div { height: 10px; }",
- "div { height: 100px; }"
- ],
- onShow: () => {
- ready(getContentWindow(panel)).then(({ window, document }) => {
- let div = document.querySelector('div');
- let style = window.getComputedStyle(div);
-
- assert.equal(div.clientHeight, 100,
- 'Panel contentStyle list is evaluated after contentStyleFile');
-
- assert.equal(div.offsetHeight, 120,
- 'Panel contentStyleFile list works');
-
- assert.equal(style.width, '320px',
- 'add-on author/page author stylesheet precedence works');
-
- assert.equal(style.maxWidth, '480px',
- 'add-on author/page author stylesheet !important precedence works');
-
- loader.unload();
- }).then(done, assert.fail);
- }
- });
-
- panel.show();
-};
-
-exports['test panel contextmenu validation'] = function(assert) {
- const loader = Loader(module);
- const { Panel } = loader.require('sdk/panel');
-
- let panel = Panel({});
-
- assert.equal(panel.contextMenu, false,
- 'contextMenu option is `false` by default');
-
- panel.destroy();
-
- panel = Panel({
- contextMenu: false
- });
-
- assert.equal(panel.contextMenu, false,
- 'contextMenu option is `false`');
-
- panel.contextMenu = true;
-
- assert.equal(panel.contextMenu, true,
- 'contextMenu option accepts boolean values');
-
- panel.destroy();
-
- panel = Panel({
- contextMenu: true
- });
-
- assert.equal(panel.contextMenu, true,
- 'contextMenu option is `true`');
-
- panel.contextMenu = false;
-
- assert.equal(panel.contextMenu, false,
- 'contextMenu option accepts boolean values');
-
- assert.throws(() =>
- Panel({contextMenu: 1}),
- /The option "contextMenu" must be one of the following types: boolean, undefined, null/,
- 'contextMenu only accepts boolean or nil values');
-
- panel = Panel();
-
- assert.throws(() =>
- panel.contextMenu = 1,
- /The option "contextMenu" must be one of the following types: boolean, undefined, null/,
- 'contextMenu only accepts boolean or nil values');
-
- loader.unload();
-}
-
-exports['test panel contextmenu enabled'] = function*(assert) {
- const loader = Loader(module);
- const { Panel } = loader.require('sdk/panel');
- const { getActiveView } = loader.require('sdk/view/core');
- const { getContentDocument } = loader.require('sdk/panel/utils');
-
- let contextmenu = getMostRecentBrowserWindow().
- document.getElementById("contentAreaContextMenu");
-
- let panel = Panel({contextMenu: true});
-
- panel.show();
-
- yield wait(panel, 'show');
-
- let view = getActiveView(panel);
- let window = getContentDocument(view).defaultView;
-
- let { sendMouseEvent } = window.QueryInterface(Ci.nsIInterfaceRequestor).
- getInterface(Ci.nsIDOMWindowUtils);
-
- yield ready(window);
-
- assert.equal(contextmenu.state, 'closed',
- 'contextmenu must be closed');
-
- sendMouseEvent('contextmenu', 20, 20, 2, 1, 0);
-
- yield wait(contextmenu, 'popupshown');
-
- assert.equal(contextmenu.state, 'open',
- 'contextmenu is opened');
-
- contextmenu.hidePopup();
-
- loader.unload();
-}
-
-exports['test panel contextmenu disabled'] = function*(assert) {
- const loader = Loader(module);
- const { Panel } = loader.require('sdk/panel');
- const { getActiveView } = loader.require('sdk/view/core');
- const { getContentDocument } = loader.require('sdk/panel/utils');
-
- let contextmenu = getMostRecentBrowserWindow().
- document.getElementById("contentAreaContextMenu");
- let listener = () => assert.fail('popupshown should never be called');
-
- let panel = Panel();
-
- panel.show();
-
- yield wait(panel, 'show');
-
- let view = getActiveView(panel);
- let window = getContentDocument(view).defaultView;
-
- let { sendMouseEvent } = window.QueryInterface(Ci.nsIInterfaceRequestor).
- getInterface(Ci.nsIDOMWindowUtils);
-
- yield ready(window);
-
- assert.equal(contextmenu.state, 'closed',
- 'contextmenu must be closed');
-
- sendMouseEvent('contextmenu', 20, 20, 2, 1, 0);
-
- contextmenu.addEventListener('popupshown', listener);
-
- yield wait(1000);
-
- contextmenu.removeEventListener('popupshown', listener);
-
- assert.equal(contextmenu.state, 'closed',
- 'contextmenu was never open');
-
- loader.unload();
-}
-
-exports["test panel addon global object"] = function*(assert) {
- const { merge } = require("sdk/util/object");
-
- let loader = Loader(module, null, null, {
- modules: {
- "sdk/self": merge({}, self, {
- data: merge({}, self.data, {url: fixtures.url})
- })
- }
- });
-
- const { Panel } = loader.require('sdk/panel');
-
- let panel = Panel({
- contentURL: "./test-trusted-document.html"
- });
-
- panel.show();
-
- yield wait(panel, "show");
-
- panel.port.emit('addon-to-document', 'ok');
-
- yield wait(panel.port, "document-to-addon");
-
- assert.pass("Received an event from the document");
-
- loader.unload();
-}
-
-exports["test panel load doesn't show"] = function*(assert) {
- let loader = Loader(module);
-
- let panel = loader.require("sdk/panel").Panel({
- contentScript: "addEventListener('load', function(event) { self.postMessage('load'); });",
- contentScriptWhen: "start",
- contentURL: "data:text/html;charset=utf-8,",
- });
-
- let shown = defer();
- let messaged = defer();
-
- panel.once("show", function() {
- shown.resolve();
- });
-
- panel.once("message", function() {
- messaged.resolve();
- });
-
- panel.show();
- yield all([shown.promise, messaged.promise]);
- assert.ok(true, "Saw panel display");
-
- panel.on("show", function() {
- assert.fail("Should not have seen another show event")
- });
-
- messaged = defer();
- panel.once("message", function() {
- assert.ok(true, "Saw panel reload");
- messaged.resolve();
- });
-
- panel.contentURL = "data:text/html;charset=utf-8,<html/>";
-
- yield messaged.promise;
- loader.unload();
-}
-
-exports["test Panel without contentURL and contentScriptWhen=start should show"] = function*(assert) {
- let loader = Loader(module);
-
- let panel = loader.require("sdk/panel").Panel({
- contentScriptWhen: "start",
- // No contentURL, the bug only shows up when contentURL is not explicitly set.
- });
-
- yield new Promise(resolve => {
- panel.once("show", resolve);
- panel.show();
- });
-
- assert.pass("Received show event");
-
- loader.unload();
-}
-
-exports["test Panel links"] = function*(assert) {
- const loader = Loader(module);
-
- const { Panel } = loader.require('sdk/panel');
- const { getActiveView } = loader.require('sdk/view/core');
- const tabs = loader.require('sdk/tabs');
-
- const synthesizeClick = (panel, options) => {
- let { contentWindow } = getActiveView(panel).querySelector('iframe');
- let event = new contentWindow.MouseEvent('click', options);
-
- contentWindow.document.querySelector('a').dispatchEvent(event);
- }
-
- const linkURL = 'data:text/html;charset=utf-8,' +
- encodeURIComponent('<html><a href="#">foo</a></html>');
-
- const contentURL = 'data:text/html;charset=utf-8,' +
- encodeURIComponent(`<html><a href="${linkURL}">page</a></html>`);
-
- let panel = Panel({
- contentURL,
- contentScript: Isolate(() => self.postMessage(document.URL))
- });
-
- panel.show();
-
- let url = yield wait(panel, 'message');
-
- assert.equal(url, contentURL,
- 'content URL loaded');
-
- synthesizeClick(panel, { bubbles: true });
-
- url = yield wait(panel, 'message');
-
- assert.equal(url, linkURL,
- 'link URL loaded in the panel after click');
-
- synthesizeClick(panel, {
- bubbles: true,
- [platform === 'darwin' ? 'metaKey' : 'ctrlKey']: true
- });
-
- let tab = yield wait(tabs, 'ready');
-
- assert.equal(tab.url, linkURL + '#',
- 'link URL loaded in a new tab after click + accel');
-
- loader.unload();
-}
-
-exports["test Panel script allow property"] = function*(assert) {
- const loader = Loader(module);
- const { Panel } = loader.require('sdk/panel');
- const { getActiveView } = loader.require('sdk/view/core');
-
- const contentURL = 'data:text/html;charset=utf-8,' +
- encodeURIComponent(`<body onclick='postMessage("got script click", "*")'>
- <script>
- document.body.appendChild(document.createElement('unwanted'))
- </script>
- </body>`);
- let panel = Panel({
- contentURL,
- allow: {script: false},
- });
-
- panel.show();
-
- yield wait(panel, 'show');
-
- let { contentWindow } = getActiveView(panel).querySelector('iframe');
-
- assert.equal(contentWindow.document.body.lastElementChild.localName, "script",
- "Script should not have executed");
-
- panel.allow.script = true;
-
- let p = wait(contentWindow, "message");
- let event = new contentWindow.MouseEvent('click', {});
- contentWindow.document.body.dispatchEvent(event);
-
- let msg = yield p;
- assert.equal(msg.data, "got script click", "Should have seen script click");
-
- loader.unload();
-};
-
-after(exports, function*(name, assert) {
- yield cleanUI();
- assert.pass("ui was cleaned.");
-});
-
-if (isTravisCI) {
- module.exports = {
- "test skip on jpm": (assert) => assert.pass("skipping this file with jpm")
- };
-}
-
-require("sdk/test").run(exports);