Index: content/child/fileapi/webfilesystem_impl.cc |
diff --git a/content/child/fileapi/webfilesystem_impl.cc b/content/child/fileapi/webfilesystem_impl.cc |
index 62e9f0eda62f8f94b220f912c0a08585cebf20a7..b85c00fda7714837a56d5c5c2f06d1cd83c9d06c 100644 |
--- a/content/child/fileapi/webfilesystem_impl.cc |
+++ b/content/child/fileapi/webfilesystem_impl.cc |
@@ -123,10 +123,65 @@ enum CallbacksUnregisterMode { |
DO_NOT_UNREGISTER_CALLBACKS, |
}; |
+// Bridging functions that convert the arguments into Blink objects |
+// (e.g. WebFileInfo, WebString, WebVector<WebFileSystemEntry>) |
+// and call WebFileSystemCallbacks's methods. |
+// These are called by RunCallbacks after crossing threads to ensure |
+// thread safety, because the Blink objects cannot be passed across |
+// threads by base::Bind(). |
+void DidSucceed(WebFileSystemCallbacks* callbacks) { |
+ callbacks->didSucceed(); |
+} |
+ |
+void DidReadMetadata(const base::File::Info& file_info, |
+ WebFileSystemCallbacks* callbacks) { |
+ WebFileInfo web_file_info; |
+ FileInfoToWebFileInfo(file_info, &web_file_info); |
+ callbacks->didReadMetadata(web_file_info); |
+} |
+ |
+void DidReadDirectory(const std::vector<fileapi::DirectoryEntry>& entries, |
+ bool has_more, WebFileSystemCallbacks* callbacks) { |
+ WebVector<WebFileSystemEntry> file_system_entries(entries.size()); |
+ for (size_t i = 0; i < entries.size(); ++i) { |
+ file_system_entries[i].name = |
+ base::FilePath(entries[i].name).AsUTF16Unsafe(); |
+ file_system_entries[i].isDirectory = entries[i].is_directory; |
+ } |
+ callbacks->didReadDirectory(file_system_entries, has_more); |
+} |
+ |
+void DidOpenFileSystem(const base::string16& name, const GURL& root, |
+ WebFileSystemCallbacks* callbacks) { |
+ callbacks->didOpenFileSystem( |
+ name, |
+ root); |
tzik
2014/07/16 04:22:51
can these arguments be packed to l156?
hiroshige
2014/07/16 04:31:49
Done.
|
+} |
+ |
+void DidResolveURL( |
+ const base::string16& name, |
+ const GURL& root_url, |
+ fileapi::FileSystemType mount_type, |
+ const base::string16& file_path, |
+ bool is_directory, |
+ WebFileSystemCallbacks* callbacks) { |
+ callbacks->didResolveURL( |
+ name, |
+ root_url, |
+ static_cast<blink::WebFileSystemType>(mount_type), |
+ file_path, |
+ is_directory); |
+} |
+ |
+void DidFail(base::File::Error error, WebFileSystemCallbacks* callbacks) { |
+ callbacks->didFail(fileapi::FileErrorToWebFileError(error)); |
+} |
+ |
// Run WebFileSystemCallbacks's |method| with |params|. |
-template <typename Method, typename Params> |
-void RunCallbacks(int callbacks_id, Method method, const Params& params, |
- CallbacksUnregisterMode callbacks_unregister_mode) { |
+void RunCallbacks( |
+ int callbacks_id, |
+ const base::Callback<void(WebFileSystemCallbacks*)>& callback, |
+ CallbacksUnregisterMode callbacks_unregister_mode) { |
WebFileSystemImpl* filesystem = |
WebFileSystemImpl::ThreadSpecificInstance(NULL); |
if (!filesystem) |
@@ -134,7 +189,7 @@ void RunCallbacks(int callbacks_id, Method method, const Params& params, |
WebFileSystemCallbacks callbacks = filesystem->GetCallbacks(callbacks_id); |
if (callbacks_unregister_mode == UNREGISTER_CALLBACKS) |
filesystem->UnregisterCallbacks(callbacks_id); |
- DispatchToMethod(&callbacks, method, params); |
+ callback.Run(&callbacks); |
} |
void DispatchResultsClosure(int thread_id, int callbacks_id, |
@@ -157,18 +212,18 @@ void DispatchResultsClosure(int thread_id, int callbacks_id, |
results_closure.Run(); |
} |
-template <typename Method, typename Params> |
void CallbackFileSystemCallbacks( |
int thread_id, int callbacks_id, |
WaitableCallbackResults* waitable_results, |
- Method method, const Params& params, |
- CallbacksUnregisterMode callbacks_unregister_mode) { |
+ const base::Callback<void(WebFileSystemCallbacks*)>& callback, |
+ CallbacksUnregisterMode callbacksunregister_mode) { |
DispatchResultsClosure( |
thread_id, callbacks_id, waitable_results, |
- base::Bind(&RunCallbacks<Method, Params>, callbacks_id, method, params, |
- callbacks_unregister_mode)); |
+ base::Bind(&RunCallbacks, callbacks_id, callback, |
+ callbacksunregister_mode)); |
} |
+ |
//----------------------------------------------------------------------------- |
// Callback adapters. Callbacks must be called on the original calling thread, |
// so these callback adapters relay back the results to the calling thread |
@@ -180,8 +235,7 @@ void OpenFileSystemCallbackAdapter( |
const std::string& name, const GURL& root) { |
CallbackFileSystemCallbacks( |
thread_id, callbacks_id, waitable_results, |
- &WebFileSystemCallbacks::didOpenFileSystem, |
- MakeTuple(base::UTF8ToUTF16(name), root), |
+ base::Bind(&DidOpenFileSystem, base::UTF8ToUTF16(name), root), |
UNREGISTER_CALLBACKS); |
} |
@@ -194,10 +248,9 @@ void ResolveURLCallbackAdapter( |
fileapi::VirtualPath::GetNormalizedFilePath(file_path)); |
CallbackFileSystemCallbacks( |
thread_id, callbacks_id, waitable_results, |
- &WebFileSystemCallbacks::didResolveURL, |
- MakeTuple(base::UTF8ToUTF16(info.name), info.root_url, |
- static_cast<blink::WebFileSystemType>(info.mount_type), |
- normalized_path.AsUTF16Unsafe(), is_directory), |
+ base::Bind(&DidResolveURL, base::UTF8ToUTF16(info.name), info.root_url, |
+ info.mount_type, |
+ normalized_path.AsUTF16Unsafe(), is_directory), |
UNREGISTER_CALLBACKS); |
} |
@@ -207,13 +260,12 @@ void StatusCallbackAdapter(int thread_id, int callbacks_id, |
if (error == base::File::FILE_OK) { |
CallbackFileSystemCallbacks( |
thread_id, callbacks_id, waitable_results, |
- &WebFileSystemCallbacks::didSucceed, MakeTuple(), |
+ base::Bind(&DidSucceed), |
UNREGISTER_CALLBACKS); |
} else { |
CallbackFileSystemCallbacks( |
thread_id, callbacks_id, waitable_results, |
- &WebFileSystemCallbacks::didFail, |
- MakeTuple(fileapi::FileErrorToWebFileError(error)), |
+ base::Bind(&DidFail, error), |
UNREGISTER_CALLBACKS); |
} |
} |
@@ -221,12 +273,9 @@ void StatusCallbackAdapter(int thread_id, int callbacks_id, |
void ReadMetadataCallbackAdapter(int thread_id, int callbacks_id, |
WaitableCallbackResults* waitable_results, |
const base::File::Info& file_info) { |
- WebFileInfo web_file_info; |
- FileInfoToWebFileInfo(file_info, &web_file_info); |
CallbackFileSystemCallbacks( |
thread_id, callbacks_id, waitable_results, |
- &WebFileSystemCallbacks::didReadMetadata, |
- MakeTuple(web_file_info), |
+ base::Bind(&DidReadMetadata, file_info), |
UNREGISTER_CALLBACKS); |
} |
@@ -234,16 +283,9 @@ void ReadDirectoryCallbackAdapter( |
int thread_id, int callbacks_id, WaitableCallbackResults* waitable_results, |
const std::vector<fileapi::DirectoryEntry>& entries, |
bool has_more) { |
- WebVector<WebFileSystemEntry> file_system_entries(entries.size()); |
- for (size_t i = 0; i < entries.size(); i++) { |
- file_system_entries[i].name = |
- base::FilePath(entries[i].name).AsUTF16Unsafe(); |
- file_system_entries[i].isDirectory = entries[i].is_directory; |
- } |
CallbackFileSystemCallbacks( |
thread_id, callbacks_id, waitable_results, |
- &WebFileSystemCallbacks::didReadDirectory, |
- MakeTuple(file_system_entries, has_more), |
+ base::Bind(&DidReadDirectory, entries, has_more), |
has_more ? DO_NOT_UNREGISTER_CALLBACKS : UNREGISTER_CALLBACKS); |
} |