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

Unified Diff: storage/browser/fileapi/obfuscated_file_util.cc

Issue 579083004: FileSystem: Modify ObfucatedFileUtil to delete contents of the plugin private filesystem (Closed) Base URL: http://chromium.googlesource.com/chromium/src.git@master
Patch Set: remake Created 6 years, 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/fileapi/plugin_private_file_system_backend_unittest.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: storage/browser/fileapi/obfuscated_file_util.cc
diff --git a/storage/browser/fileapi/obfuscated_file_util.cc b/storage/browser/fileapi/obfuscated_file_util.cc
index 4e202ebb68bf9d12779e11e72cf6f869e4d5f250..b7c73355382eec12826f652660d3f2e125cee8f1 100644
--- a/storage/browser/fileapi/obfuscated_file_util.cc
+++ b/storage/browser/fileapi/obfuscated_file_util.cc
@@ -15,6 +15,7 @@
#include "base/metrics/histogram.h"
#include "base/stl_util.h"
#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/strings/sys_string_conversions.h"
#include "base/strings/utf_string_conversions.h"
@@ -67,6 +68,8 @@ void InitFileInfo(
const int64 kPathCreationQuotaCost = 146; // Bytes per inode, basically.
const int64 kPathByteQuotaCost = 2; // Bytes per byte of path length in UTF-8.
+const char kDirectoryDatabaseKeySeparator = ' ';
+
int64 UsageForPath(size_t length) {
return kPathCreationQuotaCost +
static_cast<int64>(length) * kPathByteQuotaCost;
@@ -857,28 +860,26 @@ base::FilePath ObfuscatedFileUtil::GetDirectoryForOriginAndType(
bool ObfuscatedFileUtil::DeleteDirectoryForOriginAndType(
const GURL& origin,
const std::string& type_string) {
- base::File::Error error = base::File::FILE_OK;
- base::FilePath origin_type_path = GetDirectoryForOriginAndType(
- origin, type_string, false, &error);
- if (origin_type_path.empty())
- return true;
- if (error != base::File::FILE_ERROR_NOT_FOUND) {
- // TODO(dmikurube): Consider the return value of DestroyDirectoryDatabase.
- // We ignore its error now since 1) it doesn't matter the final result, and
- // 2) it always returns false in Windows because of LevelDB's
- // implementation.
- // Information about failure would be useful for debugging.
- if (!type_string.empty())
- DestroyDirectoryDatabase(origin, type_string);
- if (!base::DeleteFile(origin_type_path, true /* recursive */))
+ if (!DestroyDirectoryDatabase(origin, type_string))
+ return false;
+
+ const base::FilePath origin_path = GetDirectoryForOrigin(origin, false, NULL);
+ if (!type_string.empty()) {
+ // Delete the filesystem type directory.
+ base::File::Error error = base::File::FILE_OK;
+ const base::FilePath origin_type_path =
+ GetDirectoryForOriginAndType(origin, type_string, false, &error);
+ if (error == base::File::FILE_ERROR_FAILED)
return false;
- }
+ if (error == base::File::FILE_OK &&
+ !origin_type_path.empty() &&
+ !base::DeleteFile(origin_type_path, true /* recursive */)) {
+ return false;
+ }
- base::FilePath origin_path = VirtualPath::DirName(origin_type_path);
- DCHECK_EQ(origin_path.value(),
- GetDirectoryForOrigin(origin, false, NULL).value());
+ DCHECK_EQ(origin_path.value(),
+ GetDirectoryForOrigin(origin, false, NULL).value());
kinuko 2014/09/25 16:33:00 nit: This is checking the return val of GetDirecto
nhiroki 2014/11/07 08:15:42 Done.
- if (!type_string.empty()) {
// At this point we are sure we had successfully deleted the origin/type
// directory (i.e. we're ready to just return true).
// See if we have other directories in this origin directory.
@@ -900,10 +901,7 @@ bool ObfuscatedFileUtil::DeleteDirectoryForOriginAndType(
origin_database_->RemovePathForOrigin(
storage::GetIdentifierFromOrigin(origin));
}
- if (!base::DeleteFile(origin_path, true /* recursive */))
- return false;
-
- return true;
+ return base::DeleteFile(origin_path, true /* recursive */);
}
ObfuscatedFileUtil::AbstractOriginEnumerator*
@@ -918,15 +916,19 @@ ObfuscatedFileUtil::CreateOriginEnumerator() {
bool ObfuscatedFileUtil::DestroyDirectoryDatabase(
const GURL& origin,
const std::string& type_string) {
- std::string key = GetDirectoryDatabaseKey(origin, type_string);
- if (key.empty())
- return true;
- DirectoryMap::iterator iter = directories_.find(key);
- if (iter == directories_.end())
- return true;
- scoped_ptr<SandboxDirectoryDatabase> database(iter->second);
- directories_.erase(iter);
- return database->DestroyDatabase();
+ // If |type_string| is empty, delete all filesystem types under |origin|.
kinuko 2014/09/25 16:33:00 Probably we could add a test to make sure this doe
nhiroki 2014/11/07 08:15:42 Added.
+ const std::string key_prefix = GetDirectoryDatabaseKey(origin, type_string);
+ for (DirectoryMap::iterator iter = directories_.lower_bound(key_prefix);
+ iter != directories_.end();) {
+ if (!StartsWithASCII(iter->first, key_prefix, true))
+ break;
+ DCHECK(type_string.empty() || iter->first == key_prefix);
+ scoped_ptr<SandboxDirectoryDatabase> database(iter->second);
+ directories_.erase(iter++);
+ if (!database->DestroyDatabase())
+ return false;
kinuko 2014/09/25 16:33:00 It's a bit hard to say what we should do when we c
nhiroki 2014/11/07 08:15:42 I see... I made DestroyDatabase() ignore the failu
+ }
+ return true;
}
// static
@@ -1138,12 +1140,9 @@ base::FilePath ObfuscatedFileUtil::DataPathToLocalPath(
std::string ObfuscatedFileUtil::GetDirectoryDatabaseKey(
const GURL& origin, const std::string& type_string) {
- if (type_string.empty()) {
- LOG(WARNING) << "Unknown filesystem type requested:" << type_string;
- return std::string();
- }
// For isolated origin we just use a type string as a key.
- return storage::GetIdentifierFromOrigin(origin) + type_string;
+ return storage::GetIdentifierFromOrigin(origin) +
+ kDirectoryDatabaseKeySeparator + type_string;
}
// TODO(ericu): How to do the whole validation-without-creation thing?
« no previous file with comments | « content/browser/fileapi/plugin_private_file_system_backend_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698