| Index: webkit/fileapi/file_system_util.cc
|
| ===================================================================
|
| --- webkit/fileapi/file_system_util.cc (revision 79142)
|
| +++ webkit/fileapi/file_system_util.cc (working copy)
|
| @@ -7,6 +7,7 @@
|
| #include "build/build_config.h"
|
|
|
| #include "base/file_path.h"
|
| +#include "base/logging.h"
|
| #include "base/sys_string_conversions.h"
|
| #include "googleurl/src/gurl.h"
|
| #include "net/base/escape.h"
|
| @@ -19,27 +20,61 @@
|
|
|
| bool CrackFileSystemURL(const GURL& url, GURL* origin_url, FileSystemType* type,
|
| FilePath* file_path) {
|
| - *origin_url = GURL();
|
| - *type = kFileSystemTypeUnknown;
|
| - *file_path = FilePath();
|
| + GURL origin;
|
| + FileSystemType file_system_type;
|
|
|
| if (url.scheme() != "filesystem")
|
| return false;
|
|
|
| - GURL bare_url(url.path());
|
| - *origin_url = bare_url.GetOrigin();
|
| + std::string temp = url.path();
|
| + // TODO(ericu) remove this code when that ceases to be true, which should be
|
| + // soon.
|
| + // On Windows, this will have backslashes for now.
|
| + // url will look something like:
|
| + // filesystem:http://example.com/temporary/\dir\file.txt
|
| + // temp will look something like:
|
| + // http://example.com/temporary/\dir\file.txt
|
| + // On posix, url will look something like:
|
| + // filesystem:http://example.com/temporary/dir/file.txt
|
| + // temp will look something like:
|
| + // http://example.com/temporary/dir/file.txt
|
| + size_t pos = temp.find('\\');
|
| + for (; pos != std::string::npos; pos = temp.find('\\', pos + 1)) {
|
| + temp[pos] = '/';
|
| + }
|
| + // TODO(ericu): This should probably be done elsewhere after the stackable
|
| + // layers are properly in. We're supposed to reject any paths that contain
|
| + // '..' segments, but the GURL constructor is helpfully resolving them for us.
|
| + // Make sure there aren't any before we call it.
|
| + pos = temp.find("..");
|
| + for (; pos != std::string::npos; pos = temp.find("..", pos + 1)) {
|
| + if ((pos == 0 || temp[pos - 1] == '/') &&
|
| + (pos == temp.length() - 2 || temp[pos + 2] == '/'))
|
| + return false;
|
| + }
|
|
|
| + // bare_url will look something like:
|
| + // http://example.com/temporary//dir/file.txt [on Windows; the double slash
|
| + // before dir will be single on posix].
|
| + GURL bare_url(temp);
|
| +
|
| // The input URL was malformed, bail out early.
|
| - if (origin_url->is_empty() || bare_url.path().empty())
|
| + if (bare_url.path().empty())
|
| return false;
|
|
|
| + origin = bare_url.GetOrigin();
|
| +
|
| + // The input URL was malformed, bail out early.
|
| + if (origin.is_empty())
|
| + return false;
|
| +
|
| std::string path = UnescapeURLComponent(bare_url.path(),
|
| UnescapeRule::SPACES | UnescapeRule::URL_SPECIAL_CHARS);
|
| if (path.compare(0, strlen(kPersistentDir), kPersistentDir) == 0) {
|
| - *type = kFileSystemTypePersistent;
|
| + file_system_type = kFileSystemTypePersistent;
|
| path = path.substr(strlen(kPersistentDir));
|
| } else if (path.compare(0, strlen(kTemporaryDir), kTemporaryDir) == 0) {
|
| - *type = kFileSystemTypeTemporary;
|
| + file_system_type = kFileSystemTypeTemporary;
|
| path = path.substr(strlen(kTemporaryDir));
|
| } else {
|
| return false;
|
| @@ -50,13 +85,36 @@
|
| path.erase(0, 1);
|
|
|
| #if defined(OS_WIN)
|
| - const FilePath::StringType& sys_path = base::SysUTF8ToWide(path);
|
| + const FilePath::StringType sys_path = base::SysUTF8ToWide(path);
|
| #elif defined(OS_POSIX)
|
| - const FilePath::StringType& sys_path = path;
|
| + const FilePath::StringType sys_path = path;
|
| #endif
|
| + if (origin_url)
|
| + *origin_url = origin;
|
| + if (type)
|
| + *type = file_system_type;
|
| + if (file_path)
|
| + *file_path = FilePath(sys_path);
|
|
|
| - *file_path = FilePath(sys_path);
|
| return true;
|
| }
|
|
|
| +GURL GetFileSystemRootURI(
|
| + const GURL& origin_url, fileapi::FileSystemType type) {
|
| + std::string path("filesystem:");
|
| + path += origin_url.spec();
|
| + switch (type) {
|
| + case kFileSystemTypeTemporary:
|
| + path += (kTemporaryDir + 1); // We don't want the leading slash.
|
| + break;
|
| + case kFileSystemTypePersistent:
|
| + path += (kPersistentDir + 1); // We don't want the leading slash.
|
| + break;
|
| + default:
|
| + NOTREACHED();
|
| + return GURL();
|
| + }
|
| + return GURL(path);
|
| +}
|
| +
|
| } // namespace fileapi
|
|
|