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; |
} |