Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "services/preferences/public/cpp/pref_observer_store.h" | |
| 6 | |
| 7 #include "base/values.h" | |
| 8 #include "mojo/public/cpp/bindings/array.h" | |
| 9 #include "services/shell/public/cpp/connector.h" | |
| 10 | |
| 11 PrefObserverStore::PrefObserverStore(shell::Connector* connector) | |
| 12 : prefs_binding_(this), prefs_manager_(nullptr), initialized_(false) { | |
| 13 if (connector) { | |
| 14 connector->ConnectToInterface("exe:chrome", &prefs_manager_ptr_); | |
|
sadrul
2016/07/25 15:32:18
Send the |prefs_manager_ptr_| from the caller, ins
jonross
2016/07/26 19:27:36
Done.
| |
| 15 prefs_manager_ = prefs_manager_ptr_.get(); | |
| 16 } | |
| 17 } | |
| 18 | |
| 19 void PrefObserverStore::Init(const std::set<std::string>& keys) { | |
| 20 DCHECK(prefs_manager_); | |
| 21 keys_ = keys; | |
|
sadrul
2016/07/25 15:32:18
DCHECK(!initialized_)
jonross
2016/07/26 19:27:36
Done.
| |
| 22 | |
| 23 prefs::mojom::PreferenceListPtr prefs_list = | |
| 24 prefs::mojom::PreferenceList::New(); | |
| 25 mojo::Array<mojo::String> pref_array = mojo::Array<mojo::String>::From(keys); | |
| 26 prefs_list->preferences = std::move(pref_array); | |
| 27 prefs_manager_->AddObserver(std::move(prefs_list), | |
| 28 prefs_binding_.CreateInterfacePtrAndBind()); | |
| 29 } | |
| 30 | |
| 31 bool PrefObserverStore::GetValue(const std::string& key, | |
| 32 const base::Value** value) const { | |
| 33 DCHECK(initialized_); | |
| 34 DCHECK(keys_.find(key) != keys_.end()); | |
| 35 | |
| 36 return ValueMapPrefStore::GetValue(key, value); | |
| 37 } | |
| 38 | |
| 39 void PrefObserverStore::SetValue(const std::string& key, | |
| 40 std::unique_ptr<base::Value> value, | |
| 41 uint32_t flags) { | |
| 42 DCHECK(keys_.find(key) != keys_.end()); | |
| 43 | |
| 44 SetValueOnPreferenceManager(key, value.get()); | |
| 45 ValueMapPrefStore::SetValue(key, std::move(value), flags); | |
| 46 } | |
| 47 | |
| 48 void PrefObserverStore::RemoveValue(const std::string& key, uint32_t flags) { | |
| 49 // TODO(jonross): add preference removal to preferences.mojom | |
| 50 NOTIMPLEMENTED(); | |
| 51 } | |
| 52 | |
| 53 bool PrefObserverStore::GetMutableValue(const std::string& key, | |
| 54 base::Value** value) { | |
| 55 // TODO(jonross): determine how we can track edits to base::Value so that we | |
| 56 // can appropriately set the value on the PreferenceManger. | |
|
sadrul
2016/07/25 15:32:17
Looks like the callers are expected to call Report
jonross
2016/07/26 19:27:36
Yeah that seems to be true. I'll update this to fo
| |
| 57 NOTIMPLEMENTED(); | |
| 58 return false; | |
| 59 } | |
| 60 | |
| 61 void PrefObserverStore::ReportValueChanged(const std::string& key, | |
| 62 uint32_t flags) { | |
| 63 ValueMapPrefStore::ReportValueChanged(key, flags); | |
| 64 } | |
| 65 | |
| 66 void PrefObserverStore::SetValueSilently(const std::string& key, | |
| 67 std::unique_ptr<base::Value> value, | |
| 68 uint32_t flags) { | |
| 69 SetValueOnPreferenceManager(key, value.get()); | |
| 70 ValueMapPrefStore::SetValueSilently(key, std::move(value), flags); | |
| 71 } | |
| 72 | |
| 73 PrefObserverStore::~PrefObserverStore() {} | |
| 74 | |
| 75 void PrefObserverStore::SetValueOnPreferenceManager(const std::string& key, | |
| 76 base::Value* value) { | |
| 77 if (keys_.find(key) == keys_.end()) | |
| 78 return; | |
| 79 | |
| 80 // TODO(jonross): replace with struct traits for base::Value | |
|
sadrul
2016/07/25 15:32:18
Do we need to check |initialized_| here, and queue
jonross
2016/07/26 19:27:36
This is a possible way to handle it.
Another is t
| |
| 81 prefs::mojom::PreferencePtr pref = prefs::mojom::Preference::New(); | |
| 82 switch (value->GetType()) { | |
| 83 case base::Value::TYPE_INTEGER: { | |
| 84 pref->type = prefs::mojom::Preference::PreferenceType::INT; | |
| 85 int val = 0; | |
| 86 value->GetAsInteger(&val); | |
|
sadrul
2016/07/25 15:32:18
Check return value
jonross
2016/07/26 19:27:36
Done.
| |
| 87 pref->integer_value_ = val; | |
| 88 } break; | |
| 89 case base::Value::TYPE_STRING: { | |
| 90 pref->type = prefs::mojom::Preference::PreferenceType::STRING; | |
| 91 std::string str; | |
| 92 value->GetAsString(&str); | |
|
sadrul
2016/07/25 15:32:17
ditto
jonross
2016/07/26 19:27:36
Done.
| |
| 93 pref->string_value_ = str; | |
| 94 } break; | |
| 95 default: | |
| 96 NOTIMPLEMENTED(); | |
| 97 return; | |
| 98 } | |
| 99 | |
| 100 prefs::mojom::PreferenceMapPtr pref_map = prefs::mojom::PreferenceMap::New(); | |
| 101 pref_map->preferences.insert(key, std::move(pref)); | |
| 102 prefs_manager_->SetPreferences(std::move(pref_map)); | |
| 103 } | |
| 104 | |
| 105 void PrefObserverStore::OnPreferencesChanged( | |
| 106 prefs::mojom::PreferenceMapPtr preferences) { | |
| 107 for (auto& it : preferences->preferences) { | |
| 108 if (keys_.find(it.first) == keys_.end()) | |
| 109 continue; | |
| 110 // TODO(jonross): replace with struct traits for base::Value | |
| 111 base::Value* value; | |
|
sadrul
2016/07/25 15:32:17
value = nullptr;
jonross
2016/07/26 19:27:36
Done.
| |
| 112 switch (it.second->type) { | |
| 113 case prefs::mojom::Preference::PreferenceType::INT: | |
| 114 value = new base::FundamentalValue((int)it.second->integer_value_); | |
| 115 break; | |
| 116 case prefs::mojom::Preference::PreferenceType::STRING: | |
| 117 value = new base::StringValue(it.second->string_value_); | |
| 118 break; | |
| 119 default: | |
| 120 NOTIMPLEMENTED(); | |
| 121 return; | |
| 122 } | |
| 123 ValueMapPrefStore::SetValue(it.first, base::WrapUnique(value), 0); | |
| 124 } | |
| 125 | |
| 126 if (!initialized_) { | |
| 127 initialized_ = true; | |
| 128 NotifyInitializationCompleted(); | |
| 129 } | |
| 130 } | |
| OLD | NEW |