| Index: components/update_client/action_update_check.cc
|
| diff --git a/components/update_client/action_update_check.cc b/components/update_client/action_update_check.cc
|
| index f2c90c77b20ec0035db2249fd45ef721ffe49af5..2f0f64b6cfcacc76c3d44e8e94a70d1cf7bccf75 100644
|
| --- a/components/update_client/action_update_check.cc
|
| +++ b/components/update_client/action_update_check.cc
|
| @@ -114,73 +114,22 @@ void ActionUpdateCheck::OnUpdateCheckSucceeded(
|
| const UpdateResponse::Results& results) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| VLOG(1) << "Update check succeeded.";
|
| - std::vector<UpdateResponse::Result>::const_iterator it;
|
| - for (it = results.list.begin(); it != results.list.end(); ++it) {
|
| - CrxUpdateItem* crx = FindUpdateItemById(it->extension_id);
|
| - if (!crx)
|
| - continue;
|
| -
|
| - if (crx->state != CrxUpdateItem::State::kChecking) {
|
| - NOTREACHED();
|
| - continue; // Not updating this CRX now.
|
| - }
|
| -
|
| - if (it->manifest.version.empty()) {
|
| - // No version means no update available.
|
| - ChangeItemState(crx, CrxUpdateItem::State::kNoUpdate);
|
| - VLOG(1) << "No update available for CRX: " << crx->id;
|
| - continue;
|
| - }
|
|
|
| - if (!IsVersionNewer(crx->component.version, it->manifest.version)) {
|
| - // The CRX is up to date.
|
| - ChangeItemState(crx, CrxUpdateItem::State::kUpToDate);
|
| - VLOG(1) << "Component already up to date: " << crx->id;
|
| - continue;
|
| - }
|
| -
|
| - if (!it->manifest.browser_min_version.empty()) {
|
| - if (IsVersionNewer(browser_version_, it->manifest.browser_min_version)) {
|
| - // The CRX is not compatible with this Chrome version.
|
| - VLOG(1) << "Ignoring incompatible CRX: " << crx->id;
|
| - ChangeItemState(crx, CrxUpdateItem::State::kNoUpdate);
|
| - continue;
|
| - }
|
| - }
|
| -
|
| - if (it->manifest.packages.size() != 1) {
|
| - // Assume one and only one package per CRX.
|
| - VLOG(1) << "Ignoring multiple packages for CRX: " << crx->id;
|
| - ChangeItemState(crx, CrxUpdateItem::State::kNoUpdate);
|
| + for (const auto& result : results.list) {
|
| + CrxUpdateItem* crx = FindUpdateItemById(result.extension_id);
|
| + if (!crx) {
|
| + VLOG(1) << "Component not found " << result.extension_id;
|
| continue;
|
| }
|
|
|
| - // Parse the members of the result and queue an upgrade for this CRX.
|
| - crx->next_version = base::Version(it->manifest.version);
|
| + DCHECK_EQ(CrxUpdateItem::State::kChecking, crx->state);
|
|
|
| - VLOG(1) << "Update found for CRX: " << crx->id;
|
| -
|
| - const auto& package(it->manifest.packages[0]);
|
| - crx->next_fp = package.fingerprint;
|
| -
|
| - // Resolve the urls by combining the base urls with the package names.
|
| - for (size_t i = 0; i != it->crx_urls.size(); ++i) {
|
| - const GURL url(it->crx_urls[i].Resolve(package.name));
|
| - if (url.is_valid())
|
| - crx->crx_urls.push_back(url);
|
| - }
|
| - for (size_t i = 0; i != it->crx_diffurls.size(); ++i) {
|
| - const GURL url(it->crx_diffurls[i].Resolve(package.namediff));
|
| - if (url.is_valid())
|
| - crx->crx_diffurls.push_back(url);
|
| - }
|
| -
|
| - crx->hash_sha256 = package.hash_sha256;
|
| - crx->hashdiff_sha256 = package.hashdiff_sha256;
|
| -
|
| - ChangeItemState(crx, CrxUpdateItem::State::kCanUpdate);
|
| -
|
| - update_context_->queue.push(crx->id);
|
| + if (result.status == "ok")
|
| + HandleUpdateCheckOK(result, crx);
|
| + else if (result.status == "noupdate")
|
| + HandleUpdateCheckNoupdate(result, crx);
|
| + else
|
| + HandleUpdateCheckError(result, crx);
|
| }
|
|
|
| // All components that are not included in the update response are
|
| @@ -189,7 +138,7 @@ void ActionUpdateCheck::OnUpdateCheckSucceeded(
|
| CrxUpdateItem::State::kUpToDate);
|
|
|
| if (update_context_->queue.empty()) {
|
| - VLOG(1) << "Update check completed but no update is needed.";
|
| + VLOG(1) << "Update check completed but no action is needed.";
|
| UpdateComplete(Error::NONE);
|
| return;
|
| }
|
| @@ -198,6 +147,86 @@ void ActionUpdateCheck::OnUpdateCheckSucceeded(
|
| UpdateCrx();
|
| }
|
|
|
| +void ActionUpdateCheck::HandleUpdateCheckOK(
|
| + const UpdateResponse::Result& result,
|
| + CrxUpdateItem* crx) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| +
|
| + const auto& manifest = result.manifest;
|
| +
|
| + if (manifest.version.empty()) {
|
| + // It can't update without a manifest version.
|
| + VLOG(1) << "No manifest version available for CRX: " << crx->id;
|
| + ChangeItemState(crx, CrxUpdateItem::State::kNoUpdate);
|
| + return;
|
| + }
|
| +
|
| + if (!IsVersionNewer(crx->component.version, manifest.version)) {
|
| + // The CRX is up to date.
|
| + VLOG(1) << "Component already up to date: " << crx->id;
|
| + ChangeItemState(crx, CrxUpdateItem::State::kUpToDate);
|
| + return;
|
| + }
|
| +
|
| + if (!manifest.browser_min_version.empty()) {
|
| + if (IsVersionNewer(browser_version_, manifest.browser_min_version)) {
|
| + // The CRX is not compatible with this Chrome version.
|
| + VLOG(1) << "Ignoring incompatible CRX: " << crx->id;
|
| + ChangeItemState(crx, CrxUpdateItem::State::kNoUpdate);
|
| + return;
|
| + }
|
| + }
|
| +
|
| + if (manifest.packages.size() != 1) {
|
| + // Assume one and only one package per CRX.
|
| + VLOG(1) << "Ignoring multiple packages for CRX: " << crx->id;
|
| + ChangeItemState(crx, CrxUpdateItem::State::kNoUpdate);
|
| + return;
|
| + }
|
| +
|
| + // Parse the members of the result and queue an upgrade for this CRX.
|
| + VLOG(1) << "Update found for CRX: " << crx->id;
|
| +
|
| + crx->next_version = base::Version(manifest.version);
|
| + const auto& package = manifest.packages.front();
|
| + crx->next_fp = package.fingerprint;
|
| +
|
| + // Resolve the urls by combining the base urls with the package names.
|
| + for (const auto& crx_url : result.crx_urls) {
|
| + const GURL url = crx_url.Resolve(package.name);
|
| + if (url.is_valid())
|
| + crx->crx_urls.push_back(url);
|
| + }
|
| + for (const auto& crx_diffurl : result.crx_diffurls) {
|
| + const GURL url = crx_diffurl.Resolve(package.namediff);
|
| + if (url.is_valid())
|
| + crx->crx_diffurls.push_back(url);
|
| + }
|
| +
|
| + crx->hash_sha256 = package.hash_sha256;
|
| + crx->hashdiff_sha256 = package.hashdiff_sha256;
|
| +
|
| + ChangeItemState(crx, CrxUpdateItem::State::kCanUpdate);
|
| +
|
| + update_context_->queue.push(crx->id);
|
| +}
|
| +
|
| +void ActionUpdateCheck::HandleUpdateCheckNoupdate(
|
| + const UpdateResponse::Result& result,
|
| + CrxUpdateItem* crx) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + VLOG(1) << "No update for CRX: " << crx->id;
|
| + ChangeItemState(crx, CrxUpdateItem::State::kNoUpdate);
|
| +}
|
| +
|
| +void ActionUpdateCheck::HandleUpdateCheckError(
|
| + const UpdateResponse::Result& result,
|
| + CrxUpdateItem* crx) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + VLOG(1) << "Update error for CRX: " << crx->id << ", " << result.status;
|
| + ChangeItemState(crx, CrxUpdateItem::State::kNoUpdate);
|
| +}
|
| +
|
| void ActionUpdateCheck::OnUpdateCheckFailed(int error) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| DCHECK(error);
|
|
|