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

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

Issue 10542038: Rewrite DownloadsApiTest in C++. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 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 19 matching lines...) Expand all
30 #include "chrome/browser/download/download_service.h" 30 #include "chrome/browser/download/download_service.h"
31 #include "chrome/browser/download/download_service_factory.h" 31 #include "chrome/browser/download/download_service_factory.h"
32 #include "chrome/browser/download/download_util.h" 32 #include "chrome/browser/download/download_util.h"
33 #include "chrome/browser/extensions/extension_event_names.h" 33 #include "chrome/browser/extensions/extension_event_names.h"
34 #include "chrome/browser/extensions/extension_event_router.h" 34 #include "chrome/browser/extensions/extension_event_router.h"
35 #include "chrome/browser/icon_loader.h" 35 #include "chrome/browser/icon_loader.h"
36 #include "chrome/browser/icon_manager.h" 36 #include "chrome/browser/icon_manager.h"
37 #include "chrome/browser/renderer_host/chrome_render_message_filter.h" 37 #include "chrome/browser/renderer_host/chrome_render_message_filter.h"
38 #include "chrome/browser/ui/browser.h" 38 #include "chrome/browser/ui/browser.h"
39 #include "chrome/browser/ui/webui/web_ui_util.h" 39 #include "chrome/browser/ui/webui/web_ui_util.h"
40 #include "chrome/common/chrome_notification_types.h"
40 #include "content/public/browser/download_interrupt_reasons.h" 41 #include "content/public/browser/download_interrupt_reasons.h"
41 #include "content/public/browser/download_item.h" 42 #include "content/public/browser/download_item.h"
42 #include "content/public/browser/download_save_info.h" 43 #include "content/public/browser/download_save_info.h"
44 #include "content/public/browser/notification_service.h"
43 #include "content/public/browser/render_process_host.h" 45 #include "content/public/browser/render_process_host.h"
44 #include "content/public/browser/render_view_host.h" 46 #include "content/public/browser/render_view_host.h"
45 #include "content/public/browser/resource_context.h" 47 #include "content/public/browser/resource_context.h"
46 #include "content/public/browser/resource_dispatcher_host.h" 48 #include "content/public/browser/resource_dispatcher_host.h"
47 #include "net/base/load_flags.h" 49 #include "net/base/load_flags.h"
48 #include "net/http/http_util.h" 50 #include "net/http/http_util.h"
49 #include "net/url_request/url_request.h" 51 #include "net/url_request/url_request.h"
50 52
51 using content::BrowserContext; 53 using content::BrowserContext;
52 using content::BrowserThread; 54 using content::BrowserThread;
(...skipping 853 matching lines...) Expand 10 before | Expand all | Expand 10 after
906 908
907 void DownloadsGetFileIconFunction::OnIconURLExtracted(const std::string& url) { 909 void DownloadsGetFileIconFunction::OnIconURLExtracted(const std::string& url) {
908 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 910 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
909 if (url.empty()) 911 if (url.empty())
910 error_ = download_extension_errors::kIconNotFoundError; 912 error_ = download_extension_errors::kIconNotFoundError;
911 else 913 else
912 result_.reset(base::Value::CreateStringValue(url)); 914 result_.reset(base::Value::CreateStringValue(url));
913 SendResponse(error_.empty()); 915 SendResponse(error_.empty());
914 } 916 }
915 917
916 ExtensionDownloadsEventRouter::ExtensionDownloadsEventRouter(Profile* profile) 918 ExtensionDownloadsEventRouter::ExtensionDownloadsEventRouter(
919 Profile* profile,
920 DownloadManager* manager)
917 : profile_(profile), 921 : profile_(profile),
918 manager_(NULL) { 922 manager_(manager) {
919 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 923 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
920 DCHECK(profile_); 924 DCHECK(profile_);
921 // Register a callback with the DownloadService for this profile to be called 925 DCHECK(manager_);
922 // when it creates the DownloadManager, or now if the manager already exists.
923 DownloadServiceFactory::GetForProfile(profile)->OnManagerCreated(base::Bind(
924 &ExtensionDownloadsEventRouter::Init, base::Unretained(this)));
925 }
926
927 // The only public methods on this class are ModelChanged() and
928 // ManagerGoingDown(), and they are only called by DownloadManager, so
929 // there's no way for any methods on this class to be called before
930 // DownloadService calls Init() via the OnManagerCreated Callback above.
931 void ExtensionDownloadsEventRouter::Init(DownloadManager* manager) {
932 DCHECK(manager_ == NULL);
933 manager_ = manager;
934 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
935 manager_->AddObserver(this); 926 manager_->AddObserver(this);
936 } 927 }
937 928
938 ExtensionDownloadsEventRouter::~ExtensionDownloadsEventRouter() { 929 ExtensionDownloadsEventRouter::~ExtensionDownloadsEventRouter() {
930 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
939 if (manager_ != NULL) 931 if (manager_ != NULL)
940 manager_->RemoveObserver(this); 932 manager_->RemoveObserver(this);
941 for (ItemMap::const_iterator iter = downloads_.begin(); 933 for (ItemMap::const_iterator iter = downloads_.begin();
942 iter != downloads_.end(); ++iter) { 934 iter != downloads_.end(); ++iter) {
943 if (iter->second != NULL) 935 if (iter->second != NULL)
944 iter->second->RemoveObserver(this); 936 iter->second->RemoveObserver(this);
945 } 937 }
946 STLDeleteValues(&item_jsons_); 938 STLDeleteValues(&item_jsons_);
947 STLDeleteValues(&on_changed_stats_); 939 STLDeleteValues(&on_changed_stats_);
948 } 940 }
949 941
950 ExtensionDownloadsEventRouter::OnChangedStat::OnChangedStat() 942 ExtensionDownloadsEventRouter::OnChangedStat::OnChangedStat()
951 : fires(0), 943 : fires(0),
952 total(0) { 944 total(0) {
953 } 945 }
954 946
955 ExtensionDownloadsEventRouter::OnChangedStat::~OnChangedStat() { 947 ExtensionDownloadsEventRouter::OnChangedStat::~OnChangedStat() {
956 if (total > 0) 948 if (total > 0)
957 UMA_HISTOGRAM_PERCENTAGE("Download.OnChanged", (fires * 100 / total)); 949 UMA_HISTOGRAM_PERCENTAGE("Download.OnChanged", (fires * 100 / total));
958 } 950 }
959 951
960 void ExtensionDownloadsEventRouter::OnDownloadUpdated(DownloadItem* item) { 952 void ExtensionDownloadsEventRouter::OnDownloadUpdated(DownloadItem* item) {
961 if (!profile_) 953 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
962 return;
963 int download_id = item->GetId(); 954 int download_id = item->GetId();
964 if (item->GetState() == DownloadItem::REMOVING) { 955 if (item->GetState() == DownloadItem::REMOVING) {
965 // The REMOVING state indicates that this item is being erased. 956 // The REMOVING state indicates that this item is being erased.
966 // Let's unregister as an observer so that we don't see any more updates 957 // Let's unregister as an observer so that we don't see any more updates
967 // from it, dispatch the onErased event, and remove its json and is 958 // from it, dispatch the onErased event, and remove its json and is
968 // OnChangedStat from our maps. 959 // OnChangedStat from our maps.
969 downloads_.erase(download_id); 960 downloads_.erase(download_id);
970 item->RemoveObserver(this); 961 item->RemoveObserver(this);
971 DispatchEvent(extension_event_names::kOnDownloadErased, 962 DispatchEvent(extension_event_names::kOnDownloadErased,
972 base::Value::CreateIntegerValue(download_id)); 963 base::Value::CreateIntegerValue(download_id));
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1018 // changed. Replace the stored json with the new json. 1009 // changed. Replace the stored json with the new json.
1019 ++(on_changed_stats_[download_id]->total); 1010 ++(on_changed_stats_[download_id]->total);
1020 if (changed) { 1011 if (changed) {
1021 DispatchEvent(extension_event_names::kOnDownloadChanged, delta.release()); 1012 DispatchEvent(extension_event_names::kOnDownloadChanged, delta.release());
1022 ++(on_changed_stats_[download_id]->fires); 1013 ++(on_changed_stats_[download_id]->fires);
1023 } 1014 }
1024 item_jsons_[download_id]->Swap(new_json.get()); 1015 item_jsons_[download_id]->Swap(new_json.get());
1025 } 1016 }
1026 1017
1027 void ExtensionDownloadsEventRouter::OnDownloadOpened(DownloadItem* item) { 1018 void ExtensionDownloadsEventRouter::OnDownloadOpened(DownloadItem* item) {
1019 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1028 } 1020 }
1029 1021
1030 void ExtensionDownloadsEventRouter::ModelChanged(DownloadManager* manager) { 1022 void ExtensionDownloadsEventRouter::ModelChanged(DownloadManager* manager) {
1031 if (!profile_)
1032 return;
1033 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1023 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1034 DCHECK(manager_ == manager); 1024 DCHECK(manager_ == manager);
1035 typedef std::set<int> DownloadIdSet; 1025 typedef std::set<int> DownloadIdSet;
1036 1026
1037 // Get all the download items. 1027 // Get all the download items.
1038 DownloadManager::DownloadVector current_vec; 1028 DownloadManager::DownloadVector current_vec;
1039 manager_->SearchDownloads(string16(), &current_vec); 1029 manager_->SearchDownloads(string16(), &current_vec);
1040 1030
1041 // Populate set<>s of download item identifiers so that we can find 1031 // Populate set<>s of download item identifiers so that we can find
1042 // differences between the old and the new set of download items. 1032 // differences between the old and the new set of download items.
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1077 item_jsons_[*iter] = item.release(); 1067 item_jsons_[*iter] = item.release();
1078 } 1068 }
1079 downloads_.swap(current_map); 1069 downloads_.swap(current_map);
1080 1070
1081 // Dispatching onErased is handled in OnDownloadUpdated when an item 1071 // Dispatching onErased is handled in OnDownloadUpdated when an item
1082 // transitions to the REMOVING state. 1072 // transitions to the REMOVING state.
1083 } 1073 }
1084 1074
1085 void ExtensionDownloadsEventRouter::ManagerGoingDown( 1075 void ExtensionDownloadsEventRouter::ManagerGoingDown(
1086 DownloadManager* manager) { 1076 DownloadManager* manager) {
1077 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1087 manager_->RemoveObserver(this); 1078 manager_->RemoveObserver(this);
1088 manager_ = NULL; 1079 manager_ = NULL;
1089 profile_ = NULL;
1090 } 1080 }
1091 1081
1092 void ExtensionDownloadsEventRouter::DispatchEvent( 1082 void ExtensionDownloadsEventRouter::DispatchEvent(
1093 const char* event_name, base::Value* arg) { 1083 const char* event_name, base::Value* arg) {
1094 if (!profile_ || !profile_->GetExtensionEventRouter()) 1084 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1095 return;
1096 base::ListValue args; 1085 base::ListValue args;
1097 args.Append(arg); 1086 args.Append(arg);
1098 std::string json_args; 1087 std::string json_args;
1099 base::JSONWriter::Write(&args, &json_args); 1088 base::JSONWriter::Write(&args, &json_args);
1100 profile_->GetExtensionEventRouter()->DispatchEventToRenderers( 1089 profile_->GetExtensionEventRouter()->DispatchEventToRenderers(
1101 event_name, 1090 event_name,
1102 json_args, 1091 json_args,
1103 profile_, 1092 profile_,
1104 GURL()); 1093 GURL());
1094
1095 DownloadsNotificationSource notification_source;
1096 notification_source.event_name = event_name;
1097 notification_source.profile = profile_;
1098 content::NotificationService::current()->Notify(
1099 chrome::NOTIFICATION_EXTENSION_DOWNLOADS_EVENT,
1100 content::Source<DownloadsNotificationSource>(&notification_source),
1101 content::Details<std::string>(&json_args));
1105 } 1102 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698