blob: 8c2bd948bd5e4cd498b5d4e52970d9e07be53bc9 [file] [log] [blame]
// 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 EXTENSIONS_BROWSER_WARNING_SERVICE_H_
#define EXTENSIONS_BROWSER_WARNING_SERVICE_H_
#include <set>
#include <string>
#include <vector>
#include "base/observer_list.h"
#include "base/scoped_observer.h"
#include "components/keyed_service/core/keyed_service.h"
#include "extensions/browser/extension_registry_observer.h"
#include "extensions/browser/warning_set.h"
// TODO(battre) Remove the Extension prefix.
namespace content {
class BrowserContext;
}
namespace extensions {
class ExtensionRegistry;
// Manages a set of warnings caused by extensions. These warnings (e.g.
// conflicting modifications of network requests by extensions, slow extensions,
// etc.) trigger a warning badge in the UI and and provide means to resolve
// them. This class must be used on the UI thread only.
class WarningService : public KeyedService, public ExtensionRegistryObserver {
public:
class Observer {
public:
virtual void ExtensionWarningsChanged(
const ExtensionIdSet& affected_extensions) = 0;
};
// |browser_context| may be NULL for testing. In this case, be sure to not
// insert any warnings.
explicit WarningService(content::BrowserContext* browser_context);
~WarningService() override;
// Get the instance of the WarningService for |browser_context|.
// Redirected in incognito.
static WarningService* Get(content::BrowserContext* browser_context);
// Clears all warnings of types contained in |types| and notifies observers
// of the changed warnings.
void ClearWarnings(const std::set<Warning::WarningType>& types);
// Returns all types of warnings effecting extension |extension_id|.
std::set<Warning::WarningType> GetWarningTypesAffectingExtension(
const std::string& extension_id) const;
// Returns all localized warnings for extension |extension_id| in |result|.
std::vector<std::string> GetWarningMessagesForExtension(
const std::string& extension_id) const;
const WarningSet& warnings() const { return warnings_; }
// Adds a set of warnings and notifies observers if any warning is new.
void AddWarnings(const WarningSet& warnings);
// Notifies the WarningService of browser_context |browser_context_id| that
// new |warnings| occurred and triggers a warning badge.
static void NotifyWarningsOnUI(void* profile_id, const WarningSet& warnings);
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
private:
void NotifyWarningsChanged(const ExtensionIdSet& affected_extensions);
// ExtensionRegistryObserver implementation.
void OnExtensionUnloaded(content::BrowserContext* browser_context,
const Extension* extension,
UnloadedExtensionReason reason) override;
// Currently existing warnings.
WarningSet warnings_;
content::BrowserContext* const browser_context_;
// Listen to extension unloaded notifications.
ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
extension_registry_observer_;
base::ObserverList<Observer>::Unchecked observer_list_;
};
} // namespace extensions
#endif // EXTENSIONS_BROWSER_WARNING_SERVICE_H_