| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "webkit/browser/fileapi/file_system_context.h" | 5 #include "storage/browser/fileapi/file_system_context.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/single_thread_task_runner.h" | 8 #include "base/single_thread_task_runner.h" |
| 9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
| 10 #include "base/task_runner_util.h" | 10 #include "base/task_runner_util.h" |
| 11 #include "net/url_request/url_request.h" | 11 #include "net/url_request/url_request.h" |
| 12 #include "url/gurl.h" | 12 #include "url/gurl.h" |
| 13 #include "webkit/browser/blob/file_stream_reader.h" | 13 #include "storage/browser/blob/file_stream_reader.h" |
| 14 #include "webkit/browser/fileapi/copy_or_move_file_validator.h" | 14 #include "storage/browser/fileapi/copy_or_move_file_validator.h" |
| 15 #include "webkit/browser/fileapi/external_mount_points.h" | 15 #include "storage/browser/fileapi/external_mount_points.h" |
| 16 #include "webkit/browser/fileapi/file_permission_policy.h" | 16 #include "storage/browser/fileapi/file_permission_policy.h" |
| 17 #include "webkit/browser/fileapi/file_stream_writer.h" | 17 #include "storage/browser/fileapi/file_stream_writer.h" |
| 18 #include "webkit/browser/fileapi/file_system_file_util.h" | 18 #include "storage/browser/fileapi/file_system_file_util.h" |
| 19 #include "webkit/browser/fileapi/file_system_operation.h" | 19 #include "storage/browser/fileapi/file_system_operation.h" |
| 20 #include "webkit/browser/fileapi/file_system_operation_runner.h" | 20 #include "storage/browser/fileapi/file_system_operation_runner.h" |
| 21 #include "webkit/browser/fileapi/file_system_options.h" | 21 #include "storage/browser/fileapi/file_system_options.h" |
| 22 #include "webkit/browser/fileapi/file_system_quota_client.h" | 22 #include "storage/browser/fileapi/file_system_quota_client.h" |
| 23 #include "webkit/browser/fileapi/file_system_url.h" | 23 #include "storage/browser/fileapi/file_system_url.h" |
| 24 #include "webkit/browser/fileapi/isolated_context.h" | 24 #include "storage/browser/fileapi/isolated_context.h" |
| 25 #include "webkit/browser/fileapi/isolated_file_system_backend.h" | 25 #include "storage/browser/fileapi/isolated_file_system_backend.h" |
| 26 #include "webkit/browser/fileapi/mount_points.h" | 26 #include "storage/browser/fileapi/mount_points.h" |
| 27 #include "webkit/browser/fileapi/quota/quota_reservation.h" | 27 #include "storage/browser/fileapi/quota/quota_reservation.h" |
| 28 #include "webkit/browser/fileapi/sandbox_file_system_backend.h" | 28 #include "storage/browser/fileapi/sandbox_file_system_backend.h" |
| 29 #include "webkit/browser/quota/quota_manager_proxy.h" | 29 #include "storage/browser/quota/quota_manager_proxy.h" |
| 30 #include "webkit/browser/quota/special_storage_policy.h" | 30 #include "storage/browser/quota/special_storage_policy.h" |
| 31 #include "webkit/common/fileapi/file_system_info.h" | 31 #include "storage/common/fileapi/file_system_info.h" |
| 32 #include "webkit/common/fileapi/file_system_util.h" | 32 #include "storage/common/fileapi/file_system_util.h" |
| 33 | 33 |
| 34 using quota::QuotaClient; | 34 using quota::QuotaClient; |
| 35 | 35 |
| 36 namespace fileapi { | 36 namespace storage { |
| 37 | 37 |
| 38 namespace { | 38 namespace { |
| 39 | 39 |
| 40 QuotaClient* CreateQuotaClient( | 40 QuotaClient* CreateQuotaClient(FileSystemContext* context, bool is_incognito) { |
| 41 FileSystemContext* context, | |
| 42 bool is_incognito) { | |
| 43 return new FileSystemQuotaClient(context, is_incognito); | 41 return new FileSystemQuotaClient(context, is_incognito); |
| 44 } | 42 } |
| 45 | 43 |
| 46 | |
| 47 void DidGetMetadataForResolveURL( | 44 void DidGetMetadataForResolveURL( |
| 48 const base::FilePath& path, | 45 const base::FilePath& path, |
| 49 const FileSystemContext::ResolveURLCallback& callback, | 46 const FileSystemContext::ResolveURLCallback& callback, |
| 50 const FileSystemInfo& info, | 47 const FileSystemInfo& info, |
| 51 base::File::Error error, | 48 base::File::Error error, |
| 52 const base::File::Info& file_info) { | 49 const base::File::Info& file_info) { |
| 53 if (error != base::File::FILE_OK) { | 50 if (error != base::File::FILE_OK) { |
| 54 if (error == base::File::FILE_ERROR_NOT_FOUND) { | 51 if (error == base::File::FILE_ERROR_NOT_FOUND) { |
| 55 callback.Run(base::File::FILE_OK, info, path, | 52 callback.Run(base::File::FILE_OK, |
| 53 info, |
| 54 path, |
| 56 FileSystemContext::RESOLVED_ENTRY_NOT_FOUND); | 55 FileSystemContext::RESOLVED_ENTRY_NOT_FOUND); |
| 57 } else { | 56 } else { |
| 58 callback.Run(error, FileSystemInfo(), base::FilePath(), | 57 callback.Run(error, |
| 58 FileSystemInfo(), |
| 59 base::FilePath(), |
| 59 FileSystemContext::RESOLVED_ENTRY_NOT_FOUND); | 60 FileSystemContext::RESOLVED_ENTRY_NOT_FOUND); |
| 60 } | 61 } |
| 61 return; | 62 return; |
| 62 } | 63 } |
| 63 callback.Run(error, info, path, file_info.is_directory ? | 64 callback.Run(error, |
| 64 FileSystemContext::RESOLVED_ENTRY_DIRECTORY : | 65 info, |
| 65 FileSystemContext::RESOLVED_ENTRY_FILE); | 66 path, |
| 67 file_info.is_directory |
| 68 ? FileSystemContext::RESOLVED_ENTRY_DIRECTORY |
| 69 : FileSystemContext::RESOLVED_ENTRY_FILE); |
| 66 } | 70 } |
| 67 | 71 |
| 68 void RelayResolveURLCallback( | 72 void RelayResolveURLCallback( |
| 69 scoped_refptr<base::MessageLoopProxy> message_loop, | 73 scoped_refptr<base::MessageLoopProxy> message_loop, |
| 70 const FileSystemContext::ResolveURLCallback& callback, | 74 const FileSystemContext::ResolveURLCallback& callback, |
| 71 base::File::Error result, | 75 base::File::Error result, |
| 72 const FileSystemInfo& info, | 76 const FileSystemInfo& info, |
| 73 const base::FilePath& file_path, | 77 const base::FilePath& file_path, |
| 74 FileSystemContext::ResolvedEntryType type) { | 78 FileSystemContext::ResolvedEntryType type) { |
| 75 message_loop->PostTask( | 79 message_loop->PostTask(FROM_HERE, |
| 76 FROM_HERE, base::Bind(callback, result, info, file_path, type)); | 80 base::Bind(callback, result, info, file_path, type)); |
| 77 } | 81 } |
| 78 | 82 |
| 79 } // namespace | 83 } // namespace |
| 80 | 84 |
| 81 // static | 85 // static |
| 82 int FileSystemContext::GetPermissionPolicy(FileSystemType type) { | 86 int FileSystemContext::GetPermissionPolicy(FileSystemType type) { |
| 83 switch (type) { | 87 switch (type) { |
| 84 case kFileSystemTypeTemporary: | 88 case kFileSystemTypeTemporary: |
| 85 case kFileSystemTypePersistent: | 89 case kFileSystemTypePersistent: |
| 86 case kFileSystemTypeSyncable: | 90 case kFileSystemTypeSyncable: |
| 87 return FILE_PERMISSION_SANDBOX; | 91 return FILE_PERMISSION_SANDBOX; |
| 88 | 92 |
| 89 case kFileSystemTypeDrive: | 93 case kFileSystemTypeDrive: |
| 90 case kFileSystemTypeNativeForPlatformApp: | 94 case kFileSystemTypeNativeForPlatformApp: |
| 91 case kFileSystemTypeNativeLocal: | 95 case kFileSystemTypeNativeLocal: |
| 92 case kFileSystemTypeCloudDevice: | 96 case kFileSystemTypeCloudDevice: |
| 93 case kFileSystemTypeProvided: | 97 case kFileSystemTypeProvided: |
| 94 case kFileSystemTypeDeviceMediaAsFileStorage: | 98 case kFileSystemTypeDeviceMediaAsFileStorage: |
| 95 return FILE_PERMISSION_USE_FILE_PERMISSION; | 99 return FILE_PERMISSION_USE_FILE_PERMISSION; |
| 96 | 100 |
| 97 case kFileSystemTypeRestrictedNativeLocal: | 101 case kFileSystemTypeRestrictedNativeLocal: |
| 98 return FILE_PERMISSION_READ_ONLY | | 102 return FILE_PERMISSION_READ_ONLY | FILE_PERMISSION_USE_FILE_PERMISSION; |
| 99 FILE_PERMISSION_USE_FILE_PERMISSION; | |
| 100 | 103 |
| 101 case kFileSystemTypeDeviceMedia: | 104 case kFileSystemTypeDeviceMedia: |
| 102 case kFileSystemTypeIphoto: | 105 case kFileSystemTypeIphoto: |
| 103 case kFileSystemTypeItunes: | 106 case kFileSystemTypeItunes: |
| 104 case kFileSystemTypeNativeMedia: | 107 case kFileSystemTypeNativeMedia: |
| 105 case kFileSystemTypePicasa: | 108 case kFileSystemTypePicasa: |
| 106 return FILE_PERMISSION_USE_FILE_PERMISSION; | 109 return FILE_PERMISSION_USE_FILE_PERMISSION; |
| 107 | 110 |
| 108 // Following types are only accessed via IsolatedFileSystem, and | 111 // Following types are only accessed via IsolatedFileSystem, and |
| 109 // don't have their own permission policies. | 112 // don't have their own permission policies. |
| (...skipping 26 matching lines...) Expand all Loading... |
| 136 ExternalMountPoints* external_mount_points, | 139 ExternalMountPoints* external_mount_points, |
| 137 quota::SpecialStoragePolicy* special_storage_policy, | 140 quota::SpecialStoragePolicy* special_storage_policy, |
| 138 quota::QuotaManagerProxy* quota_manager_proxy, | 141 quota::QuotaManagerProxy* quota_manager_proxy, |
| 139 ScopedVector<FileSystemBackend> additional_backends, | 142 ScopedVector<FileSystemBackend> additional_backends, |
| 140 const std::vector<URLRequestAutoMountHandler>& auto_mount_handlers, | 143 const std::vector<URLRequestAutoMountHandler>& auto_mount_handlers, |
| 141 const base::FilePath& partition_path, | 144 const base::FilePath& partition_path, |
| 142 const FileSystemOptions& options) | 145 const FileSystemOptions& options) |
| 143 : io_task_runner_(io_task_runner), | 146 : io_task_runner_(io_task_runner), |
| 144 default_file_task_runner_(file_task_runner), | 147 default_file_task_runner_(file_task_runner), |
| 145 quota_manager_proxy_(quota_manager_proxy), | 148 quota_manager_proxy_(quota_manager_proxy), |
| 146 sandbox_delegate_(new SandboxFileSystemBackendDelegate( | 149 sandbox_delegate_( |
| 147 quota_manager_proxy, | 150 new SandboxFileSystemBackendDelegate(quota_manager_proxy, |
| 148 file_task_runner, | 151 file_task_runner, |
| 149 partition_path, | 152 partition_path, |
| 150 special_storage_policy, | 153 special_storage_policy, |
| 151 options)), | 154 options)), |
| 152 sandbox_backend_(new SandboxFileSystemBackend( | 155 sandbox_backend_(new SandboxFileSystemBackend(sandbox_delegate_.get())), |
| 153 sandbox_delegate_.get())), | |
| 154 isolated_backend_(new IsolatedFileSystemBackend()), | 156 isolated_backend_(new IsolatedFileSystemBackend()), |
| 155 plugin_private_backend_(new PluginPrivateFileSystemBackend( | 157 plugin_private_backend_( |
| 156 file_task_runner, | 158 new PluginPrivateFileSystemBackend(file_task_runner, |
| 157 partition_path, | 159 partition_path, |
| 158 special_storage_policy, | 160 special_storage_policy, |
| 159 options)), | 161 options)), |
| 160 additional_backends_(additional_backends.Pass()), | 162 additional_backends_(additional_backends.Pass()), |
| 161 auto_mount_handlers_(auto_mount_handlers), | 163 auto_mount_handlers_(auto_mount_handlers), |
| 162 external_mount_points_(external_mount_points), | 164 external_mount_points_(external_mount_points), |
| 163 partition_path_(partition_path), | 165 partition_path_(partition_path), |
| 164 is_incognito_(options.is_incognito()), | 166 is_incognito_(options.is_incognito()), |
| 165 operation_runner_(new FileSystemOperationRunner(this)) { | 167 operation_runner_(new FileSystemOperationRunner(this)) { |
| 166 RegisterBackend(sandbox_backend_.get()); | 168 RegisterBackend(sandbox_backend_.get()); |
| 167 RegisterBackend(isolated_backend_.get()); | 169 RegisterBackend(isolated_backend_.get()); |
| 168 RegisterBackend(plugin_private_backend_.get()); | 170 RegisterBackend(plugin_private_backend_.get()); |
| 169 | 171 |
| 170 for (ScopedVector<FileSystemBackend>::const_iterator iter = | 172 for (ScopedVector<FileSystemBackend>::const_iterator iter = |
| 171 additional_backends_.begin(); | 173 additional_backends_.begin(); |
| 172 iter != additional_backends_.end(); ++iter) { | 174 iter != additional_backends_.end(); |
| 175 ++iter) { |
| 173 RegisterBackend(*iter); | 176 RegisterBackend(*iter); |
| 174 } | 177 } |
| 175 | 178 |
| 176 if (quota_manager_proxy) { | 179 if (quota_manager_proxy) { |
| 177 // Quota client assumes all backends have registered. | 180 // Quota client assumes all backends have registered. |
| 178 quota_manager_proxy->RegisterClient(CreateQuotaClient( | 181 quota_manager_proxy->RegisterClient( |
| 179 this, options.is_incognito())); | 182 CreateQuotaClient(this, options.is_incognito())); |
| 180 } | 183 } |
| 181 | 184 |
| 182 sandbox_backend_->Initialize(this); | 185 sandbox_backend_->Initialize(this); |
| 183 isolated_backend_->Initialize(this); | 186 isolated_backend_->Initialize(this); |
| 184 plugin_private_backend_->Initialize(this); | 187 plugin_private_backend_->Initialize(this); |
| 185 for (ScopedVector<FileSystemBackend>::const_iterator iter = | 188 for (ScopedVector<FileSystemBackend>::const_iterator iter = |
| 186 additional_backends_.begin(); | 189 additional_backends_.begin(); |
| 187 iter != additional_backends_.end(); ++iter) { | 190 iter != additional_backends_.end(); |
| 191 ++iter) { |
| 188 (*iter)->Initialize(this); | 192 (*iter)->Initialize(this); |
| 189 } | 193 } |
| 190 | 194 |
| 191 // Additional mount points must be added before regular system-wide | 195 // Additional mount points must be added before regular system-wide |
| 192 // mount points. | 196 // mount points. |
| 193 if (external_mount_points) | 197 if (external_mount_points) |
| 194 url_crackers_.push_back(external_mount_points); | 198 url_crackers_.push_back(external_mount_points); |
| 195 url_crackers_.push_back(ExternalMountPoints::GetSystemInstance()); | 199 url_crackers_.push_back(ExternalMountPoints::GetSystemInstance()); |
| 196 url_crackers_.push_back(IsolatedContext::GetInstance()); | 200 url_crackers_.push_back(IsolatedContext::GetInstance()); |
| 197 } | 201 } |
| 198 | 202 |
| 199 bool FileSystemContext::DeleteDataForOriginOnFileTaskRunner( | 203 bool FileSystemContext::DeleteDataForOriginOnFileTaskRunner( |
| 200 const GURL& origin_url) { | 204 const GURL& origin_url) { |
| 201 DCHECK(default_file_task_runner()->RunsTasksOnCurrentThread()); | 205 DCHECK(default_file_task_runner()->RunsTasksOnCurrentThread()); |
| 202 DCHECK(origin_url == origin_url.GetOrigin()); | 206 DCHECK(origin_url == origin_url.GetOrigin()); |
| 203 | 207 |
| 204 bool success = true; | 208 bool success = true; |
| 205 for (FileSystemBackendMap::iterator iter = backend_map_.begin(); | 209 for (FileSystemBackendMap::iterator iter = backend_map_.begin(); |
| 206 iter != backend_map_.end(); | 210 iter != backend_map_.end(); |
| 207 ++iter) { | 211 ++iter) { |
| 208 FileSystemBackend* backend = iter->second; | 212 FileSystemBackend* backend = iter->second; |
| 209 if (!backend->GetQuotaUtil()) | 213 if (!backend->GetQuotaUtil()) |
| 210 continue; | 214 continue; |
| 211 if (backend->GetQuotaUtil()->DeleteOriginDataOnFileTaskRunner( | 215 if (backend->GetQuotaUtil()->DeleteOriginDataOnFileTaskRunner( |
| 212 this, quota_manager_proxy(), origin_url, iter->first) | 216 this, quota_manager_proxy(), origin_url, iter->first) != |
| 213 != base::File::FILE_OK) { | 217 base::File::FILE_OK) { |
| 214 // Continue the loop, but record the failure. | 218 // Continue the loop, but record the failure. |
| 215 success = false; | 219 success = false; |
| 216 } | 220 } |
| 217 } | 221 } |
| 218 | 222 |
| 219 return success; | 223 return success; |
| 220 } | 224 } |
| 221 | 225 |
| 222 scoped_refptr<QuotaReservation> | 226 scoped_refptr<QuotaReservation> |
| 223 FileSystemContext::CreateQuotaReservationOnFileTaskRunner( | 227 FileSystemContext::CreateQuotaReservationOnFileTaskRunner( |
| 224 const GURL& origin_url, | 228 const GURL& origin_url, |
| 225 FileSystemType type) { | 229 FileSystemType type) { |
| 226 DCHECK(default_file_task_runner()->RunsTasksOnCurrentThread()); | 230 DCHECK(default_file_task_runner()->RunsTasksOnCurrentThread()); |
| 227 FileSystemBackend* backend = GetFileSystemBackend(type); | 231 FileSystemBackend* backend = GetFileSystemBackend(type); |
| 228 if (!backend || !backend->GetQuotaUtil()) | 232 if (!backend || !backend->GetQuotaUtil()) |
| 229 return scoped_refptr<QuotaReservation>(); | 233 return scoped_refptr<QuotaReservation>(); |
| 230 return backend->GetQuotaUtil()->CreateQuotaReservationOnFileTaskRunner( | 234 return backend->GetQuotaUtil()->CreateQuotaReservationOnFileTaskRunner( |
| 231 origin_url, type); | 235 origin_url, type); |
| 232 } | 236 } |
| 233 | 237 |
| 234 void FileSystemContext::Shutdown() { | 238 void FileSystemContext::Shutdown() { |
| 235 if (!io_task_runner_->RunsTasksOnCurrentThread()) { | 239 if (!io_task_runner_->RunsTasksOnCurrentThread()) { |
| 236 io_task_runner_->PostTask( | 240 io_task_runner_->PostTask( |
| 237 FROM_HERE, base::Bind(&FileSystemContext::Shutdown, | 241 FROM_HERE, |
| 238 make_scoped_refptr(this))); | 242 base::Bind(&FileSystemContext::Shutdown, make_scoped_refptr(this))); |
| 239 return; | 243 return; |
| 240 } | 244 } |
| 241 operation_runner_->Shutdown(); | 245 operation_runner_->Shutdown(); |
| 242 } | 246 } |
| 243 | 247 |
| 244 FileSystemQuotaUtil* | 248 FileSystemQuotaUtil* FileSystemContext::GetQuotaUtil( |
| 245 FileSystemContext::GetQuotaUtil(FileSystemType type) const { | 249 FileSystemType type) const { |
| 246 FileSystemBackend* backend = GetFileSystemBackend(type); | 250 FileSystemBackend* backend = GetFileSystemBackend(type); |
| 247 if (!backend) | 251 if (!backend) |
| 248 return NULL; | 252 return NULL; |
| 249 return backend->GetQuotaUtil(); | 253 return backend->GetQuotaUtil(); |
| 250 } | 254 } |
| 251 | 255 |
| 252 AsyncFileUtil* FileSystemContext::GetAsyncFileUtil( | 256 AsyncFileUtil* FileSystemContext::GetAsyncFileUtil(FileSystemType type) const { |
| 253 FileSystemType type) const { | |
| 254 FileSystemBackend* backend = GetFileSystemBackend(type); | 257 FileSystemBackend* backend = GetFileSystemBackend(type); |
| 255 if (!backend) | 258 if (!backend) |
| 256 return NULL; | 259 return NULL; |
| 257 return backend->GetAsyncFileUtil(type); | 260 return backend->GetAsyncFileUtil(type); |
| 258 } | 261 } |
| 259 | 262 |
| 260 CopyOrMoveFileValidatorFactory* | 263 CopyOrMoveFileValidatorFactory* |
| 261 FileSystemContext::GetCopyOrMoveFileValidatorFactory( | 264 FileSystemContext::GetCopyOrMoveFileValidatorFactory( |
| 262 FileSystemType type, base::File::Error* error_code) const { | 265 FileSystemType type, |
| 266 base::File::Error* error_code) const { |
| 263 DCHECK(error_code); | 267 DCHECK(error_code); |
| 264 *error_code = base::File::FILE_OK; | 268 *error_code = base::File::FILE_OK; |
| 265 FileSystemBackend* backend = GetFileSystemBackend(type); | 269 FileSystemBackend* backend = GetFileSystemBackend(type); |
| 266 if (!backend) | 270 if (!backend) |
| 267 return NULL; | 271 return NULL; |
| 268 return backend->GetCopyOrMoveFileValidatorFactory( | 272 return backend->GetCopyOrMoveFileValidatorFactory(type, error_code); |
| 269 type, error_code); | |
| 270 } | 273 } |
| 271 | 274 |
| 272 FileSystemBackend* FileSystemContext::GetFileSystemBackend( | 275 FileSystemBackend* FileSystemContext::GetFileSystemBackend( |
| 273 FileSystemType type) const { | 276 FileSystemType type) const { |
| 274 FileSystemBackendMap::const_iterator found = backend_map_.find(type); | 277 FileSystemBackendMap::const_iterator found = backend_map_.find(type); |
| 275 if (found != backend_map_.end()) | 278 if (found != backend_map_.end()) |
| 276 return found->second; | 279 return found->second; |
| 277 NOTREACHED() << "Unknown filesystem type: " << type; | 280 NOTREACHED() << "Unknown filesystem type: " << type; |
| 278 return NULL; | 281 return NULL; |
| 279 } | 282 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 296 FileSystemBackend* backend = GetFileSystemBackend(type); | 299 FileSystemBackend* backend = GetFileSystemBackend(type); |
| 297 if (backend->GetQuotaUtil()) | 300 if (backend->GetQuotaUtil()) |
| 298 return backend->GetQuotaUtil()->GetAccessObservers(type); | 301 return backend->GetQuotaUtil()->GetAccessObservers(type); |
| 299 return NULL; | 302 return NULL; |
| 300 } | 303 } |
| 301 | 304 |
| 302 void FileSystemContext::GetFileSystemTypes( | 305 void FileSystemContext::GetFileSystemTypes( |
| 303 std::vector<FileSystemType>* types) const { | 306 std::vector<FileSystemType>* types) const { |
| 304 types->clear(); | 307 types->clear(); |
| 305 for (FileSystemBackendMap::const_iterator iter = backend_map_.begin(); | 308 for (FileSystemBackendMap::const_iterator iter = backend_map_.begin(); |
| 306 iter != backend_map_.end(); ++iter) | 309 iter != backend_map_.end(); |
| 310 ++iter) |
| 307 types->push_back(iter->first); | 311 types->push_back(iter->first); |
| 308 } | 312 } |
| 309 | 313 |
| 310 ExternalFileSystemBackend* | 314 ExternalFileSystemBackend* FileSystemContext::external_backend() const { |
| 311 FileSystemContext::external_backend() const { | |
| 312 return static_cast<ExternalFileSystemBackend*>( | 315 return static_cast<ExternalFileSystemBackend*>( |
| 313 GetFileSystemBackend(kFileSystemTypeExternal)); | 316 GetFileSystemBackend(kFileSystemTypeExternal)); |
| 314 } | 317 } |
| 315 | 318 |
| 316 void FileSystemContext::OpenFileSystem( | 319 void FileSystemContext::OpenFileSystem(const GURL& origin_url, |
| 317 const GURL& origin_url, | 320 FileSystemType type, |
| 318 FileSystemType type, | 321 OpenFileSystemMode mode, |
| 319 OpenFileSystemMode mode, | 322 const OpenFileSystemCallback& callback) { |
| 320 const OpenFileSystemCallback& callback) { | |
| 321 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); | 323 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
| 322 DCHECK(!callback.is_null()); | 324 DCHECK(!callback.is_null()); |
| 323 | 325 |
| 324 if (!FileSystemContext::IsSandboxFileSystem(type)) { | 326 if (!FileSystemContext::IsSandboxFileSystem(type)) { |
| 325 // Disallow opening a non-sandboxed filesystem. | 327 // Disallow opening a non-sandboxed filesystem. |
| 326 callback.Run(GURL(), std::string(), base::File::FILE_ERROR_SECURITY); | 328 callback.Run(GURL(), std::string(), base::File::FILE_ERROR_SECURITY); |
| 327 return; | 329 return; |
| 328 } | 330 } |
| 329 | 331 |
| 330 FileSystemBackend* backend = GetFileSystemBackend(type); | 332 FileSystemBackend* backend = GetFileSystemBackend(type); |
| 331 if (!backend) { | 333 if (!backend) { |
| 332 callback.Run(GURL(), std::string(), base::File::FILE_ERROR_SECURITY); | 334 callback.Run(GURL(), std::string(), base::File::FILE_ERROR_SECURITY); |
| 333 return; | 335 return; |
| 334 } | 336 } |
| 335 | 337 |
| 336 backend->ResolveURL( | 338 backend->ResolveURL( |
| 337 CreateCrackedFileSystemURL(origin_url, type, base::FilePath()), | 339 CreateCrackedFileSystemURL(origin_url, type, base::FilePath()), |
| 338 mode, | 340 mode, |
| 339 callback); | 341 callback); |
| 340 } | 342 } |
| 341 | 343 |
| 342 void FileSystemContext::ResolveURL( | 344 void FileSystemContext::ResolveURL(const FileSystemURL& url, |
| 343 const FileSystemURL& url, | 345 const ResolveURLCallback& callback) { |
| 344 const ResolveURLCallback& callback) { | |
| 345 DCHECK(!callback.is_null()); | 346 DCHECK(!callback.is_null()); |
| 346 | 347 |
| 347 // If not on IO thread, forward before passing the task to the backend. | 348 // If not on IO thread, forward before passing the task to the backend. |
| 348 if (!io_task_runner_->RunsTasksOnCurrentThread()) { | 349 if (!io_task_runner_->RunsTasksOnCurrentThread()) { |
| 349 ResolveURLCallback relay_callback = | 350 ResolveURLCallback relay_callback = base::Bind( |
| 350 base::Bind(&RelayResolveURLCallback, | 351 &RelayResolveURLCallback, base::MessageLoopProxy::current(), callback); |
| 351 base::MessageLoopProxy::current(), callback); | |
| 352 io_task_runner_->PostTask( | 352 io_task_runner_->PostTask( |
| 353 FROM_HERE, | 353 FROM_HERE, |
| 354 base::Bind(&FileSystemContext::ResolveURL, this, url, relay_callback)); | 354 base::Bind(&FileSystemContext::ResolveURL, this, url, relay_callback)); |
| 355 return; | 355 return; |
| 356 } | 356 } |
| 357 | 357 |
| 358 FileSystemBackend* backend = GetFileSystemBackend(url.type()); | 358 FileSystemBackend* backend = GetFileSystemBackend(url.type()); |
| 359 if (!backend) { | 359 if (!backend) { |
| 360 callback.Run(base::File::FILE_ERROR_SECURITY, | 360 callback.Run(base::File::FILE_ERROR_SECURITY, |
| 361 FileSystemInfo(), base::FilePath(), | 361 FileSystemInfo(), |
| 362 base::FilePath(), |
| 362 FileSystemContext::RESOLVED_ENTRY_NOT_FOUND); | 363 FileSystemContext::RESOLVED_ENTRY_NOT_FOUND); |
| 363 return; | 364 return; |
| 364 } | 365 } |
| 365 | 366 |
| 366 backend->ResolveURL( | 367 backend->ResolveURL( |
| 367 url, | 368 url, |
| 368 OPEN_FILE_SYSTEM_FAIL_IF_NONEXISTENT, | 369 OPEN_FILE_SYSTEM_FAIL_IF_NONEXISTENT, |
| 369 base::Bind(&FileSystemContext::DidOpenFileSystemForResolveURL, | 370 base::Bind(&FileSystemContext::DidOpenFileSystemForResolveURL, |
| 370 this, | 371 this, |
| 371 url, | 372 url, |
| 372 callback)); | 373 callback)); |
| 373 } | 374 } |
| 374 | 375 |
| 375 void FileSystemContext::AttemptAutoMountForURLRequest( | 376 void FileSystemContext::AttemptAutoMountForURLRequest( |
| 376 const net::URLRequest* url_request, | 377 const net::URLRequest* url_request, |
| 377 const std::string& storage_domain, | 378 const std::string& storage_domain, |
| 378 const StatusCallback& callback) { | 379 const StatusCallback& callback) { |
| 379 FileSystemURL filesystem_url(url_request->url()); | 380 FileSystemURL filesystem_url(url_request->url()); |
| 380 if (filesystem_url.type() == kFileSystemTypeExternal) { | 381 if (filesystem_url.type() == kFileSystemTypeExternal) { |
| 381 for (size_t i = 0; i < auto_mount_handlers_.size(); i++) { | 382 for (size_t i = 0; i < auto_mount_handlers_.size(); i++) { |
| 382 if (auto_mount_handlers_[i].Run(url_request, filesystem_url, | 383 if (auto_mount_handlers_[i].Run( |
| 383 storage_domain, callback)) { | 384 url_request, filesystem_url, storage_domain, callback)) { |
| 384 return; | 385 return; |
| 385 } | 386 } |
| 386 } | 387 } |
| 387 } | 388 } |
| 388 callback.Run(base::File::FILE_ERROR_NOT_FOUND); | 389 callback.Run(base::File::FILE_ERROR_NOT_FOUND); |
| 389 } | 390 } |
| 390 | 391 |
| 391 void FileSystemContext::DeleteFileSystem( | 392 void FileSystemContext::DeleteFileSystem(const GURL& origin_url, |
| 392 const GURL& origin_url, | 393 FileSystemType type, |
| 393 FileSystemType type, | 394 const StatusCallback& callback) { |
| 394 const StatusCallback& callback) { | |
| 395 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); | 395 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
| 396 DCHECK(origin_url == origin_url.GetOrigin()); | 396 DCHECK(origin_url == origin_url.GetOrigin()); |
| 397 DCHECK(!callback.is_null()); | 397 DCHECK(!callback.is_null()); |
| 398 | 398 |
| 399 FileSystemBackend* backend = GetFileSystemBackend(type); | 399 FileSystemBackend* backend = GetFileSystemBackend(type); |
| 400 if (!backend) { | 400 if (!backend) { |
| 401 callback.Run(base::File::FILE_ERROR_SECURITY); | 401 callback.Run(base::File::FILE_ERROR_SECURITY); |
| 402 return; | 402 return; |
| 403 } | 403 } |
| 404 if (!backend->GetQuotaUtil()) { | 404 if (!backend->GetQuotaUtil()) { |
| 405 callback.Run(base::File::FILE_ERROR_INVALID_OPERATION); | 405 callback.Run(base::File::FILE_ERROR_INVALID_OPERATION); |
| 406 return; | 406 return; |
| 407 } | 407 } |
| 408 | 408 |
| 409 base::PostTaskAndReplyWithResult( | 409 base::PostTaskAndReplyWithResult( |
| 410 default_file_task_runner(), | 410 default_file_task_runner(), |
| 411 FROM_HERE, | 411 FROM_HERE, |
| 412 // It is safe to pass Unretained(quota_util) since context owns it. | 412 // It is safe to pass Unretained(quota_util) since context owns it. |
| 413 base::Bind(&FileSystemQuotaUtil::DeleteOriginDataOnFileTaskRunner, | 413 base::Bind(&FileSystemQuotaUtil::DeleteOriginDataOnFileTaskRunner, |
| 414 base::Unretained(backend->GetQuotaUtil()), | 414 base::Unretained(backend->GetQuotaUtil()), |
| 415 make_scoped_refptr(this), | 415 make_scoped_refptr(this), |
| 416 base::Unretained(quota_manager_proxy()), | 416 base::Unretained(quota_manager_proxy()), |
| 417 origin_url, | 417 origin_url, |
| 418 type), | 418 type), |
| 419 callback); | 419 callback); |
| 420 } | 420 } |
| 421 | 421 |
| 422 scoped_ptr<webkit_blob::FileStreamReader> | 422 scoped_ptr<storage::FileStreamReader> FileSystemContext::CreateFileStreamReader( |
| 423 FileSystemContext::CreateFileStreamReader( | |
| 424 const FileSystemURL& url, | 423 const FileSystemURL& url, |
| 425 int64 offset, | 424 int64 offset, |
| 426 const base::Time& expected_modification_time) { | 425 const base::Time& expected_modification_time) { |
| 427 if (!url.is_valid()) | 426 if (!url.is_valid()) |
| 428 return scoped_ptr<webkit_blob::FileStreamReader>(); | 427 return scoped_ptr<storage::FileStreamReader>(); |
| 429 FileSystemBackend* backend = GetFileSystemBackend(url.type()); | 428 FileSystemBackend* backend = GetFileSystemBackend(url.type()); |
| 430 if (!backend) | 429 if (!backend) |
| 431 return scoped_ptr<webkit_blob::FileStreamReader>(); | 430 return scoped_ptr<storage::FileStreamReader>(); |
| 432 return backend->CreateFileStreamReader( | 431 return backend->CreateFileStreamReader( |
| 433 url, offset, expected_modification_time, this); | 432 url, offset, expected_modification_time, this); |
| 434 } | 433 } |
| 435 | 434 |
| 436 scoped_ptr<FileStreamWriter> FileSystemContext::CreateFileStreamWriter( | 435 scoped_ptr<FileStreamWriter> FileSystemContext::CreateFileStreamWriter( |
| 437 const FileSystemURL& url, | 436 const FileSystemURL& url, |
| 438 int64 offset) { | 437 int64 offset) { |
| 439 if (!url.is_valid()) | 438 if (!url.is_valid()) |
| 440 return scoped_ptr<FileStreamWriter>(); | 439 return scoped_ptr<FileStreamWriter>(); |
| 441 FileSystemBackend* backend = GetFileSystemBackend(url.type()); | 440 FileSystemBackend* backend = GetFileSystemBackend(url.type()); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 510 | 509 |
| 511 void FileSystemContext::DeleteOnCorrectThread() const { | 510 void FileSystemContext::DeleteOnCorrectThread() const { |
| 512 if (!io_task_runner_->RunsTasksOnCurrentThread() && | 511 if (!io_task_runner_->RunsTasksOnCurrentThread() && |
| 513 io_task_runner_->DeleteSoon(FROM_HERE, this)) { | 512 io_task_runner_->DeleteSoon(FROM_HERE, this)) { |
| 514 return; | 513 return; |
| 515 } | 514 } |
| 516 delete this; | 515 delete this; |
| 517 } | 516 } |
| 518 | 517 |
| 519 FileSystemOperation* FileSystemContext::CreateFileSystemOperation( | 518 FileSystemOperation* FileSystemContext::CreateFileSystemOperation( |
| 520 const FileSystemURL& url, base::File::Error* error_code) { | 519 const FileSystemURL& url, |
| 520 base::File::Error* error_code) { |
| 521 if (!url.is_valid()) { | 521 if (!url.is_valid()) { |
| 522 if (error_code) | 522 if (error_code) |
| 523 *error_code = base::File::FILE_ERROR_INVALID_URL; | 523 *error_code = base::File::FILE_ERROR_INVALID_URL; |
| 524 return NULL; | 524 return NULL; |
| 525 } | 525 } |
| 526 | 526 |
| 527 FileSystemBackend* backend = GetFileSystemBackend(url.type()); | 527 FileSystemBackend* backend = GetFileSystemBackend(url.type()); |
| 528 if (!backend) { | 528 if (!backend) { |
| 529 if (error_code) | 529 if (error_code) |
| 530 *error_code = base::File::FILE_ERROR_FAILED; | 530 *error_code = base::File::FILE_ERROR_FAILED; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 562 } | 562 } |
| 563 if (cracked == current) | 563 if (cracked == current) |
| 564 break; | 564 break; |
| 565 current = cracked; | 565 current = cracked; |
| 566 } | 566 } |
| 567 return current; | 567 return current; |
| 568 } | 568 } |
| 569 | 569 |
| 570 void FileSystemContext::RegisterBackend(FileSystemBackend* backend) { | 570 void FileSystemContext::RegisterBackend(FileSystemBackend* backend) { |
| 571 const FileSystemType mount_types[] = { | 571 const FileSystemType mount_types[] = { |
| 572 kFileSystemTypeTemporary, | 572 kFileSystemTypeTemporary, kFileSystemTypePersistent, |
| 573 kFileSystemTypePersistent, | 573 kFileSystemTypeIsolated, kFileSystemTypeExternal, |
| 574 kFileSystemTypeIsolated, | |
| 575 kFileSystemTypeExternal, | |
| 576 }; | 574 }; |
| 577 // Register file system backends for public mount types. | 575 // Register file system backends for public mount types. |
| 578 for (size_t j = 0; j < ARRAYSIZE_UNSAFE(mount_types); ++j) { | 576 for (size_t j = 0; j < ARRAYSIZE_UNSAFE(mount_types); ++j) { |
| 579 if (backend->CanHandleType(mount_types[j])) { | 577 if (backend->CanHandleType(mount_types[j])) { |
| 580 const bool inserted = backend_map_.insert( | 578 const bool inserted = |
| 581 std::make_pair(mount_types[j], backend)).second; | 579 backend_map_.insert(std::make_pair(mount_types[j], backend)).second; |
| 582 DCHECK(inserted); | 580 DCHECK(inserted); |
| 583 } | 581 } |
| 584 } | 582 } |
| 585 // Register file system backends for internal types. | 583 // Register file system backends for internal types. |
| 586 for (int t = kFileSystemInternalTypeEnumStart + 1; | 584 for (int t = kFileSystemInternalTypeEnumStart + 1; |
| 587 t < kFileSystemInternalTypeEnumEnd; ++t) { | 585 t < kFileSystemInternalTypeEnumEnd; |
| 586 ++t) { |
| 588 FileSystemType type = static_cast<FileSystemType>(t); | 587 FileSystemType type = static_cast<FileSystemType>(t); |
| 589 if (backend->CanHandleType(type)) { | 588 if (backend->CanHandleType(type)) { |
| 590 const bool inserted = backend_map_.insert( | 589 const bool inserted = |
| 591 std::make_pair(type, backend)).second; | 590 backend_map_.insert(std::make_pair(type, backend)).second; |
| 592 DCHECK(inserted); | 591 DCHECK(inserted); |
| 593 } | 592 } |
| 594 } | 593 } |
| 595 } | 594 } |
| 596 | 595 |
| 597 void FileSystemContext::DidOpenFileSystemForResolveURL( | 596 void FileSystemContext::DidOpenFileSystemForResolveURL( |
| 598 const FileSystemURL& url, | 597 const FileSystemURL& url, |
| 599 const FileSystemContext::ResolveURLCallback& callback, | 598 const FileSystemContext::ResolveURLCallback& callback, |
| 600 const GURL& filesystem_root, | 599 const GURL& filesystem_root, |
| 601 const std::string& filesystem_name, | 600 const std::string& filesystem_name, |
| 602 base::File::Error error) { | 601 base::File::Error error) { |
| 603 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); | 602 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
| 604 | 603 |
| 605 if (error != base::File::FILE_OK) { | 604 if (error != base::File::FILE_OK) { |
| 606 callback.Run(error, FileSystemInfo(), base::FilePath(), | 605 callback.Run(error, |
| 606 FileSystemInfo(), |
| 607 base::FilePath(), |
| 607 FileSystemContext::RESOLVED_ENTRY_NOT_FOUND); | 608 FileSystemContext::RESOLVED_ENTRY_NOT_FOUND); |
| 608 return; | 609 return; |
| 609 } | 610 } |
| 610 | 611 |
| 611 fileapi::FileSystemInfo info( | 612 storage::FileSystemInfo info( |
| 612 filesystem_name, filesystem_root, url.mount_type()); | 613 filesystem_name, filesystem_root, url.mount_type()); |
| 613 | 614 |
| 614 // Extract the virtual path not containing a filesystem type part from |url|. | 615 // Extract the virtual path not containing a filesystem type part from |url|. |
| 615 base::FilePath parent = CrackURL(filesystem_root).virtual_path(); | 616 base::FilePath parent = CrackURL(filesystem_root).virtual_path(); |
| 616 base::FilePath child = url.virtual_path(); | 617 base::FilePath child = url.virtual_path(); |
| 617 base::FilePath path; | 618 base::FilePath path; |
| 618 | 619 |
| 619 if (parent.empty()) { | 620 if (parent.empty()) { |
| 620 path = child; | 621 path = child; |
| 621 } else if (parent != child) { | 622 } else if (parent != child) { |
| 622 bool result = parent.AppendRelativePath(child, &path); | 623 bool result = parent.AppendRelativePath(child, &path); |
| 623 DCHECK(result); | 624 DCHECK(result); |
| 624 } | 625 } |
| 625 | 626 |
| 626 operation_runner()->GetMetadata( | 627 operation_runner()->GetMetadata( |
| 627 url, base::Bind(&DidGetMetadataForResolveURL, path, callback, info)); | 628 url, base::Bind(&DidGetMetadataForResolveURL, path, callback, info)); |
| 628 } | 629 } |
| 629 | 630 |
| 630 } // namespace fileapi | 631 } // namespace storage |
| OLD | NEW |