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;
   }