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