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 #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 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
179 bool ValidateFilename(const string16& filename) { | 179 bool ValidateFilename(const string16& filename) { |
180 // TODO(benjhayden): More robust validation of filename. | 180 // TODO(benjhayden): More robust validation of filename. |
181 if ((filename.find('/') != string16::npos) || | 181 if ((filename.find('/') != string16::npos) || |
182 (filename.find('\\') != string16::npos)) | 182 (filename.find('\\') != string16::npos)) |
183 return false; | 183 return false; |
184 if (filename.size() >= 2u && filename[0] == L'.' && filename[1] == L'.') | 184 if (filename.size() >= 2u && filename[0] == L'.' && filename[1] == L'.') |
185 return false; | 185 return false; |
186 return true; | 186 return true; |
187 } | 187 } |
188 | 188 |
189 scoped_ptr<base::DictionaryValue> DownloadItemToJSON(DownloadItem* item) { | 189 scoped_ptr<base::DictionaryValue> DownloadItemToJSON( |
190 DownloadItem* item, | |
191 bool incognito) { | |
190 base::DictionaryValue* json = new base::DictionaryValue(); | 192 base::DictionaryValue* json = new base::DictionaryValue(); |
191 json->SetInteger(kIdKey, item->GetId()); | 193 json->SetInteger(kIdKey, item->GetId()); |
192 json->SetString(kUrlKey, item->GetOriginalUrl().spec()); | 194 json->SetString(kUrlKey, item->GetOriginalUrl().spec()); |
193 json->SetString(kFilenameKey, item->GetFullPath().LossyDisplayName()); | 195 json->SetString(kFilenameKey, item->GetFullPath().LossyDisplayName()); |
194 json->SetString(kDangerKey, DangerString(item->GetDangerType())); | 196 json->SetString(kDangerKey, DangerString(item->GetDangerType())); |
195 if (item->GetDangerType() != content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS) | 197 if (item->GetDangerType() != content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS) |
196 json->SetBoolean(kDangerAcceptedKey, | 198 json->SetBoolean(kDangerAcceptedKey, |
197 item->GetSafetyState() == DownloadItem::DANGEROUS_BUT_VALIDATED); | 199 item->GetSafetyState() == DownloadItem::DANGEROUS_BUT_VALIDATED); |
198 json->SetString(kStateKey, StateString(item->GetState())); | 200 json->SetString(kStateKey, StateString(item->GetState())); |
199 json->SetBoolean(kPausedKey, item->IsPaused()); | 201 json->SetBoolean(kPausedKey, item->IsPaused()); |
200 json->SetString(kMimeKey, item->GetMimeType()); | 202 json->SetString(kMimeKey, item->GetMimeType()); |
201 json->SetInteger(kStartTimeKey, | 203 json->SetInteger(kStartTimeKey, |
202 (item->GetStartTime() - base::Time::UnixEpoch()).InMilliseconds()); | 204 (item->GetStartTime() - base::Time::UnixEpoch()).InMilliseconds()); |
203 json->SetInteger(kBytesReceivedKey, item->GetReceivedBytes()); | 205 json->SetInteger(kBytesReceivedKey, item->GetReceivedBytes()); |
204 json->SetInteger(kTotalBytesKey, item->GetTotalBytes()); | 206 json->SetInteger(kTotalBytesKey, item->GetTotalBytes()); |
205 json->SetBoolean(kIncognito, item->IsOtr()); | 207 json->SetBoolean(kIncognito, incognito); |
206 if (item->GetState() == DownloadItem::INTERRUPTED) { | 208 if (item->GetState() == DownloadItem::INTERRUPTED) { |
207 json->SetInteger(kErrorKey, static_cast<int>(item->GetLastReason())); | 209 json->SetInteger(kErrorKey, static_cast<int>(item->GetLastReason())); |
208 } else if (item->GetState() == DownloadItem::CANCELLED) { | 210 } else if (item->GetState() == DownloadItem::CANCELLED) { |
209 json->SetInteger(kErrorKey, static_cast<int>( | 211 json->SetInteger(kErrorKey, static_cast<int>( |
210 content::DOWNLOAD_INTERRUPT_REASON_USER_CANCELED)); | 212 content::DOWNLOAD_INTERRUPT_REASON_USER_CANCELED)); |
211 } | 213 } |
212 // TODO(benjhayden): Implement endTime and fileSize. | 214 // TODO(benjhayden): Implement endTime and fileSize. |
213 // json->SetInteger(kEndTimeKey, -1); | 215 // json->SetInteger(kEndTimeKey, -1); |
214 json->SetInteger(kFileSizeKey, item->GetTotalBytes()); | 216 json->SetInteger(kFileSizeKey, item->GetTotalBytes()); |
215 return scoped_ptr<base::DictionaryValue>(json); | 217 return scoped_ptr<base::DictionaryValue>(json); |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
307 sorter_types[kStartTimeKey] = DownloadQuery::SORT_START_TIME; | 309 sorter_types[kStartTimeKey] = DownloadQuery::SORT_START_TIME; |
308 sorter_types[kStateKey] = DownloadQuery::SORT_STATE; | 310 sorter_types[kStateKey] = DownloadQuery::SORT_STATE; |
309 sorter_types[kTotalBytesKey] = DownloadQuery::SORT_TOTAL_BYTES; | 311 sorter_types[kTotalBytesKey] = DownloadQuery::SORT_TOTAL_BYTES; |
310 sorter_types[kUrlKey] = DownloadQuery::SORT_URL; | 312 sorter_types[kUrlKey] = DownloadQuery::SORT_URL; |
311 } | 313 } |
312 | 314 |
313 bool IsNotTemporaryDownloadFilter(const DownloadItem& item) { | 315 bool IsNotTemporaryDownloadFilter(const DownloadItem& item) { |
314 return !item.IsTemporary(); | 316 return !item.IsTemporary(); |
315 } | 317 } |
316 | 318 |
319 // Set |manager| to the on-record DownloadManager, and |incognito_manager| to | |
320 // the off-record DownloadManager if one exists and is requested via | |
321 // |include_incognito|. This should work regardless of whether |profile| is | |
322 // original or incognito. | |
317 void GetManagers( | 323 void GetManagers( |
318 Profile* profile, | 324 Profile* profile, |
319 bool include_incognito, | 325 bool include_incognito, |
320 DownloadManager** manager, DownloadManager** incognito_manager) { | 326 DownloadManager** manager, |
321 *manager = BrowserContext::GetDownloadManager(profile); | 327 DownloadManager** incognito_manager) { |
322 *incognito_manager = NULL; | 328 *manager = BrowserContext::GetDownloadManager(profile->GetOriginalProfile()); |
323 if (include_incognito && profile->HasOffTheRecordProfile()) { | 329 if (profile->HasOffTheRecordProfile() && |
330 (include_incognito || | |
331 (profile != profile->GetOriginalProfile()))) { | |
324 *incognito_manager = BrowserContext::GetDownloadManager( | 332 *incognito_manager = BrowserContext::GetDownloadManager( |
325 profile->GetOffTheRecordProfile()); | 333 profile->GetOffTheRecordProfile()); |
334 } else { | |
335 *incognito_manager = NULL; | |
326 } | 336 } |
327 } | 337 } |
328 | 338 |
329 DownloadItem* GetActiveItem(Profile* profile, bool include_incognito, int id) { | 339 DownloadItem* GetActiveItem(Profile* profile, bool include_incognito, int id) { |
330 DownloadManager* manager = NULL; | 340 DownloadManager* manager = NULL; |
331 DownloadManager* incognito_manager = NULL; | 341 DownloadManager* incognito_manager = NULL; |
332 GetManagers(profile, include_incognito, &manager, &incognito_manager); | 342 GetManagers(profile, include_incognito, &manager, &incognito_manager); |
333 DownloadItem* download_item = manager->GetDownload(id); | 343 DownloadItem* download_item = manager->GetDownload(id); |
334 if (!download_item && incognito_manager) | 344 if (!download_item && incognito_manager) |
335 download_item = incognito_manager->GetDownload(id); | 345 download_item = incognito_manager->GetDownload(id); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
385 if (sorter_type == sorter_types.Get().end()) { | 395 if (sorter_type == sorter_types.Get().end()) { |
386 *error = download_extension_errors::kInvalidOrderByError; | 396 *error = download_extension_errors::kInvalidOrderByError; |
387 return; | 397 return; |
388 } | 398 } |
389 query->AddSorter(sorter_type->second, direction); | 399 query->AddSorter(sorter_type->second, direction); |
390 } | 400 } |
391 } | 401 } |
392 | 402 |
393 void RunDownloadQuery( | 403 void RunDownloadQuery( |
394 const extensions::api::downloads::DownloadQuery& query_in, | 404 const extensions::api::downloads::DownloadQuery& query_in, |
395 Profile* profile, | 405 DownloadManager* manager, |
396 bool include_incognito, | 406 DownloadManager* incognito_manager, |
397 std::string* error, | 407 std::string* error, |
398 DownloadQuery::DownloadVector* results) { | 408 DownloadQuery::DownloadVector* results) { |
399 // TODO(benjhayden): Consider switching from LazyInstance to explicit string | 409 // TODO(benjhayden): Consider switching from LazyInstance to explicit string |
400 // comparisons. | 410 // comparisons. |
401 static base::LazyInstance<FilterTypeMap> filter_types = | 411 static base::LazyInstance<FilterTypeMap> filter_types = |
402 LAZY_INSTANCE_INITIALIZER; | 412 LAZY_INSTANCE_INITIALIZER; |
403 if (filter_types.Get().size() == 0) | 413 if (filter_types.Get().size() == 0) |
404 InitFilterTypeMap(filter_types.Get()); | 414 InitFilterTypeMap(filter_types.Get()); |
405 | 415 |
406 DownloadQuery query_out; | 416 DownloadQuery query_out; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
442 FilterTypeMap::const_iterator filter_type = | 452 FilterTypeMap::const_iterator filter_type = |
443 filter_types.Get().find(query_json_field.key()); | 453 filter_types.Get().find(query_json_field.key()); |
444 if (filter_type != filter_types.Get().end()) { | 454 if (filter_type != filter_types.Get().end()) { |
445 if (!query_out.AddFilter(filter_type->second, query_json_field.value())) { | 455 if (!query_out.AddFilter(filter_type->second, query_json_field.value())) { |
446 *error = download_extension_errors::kInvalidFilterError; | 456 *error = download_extension_errors::kInvalidFilterError; |
447 return; | 457 return; |
448 } | 458 } |
449 } | 459 } |
450 } | 460 } |
451 | 461 |
452 DownloadManager* manager = NULL; | |
453 DownloadManager* incognito_manager = NULL; | |
454 GetManagers(profile, include_incognito, &manager, &incognito_manager); | |
455 DownloadQuery::DownloadVector all_items; | 462 DownloadQuery::DownloadVector all_items; |
456 if (query_in.id.get()) { | 463 if (query_in.id.get()) { |
457 DownloadItem* item = manager->GetDownload(*query_in.id.get()); | 464 DownloadItem* item = manager->GetDownload(*query_in.id.get()); |
458 if (!item && incognito_manager) | 465 if (!item && incognito_manager) |
459 item = incognito_manager->GetDownload(*query_in.id.get()); | 466 item = incognito_manager->GetDownload(*query_in.id.get()); |
460 if (item) | 467 if (item) |
461 all_items.push_back(item); | 468 all_items.push_back(item); |
462 } else { | 469 } else { |
463 manager->GetAllDownloads(FilePath(FILE_PATH_LITERAL("")), &all_items); | 470 manager->GetAllDownloads(FilePath(FILE_PATH_LITERAL("")), &all_items); |
464 if (incognito_manager) | 471 if (incognito_manager) |
465 incognito_manager->GetAllDownloads( | 472 incognito_manager->GetAllDownloads( |
466 FilePath(FILE_PATH_LITERAL("")), &all_items); | 473 FilePath(FILE_PATH_LITERAL("")), &all_items); |
467 } | 474 } |
468 query_out.Search(all_items.begin(), all_items.end(), results); | 475 query_out.Search(all_items.begin(), all_items.end(), results); |
469 } | 476 } |
470 | 477 |
478 void DispatchEventInternal( | |
479 Profile* target_profile, | |
480 const char* event_name, | |
481 const std::string& json_args) { | |
482 target_profile->GetExtensionEventRouter()->DispatchEventToRenderers( | |
483 event_name, | |
484 json_args, | |
485 target_profile, | |
486 GURL(), | |
487 extensions::EventFilteringInfo()); | |
488 | |
489 ExtensionDownloadsEventRouter::DownloadsNotificationSource | |
490 notification_source; | |
491 notification_source.event_name = event_name; | |
492 notification_source.profile = target_profile; | |
493 content::Source<ExtensionDownloadsEventRouter::DownloadsNotificationSource> | |
494 content_source(¬ification_source); | |
495 std::string args_copy(json_args); | |
496 content::NotificationService::current()->Notify( | |
497 chrome::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT, | |
498 content_source, | |
499 content::Details<std::string>(&args_copy)); | |
500 } | |
501 | |
471 } // namespace | 502 } // namespace |
472 | 503 |
473 DownloadsDownloadFunction::DownloadsDownloadFunction() {} | 504 DownloadsDownloadFunction::DownloadsDownloadFunction() {} |
474 DownloadsDownloadFunction::~DownloadsDownloadFunction() {} | 505 DownloadsDownloadFunction::~DownloadsDownloadFunction() {} |
475 | 506 |
476 bool DownloadsDownloadFunction::RunImpl() { | 507 bool DownloadsDownloadFunction::RunImpl() { |
477 scoped_ptr<extensions::api::downloads::Download::Params> params( | 508 scoped_ptr<extensions::api::downloads::Download::Params> params( |
478 extensions::api::downloads::Download::Params::Create(*args_)); | 509 extensions::api::downloads::Download::Params::Create(*args_)); |
479 EXTENSION_FUNCTION_VALIDATE(params.get()); | 510 EXTENSION_FUNCTION_VALIDATE(params.get()); |
480 const extensions::api::downloads::DownloadOptions& options = params->options; | 511 const extensions::api::downloads::DownloadOptions& options = params->options; |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
563 SendResponse(error_.empty()); | 594 SendResponse(error_.empty()); |
564 } | 595 } |
565 | 596 |
566 DownloadsSearchFunction::DownloadsSearchFunction() {} | 597 DownloadsSearchFunction::DownloadsSearchFunction() {} |
567 DownloadsSearchFunction::~DownloadsSearchFunction() {} | 598 DownloadsSearchFunction::~DownloadsSearchFunction() {} |
568 | 599 |
569 bool DownloadsSearchFunction::RunImpl() { | 600 bool DownloadsSearchFunction::RunImpl() { |
570 scoped_ptr<extensions::api::downloads::Search::Params> params( | 601 scoped_ptr<extensions::api::downloads::Search::Params> params( |
571 extensions::api::downloads::Search::Params::Create(*args_)); | 602 extensions::api::downloads::Search::Params::Create(*args_)); |
572 EXTENSION_FUNCTION_VALIDATE(params.get()); | 603 EXTENSION_FUNCTION_VALIDATE(params.get()); |
604 DownloadManager* manager = NULL; | |
605 DownloadManager* incognito_manager = NULL; | |
606 GetManagers(profile(), include_incognito(), &manager, &incognito_manager); | |
573 DownloadQuery::DownloadVector results; | 607 DownloadQuery::DownloadVector results; |
574 RunDownloadQuery(params->query, profile(), include_incognito(), | 608 RunDownloadQuery(params->query, |
575 &error_, &results); | 609 manager, |
610 incognito_manager, | |
611 &error_, | |
612 &results); | |
576 if (!error_.empty()) | 613 if (!error_.empty()) |
577 return false; | 614 return false; |
615 | |
578 base::ListValue* json_results = new base::ListValue(); | 616 base::ListValue* json_results = new base::ListValue(); |
579 for (DownloadManager::DownloadVector::const_iterator it = results.begin(); | 617 for (DownloadManager::DownloadVector::const_iterator it = results.begin(); |
580 it != results.end(); ++it) { | 618 it != results.end(); ++it) { |
581 scoped_ptr<base::DictionaryValue> item(DownloadItemToJSON(*it)); | 619 DownloadItem* item = *it; |
582 json_results->Append(item.release()); | 620 int32 download_id = item->GetId(); |
621 bool off_record = ((incognito_manager != NULL) && | |
622 (incognito_manager->GetDownload(download_id) != NULL)); | |
623 scoped_ptr<base::DictionaryValue> json_item(DownloadItemToJSON( | |
624 *it, off_record)); | |
625 json_results->Append(json_item.release()); | |
Randy Smith (Not in Mondays)
2012/08/02 17:52:17
I wince a little bit at RunDownloadQuery having th
benjhayden
2012/08/13 15:08:09
The downloads are all mixed together, so that woul
| |
583 } | 626 } |
584 SetResult(json_results); | 627 SetResult(json_results); |
585 RecordApiFunctions(DOWNLOADS_FUNCTION_SEARCH); | 628 RecordApiFunctions(DOWNLOADS_FUNCTION_SEARCH); |
586 return true; | 629 return true; |
587 } | 630 } |
588 | 631 |
589 DownloadsPauseFunction::DownloadsPauseFunction() {} | 632 DownloadsPauseFunction::DownloadsPauseFunction() {} |
590 DownloadsPauseFunction::~DownloadsPauseFunction() {} | 633 DownloadsPauseFunction::~DownloadsPauseFunction() {} |
591 | 634 |
592 bool DownloadsPauseFunction::RunImpl() { | 635 bool DownloadsPauseFunction::RunImpl() { |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
783 RecordApiFunctions(DOWNLOADS_FUNCTION_GET_FILE_ICON); | 826 RecordApiFunctions(DOWNLOADS_FUNCTION_GET_FILE_ICON); |
784 SetResult(base::Value::CreateStringValue(url)); | 827 SetResult(base::Value::CreateStringValue(url)); |
785 } | 828 } |
786 SendResponse(error_.empty()); | 829 SendResponse(error_.empty()); |
787 } | 830 } |
788 | 831 |
789 ExtensionDownloadsEventRouter::ExtensionDownloadsEventRouter( | 832 ExtensionDownloadsEventRouter::ExtensionDownloadsEventRouter( |
790 Profile* profile, | 833 Profile* profile, |
791 DownloadManager* manager) | 834 DownloadManager* manager) |
792 : profile_(profile), | 835 : profile_(profile), |
793 manager_(manager) { | 836 manager_(manager), |
837 incognito_(profile_->HasOffTheRecordProfile() && | |
838 (profile_ == profile_->GetOffTheRecordProfile())) { | |
794 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 839 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
795 DCHECK(profile_); | |
796 DCHECK(manager_); | |
797 manager_->AddObserver(this); | 840 manager_->AddObserver(this); |
798 } | 841 } |
799 | 842 |
800 ExtensionDownloadsEventRouter::~ExtensionDownloadsEventRouter() { | 843 ExtensionDownloadsEventRouter::~ExtensionDownloadsEventRouter() { |
801 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 844 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
802 if (manager_ != NULL) | 845 if (manager_ != NULL) |
803 manager_->RemoveObserver(this); | 846 manager_->RemoveObserver(this); |
804 for (ItemMap::const_iterator iter = downloads_.begin(); | 847 for (ItemMap::const_iterator iter = downloads_.begin(); |
805 iter != downloads_.end(); ++iter) { | 848 iter != downloads_.end(); ++iter) { |
806 if (iter->second != NULL) | 849 if (iter->second != NULL) |
(...skipping 26 matching lines...) Expand all Loading... | |
833 DispatchEvent(extensions::event_names::kOnDownloadErased, | 876 DispatchEvent(extensions::event_names::kOnDownloadErased, |
834 base::Value::CreateIntegerValue(download_id)); | 877 base::Value::CreateIntegerValue(download_id)); |
835 delete item_jsons_[download_id]; | 878 delete item_jsons_[download_id]; |
836 item_jsons_.erase(download_id); | 879 item_jsons_.erase(download_id); |
837 delete on_changed_stats_[download_id]; | 880 delete on_changed_stats_[download_id]; |
838 on_changed_stats_.erase(download_id); | 881 on_changed_stats_.erase(download_id); |
839 return; | 882 return; |
840 } | 883 } |
841 | 884 |
842 base::DictionaryValue* old_json = item_jsons_[download_id]; | 885 base::DictionaryValue* old_json = item_jsons_[download_id]; |
843 scoped_ptr<base::DictionaryValue> new_json(DownloadItemToJSON(item)); | 886 scoped_ptr<base::DictionaryValue> new_json(DownloadItemToJSON( |
887 item, incognito_)); | |
Randy Smith (Not in Mondays)
2012/08/02 17:52:17
Won't this produce the wrong result when we're dis
benjhayden
2012/08/13 15:08:09
We discussed offline how EDER handles incognito. T
| |
844 scoped_ptr<base::DictionaryValue> delta(new base::DictionaryValue()); | 888 scoped_ptr<base::DictionaryValue> delta(new base::DictionaryValue()); |
845 delta->SetInteger(kIdKey, download_id); | 889 delta->SetInteger(kIdKey, download_id); |
846 std::set<std::string> new_fields; | 890 std::set<std::string> new_fields; |
847 bool changed = false; | 891 bool changed = false; |
848 | 892 |
849 // For each field in the new json representation of the item except the | 893 // For each field in the new json representation of the item except the |
850 // bytesReceived field, if the field has changed from the previous old json, | 894 // bytesReceived field, if the field has changed from the previous old json, |
851 // set the differences in the |delta| object and remember that something | 895 // set the differences in the |delta| object and remember that something |
852 // significant changed. | 896 // significant changed. |
853 for (base::DictionaryValue::Iterator iter(*new_json.get()); | 897 for (base::DictionaryValue::Iterator iter(*new_json.get()); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
891 } | 935 } |
892 | 936 |
893 void ExtensionDownloadsEventRouter::OnDownloadCreated( | 937 void ExtensionDownloadsEventRouter::OnDownloadCreated( |
894 DownloadManager* manager, DownloadItem* download_item) { | 938 DownloadManager* manager, DownloadItem* download_item) { |
895 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 939 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
896 DCHECK(manager_ == manager); | 940 DCHECK(manager_ == manager); |
897 if (download_item->IsTemporary()) return; | 941 if (download_item->IsTemporary()) return; |
898 | 942 |
899 download_item->AddObserver(this); | 943 download_item->AddObserver(this); |
900 scoped_ptr<base::DictionaryValue> json_item( | 944 scoped_ptr<base::DictionaryValue> json_item( |
901 DownloadItemToJSON(download_item)); | 945 DownloadItemToJSON(download_item, incognito_)); |
902 DispatchEvent(extensions::event_names::kOnDownloadCreated, | 946 DispatchEvent(extensions::event_names::kOnDownloadCreated, |
903 json_item->DeepCopy()); | 947 json_item->DeepCopy()); |
904 int32 download_id = download_item->GetId(); | 948 int32 download_id = download_item->GetId(); |
905 DCHECK(item_jsons_.find(download_id) == item_jsons_.end()); | 949 DCHECK(item_jsons_.find(download_id) == item_jsons_.end()); |
906 on_changed_stats_[download_id] = new OnChangedStat(); | 950 on_changed_stats_[download_id] = new OnChangedStat(); |
907 item_jsons_[download_id] = json_item.release(); | 951 item_jsons_[download_id] = json_item.release(); |
908 downloads_[download_id] = download_item; | 952 downloads_[download_id] = download_item; |
909 } | 953 } |
910 | 954 |
911 void ExtensionDownloadsEventRouter::ManagerGoingDown( | 955 void ExtensionDownloadsEventRouter::ManagerGoingDown( |
912 DownloadManager* manager) { | 956 DownloadManager* manager) { |
913 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 957 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
914 manager_->RemoveObserver(this); | 958 manager_->RemoveObserver(this); |
915 manager_ = NULL; | 959 manager_ = NULL; |
916 } | 960 } |
917 | 961 |
918 void ExtensionDownloadsEventRouter::DispatchEvent( | 962 void ExtensionDownloadsEventRouter::DispatchEvent( |
919 const char* event_name, base::Value* arg) { | 963 const char* event_name, base::Value* arg) { |
920 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 964 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
921 base::ListValue args; | 965 base::ListValue args; |
922 args.Append(arg); | 966 args.Append(arg); |
923 std::string json_args; | 967 std::string json_args; |
924 base::JSONWriter::Write(&args, &json_args); | 968 base::JSONWriter::Write(&args, &json_args); |
925 profile_->GetExtensionEventRouter()->DispatchEventToRenderers( | 969 DispatchEventInternal(profile_, event_name, json_args); |
926 event_name, | 970 if (profile_->HasOffTheRecordProfile() && |
927 json_args, | 971 (profile_ == profile_->GetOriginalProfile())) { |
928 profile_, | 972 DispatchEventInternal( |
929 GURL(), | 973 profile_->GetOffTheRecordProfile(), event_name, json_args); |
930 extensions::EventFilteringInfo()); | 974 } |
931 | |
932 DownloadsNotificationSource notification_source; | |
933 notification_source.event_name = event_name; | |
934 notification_source.profile = profile_; | |
935 content::NotificationService::current()->Notify( | |
936 chrome::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT, | |
937 content::Source<DownloadsNotificationSource>(¬ification_source), | |
938 content::Details<std::string>(&json_args)); | |
939 } | 975 } |
OLD | NEW |