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 3// found in the LICENSE file. 4 5// Use the <code>chrome.downloads</code> API to programmatically initiate, 6// monitor, manipulate, and search for downloads. 7[permissions=downloads] 8namespace downloads { 9 [inline_doc] dictionary HeaderNameValuePair { 10 // Name of the HTTP header. 11 DOMString name; 12 13 // Value of the HTTP header. 14 DOMString value; 15 }; 16 17 // <dl><dt>uniquify</dt> 18 // <dd>To avoid duplication, the <code>filename</code> is changed to 19 // include a counter before the filename extension.</dd> 20 // <dt>overwrite</dt> 21 // <dd>The existing file will be overwritten with the new file.</dd> 22 // <dt>prompt</dt> 23 // <dd>The user will be prompted with a file chooser dialog.</dd> 24 // </dl> 25 enum FilenameConflictAction {uniquify, overwrite, prompt}; 26 27 [inline_doc] dictionary FilenameSuggestion { 28 // The $ref:DownloadItem's new target $ref:DownloadItem.filename, as a path 29 // relative to the user's default Downloads directory, possibly containing 30 // subdirectories. Absolute paths, empty paths, and paths containing 31 // back-references ".." will be ignored. 32 DOMString filename; 33 34 // The action to take if <code>filename</code> already exists. 35 FilenameConflictAction? conflictAction; 36 }; 37 38 [inline_doc] enum HttpMethod {GET, POST}; 39 40 enum InterruptReason { 41 FILE_FAILED, 42 FILE_ACCESS_DENIED, 43 FILE_NO_SPACE, 44 FILE_NAME_TOO_LONG, 45 FILE_TOO_LARGE, 46 FILE_VIRUS_INFECTED, 47 FILE_TRANSIENT_ERROR, 48 FILE_BLOCKED, 49 FILE_SECURITY_CHECK_FAILED, 50 FILE_TOO_SHORT, 51 NETWORK_FAILED, 52 NETWORK_TIMEOUT, 53 NETWORK_DISCONNECTED, 54 NETWORK_SERVER_DOWN, 55 SERVER_FAILED, 56 SERVER_NO_RANGE, 57 SERVER_PRECONDITION, 58 SERVER_BAD_CONTENT, 59 USER_CANCELED, 60 USER_SHUTDOWN, 61 CRASH}; 62 63 [inline_doc] dictionary DownloadOptions { 64 // The URL to download. 65 DOMString url; 66 67 // A file path relative to the Downloads directory to contain the downloaded 68 // file, possibly containing subdirectories. Absolute paths, empty paths, 69 // and paths containing back-references ".." will cause an error. 70 // $ref:onDeterminingFilename allows suggesting a filename after the file's 71 // MIME type and a tentative filename have been determined. 72 DOMString? filename; 73 74 // The action to take if <code>filename</code> already exists. 75 FilenameConflictAction? conflictAction; 76 77 // Use a file-chooser to allow the user to select a filename regardless of 78 // whether <code>filename</code> is set or already exists. 79 boolean? saveAs; 80 81 // The HTTP method to use if the URL uses the HTTP[S] protocol. 82 HttpMethod? method; 83 84 // Extra HTTP headers to send with the request if the URL uses the HTTP[s] 85 // protocol. Each header is represented as a dictionary containing the keys 86 // <code>name</code> and either <code>value</code> or 87 // <code>binaryValue</code>, restricted to those allowed by XMLHttpRequest. 88 HeaderNameValuePair[]? headers; 89 90 // Post body. 91 DOMString? body; 92 }; 93 94 // <dl><dt>file</dt> 95 // <dd>The download's filename is suspicious.</dd> 96 // <dt>url</dt> 97 // <dd>The download's URL is known to be malicious.</dd> 98 // <dt>content</dt> 99 // <dd>The downloaded file is known to be malicious.</dd> 100 // <dt>uncommon</dt> 101 // <dd>The download's URL is not commonly downloaded and could be 102 // dangerous.</dd> 103 // <dt>host</dt> 104 // <dd>The download came from a host known to distribute malicious 105 // binaries and is likely dangerous.</dd> 106 // <dt>unwanted</dt> 107 // <dd>The download is potentially unwanted or unsafe. E.g. it could make 108 // changes to browser or computer settings.</dd> 109 // <dt>safe</dt> 110 // <dd>The download presents no known danger to the user's computer.</dd> 111 // <dt>accepted</dt> 112 // <dd>The user has accepted the dangerous download.</dd> 113 // </dl> 114 enum DangerType { 115 file, url, content, uncommon, host, unwanted, safe, accepted 116 }; 117 118 // <dl><dt>in_progress</dt> 119 // <dd>The download is currently receiving data from the server.</dd> 120 // <dt>interrupted</dt> 121 // <dd>An error broke the connection with the file host.</dd> 122 // <dt>complete</dt> 123 // <dd>The download completed successfully.</dd> 124 // </dl> 125 enum State {in_progress, interrupted, complete}; 126 127 // The state of the process of downloading a file. 128 dictionary DownloadItem { 129 // An identifier that is persistent across browser sessions. 130 long id; 131 132 // Absolute URL. 133 DOMString url; 134 135 // Absolute URL. 136 DOMString referrer; 137 138 // Absolute local path. 139 DOMString filename; 140 141 // False if this download is recorded in the history, true if it is not 142 // recorded. 143 boolean incognito; 144 145 // Indication of whether this download is thought to be safe or known to be 146 // suspicious. 147 DangerType danger; 148 149 // The file's MIME type. 150 DOMString mime; 151 152 // The time when the download began in ISO 8601 format. May be passed 153 // directly to the Date constructor: <code>chrome.downloads.search({}, 154 // function(items){items.forEach(function(item){console.log(new 155 // Date(item.startTime))})})</code> 156 DOMString startTime; 157 158 // The time when the download ended in ISO 8601 format. May be passed 159 // directly to the Date constructor: <code>chrome.downloads.search({}, 160 // function(items){items.forEach(function(item){if (item.endTime) 161 // console.log(new Date(item.endTime))})})</code> 162 DOMString? endTime; 163 164 // Estimated time when the download will complete in ISO 8601 format. May be 165 // passed directly to the Date constructor: 166 // <code>chrome.downloads.search({}, 167 // function(items){items.forEach(function(item){if (item.estimatedEndTime) 168 // console.log(new Date(item.estimatedEndTime))})})</code> 169 DOMString? estimatedEndTime; 170 171 // Indicates whether the download is progressing, interrupted, or complete. 172 State state; 173 174 // True if the download has stopped reading data from the host, but kept the 175 // connection open. 176 boolean paused; 177 178 // True if the download is in progress and paused, or else if it is 179 // interrupted and can be resumed starting from where it was interrupted. 180 boolean canResume; 181 182 // Why the download was interrupted. Several kinds of HTTP errors may be 183 // grouped under one of the errors beginning with <code>SERVER_</code>. 184 // Errors relating to the network begin with <code>NETWORK_</code>, errors 185 // relating to the process of writing the file to the file system begin with 186 // <code>FILE_</code>, and interruptions initiated by the user begin with 187 // <code>USER_</code>. 188 InterruptReason? error; 189 190 // Number of bytes received so far from the host, without considering file 191 // compression. 192 long bytesReceived; 193 194 // Number of bytes in the whole file, without considering file compression, 195 // or -1 if unknown. 196 long totalBytes; 197 198 // Number of bytes in the whole file post-decompression, or -1 if unknown. 199 long fileSize; 200 201 // Whether the downloaded file still exists. This information may be out of 202 // date because Chrome does not automatically watch for file removal. Call 203 // $ref:search() in order to trigger the check for file existence. When the 204 // existence check completes, if the file has been deleted, then an 205 // $ref:onChanged event will fire. Note that $ref:search() does not wait 206 // for the existence check to finish before returning, so results from 207 // $ref:search() may not accurately reflect the file system. Also, 208 // $ref:search() may be called as often as necessary, but will not check for 209 // file existence any more frequently than once every 10 seconds. 210 boolean exists; 211 212 // The identifier for the extension that initiated this download if this 213 // download was initiated by an extension. Does not change once it is set. 214 DOMString? byExtensionId; 215 216 // The localized name of the extension that initiated this download if this 217 // download was initiated by an extension. May change if the extension 218 // changes its name or if the user changes their locale. 219 DOMString? byExtensionName; 220 }; 221 222 [inline_doc] dictionary DownloadQuery { 223 // This array of search terms limits results to $ref:DownloadItem whose 224 // <code>filename</code> or <code>url</code> contain all of the search terms 225 // that do not begin with a dash '-' and none of the search terms that do 226 // begin with a dash. 227 DOMString[]? query; 228 229 // Limits results to $ref:DownloadItem that 230 // started before the given ms since the epoch. 231 DOMString? startedBefore; 232 233 // Limits results to $ref:DownloadItem that 234 // started after the given ms since the epoch. 235 DOMString? startedAfter; 236 237 // Limits results to $ref:DownloadItem that ended before the given ms since the 238 // epoch. 239 DOMString? endedBefore; 240 241 // Limits results to $ref:DownloadItem that ended after the given ms since the 242 // epoch. 243 DOMString? endedAfter; 244 245 // Limits results to $ref:DownloadItem whose 246 // <code>totalBytes</code> is greater than the given integer. 247 long? totalBytesGreater; 248 249 // Limits results to $ref:DownloadItem whose 250 // <code>totalBytes</code> is less than the given integer. 251 long? totalBytesLess; 252 253 // Limits results to $ref:DownloadItem whose 254 // <code>filename</code> matches the given regular expression. 255 DOMString? filenameRegex; 256 257 // Limits results to $ref:DownloadItem whose 258 // <code>url</code> matches the given regular expression. 259 DOMString? urlRegex; 260 261 // The maximum number of matching $ref:DownloadItem returned. Defaults to 262 // 1000. Set to 0 in order to return all matching $ref:DownloadItem. See 263 // $ref:search for how to page through results. 264 long? limit; 265 266 // Set elements of this array to $ref:DownloadItem properties in order to 267 // sort search results. For example, setting 268 // <code>orderBy=['startTime']</code> sorts the $ref:DownloadItem by their 269 // start time in ascending order. To specify descending order, prefix with a 270 // hyphen: '-startTime'. 271 DOMString[]? orderBy; 272 273 // The <code>id</code> of the $ref:DownloadItem to query. 274 long? id; 275 276 // Absolute URL. 277 DOMString? url; 278 279 // Absolute local path. 280 DOMString? filename; 281 282 // Indication of whether this download is thought to be safe or known to be 283 // suspicious. 284 DangerType? danger; 285 286 // The file's MIME type. 287 DOMString? mime; 288 289 // The time when the download began in ISO 8601 format. 290 DOMString? startTime; 291 292 // The time when the download ended in ISO 8601 format. 293 DOMString? endTime; 294 295 // Indicates whether the download is progressing, interrupted, or complete. 296 State? state; 297 298 // True if the download has stopped reading data from the host, but kept the 299 // connection open. 300 boolean? paused; 301 302 // Why a download was interrupted. 303 InterruptReason? error; 304 305 // Number of bytes received so far from the host, without considering file 306 // compression. 307 long? bytesReceived; 308 309 // Number of bytes in the whole file, without considering file compression, 310 // or -1 if unknown. 311 long? totalBytes; 312 313 // Number of bytes in the whole file post-decompression, or -1 if unknown. 314 long? fileSize; 315 316 // Whether the downloaded file exists; 317 boolean? exists; 318 }; 319 320 dictionary StringDelta { 321 DOMString? previous; 322 DOMString? current; 323 }; 324 325 dictionary LongDelta { 326 long? previous; 327 long? current; 328 }; 329 330 dictionary BooleanDelta { 331 boolean? previous; 332 boolean? current; 333 }; 334 335 // Encapsulates a change in a DownloadItem. 336 [inline_doc] dictionary DownloadDelta { 337 // The <code>id</code> of the $ref:DownloadItem 338 // that changed. 339 long id; 340 341 // The change in <code>url</code>, if any. 342 StringDelta? url; 343 344 // The change in <code>filename</code>, if any. 345 StringDelta? filename; 346 347 // The change in <code>danger</code>, if any. 348 StringDelta? danger; 349 350 // The change in <code>mime</code>, if any. 351 StringDelta? mime; 352 353 // The change in <code>startTime</code>, if any. 354 StringDelta? startTime; 355 356 // The change in <code>endTime</code>, if any. 357 StringDelta? endTime; 358 359 // The change in <code>state</code>, if any. 360 StringDelta? state; 361 362 // The change in <code>canResume</code>, if any. 363 BooleanDelta? canResume; 364 365 // The change in <code>paused</code>, if any. 366 BooleanDelta? paused; 367 368 // The change in <code>error</code>, if any. 369 StringDelta? error; 370 371 // The change in <code>totalBytes</code>, if any. 372 LongDelta? totalBytes; 373 374 // The change in <code>fileSize</code>, if any. 375 LongDelta? fileSize; 376 377 // The change in <code>exists</code>, if any. 378 BooleanDelta? exists; 379 }; 380 381 [inline_doc] dictionary GetFileIconOptions { 382 // The size of the icon. The returned icon will be square with dimensions 383 // size * size pixels. The default size for the icon is 32x32 pixels. 384 [legalValues=(16,32)] long? size; 385 }; 386 387 callback DownloadCallback = void(long downloadId); 388 callback SearchCallback = void(DownloadItem[] results); 389 callback EraseCallback = void(long[] erasedIds); 390 callback NullCallback = void(); 391 callback GetFileIconCallback = void(optional DOMString iconURL); 392 callback SuggestFilenameCallback = void( 393 optional FilenameSuggestion suggestion); 394 395 interface Functions { 396 // Download a URL. If the URL uses the HTTP[S] protocol, then the request 397 // will include all cookies currently set for its hostname. If both 398 // <code>filename</code> and <code>saveAs</code> are specified, then the 399 // Save As dialog will be displayed, pre-populated with the specified 400 // <code>filename</code>. If the download started successfully, 401 // <code>callback</code> will be called with the new $ref:DownloadItem's 402 // <code>downloadId</code>. If there was an error starting the download, 403 // then <code>callback</code> will be called with 404 // <code>downloadId=undefined</code> and $ref:runtime.lastError will contain 405 // a descriptive string. The error strings are not guaranteed to remain 406 // backwards compatible between releases. Extensions must not parse it. 407 // |options|: What to download and how. 408 // |callback|: Called with the id of the new $ref:DownloadItem. 409 static void download(DownloadOptions options, 410 optional DownloadCallback callback); 411 412 // Find $ref:DownloadItem. Set <code>query</code> to the empty object to get 413 // all $ref:DownloadItem. To get a specific $ref:DownloadItem, set only the 414 // <code>id</code> field. To page through a large number of items, set 415 // <code>orderBy: ['-startTime']</code>, set <code>limit</code> to the 416 // number of items per page, and set <code>startedAfter</code> to the 417 // <code>startTime</code> of the last item from the last page. 418 static void search(DownloadQuery query, SearchCallback callback); 419 420 // Pause the download. If the request was successful the download is in a 421 // paused state. Otherwise $ref:runtime.lastError contains an error message. 422 // The request will fail if the download is not active. 423 // |downloadId|: The id of the download to pause. 424 // |callback|: Called when the pause request is completed. 425 static void pause(long downloadId, optional NullCallback callback); 426 427 // Resume a paused download. If the request was successful the download is 428 // in progress and unpaused. Otherwise $ref:runtime.lastError contains an 429 // error message. The request will fail if the download is not active. 430 // |downloadId|: The id of the download to resume. 431 // |callback|: Called when the resume request is completed. 432 static void resume(long downloadId, optional NullCallback callback); 433 434 // Cancel a download. When <code>callback</code> is run, the download is 435 // cancelled, completed, interrupted or doesn't exist anymore. 436 // |downloadId|: The id of the download to cancel. 437 // |callback|: Called when the cancel request is completed. 438 static void cancel(long downloadId, optional NullCallback callback); 439 440 // Retrieve an icon for the specified download. For new downloads, file 441 // icons are available after the $ref:onCreated event has been received. The 442 // image returned by this function while a download is in progress may be 443 // different from the image returned after the download is complete. Icon 444 // retrieval is done by querying the underlying operating system or toolkit 445 // depending on the platform. The icon that is returned will therefore 446 // depend on a number of factors including state of the download, platform, 447 // registered file types and visual theme. If a file icon cannot be 448 // determined, $ref:runtime.lastError will contain an error message. 449 // |downloadId|: The identifier for the download. 450 // |callback|: A URL to an image that represents the download. 451 static void getFileIcon(long downloadId, 452 optional GetFileIconOptions options, 453 GetFileIconCallback callback); 454 455 // Open the downloaded file now if the $ref:DownloadItem is complete; 456 // otherwise returns an error through $ref:runtime.lastError. Requires the 457 // <code>"downloads.open"</code> permission in addition to the 458 // <code>"downloads"</code> permission. An $ref:onChanged event will fire 459 // when the item is opened for the first time. 460 // |downloadId|: The identifier for the downloaded file. 461 static void open(long downloadId); 462 463 // Show the downloaded file in its folder in a file manager. 464 // |downloadId|: The identifier for the downloaded file. 465 static void show(long downloadId); 466 467 // Show the default Downloads folder in a file manager. 468 static void showDefaultFolder(); 469 470 // Erase matching $ref:DownloadItem from history without deleting the 471 // downloaded file. An $ref:onErased event will fire for each 472 // $ref:DownloadItem that matches <code>query</code>, then 473 // <code>callback</code> will be called. 474 static void erase(DownloadQuery query, optional EraseCallback callback); 475 476 // Remove the downloaded file if it exists and the $ref:DownloadItem is 477 // complete; otherwise return an error through $ref:runtime.lastError. 478 static void removeFile(long downloadId, optional NullCallback callback); 479 480 // Prompt the user to accept a dangerous download. Does not automatically 481 // accept dangerous downloads. If the download is accepted, then an 482 // $ref:onChanged event will fire, otherwise nothing will happen. When all 483 // the data is fetched into a temporary file and either the download is not 484 // dangerous or the danger has been accepted, then the temporary file is 485 // renamed to the target filename, the |state| changes to 'complete', and 486 // $ref:onChanged fires. 487 // |downloadId|: The identifier for the $ref:DownloadItem. 488 // |callback|: Called when the danger prompt dialog closes. 489 static void acceptDanger(long downloadId, optional NullCallback callback); 490 491 // Initiate dragging the downloaded file to another application. Call in a 492 // javascript <code>ondragstart</code> handler. 493 static void drag(long downloadId); 494 495 // Enable or disable the gray shelf at the bottom of every window associated 496 // with the current browser profile. The shelf will be disabled as long as 497 // at least one extension has disabled it. Enabling the shelf while at least 498 // one other extension has disabled it will return an error through 499 // $ref:runtime.lastError. Requires the <code>"downloads.shelf"</code> 500 // permission in addition to the <code>"downloads"</code> permission. 501 static void setShelfEnabled(boolean enabled); 502 }; 503 504 interface Events { 505 // This event fires with the $ref:DownloadItem object when a download 506 // begins. 507 static void onCreated(DownloadItem downloadItem); 508 509 // Fires with the <code>downloadId</code> when a download is erased from 510 // history. 511 // |downloadId|: The <code>id</code> of the $ref:DownloadItem that was 512 // erased. 513 static void onErased(long downloadId); 514 515 // When any of a $ref:DownloadItem's properties except 516 // <code>bytesReceived</code> and <code>estimatedEndTime</code> changes, 517 // this event fires with the <code>downloadId</code> and an object 518 // containing the properties that changed. 519 static void onChanged(DownloadDelta downloadDelta); 520 521 // During the filename determination process, extensions will be given the 522 // opportunity to override the target $ref:DownloadItem.filename. Each 523 // extension may not register more than one listener for this event. Each 524 // listener must call <code>suggest</code> exactly once, either 525 // synchronously or asynchronously. If the listener calls 526 // <code>suggest</code> asynchronously, then it must return 527 // <code>true</code>. If the listener neither calls <code>suggest</code> 528 // synchronously nor returns <code>true</code>, then <code>suggest</code> 529 // will be called automatically. The $ref:DownloadItem will not complete 530 // until all listeners have called <code>suggest</code>. Listeners may call 531 // <code>suggest</code> without any arguments in order to allow the download 532 // to use <code>downloadItem.filename</code> for its filename, or pass a 533 // <code>suggestion</code> object to <code>suggest</code> in order to 534 // override the target filename. If more than one extension overrides the 535 // filename, then the last extension installed whose listener passes a 536 // <code>suggestion</code> object to <code>suggest</code> wins. In order to 537 // avoid confusion regarding which extension will win, users should not 538 // install extensions that may conflict. If the download is initiated by 539 // $ref:download and the target filename is known before the MIME type and 540 // tentative filename have been determined, pass <code>filename</code> to 541 // $ref:download instead. 542 [maxListeners=1] static void onDeterminingFilename( 543 DownloadItem downloadItem, SuggestFilenameCallback suggest); 544 }; 545}; 546