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

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..0ecae8154e5a7e3381ba3df4f16d9012daa55b8d 100644
--- a/content/child/fileapi/webfilesystem_impl.cc
+++ b/content/child/fileapi/webfilesystem_impl.cc
@@ -123,7 +123,68 @@ enum CallbacksUnregisterMode {
DO_NOT_UNREGISTER_CALLBACKS,
};
-// Run WebFileSystemCallbacks's |method| with |params|.
+// 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().
+class WebFileSystemCallbacksBridge {
tzik 2014/07/15 10:41:26 I think it's not worth adding new class to combine
hiroshige 2014/07/15 12:30:31 Done.
+public:
+ WebFileSystemCallbacksBridge(WebFileSystemCallbacks *callbacks)
+ : callbacks_(callbacks) {}
+
+ void didSucceed() {
+ callbacks_->didSucceed();
+ }
+
+ void didReadMetadata(const base::File::Info& file_info) {
+ 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) {
+ 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) {
+ callbacks_->didOpenFileSystem(
+ static_cast<WebString>(name),
+ static_cast<WebURL>(root));
+ }
+
+ void didResolveURL(
+ const base::string16& name,
+ const GURL& root_url,
+ fileapi::FileSystemType mount_type,
+ const base::string16& file_path,
+ bool is_directory) {
+ callbacks_->didResolveURL(
+ static_cast<WebString>(name),
+ static_cast<WebURL>(root_url),
+ static_cast<blink::WebFileSystemType>(mount_type),
+ static_cast<WebString>(file_path),
+ is_directory);
+ }
+
+ void didFail(base::File::Error error) {
+ callbacks_->didFail(fileapi::FileErrorToWebFileError(error));
+ }
+
+private:
+ WebFileSystemCallbacks* callbacks_;
+};
+
+// Run WebFileSystemCallbacks's |method| with |params| via
template <typename Method, typename Params>
void RunCallbacks(int callbacks_id, Method method, const Params& params,
tzik 2014/07/15 10:41:26 (continued from above) And replace Method and Para
hiroshige 2014/07/15 12:30:31 Done.
CallbacksUnregisterMode callbacks_unregister_mode) {
@@ -134,7 +195,8 @@ 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);
+ WebFileSystemCallbacksBridge bridge(&callbacks);
+ DispatchToMethod(&bridge, method, params);
}
void DispatchResultsClosure(int thread_id, int callbacks_id,
@@ -180,7 +242,7 @@ void OpenFileSystemCallbackAdapter(
const std::string& name, const GURL& root) {
CallbackFileSystemCallbacks(
tzik 2014/07/15 10:41:26 (continued from above) And then, could you replace
hiroshige 2014/07/15 12:30:31 I retained CallbackFilesystemCallbacks to make the
thread_id, callbacks_id, waitable_results,
- &WebFileSystemCallbacks::didOpenFileSystem,
+ &WebFileSystemCallbacksBridge::didOpenFileSystem,
MakeTuple(base::UTF8ToUTF16(name), root),
UNREGISTER_CALLBACKS);
}
@@ -194,9 +256,9 @@ void ResolveURLCallbackAdapter(
fileapi::VirtualPath::GetNormalizedFilePath(file_path));
CallbackFileSystemCallbacks(
thread_id, callbacks_id, waitable_results,
- &WebFileSystemCallbacks::didResolveURL,
+ &WebFileSystemCallbacksBridge::didResolveURL,
MakeTuple(base::UTF8ToUTF16(info.name), info.root_url,
- static_cast<blink::WebFileSystemType>(info.mount_type),
+ info.mount_type,
normalized_path.AsUTF16Unsafe(), is_directory),
UNREGISTER_CALLBACKS);
}
@@ -207,13 +269,13 @@ void StatusCallbackAdapter(int thread_id, int callbacks_id,
if (error == base::File::FILE_OK) {
CallbackFileSystemCallbacks(
thread_id, callbacks_id, waitable_results,
- &WebFileSystemCallbacks::didSucceed, MakeTuple(),
+ &WebFileSystemCallbacksBridge::didSucceed, MakeTuple(),
UNREGISTER_CALLBACKS);
} else {
CallbackFileSystemCallbacks(
thread_id, callbacks_id, waitable_results,
- &WebFileSystemCallbacks::didFail,
- MakeTuple(fileapi::FileErrorToWebFileError(error)),
+ &WebFileSystemCallbacksBridge::didFail,
+ MakeTuple(error),
UNREGISTER_CALLBACKS);
}
}
@@ -221,12 +283,10 @@ 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),
+ &WebFileSystemCallbacksBridge::didReadMetadata,
+ MakeTuple(file_info),
UNREGISTER_CALLBACKS);
}
@@ -234,16 +294,10 @@ 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),
+ &WebFileSystemCallbacksBridge::didReadDirectory,
+ MakeTuple(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