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

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

Issue 9460010: test http auth-basic handling and implement headers.binaryValue for downloads.download() (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: include load_flags.h Created 8 years, 9 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
« no previous file with comments | « chrome/browser/download/download_extension_api.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 // Uncomment this when the apitest is re-enabled.
9 // console.debug = function() {};
10
11 function debugObject(obj) {
12 for (var property in obj) {
13 console.debug(property + ': ' + obj[property]);
14 }
15 }
16
8 var downloads = chrome.experimental.downloads; 17 var downloads = chrome.experimental.downloads;
9 18
10 chrome.test.getConfig(function(testConfig) { 19 chrome.test.getConfig(function(testConfig) {
11 function getURL(path) { 20 function getURL(path) {
12 return 'http://localhost:' + testConfig.testServer.port + '/' + path; 21 return 'http://localhost:' + testConfig.testServer.port + '/' + path;
13 } 22 }
14 23
15 var nextId = 0; 24 var nextId = 0;
16 function getNextId() { 25 function getNextId() {
17 return nextId++; 26 return nextId++;
(...skipping 30 matching lines...) Expand all
48 57
49 // This URL should only work with the POST method and a request body 58 // This URL should only work with the POST method and a request body
50 // containing 'BODY'. 59 // containing 'BODY'.
51 var POST_URL = getURL('files/post/downloads/a_zip_file.zip?' + 60 var POST_URL = getURL('files/post/downloads/a_zip_file.zip?' +
52 'expected_body=BODY'); 61 'expected_body=BODY');
53 62
54 // This URL should only work with headers 'Foo: bar' and 'Qx: yo'. 63 // This URL should only work with headers 'Foo: bar' and 'Qx: yo'.
55 var HEADERS_URL = getURL('files/downloads/a_zip_file.zip?' + 64 var HEADERS_URL = getURL('files/downloads/a_zip_file.zip?' +
56 'expected_headers=Foo:bar&expected_headers=Qx:yo'); 65 'expected_headers=Foo:bar&expected_headers=Qx:yo');
57 66
67 // A simple handler that requires http auth basic.
68 var AUTH_BASIC_URL = getURL('auth-basic');
69
70 // This is just base64 of 'username:secret'.
71 var AUTHORIZATION = 'dXNlcm5hbWU6c2VjcmV0';
72
58 chrome.test.runTests([ 73 chrome.test.runTests([
59 // TODO(benjhayden): Test onErased using remove(). 74 // TODO(benjhayden): Test onErased using remove().
60 75
61 // TODO(benjhayden): Sub-directories depend on http://crbug.com/109443 76 // TODO(benjhayden): Sub-directories depend on http://crbug.com/109443
62 // TODO(benjhayden): Windows slashes. 77 // TODO(benjhayden): Windows slashes.
63 // function downloadSubDirectoryFilename() { 78 // function downloadSubDirectoryFilename() {
64 // var downloadId = getNextId(); 79 // var downloadId = getNextId();
65 // var callbackCompleted = chrome.test.callbackAdded(); 80 // var callbackCompleted = chrome.test.callbackAdded();
66 // function myListener(delta) { 81 // function myListener(delta) {
67 // if ((delta.id != downloadId) || 82 // if ((delta.id != downloadId) ||
68 // !delta.filename || 83 // !delta.filename ||
69 // (delta.filename.new.indexOf('/foo/slow') == -1)) 84 // (delta.filename.new.indexOf('/foo/slow') == -1))
70 // return; 85 // return;
71 // downloads.onChanged.removeListener(myListener); 86 // downloads.onChanged.removeListener(myListener);
72 // callbackCompleted(); 87 // callbackCompleted();
73 // } 88 // }
74 // downloads.onChanged.addListener(myListener); 89 // downloads.onChanged.addListener(myListener);
75 // downloads.download( 90 // downloads.download(
76 // {'url': SAFE_FAST_URL, 'filename': 'foo/slow'}, 91 // {'url': SAFE_FAST_URL, 'filename': 'foo/slow'},
77 // chrome.test.callback(function(id) { 92 // chrome.test.callback(function(id) {
78 // chrome.test.assertEq(downloadId, id); 93 // chrome.test.assertEq(downloadId, id);
79 // })); 94 // }));
80 // }, 95 // },
81 96
82 function downloadSimple() { 97 function downloadSimple() {
83 // Test that we can begin a download. 98 // Test that we can begin a download.
84 var downloadId = getNextId(); 99 var downloadId = getNextId();
85 console.log(downloadId); 100 console.debug(downloadId);
86 downloads.download( 101 downloads.download(
87 {'url': SAFE_FAST_URL}, 102 {'url': SAFE_FAST_URL},
88 chrome.test.callback(function(id) { 103 chrome.test.callback(function(id) {
89 chrome.test.assertEq(downloadId, id); 104 chrome.test.assertEq(downloadId, id);
90 })); 105 }));
91 }, 106 },
92 107
108 function downloadOnChanged() {
109 // Test that download completion is detectable by an onChanged event
110 // listener.
111 var downloadId = getNextId();
112 console.debug(downloadId);
113 var callbackCompleted = chrome.test.callbackAdded();
114 function myListener(delta) {
115 console.debug(delta.id);
116 if ((delta.id != downloadId) ||
117 !delta.state)
118 return;
119 chrome.test.assertEq(downloads.STATE_COMPLETE, delta.state.new);
120 console.debug(downloadId);
121 downloads.onChanged.removeListener(myListener);
122 callbackCompleted();
123 }
124 downloads.onChanged.addListener(myListener);
125 downloads.download(
126 {"url": SAFE_FAST_URL},
127 chrome.test.callback(function(id) {
128 console.debug(downloadId);
129 chrome.test.assertEq(downloadId, id);
130 }));
131 },
132
133 function downloadAuthBasicFail() {
134 var downloadId = getNextId();
135 console.debug(downloadId);
136
137 var changedCompleted = chrome.test.callbackAdded();
138 function changedListener(delta) {
139 console.debug(delta.id);
140 // Ignore onChanged events for downloads besides our own, or events that
141 // signal any change besides completion.
142 if ((delta.id != downloadId) ||
143 !delta.state ||
144 !delta.error)
145 return;
146 console.debug(downloadId);
147 chrome.test.assertEq(downloads.STATE_INTERRUPTED, delta.state.new);
148 chrome.test.assertEq(30, delta.error.new);
149 downloads.onChanged.removeListener(changedListener);
150 if (changedCompleted) {
151 changedCompleted();
152 changedCompleted = null;
153 }
154 }
155 downloads.onChanged.addListener(changedListener);
156
157 // Sometimes the DownloadsEventRouter detects the item for the first time
158 // after the item has already been interrupted. In this case, the
159 // onChanged event never fires, so run the changedListener manually. If
160 // the DownloadsEventRouter detects the item before it's interrupted, then
161 // the onChanged event should fire correctly.
162 var createdCompleted = chrome.test.callbackAdded();
163 function createdListener(createdItem) {
164 console.debug(createdItem.id);
165 // Ignore events for any download besides our own.
166 if (createdItem.id != downloadId)
167 return;
168 console.debug(downloadId);
169 downloads.onCreated.removeListener(createdListener);
170 createdCompleted();
171 if (createdItem.state == downloads.STATE_INTERRUPTED) {
172 changedListener({id: downloadId, state: {new: createdItem.state},
173 error: {new: createdItem.error}});
174 }
175 }
176 downloads.onCreated.addListener(createdListener);
177
178 downloads.download(
179 {'url': AUTH_BASIC_URL,
180 'filename': downloadId + '.txt'},
181 chrome.test.callback(function(id) {
182 console.debug(downloadId);
183 chrome.test.assertEq(downloadId, id);
184 }));
185 },
186
187 function downloadAuthBasicSucceed() {
188 var downloadId = getNextId();
189 console.debug(downloadId);
190
191 var changedCompleted = chrome.test.callbackAdded();
192 function changedListener(delta) {
193 console.debug(delta.id);
194 // Ignore onChanged events for downloads besides our own, or events that
195 // signal any change besides completion.
196 if ((delta.id != downloadId) ||
197 !delta.state)
198 return;
199 chrome.test.assertEq(downloads.STATE_COMPLETE, delta.state.new);
200 console.debug(downloadId);
201 downloads.onChanged.removeListener(changedListener);
202 changedCompleted();
203 }
204 downloads.onChanged.addListener(changedListener);
205
206 downloads.download(
207 {'url': AUTH_BASIC_URL,
208 'headers': [{'name': 'Authorization',
209 'value': 'Basic ' + AUTHORIZATION}],
210 'filename': downloadId + '.txt'},
211 chrome.test.callback(function(id) {
212 console.debug(downloadId);
213 chrome.test.assertEq(downloadId, id);
214 }));
215 },
216
93 function downloadPostSuccess() { 217 function downloadPostSuccess() {
94 // Test the |method| download option. 218 // Test the |method| download option.
95 var downloadId = getNextId(); 219 var downloadId = getNextId();
96 console.log(downloadId); 220 console.debug(downloadId);
97 var changedCompleted = chrome.test.callbackAdded(); 221 var changedCompleted = chrome.test.callbackAdded();
98 function changedListener(delta) { 222 function changedListener(delta) {
99 console.log(delta.id); 223 console.debug(delta.id);
100 // Ignore onChanged events for downloads besides our own, or events that 224 // Ignore onChanged events for downloads besides our own, or events that
101 // signal any change besides completion. 225 // signal any change besides completion.
102 if ((delta.id != downloadId) || 226 if ((delta.id != downloadId) ||
103 !delta.state || 227 !delta.state)
104 (delta.state.new != downloads.STATE_COMPLETE))
105 return; 228 return;
106 console.log(downloadId); 229 chrome.test.assertEq(downloads.STATE_COMPLETE, delta.state.new);
230 console.debug(downloadId);
107 downloads.search({id: downloadId}, 231 downloads.search({id: downloadId},
108 chrome.test.callback(function(items) { 232 chrome.test.callback(function(items) {
109 console.log(downloadId); 233 console.debug(downloadId);
110 chrome.test.assertEq(1, items.length); 234 chrome.test.assertEq(1, items.length);
111 chrome.test.assertEq(downloadId, items[0].id); 235 chrome.test.assertEq(downloadId, items[0].id);
236 debugObject(items[0]);
112 var EXPECTED_SIZE = 164; 237 var EXPECTED_SIZE = 164;
113 chrome.test.assertEq(EXPECTED_SIZE, items[0].totalBytes);
114 chrome.test.assertEq(EXPECTED_SIZE, items[0].fileSize);
115 chrome.test.assertEq(EXPECTED_SIZE, items[0].bytesReceived); 238 chrome.test.assertEq(EXPECTED_SIZE, items[0].bytesReceived);
116 })); 239 }));
117 downloads.onChanged.removeListener(changedListener); 240 downloads.onChanged.removeListener(changedListener);
118 changedCompleted(); 241 changedCompleted();
119 } 242 }
120 downloads.onChanged.addListener(changedListener); 243 downloads.onChanged.addListener(changedListener);
121 244
122 downloads.download( 245 downloads.download(
123 {'url': POST_URL, 246 {'url': POST_URL,
124 'method': 'POST', 247 'method': 'POST',
125 'filename': downloadId + '.txt', 248 'filename': downloadId + '.txt',
126 'body': 'BODY'}, 249 'body': 'BODY'},
127 chrome.test.callback(function(id) { 250 chrome.test.callback(function(id) {
128 console.log(downloadId); 251 console.debug(downloadId);
129 chrome.test.assertEq(downloadId, id); 252 chrome.test.assertEq(downloadId, id);
130 })); 253 }));
131 }, 254 },
132 255
133 function downloadPostWouldFailWithoutMethod() { 256 function downloadPostWouldFailWithoutMethod() {
134 // Test that downloadPostSuccess would fail if the resource requires the 257 // Test that downloadPostSuccess would fail if the resource requires the
135 // POST method, and chrome fails to propagate the |method| parameter back 258 // POST method, and chrome fails to propagate the |method| parameter back
136 // to the server. This tests both that testserver.py does not succeed when 259 // to the server. This tests both that testserver.py does not succeed when
137 // it should fail, and this tests how the downloads extension api exposes 260 // it should fail, and this tests how the downloads extension api exposes
138 // the failure to extensions. 261 // the failure to extensions.
139 var downloadId = getNextId(); 262 var downloadId = getNextId();
140 console.log(downloadId); 263 console.debug(downloadId);
141 264
142 var changedCompleted = chrome.test.callbackAdded(); 265 var changedCompleted = chrome.test.callbackAdded();
143 function changedListener(delta) { 266 function changedListener(delta) {
144 console.log(delta.id); 267 console.debug(delta.id);
145 // Ignore onChanged events for downloads besides our own, or events that 268 // Ignore onChanged events for downloads besides our own, or events that
146 // signal any change besides interruption. 269 // signal any change besides interruption.
147 if ((delta.id != downloadId) || 270 if ((delta.id != downloadId) ||
148 !delta.state || 271 !delta.state ||
149 (delta.state.new != downloads.STATE_COMPLETE)) 272 !delta.error)
150 return; 273 return;
151 console.log(downloadId); 274 chrome.test.assertEq(downloads.STATE_INTERRUPTED, delta.state.new);
152 // TODO(benjhayden): Change COMPLETE to INTERRUPTED after 275 chrome.test.assertEq(33, delta.error.new);
153 // http://crbug.com/112342 276 console.debug(downloadId);
154 downloads.search({id: downloadId},
155 chrome.test.callback(function(items) {
156 console.log(downloadId);
157 chrome.test.assertEq(1, items.length);
158 chrome.test.assertEq(downloadId, items[0].id);
159 chrome.test.assertEq(0, items[0].totalBytes);
160 }));
161 downloads.onChanged.removeListener(changedListener); 277 downloads.onChanged.removeListener(changedListener);
162 changedCompleted(); 278 if (changedCompleted) {
279 changedCompleted();
280 changedCompleted = null;
281 }
163 } 282 }
164 downloads.onChanged.addListener(changedListener); 283 downloads.onChanged.addListener(changedListener);
165 284
285 // Sometimes the DownloadsEventRouter detects the item for the first time
286 // after the item has already been interrupted. In this case, the
287 // onChanged event never fires, so run the changedListener manually. If
288 // the DownloadsEventRouter detects the item before it's interrupted, then
289 // the onChanged event should fire correctly.
290 var createdCompleted = chrome.test.callbackAdded();
291 function createdListener(createdItem) {
292 console.debug(createdItem.id);
293 // Ignore events for any download besides our own.
294 if (createdItem.id != downloadId)
295 return;
296 console.debug(downloadId);
297 downloads.onCreated.removeListener(createdListener);
298 createdCompleted();
299 if (createdItem.state == downloads.STATE_INTERRUPTED) {
300 changedListener({id: downloadId, state: {new: createdItem.state},
301 error: {new: createdItem.error}});
302 }
303 }
304 downloads.onCreated.addListener(createdListener);
305
166 downloads.download( 306 downloads.download(
167 {'url': POST_URL, 307 {'url': POST_URL,
168 'filename': downloadId + '.txt', // Prevent 'file' danger. 308 'filename': downloadId + '.txt', // Prevent 'file' danger.
169 'body': 'BODY'}, 309 'body': 'BODY'},
170 chrome.test.callback(function(id) { 310 chrome.test.callback(function(id) {
171 console.log(downloadId); 311 console.debug(downloadId);
172 chrome.test.assertEq(downloadId, id); 312 chrome.test.assertEq(downloadId, id);
173 })); 313 }));
174 }, 314 },
175 315
176 function downloadPostWouldFailWithoutBody() { 316 function downloadPostWouldFailWithoutBody() {
177 // Test that downloadPostSuccess would fail if the resource requires the 317 // Test that downloadPostSuccess would fail if the resource requires the
178 // POST method and a request body, and chrome fails to propagate the 318 // POST method and a request body, and chrome fails to propagate the
179 // |body| parameter back to the server. This tests both that testserver.py 319 // |body| parameter back to the server. This tests both that testserver.py
180 // does not succeed when it should fail, and this tests how the downloads 320 // does not succeed when it should fail, and this tests how the downloads
181 // extension api exposes the failure to extensions. 321 // extension api exposes the failure to extensions.
182 var downloadId = getNextId(); 322 var downloadId = getNextId();
183 console.log(downloadId); 323 console.debug(downloadId);
184 324
185 var changedCompleted = chrome.test.callbackAdded(); 325 var changedCompleted = chrome.test.callbackAdded();
186 function changedListener(delta) { 326 function changedListener(delta) {
187 console.log(delta.id); 327 console.debug(delta.id);
188 // Ignore onChanged events for downloads besides our own, or events that 328 // Ignore onChanged events for downloads besides our own, or events that
189 // signal any change besides interruption. 329 // signal any change besides interruption.
190 if ((delta.id != downloadId) || 330 if ((delta.id != downloadId) ||
191 !delta.state || 331 !delta.state ||
192 (delta.state.new != downloads.STATE_COMPLETE)) 332 !delta.error)
193 return; 333 return;
194 console.log(downloadId); 334 chrome.test.assertEq(downloads.STATE_INTERRUPTED, delta.state.new);
195 // TODO(benjhayden): Change COMPLETE to INTERRUPTED after 335 chrome.test.assertEq(33, delta.error.new);
196 // http://crbug.com/112342 336 if (delta.error) console.debug(delta.error.new);
337 console.debug(downloadId);
338 downloads.onChanged.removeListener(changedListener);
339 if (changedCompleted) {
340 changedCompleted();
341 changedCompleted = null;
342 }
343 }
344 downloads.onChanged.addListener(changedListener);
345
346 // Sometimes the DownloadsEventRouter detects the item for the first time
347 // after the item has already been interrupted. In this case, the
348 // onChanged event never fires, so run the changedListener manually. If
349 // the DownloadsEventRouter detects the item before it's interrupted, then
350 // the onChanged event should fire correctly.
351 var createdCompleted = chrome.test.callbackAdded();
352 function createdListener(createdItem) {
353 console.debug(createdItem.id);
354 // Ignore events for any download besides our own.
355 if (createdItem.id != downloadId)
356 return;
357 console.debug(downloadId);
358 downloads.onCreated.removeListener(createdListener);
359 createdCompleted();
360 if (createdItem.state == downloads.STATE_INTERRUPTED) {
361 changedListener({id: downloadId, state: {new: createdItem.state},
362 error: {new: createdItem.error}});
363 }
364 }
365 downloads.onCreated.addListener(createdListener);
366
367 downloads.download(
368 {'url': POST_URL,
369 'filename': downloadId + '.txt', // Prevent 'file' danger.
370 'method': 'POST'},
371 chrome.test.callback(function(id) {
372 console.debug(downloadId);
373 chrome.test.assertEq(downloadId, id);
374 }));
375 },
376
377 function downloadHeadersSuccess() {
378 // Test the |header| download option.
379 var downloadId = getNextId();
380 console.debug(downloadId);
381 var changedCompleted = chrome.test.callbackAdded();
382 function changedListener(delta) {
383 console.debug(delta.id);
384 // Ignore onChanged events for downloads besides our own, or events that
385 // signal any change besides completion.
386 if ((delta.id != downloadId) ||
387 !delta.state)
388 return;
389 chrome.test.assertEq(downloads.STATE_COMPLETE, delta.state.new);
390 console.debug(downloadId);
197 downloads.search({id: downloadId}, 391 downloads.search({id: downloadId},
198 chrome.test.callback(function(items) { 392 chrome.test.callback(function(items) {
199 console.log(downloadId); 393 console.debug(downloadId);
200 chrome.test.assertEq(1, items.length); 394 chrome.test.assertEq(1, items.length);
201 chrome.test.assertEq(downloadId, items[0].id); 395 chrome.test.assertEq(downloadId, items[0].id);
202 chrome.test.assertEq(0, items[0].totalBytes); 396 debugObject(items[0]);
397 var EXPECTED_SIZE = 164;
398 chrome.test.assertEq(EXPECTED_SIZE, items[0].bytesReceived);
203 })); 399 }));
204 downloads.onChanged.removeListener(changedListener); 400 downloads.onChanged.removeListener(changedListener);
205 changedCompleted(); 401 changedCompleted();
206 } 402 }
207 downloads.onChanged.addListener(changedListener); 403 downloads.onChanged.addListener(changedListener);
208 404
209 downloads.download( 405 downloads.download(
210 {'url': POST_URL, 406 {'url': HEADERS_URL,
211 'filename': downloadId + '.txt', // Prevent 'file' danger. 407 'filename': downloadId + '.txt', // Prevent 'file' danger.
212 'method': 'POST'}, 408 'headers': [{'name': 'Foo', 'value': 'bar'},
409 {'name': 'Qx', 'value': 'yo'}]},
213 chrome.test.callback(function(id) { 410 chrome.test.callback(function(id) {
214 console.log(downloadId); 411 console.debug(downloadId);
215 chrome.test.assertEq(downloadId, id); 412 chrome.test.assertEq(downloadId, id);
216 })); 413 }));
217 }, 414 },
218 415
219 function downloadHeadersSuccess() { 416 function downloadHeadersBinarySuccess() {
220 // Test the |header| download option. 417 // Test the |header| download option.
221 var downloadId = getNextId(); 418 var downloadId = getNextId();
222 console.log(downloadId); 419 console.debug(downloadId);
223 var changedCompleted = chrome.test.callbackAdded(); 420 var changedCompleted = chrome.test.callbackAdded();
224 function changedListener(delta) { 421 function changedListener(delta) {
225 console.log(delta.id); 422 console.debug(delta.id);
226 // Ignore onChanged events for downloads besides our own, or events that 423 // Ignore onChanged events for downloads besides our own, or events that
227 // signal any change besides completion. 424 // signal any change besides completion.
228 if ((delta.id != downloadId) || 425 if ((delta.id != downloadId) ||
229 !delta.state || 426 !delta.state)
230 (delta.state.new != downloads.STATE_COMPLETE))
231 return; 427 return;
232 console.log(downloadId); 428 chrome.test.assertEq(downloads.STATE_COMPLETE, delta.state.new);
429 console.debug(downloadId);
233 downloads.search({id: downloadId}, 430 downloads.search({id: downloadId},
234 chrome.test.callback(function(items) { 431 chrome.test.callback(function(items) {
235 console.log(downloadId); 432 console.debug(downloadId);
236 chrome.test.assertEq(1, items.length); 433 chrome.test.assertEq(1, items.length);
237 chrome.test.assertEq(downloadId, items[0].id); 434 chrome.test.assertEq(downloadId, items[0].id);
435 debugObject(items[0]);
238 var EXPECTED_SIZE = 164; 436 var EXPECTED_SIZE = 164;
239 chrome.test.assertEq(EXPECTED_SIZE, items[0].totalBytes);
240 chrome.test.assertEq(EXPECTED_SIZE, items[0].fileSize);
241 chrome.test.assertEq(EXPECTED_SIZE, items[0].bytesReceived); 437 chrome.test.assertEq(EXPECTED_SIZE, items[0].bytesReceived);
242 })); 438 }));
243 downloads.onChanged.removeListener(changedListener); 439 downloads.onChanged.removeListener(changedListener);
244 changedCompleted(); 440 changedCompleted();
245 } 441 }
246 downloads.onChanged.addListener(changedListener); 442 downloads.onChanged.addListener(changedListener);
247 443
248 downloads.download( 444 downloads.download(
249 {'url': HEADERS_URL, 445 {'url': HEADERS_URL,
250 'filename': downloadId + '.txt', // Prevent 'file' danger. 446 'filename': downloadId + '.txt', // Prevent 'file' danger.
251 'headers': [{'name': 'Foo', 'value': 'bar'}, 447 'headers': [{'name': 'Foo', 'binaryValue': [98, 97, 114]},
252 {'name': 'Qx', 'value': 'yo'}]}, 448 {'name': 'Qx', 'binaryValue': [121, 111]}]},
253 chrome.test.callback(function(id) { 449 chrome.test.callback(function(id) {
254 console.log(downloadId); 450 console.debug(downloadId);
255 chrome.test.assertEq(downloadId, id); 451 chrome.test.assertEq(downloadId, id);
256 })); 452 }));
257 }, 453 },
258 454
259 function downloadHeadersWouldFail() { 455 function downloadHeadersWouldFail() {
260 // Test that downloadHeadersSuccess() would fail if the resource requires 456 // Test that downloadHeadersSuccess() would fail if the resource requires
261 // the headers, and chrome fails to propagate them back to the server. 457 // the headers, and chrome fails to propagate them back to the server.
262 // This tests both that testserver.py does not succeed when it should 458 // This tests both that testserver.py does not succeed when it should
263 // fail as well as how the downloads extension api exposes the 459 // fail as well as how the downloads extension api exposes the
264 // failure to extensions. 460 // failure to extensions.
265 var downloadId = getNextId(); 461 var downloadId = getNextId();
266 console.log(downloadId); 462 console.debug(downloadId);
267 463
268 var changedCompleted = chrome.test.callbackAdded(); 464 var changedCompleted = chrome.test.callbackAdded();
269 function changedListener(delta) { 465 function changedListener(delta) {
270 console.log(delta.id); 466 console.debug(delta.id);
271 // Ignore onChanged events for downloads besides our own, or events that 467 // Ignore onChanged events for downloads besides our own, or events that
272 // signal any change besides interruption. 468 // signal any change besides interruption.
273 if ((delta.id != downloadId) || 469 if ((delta.id != downloadId) ||
274 !delta.state || 470 !delta.state ||
275 (delta.state.new != downloads.STATE_COMPLETE)) 471 !delta.error)
276 return; 472 return;
277 console.log(downloadId); 473 chrome.test.assertEq(downloads.STATE_INTERRUPTED, delta.state.new);
278 // TODO(benjhayden): Change COMPLETE to INTERRUPTED after 474 chrome.test.assertEq(33, delta.error.new);
279 // http://crbug.com/112342 475 console.debug(downloadId);
280 downloads.search({id: downloadId},
281 chrome.test.callback(function(items) {
282 console.log(downloadId);
283 chrome.test.assertEq(1, items.length);
284 chrome.test.assertEq(downloadId, items[0].id);
285 chrome.test.assertEq(0, items[0].totalBytes);
286 }));
287 downloads.onChanged.removeListener(changedListener); 476 downloads.onChanged.removeListener(changedListener);
288 changedCompleted(); 477 if (changedCompleted) {
478 changedCompleted();
479 changedCompleted = null;
480 }
289 } 481 }
290 downloads.onChanged.addListener(changedListener); 482 downloads.onChanged.addListener(changedListener);
291 483
484 // Sometimes the DownloadsEventRouter detects the item for the first time
485 // after the item has already been interrupted. In this case, the
486 // onChanged event never fires, so run the changedListener manually. If
487 // the DownloadsEventRouter detects the item before it's interrupted, then
488 // the onChanged event should fire correctly.
489 var createdCompleted = chrome.test.callbackAdded();
490 function createdListener(createdItem) {
491 console.debug(createdItem.id);
492 // Ignore events for any download besides our own.
493 if (createdItem.id != downloadId)
494 return;
495 console.debug(downloadId);
496 downloads.onCreated.removeListener(createdListener);
497 createdCompleted();
498 if (createdItem.state == downloads.STATE_INTERRUPTED) {
499 changedListener({id: downloadId, state: {new: createdItem.state},
500 error: {new: createdItem.error}});
501 }
502 }
503 downloads.onCreated.addListener(createdListener);
504
292 downloads.download( 505 downloads.download(
293 {'url': HEADERS_URL}, 506 {'url': HEADERS_URL},
294 chrome.test.callback(function(id) { 507 chrome.test.callback(function(id) {
295 console.log(downloadId); 508 console.debug(downloadId);
296 chrome.test.assertEq(downloadId, id); 509 chrome.test.assertEq(downloadId, id);
297 })); 510 }));
298 }, 511 },
299 512
300 function downloadInterrupted() { 513 function downloadInterrupted() {
301 // Test that cancel()ing an in-progress download causes its state to 514 // Test that cancel()ing an in-progress download causes its state to
302 // transition to interrupted, and test that that state transition is 515 // transition to interrupted, and test that that state transition is
303 // detectable by an onChanged event listener. 516 // detectable by an onChanged event listener.
304 // TODO(benjhayden): Test other sources of interruptions such as server 517 // TODO(benjhayden): Test other sources of interruptions such as server
305 // death. 518 // death.
306 var downloadId = getNextId(); 519 var downloadId = getNextId();
307 console.log(downloadId); 520 console.debug(downloadId);
308 521
309 var createdCompleted = chrome.test.callbackAdded(); 522 var createdCompleted = chrome.test.callbackAdded();
310 function createdListener(createdItem) { 523 function createdListener(createdItem) {
311 console.log(createdItem.id); 524 console.debug(createdItem.id);
312 // Ignore onCreated events for any download besides our own. 525 // Ignore onCreated events for any download besides our own.
313 if (createdItem.id != downloadId) 526 if (createdItem.id != downloadId)
314 return; 527 return;
315 console.log(downloadId); 528 console.debug(downloadId);
316 // TODO(benjhayden) Move this cancel() into the download() callback 529 // TODO(benjhayden) Move this cancel() into the download() callback
317 // after ensuring that DownloadItems are created before that callback 530 // after ensuring that DownloadItems are created before that callback
318 // is fired. 531 // is fired.
319 downloads.cancel(downloadId, chrome.test.callback(function() { 532 downloads.cancel(downloadId, chrome.test.callback(function() {
320 console.log(downloadId); 533 console.debug(downloadId);
321 })); 534 }));
322 downloads.onCreated.removeListener(createdListener); 535 downloads.onCreated.removeListener(createdListener);
323 createdCompleted(); 536 createdCompleted();
324 } 537 }
325 downloads.onCreated.addListener(createdListener); 538 downloads.onCreated.addListener(createdListener);
326 539
327 var changedCompleted = chrome.test.callbackAdded(); 540 var changedCompleted = chrome.test.callbackAdded();
328 function changedListener(delta) { 541 function changedListener(delta) {
329 console.log(delta.id); 542 console.debug(delta.id);
330 // Ignore onChanged events for downloads besides our own, or events that 543 // Ignore onChanged events for downloads besides our own, or events that
331 // signal any change besides interruption. 544 // signal any change besides interruption.
332 if ((delta.id != downloadId) || 545 if ((delta.id != downloadId) ||
333 !delta.state || 546 !delta.state ||
334 (delta.state.new != downloads.STATE_INTERRUPTED) || 547 !delta.error)
335 !delta.error ||
336 (delta.error.new != 40))
337 return; 548 return;
338 console.log(downloadId); 549 chrome.test.assertEq(downloads.STATE_INTERRUPTED, delta.state.new);
550 chrome.test.assertEq(40, delta.error.new);
551 console.debug(downloadId);
339 downloads.onChanged.removeListener(changedListener); 552 downloads.onChanged.removeListener(changedListener);
340 changedCompleted(); 553 changedCompleted();
341 } 554 }
342 downloads.onChanged.addListener(changedListener); 555 downloads.onChanged.addListener(changedListener);
343 556
344 downloads.download( 557 downloads.download(
345 {'url': NEVER_FINISH_URL}, 558 {'url': NEVER_FINISH_URL},
346 chrome.test.callback(function(id) { 559 chrome.test.callback(function(id) {
347 console.log(downloadId); 560 console.debug(downloadId);
348 chrome.test.assertEq(downloadId, id); 561 chrome.test.assertEq(downloadId, id);
349 })); 562 }));
350 }, 563 },
351 564
352 function downloadOnChanged() {
353 // Test that download completion is detectable by an onChanged event
354 // listener.
355 var downloadId = getNextId();
356 console.log(downloadId);
357 var callbackCompleted = chrome.test.callbackAdded();
358 function myListener(delta) {
359 console.log(delta.id);
360 if ((delta.id != downloadId) ||
361 !delta.state ||
362 (delta.state.new != downloads.STATE_COMPLETE))
363 return;
364 console.log(downloadId);
365 downloads.onChanged.removeListener(myListener);
366 callbackCompleted();
367 }
368 downloads.onChanged.addListener(myListener);
369 downloads.download(
370 {"url": SAFE_FAST_URL},
371 chrome.test.callback(function(id) {
372 console.log(downloadId);
373 chrome.test.assertEq(downloadId, id);
374 }));
375 },
376
377 function downloadFilename() { 565 function downloadFilename() {
378 // Test that we can suggest a filename for a new download, and test that 566 // Test that we can suggest a filename for a new download, and test that
379 // we can detect filename changes with an onChanged event listener. 567 // we can detect filename changes with an onChanged event listener.
380 var FILENAME = 'owiejtoiwjrfoiwjroiwjroiwjroiwjrfi'; 568 var FILENAME = 'owiejtoiwjrfoiwjroiwjroiwjroiwjrfi';
381 var downloadId = getNextId(); 569 var downloadId = getNextId();
382 console.log(downloadId); 570 console.debug(downloadId);
383 var callbackCompleted = chrome.test.callbackAdded(); 571 var callbackCompleted = chrome.test.callbackAdded();
384 function myListener(delta) { 572 function myListener(delta) {
385 console.log(delta.id); 573 console.debug(delta.id);
386 if ((delta.id != downloadId) || 574 if ((delta.id != downloadId) ||
387 !delta.filename || 575 !delta.filename ||
388 (delta.filename.new.indexOf(FILENAME) == -1)) 576 (delta.filename.new.indexOf(FILENAME) == -1))
389 return; 577 return;
390 console.log(downloadId); 578 console.debug(downloadId);
391 downloads.onChanged.removeListener(myListener); 579 downloads.onChanged.removeListener(myListener);
392 callbackCompleted(); 580 callbackCompleted();
393 } 581 }
394 downloads.onChanged.addListener(myListener); 582 downloads.onChanged.addListener(myListener);
395 downloads.download( 583 downloads.download(
396 {'url': SAFE_FAST_URL, 'filename': FILENAME}, 584 {'url': SAFE_FAST_URL, 'filename': FILENAME},
397 chrome.test.callback(function(id) { 585 chrome.test.callback(function(id) {
398 console.log(downloadId); 586 console.debug(downloadId);
399 chrome.test.assertEq(downloadId, id); 587 chrome.test.assertEq(downloadId, id);
400 })); 588 }));
401 }, 589 },
402 590
403 function downloadOnCreated() { 591 function downloadOnCreated() {
404 // Test that the onCreated event fires when we start a download. 592 // Test that the onCreated event fires when we start a download.
405 var downloadId = getNextId(); 593 var downloadId = getNextId();
406 console.log(downloadId); 594 console.debug(downloadId);
407 var createdCompleted = chrome.test.callbackAdded(); 595 var createdCompleted = chrome.test.callbackAdded();
408 function createdListener(item) { 596 function createdListener(item) {
409 console.log(item.id); 597 console.debug(item.id);
410 if (item.id != downloadId) 598 if (item.id != downloadId)
411 return; 599 return;
412 console.log(downloadId); 600 console.debug(downloadId);
413 createdCompleted(); 601 createdCompleted();
414 downloads.onCreated.removeListener(createdListener); 602 downloads.onCreated.removeListener(createdListener);
415 }; 603 };
416 downloads.onCreated.addListener(createdListener); 604 downloads.onCreated.addListener(createdListener);
417 downloads.download( 605 downloads.download(
418 {'url': SAFE_FAST_URL}, 606 {'url': SAFE_FAST_URL},
419 chrome.test.callback(function(id) { 607 chrome.test.callback(function(id) {
420 console.log(downloadId); 608 console.debug(downloadId);
421 chrome.test.assertEq(downloadId, id); 609 chrome.test.assertEq(downloadId, id);
422 })); 610 }));
423 }, 611 },
424 612
425 function downloadInvalidFilename() { 613 function downloadInvalidFilename() {
426 // Test that we disallow invalid filenames for new downloads. 614 // Test that we disallow invalid filenames for new downloads.
427 downloads.download( 615 downloads.download(
428 {'url': SAFE_FAST_URL, 'filename': '../../../../../etc/passwd'}, 616 {'url': SAFE_FAST_URL, 'filename': '../../../../../etc/passwd'},
429 chrome.test.callbackFail(downloads.ERROR_GENERIC)); 617 chrome.test.callbackFail(downloads.ERROR_GENERIC));
430 }, 618 },
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 // Test that download() requires a valid url, including protocol and 687 // Test that download() requires a valid url, including protocol and
500 // hostname. 688 // hostname.
501 downloads.download( 689 downloads.download(
502 {'url': 'foo/bar.html#frag'}, 690 {'url': 'foo/bar.html#frag'},
503 chrome.test.callbackFail(downloads.ERROR_INVALID_URL)); 691 chrome.test.callbackFail(downloads.ERROR_INVALID_URL));
504 }, 692 },
505 693
506 function downloadAllowFragments() { 694 function downloadAllowFragments() {
507 // Valid URLs plus fragments are still valid URLs. 695 // Valid URLs plus fragments are still valid URLs.
508 var downloadId = getNextId(); 696 var downloadId = getNextId();
509 console.log(downloadId); 697 console.debug(downloadId);
510 downloads.download( 698 downloads.download(
511 {'url': SAFE_FAST_URL + '#frag'}, 699 {'url': SAFE_FAST_URL + '#frag'},
512 chrome.test.callback(function(id) { 700 chrome.test.callback(function(id) {
513 chrome.test.assertEq(downloadId, id); 701 chrome.test.assertEq(downloadId, id);
514 })); 702 }));
515 }, 703 },
516 704
517 function downloadAllowDataURLs() { 705 function downloadAllowDataURLs() {
518 // Valid data URLs are valid URLs. 706 // Valid data URLs are valid URLs.
519 var downloadId = getNextId(); 707 var downloadId = getNextId();
520 console.log(downloadId); 708 console.debug(downloadId);
521 downloads.download( 709 downloads.download(
522 {'url': 'data:text/plain,hello'}, 710 {'url': 'data:text/plain,hello'},
523 chrome.test.callback(function(id) { 711 chrome.test.callback(function(id) {
524 chrome.test.assertEq(downloadId, id); 712 chrome.test.assertEq(downloadId, id);
525 })); 713 }));
526 }, 714 },
527 715
528 function downloadAllowFileURLs() { 716 function downloadAllowFileURLs() {
529 // Valid file URLs are valid URLs. 717 // Valid file URLs are valid URLs.
530 var downloadId = getNextId(); 718 var downloadId = getNextId();
531 console.log(downloadId); 719 console.debug(downloadId);
532 downloads.download( 720 downloads.download(
533 {'url': 'file:///'}, 721 {'url': 'file:///'},
534 chrome.test.callback(function(id) { 722 chrome.test.callback(function(id) {
535 chrome.test.assertEq(downloadId, id); 723 chrome.test.assertEq(downloadId, id);
536 })); 724 }));
537 }, 725 },
538 726
539 // TODO(benjhayden): Set up a test ftp server. 727 // TODO(benjhayden): Set up a test ftp server.
540 // function downloadAllowFTPURLs() { 728 // function downloadAllowFTPURLs() {
541 // // Valid ftp URLs are valid URLs. 729 // // Valid ftp URLs are valid URLs.
542 // var downloadId = getNextId(); 730 // var downloadId = getNextId();
543 // console.log(downloadId); 731 // console.debug(downloadId);
544 // downloads.download( 732 // downloads.download(
545 // {'url': 'ftp://localhost:' + testConfig.testServer.port + '/'}, 733 // {'url': 'ftp://localhost:' + testConfig.testServer.port + '/'},
546 // chrome.test.callback(function(id) { 734 // chrome.test.callback(function(id) {
547 // chrome.test.assertEq(downloadId, id); 735 // chrome.test.assertEq(downloadId, id);
548 // })); 736 // }));
549 // }, 737 // },
550 738
551 function downloadInvalidURL7() { 739 function downloadInvalidURL7() {
552 // Test that download() rejects javascript urls. 740 // Test that download() rejects javascript urls.
553 downloads.download( 741 downloads.download(
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
616 function downloadResumeInvalidType() { 804 function downloadResumeInvalidType() {
617 assertThrows(('Invalid value for argument 1. Expected \'integer\' ' + 805 assertThrows(('Invalid value for argument 1. Expected \'integer\' ' +
618 'but got \'string\'.'), 806 'but got \'string\'.'),
619 downloads.resume, 807 downloads.resume,
620 'foo'); 808 'foo');
621 }, 809 },
622 810
623 function downloadCancelInvalidId() { 811 function downloadCancelInvalidId() {
624 // Canceling a non-existent download is not considered an error. 812 // Canceling a non-existent download is not considered an error.
625 downloads.cancel(-42, chrome.test.callback(function() { 813 downloads.cancel(-42, chrome.test.callback(function() {
626 console.log(''); 814 console.debug('');
627 })); 815 }));
628 }, 816 },
629 817
630 function downloadCancelInvalidType() { 818 function downloadCancelInvalidType() {
631 assertThrows(('Invalid value for argument 1. Expected \'integer\' ' + 819 assertThrows(('Invalid value for argument 1. Expected \'integer\' ' +
632 'but got \'string\'.'), 820 'but got \'string\'.'),
633 downloads.cancel, 'foo'); 821 downloads.cancel, 'foo');
634 }, 822 },
635 823
636 function downloadNoComplete() { 824 function downloadNoComplete() {
637 // This is used partly to test cleanUp. 825 // This is used partly to test cleanUp.
638 var downloadId = getNextId(); 826 var downloadId = getNextId();
639 console.log(downloadId); 827 console.debug(downloadId);
640 downloads.download( 828 downloads.download(
641 {'url': NEVER_FINISH_URL}, 829 {'url': NEVER_FINISH_URL},
642 chrome.test.callback(function(id) { 830 chrome.test.callback(function(id) {
643 console.log(downloadId); 831 console.debug(downloadId);
644 chrome.test.assertEq(downloadId, id); 832 chrome.test.assertEq(downloadId, id);
645 })); 833 }));
646 }, 834 },
647 835
648 function cleanUp() { 836 function cleanUp() {
649 // cleanUp must come last. It clears out all in-progress downloads 837 // cleanUp must come last. It clears out all in-progress downloads
650 // so the browser can shutdown cleanly. 838 // so the browser can shutdown cleanly.
651 console.log(nextId); 839 console.debug(nextId);
652 function makeCallback(id) { 840 function makeCallback(id) {
653 return function() { 841 return function() {
654 console.log(id); 842 console.debug(id);
655 } 843 }
656 } 844 }
657 for (var id = 0; id < nextId; ++id) { 845 for (var id = 0; id < nextId; ++id) {
658 downloads.cancel(id, chrome.test.callback(makeCallback(id))); 846 downloads.cancel(id, chrome.test.callback(makeCallback(id)));
659 } 847 }
660 }, 848 },
661 849
662 function callNotifyPass() { 850 function callNotifyPass() {
663 chrome.test.notifyPass(); 851 chrome.test.notifyPass();
664 setTimeout(chrome.test.callback(function() { 852 setTimeout(chrome.test.callback(function() {
665 console.log(''); 853 console.debug('');
666 }), 0); 854 }), 0);
667 } 855 }
668 ]); 856 ]);
669 }); 857 });
OLDNEW
« no previous file with comments | « chrome/browser/download/download_extension_api.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698