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

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

Issue 8203005: Implement chrome.experimental.downloads.onChanged (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: const downloadId Created 8 years, 10 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // downloads api test 5 // downloads api test
6 // browser_tests.exe --gtest_filter=DownloadsApiTest.Downloads 6 // browser_tests.exe --gtest_filter=DownloadsApiTest.Downloads
7 7
8 var downloads = chrome.experimental.downloads; 8 var downloads = chrome.experimental.downloads;
9 9
10 chrome.test.getConfig(function(testConfig) { 10 chrome.test.getConfig(function(testConfig) {
(...skipping 24 matching lines...) Expand all
35 }); 35 });
36 func.apply(null, args); 36 func.apply(null, args);
37 } catch (exception) { 37 } catch (exception) {
38 chrome.test.assertEq(exceptionMessage, exception.message); 38 chrome.test.assertEq(exceptionMessage, exception.message);
39 chrome.test.succeed(); 39 chrome.test.succeed();
40 } 40 }
41 } 41 }
42 42
43 // The "/slow" handler waits a specified amount of time before returning a 43 // The "/slow" handler waits a specified amount of time before returning a
44 // safe file. Specify zero seconds to return quickly. 44 // safe file. Specify zero seconds to return quickly.
45 var SAFE_FAST_URL = getURL('slow?0'); 45 const SAFE_FAST_URL = getURL('slow?0');
asanka 2012/02/13 19:45:47 Avoid 'const', here and elsewhere. See http://crbu
benjhayden 2012/02/13 21:05:31 Done. The style guide suggested that the reason t
46 var NEVER_FINISH_URL = getURL('download-known-size'); 46
47 var ERROR_GENERIC = downloads.ERROR_GENERIC; 47 const NEVER_FINISH_URL = getURL('download-known-size');
48 var ERROR_INVALID_URL = downloads.ERROR_INVALID_URL; 48
49 var ERROR_INVALID_OPERATION = downloads.ERROR_INVALID_OPERATION; 49 // This URL should only work with the POST method and a request body
50 // containing 'BODY'.
51 const POST_URL = getURL('files/post/downloads/a_zip_file.zip?' +
52 'expected_body=BODY');
53
54 // This URL should only work with headers 'Foo: bar' and 'Qx: yo'.
55 const HEADERS_URL = getURL('files/downloads/a_zip_file.zip?' +
56 'expected_headers=Foo:bar&expected_headers=Qx:yo');
50 57
51 chrome.test.runTests([ 58 chrome.test.runTests([
52 // TODO(benjhayden): Test onErased using remove(). 59 // TODO(benjhayden): Test onErased using remove().
60
61 // TODO(benjhayden): Sub-directories depend on http://crbug.com/109443
62 // TODO(benjhayden): Windows slashes.
63 // function downloadSubDirectoryFilename() {
64 // const downloadId = getNextId();
65 // var callbackCompleted = chrome.test.callbackAdded();
66 // function myListener(delta) {
67 // if ((delta.id != downloadId) ||
68 // !delta.filename ||
69 // (delta.filename.new.indexOf('/foo/slow') == -1))
70 // return;
71 // downloads.onChanged.removeListener(myListener);
72 // callbackCompleted();
73 // }
74 // downloads.onChanged.addListener(myListener);
75 // downloads.download(
76 // {'url': SAFE_FAST_URL, 'filename': 'foo/slow'},
77 // chrome.test.callback(function(id) {
78 // chrome.test.assertEq(downloadId, id);
79 // }));
80 // },
81
82 function downloadSimple() {
83 // Test that we can begin a download.
84 const downloadId = getNextId();
85 downloads.download(
86 {'url': SAFE_FAST_URL},
87 chrome.test.callback(function(id) {
88 chrome.test.assertEq(downloadId, id);
89 }));
90 },
91
92 function downloadPostSuccess() {
93 // Test the |method| download option.
94 const downloadId = getNextId();
95 var changedCompleted = chrome.test.callbackAdded();
96 function changedListener(delta) {
97 // Ignore onChanged events for downloads besides our own, or events that
98 // signal any change besides completion.
99 if ((delta.id != downloadId) ||
100 !delta.state ||
101 (delta.state.new != downloads.STATE_COMPLETE))
102 return;
103 downloads.search({id: downloadId},
104 chrome.test.callback(function(items) {
105 chrome.test.assertEq(1, items.length);
106 chrome.test.assertEq(downloadId, items[0].id);
107 const EXPECTED_SIZE = 164;
108 chrome.test.assertEq(EXPECTED_SIZE, items[0].totalBytes);
109 chrome.test.assertEq(EXPECTED_SIZE, items[0].fileSize);
110 chrome.test.assertEq(EXPECTED_SIZE, items[0].bytesReceived);
111 }));
112 downloads.onChanged.removeListener(changedListener);
113 changedCompleted();
114 }
115 downloads.onChanged.addListener(changedListener);
116
117 downloads.download(
118 {'url': POST_URL,
119 'method': 'POST',
120 'filename': downloadId + '.txt', // Prevent 'file' danger.
121 'body': 'BODY'},
122 chrome.test.callback(function(id) {
123 chrome.test.assertEq(downloadId, id);
124 }));
125 },
126
127 function downloadPostWouldFailWithoutMethod() {
128 // Test that downloadPostSuccess would fail if the resource requires the
129 // POST method, and chrome fails to propagate the |method| parameter back
130 // to the server. This tests both that testserver.py does not succeed when
131 // it should fail, and this tests how the downloads extension api exposes
132 // the failure to extensions.
133 const downloadId = getNextId();
134
135 var changedCompleted = chrome.test.callbackAdded();
136 function changedListener(delta) {
137 // Ignore onChanged events for downloads besides our own, or events that
138 // signal any change besides interruption.
139 if ((delta.id != downloadId) ||
140 !delta.state ||
141 (delta.state.new != downloads.STATE_COMPLETE))
142 return;
143 // TODO(benjhayden): Change COMPLETE to INTERRUPTED after
144 // http://crbug.com/112342
145 downloads.search({id: downloadId},
146 chrome.test.callback(function(items) {
147 chrome.test.assertEq(1, items.length);
148 chrome.test.assertEq(downloadId, items[0].id);
149 chrome.test.assertEq(0, items[0].totalBytes);
150 }));
151 downloads.onChanged.removeListener(changedListener);
152 changedCompleted();
153 }
154 downloads.onChanged.addListener(changedListener);
155
156 downloads.download(
157 {'url': POST_URL,
158 'filename': downloadId + '.txt', // Prevent 'file' danger.
159 'body': 'BODY'},
160 chrome.test.callback(function(id) {
161 chrome.test.assertEq(downloadId, id);
162 }));
163 },
164
165 function downloadPostWouldFailWithoutBody() {
166 // Test that downloadPostSuccess would fail if the resource requires the
167 // POST method and a request body, and chrome fails to propagate the
168 // |body| parameter back to the server. This tests both that testserver.py
169 // does not succeed when it should fail, and this tests how the downloads
170 // extension api exposes the failure to extensions.
171 const downloadId = getNextId();
172
173 var changedCompleted = chrome.test.callbackAdded();
174 function changedListener(delta) {
175 // Ignore onChanged events for downloads besides our own, or events that
176 // signal any change besides interruption.
177 if ((delta.id != downloadId) ||
178 !delta.state ||
179 (delta.state.new != downloads.STATE_COMPLETE))
180 return;
181 // TODO(benjhayden): Change COMPLETE to INTERRUPTED after
182 // http://crbug.com/112342
183 downloads.search({id: downloadId},
184 chrome.test.callback(function(items) {
185 chrome.test.assertEq(1, items.length);
186 chrome.test.assertEq(downloadId, items[0].id);
187 chrome.test.assertEq(0, items[0].totalBytes);
188 }));
189 downloads.onChanged.removeListener(changedListener);
190 changedCompleted();
191 }
192 downloads.onChanged.addListener(changedListener);
193
194 downloads.download(
195 {'url': POST_URL,
196 'filename': downloadId + '.txt', // Prevent 'file' danger.
197 'method': 'POST'},
198 chrome.test.callback(function(id) {
199 chrome.test.assertEq(downloadId, id);
200 }));
201 },
202
203 function downloadHeadersSuccess() {
204 // Test the |header| download option.
205 const downloadId = getNextId();
206 var changedCompleted = chrome.test.callbackAdded();
207 function changedListener(delta) {
208 // Ignore onChanged events for downloads besides our own, or events that
209 // signal any change besides completion.
210 if ((delta.id != downloadId) ||
211 !delta.state ||
212 (delta.state.new != downloads.STATE_COMPLETE))
213 return;
214 downloads.search({id: downloadId},
215 chrome.test.callback(function(items) {
216 chrome.test.assertEq(1, items.length);
217 chrome.test.assertEq(downloadId, items[0].id);
218 const EXPECTED_SIZE = 164;
219 chrome.test.assertEq(EXPECTED_SIZE, items[0].totalBytes);
220 chrome.test.assertEq(EXPECTED_SIZE, items[0].fileSize);
221 chrome.test.assertEq(EXPECTED_SIZE, items[0].bytesReceived);
222 }));
223 downloads.onChanged.removeListener(changedListener);
224 changedCompleted();
225 }
226 downloads.onChanged.addListener(changedListener);
227
228 downloads.download(
229 {'url': HEADERS_URL,
230 'filename': downloadId + '.txt', // Prevent 'file' danger.
231 'headers': [{'name': 'Foo', 'value': 'bar'},
232 {'name': 'Qx', 'value': 'yo'}]},
233 chrome.test.callback(function(id) {
234 chrome.test.assertEq(downloadId, id);
235 }));
236 },
237
238 function downloadHeadersWouldFail() {
239 // Test that downloadHeadersSuccess() would fail if the resource requires
240 // the headers, and chrome fails to propagate them back to the server.
241 // This tests both that testserver.py does not succeed when it should
242 // fail as well as how the downloads extension api exposes the
243 // failure to extensions.
244 const downloadId = getNextId();
245
246 var changedCompleted = chrome.test.callbackAdded();
247 function changedListener(delta) {
248 // Ignore onChanged events for downloads besides our own, or events that
249 // signal any change besides interruption.
250 if ((delta.id != downloadId) ||
251 !delta.state ||
252 (delta.state.new != downloads.STATE_COMPLETE))
253 return;
254 // TODO(benjhayden): Change COMPLETE to INTERRUPTED after
255 // http://crbug.com/112342
256 downloads.search({id: downloadId},
257 chrome.test.callback(function(items) {
258 chrome.test.assertEq(1, items.length);
259 chrome.test.assertEq(downloadId, items[0].id);
260 chrome.test.assertEq(0, items[0].totalBytes);
261 }));
262 downloads.onChanged.removeListener(changedListener);
263 changedCompleted();
264 }
265 downloads.onChanged.addListener(changedListener);
266
267 downloads.download(
268 {'url': HEADERS_URL},
269 chrome.test.callback(function(id) {
270 chrome.test.assertEq(downloadId, id);
271 }));
272 },
273
274 function downloadInterrupted() {
275 // Test that cancel()ing an in-progress download causes its state to
276 // transition to interrupted, and test that that state transition is
277 // detectable by an onChanged event listener.
278 // TODO(benjhayden): Test other sources of interruptions such as server
279 // death.
280 const downloadId = getNextId();
281
282 var createdCompleted = chrome.test.callbackAdded();
283 function createdListener(createdItem) {
284 // Ignore onCreated events for any download besides our own.
285 if (createdItem.id != downloadId)
286 return;
287 // TODO(benjhayden) Move this cancel() into the download() callback
288 // after ensuring that DownloadItems are created before that callback
289 // is fired.
290 downloads.cancel(downloadId, chrome.test.callback(function() {
291 }));
292 downloads.onCreated.removeListener(createdListener);
293 createdCompleted();
294 }
295 downloads.onCreated.addListener(createdListener);
296
297 var changedCompleted = chrome.test.callbackAdded();
298 function changedListener(delta) {
299 // Ignore onChanged events for downloads besides our own, or events that
300 // signal any change besides interruption.
301 if ((delta.id != downloadId) ||
302 !delta.state ||
303 (delta.state.new != downloads.STATE_INTERRUPTED))
304 return;
asanka 2012/02/13 19:45:47 Nit: Check delta.error.new?
benjhayden 2012/02/13 21:05:31 Done.
305 downloads.onChanged.removeListener(changedListener);
306 changedCompleted();
307 }
308 downloads.onChanged.addListener(changedListener);
309
310 downloads.download(
311 {'url': NEVER_FINISH_URL},
312 chrome.test.callback(function(id) {
313 chrome.test.assertEq(downloadId, id);
314 }));
315 },
316
317 function downloadOnChanged() {
318 // Test that download completion is detectable by an onChanged event
319 // listener.
320 const downloadId = getNextId();
321 var callbackCompleted = chrome.test.callbackAdded();
322 function myListener(delta) {
323 if ((delta.id != downloadId) ||
324 !delta.state ||
325 (delta.state.new != downloads.STATE_COMPLETE))
326 return;
327 downloads.onChanged.removeListener(myListener);
328 callbackCompleted();
329 }
330 downloads.onChanged.addListener(myListener);
331 downloads.download(
332 {"url": SAFE_FAST_URL},
333 chrome.test.callback(function(id) {
334 chrome.test.assertEq(downloadId, id);
335 }));
336 },
337
53 function downloadFilename() { 338 function downloadFilename() {
54 downloads.download( 339 // Test that we can suggest a filename for a new download, and test that
55 {'url': SAFE_FAST_URL, 'filename': 'foo'}, 340 // we can detect filename changes with an onChanged event listener.
56 chrome.test.callbackPass(function(id) { 341 const FILENAME = 'owiejtoiwjrfoiwjroiwjroiwjroiwjrfi';
57 chrome.test.assertEq(getNextId(), id); 342 const downloadId = getNextId();
58 })); 343 var callbackCompleted = chrome.test.callbackAdded();
59 // TODO(benjhayden): Test the filename using onChanged. 344 function myListener(delta) {
60 }, 345 if ((delta.id != downloadId) ||
346 !delta.filename ||
347 (delta.filename.new.indexOf(FILENAME) == -1))
asanka 2012/02/13 19:45:47 Is .filename intended to be the target (final) pat
benjhayden 2012/02/13 21:05:31 Yeah, there might be some more discussion to be ha
348 return;
349 downloads.onChanged.removeListener(myListener);
350 callbackCompleted();
351 }
352 downloads.onChanged.addListener(myListener);
353 downloads.download(
354 {'url': SAFE_FAST_URL, 'filename': FILENAME},
355 chrome.test.callback(function(id) {
356 chrome.test.assertEq(downloadId, id);
357 }));
358 },
359
61 function downloadOnCreated() { 360 function downloadOnCreated() {
62 chrome.test.listenOnce(downloads.onCreated, 361 // Test that the onCreated event fires when we start a download.
63 chrome.test.callbackPass(function(item) {})); 362 const downloadId = getNextId();
363 var createdCompleted = chrome.test.callbackAdded();
364 function createdListener(item) {
365 if (item.id == downloadId) {
366 createdCompleted();
367 downloads.onCreated.removeListener(createdListener);
368 }
369 };
370 downloads.onCreated.addListener(createdListener);
64 downloads.download( 371 downloads.download(
65 {'url': SAFE_FAST_URL}, 372 {'url': SAFE_FAST_URL},
66 function(id) { 373 chrome.test.callback(function(id) {
67 chrome.test.assertEq(getNextId(), id); 374 chrome.test.assertEq(downloadId, id);
68 }); 375 }));
69 }, 376 },
70 function downloadSubDirectoryFilename() { 377
71 downloads.download(
72 {'url': SAFE_FAST_URL, 'filename': 'foo/slow'},
73 chrome.test.callbackPass(function(id) {
74 chrome.test.assertEq(getNextId(), id);
75 }));
76 // TODO(benjhayden): Test the filename using onChanged.
77 },
78 function downloadInvalidFilename() { 378 function downloadInvalidFilename() {
379 // Test that we disallow invalid filenames for new downloads.
79 downloads.download( 380 downloads.download(
80 {'url': SAFE_FAST_URL, 'filename': '../../../../../etc/passwd'}, 381 {'url': SAFE_FAST_URL, 'filename': '../../../../../etc/passwd'},
81 chrome.test.callbackFail(ERROR_GENERIC)); 382 chrome.test.callbackFail(downloads.ERROR_GENERIC));
82 // TODO(benjhayden): Give a better error message. 383 },
83 }, 384
84 function downloadEmpty() { 385 function downloadEmpty() {
85 assertThrows(('Invalid value for argument 1. Property \'url\': ' + 386 assertThrows(('Invalid value for argument 1. Property \'url\': ' +
86 'Property is required.'), 387 'Property is required.'),
87 downloads.download, {}); 388 downloads.download, {});
88 }, 389 },
390
89 function downloadInvalidSaveAs() { 391 function downloadInvalidSaveAs() {
90 assertThrows(('Invalid value for argument 1. Property \'saveAs\': ' + 392 assertThrows(('Invalid value for argument 1. Property \'saveAs\': ' +
91 'Expected \'boolean\' but got \'string\'.'), 393 'Expected \'boolean\' but got \'string\'.'),
92 downloads.download, 394 downloads.download,
93 {'url': SAFE_FAST_URL, 'saveAs': 'GOAT'}); 395 {'url': SAFE_FAST_URL, 'saveAs': 'GOAT'});
94 }, 396 },
397
95 function downloadInvalidHeadersOption() { 398 function downloadInvalidHeadersOption() {
96 assertThrows(('Invalid value for argument 1. Property \'headers\': ' + 399 assertThrows(('Invalid value for argument 1. Property \'headers\': ' +
97 'Expected \'array\' but got \'string\'.'), 400 'Expected \'array\' but got \'string\'.'),
98 downloads.download, 401 downloads.download,
99 {'url': SAFE_FAST_URL, 'headers': 'GOAT'}); 402 {'url': SAFE_FAST_URL, 'headers': 'GOAT'});
100 }, 403 },
404
101 function downloadInvalidURL() { 405 function downloadInvalidURL() {
406 // Test that download() requires a valid url.
102 downloads.download( 407 downloads.download(
103 {'url': 'foo bar'}, 408 {'url': 'foo bar'},
104 chrome.test.callbackFail(ERROR_INVALID_URL)); 409 chrome.test.callbackFail(downloads.ERROR_INVALID_URL));
105 }, 410 },
411
106 function downloadInvalidMethod() { 412 function downloadInvalidMethod() {
107 assertThrows(('Invalid value for argument 1. Property \'method\': ' + 413 assertThrows(('Invalid value for argument 1. Property \'method\': ' +
108 'Value must be one of: [GET, POST].'), 414 'Value must be one of: [GET, POST].'),
109 downloads.download, 415 downloads.download,
110 {'url': SAFE_FAST_URL, 'method': 'GOAT'}); 416 {'url': SAFE_FAST_URL, 'method': 'GOAT'});
111 }, 417 },
112 function downloadSimple() { 418
113 downloads.download(
114 {'url': SAFE_FAST_URL},
115 chrome.test.callbackPass(function(id) {
116 chrome.test.assertEq(getNextId(), id);
117 }));
118 },
119 function downloadPost() {
120 downloads.download(
121 {'url': getURL('files/post/downloads/a_zip_file.js'),
122 'method': 'POST',
123 'body': 'WOOHOO'},
124 chrome.test.callbackPass(function(id) {
125 chrome.test.assertEq(getNextId(), id);
126 }));
127 },
128 function downloadHeader() {
129 downloads.download(
130 {'url': SAFE_FAST_URL,
131 'headers': [{'name': 'Foo', 'value': 'bar'}]
132 },
133 chrome.test.callbackPass(function(id) {
134 chrome.test.assertEq(getNextId(), id);
135 }));
136 },
137 function downloadInterrupted() {
138 // TODO(benjhayden): Find a suitable URL and test that this id is
139 // eventually interrupted using onChanged.
140 downloads.download(
141 {'url': SAFE_FAST_URL},
142 chrome.test.callbackPass(function(id) {
143 chrome.test.assertEq(getNextId(), id);
144 }));
145 },
146 function downloadInvalidHeader() { 419 function downloadInvalidHeader() {
420 // Test that download() disallows setting the Cookie header.
147 downloads.download( 421 downloads.download(
148 {'url': SAFE_FAST_URL, 422 {'url': SAFE_FAST_URL,
149 'headers': [{ 'name': 'Cookie', 'value': 'fake'}] 423 'headers': [{ 'name': 'Cookie', 'value': 'fake'}]
150 }, 424 },
151 chrome.test.callbackFail(ERROR_GENERIC)); 425 chrome.test.callbackFail(downloads.ERROR_GENERIC));
152 // TODO(benjhayden): Give a better error message. 426 },
153 }, 427
154 function downloadGetFileIconInvalidOptions() { 428 function downloadGetFileIconInvalidOptions() {
155 assertThrows(('Invalid value for argument 2. Property \'cat\': ' + 429 assertThrows(('Invalid value for argument 2. Property \'cat\': ' +
156 'Unexpected property.'), 430 'Unexpected property.'),
157 downloads.getFileIcon, 431 downloads.getFileIcon,
158 -1, {cat: 'mouse'}); 432 -1, {cat: 'mouse'});
159 }, 433 },
434
160 function downloadGetFileIconInvalidSize() { 435 function downloadGetFileIconInvalidSize() {
161 assertThrows(('Invalid value for argument 2. Property \'size\': ' + 436 assertThrows(('Invalid value for argument 2. Property \'size\': ' +
162 'Value must be one of: [16, 32].'), 437 'Value must be one of: [16, 32].'),
163 downloads.getFileIcon, -1, {size: 31}); 438 downloads.getFileIcon, -1, {size: 31});
164 }, 439 },
440
165 function downloadGetFileIconInvalidId() { 441 function downloadGetFileIconInvalidId() {
166 downloads.getFileIcon(-42, {size: 32}, 442 downloads.getFileIcon(-42, {size: 32},
167 chrome.test.callbackFail(ERROR_INVALID_OPERATION)); 443 chrome.test.callbackFail(downloads.ERROR_INVALID_OPERATION));
168 }, 444 },
169 function downloadNoComplete() { 445
170 // This is used partly to test cleanUp.
171 downloads.download(
172 {'url': NEVER_FINISH_URL},
173 chrome.test.callbackPass(function(id) {
174 chrome.test.assertEq(getNextId(), id);
175 }));
176 },
177 function downloadPauseInvalidId() { 446 function downloadPauseInvalidId() {
178 downloads.pause(-42, chrome.test.callbackFail(ERROR_INVALID_OPERATION)); 447 downloads.pause(-42, chrome.test.callbackFail(
179 }, 448 downloads.ERROR_INVALID_OPERATION));
449 },
450
180 function downloadPauseInvalidType() { 451 function downloadPauseInvalidType() {
181 assertThrows(('Invalid value for argument 1. Expected \'integer\' ' + 452 assertThrows(('Invalid value for argument 1. Expected \'integer\' ' +
182 'but got \'string\'.'), 453 'but got \'string\'.'),
183 downloads.pause, 454 downloads.pause,
184 'foo'); 455 'foo');
185 }, 456 },
457
186 function downloadResumeInvalidId() { 458 function downloadResumeInvalidId() {
187 downloads.resume(-42, chrome.test.callbackFail(ERROR_INVALID_OPERATION)); 459 downloads.resume(-42, chrome.test.callbackFail(
188 }, 460 downloads.ERROR_INVALID_OPERATION));
461 },
462
189 function downloadResumeInvalidType() { 463 function downloadResumeInvalidType() {
190 assertThrows(('Invalid value for argument 1. Expected \'integer\' ' + 464 assertThrows(('Invalid value for argument 1. Expected \'integer\' ' +
191 'but got \'string\'.'), 465 'but got \'string\'.'),
192 downloads.resume, 466 downloads.resume,
193 'foo'); 467 'foo');
194 }, 468 },
469
195 function downloadCancelInvalidId() { 470 function downloadCancelInvalidId() {
196 // Canceling a non-existent download is not considered an error. 471 // Canceling a non-existent download is not considered an error.
197 downloads.cancel(-42, chrome.test.callbackPass(function() {})); 472 downloads.cancel(-42, chrome.test.callback(function() {}));
198 }, 473 },
474
199 function downloadCancelInvalidType() { 475 function downloadCancelInvalidType() {
200 assertThrows(('Invalid value for argument 1. Expected \'integer\' ' + 476 assertThrows(('Invalid value for argument 1. Expected \'integer\' ' +
201 'but got \'string\'.'), 477 'but got \'string\'.'),
202 downloads.cancel, 'foo'); 478 downloads.cancel, 'foo');
203 }, 479 },
480
481 function downloadNoComplete() {
482 // This is used partly to test cleanUp.
483 const downloadId = getNextId();
484 downloads.download(
485 {'url': NEVER_FINISH_URL},
486 chrome.test.callback(function(id) {
487 chrome.test.assertEq(downloadId, id);
488 }));
489 },
490
204 function cleanUp() { 491 function cleanUp() {
205 // cleanUp must come last. It clears out all in-progress downloads 492 // cleanUp must come last. It clears out all in-progress downloads
206 // so the browser can shutdown cleanly. 493 // so the browser can shutdown cleanly.
207 for (var id = 0; id < nextId; ++id) { 494 for (var id = 0; id < nextId; ++id) {
208 downloads.cancel(id, chrome.test.callbackPass(function() {})); 495 downloads.cancel(id, chrome.test.callback(function() {}));
209 } 496 }
210 } 497 }
211 ]); 498 ]);
212 }); 499 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698