• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 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 "webkit/browser/fileapi/sandbox_file_system_backend.h"
6 
7 #include "base/bind.h"
8 #include "base/file_util.h"
9 #include "base/logging.h"
10 #include "base/metrics/histogram.h"
11 #include "base/task_runner_util.h"
12 #include "url/gurl.h"
13 #include "webkit/browser/blob/file_stream_reader.h"
14 #include "webkit/browser/fileapi/async_file_util_adapter.h"
15 #include "webkit/browser/fileapi/copy_or_move_file_validator.h"
16 #include "webkit/browser/fileapi/file_stream_writer.h"
17 #include "webkit/browser/fileapi/file_system_context.h"
18 #include "webkit/browser/fileapi/file_system_operation.h"
19 #include "webkit/browser/fileapi/file_system_operation_context.h"
20 #include "webkit/browser/fileapi/file_system_options.h"
21 #include "webkit/browser/fileapi/file_system_usage_cache.h"
22 #include "webkit/browser/fileapi/obfuscated_file_util.h"
23 #include "webkit/browser/fileapi/sandbox_file_system_backend_delegate.h"
24 #include "webkit/browser/fileapi/sandbox_quota_observer.h"
25 #include "webkit/browser/quota/quota_manager.h"
26 #include "webkit/common/fileapi/file_system_types.h"
27 #include "webkit/common/fileapi/file_system_util.h"
28 
29 using quota::QuotaManagerProxy;
30 using quota::SpecialStoragePolicy;
31 
32 namespace fileapi {
33 
SandboxFileSystemBackend(SandboxFileSystemBackendDelegate * delegate)34 SandboxFileSystemBackend::SandboxFileSystemBackend(
35     SandboxFileSystemBackendDelegate* delegate)
36     : delegate_(delegate),
37       enable_temporary_file_system_in_incognito_(false) {
38 }
39 
~SandboxFileSystemBackend()40 SandboxFileSystemBackend::~SandboxFileSystemBackend() {
41 }
42 
CanHandleType(FileSystemType type) const43 bool SandboxFileSystemBackend::CanHandleType(FileSystemType type) const {
44   return type == kFileSystemTypeTemporary ||
45          type == kFileSystemTypePersistent;
46 }
47 
Initialize(FileSystemContext * context)48 void SandboxFileSystemBackend::Initialize(FileSystemContext* context) {
49   DCHECK(delegate_);
50 
51   // Set quota observers.
52   delegate_->RegisterQuotaUpdateObserver(fileapi::kFileSystemTypeTemporary);
53   delegate_->AddFileAccessObserver(
54       fileapi::kFileSystemTypeTemporary,
55       delegate_->quota_observer(), NULL);
56 
57   delegate_->RegisterQuotaUpdateObserver(fileapi::kFileSystemTypePersistent);
58   delegate_->AddFileAccessObserver(
59       fileapi::kFileSystemTypePersistent,
60       delegate_->quota_observer(), NULL);
61 }
62 
ResolveURL(const FileSystemURL & url,OpenFileSystemMode mode,const OpenFileSystemCallback & callback)63 void SandboxFileSystemBackend::ResolveURL(
64     const FileSystemURL& url,
65     OpenFileSystemMode mode,
66     const OpenFileSystemCallback& callback) {
67   DCHECK(CanHandleType(url.type()));
68   DCHECK(delegate_);
69   if (delegate_->file_system_options().is_incognito() &&
70       !(url.type() == kFileSystemTypeTemporary &&
71         enable_temporary_file_system_in_incognito_)) {
72     // TODO(kinuko): return an isolated temporary directory.
73     callback.Run(GURL(), std::string(), base::File::FILE_ERROR_SECURITY);
74     return;
75   }
76 
77   delegate_->OpenFileSystem(url.origin(),
78                             url.type(),
79                             mode,
80                             callback,
81                             GetFileSystemRootURI(url.origin(), url.type()));
82 }
83 
GetAsyncFileUtil(FileSystemType type)84 AsyncFileUtil* SandboxFileSystemBackend::GetAsyncFileUtil(
85     FileSystemType type) {
86   DCHECK(delegate_);
87   return delegate_->file_util();
88 }
89 
90 CopyOrMoveFileValidatorFactory*
GetCopyOrMoveFileValidatorFactory(FileSystemType type,base::File::Error * error_code)91 SandboxFileSystemBackend::GetCopyOrMoveFileValidatorFactory(
92     FileSystemType type,
93     base::File::Error* error_code) {
94   DCHECK(error_code);
95   *error_code = base::File::FILE_OK;
96   return NULL;
97 }
98 
CreateFileSystemOperation(const FileSystemURL & url,FileSystemContext * context,base::File::Error * error_code) const99 FileSystemOperation* SandboxFileSystemBackend::CreateFileSystemOperation(
100     const FileSystemURL& url,
101     FileSystemContext* context,
102     base::File::Error* error_code) const {
103   DCHECK(CanHandleType(url.type()));
104   DCHECK(error_code);
105 
106   DCHECK(delegate_);
107   scoped_ptr<FileSystemOperationContext> operation_context =
108       delegate_->CreateFileSystemOperationContext(url, context, error_code);
109   if (!operation_context)
110     return NULL;
111 
112   SpecialStoragePolicy* policy = delegate_->special_storage_policy();
113   if (policy && policy->IsStorageUnlimited(url.origin()))
114     operation_context->set_quota_limit_type(quota::kQuotaLimitTypeUnlimited);
115   else
116     operation_context->set_quota_limit_type(quota::kQuotaLimitTypeLimited);
117 
118   return FileSystemOperation::Create(url, context, operation_context.Pass());
119 }
120 
SupportsStreaming(const fileapi::FileSystemURL & url) const121 bool SandboxFileSystemBackend::SupportsStreaming(
122     const fileapi::FileSystemURL& url) const {
123   return false;
124 }
125 
126 scoped_ptr<webkit_blob::FileStreamReader>
CreateFileStreamReader(const FileSystemURL & url,int64 offset,const base::Time & expected_modification_time,FileSystemContext * context) const127 SandboxFileSystemBackend::CreateFileStreamReader(
128     const FileSystemURL& url,
129     int64 offset,
130     const base::Time& expected_modification_time,
131     FileSystemContext* context) const {
132   DCHECK(CanHandleType(url.type()));
133   DCHECK(delegate_);
134   return delegate_->CreateFileStreamReader(
135       url, offset, expected_modification_time, context);
136 }
137 
138 scoped_ptr<fileapi::FileStreamWriter>
CreateFileStreamWriter(const FileSystemURL & url,int64 offset,FileSystemContext * context) const139 SandboxFileSystemBackend::CreateFileStreamWriter(
140     const FileSystemURL& url,
141     int64 offset,
142     FileSystemContext* context) const {
143   DCHECK(CanHandleType(url.type()));
144   DCHECK(delegate_);
145   return delegate_->CreateFileStreamWriter(url, offset, context, url.type());
146 }
147 
GetQuotaUtil()148 FileSystemQuotaUtil* SandboxFileSystemBackend::GetQuotaUtil() {
149   return delegate_;
150 }
151 
152 SandboxFileSystemBackendDelegate::OriginEnumerator*
CreateOriginEnumerator()153 SandboxFileSystemBackend::CreateOriginEnumerator() {
154   DCHECK(delegate_);
155   return delegate_->CreateOriginEnumerator();
156 }
157 
158 }  // namespace fileapi
159