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