Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1628)

Unified Diff: content/child/fileapi/webfilesystem_impl.cc

Issue 391083002: Remove passing WebString across threads (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698