|  | // Copyright 2014 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_ERROR_CONTROLLER_H_ | 
|  | #define CHROME_BROWSER_EXTENSIONS_EXTENSION_ERROR_CONTROLLER_H_ | 
|  |  | 
|  | #include <memory> | 
|  |  | 
|  | #include "base/memory/raw_ptr.h" | 
|  | #include "chrome/browser/extensions/extension_error_ui.h" | 
|  | #include "components/keyed_service/core/keyed_service.h" | 
|  | #include "extensions/buildflags/buildflags.h" | 
|  | #include "extensions/common/extension_set.h" | 
|  |  | 
|  | static_assert(BUILDFLAG(ENABLE_EXTENSIONS_CORE)); | 
|  |  | 
|  | namespace content { | 
|  | class BrowserContext; | 
|  | } | 
|  |  | 
|  | namespace extensions { | 
|  |  | 
|  | // The controller for the ExtensionErrorUI. This examines extensions for any | 
|  | // blocklisted or external extensions in order to notify the user with an error. | 
|  | // On acceptance, this will acknowledge the extensions. | 
|  | class ExtensionErrorController : public KeyedService, | 
|  | public ExtensionErrorUI::Delegate { | 
|  | public: | 
|  | typedef ExtensionErrorUI* (*UICreateMethod)(ExtensionErrorUI::Delegate*); | 
|  |  | 
|  | explicit ExtensionErrorController(content::BrowserContext* context); | 
|  |  | 
|  | ExtensionErrorController(const ExtensionErrorController&) = delete; | 
|  | ExtensionErrorController& operator=(const ExtensionErrorController&) = delete; | 
|  |  | 
|  | ~ExtensionErrorController() override; | 
|  |  | 
|  | // Specifies whether this is first run or not. | 
|  | void set_is_first_run(bool value) { is_first_run_ = value; } | 
|  |  | 
|  | void ShowErrorIfNeeded(); | 
|  |  | 
|  | // Returns the instance for the given `browser_context`. | 
|  | static ExtensionErrorController* Get( | 
|  | content::BrowserContext* browser_context); | 
|  |  | 
|  | // Set the factory method for creating a new ExtensionErrorUI. | 
|  | static void SetUICreateMethodForTesting(UICreateMethod method); | 
|  |  | 
|  | private: | 
|  | // ExtensionErrorUI::Delegate implementation: | 
|  | content::BrowserContext* GetContext() override; | 
|  | const ExtensionSet& GetBlocklistedExtensions() override; | 
|  | void OnAlertDetails() override; | 
|  | void OnAlertAccept() override; | 
|  | void OnAlertClosed() override; | 
|  |  | 
|  | // Find any extensions that the user should be alerted about (like blocklisted | 
|  | // extensions). | 
|  | void IdentifyAlertableExtensions(); | 
|  |  | 
|  | // The extensions that are blocklisted and need user approval. | 
|  | ExtensionSet blocklisted_extensions_; | 
|  |  | 
|  | // The UI component of this controller. | 
|  | std::unique_ptr<ExtensionErrorUI> error_ui_; | 
|  |  | 
|  | // The BrowserContext with which we are associated. | 
|  | raw_ptr<content::BrowserContext> browser_context_; | 
|  |  | 
|  | // Whether or not this is the first run. If it is, we avoid noisy errors, and | 
|  | // silently acknowledge blocklisted extensions. | 
|  | bool is_first_run_; | 
|  | }; | 
|  |  | 
|  | }  // namespace extensions | 
|  |  | 
|  | #endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_ERROR_CONTROLLER_H_ |