Move ChromeRequirementsChecker to //extensions as a PreloadCheck
Remove the "Chrome" from ChromeRequirementsChecker. Make it implement
PreloadCheck and simplify its async logic a bit. Transform
RequirementsCheckerBrowserTest to a unit test.
This lets AppShell and other modules use RequirementsChecker. (This
wasn't possible until GPUFeatureChecker was moved to //content in
http://crrev.com/2666243002.)
BUG=679971
[email protected]
[email protected]
Review-Url: https://codereview.chromium.org/2783813002
Cr-Commit-Position: refs/heads/master@{#462607}
diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn
index 6ef51a2..cc6a1797 100644
--- a/chrome/browser/extensions/BUILD.gn
+++ b/chrome/browser/extensions/BUILD.gn
@@ -487,8 +487,6 @@
"chrome_mojo_service_registration.h",
"chrome_process_manager_delegate.cc",
"chrome_process_manager_delegate.h",
- "chrome_requirements_checker.cc",
- "chrome_requirements_checker.h",
"chrome_url_request_util.cc",
"chrome_url_request_util.h",
"clipboard_extension_helper_chromeos.cc",
diff --git a/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc b/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
index 9d52108..8fd3eff 100644
--- a/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
+++ b/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
@@ -10,7 +10,6 @@
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/extensions/bookmark_app_helper.h"
#include "chrome/browser/extensions/chrome_extension_function_details.h"
-#include "chrome/browser/extensions/chrome_requirements_checker.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_util.h"
#include "chrome/browser/extensions/launch_util.h"
@@ -225,11 +224,6 @@
web_contents, browser_context, extension, callback));
}
-std::unique_ptr<extensions::RequirementsChecker>
-ChromeManagementAPIDelegate::CreateRequirementsChecker() const {
- return base::MakeUnique<extensions::ChromeRequirementsChecker>();
-}
-
std::unique_ptr<extensions::UninstallDialogDelegate>
ChromeManagementAPIDelegate::UninstallFunctionDelegate(
extensions::ManagementUninstallFunctionBase* function,
diff --git a/chrome/browser/extensions/api/management/chrome_management_api_delegate.h b/chrome/browser/extensions/api/management/chrome_management_api_delegate.h
index 6c12736..dec9423 100644
--- a/chrome/browser/extensions/api/management/chrome_management_api_delegate.h
+++ b/chrome/browser/extensions/api/management/chrome_management_api_delegate.h
@@ -31,8 +31,6 @@
content::BrowserContext* browser_context,
const extensions::Extension* extension,
const base::Callback<void(bool)>& callback) const override;
- std::unique_ptr<extensions::RequirementsChecker> CreateRequirementsChecker()
- const override;
std::unique_ptr<extensions::UninstallDialogDelegate>
UninstallFunctionDelegate(
extensions::ManagementUninstallFunctionBase* function,
diff --git a/chrome/browser/extensions/chrome_requirements_checker.cc b/chrome/browser/extensions/chrome_requirements_checker.cc
deleted file mode 100644
index 3aeacef..0000000
--- a/chrome/browser/extensions/chrome_requirements_checker.cc
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/extensions/chrome_requirements_checker.h"
-
-#include "base/bind.h"
-#include "build/build_config.h"
-#include "chrome/grit/generated_resources.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/gpu_feature_checker.h"
-#include "extensions/common/extension.h"
-#include "extensions/common/manifest.h"
-#include "extensions/common/manifest_handlers/requirements_info.h"
-#include "gpu/config/gpu_feature_type.h"
-#include "ui/base/l10n/l10n_util.h"
-
-namespace extensions {
-
-ChromeRequirementsChecker::ChromeRequirementsChecker()
- : pending_requirement_checks_(0), weak_ptr_factory_(this) {
-}
-
-ChromeRequirementsChecker::~ChromeRequirementsChecker() {
-}
-
-void ChromeRequirementsChecker::Check(
- const scoped_refptr<const Extension>& extension,
- const RequirementsCheckedCallback& callback) {
- DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-
- callback_ = callback;
- const RequirementsInfo& requirements =
- RequirementsInfo::GetRequirements(extension.get());
-
- if (requirements.npapi) {
-#if defined(OS_POSIX) && !defined(OS_MACOSX)
- errors_.push_back(
- l10n_util::GetStringUTF8(IDS_EXTENSION_NPAPI_NOT_SUPPORTED));
-#endif
- }
-
- if (requirements.window_shape) {
-#if !defined(USE_AURA)
- errors_.push_back(
- l10n_util::GetStringUTF8(IDS_EXTENSION_WINDOW_SHAPE_NOT_SUPPORTED));
-#endif
- }
-
- if (requirements.webgl) {
- ++pending_requirement_checks_;
- webgl_checker_ = content::GpuFeatureChecker::Create(
- gpu::GPU_FEATURE_TYPE_ACCELERATED_WEBGL,
- base::Bind(&ChromeRequirementsChecker::SetWebGLAvailability,
- weak_ptr_factory_.GetWeakPtr()));
- }
-
- if (pending_requirement_checks_ == 0) {
- content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
- base::Bind(callback_, errors_));
- // Reset the callback so any ref-counted bound parameters will get released.
- callback_.Reset();
- return;
- }
- // Running the GPU checkers down here removes any race condition that arises
- // from the use of pending_requirement_checks_.
- if (webgl_checker_.get())
- webgl_checker_->CheckGpuFeatureAvailability();
-}
-
-void ChromeRequirementsChecker::SetWebGLAvailability(bool available) {
- if (!available) {
- errors_.push_back(
- l10n_util::GetStringUTF8(IDS_EXTENSION_WEBGL_NOT_SUPPORTED));
- }
- MaybeRunCallback();
-}
-
-void ChromeRequirementsChecker::MaybeRunCallback() {
- if (--pending_requirement_checks_ == 0) {
- content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
- base::Bind(callback_, errors_));
- // Reset the callback so any ref-counted bound parameters will get released.
- callback_.Reset();
- errors_.clear();
- }
-}
-
-} // namespace extensions
diff --git a/chrome/browser/extensions/chrome_requirements_checker.h b/chrome/browser/extensions/chrome_requirements_checker.h
deleted file mode 100644
index 07304e9..0000000
--- a/chrome/browser/extensions/chrome_requirements_checker.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_EXTENSIONS_CHROME_REQUIREMENTS_CHECKER_H_
-#define CHROME_BROWSER_EXTENSIONS_CHROME_REQUIREMENTS_CHECKER_H_
-
-#include <vector>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "extensions/browser/requirements_checker.h"
-
-namespace content {
-class GpuFeatureChecker;
-}
-
-namespace extensions {
-class Extension;
-
-// Validates the 'requirements' extension manifest field. This is an
-// asynchronous process that involves several threads, but the public interface
-// of this class (including constructor and destructor) must only be used on
-// the UI thread.
-class ChromeRequirementsChecker : public RequirementsChecker {
- public:
- ChromeRequirementsChecker();
- ~ChromeRequirementsChecker() override;
-
- private:
- // RequirementsChecker:
- void Check(const scoped_refptr<const Extension>& extension,
- const RequirementsCheckedCallback& callback) override;
-
- // Callbacks for the GpuFeatureChecker.
- void SetWebGLAvailability(bool available);
-
- void MaybeRunCallback();
-
- std::vector<std::string> errors_;
-
- // Every requirement that needs to be resolved asynchronously will add to
- // this counter. When the counter is depleted, the callback will be run.
- int pending_requirement_checks_;
-
- scoped_refptr<content::GpuFeatureChecker> webgl_checker_;
-
- RequirementsCheckedCallback callback_;
-
- base::WeakPtrFactory<ChromeRequirementsChecker> weak_ptr_factory_;
-
- DISALLOW_COPY_AND_ASSIGN(ChromeRequirementsChecker);
-};
-
-} // namespace extensions
-
-#endif // CHROME_BROWSER_EXTENSIONS_CHROME_REQUIREMENTS_CHECKER_H_
diff --git a/chrome/browser/extensions/crx_installer.cc b/chrome/browser/extensions/crx_installer.cc
index beb79a7..05462ce 100644
--- a/chrome/browser/extensions/crx_installer.cc
+++ b/chrome/browser/extensions/crx_installer.cc
@@ -526,12 +526,11 @@
return;
// Check for requirement errors.
- if (!install_checker_->requirement_errors().empty()) {
+ if (!install_checker_->requirements_error_message().empty()) {
if (error_on_unsupported_requirements_) {
ReportFailureFromUIThread(
CrxInstallError(CrxInstallError::ERROR_DECLINED,
- base::UTF8ToUTF16(base::JoinString(
- install_checker_->requirement_errors(), " "))));
+ install_checker_->requirements_error_message()));
return;
}
install_flags_ |= kInstallFlagHasRequirementErrors;
@@ -569,9 +568,8 @@
// Note: |client_| can be NULL in unit_tests!
if (extension()->from_webstore() && client_)
client_->install_ui()->SetSkipPostInstallUI(true);
- ReportFailureFromUIThread(
- CrxInstallError(CrxInstallError::ERROR_DECLINED,
- base::UTF8ToUTF16(install_checker_->policy_error())));
+ ReportFailureFromUIThread(CrxInstallError(
+ CrxInstallError::ERROR_DECLINED, install_checker_->policy_error()));
return;
}
diff --git a/chrome/browser/extensions/extension_install_checker.cc b/chrome/browser/extensions/extension_install_checker.cc
index 8117973..d529647e 100644
--- a/chrome/browser/extensions/extension_install_checker.cc
+++ b/chrome/browser/extensions/extension_install_checker.cc
@@ -10,11 +10,11 @@
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/extensions/blacklist.h"
#include "chrome/browser/extensions/blacklist_check.h"
-#include "chrome/browser/extensions/chrome_requirements_checker.h"
#include "chrome/browser/profiles/profile.h"
#include "content/public/browser/browser_thread.h"
#include "extensions/browser/extension_system.h"
#include "extensions/browser/policy_check.h"
+#include "extensions/browser/requirements_checker.h"
namespace extensions {
@@ -72,7 +72,7 @@
void ExtensionInstallChecker::CheckManagementPolicy() {
// In tests, this check may already be stubbed.
if (!policy_check_)
- policy_check_ = base::MakeUnique<PolicyCheck>(profile_, extension_.get());
+ policy_check_ = base::MakeUnique<PolicyCheck>(profile_, extension_);
policy_check_->Start(
base::BindOnce(&ExtensionInstallChecker::OnManagementPolicyCheckDone,
weak_ptr_factory_.GetWeakPtr()));
@@ -82,7 +82,7 @@
PreloadCheck::Errors errors) {
if (!errors.empty()) {
DCHECK_EQ(1u, errors.count(PreloadCheck::DISALLOWED_BY_POLICY));
- policy_error_ = base::UTF16ToUTF8(policy_check_->GetErrorMessage());
+ policy_error_ = policy_check_->GetErrorMessage();
}
running_checks_ &= ~CHECK_MANAGEMENT_POLICY;
@@ -90,17 +90,19 @@
}
void ExtensionInstallChecker::CheckRequirements() {
- requirements_checker_ = base::MakeUnique<ChromeRequirementsChecker>();
- requirements_checker_->Check(
- extension_, base::Bind(&ExtensionInstallChecker::OnRequirementsCheckDone,
- weak_ptr_factory_.GetWeakPtr()));
+ // In tests, this check may already be stubbed.
+ if (!requirements_check_)
+ requirements_check_ = base::MakeUnique<RequirementsChecker>(extension_);
+ requirements_check_->Start(
+ base::BindOnce(&ExtensionInstallChecker::OnRequirementsCheckDone,
+ weak_ptr_factory_.GetWeakPtr()));
}
void ExtensionInstallChecker::OnRequirementsCheckDone(
- const std::vector<std::string>& errors) {
+ PreloadCheck::Errors errors) {
DCHECK(is_running());
- requirement_errors_ = errors;
+ requirements_error_message_ = requirements_check_->GetErrorMessage();
running_checks_ &= ~CHECK_REQUIREMENTS;
MaybeInvokeCallback();
@@ -109,8 +111,8 @@
void ExtensionInstallChecker::CheckBlacklistState() {
// In tests, this check may already be stubbed.
if (!blacklist_check_) {
- blacklist_check_ = base::MakeUnique<BlacklistCheck>(
- Blacklist::Get(profile_), extension_.get());
+ blacklist_check_ =
+ base::MakeUnique<BlacklistCheck>(Blacklist::Get(profile_), extension_);
}
blacklist_check_->Start(
base::BindOnce(&ExtensionInstallChecker::OnBlacklistStateCheckDone,
@@ -140,7 +142,7 @@
int failed_mask = 0;
if (blacklist_error_ == PreloadCheck::BLACKLISTED_ID)
failed_mask |= CHECK_BLACKLIST;
- if (!requirement_errors_.empty())
+ if (!requirements_error_message_.empty())
failed_mask |= CHECK_REQUIREMENTS;
if (!policy_error_.empty())
failed_mask |= CHECK_MANAGEMENT_POLICY;
@@ -153,7 +155,7 @@
// If we are failing fast, discard any pending results.
blacklist_check_.reset();
policy_check_.reset();
- requirements_checker_.reset();
+ requirements_check_.reset();
weak_ptr_factory_.InvalidateWeakPtrs();
base::ResetAndReturn(&callback_).Run(failed_mask);
}
diff --git a/chrome/browser/extensions/extension_install_checker.h b/chrome/browser/extensions/extension_install_checker.h
index 17da2427..767c466 100644
--- a/chrome/browser/extensions/extension_install_checker.h
+++ b/chrome/browser/extensions/extension_install_checker.h
@@ -20,8 +20,6 @@
namespace extensions {
-class RequirementsChecker;
-
// Performs common checks for validating whether an extension may be installed.
// This class should be Start()-ed at most once.
class ExtensionInstallChecker {
@@ -60,10 +58,9 @@
// Returns true if any checks are currently running.
bool is_running() const { return running_checks_ != 0; }
- // Returns the requirement violations. A non-empty list is considered to be
- // a check failure.
- const std::vector<std::string>& requirement_errors() const {
- return requirement_errors_;
+ // Returns the error message for requirement violations, if any were found.
+ const base::string16& requirements_error_message() const {
+ return requirements_error_message_;
}
// Returns the blacklist error of the extension. Note that there is only an
@@ -71,7 +68,7 @@
PreloadCheck::Error blacklist_error() const { return blacklist_error_; }
// Returns whether management policy permits installation of the extension.
- const std::string& policy_error() const { return policy_error_; }
+ const base::string16& policy_error() const { return policy_error_; }
void SetBlacklistCheckForTesting(std::unique_ptr<PreloadCheck> policy_check) {
blacklist_check_ = std::move(policy_check);
@@ -79,13 +76,17 @@
void SetPolicyCheckForTesting(std::unique_ptr<PreloadCheck> policy_check) {
policy_check_ = std::move(policy_check);
}
+ void SetRequirementsCheckForTesting(
+ std::unique_ptr<PreloadCheck> requirements_check) {
+ requirements_check_ = std::move(requirements_check);
+ }
protected:
virtual void CheckManagementPolicy();
void OnManagementPolicyCheckDone(PreloadCheck::Errors errors);
virtual void CheckRequirements();
- void OnRequirementsCheckDone(const std::vector<std::string>& errors);
+ void OnRequirementsCheckDone(PreloadCheck::Errors errors);
virtual void CheckBlacklistState();
void OnBlacklistStateCheckDone(PreloadCheck::Errors errors);
@@ -100,8 +101,8 @@
scoped_refptr<const Extension> extension_;
// Checks requirements specified in the manifest.
- std::unique_ptr<RequirementsChecker> requirements_checker_;
- std::vector<std::string> requirement_errors_;
+ std::unique_ptr<PreloadCheck> requirements_check_;
+ base::string16 requirements_error_message_;
// Checks if the extension is blacklisted.
std::unique_ptr<PreloadCheck> blacklist_check_;
@@ -109,7 +110,7 @@
// Checks whether management policies allow the extension to be installed.
std::unique_ptr<PreloadCheck> policy_check_;
- std::string policy_error_;
+ base::string16 policy_error_;
// Bitmask of enabled checks.
int enabled_checks_;
diff --git a/chrome/browser/extensions/extension_install_checker_unittest.cc b/chrome/browser/extensions/extension_install_checker_unittest.cc
index 36307ff..5c4238a4 100644
--- a/chrome/browser/extensions/extension_install_checker_unittest.cc
+++ b/chrome/browser/extensions/extension_install_checker_unittest.cc
@@ -34,41 +34,13 @@
~ExtensionInstallCheckerForTest() override {}
- void set_requirements_error(const std::string& error) {
- requirements_error_ = error;
- }
-
bool is_async() const { return is_async_; }
void set_is_async(bool is_async) { is_async_ = is_async; }
- protected:
- void MockCheckRequirements() {
- if (!is_running())
- return;
- std::vector<std::string> errors;
- if (!requirements_error_.empty())
- errors.push_back(requirements_error_);
- OnRequirementsCheckDone(errors);
- }
-
- void CheckRequirements() override {
- if (is_async_) {
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE,
- base::Bind(&ExtensionInstallCheckerForTest::MockCheckRequirements,
- base::Unretained(this)));
- } else {
- MockCheckRequirements();
- }
- }
-
private:
// Whether to run the requirements and blacklist checks asynchronously, as
// they often do in ExtensionInstallChecker.
bool is_async_ = false;
-
- // Dummy error for testing.
- std::string requirements_error_;
};
class CheckObserver {
@@ -121,29 +93,41 @@
checker->SetPolicyCheckForTesting(std::move(policy_check));
}
+ void SetRequirementsError(ExtensionInstallCheckerForTest* checker,
+ PreloadCheck::Error error,
+ const std::string& message) {
+ auto requirements_check = base::MakeUnique<PreloadCheckStub>();
+ requirements_check->set_is_async(checker->is_async());
+ if (error != PreloadCheck::NONE) {
+ requirements_check->AddError(error);
+ requirements_check->set_error_message(base::UTF8ToUTF16(message));
+ }
+ checker->SetRequirementsCheckForTesting(std::move(requirements_check));
+ }
+
protected:
void SetAllPass(ExtensionInstallCheckerForTest* checker) {
SetBlacklistError(checker, PreloadCheck::NONE);
SetPolicyError(checker, PreloadCheck::NONE, "");
- checker->set_requirements_error("");
+ SetRequirementsError(checker, PreloadCheck::NONE, "");
}
void SetAllErrors(ExtensionInstallCheckerForTest* checker) {
SetBlacklistError(checker, kBlacklistError);
SetPolicyError(checker, PreloadCheck::DISALLOWED_BY_POLICY,
kDummyPolicyError);
- checker->set_requirements_error(kDummyRequirementsError);
+ SetRequirementsError(checker, PreloadCheck::NPAPI_NOT_SUPPORTED,
+ kDummyRequirementsError);
}
void ExpectRequirementsPass(const ExtensionInstallCheckerForTest& checker) {
- EXPECT_TRUE(checker.requirement_errors().empty());
+ EXPECT_EQ(base::string16(), checker.requirements_error_message());
}
void ExpectRequirementsError(const char* expected_error,
const ExtensionInstallCheckerForTest& checker) {
- EXPECT_FALSE(checker.requirement_errors().empty());
- EXPECT_EQ(std::string(expected_error),
- checker.requirement_errors().front());
+ EXPECT_EQ(base::UTF8ToUTF16(expected_error),
+ checker.requirements_error_message());
}
void ExpectRequirementsError(const ExtensionInstallCheckerForTest& checker) {
@@ -165,7 +149,7 @@
void ExpectPolicyError(const char* expected_error,
const ExtensionInstallCheckerForTest& checker) {
EXPECT_FALSE(checker.policy_error().empty());
- EXPECT_EQ(std::string(expected_error), checker.policy_error());
+ EXPECT_EQ(base::UTF8ToUTF16(expected_error), checker.policy_error());
}
void ExpectPolicyError(const ExtensionInstallCheckerForTest& checker) {
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
index 06617e6d..9338f19 100644
--- a/chrome/browser/extensions/extension_service.cc
+++ b/chrome/browser/extensions/extension_service.cc
@@ -654,7 +654,9 @@
extensions::UnpackedInstaller::Create(this)->LoadFromCommandLine(
base::FilePath(t.token()), &extension_id, false /*only-allow-apps*/);
// Extension id is added to whitelist after its extension is loaded
- // because code is executed asynchronously.
+ // because code is executed asynchronously. TODO(michaelpg): Remove this
+ // assumption so loading extensions does not have to be asynchronous:
+ // crbug.com/708354.
if (switch_name == switches::kDisableExtensionsExcept)
disable_flag_exempted_extensions_.insert(extension_id);
}
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc
index ee94ed9..d1e8c5e4 100644
--- a/chrome/browser/extensions/extension_service_unittest.cc
+++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -78,7 +78,6 @@
#include "chrome/browser/ui/global_error/global_error_service_factory.h"
#include "chrome/common/chrome_constants.h"
#include "chrome/common/chrome_switches.h"
-#include "chrome/common/extensions/api/plugins/plugins_handler.h"
#include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
#include "chrome/common/extensions/manifest_handlers/content_scripts_handler.h"
#include "chrome/common/pref_names.h"
@@ -123,6 +122,7 @@
#include "extensions/common/manifest_constants.h"
#include "extensions/common/manifest_handlers/background_info.h"
#include "extensions/common/manifest_handlers/permissions_parser.h"
+#include "extensions/common/manifest_handlers/plugins_handler.h"
#include "extensions/common/manifest_url_handlers.h"
#include "extensions/common/permissions/permission_set.h"
#include "extensions/common/permissions/permissions_data.h"
diff --git a/chrome/browser/extensions/plugin_manager.cc b/chrome/browser/extensions/plugin_manager.cc
index 0b9d50e..688f79f 100644
--- a/chrome/browser/extensions/plugin_manager.cc
+++ b/chrome/browser/extensions/plugin_manager.cc
@@ -2,21 +2,22 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "chrome/browser/extensions/plugin_manager.h"
+
#include "base/files/file_path.h"
#include "base/lazy_instance.h"
#include "base/path_service.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/plugin_manager.h"
#include "chrome/browser/plugins/chrome_plugin_service_filter.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/chrome_paths.h"
-#include "chrome/common/extensions/api/plugins/plugins_handler.h"
#include "content/public/browser/plugin_service.h"
#include "content/public/common/pepper_plugin_info.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/common/extension.h"
#include "extensions/common/manifest_handlers/mime_types_handler.h"
+#include "extensions/common/manifest_handlers/plugins_handler.h"
#include "url/gurl.h"
#if !defined(DISABLE_NACL)
diff --git a/chrome/browser/extensions/requirements_checker_browsertest.cc b/chrome/browser/extensions/requirements_checker_browsertest.cc
deleted file mode 100644
index d8d40e4a..0000000
--- a/chrome/browser/extensions/requirements_checker_browsertest.cc
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <vector>
-
-#include "base/bind.h"
-#include "base/files/file_path.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "base/path_service.h"
-#include "base/strings/string_util.h"
-#include "build/build_config.h"
-#include "chrome/browser/extensions/chrome_requirements_checker.h"
-#include "chrome/browser/extensions/extension_browsertest.h"
-#include "chrome/common/chrome_paths.h"
-#include "chrome/grit/generated_resources.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/gpu_data_manager.h"
-#include "content/public/test/test_utils.h"
-#include "extensions/common/extension.h"
-#include "extensions/common/file_util.h"
-#include "ui/base/l10n/l10n_util.h"
-
-namespace extensions {
-
-class RequirementsCheckerBrowserTest : public ExtensionBrowserTest {
- public:
- RequirementsCheckerBrowserTest()
- : checker_(new ChromeRequirementsChecker()) {}
-
- scoped_refptr<const Extension> LoadExtensionFromDirName(
- const std::string& extension_dir_name) {
- base::FilePath extension_path;
- std::string load_error;
- PathService::Get(chrome::DIR_TEST_DATA, &extension_path);
- extension_path = extension_path.AppendASCII("requirements_checker")
- .AppendASCII(extension_dir_name);
- scoped_refptr<const Extension> extension = file_util::LoadExtension(
- extension_path, Manifest::UNPACKED, 0, &load_error);
- CHECK_EQ(0U, load_error.length());
- return extension;
- }
-
- void ValidateRequirementErrors(
- const std::vector<std::string>& expected_errors,
- const std::vector<std::string>& actual_errors) {
- ASSERT_EQ(expected_errors, actual_errors);
- }
-
- protected:
- std::unique_ptr<RequirementsChecker> checker_;
-};
-
-IN_PROC_BROWSER_TEST_F(RequirementsCheckerBrowserTest, CheckEmptyExtension) {
- scoped_refptr<const Extension> extension(
- LoadExtensionFromDirName("no_requirements"));
- ASSERT_TRUE(extension.get());
- checker_->Check(extension, base::Bind(
- &RequirementsCheckerBrowserTest::ValidateRequirementErrors,
- base::Unretained(this), std::vector<std::string>()));
- content::RunAllBlockingPoolTasksUntilIdle();
-}
-
-IN_PROC_BROWSER_TEST_F(RequirementsCheckerBrowserTest, CheckNpapiExtension) {
- scoped_refptr<const Extension> extension(
- LoadExtensionFromDirName("require_npapi"));
- ASSERT_TRUE(extension.get());
-
- std::vector<std::string> expected_errors;
-#if defined(OS_POSIX) && !defined(OS_MACOSX)
- expected_errors.push_back(l10n_util::GetStringUTF8(
- IDS_EXTENSION_NPAPI_NOT_SUPPORTED));
-#endif
-
- checker_->Check(extension, base::Bind(
- &RequirementsCheckerBrowserTest::ValidateRequirementErrors,
- base::Unretained(this), expected_errors));
- content::RunAllBlockingPoolTasksUntilIdle();
-}
-
-IN_PROC_BROWSER_TEST_F(RequirementsCheckerBrowserTest,
- CheckWindowShapeExtension) {
- scoped_refptr<const Extension> extension(
- LoadExtensionFromDirName("require_window_shape"));
- ASSERT_TRUE(extension.get());
-
- std::vector<std::string> expected_errors;
-#if !defined(USE_AURA)
- expected_errors.push_back(l10n_util::GetStringUTF8(
- IDS_EXTENSION_WINDOW_SHAPE_NOT_SUPPORTED));
-#endif // !defined(USE_AURA)
-
- checker_->Check(extension, base::Bind(
- &RequirementsCheckerBrowserTest::ValidateRequirementErrors,
- base::Unretained(this), expected_errors));
- content::RunAllBlockingPoolTasksUntilIdle();
-}
-
-IN_PROC_BROWSER_TEST_F(RequirementsCheckerBrowserTest, DisallowWebGL) {
- scoped_refptr<const Extension> extension(
- LoadExtensionFromDirName("require_3d"));
- ASSERT_TRUE(extension.get());
-
- content::GpuDataManager::GetInstance()->BlacklistWebGLForTesting();
- content::RunAllBlockingPoolTasksUntilIdle();
-
- std::vector<std::string> expected_errors;
- expected_errors.push_back(l10n_util::GetStringUTF8(
- IDS_EXTENSION_WEBGL_NOT_SUPPORTED));
-
- checker_->Check(extension, base::Bind(
- &RequirementsCheckerBrowserTest::ValidateRequirementErrors,
- base::Unretained(this), expected_errors));
- content::RunAllBlockingPoolTasksUntilIdle();
-}
-
-IN_PROC_BROWSER_TEST_F(RequirementsCheckerBrowserTest, Check3DExtension) {
- scoped_refptr<const Extension> extension(
- LoadExtensionFromDirName("require_3d"));
- ASSERT_TRUE(extension.get());
-
- std::vector<std::string> expected_errors;
-
- if (!content::GpuDataManager::GetInstance()->GpuAccessAllowed(NULL)) {
- expected_errors.push_back(l10n_util::GetStringUTF8(
- IDS_EXTENSION_WEBGL_NOT_SUPPORTED));
- }
-
- checker_->Check(extension, base::Bind(
- &RequirementsCheckerBrowserTest::ValidateRequirementErrors,
- base::Unretained(this), expected_errors));
- content::RunAllBlockingPoolTasksUntilIdle();
-}
-
-} // namespace extensions
diff --git a/chrome/browser/extensions/unpacked_installer.cc b/chrome/browser/extensions/unpacked_installer.cc
index 148113f3..0d93fcc 100644
--- a/chrome/browser/extensions/unpacked_installer.cc
+++ b/chrome/browser/extensions/unpacked_installer.cc
@@ -8,7 +8,9 @@
#include "base/callback.h"
#include "base/files/file_util.h"
#include "base/memory/ptr_util.h"
+#include "base/strings/string16.h"
#include "base/strings/string_util.h"
+#include "base/strings/utf_string_conversions.h"
#include "base/threading/thread_restrictions.h"
#include "chrome/browser/extensions/extension_error_reporter.h"
#include "chrome/browser/extensions/extension_install_checker.h"
@@ -18,7 +20,6 @@
#include "chrome/browser/extensions/permissions_updater.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/extensions/extension_install_ui_factory.h"
-#include "chrome/common/extensions/api/plugins/plugins_handler.h"
#include "components/crx_file/id_util.h"
#include "components/sync/model/string_ordinal.h"
#include "content/public/browser/browser_thread.h"
@@ -30,6 +31,7 @@
#include "extensions/common/extension_l10n_util.h"
#include "extensions/common/file_util.h"
#include "extensions/common/manifest.h"
+#include "extensions/common/manifest_handlers/plugins_handler.h"
#include "extensions/common/manifest_handlers/shared_module_info.h"
#include "extensions/common/permissions/permissions_data.h"
@@ -253,14 +255,12 @@
void UnpackedInstaller::OnInstallChecksComplete(int failed_checks) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- if (!install_checker_->policy_error().empty()) {
- ReportExtensionLoadError(install_checker_->policy_error());
- return;
- }
+ base::string16 error_message = install_checker_->policy_error();
+ if (error_message.empty())
+ error_message = install_checker_->requirements_error_message();
- if (!install_checker_->requirement_errors().empty()) {
- ReportExtensionLoadError(
- base::JoinString(install_checker_->requirement_errors(), " "));
+ if (!error_message.empty()) {
+ ReportExtensionLoadError(base::UTF16ToUTF8(error_message));
return;
}