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