Index: chrome/browser/component_updater/component_updater_service.cc |
=================================================================== |
--- chrome/browser/component_updater/component_updater_service.cc (revision 177059) |
+++ chrome/browser/component_updater/component_updater_service.cc (working copy) |
@@ -45,6 +45,13 @@ |
// base::Bind() calls are not refcounted. |
namespace { |
+// Manifest sources, from most important to least important. |
+const CrxComponent::UrlSource kManifestSources[] = { |
+ CrxComponent::BANDAID, |
+ CrxComponent::CWS_PUBLIC, |
+ CrxComponent::CWS_SANDBOX |
+}; |
+ |
// Extends an omaha compatible update check url |query| string. Does |
// not mutate the string if it would be longer than |limit| chars. |
bool AddQueryString(const std::string& id, |
@@ -215,9 +222,14 @@ |
typedef ComponentUpdateService::Configurator Config; |
-CrxComponent::CrxComponent() : installer(NULL) {} |
-CrxComponent::~CrxComponent() {} |
+CrxComponent::CrxComponent() |
+ : installer(NULL), |
+ source(BANDAID) { |
+} |
+CrxComponent::~CrxComponent() { |
+} |
+ |
////////////////////////////////////////////////////////////////////////////// |
// The one and only implementation of the ComponentUpdateService interface. In |
// charge of running the show. The main method is ProcessPendingItems() which |
@@ -515,64 +527,79 @@ |
return; |
} |
- std::string query; |
- // If no pending upgrades, we check the if there are new |
- // components we have not checked against the server. We |
- // can batch a bunch in a single url request. |
- for (UpdateItems::const_iterator it = work_items_.begin(); |
- it != work_items_.end(); ++it) { |
- CrxUpdateItem* item = *it; |
- if (item->status != CrxUpdateItem::kNew) |
- continue; |
- if (!AddItemToUpdateCheck(item, &query)) |
- break; |
- } |
+ for (size_t ix = 0; ix != arraysize(kManifestSources); ++ix) { |
+ const CrxComponent::UrlSource manifest_source = kManifestSources[ix]; |
- // Next we can go back to components we already checked, here |
- // we can also batch them in a single url request, as long as |
- // we have not checked them recently. |
- const base::TimeDelta min_delta_time = |
- base::TimeDelta::FromSeconds(config_->MinimumReCheckWait()); |
+ std::string query; |
+ // If no pending upgrades, we check if there are new components we have not |
+ // checked against the server. We can batch some in a single url request. |
+ for (UpdateItems::const_iterator it = work_items_.begin(); |
+ it != work_items_.end(); ++it) { |
+ CrxUpdateItem* item = *it; |
+ if (item->status != CrxUpdateItem::kNew) |
+ continue; |
+ if (item->component.source != manifest_source) |
+ continue; |
+ if (!AddItemToUpdateCheck(item, &query)) |
+ break; |
+ } |
- for (UpdateItems::const_iterator it = work_items_.begin(); |
- it != work_items_.end(); ++it) { |
- CrxUpdateItem* item = *it; |
- if ((item->status != CrxUpdateItem::kNoUpdate) && |
- (item->status != CrxUpdateItem::kUpToDate)) |
+ // Next we can go back to components we already checked, here |
+ // we can also batch them in a single url request, as long as |
+ // we have not checked them recently. |
+ const base::TimeDelta min_delta_time = |
+ base::TimeDelta::FromSeconds(config_->MinimumReCheckWait()); |
+ |
+ for (UpdateItems::const_iterator it = work_items_.begin(); |
+ it != work_items_.end(); ++it) { |
+ CrxUpdateItem* item = *it; |
+ if ((item->status != CrxUpdateItem::kNoUpdate) && |
+ (item->status != CrxUpdateItem::kUpToDate)) |
+ continue; |
+ if (item->component.source != manifest_source) |
+ continue; |
+ base::TimeDelta delta = base::Time::Now() - item->last_check; |
+ if (delta < min_delta_time) |
+ continue; |
+ if (!AddItemToUpdateCheck(item, &query)) |
+ break; |
+ } |
+ |
+ // Finally, we check components that we already updated as long as |
+ // we have not checked them recently. |
+ for (UpdateItems::const_iterator it = work_items_.begin(); |
+ it != work_items_.end(); ++it) { |
+ CrxUpdateItem* item = *it; |
+ if (item->status != CrxUpdateItem::kUpdated) |
+ continue; |
+ if (item->component.source != manifest_source) |
+ continue; |
+ base::TimeDelta delta = base::Time::Now() - item->last_check; |
+ if (delta < min_delta_time) |
+ continue; |
+ if (!AddItemToUpdateCheck(item, &query)) |
+ break; |
+ } |
+ |
+ // If no components to update we move down to the next source. |
+ if (query.empty()) |
continue; |
- base::TimeDelta delta = base::Time::Now() - item->last_check; |
- if (delta < min_delta_time) |
- continue; |
- if (!AddItemToUpdateCheck(item, &query)) |
- break; |
- } |
- // Finally, we check components that we already updated. |
- for (UpdateItems::const_iterator it = work_items_.begin(); |
- it != work_items_.end(); ++it) { |
- CrxUpdateItem* item = *it; |
- if (item->status != CrxUpdateItem::kUpdated) |
- continue; |
- base::TimeDelta delta = base::Time::Now() - item->last_check; |
- if (delta < min_delta_time) |
- continue; |
- if (!AddItemToUpdateCheck(item, &query)) |
- break; |
- } |
- if (query.empty()) { |
- // Next check after the long sleep. |
- ScheduleNextRun(false); |
+ // We got components to check. Start the url request and exit. |
+ const std::string full_query = |
+ MakeFinalQuery(config_->UpdateUrl(manifest_source).spec(), |
+ query, |
+ config_->ExtraRequestParams()); |
+ |
+ url_fetcher_.reset(net::URLFetcher::Create( |
+ 0, GURL(full_query), net::URLFetcher::GET, |
+ MakeContextDelegate(this, new UpdateContext()))); |
+ StartFetch(url_fetcher_.get(), config_->RequestContext(), false); |
return; |
} |
- // We got components to check. Start the url request. |
- const std::string full_query = MakeFinalQuery(config_->UpdateUrl().spec(), |
- query, |
- config_->ExtraRequestParams()); |
- url_fetcher_.reset(net::URLFetcher::Create( |
- 0, GURL(full_query), net::URLFetcher::GET, |
- MakeContextDelegate(this, new UpdateContext()))); |
- StartFetch(url_fetcher_.get(), config_->RequestContext(), false); |
+ // No components to update. Next check after the long sleep. |
+ ScheduleNextRun(false); |
} |
// Caled when we got a response from the update server. It consists of an xml |