| Index: content/child/fileapi/webfilesystem_impl.cc
|
| diff --git a/content/child/fileapi/webfilesystem_impl.cc b/content/child/fileapi/webfilesystem_impl.cc
|
| index b811c27b22e3596fe52d117ba5b2d0c8bc05a321..2c3de4dc0b279dce31b505a4992f80d5787671cc 100644
|
| --- a/content/child/fileapi/webfilesystem_impl.cc
|
| +++ b/content/child/fileapi/webfilesystem_impl.cc
|
| @@ -16,9 +16,9 @@
|
| #include "content/child/fileapi/webfilewriter_impl.h"
|
| #include "content/common/fileapi/file_system_messages.h"
|
| #include "third_party/WebKit/public/platform/WebFileInfo.h"
|
| +#include "third_party/WebKit/public/platform/WebFileSystemCallbacks.h"
|
| #include "third_party/WebKit/public/platform/WebString.h"
|
| #include "third_party/WebKit/public/platform/WebURL.h"
|
| -#include "third_party/WebKit/public/web/WebFileSystemCallbacks.h"
|
| #include "url/gurl.h"
|
| #include "webkit/child/worker_task_runner.h"
|
| #include "webkit/common/fileapi/directory_entry.h"
|
| @@ -37,14 +37,23 @@ namespace content {
|
|
|
| namespace {
|
|
|
| +// TODO(kinuko): Remove this hack after the two-sided patch lands.
|
| +WebFileSystemCallbacks* Wrapper(WebFileSystemCallbacksType& cb) {
|
| +#ifdef NON_SELFDESTRUCT_WEBFILESYSTEMCALLBACKS
|
| + return &cb;
|
| +#else
|
| + return cb;
|
| +#endif
|
| +}
|
| +
|
| base::LazyInstance<base::ThreadLocalPointer<WebFileSystemImpl> >::Leaky
|
| g_webfilesystem_tls = LAZY_INSTANCE_INITIALIZER;
|
|
|
| class WaitableCallbackResults {
|
| public:
|
| static WaitableCallbackResults* MaybeCreate(
|
| - WebKit::WebFileSystemCallbacks* callbacks) {
|
| - if (callbacks->shouldBlockUntilCompletion())
|
| + WebFileSystemCallbacksType callbacks) {
|
| + if (Wrapper(callbacks)->shouldBlockUntilCompletion())
|
| return new WaitableCallbackResults;
|
| return NULL;
|
| }
|
| @@ -110,10 +119,9 @@ void RunCallbacks(int callbacks_id, Method method, const Params& params) {
|
| WebFileSystemImpl::ThreadSpecificInstance(NULL);
|
| if (!filesystem)
|
| return;
|
| - WebFileSystemCallbacks* callbacks =
|
| + WebFileSystemCallbacksType callbacks =
|
| filesystem->GetAndUnregisterCallbacks(callbacks_id);
|
| - DCHECK(callbacks);
|
| - DispatchToMethod(callbacks, method, params);
|
| + DispatchToMethod(Wrapper(callbacks), method, params);
|
| }
|
|
|
| void DispatchResultsClosure(int thread_id, int callbacks_id,
|
| @@ -208,17 +216,17 @@ void DidCreateFileWriter(
|
| if (!filesystem)
|
| return;
|
|
|
| - WebFileSystemCallbacks* callbacks =
|
| + WebFileSystemCallbacksType callbacks =
|
| filesystem->GetAndUnregisterCallbacks(callbacks_id);
|
| - DCHECK(callbacks);
|
|
|
| if (file_info.is_directory || file_info.size < 0) {
|
| - callbacks->didFail(WebKit::WebFileErrorInvalidState);
|
| + Wrapper(callbacks)->didFail(WebKit::WebFileErrorInvalidState);
|
| return;
|
| }
|
| - WebFileWriterImpl::Type type = callbacks->shouldBlockUntilCompletion() ?
|
| - WebFileWriterImpl::TYPE_SYNC : WebFileWriterImpl::TYPE_ASYNC;
|
| - callbacks->didCreateFileWriter(
|
| + WebFileWriterImpl::Type type =
|
| + Wrapper(callbacks)->shouldBlockUntilCompletion() ?
|
| + WebFileWriterImpl::TYPE_SYNC : WebFileWriterImpl::TYPE_ASYNC;
|
| + Wrapper(callbacks)->didCreateFileWriter(
|
| new WebFileWriterImpl(path, client, type, main_thread_loop),
|
| file_info.size);
|
| }
|
| @@ -247,14 +255,13 @@ void DidCreateSnapshotFile(
|
| if (!filesystem)
|
| return;
|
|
|
| - WebFileSystemCallbacks* callbacks =
|
| + WebFileSystemCallbacksType callbacks =
|
| filesystem->GetAndUnregisterCallbacks(callbacks_id);
|
| - DCHECK(callbacks);
|
|
|
| WebFileInfo web_file_info;
|
| webkit_glue::PlatformFileInfoToWebFileInfo(file_info, &web_file_info);
|
| web_file_info.platformPath = platform_path.AsUTF16Unsafe();
|
| - callbacks->didCreateSnapshotFile(web_file_info);
|
| + Wrapper(callbacks)->didCreateSnapshotFile(web_file_info);
|
|
|
| // TODO(michaeln,kinuko): Use ThreadSafeSender when Blob becomes
|
| // non-bridge model.
|
| @@ -298,16 +305,18 @@ void WebFileSystemImpl::DeleteThreadSpecificInstance() {
|
| }
|
|
|
| WebFileSystemImpl::WebFileSystemImpl(base::MessageLoopProxy* main_thread_loop)
|
| - : main_thread_loop_(main_thread_loop) {
|
| + : main_thread_loop_(main_thread_loop),
|
| + next_callbacks_id_(0) {
|
| g_webfilesystem_tls.Pointer()->Set(this);
|
| }
|
|
|
| WebFileSystemImpl::~WebFileSystemImpl() {
|
| - IDMap<WebFileSystemCallbacks>::iterator iter(&callbacks_);
|
| - while (!iter.IsAtEnd()) {
|
| - iter.GetCurrentValue()->didFail(WebKit::WebFileErrorAbort);
|
| - iter.Advance();
|
| +#if !defined(NON_SELFDESTRUCT_WEBFILESYSTEMCALLBACKS)
|
| + for (CallbacksMap::iterator iter = callbacks_.begin();
|
| + iter != callbacks_.end(); ++iter) {
|
| + iter->second->didFail(WebKit::WebFileErrorAbort);
|
| }
|
| +#endif
|
| g_webfilesystem_tls.Pointer()->Set(NULL);
|
| }
|
|
|
| @@ -319,7 +328,7 @@ void WebFileSystemImpl::openFileSystem(
|
| const WebKit::WebURL& storage_partition,
|
| WebKit::WebFileSystemType type,
|
| bool create,
|
| - WebKit::WebFileSystemCallbacks* callbacks) {
|
| + WebFileSystemCallbacksType callbacks) {
|
| int callbacks_id = RegisterCallbacks(callbacks);
|
| WaitableCallbackResults* waitable_results =
|
| WaitableCallbackResults::MaybeCreate(callbacks);
|
| @@ -341,7 +350,7 @@ void WebFileSystemImpl::openFileSystem(
|
| void WebFileSystemImpl::deleteFileSystem(
|
| const WebKit::WebURL& storage_partition,
|
| WebKit::WebFileSystemType type,
|
| - WebKit::WebFileSystemCallbacks* callbacks) {
|
| + WebFileSystemCallbacksType callbacks) {
|
| int callbacks_id = RegisterCallbacks(callbacks);
|
| WaitableCallbackResults* waitable_results =
|
| WaitableCallbackResults::MaybeCreate(callbacks);
|
| @@ -359,7 +368,7 @@ void WebFileSystemImpl::deleteFileSystem(
|
| void WebFileSystemImpl::move(
|
| const WebKit::WebURL& src_path,
|
| const WebKit::WebURL& dest_path,
|
| - WebKit::WebFileSystemCallbacks* callbacks) {
|
| + WebFileSystemCallbacksType callbacks) {
|
| int callbacks_id = RegisterCallbacks(callbacks);
|
| WaitableCallbackResults* waitable_results =
|
| WaitableCallbackResults::MaybeCreate(callbacks);
|
| @@ -376,7 +385,7 @@ void WebFileSystemImpl::move(
|
| void WebFileSystemImpl::copy(
|
| const WebKit::WebURL& src_path,
|
| const WebKit::WebURL& dest_path,
|
| - WebKit::WebFileSystemCallbacks* callbacks) {
|
| + WebFileSystemCallbacksType callbacks) {
|
| int callbacks_id = RegisterCallbacks(callbacks);
|
| WaitableCallbackResults* waitable_results =
|
| WaitableCallbackResults::MaybeCreate(callbacks);
|
| @@ -392,7 +401,7 @@ void WebFileSystemImpl::copy(
|
|
|
| void WebFileSystemImpl::remove(
|
| const WebKit::WebURL& path,
|
| - WebKit::WebFileSystemCallbacks* callbacks) {
|
| + WebFileSystemCallbacksType callbacks) {
|
| int callbacks_id = RegisterCallbacks(callbacks);
|
| WaitableCallbackResults* waitable_results =
|
| WaitableCallbackResults::MaybeCreate(callbacks);
|
| @@ -408,7 +417,7 @@ void WebFileSystemImpl::remove(
|
|
|
| void WebFileSystemImpl::removeRecursively(
|
| const WebKit::WebURL& path,
|
| - WebKit::WebFileSystemCallbacks* callbacks) {
|
| + WebFileSystemCallbacksType callbacks) {
|
| int callbacks_id = RegisterCallbacks(callbacks);
|
| WaitableCallbackResults* waitable_results =
|
| WaitableCallbackResults::MaybeCreate(callbacks);
|
| @@ -424,7 +433,7 @@ void WebFileSystemImpl::removeRecursively(
|
|
|
| void WebFileSystemImpl::readMetadata(
|
| const WebKit::WebURL& path,
|
| - WebKit::WebFileSystemCallbacks* callbacks) {
|
| + WebFileSystemCallbacksType callbacks) {
|
| int callbacks_id = RegisterCallbacks(callbacks);
|
| WaitableCallbackResults* waitable_results =
|
| WaitableCallbackResults::MaybeCreate(callbacks);
|
| @@ -444,7 +453,7 @@ void WebFileSystemImpl::readMetadata(
|
| void WebFileSystemImpl::createFile(
|
| const WebKit::WebURL& path,
|
| bool exclusive,
|
| - WebKit::WebFileSystemCallbacks* callbacks) {
|
| + WebFileSystemCallbacksType callbacks) {
|
| int callbacks_id = RegisterCallbacks(callbacks);
|
| WaitableCallbackResults* waitable_results =
|
| WaitableCallbackResults::MaybeCreate(callbacks);
|
| @@ -461,7 +470,7 @@ void WebFileSystemImpl::createFile(
|
| void WebFileSystemImpl::createDirectory(
|
| const WebKit::WebURL& path,
|
| bool exclusive,
|
| - WebKit::WebFileSystemCallbacks* callbacks) {
|
| + WebFileSystemCallbacksType callbacks) {
|
| int callbacks_id = RegisterCallbacks(callbacks);
|
| WaitableCallbackResults* waitable_results =
|
| WaitableCallbackResults::MaybeCreate(callbacks);
|
| @@ -477,7 +486,7 @@ void WebFileSystemImpl::createDirectory(
|
|
|
| void WebFileSystemImpl::fileExists(
|
| const WebKit::WebURL& path,
|
| - WebKit::WebFileSystemCallbacks* callbacks) {
|
| + WebFileSystemCallbacksType callbacks) {
|
| int callbacks_id = RegisterCallbacks(callbacks);
|
| WaitableCallbackResults* waitable_results =
|
| WaitableCallbackResults::MaybeCreate(callbacks);
|
| @@ -493,7 +502,7 @@ base::Unretained(waitable_results))),
|
|
|
| void WebFileSystemImpl::directoryExists(
|
| const WebKit::WebURL& path,
|
| - WebKit::WebFileSystemCallbacks* callbacks) {
|
| + WebFileSystemCallbacksType callbacks) {
|
| int callbacks_id = RegisterCallbacks(callbacks);
|
| WaitableCallbackResults* waitable_results =
|
| WaitableCallbackResults::MaybeCreate(callbacks);
|
| @@ -509,7 +518,7 @@ void WebFileSystemImpl::directoryExists(
|
|
|
| void WebFileSystemImpl::readDirectory(
|
| const WebKit::WebURL& path,
|
| - WebKit::WebFileSystemCallbacks* callbacks) {
|
| + WebFileSystemCallbacksType callbacks) {
|
| int callbacks_id = RegisterCallbacks(callbacks);
|
| WaitableCallbackResults* waitable_results =
|
| WaitableCallbackResults::MaybeCreate(callbacks);
|
| @@ -536,7 +545,7 @@ WebKit::WebFileWriter* WebFileSystemImpl::createFileWriter(
|
| void WebFileSystemImpl::createFileWriter(
|
| const WebURL& path,
|
| WebKit::WebFileWriterClient* client,
|
| - WebKit::WebFileSystemCallbacks* callbacks) {
|
| + WebFileSystemCallbacksType callbacks) {
|
| int callbacks_id = RegisterCallbacks(callbacks);
|
| WaitableCallbackResults* waitable_results =
|
| WaitableCallbackResults::MaybeCreate(callbacks);
|
| @@ -556,7 +565,7 @@ void WebFileSystemImpl::createFileWriter(
|
|
|
| void WebFileSystemImpl::createSnapshotFileAndReadMetadata(
|
| const WebKit::WebURL& path,
|
| - WebKit::WebFileSystemCallbacks* callbacks) {
|
| + WebFileSystemCallbacksType callbacks) {
|
| int callbacks_id = RegisterCallbacks(callbacks);
|
| WaitableCallbackResults* waitable_results =
|
| WaitableCallbackResults::MaybeCreate(callbacks);
|
| @@ -574,14 +583,20 @@ void WebFileSystemImpl::createSnapshotFileAndReadMetadata(
|
| make_scoped_ptr(waitable_results));
|
| }
|
|
|
| -int WebFileSystemImpl::RegisterCallbacks(WebFileSystemCallbacks* callbacks) {
|
| - return callbacks_.Add(callbacks);
|
| +int WebFileSystemImpl::RegisterCallbacks(WebFileSystemCallbacksType callbacks) {
|
| + DCHECK(CalledOnValidThread());
|
| + int id = next_callbacks_id_++;
|
| + callbacks_[id] = callbacks;
|
| + return id;
|
| }
|
|
|
| -WebFileSystemCallbacks* WebFileSystemImpl::GetAndUnregisterCallbacks(
|
| +WebFileSystemCallbacksType WebFileSystemImpl::GetAndUnregisterCallbacks(
|
| int callbacks_id) {
|
| - WebFileSystemCallbacks* callbacks = callbacks_.Lookup(callbacks_id);
|
| - callbacks_.Remove(callbacks_id);
|
| + DCHECK(CalledOnValidThread());
|
| + CallbacksMap::iterator found = callbacks_.find(callbacks_id);
|
| + DCHECK(found != callbacks_.end());
|
| + WebFileSystemCallbacksType callbacks = found->second;
|
| + callbacks_.erase(found);
|
| return callbacks;
|
| }
|
|
|
|
|