1bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen/*
2bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * Copyright (C) 2010 Google Inc. All rights reserved.
3bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen *
4bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * Redistribution and use in source and binary forms, with or without
5bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * modification, are permitted provided that the following conditions are
6bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * met:
7bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen *
8bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen *     * Redistributions of source code must retain the above copyright
9bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * notice, this list of conditions and the following disclaimer.
10bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen *     * Redistributions in binary form must reproduce the above
11bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * copyright notice, this list of conditions and the following disclaimer
12bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * in the documentation and/or other materials provided with the
13bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * distribution.
14bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen *     * Neither the name of Google Inc. nor the names of its
15bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * contributors may be used to endorse or promote products derived from
16bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * this software without specific prior written permission.
17bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen *
18bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen */
30bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
31bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "config.h"
32bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "WorkerFileSystemCallbacksBridge.h"
33bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
34bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if ENABLE(FILE_SYSTEM)
35bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
36bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "CrossThreadTask.h"
37bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "WebCommonWorkerClient.h"
38a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "WebFileInfo.h"
39bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "WebFileSystemCallbacks.h"
40a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "WebFileSystemEntry.h"
41bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "WebString.h"
42bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "WebWorkerBase.h"
43bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "WorkerContext.h"
44bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "WorkerScriptController.h"
45bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "WorkerThread.h"
46bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include <wtf/MainThread.h>
47bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include <wtf/Threading.h>
482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <wtf/UnusedParam.h>
49bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
50a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochnamespace WebCore {
51a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
52a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochtemplate<> struct CrossThreadCopierBase<false, false, WebKit::WebFileInfo> {
53a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    typedef WebKit::WebFileInfo Type;
54a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    static Type copy(const WebKit::WebFileInfo& info)
55a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
56a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        // Perform per-field copy to make sure we don't do any (unexpected) non-thread safe copy here.
57a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        struct WebKit::WebFileInfo newInfo;
58a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        newInfo.modificationTime = info.modificationTime;
59a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        newInfo.length = info.length;
60a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        newInfo.type = info.type;
612bde8e466a4451c7319e3a072d118917957d6554Steve Block        newInfo.platformPath.assign(info.platformPath.data(), info.platformPath.length());
62a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return newInfo;
63a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
64a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch};
65a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
66a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochtemplate<> struct CrossThreadCopierBase<false, false, WebKit::WebVector<WebKit::WebFileSystemEntry> > {
67a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    typedef WebKit::WebVector<WebKit::WebFileSystemEntry> Type;
68a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    static Type copy(const WebKit::WebVector<WebKit::WebFileSystemEntry>& entries)
69a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
70a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        WebKit::WebVector<WebKit::WebFileSystemEntry> newEntries(entries.size());
71a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        for (size_t i = 0; i < entries.size(); ++i) {
72a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            String name = entries[i].name;
73a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            newEntries[i].isDirectory = entries[i].isDirectory;
74a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            newEntries[i].name = name.crossThreadString();
75a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
76a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return newEntries;
77a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
78a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch};
79a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
80a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
81a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
82bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenusing namespace WebCore;
83bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
84bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsennamespace WebKit {
85bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
86bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen// FileSystemCallbacks that are to be dispatched on the main thread.
87bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenclass MainThreadFileSystemCallbacks : public WebFileSystemCallbacks {
88bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenpublic:
89a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    // Callbacks are self-destructed and we always return leaked pointer here.
902bde8e466a4451c7319e3a072d118917957d6554Steve Block    static MainThreadFileSystemCallbacks* createLeakedPtr(WorkerFileSystemCallbacksBridge* bridge, const String& mode)
91bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
92a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        OwnPtr<MainThreadFileSystemCallbacks> callbacks = adoptPtr(new MainThreadFileSystemCallbacks(bridge, mode));
93a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return callbacks.leakPtr();
94bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
95bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
96bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    virtual ~MainThreadFileSystemCallbacks()
97bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
98bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
99bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
100bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    virtual void didOpenFileSystem(const WebString& name, const WebString& path)
101bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
102bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        m_bridge->didOpenFileSystemOnMainThread(name, path, m_mode);
103bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        delete this;
104bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
105bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
106bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    virtual void didFail(WebFileError error)
107bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
108bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        m_bridge->didFailOnMainThread(error, m_mode);
109bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        delete this;
110bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
111bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
112bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    virtual void didSucceed()
113bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
114a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_bridge->didSucceedOnMainThread(m_mode);
115a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        delete this;
116bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
117bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
118bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    virtual void didReadMetadata(const WebFileInfo& info)
119bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
120a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_bridge->didReadMetadataOnMainThread(info, m_mode);
121a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        delete this;
122bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
123bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
124bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    virtual void didReadDirectory(const WebVector<WebFileSystemEntry>& entries, bool hasMore)
125bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
126a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_bridge->didReadDirectoryOnMainThread(entries, hasMore, m_mode);
127a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        delete this;
128bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
129bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
130bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenprivate:
1312bde8e466a4451c7319e3a072d118917957d6554Steve Block    MainThreadFileSystemCallbacks(WorkerFileSystemCallbacksBridge* bridge, const String& mode)
132bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        : m_bridge(bridge)
133bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        , m_mode(mode)
134bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1352bde8e466a4451c7319e3a072d118917957d6554Steve Block        ASSERT(m_bridge);
136bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
137bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
138bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    friend class WorkerFileSystemCallbacksBridge;
1392bde8e466a4451c7319e3a072d118917957d6554Steve Block    // The bridge pointer is kept by the bridge itself on the WorkerThread.
1402bde8e466a4451c7319e3a072d118917957d6554Steve Block    WorkerFileSystemCallbacksBridge* m_bridge;
141bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    const String m_mode;
142bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen};
143bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
144bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid WorkerFileSystemCallbacksBridge::stop()
145bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
146bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    ASSERT(m_workerContext->isContextThread());
147bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    MutexLocker locker(m_mutex);
148bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    m_worker = 0;
149bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
150bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (m_callbacksOnWorkerThread) {
151bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        m_callbacksOnWorkerThread->didFail(WebFileErrorAbort);
152bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        m_callbacksOnWorkerThread = 0;
153bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
154bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
155bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1562bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WorkerFileSystemCallbacksBridge::postOpenFileSystemToMainThread(WebCommonWorkerClient* commonClient, WebFileSystem::Type type, long long size, bool create, const String& mode)
157bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
1582bde8e466a4451c7319e3a072d118917957d6554Steve Block    dispatchTaskToMainThread(createCallbackTask(&openFileSystemOnMainThread, commonClient, type, size, create, this, mode));
159a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
160a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
161a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::postMoveToMainThread(WebFileSystem* fileSystem, const String& sourcePath, const String& destinationPath, const String& mode)
162a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
163a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    dispatchTaskToMainThread(createCallbackTask(&moveOnMainThread, fileSystem, sourcePath, destinationPath, this, mode));
164a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
165a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
166a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::postCopyToMainThread(WebFileSystem* fileSystem, const String& sourcePath, const String& destinationPath, const String& mode)
167a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
168a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    dispatchTaskToMainThread(createCallbackTask(&copyOnMainThread, fileSystem, sourcePath, destinationPath, this, mode));
169a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
170a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
171a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::postRemoveToMainThread(WebFileSystem* fileSystem, const String& path, const String& mode)
172a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
173a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ASSERT(fileSystem);
174a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    dispatchTaskToMainThread(createCallbackTask(&removeOnMainThread, fileSystem, path, this, mode));
175a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
176a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
177a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::postRemoveRecursivelyToMainThread(WebFileSystem* fileSystem, const String& path, const String& mode)
178a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
179a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ASSERT(fileSystem);
180a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    dispatchTaskToMainThread(createCallbackTask(&removeRecursivelyOnMainThread, fileSystem, path, this, mode));
181a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
182a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
183a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::postReadMetadataToMainThread(WebFileSystem* fileSystem, const String& path, const String& mode)
184a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
185a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ASSERT(fileSystem);
186a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    dispatchTaskToMainThread(createCallbackTask(&readMetadataOnMainThread, fileSystem, path, this, mode));
187a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
188a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
189a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::postCreateFileToMainThread(WebFileSystem* fileSystem, const String& path, bool exclusive, const String& mode)
190a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
191a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    dispatchTaskToMainThread(createCallbackTask(&createFileOnMainThread, fileSystem, path, exclusive, this, mode));
192a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
193a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
194a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::postCreateDirectoryToMainThread(WebFileSystem* fileSystem, const String& path, bool exclusive, const String& mode)
195a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
196a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ASSERT(fileSystem);
197a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    dispatchTaskToMainThread(createCallbackTask(&createDirectoryOnMainThread, fileSystem, path, exclusive, this, mode));
198a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
199a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
200a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::postFileExistsToMainThread(WebFileSystem* fileSystem, const String& path, const String& mode)
201a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
202a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ASSERT(fileSystem);
203a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    dispatchTaskToMainThread(createCallbackTask(&fileExistsOnMainThread, fileSystem, path, this, mode));
204a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
205a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
206a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::postDirectoryExistsToMainThread(WebFileSystem* fileSystem, const String& path, const String& mode)
207a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
208a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ASSERT(fileSystem);
209a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    dispatchTaskToMainThread(createCallbackTask(&directoryExistsOnMainThread, fileSystem, path, this, mode));
210a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
211a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
212a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::postReadDirectoryToMainThread(WebFileSystem* fileSystem, const String& path, const String& mode)
213a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
214a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ASSERT(fileSystem);
215a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    dispatchTaskToMainThread(createCallbackTask(&readDirectoryOnMainThread, fileSystem, path, this, mode));
216bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
217bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
2182bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WorkerFileSystemCallbacksBridge::openFileSystemOnMainThread(ScriptExecutionContext*, WebCommonWorkerClient* commonClient, WebFileSystem::Type type, long long size, bool create, WorkerFileSystemCallbacksBridge* bridge, const String& mode)
219bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
220bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!commonClient)
221bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        bridge->didFailOnMainThread(WebFileErrorAbort, mode);
222bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    else {
2232bde8e466a4451c7319e3a072d118917957d6554Steve Block        commonClient->openFileSystem(type, size, create, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode));
224bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
225bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
226bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
227a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::moveOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& sourcePath, const String& destinationPath, WorkerFileSystemCallbacksBridge* bridge, const String& mode)
228a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
229a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    fileSystem->move(sourcePath, destinationPath, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode));
230a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
231a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
232a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::copyOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& sourcePath, const String& destinationPath, WorkerFileSystemCallbacksBridge* bridge, const String& mode)
233a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
234a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    fileSystem->copy(sourcePath, destinationPath, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode));
235a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
236a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
237a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::removeOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& path, WorkerFileSystemCallbacksBridge* bridge, const String& mode)
238a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
239a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    fileSystem->remove(path, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode));
240a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
241a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
242a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::removeRecursivelyOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& path, WorkerFileSystemCallbacksBridge* bridge, const String& mode)
243a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
244a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    fileSystem->removeRecursively(path, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode));
245a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
246a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
247a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::readMetadataOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& path, WorkerFileSystemCallbacksBridge* bridge, const String& mode)
248a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
249a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    fileSystem->readMetadata(path, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode));
250a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
251a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
252a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::createFileOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& path, bool exclusive, WorkerFileSystemCallbacksBridge* bridge, const String& mode)
253a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
254a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    fileSystem->createFile(path, exclusive, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode));
255a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
256a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
257a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::createDirectoryOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& path, bool exclusive, WorkerFileSystemCallbacksBridge* bridge, const String& mode)
258a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
259a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    fileSystem->createDirectory(path, exclusive, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode));
260a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
261a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
262a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::fileExistsOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& path, WorkerFileSystemCallbacksBridge* bridge, const String& mode)
263a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
264a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    fileSystem->fileExists(path, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode));
265a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
266a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
267a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::directoryExistsOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& path, WorkerFileSystemCallbacksBridge* bridge, const String& mode)
268a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
269a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    fileSystem->directoryExists(path, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode));
270a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
271a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
272a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::readDirectoryOnMainThread(WebCore::ScriptExecutionContext*, WebFileSystem* fileSystem, const String& path, WorkerFileSystemCallbacksBridge* bridge, const String& mode)
273a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
274a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    fileSystem->readDirectory(path, MainThreadFileSystemCallbacks::createLeakedPtr(bridge, mode));
275a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
276a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
277bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid WorkerFileSystemCallbacksBridge::didFailOnMainThread(WebFileError error, const String& mode)
278bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
279a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    mayPostTaskToWorker(createCallbackTask(&didFailOnWorkerThread, this, error), mode);
280bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
281bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
282bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid WorkerFileSystemCallbacksBridge::didOpenFileSystemOnMainThread(const String& name, const String& rootPath, const String& mode)
283bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
284a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    mayPostTaskToWorker(createCallbackTask(&didOpenFileSystemOnWorkerThread, this, name, rootPath), mode);
285a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
286a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
287a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::didSucceedOnMainThread(const String& mode)
288a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
289a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    mayPostTaskToWorker(createCallbackTask(&didSucceedOnWorkerThread, this), mode);
290a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
291a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
292a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::didReadMetadataOnMainThread(const WebFileInfo& info, const String& mode)
293a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
294a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    mayPostTaskToWorker(createCallbackTask(&didReadMetadataOnWorkerThread, this, info), mode);
295a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
296a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
297a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::didReadDirectoryOnMainThread(const WebVector<WebFileSystemEntry>& entries, bool hasMore, const String& mode)
298a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
299a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    mayPostTaskToWorker(createCallbackTask(&didReadDirectoryOnWorkerThread, this, entries, hasMore), mode);
300bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
301bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
302bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWorkerFileSystemCallbacksBridge::WorkerFileSystemCallbacksBridge(WebWorkerBase* worker, ScriptExecutionContext* scriptExecutionContext, WebFileSystemCallbacks* callbacks)
303bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    : WorkerContext::Observer(static_cast<WorkerContext*>(scriptExecutionContext))
304bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    , m_worker(worker)
305bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    , m_workerContext(scriptExecutionContext)
306bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    , m_callbacksOnWorkerThread(callbacks)
307bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
308bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    ASSERT(m_workerContext->isContextThread());
309bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
310bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
311bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWorkerFileSystemCallbacksBridge::~WorkerFileSystemCallbacksBridge()
312bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
313bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    ASSERT(!m_callbacksOnWorkerThread);
314bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
315bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
316a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::didFailOnWorkerThread(ScriptExecutionContext*, WorkerFileSystemCallbacksBridge* bridge, WebFileError error)
317bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
318a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    bridge->m_callbacksOnWorkerThread->didFail(error);
319bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
320bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
321a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::didOpenFileSystemOnWorkerThread(ScriptExecutionContext*, WorkerFileSystemCallbacksBridge* bridge, const String& name, const String& rootPath)
322bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
323a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    bridge->m_callbacksOnWorkerThread->didOpenFileSystem(name, rootPath);
324a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
325a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
326a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::didSucceedOnWorkerThread(ScriptExecutionContext*, WorkerFileSystemCallbacksBridge* bridge)
327a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
328a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    bridge->m_callbacksOnWorkerThread->didSucceed();
329a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
330a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
331a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::didReadMetadataOnWorkerThread(ScriptExecutionContext*, WorkerFileSystemCallbacksBridge* bridge, const WebFileInfo& info)
332a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
333a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    bridge->m_callbacksOnWorkerThread->didReadMetadata(info);
334a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
335a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
336a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::didReadDirectoryOnWorkerThread(ScriptExecutionContext*, WorkerFileSystemCallbacksBridge* bridge, const WebVector<WebFileSystemEntry>& entries, bool hasMore)
337a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
338a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    bridge->m_callbacksOnWorkerThread->didReadDirectory(entries, hasMore);
339a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
340a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
341a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
3422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WorkerFileSystemCallbacksBridge::runTaskOnMainThread(WebCore::ScriptExecutionContext* scriptExecutionContext, PassRefPtr<WorkerFileSystemCallbacksBridge> bridge, PassOwnPtr<WebCore::ScriptExecutionContext::Task> taskToRun)
343a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
344a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ASSERT(isMainThread());
3452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Every task run will result in one call to mayPostTaskToWorker, which is where this ref is released.
3472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    WorkerFileSystemCallbacksBridge* leaked = bridge.leakRef();
3482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    UNUSED_PARAM(leaked);
349a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    taskToRun->performTask(scriptExecutionContext);
350a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
351a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
352a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::runTaskOnWorkerThread(WebCore::ScriptExecutionContext* scriptExecutionContext, PassRefPtr<WorkerFileSystemCallbacksBridge> bridge, PassOwnPtr<WebCore::ScriptExecutionContext::Task> taskToRun)
353a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
354a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!bridge->m_callbacksOnWorkerThread)
355a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return;
356a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ASSERT(bridge->m_workerContext->isContextThread());
357a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    taskToRun->performTask(scriptExecutionContext);
358a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    bridge->m_callbacksOnWorkerThread = 0;
3592bde8e466a4451c7319e3a072d118917957d6554Steve Block    bridge->stopObserving();
360a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
361a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
362a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WorkerFileSystemCallbacksBridge::dispatchTaskToMainThread(PassOwnPtr<WebCore::ScriptExecutionContext::Task> task)
363a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
364a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ASSERT(m_worker);
365a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ASSERT(m_workerContext->isContextThread());
3662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_worker->dispatchTaskToMainThread(createCallbackTask(&runTaskOnMainThread, RefPtr<WorkerFileSystemCallbacksBridge>(this).release(), task));
367bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
368bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
369bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid WorkerFileSystemCallbacksBridge::mayPostTaskToWorker(PassOwnPtr<ScriptExecutionContext::Task> task, const String& mode)
370bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
371a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ASSERT(isMainThread());
3722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Balancing out the ref() done in runTaskOnMainThread. (Since m_mutex is a member and the deref may result
3742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // in the destruction of WorkerFileSystemCallbacksBridge, the ordering of the RefPtr and the MutexLocker
3752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // is very important, to ensure that the m_mutex is still valid when it gets unlocked.)
3762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RefPtr<WorkerFileSystemCallbacksBridge> bridge = adoptRef(this);
3772bde8e466a4451c7319e3a072d118917957d6554Steve Block    MutexLocker locker(m_mutex);
3782bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_worker)
3792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_worker->postTaskForModeToWorkerContext(createCallbackTask(&runTaskOnWorkerThread, bridge, task), mode);
380bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
381bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
382bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen} // namespace WebCore
383bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
384bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#endif // ENABLE(FILE_SYSTEM)
385