16b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner/* 26b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * Copyright (C) 2010 Google Inc. All rights reserved. 36b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * 46b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * Redistribution and use in source and binary forms, with or without 56b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * modification, are permitted provided that the following conditions are 66b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * met: 76b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * 86b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * * Redistributions of source code must retain the above copyright 96b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * notice, this list of conditions and the following disclaimer. 106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * * Redistributions in binary form must reproduce the above 116b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * copyright notice, this list of conditions and the following disclaimer 126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * in the documentation and/or other materials provided with the 136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * distribution. 146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * * Neither the name of Google Inc. nor the names of its 156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * contributors may be used to endorse or promote products derived from 166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * this software without specific prior written permission. 176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * 186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 296b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner */ 306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "config.h" 326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "WorkerFileWriterCallbacksBridge.h" 336b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 346b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#if ENABLE(FILE_SYSTEM) 356b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 366b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "AsyncFileWriterClient.h" 376b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "CrossThreadTask.h" 386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "WebCString.h" 396b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "WebFileSystem.h" 406b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "WebFileWriter.h" 416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "WebKit.h" 426b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "WebKitClient.h" 436b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "WebWorkerBase.h" 446b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "WorkerContext.h" 456b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "WorkerLoaderProxy.h" 466b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "WorkerThread.h" 476b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include <wtf/MainThread.h> 486b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include <wtf/Threading.h> 496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 506b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerusing namespace WebCore; 516b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 526b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennernamespace WebKit { 536b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 546b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid WorkerFileWriterCallbacksBridge::notifyStop() 556b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner ASSERT(m_workerContext->isContextThread()); 576b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_clientOnWorkerThread = 0; 586b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 596b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 606b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid WorkerFileWriterCallbacksBridge::postWriteToMainThread(long long position, const KURL& data) 616b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ASSERT(!m_operationInProgress); 634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang m_operationInProgress = true; 646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner dispatchTaskToMainThread(createCallbackTask(&writeOnMainThread, this, position, data)); 656b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid WorkerFileWriterCallbacksBridge::postTruncateToMainThread(long long length) 686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ASSERT(!m_operationInProgress); 704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang m_operationInProgress = true; 716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner dispatchTaskToMainThread(createCallbackTask(&truncateOnMainThread, this, length)); 726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 736b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 746b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid WorkerFileWriterCallbacksBridge::postAbortToMainThread() 756b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ASSERT(m_operationInProgress); 776b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner dispatchTaskToMainThread(createCallbackTask(&abortOnMainThread, this)); 786b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 796b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 806b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid WorkerFileWriterCallbacksBridge::postShutdownToMainThread(PassRefPtr<WorkerFileWriterCallbacksBridge> bridge) 816b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 826b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner ASSERT(m_workerContext->isContextThread()); 836b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_clientOnWorkerThread = 0; 846b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner dispatchTaskToMainThread(createCallbackTask(&shutdownOnMainThread, bridge)); 856b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 866b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 876b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid WorkerFileWriterCallbacksBridge::writeOnMainThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, long long position, const KURL& data) 886b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 896b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner bridge->m_writer->write(position, WebURL(data)); 906b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 916b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 926b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid WorkerFileWriterCallbacksBridge::truncateOnMainThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, long long length) 936b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 946b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner bridge->m_writer->truncate(length); 956b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 966b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 976b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid WorkerFileWriterCallbacksBridge::abortOnMainThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge) 986b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 996b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner bridge->m_writer->cancel(); 1006b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 1016b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 1026b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid WorkerFileWriterCallbacksBridge::initOnMainThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, const String& path) 1036b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 1046b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner ASSERT(!bridge->m_writer); 1056b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner bridge->m_writer = webKitClient()->fileSystem()->createFileWriter(path, bridge.get()); 1066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 1076b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 1086b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid WorkerFileWriterCallbacksBridge::shutdownOnMainThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge) 1096b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 1106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner bridge->m_writerDeleted = true; 1116b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner bridge->m_writer.clear(); 1126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 1136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 1146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid WorkerFileWriterCallbacksBridge::didWrite(long long bytes, bool complete) 1156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 1166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner dispatchTaskToWorkerThread(createCallbackTask(&didWriteOnWorkerThread, this, bytes, complete)); 1176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 1186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 1196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid WorkerFileWriterCallbacksBridge::didFail(WebFileError error) 1206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 1216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner dispatchTaskToWorkerThread(createCallbackTask(&didFailOnWorkerThread, this, error)); 1226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 1236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 1246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid WorkerFileWriterCallbacksBridge::didTruncate() 1256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 1266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner dispatchTaskToWorkerThread(createCallbackTask(&didTruncateOnWorkerThread, this)); 1276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 1286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 1294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic const char fileWriterOperationsMode[] = "fileWriterOperationsMode"; 1304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell BrennerWorkerFileWriterCallbacksBridge::WorkerFileWriterCallbacksBridge(const String& path, WorkerLoaderProxy* proxy, ScriptExecutionContext* scriptExecutionContext, AsyncFileWriterClient* client) 1326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner : WorkerContext::Observer(static_cast<WorkerContext*>(scriptExecutionContext)) 1336b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner , m_proxy(proxy) 1346b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner , m_workerContext(scriptExecutionContext) 1356b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner , m_clientOnWorkerThread(client) 1366b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner , m_writerDeleted(false) 1374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang , m_operationInProgress(false) 1386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 1396b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner ASSERT(m_workerContext->isContextThread()); 1404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang m_mode = fileWriterOperationsMode; 1414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang m_mode.append(String::number(static_cast<WorkerContext*>(scriptExecutionContext)->thread()->runLoop().createUniqueId())); 1426b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner postInitToMainThread(path); 1436b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 1446b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 1456b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid WorkerFileWriterCallbacksBridge::postInitToMainThread(const String& path) 1466b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 1476b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner dispatchTaskToMainThread(createCallbackTask(&initOnMainThread, this, path)); 1486b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 1496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 1506b70adc33054f8aee8c54d0f460458a9df11b8a5Russell BrennerWorkerFileWriterCallbacksBridge::~WorkerFileWriterCallbacksBridge() 1516b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 1526b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner ASSERT(!m_clientOnWorkerThread); 1536b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner ASSERT(!m_writer); 1546b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 1556b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 1566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner// We know m_clientOnWorkerThread is still valid because it is only cleared on the context thread, and because we check in runTaskOnWorkerThread before calling any of these methods. 1576b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid WorkerFileWriterCallbacksBridge::didWriteOnWorkerThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, long long length, bool complete) 1586b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 1596b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner ASSERT(bridge->m_workerContext->isContextThread()); 1604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ASSERT(bridge->m_operationInProgress); 1614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (complete) 1624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang bridge->m_operationInProgress = false; 1636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner bridge->m_clientOnWorkerThread->didWrite(length, complete); 1646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 1656b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 1666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid WorkerFileWriterCallbacksBridge::didFailOnWorkerThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, WebFileError error) 1676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 1686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner ASSERT(bridge->m_workerContext->isContextThread()); 1694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ASSERT(bridge->m_operationInProgress); 1704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang bridge->m_operationInProgress = false; 1716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner bridge->m_clientOnWorkerThread->didFail(static_cast<FileError::ErrorCode>(error)); 1726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 1736b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 1746b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid WorkerFileWriterCallbacksBridge::didTruncateOnWorkerThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge) 1756b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 1766b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner ASSERT(bridge->m_workerContext->isContextThread()); 1774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ASSERT(bridge->m_operationInProgress); 1784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang bridge->m_operationInProgress = false; 1796b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner bridge->m_clientOnWorkerThread->didTruncate(); 1806b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 1816b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 1826b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid WorkerFileWriterCallbacksBridge::runTaskOnMainThread(ScriptExecutionContext* scriptExecutionContext, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, PassOwnPtr<ScriptExecutionContext::Task> taskToRun) 1836b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 1846b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner ASSERT(isMainThread()); 1856b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (!bridge->m_writerDeleted) 1866b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner taskToRun->performTask(scriptExecutionContext); 1876b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 1886b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 1896b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid WorkerFileWriterCallbacksBridge::runTaskOnWorkerThread(ScriptExecutionContext* scriptExecutionContext, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, PassOwnPtr<ScriptExecutionContext::Task> taskToRun) 1906b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 1916b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner ASSERT(bridge->m_workerContext->isContextThread()); 1926b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (bridge->m_clientOnWorkerThread) 1936b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner taskToRun->performTask(scriptExecutionContext); 1946b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 1956b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 1966b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid WorkerFileWriterCallbacksBridge::dispatchTaskToMainThread(PassOwnPtr<ScriptExecutionContext::Task> task) 1976b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 1986b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner ASSERT(m_workerContext->isContextThread()); 1996b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner WebWorkerBase::dispatchTaskToMainThread(createCallbackTask(&runTaskOnMainThread, this, task)); 2006b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 2016b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 2026b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid WorkerFileWriterCallbacksBridge::dispatchTaskToWorkerThread(PassOwnPtr<ScriptExecutionContext::Task> task) 2036b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 2046b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner ASSERT(isMainThread()); 2054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang m_proxy->postTaskForModeToWorkerContext(createCallbackTask(&runTaskOnWorkerThread, this, task), m_mode); 2066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 2076b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 2084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangbool WorkerFileWriterCallbacksBridge::waitForOperationToComplete() 2094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 2104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang while (m_operationInProgress) { 2114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang WorkerContext* context = static_cast<WorkerContext*>(m_workerContext); 2124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (context->thread()->runLoop().runInMode(context, m_mode) == MessageQueueTerminated) 2134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return false; 2144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 2154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return true; 2166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 2176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 2184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} // namespace WebKit 2194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#endif // ENABLE(FILE_SYSTEM) 221