File: content_settings_store.h

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (177 lines) | stat: -rw-r--r-- 6,601 bytes parent folder | download | duplicates (5)
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_