Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6010)

Unified Diff: chrome/browser/force_tls_persister.cc

Issue 186014: ForceTLS: persist to disk (Closed)
Patch Set: ... Created 11 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/force_tls_persister.cc
diff --git a/chrome/browser/force_tls_persister.cc b/chrome/browser/force_tls_persister.cc
new file mode 100644
index 0000000000000000000000000000000000000000..91f22057cb54f80d348b1cd25c5d186a64caafe8
--- /dev/null
+++ b/chrome/browser/force_tls_persister.cc
@@ -0,0 +1,78 @@
+// Copyright (c) 2006-2008 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/force_tls_persister.h"
+
+#include "base/file_path.h"
+#include "base/file_util.h"
+#include "base/message_loop.h"
+#include "base/path_service.h"
+#include "base/thread.h"
+#include "chrome/common/chrome_paths.h"
+#include "net/base/force_tls_state.h"
+
+// Since the ForceTLSState takes a simple C function as the callback, this
+// bounces to the StateIsDirty method of the given object.
+static void StateIsDirtyTrampoline(void* arg) {
+ ForceTLSPersister* persister = reinterpret_cast<ForceTLSPersister*>(arg);
+ persister->StateIsDirty();
+}
+
+ForceTLSPersister::ForceTLSPersister(net::ForceTLSState* state,
+ base::Thread* file_thread)
+ : state_is_dirty_(false),
+ force_tls_state_(state),
+ file_thread_(file_thread) {
+ state->SetDirtyCallback(StateIsDirtyTrampoline, this);
+
+ Task* task = NewRunnableMethod(this, &ForceTLSPersister::LoadState);
+ file_thread->message_loop()->PostDelayedTask(FROM_HERE, task,
+ 1000 /* 1 second */);
+}
+
+static FilePath GetStateFile() {
+ FilePath user_data_dir;
+ PathService::Get(chrome::DIR_USER_DATA, &user_data_dir);
+ return user_data_dir.Append("ForceTLSState");
+}
+
+void ForceTLSPersister::LoadState() {
+ // Runs on |file_thread_|
+ AutoLock locked_(lock_);
+ DCHECK(file_thread_->message_loop() == MessageLoop::current());
+
+ std::string state;
+ if (!file_util::ReadFileToString(GetStateFile(), &state))
+ return;
+
+ force_tls_state_->Deserialise(state);
+}
+
+void ForceTLSPersister::StateIsDirty() {
+ // Runs on arbitary thread, may not block nor reenter |force_tls_state_|
+ AutoLock locked_(lock_);
+
+ if (state_is_dirty_)
+ return; // we already have a serialisation scheduled
+
+ Task* task = NewRunnableMethod(this, &ForceTLSPersister::SerialiseState);
+ file_thread_->message_loop()->PostDelayedTask(FROM_HERE, task,
+ 1000 /* 1 second */);
+ state_is_dirty_ = true;
+}
+
+void ForceTLSPersister::SerialiseState() {
+ // Runs on |file_thread_|
+ AutoLock locked_(lock_);
+ DCHECK(file_thread_->message_loop() == MessageLoop::current());
+
+ DCHECK(state_is_dirty_);
+ state_is_dirty_ = false;
+
+ std::string state;
+ if (!force_tls_state_->Serialise(&state))
+ return;
+
+ file_util::WriteFile(GetStateFile(), state.data(), state.size());
+}

Powered by Google App Engine
This is Rietveld 408576698