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