OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 }); |
OLD | NEW |