| Index: chrome/browser/extensions/crx_installer.cc
|
| diff --git a/chrome/browser/extensions/crx_installer.cc b/chrome/browser/extensions/crx_installer.cc
|
| index f0a93657b4890db72cad4ecbe5721f52462218f3..2efea974d1305ab9db03948b19cd840a3a85b499 100644
|
| --- a/chrome/browser/extensions/crx_installer.cc
|
| +++ b/chrome/browser/extensions/crx_installer.cc
|
| @@ -42,6 +42,7 @@
|
| #include "chrome/common/extensions/feature_switch.h"
|
| #include "chrome/common/extensions/manifest.h"
|
| #include "chrome/common/extensions/manifest_handlers/icons_handler.h"
|
| +#include "chrome/common/extensions/manifest_handlers/shared_module_info.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/notification_service.h"
|
| #include "content/public/browser/resource_dispatcher_host.h"
|
| @@ -60,6 +61,7 @@
|
|
|
| using content::BrowserThread;
|
| using content::UserMetricsAction;
|
| +using extensions::SharedModuleInfo;
|
|
|
| namespace extensions {
|
|
|
| @@ -400,14 +402,42 @@ void CrxInstaller::OnUnpackSuccess(const base::FilePath& temp_dir,
|
|
|
| if (!BrowserThread::PostTask(
|
| BrowserThread::UI, FROM_HERE,
|
| - base::Bind(&CrxInstaller::CheckRequirements, this)))
|
| + base::Bind(&CrxInstaller::CheckImportsAndRequirements, this)))
|
| NOTREACHED();
|
| }
|
|
|
| -void CrxInstaller::CheckRequirements() {
|
| +void CrxInstaller::CheckImportsAndRequirements() {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| if (!frontend_weak_.get() || frontend_weak_->browser_terminating())
|
| return;
|
| +
|
| + if (SharedModuleInfo::ImportsModules(extension_)) {
|
| + const std::vector<SharedModuleInfo::ImportInfo>& imports =
|
| + SharedModuleInfo::GetImports(extension_);
|
| + std::vector<SharedModuleInfo::ImportInfo>::const_iterator i;
|
| + for (i = imports.begin(); i != imports.end(); ++i) {
|
| + Version version_required(i->minimum_version);
|
| + const Extension* imported_module =
|
| + frontend_weak_->GetExtensionById(i->extension_id, true);
|
| + if (!imported_module ||
|
| + (version_required.IsValid() &&
|
| + imported_module->version()->CompareTo(version_required) < 0)) {
|
| + ReportFailureFromUIThread(
|
| + CrxInstallerError(l10n_util::GetStringFUTF16(
|
| + IDS_EXTENSION_INSTALL_DEPENDENCY_NOT_FOUND,
|
| + ASCIIToUTF16(i->extension_id),
|
| + ASCIIToUTF16(i->minimum_version))));
|
| + return;
|
| + }
|
| + if (!SharedModuleInfo::IsSharedModule(imported_module)) {
|
| + ReportFailureFromUIThread(
|
| + CrxInstallerError(l10n_util::GetStringFUTF16(
|
| + IDS_EXTENSION_INSTALL_DEPENDENCY_NOT_SHARED_MODULE,
|
| + ASCIIToUTF16(i->extension_id))));
|
| + return;
|
| + }
|
| + }
|
| + }
|
| AddRef(); // Balanced in OnRequirementsChecked().
|
| requirements_checker_->Check(extension_,
|
| base::Bind(&CrxInstaller::OnRequirementsChecked,
|
| @@ -417,7 +447,7 @@ void CrxInstaller::CheckRequirements() {
|
| void CrxInstaller::OnRequirementsChecked(
|
| std::vector<std::string> requirement_errors) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - Release(); // Balanced in CheckRequirements().
|
| + Release(); // Balanced in CheckImportsAndRequirements().
|
| if (!requirement_errors.empty()) {
|
| if (error_on_unsupported_requirements_) {
|
| ReportFailureFromUIThread(CrxInstallerError(
|
|
|