Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(790)

Unified Diff: chrome/browser/extensions/webstore_standalone_installer.cc

Issue 389613006: Prevent duplicate concurrent installs of the same extension (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/webstore_standalone_installer.cc
diff --git a/chrome/browser/extensions/webstore_standalone_installer.cc b/chrome/browser/extensions/webstore_standalone_installer.cc
index 4f42f01b221312bc01654531b520157d9c2244e0..ca46c7512ccc94f7c0a199c388fc3a0baae58e68 100644
--- a/chrome/browser/extensions/webstore_standalone_installer.cc
+++ b/chrome/browser/extensions/webstore_standalone_installer.cc
@@ -31,6 +31,8 @@ const char kInvalidWebstoreResponseError[] = "Invalid Chrome Web Store reponse";
const char kInvalidManifestError[] = "Invalid manifest";
const char kUserCancelledError[] = "User cancelled install";
const char kExtensionIsBlacklisted[] = "Extension is blacklisted";
+const char kInstallInProgressError[] = "An install is already in progress";
+const char kLaunchInProgressError[] = "A launch is already in progress";
WebstoreStandaloneInstaller::WebstoreStandaloneInstaller(
const std::string& webstore_item_id,
@@ -42,7 +44,8 @@ WebstoreStandaloneInstaller::WebstoreStandaloneInstaller(
install_source_(WebstoreInstaller::INSTALL_SOURCE_INLINE),
show_user_count_(true),
average_rating_(0.0),
- rating_count_(0) {
+ rating_count_(0),
+ install_registered_(false) {
}
void WebstoreStandaloneInstaller::BeginInstall() {
@@ -56,6 +59,13 @@ void WebstoreStandaloneInstaller::BeginInstall() {
return;
}
+ webstore_install::Result result = webstore_install::UNKNOWN_ERROR;
+ std::string error;
+ if (!EnsureUniqueInstall(&result, &error)) {
+ CompleteInstall(result, error);
+ return;
+ }
+
// Use the requesting page as the referrer both since that is more correct
// (it is the page that caused this request to happen) and so that we can
// track top sites that trigger inline install requests.
@@ -79,13 +89,41 @@ void WebstoreStandaloneInstaller::AbortInstall() {
// Abort any in-progress fetches.
if (webstore_data_fetcher_) {
webstore_data_fetcher_.reset();
+ DeregisterActiveInstall();
Release(); // Matches the AddRef in BeginInstall.
}
}
+bool WebstoreStandaloneInstaller::EnsureUniqueInstall(
+ webstore_install::Result* reason,
+ std::string* error) {
+ InstallTracker* tracker = InstallTracker::Get(profile_);
+ DCHECK(tracker);
+
+ const InstallTracker::InstallProgressData* existing_install_data =
+ tracker->GetActiveInstall(id_);
+ if (existing_install_data) {
+ if (existing_install_data->is_ephemeral) {
+ *reason = webstore_install::LAUNCH_IN_PROGRESS;
+ *error = kLaunchInProgressError;
+ } else {
+ *reason = webstore_install::INSTALL_IN_PROGRESS;
+ *error = kInstallInProgressError;
+ }
+ return false;
+ }
+
+ InstallTracker::InstallProgressData install_data(id_);
+ InitInstallData(&install_data);
+ tracker->AddActiveInstall(install_data);
+ install_registered_ = true;
+ return true;
+}
+
void WebstoreStandaloneInstaller::CompleteInstall(
webstore_install::Result result,
const std::string& error) {
+ DeregisterActiveInstall();
if (!callback_.is_null())
callback_.Run(result == webstore_install::SUCCESS, error);
Release(); // Matches the AddRef in BeginInstall.
@@ -121,6 +159,11 @@ WebstoreStandaloneInstaller::GetLocalizedExtensionForDisplay() {
return localized_extension_for_display_.get();
}
+void WebstoreStandaloneInstaller::InitInstallData(
+ InstallTracker::InstallProgressData* install_data) const {
+ // Default implementation sets no properties.
+}
+
void WebstoreStandaloneInstaller::OnManifestParsed() {
ProceedWithInstallPrompt();
}
@@ -395,4 +438,13 @@ void WebstoreStandaloneInstaller::OnWebStoreDataFetcherDone() {
webstore_data_fetcher_.reset();
}
+void WebstoreStandaloneInstaller::DeregisterActiveInstall() {
+ if (!install_registered_)
+ return;
+
+ InstallTracker* tracker = InstallTracker::Get(profile_);
+ DCHECK(tracker);
+ tracker->RemoveActiveInstall(id_);
+}
+
} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698