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

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

Issue 7057032: Integrated obfuscation with quota; all unit tests now pass (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Tiny comment fixes. Created 9 years, 7 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/command_line.h" 7 #include "base/command_line.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/memory/scoped_callback_factory.h" 9 #include "base/memory/scoped_callback_factory.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
11 #include "base/message_loop.h" 11 #include "base/message_loop.h"
12 #include "base/message_loop_proxy.h" 12 #include "base/message_loop_proxy.h"
13 #include "base/rand_util.h" 13 #include "base/rand_util.h"
14 #include "base/string_util.h" 14 #include "base/string_util.h"
15 #include "base/stringprintf.h" 15 #include "base/stringprintf.h"
16 #include "base/utf_string_conversions.h"
17 #include "googleurl/src/gurl.h" 16 #include "googleurl/src/gurl.h"
18 #include "net/base/net_util.h" 17 #include "net/base/net_util.h"
19 #include "third_party/WebKit/Source/WebKit/chromium/public/WebCString.h"
20 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h"
21 #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
22 #include "webkit/fileapi/file_system_path_manager.h" 18 #include "webkit/fileapi/file_system_path_manager.h"
23 #include "webkit/fileapi/file_system_types.h" 19 #include "webkit/fileapi/file_system_types.h"
24 #include "webkit/fileapi/file_system_usage_cache.h" 20 #include "webkit/fileapi/file_system_usage_cache.h"
25 #include "webkit/fileapi/file_system_util.h" 21 #include "webkit/fileapi/file_system_util.h"
26 #include "webkit/fileapi/local_file_system_file_util.h" 22 #include "webkit/fileapi/local_file_system_file_util.h"
27 #include "webkit/fileapi/obfuscated_file_system_file_util.h" 23 #include "webkit/fileapi/obfuscated_file_system_file_util.h"
28 #include "webkit/fileapi/sandbox_mount_point_provider.h" 24 #include "webkit/fileapi/sandbox_mount_point_provider.h"
29 #include "webkit/glue/webkit_glue.h" 25 #include "webkit/glue/webkit_glue.h"
30 #include "webkit/quota/quota_manager.h" 26 #include "webkit/quota/quota_manager.h"
31 27
(...skipping 24 matching lines...) Expand all
56 52
57 inline std::string FilePathStringToASCII( 53 inline std::string FilePathStringToASCII(
58 const FilePath::StringType& path_string) { 54 const FilePath::StringType& path_string) {
59 #if defined(OS_WIN) 55 #if defined(OS_WIN)
60 return WideToASCII(path_string); 56 return WideToASCII(path_string);
61 #elif defined(OS_POSIX) 57 #elif defined(OS_POSIX)
62 return path_string; 58 return path_string;
63 #endif 59 #endif
64 } 60 }
65 61
66 // TODO(kinuko): Merge these two methods (conversion methods between
67 // origin url <==> identifier) with the ones in the database module.
68 std::string GetOriginIdentifierFromURL(const GURL& url) {
69 WebKit::WebSecurityOrigin web_security_origin =
70 WebKit::WebSecurityOrigin::createFromString(UTF8ToUTF16(url.spec()));
71 return web_security_origin.databaseIdentifier().utf8();
72 }
73
74 GURL GetOriginURLFromIdentifier(const std::string& origin_identifier) {
75 WebKit::WebSecurityOrigin web_security_origin =
76 WebKit::WebSecurityOrigin::createFromDatabaseIdentifier(
77 UTF8ToUTF16(origin_identifier));
78 GURL origin_url(web_security_origin.toString());
79
80 // We need this work-around for file:/// URIs as
81 // createFromDatabaseIdentifier returns empty origin_url for them.
82 if (origin_url.spec().empty() &&
83 origin_identifier.find("file__") == 0)
84 return GURL("file:///");
85 return origin_url;
86 }
87
88 FilePath::StringType CreateUniqueDirectoryName(const GURL& origin_url) { 62 FilePath::StringType CreateUniqueDirectoryName(const GURL& origin_url) {
89 // This can be anything but need to be unpredictable. 63 // This can be anything but need to be unpredictable.
90 static const FilePath::CharType letters[] = FILE_PATH_LITERAL( 64 static const FilePath::CharType letters[] = FILE_PATH_LITERAL(
91 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"); 65 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
92 FilePath::StringType unique(kFileSystemUniqueNamePrefix); 66 FilePath::StringType unique(kFileSystemUniqueNamePrefix);
93 for (int i = 0; i < kFileSystemUniqueLength; ++i) 67 for (int i = 0; i < kFileSystemUniqueLength; ++i)
94 unique += letters[base::RandInt(0, arraysize(letters) - 2)]; 68 unique += letters[base::RandInt(0, arraysize(letters) - 2)];
95 return unique; 69 return unique;
96 } 70 }
97 71
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 return FilePath(); 105 return FilePath();
132 106
133 // Creates the root directory. 107 // Creates the root directory.
134 root = origin_base_path.Append(CreateUniqueDirectoryName(origin_url)); 108 root = origin_base_path.Append(CreateUniqueDirectoryName(origin_url));
135 if (!file_util::CreateDirectory(root)) 109 if (!file_util::CreateDirectory(root))
136 return FilePath(); 110 return FilePath();
137 111
138 return root; 112 return root;
139 } 113 }
140 114
115 class ObfuscatedOriginEnumerator
116 : public fileapi::SandboxMountPointProvider::OriginEnumerator {
117 public:
118 explicit ObfuscatedOriginEnumerator(
119 fileapi::ObfuscatedFileSystemFileUtil* file_util) {
120 enum_.reset(file_util->CreateOriginEnumerator());
121 }
122 virtual ~ObfuscatedOriginEnumerator() {}
123
124 virtual GURL Next() OVERRIDE {
125 return enum_->Next();
126 }
127
128 virtual bool HasFileSystemType(fileapi::FileSystemType type) const OVERRIDE {
129 return enum_->HasFileSystemType(type);
130 }
131
132 private:
133 scoped_ptr<fileapi::ObfuscatedFileSystemFileUtil::AbstractOriginEnumerator>
134 enum_;
135 };
136
141 class SandboxOriginEnumerator 137 class SandboxOriginEnumerator
142 : public fileapi::SandboxMountPointProvider::OriginEnumerator { 138 : public fileapi::SandboxMountPointProvider::OriginEnumerator {
143 public: 139 public:
144 explicit SandboxOriginEnumerator(const FilePath& base_path) 140 explicit SandboxOriginEnumerator(const FilePath& base_path)
145 : enumerator_(base_path, false /* recursive */, 141 : enumerator_(base_path, false /* recursive */,
146 file_util::FileEnumerator::DIRECTORIES) {} 142 file_util::FileEnumerator::DIRECTORIES) {}
147 virtual ~SandboxOriginEnumerator() {} 143 virtual ~SandboxOriginEnumerator() {}
148 144
149 virtual GURL Next() OVERRIDE { 145 virtual GURL Next() OVERRIDE {
150 current_ = enumerator_.Next(); 146 current_ = enumerator_.Next();
151 if (current_.empty()) 147 if (current_.empty())
152 return GURL(); 148 return GURL();
153 return GetOriginURLFromIdentifier( 149 return fileapi::GetOriginURLFromIdentifier(
154 FilePathStringToASCII(current_.BaseName().value())); 150 FilePathStringToASCII(current_.BaseName().value()));
155 } 151 }
156 152
157 virtual bool HasFileSystemType(fileapi::FileSystemType type) const OVERRIDE { 153 virtual bool HasFileSystemType(fileapi::FileSystemType type) const OVERRIDE {
158 if (current_.empty()) 154 if (current_.empty())
159 return false; 155 return false;
160 std::string directory = 156 std::string directory =
161 fileapi::FileSystemPathManager::GetFileSystemTypeString(type); 157 fileapi::FileSystemPathManager::GetFileSystemTypeString(type);
162 DCHECK(!directory.empty()); 158 DCHECK(!directory.empty());
163 return file_util::DirectoryExists(current_.AppendASCII(directory)); 159 return file_util::DirectoryExists(current_.AppendASCII(directory));
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
258 254
259 scoped_refptr<base::MessageLoopProxy> file_message_loop_; 255 scoped_refptr<base::MessageLoopProxy> file_message_loop_;
260 scoped_refptr<base::MessageLoopProxy> origin_message_loop_proxy_; 256 scoped_refptr<base::MessageLoopProxy> origin_message_loop_proxy_;
261 GURL origin_url_; 257 GURL origin_url_;
262 FilePath origin_base_path_; 258 FilePath origin_base_path_;
263 FileSystemType type_; 259 FileSystemType type_;
264 scoped_refptr<ObfuscatedFileSystemFileUtil> file_util_; 260 scoped_refptr<ObfuscatedFileSystemFileUtil> file_util_;
265 scoped_ptr<FileSystemPathManager::GetRootPathCallback> callback_; 261 scoped_ptr<FileSystemPathManager::GetRootPathCallback> callback_;
266 }; 262 };
267 263
268 FilePath SandboxMountPointProvider::GetFileSystemRootPathOnFileThread(
269 const GURL& origin_url, FileSystemType type, bool create) {
270 if (CommandLine::ForCurrentProcess()->HasSwitch(kObfuscationFlag))
271 return sandbox_file_util_->GetDirectoryForOriginAndType(
272 origin_url, type, create);
273
274 std::string name;
275 FilePath origin_base_path;
276 if (!GetOriginBasePathAndName(origin_url, &origin_base_path, type, &name))
277 return FilePath();
278
279 return GetFileSystemRootPathOnFileThreadHelper(
280 origin_url, origin_base_path, create);
281 }
282
283 bool SandboxMountPointProvider::IsRestrictedFileName(const FilePath& filename) 264 bool SandboxMountPointProvider::IsRestrictedFileName(const FilePath& filename)
284 const { 265 const {
285 if (filename.value().empty()) 266 if (filename.value().empty())
286 return false; 267 return false;
287 268
288 if (IsWhitespace(filename.value()[filename.value().size() - 1]) || 269 if (IsWhitespace(filename.value()[filename.value().size() - 1]) ||
289 filename.value()[filename.value().size() - 1] == '.') 270 filename.value()[filename.value().size() - 1] == '.')
290 return true; 271 return true;
291 272
292 std::string filename_lower = StringToLowerASCII( 273 std::string filename_lower = StringToLowerASCII(
(...skipping 20 matching lines...) Expand all
313 std::vector<FilePath> SandboxMountPointProvider::GetRootDirectories() const { 294 std::vector<FilePath> SandboxMountPointProvider::GetRootDirectories() const {
314 NOTREACHED(); 295 NOTREACHED();
315 // TODO(ericu): Implement this method and check for access permissions as 296 // TODO(ericu): Implement this method and check for access permissions as
316 // fileBrowserPrivate extension API does. We currently have another mechanism, 297 // fileBrowserPrivate extension API does. We currently have another mechanism,
317 // but we should switch over. 298 // but we should switch over.
318 return std::vector<FilePath>(); 299 return std::vector<FilePath>();
319 } 300 }
320 301
321 SandboxMountPointProvider::OriginEnumerator* 302 SandboxMountPointProvider::OriginEnumerator*
322 SandboxMountPointProvider::CreateOriginEnumerator() const { 303 SandboxMountPointProvider::CreateOriginEnumerator() const {
304 if (CommandLine::ForCurrentProcess()->HasSwitch(kObfuscationFlag))
305 return new ObfuscatedOriginEnumerator(sandbox_file_util_.get());
323 return new SandboxOriginEnumerator(base_path_); 306 return new SandboxOriginEnumerator(base_path_);
324 } 307 }
325 308
326 void SandboxMountPointProvider::ValidateFileSystemRootAndGetURL( 309 void SandboxMountPointProvider::ValidateFileSystemRootAndGetURL(
327 const GURL& origin_url, fileapi::FileSystemType type, 310 const GURL& origin_url, fileapi::FileSystemType type,
328 bool create, FileSystemPathManager::GetRootPathCallback* callback_ptr) { 311 bool create, FileSystemPathManager::GetRootPathCallback* callback_ptr) {
329 scoped_ptr<FileSystemPathManager::GetRootPathCallback> callback(callback_ptr); 312 scoped_ptr<FileSystemPathManager::GetRootPathCallback> callback(callback_ptr);
330 ObfuscatedFileSystemFileUtil* file_util = NULL; 313 ObfuscatedFileSystemFileUtil* file_util = NULL;
331 FilePath origin_base_path; 314 FilePath origin_base_path;
315
316 if (path_manager_->is_incognito()) {
317 // TODO(kinuko): return an isolated temporary directory.
318 callback->Run(false, FilePath(), std::string());
319 return;
320 }
321
322 if (!path_manager_->IsAllowedScheme(origin_url)) {
323 callback->Run(false, FilePath(), std::string());
324 return;
325 }
326
332 if (CommandLine::ForCurrentProcess()->HasSwitch(kObfuscationFlag)) { 327 if (CommandLine::ForCurrentProcess()->HasSwitch(kObfuscationFlag)) {
333 file_util = sandbox_file_util_.get(); 328 file_util = sandbox_file_util_.get();
334 } else { 329 } else {
335 std::string name; 330 std::string name;
336 if (!GetOriginBasePathAndName(origin_url, &origin_base_path, type, &name)) { 331 if (!GetOriginBasePathAndName(origin_url, &origin_base_path, type, &name)) {
337 callback->Run(false, FilePath(), std::string()); 332 callback->Run(false, FilePath(), std::string());
338 return; 333 return;
339 } 334 }
340 } 335 }
341 336
342 scoped_refptr<GetFileSystemRootPathTask> task( 337 scoped_refptr<GetFileSystemRootPathTask> task(
343 new GetFileSystemRootPathTask(file_message_loop_, 338 new GetFileSystemRootPathTask(file_message_loop_,
344 origin_url, 339 origin_url,
345 origin_base_path, 340 origin_base_path,
346 type, 341 type,
347 file_util, 342 file_util,
348 callback.release())); 343 callback.release()));
349 task->Start(create); 344 task->Start(create);
350 }; 345 };
351 346
352 FilePath 347 FilePath
353 SandboxMountPointProvider::ValidateFileSystemRootAndGetPathOnFileThread( 348 SandboxMountPointProvider::ValidateFileSystemRootAndGetPathOnFileThread(
354 const GURL& origin_url, FileSystemType type, const FilePath& unused, 349 const GURL& origin_url, FileSystemType type, const FilePath& unused,
355 bool create) { 350 bool create) {
356 return GetFileSystemRootPathOnFileThread(origin_url, type, create); 351 if (path_manager_->is_incognito())
352 // TODO(kinuko): return an isolated temporary directory.
353 return FilePath();
354
355 if (!path_manager_->IsAllowedScheme(origin_url))
356 return FilePath();
357
358 if (CommandLine::ForCurrentProcess()->HasSwitch(kObfuscationFlag))
359 return sandbox_file_util_->GetDirectoryForOriginAndType(
360 origin_url, type, create);
361
362 std::string name;
363 FilePath origin_base_path;
364 if (!GetOriginBasePathAndName(origin_url, &origin_base_path, type, &name))
365 return FilePath();
366
367 return GetFileSystemRootPathOnFileThreadHelper(
368 origin_url, origin_base_path, create);
357 } 369 }
358 370
359 FilePath SandboxMountPointProvider::GetBaseDirectoryForOrigin( 371 FilePath SandboxMountPointProvider::GetBaseDirectoryForOrigin(
360 const GURL& origin_url) const { 372 const GURL& origin_url, bool create) const {
373 if (CommandLine::ForCurrentProcess()->HasSwitch(kObfuscationFlag))
374 return sandbox_file_util_->GetDirectoryForOrigin(
375 origin_url, create);
361 return base_path_.AppendASCII(GetOriginIdentifierFromURL(origin_url)); 376 return base_path_.AppendASCII(GetOriginIdentifierFromURL(origin_url));
362 } 377 }
363 378
364 // Needed for the old way of doing things. 379 // Needed for the old way of doing things.
365 FilePath SandboxMountPointProvider::GetBaseDirectoryForOriginAndType( 380 FilePath SandboxMountPointProvider::GetBaseDirectoryForOriginAndType(
366 const GURL& origin_url, fileapi::FileSystemType type) const { 381 const GURL& origin_url, fileapi::FileSystemType type, bool create) const {
382 if (CommandLine::ForCurrentProcess()->HasSwitch(kObfuscationFlag))
383 return sandbox_file_util_->GetDirectoryForOriginAndType(
384 origin_url, type, create);
367 std::string type_string = 385 std::string type_string =
368 FileSystemPathManager::GetFileSystemTypeString(type); 386 FileSystemPathManager::GetFileSystemTypeString(type);
369 if (type_string.empty()) { 387 if (type_string.empty()) {
370 LOG(WARNING) << "Unknown filesystem type is requested:" << type; 388 LOG(WARNING) << "Unknown filesystem type is requested:" << type;
371 return FilePath(); 389 return FilePath();
372 } 390 }
373 return GetBaseDirectoryForOrigin(origin_url).AppendASCII(type_string); 391 return GetBaseDirectoryForOrigin(origin_url, create).AppendASCII(type_string);
374 } 392 }
375 393
376 bool SandboxMountPointProvider::DeleteOriginDataOnFileThread( 394 bool SandboxMountPointProvider::DeleteOriginDataOnFileThread(
377 QuotaManagerProxy* proxy, const GURL& origin_url, 395 QuotaManagerProxy* proxy, const GURL& origin_url,
378 fileapi::FileSystemType type) { 396 fileapi::FileSystemType type) {
379 FilePath path_for_origin = GetBaseDirectoryForOriginAndType(origin_url, 397 FilePath path_for_origin =
380 type); 398 GetBaseDirectoryForOriginAndType(origin_url, type, false);
381 if (!file_util::PathExists(path_for_origin)) 399 if (!file_util::PathExists(path_for_origin))
382 return true; 400 return true;
383 401
384 int64 usage = GetOriginUsageOnFileThread(origin_url, type); 402 int64 usage = GetOriginUsageOnFileThread(origin_url, type);
385 bool result = file_util::Delete(path_for_origin, true /* recursive */); 403 bool result = file_util::Delete(path_for_origin, true /* recursive */);
386 if (result && proxy) { 404 if (result && proxy) {
387 proxy->NotifyStorageModified( 405 proxy->NotifyStorageModified(
388 quota::QuotaClient::kFileSystem, 406 quota::QuotaClient::kFileSystem,
389 origin_url, 407 origin_url,
390 FileSystemTypeToQuotaStorageType(type), 408 FileSystemTypeToQuotaStorageType(type),
(...skipping 27 matching lines...) Expand all
418 if (host == net::GetHostOrSpecFromURL(origin) && 436 if (host == net::GetHostOrSpecFromURL(origin) &&
419 enumerator->HasFileSystemType(type)) 437 enumerator->HasFileSystemType(type))
420 origins->insert(origin); 438 origins->insert(origin);
421 } 439 }
422 } 440 }
423 441
424 int64 SandboxMountPointProvider::GetOriginUsageOnFileThread( 442 int64 SandboxMountPointProvider::GetOriginUsageOnFileThread(
425 const GURL& origin_url, fileapi::FileSystemType type) { 443 const GURL& origin_url, fileapi::FileSystemType type) {
426 DCHECK(type == fileapi::kFileSystemTypeTemporary || 444 DCHECK(type == fileapi::kFileSystemTypeTemporary ||
427 type == fileapi::kFileSystemTypePersistent); 445 type == fileapi::kFileSystemTypePersistent);
428 FilePath base_path = GetBaseDirectoryForOriginAndType(origin_url, type); 446 FilePath base_path =
447 GetBaseDirectoryForOriginAndType(origin_url, type, false);
429 if (!file_util::DirectoryExists(base_path)) 448 if (!file_util::DirectoryExists(base_path))
430 return 0; 449 return 0;
431 450
432 FilePath usage_file_path = base_path.AppendASCII( 451 FilePath usage_file_path = base_path.AppendASCII(
433 FileSystemUsageCache::kUsageFileName); 452 FileSystemUsageCache::kUsageFileName);
434 int32 dirty_status = FileSystemUsageCache::GetDirty(usage_file_path); 453 int32 dirty_status = FileSystemUsageCache::GetDirty(usage_file_path);
435 bool visited = (visited_origins_.find(origin_url) != visited_origins_.end()); 454 bool visited = (visited_origins_.find(origin_url) != visited_origins_.end());
436 visited_origins_.insert(origin_url); 455 visited_origins_.insert(origin_url);
437 if (dirty_status == 0 || (dirty_status > 0 && visited)) { 456 if (dirty_status == 0 || (dirty_status > 0 && visited)) {
438 // The usage cache is clean (dirty == 0) or the origin is already 457 // The usage cache is clean (dirty == 0) or the origin is already
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
505 return LocalFileSystemFileUtil::GetInstance(); 524 return LocalFileSystemFileUtil::GetInstance();
506 } 525 }
507 526
508 // Needed for the old way of doing things. 527 // Needed for the old way of doing things.
509 bool SandboxMountPointProvider::GetOriginBasePathAndName( 528 bool SandboxMountPointProvider::GetOriginBasePathAndName(
510 const GURL& origin_url, 529 const GURL& origin_url,
511 FilePath* origin_base_path, 530 FilePath* origin_base_path,
512 FileSystemType type, 531 FileSystemType type,
513 std::string* name) { 532 std::string* name) {
514 533
515 // TODO(ericu): Put the incognito and allowed scheme checks somewhere in the 534 *origin_base_path = GetBaseDirectoryForOriginAndType(origin_url, type, false);
516 // obfuscated code as well.
517 if (path_manager_->is_incognito())
518 // TODO(kinuko): return an isolated temporary directory.
519 return false;
520
521 if (!path_manager_->IsAllowedScheme(origin_url))
522 return false;
523
524 *origin_base_path = GetBaseDirectoryForOriginAndType(origin_url, type);
525 if (origin_base_path->empty()) 535 if (origin_base_path->empty())
526 return false; 536 return false;
527 537
528 std::string origin_identifier = GetOriginIdentifierFromURL(origin_url); 538 std::string origin_identifier = GetOriginIdentifierFromURL(origin_url);
529 std::string type_string = 539 std::string type_string =
530 FileSystemPathManager::GetFileSystemTypeString(type); 540 FileSystemPathManager::GetFileSystemTypeString(type);
531 DCHECK(!type_string.empty()); 541 DCHECK(!type_string.empty());
532 if (name) 542 if (name)
533 *name = origin_identifier + ":" + type_string; 543 *name = origin_identifier + ":" + type_string;
534 return true; 544 return true;
535 } 545 }
536 546
537 FilePath SandboxMountPointProvider::GetUsageCachePathForOriginAndType( 547 FilePath SandboxMountPointProvider::GetUsageCachePathForOriginAndType(
538 const GURL& origin_url, fileapi::FileSystemType type) const { 548 const GURL& origin_url, fileapi::FileSystemType type) const {
539 FilePath base_path = GetBaseDirectoryForOriginAndType(origin_url, type); 549 FilePath base_path =
550 GetBaseDirectoryForOriginAndType(origin_url, type, false);
540 return base_path.AppendASCII(FileSystemUsageCache::kUsageFileName); 551 return base_path.AppendASCII(FileSystemUsageCache::kUsageFileName);
kinuko 2011/05/23 05:15:41 In obfuscated cases we create this file under the
ericu 2011/05/23 05:23:26 Right, the usage file is FileSystem/[origin #]/t/[
kinuko 2011/05/23 05:54:28 thx, sgtm.
541 } 552 }
542 553
543 } // namespace fileapi 554 } // namespace fileapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698