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(©OnMainThread, 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