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