From 2bde8e466a4451c7319e3a072d118917957d6554 Mon Sep 17 00:00:00 2001 From: Steve Block Date: Wed, 25 May 2011 19:08:45 +0100 Subject: Merge WebKit at r82507: Initial merge by git Change-Id: I60ce9d780725b58b45e54165733a8ffee23b683e --- Source/WebCore/fileapi/BlobURL.cpp | 13 +--- Source/WebCore/fileapi/BlobURL.h | 1 - Source/WebCore/fileapi/DOMFileSystem.cpp | 41 +++++++++++- Source/WebCore/fileapi/DOMFileSystemSync.cpp | 98 ++++++++++++++++++++++++++++ Source/WebCore/fileapi/Entry.idl | 2 +- Source/WebCore/fileapi/EntryBase.cpp | 8 ++- Source/WebCore/fileapi/EntryBase.h | 2 +- Source/WebCore/fileapi/EntrySync.idl | 2 +- Source/WebCore/fileapi/FileReaderLoader.cpp | 4 ++ Source/WebCore/fileapi/FileThread.h | 2 +- Source/WebCore/fileapi/LocalFileSystem.cpp | 2 +- Source/WebCore/fileapi/LocalFileSystem.h | 2 +- 12 files changed, 155 insertions(+), 22 deletions(-) (limited to 'Source/WebCore/fileapi') 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, PassRefPtrcreateWriter(fileWriter.get(), platformPath, callbacks.release()); } -void DOMFileSystem::createFile(const FileEntry* fileEntry, PassRefPtr successCallback, PassRefPtr) +namespace { + +class GetPathCallback : public FileSystemCallbacksBase { +public: + static PassOwnPtr create(PassRefPtr filesystem, const String& path, PassRefPtr successCallback, PassRefPtr 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 filesystem, const String& path, PassRefPtr successCallback, PassRefPtr errorCallback) + : FileSystemCallbacksBase(errorCallback) + , m_filesystem(filesystem) + , m_path(path) + , m_successCallback(successCallback) + { + } + + RefPtr m_filesystem; + String m_path; + RefPtr m_successCallback; +}; + +} // namespace + +void DOMFileSystem::createFile(const FileEntry* fileEntry, PassRefPtr successCallback, PassRefPtr 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 DOMFileSystemSync::root() return DirectoryEntrySync::create(this, DOMFilePath::root); } +namespace { + +class GetPathHelper : public AsyncFileSystemCallbacks { +public: + class GetPathResult : public RefCounted { + public: + static PassRefPtr 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; + }; + + static PassOwnPtr create(PassRefPtr result) + { + return adoptPtr(new GetPathHelper(result)); + } + + virtual void didSucceed() + { + ASSERT_NOT_REACHED(); + } + + virtual void didOpenFileSystem(const String&, PassOwnPtr) + { + ASSERT_NOT_REACHED(); + } + + virtual void didReadDirectoryEntry(const String&, bool) + { + ASSERT_NOT_REACHED(); + } + + virtual void didReadDirectoryEntries(bool) + { + ASSERT_NOT_REACHED(); + } + + virtual void didCreateFileWriter(PassOwnPtr, 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 result) + : m_result(result) + { + } + + RefPtr m_result; +}; + +} // namespace + PassRefPtr DOMFileSystemSync::createFile(const FileEntrySync* fileEntry, ExceptionCode& ec) { ec = 0; String platformPath = m_asyncFileSystem->virtualToPlatformPath(fileEntry->fullPath()); + RefPtr 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, 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 { +class FileThread : public ThreadSafeRefCounted { public: static PassRefPtr 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 callbacks) +void LocalFileSystem::readFileSystem(ScriptExecutionContext* context, AsyncFileSystem::Type type, PassOwnPtr 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); + void readFileSystem(ScriptExecutionContext*, AsyncFileSystem::Type, PassOwnPtr, bool synchronous = false); void requestFileSystem(ScriptExecutionContext*, AsyncFileSystem::Type, long long size, PassOwnPtr, bool synchronous = false); -- cgit v1.1