| 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/extensions/updater/extension_downloader.h" | 5 #include "chrome/browser/extensions/updater/extension_downloader.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 bool ShouldRetryRequest(const net::URLRequestStatus& status, | 89 bool ShouldRetryRequest(const net::URLRequestStatus& status, |
| 90 int response_code) { | 90 int response_code) { |
| 91 // Retry if the response code is a server error, or the request failed because | 91 // Retry if the response code is a server error, or the request failed because |
| 92 // of network errors as opposed to file errors. | 92 // of network errors as opposed to file errors. |
| 93 return (response_code >= 500 && status.is_success()) || | 93 return (response_code >= 500 && status.is_success()) || |
| 94 status.status() == net::URLRequestStatus::FAILED; | 94 status.status() == net::URLRequestStatus::FAILED; |
| 95 } | 95 } |
| 96 | 96 |
| 97 } // namespace | 97 } // namespace |
| 98 | 98 |
| 99 UpdateDetails::UpdateDetails(const std::string& id, | 99 UpdateDetails::UpdateDetails(const std::string& id, const Version& version) |
| 100 const base::Version& version) | |
| 101 : id(id), version(version) {} | 100 : id(id), version(version) {} |
| 102 | 101 |
| 103 UpdateDetails::~UpdateDetails() {} | 102 UpdateDetails::~UpdateDetails() {} |
| 104 | 103 |
| 105 ExtensionDownloader::ExtensionFetch::ExtensionFetch() : url() {} | 104 ExtensionDownloader::ExtensionFetch::ExtensionFetch() : url() {} |
| 106 | 105 |
| 107 ExtensionDownloader::ExtensionFetch::ExtensionFetch( | 106 ExtensionDownloader::ExtensionFetch::ExtensionFetch( |
| 108 const std::string& id, | 107 const std::string& id, |
| 109 const GURL& url, | 108 const GURL& url, |
| 110 const std::string& package_hash, | 109 const std::string& package_hash, |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 154 ManifestURL::GetUpdateURL(&extension), | 153 ManifestURL::GetUpdateURL(&extension), |
| 155 update_url_data, request_id); | 154 update_url_data, request_id); |
| 156 } | 155 } |
| 157 | 156 |
| 158 bool ExtensionDownloader::AddPendingExtension(const std::string& id, | 157 bool ExtensionDownloader::AddPendingExtension(const std::string& id, |
| 159 const GURL& update_url, | 158 const GURL& update_url, |
| 160 int request_id) { | 159 int request_id) { |
| 161 // Use a zero version to ensure that a pending extension will always | 160 // Use a zero version to ensure that a pending extension will always |
| 162 // be updated, and thus installed (assuming all extensions have | 161 // be updated, and thus installed (assuming all extensions have |
| 163 // non-zero versions). | 162 // non-zero versions). |
| 164 base::Version version("0.0.0.0"); | 163 Version version("0.0.0.0"); |
| 165 DCHECK(version.IsValid()); | 164 DCHECK(version.IsValid()); |
| 166 | 165 |
| 167 return AddExtensionData(id, | 166 return AddExtensionData(id, |
| 168 version, | 167 version, |
| 169 Manifest::TYPE_UNKNOWN, | 168 Manifest::TYPE_UNKNOWN, |
| 170 update_url, | 169 update_url, |
| 171 std::string(), | 170 std::string(), |
| 172 request_id); | 171 request_id); |
| 173 } | 172 } |
| 174 | 173 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 199 DCHECK(blacklist_fetch->base_url().SchemeIsSecure()); | 198 DCHECK(blacklist_fetch->base_url().SchemeIsSecure()); |
| 200 blacklist_fetch->AddExtension(kBlacklistAppID, | 199 blacklist_fetch->AddExtension(kBlacklistAppID, |
| 201 version, | 200 version, |
| 202 &ping_data, | 201 &ping_data, |
| 203 std::string(), | 202 std::string(), |
| 204 kDefaultInstallSource); | 203 kDefaultInstallSource); |
| 205 StartUpdateCheck(blacklist_fetch.Pass()); | 204 StartUpdateCheck(blacklist_fetch.Pass()); |
| 206 } | 205 } |
| 207 | 206 |
| 208 bool ExtensionDownloader::AddExtensionData(const std::string& id, | 207 bool ExtensionDownloader::AddExtensionData(const std::string& id, |
| 209 const base::Version& version, | 208 const Version& version, |
| 210 Manifest::Type extension_type, | 209 Manifest::Type extension_type, |
| 211 const GURL& extension_update_url, | 210 const GURL& extension_update_url, |
| 212 const std::string& update_url_data, | 211 const std::string& update_url_data, |
| 213 int request_id) { | 212 int request_id) { |
| 214 GURL update_url(extension_update_url); | 213 GURL update_url(extension_update_url); |
| 215 // Skip extensions with non-empty invalid update URLs. | 214 // Skip extensions with non-empty invalid update URLs. |
| 216 if (!update_url.is_empty() && !update_url.is_valid()) { | 215 if (!update_url.is_empty() && !update_url.is_valid()) { |
| 217 LOG(WARNING) << "Extension " << id << " has invalid update url " | 216 LOG(WARNING) << "Extension " << id << " has invalid update url " |
| 218 << update_url; | 217 << update_url; |
| 219 return false; | 218 return false; |
| (...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 524 fetch_data.request_ids(), | 523 fetch_data.request_ids(), |
| 525 ExtensionDownloaderDelegate::NO_UPDATE_AVAILABLE); | 524 ExtensionDownloaderDelegate::NO_UPDATE_AVAILABLE); |
| 526 } | 525 } |
| 527 | 526 |
| 528 void ExtensionDownloader::DetermineUpdates( | 527 void ExtensionDownloader::DetermineUpdates( |
| 529 const ManifestFetchData& fetch_data, | 528 const ManifestFetchData& fetch_data, |
| 530 const UpdateManifest::Results& possible_updates, | 529 const UpdateManifest::Results& possible_updates, |
| 531 std::vector<int>* result) { | 530 std::vector<int>* result) { |
| 532 // This will only be valid if one of possible_updates specifies | 531 // This will only be valid if one of possible_updates specifies |
| 533 // browser_min_version. | 532 // browser_min_version. |
| 534 base::Version browser_version; | 533 Version browser_version; |
| 535 | 534 |
| 536 for (size_t i = 0; i < possible_updates.list.size(); i++) { | 535 for (size_t i = 0; i < possible_updates.list.size(); i++) { |
| 537 const UpdateManifest::Result* update = &possible_updates.list[i]; | 536 const UpdateManifest::Result* update = &possible_updates.list[i]; |
| 538 const std::string& id = update->extension_id; | 537 const std::string& id = update->extension_id; |
| 539 | 538 |
| 540 if (!fetch_data.Includes(id)) { | 539 if (!fetch_data.Includes(id)) { |
| 541 VLOG(2) << "Ignoring " << id << " from this manifest"; | 540 VLOG(2) << "Ignoring " << id << " from this manifest"; |
| 542 continue; | 541 continue; |
| 543 } | 542 } |
| 544 | 543 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 555 // version is the same or older than what's already installed, | 554 // version is the same or older than what's already installed, |
| 556 // we don't want it. | 555 // we don't want it. |
| 557 std::string version; | 556 std::string version; |
| 558 if (!delegate_->GetExtensionExistingVersion(id, &version)) { | 557 if (!delegate_->GetExtensionExistingVersion(id, &version)) { |
| 559 VLOG(2) << id << " is not installed"; | 558 VLOG(2) << id << " is not installed"; |
| 560 continue; | 559 continue; |
| 561 } | 560 } |
| 562 | 561 |
| 563 VLOG(2) << id << " is at '" << version << "'"; | 562 VLOG(2) << id << " is at '" << version << "'"; |
| 564 | 563 |
| 565 base::Version existing_version(version); | 564 Version existing_version(version); |
| 566 base::Version update_version(update->version); | 565 Version update_version(update->version); |
| 567 | 566 |
| 568 if (!update_version.IsValid() || | 567 if (!update_version.IsValid() || |
| 569 update_version.CompareTo(existing_version) <= 0) { | 568 update_version.CompareTo(existing_version) <= 0) { |
| 570 continue; | 569 continue; |
| 571 } | 570 } |
| 572 } | 571 } |
| 573 | 572 |
| 574 // If the update specifies a browser minimum version, do we qualify? | 573 // If the update specifies a browser minimum version, do we qualify? |
| 575 if (update->browser_min_version.length() > 0) { | 574 if (update->browser_min_version.length() > 0) { |
| 576 // First determine the browser version if we haven't already. | 575 // First determine the browser version if we haven't already. |
| 577 if (!browser_version.IsValid()) { | 576 if (!browser_version.IsValid()) { |
| 578 chrome::VersionInfo version_info; | 577 chrome::VersionInfo version_info; |
| 579 if (version_info.is_valid()) | 578 if (version_info.is_valid()) |
| 580 browser_version = base::Version(version_info.Version()); | 579 browser_version = Version(version_info.Version()); |
| 581 } | 580 } |
| 582 base::Version browser_min_version(update->browser_min_version); | 581 Version browser_min_version(update->browser_min_version); |
| 583 if (browser_version.IsValid() && browser_min_version.IsValid() && | 582 if (browser_version.IsValid() && browser_min_version.IsValid() && |
| 584 browser_min_version.CompareTo(browser_version) > 0) { | 583 browser_min_version.CompareTo(browser_version) > 0) { |
| 585 // TODO(asargent) - We may want this to show up in the extensions UI | 584 // TODO(asargent) - We may want this to show up in the extensions UI |
| 586 // eventually. (http://crbug.com/12547). | 585 // eventually. (http://crbug.com/12547). |
| 587 LOG(WARNING) << "Updated version of extension " << id | 586 LOG(WARNING) << "Updated version of extension " << id |
| 588 << " available, but requires chrome version " | 587 << " available, but requires chrome version " |
| 589 << update->browser_min_version; | 588 << update->browser_min_version; |
| 590 continue; | 589 continue; |
| 591 } | 590 } |
| 592 } | 591 } |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 699 for (std::set<std::string>::const_iterator it = extension_ids.begin(); | 698 for (std::set<std::string>::const_iterator it = extension_ids.begin(); |
| 700 it != extension_ids.end(); ++it) { | 699 it != extension_ids.end(); ++it) { |
| 701 const ExtensionDownloaderDelegate::PingResult& ping = ping_results_[*it]; | 700 const ExtensionDownloaderDelegate::PingResult& ping = ping_results_[*it]; |
| 702 delegate_->OnExtensionDownloadFailed(*it, error, ping, request_ids); | 701 delegate_->OnExtensionDownloadFailed(*it, error, ping, request_ids); |
| 703 ping_results_.erase(*it); | 702 ping_results_.erase(*it); |
| 704 } | 703 } |
| 705 } | 704 } |
| 706 | 705 |
| 707 void ExtensionDownloader::NotifyUpdateFound(const std::string& id, | 706 void ExtensionDownloader::NotifyUpdateFound(const std::string& id, |
| 708 const std::string& version) { | 707 const std::string& version) { |
| 709 UpdateDetails updateInfo(id, base::Version(version)); | 708 UpdateDetails updateInfo(id, Version(version)); |
| 710 content::NotificationService::current()->Notify( | 709 content::NotificationService::current()->Notify( |
| 711 chrome::NOTIFICATION_EXTENSION_UPDATE_FOUND, | 710 chrome::NOTIFICATION_EXTENSION_UPDATE_FOUND, |
| 712 content::NotificationService::AllBrowserContextsAndSources(), | 711 content::NotificationService::AllBrowserContextsAndSources(), |
| 713 content::Details<UpdateDetails>(&updateInfo)); | 712 content::Details<UpdateDetails>(&updateInfo)); |
| 714 } | 713 } |
| 715 | 714 |
| 716 } // namespace extensions | 715 } // namespace extensions |
| OLD | NEW |