File: scoped_user_pref_update.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 (132 lines) | stat: -rw-r--r-- 4,667 bytes parent folder | download | duplicates (9)
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
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// A helper class that assists preferences in firing notifications when lists
// or dictionaries are changed.

#ifndef COMPONENTS_PREFS_SCOPED_USER_PREF_UPDATE_H_
#define COMPONENTS_PREFS_SCOPED_USER_PREF_UPDATE_H_

#include <string>
#include <string_view>

#include "base/memory/raw_ptr.h"
#include "base/memory/raw_ref.h"
#include "base/sequence_checker.h"
#include "base/values.h"
#include "components/prefs/pref_service.h"
#include "components/prefs/prefs_export.h"

class PrefService;

namespace subtle {

// Base class for ScopedUserPrefUpdateTemplate that contains the parts
// that do not depend on ScopedUserPrefUpdateTemplate's template parameter.
//
// We need this base class mostly for making it a friend of PrefService
// and getting access to PrefService::GetMutableUserPref and
// PrefService::ReportUserPrefChanged.
class COMPONENTS_PREFS_EXPORT ScopedUserPrefUpdateBase {
 public:
  ScopedUserPrefUpdateBase(const ScopedUserPrefUpdateBase&) = delete;
  ScopedUserPrefUpdateBase& operator=(const ScopedUserPrefUpdateBase&) = delete;

 protected:
  ScopedUserPrefUpdateBase(PrefService* service, std::string_view path);

  // Calls Notify().
  virtual ~ScopedUserPrefUpdateBase();

  // Sets `value_` to `service_`->GetMutableUserPref and returns it.
  base::Value* GetValueOfType(base::Value::Type type);

 private:
  // If `value_` is not null, triggers a notification of PrefObservers and
  // resets `value_`.
  void Notify();

  // Weak pointer.
  const raw_ref<PrefService> service_;
  // Path of the preference being updated.
  const std::string path_;
  // Cache of value from user pref store (set between Get() and Notify() calls).
  raw_ptr<base::Value> value_ = nullptr;

  SEQUENCE_CHECKER(sequence_checker_);
};

}  // namespace subtle

// Class to support modifications to base::Value::Dicts while guaranteeing
// that PrefObservers are notified of changed values.
//
// This class may only be used on the UI thread as it requires access to the
// PrefService.
class COMPONENTS_PREFS_EXPORT ScopedDictPrefUpdate
    : public subtle::ScopedUserPrefUpdateBase {
 public:
  // The underlying dictionary must not be removed from `service` during
  // the lifetime of the created ScopedDictPrefUpdate.
  ScopedDictPrefUpdate(PrefService* service, std::string_view path)
      : ScopedUserPrefUpdateBase(service, path) {}

  ScopedDictPrefUpdate(const ScopedDictPrefUpdate&) = delete;
  ScopedDictPrefUpdate& operator=(const ScopedDictPrefUpdate&) = delete;

  // Triggers an update notification if Get() was called.
  ~ScopedDictPrefUpdate() override = default;

  // Returns a mutable `base::Value::Dict` instance that
  // - is already in the user pref store, or
  // - is (silently) created and written to the user pref store if none existed
  //   before.
  //
  // Calling Get() will result in an update notification automatically
  // being triggered at destruction time.
  //
  // The ownership of the return value remains with the user pref store.
  base::Value::Dict& Get();

  base::Value::Dict& operator*() { return Get(); }

  base::Value::Dict* operator->() { return &Get(); }
};

// Class to support modifications to base::Value::Lists while guaranteeing
// that PrefObservers are notified of changed values.
//
// This class may only be used on the UI thread as it requires access to the
// PrefService.
class COMPONENTS_PREFS_EXPORT ScopedListPrefUpdate
    : public subtle::ScopedUserPrefUpdateBase {
 public:
  // The underlying list must not be removed from `service` during
  // the lifetime of the created ScopedListPrefUpdate.
  ScopedListPrefUpdate(PrefService* service, std::string_view path)
      : ScopedUserPrefUpdateBase(service, path) {}

  ScopedListPrefUpdate(const ScopedListPrefUpdate&) = delete;
  ScopedListPrefUpdate& operator=(const ScopedListPrefUpdate&) = delete;

  // Triggers an update notification if Get() was called.
  ~ScopedListPrefUpdate() override = default;

  // Returns a mutable `base::Value::List` instance that
  // - is already in the user pref store, or
  // - is (silently) created and written to the user pref store if none existed
  //   before.
  //
  // Calling Get() will result in an update notification automatically
  // being triggered at destruction time.
  //
  // The ownership of the return value remains with the user pref store.
  base::Value::List& Get();

  base::Value::List& operator*() { return Get(); }

  base::Value::List* operator->() { return &Get(); }
};

#endif  // COMPONENTS_PREFS_SCOPED_USER_PREF_UPDATE_H_