| Index: chrome/browser/net/transport_security_persister.cc
|
| diff --git a/chrome/browser/net/transport_security_persister.cc b/chrome/browser/net/transport_security_persister.cc
|
| index 9b803a39d266b19dd1a4de6ee2423f8f337fb810..afa186043107cb081bc2e5b9e7c4b7f6a4a72b25 100644
|
| --- a/chrome/browser/net/transport_security_persister.cc
|
| +++ b/chrome/browser/net/transport_security_persister.cc
|
| @@ -11,15 +11,14 @@
|
| #include "base/json/json_reader.h"
|
| #include "base/json/json_writer.h"
|
| #include "base/message_loop/message_loop.h"
|
| -#include "base/path_service.h"
|
| +#include "base/message_loop/message_loop_proxy.h"
|
| +#include "base/sequenced_task_runner.h"
|
| +#include "base/task_runner_util.h"
|
| #include "base/values.h"
|
| -#include "chrome/common/chrome_paths.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| #include "crypto/sha2.h"
|
| #include "net/cert/x509_certificate.h"
|
| #include "net/http/transport_security_state.h"
|
|
|
| -using content::BrowserThread;
|
| using net::HashValue;
|
| using net::HashValueTag;
|
| using net::HashValueVector;
|
| @@ -81,67 +80,39 @@ const char kDefault[] = "default";
|
| const char kPinningOnly[] = "pinning-only";
|
| const char kCreated[] = "created";
|
|
|
| -} // namespace
|
| -
|
| -class TransportSecurityPersister::Loader {
|
| - public:
|
| - Loader(const base::WeakPtr<TransportSecurityPersister>& persister,
|
| - const base::FilePath& path)
|
| - : persister_(persister),
|
| - path_(path),
|
| - state_valid_(false) {
|
| - }
|
| -
|
| - void Load() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
|
| - state_valid_ = base::ReadFileToString(path_, &state_);
|
| - }
|
| -
|
| - void CompleteLoad() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - // Make sure we're deleted.
|
| - scoped_ptr<Loader> deleter(this);
|
| -
|
| - if (!persister_.get() || !state_valid_)
|
| - return;
|
| - persister_->CompleteLoad(state_);
|
| +std::string LoadState(const base::FilePath& path) {
|
| + std::string result;
|
| + if (!base::ReadFileToString(path, &result)) {
|
| + return "";
|
| }
|
| + return result;
|
| +}
|
|
|
| - private:
|
| - base::WeakPtr<TransportSecurityPersister> persister_;
|
| -
|
| - base::FilePath path_;
|
| -
|
| - std::string state_;
|
| - bool state_valid_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(Loader);
|
| -};
|
| +} // namespace
|
|
|
| TransportSecurityPersister::TransportSecurityPersister(
|
| TransportSecurityState* state,
|
| const base::FilePath& profile_path,
|
| + base::SequencedTaskRunner* background_runner,
|
| bool readonly)
|
| : transport_security_state_(state),
|
| - writer_(profile_path.AppendASCII("TransportSecurity"),
|
| - BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE)
|
| - .get()),
|
| + writer_(profile_path.AppendASCII("TransportSecurity"), background_runner),
|
| + foreground_runner_(base::MessageLoop::current()->message_loop_proxy()),
|
| + background_runner_(background_runner),
|
| readonly_(readonly),
|
| weak_ptr_factory_(this) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| transport_security_state_->SetDelegate(this);
|
|
|
| - Loader* loader = new Loader(weak_ptr_factory_.GetWeakPtr(), writer_.path());
|
| - BrowserThread::PostTaskAndReply(
|
| - BrowserThread::FILE, FROM_HERE,
|
| - base::Bind(&Loader::Load, base::Unretained(loader)),
|
| - base::Bind(&Loader::CompleteLoad, base::Unretained(loader)));
|
| + base::PostTaskAndReplyWithResult(
|
| + background_runner_,
|
| + FROM_HERE,
|
| + base::Bind(&::LoadState, writer_.path()),
|
| + base::Bind(&TransportSecurityPersister::CompleteLoad,
|
| + weak_ptr_factory_.GetWeakPtr()));
|
| }
|
|
|
| TransportSecurityPersister::~TransportSecurityPersister() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| + DCHECK(foreground_runner_->RunsTasksOnCurrentThread());
|
|
|
| if (writer_.HasPendingWrite())
|
| writer_.DoScheduledWrite();
|
| @@ -151,7 +122,7 @@ TransportSecurityPersister::~TransportSecurityPersister() {
|
|
|
| void TransportSecurityPersister::StateIsDirty(
|
| TransportSecurityState* state) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| + DCHECK(foreground_runner_->RunsTasksOnCurrentThread());
|
| DCHECK_EQ(transport_security_state_, state);
|
|
|
| if (!readonly_)
|
| @@ -159,7 +130,7 @@ void TransportSecurityPersister::StateIsDirty(
|
| }
|
|
|
| bool TransportSecurityPersister::SerializeData(std::string* output) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| + DCHECK(foreground_runner_->RunsTasksOnCurrentThread());
|
|
|
| DictionaryValue toplevel;
|
| base::Time now = base::Time::Now();
|
| @@ -211,7 +182,7 @@ bool TransportSecurityPersister::SerializeData(std::string* output) {
|
|
|
| bool TransportSecurityPersister::LoadEntries(const std::string& serialized,
|
| bool* dirty) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| + DCHECK(foreground_runner_->RunsTasksOnCurrentThread());
|
|
|
| transport_security_state_->ClearDynamicData();
|
| return Deserialize(serialized, dirty, transport_security_state_);
|
| @@ -327,7 +298,7 @@ bool TransportSecurityPersister::Deserialize(const std::string& serialized,
|
| }
|
|
|
| void TransportSecurityPersister::CompleteLoad(const std::string& state) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| + DCHECK(foreground_runner_->RunsTasksOnCurrentThread());
|
|
|
| bool dirty = false;
|
| if (!LoadEntries(state, &dirty)) {
|
|
|