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