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

Side by Side Diff: webkit/browser/fileapi/sandbox_mount_point_provider.cc

Issue 18668003: SyncFS: Introduce SyncFileSystemBackend (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 5 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
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/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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698