1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
|
// 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_
|