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/sandbox_mount_point_provider.h" | 5 #include "webkit/browser/fileapi/sandbox_mount_point_provider.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/memory/scoped_ptr.h" | |
12 #include "base/metrics/histogram.h" | 11 #include "base/metrics/histogram.h" |
13 #include "base/stl_util.h" | 12 #include "base/stl_util.h" |
14 #include "base/task_runner_util.h" | 13 #include "base/task_runner_util.h" |
15 #include "net/base/net_util.h" | 14 #include "net/base/net_util.h" |
16 #include "url/gurl.h" | |
17 #include "webkit/browser/fileapi/async_file_util_adapter.h" | 15 #include "webkit/browser/fileapi/async_file_util_adapter.h" |
18 #include "webkit/browser/fileapi/copy_or_move_file_validator.h" | 16 #include "webkit/browser/fileapi/copy_or_move_file_validator.h" |
19 #include "webkit/browser/fileapi/file_system_context.h" | 17 #include "webkit/browser/fileapi/file_system_context.h" |
20 #include "webkit/browser/fileapi/file_system_file_stream_reader.h" | 18 #include "webkit/browser/fileapi/file_system_file_stream_reader.h" |
21 #include "webkit/browser/fileapi/file_system_operation_context.h" | 19 #include "webkit/browser/fileapi/file_system_operation_context.h" |
22 #include "webkit/browser/fileapi/file_system_options.h" | 20 #include "webkit/browser/fileapi/file_system_options.h" |
23 #include "webkit/browser/fileapi/file_system_task_runners.h" | 21 #include "webkit/browser/fileapi/file_system_task_runners.h" |
24 #include "webkit/browser/fileapi/file_system_usage_cache.h" | 22 #include "webkit/browser/fileapi/file_system_usage_cache.h" |
25 #include "webkit/browser/fileapi/local_file_system_operation.h" | 23 #include "webkit/browser/fileapi/local_file_system_operation.h" |
26 #include "webkit/browser/fileapi/obfuscated_file_util.h" | 24 #include "webkit/browser/fileapi/obfuscated_file_util.h" |
27 #include "webkit/browser/fileapi/sandbox_file_stream_writer.h" | 25 #include "webkit/browser/fileapi/sandbox_file_stream_writer.h" |
28 #include "webkit/browser/fileapi/sandbox_quota_observer.h" | 26 #include "webkit/browser/fileapi/sandbox_quota_observer.h" |
29 #include "webkit/browser/fileapi/syncable/syncable_file_system_operation.h" | |
30 #include "webkit/browser/quota/quota_manager.h" | 27 #include "webkit/browser/quota/quota_manager.h" |
31 #include "webkit/common/fileapi/file_system_types.h" | 28 #include "webkit/common/fileapi/file_system_types.h" |
32 #include "webkit/common/fileapi/file_system_util.h" | 29 #include "webkit/common/fileapi/file_system_util.h" |
33 | 30 |
34 using quota::QuotaManagerProxy; | |
35 | |
36 namespace fileapi { | 31 namespace fileapi { |
37 | 32 |
38 namespace { | 33 namespace { |
39 | 34 |
40 const char kChromeScheme[] = "chrome"; | 35 const char kChromeScheme[] = "chrome"; |
41 const char kExtensionScheme[] = "chrome-extension"; | 36 const char kExtensionScheme[] = "chrome-extension"; |
42 | 37 |
43 const char kOpenFileSystemLabel[] = "FileSystem.OpenFileSystem"; | 38 const char kOpenFileSystemLabel[] = "FileSystem.OpenFileSystem"; |
44 const char kOpenFileSystemDetailLabel[] = "FileSystem.OpenFileSystemDetail"; | 39 const char kOpenFileSystemDetailLabel[] = "FileSystem.OpenFileSystemDetail"; |
45 const char kOpenFileSystemDetailNonThrottledLabel[] = | 40 const char kOpenFileSystemDetailNonThrottledLabel[] = |
46 "FileSystem.OpenFileSystemDetailNonthrottled"; | 41 "FileSystem.OpenFileSystemDetailNonthrottled"; |
47 int64 kMinimumStatsCollectionIntervalHours = 1; | 42 int64 kMinimumStatsCollectionIntervalHours = 1; |
48 | 43 |
49 // A command line switch to disable usage tracking. | 44 // A command line switch to disable usage tracking. |
50 const char kDisableUsageTracking[] = "disable-file-system-usage-tracking"; | 45 const char kDisableUsageTracking[] = "disable-file-system-usage-tracking"; |
51 | 46 |
52 enum FileSystemError { | 47 enum FileSystemError { |
53 kOK = 0, | 48 kOK = 0, |
54 kIncognito, | 49 kIncognito, |
55 kInvalidSchemeError, | 50 kInvalidSchemeError, |
56 kCreateDirectoryError, | 51 kCreateDirectoryError, |
57 kNotFound, | 52 kNotFound, |
58 kUnknownError, | 53 kUnknownError, |
59 kFileSystemErrorMax, | 54 kFileSystemErrorMax, |
60 }; | 55 }; |
61 | 56 |
62 const char kTemporaryOriginsCountLabel[] = "FileSystem.TemporaryOriginsCount"; | 57 const char kTemporaryOriginsCountLabel[] = "FileSystem.TemporaryOriginsCount"; |
63 const char kPersistentOriginsCountLabel[] = "FileSystem.PersistentOriginsCount"; | 58 const char kPersistentOriginsCountLabel[] = "FileSystem.PersistentOriginsCount"; |
64 const char kSyncableOriginsCountLabel[] = "FileSystem.SyncableOriginsCount"; | |
65 | 59 |
66 // Restricted names. | 60 // Restricted names. |
67 // http://dev.w3.org/2009/dap/file-system/file-dir-sys.html#naming-restrictions | 61 // http://dev.w3.org/2009/dap/file-system/file-dir-sys.html#naming-restrictions |
68 const base::FilePath::CharType* const kRestrictedNames[] = { | 62 const base::FilePath::CharType* const kRestrictedNames[] = { |
69 FILE_PATH_LITERAL("."), FILE_PATH_LITERAL(".."), | 63 FILE_PATH_LITERAL("."), FILE_PATH_LITERAL(".."), |
70 }; | 64 }; |
71 | 65 |
72 // Restricted chars. | 66 // Restricted chars. |
73 const base::FilePath::CharType kRestrictedChars[] = { | 67 const base::FilePath::CharType kRestrictedChars[] = { |
74 FILE_PATH_LITERAL('/'), FILE_PATH_LITERAL('\\'), | 68 FILE_PATH_LITERAL('/'), FILE_PATH_LITERAL('\\'), |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 SandboxMountPointProvider::SandboxMountPointProvider( | 130 SandboxMountPointProvider::SandboxMountPointProvider( |
137 quota::QuotaManagerProxy* quota_manager_proxy, | 131 quota::QuotaManagerProxy* quota_manager_proxy, |
138 base::SequencedTaskRunner* file_task_runner, | 132 base::SequencedTaskRunner* file_task_runner, |
139 const base::FilePath& profile_path, | 133 const base::FilePath& profile_path, |
140 const FileSystemOptions& file_system_options, | 134 const FileSystemOptions& file_system_options, |
141 quota::SpecialStoragePolicy* special_storage_policy) | 135 quota::SpecialStoragePolicy* special_storage_policy) |
142 : file_task_runner_(file_task_runner), | 136 : file_task_runner_(file_task_runner), |
143 profile_path_(profile_path), | 137 profile_path_(profile_path), |
144 file_system_options_(file_system_options), | 138 file_system_options_(file_system_options), |
145 enable_temporary_file_system_in_incognito_(false), | 139 enable_temporary_file_system_in_incognito_(false), |
146 sandbox_file_util_( | |
147 new AsyncFileUtilAdapter( | |
148 new ObfuscatedFileUtil( | |
149 special_storage_policy, | |
150 profile_path.Append(kFileSystemDirectory), | |
151 file_task_runner))), | |
152 file_system_usage_cache_(new FileSystemUsageCache(file_task_runner)), | 140 file_system_usage_cache_(new FileSystemUsageCache(file_task_runner)), |
153 quota_observer_(new SandboxQuotaObserver( | |
154 quota_manager_proxy, | |
155 file_task_runner, | |
156 sandbox_sync_file_util(), | |
157 file_system_usage_cache_.get())), | |
158 enable_usage_tracking_( | 141 enable_usage_tracking_( |
159 !CommandLine::ForCurrentProcess()->HasSwitch( | 142 !CommandLine::ForCurrentProcess()->HasSwitch( |
160 kDisableUsageTracking)), | 143 kDisableUsageTracking)), |
161 special_storage_policy_(special_storage_policy), | 144 special_storage_policy_(special_storage_policy), |
162 weak_factory_(this) { | 145 weak_factory_(this) { |
| 146 sandbox_file_util_.reset(new AsyncFileUtilAdapter( |
| 147 new ObfuscatedFileUtil( |
| 148 special_storage_policy, |
| 149 profile_path.Append(kFileSystemDirectory), |
| 150 file_task_runner))); |
| 151 |
| 152 quota_observer_.reset(new SandboxQuotaObserver( |
| 153 quota_manager_proxy, |
| 154 file_task_runner, |
| 155 sandbox_sync_file_util(), |
| 156 file_system_usage_cache_.get())); |
| 157 |
163 // Set quota observers. | 158 // Set quota observers. |
164 UpdateObserverList::Source update_observers_src; | 159 UpdateObserverList::Source update_observers_src; |
165 AccessObserverList::Source access_observers_src; | 160 AccessObserverList::Source access_observers_src; |
166 | 161 |
167 if (enable_usage_tracking_) { | 162 if (enable_usage_tracking_) { |
168 update_observers_src.AddObserver(quota_observer_.get(), | 163 update_observers_src.AddObserver(quota_observer_.get(), |
169 file_task_runner_.get()); | 164 file_task_runner_.get()); |
170 access_observers_src.AddObserver(quota_observer_.get(), NULL); | 165 access_observers_src.AddObserver(quota_observer_.get(), NULL); |
171 } | 166 } |
172 | 167 |
173 update_observers_ = UpdateObserverList(update_observers_src); | 168 update_observers_ = UpdateObserverList(update_observers_src); |
174 access_observers_ = AccessObserverList(access_observers_src); | 169 access_observers_ = AccessObserverList(access_observers_src); |
175 syncable_update_observers_ = UpdateObserverList(update_observers_src); | |
176 | 170 |
177 if (!file_task_runner_->RunsTasksOnCurrentThread()) { | 171 if (!file_task_runner_->RunsTasksOnCurrentThread()) { |
178 // Post prepopulate task only if it's not already running on | 172 // Post prepopulate task only if it's not already running on |
179 // file_task_runner (which implies running in tests). | 173 // file_task_runner (which implies running in tests). |
180 file_task_runner_->PostTask( | 174 file_task_runner_->PostTask( |
181 FROM_HERE, | 175 FROM_HERE, |
182 base::Bind(&ObfuscatedFileUtil::MaybePrepopulateDatabase, | 176 base::Bind(&ObfuscatedFileUtil::MaybePrepopulateDatabase, |
183 base::Unretained(sandbox_sync_file_util()))); | 177 base::Unretained(sandbox_sync_file_util()))); |
184 } | 178 } |
185 } | 179 } |
186 | 180 |
187 SandboxMountPointProvider::~SandboxMountPointProvider() { | 181 SandboxMountPointProvider::~SandboxMountPointProvider() { |
188 if (!file_task_runner_->RunsTasksOnCurrentThread()) { | 182 if (!file_task_runner_->RunsTasksOnCurrentThread()) { |
189 AsyncFileUtilAdapter* sandbox_file_util = sandbox_file_util_.release(); | 183 AsyncFileUtilAdapter* sandbox_file_util = sandbox_file_util_.release(); |
190 SandboxQuotaObserver* quota_observer = quota_observer_.release(); | 184 SandboxQuotaObserver* quota_observer = quota_observer_.release(); |
191 FileSystemUsageCache* file_system_usage_cache = | 185 FileSystemUsageCache* file_system_usage_cache = |
192 file_system_usage_cache_.release(); | 186 file_system_usage_cache_.release(); |
193 if (!file_task_runner_->DeleteSoon(FROM_HERE, sandbox_file_util)) | 187 if (!file_task_runner_->DeleteSoon(FROM_HERE, sandbox_file_util)) |
194 delete sandbox_file_util; | 188 delete sandbox_file_util; |
195 if (!file_task_runner_->DeleteSoon(FROM_HERE, quota_observer)) | 189 if (!file_task_runner_->DeleteSoon(FROM_HERE, quota_observer)) |
196 delete quota_observer; | 190 delete quota_observer; |
197 if (!file_task_runner_->DeleteSoon(FROM_HERE, file_system_usage_cache)) | 191 if (!file_task_runner_->DeleteSoon(FROM_HERE, file_system_usage_cache)) |
198 delete file_system_usage_cache; | 192 delete file_system_usage_cache; |
199 } | 193 } |
200 } | 194 } |
201 | 195 |
202 bool SandboxMountPointProvider::CanHandleType(FileSystemType type) const { | 196 bool SandboxMountPointProvider::CanHandleType(FileSystemType type) const { |
203 return type == kFileSystemTypeTemporary || | 197 return type == kFileSystemTypeTemporary || |
204 type == kFileSystemTypePersistent || | 198 type == kFileSystemTypePersistent; |
205 type == kFileSystemTypeSyncable || | 199 } |
206 type == kFileSystemTypeSyncableForInternalSync; | 200 |
| 201 GURL SandboxMountPointProvider::GetRootURI(const GURL& origin_url, |
| 202 FileSystemType type) const { |
| 203 if (!CanHandleType(type)) |
| 204 return GURL(); |
| 205 return GetFileSystemRootURI(origin_url, type); |
207 } | 206 } |
208 | 207 |
209 void SandboxMountPointProvider::OpenFileSystem( | 208 void SandboxMountPointProvider::OpenFileSystem( |
210 const GURL& origin_url, fileapi::FileSystemType type, | 209 const GURL& origin_url, fileapi::FileSystemType type, |
211 OpenFileSystemMode mode, | 210 OpenFileSystemMode mode, |
212 const OpenFileSystemCallback& callback) { | 211 const OpenFileSystemCallback& callback) { |
213 if (file_system_options_.is_incognito() && | 212 if (file_system_options_.is_incognito() && |
214 !(type == kFileSystemTypeTemporary && | 213 !(type == kFileSystemTypeTemporary && |
215 enable_temporary_file_system_in_incognito_)) { | 214 enable_temporary_file_system_in_incognito_)) { |
216 // TODO(kinuko): return an isolated temporary directory. | 215 // TODO(kinuko): return an isolated temporary directory. |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 const FileSystemURL& url, | 275 const FileSystemURL& url, |
277 FileSystemContext* context, | 276 FileSystemContext* context, |
278 base::PlatformFileError* error_code) const { | 277 base::PlatformFileError* error_code) const { |
279 if (!IsAccessValid(url)) { | 278 if (!IsAccessValid(url)) { |
280 *error_code = base::PLATFORM_FILE_ERROR_SECURITY; | 279 *error_code = base::PLATFORM_FILE_ERROR_SECURITY; |
281 return NULL; | 280 return NULL; |
282 } | 281 } |
283 | 282 |
284 scoped_ptr<FileSystemOperationContext> operation_context( | 283 scoped_ptr<FileSystemOperationContext> operation_context( |
285 new FileSystemOperationContext(context)); | 284 new FileSystemOperationContext(context)); |
286 | |
287 // Copy the observer lists (assuming we only have small number of observers). | |
288 if (url.type() == kFileSystemTypeSyncable) { | |
289 operation_context->set_update_observers(syncable_update_observers_); | |
290 operation_context->set_change_observers(syncable_change_observers_); | |
291 return new sync_file_system::SyncableFileSystemOperation( | |
292 url, context, operation_context.Pass()); | |
293 } | |
294 | |
295 // For regular sandboxed types. | |
296 operation_context->set_update_observers(update_observers_); | 285 operation_context->set_update_observers(update_observers_); |
297 operation_context->set_change_observers(change_observers_); | 286 operation_context->set_change_observers(change_observers_); |
298 | 287 |
299 if (special_storage_policy_.get() && | 288 if (special_storage_policy_.get() && |
300 special_storage_policy_->IsStorageUnlimited(url.origin())) { | 289 special_storage_policy_->IsStorageUnlimited(url.origin())) { |
301 operation_context->set_quota_limit_type(quota::kQuotaLimitTypeUnlimited); | 290 operation_context->set_quota_limit_type(quota::kQuotaLimitTypeUnlimited); |
302 } else { | 291 } else { |
303 operation_context->set_quota_limit_type(quota::kQuotaLimitTypeLimited); | 292 operation_context->set_quota_limit_type(quota::kQuotaLimitTypeLimited); |
304 } | 293 } |
305 | 294 |
(...skipping 21 matching lines...) Expand all Loading... |
327 if (!IsAccessValid(url)) | 316 if (!IsAccessValid(url)) |
328 return scoped_ptr<fileapi::FileStreamWriter>(); | 317 return scoped_ptr<fileapi::FileStreamWriter>(); |
329 return scoped_ptr<fileapi::FileStreamWriter>( | 318 return scoped_ptr<fileapi::FileStreamWriter>( |
330 new SandboxFileStreamWriter(context, url, offset, update_observers_)); | 319 new SandboxFileStreamWriter(context, url, offset, update_observers_)); |
331 } | 320 } |
332 | 321 |
333 FileSystemQuotaUtil* SandboxMountPointProvider::GetQuotaUtil() { | 322 FileSystemQuotaUtil* SandboxMountPointProvider::GetQuotaUtil() { |
334 return this; | 323 return this; |
335 } | 324 } |
336 | 325 |
| 326 const UpdateObserverList* |
| 327 SandboxMountPointProvider::GetUpdateObservers(FileSystemType type) const { |
| 328 return &update_observers_; |
| 329 } |
| 330 |
337 SandboxMountPointProvider::OriginEnumerator* | 331 SandboxMountPointProvider::OriginEnumerator* |
338 SandboxMountPointProvider::CreateOriginEnumerator() { | 332 SandboxMountPointProvider::CreateOriginEnumerator() { |
339 return new ObfuscatedOriginEnumerator(sandbox_sync_file_util()); | 333 return new ObfuscatedOriginEnumerator(sandbox_sync_file_util()); |
340 } | 334 } |
341 | 335 |
342 base::FilePath SandboxMountPointProvider::GetBaseDirectoryForOriginAndType( | 336 base::FilePath SandboxMountPointProvider::GetBaseDirectoryForOriginAndType( |
343 const GURL& origin_url, fileapi::FileSystemType type, bool create) { | 337 const GURL& origin_url, fileapi::FileSystemType type, bool create) { |
344 | 338 |
345 base::PlatformFileError error = base::PLATFORM_FILE_OK; | 339 base::PlatformFileError error = base::PLATFORM_FILE_OK; |
346 base::FilePath path = sandbox_sync_file_util()->GetDirectoryForOriginAndType( | 340 base::FilePath path = sandbox_sync_file_util()->GetDirectoryForOriginAndType( |
347 origin_url, type, create, &error); | 341 origin_url, type, create, &error); |
348 if (error != base::PLATFORM_FILE_OK) | 342 if (error != base::PLATFORM_FILE_OK) |
349 return base::FilePath(); | 343 return base::FilePath(); |
350 return path; | 344 return path; |
351 } | 345 } |
352 | 346 |
353 base::PlatformFileError | 347 base::PlatformFileError |
354 SandboxMountPointProvider::DeleteOriginDataOnFileThread( | 348 SandboxMountPointProvider::DeleteOriginDataOnFileThread( |
355 FileSystemContext* file_system_context, | 349 FileSystemContext* file_system_context, |
356 QuotaManagerProxy* proxy, | 350 quota::QuotaManagerProxy* proxy, |
357 const GURL& origin_url, | 351 const GURL& origin_url, |
358 fileapi::FileSystemType type) { | 352 fileapi::FileSystemType type) { |
359 | 353 |
360 int64 usage = GetOriginUsageOnFileThread(file_system_context, | 354 int64 usage = GetOriginUsageOnFileThread(file_system_context, |
361 origin_url, type); | 355 origin_url, type); |
362 | 356 |
363 file_system_usage_cache_->CloseCacheFiles(); | 357 file_system_usage_cache_->CloseCacheFiles(); |
364 bool result = sandbox_sync_file_util()->DeleteDirectoryForOriginAndType( | 358 bool result = sandbox_sync_file_util()->DeleteDirectoryForOriginAndType( |
365 origin_url, type); | 359 origin_url, type); |
366 if (result && proxy) { | 360 if (result && proxy) { |
(...skipping 19 matching lines...) Expand all Loading... |
386 if (enumerator->HasFileSystemType(type)) | 380 if (enumerator->HasFileSystemType(type)) |
387 origins->insert(origin); | 381 origins->insert(origin); |
388 } | 382 } |
389 switch (type) { | 383 switch (type) { |
390 case kFileSystemTypeTemporary: | 384 case kFileSystemTypeTemporary: |
391 UMA_HISTOGRAM_COUNTS(kTemporaryOriginsCountLabel, origins->size()); | 385 UMA_HISTOGRAM_COUNTS(kTemporaryOriginsCountLabel, origins->size()); |
392 break; | 386 break; |
393 case kFileSystemTypePersistent: | 387 case kFileSystemTypePersistent: |
394 UMA_HISTOGRAM_COUNTS(kPersistentOriginsCountLabel, origins->size()); | 388 UMA_HISTOGRAM_COUNTS(kPersistentOriginsCountLabel, origins->size()); |
395 break; | 389 break; |
396 case kFileSystemTypeSyncable: | |
397 UMA_HISTOGRAM_COUNTS(kSyncableOriginsCountLabel, origins->size()); | |
398 break; | |
399 default: | 390 default: |
400 break; | 391 break; |
401 } | 392 } |
402 } | 393 } |
403 | 394 |
404 void SandboxMountPointProvider::GetOriginsForHostOnFileThread( | 395 void SandboxMountPointProvider::GetOriginsForHostOnFileThread( |
405 fileapi::FileSystemType type, const std::string& host, | 396 fileapi::FileSystemType type, |
| 397 const std::string& host, |
406 std::set<GURL>* origins) { | 398 std::set<GURL>* origins) { |
407 DCHECK(CanHandleType(type)); | 399 DCHECK(CanHandleType(type)); |
408 DCHECK(origins); | 400 DCHECK(origins); |
409 scoped_ptr<OriginEnumerator> enumerator(CreateOriginEnumerator()); | 401 scoped_ptr<OriginEnumerator> enumerator(CreateOriginEnumerator()); |
410 GURL origin; | 402 GURL origin; |
411 while (!(origin = enumerator->Next()).is_empty()) { | 403 while (!(origin = enumerator->Next()).is_empty()) { |
412 if (host == net::GetHostOrSpecFromURL(origin) && | 404 if (host == net::GetHostOrSpecFromURL(origin) && |
413 enumerator->HasFileSystemType(type)) | 405 enumerator->HasFileSystemType(type)) |
414 origins->insert(origin); | 406 origins->insert(origin); |
415 } | 407 } |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
509 REPORT(kNotFound); | 501 REPORT(kNotFound); |
510 break; | 502 break; |
511 case base::PLATFORM_FILE_ERROR_FAILED: | 503 case base::PLATFORM_FILE_ERROR_FAILED: |
512 default: | 504 default: |
513 REPORT(kUnknownError); | 505 REPORT(kUnknownError); |
514 break; | 506 break; |
515 } | 507 } |
516 #undef REPORT | 508 #undef REPORT |
517 } | 509 } |
518 | 510 |
519 const UpdateObserverList* SandboxMountPointProvider::GetUpdateObservers( | |
520 FileSystemType type) const { | |
521 DCHECK(CanHandleType(type)); | |
522 if (type == kFileSystemTypeSyncable) | |
523 return &syncable_update_observers_; | |
524 return &update_observers_; | |
525 } | |
526 | |
527 const AccessObserverList* SandboxMountPointProvider::GetAccessObservers( | 511 const AccessObserverList* SandboxMountPointProvider::GetAccessObservers( |
528 FileSystemType type) const { | 512 FileSystemType type) const { |
529 DCHECK(CanHandleType(type)); | 513 DCHECK(CanHandleType(type)); |
530 return &access_observers_; | 514 return &access_observers_; |
531 } | 515 } |
532 | 516 |
533 void SandboxMountPointProvider::AddFileUpdateObserver( | 517 void SandboxMountPointProvider::AddFileUpdateObserver( |
534 FileSystemType type, | 518 FileSystemType type, |
535 FileUpdateObserver* observer, | 519 FileUpdateObserver* observer, |
536 base::SequencedTaskRunner* task_runner) { | 520 base::SequencedTaskRunner* task_runner) { |
537 DCHECK(CanHandleType(type)); | 521 DCHECK(CanHandleType(type)); |
538 UpdateObserverList* list = &update_observers_; | 522 UpdateObserverList* list = &update_observers_; |
539 if (type == kFileSystemTypeSyncable) | |
540 list = &syncable_update_observers_; | |
541 UpdateObserverList::Source observer_source = list->source(); | 523 UpdateObserverList::Source observer_source = list->source(); |
542 observer_source.AddObserver(observer, task_runner); | 524 observer_source.AddObserver(observer, task_runner); |
543 *list = UpdateObserverList(observer_source); | 525 *list = UpdateObserverList(observer_source); |
544 } | 526 } |
545 | 527 |
546 void SandboxMountPointProvider::AddFileChangeObserver( | 528 void SandboxMountPointProvider::AddFileChangeObserver( |
547 FileSystemType type, | 529 FileSystemType type, |
548 FileChangeObserver* observer, | 530 FileChangeObserver* observer, |
549 base::SequencedTaskRunner* task_runner) { | 531 base::SequencedTaskRunner* task_runner) { |
550 ChangeObserverList* list = &change_observers_; | 532 ChangeObserverList* list = &change_observers_; |
551 if (type == kFileSystemTypeSyncable) | |
552 list = &syncable_change_observers_; | |
553 ChangeObserverList::Source observer_source = list->source(); | 533 ChangeObserverList::Source observer_source = list->source(); |
554 observer_source.AddObserver(observer, task_runner); | 534 observer_source.AddObserver(observer, task_runner); |
555 *list = ChangeObserverList(observer_source); | 535 *list = ChangeObserverList(observer_source); |
556 } | 536 } |
557 | 537 |
558 bool SandboxMountPointProvider::IsAccessValid( | 538 bool SandboxMountPointProvider::IsAccessValid( |
559 const FileSystemURL& url) const { | 539 const FileSystemURL& url) const { |
560 if (!IsAllowedScheme(url.origin())) | 540 if (!IsAllowedScheme(url.origin())) |
561 return false; | 541 return false; |
562 | 542 |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
667 | 647 |
668 while (!(file_path_each = enumerator->Next()).empty()) { | 648 while (!(file_path_each = enumerator->Next()).empty()) { |
669 usage += enumerator->Size(); | 649 usage += enumerator->Size(); |
670 usage += ObfuscatedFileUtil::ComputeFilePathCost(file_path_each); | 650 usage += ObfuscatedFileUtil::ComputeFilePathCost(file_path_each); |
671 } | 651 } |
672 | 652 |
673 return usage; | 653 return usage; |
674 } | 654 } |
675 | 655 |
676 } // namespace fileapi | 656 } // namespace fileapi |
OLD | NEW |