Chromium Code Reviews| Index: chrome/browser/extensions/crx_installer.cc |
| diff --git a/chrome/browser/extensions/crx_installer.cc b/chrome/browser/extensions/crx_installer.cc |
| index 7acd8dded38b98e496ed629f209c77d9fd21492c..0fb7451054e03f414989f671bf6aa30db2eb9f9d 100644 |
| --- a/chrome/browser/extensions/crx_installer.cc |
| +++ b/chrome/browser/extensions/crx_installer.cc |
| @@ -45,6 +45,7 @@ |
| #include "extensions/browser/extension_prefs.h" |
| #include "extensions/browser/extension_system.h" |
| #include "extensions/browser/install_flag.h" |
| +#include "extensions/browser/management_policy.h" |
|
asargent_no_longer_on_chrome
2014/07/09 23:54:16
Do you actually use anything from this header file
tmdiep
2014/07/10 00:26:24
You're right, it's not used in this file. I intend
|
| #include "extensions/common/extension_icon_set.h" |
| #include "extensions/common/feature_switch.h" |
| #include "extensions/common/file_util.h" |
| @@ -133,7 +134,7 @@ CrxInstaller::CrxInstaller(base::WeakPtr<ExtensionService> service_weak, |
| error_on_unsupported_requirements_(false), |
| update_from_settings_page_(false), |
| install_flags_(kInstallFlagNone), |
| - installer_(service_weak->profile()) { |
| + install_checker_(service_weak->profile()) { |
| installer_task_runner_ = service_weak->GetFileTaskRunner(); |
| if (!approval) |
| return; |
| @@ -369,7 +370,7 @@ CrxInstallerError CrxInstaller::AllowInstall(const Extension* extension) { |
| } |
| } |
| - if (installer_.extension()->is_app()) { |
| + if (install_checker_.extension()->is_app()) { |
| // If the app was downloaded, apps_require_extension_mime_type_ |
| // will be set. In this case, check that it was served with the |
| // right mime type. Make an exception for file URLs, which come |
| @@ -404,7 +405,7 @@ CrxInstallerError CrxInstaller::AllowInstall(const Extension* extension) { |
| pattern.SetHost(download_url_.host()); |
| pattern.SetMatchSubdomains(true); |
| - URLPatternSet patterns = installer_.extension()->web_extent(); |
| + URLPatternSet patterns = install_checker_.extension()->web_extent(); |
| for (URLPatternSet::const_iterator i = patterns.begin(); |
| i != patterns.end(); ++i) { |
| if (!pattern.MatchesHost(i->host())) { |
| @@ -448,7 +449,7 @@ void CrxInstaller::OnUnpackSuccess( |
| install_cause(), |
| extension_misc::NUM_INSTALL_CAUSES); |
| - installer_.set_extension(extension); |
| + install_checker_.set_extension(extension); |
| temp_dir_ = temp_dir; |
| if (!install_icon.empty()) |
| install_icon_.reset(new SkBitmap(install_icon)); |
| @@ -468,13 +469,13 @@ void CrxInstaller::OnUnpackSuccess( |
| return; |
| } |
| - if (!BrowserThread::PostTask( |
| - BrowserThread::UI, FROM_HERE, |
| - base::Bind(&CrxInstaller::CheckImportsAndRequirements, this))) |
| + if (!BrowserThread::PostTask(BrowserThread::UI, |
| + FROM_HERE, |
| + base::Bind(&CrxInstaller::CheckInstall, this))) |
| NOTREACHED(); |
| } |
| -void CrxInstaller::CheckImportsAndRequirements() { |
| +void CrxInstaller::CheckInstall() { |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| ExtensionService* service = service_weak_.get(); |
| if (!service || service->browser_terminating()) |
| @@ -505,42 +506,36 @@ void CrxInstaller::CheckImportsAndRequirements() { |
| } |
| } |
| } |
| - installer_.CheckRequirements(base::Bind(&CrxInstaller::OnRequirementsChecked, |
| - this)); |
| + |
| + // Run the policy, requirements and blacklist checks in parallel. |
| + install_checker_.Start( |
| + ExtensionInstallChecker::CHECK_ALL, |
| + false /* fail fast */, |
| + base::Bind(&CrxInstaller::OnInstallChecksComplete, this)); |
| } |
| -void CrxInstaller::OnRequirementsChecked( |
| - std::vector<std::string> requirement_errors) { |
| +void CrxInstaller::OnInstallChecksComplete(int failed_checks) { |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| if (!service_weak_) |
| return; |
| - if (!requirement_errors.empty()) { |
| + // Check for requirement errors. |
| + if (!install_checker_.requirement_errors().empty()) { |
| if (error_on_unsupported_requirements_) { |
| - ReportFailureFromUIThread(CrxInstallerError( |
| - base::UTF8ToUTF16(JoinString(requirement_errors, ' ')))); |
| + ReportFailureFromUIThread(CrxInstallerError(base::UTF8ToUTF16( |
| + JoinString(install_checker_.requirement_errors(), ' ')))); |
| return; |
| } |
| install_flags_ |= kInstallFlagHasRequirementErrors; |
| } |
| - ExtensionSystem::Get(profile())->blacklist()->IsBlacklisted( |
| - extension()->id(), |
| - base::Bind(&CrxInstaller::OnBlacklistChecked, this)); |
| -} |
| - |
| -void CrxInstaller::OnBlacklistChecked( |
| - extensions::BlacklistState blacklist_state) { |
| - DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| - if (!service_weak_) |
| - return; |
| - |
| - if (blacklist_state == extensions::BLACKLISTED_MALWARE) { |
| + // Check the blacklist state. |
| + if (install_checker_.blacklist_state() == extensions::BLACKLISTED_MALWARE) { |
| install_flags_ |= kInstallFlagIsBlacklistedForMalware; |
| } |
| - if ((blacklist_state == extensions::BLACKLISTED_MALWARE || |
| - blacklist_state == extensions::BLACKLISTED_UNKNOWN) && |
| + if ((install_checker_.blacklist_state() == extensions::BLACKLISTED_MALWARE || |
| + install_checker_.blacklist_state() == extensions::BLACKLISTED_UNKNOWN) && |
| !allow_silent_install_) { |
| // User tried to install a blacklisted extension. Show an error and |
| // refuse to install it. |
| @@ -556,6 +551,19 @@ void CrxInstaller::OnBlacklistChecked( |
| // NOTE: extension may still be blacklisted, but we're forced to silently |
| // install it. In this case, ExtensionService::OnExtensionInstalled needs to |
| // deal with it. |
| + |
| + // Check for policy errors. |
| + if (!install_checker_.policy_error().empty()) { |
| + // We don't want to show the error infobar for installs from the WebStore, |
| + // because the WebStore already shows an error dialog itself. |
| + // Note: |client_| can be NULL in unit_tests! |
| + if (extension()->from_webstore() && client_) |
| + client_->install_ui()->set_skip_post_install_ui(true); |
| + ReportFailureFromUIThread( |
| + CrxInstallerError(base::UTF8ToUTF16(install_checker_.policy_error()))); |
| + return; |
| + } |
| + |
| ConfirmInstall(); |
| } |
| @@ -565,7 +573,7 @@ void CrxInstaller::ConfirmInstall() { |
| if (!service || service->browser_terminating()) |
| return; |
| - if (KioskModeInfo::IsKioskOnly(installer_.extension())) { |
| + if (KioskModeInfo::IsKioskOnly(install_checker_.extension())) { |
| bool in_kiosk_mode = false; |
| #if defined(OS_CHROMEOS) |
| chromeos::UserManager* user_manager = chromeos::UserManager::Get(); |
| @@ -579,17 +587,6 @@ void CrxInstaller::ConfirmInstall() { |
| } |
| } |
| - base::string16 error = installer_.CheckManagementPolicy(); |
| - if (!error.empty()) { |
| - // We don't want to show the error infobar for installs from the WebStore, |
| - // because the WebStore already shows an error dialog itself. |
| - // Note: |client_| can be NULL in unit_tests! |
| - if (extension()->from_webstore() && client_) |
| - client_->install_ui()->set_skip_post_install_ui(true); |
| - ReportFailureFromUIThread(CrxInstallerError(error)); |
| - return; |
| - } |
| - |
| // Check whether this install is initiated from the settings page to |
| // update an existing extension or app. |
| CheckUpdateFromSettingsPage(); |
| @@ -722,7 +719,7 @@ void CrxInstaller::ReloadExtensionAfterInstall( |
| // with base::string16 |
| std::string extension_id = extension()->id(); |
| std::string error; |
| - installer_.set_extension( |
| + install_checker_.set_extension( |
| file_util::LoadExtension( |
| version_dir, |
| install_source_, |