summaryrefslogtreecommitdiffstats
path: root/addon-sdk/source/test/test-ui-sidebar.js
diff options
context:
space:
mode:
Diffstat (limited to 'addon-sdk/source/test/test-ui-sidebar.js')
-rw-r--r--addon-sdk/source/test/test-ui-sidebar.js1579
1 files changed, 1579 insertions, 0 deletions
diff --git a/addon-sdk/source/test/test-ui-sidebar.js b/addon-sdk/source/test/test-ui-sidebar.js
new file mode 100644
index 000000000..916a43e0b
--- /dev/null
+++ b/addon-sdk/source/test/test-ui-sidebar.js
@@ -0,0 +1,1579 @@
+/* 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 { Cu } = require('chrome');
+const { Loader } = require('sdk/test/loader');
+const { show, hide } = require('sdk/ui/sidebar/actions');
+const { isShowing } = require('sdk/ui/sidebar/utils');
+const { getMostRecentBrowserWindow, isFocused } = require('sdk/window/utils');
+const { open, close, focus, promise: windowPromise } = require('sdk/window/helpers');
+const { setTimeout, setImmediate } = require('sdk/timers');
+const { isPrivate } = require('sdk/private-browsing');
+const data = require('./fixtures');
+const { URL } = require('sdk/url');
+const { once, off, emit } = require('sdk/event/core');
+const { defer, all } = require('sdk/core/promise');
+const { modelFor } = require('sdk/model/core');
+const { cleanUI } = require("sdk/test/utils");
+const { before, after } = require('sdk/test/utils');
+
+require('sdk/windows');
+
+const { BUILTIN_SIDEBAR_MENUITEMS, isSidebarShowing,
+ getSidebarMenuitems, getExtraSidebarMenuitems, makeID, simulateCommand,
+ simulateClick, isChecked } = require('./sidebar/utils');
+
+exports.testSidebarBasicLifeCycle = function*(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testSidebarBasicLifeCycle';
+ let window = getMostRecentBrowserWindow();
+ assert.ok(!window.document.getElementById(makeID(testName)), 'sidebar id DNE');
+ let sidebarXUL = window.document.getElementById('sidebar');
+ assert.ok(sidebarXUL, 'sidebar xul element does exist');
+ assert.ok(!getExtraSidebarMenuitems().length, 'there are no extra sidebar menuitems');
+
+ assert.equal(isSidebarShowing(window), false, 'sidebar is not showing 1');
+ let sidebarDetails = {
+ id: testName,
+ title: 'test',
+ url: 'data:text/html;charset=utf-8,'+testName
+ };
+ let sidebar = Sidebar(sidebarDetails);
+
+ // test the sidebar attributes
+ for (let key of Object.keys(sidebarDetails)) {
+ assert.equal(sidebarDetails[key], sidebar[key], 'the attributes match the input');
+ }
+
+ assert.pass('The Sidebar constructor worked');
+
+ let extraMenuitems = getExtraSidebarMenuitems();
+ assert.equal(extraMenuitems.length, 1, 'there is one extra sidebar menuitems');
+
+ let ele = window.document.getElementById(makeID(testName));
+ assert.equal(ele, extraMenuitems[0], 'the only extra menuitem is the one for our sidebar.')
+ assert.ok(ele, 'sidebar element was added');
+ assert.ok(!isChecked(ele), 'the sidebar is not displayed');
+ assert.equal(ele.getAttribute('label'), sidebar.title, 'the sidebar title is the menuitem label')
+
+ assert.equal(isSidebarShowing(window), false, 'sidebar is not showing 2');
+
+ // explicit test of the on hide event
+ yield new Promise(resolve => {
+ sidebar.on('show', resolve);
+ sidebar.show();
+ assert.pass('showing sidebar..');
+ });
+
+ assert.pass('the show event was fired');
+ assert.equal(isSidebarShowing(window), true, 'sidebar is not showing 3');
+ assert.equal(isShowing(sidebar), true, 'the sidebar is showing');
+ assert.ok(isChecked(ele), 'the sidebar is displayed');
+
+ // explicit test of the on show event
+ yield new Promise(resolve => {
+ sidebar.on('hide', () => {
+ sidebar.once('detach', resolve);
+
+ assert.pass('the hide event was fired');
+ assert.ok(!isChecked(ele), 'the sidebar menuitem is not checked');
+ assert.equal(isShowing(sidebar), false, 'the sidebar is not showing');
+ assert.equal(isSidebarShowing(window), false, 'the sidebar elemnt is hidden');
+ });
+ sidebar.hide();
+ assert.pass('hiding sidebar..');
+ });
+
+ // calling destroy twice should not matter
+ sidebar.destroy();
+ sidebar.destroy();
+
+ for (let mi of getSidebarMenuitems()) {
+ let id = mi.getAttribute('id');
+
+ if (BUILTIN_SIDEBAR_MENUITEMS.indexOf(id) < 0) {
+ assert.fail('the menuitem "' + id + '" is not a built-in sidebar');
+ }
+ assert.ok(!isChecked(mi), 'no sidebar menuitem is checked');
+ }
+
+ assert.ok(!window.document.getElementById(makeID(testName)), 'sidebar id DNE');
+ assert.pass('calling destroy worked without error');
+}
+
+exports.testSideBarIsInNewWindows = function*(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testSideBarIsInNewWindows';
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName,
+ url: 'data:text/html;charset=utf-8,'+testName
+ });
+
+ let startWindow = getMostRecentBrowserWindow();
+ let ele = startWindow.document.getElementById(makeID(testName));
+ assert.ok(ele, 'sidebar element was added');
+
+ let window = yield open();
+
+ ele = window.document.getElementById(makeID(testName));
+ assert.ok(ele, 'sidebar element was added');
+
+ // calling destroy twice should not matter
+ sidebar.destroy();
+ sidebar.destroy();
+
+ assert.ok(!window.document.getElementById(makeID(testName)), 'sidebar id DNE');
+ assert.ok(!startWindow.document.getElementById(makeID(testName)), 'sidebar id DNE');
+}
+
+exports.testSideBarIsShowingInNewWindows = function*(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testSideBarIsShowingInNewWindows';
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName,
+ url: URL('data:text/html;charset=utf-8,'+testName)
+ });
+
+ let startWindow = getMostRecentBrowserWindow();
+ let ele = startWindow.document.getElementById(makeID(testName));
+ assert.ok(ele, 'sidebar element was added');
+
+ let oldEle = ele;
+
+ yield new Promise(resolve => {
+ sidebar.once('attach', function() {
+ assert.pass('attach event fired');
+
+ sidebar.once('show', function() {
+ assert.pass('show event fired');
+ resolve();
+ })
+ });
+ sidebar.show();
+ });
+
+ yield new Promise(resolve => {
+ sidebar.once('show', resolve);
+ startWindow.OpenBrowserWindow();
+ });
+
+ let window = getMostRecentBrowserWindow();
+ assert.notEqual(startWindow, window, 'window is new');
+
+ let sb = window.document.getElementById('sidebar');
+ yield new Promise(resolve => {
+ if (sb && sb.docShell && sb.contentDocument && sb.contentDocument.getElementById('web-panels-browser')) {
+ end();
+ }
+ else {
+ sb.addEventListener('DOMWindowCreated', end, false);
+ }
+ function end () {
+ sb.removeEventListener('DOMWindowCreated', end, false);
+ resolve();
+ }
+ })
+
+ ele = window.document.getElementById(makeID(testName));
+ assert.ok(ele, 'sidebar element was added 2');
+ assert.ok(isChecked(ele), 'the sidebar is checked');
+ assert.notEqual(ele, oldEle, 'there are two different sidebars');
+
+ assert.equal(isShowing(sidebar), true, 'the sidebar is showing in new window');
+
+ sidebar.destroy();
+
+ assert.equal(isShowing(sidebar), false, 'the sidebar is not showing');
+ assert.ok(!isSidebarShowing(window), 'sidebar in most recent window is not showing');
+ assert.ok(!isSidebarShowing(startWindow), 'sidebar in most start window is not showing');
+ assert.ok(!window.document.getElementById(makeID(testName)), 'sidebar id DNE');
+ assert.ok(!startWindow.document.getElementById(makeID(testName)), 'sidebar id DNE');
+}
+
+// TODO: determine if this is acceptable..
+/*
+exports.testAddonGlobalSimple = function(assert, done) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testAddonGlobalSimple';
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName,
+ url: data.url('test-sidebar-addon-global.html')
+ });
+
+ sidebar.on('show', function({worker}) {
+ assert.pass('sidebar was attached');
+ assert.ok(!!worker, 'attach event has worker');
+
+ worker.port.on('X', function(msg) {
+ assert.equal(msg, '23', 'the final message is correct');
+
+ sidebar.destroy();
+
+ done();
+ });
+ worker.port.emit('X', '2');
+ });
+ show(sidebar);
+}
+*/
+
+exports.testAddonGlobalComplex = function*(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testAddonGlobalComplex';
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName,
+ url: data.url('test-sidebar-addon-global.html')
+ });
+
+ let worker = yield new Promise(resolve => {
+ sidebar.on('attach', resolve);
+ show(sidebar);
+ });
+
+ assert.pass('sidebar was attached');
+ assert.ok(!!worker, 'attach event has worker');
+
+
+ let msg = yield new Promise(resolve => {
+ worker.port.once('Y', resolve);
+ });
+
+ assert.equal(msg, '1', 'got event from worker');
+
+ msg = yield new Promise(resolve => {
+ worker.port.on('X', resolve);
+ worker.port.emit('X', msg + '2');
+ });
+
+ assert.equal(msg, '123', 'the final message is correct');
+
+ sidebar.destroy();
+}
+
+exports.testAddonReady = function*(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testAddonReady';
+ let ready = defer();
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName,
+ url: data.url('test-sidebar-addon-global.html'),
+ onReady: ready.resolve
+ });
+ show(sidebar);
+
+ let worker = yield ready.promise;
+ assert.pass('sidebar was attached');
+ assert.ok(!!worker, 'attach event has worker');
+
+ let msg = yield new Promise(resolve => {
+ worker.port.on('X', resolve);
+ worker.port.emit('X', '12');
+ });
+ assert.equal(msg, '123', 'the final message is correct');
+
+ sidebar.destroy();
+}
+
+exports.testShowingOneSidebarAfterAnother = function*(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testShowingOneSidebarAfterAnother';
+
+ let sidebar1 = Sidebar({
+ id: testName + '1',
+ title: testName + '1',
+ url: 'data:text/html;charset=utf-8,'+ testName + 1
+ });
+ let sidebar2 = Sidebar({
+ id: testName + '2',
+ title: testName + '2',
+ url: 'data:text/html;charset=utf-8,'+ testName + 2
+ });
+
+ let window = getMostRecentBrowserWindow();
+ let IDs = [ sidebar1.id, sidebar2.id ];
+
+ let extraMenuitems = getExtraSidebarMenuitems(window);
+ assert.equal(extraMenuitems.length, 2, 'there are two extra sidebar menuitems');
+
+ function testShowing(sb1, sb2, sbEle) {
+ assert.equal(isShowing(sidebar1), sb1);
+ assert.equal(isShowing(sidebar2), sb2);
+ assert.equal(isSidebarShowing(window), sbEle);
+ }
+ testShowing(false, false, false);
+
+ yield show(sidebar1);
+ assert.pass('showed sidebar1');
+
+ testShowing(true, false, true);
+
+ for (let mi of getExtraSidebarMenuitems(window)) {
+ let menuitemID = mi.getAttribute('id').replace(/^jetpack-sidebar-/, '');
+ assert.ok(IDs.indexOf(menuitemID) >= 0, 'the extra menuitem is for one of our test sidebars');
+ assert.equal(isChecked(mi), menuitemID == sidebar1.id, 'the test sidebar menuitem has the correct checked value');
+ }
+
+ yield show(sidebar2);
+ assert.pass('showed sidebar2');
+
+ testShowing(false, true, true);
+
+ for (let mi of getExtraSidebarMenuitems(window)) {
+ let menuitemID = mi.getAttribute('id').replace(/^jetpack-sidebar-/, '');
+ assert.ok(IDs.indexOf(menuitemID) >= 0, 'the extra menuitem is for one of our test sidebars');
+ assert.equal(isChecked(mi), menuitemID == sidebar2.id, 'the test sidebar menuitem has the correct checked value');
+ }
+
+ sidebar1.destroy();
+ sidebar2.destroy();
+
+ testShowing(false, false, false);
+}
+
+exports.testSidebarUnload = function*(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testSidebarUnload';
+ let loader = Loader(module);
+
+ let window = getMostRecentBrowserWindow();
+
+ assert.equal(isPrivate(window), false, 'the current window is not private');
+
+ let sidebar = loader.require('sdk/ui/sidebar').Sidebar({
+ id: testName,
+ title: testName,
+ url: 'data:text/html;charset=utf-8,'+ testName
+ });
+
+ yield sidebar.show();
+ assert.pass('showing the sidebar');
+
+ loader.unload();
+
+ for (let mi of getSidebarMenuitems()) {
+ assert.ok(BUILTIN_SIDEBAR_MENUITEMS.indexOf(mi.getAttribute('id')) >= 0, 'the menuitem is for a built-in sidebar')
+ assert.ok(!isChecked(mi), 'no sidebar menuitem is checked');
+ }
+
+ assert.ok(!window.document.getElementById(makeID(testName)), 'sidebar id DNE');
+ assert.equal(isSidebarShowing(window), false, 'the sidebar is not showing');
+}
+
+exports.testRelativeURL = function*(assert) {
+ const { merge } = require('sdk/util/object');
+ const self = require('sdk/self');
+
+ let loader = Loader(module, null, null, {
+ modules: {
+ 'sdk/self': merge({}, self, {
+ data: merge({}, self.data, require('./fixtures'))
+ })
+ }
+ });
+
+ const { Sidebar } = loader.require('sdk/ui/sidebar');
+
+ let testName = 'testRelativeURL';
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName,
+ url: './test-sidebar-addon-global.html'
+ });
+
+ yield new Promise(resolve => {
+ sidebar.on('attach', function(worker) {
+ assert.pass('sidebar was attached');
+ assert.ok(!!worker, 'attach event has worker');
+
+ worker.port.once('Y', function(msg) {
+ assert.equal(msg, '1', 'got event from worker');
+
+ worker.port.on('X', function(msg) {
+ assert.equal(msg, '123', 'the final message is correct');
+ resolve();
+ });
+ worker.port.emit('X', msg + '2');
+ })
+ });
+ sidebar.show();
+ });
+
+ sidebar.destroy();
+}
+
+exports.testRemoteContent = function(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testRemoteContent';
+ try {
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName,
+ url: 'http://dne.xyz.mozilla.org'
+ });
+ assert.fail('a bad sidebar was created..');
+ sidebar.destroy();
+ }
+ catch(e) {
+ assert.ok(/The option "url" must be a valid local URI\./.test(e), 'remote content is not acceptable');
+ }
+}
+
+exports.testInvalidURL = function(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testInvalidURL';
+ try {
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName,
+ url: 'http:mozilla.org'
+ });
+ assert.fail('a bad sidebar was created..');
+ sidebar.destroy();
+ }
+ catch(e) {
+ assert.ok(/The option "url" must be a valid local URI\./.test(e), 'invalid URIs are not acceptable');
+ }
+}
+
+exports.testInvalidURLType = function(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testInvalidURLType';
+ try {
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName
+ });
+ assert.fail('a bad sidebar was created..');
+ sidebar.destroy();
+ }
+ catch(e) {
+ assert.ok(/The option "url" must be a valid local URI\./.test(e), 'invalid URIs are not acceptable');
+ }
+}
+
+exports.testInvalidTitle = function(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testInvalidTitle';
+ try {
+ let sidebar = Sidebar({
+ id: testName,
+ title: '',
+ url: 'data:text/html;charset=utf-8,'+testName
+ });
+ assert.fail('a bad sidebar was created..');
+ sidebar.destroy();
+ }
+ catch(e) {
+ assert.equal('The option "title" must be one of the following types: string', e.message, 'invalid titles are not acceptable');
+ }
+}
+
+exports.testInvalidID = function(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testInvalidID';
+ try {
+ let sidebar = Sidebar({
+ id: '!',
+ title: testName,
+ url: 'data:text/html;charset=utf-8,'+testName
+ });
+ assert.fail('a bad sidebar was created..');
+ sidebar.destroy();
+ }
+ catch(e) {
+ assert.ok(/The option "id" must be a valid alphanumeric id/.test(e), 'invalid ids are not acceptable');
+ }
+}
+
+exports.testInvalidBlankID = function(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testInvalidBlankID';
+ try {
+ let sidebar = Sidebar({
+ id: '',
+ title: testName,
+ url: 'data:text/html;charset=utf-8,'+testName
+ });
+ assert.fail('a bad sidebar was created..');
+ sidebar.destroy();
+ }
+ catch(e) {
+ assert.ok(/The option "id" must be a valid alphanumeric id/.test(e), 'invalid ids are not acceptable');
+ }
+}
+
+exports.testInvalidNullID = function(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testInvalidNullID';
+ try {
+ let sidebar = Sidebar({
+ id: null,
+ title: testName,
+ url: 'data:text/html;charset=utf-8,'+testName
+ });
+ assert.fail('a bad sidebar was created..');
+ sidebar.destroy();
+ }
+ catch(e) {
+ assert.ok(/The option "id" must be a valid alphanumeric id/.test(e), 'invalid ids are not acceptable');
+ }
+}
+
+exports.testUndefinedID = function(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testInvalidUndefinedID';
+
+ try {
+ let sidebar = Sidebar({
+ title: testName,
+ url: 'data:text/html;charset=utf-8,' + testName
+ });
+
+ assert.ok(sidebar.id, 'an undefined id was accepted, id was creawted: ' + sidebar.id);
+ assert.ok(getMostRecentBrowserWindow().document.getElementById(makeID(sidebar.id)), 'the sidebar element was found');
+
+ sidebar.destroy();
+ }
+ catch(e) {
+ assert.fail('undefined ids are acceptable');
+ assert.fail(e.message);
+ }
+}
+
+// TEST: edge case where web panel is destroyed while loading
+exports.testDestroyEdgeCaseBug = function*(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testDestroyEdgeCaseBug';
+ let window = getMostRecentBrowserWindow();
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName,
+ url: 'data:text/html;charset=utf-8,'+testName
+ });
+
+ // NOTE: purposely not listening to show event b/c the event happens
+ // between now and then.
+ sidebar.show();
+
+ assert.equal(isPrivate(window), false, 'the new window is not private');
+ assert.equal(isSidebarShowing(window), true, 'the sidebar is showing');
+
+ //assert.equal(isShowing(sidebar), true, 'the sidebar is showing');
+
+ let window2 = yield open().then(focus);
+
+ assert.equal(isPrivate(window2), false, 'the new window is not private');
+ assert.equal(isSidebarShowing(window2), false, 'the sidebar is not showing');
+ assert.equal(isShowing(sidebar), false, 'the sidebar is not showing');
+
+ sidebar.destroy();
+ assert.pass('destroying the sidebar');
+
+ yield close(window2);
+
+ let loader = Loader(module);
+
+ assert.equal(isPrivate(window), false, 'the current window is not private');
+
+ sidebar = loader.require('sdk/ui/sidebar').Sidebar({
+ id: testName,
+ title: testName,
+ url: 'data:text/html;charset=utf-8,'+ testName,
+ onShow: function() {
+ }
+ })
+
+ assert.pass('showing the sidebar');
+ yield sidebar.show();
+ loader.unload();
+
+ for (let mi of getSidebarMenuitems()) {
+ let id = mi.getAttribute('id');
+
+ if (BUILTIN_SIDEBAR_MENUITEMS.indexOf(id) < 0) {
+ assert.fail('the menuitem "' + id + '" is not a built-in sidebar');
+ }
+ assert.ok(!isChecked(mi), 'no sidebar menuitem is checked');
+ }
+ assert.ok(!window.document.getElementById(makeID(testName)), 'sidebar id DNE');
+ assert.equal(isSidebarShowing(window), false, 'the sidebar is not showing');
+}
+
+exports.testClickingACheckedMenuitem = function*(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ const testName = 'testClickingACheckedMenuitem';
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName,
+ url: 'data:text/html;charset=utf-8,'+testName,
+ });
+ assert.pass('sidebar was created');
+
+ let window = yield open().then(focus);
+ yield sidebar.show();
+ assert.pass('the show callback works');
+
+ let waitForHide = defer();
+ sidebar.once('hide', waitForHide.resolve);
+ let menuitem = window.document.getElementById(makeID(sidebar.id));
+ simulateCommand(menuitem);
+
+ yield waitForHide.promise;
+
+ assert.pass('clicking the menuitem after the sidebar has shown hides it.');
+ sidebar.destroy();
+};
+
+exports.testTitleSetter = function*(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testTitleSetter';
+ let { document } = getMostRecentBrowserWindow();
+
+ let sidebar1 = Sidebar({
+ id: testName,
+ title: testName,
+ url: 'data:text/html;charset=utf-8,'+testName,
+ });
+
+ assert.equal(sidebar1.title, testName, 'title getter works');
+
+ yield sidebar1.show();
+ assert.equal(document.getElementById(makeID(sidebar1.id)).getAttribute('label'),
+ testName,
+ 'the menuitem label is correct');
+
+ assert.equal(document.getElementById('sidebar-title').value, testName, 'the menuitem label is correct');
+
+ sidebar1.title = 'foo';
+
+ assert.equal(sidebar1.title, 'foo', 'title getter works');
+
+ assert.equal(document.getElementById(makeID(sidebar1.id)).getAttribute('label'),
+ 'foo',
+ 'the menuitem label was updated');
+
+ assert.equal(document.getElementById('sidebar-title').value, 'foo', 'the sidebar title was updated');
+
+ sidebar1.destroy();
+}
+
+exports.testURLSetter = function*(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testURLSetter';
+ let window = getMostRecentBrowserWindow();
+ let { document } = window;
+ let url = 'data:text/html;charset=utf-8,'+testName;
+
+ let sidebar1 = Sidebar({
+ id: testName,
+ title: testName,
+ url: url
+ });
+
+ assert.equal(sidebar1.url, url, 'url getter works');
+ assert.equal(isShowing(sidebar1), false, 'the sidebar is not showing');
+ assert.ok(!isChecked(document.getElementById(makeID(sidebar1.id))),
+ 'the menuitem is not checked');
+ assert.equal(isSidebarShowing(window), false, 'the new window sidebar is not showing');
+
+ window = yield windowPromise(window.OpenBrowserWindow(), 'load');
+ document = window.document;
+ assert.pass('new window was opened');
+
+ yield sidebar1.show();
+
+ assert.equal(isShowing(sidebar1), true, 'the sidebar is showing');
+ assert.ok(isChecked(document.getElementById(makeID(sidebar1.id))),
+ 'the menuitem is checked');
+ assert.ok(isSidebarShowing(window), 'the new window sidebar is showing');
+
+ yield new Promise(resolve => {
+ sidebar1.once('show', resolve);
+ sidebar1.url = (url + '1');
+ assert.equal(sidebar1.url, (url + '1'), 'url getter works');
+ assert.equal(isShowing(sidebar1), true, 'the sidebar is showing');
+ assert.ok(isSidebarShowing(window), 'the new window sidebar is showing');
+ });
+
+ assert.pass('setting the sidebar.url causes a show event');
+
+ assert.equal(isShowing(sidebar1), true, 'the sidebar is showing');
+ assert.equal(isSidebarShowing(window), true, 'the new window sidebar is still showing');
+
+ assert.ok(isChecked(document.getElementById(makeID(sidebar1.id))),
+ 'the menuitem is still checked');
+
+ sidebar1.destroy();
+ assert.equal(isSidebarShowing(window), false, 'the new window sidebar is not showing');
+}
+
+exports.testDuplicateID = function(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testDuplicateID';
+ let window = getMostRecentBrowserWindow();
+ let { document } = window;
+ let url = 'data:text/html;charset=utf-8,'+testName;
+
+ let sidebar1 = Sidebar({
+ id: testName,
+ title: testName,
+ url: url
+ });
+
+ assert.throws(function() {
+ Sidebar({
+ id: testName,
+ title: testName + 1,
+ url: url + 2
+ }).destroy();
+ }, /The ID .+ seems already used\./i, 'duplicate IDs will throw errors');
+
+ sidebar1.destroy();
+}
+
+exports.testURLSetterToSameValueReloadsSidebar = function*(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testURLSetterToSameValueReloadsSidebar';
+ let window = getMostRecentBrowserWindow();
+ let { document } = window;
+ let url = 'data:text/html;charset=utf-8,'+testName;
+
+ let sidebar1 = Sidebar({
+ id: testName,
+ title: testName,
+ url: url
+ });
+
+ assert.equal(sidebar1.url, url, 'url getter works');
+ assert.equal(isShowing(sidebar1), false, 'the sidebar is not showing');
+ assert.ok(!isChecked(document.getElementById(makeID(sidebar1.id))),
+ 'the menuitem is not checked');
+ assert.equal(isSidebarShowing(window), false, 'the new window sidebar is not showing');
+
+ window = yield windowPromise(window.OpenBrowserWindow(), 'load');
+ document = window.document;
+ assert.pass('new window was opened');
+
+ yield focus(window);
+ assert.pass('new window was focused');
+
+ yield sidebar1.show();
+
+ assert.equal(isShowing(sidebar1), true, 'the sidebar is showing');
+ assert.ok(isChecked(document.getElementById(makeID(sidebar1.id))),
+ 'the menuitem is checked');
+ assert.ok(isSidebarShowing(window), 'the new window sidebar is showing');
+
+ let shown = defer();
+ sidebar1.once('show', shown.resolve);
+ sidebar1.url = url;
+
+ assert.equal(sidebar1.url, url, 'url getter works');
+ assert.equal(isShowing(sidebar1), true, 'the sidebar is showing');
+ assert.ok(isSidebarShowing(window), 'the new window sidebar is showing');
+
+ yield shown.promise;
+
+ assert.pass('setting the sidebar.url causes a show event');
+
+ assert.equal(isShowing(sidebar1), true, 'the sidebar is showing');
+ assert.ok(isSidebarShowing(window), 'the new window sidebar is still showing');
+
+ assert.ok(isChecked(document.getElementById(makeID(sidebar1.id))),
+ 'the menuitem is still checked');
+
+ sidebar1.destroy();
+}
+
+exports.testShowingInOneWindowDoesNotAffectOtherWindows = function*(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testShowingInOneWindowDoesNotAffectOtherWindows';
+ let window1 = getMostRecentBrowserWindow();
+ let url = 'data:text/html;charset=utf-8,'+testName;
+
+ let sidebar1 = Sidebar({
+ id: testName,
+ title: testName,
+ url: url
+ });
+
+ assert.equal(sidebar1.url, url, 'url getter works');
+ assert.equal(isShowing(sidebar1), false, 'the sidebar is not showing');
+ let checkCount = 1;
+ function checkSidebarShowing(window, expected) {
+ assert.pass('check count ' + checkCount++);
+
+ let mi = window.document.getElementById(makeID(sidebar1.id));
+ if (mi) {
+ assert.equal(isChecked(mi), expected,
+ 'the menuitem is not checked');
+ }
+ assert.equal(isSidebarShowing(window), expected || false, 'the new window sidebar is not showing');
+ }
+ checkSidebarShowing(window1, false);
+
+ let window = yield windowPromise(window1.OpenBrowserWindow(), 'load');
+ let { document } = window;
+ assert.pass('new window was opened!');
+
+ // waiting for show
+ yield sidebar1.show();
+
+ // check state of the new window
+ assert.equal(isShowing(sidebar1), true, 'the sidebar is showing');
+ checkSidebarShowing(window, true);
+
+ // check state of old window
+ checkSidebarShowing(window1, false);
+
+ yield sidebar1.show();
+
+ // check state of the new window
+ assert.equal(isShowing(sidebar1), true, 'the sidebar is showing');
+ checkSidebarShowing(window, true);
+
+ // check state of old window
+ checkSidebarShowing(window1, false);
+
+ // calling destroy() twice should not matter
+ sidebar1.destroy();
+ sidebar1.destroy();
+
+ // check state of the new window
+ assert.equal(isShowing(sidebar1), false, 'the sidebar is not showing');
+ checkSidebarShowing(window, undefined);
+
+ // check state of old window
+ checkSidebarShowing(window1, undefined);
+}
+
+exports.testHidingAHiddenSidebarRejects = function*(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testHidingAHiddenSidebarRejects';
+ let url = 'data:text/html;charset=utf-8,'+testName;
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName,
+ url: url
+ });
+
+ yield sidebar.hide().then(assert.fail, assert.pass);
+
+ sidebar.destroy();
+}
+
+exports.testGCdSidebarsOnUnload = function*(assert) {
+ const loader = Loader(module);
+ const { Sidebar } = loader.require('sdk/ui/sidebar');
+ const window = getMostRecentBrowserWindow();
+
+ let testName = 'testGCdSidebarsOnUnload';
+ let url = 'data:text/html;charset=utf-8,'+testName;
+
+ assert.equal(isSidebarShowing(window), false, 'the sidebar is not showing');
+
+ // IMPORTANT: make no reference to the sidebar instance, so it is GC'd
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName,
+ url: url
+ });
+
+ yield sidebar.show();
+ sidebar = null;
+
+ assert.equal(isSidebarShowing(window), true, 'the sidebar is showing');
+
+ let menuitemID = makeID(testName);
+
+ assert.ok(window.document.getElementById(menuitemID), 'the menuitem was found');
+
+ yield new Promise(resolve => Cu.schedulePreciseGC(resolve));
+
+ loader.unload();
+
+ assert.equal(isSidebarShowing(window), false, 'the sidebar is not showing after unload');
+ assert.ok(!window.document.getElementById(menuitemID), 'the menuitem was removed');
+}
+
+exports.testGCdShowingSidebarsOnUnload = function*(assert) {
+ const loader = Loader(module);
+ const { Sidebar } = loader.require('sdk/ui/sidebar');
+ const window = getMostRecentBrowserWindow();
+
+ let testName = 'testGCdShowingSidebarsOnUnload';
+ let url = 'data:text/html;charset=utf-8,'+testName;
+
+ assert.equal(isSidebarShowing(window), false, 'the sidebar is not showing');
+
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName,
+ url: url
+ });
+
+ yield sidebar.show();
+
+ sidebar = null;
+
+ assert.equal(isSidebarShowing(window), true, 'the sidebar is showing');
+
+ let menuitemID = makeID(testName);
+
+ assert.ok(!!window.document.getElementById(menuitemID), 'the menuitem was found');
+
+ yield new Promise(resolve => Cu.schedulePreciseGC(resolve));
+
+ assert.equal(isSidebarShowing(window), true, 'the sidebar is still showing after gc');
+ assert.ok(!!window.document.getElementById(menuitemID), 'the menuitem was found after gc');
+
+ loader.unload();
+
+ assert.equal(isSidebarShowing(window), false, 'the sidebar is not showing after unload');
+ assert.ok(!window.document.getElementById(menuitemID), 'the menuitem was removed');
+}
+
+exports.testDetachEventOnWindowClose = function*(assert) {
+ const loader = Loader(module);
+ const { Sidebar } = loader.require('sdk/ui/sidebar');
+ let window = getMostRecentBrowserWindow();
+
+ let testName = 'testDetachEventOnWindowClose';
+ let url = 'data:text/html;charset=utf-8,' + testName;
+
+ window = yield windowPromise(window.OpenBrowserWindow(), 'load').then(focus);
+
+ yield new Promise(resolve => {
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName,
+ url: url,
+ onAttach: function() {
+ assert.pass('the attach event is fired');
+ window.close();
+ },
+ onDetach: resolve
+ });
+
+ sidebar.show();
+ });
+
+ assert.pass('the detach event is fired when the window showing it closes');
+ loader.unload();
+}
+
+exports.testHideEventOnWindowClose = function*(assert) {
+ const loader = Loader(module);
+ const { Sidebar } = loader.require('sdk/ui/sidebar');
+ let window = getMostRecentBrowserWindow();
+
+ let testName = 'testDetachEventOnWindowClose';
+ let url = 'data:text/html;charset=utf-8,' + testName;
+
+
+ window = yield windowPromise(window.OpenBrowserWindow(), 'load').then(focus);
+ yield new Promise(resolve => {
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName,
+ url: url,
+ onAttach: function() {
+ assert.pass('the attach event is fired');
+ window.close();
+ },
+ onHide: resolve
+ });
+
+ sidebar.show();
+ });
+
+ assert.pass('the hide event is fired when the window showing it closes');
+ loader.unload();
+}
+
+exports.testGCdHiddenSidebarsOnUnload = function*(assert) {
+ const loader = Loader(module);
+ const { Sidebar } = loader.require('sdk/ui/sidebar');
+ const window = getMostRecentBrowserWindow();
+
+ let testName = 'testGCdHiddenSidebarsOnUnload';
+ let url = 'data:text/html;charset=utf-8,'+testName;
+
+ assert.equal(isSidebarShowing(window), false, 'the sidebar is not showing');
+
+ // IMPORTANT: make no reference to the sidebar instance, so it is GC'd
+ Sidebar({
+ id: testName,
+ title: testName,
+ url: url
+ });
+
+ let menuitemID = makeID(testName);
+
+ assert.ok(!!window.document.getElementById(menuitemID), 'the menuitem was found');
+
+ yield new Promise(resolve => Cu.schedulePreciseGC(resolve));
+
+ assert.ok(!!window.document.getElementById(menuitemID), 'the menuitem was found after gc');
+
+ loader.unload();
+
+ assert.ok(!window.document.getElementById(menuitemID), 'the menuitem was removed');
+}
+
+exports.testSidebarGettersAndSettersAfterDestroy = function(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testSidebarGettersAndSettersAfterDestroy';
+ let url = 'data:text/html;charset=utf-8,'+testName;
+
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName,
+ url: url
+ });
+
+ sidebar.destroy();
+
+ assert.equal(sidebar.id, undefined, 'sidebar after destroy has no id');
+
+ assert.throws(() => sidebar.id = 'foo-tang',
+ /^setting a property that has only a getter/,
+ 'id cannot be set at runtime');
+
+ assert.equal(sidebar.id, undefined, 'sidebar after destroy has no id');
+
+ assert.equal(sidebar.title, undefined, 'sidebar after destroy has no title');
+ sidebar.title = 'boo-tang';
+ assert.equal(sidebar.title, undefined, 'sidebar after destroy has no title');
+
+ assert.equal(sidebar.url, undefined, 'sidebar after destroy has no url');
+ sidebar.url = url + 'barz';
+ assert.equal(sidebar.url, undefined, 'sidebar after destroy has no url');
+}
+
+
+exports.testSidebarLeakCheckDestroyAfterAttach = function*(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testSidebarLeakCheckDestroyAfterAttach';
+ let window = getMostRecentBrowserWindow();
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName,
+ url: 'data:text/html;charset=utf-8,'+testName
+ });
+
+ yield new Promise(resolve => {
+ sidebar.on('attach', resolve);
+ assert.pass('showing the sidebar');
+ sidebar.show();
+ })
+
+ assert.pass('the sidebar was shown');
+
+ sidebar.on('show', () => {
+ assert.fail('the sidebar show listener should have been removed');
+ });
+ assert.pass('added a sidebar show listener');
+
+ sidebar.on('hide', () => {
+ assert.fail('the sidebar hide listener should have been removed');
+ });
+ assert.pass('added a sidebar hide listener');
+
+ yield new Promise(resolve => {
+ let panelBrowser = window.document.getElementById('sidebar').contentDocument.getElementById('web-panels-browser');
+ panelBrowser.contentWindow.addEventListener('unload', function onUnload() {
+ panelBrowser.contentWindow.removeEventListener('unload', onUnload, false);
+ resolve();
+ }, false);
+ sidebar.destroy();
+ });
+
+ assert.pass('the sidebar web panel was unloaded properly');
+}
+
+exports.testSidebarLeakCheckUnloadAfterAttach = function*(assert) {
+ const loader = Loader(module);
+ const { Sidebar } = loader.require('sdk/ui/sidebar');
+ let testName = 'testSidebarLeakCheckUnloadAfterAttach';
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName,
+ url: 'data:text/html;charset=utf-8,'+testName
+ });
+
+ let window = yield open().then(focus);
+
+ yield new Promise(resolve => {
+ sidebar.on('attach', resolve);
+ assert.pass('showing the sidebar');
+ sidebar.show();
+ });
+
+ assert.pass('the sidebar was shown');
+
+ sidebar.on('show', function() {
+ assert.fail('the sidebar show listener should have been removed');
+ });
+ assert.pass('added a sidebar show listener');
+
+ sidebar.on('hide', function() {
+ assert.fail('the sidebar hide listener should have been removed');
+ });
+ assert.pass('added a sidebar hide listener');
+
+ let panelBrowser = window.document.getElementById('sidebar').contentDocument.getElementById('web-panels-browser');
+ yield new Promise(resolve => {
+ panelBrowser.contentWindow.addEventListener('unload', function onUnload() {
+ panelBrowser.contentWindow.removeEventListener('unload', onUnload, false);
+ resolve();
+ }, false);
+ loader.unload();
+ });
+
+ assert.pass('the sidebar web panel was unloaded properly');
+}
+
+exports.testTwoSidebarsWithSameTitleAndURL = function(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testTwoSidebarsWithSameTitleAndURL';
+
+ let title = testName;
+ let url = 'data:text/html;charset=utf-8,' + testName;
+
+ let sidebar1 = Sidebar({
+ id: testName + 1,
+ title: title,
+ url: url
+ });
+
+ assert.throws(function() {
+ Sidebar({
+ id: testName + 2,
+ title: title,
+ url: url
+ }).destroy();
+ }, /title.+url.+invalid/i, 'Creating two sidebars with the same title + url is not allowed');
+
+ let sidebar2 = Sidebar({
+ id: testName + 2,
+ title: title,
+ url: 'data:text/html;charset=utf-8,X'
+ });
+
+ assert.throws(function() {
+ sidebar2.url = url;
+ }, /title.+url.+invalid/i, 'Creating two sidebars with the same title + url is not allowed');
+
+ sidebar2.title = 'foo';
+ sidebar2.url = url;
+
+ assert.throws(function() {
+ sidebar2.title = title;
+ }, /title.+url.+invalid/i, 'Creating two sidebars with the same title + url is not allowed');
+
+ sidebar1.destroy();
+ sidebar2.destroy();
+}
+
+exports.testChangingURLBackToOriginalValue = function(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testChangingURLBackToOriginalValue';
+
+ let title = testName;
+ let url = 'data:text/html;charset=utf-8,' + testName;
+ let count = 0;
+
+ let sidebar = Sidebar({
+ id: testName,
+ title: title,
+ url: url
+ });
+
+ sidebar.url = url + 2;
+ assert.equal(sidebar.url, url + 2, 'the sidebar.url is correct');
+ sidebar.url = url;
+ assert.equal(sidebar.url, url, 'the sidebar.url is correct');
+
+ sidebar.title = 'foo';
+ assert.equal(sidebar.title, 'foo', 'the sidebar.title is correct');
+ sidebar.title = title;
+ assert.equal(sidebar.title, title, 'the sidebar.title is correct');
+
+ sidebar.destroy();
+
+ assert.pass('Changing values back to originals works');
+}
+
+exports.testShowToOpenXToClose = function*(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testShowToOpenXToClose';
+
+ let title = testName;
+ let url = 'data:text/html;charset=utf-8,' + testName;
+ let window = getMostRecentBrowserWindow();
+ let shown = defer();
+ let hidden = defer();
+
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName,
+ url: url,
+ onShow: shown.resolve,
+ onHide: hidden.resolve
+ });
+
+ let menuitem = window.document.getElementById(makeID(sidebar.id));
+
+ assert.ok(!isChecked(menuitem), 'menuitem is not checked');
+
+ sidebar.show();
+
+ yield shown.promise;
+
+ assert.ok(isChecked(menuitem), 'menuitem is checked');
+
+ let closeButton = window.document.querySelector('#sidebar-header > toolbarbutton.close-icon');
+ simulateCommand(closeButton);
+
+ yield hidden.promise;
+
+ assert.ok(!isChecked(menuitem), 'menuitem is not checked');
+
+ sidebar.destroy();
+}
+
+exports.testShowToOpenMenuitemToClose = function*(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testShowToOpenMenuitemToClose';
+
+ let title = testName;
+ let url = 'data:text/html;charset=utf-8,' + testName;
+ let window = getMostRecentBrowserWindow();
+
+ let hidden = defer();
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName,
+ url: url,
+ onHide: hidden.resolve
+ });
+
+ let menuitem = window.document.getElementById(makeID(sidebar.id));
+
+ assert.ok(!isChecked(menuitem), 'menuitem is not checked');
+
+ yield sidebar.show();
+
+ assert.ok(isChecked(menuitem), 'menuitem is checked');
+
+ simulateCommand(menuitem);
+
+ yield hidden.promise;
+
+ assert.ok(!isChecked(menuitem), 'menuitem is not checked');
+
+ sidebar.destroy();
+}
+
+exports.testDestroyWhileNonBrowserWindowIsOpen = function*(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testDestroyWhileNonBrowserWindowIsOpen';
+ let url = 'data:text/html;charset=utf-8,' + testName;
+
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName,
+ url: url
+ });
+
+ let window = yield open('chrome://browser/content/aboutDialog.xul');
+
+ yield sidebar.show();
+ assert.equal(isSidebarShowing(getMostRecentBrowserWindow()), true, 'the sidebar is showing');
+
+ sidebar.destroy();
+ assert.pass('sidebar was destroyed while a non browser window was open');
+
+ yield cleanUI();
+ assert.equal(isSidebarShowing(getMostRecentBrowserWindow()), false, 'the sidebar is not showing');
+}
+
+exports.testEventListeners = function*(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testWhatThisIsInSidebarEventListeners';
+ let eventListenerOrder = [];
+
+ let constructorOnShow = defer();
+ let constructorOnHide = defer();
+ let constructorOnAttach = defer();
+ let constructorOnReady = defer();
+
+ let onShow = defer();
+ let onHide = defer();
+ let onAttach = defer();
+ let onReady = defer();
+
+ let onceShow = defer();
+ let onceHide = defer();
+ let onceAttach = defer();
+ let onceReady = defer();
+
+ function testThis() {
+ assert(this, sidebar, '`this` is correct');
+ }
+
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName,
+ url: 'data:text/html;charset=utf-8,' + testName,
+ onShow: function() {
+ assert.equal(this, sidebar, '`this` is correct in onShow');
+ eventListenerOrder.push('onShow');
+ constructorOnShow.resolve();
+ },
+ onAttach: function() {
+ assert.equal(this, sidebar, '`this` is correct in onAttach');
+ eventListenerOrder.push('onAttach');
+ constructorOnAttach.resolve();
+ },
+ onReady: function() {
+ assert.equal(this, sidebar, '`this` is correct in onReady');
+ eventListenerOrder.push('onReady');
+ constructorOnReady.resolve();
+ },
+ onHide: function() {
+ assert.equal(this, sidebar, '`this` is correct in onHide');
+ eventListenerOrder.push('onHide');
+ constructorOnHide.resolve();
+ }
+ });
+
+ sidebar.once('show', function() {
+ assert.equal(this, sidebar, '`this` is correct in once show');
+ eventListenerOrder.push('once show');
+ onceShow.resolve();
+ });
+ sidebar.once('attach', function() {
+ assert.equal(this, sidebar, '`this` is correct in once attach');
+ eventListenerOrder.push('once attach');
+ onceAttach.resolve();
+ });
+ sidebar.once('ready', function() {
+ assert.equal(this, sidebar, '`this` is correct in once ready');
+ eventListenerOrder.push('once ready');
+ onceReady.resolve();
+ });
+ sidebar.once('hide', function() {
+ assert.equal(this, sidebar, '`this` is correct in once hide');
+ eventListenerOrder.push('once hide');
+ onceHide.resolve();
+ });
+
+ sidebar.on('show', function() {
+ assert.equal(this, sidebar, '`this` is correct in on show');
+ eventListenerOrder.push('on show');
+ onShow.resolve();
+
+ sidebar.hide();
+ });
+ sidebar.on('attach', function() {
+ assert.equal(this, sidebar, '`this` is correct in on attach');
+ eventListenerOrder.push('on attach');
+ onAttach.resolve();
+ });
+ sidebar.on('ready', function() {
+ assert.equal(this, sidebar, '`this` is correct in on ready');
+ eventListenerOrder.push('on ready');
+ onReady.resolve();
+ });
+ sidebar.on('hide', function() {
+ assert.equal(this, sidebar, '`this` is correct in on hide');
+ eventListenerOrder.push('on hide');
+ onHide.resolve();
+ });
+
+ sidebar.show();
+
+ yield all([constructorOnShow.promise,
+ constructorOnAttach.promise,
+ constructorOnReady.promise,
+ constructorOnHide.promise,
+ onceShow.promise,
+ onceAttach.promise,
+ onceReady.promise,
+ onceHide.promise,
+ onShow.promise,
+ onAttach.promise,
+ onReady.promise,
+ onHide.promise]);
+
+ assert.equal(eventListenerOrder.join(), [
+ 'onAttach',
+ 'once attach',
+ 'on attach',
+ 'onReady',
+ 'once ready',
+ 'on ready',
+ 'onShow',
+ 'once show',
+ 'on show',
+ 'onHide',
+ 'once hide',
+ 'on hide'
+ ].join(), 'the event order was correct');
+
+ sidebar.destroy();
+}
+
+// For more information see Bug 920780
+exports.testAttachDoesNotEmitWhenShown = function*(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+ let testName = 'testAttachDoesNotEmitWhenShown';
+ let count = 0;
+
+ let attached = defer();
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName,
+ url: 'data:text/html;charset=utf-8,'+testName,
+ onAttach: function() {
+ if (count > 2) {
+ assert.fail('sidebar was attached again..');
+ }
+ else {
+ assert.pass('sidebar was attached ' + count + ' time(s)');
+ }
+
+ count++;
+ attached.resolve();
+ }
+ });
+
+ sidebar.show();
+
+ yield attached.promise;
+
+ let shownFired = 0;
+ let onShow = () => shownFired++;
+ sidebar.on('show', onShow);
+
+ yield sidebar.show();
+ assert.equal(shownFired, 0, 'shown should not be fired again when already showing from after attach');
+
+ yield sidebar.hide();
+ assert.pass("the sidebar was hidden");
+
+ yield sidebar.show();
+ assert.equal(shownFired, 1, 'shown was emitted when `show` called after being hidden');
+
+ yield sidebar.show();
+ assert.equal(shownFired, 1, 'shown was not emitted again if already being shown');
+
+ sidebar.off('show', onShow);
+ sidebar.destroy();
+}
+
+exports.testShowHideRawWindowArg = function*(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+
+ let testName = 'testShowHideRawWindowArg';
+
+ assert.pass("Creating sidebar");
+
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName,
+ url: 'data:text/html;charset=utf-8,' + testName
+ });
+
+ assert.pass("Created sidebar");
+
+ let mainWindow = getMostRecentBrowserWindow();
+ let newWindow = yield windowPromise(mainWindow.OpenBrowserWindow(), 'load');
+ assert.pass("Created the new window");
+
+ yield focus(newWindow);
+ assert.pass("Focused the new window");
+
+ let newWindow2 = yield windowPromise(mainWindow.OpenBrowserWindow(), 'load');
+ assert.pass("Created the second new window");
+
+ yield focus(newWindow2);
+ assert.pass("Focused the second new window");
+
+ yield sidebar.show(newWindow);
+
+ assert.pass('the sidebar was shown');
+ assert.equal(isSidebarShowing(mainWindow), false, 'sidebar is not showing in main window');
+ assert.equal(isSidebarShowing(newWindow2), false, 'sidebar is not showing in second window');
+ assert.equal(isSidebarShowing(newWindow), true, 'sidebar is showing in new window');
+
+ assert.ok(isFocused(newWindow2), 'main window is still focused');
+
+ yield sidebar.hide(newWindow);
+
+ assert.equal(isFocused(newWindow2), true, 'second window is still focused');
+ assert.equal(isSidebarShowing(mainWindow), false, 'sidebar is not showing in main window');
+ assert.equal(isSidebarShowing(newWindow2), false, 'sidebar is not showing in second window');
+ assert.equal(isSidebarShowing(newWindow), false, 'sidebar is not showing in new window');
+
+ sidebar.destroy();
+}
+
+exports.testShowHideSDKWindowArg = function*(assert) {
+ const { Sidebar } = require('sdk/ui/sidebar');
+
+ let testName = 'testShowHideSDKWindowArg';
+ let sidebar = Sidebar({
+ id: testName,
+ title: testName,
+ url: 'data:text/html;charset=utf-8,' + testName
+ });
+
+ let mainWindow = getMostRecentBrowserWindow();
+ let newWindow = yield open().then(focus);
+ let newSDKWindow = modelFor(newWindow);
+
+ yield focus(mainWindow);
+
+ yield sidebar.show(newSDKWindow);
+
+ assert.pass('the sidebar was shown');
+ assert.ok(!isSidebarShowing(mainWindow), 'sidebar is not showing in main window');
+ assert.ok(isSidebarShowing(newWindow), 'sidebar is showing in new window');
+
+ assert.ok(isFocused(mainWindow), 'main window is still focused');
+
+ yield sidebar.hide(newSDKWindow);
+
+ assert.ok(isFocused(mainWindow), 'main window is still focused');
+ assert.ok(!isSidebarShowing(mainWindow), 'sidebar is not showing in main window');
+ assert.ok(!isSidebarShowing(newWindow), 'sidebar is not showing in new window');
+ sidebar.destroy();
+}
+
+before(exports, (name, assert) => {
+ assert.equal(isSidebarShowing(), false, 'no sidebar is showing');
+});
+
+after(exports, function*(name, assert) {
+ assert.pass("Cleaning new windows and tabs");
+ yield cleanUI();
+ assert.equal(isSidebarShowing(), false, 'no sidebar is showing');
+});
+
+require('sdk/test').run(exports);