Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(608)

Side by Side Diff: chrome/test/data/extensions/api_test/offscreen_tabs/test.js

Issue 7720002: Chrome Extensions chrome.experimental.offscreenTabs.* API implementation, docs, and test. (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: '' Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // OffscreenTabs API test
6 // browser_tests.exe --gtest_filter=ExtensionApiTest.OffscreenTabs
jstritar 2011/09/16 16:03:50 ExperimentalApiTest
alexbost 2011/09/16 20:18:14 Done.
7
8 var pass = chrome.test.callbackPass;
9 var fail = chrome.test.callbackFail;
10 var assertEq = chrome.test.assertEq;
11 var assertTrue = chrome.test.assertTrue;
12
13 var extensionPath =
14 location.href.substring(0, location.href.lastIndexOf("/") + 1);
15
16 var inTabs = [
17 { "url":extensionPath + "a.html",
18 "width":200,
19 "height":200
20 },
jstritar 2011/09/16 16:03:50 style nits: spaces after the ':' { "url": exten
alexbost 2011/09/16 20:18:14 Done.
21 { "url":extensionPath + "b.html",
22 "width":200,
23 "height":200
24 },
25 { "url":extensionPath + "c.html",
26 "width":1000,
27 "height":800
28 }
29 ];
30
31 // Tab management
jstritar 2011/09/16 16:03:50 can you make the comment more useful? or remove it
alexbost 2011/09/16 20:18:14 Done.
32 var tabs = [];
33
34 // Mouse
35
jstritar 2011/09/16 16:03:50 remove new line
alexbost 2011/09/16 20:18:14 Done.
36 var tabMouse = new Object();
37
38 var mouseEvent = {
39 "button":0,
jstritar 2011/09/16 16:03:50 "button": 0, etc..
alexbost 2011/09/16 20:18:14 Done.
40 "altKey":false,
41 "ctrlKey":false,
42 "shiftKey":false
43 };
44
45 var x = 11;
46 var y = 11;
47
48 // Keyboard
49
jstritar 2011/09/16 16:03:50 ditto on these comments. they don't add much right
alexbost 2011/09/16 20:18:14 Done.
50 var tabKeyboard = new Object();
51
52 // ToDataUrl
53
54 var tabsCaptured = [];
55
56 var nTabsCaptured = 2;
57
58 // Util
59
60 function compareTabs(tabA, tabB) {
61 assertEq(tabA.id, tabB.id);
62 assertEq(tabA.url, tabB.url);
63 assertEq(tabA.width, tabB.width);
64 assertEq(tabA.height, tabB.height);
65 }
66
67 function sortTab(tabA, tabB) {
68 return tabA.id - tabB.id;
69 }
70
71 function verifyTabDoesNotExist(tabId) {
72 chrome.experimental.offscreenTabs.
73 get(tabId, fail("No offscreen tab with id: " + tabId + "."));
74 }
75
76 // Tab management --------------------------------------------------------------
77
78 function startTabManagement() {
79 var nCallbacksNotDone = inTabs.length;
80
81 for (var i=0; i<inTabs.length; i++) {
82 chrome.experimental.offscreenTabs.create(
83 { "url":inTabs[i].url,
84 "width":inTabs[i].width,
85 "height":inTabs[i].height
86 },
87 function() {
88 var j = i;
jstritar 2011/09/16 16:03:50 indent the function body 2 spaces less
alexbost 2011/09/16 20:18:14 Done.
89 return function(tab) {
90 tabs[j] = tab;
91
92 nCallbacksNotDone--;
93
94 if (nCallbacksNotDone == 0)
95 getAll();
96 }
97 }()
98 );
99 }
100 }
101
102 function getAll() {
103 chrome.experimental.offscreenTabs.getAll(function(tabsResult) {
104 assertEq(tabs.length, tabsResult.length);
jstritar 2011/09/16 16:03:50 indent 2 spaces less
alexbost 2011/09/16 20:18:14 Done.
105
106 tabs.sort(sortTab);
107 tabsResult.sort(sortTab);
108
109 for (var i=0; i<tabs.length; i++)
110 compareTabs(tabs[i], tabsResult[i]);
111
112 get();
113 });
114 }
115
116 function get() {
117 var comparedTab = tabs[0];
118
119 chrome.experimental.offscreenTabs.get(comparedTab.id, function(tab) {
120 compareTabs(comparedTab, tab);
121
122 update();
123 });
124 }
125
126 function update() {
127 var replicatedTab = tabs[0];
128
129 chrome.experimental.offscreenTabs.update(tabs[1].id,
130 { "url":replicatedTab.url,
131 "width":replicatedTab.width,
132 "height":replicatedTab.height
133 },
134 function(tab) {
135 assertEq(replicatedTab.url, tab.url);
136 assertEq(replicatedTab.width, tab.width);
137 assertEq(replicatedTab.height, tab.height);
138
139 remove();
140 }
141 );
142 }
143
144 function remove() {
145 for (var i=0; i<inTabs.length; i++) {
146 chrome.experimental.offscreenTabs.remove(tabs[i].id);
147
148 verifyTabDoesNotExist(tabs[i].id);
149 }
150 }
151
152 // Mouse -----------------------------------------------------------------------
153
154 function startMouseEvents() {
155 chrome.experimental.offscreenTabs.onUpdated.addListener(listener =
jstritar 2011/09/16 16:03:50 We have a helper method, chrome.test.listenOnce, t
alexbost 2011/09/16 20:18:14 Bingo! (Not completely sure if it will work in my
156 function (tabId, changeInfo, tab) {
157 chrome.experimental.offscreenTabs.onUpdated.removeListener(listener);
158
159 assertEq(inTabs[0].url, changeInfo.url);
160 assertEq(inTabs[0].url, tab.url);
161 assertEq(inTabs[0].width, tab.width);
162 assertEq(inTabs[0].height, tab.height);
163
164 tabMouse = tab;
165
166 mouseClick();
167 });
168
169 chrome.experimental.offscreenTabs.create(
170 { "url":inTabs[0].url,
171 "width":inTabs[0].width,
172 "height":inTabs[0].height
173 }
174 );
175 }
176
177 function mouseClick() {
178 chrome.experimental.offscreenTabs.onUpdated.addListener(listener =
179 function(tabId, changeInfo, tab) {
180 chrome.experimental.offscreenTabs.onUpdated.removeListener(listener);
181
182 assertEq(tabMouse.id, tabId);
183 assertEq(tabMouse.id, tab.id);
184 assertEq(inTabs[1].url, changeInfo.url);
185 assertEq(inTabs[1].url, tab.url);
186 assertEq(tabMouse.width, tab.width);
187 assertEq(tabMouse.height, tab.height);
188
189 mouseWheel();
190 });
191
192 mouseEvent.type = "click";
193 chrome.experimental.offscreenTabs.
194 sendMouseEvent(tabMouse.id, mouseEvent, x, y);
195 }
196
197 function mouseWheel() {
198 mouseEvent.type = "mousewheel";
199 mouseEvent.wheelDeltaX = 0;
200 mouseEvent.wheelDeltaY = -100;
201 chrome.experimental.offscreenTabs.
202 sendMouseEvent(tabMouse.id, mouseEvent, 0, 0, function(tab) {
203 mouseDownUp();
204 }
205 );
206 }
207
208 function mouseDownUp() {
209 chrome.experimental.offscreenTabs.onUpdated.addListener(listener =
210 function(tabId, changeInfo, tab) {
211 chrome.experimental.offscreenTabs.onUpdated.removeListener(listener);
212
213 assertEq(inTabs[2].url, tab.url);
214
215 removeMouse();
216 });
217
218 mouseEvent.type = "mousedown";
219 chrome.experimental.offscreenTabs.
220 sendMouseEvent(tabMouse.id, mouseEvent, x, y);
221
222 mouseEvent.type = "mouseup";
223 chrome.experimental.offscreenTabs.
224 sendMouseEvent(tabMouse.id, mouseEvent, x, y);
225 }
226
227 function removeMouse() {
jstritar 2011/09/16 16:03:50 see comments about removeKeyboard
alexbost 2011/09/16 20:18:14 Done.
228 chrome.experimental.offscreenTabs.remove(tabMouse.id);
229
230 verifyTabDoesNotExist(tabMouse.id);
231 }
232
233 // Keyboard --------------------------------------------------------------------
234
235 function startKeyboardEvents() {
236 chrome.experimental.offscreenTabs.onUpdated.addListener(listener =
jstritar 2011/09/16 16:03:50 chrome.test.listenOnce
jstritar 2011/09/16 16:03:50 Why do you wait for onUpdated here? Why not just c
alexbost 2011/09/16 20:18:14 Done.
alexbost 2011/09/16 20:18:14 Because create might return before the page has na
237 function(tabId, changeInfo, tab) {
238 chrome.experimental.offscreenTabs.onUpdated.removeListener(listener);
239
240 tabKeyboard = tab;
241
242 keyPress();
243 });
244
245 chrome.experimental.offscreenTabs.create(
246 { "url":inTabs[0].url,
247 "width":inTabs[0].width,
248 "height":inTabs[0].height
249 }
250 );
jstritar 2011/09/16 16:03:50 I'm not sure about this but it's probably safer to
alexbost 2011/09/16 20:18:14 I had some trouble using the pass function with th
251 }
252
253 function keyPress() {
254 chrome.experimental.offscreenTabs.onUpdated.addListener(listener =
jstritar 2011/09/16 16:03:50 ditto on chrome.test.listenOnce
alexbost 2011/09/16 20:18:14 Done.
255 function(tabId, changeInfo, tab) {
256 chrome.experimental.offscreenTabs.onUpdated.removeListener(listener);
257
258 assertEq(inTabs[1].url, tab.url);
259
260 removeKeyboard();
261 });
262
263 var keyboardEvent = {
264 "type":"keypress",
265 "charCode":113, // q
266 "keyCode":113,
267 "altKey":false,
268 "ctrlKey":false,
269 "shiftKey":false
270 };
271
272 chrome.experimental.offscreenTabs.
273 sendKeyboardEvent(tabKeyboard.id, keyboardEvent);
274 }
275
276 function removeKeyboard() {
jstritar 2011/09/16 16:03:50 I don't think this needs to be its own method sinc
alexbost 2011/09/16 20:18:14 Done.
277 chrome.experimental.offscreenTabs.remove(tabKeyboard.id);
278
279 verifyTabDoesNotExist(tabKeyboard.id);
jstritar 2011/09/16 16:03:50 There's a race condition here. The tab may not rea
alexbost 2011/09/16 20:18:14 Done. BTW, I think there is a bug in the tabs API
280 }
281
282 // toDataUrl -------------------------------------------------------------------
283
284 // In order to test that we don't get empty images back we can compare two
285 // images that are supposed to be different. We only need to make sure the two
286 // offscreen tabs have the same size (i.e. inTabs[0] and inTabs[1])
287 function startToDataUrl() {
288 var nCallbacksNotDone = nTabsCaptured;
289
290 for (var i=0; i<nTabsCaptured; i++) {
291 chrome.experimental.offscreenTabs.create(
292 { "url":inTabs[i].url,
293 "width":inTabs[i].width,
294 "height":inTabs[i].height
295 },
296 function() {
297 var j = i;
298 return function(tab) {
299 tabsCaptured[j] = tab;
300
301 nCallbacksNotDone--;
302
303 if (nCallbacksNotDone == 0)
304 toDataUrl();
305 }
306 }()
307 );
308 }
309 }
310
311 function toDataUrl() {
312 var nCallbacksNotDone = nTabsCaptured;
313
314 for (var i=0; i<nTabsCaptured; i++) {
315 chrome.experimental.offscreenTabs.toDataUrl(
316 tabsCaptured[i].id,
317 {"format":"png"},
318 function(dataUrl) {
319 var j = i;
320 return function(dataUrl) {
321 assertEq('string', typeof(dataUrl));
322 assertEq('data:image/png;base64,', dataUrl.substr(0,22));
323
324 tabsCaptured[j].dataUrl = dataUrl;
325
326 nCallbacksNotDone--;
327
328 if (nCallbacksNotDone == 0) {
329 // Compare the dataUrls
330 assertTrue(tabsCaptured[0].dataUrl != tabsCaptured[1].dataUrl);
331
332 removeToDataUrl();
333 }
334 }
335 }()
336 );
337 }
338 }
339
340 function removeToDataUrl() {
341 for (var i=0; i<nTabsCaptured; i++) {
342 chrome.experimental.offscreenTabs.remove(tabsCaptured[i].id);
343
344 verifyTabDoesNotExist(tabsCaptured[i].id);
345 }
346 }
347
348 // Run tests ------------------------------------------------------------------
349
350 function run() {
jstritar 2011/09/16 16:03:50 You don't need the run() method-- the chrome.test.
alexbost 2011/09/16 20:18:14 Done.
351 chrome.test.runTests([
352 function tabManagement() {
jstritar 2011/09/16 16:03:50 I think you have race conditions in these tests- t
alexbost 2011/09/16 20:18:14 Unfortunately, I haven't been able to use the pass
jstritar 2011/09/16 21:02:41 I do think you need them. The timing issue could s
alexbost 2011/09/16 21:46:53 This error is caused by create returning before th
jstritar 2011/09/16 22:14:22 Okay, as long as the tests are passing now, I can
353 startTabManagement();
jstritar 2011/09/16 16:03:50 I think these tests would be easier to follow if y
alexbost 2011/09/16 20:18:14 Yes, I tried to stay away from the multiple levels
354 }
355 ,
jstritar 2011/09/16 16:03:50 nit: comma right after the '}' like this },
alexbost 2011/09/16 20:18:14 Done.
356 function mouseEvents() {
jstritar 2011/09/16 16:03:50 Can you add comments to each of these to make clea
alexbost 2011/09/16 20:18:14 Done.
357 startMouseEvents();
358 }
359 ,
360 function keyboardEvents() {
361 startKeyboardEvents();
362 }
363 ,
364 function toDataUrl() {
365 startToDataUrl();
366 }
367 ]);
368 }
369
370 run();
371
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698