summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/fileapi
diff options
context:
space:
mode:
authorSteve Block <steveblock@google.com>2011-05-25 19:08:45 +0100
committerSteve Block <steveblock@google.com>2011-06-08 13:51:31 +0100
commit2bde8e466a4451c7319e3a072d118917957d6554 (patch)
tree28f4a1b869a513e565c7760d0e6a06e7cf1fe95a /Source/WebCore/fileapi
parent6939c99b71d9372d14a0c74a772108052e8c48c8 (diff)
downloadexternal_webkit-2bde8e466a4451c7319e3a072d118917957d6554.zip
external_webkit-2bde8e466a4451c7319e3a072d118917957d6554.tar.gz
external_webkit-2bde8e466a4451c7319e3a072d118917957d6554.tar.bz2
Merge WebKit at r82507: Initial merge by git
Change-Id: I60ce9d780725b58b45e54165733a8ffee23b683e
Diffstat (limited to 'Source/WebCore/fileapi')
-rw-r--r--Source/WebCore/fileapi/BlobURL.cpp13
-rw-r--r--Source/WebCore/fileapi/BlobURL.h1
-rw-r--r--Source/WebCore/fileapi/DOMFileSystem.cpp41
-rw-r--r--Source/WebCore/fileapi/DOMFileSystemSync.cpp98
-rw-r--r--Source/WebCore/fileapi/Entry.idl2
-rw-r--r--Source/WebCore/fileapi/EntryBase.cpp8
-rw-r--r--Source/WebCore/fileapi/EntryBase.h2
-rw-r--r--Source/WebCore/fileapi/EntrySync.idl2
-rw-r--r--Source/WebCore/fileapi/FileReaderLoader.cpp4
-rw-r--r--Source/WebCore/fileapi/FileThread.h2
-rw-r--r--Source/WebCore/fileapi/LocalFileSystem.cpp2
-rw-r--r--Source/WebCore/fileapi/LocalFileSystem.h2
12 files changed, 155 insertions, 22 deletions
diff --git a/Source/WebCore/fileapi/BlobURL.cpp b/Source/WebCore/fileapi/BlobURL.cpp
index 47ebe8d..5d79141 100644
--- a/Source/WebCore/fileapi/BlobURL.cpp
+++ b/Source/WebCore/fileapi/BlobURL.cpp
@@ -52,16 +52,6 @@ KURL BlobURL::createInternalURL()
return createBlobURL("blobinternal://");
}
-KURL BlobURL::getOrigin(const KURL& url)
-{
- ASSERT(url.protocolIs(kBlobProtocol));
-
- unsigned startIndex = url.pathStart();
- unsigned afterEndIndex = url.pathAfterLastSlash();
- String origin = url.string().substring(startIndex, afterEndIndex - startIndex);
- return KURL(ParsedURLString, decodeURLEscapeSequences(origin));
-}
-
String BlobURL::getIdentifier(const KURL& url)
{
ASSERT(url.protocolIs(kBlobProtocol));
@@ -72,6 +62,9 @@ String BlobURL::getIdentifier(const KURL& url)
KURL BlobURL::createBlobURL(const String& originString)
{
+ ASSERT(!originString.isEmpty());
+ if (originString == "null")
+ return KURL();
String urlString = kBlobProtocol;
urlString += ":";
urlString += encodeWithURLEscapeSequences(originString);
diff --git a/Source/WebCore/fileapi/BlobURL.h b/Source/WebCore/fileapi/BlobURL.h
index 4526e63..4ea59fe 100644
--- a/Source/WebCore/fileapi/BlobURL.h
+++ b/Source/WebCore/fileapi/BlobURL.h
@@ -50,7 +50,6 @@ class BlobURL {
public:
static KURL createPublicURL(SecurityOrigin*);
static KURL createInternalURL();
- static KURL getOrigin(const KURL&);
static String getIdentifier(const KURL&);
static const char* blobProtocol() { return kBlobProtocol; }
diff --git a/Source/WebCore/fileapi/DOMFileSystem.cpp b/Source/WebCore/fileapi/DOMFileSystem.cpp
index c1710cd..01d56d5 100644
--- a/Source/WebCore/fileapi/DOMFileSystem.cpp
+++ b/Source/WebCore/fileapi/DOMFileSystem.cpp
@@ -39,6 +39,7 @@
#include "ErrorCallback.h"
#include "File.h"
#include "FileEntry.h"
+#include "FileMetadata.h"
#include "FileSystemCallbacks.h"
#include "FileWriter.h"
#include "FileWriterBaseCallback.h"
@@ -111,12 +112,46 @@ void DOMFileSystem::createWriter(const FileEntry* fileEntry, PassRefPtr<FileWrit
m_asyncFileSystem->createWriter(fileWriter.get(), platformPath, callbacks.release());
}
-void DOMFileSystem::createFile(const FileEntry* fileEntry, PassRefPtr<FileCallback> successCallback, PassRefPtr<ErrorCallback>)
+namespace {
+
+class GetPathCallback : public FileSystemCallbacksBase {
+public:
+ static PassOwnPtr<GetPathCallback> create(PassRefPtr<DOMFileSystem> filesystem, const String& path, PassRefPtr<FileCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)
+ {
+ return adoptPtr(new GetPathCallback(filesystem, path, successCallback, errorCallback));
+ }
+
+ virtual void didReadMetadata(const FileMetadata& metadata)
+ {
+ if (!metadata.platformPath.isEmpty())
+ m_path = metadata.platformPath;
+
+ m_filesystem->scheduleCallback(m_successCallback.release(), File::create(m_path));
+ }
+
+private:
+ GetPathCallback(PassRefPtr<DOMFileSystem> filesystem, const String& path, PassRefPtr<FileCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)
+ : FileSystemCallbacksBase(errorCallback)
+ , m_filesystem(filesystem)
+ , m_path(path)
+ , m_successCallback(successCallback)
+ {
+ }
+
+ RefPtr<DOMFileSystem> m_filesystem;
+ String m_path;
+ RefPtr<FileCallback> m_successCallback;
+};
+
+} // namespace
+
+void DOMFileSystem::createFile(const FileEntry* fileEntry, PassRefPtr<FileCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)
{
String platformPath = m_asyncFileSystem->virtualToPlatformPath(fileEntry->fullPath());
- scheduleCallback(successCallback, File::create(platformPath));
+
+ m_asyncFileSystem->readMetadata(platformPath, GetPathCallback::create(this, platformPath, successCallback, errorCallback));
}
-} // namespace
+} // namespace WebCore
#endif // ENABLE(FILE_SYSTEM)
diff --git a/Source/WebCore/fileapi/DOMFileSystemSync.cpp b/Source/WebCore/fileapi/DOMFileSystemSync.cpp
index 5ae7545..0d26bb6 100644
--- a/Source/WebCore/fileapi/DOMFileSystemSync.cpp
+++ b/Source/WebCore/fileapi/DOMFileSystemSync.cpp
@@ -33,6 +33,8 @@
#if ENABLE(FILE_SYSTEM)
+#include "AsyncFileSystem.h"
+#include "AsyncFileWriter.h"
#include "DOMFilePath.h"
#include "DirectoryEntrySync.h"
#include "ErrorCallback.h"
@@ -40,6 +42,7 @@
#include "FileEntrySync.h"
#include "FileError.h"
#include "FileException.h"
+#include "FileMetadata.h"
#include "FileSystemCallbacks.h"
#include "FileWriterBaseCallback.h"
#include "FileWriterSync.h"
@@ -67,10 +70,105 @@ PassRefPtr<DirectoryEntrySync> DOMFileSystemSync::root()
return DirectoryEntrySync::create(this, DOMFilePath::root);
}
+namespace {
+
+class GetPathHelper : public AsyncFileSystemCallbacks {
+public:
+ class GetPathResult : public RefCounted<GetPathResult> {
+ public:
+ static PassRefPtr<GetPathResult> create()
+ {
+ return adoptRef(new GetPathResult());
+ }
+
+ bool m_failed;
+ int m_code;
+ String m_path;
+
+ private:
+ GetPathResult()
+ : m_failed(false)
+ , m_code(0)
+ {
+ }
+
+ ~GetPathResult()
+ {
+ }
+ friend class WTF::RefCounted<GetPathResult>;
+ };
+
+ static PassOwnPtr<GetPathHelper> create(PassRefPtr<GetPathResult> result)
+ {
+ return adoptPtr(new GetPathHelper(result));
+ }
+
+ virtual void didSucceed()
+ {
+ ASSERT_NOT_REACHED();
+ }
+
+ virtual void didOpenFileSystem(const String&, PassOwnPtr<AsyncFileSystem>)
+ {
+ ASSERT_NOT_REACHED();
+ }
+
+ virtual void didReadDirectoryEntry(const String&, bool)
+ {
+ ASSERT_NOT_REACHED();
+ }
+
+ virtual void didReadDirectoryEntries(bool)
+ {
+ ASSERT_NOT_REACHED();
+ }
+
+ virtual void didCreateFileWriter(PassOwnPtr<AsyncFileWriter>, long long)
+ {
+ ASSERT_NOT_REACHED();
+ }
+
+ virtual void didFail(int code)
+ {
+ m_result->m_failed = true;
+ m_result->m_code = code;
+ }
+
+ virtual ~GetPathHelper()
+ {
+ }
+
+ void didReadMetadata(const FileMetadata& metadata)
+ {
+ m_result->m_path = metadata.platformPath;
+ }
+private:
+ GetPathHelper(PassRefPtr<GetPathResult> result)
+ : m_result(result)
+ {
+ }
+
+ RefPtr<GetPathResult> m_result;
+};
+
+} // namespace
+
PassRefPtr<File> DOMFileSystemSync::createFile(const FileEntrySync* fileEntry, ExceptionCode& ec)
{
ec = 0;
String platformPath = m_asyncFileSystem->virtualToPlatformPath(fileEntry->fullPath());
+ RefPtr<GetPathHelper::GetPathResult> result(GetPathHelper::GetPathResult::create());
+ m_asyncFileSystem->readMetadata(platformPath, GetPathHelper::create(result));
+ if (!m_asyncFileSystem->waitForOperationToComplete()) {
+ ec = FileException::ABORT_ERR;
+ return 0;
+ }
+ if (result->m_failed) {
+ ec = result->m_code;
+ return 0;
+ }
+ if (!result->m_path.isEmpty())
+ platformPath = result->m_path;
return File::create(platformPath);
}
diff --git a/Source/WebCore/fileapi/Entry.idl b/Source/WebCore/fileapi/Entry.idl
index f144b31..557ade4 100644
--- a/Source/WebCore/fileapi/Entry.idl
+++ b/Source/WebCore/fileapi/Entry.idl
@@ -43,7 +43,7 @@ module storage {
void getMetadata(in [Optional, Callback] MetadataCallback successCallback, in [Optional, Callback] ErrorCallback errorCallback);
void moveTo(in DirectoryEntry parent, in [Optional, ConvertUndefinedOrNullToNullString] DOMString name, in [Optional, Callback] EntryCallback successCallback, in [Optional, Callback] ErrorCallback errorCallback);
void copyTo(in DirectoryEntry parent, in [Optional, ConvertUndefinedOrNullToNullString] DOMString name, in [Optional, Callback] EntryCallback successCallback, in [Optional, Callback] ErrorCallback errorCallback);
- DOMString toURI();
+ DOMString toURL();
void remove(in [Optional, Callback] VoidCallback successCallback, in [Optional, Callback] ErrorCallback errorCallback);
void getParent(in [Optional, Callback] EntryCallback successCallback, in [Optional, Callback] ErrorCallback errorCallback);
};
diff --git a/Source/WebCore/fileapi/EntryBase.cpp b/Source/WebCore/fileapi/EntryBase.cpp
index ad3bec0..e10964a 100644
--- a/Source/WebCore/fileapi/EntryBase.cpp
+++ b/Source/WebCore/fileapi/EntryBase.cpp
@@ -54,11 +54,15 @@ EntryBase::~EntryBase()
{
}
-String EntryBase::toURI()
+String EntryBase::toURL()
{
+ String originString = m_fileSystem->securityOrigin()->toString();
+ ASSERT(!originString.isEmpty());
+ if (originString == "null")
+ return String();
StringBuilder result;
result.append("filesystem:");
- result.append(m_fileSystem->securityOrigin()->toString());
+ result.append(originString);
result.append("/");
result.append(m_fileSystem->asyncFileSystem()->type() == AsyncFileSystem::Temporary ? DOMFileSystemBase::kTemporaryPathPrefix : DOMFileSystemBase::kPersistentPathPrefix);
result.append(m_fullPath);
diff --git a/Source/WebCore/fileapi/EntryBase.h b/Source/WebCore/fileapi/EntryBase.h
index babd295..a34a914 100644
--- a/Source/WebCore/fileapi/EntryBase.h
+++ b/Source/WebCore/fileapi/EntryBase.h
@@ -55,7 +55,7 @@ public:
const String& fullPath() const { return m_fullPath; }
const String& name() const { return m_name; }
- String toURI();
+ String toURL();
protected:
EntryBase(PassRefPtr<DOMFileSystemBase>, const String& fullPath);
diff --git a/Source/WebCore/fileapi/EntrySync.idl b/Source/WebCore/fileapi/EntrySync.idl
index 0a180e8..459a014 100644
--- a/Source/WebCore/fileapi/EntrySync.idl
+++ b/Source/WebCore/fileapi/EntrySync.idl
@@ -43,7 +43,7 @@ module storage {
Metadata getMetadata() raises (FileException);
EntrySync moveTo(in DirectoryEntrySync parent, in [ConvertUndefinedOrNullToNullString] DOMString name) raises (FileException);
EntrySync copyTo(in DirectoryEntrySync parent, in [ConvertUndefinedOrNullToNullString] DOMString name) raises (FileException);
- DOMString toURI();
+ DOMString toURL();
void remove() raises (FileException);
DirectoryEntrySync getParent();
};
diff --git a/Source/WebCore/fileapi/FileReaderLoader.cpp b/Source/WebCore/fileapi/FileReaderLoader.cpp
index 07b32a6..918ffba 100644
--- a/Source/WebCore/fileapi/FileReaderLoader.cpp
+++ b/Source/WebCore/fileapi/FileReaderLoader.cpp
@@ -75,6 +75,10 @@ void FileReaderLoader::start(ScriptExecutionContext* scriptExecutionContext, Blo
{
// The blob is read by routing through the request handling layer given a temporary public url.
m_urlForReading = BlobURL::createPublicURL(scriptExecutionContext->securityOrigin());
+ if (m_urlForReading.isEmpty()) {
+ failed(FileError::SECURITY_ERR);
+ return;
+ }
ThreadableBlobRegistry::registerBlobURL(m_urlForReading, blob->url());
// Construct and load the request.
diff --git a/Source/WebCore/fileapi/FileThread.h b/Source/WebCore/fileapi/FileThread.h
index 45205c4..9c1d267 100644
--- a/Source/WebCore/fileapi/FileThread.h
+++ b/Source/WebCore/fileapi/FileThread.h
@@ -42,7 +42,7 @@ namespace WebCore {
class FileStream;
-class FileThread : public ThreadSafeShared<FileThread> {
+class FileThread : public ThreadSafeRefCounted<FileThread> {
public:
static PassRefPtr<FileThread> create()
{
diff --git a/Source/WebCore/fileapi/LocalFileSystem.cpp b/Source/WebCore/fileapi/LocalFileSystem.cpp
index 688d155..955d723 100644
--- a/Source/WebCore/fileapi/LocalFileSystem.cpp
+++ b/Source/WebCore/fileapi/LocalFileSystem.cpp
@@ -81,7 +81,7 @@ static void openFileSystem(ScriptExecutionContext*, const String& basePath, cons
AsyncFileSystem::openFileSystem(basePath, identifier, type, create, callbacks);
}
-void LocalFileSystem::readFileSystem(ScriptExecutionContext* context, AsyncFileSystem::Type type, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+void LocalFileSystem::readFileSystem(ScriptExecutionContext* context, AsyncFileSystem::Type type, PassOwnPtr<AsyncFileSystemCallbacks> callbacks, bool)
{
// AsyncFileSystem::openFileSystem calls callbacks synchronously, so the method needs to be called asynchronously.
context->postTask(createCallbackTask(&openFileSystem, fileSystemBasePath(), context->securityOrigin()->databaseIdentifier(), type, false, callbacks));
diff --git a/Source/WebCore/fileapi/LocalFileSystem.h b/Source/WebCore/fileapi/LocalFileSystem.h
index baf72d9..2eabd7a 100644
--- a/Source/WebCore/fileapi/LocalFileSystem.h
+++ b/Source/WebCore/fileapi/LocalFileSystem.h
@@ -54,7 +54,7 @@ public:
static LocalFileSystem& localFileSystem();
// Does not create the root path for file system, just reads it if available.
- void readFileSystem(ScriptExecutionContext*, AsyncFileSystem::Type, PassOwnPtr<AsyncFileSystemCallbacks>);
+ void readFileSystem(ScriptExecutionContext*, AsyncFileSystem::Type, PassOwnPtr<AsyncFileSystemCallbacks>, bool synchronous = false);
void requestFileSystem(ScriptExecutionContext*, AsyncFileSystem::Type, long long size, PassOwnPtr<AsyncFileSystemCallbacks>, bool synchronous = false);