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

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

Issue 12163003: Add FilePath to base namespace. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 10 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/fileapi/sandbox_mount_point_provider.h" 5 #include "webkit/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/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 kNotFound, 56 kNotFound,
57 kUnknownError, 57 kUnknownError,
58 kFileSystemErrorMax, 58 kFileSystemErrorMax,
59 }; 59 };
60 60
61 const char kTemporaryOriginsCountLabel[] = "FileSystem.TemporaryOriginsCount"; 61 const char kTemporaryOriginsCountLabel[] = "FileSystem.TemporaryOriginsCount";
62 const char kPersistentOriginsCountLabel[] = "FileSystem.PersistentOriginsCount"; 62 const char kPersistentOriginsCountLabel[] = "FileSystem.PersistentOriginsCount";
63 63
64 // Restricted names. 64 // Restricted names.
65 // http://dev.w3.org/2009/dap/file-system/file-dir-sys.html#naming-restrictions 65 // http://dev.w3.org/2009/dap/file-system/file-dir-sys.html#naming-restrictions
66 const FilePath::CharType* const kRestrictedNames[] = { 66 const base::FilePath::CharType* const kRestrictedNames[] = {
67 FILE_PATH_LITERAL("."), FILE_PATH_LITERAL(".."), 67 FILE_PATH_LITERAL("."), FILE_PATH_LITERAL(".."),
68 }; 68 };
69 69
70 // Restricted chars. 70 // Restricted chars.
71 const FilePath::CharType kRestrictedChars[] = { 71 const base::FilePath::CharType kRestrictedChars[] = {
72 FILE_PATH_LITERAL('/'), FILE_PATH_LITERAL('\\'), 72 FILE_PATH_LITERAL('/'), FILE_PATH_LITERAL('\\'),
73 }; 73 };
74 74
75 class ObfuscatedOriginEnumerator 75 class ObfuscatedOriginEnumerator
76 : public SandboxMountPointProvider::OriginEnumerator { 76 : public SandboxMountPointProvider::OriginEnumerator {
77 public: 77 public:
78 explicit ObfuscatedOriginEnumerator(ObfuscatedFileUtil* file_util) { 78 explicit ObfuscatedOriginEnumerator(ObfuscatedFileUtil* file_util) {
79 enum_.reset(file_util->CreateOriginEnumerator()); 79 enum_.reset(file_util->CreateOriginEnumerator());
80 } 80 }
81 virtual ~ObfuscatedOriginEnumerator() {} 81 virtual ~ObfuscatedOriginEnumerator() {}
(...skipping 20 matching lines...) Expand all
102 } 102 }
103 103
104 void ValidateRootOnFileThread( 104 void ValidateRootOnFileThread(
105 ObfuscatedFileUtil* file_util, 105 ObfuscatedFileUtil* file_util,
106 const GURL& origin_url, 106 const GURL& origin_url,
107 FileSystemType type, 107 FileSystemType type,
108 bool create, 108 bool create,
109 base::PlatformFileError* error_ptr) { 109 base::PlatformFileError* error_ptr) {
110 DCHECK(error_ptr); 110 DCHECK(error_ptr);
111 111
112 FilePath root_path = 112 base::FilePath root_path =
113 file_util->GetDirectoryForOriginAndType( 113 file_util->GetDirectoryForOriginAndType(
114 origin_url, type, create, error_ptr); 114 origin_url, type, create, error_ptr);
115 if (*error_ptr != base::PLATFORM_FILE_OK) { 115 if (*error_ptr != base::PLATFORM_FILE_OK) {
116 UMA_HISTOGRAM_ENUMERATION(kOpenFileSystemLabel, 116 UMA_HISTOGRAM_ENUMERATION(kOpenFileSystemLabel,
117 kCreateDirectoryError, 117 kCreateDirectoryError,
118 kFileSystemErrorMax); 118 kFileSystemErrorMax);
119 } else { 119 } else {
120 UMA_HISTOGRAM_ENUMERATION(kOpenFileSystemLabel, kOK, kFileSystemErrorMax); 120 UMA_HISTOGRAM_ENUMERATION(kOpenFileSystemLabel, kOK, kFileSystemErrorMax);
121 } 121 }
122 // The reference of file_util will be derefed on the FILE thread 122 // The reference of file_util will be derefed on the FILE thread
123 // when the storage of this callback gets deleted regardless of whether 123 // when the storage of this callback gets deleted regardless of whether
124 // this method is called or not. 124 // this method is called or not.
125 } 125 }
126 126
127 } // anonymous namespace 127 } // anonymous namespace
128 128
129 const FilePath::CharType SandboxMountPointProvider::kFileSystemDirectory[] = 129 const base::FilePath::CharType SandboxMountPointProvider::kFileSystemDirectory[] =
130 FILE_PATH_LITERAL("File System"); 130 FILE_PATH_LITERAL("File System");
131 131
132 // static 132 // static
133 bool SandboxMountPointProvider::CanHandleType(FileSystemType type) { 133 bool SandboxMountPointProvider::CanHandleType(FileSystemType type) {
134 return type == kFileSystemTypeTemporary || 134 return type == kFileSystemTypeTemporary ||
135 type == kFileSystemTypePersistent || 135 type == kFileSystemTypePersistent ||
136 type == kFileSystemTypeSyncable; 136 type == kFileSystemTypeSyncable;
137 } 137 }
138 138
139 SandboxMountPointProvider::SandboxMountPointProvider( 139 SandboxMountPointProvider::SandboxMountPointProvider(
140 quota::QuotaManagerProxy* quota_manager_proxy, 140 quota::QuotaManagerProxy* quota_manager_proxy,
141 base::SequencedTaskRunner* file_task_runner, 141 base::SequencedTaskRunner* file_task_runner,
142 const FilePath& profile_path, 142 const base::FilePath& profile_path,
143 const FileSystemOptions& file_system_options) 143 const FileSystemOptions& file_system_options)
144 : file_task_runner_(file_task_runner), 144 : file_task_runner_(file_task_runner),
145 profile_path_(profile_path), 145 profile_path_(profile_path),
146 file_system_options_(file_system_options), 146 file_system_options_(file_system_options),
147 sandbox_file_util_( 147 sandbox_file_util_(
148 new AsyncFileUtilAdapter( 148 new AsyncFileUtilAdapter(
149 new ObfuscatedFileUtil( 149 new ObfuscatedFileUtil(
150 profile_path.Append(kFileSystemDirectory)))), 150 profile_path.Append(kFileSystemDirectory)))),
151 quota_observer_(new SandboxQuotaObserver( 151 quota_observer_(new SandboxQuotaObserver(
152 quota_manager_proxy, 152 quota_manager_proxy,
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 FROM_HERE, 204 FROM_HERE,
205 base::Bind(&ValidateRootOnFileThread, 205 base::Bind(&ValidateRootOnFileThread,
206 sandbox_sync_file_util(), 206 sandbox_sync_file_util(),
207 origin_url, type, create, 207 origin_url, type, create,
208 base::Unretained(error_ptr)), 208 base::Unretained(error_ptr)),
209 base::Bind(&DidValidateFileSystemRoot, 209 base::Bind(&DidValidateFileSystemRoot,
210 weak_factory_.GetWeakPtr(), 210 weak_factory_.GetWeakPtr(),
211 callback, base::Owned(error_ptr))); 211 callback, base::Owned(error_ptr)));
212 }; 212 };
213 213
214 FilePath 214 base::FilePath
215 SandboxMountPointProvider::GetFileSystemRootPathOnFileThread( 215 SandboxMountPointProvider::GetFileSystemRootPathOnFileThread(
216 const FileSystemURL& url, 216 const FileSystemURL& url,
217 bool create) { 217 bool create) {
218 if (file_system_options_.is_incognito()) 218 if (file_system_options_.is_incognito())
219 // TODO(kinuko): return an isolated temporary directory. 219 // TODO(kinuko): return an isolated temporary directory.
220 return FilePath(); 220 return base::FilePath();
221 221
222 if (!IsAllowedScheme(url.origin())) 222 if (!IsAllowedScheme(url.origin()))
223 return FilePath(); 223 return base::FilePath();
224 224
225 return GetBaseDirectoryForOriginAndType(url.origin(), url.type(), create); 225 return GetBaseDirectoryForOriginAndType(url.origin(), url.type(), create);
226 } 226 }
227 227
228 bool SandboxMountPointProvider::IsAccessAllowed(const FileSystemURL& url) { 228 bool SandboxMountPointProvider::IsAccessAllowed(const FileSystemURL& url) {
229 if (!CanHandleType(url.type())) 229 if (!CanHandleType(url.type()))
230 return false; 230 return false;
231 // We essentially depend on quota to do our access controls, so here 231 // We essentially depend on quota to do our access controls, so here
232 // we only check if the requested scheme is allowed or not. 232 // we only check if the requested scheme is allowed or not.
233 return IsAllowedScheme(url.origin()); 233 return IsAllowedScheme(url.origin());
234 } 234 }
235 235
236 bool SandboxMountPointProvider::IsRestrictedFileName(const FilePath& filename) 236 bool SandboxMountPointProvider::IsRestrictedFileName(const base::FilePath& filen ame)
237 const { 237 const {
238 if (filename.value().empty()) 238 if (filename.value().empty())
239 return false; 239 return false;
240 240
241 for (size_t i = 0; i < arraysize(kRestrictedNames); ++i) { 241 for (size_t i = 0; i < arraysize(kRestrictedNames); ++i) {
242 // Exact match. 242 // Exact match.
243 if (filename.value() == kRestrictedNames[i]) 243 if (filename.value() == kRestrictedNames[i])
244 return true; 244 return true;
245 } 245 }
246 246
247 for (size_t i = 0; i < arraysize(kRestrictedChars); ++i) { 247 for (size_t i = 0; i < arraysize(kRestrictedChars); ++i) {
248 if (filename.value().find(kRestrictedChars[i]) != 248 if (filename.value().find(kRestrictedChars[i]) !=
249 FilePath::StringType::npos) 249 base::FilePath::StringType::npos)
250 return true; 250 return true;
251 } 251 }
252 252
253 return false; 253 return false;
254 } 254 }
255 255
256 FileSystemFileUtil* SandboxMountPointProvider::GetFileUtil( 256 FileSystemFileUtil* SandboxMountPointProvider::GetFileUtil(
257 FileSystemType type) { 257 FileSystemType type) {
258 DCHECK(sandbox_file_util_.get()); 258 DCHECK(sandbox_file_util_.get());
259 return sandbox_file_util_->sync_file_util(); 259 return sandbox_file_util_->sync_file_util();
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 origin_url, 334 origin_url,
335 type), 335 type),
336 callback); 336 callback);
337 } 337 }
338 338
339 SandboxMountPointProvider::OriginEnumerator* 339 SandboxMountPointProvider::OriginEnumerator*
340 SandboxMountPointProvider::CreateOriginEnumerator() { 340 SandboxMountPointProvider::CreateOriginEnumerator() {
341 return new ObfuscatedOriginEnumerator(sandbox_sync_file_util()); 341 return new ObfuscatedOriginEnumerator(sandbox_sync_file_util());
342 } 342 }
343 343
344 FilePath SandboxMountPointProvider::GetBaseDirectoryForOriginAndType( 344 base::FilePath SandboxMountPointProvider::GetBaseDirectoryForOriginAndType(
345 const GURL& origin_url, fileapi::FileSystemType type, bool create) { 345 const GURL& origin_url, fileapi::FileSystemType type, bool create) {
346 346
347 base::PlatformFileError error = base::PLATFORM_FILE_OK; 347 base::PlatformFileError error = base::PLATFORM_FILE_OK;
348 FilePath path = sandbox_sync_file_util()->GetDirectoryForOriginAndType( 348 base::FilePath path = sandbox_sync_file_util()->GetDirectoryForOriginAndType(
349 origin_url, type, create, &error); 349 origin_url, type, create, &error);
350 if (error != base::PLATFORM_FILE_OK) 350 if (error != base::PLATFORM_FILE_OK)
351 return FilePath(); 351 return base::FilePath();
352 return path; 352 return path;
353 } 353 }
354 354
355 base::PlatformFileError 355 base::PlatformFileError
356 SandboxMountPointProvider::DeleteOriginDataOnFileThread( 356 SandboxMountPointProvider::DeleteOriginDataOnFileThread(
357 FileSystemContext* file_system_context, 357 FileSystemContext* file_system_context,
358 QuotaManagerProxy* proxy, 358 QuotaManagerProxy* proxy,
359 const GURL& origin_url, 359 const GURL& origin_url,
360 fileapi::FileSystemType type) { 360 fileapi::FileSystemType type) {
361 361
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 enumerator->HasFileSystemType(type)) 411 enumerator->HasFileSystemType(type))
412 origins->insert(origin); 412 origins->insert(origin);
413 } 413 }
414 } 414 }
415 415
416 int64 SandboxMountPointProvider::GetOriginUsageOnFileThread( 416 int64 SandboxMountPointProvider::GetOriginUsageOnFileThread(
417 FileSystemContext* file_system_context, 417 FileSystemContext* file_system_context,
418 const GURL& origin_url, 418 const GURL& origin_url,
419 fileapi::FileSystemType type) { 419 fileapi::FileSystemType type) {
420 DCHECK(CanHandleType(type)); 420 DCHECK(CanHandleType(type));
421 FilePath base_path = 421 base::FilePath base_path =
422 GetBaseDirectoryForOriginAndType(origin_url, type, false); 422 GetBaseDirectoryForOriginAndType(origin_url, type, false);
423 if (base_path.empty() || !file_util::DirectoryExists(base_path)) return 0; 423 if (base_path.empty() || !file_util::DirectoryExists(base_path)) return 0;
424 FilePath usage_file_path = 424 base::FilePath usage_file_path =
425 base_path.Append(FileSystemUsageCache::kUsageFileName); 425 base_path.Append(FileSystemUsageCache::kUsageFileName);
426 426
427 bool is_valid = FileSystemUsageCache::IsValid(usage_file_path); 427 bool is_valid = FileSystemUsageCache::IsValid(usage_file_path);
428 int32 dirty_status = FileSystemUsageCache::GetDirty(usage_file_path); 428 int32 dirty_status = FileSystemUsageCache::GetDirty(usage_file_path);
429 bool visited = (visited_origins_.find(origin_url) != visited_origins_.end()); 429 bool visited = (visited_origins_.find(origin_url) != visited_origins_.end());
430 visited_origins_.insert(origin_url); 430 visited_origins_.insert(origin_url);
431 if (is_valid && (dirty_status == 0 || (dirty_status > 0 && visited))) { 431 if (is_valid && (dirty_status == 0 || (dirty_status > 0 && visited))) {
432 // The usage cache is clean (dirty == 0) or the origin is already 432 // The usage cache is clean (dirty == 0) or the origin is already
433 // initialized and running. Read the cache file to get the usage. 433 // initialized and running. Read the cache file to get the usage.
434 return FileSystemUsageCache::GetUsage(usage_file_path); 434 return FileSystemUsageCache::GetUsage(usage_file_path);
435 } 435 }
436 // The usage cache has not been initialized or the cache is dirty. 436 // The usage cache has not been initialized or the cache is dirty.
437 // Get the directory size now and update the cache. 437 // Get the directory size now and update the cache.
438 FileSystemUsageCache::Delete(usage_file_path); 438 FileSystemUsageCache::Delete(usage_file_path);
439 439
440 FileSystemOperationContext context(file_system_context); 440 FileSystemOperationContext context(file_system_context);
441 FileSystemURL url = file_system_context->CreateCrackedFileSystemURL( 441 FileSystemURL url = file_system_context->CreateCrackedFileSystemURL(
442 origin_url, type, FilePath()); 442 origin_url, type, base::FilePath());
443 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> enumerator( 443 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> enumerator(
444 sandbox_sync_file_util()->CreateFileEnumerator(&context, url, true)); 444 sandbox_sync_file_util()->CreateFileEnumerator(&context, url, true));
445 445
446 FilePath file_path_each; 446 base::FilePath file_path_each;
447 int64 usage = 0; 447 int64 usage = 0;
448 448
449 while (!(file_path_each = enumerator->Next()).empty()) { 449 while (!(file_path_each = enumerator->Next()).empty()) {
450 usage += enumerator->Size(); 450 usage += enumerator->Size();
451 usage += ObfuscatedFileUtil::ComputeFilePathCost(file_path_each); 451 usage += ObfuscatedFileUtil::ComputeFilePathCost(file_path_each);
452 } 452 }
453 // This clears the dirty flag too. 453 // This clears the dirty flag too.
454 FileSystemUsageCache::UpdateUsage(usage_file_path, usage); 454 FileSystemUsageCache::UpdateUsage(usage_file_path, usage);
455 return usage; 455 return usage;
456 } 456 }
457 457
458 void SandboxMountPointProvider::InvalidateUsageCache( 458 void SandboxMountPointProvider::InvalidateUsageCache(
459 const GURL& origin_url, fileapi::FileSystemType type) { 459 const GURL& origin_url, fileapi::FileSystemType type) {
460 DCHECK(CanHandleType(type)); 460 DCHECK(CanHandleType(type));
461 base::PlatformFileError error = base::PLATFORM_FILE_OK; 461 base::PlatformFileError error = base::PLATFORM_FILE_OK;
462 FilePath usage_file_path = GetUsageCachePathForOriginAndType( 462 base::FilePath usage_file_path = GetUsageCachePathForOriginAndType(
463 sandbox_sync_file_util(), origin_url, type, &error); 463 sandbox_sync_file_util(), origin_url, type, &error);
464 if (error != base::PLATFORM_FILE_OK) 464 if (error != base::PLATFORM_FILE_OK)
465 return; 465 return;
466 FileSystemUsageCache::IncrementDirty(usage_file_path); 466 FileSystemUsageCache::IncrementDirty(usage_file_path);
467 } 467 }
468 468
469 void SandboxMountPointProvider::CollectOpenFileSystemMetrics( 469 void SandboxMountPointProvider::CollectOpenFileSystemMetrics(
470 base::PlatformFileError error_code) { 470 base::PlatformFileError error_code) {
471 base::Time now = base::Time::Now(); 471 base::Time now = base::Time::Now();
472 bool throttled = now < next_release_time_for_open_filesystem_stat_; 472 bool throttled = now < next_release_time_for_open_filesystem_stat_;
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
533 SandboxMountPointProvider::CreateFileSystemOperationForSync( 533 SandboxMountPointProvider::CreateFileSystemOperationForSync(
534 FileSystemContext* file_system_context) { 534 FileSystemContext* file_system_context) {
535 scoped_ptr<FileSystemOperationContext> operation_context( 535 scoped_ptr<FileSystemOperationContext> operation_context(
536 new FileSystemOperationContext(file_system_context)); 536 new FileSystemOperationContext(file_system_context));
537 operation_context->set_update_observers(update_observers_); 537 operation_context->set_update_observers(update_observers_);
538 operation_context->set_access_observers(access_observers_); 538 operation_context->set_access_observers(access_observers_);
539 return new LocalFileSystemOperation(file_system_context, 539 return new LocalFileSystemOperation(file_system_context,
540 operation_context.Pass()); 540 operation_context.Pass());
541 } 541 }
542 542
543 FilePath SandboxMountPointProvider::GetUsageCachePathForOriginAndType( 543 base::FilePath SandboxMountPointProvider::GetUsageCachePathForOriginAndType(
544 const GURL& origin_url, 544 const GURL& origin_url,
545 FileSystemType type) { 545 FileSystemType type) {
546 base::PlatformFileError error; 546 base::PlatformFileError error;
547 FilePath path = GetUsageCachePathForOriginAndType( 547 base::FilePath path = GetUsageCachePathForOriginAndType(
548 sandbox_sync_file_util(), origin_url, type, &error); 548 sandbox_sync_file_util(), origin_url, type, &error);
549 if (error != base::PLATFORM_FILE_OK) 549 if (error != base::PLATFORM_FILE_OK)
550 return FilePath(); 550 return base::FilePath();
551 return path; 551 return path;
552 } 552 }
553 553
554 // static 554 // static
555 FilePath SandboxMountPointProvider::GetUsageCachePathForOriginAndType( 555 base::FilePath SandboxMountPointProvider::GetUsageCachePathForOriginAndType(
556 ObfuscatedFileUtil* sandbox_file_util, 556 ObfuscatedFileUtil* sandbox_file_util,
557 const GURL& origin_url, 557 const GURL& origin_url,
558 fileapi::FileSystemType type, 558 fileapi::FileSystemType type,
559 base::PlatformFileError* error_out) { 559 base::PlatformFileError* error_out) {
560 DCHECK(error_out); 560 DCHECK(error_out);
561 *error_out = base::PLATFORM_FILE_OK; 561 *error_out = base::PLATFORM_FILE_OK;
562 FilePath base_path = sandbox_file_util->GetDirectoryForOriginAndType( 562 base::FilePath base_path = sandbox_file_util->GetDirectoryForOriginAndType(
563 origin_url, type, false /* create */, error_out); 563 origin_url, type, false /* create */, error_out);
564 if (*error_out != base::PLATFORM_FILE_OK) 564 if (*error_out != base::PLATFORM_FILE_OK)
565 return FilePath(); 565 return base::FilePath();
566 return base_path.Append(FileSystemUsageCache::kUsageFileName); 566 return base_path.Append(FileSystemUsageCache::kUsageFileName);
567 } 567 }
568 568
569 bool SandboxMountPointProvider::IsAllowedScheme(const GURL& url) const { 569 bool SandboxMountPointProvider::IsAllowedScheme(const GURL& url) const {
570 // Basically we only accept http or https. We allow file:// URLs 570 // Basically we only accept http or https. We allow file:// URLs
571 // only if --allow-file-access-from-files flag is given. 571 // only if --allow-file-access-from-files flag is given.
572 if (url.SchemeIs("http") || url.SchemeIs("https")) 572 if (url.SchemeIs("http") || url.SchemeIs("https"))
573 return true; 573 return true;
574 if (url.SchemeIsFileSystem()) 574 if (url.SchemeIsFileSystem())
575 return url.inner_url() && IsAllowedScheme(*url.inner_url()); 575 return url.inner_url() && IsAllowedScheme(*url.inner_url());
576 576
577 for (size_t i = 0; 577 for (size_t i = 0;
578 i < file_system_options_.additional_allowed_schemes().size(); 578 i < file_system_options_.additional_allowed_schemes().size();
579 ++i) { 579 ++i) {
580 if (url.SchemeIs( 580 if (url.SchemeIs(
581 file_system_options_.additional_allowed_schemes()[i].c_str())) 581 file_system_options_.additional_allowed_schemes()[i].c_str()))
582 return true; 582 return true;
583 } 583 }
584 return false; 584 return false;
585 } 585 }
586 586
587 ObfuscatedFileUtil* SandboxMountPointProvider::sandbox_sync_file_util() { 587 ObfuscatedFileUtil* SandboxMountPointProvider::sandbox_sync_file_util() {
588 DCHECK(sandbox_file_util_.get()); 588 DCHECK(sandbox_file_util_.get());
589 return static_cast<ObfuscatedFileUtil*>(sandbox_file_util_->sync_file_util()); 589 return static_cast<ObfuscatedFileUtil*>(sandbox_file_util_->sync_file_util());
590 } 590 }
591 591
592 } // namespace fileapi 592 } // namespace fileapi
OLDNEW
« no previous file with comments | « webkit/fileapi/sandbox_mount_point_provider.h ('k') | webkit/fileapi/sandbox_mount_point_provider_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698