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

Side by Side Diff: chrome/browser/component_updater/component_updater_service.cc

Issue 421393002: Componentize component_updater: Split content::ResourceThrottle from CUS. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 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 2012 The Chromium Authors. All rights reserved. 1 // Copyright 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/component_updater/component_updater_service.h" 5 #include "chrome/browser/component_updater/component_updater_service.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/at_exit.h" 11 #include "base/at_exit.h"
12 #include "base/bind.h" 12 #include "base/bind.h"
13 #include "base/callback.h"
13 #include "base/compiler_specific.h" 14 #include "base/compiler_specific.h"
14 #include "base/file_util.h" 15 #include "base/file_util.h"
15 #include "base/files/file_path.h" 16 #include "base/files/file_path.h"
16 #include "base/logging.h" 17 #include "base/logging.h"
17 #include "base/memory/scoped_ptr.h" 18 #include "base/memory/scoped_ptr.h"
18 #include "base/message_loop/message_loop_proxy.h" 19 #include "base/message_loop/message_loop_proxy.h"
19 #include "base/observer_list.h" 20 #include "base/observer_list.h"
20 #include "base/sequenced_task_runner.h" 21 #include "base/sequenced_task_runner.h"
21 #include "base/stl_util.h" 22 #include "base/stl_util.h"
22 #include "base/threading/sequenced_worker_pool.h" 23 #include "base/threading/sequenced_worker_pool.h"
23 #include "base/threading/thread_checker.h" 24 #include "base/threading/thread_checker.h"
24 #include "base/timer/timer.h" 25 #include "base/timer/timer.h"
25 #include "chrome/browser/browser_process.h"
26 #include "chrome/browser/component_updater/component_patcher_operation.h" 26 #include "chrome/browser/component_updater/component_patcher_operation.h"
27 #include "chrome/browser/component_updater/component_unpacker.h" 27 #include "chrome/browser/component_updater/component_unpacker.h"
28 #include "chrome/browser/component_updater/component_updater_configurator.h" 28 #include "chrome/browser/component_updater/component_updater_configurator.h"
29 #include "chrome/browser/component_updater/component_updater_ping_manager.h" 29 #include "chrome/browser/component_updater/component_updater_ping_manager.h"
30 #include "chrome/browser/component_updater/component_updater_utils.h" 30 #include "chrome/browser/component_updater/component_updater_utils.h"
31 #include "chrome/browser/component_updater/crx_downloader.h" 31 #include "chrome/browser/component_updater/crx_downloader.h"
32 #include "chrome/browser/component_updater/crx_update_item.h" 32 #include "chrome/browser/component_updater/crx_update_item.h"
33 #include "chrome/browser/component_updater/update_checker.h" 33 #include "chrome/browser/component_updater/update_checker.h"
34 #include "chrome/browser/component_updater/update_response.h" 34 #include "chrome/browser/component_updater/update_response.h"
35 #include "content/public/browser/browser_thread.h"
36 #include "content/public/browser/resource_controller.h"
37 #include "content/public/browser/resource_throttle.h"
38 #include "url/gurl.h" 35 #include "url/gurl.h"
39 36
40 using content::BrowserThread;
41
42 namespace component_updater { 37 namespace component_updater {
43 38
44 // The component updater is designed to live until process shutdown, so 39 // The component updater is designed to live until process shutdown, so
45 // base::Bind() calls are not refcounted. 40 // base::Bind() calls are not refcounted.
46 41
47 namespace { 42 namespace {
48 43
49 // Returns true if the |proposed| version is newer than |current| version. 44 // Returns true if the |proposed| version is newer than |current| version.
50 bool IsVersionNewer(const Version& current, const std::string& proposed) { 45 bool IsVersionNewer(const Version& current, const std::string& proposed) {
51 Version proposed_ver(proposed); 46 Version proposed_ver(proposed);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 CrxUpdateItem::~CrxUpdateItem() { 78 CrxUpdateItem::~CrxUpdateItem() {
84 } 79 }
85 80
86 CrxComponent::CrxComponent() 81 CrxComponent::CrxComponent()
87 : installer(NULL), allow_background_download(true) { 82 : installer(NULL), allow_background_download(true) {
88 } 83 }
89 84
90 CrxComponent::~CrxComponent() { 85 CrxComponent::~CrxComponent() {
91 } 86 }
92 87
93 ///////////////////////////////////////////////////////////////////////////////
94 // In charge of blocking url requests until the |crx_id| component has been
95 // updated. This class is touched solely from the IO thread. The UI thread
96 // can post tasks to it via weak pointers. By default the request is blocked
97 // unless the CrxUpdateService calls Unblock().
98 // The lifetime is controlled by Chrome's resource loader so the component
99 // updater cannot touch objects from this class except via weak pointers.
100 class CUResourceThrottle : public content::ResourceThrottle,
101 public base::SupportsWeakPtr<CUResourceThrottle> {
102 public:
103 explicit CUResourceThrottle(const net::URLRequest* request);
104 virtual ~CUResourceThrottle();
105
106 // Overriden from ResourceThrottle.
107 virtual void WillStartRequest(bool* defer) OVERRIDE;
108 virtual void WillRedirectRequest(const GURL& new_url, bool* defer) OVERRIDE;
109 virtual const char* GetNameForLogging() const OVERRIDE;
110
111 // Component updater calls this function via PostTask to unblock the request.
112 void Unblock();
113
114 typedef std::vector<base::WeakPtr<CUResourceThrottle> > WeakPtrVector;
115
116 private:
117 enum State { NEW, BLOCKED, UNBLOCKED };
118
119 State state_;
120 };
121
122 void UnblockResourceThrottle(base::WeakPtr<CUResourceThrottle> rt) {
123 BrowserThread::PostTask(BrowserThread::IO,
124 FROM_HERE,
125 base::Bind(&CUResourceThrottle::Unblock, rt));
126 }
127
128 void UnblockandReapAllThrottles(CUResourceThrottle::WeakPtrVector* throttles) {
129 CUResourceThrottle::WeakPtrVector::iterator it;
130 for (it = throttles->begin(); it != throttles->end(); ++it)
131 UnblockResourceThrottle(*it);
132 throttles->clear();
133 }
134
135 ////////////////////////////////////////////////////////////////////////////// 88 //////////////////////////////////////////////////////////////////////////////
136 // The one and only implementation of the ComponentUpdateService interface. In 89 // The one and only implementation of the ComponentUpdateService interface. In
137 // charge of running the show. The main method is ProcessPendingItems() which 90 // charge of running the show. The main method is ProcessPendingItems() which
138 // is called periodically to do the upgrades/installs or the update checks. 91 // is called periodically to do the upgrades/installs or the update checks.
139 // An important consideration here is to be as "low impact" as we can to the 92 // An important consideration here is to be as "low impact" as we can to the
140 // rest of the browser, so even if we have many components registered and 93 // rest of the browser, so even if we have many components registered and
141 // eligible for update, we only do one thing at a time with pauses in between 94 // eligible for update, we only do one thing at a time with pauses in between
142 // the tasks. Also when we do network requests there is only one |url_fetcher_| 95 // the tasks. Also when we do network requests there is only one |url_fetcher_|
143 // in flight at a time. 96 // in flight at a time.
144 // There are no locks in this code, the main structure |work_items_| is mutated 97 // There are no locks in this code, the main structure |work_items_| is mutated
145 // only from the main thread. The unpack and installation is done in a blocking 98 // only from the main thread. The unpack and installation is done in a blocking
146 // pool thread. The network requests are done in the IO thread or in the file 99 // pool thread. The network requests are done in the IO thread or in the file
147 // thread. 100 // thread.
148 class CrxUpdateService : public ComponentUpdateService, public OnDemandUpdater { 101 class CrxUpdateService : public ComponentUpdateService, public OnDemandUpdater {
149 public: 102 public:
150 explicit CrxUpdateService(Configurator* config); 103 explicit CrxUpdateService(Configurator* config);
151 virtual ~CrxUpdateService(); 104 virtual ~CrxUpdateService();
152 105
153 // Overrides for ComponentUpdateService. 106 // Overrides for ComponentUpdateService.
154 virtual void AddObserver(Observer* observer) OVERRIDE; 107 virtual void AddObserver(Observer* observer) OVERRIDE;
155 virtual void RemoveObserver(Observer* observer) OVERRIDE; 108 virtual void RemoveObserver(Observer* observer) OVERRIDE;
156 virtual Status Start() OVERRIDE; 109 virtual Status Start() OVERRIDE;
157 virtual Status Stop() OVERRIDE; 110 virtual Status Stop() OVERRIDE;
158 virtual Status RegisterComponent(const CrxComponent& component) OVERRIDE; 111 virtual Status RegisterComponent(const CrxComponent& component) OVERRIDE;
159 virtual std::vector<std::string> GetComponentIDs() const OVERRIDE; 112 virtual std::vector<std::string> GetComponentIDs() const OVERRIDE;
160 virtual bool GetComponentDetails(const std::string& component_id,
161 CrxUpdateItem* item) const OVERRIDE;
162 virtual OnDemandUpdater& GetOnDemandUpdater() OVERRIDE; 113 virtual OnDemandUpdater& GetOnDemandUpdater() OVERRIDE;
114 virtual void MaybeThrottle(const std::string& crx_id,
115 const base::Closure& callback) OVERRIDE;
163 virtual scoped_refptr<base::SequencedTaskRunner> GetSequencedTaskRunner() 116 virtual scoped_refptr<base::SequencedTaskRunner> GetSequencedTaskRunner()
164 OVERRIDE; 117 OVERRIDE;
165 118
166 // Overrides for OnDemandUpdater.
167 virtual content::ResourceThrottle* GetOnDemandResourceThrottle(
168 net::URLRequest* request,
169 const std::string& crx_id) OVERRIDE;
170 virtual Status OnDemandUpdate(const std::string& component_id) OVERRIDE;
171
172 // Context for a crx download url request. 119 // Context for a crx download url request.
173 struct CRXContext { 120 struct CRXContext {
174 ComponentInstaller* installer; 121 ComponentInstaller* installer;
175 std::vector<uint8> pk_hash; 122 std::vector<uint8> pk_hash;
176 std::string id; 123 std::string id;
177 std::string fingerprint; 124 std::string fingerprint;
178 CRXContext() : installer(NULL) {} 125 CRXContext() : installer(NULL) {}
179 }; 126 };
180 127
181 private: 128 private:
182 enum ErrorCategory { 129 enum ErrorCategory {
183 kErrorNone = 0, 130 kErrorNone = 0,
184 kNetworkError, 131 kNetworkError,
185 kUnpackError, 132 kUnpackError,
186 kInstallError, 133 kInstallError,
187 }; 134 };
188 135
189 enum StepDelayInterval { 136 enum StepDelayInterval {
190 kStepDelayShort = 0, 137 kStepDelayShort = 0,
191 kStepDelayMedium, 138 kStepDelayMedium,
192 kStepDelayLong, 139 kStepDelayLong,
193 }; 140 };
194 141
142 // Overrides for ComponentUpdateService.
143 virtual bool GetComponentDetails(const std::string& component_id,
144 CrxUpdateItem* item) const OVERRIDE;
145
146 // Overrides for OnDemandUpdater.
147 virtual Status OnDemandUpdate(const std::string& component_id) OVERRIDE;
148
195 void UpdateCheckComplete(int error, 149 void UpdateCheckComplete(int error,
196 const std::string& error_message, 150 const std::string& error_message,
197 const UpdateResponse::Results& results); 151 const UpdateResponse::Results& results);
198 void OnUpdateCheckSucceeded(const UpdateResponse::Results& results); 152 void OnUpdateCheckSucceeded(const UpdateResponse::Results& results);
199 void OnUpdateCheckFailed(int error, const std::string& error_message); 153 void OnUpdateCheckFailed(int error, const std::string& error_message);
200 154
201 void DownloadProgress(const std::string& component_id, 155 void DownloadProgress(const std::string& component_id,
202 const CrxDownloader::Result& download_result); 156 const CrxDownloader::Result& download_result);
203 157
204 void DownloadComplete(scoped_ptr<CRXContext> crx_context, 158 void DownloadComplete(scoped_ptr<CRXContext> crx_context,
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 void ChangeItemState(CrxUpdateItem* item, CrxUpdateItem::Status to); 191 void ChangeItemState(CrxUpdateItem* item, CrxUpdateItem::Status to);
238 192
239 size_t ChangeItemStatus(CrxUpdateItem::Status from, CrxUpdateItem::Status to); 193 size_t ChangeItemStatus(CrxUpdateItem::Status from, CrxUpdateItem::Status to);
240 194
241 CrxUpdateItem* FindUpdateItemById(const std::string& id) const; 195 CrxUpdateItem* FindUpdateItemById(const std::string& id) const;
242 196
243 void NotifyObservers(Observer::Events event, const std::string& id); 197 void NotifyObservers(Observer::Events event, const std::string& id);
244 198
245 bool HasOnDemandItems() const; 199 bool HasOnDemandItems() const;
246 200
247 void OnNewResourceThrottle(base::WeakPtr<CUResourceThrottle> rt,
248 const std::string& crx_id);
249
250 Status GetServiceStatus(const CrxUpdateItem::Status status); 201 Status GetServiceStatus(const CrxUpdateItem::Status status);
251 202
252 scoped_ptr<Configurator> config_; 203 scoped_ptr<Configurator> config_;
253 204
254 scoped_ptr<UpdateChecker> update_checker_; 205 scoped_ptr<UpdateChecker> update_checker_;
255 206
256 scoped_ptr<PingManager> ping_manager_; 207 scoped_ptr<PingManager> ping_manager_;
257 208
258 scoped_refptr<ComponentUnpacker> unpacker_; 209 scoped_refptr<ComponentUnpacker> unpacker_;
259 210
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
442 case CrxUpdateItem::kDownloading: 393 case CrxUpdateItem::kDownloading:
443 case CrxUpdateItem::kDownloadingDiff: 394 case CrxUpdateItem::kDownloadingDiff:
444 case CrxUpdateItem::kLastStatus: 395 case CrxUpdateItem::kLastStatus:
445 // No notification for these states. 396 // No notification for these states.
446 break; 397 break;
447 } 398 }
448 399
449 // Free possible pending network requests. 400 // Free possible pending network requests.
450 if ((to == CrxUpdateItem::kUpdated) || (to == CrxUpdateItem::kUpToDate) || 401 if ((to == CrxUpdateItem::kUpdated) || (to == CrxUpdateItem::kUpToDate) ||
451 (to == CrxUpdateItem::kNoUpdate)) { 402 (to == CrxUpdateItem::kNoUpdate)) {
452 UnblockandReapAllThrottles(&item->throttles); 403 for (std::vector<base::Closure>::iterator it =
404 item->ready_callbacks.begin();
405 it != item->ready_callbacks.end();
406 ++it) {
407 it->Run();
408 }
409 item->ready_callbacks.clear();
453 } 410 }
454 } 411 }
455 412
456 // Changes all the components in |work_items_| that have |from| status to 413 // Changes all the components in |work_items_| that have |from| status to
457 // |to| status and returns how many have been changed. 414 // |to| status and returns how many have been changed.
458 size_t CrxUpdateService::ChangeItemStatus(CrxUpdateItem::Status from, 415 size_t CrxUpdateService::ChangeItemStatus(CrxUpdateItem::Status from,
459 CrxUpdateItem::Status to) { 416 CrxUpdateItem::Status to) {
460 DCHECK(thread_checker_.CalledOnValidThread()); 417 DCHECK(thread_checker_.CalledOnValidThread());
461 size_t count = 0; 418 size_t count = 0;
462 for (UpdateItems::iterator it = work_items_.begin(); 419 for (UpdateItems::iterator it = work_items_.begin();
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
518 std::vector<std::string> component_ids; 475 std::vector<std::string> component_ids;
519 for (UpdateItems::const_iterator it = work_items_.begin(); 476 for (UpdateItems::const_iterator it = work_items_.begin();
520 it != work_items_.end(); 477 it != work_items_.end();
521 ++it) { 478 ++it) {
522 const CrxUpdateItem* item = *it; 479 const CrxUpdateItem* item = *it;
523 component_ids.push_back(item->id); 480 component_ids.push_back(item->id);
524 } 481 }
525 return component_ids; 482 return component_ids;
526 } 483 }
527 484
485 OnDemandUpdater& CrxUpdateService::GetOnDemandUpdater() {
486 return *this;
487 }
488
489 void CrxUpdateService::MaybeThrottle(const std::string& crx_id,
490 const base::Closure& callback) {
491 DCHECK(thread_checker_.CalledOnValidThread());
492 // Check if we can on-demand update, else unblock the request anyway.
493 CrxUpdateItem* item = FindUpdateItemById(crx_id);
494 Status status = OnDemandUpdateWithCooldown(item);
495 if (status == kOk || status == kInProgress) {
496 item->ready_callbacks.push_back(callback);
497 return;
498 }
499 callback.Run();
500 }
501
502 scoped_refptr<base::SequencedTaskRunner>
503 CrxUpdateService::GetSequencedTaskRunner() {
504 return config_->GetSequencedTaskRunner();
505 }
506
528 bool CrxUpdateService::GetComponentDetails(const std::string& component_id, 507 bool CrxUpdateService::GetComponentDetails(const std::string& component_id,
529 CrxUpdateItem* item) const { 508 CrxUpdateItem* item) const {
530 DCHECK(thread_checker_.CalledOnValidThread()); 509 DCHECK(thread_checker_.CalledOnValidThread());
531 const CrxUpdateItem* crx_update_item(FindUpdateItemById(component_id)); 510 const CrxUpdateItem* crx_update_item(FindUpdateItemById(component_id));
532 if (crx_update_item) 511 if (crx_update_item)
533 *item = *crx_update_item; 512 *item = *crx_update_item;
534 return crx_update_item != NULL; 513 return crx_update_item != NULL;
535 } 514 }
536 515
537 OnDemandUpdater& CrxUpdateService::GetOnDemandUpdater() { 516 // Start the process of checking for an update, for a particular component
538 return *this; 517 // that was previously registered.
539 } 518 // |component_id| is a value returned from GetCrxComponentID().
540 519 ComponentUpdateService::Status CrxUpdateService::OnDemandUpdate(
541 scoped_refptr<base::SequencedTaskRunner> 520 const std::string& component_id) {
542 CrxUpdateService::GetSequencedTaskRunner() { 521 return OnDemandUpdateInternal(FindUpdateItemById(component_id));
543 return config_->GetSequencedTaskRunner();
544 } 522 }
545 523
546 // This is the main loop of the component updater. It updates one component 524 // This is the main loop of the component updater. It updates one component
547 // at a time if updates are available. Otherwise, it does an update check or 525 // at a time if updates are available. Otherwise, it does an update check or
548 // takes a long sleep until the loop runs again. 526 // takes a long sleep until the loop runs again.
549 void CrxUpdateService::ProcessPendingItems() { 527 void CrxUpdateService::ProcessPendingItems() {
550 DCHECK(thread_checker_.CalledOnValidThread()); 528 DCHECK(thread_checker_.CalledOnValidThread());
551 529
552 CrxUpdateItem* ready_upgrade = FindReadyComponent(); 530 CrxUpdateItem* ready_upgrade = FindReadyComponent();
553 if (ready_upgrade) { 531 if (ready_upgrade) {
(...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after
952 // Move on to the next update, if there is one available. 930 // Move on to the next update, if there is one available.
953 ScheduleNextRun(kStepDelayMedium); 931 ScheduleNextRun(kStepDelayMedium);
954 } 932 }
955 933
956 void CrxUpdateService::NotifyObservers(Observer::Events event, 934 void CrxUpdateService::NotifyObservers(Observer::Events event,
957 const std::string& id) { 935 const std::string& id) {
958 DCHECK(thread_checker_.CalledOnValidThread()); 936 DCHECK(thread_checker_.CalledOnValidThread());
959 FOR_EACH_OBSERVER(Observer, observer_list_, OnEvent(event, id)); 937 FOR_EACH_OBSERVER(Observer, observer_list_, OnEvent(event, id));
960 } 938 }
961 939
962 content::ResourceThrottle* CrxUpdateService::GetOnDemandResourceThrottle(
963 net::URLRequest* request,
964 const std::string& crx_id) {
965 // We give the raw pointer to the caller, who will delete it at will
966 // and we keep for ourselves a weak pointer to it so we can post tasks
967 // from the UI thread without having to track lifetime directly.
968 CUResourceThrottle* rt = new CUResourceThrottle(request);
969 main_task_runner_->PostTask(
970 FROM_HERE,
971 base::Bind(&CrxUpdateService::OnNewResourceThrottle,
972 base::Unretained(this), rt->AsWeakPtr(), crx_id));
973 return rt;
974 }
975
976 void CrxUpdateService::OnNewResourceThrottle(
977 base::WeakPtr<CUResourceThrottle> rt,
978 const std::string& crx_id) {
979 DCHECK(thread_checker_.CalledOnValidThread());
980 // Check if we can on-demand update, else unblock the request anyway.
981 CrxUpdateItem* item = FindUpdateItemById(crx_id);
982 Status status = OnDemandUpdateWithCooldown(item);
983 if (status == kOk || status == kInProgress) {
984 item->throttles.push_back(rt);
985 return;
986 }
987 UnblockResourceThrottle(rt);
988 }
989
990 // Start the process of checking for an update, for a particular component
991 // that was previously registered.
992 // |component_id| is a value returned from GetCrxComponentID().
993 ComponentUpdateService::Status CrxUpdateService::OnDemandUpdate(
994 const std::string& component_id) {
995 return OnDemandUpdateInternal(FindUpdateItemById(component_id));
996 }
997
998 ComponentUpdateService::Status CrxUpdateService::OnDemandUpdateWithCooldown( 940 ComponentUpdateService::Status CrxUpdateService::OnDemandUpdateWithCooldown(
999 CrxUpdateItem* uit) { 941 CrxUpdateItem* uit) {
1000 if (!uit) 942 if (!uit)
1001 return kError; 943 return kError;
1002 944
1003 // Check if the request is too soon. 945 // Check if the request is too soon.
1004 base::TimeDelta delta = base::Time::Now() - uit->last_check; 946 base::TimeDelta delta = base::Time::Now() - uit->last_check;
1005 if (delta < base::TimeDelta::FromSeconds(config_->OnDemandDelay())) 947 if (delta < base::TimeDelta::FromSeconds(config_->OnDemandDelay()))
1006 return kError; 948 return kError;
1007 949
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1059 case CrxUpdateItem::kNoUpdate: 1001 case CrxUpdateItem::kNoUpdate:
1060 return kOk; 1002 return kOk;
1061 case CrxUpdateItem::kLastStatus: 1003 case CrxUpdateItem::kLastStatus:
1062 NOTREACHED() << status; 1004 NOTREACHED() << status;
1063 } 1005 }
1064 return kError; 1006 return kError;
1065 } 1007 }
1066 1008
1067 /////////////////////////////////////////////////////////////////////////////// 1009 ///////////////////////////////////////////////////////////////////////////////
1068 1010
1069 CUResourceThrottle::CUResourceThrottle(const net::URLRequest* request)
1070 : state_(NEW) {
1071 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
1072 }
1073
1074 CUResourceThrottle::~CUResourceThrottle() {
1075 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
1076 }
1077
1078 void CUResourceThrottle::WillStartRequest(bool* defer) {
1079 if (state_ != UNBLOCKED) {
1080 state_ = BLOCKED;
1081 *defer = true;
1082 } else {
1083 *defer = false;
1084 }
1085 }
1086
1087 void CUResourceThrottle::WillRedirectRequest(const GURL& new_url, bool* defer) {
1088 WillStartRequest(defer);
1089 }
1090
1091 const char* CUResourceThrottle::GetNameForLogging() const {
1092 return "ComponentUpdateResourceThrottle";
1093 }
1094
1095 void CUResourceThrottle::Unblock() {
1096 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
1097 if (state_ == BLOCKED)
1098 controller()->Resume();
1099 state_ = UNBLOCKED;
1100 }
1101
1102 // The component update factory. Using the component updater as a singleton 1011 // The component update factory. Using the component updater as a singleton
1103 // is the job of the browser process. 1012 // is the job of the browser process.
1104 ComponentUpdateService* ComponentUpdateServiceFactory(Configurator* config) { 1013 ComponentUpdateService* ComponentUpdateServiceFactory(Configurator* config) {
1105 DCHECK(config); 1014 DCHECK(config);
1106 return new CrxUpdateService(config); 1015 return new CrxUpdateService(config);
1107 } 1016 }
1108 1017
1109 } // namespace component_updater 1018 } // namespace component_updater
OLDNEW
« no previous file with comments | « chrome/browser/component_updater/component_updater_service.h ('k') | chrome/browser/component_updater/crx_update_item.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698