michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: 'use strict'; michael@0: michael@0: module.metadata = { michael@0: 'engines': { michael@0: 'Firefox': '*' michael@0: } michael@0: }; michael@0: michael@0: const { Cu } = require('chrome'); michael@0: const { Loader } = require('sdk/test/loader'); michael@0: const { show, hide } = require('sdk/ui/sidebar/actions'); michael@0: const { isShowing } = require('sdk/ui/sidebar/utils'); michael@0: const { getMostRecentBrowserWindow } = require('sdk/window/utils'); michael@0: const { open, close, focus, promise: windowPromise } = require('sdk/window/helpers'); michael@0: const { setTimeout, setImmediate } = require('sdk/timers'); michael@0: const { isPrivate } = require('sdk/private-browsing'); michael@0: const data = require('./fixtures'); michael@0: const { URL } = require('sdk/url'); michael@0: const { once, off, emit } = require('sdk/event/core'); michael@0: const { defer, all } = require('sdk/core/promise'); michael@0: michael@0: const { BUILTIN_SIDEBAR_MENUITEMS, isSidebarShowing, michael@0: getSidebarMenuitems, getExtraSidebarMenuitems, makeID, simulateCommand, michael@0: simulateClick, isChecked } = require('./sidebar/utils'); michael@0: michael@0: exports.testSidebarBasicLifeCycle = function(assert, done) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testSidebarBasicLifeCycle'; michael@0: let window = getMostRecentBrowserWindow(); michael@0: assert.ok(!window.document.getElementById(makeID(testName)), 'sidebar id DNE'); michael@0: let sidebarXUL = window.document.getElementById('sidebar'); michael@0: assert.ok(sidebarXUL, 'sidebar xul element does exist'); michael@0: assert.ok(!getExtraSidebarMenuitems().length, 'there are no extra sidebar menuitems'); michael@0: michael@0: assert.equal(isSidebarShowing(window), false, 'sidebar is not showing 1'); michael@0: let sidebarDetails = { michael@0: id: testName, michael@0: title: 'test', michael@0: url: 'data:text/html;charset=utf-8,'+testName michael@0: }; michael@0: let sidebar = Sidebar(sidebarDetails); michael@0: michael@0: // test the sidebar attributes michael@0: for (let key of Object.keys(sidebarDetails)) { michael@0: assert.equal(sidebarDetails[key], sidebar[key], 'the attributes match the input'); michael@0: } michael@0: michael@0: assert.pass('The Sidebar constructor worked'); michael@0: michael@0: let extraMenuitems = getExtraSidebarMenuitems(); michael@0: assert.equal(extraMenuitems.length, 1, 'there is one extra sidebar menuitems'); michael@0: michael@0: let ele = window.document.getElementById(makeID(testName)); michael@0: assert.equal(ele, extraMenuitems[0], 'the only extra menuitem is the one for our sidebar.') michael@0: assert.ok(ele, 'sidebar element was added'); michael@0: assert.ok(!isChecked(ele), 'the sidebar is not displayed'); michael@0: assert.equal(ele.getAttribute('label'), sidebar.title, 'the sidebar title is the menuitem label') michael@0: michael@0: assert.equal(isSidebarShowing(window), false, 'sidebar is not showing 2'); michael@0: sidebar.on('show', function() { michael@0: assert.pass('the show event was fired'); michael@0: assert.equal(isSidebarShowing(window), true, 'sidebar is not showing 3'); michael@0: assert.equal(isShowing(sidebar), true, 'the sidebar is showing'); michael@0: assert.ok(isChecked(ele), 'the sidebar is displayed'); michael@0: michael@0: sidebar.once('hide', function() { michael@0: assert.pass('the hide event was fired'); michael@0: assert.ok(!isChecked(ele), 'the sidebar menuitem is not checked'); michael@0: assert.equal(isShowing(sidebar), false, 'the sidebar is not showing'); michael@0: assert.equal(isSidebarShowing(window), false, 'the sidebar elemnt is hidden'); michael@0: michael@0: sidebar.once('detach', function() { michael@0: // calling destroy twice should not matter michael@0: sidebar.destroy(); michael@0: sidebar.destroy(); michael@0: michael@0: let sidebarMI = getSidebarMenuitems(); michael@0: for (let mi of sidebarMI) { michael@0: assert.ok(BUILTIN_SIDEBAR_MENUITEMS.indexOf(mi.getAttribute('id')) >= 0, 'the menuitem is for a built-in sidebar') michael@0: assert.ok(!isChecked(mi), 'no sidebar menuitem is checked'); michael@0: } michael@0: michael@0: assert.ok(!window.document.getElementById(makeID(testName)), 'sidebar id DNE'); michael@0: assert.pass('calling destroy worked without error'); michael@0: michael@0: done(); michael@0: }); michael@0: }); michael@0: michael@0: sidebar.hide(); michael@0: assert.pass('hiding sidebar..'); michael@0: }); michael@0: michael@0: sidebar.show(); michael@0: assert.pass('showing sidebar..'); michael@0: } michael@0: michael@0: exports.testSideBarIsInNewWindows = function(assert, done) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testSideBarIsInNewWindows'; michael@0: let sidebar = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: 'data:text/html;charset=utf-8,'+testName michael@0: }); michael@0: michael@0: let startWindow = getMostRecentBrowserWindow(); michael@0: let ele = startWindow.document.getElementById(makeID(testName)); michael@0: assert.ok(ele, 'sidebar element was added'); michael@0: michael@0: open().then(function(window) { michael@0: let ele = window.document.getElementById(makeID(testName)); michael@0: assert.ok(ele, 'sidebar element was added'); michael@0: michael@0: // calling destroy twice should not matter michael@0: sidebar.destroy(); michael@0: sidebar.destroy(); michael@0: michael@0: assert.ok(!window.document.getElementById(makeID(testName)), 'sidebar id DNE'); michael@0: assert.ok(!startWindow.document.getElementById(makeID(testName)), 'sidebar id DNE'); michael@0: michael@0: close(window).then(done, assert.fail); michael@0: }) michael@0: } michael@0: michael@0: exports.testSideBarIsShowingInNewWindows = function(assert, done) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testSideBarIsShowingInNewWindows'; michael@0: let sidebar = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: URL('data:text/html;charset=utf-8,'+testName) michael@0: }); michael@0: michael@0: let startWindow = getMostRecentBrowserWindow(); michael@0: let ele = startWindow.document.getElementById(makeID(testName)); michael@0: assert.ok(ele, 'sidebar element was added'); michael@0: michael@0: let oldEle = ele; michael@0: sidebar.once('attach', function() { michael@0: assert.pass('attach event fired'); michael@0: michael@0: sidebar.once('show', function() { michael@0: assert.pass('show event fired'); michael@0: michael@0: sidebar.once('show', function() { michael@0: let window = getMostRecentBrowserWindow(); michael@0: assert.notEqual(startWindow, window, 'window is new'); michael@0: michael@0: let sb = window.document.getElementById('sidebar'); michael@0: if (sb && sb.docShell && sb.contentDocument && sb.contentDocument.getElementById('web-panels-browser')) { michael@0: end(); michael@0: } michael@0: else { michael@0: sb.addEventListener('DOMWindowCreated', end, false); michael@0: } michael@0: michael@0: function end() { michael@0: sb.removeEventListener('DOMWindowCreated', end, false); michael@0: let webPanelBrowser = sb.contentDocument.getElementById('web-panels-browser'); michael@0: michael@0: let ele = window.document.getElementById(makeID(testName)); michael@0: michael@0: assert.ok(ele, 'sidebar element was added 2'); michael@0: assert.ok(isChecked(ele), 'the sidebar is checked'); michael@0: assert.notEqual(ele, oldEle, 'there are two different sidebars'); michael@0: michael@0: assert.equal(isShowing(sidebar), true, 'the sidebar is showing in new window'); michael@0: michael@0: michael@0: sidebar.destroy(); michael@0: michael@0: assert.equal(isShowing(sidebar), false, 'the sidebar is not showing'); michael@0: assert.ok(!isSidebarShowing(window), 'sidebar in most recent window is not showing'); michael@0: assert.ok(!isSidebarShowing(startWindow), 'sidebar in most start window is not showing'); michael@0: assert.ok(!window.document.getElementById(makeID(testName)), 'sidebar id DNE'); michael@0: assert.ok(!startWindow.document.getElementById(makeID(testName)), 'sidebar id DNE'); michael@0: michael@0: setTimeout(function() { michael@0: close(window).then(done, assert.fail); michael@0: }); michael@0: } michael@0: }); michael@0: michael@0: startWindow.OpenBrowserWindow(); michael@0: }); michael@0: }); michael@0: michael@0: show(sidebar); michael@0: assert.pass('showing the sidebar'); michael@0: } michael@0: michael@0: // TODO: determine if this is acceptable.. michael@0: /* michael@0: exports.testAddonGlobalSimple = function(assert, done) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testAddonGlobalSimple'; michael@0: let sidebar = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: data.url('test-sidebar-addon-global.html') michael@0: }); michael@0: michael@0: sidebar.on('show', function({worker}) { michael@0: assert.pass('sidebar was attached'); michael@0: assert.ok(!!worker, 'attach event has worker'); michael@0: michael@0: worker.port.on('X', function(msg) { michael@0: assert.equal(msg, '23', 'the final message is correct'); michael@0: michael@0: sidebar.destroy(); michael@0: michael@0: done(); michael@0: }); michael@0: worker.port.emit('X', '2'); michael@0: }); michael@0: show(sidebar); michael@0: } michael@0: */ michael@0: michael@0: exports.testAddonGlobalComplex = function(assert, done) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testAddonGlobalComplex'; michael@0: let sidebar = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: data.url('test-sidebar-addon-global.html') michael@0: }); michael@0: michael@0: sidebar.on('attach', function(worker) { michael@0: assert.pass('sidebar was attached'); michael@0: assert.ok(!!worker, 'attach event has worker'); michael@0: michael@0: worker.port.once('Y', function(msg) { michael@0: assert.equal(msg, '1', 'got event from worker'); michael@0: michael@0: worker.port.on('X', function(msg) { michael@0: assert.equal(msg, '123', 'the final message is correct'); michael@0: michael@0: sidebar.destroy(); michael@0: michael@0: done(); michael@0: }); michael@0: worker.port.emit('X', msg + '2'); michael@0: }) michael@0: }); michael@0: michael@0: show(sidebar); michael@0: } michael@0: michael@0: exports.testAddonReady = function(assert, done) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testAddonReady'; michael@0: let sidebar = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: data.url('test-sidebar-addon-global.html'), michael@0: onReady: function(worker) { michael@0: assert.pass('sidebar was attached'); michael@0: assert.ok(!!worker, 'attach event has worker'); michael@0: michael@0: worker.port.on('X', function(msg) { michael@0: assert.equal(msg, '123', 'the final message is correct'); michael@0: michael@0: sidebar.destroy(); michael@0: michael@0: done(); michael@0: }); michael@0: michael@0: worker.port.emit('X', '12'); michael@0: } michael@0: }); michael@0: michael@0: show(sidebar); michael@0: } michael@0: michael@0: exports.testShowingOneSidebarAfterAnother = function(assert, done) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testShowingOneSidebarAfterAnother'; michael@0: michael@0: let sidebar1 = Sidebar({ michael@0: id: testName + '1', michael@0: title: testName + '1', michael@0: url: 'data:text/html;charset=utf-8,'+ testName + 1 michael@0: }); michael@0: let sidebar2 = Sidebar({ michael@0: id: testName + '2', michael@0: title: testName + '2', michael@0: url: 'data:text/html;charset=utf-8,'+ testName + 2 michael@0: }); michael@0: michael@0: let window = getMostRecentBrowserWindow(); michael@0: let IDs = [ sidebar1.id, sidebar2.id ]; michael@0: michael@0: let extraMenuitems = getExtraSidebarMenuitems(window); michael@0: assert.equal(extraMenuitems.length, 2, 'there are two extra sidebar menuitems'); michael@0: michael@0: function testShowing(sb1, sb2, sbEle) { michael@0: assert.equal(isShowing(sidebar1), sb1); michael@0: assert.equal(isShowing(sidebar2), sb2); michael@0: assert.equal(isSidebarShowing(window), sbEle); michael@0: } michael@0: testShowing(false, false, false); michael@0: michael@0: sidebar1.once('show', function() { michael@0: testShowing(true, false, true); michael@0: for (let mi of getExtraSidebarMenuitems(window)) { michael@0: let menuitemID = mi.getAttribute('id').replace(/^jetpack-sidebar-/, ''); michael@0: assert.ok(IDs.indexOf(menuitemID) >= 0, 'the extra menuitem is for one of our test sidebars'); michael@0: assert.equal(isChecked(mi), menuitemID == sidebar1.id, 'the test sidebar menuitem has the correct checked value'); michael@0: } michael@0: michael@0: sidebar2.once('show', function() { michael@0: testShowing(false, true, true); michael@0: for (let mi of getExtraSidebarMenuitems(window)) { michael@0: let menuitemID = mi.getAttribute('id').replace(/^jetpack-sidebar-/, ''); michael@0: assert.ok(IDs.indexOf(menuitemID) >= 0, 'the extra menuitem is for one of our test sidebars'); michael@0: assert.equal(isChecked(mi), menuitemID == sidebar2.id, 'the test sidebar menuitem has the correct checked value'); michael@0: } michael@0: michael@0: sidebar1.destroy(); michael@0: sidebar2.destroy(); michael@0: michael@0: testShowing(false, false, false); michael@0: michael@0: done(); michael@0: }); michael@0: michael@0: show(sidebar2); michael@0: assert.pass('showing sidebar 2'); michael@0: }) michael@0: show(sidebar1); michael@0: assert.pass('showing sidebar 1'); michael@0: } michael@0: michael@0: exports.testSidebarUnload = function(assert, done) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testSidebarUnload'; michael@0: let loader = Loader(module); michael@0: michael@0: let window = getMostRecentBrowserWindow(); michael@0: michael@0: assert.equal(isPrivate(window), false, 'the current window is not private'); michael@0: michael@0: let sidebar = loader.require('sdk/ui/sidebar').Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: 'data:text/html;charset=utf-8,'+ testName, michael@0: onShow: function() { michael@0: assert.pass('onShow works for Sidebar'); michael@0: loader.unload(); michael@0: michael@0: let sidebarMI = getSidebarMenuitems(); michael@0: for (let mi of sidebarMI) { michael@0: assert.ok(BUILTIN_SIDEBAR_MENUITEMS.indexOf(mi.getAttribute('id')) >= 0, 'the menuitem is for a built-in sidebar') michael@0: assert.ok(!isChecked(mi), 'no sidebar menuitem is checked'); michael@0: } michael@0: assert.ok(!window.document.getElementById(makeID(testName)), 'sidebar id DNE'); michael@0: assert.equal(isSidebarShowing(window), false, 'the sidebar is not showing'); michael@0: michael@0: done(); michael@0: } michael@0: }) michael@0: michael@0: sidebar.show(); michael@0: assert.pass('showing the sidebar'); michael@0: } michael@0: michael@0: exports.testRemoteContent = function(assert) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testRemoteContent'; michael@0: try { michael@0: let sidebar = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: 'http://dne.xyz.mozilla.org' michael@0: }); michael@0: assert.fail('a bad sidebar was created..'); michael@0: sidebar.destroy(); michael@0: } michael@0: catch(e) { michael@0: assert.ok(/The option "url" must be a valid local URI\./.test(e), 'remote content is not acceptable'); michael@0: } michael@0: } michael@0: michael@0: exports.testInvalidURL = function(assert) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testInvalidURL'; michael@0: try { michael@0: let sidebar = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: 'http:mozilla.org' michael@0: }); michael@0: assert.fail('a bad sidebar was created..'); michael@0: sidebar.destroy(); michael@0: } michael@0: catch(e) { michael@0: assert.ok(/The option "url" must be a valid local URI\./.test(e), 'invalid URIs are not acceptable'); michael@0: } michael@0: } michael@0: michael@0: exports.testInvalidURLType = function(assert) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testInvalidURLType'; michael@0: try { michael@0: let sidebar = Sidebar({ michael@0: id: testName, michael@0: title: testName michael@0: }); michael@0: assert.fail('a bad sidebar was created..'); michael@0: sidebar.destroy(); michael@0: } michael@0: catch(e) { michael@0: assert.ok(/The option "url" must be a valid local URI\./.test(e), 'invalid URIs are not acceptable'); michael@0: } michael@0: } michael@0: michael@0: exports.testInvalidTitle = function(assert) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testInvalidTitle'; michael@0: try { michael@0: let sidebar = Sidebar({ michael@0: id: testName, michael@0: title: '', michael@0: url: 'data:text/html;charset=utf-8,'+testName michael@0: }); michael@0: assert.fail('a bad sidebar was created..'); michael@0: sidebar.destroy(); michael@0: } michael@0: catch(e) { michael@0: assert.equal('The option "title" must be one of the following types: string', e.message, 'invalid titles are not acceptable'); michael@0: } michael@0: } michael@0: michael@0: exports.testInvalidID = function(assert) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testInvalidID'; michael@0: try { michael@0: let sidebar = Sidebar({ michael@0: id: '!', michael@0: title: testName, michael@0: url: 'data:text/html;charset=utf-8,'+testName michael@0: }); michael@0: assert.fail('a bad sidebar was created..'); michael@0: sidebar.destroy(); michael@0: } michael@0: catch(e) { michael@0: assert.ok(/The option "id" must be a valid alphanumeric id/.test(e), 'invalid ids are not acceptable'); michael@0: } michael@0: } michael@0: michael@0: exports.testInvalidBlankID = function(assert) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testInvalidBlankID'; michael@0: try { michael@0: let sidebar = Sidebar({ michael@0: id: '', michael@0: title: testName, michael@0: url: 'data:text/html;charset=utf-8,'+testName michael@0: }); michael@0: assert.fail('a bad sidebar was created..'); michael@0: sidebar.destroy(); michael@0: } michael@0: catch(e) { michael@0: assert.ok(/The option "id" must be a valid alphanumeric id/.test(e), 'invalid ids are not acceptable'); michael@0: } michael@0: } michael@0: michael@0: exports.testInvalidNullID = function(assert) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testInvalidNullID'; michael@0: try { michael@0: let sidebar = Sidebar({ michael@0: id: null, michael@0: title: testName, michael@0: url: 'data:text/html;charset=utf-8,'+testName michael@0: }); michael@0: assert.fail('a bad sidebar was created..'); michael@0: sidebar.destroy(); michael@0: } michael@0: catch(e) { michael@0: assert.ok(/The option "id" must be a valid alphanumeric id/.test(e), 'invalid ids are not acceptable'); michael@0: } michael@0: } michael@0: michael@0: exports.testUndefinedID = function(assert) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testInvalidUndefinedID'; michael@0: michael@0: try { michael@0: let sidebar = Sidebar({ michael@0: title: testName, michael@0: url: 'data:text/html;charset=utf-8,' + testName michael@0: }); michael@0: michael@0: assert.ok(sidebar.id, 'an undefined id was accepted, id was creawted: ' + sidebar.id); michael@0: assert.ok(getMostRecentBrowserWindow().document.getElementById(makeID(sidebar.id)), 'the sidebar element was found'); michael@0: michael@0: sidebar.destroy(); michael@0: } michael@0: catch(e) { michael@0: assert.fail('undefined ids are acceptable'); michael@0: assert.fail(e.message); michael@0: } michael@0: } michael@0: michael@0: // TEST: edge case where web panel is destroyed while loading michael@0: exports.testDestroyEdgeCaseBug = function(assert, done) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testDestroyEdgeCaseBug'; michael@0: let window = getMostRecentBrowserWindow(); michael@0: let sidebar = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: 'data:text/html;charset=utf-8,'+testName michael@0: }); michael@0: michael@0: // NOTE: purposely not listening to show event b/c the event happens michael@0: // between now and then. michael@0: sidebar.show(); michael@0: michael@0: assert.equal(isPrivate(window), false, 'the new window is not private'); michael@0: assert.equal(isSidebarShowing(window), true, 'the sidebar is showing'); michael@0: michael@0: //assert.equal(isShowing(sidebar), true, 'the sidebar is showing'); michael@0: michael@0: open().then(focus).then(function(window2) { michael@0: assert.equal(isPrivate(window2), false, 'the new window is not private'); michael@0: assert.equal(isSidebarShowing(window2), false, 'the sidebar is not showing'); michael@0: assert.equal(isShowing(sidebar), false, 'the sidebar is not showing'); michael@0: michael@0: sidebar.destroy(); michael@0: assert.pass('destroying the sidebar'); michael@0: michael@0: close(window2).then(function() { michael@0: let loader = Loader(module); michael@0: michael@0: assert.equal(isPrivate(window), false, 'the current window is not private'); michael@0: michael@0: let sidebar = loader.require('sdk/ui/sidebar').Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: 'data:text/html;charset=utf-8,'+ testName, michael@0: onShow: function() { michael@0: assert.pass('onShow works for Sidebar'); michael@0: loader.unload(); michael@0: michael@0: let sidebarMI = getSidebarMenuitems(); michael@0: for (let mi of sidebarMI) { michael@0: assert.ok(BUILTIN_SIDEBAR_MENUITEMS.indexOf(mi.getAttribute('id')) >= 0, 'the menuitem is for a built-in sidebar') michael@0: assert.ok(!isChecked(mi), 'no sidebar menuitem is checked'); michael@0: } michael@0: assert.ok(!window.document.getElementById(makeID(testName)), 'sidebar id DNE'); michael@0: assert.equal(isSidebarShowing(window), false, 'the sidebar is not showing'); michael@0: michael@0: done(); michael@0: } michael@0: }) michael@0: michael@0: sidebar.show(); michael@0: assert.pass('showing the sidebar'); michael@0: michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: exports.testClickingACheckedMenuitem = function(assert, done) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testClickingACheckedMenuitem'; michael@0: let window = getMostRecentBrowserWindow(); michael@0: let sidebar = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: 'data:text/html;charset=utf-8,'+testName, michael@0: }); michael@0: michael@0: sidebar.show().then(function() { michael@0: assert.pass('the show callback works'); michael@0: michael@0: sidebar.once('hide', function() { michael@0: assert.pass('clicking the menuitem after the sidebar has shown hides it.'); michael@0: sidebar.destroy(); michael@0: done(); michael@0: }); michael@0: michael@0: let menuitem = window.document.getElementById(makeID(sidebar.id)); michael@0: simulateCommand(menuitem); michael@0: }); michael@0: }; michael@0: michael@0: exports.testTitleSetter = function(assert, done) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testTitleSetter'; michael@0: let { document } = getMostRecentBrowserWindow(); michael@0: michael@0: let sidebar1 = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: 'data:text/html;charset=utf-8,'+testName, michael@0: }); michael@0: michael@0: assert.equal(sidebar1.title, testName, 'title getter works'); michael@0: michael@0: sidebar1.show().then(function() { michael@0: assert.equal(document.getElementById(makeID(sidebar1.id)).getAttribute('label'), michael@0: testName, michael@0: 'the menuitem label is correct'); michael@0: michael@0: assert.equal(document.getElementById('sidebar-title').value, testName, 'the menuitem label is correct'); michael@0: michael@0: sidebar1.title = 'foo'; michael@0: michael@0: assert.equal(sidebar1.title, 'foo', 'title getter works'); michael@0: michael@0: assert.equal(document.getElementById(makeID(sidebar1.id)).getAttribute('label'), michael@0: 'foo', michael@0: 'the menuitem label was updated'); michael@0: michael@0: assert.equal(document.getElementById('sidebar-title').value, 'foo', 'the sidebar title was updated'); michael@0: michael@0: sidebar1.destroy(); michael@0: done(); michael@0: }, assert.fail); michael@0: } michael@0: michael@0: exports.testURLSetter = function(assert, done) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testURLSetter'; michael@0: let window = getMostRecentBrowserWindow(); michael@0: let { document } = window; michael@0: let url = 'data:text/html;charset=utf-8,'+testName; michael@0: michael@0: let sidebar1 = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: url michael@0: }); michael@0: michael@0: assert.equal(sidebar1.url, url, 'url getter works'); michael@0: assert.equal(isShowing(sidebar1), false, 'the sidebar is not showing'); michael@0: assert.ok(!isChecked(document.getElementById(makeID(sidebar1.id))), michael@0: 'the menuitem is not checked'); michael@0: assert.equal(isSidebarShowing(window), false, 'the new window sidebar is not showing'); michael@0: michael@0: windowPromise(window.OpenBrowserWindow(), 'load').then(function(window) { michael@0: let { document } = window; michael@0: assert.pass('new window was opened'); michael@0: michael@0: sidebar1.show().then(function() { michael@0: assert.equal(isShowing(sidebar1), true, 'the sidebar is showing'); michael@0: assert.ok(isChecked(document.getElementById(makeID(sidebar1.id))), michael@0: 'the menuitem is checked'); michael@0: assert.ok(isSidebarShowing(window), 'the new window sidebar is showing'); michael@0: michael@0: sidebar1.once('show', function() { michael@0: assert.pass('setting the sidebar.url causes a show event'); michael@0: michael@0: assert.equal(isShowing(sidebar1), true, 'the sidebar is showing'); michael@0: assert.ok(isSidebarShowing(window), 'the new window sidebar is still showing'); michael@0: michael@0: assert.ok(isChecked(document.getElementById(makeID(sidebar1.id))), michael@0: 'the menuitem is still checked'); michael@0: michael@0: sidebar1.destroy(); michael@0: michael@0: close(window).then(done); michael@0: }); michael@0: michael@0: sidebar1.url = (url + '1'); michael@0: michael@0: assert.equal(sidebar1.url, (url + '1'), 'url getter works'); michael@0: assert.equal(isShowing(sidebar1), true, 'the sidebar is showing'); michael@0: assert.ok(isSidebarShowing(window), 'the new window sidebar is showing'); michael@0: }, assert.fail); michael@0: }, assert.fail); michael@0: } michael@0: michael@0: exports.testDuplicateID = function(assert) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testDuplicateID'; michael@0: let window = getMostRecentBrowserWindow(); michael@0: let { document } = window; michael@0: let url = 'data:text/html;charset=utf-8,'+testName; michael@0: michael@0: let sidebar1 = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: url michael@0: }); michael@0: michael@0: assert.throws(function() { michael@0: Sidebar({ michael@0: id: testName, michael@0: title: testName + 1, michael@0: url: url + 2 michael@0: }).destroy(); michael@0: }, /The ID .+ seems already used\./i, 'duplicate IDs will throw errors'); michael@0: michael@0: sidebar1.destroy(); michael@0: } michael@0: michael@0: exports.testURLSetterToSameValueReloadsSidebar = function(assert, done) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testURLSetterToSameValueReloadsSidebar'; michael@0: let window = getMostRecentBrowserWindow(); michael@0: let { document } = window; michael@0: let url = 'data:text/html;charset=utf-8,'+testName; michael@0: michael@0: let sidebar1 = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: url michael@0: }); michael@0: michael@0: assert.equal(sidebar1.url, url, 'url getter works'); michael@0: assert.equal(isShowing(sidebar1), false, 'the sidebar is not showing'); michael@0: assert.ok(!isChecked(document.getElementById(makeID(sidebar1.id))), michael@0: 'the menuitem is not checked'); michael@0: assert.equal(isSidebarShowing(window), false, 'the new window sidebar is not showing'); michael@0: michael@0: windowPromise(window.OpenBrowserWindow(), 'load').then(function(window) { michael@0: let { document } = window; michael@0: assert.pass('new window was opened'); michael@0: michael@0: sidebar1.show().then(function() { michael@0: assert.equal(isShowing(sidebar1), true, 'the sidebar is showing'); michael@0: assert.ok(isChecked(document.getElementById(makeID(sidebar1.id))), michael@0: 'the menuitem is checked'); michael@0: assert.ok(isSidebarShowing(window), 'the new window sidebar is showing'); michael@0: michael@0: sidebar1.once('show', function() { michael@0: assert.pass('setting the sidebar.url causes a show event'); michael@0: michael@0: assert.equal(isShowing(sidebar1), true, 'the sidebar is showing'); michael@0: assert.ok(isSidebarShowing(window), 'the new window sidebar is still showing'); michael@0: michael@0: assert.ok(isChecked(document.getElementById(makeID(sidebar1.id))), michael@0: 'the menuitem is still checked'); michael@0: michael@0: sidebar1.destroy(); michael@0: michael@0: close(window).then(done); michael@0: }); michael@0: michael@0: sidebar1.url = url; michael@0: michael@0: assert.equal(sidebar1.url, url, 'url getter works'); michael@0: assert.equal(isShowing(sidebar1), true, 'the sidebar is showing'); michael@0: assert.ok(isSidebarShowing(window), 'the new window sidebar is showing'); michael@0: }, assert.fail); michael@0: }, assert.fail); michael@0: } michael@0: michael@0: exports.testShowingInOneWindowDoesNotAffectOtherWindows = function(assert, done) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testShowingInOneWindowDoesNotAffectOtherWindows'; michael@0: let window1 = getMostRecentBrowserWindow(); michael@0: let url = 'data:text/html;charset=utf-8,'+testName; michael@0: michael@0: let sidebar1 = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: url michael@0: }); michael@0: michael@0: assert.equal(sidebar1.url, url, 'url getter works'); michael@0: assert.equal(isShowing(sidebar1), false, 'the sidebar is not showing'); michael@0: let checkCount = 1; michael@0: function checkSidebarShowing(window, expected) { michael@0: assert.pass('check count ' + checkCount++); michael@0: michael@0: let mi = window.document.getElementById(makeID(sidebar1.id)); michael@0: if (mi) { michael@0: assert.equal(isChecked(mi), expected, michael@0: 'the menuitem is not checked'); michael@0: } michael@0: assert.equal(isSidebarShowing(window), expected || false, 'the new window sidebar is not showing'); michael@0: } michael@0: checkSidebarShowing(window1, false); michael@0: michael@0: windowPromise(window1.OpenBrowserWindow(), 'load').then(function(window) { michael@0: let { document } = window; michael@0: assert.pass('new window was opened!'); michael@0: michael@0: // waiting for show michael@0: sidebar1.once('show', function() { michael@0: // check state of the new window michael@0: assert.equal(isShowing(sidebar1), true, 'the sidebar is showing'); michael@0: checkSidebarShowing(window, true); michael@0: michael@0: // check state of old window michael@0: checkSidebarShowing(window1, false); michael@0: michael@0: // waiting for show using url setter michael@0: sidebar1.once('show', function() { michael@0: assert.pass('setting the sidebar.url causes a new show event'); michael@0: michael@0: // check state of the new window michael@0: assert.equal(isShowing(sidebar1), true, 'the sidebar is showing'); michael@0: checkSidebarShowing(window, true); michael@0: michael@0: // check state of old window michael@0: checkSidebarShowing(window1, false); michael@0: michael@0: // calling destroy() twice should not matter michael@0: sidebar1.destroy(); michael@0: sidebar1.destroy(); michael@0: michael@0: // check state of the new window michael@0: assert.equal(isShowing(sidebar1), false, 'the sidebar is not showing'); michael@0: checkSidebarShowing(window, undefined); michael@0: michael@0: // check state of old window michael@0: checkSidebarShowing(window1, undefined); michael@0: michael@0: close(window).then(done); michael@0: }); michael@0: michael@0: assert.pass('setting sidebar1.url'); michael@0: sidebar1.url += '1'; michael@0: assert.pass('set sidebar1.url'); michael@0: }); michael@0: michael@0: sidebar1.show(); michael@0: }, assert.fail); michael@0: } michael@0: michael@0: exports.testHidingAHiddenSidebarRejects = function(assert, done) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testHidingAHiddenSidebarRejects'; michael@0: let url = 'data:text/html;charset=utf-8,'+testName; michael@0: let sidebar = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: url michael@0: }); michael@0: michael@0: sidebar.hide().then(assert.fail, assert.pass).then(function() { michael@0: sidebar.destroy(); michael@0: done(); michael@0: }, assert.fail); michael@0: } michael@0: michael@0: exports.testGCdSidebarsOnUnload = function(assert, done) { michael@0: const loader = Loader(module); michael@0: const { Sidebar } = loader.require('sdk/ui/sidebar'); michael@0: const window = getMostRecentBrowserWindow(); michael@0: michael@0: let testName = 'testGCdSidebarsOnUnload'; michael@0: let url = 'data:text/html;charset=utf-8,'+testName; michael@0: michael@0: assert.equal(isSidebarShowing(window), false, 'the sidebar is not showing'); michael@0: michael@0: // IMPORTANT: make no reference to the sidebar instance, so it is GC'd michael@0: let sidebar = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: url michael@0: }); michael@0: michael@0: sidebar.show().then(function() { michael@0: sidebar = null; michael@0: michael@0: assert.equal(isSidebarShowing(window), true, 'the sidebar is showing'); michael@0: michael@0: let menuitemID = makeID(testName); michael@0: michael@0: assert.ok(!!window.document.getElementById(menuitemID), 'the menuitem was found'); michael@0: michael@0: Cu.schedulePreciseGC(function() { michael@0: loader.unload(); michael@0: michael@0: assert.equal(isSidebarShowing(window), false, 'the sidebar is not showing after unload'); michael@0: assert.ok(!window.document.getElementById(menuitemID), 'the menuitem was removed'); michael@0: michael@0: done(); michael@0: }) michael@0: }, assert.fail).then(null, assert.fail); michael@0: } michael@0: michael@0: exports.testGCdShowingSidebarsOnUnload = function(assert, done) { michael@0: const loader = Loader(module); michael@0: const { Sidebar } = loader.require('sdk/ui/sidebar'); michael@0: const window = getMostRecentBrowserWindow(); michael@0: michael@0: let testName = 'testGCdShowingSidebarsOnUnload'; michael@0: let url = 'data:text/html;charset=utf-8,'+testName; michael@0: michael@0: assert.equal(isSidebarShowing(window), false, 'the sidebar is not showing'); michael@0: michael@0: let sidebar = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: url michael@0: }); michael@0: michael@0: sidebar.on('show', function() { michael@0: sidebar = null; michael@0: michael@0: assert.equal(isSidebarShowing(window), true, 'the sidebar is showing'); michael@0: michael@0: let menuitemID = makeID(testName); michael@0: michael@0: assert.ok(!!window.document.getElementById(menuitemID), 'the menuitem was found'); michael@0: michael@0: Cu.schedulePreciseGC(function() { michael@0: assert.equal(isSidebarShowing(window), true, 'the sidebar is still showing after gc'); michael@0: assert.ok(!!window.document.getElementById(menuitemID), 'the menuitem was found after gc'); michael@0: michael@0: loader.unload(); michael@0: michael@0: assert.equal(isSidebarShowing(window), false, 'the sidebar is not showing after unload'); michael@0: assert.ok(!window.document.getElementById(menuitemID), 'the menuitem was removed'); michael@0: michael@0: done(); michael@0: }) michael@0: }); michael@0: michael@0: sidebar.show(); michael@0: } michael@0: michael@0: exports.testDetachEventOnWindowClose = function(assert, done) { michael@0: const loader = Loader(module); michael@0: const { Sidebar } = loader.require('sdk/ui/sidebar'); michael@0: const window = getMostRecentBrowserWindow(); michael@0: michael@0: let testName = 'testDetachEventOnWindowClose'; michael@0: let url = 'data:text/html;charset=utf-8,' + testName; michael@0: michael@0: michael@0: windowPromise(window.OpenBrowserWindow(), 'load').then(focus).then(function(window) { michael@0: let sidebar = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: url, michael@0: onAttach: function() { michael@0: assert.pass('the attach event is fired'); michael@0: window.close(); michael@0: }, michael@0: onDetach: function() { michael@0: assert.pass('the detach event is fired when the window showing it closes'); michael@0: loader.unload(); michael@0: done(); michael@0: } michael@0: }); michael@0: michael@0: sidebar.show(); michael@0: }).then(null, assert.fail); michael@0: } michael@0: michael@0: exports.testHideEventOnWindowClose = function(assert, done) { michael@0: const loader = Loader(module); michael@0: const { Sidebar } = loader.require('sdk/ui/sidebar'); michael@0: const window = getMostRecentBrowserWindow(); michael@0: michael@0: let testName = 'testDetachEventOnWindowClose'; michael@0: let url = 'data:text/html;charset=utf-8,' + testName; michael@0: michael@0: michael@0: windowPromise(window.OpenBrowserWindow(), 'load').then(focus).then(function(window) { michael@0: let sidebar = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: url, michael@0: onAttach: function() { michael@0: assert.pass('the attach event is fired'); michael@0: window.close(); michael@0: }, michael@0: onHide: function() { michael@0: assert.pass('the hide event is fired when the window showing it closes'); michael@0: loader.unload(); michael@0: done(); michael@0: } michael@0: }); michael@0: michael@0: sidebar.show(); michael@0: }).then(null, assert.fail); michael@0: } michael@0: michael@0: exports.testGCdHiddenSidebarsOnUnload = function(assert, done) { michael@0: const loader = Loader(module); michael@0: const { Sidebar } = loader.require('sdk/ui/sidebar'); michael@0: const window = getMostRecentBrowserWindow(); michael@0: michael@0: let testName = 'testGCdHiddenSidebarsOnUnload'; michael@0: let url = 'data:text/html;charset=utf-8,'+testName; michael@0: michael@0: assert.equal(isSidebarShowing(window), false, 'the sidebar is not showing'); michael@0: michael@0: // IMPORTANT: make no reference to the sidebar instance, so it is GC'd michael@0: Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: url michael@0: }); michael@0: michael@0: let menuitemID = makeID(testName); michael@0: michael@0: assert.ok(!!window.document.getElementById(menuitemID), 'the menuitem was found'); michael@0: michael@0: Cu.schedulePreciseGC(function() { michael@0: assert.ok(!!window.document.getElementById(menuitemID), 'the menuitem was found after gc'); michael@0: michael@0: loader.unload(); michael@0: michael@0: assert.ok(!window.document.getElementById(menuitemID), 'the menuitem was removed'); michael@0: michael@0: done(); michael@0: }); michael@0: } michael@0: michael@0: exports.testSidebarGettersAndSettersAfterDestroy = function(assert) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testSidebarGettersAndSettersAfterDestroy'; michael@0: let url = 'data:text/html;charset=utf-8,'+testName; michael@0: michael@0: let sidebar = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: url michael@0: }); michael@0: michael@0: sidebar.destroy(); michael@0: michael@0: assert.equal(sidebar.id, undefined, 'sidebar after destroy has no id'); michael@0: michael@0: assert.throws(() => sidebar.id = 'foo-tang', michael@0: /^setting a property that has only a getter/, michael@0: 'id cannot be set at runtime'); michael@0: michael@0: assert.equal(sidebar.id, undefined, 'sidebar after destroy has no id'); michael@0: michael@0: assert.equal(sidebar.title, undefined, 'sidebar after destroy has no title'); michael@0: sidebar.title = 'boo-tang'; michael@0: assert.equal(sidebar.title, undefined, 'sidebar after destroy has no title'); michael@0: michael@0: assert.equal(sidebar.url, undefined, 'sidebar after destroy has no url'); michael@0: sidebar.url = url + 'barz'; michael@0: assert.equal(sidebar.url, undefined, 'sidebar after destroy has no url'); michael@0: } michael@0: michael@0: michael@0: exports.testSidebarLeakCheckDestroyAfterAttach = function(assert, done) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testSidebarLeakCheckDestroyAfterAttach'; michael@0: let window = getMostRecentBrowserWindow(); michael@0: let sidebar = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: 'data:text/html;charset=utf-8,'+testName michael@0: }); michael@0: michael@0: sidebar.on('attach', function() { michael@0: assert.pass('the sidebar was shown'); michael@0: michael@0: sidebar.on('show', function() { michael@0: assert.fail('the sidebar show listener should have been removed'); michael@0: }); michael@0: assert.pass('added a sidebar show listener'); michael@0: michael@0: sidebar.on('hide', function() { michael@0: assert.fail('the sidebar hide listener should have been removed'); michael@0: }); michael@0: assert.pass('added a sidebar hide listener'); michael@0: michael@0: let panelBrowser = window.document.getElementById('sidebar').contentDocument.getElementById('web-panels-browser'); michael@0: panelBrowser.contentWindow.addEventListener('unload', function onUnload() { michael@0: panelBrowser.contentWindow.removeEventListener('unload', onUnload, false); michael@0: // wait a tick.. michael@0: setTimeout(function() { michael@0: assert.pass('the sidebar web panel was unloaded properly'); michael@0: done(); michael@0: }) michael@0: }, false); michael@0: michael@0: sidebar.destroy(); michael@0: }); michael@0: michael@0: assert.pass('showing the sidebar'); michael@0: sidebar.show(); michael@0: } michael@0: michael@0: exports.testSidebarLeakCheckUnloadAfterAttach = function(assert, done) { michael@0: const loader = Loader(module); michael@0: const { Sidebar } = loader.require('sdk/ui/sidebar'); michael@0: let testName = 'testSidebarLeakCheckUnloadAfterAttach'; michael@0: let window = getMostRecentBrowserWindow(); michael@0: let sidebar = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: 'data:text/html;charset=utf-8,'+testName michael@0: }); michael@0: michael@0: sidebar.on('attach', function() { michael@0: assert.pass('the sidebar was shown'); michael@0: michael@0: sidebar.on('show', function() { michael@0: assert.fail('the sidebar show listener should have been removed'); michael@0: }); michael@0: assert.pass('added a sidebar show listener'); michael@0: michael@0: sidebar.on('hide', function() { michael@0: assert.fail('the sidebar hide listener should have been removed'); michael@0: }); michael@0: assert.pass('added a sidebar hide listener'); michael@0: michael@0: let panelBrowser = window.document.getElementById('sidebar').contentDocument.getElementById('web-panels-browser'); michael@0: panelBrowser.contentWindow.addEventListener('unload', function onUnload() { michael@0: panelBrowser.contentWindow.removeEventListener('unload', onUnload, false); michael@0: // wait a tick.. michael@0: setTimeout(function() { michael@0: assert.pass('the sidebar web panel was unloaded properly'); michael@0: done(); michael@0: }) michael@0: }, false); michael@0: michael@0: loader.unload(); michael@0: }); michael@0: michael@0: assert.pass('showing the sidebar'); michael@0: sidebar.show(); michael@0: } michael@0: michael@0: exports.testTwoSidebarsWithSameTitleAndURL = function(assert) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testTwoSidebarsWithSameTitleAndURL'; michael@0: michael@0: let title = testName; michael@0: let url = 'data:text/html;charset=utf-8,' + testName; michael@0: michael@0: let sidebar1 = Sidebar({ michael@0: id: testName + 1, michael@0: title: title, michael@0: url: url michael@0: }); michael@0: michael@0: assert.throws(function() { michael@0: Sidebar({ michael@0: id: testName + 2, michael@0: title: title, michael@0: url: url michael@0: }).destroy(); michael@0: }, /title.+url.+invalid/i, 'Creating two sidebars with the same title + url is not allowed'); michael@0: michael@0: let sidebar2 = Sidebar({ michael@0: id: testName + 2, michael@0: title: title, michael@0: url: 'data:text/html;charset=utf-8,X' michael@0: }); michael@0: michael@0: assert.throws(function() { michael@0: sidebar2.url = url; michael@0: }, /title.+url.+invalid/i, 'Creating two sidebars with the same title + url is not allowed'); michael@0: michael@0: sidebar2.title = 'foo'; michael@0: sidebar2.url = url; michael@0: michael@0: assert.throws(function() { michael@0: sidebar2.title = title; michael@0: }, /title.+url.+invalid/i, 'Creating two sidebars with the same title + url is not allowed'); michael@0: michael@0: sidebar1.destroy(); michael@0: sidebar2.destroy(); michael@0: } michael@0: michael@0: exports.testChangingURLBackToOriginalValue = function(assert) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testChangingURLBackToOriginalValue'; michael@0: michael@0: let title = testName; michael@0: let url = 'data:text/html;charset=utf-8,' + testName; michael@0: let count = 0; michael@0: michael@0: let sidebar = Sidebar({ michael@0: id: testName, michael@0: title: title, michael@0: url: url michael@0: }); michael@0: michael@0: sidebar.url = url + 2; michael@0: assert.equal(sidebar.url, url + 2, 'the sidebar.url is correct'); michael@0: sidebar.url = url; michael@0: assert.equal(sidebar.url, url, 'the sidebar.url is correct'); michael@0: michael@0: sidebar.title = 'foo'; michael@0: assert.equal(sidebar.title, 'foo', 'the sidebar.title is correct'); michael@0: sidebar.title = title; michael@0: assert.equal(sidebar.title, title, 'the sidebar.title is correct'); michael@0: michael@0: sidebar.destroy(); michael@0: michael@0: assert.pass('Changing values back to originals works'); michael@0: } michael@0: michael@0: exports.testShowToOpenXToClose = function(assert, done) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testShowToOpenXToClose'; michael@0: michael@0: let title = testName; michael@0: let url = 'data:text/html;charset=utf-8,' + testName; michael@0: let window = getMostRecentBrowserWindow(); michael@0: michael@0: let sidebar = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: url, michael@0: onShow: function() { michael@0: assert.ok(isChecked(menuitem), 'menuitem is checked'); michael@0: michael@0: let closeButton = window.document.querySelector('#sidebar-header > toolbarbutton.close-icon'); michael@0: simulateCommand(closeButton); michael@0: }, michael@0: onHide: function() { michael@0: assert.ok(!isChecked(menuitem), 'menuitem is not checked'); michael@0: michael@0: sidebar.destroy(); michael@0: done(); michael@0: } michael@0: }); michael@0: michael@0: let menuitem = window.document.getElementById(makeID(sidebar.id)); michael@0: michael@0: assert.ok(!isChecked(menuitem), 'menuitem is not checked'); michael@0: michael@0: sidebar.show(); michael@0: } michael@0: michael@0: exports.testShowToOpenMenuitemToClose = function(assert, done) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testShowToOpenMenuitemToClose'; michael@0: michael@0: let title = testName; michael@0: let url = 'data:text/html;charset=utf-8,' + testName; michael@0: let window = getMostRecentBrowserWindow(); michael@0: michael@0: let sidebar = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: url, michael@0: onShow: function() { michael@0: assert.ok(isChecked(menuitem), 'menuitem is checked'); michael@0: michael@0: simulateCommand(menuitem); michael@0: }, michael@0: onHide: function() { michael@0: assert.ok(!isChecked(menuitem), 'menuitem is not checked'); michael@0: michael@0: sidebar.destroy(); michael@0: done(); michael@0: } michael@0: }); michael@0: michael@0: let menuitem = window.document.getElementById(makeID(sidebar.id)); michael@0: michael@0: assert.ok(!isChecked(menuitem), 'menuitem is not checked'); michael@0: michael@0: sidebar.show(); michael@0: } michael@0: michael@0: exports.testDestroyWhileNonBrowserWindowIsOpen = function(assert, done) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testDestroyWhileNonBrowserWindowIsOpen'; michael@0: let url = 'data:text/html;charset=utf-8,' + testName; michael@0: michael@0: let sidebar = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: url michael@0: }); michael@0: michael@0: open('chrome://browser/content/preferences/preferences.xul').then(function(window) { michael@0: try { michael@0: sidebar.show(); michael@0: assert.equal(isSidebarShowing(getMostRecentBrowserWindow()), true, 'the sidebar is showing'); michael@0: michael@0: sidebar.destroy(); michael@0: michael@0: assert.pass('sidebar was destroyed while a non browser window was open'); michael@0: } michael@0: catch(e) { michael@0: assert.fail(e); michael@0: } michael@0: michael@0: return window; michael@0: }).then(close).then(function() { michael@0: assert.equal(isSidebarShowing(getMostRecentBrowserWindow()), false, 'the sidebar is not showing'); michael@0: }).then(done, assert.fail); michael@0: } michael@0: michael@0: exports.testEventListeners = function(assert, done) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testWhatThisIsInSidebarEventListeners'; michael@0: let eventListenerOrder = []; michael@0: michael@0: let constructorOnShow = defer(); michael@0: let constructorOnHide = defer(); michael@0: let constructorOnAttach = defer(); michael@0: let constructorOnReady = defer(); michael@0: michael@0: let onShow = defer(); michael@0: let onHide = defer(); michael@0: let onAttach = defer(); michael@0: let onReady = defer(); michael@0: michael@0: let onceShow = defer(); michael@0: let onceHide = defer(); michael@0: let onceAttach = defer(); michael@0: let onceReady = defer(); michael@0: michael@0: function testThis() { michael@0: assert(this, sidebar, '`this` is correct'); michael@0: } michael@0: michael@0: let sidebar = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: 'data:text/html;charset=utf-8,' + testName, michael@0: onShow: function() { michael@0: assert.equal(this, sidebar, '`this` is correct in onShow'); michael@0: eventListenerOrder.push('onShow'); michael@0: constructorOnShow.resolve(); michael@0: }, michael@0: onAttach: function() { michael@0: assert.equal(this, sidebar, '`this` is correct in onAttach'); michael@0: eventListenerOrder.push('onAttach'); michael@0: constructorOnAttach.resolve(); michael@0: }, michael@0: onReady: function() { michael@0: assert.equal(this, sidebar, '`this` is correct in onReady'); michael@0: eventListenerOrder.push('onReady'); michael@0: constructorOnReady.resolve(); michael@0: }, michael@0: onHide: function() { michael@0: assert.equal(this, sidebar, '`this` is correct in onHide'); michael@0: eventListenerOrder.push('onHide'); michael@0: constructorOnHide.resolve(); michael@0: } michael@0: }); michael@0: michael@0: sidebar.once('show', function() { michael@0: assert.equal(this, sidebar, '`this` is correct in once show'); michael@0: eventListenerOrder.push('once show'); michael@0: onceShow.resolve(); michael@0: }); michael@0: sidebar.once('attach', function() { michael@0: assert.equal(this, sidebar, '`this` is correct in once attach'); michael@0: eventListenerOrder.push('once attach'); michael@0: onceAttach.resolve(); michael@0: }); michael@0: sidebar.once('ready', function() { michael@0: assert.equal(this, sidebar, '`this` is correct in once ready'); michael@0: eventListenerOrder.push('once ready'); michael@0: onceReady.resolve(); michael@0: }); michael@0: sidebar.once('hide', function() { michael@0: assert.equal(this, sidebar, '`this` is correct in once hide'); michael@0: eventListenerOrder.push('once hide'); michael@0: onceHide.resolve(); michael@0: }); michael@0: michael@0: sidebar.on('show', function() { michael@0: assert.equal(this, sidebar, '`this` is correct in on show'); michael@0: eventListenerOrder.push('on show'); michael@0: onShow.resolve(); michael@0: michael@0: sidebar.hide(); michael@0: }); michael@0: sidebar.on('attach', function() { michael@0: assert.equal(this, sidebar, '`this` is correct in on attach'); michael@0: eventListenerOrder.push('on attach'); michael@0: onAttach.resolve(); michael@0: }); michael@0: sidebar.on('ready', function() { michael@0: assert.equal(this, sidebar, '`this` is correct in on ready'); michael@0: eventListenerOrder.push('on ready'); michael@0: onReady.resolve(); michael@0: }); michael@0: sidebar.on('hide', function() { michael@0: assert.equal(this, sidebar, '`this` is correct in on hide'); michael@0: eventListenerOrder.push('on hide'); michael@0: onHide.resolve(); michael@0: }); michael@0: michael@0: all([constructorOnShow.promise, michael@0: constructorOnAttach.promise, michael@0: constructorOnReady.promise, michael@0: constructorOnHide.promise, michael@0: onceShow.promise, michael@0: onceAttach.promise, michael@0: onceReady.promise, michael@0: onceHide.promise, michael@0: onShow.promise, michael@0: onAttach.promise, michael@0: onReady.promise, michael@0: onHide.promise]).then(function() { michael@0: assert.equal(eventListenerOrder.join(), [ michael@0: 'onAttach', michael@0: 'once attach', michael@0: 'on attach', michael@0: 'onReady', michael@0: 'once ready', michael@0: 'on ready', michael@0: 'onShow', michael@0: 'once show', michael@0: 'on show', michael@0: 'onHide', michael@0: 'once hide', michael@0: 'on hide' michael@0: ].join(), 'the event order was correct'); michael@0: sidebar.destroy(); michael@0: }).then(done, assert.fail); michael@0: michael@0: sidebar.show(); michael@0: } michael@0: michael@0: // For more information see Bug 920780 michael@0: exports.testAttachDoesNotEmitWhenShown = function(assert, done) { michael@0: const { Sidebar } = require('sdk/ui/sidebar'); michael@0: let testName = 'testSidebarLeakCheckUnloadAfterAttach'; michael@0: let count = 0; michael@0: michael@0: let sidebar = Sidebar({ michael@0: id: testName, michael@0: title: testName, michael@0: url: 'data:text/html;charset=utf-8,'+testName, michael@0: onAttach: function() { michael@0: if (count > 2) { michael@0: assert.fail('sidebar was attached again..'); michael@0: } michael@0: else { michael@0: assert.pass('sidebar was attached ' + count + ' time(s)'); michael@0: } michael@0: michael@0: if (++count == 1) { michael@0: setImmediate(function() { michael@0: let shownFired = 0; michael@0: let onShow = () => shownFired++; michael@0: sidebar.on('show', onShow); michael@0: michael@0: sidebar.show() michael@0: .then(() => assert.equal(shownFired, 0, 'shown should not be fired again when already showing from after attach')) michael@0: .then(sidebar.hide.bind(sidebar)) michael@0: .then(sidebar.show.bind(sidebar)) michael@0: .then(() => assert.equal(shownFired, 1, 'shown was emitted when `show` called after being hidden')) michael@0: .then(sidebar.show.bind(sidebar)) michael@0: .then(() => { michael@0: assert.equal(shownFired, 1, 'shown was not emitted again if already being shown'); michael@0: sidebar.off('show', onShow); michael@0: sidebar.destroy(); michael@0: }).catch(assert.fail).then(done); michael@0: }); michael@0: } michael@0: } michael@0: }); michael@0: michael@0: sidebar.show(); michael@0: } michael@0: michael@0: // If the module doesn't support the app we're being run in, require() will michael@0: // throw. In that case, remove all tests above from exports, and add one dummy michael@0: // test that passes. michael@0: try { michael@0: require('sdk/ui/sidebar'); michael@0: } michael@0: catch (err) { michael@0: if (!/^Unsupported Application/.test(err.message)) michael@0: throw err; michael@0: michael@0: module.exports = { michael@0: 'test Unsupported Application': assert => assert.pass(err.message) michael@0: } michael@0: } michael@0: michael@0: require('sdk/test').run(exports);