Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(415)

Side by Side Diff: webkit/fileapi/file_system_context.cc

Issue 14096022: Make MountPointProvider pluggable from outside webkit/fileapi (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: build fix etc Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « webkit/fileapi/file_system_context.h ('k') | webkit/fileapi/file_system_context_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/fileapi/file_system_context.h" 5 #include "webkit/fileapi/file_system_context.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/stl_util.h" 8 #include "base/stl_util.h"
9 #include "base/single_thread_task_runner.h" 9 #include "base/single_thread_task_runner.h"
10 #include "googleurl/src/gurl.h" 10 #include "googleurl/src/gurl.h"
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 callback.Run(error, filesystem_name, filesystem_root); 54 callback.Run(error, filesystem_name, filesystem_root);
55 } 55 }
56 56
57 } // namespace 57 } // namespace
58 58
59 FileSystemContext::FileSystemContext( 59 FileSystemContext::FileSystemContext(
60 scoped_ptr<FileSystemTaskRunners> task_runners, 60 scoped_ptr<FileSystemTaskRunners> task_runners,
61 ExternalMountPoints* external_mount_points, 61 ExternalMountPoints* external_mount_points,
62 quota::SpecialStoragePolicy* special_storage_policy, 62 quota::SpecialStoragePolicy* special_storage_policy,
63 quota::QuotaManagerProxy* quota_manager_proxy, 63 quota::QuotaManagerProxy* quota_manager_proxy,
64 ScopedVector<FileSystemMountPointProvider> additional_providers,
64 const base::FilePath& partition_path, 65 const base::FilePath& partition_path,
65 const FileSystemOptions& options) 66 const FileSystemOptions& options)
66 : task_runners_(task_runners.Pass()), 67 : task_runners_(task_runners.Pass()),
67 quota_manager_proxy_(quota_manager_proxy), 68 quota_manager_proxy_(quota_manager_proxy),
68 sandbox_provider_( 69 sandbox_provider_(
69 new SandboxMountPointProvider( 70 new SandboxMountPointProvider(
70 quota_manager_proxy, 71 quota_manager_proxy,
71 task_runners_->file_task_runner(), 72 task_runners_->file_task_runner(),
72 partition_path, 73 partition_path,
73 options)), 74 options)),
74 isolated_provider_(new IsolatedMountPointProvider(partition_path)), 75 isolated_provider_(new IsolatedMountPointProvider(partition_path)),
76 additional_providers_(additional_providers.Pass()),
75 external_mount_points_(external_mount_points), 77 external_mount_points_(external_mount_points),
76 partition_path_(partition_path) { 78 partition_path_(partition_path) {
77 DCHECK(task_runners_.get()); 79 DCHECK(task_runners_.get());
78 80
79 if (quota_manager_proxy) { 81 if (quota_manager_proxy) {
80 quota_manager_proxy->RegisterClient(CreateQuotaClient( 82 quota_manager_proxy->RegisterClient(CreateQuotaClient(
81 this, options.is_incognito())); 83 this, options.is_incognito()));
82 } 84 }
83 85
86 RegisterMountPointProvider(sandbox_provider_.get());
87 RegisterMountPointProvider(isolated_provider_.get());
88
84 #if defined(OS_CHROMEOS) 89 #if defined(OS_CHROMEOS)
90 // TODO(kinuko): Move this out of webkit/fileapi layer.
85 DCHECK(external_mount_points); 91 DCHECK(external_mount_points);
86 external_provider_.reset( 92 external_provider_.reset(
87 new chromeos::CrosMountPointProvider( 93 new chromeos::CrosMountPointProvider(
88 special_storage_policy, 94 special_storage_policy,
89 external_mount_points, 95 external_mount_points,
90 ExternalMountPoints::GetSystemInstance())); 96 ExternalMountPoints::GetSystemInstance()));
97 RegisterMountPointProvider(external_provider_.get());
91 #endif 98 #endif
92 99
100 for (ScopedVector<FileSystemMountPointProvider>::const_iterator iter =
101 additional_providers_.begin();
102 iter != additional_providers_.end(); ++iter) {
103 RegisterMountPointProvider(*iter);
104 }
105
106 // Additional mount points must be added before regular system-wide
107 // mount points.
93 if (external_mount_points) 108 if (external_mount_points)
94 url_crackers_.push_back(external_mount_points); 109 url_crackers_.push_back(external_mount_points);
95 url_crackers_.push_back(ExternalMountPoints::GetSystemInstance()); 110 url_crackers_.push_back(ExternalMountPoints::GetSystemInstance());
96 url_crackers_.push_back(IsolatedContext::GetInstance()); 111 url_crackers_.push_back(IsolatedContext::GetInstance());
97 } 112 }
98 113
99 bool FileSystemContext::DeleteDataForOriginOnFileThread( 114 bool FileSystemContext::DeleteDataForOriginOnFileThread(
100 const GURL& origin_url) { 115 const GURL& origin_url) {
101 DCHECK(task_runners_->file_task_runner()->RunsTasksOnCurrentThread()); 116 DCHECK(task_runners_->file_task_runner()->RunsTasksOnCurrentThread());
102 DCHECK(sandbox_provider()); 117 DCHECK(sandbox_provider());
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 FileSystemMountPointProvider* mount_point_provider = 159 FileSystemMountPointProvider* mount_point_provider =
145 GetMountPointProvider(type); 160 GetMountPointProvider(type);
146 if (!mount_point_provider) 161 if (!mount_point_provider)
147 return NULL; 162 return NULL;
148 return mount_point_provider->GetCopyOrMoveFileValidatorFactory( 163 return mount_point_provider->GetCopyOrMoveFileValidatorFactory(
149 type, error_code); 164 type, error_code);
150 } 165 }
151 166
152 FileSystemMountPointProvider* FileSystemContext::GetMountPointProvider( 167 FileSystemMountPointProvider* FileSystemContext::GetMountPointProvider(
153 FileSystemType type) const { 168 FileSystemType type) const {
154 switch (type) { 169 MountPointProviderMap::const_iterator found = provider_map_.find(type);
155 case kFileSystemTypeTemporary: 170 if (found != provider_map_.end())
156 case kFileSystemTypePersistent: 171 return found->second;
157 case kFileSystemTypeSyncable: 172 NOTREACHED() << "Unknown filesystem type: " << type;
158 return sandbox_provider_.get(); 173 return NULL;
159 case kFileSystemTypeExternal:
160 case kFileSystemTypeDrive:
161 case kFileSystemTypeRestrictedNativeLocal:
162 return external_provider_.get();
163 case kFileSystemTypeIsolated:
164 case kFileSystemTypeDragged:
165 case kFileSystemTypeNativeMedia:
166 case kFileSystemTypeDeviceMedia:
167 return isolated_provider_.get();
168 case kFileSystemTypeNativeLocal:
169 case kFileSystemTypeNativeForPlatformApp:
170 #if defined(OS_CHROMEOS)
171 return external_provider_.get();
172 #else
173 return isolated_provider_.get();
174 #endif
175 default:
176 if (provider_map_.find(type) != provider_map_.end())
177 return provider_map_.find(type)->second;
178 // Fall through.
179 case kFileSystemTypeUnknown:
180 NOTREACHED();
181 return NULL;
182 }
183 } 174 }
184 175
185 const UpdateObserverList* FileSystemContext::GetUpdateObservers( 176 const UpdateObserverList* FileSystemContext::GetUpdateObservers(
186 FileSystemType type) const { 177 FileSystemType type) const {
187 // Currently update observer is only available in SandboxMountPointProvider 178 // Currently update observer is only available in SandboxMountPointProvider
188 // and TestMountPointProvider. 179 // and TestMountPointProvider.
189 // TODO(kinuko): Probably GetUpdateObservers() virtual method should be 180 // TODO(kinuko): Probably GetUpdateObservers() virtual method should be
190 // added to FileSystemMountPointProvider interface and be called like 181 // added to FileSystemMountPointProvider interface and be called like
191 // other GetFoo() methods do. 182 // other GetFoo() methods do.
192 if (SandboxMountPointProvider::CanHandleType(type)) 183 if (SandboxMountPointProvider::IsSandboxType(type))
193 return sandbox_provider()->GetUpdateObservers(type); 184 return sandbox_provider()->GetUpdateObservers(type);
194 if (type != kFileSystemTypeTest) 185 if (type != kFileSystemTypeTest)
195 return NULL; 186 return NULL;
196 FileSystemMountPointProvider* mount_point_provider = 187 FileSystemMountPointProvider* mount_point_provider =
197 GetMountPointProvider(type); 188 GetMountPointProvider(type);
198 return static_cast<TestMountPointProvider*>( 189 return static_cast<TestMountPointProvider*>(
199 mount_point_provider)->GetUpdateObservers(type); 190 mount_point_provider)->GetUpdateObservers(type);
200 } 191 }
201 192
202 SandboxMountPointProvider* 193 SandboxMountPointProvider*
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
313 int64 offset) { 304 int64 offset) {
314 if (!url.is_valid()) 305 if (!url.is_valid())
315 return scoped_ptr<FileStreamWriter>(); 306 return scoped_ptr<FileStreamWriter>();
316 FileSystemMountPointProvider* mount_point_provider = 307 FileSystemMountPointProvider* mount_point_provider =
317 GetMountPointProvider(url.type()); 308 GetMountPointProvider(url.type());
318 if (!mount_point_provider) 309 if (!mount_point_provider)
319 return scoped_ptr<FileStreamWriter>(); 310 return scoped_ptr<FileStreamWriter>();
320 return mount_point_provider->CreateFileStreamWriter(url, offset, this); 311 return mount_point_provider->CreateFileStreamWriter(url, offset, this);
321 } 312 }
322 313
323 void FileSystemContext::RegisterMountPointProvider(
324 FileSystemType type,
325 FileSystemMountPointProvider* provider) {
326 DCHECK(provider);
327 DCHECK(provider_map_.find(type) == provider_map_.end());
328 provider_map_[type] = provider;
329 }
330
331 void FileSystemContext::SetLocalFileChangeTracker( 314 void FileSystemContext::SetLocalFileChangeTracker(
332 scoped_ptr<sync_file_system::LocalFileChangeTracker> tracker) { 315 scoped_ptr<sync_file_system::LocalFileChangeTracker> tracker) {
333 DCHECK(!change_tracker_.get()); 316 DCHECK(!change_tracker_.get());
334 DCHECK(tracker.get()); 317 DCHECK(tracker.get());
335 change_tracker_ = tracker.Pass(); 318 change_tracker_ = tracker.Pass();
336 sandbox_provider_->AddSyncableFileUpdateObserver( 319 sandbox_provider_->AddSyncableFileUpdateObserver(
337 change_tracker_.get(), 320 change_tracker_.get(),
338 task_runners_->file_task_runner()); 321 task_runners_->file_task_runner());
339 sandbox_provider_->AddSyncableFileChangeObserver( 322 sandbox_provider_->AddSyncableFileChangeObserver(
340 change_tracker_.get(), 323 change_tracker_.get(),
(...skipping 19 matching lines...) Expand all
360 FileSystemContext::~FileSystemContext() { 343 FileSystemContext::~FileSystemContext() {
361 task_runners_->file_task_runner()->DeleteSoon( 344 task_runners_->file_task_runner()->DeleteSoon(
362 FROM_HERE, change_tracker_.release()); 345 FROM_HERE, change_tracker_.release());
363 } 346 }
364 347
365 void FileSystemContext::DeleteOnCorrectThread() const { 348 void FileSystemContext::DeleteOnCorrectThread() const {
366 if (!task_runners_->io_task_runner()->RunsTasksOnCurrentThread() && 349 if (!task_runners_->io_task_runner()->RunsTasksOnCurrentThread() &&
367 task_runners_->io_task_runner()->DeleteSoon(FROM_HERE, this)) { 350 task_runners_->io_task_runner()->DeleteSoon(FROM_HERE, this)) {
368 return; 351 return;
369 } 352 }
370 STLDeleteContainerPairSecondPointers(provider_map_.begin(),
371 provider_map_.end());
372 delete this; 353 delete this;
373 } 354 }
374 355
375 FileSystemURL FileSystemContext::CrackFileSystemURL( 356 FileSystemURL FileSystemContext::CrackFileSystemURL(
376 const FileSystemURL& url) const { 357 const FileSystemURL& url) const {
377 if (!url.is_valid()) 358 if (!url.is_valid())
378 return FileSystemURL(); 359 return FileSystemURL();
379 360
380 // The returned value in case there is no crackers which can crack the url. 361 // The returned value in case there is no crackers which can crack the url.
381 // This is valid situation for non isolated/external file systems. 362 // This is valid situation for non isolated/external file systems.
(...skipping 19 matching lines...) Expand all
401 382
402 FileSystemFileUtil* FileSystemContext::GetFileUtil( 383 FileSystemFileUtil* FileSystemContext::GetFileUtil(
403 FileSystemType type) const { 384 FileSystemType type) const {
404 FileSystemMountPointProvider* mount_point_provider = 385 FileSystemMountPointProvider* mount_point_provider =
405 GetMountPointProvider(type); 386 GetMountPointProvider(type);
406 if (!mount_point_provider) 387 if (!mount_point_provider)
407 return NULL; 388 return NULL;
408 return mount_point_provider->GetFileUtil(type); 389 return mount_point_provider->GetFileUtil(type);
409 } 390 }
410 391
392 void FileSystemContext::RegisterMountPointProvider(
393 FileSystemMountPointProvider* provider) {
394 const FileSystemType mount_types[] = {
395 kFileSystemTypeTemporary,
396 kFileSystemTypePersistent,
397 kFileSystemTypeIsolated,
398 kFileSystemTypeExternal,
399 };
400 // Register mount point providers for public mount types.
401 for (size_t j = 0; j < ARRAYSIZE_UNSAFE(mount_types); ++j) {
402 if (provider->CanHandleType(mount_types[j])) {
403 const bool inserted = provider_map_.insert(
404 std::make_pair(mount_types[j], provider)).second;
405 DCHECK(inserted);
406 }
407 }
408 // Register mount point providers for internal types.
409 for (int t = kFileSystemInternalTypeEnumStart + 1;
410 t < kFileSystemInternalTypeEnumEnd; ++t) {
411 FileSystemType type = static_cast<FileSystemType>(t);
412 if (provider->CanHandleType(type)) {
413 const bool inserted = provider_map_.insert(
414 std::make_pair(type, provider)).second;
415 DCHECK(inserted);
416 }
417 }
418 }
419
411 } // namespace fileapi 420 } // namespace fileapi
OLDNEW
« no previous file with comments | « webkit/fileapi/file_system_context.h ('k') | webkit/fileapi/file_system_context_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698