Index: chrome/browser/extensions/crx_installer.cc |
diff --git a/chrome/browser/extensions/crx_installer.cc b/chrome/browser/extensions/crx_installer.cc |
index 5ba1d5e53c3798111a9d26d15b5098e7e8b9b3dd..f997fc6fb78ab8869ba650c64851d3f9ff73df52 100644 |
--- a/chrome/browser/extensions/crx_installer.cc |
+++ b/chrome/browser/extensions/crx_installer.cc |
@@ -16,9 +16,9 @@ |
#include "base/sequenced_task_runner.h" |
#include "base/string_util.h" |
#include "base/stringprintf.h" |
+#include "base/threading/sequenced_worker_pool.h" |
#include "base/threading/thread_restrictions.h" |
#include "base/time.h" |
-#include "base/threading/sequenced_worker_pool.h" |
#include "base/utf_string_conversions.h" |
#include "base/version.h" |
#include "chrome/browser/browser_process.h" |
@@ -99,6 +99,7 @@ CrxInstaller::CrxInstaller( |
client_(client), |
apps_require_extension_mime_type_(false), |
allow_silent_install_(false), |
+ bypass_blacklist_for_test_(false), |
install_cause_(extension_misc::INSTALL_CAUSE_UNSET), |
creation_flags_(Extension::NO_FLAGS), |
off_store_install_allow_reason_(OffStoreInstallDisallowed), |
@@ -486,7 +487,7 @@ void CrxInstaller::InstallUIAbort(bool user_initiated) { |
content::Source<CrxInstaller>(this), |
content::NotificationService::NoDetails()); |
- NotifyCrxInstallComplete(NULL); |
+ NotifyCrxInstallComplete(false); |
Release(); // balanced in ConfirmInstall(). |
@@ -547,7 +548,7 @@ void CrxInstaller::CompleteInstall() { |
if (extension_) { |
ReportSuccessFromFileThread(); |
} else { |
- LOG(ERROR) << error << " " << extension_id << " " << download_url_.spec(); |
+ LOG(ERROR) << error << " " << extension_id << " " << download_url_; |
ReportFailureFromFileThread(CrxInstallerError(UTF8ToUTF16(error))); |
} |
@@ -582,7 +583,7 @@ void CrxInstaller::ReportFailureFromUIThread(const CrxInstallerError& error) { |
if (client_) |
client_->OnInstallFailure(error); |
- NotifyCrxInstallComplete(NULL); |
+ NotifyCrxInstallComplete(false); |
// Delete temporary files. |
CleanupTempFiles(); |
@@ -626,22 +627,43 @@ void CrxInstaller::ReportSuccessFromUIThread() { |
perms_updater.GrantActivePermissions(extension_, record_oauth2_grant_); |
} |
- // Tell the frontend about the installation and hand off ownership of |
- // extension_ to it. |
- frontend_weak_->OnExtensionInstalled(extension_, |
- page_ordinal_, |
- has_requirement_errors_, |
- install_wait_for_idle_); |
- |
- NotifyCrxInstallComplete(extension_.get()); |
- |
- extension_ = NULL; |
+ // Install the extension if it's not blacklisted, but notify either way. |
+ base::Closure on_success = |
+ base::Bind(&ExtensionService::OnExtensionInstalled, |
+ frontend_weak_, |
+ extension_, |
+ page_ordinal_, |
+ has_requirement_errors_, |
+ install_wait_for_idle_); |
+ if (bypass_blacklist_for_test_) { |
+ HandleIsBlacklistedResponse(on_success, false); |
+ } else { |
+ ExtensionSystem::Get(profile_)->blacklist()->IsBlacklisted( |
+ extension_->id(), |
+ base::Bind(&CrxInstaller::HandleIsBlacklistedResponse, |
+ this, |
+ on_success)); |
+ } |
+} |
- // We're done. We don't post any more tasks to ourselves so we are deleted |
- // soon. |
+void CrxInstaller::HandleIsBlacklistedResponse( |
+ const base::Closure& on_success, |
+ bool is_blacklisted) { |
+ if (is_blacklisted) { |
+ string16 error = |
+ l10n_util::GetStringFUTF16(IDS_EXTENSION_IS_BLACKLISTED, |
+ UTF8ToUTF16(extension_->name())); |
+ make_scoped_ptr(ExtensionInstallUI::Create(profile()))->OnInstallFailure( |
+ extensions::CrxInstallerError(error)); |
+ // Show error via reporter to make tests happy. |
+ ExtensionErrorReporter::GetInstance()->ReportError(error, false); // quiet |
+ } else { |
+ on_success.Run(); |
+ } |
+ NotifyCrxInstallComplete(!is_blacklisted); |
} |
-void CrxInstaller::NotifyCrxInstallComplete(const Extension* extension) { |
+void CrxInstaller::NotifyCrxInstallComplete(bool success) { |
// Some users (such as the download shelf) need to know when a |
// CRXInstaller is done. Listening for the EXTENSION_* events |
// is problematic because they don't know anything about the |
@@ -650,7 +672,11 @@ void CrxInstaller::NotifyCrxInstallComplete(const Extension* extension) { |
content::NotificationService::current()->Notify( |
chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
content::Source<CrxInstaller>(this), |
- content::Details<const Extension>(extension)); |
+ content::Details<const Extension>(success ? extension_.get() : NULL)); |
+ |
+ // We're done. We don't post any more tasks to ourselves so we are deleted |
+ // soon. |
+ extension_ = NULL; |
} |
void CrxInstaller::CleanupTempFiles() { |