blob: 323e08982b2d158ecba0d9b0d897775cd54ce054 [file] [log] [blame]
// Copyright 2014 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 <map>
#include <memory>
#include "base/macros.h"
#include "base/scoped_observer.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "extensions/browser/extension_registry_observer.h"
#include "extensions/common/extension_id.h"
namespace content {
class BrowserContext;
class NotificationDetails;
class NotificationSource;
namespace extensions {
class Extension;
class ExtensionRegistry;
class ExtensionPrefs;
class ExternalInstallError;
class ExternalInstallManager : public ExtensionRegistryObserver,
public content::NotificationObserver {
ExternalInstallManager(content::BrowserContext* browser_context,
bool is_first_run);
~ExternalInstallManager() override;
// Returns true if prompting for external extensions is enabled.
static bool IsPromptingEnabled();
// Removes the error associated with a given extension.
void RemoveExternalInstallError(const std::string& extension_id);
// Checks if there are any new external extensions to notify the user about.
void UpdateExternalExtensionAlert();
// Given a (presumably just-installed) extension id, mark that extension as
// acknowledged.
void AcknowledgeExternalExtension(const std::string& extension_id);
// Notifies the manager that |external_install_error| has changed its alert
// visibility.
void DidChangeInstallAlertVisibility(
ExternalInstallError* external_install_error,
bool visible);
bool has_currently_visible_install_alert() {
return currently_visible_install_alert_ != nullptr;
ExternalInstallError* currently_visible_install_alert_for_testing() const {
return currently_visible_install_alert_;
// Returns a mutable copy of the list of global errors for testing purposes.
std::vector<ExternalInstallError*> GetErrorsForTesting();
// Clears the record of shown IDs for testing.
void ClearShownIdsForTesting();
// ExtensionRegistryObserver implementation.
void OnExtensionLoaded(content::BrowserContext* browser_context,
const Extension* extension) override;
void OnExtensionInstalled(content::BrowserContext* browser_context,
const Extension* extension,
bool is_update) override;
void OnExtensionUninstalled(content::BrowserContext* browser_context,
const Extension* extension,
extensions::UninstallReason reason) override;
// content::NotificationObserver implementation.
void Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) override;
// Adds a global error informing the user that an external extension was
// installed. If |is_new_profile| is true, then this error is from the first
// time our profile checked for new extensions.
void AddExternalInstallError(const Extension* extension, bool is_new_profile);
// Returns true if this extension is an external one that has yet to be
// marked as acknowledged.
bool IsUnacknowledgedExternalExtension(const Extension& extension) const;
// The associated BrowserContext.
content::BrowserContext* browser_context_;
// Whether or not this is the first run for the profile.
bool is_first_run_;
// The associated ExtensionPrefs.
ExtensionPrefs* extension_prefs_;
// The collection of ExternalInstallErrors.
std::map<std::string, std::unique_ptr<ExternalInstallError>> errors_;
// The set of ids of unacknowledged external extensions. Populated at
// initialization, and then updated as extensions are added, removed,
// acknowledged, etc.
std::set<ExtensionId> unacknowledged_ids_;
// The set of ids of extensions that we have warned about in this session.
std::set<ExtensionId> shown_ids_;
// The error that is currently showing an alert dialog/bubble.
ExternalInstallError* currently_visible_install_alert_;
content::NotificationRegistrar registrar_;
ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
} // namespace extensions