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

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 // Run WebFileSystemCallbacks's |method| with |params|. 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 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.
133 public:
134 WebFileSystemCallbacksBridge(WebFileSystemCallbacks *callbacks)
135 : callbacks_(callbacks) {}
136
137 void didSucceed() {
138 callbacks_->didSucceed();
139 }
140
141 void didReadMetadata(const base::File::Info& file_info) {
142 WebFileInfo web_file_info;
143 FileInfoToWebFileInfo(file_info, &web_file_info);
144 callbacks_->didReadMetadata(web_file_info);
145 }
146
147 void didReadDirectory(
148 const std::vector<fileapi::DirectoryEntry>& entries,
149 bool has_more) {
150 WebVector<WebFileSystemEntry> file_system_entries(entries.size());
151 for (size_t i = 0; i < entries.size(); i++) {
152 file_system_entries[i].name =
153 base::FilePath(entries[i].name).AsUTF16Unsafe();
154 file_system_entries[i].isDirectory = entries[i].is_directory;
155 }
156 callbacks_->didReadDirectory(file_system_entries, has_more);
157 }
158
159 void didOpenFileSystem(const base::string16& name, const GURL& root) {
160 callbacks_->didOpenFileSystem(
161 static_cast<WebString>(name),
162 static_cast<WebURL>(root));
163 }
164
165 void didResolveURL(
166 const base::string16& name,
167 const GURL& root_url,
168 fileapi::FileSystemType mount_type,
169 const base::string16& file_path,
170 bool is_directory) {
171 callbacks_->didResolveURL(
172 static_cast<WebString>(name),
173 static_cast<WebURL>(root_url),
174 static_cast<blink::WebFileSystemType>(mount_type),
175 static_cast<WebString>(file_path),
176 is_directory);
177 }
178
179 void didFail(base::File::Error error) {
180 callbacks_->didFail(fileapi::FileErrorToWebFileError(error));
181 }
182
183 private:
184 WebFileSystemCallbacks* callbacks_;
185 };
186
187 // Run WebFileSystemCallbacks's |method| with |params| via
127 template <typename Method, typename Params> 188 template <typename Method, typename Params>
128 void RunCallbacks(int callbacks_id, Method method, const Params& params, 189 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.
129 CallbacksUnregisterMode callbacks_unregister_mode) { 190 CallbacksUnregisterMode callbacks_unregister_mode) {
130 WebFileSystemImpl* filesystem = 191 WebFileSystemImpl* filesystem =
131 WebFileSystemImpl::ThreadSpecificInstance(NULL); 192 WebFileSystemImpl::ThreadSpecificInstance(NULL);
132 if (!filesystem) 193 if (!filesystem)
133 return; 194 return;
134 WebFileSystemCallbacks callbacks = filesystem->GetCallbacks(callbacks_id); 195 WebFileSystemCallbacks callbacks = filesystem->GetCallbacks(callbacks_id);
135 if (callbacks_unregister_mode == UNREGISTER_CALLBACKS) 196 if (callbacks_unregister_mode == UNREGISTER_CALLBACKS)
136 filesystem->UnregisterCallbacks(callbacks_id); 197 filesystem->UnregisterCallbacks(callbacks_id);
137 DispatchToMethod(&callbacks, method, params); 198 WebFileSystemCallbacksBridge bridge(&callbacks);
199 DispatchToMethod(&bridge, method, params);
138 } 200 }
139 201
140 void DispatchResultsClosure(int thread_id, int callbacks_id, 202 void DispatchResultsClosure(int thread_id, int callbacks_id,
141 WaitableCallbackResults* waitable_results, 203 WaitableCallbackResults* waitable_results,
142 const base::Closure& results_closure) { 204 const base::Closure& results_closure) {
143 if (thread_id != CurrentWorkerId()) { 205 if (thread_id != CurrentWorkerId()) {
144 if (waitable_results) { 206 if (waitable_results) {
145 // If someone is waiting, this should result in running the closure. 207 // If someone is waiting, this should result in running the closure.
146 waitable_results->AddResultsAndSignal(results_closure); 208 waitable_results->AddResultsAndSignal(results_closure);
147 // In case no one is waiting, post a task to run the closure. 209 // In case no one is waiting, post a task to run the closure.
(...skipping 23 matching lines...) Expand all
171 233
172 //----------------------------------------------------------------------------- 234 //-----------------------------------------------------------------------------
173 // Callback adapters. Callbacks must be called on the original calling thread, 235 // Callback adapters. Callbacks must be called on the original calling thread,
174 // so these callback adapters relay back the results to the calling thread 236 // so these callback adapters relay back the results to the calling thread
175 // if necessary. 237 // if necessary.
176 238
177 void OpenFileSystemCallbackAdapter( 239 void OpenFileSystemCallbackAdapter(
178 int thread_id, int callbacks_id, 240 int thread_id, int callbacks_id,
179 WaitableCallbackResults* waitable_results, 241 WaitableCallbackResults* waitable_results,
180 const std::string& name, const GURL& root) { 242 const std::string& name, const GURL& root) {
181 CallbackFileSystemCallbacks( 243 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
182 thread_id, callbacks_id, waitable_results, 244 thread_id, callbacks_id, waitable_results,
183 &WebFileSystemCallbacks::didOpenFileSystem, 245 &WebFileSystemCallbacksBridge::didOpenFileSystem,
184 MakeTuple(base::UTF8ToUTF16(name), root), 246 MakeTuple(base::UTF8ToUTF16(name), root),
185 UNREGISTER_CALLBACKS); 247 UNREGISTER_CALLBACKS);
186 } 248 }
187 249
188 void ResolveURLCallbackAdapter( 250 void ResolveURLCallbackAdapter(
189 int thread_id, int callbacks_id, 251 int thread_id, int callbacks_id,
190 WaitableCallbackResults* waitable_results, 252 WaitableCallbackResults* waitable_results,
191 const fileapi::FileSystemInfo& info, 253 const fileapi::FileSystemInfo& info,
192 const base::FilePath& file_path, bool is_directory) { 254 const base::FilePath& file_path, bool is_directory) {
193 base::FilePath normalized_path( 255 base::FilePath normalized_path(
194 fileapi::VirtualPath::GetNormalizedFilePath(file_path)); 256 fileapi::VirtualPath::GetNormalizedFilePath(file_path));
195 CallbackFileSystemCallbacks( 257 CallbackFileSystemCallbacks(
196 thread_id, callbacks_id, waitable_results, 258 thread_id, callbacks_id, waitable_results,
197 &WebFileSystemCallbacks::didResolveURL, 259 &WebFileSystemCallbacksBridge::didResolveURL,
198 MakeTuple(base::UTF8ToUTF16(info.name), info.root_url, 260 MakeTuple(base::UTF8ToUTF16(info.name), info.root_url,
199 static_cast<blink::WebFileSystemType>(info.mount_type), 261 info.mount_type,
200 normalized_path.AsUTF16Unsafe(), is_directory), 262 normalized_path.AsUTF16Unsafe(), is_directory),
201 UNREGISTER_CALLBACKS); 263 UNREGISTER_CALLBACKS);
202 } 264 }
203 265
204 void StatusCallbackAdapter(int thread_id, int callbacks_id, 266 void StatusCallbackAdapter(int thread_id, int callbacks_id,
205 WaitableCallbackResults* waitable_results, 267 WaitableCallbackResults* waitable_results,
206 base::File::Error error) { 268 base::File::Error error) {
207 if (error == base::File::FILE_OK) { 269 if (error == base::File::FILE_OK) {
208 CallbackFileSystemCallbacks( 270 CallbackFileSystemCallbacks(
209 thread_id, callbacks_id, waitable_results, 271 thread_id, callbacks_id, waitable_results,
210 &WebFileSystemCallbacks::didSucceed, MakeTuple(), 272 &WebFileSystemCallbacksBridge::didSucceed, MakeTuple(),
211 UNREGISTER_CALLBACKS); 273 UNREGISTER_CALLBACKS);
212 } else { 274 } else {
213 CallbackFileSystemCallbacks( 275 CallbackFileSystemCallbacks(
214 thread_id, callbacks_id, waitable_results, 276 thread_id, callbacks_id, waitable_results,
215 &WebFileSystemCallbacks::didFail, 277 &WebFileSystemCallbacksBridge::didFail,
216 MakeTuple(fileapi::FileErrorToWebFileError(error)), 278 MakeTuple(error),
217 UNREGISTER_CALLBACKS); 279 UNREGISTER_CALLBACKS);
218 } 280 }
219 } 281 }
220 282
221 void ReadMetadataCallbackAdapter(int thread_id, int callbacks_id, 283 void ReadMetadataCallbackAdapter(int thread_id, int callbacks_id,
222 WaitableCallbackResults* waitable_results, 284 WaitableCallbackResults* waitable_results,
223 const base::File::Info& file_info) { 285 const base::File::Info& file_info) {
224 WebFileInfo web_file_info;
225 FileInfoToWebFileInfo(file_info, &web_file_info);
226 CallbackFileSystemCallbacks( 286 CallbackFileSystemCallbacks(
227 thread_id, callbacks_id, waitable_results, 287 thread_id, callbacks_id, waitable_results,
228 &WebFileSystemCallbacks::didReadMetadata, 288 &WebFileSystemCallbacksBridge::didReadMetadata,
229 MakeTuple(web_file_info), 289 MakeTuple(file_info),
230 UNREGISTER_CALLBACKS); 290 UNREGISTER_CALLBACKS);
231 } 291 }
232 292
233 void ReadDirectoryCallbackAdapter( 293 void ReadDirectoryCallbackAdapter(
234 int thread_id, int callbacks_id, WaitableCallbackResults* waitable_results, 294 int thread_id, int callbacks_id, WaitableCallbackResults* waitable_results,
235 const std::vector<fileapi::DirectoryEntry>& entries, 295 const std::vector<fileapi::DirectoryEntry>& entries,
236 bool has_more) { 296 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( 297 CallbackFileSystemCallbacks(
244 thread_id, callbacks_id, waitable_results, 298 thread_id, callbacks_id, waitable_results,
245 &WebFileSystemCallbacks::didReadDirectory, 299 &WebFileSystemCallbacksBridge::didReadDirectory,
246 MakeTuple(file_system_entries, has_more), 300 MakeTuple(entries, has_more),
247 has_more ? DO_NOT_UNREGISTER_CALLBACKS : UNREGISTER_CALLBACKS); 301 has_more ? DO_NOT_UNREGISTER_CALLBACKS : UNREGISTER_CALLBACKS);
248 } 302 }
249 303
250 void DidCreateFileWriter( 304 void DidCreateFileWriter(
251 int callbacks_id, 305 int callbacks_id,
252 const GURL& path, 306 const GURL& path,
253 blink::WebFileWriterClient* client, 307 blink::WebFileWriterClient* client,
254 base::MessageLoopProxy* main_thread_loop, 308 base::MessageLoopProxy* main_thread_loop,
255 const base::File::Info& file_info) { 309 const base::File::Info& file_info) {
256 WebFileSystemImpl* filesystem = 310 WebFileSystemImpl* filesystem =
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
646 WaitableCallbackResults* WebFileSystemImpl::MaybeCreateWaitableResults( 700 WaitableCallbackResults* WebFileSystemImpl::MaybeCreateWaitableResults(
647 const WebFileSystemCallbacks& callbacks, int callbacks_id) { 701 const WebFileSystemCallbacks& callbacks, int callbacks_id) {
648 if (!callbacks.shouldBlockUntilCompletion()) 702 if (!callbacks.shouldBlockUntilCompletion())
649 return NULL; 703 return NULL;
650 WaitableCallbackResults* results = new WaitableCallbackResults(); 704 WaitableCallbackResults* results = new WaitableCallbackResults();
651 waitable_results_[callbacks_id] = results; 705 waitable_results_[callbacks_id] = results;
652 return results; 706 return results;
653 } 707 }
654 708
655 } // namespace content 709 } // 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