Remove passing WebString across threads

Create bridge functions that converts arguments into Blink objects
(such as WebFileSystemEntry and WebFileInfo) after crossing threads
and then call WebFileSystemCallbacks methods.

BUG=393900

Review URL: https://codereview.chromium.org/391083002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@283627 0039d316-1c4b-4281-b951-d872f2087c98
parent 7b3d54da
...@@ -123,9 +123,62 @@ enum CallbacksUnregisterMode { ...@@ -123,9 +123,62 @@ enum CallbacksUnregisterMode {
DO_NOT_UNREGISTER_CALLBACKS, 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);
}
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|. // Run WebFileSystemCallbacks's |method| with |params|.
template <typename Method, typename Params> void RunCallbacks(
void RunCallbacks(int callbacks_id, Method method, const Params& params, int callbacks_id,
const base::Callback<void(WebFileSystemCallbacks*)>& callback,
CallbacksUnregisterMode callbacks_unregister_mode) { CallbacksUnregisterMode callbacks_unregister_mode) {
WebFileSystemImpl* filesystem = WebFileSystemImpl* filesystem =
WebFileSystemImpl::ThreadSpecificInstance(NULL); WebFileSystemImpl::ThreadSpecificInstance(NULL);
...@@ -134,7 +187,7 @@ void RunCallbacks(int callbacks_id, Method method, const Params& params, ...@@ -134,7 +187,7 @@ void RunCallbacks(int callbacks_id, Method method, const Params& params,
WebFileSystemCallbacks callbacks = filesystem->GetCallbacks(callbacks_id); WebFileSystemCallbacks callbacks = filesystem->GetCallbacks(callbacks_id);
if (callbacks_unregister_mode == UNREGISTER_CALLBACKS) if (callbacks_unregister_mode == UNREGISTER_CALLBACKS)
filesystem->UnregisterCallbacks(callbacks_id); filesystem->UnregisterCallbacks(callbacks_id);
DispatchToMethod(&callbacks, method, params); callback.Run(&callbacks);
} }
void DispatchResultsClosure(int thread_id, int callbacks_id, void DispatchResultsClosure(int thread_id, int callbacks_id,
...@@ -157,16 +210,15 @@ void DispatchResultsClosure(int thread_id, int callbacks_id, ...@@ -157,16 +210,15 @@ void DispatchResultsClosure(int thread_id, int callbacks_id,
results_closure.Run(); results_closure.Run();
} }
template <typename Method, typename Params>
void CallbackFileSystemCallbacks( void CallbackFileSystemCallbacks(
int thread_id, int callbacks_id, int thread_id, int callbacks_id,
WaitableCallbackResults* waitable_results, WaitableCallbackResults* waitable_results,
Method method, const Params& params, const base::Callback<void(WebFileSystemCallbacks*)>& callback,
CallbacksUnregisterMode callbacks_unregister_mode) { CallbacksUnregisterMode callbacksunregister_mode) {
DispatchResultsClosure( DispatchResultsClosure(
thread_id, callbacks_id, waitable_results, thread_id, callbacks_id, waitable_results,
base::Bind(&RunCallbacks<Method, Params>, callbacks_id, method, params, base::Bind(&RunCallbacks, callbacks_id, callback,
callbacks_unregister_mode)); callbacksunregister_mode));
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
...@@ -180,8 +232,7 @@ void OpenFileSystemCallbackAdapter( ...@@ -180,8 +232,7 @@ void OpenFileSystemCallbackAdapter(
const std::string& name, const GURL& root) { const std::string& name, const GURL& root) {
CallbackFileSystemCallbacks( CallbackFileSystemCallbacks(
thread_id, callbacks_id, waitable_results, thread_id, callbacks_id, waitable_results,
&WebFileSystemCallbacks::didOpenFileSystem, base::Bind(&DidOpenFileSystem, base::UTF8ToUTF16(name), root),
MakeTuple(base::UTF8ToUTF16(name), root),
UNREGISTER_CALLBACKS); UNREGISTER_CALLBACKS);
} }
...@@ -194,9 +245,8 @@ void ResolveURLCallbackAdapter( ...@@ -194,9 +245,8 @@ void ResolveURLCallbackAdapter(
fileapi::VirtualPath::GetNormalizedFilePath(file_path)); fileapi::VirtualPath::GetNormalizedFilePath(file_path));
CallbackFileSystemCallbacks( CallbackFileSystemCallbacks(
thread_id, callbacks_id, waitable_results, thread_id, callbacks_id, waitable_results,
&WebFileSystemCallbacks::didResolveURL, base::Bind(&DidResolveURL, base::UTF8ToUTF16(info.name), info.root_url,
MakeTuple(base::UTF8ToUTF16(info.name), info.root_url, info.mount_type,
static_cast<blink::WebFileSystemType>(info.mount_type),
normalized_path.AsUTF16Unsafe(), is_directory), normalized_path.AsUTF16Unsafe(), is_directory),
UNREGISTER_CALLBACKS); UNREGISTER_CALLBACKS);
} }
...@@ -207,13 +257,12 @@ void StatusCallbackAdapter(int thread_id, int callbacks_id, ...@@ -207,13 +257,12 @@ void StatusCallbackAdapter(int thread_id, int callbacks_id,
if (error == base::File::FILE_OK) { if (error == base::File::FILE_OK) {
CallbackFileSystemCallbacks( CallbackFileSystemCallbacks(
thread_id, callbacks_id, waitable_results, thread_id, callbacks_id, waitable_results,
&WebFileSystemCallbacks::didSucceed, MakeTuple(), base::Bind(&DidSucceed),
UNREGISTER_CALLBACKS); UNREGISTER_CALLBACKS);
} else { } else {
CallbackFileSystemCallbacks( CallbackFileSystemCallbacks(
thread_id, callbacks_id, waitable_results, thread_id, callbacks_id, waitable_results,
&WebFileSystemCallbacks::didFail, base::Bind(&DidFail, error),
MakeTuple(fileapi::FileErrorToWebFileError(error)),
UNREGISTER_CALLBACKS); UNREGISTER_CALLBACKS);
} }
} }
...@@ -221,12 +270,9 @@ void StatusCallbackAdapter(int thread_id, int callbacks_id, ...@@ -221,12 +270,9 @@ void StatusCallbackAdapter(int thread_id, int callbacks_id,
void ReadMetadataCallbackAdapter(int thread_id, int callbacks_id, void ReadMetadataCallbackAdapter(int thread_id, int callbacks_id,
WaitableCallbackResults* waitable_results, WaitableCallbackResults* waitable_results,
const base::File::Info& file_info) { const base::File::Info& file_info) {
WebFileInfo web_file_info;
FileInfoToWebFileInfo(file_info, &web_file_info);
CallbackFileSystemCallbacks( CallbackFileSystemCallbacks(
thread_id, callbacks_id, waitable_results, thread_id, callbacks_id, waitable_results,
&WebFileSystemCallbacks::didReadMetadata, base::Bind(&DidReadMetadata, file_info),
MakeTuple(web_file_info),
UNREGISTER_CALLBACKS); UNREGISTER_CALLBACKS);
} }
...@@ -234,16 +280,9 @@ void ReadDirectoryCallbackAdapter( ...@@ -234,16 +280,9 @@ void ReadDirectoryCallbackAdapter(
int thread_id, int callbacks_id, WaitableCallbackResults* waitable_results, int thread_id, int callbacks_id, WaitableCallbackResults* waitable_results,
const std::vector<fileapi::DirectoryEntry>& entries, const std::vector<fileapi::DirectoryEntry>& entries,
bool has_more) { 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( CallbackFileSystemCallbacks(
thread_id, callbacks_id, waitable_results, thread_id, callbacks_id, waitable_results,
&WebFileSystemCallbacks::didReadDirectory, base::Bind(&DidReadDirectory, entries, has_more),
MakeTuple(file_system_entries, has_more),
has_more ? DO_NOT_UNREGISTER_CALLBACKS : UNREGISTER_CALLBACKS); has_more ? DO_NOT_UNREGISTER_CALLBACKS : UNREGISTER_CALLBACKS);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment