summaryrefslogtreecommitdiffstats
path: root/webkit/browser/fileapi/dump_file_system.cc
diff options
context:
space:
mode:
authorkinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-28 02:08:07 +0000
committerkinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-28 02:08:07 +0000
commitc6f9203a46211bb08b84f73b4e1df303f1ab8c42 (patch)
treeb8774c1e80f5e37c7f31a889023962fb3eb1bb7e /webkit/browser/fileapi/dump_file_system.cc
parentba7e19a2704f1c4772d1f1f3a45a2b2b78c0bbd7 (diff)
downloadchromium_src-c6f9203a46211bb08b84f73b4e1df303f1ab8c42.zip
chromium_src-c6f9203a46211bb08b84f73b4e1df303f1ab8c42.tar.gz
chromium_src-c6f9203a46211bb08b84f73b4e1df303f1ab8c42.tar.bz2
Move browser-specific FileAPI code from webkit/fileapi to webkit/browser/fileapi
Moving following files: - file_system_context* - file_system_operation* - file_system_url* - and all others but not in syncable/ ones BUG=239710 TBR=avi@chromium.org, tzik@chromium.org Review URL: https://codereview.chromium.org/15859007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@202482 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/browser/fileapi/dump_file_system.cc')
-rw-r--r--webkit/browser/fileapi/dump_file_system.cc205
1 files changed, 205 insertions, 0 deletions
diff --git a/webkit/browser/fileapi/dump_file_system.cc b/webkit/browser/fileapi/dump_file_system.cc
new file mode 100644
index 0000000..452dc5f
--- /dev/null
+++ b/webkit/browser/fileapi/dump_file_system.cc
@@ -0,0 +1,205 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// A tool to dump HTML5 filesystem from CUI.
+//
+// Usage:
+//
+// ./out/Release/dump_file_system [options] <filesystem dir> [origin]...
+//
+// If no origin is specified, this dumps all origins in the profile dir.
+//
+// Available options:
+//
+// -t : dumps temporary files instead of persistent.
+// -s : dumps syncable files instead of persistent.
+// -l : more information will be displayed.
+//
+// The format of -l option is:
+//
+// === ORIGIN origin_name origin_dir ===
+// file_name file_id file_size file_content_path
+// ...
+//
+// where file_name has a trailing slash, file_size is the number of
+// children, and file_content_path is empty if the file is a directory.
+//
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <stack>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/file_util.h"
+#include "base/files/file_path.h"
+#include "base/format_macros.h"
+#include "base/stringprintf.h"
+#include "webkit/browser/fileapi/obfuscated_file_util.h"
+#include "webkit/browser/fileapi/sandbox_directory_database.h"
+#include "webkit/browser/fileapi/sandbox_mount_point_provider.h"
+#include "webkit/browser/fileapi/sandbox_origin_database.h"
+#include "webkit/fileapi/file_system_types.h"
+#include "webkit/fileapi/file_system_util.h"
+
+namespace {
+
+bool g_opt_long;
+fileapi::FileSystemType g_opt_fs_type = fileapi::kFileSystemTypePersistent;
+
+void ShowMessageAndExit(const std::string& msg) {
+ fprintf(stderr, "%s\n", msg.c_str());
+ exit(EXIT_FAILURE);
+}
+
+void ShowUsageAndExit(const std::string& arg0) {
+ ShowMessageAndExit(
+ "Usage: " + arg0 +
+ " [-l] [-t] [-s] <filesystem dir> [origin]...");
+}
+
+} // namespace
+
+namespace fileapi {
+
+static void DumpDirectoryTree(const std::string& origin_name,
+ base::FilePath origin_dir) {
+ origin_dir = origin_dir.Append(
+ ObfuscatedFileUtil::GetDirectoryNameForType(g_opt_fs_type));
+
+ printf("=== ORIGIN %s %s ===\n",
+ origin_name.c_str(), FilePathToString(origin_dir).c_str());
+
+ if (!file_util::DirectoryExists(origin_dir))
+ return;
+
+ SandboxDirectoryDatabase directory_db(origin_dir);
+ SandboxDirectoryDatabase::FileId root_id;
+ if (!directory_db.GetFileWithPath(StringToFilePath("/"), &root_id))
+ return;
+
+ std::stack<std::pair<SandboxDirectoryDatabase::FileId,
+ std::string> > paths;
+ paths.push(std::make_pair(root_id, ""));
+ while (!paths.empty()) {
+ SandboxDirectoryDatabase::FileId id = paths.top().first;
+ const std::string dirname = paths.top().second;
+ paths.pop();
+
+ SandboxDirectoryDatabase::FileInfo info;
+ if (!directory_db.GetFileInfo(id, &info)) {
+ ShowMessageAndExit(base::StringPrintf("GetFileInfo failed for %"PRId64,
+ id));
+ }
+
+ const std::string name =
+ dirname + "/" + FilePathToString(base::FilePath(info.name));
+ std::vector<SandboxDirectoryDatabase::FileId> children;
+ if (info.is_directory()) {
+ if (!directory_db.ListChildren(id, &children)) {
+ ShowMessageAndExit(base::StringPrintf(
+ "ListChildren failed for %s (%"PRId64")",
+ info.name.c_str(), id));
+ }
+
+ for (size_t j = children.size(); j; j--)
+ paths.push(make_pair(children[j-1], name));
+ }
+
+ // +1 for the leading extra slash.
+ const char* display_name = name.c_str() + 1;
+ const char* directory_suffix = info.is_directory() ? "/" : "";
+ if (g_opt_long) {
+ int64 size;
+ if (info.is_directory()) {
+ size = static_cast<int64>(children.size());
+ } else {
+ file_util::GetFileSize(origin_dir.Append(info.data_path), &size);
+ }
+ // TODO(hamaji): Modification time?
+ printf("%s%s %"PRId64" %"PRId64" %s\n",
+ display_name,
+ directory_suffix,
+ id,
+ size,
+ FilePathToString(info.data_path).c_str());
+ } else {
+ printf("%s%s\n", display_name, directory_suffix);
+ }
+ }
+}
+
+static void DumpOrigin(const base::FilePath& file_system_dir,
+ const std::string& origin_name) {
+ SandboxOriginDatabase origin_db(file_system_dir);
+ base::FilePath origin_dir;
+ if (!origin_db.HasOriginPath(origin_name)) {
+ ShowMessageAndExit("Origin " + origin_name + " is not in " +
+ FilePathToString(file_system_dir));
+ }
+
+ if (!origin_db.GetPathForOrigin(origin_name, &origin_dir)) {
+ ShowMessageAndExit("Failed to get path of origin " + origin_name +
+ " in " + FilePathToString(file_system_dir));
+ }
+ DumpDirectoryTree(origin_name, file_system_dir.Append(origin_dir));
+}
+
+static void DumpFileSystem(const base::FilePath& file_system_dir) {
+ SandboxOriginDatabase origin_db(file_system_dir);
+ std::vector<SandboxOriginDatabase::OriginRecord> origins;
+ origin_db.ListAllOrigins(&origins);
+ for (size_t i = 0; i < origins.size(); i++) {
+ const SandboxOriginDatabase::OriginRecord& origin = origins[i];
+ DumpDirectoryTree(origin.origin, file_system_dir.Append(origin.path));
+ puts("");
+ }
+}
+
+} // namespace fileapi
+
+int main(int argc, char* argv[]) {
+ const char* arg0 = argv[0];
+ std::string username = "Default";
+ while (true) {
+ if (argc < 2)
+ ShowUsageAndExit(arg0);
+
+ if (std::string(argv[1]) == "-l") {
+ g_opt_long = true;
+ argc--;
+ argv++;
+ } else if (std::string(argv[1]) == "-t") {
+ g_opt_fs_type = fileapi::kFileSystemTypeTemporary;
+ argc--;
+ argv++;
+ } else if (std::string(argv[1]) == "-s") {
+ g_opt_fs_type = fileapi::kFileSystemTypeSyncable;
+ argc--;
+ argv++;
+ } else {
+ break;
+ }
+ }
+
+ if (argc < 2)
+ ShowUsageAndExit(arg0);
+
+ const base::FilePath file_system_dir = fileapi::StringToFilePath(argv[1]);
+ if (!file_util::DirectoryExists(file_system_dir)) {
+ ShowMessageAndExit(fileapi::FilePathToString(file_system_dir) +
+ " is not a filesystem directory");
+ }
+
+ if (argc == 2) {
+ fileapi::DumpFileSystem(file_system_dir);
+ } else {
+ for (int i = 2; i < argc; i++) {
+ fileapi::DumpOrigin(file_system_dir, argv[i]);
+ }
+ }
+ return 0;
+}