1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/addon-sdk/source/test/test-tab-events.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,238 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +"use strict"; 1.9 + 1.10 +const { Loader } = require("sdk/test/loader"); 1.11 +const utils = require("sdk/tabs/utils"); 1.12 +const { open, close } = require("sdk/window/helpers"); 1.13 +const { getMostRecentBrowserWindow } = require("sdk/window/utils"); 1.14 +const { events } = require("sdk/tab/events"); 1.15 +const { on, off } = require("sdk/event/core"); 1.16 +const { resolve, defer } = require("sdk/core/promise"); 1.17 + 1.18 +let isFennec = require("sdk/system/xul-app").is("Fennec"); 1.19 + 1.20 +function test(options) { 1.21 + return function(assert, done) { 1.22 + let tabEvents = []; 1.23 + let tabs = []; 1.24 + let { promise, resolve: resolveP } = defer(); 1.25 + let win = isFennec ? resolve(getMostRecentBrowserWindow()) : 1.26 + open(null, { 1.27 + features: { private: true, toolbar:true, chrome: true } 1.28 + }); 1.29 + let window = null; 1.30 + 1.31 + // Firefox events are fired sync; Fennec events async 1.32 + // this normalizes the tests 1.33 + function handler (event) { 1.34 + tabEvents.push(event); 1.35 + runIfReady(); 1.36 + } 1.37 + 1.38 + function runIfReady () { 1.39 + let releventEvents = getRelatedEvents(tabEvents, tabs); 1.40 + if (options.readyWhen(releventEvents)) 1.41 + options.end({ 1.42 + tabs: tabs, 1.43 + events: releventEvents, 1.44 + assert: assert, 1.45 + done: resolveP 1.46 + }); 1.47 + } 1.48 + 1.49 + win.then(function(w) { 1.50 + window = w; 1.51 + on(events, "data", handler); 1.52 + options.start({ tabs: tabs, window: window }); 1.53 + 1.54 + // Execute here for synchronous FF events, as the handlers 1.55 + // were called before tabs were pushed to `tabs` 1.56 + runIfReady(); 1.57 + return promise; 1.58 + }).then(function() { 1.59 + off(events, "data", handler); 1.60 + return isFennec ? null : close(window); 1.61 + }).then(done, assert.fail); 1.62 + }; 1.63 +} 1.64 + 1.65 +// Just making sure that tab events work for already opened tabs not only 1.66 +// for new windows. 1.67 +exports["test current window"] = test({ 1.68 + readyWhen: events => events.length === 3, 1.69 + start: ({ tabs, window }) => { 1.70 + let tab = utils.openTab(window, 'data:text/plain,open'); 1.71 + tabs.push(tab); 1.72 + utils.closeTab(tab); 1.73 + }, 1.74 + end: ({ tabs, events, assert, done }) => { 1.75 + let [open, select, close] = events; 1.76 + let tab = tabs[0]; 1.77 + 1.78 + assert.equal(open.type, "TabOpen"); 1.79 + assert.equal(open.target, tab); 1.80 + 1.81 + assert.equal(select.type, "TabSelect"); 1.82 + assert.equal(select.target, tab); 1.83 + 1.84 + assert.equal(close.type, "TabClose"); 1.85 + assert.equal(close.target, tab); 1.86 + done(); 1.87 + } 1.88 +}); 1.89 + 1.90 +exports["test open"] = test({ 1.91 + readyWhen: events => events.length === 2, 1.92 + start: ({ tabs, window }) => { 1.93 + tabs.push(utils.openTab(window, 'data:text/plain,open')); 1.94 + }, 1.95 + end: ({ tabs, events, assert, done }) => { 1.96 + let [open, select] = events; 1.97 + let tab = tabs[0]; 1.98 + 1.99 + assert.equal(open.type, "TabOpen"); 1.100 + assert.equal(open.target, tab); 1.101 + 1.102 + assert.equal(select.type, "TabSelect"); 1.103 + assert.equal(select.target, tab); 1.104 + done(); 1.105 + } 1.106 +}); 1.107 + 1.108 +exports["test open -> close"] = test({ 1.109 + readyWhen: events => events.length === 3, 1.110 + start: ({ tabs, window }) => { 1.111 + // First tab is useless we just open it so that closing second tab won't 1.112 + // close window on some platforms. 1.113 + utils.openTab(window, 'data:text/plain,ignore'); 1.114 + let tab = utils.openTab(window, 'data:text/plain,open-close'); 1.115 + tabs.push(tab); 1.116 + utils.closeTab(tab); 1.117 + }, 1.118 + end: ({ tabs, events, assert, done }) => { 1.119 + let [open, select, close] = events; 1.120 + let tab = tabs[0]; 1.121 + 1.122 + assert.equal(open.type, "TabOpen"); 1.123 + assert.equal(open.target, tab); 1.124 + 1.125 + assert.equal(select.type, "TabSelect"); 1.126 + assert.equal(select.target, tab); 1.127 + 1.128 + assert.equal(close.type, "TabClose"); 1.129 + assert.equal(close.target, tab); 1.130 + done(); 1.131 + } 1.132 +}); 1.133 + 1.134 +exports["test open -> open -> select"] = test({ 1.135 + readyWhen: events => events.length === 5, 1.136 + start: ({tabs, window}) => { 1.137 + tabs.push(utils.openTab(window, 'data:text/plain,Tab-1')); 1.138 + tabs.push(utils.openTab(window, 'data:text/plain,Tab-2')); 1.139 + utils.activateTab(tabs[0], window); 1.140 + }, 1.141 + end: ({ tabs, events, assert, done }) => { 1.142 + let [ tab1, tab2 ] = tabs; 1.143 + let tab1Events = 0; 1.144 + getRelatedEvents(events, tab1).map(event => { 1.145 + tab1Events++; 1.146 + if (tab1Events === 1) 1.147 + assert.equal(event.type, "TabOpen", "first tab opened"); 1.148 + else 1.149 + assert.equal(event.type, "TabSelect", "first tab selected"); 1.150 + assert.equal(event.target, tab1); 1.151 + }); 1.152 + assert.equal(tab1Events, 3, "first tab has 3 events"); 1.153 + 1.154 + let tab2Opened; 1.155 + getRelatedEvents(events, tab2).map(event => { 1.156 + if (!tab2Opened) 1.157 + assert.equal(event.type, "TabOpen", "second tab opened"); 1.158 + else 1.159 + assert.equal(event.type, "TabSelect", "second tab selected"); 1.160 + tab2Opened = true; 1.161 + assert.equal(event.target, tab2); 1.162 + }); 1.163 + done(); 1.164 + } 1.165 +}); 1.166 + 1.167 +exports["test open -> pin -> unpin"] = test({ 1.168 + readyWhen: events => events.length === (isFennec ? 2 : 5), 1.169 + start: ({ tabs, window }) => { 1.170 + tabs.push(utils.openTab(window, 'data:text/plain,pin-unpin')); 1.171 + utils.pin(tabs[0]); 1.172 + utils.unpin(tabs[0]); 1.173 + }, 1.174 + end: ({ tabs, events, assert, done }) => { 1.175 + let [open, select, move, pin, unpin] = events; 1.176 + let tab = tabs[0]; 1.177 + 1.178 + assert.equal(open.type, "TabOpen"); 1.179 + assert.equal(open.target, tab); 1.180 + 1.181 + assert.equal(select.type, "TabSelect"); 1.182 + assert.equal(select.target, tab); 1.183 + 1.184 + if (isFennec) { 1.185 + assert.pass("Tab pin / unpin is not supported by Fennec"); 1.186 + } 1.187 + else { 1.188 + assert.equal(move.type, "TabMove"); 1.189 + assert.equal(move.target, tab); 1.190 + 1.191 + assert.equal(pin.type, "TabPinned"); 1.192 + assert.equal(pin.target, tab); 1.193 + 1.194 + assert.equal(unpin.type, "TabUnpinned"); 1.195 + assert.equal(unpin.target, tab); 1.196 + } 1.197 + done(); 1.198 + } 1.199 +}); 1.200 + 1.201 +exports["test open -> open -> move "] = test({ 1.202 + readyWhen: events => events.length === (isFennec ? 4 : 5), 1.203 + start: ({tabs, window}) => { 1.204 + tabs.push(utils.openTab(window, 'data:text/plain,Tab-1')); 1.205 + tabs.push(utils.openTab(window, 'data:text/plain,Tab-2')); 1.206 + utils.move(tabs[0], 2); 1.207 + }, 1.208 + end: ({ tabs, events, assert, done }) => { 1.209 + let [ tab1, tab2 ] = tabs; 1.210 + let tab1Events = 0; 1.211 + getRelatedEvents(events, tab1).map(event => { 1.212 + tab1Events++; 1.213 + if (tab1Events === 1) 1.214 + assert.equal(event.type, "TabOpen", "first tab opened"); 1.215 + else if (tab1Events === 2) 1.216 + assert.equal(event.type, "TabSelect", "first tab selected"); 1.217 + else if (tab1Events === 3 && isFennec) 1.218 + assert.equal(event.type, "TabMove", "first tab moved"); 1.219 + assert.equal(event.target, tab1); 1.220 + }); 1.221 + assert.equal(tab1Events, isFennec ? 2 : 3, 1.222 + "correct number of events for first tab"); 1.223 + 1.224 + let tab2Events = 0; 1.225 + getRelatedEvents(events, tab2).map(event => { 1.226 + tab2Events++; 1.227 + if (tab2Events === 1) 1.228 + assert.equal(event.type, "TabOpen", "second tab opened"); 1.229 + else 1.230 + assert.equal(event.type, "TabSelect", "second tab selected"); 1.231 + assert.equal(event.target, tab2); 1.232 + }); 1.233 + done(); 1.234 + } 1.235 +}); 1.236 + 1.237 +function getRelatedEvents (events, tabs) { 1.238 + return events.filter(({target}) => ~([].concat(tabs)).indexOf(target)); 1.239 +} 1.240 + 1.241 +require("sdk/test").run(exports);