// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/profile_resetter/automatic_profile_resetter_mementos.h" #include "base/bind.h" #include "base/bind_helpers.h" #include "base/file_util.h" #include "base/files/file_path.h" #include "base/logging.h" #include "base/prefs/pref_service.h" #include "base/prefs/scoped_user_pref_update.h" #include "base/values.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/chrome_constants.h" #include "chrome/common/pref_names.h" #include "content/public/browser/browser_thread.h" using base::DictionaryValue; // AutomaticProfileResetter::PreferenceHostedPromptMemento ------------------- PreferenceHostedPromptMemento::PreferenceHostedPromptMemento(Profile* profile) : profile_(profile) {} PreferenceHostedPromptMemento::~PreferenceHostedPromptMemento() {} std::string PreferenceHostedPromptMemento::ReadValue() const { PrefService* prefs = profile_->GetPrefs(); DCHECK(prefs); return prefs->GetString(prefs::kProfileResetPromptMemento); } void PreferenceHostedPromptMemento::StoreValue(const std::string& value) { PrefService* prefs = profile_->GetPrefs(); DCHECK(prefs); prefs->SetString(prefs::kProfileResetPromptMemento, value); } // AutomaticProfileResetter::LocalStateHostedPromptMemento ------------------- LocalStateHostedPromptMemento::LocalStateHostedPromptMemento(Profile* profile) : profile_(profile) {} LocalStateHostedPromptMemento::~LocalStateHostedPromptMemento() {} std::string LocalStateHostedPromptMemento::ReadValue() const { PrefService* local_state = g_browser_process->local_state(); DCHECK(local_state); const base::DictionaryValue* prompt_shown_dict = local_state->GetDictionary(prefs::kProfileResetPromptMemento); std::string profile_key = GetProfileKey(); if (!prompt_shown_dict || profile_key.empty()) { NOTREACHED(); return std::string(); } std::string value; return prompt_shown_dict->GetStringWithoutPathExpansion(profile_key, &value) ? value : std::string(); } void LocalStateHostedPromptMemento::StoreValue(const std::string& value) { PrefService* local_state = g_browser_process->local_state(); DCHECK(local_state); DictionaryPrefUpdate prompt_shown_dict_update( local_state, prefs::kProfileResetPromptMemento); std::string profile_key = GetProfileKey(); if (profile_key.empty()) { NOTREACHED(); return; } prompt_shown_dict_update.Get()->SetStringWithoutPathExpansion(profile_key, value); } std::string LocalStateHostedPromptMemento::GetProfileKey() const { return profile_->GetPath().BaseName().MaybeAsASCII(); } // AutomaticProfileResetter::FileHostedPromptMemento ------------------------- FileHostedPromptMemento::FileHostedPromptMemento(Profile* profile) : profile_(profile) {} FileHostedPromptMemento::~FileHostedPromptMemento() {} void FileHostedPromptMemento::ReadValue( const ReadValueCallback& callback) const { base::FilePath path = GetMementoFilePath(); content::BrowserThread::PostTaskAndReplyWithResult( content::BrowserThread::FILE, FROM_HERE, base::Bind(&ReadValueOnFileThread, path), callback); } void FileHostedPromptMemento::StoreValue(const std::string& value) { base::FilePath path = GetMementoFilePath(); content::BrowserThread::PostTask( content::BrowserThread::FILE, FROM_HERE, base::Bind(&StoreValueOnFileThread, path, value)); } std::string FileHostedPromptMemento::ReadValueOnFileThread( const base::FilePath& memento_file_path) { std::string value; base::ReadFileToString(memento_file_path, &value); return value; } void FileHostedPromptMemento::StoreValueOnFileThread( const base::FilePath& memento_file_path, const std::string& value) { int retval = base::WriteFile(memento_file_path, value.c_str(), value.size()); DCHECK_EQ(retval, (int)value.size()); } base::FilePath FileHostedPromptMemento::GetMementoFilePath() const { return profile_->GetPath().Append(chrome::kResetPromptMementoFilename); }