blob: 56ea51e3d2aba56b7daed6ddba2b5c42bf7aab50 [file] [log] [blame]
Ben Murdochbb1529c2013-08-08 10:24:53 +01001// 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.
4
5#include "content/browser/dom_storage/dom_storage_context_wrapper.h"
6
7#include "base/bind.h"
8#include "base/bind_helpers.h"
9#include "base/files/file_path.h"
10#include "base/message_loop/message_loop_proxy.h"
11#include "content/browser/dom_storage/dom_storage_area.h"
12#include "content/browser/dom_storage/dom_storage_context_impl.h"
13#include "content/browser/dom_storage/dom_storage_task_runner.h"
14#include "content/browser/dom_storage/session_storage_namespace_impl.h"
15#include "content/public/browser/browser_thread.h"
16#include "content/public/browser/local_storage_usage_info.h"
17#include "content/public/browser/session_storage_usage_info.h"
18
19namespace content {
20namespace {
21
22const char kLocalStorageDirectory[] = "Local Storage";
23const char kSessionStorageDirectory[] = "Session Storage";
24
25void InvokeLocalStorageUsageCallbackHelper(
26 const DOMStorageContext::GetLocalStorageUsageCallback& callback,
27 const std::vector<LocalStorageUsageInfo>* infos) {
28 callback.Run(*infos);
29}
30
31void GetLocalStorageUsageHelper(
32 base::MessageLoopProxy* reply_loop,
33 DOMStorageContextImpl* context,
34 const DOMStorageContext::GetLocalStorageUsageCallback& callback) {
35 std::vector<LocalStorageUsageInfo>* infos =
36 new std::vector<LocalStorageUsageInfo>;
37 context->GetLocalStorageUsage(infos, true);
38 reply_loop->PostTask(
39 FROM_HERE,
40 base::Bind(&InvokeLocalStorageUsageCallbackHelper,
41 callback, base::Owned(infos)));
42}
43
44void InvokeSessionStorageUsageCallbackHelper(
45 const DOMStorageContext::GetSessionStorageUsageCallback& callback,
46 const std::vector<SessionStorageUsageInfo>* infos) {
47 callback.Run(*infos);
48}
49
50void GetSessionStorageUsageHelper(
51 base::MessageLoopProxy* reply_loop,
52 DOMStorageContextImpl* context,
53 const DOMStorageContext::GetSessionStorageUsageCallback& callback) {
54 std::vector<SessionStorageUsageInfo>* infos =
55 new std::vector<SessionStorageUsageInfo>;
56 context->GetSessionStorageUsage(infos);
57 reply_loop->PostTask(
58 FROM_HERE,
59 base::Bind(&InvokeSessionStorageUsageCallbackHelper,
60 callback, base::Owned(infos)));
61}
62
63} // namespace
64
65DOMStorageContextWrapper::DOMStorageContextWrapper(
66 const base::FilePath& data_path,
67 quota::SpecialStoragePolicy* special_storage_policy) {
68 base::SequencedWorkerPool* worker_pool = BrowserThread::GetBlockingPool();
69 context_ = new DOMStorageContextImpl(
70 data_path.empty() ? data_path
71 : data_path.AppendASCII(kLocalStorageDirectory),
72 data_path.empty() ? data_path
73 : data_path.AppendASCII(kSessionStorageDirectory),
74 special_storage_policy,
75 new DOMStorageWorkerPoolTaskRunner(
76 worker_pool,
77 worker_pool->GetNamedSequenceToken("dom_storage_primary"),
78 worker_pool->GetNamedSequenceToken("dom_storage_commit"),
79 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)
80 .get()));
81}
82
83DOMStorageContextWrapper::~DOMStorageContextWrapper() {
84}
85
86void DOMStorageContextWrapper::GetLocalStorageUsage(
87 const GetLocalStorageUsageCallback& callback) {
88 DCHECK(context_.get());
89 context_->task_runner()
90 ->PostShutdownBlockingTask(FROM_HERE,
91 DOMStorageTaskRunner::PRIMARY_SEQUENCE,
92 base::Bind(&GetLocalStorageUsageHelper,
93 base::MessageLoopProxy::current(),
94 context_,
95 callback));
96}
97
98void DOMStorageContextWrapper::GetSessionStorageUsage(
99 const GetSessionStorageUsageCallback& callback) {
100 DCHECK(context_.get());
101 context_->task_runner()
102 ->PostShutdownBlockingTask(FROM_HERE,
103 DOMStorageTaskRunner::PRIMARY_SEQUENCE,
104 base::Bind(&GetSessionStorageUsageHelper,
105 base::MessageLoopProxy::current(),
106 context_,
107 callback));
108}
109
110void DOMStorageContextWrapper::DeleteLocalStorage(const GURL& origin) {
111 DCHECK(context_.get());
112 context_->task_runner()->PostShutdownBlockingTask(
113 FROM_HERE,
114 DOMStorageTaskRunner::PRIMARY_SEQUENCE,
115 base::Bind(&DOMStorageContextImpl::DeleteLocalStorage, context_, origin));
116}
117
118void DOMStorageContextWrapper::DeleteSessionStorage(
119 const SessionStorageUsageInfo& usage_info) {
120 DCHECK(context_.get());
121 context_->task_runner()->PostShutdownBlockingTask(
122 FROM_HERE,
123 DOMStorageTaskRunner::PRIMARY_SEQUENCE,
124 base::Bind(&DOMStorageContextImpl::DeleteSessionStorage,
125 context_, usage_info));
126}
127
128void DOMStorageContextWrapper::SetSaveSessionStorageOnDisk() {
129 DCHECK(context_.get());
130 context_->SetSaveSessionStorageOnDisk();
131}
132
133scoped_refptr<SessionStorageNamespace>
134DOMStorageContextWrapper::RecreateSessionStorage(
135 const std::string& persistent_id) {
136 return scoped_refptr<SessionStorageNamespace>(
137 new SessionStorageNamespaceImpl(this, persistent_id));
138}
139
140void DOMStorageContextWrapper::StartScavengingUnusedSessionStorage() {
141 DCHECK(context_.get());
142 context_->task_runner()->PostShutdownBlockingTask(
143 FROM_HERE,
144 DOMStorageTaskRunner::PRIMARY_SEQUENCE,
145 base::Bind(&DOMStorageContextImpl::StartScavengingUnusedSessionStorage,
146 context_));
147}
148
149void DOMStorageContextWrapper::PurgeMemory() {
150 DCHECK(context_.get());
151 context_->task_runner()->PostShutdownBlockingTask(
152 FROM_HERE,
153 DOMStorageTaskRunner::PRIMARY_SEQUENCE,
154 base::Bind(&DOMStorageContextImpl::PurgeMemory, context_));
155}
156
157void DOMStorageContextWrapper::SetForceKeepSessionState() {
158 DCHECK(context_.get());
159 context_->task_runner()->PostShutdownBlockingTask(
160 FROM_HERE,
161 DOMStorageTaskRunner::PRIMARY_SEQUENCE,
162 base::Bind(&DOMStorageContextImpl::SetForceKeepSessionState, context_));
163}
164
165void DOMStorageContextWrapper::Shutdown() {
166 DCHECK(context_.get());
167 context_->task_runner()->PostShutdownBlockingTask(
168 FROM_HERE,
169 DOMStorageTaskRunner::PRIMARY_SEQUENCE,
170 base::Bind(&DOMStorageContextImpl::Shutdown, context_));
171}
172
173} // namespace content