WebCore/ChangeLog

 12010-09-17 Eric Uhrhane <ericu@chromium.org>
 2
 3 Reviewed by NOBODY (OOPS!).
 4
 5 Add Chromium implementation for FileWriter
 6 https://bugs.webkit.org/show_bug.cgi?id=44361
 7
 8 No new tests; the implementation's not yet far enough along for that.
 9
 10 This makes a chain of contruction-and-linking-up for various sorts of
 11 FileWriter interfaces to call through to Chromium, and for various
 12 sorts of FileWriterClients to call back, with object ownership always
 13 pointing towards the Chromium API. That is, the DOM object owns an
 14 AsyncFileWriter, which owns its implementation object, and the reverse
 15 (client) direction is raw pointers.
 16
 17 File metadata is looked up before the FileWriter is returned, so that
 18 we know the file exists and can cache its length.
 19
 20 The WebCore part of this is simple and generic enough to handle
 21 Chromium, so it should be easy for me to put in a WebCore-only
 22 implementation next.
 23
 24 * fileapi/AsyncFileWriter.h:
 25 * fileapi/DOMFileSystem.cpp:
 26 (WebCore::DOMFileSystem::createWriter):
 27 * fileapi/DOMFileSystem.h:
 28 * fileapi/FileSystemCallbacks.cpp:
 29 (WebCore::FileSystemCallbacksBase::didCreateFileWriter):
 30 (WebCore::FileWriterCallbacks::FileWriterCallbacks):
 31 (WebCore::FileWriterCallbacks::didCreateFileWriter):
 32 * fileapi/FileSystemCallbacks.h:
 33 * platform/AsyncFileSystem.h:
 34 * platform/AsyncFileSystemCallbacks.h:
 35
1362010-09-17 Darin Adler <darin@apple.com>
237
338 Build fix for platforms that compile Touch.
67769

WebCore/fileapi/AsyncFileWriter.h

@@class AsyncFileWriter {
4545public:
4646 virtual ~AsyncFileWriter() {}
4747
48  virtual void setFileWriterClient(FileWriterClient* client) = 0;
49 
5048 virtual void write(long long position, Blob* data) = 0;
5149 virtual void truncate(long long length) = 0;
5250 virtual void abort() = 0;
67769

WebCore/fileapi/DOMFileSystem.cpp

4040#include "Entry.h"
4141#include "EntryCallback.h"
4242#include "ErrorCallback.h"
 43#include "FileEntry.h"
4344#include "FileError.h"
4445#include "FileSystemCallbacks.h"
 46#include "FileWriter.h"
 47#include "FileWriterCallback.h"
4548#include "MetadataCallback.h"
4649#include "ScriptExecutionContext.h"
4750#include "VoidCallback.h"

@@void DOMFileSystem::getDirectory(const E
199202 m_asyncFileSystem->directoryExists(platformPath, callbacks.release());
200203}
201204
 205void DOMFileSystem::createWriter(const FileEntry* file, PassRefPtr<FileWriterCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)
 206{
 207 ASSERT(file);
 208
 209 String platformPath = m_asyncFileSystem->virtualToPlatformPath(file->fullPath());
 210
 211 RefPtr<FileWriter> fileWriter = FileWriter::create(scriptExecutionContext());
 212 OwnPtr<FileWriterCallbacks> callbacks = adoptPtr(new FileWriterCallbacks(fileWriter, successCallback, errorCallback));
 213 m_asyncFileSystem->createWriter(fileWriter.get(), platformPath, callbacks.release());
 214}
 215
202216void DOMFileSystem::readDirectory(const String& path, PassRefPtr<EntriesCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)
203217{
204218 ASSERT(DOMFilePath::isAbsolute(path));
67769

WebCore/fileapi/DOMFileSystem.h

@@class Entry;
4848class EntryCallback;
4949class EntriesCallback;
5050class ErrorCallback;
 51class FileEntry;
 52class FileWriterCallback;
5153class MetadataCallback;
5254class VoidCallback;
5355

@@public:
7779 void getFile(const Entry* base, const String& path, PassRefPtr<Flags>, PassRefPtr<EntryCallback>, PassRefPtr<ErrorCallback>);
7880 void getDirectory(const Entry* base, const String& path, PassRefPtr<Flags>, PassRefPtr<EntryCallback>, PassRefPtr<ErrorCallback>);
7981 void readDirectory(const String& path, PassRefPtr<EntriesCallback>, PassRefPtr<ErrorCallback>);
 82 void createWriter(const FileEntry* file, PassRefPtr<FileWriterCallback>, PassRefPtr<ErrorCallback>);
8083
8184 // Schedule a callback. This should not cross threads (should be called on the same context thread).
8285 template <typename CB, typename CBArg>
67769

WebCore/fileapi/FileSystemCallbacks.cpp

3434#if ENABLE(FILE_SYSTEM)
3535
3636#include "AsyncFileSystem.h"
 37#include "AsyncFileWriter.h"
3738#include "DOMFilePath.h"
3839#include "DOMFileSystem.h"
3940#include "DirectoryEntry.h"

4546#include "FileEntry.h"
4647#include "FileError.h"
4748#include "FileSystemCallback.h"
 49#include "FileWriter.h"
 50#include "FileWriterCallback.h"
4851#include "Metadata.h"
4952#include "MetadataCallback.h"
5053#include "ScriptExecutionContext.h"

@@void FileSystemCallbacksBase::didReadDir
9194 ASSERT_NOT_REACHED();
9295}
9396
 97void FileSystemCallbacksBase::didCreateFileWriter(PassOwnPtr<AsyncFileWriter>, long long)
 98{
 99 // Each subclass must implement an appropriate one.
 100 ASSERT_NOT_REACHED();
 101}
 102
94103void FileSystemCallbacksBase::didFail(int code)
95104{
96105 if (m_errorCallback) {

@@void MetadataCallbacks::didReadMetadata(
187196 m_successCallback.clear();
188197}
189198
 199// FileWriterCallbacks ----------------------------------------------------------
 200
 201FileWriterCallbacks::FileWriterCallbacks(PassRefPtr<FileWriter> fileWriter, PassRefPtr<FileWriterCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)
 202 : FileSystemCallbacksBase(errorCallback)
 203 , m_fileWriter(fileWriter)
 204 , m_successCallback(successCallback)
 205{
 206}
 207
 208void FileWriterCallbacks::didCreateFileWriter(PassOwnPtr<AsyncFileWriter> asyncFileWriter, long long length)
 209{
 210 m_fileWriter->initialize(asyncFileWriter, length);
 211 if (m_successCallback)
 212 m_successCallback->handleEvent(m_fileWriter.release().get());
 213 m_successCallback.clear();
 214}
 215
190216// VoidCallbacks --------------------------------------------------------------
191217
192218VoidCallbacks::VoidCallbacks(PassRefPtr<VoidCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)
67769

WebCore/fileapi/FileSystemCallbacks.h

4040
4141namespace WebCore {
4242
 43class AsyncFileWriter;
4344class DOMFileSystem;
4445class ErrorCallback;
4546class EntriesCallback;
4647class EntryArray;
4748class EntryCallback;
4849class FileSystemCallback;
 50class FileWriter;
 51class FileWriterCallback;
4952class MetadataCallback;
5053class ScriptExecutionContext;
5154class VoidCallback;

@@public:
6770 virtual void didReadDirectoryEntry(const String& name, bool isDirectory);
6871 virtual void didReadDirectoryEntries(bool hasMore);
6972
 73 // For createFileWriter.
 74 virtual void didCreateFileWriter(PassOwnPtr<AsyncFileWriter>, long long length);
 75
7076 // For ErrorCallback.
7177 virtual void didFail(int code);
7278

@@private:
121127 RefPtr<MetadataCallback> m_successCallback;
122128};
123129
 130class FileWriterCallbacks : public FileSystemCallbacksBase {
 131public:
 132 FileWriterCallbacks(PassRefPtr<FileWriter>, PassRefPtr<FileWriterCallback>, PassRefPtr<ErrorCallback>);
 133 virtual void didCreateFileWriter(PassOwnPtr<AsyncFileWriter>, long long length);
 134
 135private:
 136 RefPtr<FileWriter> m_fileWriter;
 137 RefPtr<FileWriterCallback> m_successCallback;
 138};
 139
124140class VoidCallbacks : public FileSystemCallbacksBase {
125141public:
126142 VoidCallbacks(PassRefPtr<VoidCallback>, PassRefPtr<ErrorCallback>);
67769

WebCore/platform/AsyncFileSystem.h

@@namespace WebCore {
4141
4242class AsyncFileSystem;
4343class AsyncFileSystemCallbacks;
 44class FileWriterClient;
4445
4546// This class provides async interface for platform-specific file system implementation. Note that all the methods take platform paths.
4647class AsyncFileSystem : public Noncopyable {

@@public:
107108 // AsyncFileSystemCallbacks::didFail() is when there is an error.
108109 virtual void readDirectory(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>) = 0;
109110
 111 // Creates an AsyncFileWriter for a given file path.
 112 // AsyncFileSystemCallbacks::didCreateFileWriter() is called when an AsyncFileWriter is created successfully.
 113 // AsyncFileSystemCallbacks::didFail() is called otherwise.
 114 virtual void createWriter(FileWriterClient* client, const String& path, PassOwnPtr<AsyncFileSystemCallbacks>) = 0;
 115
110116 // Converts a given absolute virtual path to a platform path that starts with the platform root path of this file system.
111117 virtual String virtualToPlatformPath(const String& path) const;
112118
67769

WebCore/platform/AsyncFileSystemCallbacks.h

3838namespace WebCore {
3939
4040class AsyncFileSystem;
 41class AsyncFileWriter;
4142
4243class AsyncFileSystemCallbacks : public Noncopyable {
4344public:

@@public:
5657 // Called after a chunk of directory entries have been read (i.e. indicates it's good time to call back to the application). If hasMore is true there can be more chunks.
5758 virtual void didReadDirectoryEntries(bool hasMore) = 0;
5859
 60 // Called when an AsyncFileWrter has been created successfully.
 61 virtual void didCreateFileWriter(PassOwnPtr<AsyncFileWriter> writer, long long length) = 0;
 62
5963 // Called when there was an error.
6064 virtual void didFail(int code) = 0;
6165
67769

WebKit/chromium/ChangeLog

 12010-09-17 Eric Uhrhane <ericu@chromium.org>
 2
 3 Reviewed by NOBODY (OOPS!).
 4
 5 Add Chromium implementation for FileWriter
 6 https://bugs.webkit.org/show_bug.cgi?id=44361
 7
 8 No new tests; the implementation's not yet far enough along for that.
 9
 10 This makes a chain of contruction-and-linking-up for various sorts of
 11 FileWriter interfaces to call through to Chromium, and for various
 12 sorts of FileWriterClients to call back, with object ownership always
 13 pointing towards the Chromium API. That is, the DOM object owns an
 14 AsyncFileWriter, which owns its implementation object, and the reverse
 15 (client) direction is raw pointers.
 16
 17 File metadata is looked up before the FileWriter is returned, so that
 18 we know the file exists and can cache its length.
 19
 20 The WebKit/chromium interface here is modeled after that of the
 21 FileSystem.
 22
 23 * public/WebFileInfo.h:
 24 (WebKit::WebFileInfo::WebFileInfo):
 25 * src/AsyncFileSystemChromium.cpp:
 26 (WebCore::FileWriterHelperCallbacks::FileWriterHelperCallbacks):
 27 (WebCore::FileWriterHelperCallbacks::didSucceed):
 28 (WebCore::FileWriterHelperCallbacks::didReadMetadata):
 29 (WebCore::FileWriterHelperCallbacks::didReadDirectory):
 30 (WebCore::FileWriterHelperCallbacks::didOpenFileSystem):
 31 (WebCore::FileWriterHelperCallbacks::didCreateFileWriter):
 32 (WebCore::FileWriterHelperCallbacks::didFail):
 33 (WebCore::AsyncFileSystemChromium::createWriter):
 34 * src/AsyncFileSystemChromium.h:
 35 * src/AsyncFileWriterChromium.cpp:
 36 (WebCore::AsyncFileWriterChromium::setWebFileWriter):
 37 (WebCore::AsyncFileWriterChromium::write):
 38 (WebCore::AsyncFileWriterChromium::didFail):
 39 * src/AsyncFileWriterChromium.h:
 40 * src/WebFileSystemCallbacksImpl.h:
 41
1422010-09-17 Darin Adler <darin@apple.com>
243
344 Reviewed by Sam Weinig.
67769

WebKit/chromium/public/WebFileInfo.h

@@struct WebFileInfo {
3838 // The value 0.0 means that the time is not set.
3939 double modificationTime;
4040
41  WebFileInfo() : modificationTime(0.0) { }
 41 // The length of the file in bytes.
 42 // The value -1 means that the length is not set.
 43 long long length;
 44
 45 enum EntryType {
 46 TypeUnknown = 0,
 47 TypeFile,
 48 TypeDirectory
 49 };
 50
 51 EntryType type;
 52
 53 WebFileInfo() : modificationTime(0.0), length(-1), type(TypeUnknown) { }
4254};
4355
4456} // namespace WebKit
67769

WebKit/chromium/src/AsyncFileSystemChromium.cpp

3333#if ENABLE(FILE_SYSTEM)
3434
3535#include "AsyncFileSystemCallbacks.h"
36 #include "FileSystem.h"
 36#include "AsyncFileWriterChromium.h"
 37#include "WebFileInfo.h"
3738#include "WebFileSystem.h"
3839#include "WebFileSystemCallbacksImpl.h"
 40#include "WebFileWriter.h"
3941#include "WebKit.h"
4042#include "WebKitClient.h"
4143

@@void AsyncFileSystemChromium::readDirect
99101 m_webFileSystem->readDirectory(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
100102}
101103
 104class FileWriterHelperCallbacks : public WebKit::WebFileSystemCallbacks {
 105public:
 106 FileWriterHelperCallbacks(FileWriterClient* client, const String& path, WebKit::WebFileSystem* webFileSystem, PassOwnPtr<WebCore::AsyncFileSystemCallbacks> callbacks)
 107 : m_client(client)
 108 , m_path(path)
 109 , m_webFileSystem(webFileSystem)
 110 , m_callbacks(callbacks)
 111 {
 112 }
 113
 114 virtual void didSucceed()
 115 {
 116 ASSERT_NOT_REACHED();
 117 delete this;
 118 }
 119 virtual void didReadMetadata(const WebKit::WebFileInfo& info)
 120 {
 121 ASSERT(m_callbacks);
 122 if (info.type != WebKit::WebFileInfo::TypeFile || info.length < 0)
 123 m_callbacks->didFail(error);
 124 else {
 125 OwnPtr<AsyncFileWriterChromium> asyncFileWriterChromium = adoptPtr(new AsyncFileWriterChromium(m_client));
 126 OwnPtr<WebKit::WebFileWriter> webFileWriter = adoptPtr(m_webFileSystem->createFileWriter(m_path, asyncFileWriterChromium.get()));
 127 asyncFileWriterChromium->setWebFileWriter(webFileWriter.release());
 128 m_callbacks->didCreateFileWriter(asyncFileWriterChromium.release(), info.length);
 129 }
 130 delete this;
 131 }
 132
 133 virtual void didReadDirectory(const WebKit::WebVector<WebKit::WebFileSystemEntry>& entries, bool hasMore)
 134 {
 135 ASSERT_NOT_REACHED();
 136 delete this;
 137 }
 138 virtual void didOpenFileSystem(const WebKit::WebString& name, const WebKit::WebString& rootPath)
 139 {
 140 ASSERT_NOT_REACHED();
 141 delete this;
 142 }
 143
 144 virtual void didFail(WebKit::WebFileError error)
 145 {
 146 ASSERT(m_callbacks);
 147 m_callbacks->didFail(error);
 148 delete this;
 149 }
 150
 151private:
 152 FileWriterClient* m_client;
 153 String m_path;
 154 WebKit::WebFileSystem* m_webFileSystem;
 155 OwnPtr<WebCore::AsyncFileSystemCallbacks> m_callbacks;
 156};
 157
 158void AsyncFileSystemChromium::createWriter(FileWriterClient* client, const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
 159{
 160 m_webFileSystem->readMetadata(path, new FileWriterHelperCallbacks(client, path, m_webFileSystem, callbacks));
 161}
 162
102163} // namespace WebCore
103164
104165#endif
67769

WebKit/chromium/src/AsyncFileSystemChromium.h

@@public:
5858 virtual void fileExists(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>);
5959 virtual void directoryExists(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>);
6060 virtual void readDirectory(const String& path, PassOwnPtr<AsyncFileSystemCallbacks>);
 61 virtual void createWriter(FileWriterClient* client, const String& path, PassOwnPtr<AsyncFileSystemCallbacks>);
6162
6263private:
6364 WebKit::WebFileSystem* m_webFileSystem;
67769

WebKit/chromium/src/AsyncFileWriterChromium.cpp

3838#include "WebFileWriter.h"
3939#include "WebURL.h"
4040
41 using namespace WebCore;
42 
43 namespace WebKit {
 41namespace WebCore {
4442
4543AsyncFileWriterChromium::AsyncFileWriterChromium(FileWriterClient* client)
4644 : m_client(client)
4745{
4846}
4947
50 void AsyncFileWriterChromium::setWebFileWriter(WebFileWriter* writer)
 48AsyncFileWriterChromium::~AsyncFileWriterChromium()
 49{
 50}
 51
 52void AsyncFileWriterChromium::setWebFileWriter(PassOwnPtr<WebKit::WebFileWriter> writer)
5153{
52  ASSERT(!m_writer);
5354 m_writer = writer;
5455}
5556
5657void AsyncFileWriterChromium::write(long long position, Blob* data)
5758{
5859 ASSERT(m_writer);
59  m_writer->write(position, WebURL(data->url()));
 60 m_writer->write(position, WebKit::WebURL(data->url()));
6061}
6162
6263void AsyncFileWriterChromium::truncate(long long length)

@@void AsyncFileWriterChromium::didTruncat
8283 m_client->didTruncate(length);
8384}
8485
85 void AsyncFileWriterChromium::didFail(WebFileError error)
 86void AsyncFileWriterChromium::didFail(WebKit::WebFileError error)
8687{
8788 m_client->didFail(error);
8889}
67769

WebKit/chromium/src/AsyncFileWriterChromium.h

3636#include "AsyncFileWriter.h"
3737#include "WebFileError.h"
3838#include "WebFileWriterClient.h"
 39#include <WTF/PassOwnPtr.h>
3940
40 namespace WebCore {
41 class Blob;
42 class FileWriterClient;
 41namespace WebKit {
 42class WebFileWriter;
4343}
4444
45 namespace WebKit {
 45namespace WebCore {
4646
47 class WebFileWriter;
 47class Blob;
 48class FileWriterClient;
4849
49 class AsyncFileWriterChromium : public WebCore::AsyncFileWriter, public WebFileWriterClient {
 50class AsyncFileWriterChromium : public AsyncFileWriter, public WebKit::WebFileWriterClient {
5051public:
51  AsyncFileWriterChromium(WebCore::FileWriterClient* client);
52 
53  void setWebFileWriter(WebFileWriter* writer);
 52 AsyncFileWriterChromium(FileWriterClient* client);
 53 ~AsyncFileWriterChromium();
 54
 55 void setWebFileWriter(PassOwnPtr<WebKit::WebFileWriter> writer);
5456
5557 // FileWriter
56  virtual void write(long long position, WebCore::Blob* data);
 58 virtual void write(long long position, Blob* data);
5759 virtual void truncate(long long length);
5860 virtual void abort();
5961
6062 // WebFileWriterClient
6163 virtual void didWrite(long long bytes, bool complete);
6264 virtual void didTruncate(long long length);
63  virtual void didFail(WebFileError);
 65 virtual void didFail(WebKit::WebFileError);
6466
6567private:
66  OwnPtr<WebFileWriter> m_writer;
67  WebCore::FileWriterClient* m_client;
 68 OwnPtr<WebKit::WebFileWriter> m_writer;
 69 FileWriterClient* m_client;
6870};
6971
7072} // namespace
67769