Index: extensions/browser/updater/extension_downloader.cc |
diff --git a/extensions/browser/updater/extension_downloader.cc b/extensions/browser/updater/extension_downloader.cc |
index 7bc7f6752a6c14ca4ec8383a42964adfee75b6e2..85e192177e06956ac0921f331e42ea8fd65cea66 100644 |
--- a/extensions/browser/updater/extension_downloader.cc |
+++ b/extensions/browser/updater/extension_downloader.cc |
@@ -85,6 +85,7 @@ const int kMaxOAuth2Attempts = 3; |
const char kNotFromWebstoreInstallSource[] = "notfromwebstore"; |
const char kDefaultInstallSource[] = ""; |
+const char kReinstallInstallSource[] = "reinstall"; |
const char kGoogleDotCom[] = "google.com"; |
const char kTokenServiceConsumerId[] = "extension_downloader"; |
@@ -180,6 +181,8 @@ ExtensionDownloader::ExtensionFetch::ExtensionFetch( |
ExtensionDownloader::ExtensionFetch::~ExtensionFetch() { |
} |
+ExtensionDownloader::ExtraParams::ExtraParams() : is_corrupt_reinstall(false) {} |
+ |
ExtensionDownloader::ExtensionDownloader( |
ExtensionDownloaderDelegate* delegate, |
net::URLRequestContextGetter* request_context) |
@@ -210,29 +213,35 @@ bool ExtensionDownloader::AddExtension(const Extension& extension, |
return false; |
} |
+ ExtraParams extra; |
+ |
// If the extension updates itself from the gallery, ignore any update URL |
// data. At the moment there is no extra data that an extension can |
// communicate to the the gallery update servers. |
std::string update_url_data; |
if (!ManifestURL::UpdatesFromGallery(&extension)) |
- update_url_data = delegate_->GetUpdateUrlData(extension.id()); |
+ extra.update_url_data = delegate_->GetUpdateUrlData(extension.id()); |
return AddExtensionData( |
extension.id(), *extension.version(), extension.GetType(), |
- ManifestURL::GetUpdateURL(&extension), update_url_data, request_id); |
+ ManifestURL::GetUpdateURL(&extension), extra, request_id); |
} |
bool ExtensionDownloader::AddPendingExtension(const std::string& id, |
const GURL& update_url, |
+ bool is_corrupt_reinstall, |
int request_id) { |
// Use a zero version to ensure that a pending extension will always |
// be updated, and thus installed (assuming all extensions have |
// non-zero versions). |
base::Version version("0.0.0.0"); |
DCHECK(version.IsValid()); |
+ ExtraParams extra; |
+ if (is_corrupt_reinstall) |
+ extra.is_corrupt_reinstall = true; |
return AddExtensionData(id, version, Manifest::TYPE_UNKNOWN, update_url, |
- std::string(), request_id); |
+ extra, request_id); |
} |
void ExtensionDownloader::StartAllPending(ExtensionCache* cache) { |
@@ -289,7 +298,7 @@ bool ExtensionDownloader::AddExtensionData(const std::string& id, |
const base::Version& version, |
Manifest::Type extension_type, |
const GURL& extension_update_url, |
- const std::string& update_url_data, |
+ const ExtraParams& extra, |
int request_id) { |
GURL update_url(extension_update_url); |
// Skip extensions with non-empty invalid update URLs. |
@@ -347,6 +356,8 @@ bool ExtensionDownloader::AddExtensionData(const std::string& id, |
std::string install_source = extension_urls::IsWebstoreUpdateUrl(update_url) |
? kDefaultInstallSource |
: kNotFromWebstoreInstallSource; |
+ if (extra.is_corrupt_reinstall) |
+ install_source = kReinstallInstallSource; |
ManifestFetchData::PingData ping_data; |
ManifestFetchData::PingData* optional_ping_data = NULL; |
@@ -362,7 +373,7 @@ bool ExtensionDownloader::AddExtensionData(const std::string& id, |
// Try to add to the ManifestFetchData at the end of the list. |
ManifestFetchData* existing_fetch = existing_iter->second.back().get(); |
if (existing_fetch->AddExtension(id, version.GetString(), |
- optional_ping_data, update_url_data, |
+ optional_ping_data, extra.update_url_data, |
install_source)) { |
added = true; |
} |
@@ -376,7 +387,7 @@ bool ExtensionDownloader::AddExtensionData(const std::string& id, |
fetches_preparing_[std::make_pair(request_id, update_url)].push_back( |
std::move(fetch)); |
added = fetch_ptr->AddExtension(id, version.GetString(), optional_ping_data, |
- update_url_data, install_source); |
+ extra.update_url_data, install_source); |
DCHECK(added); |
} |