blob: 668f7401dce0a24fa0403c7de4aa642cd4ecc963 [file] [log] [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef EXTENSIONS_BROWSER_API_CONTENT_SETTINGS_CONTENT_SETTINGS_STORE_H_
#define EXTENSIONS_BROWSER_API_CONTENT_SETTINGS_CONTENT_SETTINGS_STORE_H_
#include <map>
#include <memory>
#include <string>
#include <vector>
#include "base/memory/ref_counted.h"
#include "base/observer_list.h"
#include "base/synchronization/lock.h"
#include "base/threading/thread_checker.h"
#include "base/time/time.h"
#include "base/values.h"
#include "components/content_settings/core/common/content_settings.h"
#include "extensions/common/api/types.h"
#include "extensions/common/extension_id.h"
class GURL;
class ContentSettingsPattern;
namespace content_settings {
class OriginValueMap;
class RuleIterator;
struct Rule;
}
namespace extensions {
// This class is the backend for extension-defined content settings. It is used
// by the content_settings::CustomExtensionProvider to integrate its settings
// into the HostContentSettingsMap and by the content settings extension API to
// provide extensions with access to content settings.
class ContentSettingsStore
: public base::RefCountedThreadSafe<ContentSettingsStore> {
public:
using ChromeSettingScope = extensions::api::types::ChromeSettingScope;
class Observer {
public:
virtual ~Observer() = default;
// Called when a content setting changes in the
// ContentSettingsStore.
virtual void OnContentSettingChanged(const ExtensionId& extension_id,
bool incognito) = 0;
};
static constexpr char kContentSettingKey[] = "setting";
static constexpr char kContentSettingsTypeKey[] = "type";
static constexpr char kPrimaryPatternKey[] = "primaryPattern";
static constexpr char kSecondaryPatternKey[] = "secondaryPattern";
ContentSettingsStore();
ContentSettingsStore(const ContentSettingsStore&) = delete;
ContentSettingsStore& operator=(const ContentSettingsStore&) = delete;
// //////////////////////////////////////////////////////////////////////////
// See GetRuleIterator::GetRuleIterator().
std::unique_ptr<content_settings::RuleIterator> GetRuleIterator(
ContentSettingsType type,
bool incognito) const;
// See GetRuleIterator::GetRule().
std::unique_ptr<content_settings::Rule> GetRule(
const GURL& primary_url,
const GURL& secondary_url,
ContentSettingsType content_type,
bool off_the_record) const;
// Sets the content `setting` for `pattern` of extension `ext_id`. The
// `incognito` flag allow to set whether the provided setting is for
// incognito mode only.
// Precondition: the extension must be registered.
// This method should only be called on the UI thread.
// This method is called on startup to load from extension prefs. This method
// is called each time an extension changes content settings.
void SetExtensionContentSetting(
const std::string& ext_id,
const ContentSettingsPattern& embedded_pattern,
const ContentSettingsPattern& top_level_pattern,
ContentSettingsType type,
ContentSetting setting,
ChromeSettingScope scope);
// Clears all contents settings set by the extension `ext_id`.
void ClearContentSettingsForExtension(const std::string& ext_id,
ChromeSettingScope scope);
// Clears all contents settings set by the extension `ext_id` for the
// content type `content_type`.
void ClearContentSettingsForExtensionAndContentType(
const std::string& ext_id,
ChromeSettingScope scope,
ContentSettingsType content_type);
// Serializes all content settings set by the extension with ID `extension_id`
// and returns them as a list of Values.
base::Value::List GetSettingsForExtension(const ExtensionId& extension_id,
ChromeSettingScope scope) const;
// Deserializes content settings rules from `list` and applies them as set by
// the extension with ID `extension_id`.
void SetExtensionContentSettingFromList(const ExtensionId& extension_id,
const base::Value::List& list,
ChromeSettingScope scope);
// //////////////////////////////////////////////////////////////////////////
// Registers the time when an extension `ext_id` is installed.
void RegisterExtension(const std::string& ext_id,
const base::Time& install_time,
bool is_enabled);
// Deletes all entries related to extension `ext_id`.
void UnregisterExtension(const std::string& ext_id);
// Hides or makes the extension content settings of the specified extension
// visible.
void SetExtensionState(const std::string& ext_id, bool is_enabled);
// Adds `observer`. This method should only be called on the UI thread.
void AddObserver(Observer* observer);
// Remove `observer`. This method should only be called on the UI thread.
void RemoveObserver(Observer* observer);
private:
friend class base::RefCountedThreadSafe<ContentSettingsStore>;
struct ExtensionEntry;
// A list of the entries, maintained in reverse-chronological order (most-
// recently installed items first) to facilitate search.
using ExtensionEntries = std::vector<std::unique_ptr<ExtensionEntry>>;
virtual ~ContentSettingsStore();
content_settings::OriginValueMap* GetValueMap(const std::string& ext_id,
ChromeSettingScope scope)
EXCLUSIVE_LOCKS_REQUIRED(lock_);
const content_settings::OriginValueMap* GetValueMap(
const std::string& ext_id,
ChromeSettingScope scope) const EXCLUSIVE_LOCKS_REQUIRED(lock_);
void NotifyOfContentSettingChanged(const ExtensionId& extension_id,
bool incognito);
bool OnCorrectThread();
ExtensionEntry* FindEntry(const std::string& ext_id) const
EXCLUSIVE_LOCKS_REQUIRED(lock_);
ExtensionEntries::iterator FindIterator(const std::string& ext_id)
EXCLUSIVE_LOCKS_REQUIRED(lock_);
void ShouldNotifyForEntry(const ExtensionEntry& entry,
bool* notify,
bool* notify_incognito);
// The entries.
ExtensionEntries entries_ GUARDED_BY(lock_);
base::ObserverList<Observer, false>::Unchecked observers_;
mutable base::Lock lock_;
};
} // namespace extensions
#endif // EXTENSIONS_BROWSER_API_CONTENT_SETTINGS_CONTENT_SETTINGS_STORE_H_