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

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

Issue 209313002: Modified components ui to address concern of all the time disabled check update button. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Code review. Created 6 years, 7 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
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 CrxUpdateItem::~CrxUpdateItem() { 81 CrxUpdateItem::~CrxUpdateItem() {
82 } 82 }
83 83
84 CrxComponent::CrxComponent() 84 CrxComponent::CrxComponent()
85 : installer(NULL), allow_background_download(true) { 85 : installer(NULL), allow_background_download(true) {
86 } 86 }
87 87
88 CrxComponent::~CrxComponent() { 88 CrxComponent::~CrxComponent() {
89 } 89 }
90 90
91 CrxComponentInfo::CrxComponentInfo() {
92 }
93
94 CrxComponentInfo::~CrxComponentInfo() {
95 }
96
97 /////////////////////////////////////////////////////////////////////////////// 91 ///////////////////////////////////////////////////////////////////////////////
98 // In charge of blocking url requests until the |crx_id| component has been 92 // In charge of blocking url requests until the |crx_id| component has been
99 // updated. This class is touched solely from the IO thread. The UI thread 93 // updated. This class is touched solely from the IO thread. The UI thread
100 // can post tasks to it via weak pointers. By default the request is blocked 94 // can post tasks to it via weak pointers. By default the request is blocked
101 // unless the CrxUpdateService calls Unblock(). 95 // unless the CrxUpdateService calls Unblock().
102 // The lifetime is controlled by Chrome's resource loader so the component 96 // The lifetime is controlled by Chrome's resource loader so the component
103 // updater cannot touch objects from this class except via weak pointers. 97 // updater cannot touch objects from this class except via weak pointers.
104 class CUResourceThrottle : public content::ResourceThrottle, 98 class CUResourceThrottle : public content::ResourceThrottle,
105 public base::SupportsWeakPtr<CUResourceThrottle> { 99 public base::SupportsWeakPtr<CUResourceThrottle> {
106 public: 100 public:
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 explicit CrxUpdateService(ComponentUpdateService::Configurator* config); 148 explicit CrxUpdateService(ComponentUpdateService::Configurator* config);
155 virtual ~CrxUpdateService(); 149 virtual ~CrxUpdateService();
156 150
157 // Overrides for ComponentUpdateService. 151 // Overrides for ComponentUpdateService.
158 virtual void AddObserver(Observer* observer) OVERRIDE; 152 virtual void AddObserver(Observer* observer) OVERRIDE;
159 virtual void RemoveObserver(Observer* observer) OVERRIDE; 153 virtual void RemoveObserver(Observer* observer) OVERRIDE;
160 virtual Status Start() OVERRIDE; 154 virtual Status Start() OVERRIDE;
161 virtual Status Stop() OVERRIDE; 155 virtual Status Stop() OVERRIDE;
162 virtual Status RegisterComponent(const CrxComponent& component) OVERRIDE; 156 virtual Status RegisterComponent(const CrxComponent& component) OVERRIDE;
163 virtual Status OnDemandUpdate(const std::string& component_id) OVERRIDE; 157 virtual Status OnDemandUpdate(const std::string& component_id) OVERRIDE;
164 virtual void GetComponents( 158 virtual std::vector<std::string> GetComponentIDs() const OVERRIDE;
165 std::vector<CrxComponentInfo>* components) OVERRIDE; 159 virtual CrxUpdateItem* GetComponentDetails(
160 const std::string& component_id) const OVERRIDE;
161
166 virtual content::ResourceThrottle* GetOnDemandResourceThrottle( 162 virtual content::ResourceThrottle* GetOnDemandResourceThrottle(
167 net::URLRequest* request, 163 net::URLRequest* request,
168 const std::string& crx_id) OVERRIDE; 164 const std::string& crx_id) OVERRIDE;
169 165
170 // Context for a crx download url request. 166 // Context for a crx download url request.
171 struct CRXContext { 167 struct CRXContext {
172 ComponentInstaller* installer; 168 ComponentInstaller* installer;
173 std::vector<uint8> pk_hash; 169 std::vector<uint8> pk_hash;
174 std::string id; 170 std::string id;
175 std::string fingerprint; 171 std::string fingerprint;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 int extended_error); 224 int extended_error);
229 225
230 void DoneInstalling(const std::string& component_id, 226 void DoneInstalling(const std::string& component_id,
231 ComponentUnpacker::Error error, 227 ComponentUnpacker::Error error,
232 int extended_error); 228 int extended_error);
233 229
234 void ChangeItemState(CrxUpdateItem* item, CrxUpdateItem::Status to); 230 void ChangeItemState(CrxUpdateItem* item, CrxUpdateItem::Status to);
235 231
236 size_t ChangeItemStatus(CrxUpdateItem::Status from, CrxUpdateItem::Status to); 232 size_t ChangeItemStatus(CrxUpdateItem::Status from, CrxUpdateItem::Status to);
237 233
238 CrxUpdateItem* FindUpdateItemById(const std::string& id); 234 CrxUpdateItem* FindUpdateItemById(const std::string& id) const;
239 235
240 void NotifyObservers(Observer::Events event, const std::string& id); 236 void NotifyObservers(Observer::Events event, const std::string& id);
241 237
242 bool HasOnDemandItems() const; 238 bool HasOnDemandItems() const;
243 239
244 void OnNewResourceThrottle(base::WeakPtr<CUResourceThrottle> rt, 240 void OnNewResourceThrottle(base::WeakPtr<CUResourceThrottle> rt,
245 const std::string& crx_id); 241 const std::string& crx_id);
246 242
243 Status GetServiceStatus(const CrxUpdateItem::Status status);
244
247 scoped_ptr<ComponentUpdateService::Configurator> config_; 245 scoped_ptr<ComponentUpdateService::Configurator> config_;
248 246
249 scoped_ptr<UpdateChecker> update_checker_; 247 scoped_ptr<UpdateChecker> update_checker_;
250 248
251 scoped_ptr<PingManager> ping_manager_; 249 scoped_ptr<PingManager> ping_manager_;
252 250
253 scoped_refptr<ComponentUnpacker> unpacker_; 251 scoped_refptr<ComponentUnpacker> unpacker_;
254 252
255 scoped_ptr<CrxDownloader> crx_downloader_; 253 scoped_ptr<CrxDownloader> crx_downloader_;
256 254
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 } 387 }
390 388
391 VLOG(1) << "Scheduling next run to occur in " << delay_seconds << " seconds"; 389 VLOG(1) << "Scheduling next run to occur in " << delay_seconds << " seconds";
392 timer_.Start(FROM_HERE, 390 timer_.Start(FROM_HERE,
393 base::TimeDelta::FromSeconds(delay_seconds), 391 base::TimeDelta::FromSeconds(delay_seconds),
394 this, 392 this,
395 &CrxUpdateService::ProcessPendingItems); 393 &CrxUpdateService::ProcessPendingItems);
396 } 394 }
397 395
398 // Given a extension-like component id, find the associated component. 396 // Given a extension-like component id, find the associated component.
399 CrxUpdateItem* CrxUpdateService::FindUpdateItemById(const std::string& id) { 397 CrxUpdateItem* CrxUpdateService::FindUpdateItemById(
398 const std::string& id) const {
400 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 399 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
401 CrxUpdateItem::FindById finder(id); 400 CrxUpdateItem::FindById finder(id);
402 UpdateItems::iterator it = 401 UpdateItems::const_iterator it =
403 std::find_if(work_items_.begin(), work_items_.end(), finder); 402 std::find_if(work_items_.begin(), work_items_.end(), finder);
404 return it != work_items_.end() ? *it : NULL; 403 return it != work_items_.end() ? *it : NULL;
405 } 404 }
406 405
407 // Changes a component's status, clearing on_demand and firing notifications as 406 // Changes a component's status, clearing on_demand and firing notifications as
408 // necessary. By convention, this is the only function that can change a 407 // necessary. By convention, this is the only function that can change a
409 // CrxUpdateItem's |status|. 408 // CrxUpdateItem's |status|.
410 // TODO(waffles): Do we want to add DCHECKS for valid state transitions here? 409 // TODO(waffles): Do we want to add DCHECKS for valid state transitions here?
411 void CrxUpdateService::ChangeItemState(CrxUpdateItem* item, 410 void CrxUpdateService::ChangeItemState(CrxUpdateItem* item,
412 CrxUpdateItem::Status to) { 411 CrxUpdateItem::Status to) {
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
507 ComponentUpdateService::Status CrxUpdateService::OnDemandUpdateInternal( 506 ComponentUpdateService::Status CrxUpdateService::OnDemandUpdateInternal(
508 CrxUpdateItem* uit) { 507 CrxUpdateItem* uit) {
509 if (!uit) 508 if (!uit)
510 return kError; 509 return kError;
511 510
512 // Check if the request is too soon. 511 // Check if the request is too soon.
513 base::TimeDelta delta = base::Time::Now() - uit->last_check; 512 base::TimeDelta delta = base::Time::Now() - uit->last_check;
514 if (delta < base::TimeDelta::FromSeconds(config_->OnDemandDelay())) 513 if (delta < base::TimeDelta::FromSeconds(config_->OnDemandDelay()))
515 return kError; 514 return kError;
516 515
517 switch (uit->status) { 516 Status service_status = GetServiceStatus(uit->status);
518 // If the item is already in the process of being updated, there is 517 // If the item is already in the process of being updated, there is
519 // no point in this call, so return kInProgress. 518 // no point in this call, so return kInProgress.
520 case CrxUpdateItem::kChecking: 519 if (service_status == kInProgress)
521 case CrxUpdateItem::kCanUpdate: 520 return service_status;
522 case CrxUpdateItem::kDownloadingDiff: 521
523 case CrxUpdateItem::kDownloading: 522 // Otherwise the item was already checked a while back (or it is new),
524 case CrxUpdateItem::kUpdatingDiff: 523 // set its status to kNew to give it a slightly higher priority.
525 case CrxUpdateItem::kUpdating: 524 ChangeItemState(uit, CrxUpdateItem::kNew);
526 return kInProgress; 525 uit->on_demand = true;
527 // Otherwise the item was already checked a while back (or it is new),
528 // set its status to kNew to give it a slightly higher priority.
529 case CrxUpdateItem::kNew:
530 case CrxUpdateItem::kUpdated:
531 case CrxUpdateItem::kUpToDate:
532 case CrxUpdateItem::kNoUpdate:
533 ChangeItemState(uit, CrxUpdateItem::kNew);
534 uit->on_demand = true;
535 break;
536 case CrxUpdateItem::kLastStatus:
537 NOTREACHED() << uit->status;
538 }
539 526
540 // In case the current delay is long, set the timer to a shorter value 527 // In case the current delay is long, set the timer to a shorter value
541 // to get the ball rolling. 528 // to get the ball rolling.
542 if (timer_.IsRunning()) { 529 if (timer_.IsRunning()) {
543 timer_.Stop(); 530 timer_.Stop();
544 timer_.Start(FROM_HERE, 531 timer_.Start(FROM_HERE,
545 base::TimeDelta::FromSeconds(config_->StepDelay()), 532 base::TimeDelta::FromSeconds(config_->StepDelay()),
546 this, 533 this,
547 &CrxUpdateService::ProcessPendingItems); 534 &CrxUpdateService::ProcessPendingItems);
548 } 535 }
549 536
550 return kOk; 537 return kOk;
551 } 538 }
552 539
553 void CrxUpdateService::GetComponents( 540 std::vector<std::string> CrxUpdateService::GetComponentIDs() const {
554 std::vector<CrxComponentInfo>* components) {
555 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 541 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
542 std::vector<std::string> component_ids;
556 for (UpdateItems::const_iterator it = work_items_.begin(); 543 for (UpdateItems::const_iterator it = work_items_.begin();
557 it != work_items_.end(); 544 it != work_items_.end();
558 ++it) { 545 ++it) {
559 const CrxUpdateItem* item = *it; 546 const CrxUpdateItem* item = *it;
560 CrxComponentInfo info; 547 component_ids.push_back(item->id);
561 info.id = GetCrxComponentID(item->component);
562 info.version = item->component.version.GetString();
563 info.name = item->component.name;
564 components->push_back(info);
565 } 548 }
549 return component_ids;
550 }
551
552 CrxUpdateItem* CrxUpdateService::GetComponentDetails(
553 const std::string& component_id) const {
554 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
555 return FindUpdateItemById(component_id);
566 } 556 }
567 557
568 // This is the main loop of the component updater. It updates one component 558 // This is the main loop of the component updater. It updates one component
569 // at a time if updates are available. Otherwise, it does an update check or 559 // at a time if updates are available. Otherwise, it does an update check or
570 // takes a long sleep until the loop runs again. 560 // takes a long sleep until the loop runs again.
571 void CrxUpdateService::ProcessPendingItems() { 561 void CrxUpdateService::ProcessPendingItems() {
572 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 562 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
573 563
574 CrxUpdateItem* ready_upgrade = FindReadyComponent(); 564 CrxUpdateItem* ready_upgrade = FindReadyComponent();
575 if (ready_upgrade) { 565 if (ready_upgrade) {
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after
1003 // Check if we can on-demand update, else unblock the request anyway. 993 // Check if we can on-demand update, else unblock the request anyway.
1004 CrxUpdateItem* item = FindUpdateItemById(crx_id); 994 CrxUpdateItem* item = FindUpdateItemById(crx_id);
1005 Status status = OnDemandUpdateInternal(item); 995 Status status = OnDemandUpdateInternal(item);
1006 if (status == kOk || status == kInProgress) { 996 if (status == kOk || status == kInProgress) {
1007 item->throttles.push_back(rt); 997 item->throttles.push_back(rt);
1008 return; 998 return;
1009 } 999 }
1010 UnblockResourceThrottle(rt); 1000 UnblockResourceThrottle(rt);
1011 } 1001 }
1012 1002
1003 ComponentUpdateService::Status CrxUpdateService::GetServiceStatus(
1004 CrxUpdateItem::Status status) {
1005 switch (status) {
1006 case CrxUpdateItem::kChecking:
1007 case CrxUpdateItem::kCanUpdate:
1008 case CrxUpdateItem::kDownloadingDiff:
1009 case CrxUpdateItem::kDownloading:
1010 case CrxUpdateItem::kUpdatingDiff:
1011 case CrxUpdateItem::kUpdating:
1012 return kInProgress;
1013 case CrxUpdateItem::kNew:
1014 case CrxUpdateItem::kUpdated:
1015 case CrxUpdateItem::kUpToDate:
1016 case CrxUpdateItem::kNoUpdate:
1017 return kOk;
1018 break;
1019 case CrxUpdateItem::kLastStatus:
1020 NOTREACHED() << status;
1021 }
1022 return kError;
1023 }
1024
1013 /////////////////////////////////////////////////////////////////////////////// 1025 ///////////////////////////////////////////////////////////////////////////////
1014 1026
1015 CUResourceThrottle::CUResourceThrottle(const net::URLRequest* request) 1027 CUResourceThrottle::CUResourceThrottle(const net::URLRequest* request)
1016 : state_(NEW) { 1028 : state_(NEW) {
1017 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1029 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
1018 } 1030 }
1019 1031
1020 CUResourceThrottle::~CUResourceThrottle() { 1032 CUResourceThrottle::~CUResourceThrottle() {
1021 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1033 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
1022 } 1034 }
(...skipping 24 matching lines...) Expand all
1047 1059
1048 // The component update factory. Using the component updater as a singleton 1060 // The component update factory. Using the component updater as a singleton
1049 // is the job of the browser process. 1061 // is the job of the browser process.
1050 ComponentUpdateService* ComponentUpdateServiceFactory( 1062 ComponentUpdateService* ComponentUpdateServiceFactory(
1051 ComponentUpdateService::Configurator* config) { 1063 ComponentUpdateService::Configurator* config) {
1052 DCHECK(config); 1064 DCHECK(config);
1053 return new CrxUpdateService(config); 1065 return new CrxUpdateService(config);
1054 } 1066 }
1055 1067
1056 } // namespace component_updater 1068 } // namespace component_updater
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698