addon-sdk/source/test/test-tab-events.js

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:5fcc050eae61
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4
5 "use strict";
6
7 const { Loader } = require("sdk/test/loader");
8 const utils = require("sdk/tabs/utils");
9 const { open, close } = require("sdk/window/helpers");
10 const { getMostRecentBrowserWindow } = require("sdk/window/utils");
11 const { events } = require("sdk/tab/events");
12 const { on, off } = require("sdk/event/core");
13 const { resolve, defer } = require("sdk/core/promise");
14
15 let isFennec = require("sdk/system/xul-app").is("Fennec");
16
17 function test(options) {
18 return function(assert, done) {
19 let tabEvents = [];
20 let tabs = [];
21 let { promise, resolve: resolveP } = defer();
22 let win = isFennec ? resolve(getMostRecentBrowserWindow()) :
23 open(null, {
24 features: { private: true, toolbar:true, chrome: true }
25 });
26 let window = null;
27
28 // Firefox events are fired sync; Fennec events async
29 // this normalizes the tests
30 function handler (event) {
31 tabEvents.push(event);
32 runIfReady();
33 }
34
35 function runIfReady () {
36 let releventEvents = getRelatedEvents(tabEvents, tabs);
37 if (options.readyWhen(releventEvents))
38 options.end({
39 tabs: tabs,
40 events: releventEvents,
41 assert: assert,
42 done: resolveP
43 });
44 }
45
46 win.then(function(w) {
47 window = w;
48 on(events, "data", handler);
49 options.start({ tabs: tabs, window: window });
50
51 // Execute here for synchronous FF events, as the handlers
52 // were called before tabs were pushed to `tabs`
53 runIfReady();
54 return promise;
55 }).then(function() {
56 off(events, "data", handler);
57 return isFennec ? null : close(window);
58 }).then(done, assert.fail);
59 };
60 }
61
62 // Just making sure that tab events work for already opened tabs not only
63 // for new windows.
64 exports["test current window"] = test({
65 readyWhen: events => events.length === 3,
66 start: ({ tabs, window }) => {
67 let tab = utils.openTab(window, 'data:text/plain,open');
68 tabs.push(tab);
69 utils.closeTab(tab);
70 },
71 end: ({ tabs, events, assert, done }) => {
72 let [open, select, close] = events;
73 let tab = tabs[0];
74
75 assert.equal(open.type, "TabOpen");
76 assert.equal(open.target, tab);
77
78 assert.equal(select.type, "TabSelect");
79 assert.equal(select.target, tab);
80
81 assert.equal(close.type, "TabClose");
82 assert.equal(close.target, tab);
83 done();
84 }
85 });
86
87 exports["test open"] = test({
88 readyWhen: events => events.length === 2,
89 start: ({ tabs, window }) => {
90 tabs.push(utils.openTab(window, 'data:text/plain,open'));
91 },
92 end: ({ tabs, events, assert, done }) => {
93 let [open, select] = events;
94 let tab = tabs[0];
95
96 assert.equal(open.type, "TabOpen");
97 assert.equal(open.target, tab);
98
99 assert.equal(select.type, "TabSelect");
100 assert.equal(select.target, tab);
101 done();
102 }
103 });
104
105 exports["test open -> close"] = test({
106 readyWhen: events => events.length === 3,
107 start: ({ tabs, window }) => {
108 // First tab is useless we just open it so that closing second tab won't
109 // close window on some platforms.
110 utils.openTab(window, 'data:text/plain,ignore');
111 let tab = utils.openTab(window, 'data:text/plain,open-close');
112 tabs.push(tab);
113 utils.closeTab(tab);
114 },
115 end: ({ tabs, events, assert, done }) => {
116 let [open, select, close] = events;
117 let tab = tabs[0];
118
119 assert.equal(open.type, "TabOpen");
120 assert.equal(open.target, tab);
121
122 assert.equal(select.type, "TabSelect");
123 assert.equal(select.target, tab);
124
125 assert.equal(close.type, "TabClose");
126 assert.equal(close.target, tab);
127 done();
128 }
129 });
130
131 exports["test open -> open -> select"] = test({
132 readyWhen: events => events.length === 5,
133 start: ({tabs, window}) => {
134 tabs.push(utils.openTab(window, 'data:text/plain,Tab-1'));
135 tabs.push(utils.openTab(window, 'data:text/plain,Tab-2'));
136 utils.activateTab(tabs[0], window);
137 },
138 end: ({ tabs, events, assert, done }) => {
139 let [ tab1, tab2 ] = tabs;
140 let tab1Events = 0;
141 getRelatedEvents(events, tab1).map(event => {
142 tab1Events++;
143 if (tab1Events === 1)
144 assert.equal(event.type, "TabOpen", "first tab opened");
145 else
146 assert.equal(event.type, "TabSelect", "first tab selected");
147 assert.equal(event.target, tab1);
148 });
149 assert.equal(tab1Events, 3, "first tab has 3 events");
150
151 let tab2Opened;
152 getRelatedEvents(events, tab2).map(event => {
153 if (!tab2Opened)
154 assert.equal(event.type, "TabOpen", "second tab opened");
155 else
156 assert.equal(event.type, "TabSelect", "second tab selected");
157 tab2Opened = true;
158 assert.equal(event.target, tab2);
159 });
160 done();
161 }
162 });
163
164 exports["test open -> pin -> unpin"] = test({
165 readyWhen: events => events.length === (isFennec ? 2 : 5),
166 start: ({ tabs, window }) => {
167 tabs.push(utils.openTab(window, 'data:text/plain,pin-unpin'));
168 utils.pin(tabs[0]);
169 utils.unpin(tabs[0]);
170 },
171 end: ({ tabs, events, assert, done }) => {
172 let [open, select, move, pin, unpin] = events;
173 let tab = tabs[0];
174
175 assert.equal(open.type, "TabOpen");
176 assert.equal(open.target, tab);
177
178 assert.equal(select.type, "TabSelect");
179 assert.equal(select.target, tab);
180
181 if (isFennec) {
182 assert.pass("Tab pin / unpin is not supported by Fennec");
183 }
184 else {
185 assert.equal(move.type, "TabMove");
186 assert.equal(move.target, tab);
187
188 assert.equal(pin.type, "TabPinned");
189 assert.equal(pin.target, tab);
190
191 assert.equal(unpin.type, "TabUnpinned");
192 assert.equal(unpin.target, tab);
193 }
194 done();
195 }
196 });
197
198 exports["test open -> open -> move "] = test({
199 readyWhen: events => events.length === (isFennec ? 4 : 5),
200 start: ({tabs, window}) => {
201 tabs.push(utils.openTab(window, 'data:text/plain,Tab-1'));
202 tabs.push(utils.openTab(window, 'data:text/plain,Tab-2'));
203 utils.move(tabs[0], 2);
204 },
205 end: ({ tabs, events, assert, done }) => {
206 let [ tab1, tab2 ] = tabs;
207 let tab1Events = 0;
208 getRelatedEvents(events, tab1).map(event => {
209 tab1Events++;
210 if (tab1Events === 1)
211 assert.equal(event.type, "TabOpen", "first tab opened");
212 else if (tab1Events === 2)
213 assert.equal(event.type, "TabSelect", "first tab selected");
214 else if (tab1Events === 3 && isFennec)
215 assert.equal(event.type, "TabMove", "first tab moved");
216 assert.equal(event.target, tab1);
217 });
218 assert.equal(tab1Events, isFennec ? 2 : 3,
219 "correct number of events for first tab");
220
221 let tab2Events = 0;
222 getRelatedEvents(events, tab2).map(event => {
223 tab2Events++;
224 if (tab2Events === 1)
225 assert.equal(event.type, "TabOpen", "second tab opened");
226 else
227 assert.equal(event.type, "TabSelect", "second tab selected");
228 assert.equal(event.target, tab2);
229 });
230 done();
231 }
232 });
233
234 function getRelatedEvents (events, tabs) {
235 return events.filter(({target}) => ~([].concat(tabs)).indexOf(target));
236 }
237
238 require("sdk/test").run(exports);

mercurial