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

Side by Side Diff: chrome/browser/extensions/api/downloads/downloads_api.cc

Issue 16924017: A few minor changes to the chrome.downloads extension API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: @r208716 Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/api/downloads/downloads_api.h" 5 #include "chrome/browser/extensions/api/downloads/downloads_api.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cctype> 8 #include <cctype>
9 #include <iterator> 9 #include <iterator>
10 #include <set> 10 #include <set>
(...skipping 11 matching lines...) Expand all
22 #include "base/metrics/histogram.h" 22 #include "base/metrics/histogram.h"
23 #include "base/stl_util.h" 23 #include "base/stl_util.h"
24 #include "base/strings/string16.h" 24 #include "base/strings/string16.h"
25 #include "base/strings/string_split.h" 25 #include "base/strings/string_split.h"
26 #include "base/strings/string_util.h" 26 #include "base/strings/string_util.h"
27 #include "base/strings/stringprintf.h" 27 #include "base/strings/stringprintf.h"
28 #include "base/values.h" 28 #include "base/values.h"
29 #include "chrome/browser/browser_process.h" 29 #include "chrome/browser/browser_process.h"
30 #include "chrome/browser/download/download_danger_prompt.h" 30 #include "chrome/browser/download/download_danger_prompt.h"
31 #include "chrome/browser/download/download_file_icon_extractor.h" 31 #include "chrome/browser/download/download_file_icon_extractor.h"
32 #include "chrome/browser/download/download_prefs.h"
32 #include "chrome/browser/download/download_query.h" 33 #include "chrome/browser/download/download_query.h"
33 #include "chrome/browser/download/download_service.h" 34 #include "chrome/browser/download/download_service.h"
34 #include "chrome/browser/download/download_service_factory.h" 35 #include "chrome/browser/download/download_service_factory.h"
35 #include "chrome/browser/download/download_util.h" 36 #include "chrome/browser/download/download_util.h"
36 #include "chrome/browser/extensions/event_names.h" 37 #include "chrome/browser/extensions/event_names.h"
37 #include "chrome/browser/extensions/event_router.h" 38 #include "chrome/browser/extensions/event_router.h"
38 #include "chrome/browser/extensions/extension_function_dispatcher.h" 39 #include "chrome/browser/extensions/extension_function_dispatcher.h"
39 #include "chrome/browser/extensions/extension_info_map.h" 40 #include "chrome/browser/extensions/extension_info_map.h"
40 #include "chrome/browser/extensions/extension_prefs.h" 41 #include "chrome/browser/extensions/extension_prefs.h"
41 #include "chrome/browser/extensions/extension_service.h" 42 #include "chrome/browser/extensions/extension_service.h"
42 #include "chrome/browser/extensions/extension_system.h" 43 #include "chrome/browser/extensions/extension_system.h"
43 #include "chrome/browser/icon_loader.h" 44 #include "chrome/browser/icon_loader.h"
44 #include "chrome/browser/icon_manager.h" 45 #include "chrome/browser/icon_manager.h"
46 #include "chrome/browser/platform_util.h"
45 #include "chrome/browser/renderer_host/chrome_render_message_filter.h" 47 #include "chrome/browser/renderer_host/chrome_render_message_filter.h"
46 #include "chrome/browser/ui/browser.h" 48 #include "chrome/browser/ui/browser.h"
47 #include "chrome/common/cancelable_task_tracker.h" 49 #include "chrome/common/cancelable_task_tracker.h"
48 #include "chrome/common/chrome_notification_types.h" 50 #include "chrome/common/chrome_notification_types.h"
49 #include "chrome/common/extensions/api/downloads.h" 51 #include "chrome/common/extensions/api/downloads.h"
50 #include "chrome/common/extensions/permissions/permissions_data.h" 52 #include "chrome/common/extensions/permissions/permissions_data.h"
51 #include "content/public/browser/download_interrupt_reasons.h" 53 #include "content/public/browser/download_interrupt_reasons.h"
52 #include "content/public/browser/download_item.h" 54 #include "content/public/browser/download_item.h"
53 #include "content/public/browser/download_save_info.h" 55 #include "content/public/browser/download_save_info.h"
54 #include "content/public/browser/download_url_parameters.h" 56 #include "content/public/browser/download_url_parameters.h"
(...skipping 25 matching lines...) Expand all
80 const char kGenericError[] = "I'm afraid I can't do that"; 82 const char kGenericError[] = "I'm afraid I can't do that";
81 const char kIconNotFoundError[] = "Icon not found"; 83 const char kIconNotFoundError[] = "Icon not found";
82 const char kInvalidDangerTypeError[] = "Invalid danger type"; 84 const char kInvalidDangerTypeError[] = "Invalid danger type";
83 const char kInvalidFilenameError[] = "Invalid filename"; 85 const char kInvalidFilenameError[] = "Invalid filename";
84 const char kInvalidFilterError[] = "Invalid query filter"; 86 const char kInvalidFilterError[] = "Invalid query filter";
85 const char kInvalidOperationError[] = "Invalid operation"; 87 const char kInvalidOperationError[] = "Invalid operation";
86 const char kInvalidOrderByError[] = "Invalid orderBy field"; 88 const char kInvalidOrderByError[] = "Invalid orderBy field";
87 const char kInvalidQueryLimit[] = "Invalid query limit"; 89 const char kInvalidQueryLimit[] = "Invalid query limit";
88 const char kInvalidStateError[] = "Invalid state"; 90 const char kInvalidStateError[] = "Invalid state";
89 const char kInvalidURLError[] = "Invalid URL"; 91 const char kInvalidURLError[] = "Invalid URL";
92 const char kNotPermittedURLError[] = "In order to access that URL, this "
93 "extension must add the host to \"permissions\" in manifest.json";
90 const char kNotImplementedError[] = "NotImplemented"; 94 const char kNotImplementedError[] = "NotImplemented";
91 const char kTooManyListenersError[] = "Each extension may have at most one " 95 const char kTooManyListenersError[] = "Each extension may have at most one "
92 "onDeterminingFilename listener between all of its renderer execution " 96 "onDeterminingFilename listener between all of its renderer execution "
93 "contexts."; 97 "contexts.";
94 98
95 } // namespace download_extension_errors 99 } // namespace download_extension_errors
96 100
97 namespace { 101 namespace {
98 102
99 // Default icon size for getFileIcon() in pixels. 103 // Default icon size for getFileIcon() in pixels.
100 const int kDefaultIconSize = 32; 104 const int kDefaultIconSize = 32;
101 105
102 // Parameter keys 106 // Parameter keys
103 const char kBytesReceivedKey[] = "bytesReceived"; 107 const char kBytesReceivedKey[] = "bytesReceived";
104 const char kDangerAcceptedKey[] = "dangerAccepted"; 108 const char kCanResumeKey[] = "canResume";
109 const char kDangerAccepted[] = "accepted";
105 const char kDangerContent[] = "content"; 110 const char kDangerContent[] = "content";
106 const char kDangerFile[] = "file"; 111 const char kDangerFile[] = "file";
112 const char kDangerHost[] = "host";
107 const char kDangerKey[] = "danger"; 113 const char kDangerKey[] = "danger";
108 const char kDangerSafe[] = "safe"; 114 const char kDangerSafe[] = "safe";
109 const char kDangerUncommon[] = "uncommon"; 115 const char kDangerUncommon[] = "uncommon";
110 const char kDangerAccepted[] = "accepted";
111 const char kDangerHost[] = "host";
112 const char kDangerUrl[] = "url"; 116 const char kDangerUrl[] = "url";
113 const char kEndTimeKey[] = "endTime"; 117 const char kEndTimeKey[] = "endTime";
114 const char kEndedAfterKey[] = "endedAfter"; 118 const char kEndedAfterKey[] = "endedAfter";
115 const char kEndedBeforeKey[] = "endedBefore"; 119 const char kEndedBeforeKey[] = "endedBefore";
116 const char kErrorKey[] = "error"; 120 const char kErrorKey[] = "error";
121 const char kEstimatedEndTimeKey[] = "estimatedEndTime";
117 const char kExistsKey[] = "exists"; 122 const char kExistsKey[] = "exists";
118 const char kFileSizeKey[] = "fileSize"; 123 const char kFileSizeKey[] = "fileSize";
119 const char kFilenameKey[] = "filename"; 124 const char kFilenameKey[] = "filename";
120 const char kFilenameRegexKey[] = "filenameRegex"; 125 const char kFilenameRegexKey[] = "filenameRegex";
121 const char kIdKey[] = "id"; 126 const char kIdKey[] = "id";
122 const char kIncognito[] = "incognito"; 127 const char kIncognito[] = "incognito";
123 const char kMimeKey[] = "mime"; 128 const char kMimeKey[] = "mime";
124 const char kPausedKey[] = "paused"; 129 const char kPausedKey[] = "paused";
125 const char kQueryKey[] = "query"; 130 const char kQueryKey[] = "query";
131 const char kReferrerUrlKey[] = "referrer";
126 const char kStartTimeKey[] = "startTime"; 132 const char kStartTimeKey[] = "startTime";
127 const char kStartedAfterKey[] = "startedAfter"; 133 const char kStartedAfterKey[] = "startedAfter";
128 const char kStartedBeforeKey[] = "startedBefore"; 134 const char kStartedBeforeKey[] = "startedBefore";
129 const char kStateComplete[] = "complete"; 135 const char kStateComplete[] = "complete";
130 const char kStateInProgress[] = "in_progress"; 136 const char kStateInProgress[] = "in_progress";
131 const char kStateInterrupted[] = "interrupted"; 137 const char kStateInterrupted[] = "interrupted";
132 const char kStateKey[] = "state"; 138 const char kStateKey[] = "state";
133 const char kTotalBytesGreaterKey[] = "totalBytesGreater"; 139 const char kTotalBytesGreaterKey[] = "totalBytesGreater";
134 const char kTotalBytesKey[] = "totalBytes"; 140 const char kTotalBytesKey[] = "totalBytes";
135 const char kTotalBytesLessKey[] = "totalBytesLess"; 141 const char kTotalBytesLessKey[] = "totalBytesLess";
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 } 214 }
209 215
210 scoped_ptr<base::DictionaryValue> DownloadItemToJSON( 216 scoped_ptr<base::DictionaryValue> DownloadItemToJSON(
211 DownloadItem* download_item, 217 DownloadItem* download_item,
212 bool incognito) { 218 bool incognito) {
213 base::DictionaryValue* json = new base::DictionaryValue(); 219 base::DictionaryValue* json = new base::DictionaryValue();
214 json->SetBoolean(kExistsKey, !download_item->GetFileExternallyRemoved()); 220 json->SetBoolean(kExistsKey, !download_item->GetFileExternallyRemoved());
215 json->SetInteger(kIdKey, download_item->GetId()); 221 json->SetInteger(kIdKey, download_item->GetId());
216 const GURL& url = download_item->GetOriginalUrl(); 222 const GURL& url = download_item->GetOriginalUrl();
217 json->SetString(kUrlKey, (url.is_valid() ? url.spec() : std::string())); 223 json->SetString(kUrlKey, (url.is_valid() ? url.spec() : std::string()));
224 const GURL& referrer = download_item->GetReferrerUrl();
225 json->SetString(kReferrerUrlKey, (referrer.is_valid() ? referrer.spec()
226 : std::string()));
218 json->SetString(kFilenameKey, 227 json->SetString(kFilenameKey,
219 download_item->GetTargetFilePath().LossyDisplayName()); 228 download_item->GetTargetFilePath().LossyDisplayName());
220 json->SetString(kDangerKey, DangerString(download_item->GetDangerType())); 229 json->SetString(kDangerKey, DangerString(download_item->GetDangerType()));
221 if (download_item->GetDangerType() !=
222 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS)
223 json->SetBoolean(kDangerAcceptedKey,
224 download_item->GetDangerType() ==
225 content::DOWNLOAD_DANGER_TYPE_USER_VALIDATED);
226 json->SetString(kStateKey, StateString(download_item->GetState())); 230 json->SetString(kStateKey, StateString(download_item->GetState()));
231 json->SetBoolean(kCanResumeKey, download_item->CanResume());
227 json->SetBoolean(kPausedKey, download_item->IsPaused()); 232 json->SetBoolean(kPausedKey, download_item->IsPaused());
228 json->SetString(kMimeKey, download_item->GetMimeType()); 233 json->SetString(kMimeKey, download_item->GetMimeType());
229 json->SetString(kStartTimeKey, TimeToISO8601(download_item->GetStartTime())); 234 json->SetString(kStartTimeKey, TimeToISO8601(download_item->GetStartTime()));
230 json->SetInteger(kBytesReceivedKey, download_item->GetReceivedBytes()); 235 json->SetInteger(kBytesReceivedKey, download_item->GetReceivedBytes());
231 json->SetInteger(kTotalBytesKey, download_item->GetTotalBytes()); 236 json->SetInteger(kTotalBytesKey, download_item->GetTotalBytes());
232 json->SetBoolean(kIncognito, incognito); 237 json->SetBoolean(kIncognito, incognito);
233 if (download_item->GetState() == DownloadItem::INTERRUPTED) { 238 if (download_item->GetState() == DownloadItem::INTERRUPTED) {
234 json->SetInteger(kErrorKey, static_cast<int>( 239 json->SetInteger(kErrorKey, static_cast<int>(
235 download_item->GetLastReason())); 240 download_item->GetLastReason()));
236 } else if (download_item->GetState() == DownloadItem::CANCELLED) { 241 } else if (download_item->GetState() == DownloadItem::CANCELLED) {
237 json->SetInteger(kErrorKey, static_cast<int>( 242 json->SetInteger(kErrorKey, static_cast<int>(
238 content::DOWNLOAD_INTERRUPT_REASON_USER_CANCELED)); 243 content::DOWNLOAD_INTERRUPT_REASON_USER_CANCELED));
239 } 244 }
240 if (!download_item->GetEndTime().is_null()) 245 if (!download_item->GetEndTime().is_null())
241 json->SetString(kEndTimeKey, TimeToISO8601(download_item->GetEndTime())); 246 json->SetString(kEndTimeKey, TimeToISO8601(download_item->GetEndTime()));
247 base::TimeDelta time_remaining;
248 if (download_item->TimeRemaining(&time_remaining)) {
249 base::Time now = base::Time::Now();
250 json->SetString(kEstimatedEndTimeKey, TimeToISO8601(now + time_remaining));
251 }
242 // TODO(benjhayden): Implement fileSize. 252 // TODO(benjhayden): Implement fileSize.
243 json->SetInteger(kFileSizeKey, download_item->GetTotalBytes()); 253 json->SetInteger(kFileSizeKey, download_item->GetTotalBytes());
244 return scoped_ptr<base::DictionaryValue>(json); 254 return scoped_ptr<base::DictionaryValue>(json);
245 } 255 }
246 256
247 class DownloadFileIconExtractorImpl : public DownloadFileIconExtractor { 257 class DownloadFileIconExtractorImpl : public DownloadFileIconExtractor {
248 public: 258 public:
249 DownloadFileIconExtractorImpl() {} 259 DownloadFileIconExtractorImpl() {}
250 260
251 virtual ~DownloadFileIconExtractorImpl() {} 261 virtual ~DownloadFileIconExtractorImpl() {}
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 default: 302 default:
293 NOTREACHED(); 303 NOTREACHED();
294 return IconLoader::NORMAL; 304 return IconLoader::NORMAL;
295 } 305 }
296 } 306 }
297 307
298 typedef base::hash_map<std::string, DownloadQuery::FilterType> FilterTypeMap; 308 typedef base::hash_map<std::string, DownloadQuery::FilterType> FilterTypeMap;
299 309
300 void InitFilterTypeMap(FilterTypeMap& filter_types) { 310 void InitFilterTypeMap(FilterTypeMap& filter_types) {
301 filter_types[kBytesReceivedKey] = DownloadQuery::FILTER_BYTES_RECEIVED; 311 filter_types[kBytesReceivedKey] = DownloadQuery::FILTER_BYTES_RECEIVED;
302 filter_types[kDangerAcceptedKey] = DownloadQuery::FILTER_DANGER_ACCEPTED;
303 filter_types[kExistsKey] = DownloadQuery::FILTER_EXISTS; 312 filter_types[kExistsKey] = DownloadQuery::FILTER_EXISTS;
304 filter_types[kFilenameKey] = DownloadQuery::FILTER_FILENAME; 313 filter_types[kFilenameKey] = DownloadQuery::FILTER_FILENAME;
305 filter_types[kFilenameRegexKey] = DownloadQuery::FILTER_FILENAME_REGEX; 314 filter_types[kFilenameRegexKey] = DownloadQuery::FILTER_FILENAME_REGEX;
306 filter_types[kMimeKey] = DownloadQuery::FILTER_MIME; 315 filter_types[kMimeKey] = DownloadQuery::FILTER_MIME;
307 filter_types[kPausedKey] = DownloadQuery::FILTER_PAUSED; 316 filter_types[kPausedKey] = DownloadQuery::FILTER_PAUSED;
308 filter_types[kQueryKey] = DownloadQuery::FILTER_QUERY; 317 filter_types[kQueryKey] = DownloadQuery::FILTER_QUERY;
309 filter_types[kEndedAfterKey] = DownloadQuery::FILTER_ENDED_AFTER; 318 filter_types[kEndedAfterKey] = DownloadQuery::FILTER_ENDED_AFTER;
310 filter_types[kEndedBeforeKey] = DownloadQuery::FILTER_ENDED_BEFORE; 319 filter_types[kEndedBeforeKey] = DownloadQuery::FILTER_ENDED_BEFORE;
311 filter_types[kEndTimeKey] = DownloadQuery::FILTER_END_TIME; 320 filter_types[kEndTimeKey] = DownloadQuery::FILTER_END_TIME;
312 filter_types[kStartedAfterKey] = DownloadQuery::FILTER_STARTED_AFTER; 321 filter_types[kStartedAfterKey] = DownloadQuery::FILTER_STARTED_AFTER;
313 filter_types[kStartedBeforeKey] = DownloadQuery::FILTER_STARTED_BEFORE; 322 filter_types[kStartedBeforeKey] = DownloadQuery::FILTER_STARTED_BEFORE;
314 filter_types[kStartTimeKey] = DownloadQuery::FILTER_START_TIME; 323 filter_types[kStartTimeKey] = DownloadQuery::FILTER_START_TIME;
315 filter_types[kTotalBytesKey] = DownloadQuery::FILTER_TOTAL_BYTES; 324 filter_types[kTotalBytesKey] = DownloadQuery::FILTER_TOTAL_BYTES;
316 filter_types[kTotalBytesGreaterKey] = 325 filter_types[kTotalBytesGreaterKey] =
317 DownloadQuery::FILTER_TOTAL_BYTES_GREATER; 326 DownloadQuery::FILTER_TOTAL_BYTES_GREATER;
318 filter_types[kTotalBytesLessKey] = DownloadQuery::FILTER_TOTAL_BYTES_LESS; 327 filter_types[kTotalBytesLessKey] = DownloadQuery::FILTER_TOTAL_BYTES_LESS;
319 filter_types[kUrlKey] = DownloadQuery::FILTER_URL; 328 filter_types[kUrlKey] = DownloadQuery::FILTER_URL;
320 filter_types[kUrlRegexKey] = DownloadQuery::FILTER_URL_REGEX; 329 filter_types[kUrlRegexKey] = DownloadQuery::FILTER_URL_REGEX;
321 } 330 }
322 331
323 typedef base::hash_map<std::string, DownloadQuery::SortType> SortTypeMap; 332 typedef base::hash_map<std::string, DownloadQuery::SortType> SortTypeMap;
324 333
325 void InitSortTypeMap(SortTypeMap& sorter_types) { 334 void InitSortTypeMap(SortTypeMap& sorter_types) {
326 sorter_types[kBytesReceivedKey] = DownloadQuery::SORT_BYTES_RECEIVED; 335 sorter_types[kBytesReceivedKey] = DownloadQuery::SORT_BYTES_RECEIVED;
327 sorter_types[kDangerKey] = DownloadQuery::SORT_DANGER; 336 sorter_types[kDangerKey] = DownloadQuery::SORT_DANGER;
328 sorter_types[kDangerAcceptedKey] = DownloadQuery::SORT_DANGER_ACCEPTED;
329 sorter_types[kEndTimeKey] = DownloadQuery::SORT_END_TIME; 337 sorter_types[kEndTimeKey] = DownloadQuery::SORT_END_TIME;
330 sorter_types[kExistsKey] = DownloadQuery::SORT_EXISTS; 338 sorter_types[kExistsKey] = DownloadQuery::SORT_EXISTS;
331 sorter_types[kFilenameKey] = DownloadQuery::SORT_FILENAME; 339 sorter_types[kFilenameKey] = DownloadQuery::SORT_FILENAME;
332 sorter_types[kMimeKey] = DownloadQuery::SORT_MIME; 340 sorter_types[kMimeKey] = DownloadQuery::SORT_MIME;
333 sorter_types[kPausedKey] = DownloadQuery::SORT_PAUSED; 341 sorter_types[kPausedKey] = DownloadQuery::SORT_PAUSED;
334 sorter_types[kStartTimeKey] = DownloadQuery::SORT_START_TIME; 342 sorter_types[kStartTimeKey] = DownloadQuery::SORT_START_TIME;
335 sorter_types[kStateKey] = DownloadQuery::SORT_STATE; 343 sorter_types[kStateKey] = DownloadQuery::SORT_STATE;
336 sorter_types[kTotalBytesKey] = DownloadQuery::SORT_TOTAL_BYTES; 344 sorter_types[kTotalBytesKey] = DownloadQuery::SORT_TOTAL_BYTES;
337 sorter_types[kUrlKey] = DownloadQuery::SORT_URL; 345 sorter_types[kUrlKey] = DownloadQuery::SORT_URL;
338 } 346 }
(...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after
800 DownloadsDownloadFunction::DownloadsDownloadFunction() {} 808 DownloadsDownloadFunction::DownloadsDownloadFunction() {}
801 809
802 DownloadsDownloadFunction::~DownloadsDownloadFunction() {} 810 DownloadsDownloadFunction::~DownloadsDownloadFunction() {}
803 811
804 bool DownloadsDownloadFunction::RunImpl() { 812 bool DownloadsDownloadFunction::RunImpl() {
805 scoped_ptr<extensions::api::downloads::Download::Params> params( 813 scoped_ptr<extensions::api::downloads::Download::Params> params(
806 extensions::api::downloads::Download::Params::Create(*args_)); 814 extensions::api::downloads::Download::Params::Create(*args_));
807 EXTENSION_FUNCTION_VALIDATE(params.get()); 815 EXTENSION_FUNCTION_VALIDATE(params.get());
808 const extensions::api::downloads::DownloadOptions& options = params->options; 816 const extensions::api::downloads::DownloadOptions& options = params->options;
809 GURL download_url(options.url); 817 GURL download_url(options.url);
810 if (!download_url.is_valid() || 818 if (!download_url.is_valid()) {
811 (!download_url.SchemeIs("data") &&
812 download_url.GetOrigin() != GetExtension()->url().GetOrigin() &&
813 !extensions::PermissionsData::HasHostPermission(GetExtension(),
814 download_url))) {
815 error_ = download_extension_errors::kInvalidURLError; 819 error_ = download_extension_errors::kInvalidURLError;
816 return false; 820 return false;
821 } else if (!download_url.SchemeIs("data") &&
822 download_url.GetOrigin() != GetExtension()->url().GetOrigin() &&
823 !extensions::PermissionsData::HasHostPermission(GetExtension(),
824 download_url)) {
825 error_ = download_extension_errors::kNotPermittedURLError;
826 return false;
817 } 827 }
818 828
819 Profile* current_profile = profile(); 829 Profile* current_profile = profile();
820 if (include_incognito() && profile()->HasOffTheRecordProfile()) 830 if (include_incognito() && profile()->HasOffTheRecordProfile())
821 current_profile = profile()->GetOffTheRecordProfile(); 831 current_profile = profile()->GetOffTheRecordProfile();
822 832
823 scoped_ptr<content::DownloadUrlParameters> download_params( 833 scoped_ptr<content::DownloadUrlParameters> download_params(
824 new content::DownloadUrlParameters( 834 new content::DownloadUrlParameters(
825 download_url, 835 download_url,
826 render_view_host()->GetProcess()->GetID(), 836 render_view_host()->GetProcess()->GetID(),
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
1056 RecordApiFunctions(DOWNLOADS_FUNCTION_ACCEPT_DANGER); 1066 RecordApiFunctions(DOWNLOADS_FUNCTION_ACCEPT_DANGER);
1057 // DownloadDangerPrompt displays a modal dialog using native widgets that the 1067 // DownloadDangerPrompt displays a modal dialog using native widgets that the
1058 // user must either accept or cancel. It cannot be scripted. 1068 // user must either accept or cancel. It cannot be scripted.
1059 DownloadDangerPrompt::Create( 1069 DownloadDangerPrompt::Create(
1060 download_item, 1070 download_item,
1061 web_contents, 1071 web_contents,
1062 true, 1072 true,
1063 base::Bind(&DownloadsAcceptDangerFunction::DangerPromptCallback, 1073 base::Bind(&DownloadsAcceptDangerFunction::DangerPromptCallback,
1064 this, true, params->download_id), 1074 this, true, params->download_id),
1065 base::Bind(&DownloadsAcceptDangerFunction::DangerPromptCallback, 1075 base::Bind(&DownloadsAcceptDangerFunction::DangerPromptCallback,
1066 this, false, params->download_id)); 1076 this, false, params->download_id),
1077 base::Bind(&DownloadsAcceptDangerFunction::DangerPromptDestroyed,
1078 this));
1067 // DownloadDangerPrompt deletes itself 1079 // DownloadDangerPrompt deletes itself
1068 return true; 1080 return true;
1069 } 1081 }
1070 1082
1071 void DownloadsAcceptDangerFunction::DangerPromptCallback( 1083 void DownloadsAcceptDangerFunction::DangerPromptCallback(
1072 bool accept, int download_id) { 1084 bool accept, int download_id) {
1085 DownloadItem* download_item = GetDownloadIfInProgress(
1086 profile(), include_incognito(), download_id);
1087 if (!download_item) {
1088 error_ = download_extension_errors::kInvalidOperationError;
1089 return;
1090 }
1073 if (accept) { 1091 if (accept) {
1074 DownloadItem* download_item = GetDownloadIfInProgress( 1092 download_item->ValidateDangerousDownload();
1075 profile(), include_incognito(), download_id); 1093 } else {
1076 if (download_item) 1094 download_item->Remove();
1077 download_item->ValidateDangerousDownload();
1078 } 1095 }
1096 }
1097
1098 void DownloadsAcceptDangerFunction::DangerPromptDestroyed() {
1079 SendResponse(error_.empty()); 1099 SendResponse(error_.empty());
1080 } 1100 }
1081 1101
1082 DownloadsShowFunction::DownloadsShowFunction() {} 1102 DownloadsShowFunction::DownloadsShowFunction() {}
1083 1103
1084 DownloadsShowFunction::~DownloadsShowFunction() {} 1104 DownloadsShowFunction::~DownloadsShowFunction() {}
1085 1105
1086 bool DownloadsShowFunction::RunImpl() { 1106 bool DownloadsShowFunction::RunImpl() {
1087 scoped_ptr<extensions::api::downloads::Show::Params> params( 1107 scoped_ptr<extensions::api::downloads::Show::Params> params(
1088 extensions::api::downloads::Show::Params::Create(*args_)); 1108 extensions::api::downloads::Show::Params::Create(*args_));
1089 EXTENSION_FUNCTION_VALIDATE(params.get()); 1109 EXTENSION_FUNCTION_VALIDATE(params.get());
1090 DownloadItem* download_item = GetDownload( 1110 if (params->download_id) {
1091 profile(), include_incognito(), params->download_id); 1111 DownloadItem* download_item = GetDownload(
1092 if (!download_item) { 1112 profile(), include_incognito(), *params->download_id);
1093 error_ = download_extension_errors::kInvalidOperationError; 1113 if (!download_item) {
1094 return false; 1114 error_ = download_extension_errors::kInvalidOperationError;
1115 return false;
1116 }
1117 download_item->ShowDownloadInShell();
1118 } else {
1119 DownloadManager* manager = NULL;
1120 DownloadManager* incognito_manager = NULL;
1121 GetManagers(profile(), include_incognito(), &manager, &incognito_manager);
1122 platform_util::OpenItem(DownloadPrefs::FromDownloadManager(
1123 manager)->DownloadPath());
1095 } 1124 }
1096 download_item->ShowDownloadInShell();
1097 RecordApiFunctions(DOWNLOADS_FUNCTION_SHOW); 1125 RecordApiFunctions(DOWNLOADS_FUNCTION_SHOW);
1098 return true; 1126 return true;
1099 } 1127 }
1100 1128
1101 DownloadsOpenFunction::DownloadsOpenFunction() {} 1129 DownloadsOpenFunction::DownloadsOpenFunction() {}
1102 1130
1103 DownloadsOpenFunction::~DownloadsOpenFunction() {} 1131 DownloadsOpenFunction::~DownloadsOpenFunction() {}
1104 1132
1105 bool DownloadsOpenFunction::RunImpl() { 1133 bool DownloadsOpenFunction::RunImpl() {
1106 scoped_ptr<extensions::api::downloads::Open::Params> params( 1134 scoped_ptr<extensions::api::downloads::Open::Params> params(
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after
1421 std::set<std::string> new_fields; 1449 std::set<std::string> new_fields;
1422 bool changed = false; 1450 bool changed = false;
1423 1451
1424 // For each field in the new json representation of the download_item except 1452 // For each field in the new json representation of the download_item except
1425 // the bytesReceived field, if the field has changed from the previous old 1453 // the bytesReceived field, if the field has changed from the previous old
1426 // json, set the differences in the |delta| object and remember that something 1454 // json, set the differences in the |delta| object and remember that something
1427 // significant changed. 1455 // significant changed.
1428 for (base::DictionaryValue::Iterator iter(*new_json.get()); 1456 for (base::DictionaryValue::Iterator iter(*new_json.get());
1429 !iter.IsAtEnd(); iter.Advance()) { 1457 !iter.IsAtEnd(); iter.Advance()) {
1430 new_fields.insert(iter.key()); 1458 new_fields.insert(iter.key());
1431 if (iter.key() != kBytesReceivedKey) { 1459 if ((iter.key() != kBytesReceivedKey) &&
1460 (iter.key() != kEstimatedEndTimeKey)) {
1432 const base::Value* old_value = NULL; 1461 const base::Value* old_value = NULL;
1433 if (!data->json().HasKey(iter.key()) || 1462 if (!data->json().HasKey(iter.key()) ||
1434 (data->json().Get(iter.key(), &old_value) && 1463 (data->json().Get(iter.key(), &old_value) &&
1435 !iter.value().Equals(old_value))) { 1464 !iter.value().Equals(old_value))) {
1436 delta->Set(iter.key() + ".current", iter.value().DeepCopy()); 1465 delta->Set(iter.key() + ".current", iter.value().DeepCopy());
1437 if (old_value) 1466 if (old_value)
1438 delta->Set(iter.key() + ".previous", old_value->DeepCopy()); 1467 delta->Set(iter.key() + ".previous", old_value->DeepCopy());
1439 changed = true; 1468 changed = true;
1440 } 1469 }
1441 } 1470 }
1442 } 1471 }
1443 1472
1444 // If a field was in the previous json but is not in the new json, set the 1473 // If a field was in the previous json but is not in the new json, set the
1445 // difference in |delta|. 1474 // difference in |delta|.
1446 for (base::DictionaryValue::Iterator iter(data->json()); 1475 for (base::DictionaryValue::Iterator iter(data->json());
1447 !iter.IsAtEnd(); iter.Advance()) { 1476 !iter.IsAtEnd(); iter.Advance()) {
1448 if (new_fields.find(iter.key()) == new_fields.end()) { 1477 if ((new_fields.find(iter.key()) == new_fields.end()) &&
1478 (iter.key() != kEstimatedEndTimeKey)) {
1479 // estimatedEndTime disappears after completion, but bytesReceived stays.
1449 delta->Set(iter.key() + ".previous", iter.value().DeepCopy()); 1480 delta->Set(iter.key() + ".previous", iter.value().DeepCopy());
1450 changed = true; 1481 changed = true;
1451 } 1482 }
1452 } 1483 }
1453 1484
1454 // Update the OnChangedStat and dispatch the event if something significant 1485 // Update the OnChangedStat and dispatch the event if something significant
1455 // changed. Replace the stored json with the new json. 1486 // changed. Replace the stored json with the new json.
1456 data->OnItemUpdated(); 1487 data->OnItemUpdated();
1457 if (changed) { 1488 if (changed) {
1458 DispatchEvent(events::kOnDownloadChanged, 1489 DispatchEvent(events::kOnDownloadChanged,
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1502 DownloadsNotificationSource notification_source; 1533 DownloadsNotificationSource notification_source;
1503 notification_source.event_name = event_name; 1534 notification_source.event_name = event_name;
1504 notification_source.profile = profile_; 1535 notification_source.profile = profile_;
1505 content::Source<DownloadsNotificationSource> content_source( 1536 content::Source<DownloadsNotificationSource> content_source(
1506 &notification_source); 1537 &notification_source);
1507 content::NotificationService::current()->Notify( 1538 content::NotificationService::current()->Notify(
1508 chrome::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT, 1539 chrome::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT,
1509 content_source, 1540 content_source,
1510 content::Details<std::string>(&json_args)); 1541 content::Details<std::string>(&json_args));
1511 } 1542 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698