Update ASan/Android runtime and setup script to LLVM r200682.
[chromium-blink-merge.git] / content / browser / dom_storage / dom_storage_session.cc
blobc3b7a9e304603ee90c7ef07324c19be0222edbd7
1 // Copyright 2013 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.
5 #include "content/browser/dom_storage/dom_storage_session.h"
7 #include "base/bind.h"
8 #include "base/bind_helpers.h"
9 #include "base/logging.h"
10 #include "base/single_thread_task_runner.h"
11 #include "base/thread_task_runner_handle.h"
12 #include "base/tracked_objects.h"
13 #include "content/browser/dom_storage/dom_storage_context_impl.h"
14 #include "content/browser/dom_storage/dom_storage_task_runner.h"
16 namespace content {
18 namespace {
20 void PostMergeTaskResult(
21 const SessionStorageNamespace::MergeResultCallback& callback,
22 SessionStorageNamespace::MergeResult result) {
23 callback.Run(result);
26 void RunMergeTaskAndPostResult(
27 const base::Callback<SessionStorageNamespace::MergeResult(void)>& task,
28 scoped_refptr<base::SingleThreadTaskRunner> result_loop,
29 const SessionStorageNamespace::MergeResultCallback& callback) {
30 SessionStorageNamespace::MergeResult result = task.Run();
31 result_loop->PostTask(
32 FROM_HERE, base::Bind(&PostMergeTaskResult, callback, result));
35 } // namespace
37 DOMStorageSession::DOMStorageSession(DOMStorageContextImpl* context)
38 : context_(context),
39 namespace_id_(context->AllocateSessionId()),
40 persistent_namespace_id_(context->AllocatePersistentSessionId()),
41 should_persist_(false) {
42 context->task_runner()->PostTask(
43 FROM_HERE,
44 base::Bind(&DOMStorageContextImpl::CreateSessionNamespace,
45 context_, namespace_id_, persistent_namespace_id_));
48 DOMStorageSession::DOMStorageSession(DOMStorageContextImpl* context,
49 const std::string& persistent_namespace_id)
50 : context_(context),
51 namespace_id_(context->AllocateSessionId()),
52 persistent_namespace_id_(persistent_namespace_id),
53 should_persist_(false) {
54 context->task_runner()->PostTask(
55 FROM_HERE,
56 base::Bind(&DOMStorageContextImpl::CreateSessionNamespace,
57 context_, namespace_id_, persistent_namespace_id_));
60 DOMStorageSession::DOMStorageSession(
61 DOMStorageSession* master_dom_storage_session)
62 : context_(master_dom_storage_session->context_),
63 namespace_id_(master_dom_storage_session->context_->AllocateSessionId()),
64 persistent_namespace_id_(
65 master_dom_storage_session->persistent_namespace_id()),
66 should_persist_(false) {
67 context_->task_runner()->PostTask(
68 FROM_HERE,
69 base::Bind(&DOMStorageContextImpl::CreateAliasSessionNamespace,
70 context_,
71 master_dom_storage_session->namespace_id(),
72 namespace_id_,
73 persistent_namespace_id_));
76 void DOMStorageSession::SetShouldPersist(bool should_persist) {
77 should_persist_ = should_persist;
80 bool DOMStorageSession::should_persist() const {
81 return should_persist_;
84 bool DOMStorageSession::IsFromContext(DOMStorageContextImpl* context) {
85 return context_.get() == context;
88 DOMStorageSession* DOMStorageSession::Clone() {
89 return CloneFrom(context_.get(), namespace_id_);
92 // static
93 DOMStorageSession* DOMStorageSession::CloneFrom(DOMStorageContextImpl* context,
94 int64 namepace_id_to_clone) {
95 int64 clone_id = context->AllocateSessionId();
96 std::string persistent_clone_id = context->AllocatePersistentSessionId();
97 context->task_runner()->PostTask(
98 FROM_HERE,
99 base::Bind(&DOMStorageContextImpl::CloneSessionNamespace,
100 context, namepace_id_to_clone, clone_id, persistent_clone_id));
101 return new DOMStorageSession(context, clone_id, persistent_clone_id);
104 DOMStorageSession::DOMStorageSession(DOMStorageContextImpl* context,
105 int64 namespace_id,
106 const std::string& persistent_namespace_id)
107 : context_(context),
108 namespace_id_(namespace_id),
109 persistent_namespace_id_(persistent_namespace_id),
110 should_persist_(false) {
111 // This ctor is intended for use by the Clone() method.
114 DOMStorageSession::~DOMStorageSession() {
115 context_->task_runner()->PostTask(
116 FROM_HERE,
117 base::Bind(&DOMStorageContextImpl::DeleteSessionNamespace,
118 context_, namespace_id_, should_persist_));
121 void DOMStorageSession::AddTransactionLogProcessId(int process_id) {
122 context_->task_runner()->PostTask(
123 FROM_HERE,
124 base::Bind(&DOMStorageContextImpl::AddTransactionLogProcessId,
125 context_, namespace_id_, process_id));
128 void DOMStorageSession::RemoveTransactionLogProcessId(int process_id) {
129 context_->task_runner()->PostTask(
130 FROM_HERE,
131 base::Bind(&DOMStorageContextImpl::RemoveTransactionLogProcessId,
132 context_, namespace_id_, process_id));
135 void DOMStorageSession::Merge(
136 bool actually_merge,
137 int process_id,
138 DOMStorageSession* other,
139 const SessionStorageNamespace::MergeResultCallback& callback) {
140 scoped_refptr<base::SingleThreadTaskRunner> current_loop(
141 base::ThreadTaskRunnerHandle::Get());
142 SessionStorageNamespace::MergeResultCallback cb =
143 base::Bind(&DOMStorageSession::ProcessMergeResult,
144 this,
145 actually_merge,
146 callback,
147 other->persistent_namespace_id());
148 context_->task_runner()->PostTask(
149 FROM_HERE,
150 base::Bind(&RunMergeTaskAndPostResult,
151 base::Bind(&DOMStorageContextImpl::MergeSessionStorage,
152 context_, namespace_id_, actually_merge, process_id,
153 other->namespace_id_),
154 current_loop,
155 cb));
158 void DOMStorageSession::ProcessMergeResult(
159 bool actually_merge,
160 const SessionStorageNamespace::MergeResultCallback& callback,
161 const std::string& new_persistent_namespace_id,
162 SessionStorageNamespace::MergeResult result) {
163 if (actually_merge &&
164 (result == SessionStorageNamespace::MERGE_RESULT_MERGEABLE ||
165 result == SessionStorageNamespace::MERGE_RESULT_NO_TRANSACTIONS)) {
166 persistent_namespace_id_ = new_persistent_namespace_id;
168 callback.Run(result);
171 } // namespace content