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

Side by Side 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 unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/child/fileapi/webfilesystem_impl.h" 5 #include "content/child/fileapi/webfilesystem_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/lazy_instance.h" 8 #include "base/lazy_instance.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/message_loop/message_loop_proxy.h" 10 #include "base/message_loop/message_loop_proxy.h"
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 DCHECK(!waitable_results); 116 DCHECK(!waitable_results);
117 DispatchToMethod(ChildThread::current()->file_system_dispatcher(), 117 DispatchToMethod(ChildThread::current()->file_system_dispatcher(),
118 method, params); 118 method, params);
119 } 119 }
120 120
121 enum CallbacksUnregisterMode { 121 enum CallbacksUnregisterMode {
122 UNREGISTER_CALLBACKS, 122 UNREGISTER_CALLBACKS,
123 DO_NOT_UNREGISTER_CALLBACKS, 123 DO_NOT_UNREGISTER_CALLBACKS,
124 }; 124 };
125 125
126 // Bridging functions that convert the arguments into Blink objects
127 // (e.g. WebFileInfo, WebString, WebVector<WebFileSystemEntry>)
128 // and call WebFileSystemCallbacks's methods.
129 // These are called by RunCallbacks after crossing threads to ensure
130 // thread safety, because the Blink objects cannot be passed across
131 // threads by base::Bind().
132 void DidSucceed(WebFileSystemCallbacks* callbacks) {
133 callbacks->didSucceed();
134 }
135
136 void DidReadMetadata(const base::File::Info& file_info,
137 WebFileSystemCallbacks* callbacks) {
138 WebFileInfo web_file_info;
139 FileInfoToWebFileInfo(file_info, &web_file_info);
140 callbacks->didReadMetadata(web_file_info);
141 }
142
143 void DidReadDirectory(const std::vector<fileapi::DirectoryEntry>& entries,
144 bool has_more, WebFileSystemCallbacks* callbacks) {
145 WebVector<WebFileSystemEntry> file_system_entries(entries.size());
146 for (size_t i = 0; i < entries.size(); ++i) {
147 file_system_entries[i].name =
148 base::FilePath(entries[i].name).AsUTF16Unsafe();
149 file_system_entries[i].isDirectory = entries[i].is_directory;
150 }
151 callbacks->didReadDirectory(file_system_entries, has_more);
152 }
153
154 void DidOpenFileSystem(const base::string16& name, const GURL& root,
155 WebFileSystemCallbacks* callbacks) {
156 callbacks->didOpenFileSystem(
157 name,
158 root);
tzik 2014/07/16 04:22:51 can these arguments be packed to l156?
hiroshige 2014/07/16 04:31:49 Done.
159 }
160
161 void DidResolveURL(
162 const base::string16& name,
163 const GURL& root_url,
164 fileapi::FileSystemType mount_type,
165 const base::string16& file_path,
166 bool is_directory,
167 WebFileSystemCallbacks* callbacks) {
168 callbacks->didResolveURL(
169 name,
170 root_url,
171 static_cast<blink::WebFileSystemType>(mount_type),
172 file_path,
173 is_directory);
174 }
175
176 void DidFail(base::File::Error error, WebFileSystemCallbacks* callbacks) {
177 callbacks->didFail(fileapi::FileErrorToWebFileError(error));
178 }
179
126 // Run WebFileSystemCallbacks's |method| with |params|. 180 // Run WebFileSystemCallbacks's |method| with |params|.
127 template <typename Method, typename Params> 181 void RunCallbacks(
128 void RunCallbacks(int callbacks_id, Method method, const Params& params, 182 int callbacks_id,
129 CallbacksUnregisterMode callbacks_unregister_mode) { 183 const base::Callback<void(WebFileSystemCallbacks*)>& callback,
184 CallbacksUnregisterMode callbacks_unregister_mode) {
130 WebFileSystemImpl* filesystem = 185 WebFileSystemImpl* filesystem =
131 WebFileSystemImpl::ThreadSpecificInstance(NULL); 186 WebFileSystemImpl::ThreadSpecificInstance(NULL);
132 if (!filesystem) 187 if (!filesystem)
133 return; 188 return;
134 WebFileSystemCallbacks callbacks = filesystem->GetCallbacks(callbacks_id); 189 WebFileSystemCallbacks callbacks = filesystem->GetCallbacks(callbacks_id);
135 if (callbacks_unregister_mode == UNREGISTER_CALLBACKS) 190 if (callbacks_unregister_mode == UNREGISTER_CALLBACKS)
136 filesystem->UnregisterCallbacks(callbacks_id); 191 filesystem->UnregisterCallbacks(callbacks_id);
137 DispatchToMethod(&callbacks, method, params); 192 callback.Run(&callbacks);
138 } 193 }
139 194
140 void DispatchResultsClosure(int thread_id, int callbacks_id, 195 void DispatchResultsClosure(int thread_id, int callbacks_id,
141 WaitableCallbackResults* waitable_results, 196 WaitableCallbackResults* waitable_results,
142 const base::Closure& results_closure) { 197 const base::Closure& results_closure) {
143 if (thread_id != CurrentWorkerId()) { 198 if (thread_id != CurrentWorkerId()) {
144 if (waitable_results) { 199 if (waitable_results) {
145 // If someone is waiting, this should result in running the closure. 200 // If someone is waiting, this should result in running the closure.
146 waitable_results->AddResultsAndSignal(results_closure); 201 waitable_results->AddResultsAndSignal(results_closure);
147 // In case no one is waiting, post a task to run the closure. 202 // In case no one is waiting, post a task to run the closure.
148 WorkerTaskRunner::Instance()->PostTask( 203 WorkerTaskRunner::Instance()->PostTask(
149 thread_id, 204 thread_id,
150 base::Bind(&WaitableCallbackResults::Run, 205 base::Bind(&WaitableCallbackResults::Run,
151 make_scoped_refptr(waitable_results))); 206 make_scoped_refptr(waitable_results)));
152 return; 207 return;
153 } 208 }
154 WorkerTaskRunner::Instance()->PostTask(thread_id, results_closure); 209 WorkerTaskRunner::Instance()->PostTask(thread_id, results_closure);
155 return; 210 return;
156 } 211 }
157 results_closure.Run(); 212 results_closure.Run();
158 } 213 }
159 214
160 template <typename Method, typename Params>
161 void CallbackFileSystemCallbacks( 215 void CallbackFileSystemCallbacks(
162 int thread_id, int callbacks_id, 216 int thread_id, int callbacks_id,
163 WaitableCallbackResults* waitable_results, 217 WaitableCallbackResults* waitable_results,
164 Method method, const Params& params, 218 const base::Callback<void(WebFileSystemCallbacks*)>& callback,
165 CallbacksUnregisterMode callbacks_unregister_mode) { 219 CallbacksUnregisterMode callbacksunregister_mode) {
166 DispatchResultsClosure( 220 DispatchResultsClosure(
167 thread_id, callbacks_id, waitable_results, 221 thread_id, callbacks_id, waitable_results,
168 base::Bind(&RunCallbacks<Method, Params>, callbacks_id, method, params, 222 base::Bind(&RunCallbacks, callbacks_id, callback,
169 callbacks_unregister_mode)); 223 callbacksunregister_mode));
170 } 224 }
171 225
226
172 //----------------------------------------------------------------------------- 227 //-----------------------------------------------------------------------------
173 // Callback adapters. Callbacks must be called on the original calling thread, 228 // Callback adapters. Callbacks must be called on the original calling thread,
174 // so these callback adapters relay back the results to the calling thread 229 // so these callback adapters relay back the results to the calling thread
175 // if necessary. 230 // if necessary.
176 231
177 void OpenFileSystemCallbackAdapter( 232 void OpenFileSystemCallbackAdapter(
178 int thread_id, int callbacks_id, 233 int thread_id, int callbacks_id,
179 WaitableCallbackResults* waitable_results, 234 WaitableCallbackResults* waitable_results,
180 const std::string& name, const GURL& root) { 235 const std::string& name, const GURL& root) {
181 CallbackFileSystemCallbacks( 236 CallbackFileSystemCallbacks(
182 thread_id, callbacks_id, waitable_results, 237 thread_id, callbacks_id, waitable_results,
183 &WebFileSystemCallbacks::didOpenFileSystem, 238 base::Bind(&DidOpenFileSystem, base::UTF8ToUTF16(name), root),
184 MakeTuple(base::UTF8ToUTF16(name), root),
185 UNREGISTER_CALLBACKS); 239 UNREGISTER_CALLBACKS);
186 } 240 }
187 241
188 void ResolveURLCallbackAdapter( 242 void ResolveURLCallbackAdapter(
189 int thread_id, int callbacks_id, 243 int thread_id, int callbacks_id,
190 WaitableCallbackResults* waitable_results, 244 WaitableCallbackResults* waitable_results,
191 const fileapi::FileSystemInfo& info, 245 const fileapi::FileSystemInfo& info,
192 const base::FilePath& file_path, bool is_directory) { 246 const base::FilePath& file_path, bool is_directory) {
193 base::FilePath normalized_path( 247 base::FilePath normalized_path(
194 fileapi::VirtualPath::GetNormalizedFilePath(file_path)); 248 fileapi::VirtualPath::GetNormalizedFilePath(file_path));
195 CallbackFileSystemCallbacks( 249 CallbackFileSystemCallbacks(
196 thread_id, callbacks_id, waitable_results, 250 thread_id, callbacks_id, waitable_results,
197 &WebFileSystemCallbacks::didResolveURL, 251 base::Bind(&DidResolveURL, base::UTF8ToUTF16(info.name), info.root_url,
198 MakeTuple(base::UTF8ToUTF16(info.name), info.root_url, 252 info.mount_type,
199 static_cast<blink::WebFileSystemType>(info.mount_type), 253 normalized_path.AsUTF16Unsafe(), is_directory),
200 normalized_path.AsUTF16Unsafe(), is_directory),
201 UNREGISTER_CALLBACKS); 254 UNREGISTER_CALLBACKS);
202 } 255 }
203 256
204 void StatusCallbackAdapter(int thread_id, int callbacks_id, 257 void StatusCallbackAdapter(int thread_id, int callbacks_id,
205 WaitableCallbackResults* waitable_results, 258 WaitableCallbackResults* waitable_results,
206 base::File::Error error) { 259 base::File::Error error) {
207 if (error == base::File::FILE_OK) { 260 if (error == base::File::FILE_OK) {
208 CallbackFileSystemCallbacks( 261 CallbackFileSystemCallbacks(
209 thread_id, callbacks_id, waitable_results, 262 thread_id, callbacks_id, waitable_results,
210 &WebFileSystemCallbacks::didSucceed, MakeTuple(), 263 base::Bind(&DidSucceed),
211 UNREGISTER_CALLBACKS); 264 UNREGISTER_CALLBACKS);
212 } else { 265 } else {
213 CallbackFileSystemCallbacks( 266 CallbackFileSystemCallbacks(
214 thread_id, callbacks_id, waitable_results, 267 thread_id, callbacks_id, waitable_results,
215 &WebFileSystemCallbacks::didFail, 268 base::Bind(&DidFail, error),
216 MakeTuple(fileapi::FileErrorToWebFileError(error)),
217 UNREGISTER_CALLBACKS); 269 UNREGISTER_CALLBACKS);
218 } 270 }
219 } 271 }
220 272
221 void ReadMetadataCallbackAdapter(int thread_id, int callbacks_id, 273 void ReadMetadataCallbackAdapter(int thread_id, int callbacks_id,
222 WaitableCallbackResults* waitable_results, 274 WaitableCallbackResults* waitable_results,
223 const base::File::Info& file_info) { 275 const base::File::Info& file_info) {
224 WebFileInfo web_file_info;
225 FileInfoToWebFileInfo(file_info, &web_file_info);
226 CallbackFileSystemCallbacks( 276 CallbackFileSystemCallbacks(
227 thread_id, callbacks_id, waitable_results, 277 thread_id, callbacks_id, waitable_results,
228 &WebFileSystemCallbacks::didReadMetadata, 278 base::Bind(&DidReadMetadata, file_info),
229 MakeTuple(web_file_info),
230 UNREGISTER_CALLBACKS); 279 UNREGISTER_CALLBACKS);
231 } 280 }
232 281
233 void ReadDirectoryCallbackAdapter( 282 void ReadDirectoryCallbackAdapter(
234 int thread_id, int callbacks_id, WaitableCallbackResults* waitable_results, 283 int thread_id, int callbacks_id, WaitableCallbackResults* waitable_results,
235 const std::vector<fileapi::DirectoryEntry>& entries, 284 const std::vector<fileapi::DirectoryEntry>& entries,
236 bool has_more) { 285 bool has_more) {
237 WebVector<WebFileSystemEntry> file_system_entries(entries.size());
238 for (size_t i = 0; i < entries.size(); i++) {
239 file_system_entries[i].name =
240 base::FilePath(entries[i].name).AsUTF16Unsafe();
241 file_system_entries[i].isDirectory = entries[i].is_directory;
242 }
243 CallbackFileSystemCallbacks( 286 CallbackFileSystemCallbacks(
244 thread_id, callbacks_id, waitable_results, 287 thread_id, callbacks_id, waitable_results,
245 &WebFileSystemCallbacks::didReadDirectory, 288 base::Bind(&DidReadDirectory, entries, has_more),
246 MakeTuple(file_system_entries, has_more),
247 has_more ? DO_NOT_UNREGISTER_CALLBACKS : UNREGISTER_CALLBACKS); 289 has_more ? DO_NOT_UNREGISTER_CALLBACKS : UNREGISTER_CALLBACKS);
248 } 290 }
249 291
250 void DidCreateFileWriter( 292 void DidCreateFileWriter(
251 int callbacks_id, 293 int callbacks_id,
252 const GURL& path, 294 const GURL& path,
253 blink::WebFileWriterClient* client, 295 blink::WebFileWriterClient* client,
254 base::MessageLoopProxy* main_thread_loop, 296 base::MessageLoopProxy* main_thread_loop,
255 const base::File::Info& file_info) { 297 const base::File::Info& file_info) {
256 WebFileSystemImpl* filesystem = 298 WebFileSystemImpl* filesystem =
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
646 WaitableCallbackResults* WebFileSystemImpl::MaybeCreateWaitableResults( 688 WaitableCallbackResults* WebFileSystemImpl::MaybeCreateWaitableResults(
647 const WebFileSystemCallbacks& callbacks, int callbacks_id) { 689 const WebFileSystemCallbacks& callbacks, int callbacks_id) {
648 if (!callbacks.shouldBlockUntilCompletion()) 690 if (!callbacks.shouldBlockUntilCompletion())
649 return NULL; 691 return NULL;
650 WaitableCallbackResults* results = new WaitableCallbackResults(); 692 WaitableCallbackResults* results = new WaitableCallbackResults();
651 waitable_results_[callbacks_id] = results; 693 waitable_results_[callbacks_id] = results;
652 return results; 694 return results;
653 } 695 }
654 696
655 } // namespace content 697 } // namespace content
OLDNEW
« 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