1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/fileapi/webfilesystem_impl.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/bind.h" 8558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/lazy_instance.h" 9558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/logging.h" 10558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/message_loop/message_loop_proxy.h" 113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/synchronization/waitable_event.h" 13558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/threading/thread_local.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/child_thread.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/fileapi/file_system_dispatcher.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/fileapi/webfilewriter_impl.h" 17558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/common/fileapi/file_system_messages.h" 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebFileInfo.h" 1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebFileSystemCallbacks.h" 20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h" 21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURL.h" 22558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "url/gurl.h" 23558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "webkit/child/worker_task_runner.h" 24558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "webkit/common/fileapi/directory_entry.h" 25558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "webkit/common/fileapi/file_system_util.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/glue/webkit_glue.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebFileInfo; 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebFileSystemCallbacks; 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebFileSystemEntry; 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebString; 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURL; 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebVector; 34558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochusing webkit_glue::WorkerTaskRunner; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace { 397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)base::LazyInstance<base::ThreadLocalPointer<WebFileSystemImpl> >::Leaky 413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) g_webfilesystem_tls = LAZY_INSTANCE_INITIALIZER; 42558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class WaitableCallbackResults { 44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public: 45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static WaitableCallbackResults* MaybeCreate( 4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const WebFileSystemCallbacks& callbacks) { 4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (callbacks.shouldBlockUntilCompletion()) 48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return new WaitableCallbackResults; 49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return NULL; 50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ~WaitableCallbackResults() {} 52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void SetResultsAndSignal(const base::Closure& results_closure) { 54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) results_closure_ = results_closure; 55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) event_->Signal(); 56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void WaitAndRun() { 59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) event_->Wait(); 60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(!results_closure_.is_null()); 61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) results_closure_.Run(); 627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private: 65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults() : event_(new base::WaitableEvent(true, false)) {} 66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::WaitableEvent* event_; 68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Closure results_closure_; 69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WaitableCallbackResults); 70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 72558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid DidReceiveSnapshotFile(int request_id) { 73558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (ChildThread::current()) 74558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ChildThread::current()->Send( 75558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch new FileSystemHostMsg_DidReceiveSnapshotFile(request_id)); 76558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 77558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 78558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint CurrentWorkerId() { 79558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return WorkerTaskRunner::Instance()->CurrentWorkerId(); 80558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 81558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 82558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochtemplate <typename Method, typename Params> 83558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid CallDispatcherOnMainThread( 84558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::MessageLoopProxy* loop, 85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) Method method, const Params& params, 86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<WaitableCallbackResults> waitable_results) { 87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<WaitableCallbackResults> null_waitable; 88558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!loop->RunsTasksOnCurrentThread()) { 89558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch loop->PostTask(FROM_HERE, 90558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::Bind(&CallDispatcherOnMainThread<Method, Params>, 91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) make_scoped_refptr(loop), method, params, 92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Passed(&null_waitable))); 93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!waitable_results) 94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return; 95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) waitable_results->WaitAndRun(); 96558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 97558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!ChildThread::current() || 98558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch !ChildThread::current()->file_system_dispatcher()) 99558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return; 100558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(!waitable_results); 102558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DispatchToMethod(ChildThread::current()->file_system_dispatcher(), 103558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch method, params); 104558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 105558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Run WebFileSystemCallbacks's |method| with |params|. 107558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochtemplate <typename Method, typename Params> 108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void RunCallbacks(int callbacks_id, Method method, const Params& params) { 1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) WebFileSystemImpl* filesystem = 1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) WebFileSystemImpl::ThreadSpecificInstance(NULL); 1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!filesystem) 112558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return; 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebFileSystemCallbacks callbacks = 1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) filesystem->GetAndUnregisterCallbacks(callbacks_id); 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DispatchToMethod(&callbacks, method, params); 116558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 117558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void DispatchResultsClosure(int thread_id, int callbacks_id, 119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults* waitable_results, 120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::Closure& results_closure) { 121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (thread_id != CurrentWorkerId()) { 122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (waitable_results) { 123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) waitable_results->SetResultsAndSignal(results_closure); 124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return; 125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WorkerTaskRunner::Instance()->PostTask(thread_id, results_closure); 127a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return; 128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) results_closure.Run(); 130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)template <typename Method, typename Params> 133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CallbackFileSystemCallbacks( 134a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int thread_id, int callbacks_id, 135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults* waitable_results, 136a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) Method method, const Params& params) { 137a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DispatchResultsClosure( 138a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) thread_id, callbacks_id, waitable_results, 139a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&RunCallbacks<Method, Params>, callbacks_id, method, params)); 140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//----------------------------------------------------------------------------- 1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Callback adapters. Callbacks must be called on the original calling thread, 1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// so these callback adapters relay back the results to the calling thread 1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// if necessary. 1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void OpenFileSystemCallbackAdapter( 1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int thread_id, int callbacks_id, 1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) WaitableCallbackResults* waitable_results, 1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& name, const GURL& root) { 1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CallbackFileSystemCallbacks( 1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) thread_id, callbacks_id, waitable_results, 1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &WebFileSystemCallbacks::didOpenFileSystem, 1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) MakeTuple(UTF8ToUTF16(name), root)); 1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 15768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ResolveURLCallbackAdapter( 15868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int thread_id, int callbacks_id, 15968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) WaitableCallbackResults* waitable_results, 16068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const fileapi::FileSystemInfo& info, 16168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const base::FilePath& file_path, bool is_directory) { 16268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::FilePath normalized_path( 16368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) fileapi::VirtualPath::GetNormalizedFilePath(file_path)); 16468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CallbackFileSystemCallbacks( 16568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) thread_id, callbacks_id, waitable_results, 16668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &WebFileSystemCallbacks::didResolveURL, 16768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) MakeTuple(UTF8ToUTF16(info.name), info.root_url, 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static_cast<blink::WebFileSystemType>(info.mount_type), 16968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) normalized_path.AsUTF16Unsafe(), is_directory)); 17068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 17168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 172558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid StatusCallbackAdapter(int thread_id, int callbacks_id, 173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults* waitable_results, 174558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::PlatformFileError error) { 175558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (error == base::PLATFORM_FILE_OK) { 176558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CallbackFileSystemCallbacks( 177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) thread_id, callbacks_id, waitable_results, 178558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch &WebFileSystemCallbacks::didSucceed, MakeTuple()); 179558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } else { 180558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CallbackFileSystemCallbacks( 181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) thread_id, callbacks_id, waitable_results, 182558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch &WebFileSystemCallbacks::didFail, 183558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch MakeTuple(fileapi::PlatformFileErrorToWebFileError(error))); 184558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 185558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 186558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 187558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid ReadMetadataCallbackAdapter(int thread_id, int callbacks_id, 188a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults* waitable_results, 189558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const base::PlatformFileInfo& file_info) { 190558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch WebFileInfo web_file_info; 191558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch webkit_glue::PlatformFileInfoToWebFileInfo(file_info, &web_file_info); 192558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CallbackFileSystemCallbacks( 193a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) thread_id, callbacks_id, waitable_results, 194558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch &WebFileSystemCallbacks::didReadMetadata, 195558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch MakeTuple(web_file_info)); 196558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 197558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 198558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid ReadDirectoryCallbackAdapater( 199a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int thread_id, int callbacks_id, WaitableCallbackResults* waitable_results, 200558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const std::vector<fileapi::DirectoryEntry>& entries, 201558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bool has_more) { 202558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch WebVector<WebFileSystemEntry> file_system_entries(entries.size()); 203558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch for (size_t i = 0; i < entries.size(); i++) { 204558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch file_system_entries[i].name = 205558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::FilePath(entries[i].name).AsUTF16Unsafe(); 206558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch file_system_entries[i].isDirectory = entries[i].is_directory; 207558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 208558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CallbackFileSystemCallbacks( 209a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) thread_id, callbacks_id, waitable_results, 210558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch &WebFileSystemCallbacks::didReadDirectory, 211558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch MakeTuple(file_system_entries, has_more)); 212558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 213558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 214a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void DidCreateFileWriter( 215a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int callbacks_id, 216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const GURL& path, 217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFileWriterClient* client, 218a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::MessageLoopProxy* main_thread_loop, 219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::PlatformFileInfo& file_info) { 2203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) WebFileSystemImpl* filesystem = 2213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) WebFileSystemImpl::ThreadSpecificInstance(NULL); 2223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!filesystem) 223a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return; 224a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebFileSystemCallbacks callbacks = 2263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) filesystem->GetAndUnregisterCallbacks(callbacks_id); 227a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 228a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (file_info.is_directory || file_info.size < 0) { 229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) callbacks.didFail(blink::WebFileErrorInvalidState); 230a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return; 231a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 23258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebFileWriterImpl::Type type = 23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) callbacks.shouldBlockUntilCompletion() ? 23458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebFileWriterImpl::TYPE_SYNC : WebFileWriterImpl::TYPE_ASYNC; 23558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) callbacks.didCreateFileWriter( 2363240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch new WebFileWriterImpl(path, client, type, main_thread_loop), 2373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch file_info.size); 238a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 239a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 240a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CreateFileWriterCallbackAdapter( 241558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch int thread_id, int callbacks_id, 242a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults* waitable_results, 243a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::MessageLoopProxy* main_thread_loop, 244a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const GURL& path, 245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFileWriterClient* client, 246a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::PlatformFileInfo& file_info) { 247a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DispatchResultsClosure( 248a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) thread_id, callbacks_id, waitable_results, 249a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&DidCreateFileWriter, callbacks_id, path, client, 250a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) make_scoped_refptr(main_thread_loop), file_info)); 251a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 252a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 253a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void DidCreateSnapshotFile( 254a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int callbacks_id, 255558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::MessageLoopProxy* main_thread_loop, 256558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const base::PlatformFileInfo& file_info, 257558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const base::FilePath& platform_path, 258558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch int request_id) { 2593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) WebFileSystemImpl* filesystem = 2603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) WebFileSystemImpl::ThreadSpecificInstance(NULL); 2613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!filesystem) 262558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return; 263558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 26458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebFileSystemCallbacks callbacks = 2653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) filesystem->GetAndUnregisterCallbacks(callbacks_id); 266558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 267558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch WebFileInfo web_file_info; 268558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch webkit_glue::PlatformFileInfoToWebFileInfo(file_info, &web_file_info); 269558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch web_file_info.platformPath = platform_path.AsUTF16Unsafe(); 27058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) callbacks.didCreateSnapshotFile(web_file_info); 271558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 272558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // TODO(michaeln,kinuko): Use ThreadSafeSender when Blob becomes 273558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // non-bridge model. 274558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch main_thread_loop->PostTask( 275558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch FROM_HERE, base::Bind(&DidReceiveSnapshotFile, request_id)); 276558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 277558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 278a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CreateSnapshotFileCallbackAdapter( 279a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int thread_id, int callbacks_id, 280a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults* waitable_results, 281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::MessageLoopProxy* main_thread_loop, 282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::PlatformFileInfo& file_info, 283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::FilePath& platform_path, 284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int request_id) { 285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DispatchResultsClosure( 286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) thread_id, callbacks_id, waitable_results, 287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&DidCreateSnapshotFile, callbacks_id, 288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) make_scoped_refptr(main_thread_loop), 289a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) file_info, platform_path, request_id)); 290a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 291a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} // namespace 2937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//----------------------------------------------------------------------------- 2953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// WebFileSystemImpl 2963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)WebFileSystemImpl* WebFileSystemImpl::ThreadSpecificInstance( 2983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::MessageLoopProxy* main_thread_loop) { 2993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (g_webfilesystem_tls.Pointer()->Get() || !main_thread_loop) 3003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return g_webfilesystem_tls.Pointer()->Get(); 3013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) WebFileSystemImpl* filesystem = new WebFileSystemImpl(main_thread_loop); 3023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (WorkerTaskRunner::Instance()->CurrentWorkerId()) 3033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) WorkerTaskRunner::Instance()->AddStopObserver(filesystem); 3043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return filesystem; 3053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 3063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void WebFileSystemImpl::DeleteThreadSpecificInstance() { 3083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(!WorkerTaskRunner::Instance()->CurrentWorkerId()); 3093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (g_webfilesystem_tls.Pointer()->Get()) 3103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) delete g_webfilesystem_tls.Pointer()->Get(); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 313558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochWebFileSystemImpl::WebFileSystemImpl(base::MessageLoopProxy* main_thread_loop) 31458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : main_thread_loop_(main_thread_loop), 31558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) next_callbacks_id_(0) { 3163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) g_webfilesystem_tls.Pointer()->Set(this); 3173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 3183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)WebFileSystemImpl::~WebFileSystemImpl() { 3203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) g_webfilesystem_tls.Pointer()->Set(NULL); 3213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 3223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void WebFileSystemImpl::OnWorkerRunLoopStopped() { 3243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) delete this; 3253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 3263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void WebFileSystemImpl::openFileSystem( 328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& storage_partition, 329f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFileSystemType type, 33058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebFileSystemCallbacks callbacks) { 3313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int callbacks_id = RegisterCallbacks(callbacks); 3323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) WaitableCallbackResults* waitable_results = 3333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) WaitableCallbackResults::MaybeCreate(callbacks); 3343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CallDispatcherOnMainThread( 3353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) main_thread_loop_.get(), 3363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &FileSystemDispatcher::OpenFileSystem, 3373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) MakeTuple(GURL(storage_partition), 3383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) static_cast<fileapi::FileSystemType>(type), 3393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Bind(&OpenFileSystemCallbackAdapter, 3403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CurrentWorkerId(), callbacks_id, 3413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Unretained(waitable_results)), 3423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Bind(&StatusCallbackAdapter, 3433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CurrentWorkerId(), callbacks_id, 3443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Unretained(waitable_results))), 3453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) make_scoped_ptr(waitable_results)); 3463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 3473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 34868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void WebFileSystemImpl::resolveURL( 349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& filesystem_url, 35068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) WebFileSystemCallbacks callbacks) { 35168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int callbacks_id = RegisterCallbacks(callbacks); 35268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) WaitableCallbackResults* waitable_results = 35368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) WaitableCallbackResults::MaybeCreate(callbacks); 35468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CallDispatcherOnMainThread( 35568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) main_thread_loop_.get(), 35668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &FileSystemDispatcher::ResolveURL, 35768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) MakeTuple(GURL(filesystem_url), 35868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::Bind(&ResolveURLCallbackAdapter, 35968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CurrentWorkerId(), callbacks_id, 36068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::Unretained(waitable_results)), 36168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::Bind(&StatusCallbackAdapter, 36268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CurrentWorkerId(), callbacks_id, 36368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::Unretained(waitable_results))), 36468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) make_scoped_ptr(waitable_results)); 36568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 36668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void WebFileSystemImpl::deleteFileSystem( 368f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& storage_partition, 369f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFileSystemType type, 37058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebFileSystemCallbacks callbacks) { 3713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int callbacks_id = RegisterCallbacks(callbacks); 3723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) WaitableCallbackResults* waitable_results = 3733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) WaitableCallbackResults::MaybeCreate(callbacks); 3743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CallDispatcherOnMainThread( 3753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) main_thread_loop_.get(), 3763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &FileSystemDispatcher::DeleteFileSystem, 3773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) MakeTuple(GURL(storage_partition), 3783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) static_cast<fileapi::FileSystemType>(type), 3793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Bind(&StatusCallbackAdapter, 3803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CurrentWorkerId(), callbacks_id, 3813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Unretained(waitable_results))), 3823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) make_scoped_ptr(waitable_results)); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid WebFileSystemImpl::move( 386f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& src_path, 387f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& dest_path, 38858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebFileSystemCallbacks callbacks) { 3893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int callbacks_id = RegisterCallbacks(callbacks); 390a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults* waitable_results = 391a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults::MaybeCreate(callbacks); 392558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CallDispatcherOnMainThread( 393558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch main_thread_loop_.get(), 394558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch &FileSystemDispatcher::Move, 395558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch MakeTuple(GURL(src_path), GURL(dest_path), 396558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::Bind(&StatusCallbackAdapter, 397a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CurrentWorkerId(), callbacks_id, 398a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(waitable_results))), 399a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) make_scoped_ptr(waitable_results)); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 402558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid WebFileSystemImpl::copy( 403f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& src_path, 404f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& dest_path, 40558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebFileSystemCallbacks callbacks) { 4063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int callbacks_id = RegisterCallbacks(callbacks); 407a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults* waitable_results = 408a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults::MaybeCreate(callbacks); 409558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CallDispatcherOnMainThread( 410558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch main_thread_loop_.get(), 411558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch &FileSystemDispatcher::Copy, 412558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch MakeTuple(GURL(src_path), GURL(dest_path), 413558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::Bind(&StatusCallbackAdapter, 414a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CurrentWorkerId(), callbacks_id, 415a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(waitable_results))), 416a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) make_scoped_ptr(waitable_results)); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 419558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid WebFileSystemImpl::remove( 420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& path, 42158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebFileSystemCallbacks callbacks) { 4223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int callbacks_id = RegisterCallbacks(callbacks); 423a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults* waitable_results = 424a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults::MaybeCreate(callbacks); 425558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CallDispatcherOnMainThread( 426558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch main_thread_loop_.get(), 427558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch &FileSystemDispatcher::Remove, 428558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch MakeTuple(GURL(path), false /* recursive */, 429558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::Bind(&StatusCallbackAdapter, 430a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CurrentWorkerId(), callbacks_id, 431a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(waitable_results))), 432a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) make_scoped_ptr(waitable_results)); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid WebFileSystemImpl::removeRecursively( 436f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& path, 43758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebFileSystemCallbacks callbacks) { 4383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int callbacks_id = RegisterCallbacks(callbacks); 439a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults* waitable_results = 440a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults::MaybeCreate(callbacks); 441558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CallDispatcherOnMainThread( 442558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch main_thread_loop_.get(), 443558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch &FileSystemDispatcher::Remove, 444558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch MakeTuple(GURL(path), true /* recursive */, 445558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::Bind(&StatusCallbackAdapter, 446a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CurrentWorkerId(), callbacks_id, 447a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(waitable_results))), 448a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) make_scoped_ptr(waitable_results)); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 451558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid WebFileSystemImpl::readMetadata( 452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& path, 45358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebFileSystemCallbacks callbacks) { 4543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int callbacks_id = RegisterCallbacks(callbacks); 455a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults* waitable_results = 456a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults::MaybeCreate(callbacks); 457558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CallDispatcherOnMainThread( 458558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch main_thread_loop_.get(), 459558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch &FileSystemDispatcher::ReadMetadata, 460558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch MakeTuple(GURL(path), 461558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::Bind(&ReadMetadataCallbackAdapter, 462a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CurrentWorkerId(), callbacks_id, 463a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(waitable_results)), 464558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::Bind(&StatusCallbackAdapter, 465a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CurrentWorkerId(), callbacks_id, 466a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(waitable_results))), 467a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) make_scoped_ptr(waitable_results)); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 470558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid WebFileSystemImpl::createFile( 471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& path, 472558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bool exclusive, 47358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebFileSystemCallbacks callbacks) { 4743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int callbacks_id = RegisterCallbacks(callbacks); 475a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults* waitable_results = 476a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults::MaybeCreate(callbacks); 477558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CallDispatcherOnMainThread( 478558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch main_thread_loop_.get(), 479558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch &FileSystemDispatcher::CreateFile, 480558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch MakeTuple(GURL(path), exclusive, 481558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::Bind(&StatusCallbackAdapter, 482a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CurrentWorkerId(), callbacks_id, 483a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(waitable_results))), 484a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) make_scoped_ptr(waitable_results)); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 487558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid WebFileSystemImpl::createDirectory( 488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& path, 489558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bool exclusive, 49058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebFileSystemCallbacks callbacks) { 4913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int callbacks_id = RegisterCallbacks(callbacks); 492a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults* waitable_results = 493a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults::MaybeCreate(callbacks); 494558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CallDispatcherOnMainThread( 495558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch main_thread_loop_.get(), 496558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch &FileSystemDispatcher::CreateDirectory, 497558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch MakeTuple(GURL(path), exclusive, false /* recursive */, 498558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::Bind(&StatusCallbackAdapter, 499a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CurrentWorkerId(), callbacks_id, 500a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(waitable_results))), 501a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) make_scoped_ptr(waitable_results)); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 504558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid WebFileSystemImpl::fileExists( 505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& path, 50658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebFileSystemCallbacks callbacks) { 5073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int callbacks_id = RegisterCallbacks(callbacks); 508a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults* waitable_results = 509a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults::MaybeCreate(callbacks); 510558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CallDispatcherOnMainThread( 511558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch main_thread_loop_.get(), 512558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch &FileSystemDispatcher::Exists, 513558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch MakeTuple(GURL(path), false /* directory */, 514558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::Bind(&StatusCallbackAdapter, 515a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CurrentWorkerId(), callbacks_id, 51668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::Unretained(waitable_results))), 517a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) make_scoped_ptr(waitable_results)); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 520558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid WebFileSystemImpl::directoryExists( 521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& path, 52258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebFileSystemCallbacks callbacks) { 5233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int callbacks_id = RegisterCallbacks(callbacks); 524a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults* waitable_results = 525a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults::MaybeCreate(callbacks); 526558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CallDispatcherOnMainThread( 527558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch main_thread_loop_.get(), 528558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch &FileSystemDispatcher::Exists, 529558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch MakeTuple(GURL(path), true /* directory */, 530558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::Bind(&StatusCallbackAdapter, 531a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CurrentWorkerId(), callbacks_id, 532a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(waitable_results))), 533a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) make_scoped_ptr(waitable_results)); 534558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 535558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 536558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid WebFileSystemImpl::readDirectory( 537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& path, 53858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebFileSystemCallbacks callbacks) { 5393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int callbacks_id = RegisterCallbacks(callbacks); 540a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults* waitable_results = 541a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults::MaybeCreate(callbacks); 542558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CallDispatcherOnMainThread( 543558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch main_thread_loop_.get(), 544558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch &FileSystemDispatcher::ReadDirectory, 545558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch MakeTuple(GURL(path), 546558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::Bind(&ReadDirectoryCallbackAdapater, 547a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CurrentWorkerId(), callbacks_id, 548a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(waitable_results)), 549558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::Bind(&StatusCallbackAdapter, 550a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CurrentWorkerId(), callbacks_id, 551a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)base::Unretained(waitable_results))), 552a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) make_scoped_ptr(waitable_results)); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid WebFileSystemImpl::createFileWriter( 5567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const WebURL& path, 557f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFileWriterClient* client, 55858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebFileSystemCallbacks callbacks) { 5593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int callbacks_id = RegisterCallbacks(callbacks); 560a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults* waitable_results = 561a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults::MaybeCreate(callbacks); 562a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CallDispatcherOnMainThread( 563a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) main_thread_loop_.get(), 564a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) &FileSystemDispatcher::ReadMetadata, 565a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MakeTuple(GURL(path), 566a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&CreateFileWriterCallbackAdapter, 567a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CurrentWorkerId(), callbacks_id, 568a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(waitable_results), 569a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) main_thread_loop_, GURL(path), client), 570a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&StatusCallbackAdapter, 571a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CurrentWorkerId(), callbacks_id, 572a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(waitable_results))), 573a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) make_scoped_ptr(waitable_results)); 5747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 5757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebFileSystemImpl::createSnapshotFileAndReadMetadata( 577f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& path, 57858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebFileSystemCallbacks callbacks) { 5793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int callbacks_id = RegisterCallbacks(callbacks); 580a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults* waitable_results = 581a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitableCallbackResults::MaybeCreate(callbacks); 582558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CallDispatcherOnMainThread( 583558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch main_thread_loop_.get(), 584558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch &FileSystemDispatcher::CreateSnapshotFile, 585558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch MakeTuple(GURL(path), 586558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::Bind(&CreateSnapshotFileCallbackAdapter, 587558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CurrentWorkerId(), callbacks_id, 588a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(waitable_results), 589558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch main_thread_loop_), 590558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::Bind(&StatusCallbackAdapter, 591a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CurrentWorkerId(), callbacks_id, 592a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(waitable_results))), 593a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) make_scoped_ptr(waitable_results)); 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 59658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)int WebFileSystemImpl::RegisterCallbacks( 59758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const WebFileSystemCallbacks& callbacks) { 59858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(CalledOnValidThread()); 59958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int id = next_callbacks_id_++; 60058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) callbacks_[id] = callbacks; 60158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return id; 6023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 6033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 60458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)WebFileSystemCallbacks WebFileSystemImpl::GetAndUnregisterCallbacks( 6053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int callbacks_id) { 60658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(CalledOnValidThread()); 60758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CallbacksMap::iterator found = callbacks_.find(callbacks_id); 60858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(found != callbacks_.end()); 60958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebFileSystemCallbacks callbacks = found->second; 61058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) callbacks_.erase(found); 6113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return callbacks; 6123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 6133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 615