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/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 <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/at_exit.h" | 10 #include "base/at_exit.h" |
(...skipping 27 matching lines...) Expand all Loading... | |
38 | 38 |
39 using content::BrowserThread; | 39 using content::BrowserThread; |
40 using content::UtilityProcessHost; | 40 using content::UtilityProcessHost; |
41 using content::UtilityProcessHostClient; | 41 using content::UtilityProcessHostClient; |
42 using extensions::Extension; | 42 using extensions::Extension; |
43 | 43 |
44 // The component updater is designed to live until process shutdown, so | 44 // The component updater is designed to live until process shutdown, so |
45 // base::Bind() calls are not refcounted. | 45 // base::Bind() calls are not refcounted. |
46 | 46 |
47 namespace { | 47 namespace { |
48 // Manifest sources, from most important to least important. | |
49 const CrxComponent::UrlSource kManifestSources[] = { | |
50 CrxComponent::BANDAID, | |
51 CrxComponent::CWS_PUBLIC, | |
52 CrxComponent::CWS_SANDBOX | |
53 }; | |
54 | |
48 // Extends an omaha compatible update check url |query| string. Does | 55 // Extends an omaha compatible update check url |query| string. Does |
49 // not mutate the string if it would be longer than |limit| chars. | 56 // not mutate the string if it would be longer than |limit| chars. |
50 bool AddQueryString(const std::string& id, | 57 bool AddQueryString(const std::string& id, |
51 const std::string& version, | 58 const std::string& version, |
52 size_t limit, | 59 size_t limit, |
53 std::string* query) { | 60 std::string* query) { |
54 std::string additional = | 61 std::string additional = |
55 base::StringPrintf("id=%s&v=%s&uc", id.c_str(), version.c_str()); | 62 base::StringPrintf("id=%s&v=%s&uc", id.c_str(), version.c_str()); |
56 additional = "x=" + net::EscapeQueryParamValue(additional, true); | 63 additional = "x=" + net::EscapeQueryParamValue(additional, true); |
57 if ((additional.size() + query->size() + 1) > limit) | 64 if ((additional.size() + query->size() + 1) > limit) |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
208 } | 215 } |
209 private: | 216 private: |
210 const std::string& id_; | 217 const std::string& id_; |
211 }; | 218 }; |
212 }; | 219 }; |
213 | 220 |
214 } // namespace. | 221 } // namespace. |
215 | 222 |
216 typedef ComponentUpdateService::Configurator Config; | 223 typedef ComponentUpdateService::Configurator Config; |
217 | 224 |
218 CrxComponent::CrxComponent() : installer(NULL) {} | 225 CrxComponent::CrxComponent() |
219 CrxComponent::~CrxComponent() {} | 226 : installer(NULL), |
227 source(BANDAID) { | |
cpu_(ooo_6.6-7.5)
2013/01/21 02:47:19
the default source is the current one so I don't h
| |
228 } | |
229 | |
230 CrxComponent::~CrxComponent() { | |
231 } | |
220 | 232 |
221 ////////////////////////////////////////////////////////////////////////////// | 233 ////////////////////////////////////////////////////////////////////////////// |
222 // The one and only implementation of the ComponentUpdateService interface. In | 234 // The one and only implementation of the ComponentUpdateService interface. In |
223 // charge of running the show. The main method is ProcessPendingItems() which | 235 // charge of running the show. The main method is ProcessPendingItems() which |
224 // is called periodically to do the upgrades/installs or the update checks. | 236 // is called periodically to do the upgrades/installs or the update checks. |
225 // An important consideration here is to be as "low impact" as we can to the | 237 // An important consideration here is to be as "low impact" as we can to the |
226 // rest of the browser, so even if we have many components registered and | 238 // rest of the browser, so even if we have many components registered and |
227 // eligible for update, we only do one thing at a time with pauses in between | 239 // eligible for update, we only do one thing at a time with pauses in between |
228 // the tasks. Also when we do network requests there is only one |url_fetcher_| | 240 // the tasks. Also when we do network requests there is only one |url_fetcher_| |
229 // in flight at at a time. | 241 // in flight at at a time. |
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
507 CRXContext* context = new CRXContext; | 519 CRXContext* context = new CRXContext; |
508 context->pk_hash = item->component.pk_hash; | 520 context->pk_hash = item->component.pk_hash; |
509 context->id = item->id; | 521 context->id = item->id; |
510 context->installer = item->component.installer; | 522 context->installer = item->component.installer; |
511 url_fetcher_.reset(net::URLFetcher::Create( | 523 url_fetcher_.reset(net::URLFetcher::Create( |
512 0, item->crx_url, net::URLFetcher::GET, | 524 0, item->crx_url, net::URLFetcher::GET, |
513 MakeContextDelegate(this, context))); | 525 MakeContextDelegate(this, context))); |
514 StartFetch(url_fetcher_.get(), config_->RequestContext(), true); | 526 StartFetch(url_fetcher_.get(), config_->RequestContext(), true); |
515 return; | 527 return; |
516 } | 528 } |
517 | 529 |
cpu_(ooo_6.6-7.5)
2013/01/21 02:47:19
this new for loop is the meat of the change. Basic
| |
518 std::string query; | 530 for (size_t ix = 0; ix != arraysize(kManifestSources); ++ix) { |
519 // If no pending upgrades, we check the if there are new | 531 const CrxComponent::UrlSource manifest_source = kManifestSources[ix]; |
520 // components we have not checked against the server. We | 532 |
521 // can batch a bunch in a single url request. | 533 std::string query; |
522 for (UpdateItems::const_iterator it = work_items_.begin(); | 534 // If no pending upgrades, we check the if there are new |
asargent_no_longer_on_chrome
2013/01/23 17:58:32
typo: "we check the if there"
cpu_(ooo_6.6-7.5)
2013/01/23 18:56:06
Done.
| |
523 it != work_items_.end(); ++it) { | 535 // components we have not checked against the server. We |
524 CrxUpdateItem* item = *it; | 536 // can batch a bunch in a single url request. |
525 if (item->status != CrxUpdateItem::kNew) | 537 for (UpdateItems::const_iterator it = work_items_.begin(); |
538 it != work_items_.end(); ++it) { | |
539 CrxUpdateItem* item = *it; | |
540 if (item->status != CrxUpdateItem::kNew) | |
541 continue; | |
542 if (item->component.source != manifest_source) | |
543 continue; | |
544 if (!AddItemToUpdateCheck(item, &query)) | |
545 break; | |
546 } | |
547 | |
548 // Next we can go back to components we already checked, here | |
549 // we can also batch them in a single url request, as long as | |
550 // we have not checked them recently. | |
551 const base::TimeDelta min_delta_time = | |
552 base::TimeDelta::FromSeconds(config_->MinimumReCheckWait()); | |
553 | |
554 for (UpdateItems::const_iterator it = work_items_.begin(); | |
555 it != work_items_.end(); ++it) { | |
556 CrxUpdateItem* item = *it; | |
557 if ((item->status != CrxUpdateItem::kNoUpdate) && | |
558 (item->status != CrxUpdateItem::kUpToDate)) | |
559 continue; | |
560 if (item->component.source != manifest_source) | |
561 continue; | |
562 base::TimeDelta delta = base::Time::Now() - item->last_check; | |
563 if (delta < min_delta_time) | |
564 continue; | |
565 if (!AddItemToUpdateCheck(item, &query)) | |
566 break; | |
567 } | |
568 | |
569 // Finally, we check components that we already updated as long | |
570 // we have not checked them recently. | |
asargent_no_longer_on_chrome
2013/01/23 17:58:32
typo: comment should say "..updated as long as we
cpu_(ooo_6.6-7.5)
2013/01/23 18:56:06
Done.
| |
571 for (UpdateItems::const_iterator it = work_items_.begin(); | |
572 it != work_items_.end(); ++it) { | |
573 CrxUpdateItem* item = *it; | |
574 if (item->status != CrxUpdateItem::kUpdated) | |
575 continue; | |
576 if (item->component.source != manifest_source) | |
577 continue; | |
578 base::TimeDelta delta = base::Time::Now() - item->last_check; | |
579 if (delta < min_delta_time) | |
580 continue; | |
581 if (!AddItemToUpdateCheck(item, &query)) | |
582 break; | |
583 } | |
asargent_no_longer_on_chrome
2013/01/23 17:58:32
I assume that work_items_ will always be very shor
cpu_(ooo_6.6-7.5)
2013/01/23 18:56:06
Yep, currently at 4 items.
On 2013/01/23 17:58:32
| |
584 | |
585 // If no components to update we move down to the next source. | |
586 if (query.empty()) | |
526 continue; | 587 continue; |
527 if (!AddItemToUpdateCheck(item, &query)) | |
528 break; | |
529 } | |
530 | 588 |
531 // Next we can go back to components we already checked, here | 589 // We got components to check. Start the url request and exit. |
532 // we can also batch them in a single url request, as long as | 590 const std::string full_query = |
533 // we have not checked them recently. | 591 MakeFinalQuery(config_->UpdateUrl(manifest_source).spec(), |
534 const base::TimeDelta min_delta_time = | 592 query, |
535 base::TimeDelta::FromSeconds(config_->MinimumReCheckWait()); | 593 config_->ExtraRequestParams()); |
536 | 594 |
537 for (UpdateItems::const_iterator it = work_items_.begin(); | 595 url_fetcher_.reset(net::URLFetcher::Create( |
538 it != work_items_.end(); ++it) { | 596 0, GURL(full_query), net::URLFetcher::GET, |
539 CrxUpdateItem* item = *it; | 597 MakeContextDelegate(this, new UpdateContext()))); |
540 if ((item->status != CrxUpdateItem::kNoUpdate) && | 598 StartFetch(url_fetcher_.get(), config_->RequestContext(), false); |
541 (item->status != CrxUpdateItem::kUpToDate)) | |
542 continue; | |
543 base::TimeDelta delta = base::Time::Now() - item->last_check; | |
544 if (delta < min_delta_time) | |
545 continue; | |
546 if (!AddItemToUpdateCheck(item, &query)) | |
547 break; | |
548 } | |
549 // Finally, we check components that we already updated. | |
550 for (UpdateItems::const_iterator it = work_items_.begin(); | |
551 it != work_items_.end(); ++it) { | |
552 CrxUpdateItem* item = *it; | |
553 if (item->status != CrxUpdateItem::kUpdated) | |
554 continue; | |
555 base::TimeDelta delta = base::Time::Now() - item->last_check; | |
556 if (delta < min_delta_time) | |
557 continue; | |
558 if (!AddItemToUpdateCheck(item, &query)) | |
559 break; | |
560 } | |
561 | |
562 if (query.empty()) { | |
563 // Next check after the long sleep. | |
564 ScheduleNextRun(false); | |
565 return; | 599 return; |
566 } | 600 } |
567 | 601 |
568 // We got components to check. Start the url request. | 602 // No components to update. Next check after the long sleep. |
569 const std::string full_query = MakeFinalQuery(config_->UpdateUrl().spec(), | 603 ScheduleNextRun(false); |
570 query, | |
571 config_->ExtraRequestParams()); | |
572 url_fetcher_.reset(net::URLFetcher::Create( | |
573 0, GURL(full_query), net::URLFetcher::GET, | |
574 MakeContextDelegate(this, new UpdateContext()))); | |
575 StartFetch(url_fetcher_.get(), config_->RequestContext(), false); | |
576 } | 604 } |
577 | 605 |
578 // Caled when we got a response from the update server. It consists of an xml | 606 // Caled when we got a response from the update server. It consists of an xml |
579 // document following the omaha update scheme. | 607 // document following the omaha update scheme. |
580 void CrxUpdateService::OnURLFetchComplete(const net::URLFetcher* source, | 608 void CrxUpdateService::OnURLFetchComplete(const net::URLFetcher* source, |
581 UpdateContext* context) { | 609 UpdateContext* context) { |
582 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 610 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
583 if (FetchSuccess(*source)) { | 611 if (FetchSuccess(*source)) { |
584 std::string xml; | 612 std::string xml; |
585 source->GetResponseAsString(&xml); | 613 source->GetResponseAsString(&xml); |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
772 ScheduleNextRun(false); | 800 ScheduleNextRun(false); |
773 } | 801 } |
774 | 802 |
775 // The component update factory. Using the component updater as a singleton | 803 // The component update factory. Using the component updater as a singleton |
776 // is the job of the browser process. | 804 // is the job of the browser process. |
777 ComponentUpdateService* ComponentUpdateServiceFactory( | 805 ComponentUpdateService* ComponentUpdateServiceFactory( |
778 ComponentUpdateService::Configurator* config) { | 806 ComponentUpdateService::Configurator* config) { |
779 DCHECK(config); | 807 DCHECK(config); |
780 return new CrxUpdateService(config); | 808 return new CrxUpdateService(config); |
781 } | 809 } |
OLD | NEW |