Index: chrome/browser/extensions/updater/extension_downloader.cc |
diff --git a/chrome/browser/extensions/updater/extension_downloader.cc b/chrome/browser/extensions/updater/extension_downloader.cc |
index 264e461e535723dd8b85b0cd820ec9789d3d5a6d..d8f183c153e875416294763b47c6fc827460b684 100644 |
--- a/chrome/browser/extensions/updater/extension_downloader.cc |
+++ b/chrome/browser/extensions/updater/extension_downloader.cc |
@@ -28,6 +28,7 @@ |
#include "chrome/common/chrome_version_info.h" |
#include "chrome/common/extensions/extension_constants.h" |
#include "chrome/common/extensions/manifest_url_handler.h" |
+#include "components/omaha_query_params/omaha_query_params.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/notification_details.h" |
#include "content/public/browser/notification_service.h" |
@@ -44,6 +45,7 @@ |
using base::Time; |
using base::TimeDelta; |
using content::BrowserThread; |
+using omaha_query_params::OmahaQueryParams; |
namespace extensions { |
@@ -84,6 +86,7 @@ const int kMaxOAuth2Attempts = 3; |
const char kNotFromWebstoreInstallSource[] = "notfromwebstore"; |
const char kDefaultInstallSource[] = ""; |
+const char kWrongMultiCrxInstallSource[] = "wrong_multi_crx"; |
const char kGoogleDotCom[] = "google.com"; |
const char kTokenServiceConsumerId[] = "extension_downloader"; |
@@ -210,10 +213,24 @@ bool ExtensionDownloader::AddExtension(const Extension& extension, |
if (!ManifestURL::UpdatesFromGallery(&extension)) |
update_url_data = delegate_->GetUpdateUrlData(extension.id()); |
- return AddExtensionData(extension.id(), *extension.version(), |
+ // If the browser's native architecture has changed since this extension was |
+ // installed, we need to force an update. |
+ bool force_update = false; |
+ std::string install_source; |
+ if (extension.HasPlatformSpecificResources() && |
+ !extension.HasResourcesForPlatform(OmahaQueryParams::GetNaclArch())) { |
+ force_update = true; |
+ install_source = kWrongMultiCrxInstallSource; |
+ } |
+ |
+ return AddExtensionData(extension.id(), |
+ *extension.version(), |
extension.GetType(), |
ManifestURL::GetUpdateURL(&extension), |
- update_url_data, request_id); |
+ update_url_data, |
+ request_id, |
+ force_update, |
+ install_source); |
} |
bool ExtensionDownloader::AddPendingExtension(const std::string& id, |
@@ -230,7 +247,9 @@ bool ExtensionDownloader::AddPendingExtension(const std::string& id, |
Manifest::TYPE_UNKNOWN, |
update_url, |
std::string(), |
- request_id); |
+ request_id, |
+ false, |
+ std::string()); |
} |
void ExtensionDownloader::StartAllPending(ExtensionCache* cache) { |
@@ -273,7 +292,8 @@ void ExtensionDownloader::StartBlacklistUpdate( |
version, |
&ping_data, |
std::string(), |
- kDefaultInstallSource); |
+ kDefaultInstallSource, |
+ false); |
StartUpdateCheck(blacklist_fetch.Pass()); |
} |
@@ -282,12 +302,15 @@ void ExtensionDownloader::SetWebstoreIdentityProvider( |
identity_provider_.swap(identity_provider); |
} |
-bool ExtensionDownloader::AddExtensionData(const std::string& id, |
- const Version& version, |
- Manifest::Type extension_type, |
- const GURL& extension_update_url, |
- const std::string& update_url_data, |
- int request_id) { |
+bool ExtensionDownloader::AddExtensionData( |
+ const std::string& id, |
+ const Version& version, |
+ Manifest::Type extension_type, |
+ const GURL& extension_update_url, |
+ const std::string& update_url_data, |
+ int request_id, |
+ bool force_update, |
+ const std::string& install_source_override) { |
GURL update_url(extension_update_url); |
// Skip extensions with non-empty invalid update URLs. |
if (!update_url.is_empty() && !update_url.is_valid()) { |
@@ -353,6 +376,9 @@ bool ExtensionDownloader::AddExtensionData(const std::string& id, |
std::string install_source = i == 0 ? |
kDefaultInstallSource : kNotFromWebstoreInstallSource; |
+ if (!install_source_override.empty()) { |
+ install_source = install_source_override; |
+ } |
ManifestFetchData::PingData ping_data; |
ManifestFetchData::PingData* optional_ping_data = NULL; |
@@ -369,7 +395,8 @@ bool ExtensionDownloader::AddExtensionData(const std::string& id, |
ManifestFetchData* existing_fetch = existing_iter->second.back().get(); |
if (existing_fetch->AddExtension(id, version.GetString(), |
optional_ping_data, update_url_data, |
- install_source)) { |
+ install_source, |
+ force_update)) { |
added = true; |
} |
} |
@@ -383,7 +410,8 @@ bool ExtensionDownloader::AddExtensionData(const std::string& id, |
added = fetch->AddExtension(id, version.GetString(), |
optional_ping_data, |
update_url_data, |
- install_source); |
+ install_source, |
+ force_update); |
DCHECK(added); |
} |
} |
@@ -639,12 +667,14 @@ void ExtensionDownloader::DetermineUpdates( |
VLOG(2) << id << " is at '" << version << "'"; |
- Version existing_version(version); |
- Version update_version(update->version); |
- |
- if (!update_version.IsValid() || |
- update_version.CompareTo(existing_version) <= 0) { |
- continue; |
+ // We should skip the version check if update was forced. |
+ if (!fetch_data.DidForceUpdate(id)) { |
+ Version existing_version(version); |
+ Version update_version(update->version); |
+ if (!update_version.IsValid() || |
+ update_version.CompareTo(existing_version) <= 0) { |
+ continue; |
+ } |
} |
} |