file_system_quota_client.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/file_system_quota_client.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/location.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sequenced_task_runner.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/single_thread_task_runner.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/task_runner_util.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h" 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/file_system_context.h" 2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/file_system_quota_util.h" 2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/file_system_task_runners.h" 2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/file_system_usage_cache.h" 2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/sandbox_mount_point_provider.h" 2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/common/fileapi/file_system_util.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using quota::StorageType; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace fileapi { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetOriginsForTypeOnFileThread( 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemContext* context, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType storage_type, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<GURL>* origins_ptr) { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemType type = QuotaStorageTypeToFileSystemType(storage_type); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(type != kFileSystemTypeUnknown); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemQuotaUtil* quota_util = context->GetQuotaUtil(type); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!quota_util) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) quota_util->GetOriginsForTypeOnFileThread(type, origins_ptr); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetOriginsForHostOnFileThread( 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemContext* context, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType storage_type, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& host, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<GURL>* origins_ptr) { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemType type = QuotaStorageTypeToFileSystemType(storage_type); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(type != kFileSystemTypeUnknown); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemQuotaUtil* quota_util = context->GetQuotaUtil(type); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!quota_util) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) quota_util->GetOriginsForHostOnFileThread(type, host, origins_ptr); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DidGetOrigins( 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const quota::QuotaClient::GetOriginsCallback& callback, 6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::set<GURL>* origins_ptr) { 6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) callback.Run(*origins_ptr); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)quota::QuotaStatusCode DeleteOriginOnFileThread( 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemContext* context, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& origin, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemType type) { 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FileSystemMountPointProvider* provider = context->GetMountPointProvider(type); 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!provider || !provider->GetQuotaUtil()) 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return quota::kQuotaErrorNotSupported; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformFileError result = 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch provider->GetQuotaUtil()->DeleteOriginDataOnFileThread( 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context, context->quota_manager_proxy(), origin, type); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result == base::PLATFORM_FILE_OK) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return quota::kQuotaStatusOk; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return quota::kQuotaErrorInvalidModification; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FileSystemQuotaClient::FileSystemQuotaClient( 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemContext* file_system_context, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_incognito) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : file_system_context_(file_system_context), 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_incognito_(is_incognito) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FileSystemQuotaClient::~FileSystemQuotaClient() {} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)quota::QuotaClient::ID FileSystemQuotaClient::id() const { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return quota::QuotaClient::kFileSystem; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FileSystemQuotaClient::OnQuotaManagerDestroyed() { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete this; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FileSystemQuotaClient::GetOriginUsage( 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& origin_url, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType storage_type, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GetUsageCallback& callback) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!callback.is_null()); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_incognito_) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't support FileSystem in incognito mode yet. 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(0); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemType type = QuotaStorageTypeToFileSystemType(storage_type); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(type != kFileSystemTypeUnknown); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemQuotaUtil* quota_util = file_system_context_->GetQuotaUtil(type); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!quota_util) { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(0); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PostTaskAndReplyWithResult( 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_task_runner(), 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is safe to pass Unretained(quota_util) since context owns it. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&FileSystemQuotaUtil::GetOriginUsageOnFileThread, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(quota_util), 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_system_context_, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin_url, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type), 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FileSystemQuotaClient::GetOriginsForType( 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType storage_type, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GetOriginsCallback& callback) { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!callback.is_null()); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_incognito_) { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't support FileSystem in incognito mode yet. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<GURL> origins; 14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) callback.Run(origins); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<GURL>* origins_ptr = new std::set<GURL>(); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_task_runner()->PostTaskAndReply( 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&GetOriginsForTypeOnFileThread, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_system_context_, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage_type, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(origins_ptr)), 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&DidGetOrigins, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback, 15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Owned(origins_ptr))); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FileSystemQuotaClient::GetOriginsForHost( 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType storage_type, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& host, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GetOriginsCallback& callback) { 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!callback.is_null()); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_incognito_) { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't support FileSystem in incognito mode yet. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<GURL> origins; 16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) callback.Run(origins); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<GURL>* origins_ptr = new std::set<GURL>(); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_task_runner()->PostTaskAndReply( 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&GetOriginsForHostOnFileThread, 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_system_context_, 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage_type, 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host, 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(origins_ptr)), 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&DidGetOrigins, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback, 18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Owned(origins_ptr))); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FileSystemQuotaClient::DeleteOriginData( 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& origin, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType type, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DeletionCallback& callback) { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemType fs_type = QuotaStorageTypeToFileSystemType(type); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(fs_type != kFileSystemTypeUnknown); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PostTaskAndReplyWithResult( 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_task_runner(), 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&DeleteOriginOnFileThread, 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_system_context_, 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fs_type), 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::SequencedTaskRunner* FileSystemQuotaClient::file_task_runner() const { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return file_system_context_->task_runners()->file_task_runner(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace fileapi 206