#include "chrome/browser/devtools/devtools_settings.h"
#include "base/strings/to_string.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/pref_names.h"
#include "components/prefs/scoped_user_pref_update.h"
const char DevToolsSettings::kSyncDevToolsPreferencesFrontendName[] =
"sync-preferences";
const bool DevToolsSettings::kSyncDevToolsPreferencesDefault = false;
DevToolsSettings::DevToolsSettings(Profile* profile) : profile_(profile) {
pref_change_registrar_.Init(profile_->GetPrefs());
pref_change_registrar_.Add(
prefs::kDevToolsSyncPreferences,
base::BindRepeating(&DevToolsSettings::DevToolsSyncPreferencesChanged,
base::Unretained(this)));
}
DevToolsSettings::~DevToolsSettings() = default;
void DevToolsSettings::Register(const std::string& name,
const RegisterOptions& options) {
if (name == kSyncDevToolsPreferencesFrontendName)
return;
if (options.sync_mode == RegisterOptions::SyncMode::kSync) {
synced_setting_names_.insert(name);
}
PrefService* prefs = profile_->GetPrefs();
const char* dictionary_to_remove_from =
options.sync_mode == RegisterOptions::SyncMode::kSync
? prefs::kDevToolsPreferences
: GetDictionaryNameForSyncedPrefs();
const std::string* settings_value =
prefs->GetDict(dictionary_to_remove_from).FindString(name);
if (!settings_value) {
return;
}
const char* dictionary_to_insert_into =
GetDictionaryNameForSettingsName(name);
const std::string* already_synced_value =
prefs->GetDict(dictionary_to_insert_into).FindString(name);
if (dictionary_to_insert_into == prefs::kDevToolsPreferences ||
!already_synced_value) {
ScopedDictPrefUpdate insert_update(profile_->GetPrefs(),
dictionary_to_insert_into);
insert_update->Set(name, *settings_value);
}
ScopedDictPrefUpdate remove_update(profile_->GetPrefs(),
dictionary_to_remove_from);
remove_update->Remove(name);
}
base::Value::Dict DevToolsSettings::Get() {
base::Value::Dict settings;
PrefService* prefs = profile_->GetPrefs();
settings.Set(
kSyncDevToolsPreferencesFrontendName,
base::ToString(prefs->GetBoolean(prefs::kDevToolsSyncPreferences)));
settings.Merge(prefs->GetDict(prefs::kDevToolsPreferences).Clone());
settings.Merge(prefs->GetDict(GetDictionaryNameForSyncedPrefs()).Clone());
return settings;
}
std::optional<base::Value> DevToolsSettings::Get(const std::string& name) {
PrefService* prefs = profile_->GetPrefs();
if (name == kSyncDevToolsPreferencesFrontendName) {
bool result = prefs->GetBoolean(prefs::kDevToolsSyncPreferences);
return base::Value(base::ToString(result));
}
const char* dict_name = GetDictionaryNameForSettingsName(name);
const base::Value::Dict& dict = prefs->GetDict(dict_name);
const base::Value* value = dict.Find(name);
return value ? std::optional<base::Value>(value->Clone()) : std::nullopt;
}
void DevToolsSettings::Set(const std::string& name, const std::string& value) {
if (name == kSyncDevToolsPreferencesFrontendName) {
profile_->GetPrefs()->SetBoolean(prefs::kDevToolsSyncPreferences,
value == "true");
return;
}
ScopedDictPrefUpdate update(profile_->GetPrefs(),
GetDictionaryNameForSettingsName(name));
update->Set(name, value);
}
void DevToolsSettings::Remove(const std::string& name) {
if (name == kSyncDevToolsPreferencesFrontendName) {
profile_->GetPrefs()->SetBoolean(prefs::kDevToolsSyncPreferences,
kSyncDevToolsPreferencesDefault);
return;
}
PrefService* prefs = profile_->GetPrefs();
for (auto* dict_name :
{GetDictionaryNameForSyncedPrefs(), prefs::kDevToolsPreferences}) {
const base::Value::Dict& dict = prefs->GetDict(dict_name);
if (dict.Find(name)) {
ScopedDictPrefUpdate update(profile_->GetPrefs(), dict_name);
update->Remove(name);
}
}
}
void DevToolsSettings::Clear() {
profile_->GetPrefs()->SetBoolean(prefs::kDevToolsSyncPreferences,
kSyncDevToolsPreferencesDefault);
profile_->GetPrefs()->SetDict(prefs::kDevToolsPreferences,
base::Value::Dict());
profile_->GetPrefs()->SetDict(prefs::kDevToolsSyncedPreferencesSyncEnabled,
base::Value::Dict());
profile_->GetPrefs()->SetDict(prefs::kDevToolsSyncedPreferencesSyncDisabled,
base::Value::Dict());
}
const char* DevToolsSettings::GetDictionaryNameForSettingsName(
const std::string& name) const {
return synced_setting_names_.contains(name)
? GetDictionaryNameForSyncedPrefs()
: prefs::kDevToolsPreferences;
}
const char* DevToolsSettings::GetDictionaryNameForSyncedPrefs() const {
const bool isDevToolsSyncEnabled =
profile_->GetPrefs()->GetBoolean(prefs::kDevToolsSyncPreferences);
return isDevToolsSyncEnabled ? prefs::kDevToolsSyncedPreferencesSyncEnabled
: prefs::kDevToolsSyncedPreferencesSyncDisabled;
}
void DevToolsSettings::DevToolsSyncPreferencesChanged() {
const bool sync_enabled =
profile_->GetPrefs()->GetBoolean(prefs::kDevToolsSyncPreferences);
const char* target_dictionary =
sync_enabled ? prefs::kDevToolsSyncedPreferencesSyncEnabled
: prefs::kDevToolsSyncedPreferencesSyncDisabled;
const char* source_dictionary =
sync_enabled ? prefs::kDevToolsSyncedPreferencesSyncDisabled
: prefs::kDevToolsSyncedPreferencesSyncEnabled;
ScopedDictPrefUpdate source_update(profile_->GetPrefs(), source_dictionary);
ScopedDictPrefUpdate target_update(profile_->GetPrefs(), target_dictionary);
base::Value::Dict source_dict;
std::swap(source_dict, *source_update);
target_update->Merge(std::move(source_dict));
}