1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/* 2635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2008 Apple Inc. All Rights Reserved. 32fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * Copyright (C) 2009, 2011 Google Inc. All Rights Reserved. 4635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 5635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Redistribution and use in source and binary forms, with or without 6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * modification, are permitted provided that the following conditions 7635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * are met: 8635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * notice, this list of conditions and the following disclaimer. 10635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 12635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * documentation and/or other materials provided with the distribution. 13635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 14635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 15635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 18635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project */ 27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "config.h" 29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(WORKERS) 31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 32635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "WorkerContext.h" 33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "AbstractDatabase.h" 35635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "ActiveDOMObject.h" 3606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "Database.h" 3706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "DatabaseCallback.h" 3806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "DatabaseSync.h" 396c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#include "DatabaseTracker.h" 408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "DOMTimer.h" 4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "DOMURL.h" 42635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "DOMWindow.h" 43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "ErrorEvent.h" 44635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Event.h" 45635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "EventException.h" 4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "InspectorInstrumentation.h" 475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "KURL.h" 480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "MessagePort.h" 49635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "NotImplemented.h" 50ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include "ScriptCallStack.h" 518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "ScriptSourceCode.h" 528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "ScriptValue.h" 53635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "SecurityOrigin.h" 542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "WorkerInspectorController.h" 55635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "WorkerLocation.h" 56635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "WorkerNavigator.h" 578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "WorkerObjectProxy.h" 580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "WorkerScriptLoader.h" 59635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "WorkerThread.h" 605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "WorkerThreadableLoader.h" 618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "XMLHttpRequestException.h" 62635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/RefPtr.h> 63e2bca94a6deb58613400a85282dea37566fff097Steve Block#include <wtf/UnusedParam.h> 64635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 65231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(NOTIFICATIONS) 66231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "NotificationCenter.h" 67231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 68231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 69bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if ENABLE(FILE_SYSTEM) 70bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "AsyncFileSystem.h" 712bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "DirectoryEntrySync.h" 72bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "DOMFileSystem.h" 732bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "DOMFileSystemBase.h" 74a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "DOMFileSystemSync.h" 75bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "ErrorCallback.h" 762bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "FileEntrySync.h" 77bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "FileError.h" 78e14391e94c850b8bd03680c23b38978db68687a8John Reck#include "FileException.h" 79bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "FileSystemCallback.h" 80bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "FileSystemCallbacks.h" 81bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "LocalFileSystem.h" 82a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "SyncCallbackHelper.h" 83bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#endif 84bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 85635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace WebCore { 86635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass CloseWorkerContextTask : public ScriptExecutionContext::Task { 88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockpublic: 89dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block static PassOwnPtr<CloseWorkerContextTask> create() 90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block { 91dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return new CloseWorkerContextTask; 92dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 94dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block virtual void performTask(ScriptExecutionContext *context) 95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block { 96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(context->isWorkerContext()); 97dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WorkerContext* workerContext = static_cast<WorkerContext*>(context); 98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Notify parent that this context is closed. Parent is responsible for calling WorkerThread::stop(). 99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block workerContext->thread()->workerReportingProxy().workerContextClosed(); 100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block virtual bool isCleanupTask() const { return true; } 103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}; 104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 105635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectWorkerContext::WorkerContext(const KURL& url, const String& userAgent, WorkerThread* thread) 106635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project : m_url(url) 107635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_userAgent(userAgent) 108635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_script(new WorkerScriptController(this)) 109635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_thread(thread) 1102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if ENABLE(INSPECTOR) 1112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch , m_workerInspectorController(new WorkerInspectorController(this)) 1122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif 1135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian , m_closing(false) 114635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 115635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project setSecurityOrigin(SecurityOrigin::create(url)); 116635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 117635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 118635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectWorkerContext::~WorkerContext() 119635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 120231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(currentThread() == thread()->threadID()); 121231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(NOTIFICATIONS) 122231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_notifications.clear(); 123231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 124bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 125bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen // Make sure we have no observers. 126bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen notifyObserversOfStop(); 127bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 128231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Notify proxy that we are going away. This can free the WorkerThread object, so do not access it after this. 129231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block thread()->workerReportingProxy().workerContextDestroyed(); 130635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 131635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 132635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectScriptExecutionContext* WorkerContext::scriptExecutionContext() const 133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 134635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return const_cast<WorkerContext*>(this); 135635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 136635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 137635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectconst KURL& WorkerContext::virtualURL() const 138635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 139635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return m_url; 140635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 141635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 142635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectKURL WorkerContext::virtualCompleteURL(const String& url) const 143635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 144635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return completeURL(url); 145635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 146635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 147635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectKURL WorkerContext::completeURL(const String& url) const 148635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 149635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Always return a null URL when passed a null string. 150635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // FIXME: Should we change the KURL constructor to have this behavior? 151635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (url.isNull()) 152635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return KURL(); 1538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Always use UTF-8 in Workers. 1545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return KURL(m_url, url); 155635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 156635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianString WorkerContext::userAgent(const KURL&) const 1588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 1598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return m_userAgent; 1608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 1618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1625f1ab04193ad0130ca8204aadaceae083aca9881Feng QianWorkerLocation* WorkerContext::location() const 1635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 1645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!m_location) 1655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_location = WorkerLocation::create(m_url); 1665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return m_location.get(); 1675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 1685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid WorkerContext::close() 1705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 1715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_closing) 1725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return; 1735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 174dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Let current script run to completion but prevent future script evaluations. 1752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // After m_closing is set, all the tasks in the queue continue to be fetched but only 1762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // tasks with isCleanupTask()==true will be executed. 1772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch m_closing = true; 178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block postTask(CloseWorkerContextTask::create()); 1795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 1805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 181635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectWorkerNavigator* WorkerContext::navigator() const 182635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 183635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!m_navigator) 184635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_navigator = WorkerNavigator::create(m_userAgent); 185635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return m_navigator.get(); 186635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 187635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 188635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool WorkerContext::hasPendingActivity() const 189635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 190635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ActiveDOMObjectsMap& activeObjects = activeDOMObjects(); 191635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ActiveDOMObjectsMap::const_iterator activeObjectsEnd = activeObjects.end(); 192635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (ActiveDOMObjectsMap::const_iterator iter = activeObjects.begin(); iter != activeObjectsEnd; ++iter) { 193635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (iter->first->hasPendingActivity()) 194635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return true; 195635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 196635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Keep the worker active as long as there is a MessagePort with pending activity or that is remotely entangled. 1980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch HashSet<MessagePort*>::const_iterator messagePortsEnd = messagePorts().end(); 1990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch for (HashSet<MessagePort*>::const_iterator iter = messagePorts().begin(); iter != messagePortsEnd; ++iter) { 2000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if ((*iter)->hasPendingActivity() || ((*iter)->isEntangled() && !(*iter)->locallyEntangledPort())) 2010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return true; 2020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 203635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return false; 205635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 206635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 207643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WorkerContext::postTask(PassOwnPtr<Task> task) 2088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 2098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian thread()->runLoop().postTask(task); 2108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 211635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 212e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkeint WorkerContext::setTimeout(PassOwnPtr<ScheduledAction> action, int timeout) 2135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 2145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return DOMTimer::install(scriptExecutionContext(), action, timeout, true); 2155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 2165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid WorkerContext::clearTimeout(int timeoutId) 2185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 2195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian DOMTimer::removeById(scriptExecutionContext(), timeoutId); 2205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 2215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 222e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkeint WorkerContext::setInterval(PassOwnPtr<ScheduledAction> action, int timeout) 2238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 2245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return DOMTimer::install(scriptExecutionContext(), action, timeout, false); 2258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 226635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid WorkerContext::clearInterval(int timeoutId) 2288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 2298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian DOMTimer::removeById(scriptExecutionContext(), timeoutId); 2308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 231635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 232dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WorkerContext::importScripts(const Vector<String>& urls, ExceptionCode& ec) 233635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 2348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ec = 0; 2358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Vector<String>::const_iterator urlsEnd = urls.end(); 2368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Vector<KURL> completedURLs; 2378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian for (Vector<String>::const_iterator it = urls.begin(); it != urlsEnd; ++it) { 2388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian const KURL& url = scriptExecutionContext()->completeURL(*it); 2398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!url.isValid()) { 2408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ec = SYNTAX_ERR; 2418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 2428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 2438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian completedURLs.append(url); 2448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 2458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Vector<KURL>::const_iterator end = completedURLs.end(); 2468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian for (Vector<KURL>::const_iterator it = completedURLs.begin(); it != end; ++it) { 24821939df44de1705786c545cd1bf519d47250322dBen Murdoch WorkerScriptLoader scriptLoader(ResourceRequestBase::TargetIsScript); 249231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block scriptLoader.loadSynchronously(scriptExecutionContext(), *it, AllowCrossOriginRequests); 2500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // If the fetching attempt failed, throw a NETWORK_ERR exception and abort all these steps. 2520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (scriptLoader.failed()) { 2538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ec = XMLHttpRequestException::NETWORK_ERR; 2548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 2558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 2568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch InspectorInstrumentation::scriptImported(scriptExecutionContext(), scriptLoader.identifier(), scriptLoader.script()); 2580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ScriptValue exception; 2602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_script->evaluate(ScriptSourceCode(scriptLoader.script(), scriptLoader.responseURL()), &exception); 2618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!exception.hasNoValue()) { 2628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_script->setException(exception); 2638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 2648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 2658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 266635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 267635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 268ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochEventTarget* WorkerContext::errorEventTarget() 2690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 270ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch return this; 271ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch} 272ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 273ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid WorkerContext::logExceptionToConsole(const String& errorMessage, int lineNumber, const String& sourceURL, PassRefPtr<ScriptCallStack>) 274ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{ 275ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch thread()->workerReportingProxy().postExceptionToWorkerObject(errorMessage, lineNumber, sourceURL); 276231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 277231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 278ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid WorkerContext::addMessage(MessageSource source, MessageType type, MessageLevel level, const String& message, unsigned lineNumber, const String& sourceURL, PassRefPtr<ScriptCallStack>) 279231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 280dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block thread()->workerReportingProxy().postConsoleMessageToWorkerObject(source, type, level, message, lineNumber, sourceURL); 281231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 282231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 283231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(NOTIFICATIONS) 284231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockNotificationCenter* WorkerContext::webkitNotifications() const 285231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 286231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!m_notifications) 287231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_notifications = NotificationCenter::create(scriptExecutionContext(), m_thread->getNotificationPresenter()); 288231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return m_notifications.get(); 289231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 290231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 291231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 292d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(DATABASE) 293dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockPassRefPtr<Database> WorkerContext::openDatabase(const String& name, const String& version, const String& displayName, unsigned long estimatedSize, PassRefPtr<DatabaseCallback> creationCallback, ExceptionCode& ec) 294d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 29506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!securityOrigin()->canAccessDatabase() || !AbstractDatabase::isAvailable()) { 2966c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen ec = SECURITY_ERR; 2976c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return 0; 2986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } 2996c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 3006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return Database::openDatabase(this, name, version, displayName, estimatedSize, creationCallback, ec); 3016c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 3026c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 3036c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenvoid WorkerContext::databaseExceededQuota(const String&) 3046c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 3056c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#if !PLATFORM(CHROMIUM) 3066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen // FIXME: This needs a real implementation; this is a temporary solution for testing. 3076c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen const unsigned long long defaultQuota = 5 * 1024 * 1024; 3086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen DatabaseTracker::tracker().setQuota(securityOrigin(), defaultQuota); 3096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#endif 3106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 3116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 3126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenPassRefPtr<DatabaseSync> WorkerContext::openDatabaseSync(const String& name, const String& version, const String& displayName, unsigned long estimatedSize, PassRefPtr<DatabaseCallback> creationCallback, ExceptionCode& ec) 3136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 31406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!securityOrigin()->canAccessDatabase() || !AbstractDatabase::isAvailable()) { 315d0825bca7fe65beaee391d30da42e937db621564Steve Block ec = SECURITY_ERR; 316d0825bca7fe65beaee391d30da42e937db621564Steve Block return 0; 317d0825bca7fe65beaee391d30da42e937db621564Steve Block } 318d0825bca7fe65beaee391d30da42e937db621564Steve Block 3196c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return DatabaseSync::openDatabaseSync(this, name, version, displayName, estimatedSize, creationCallback, ec); 320d0825bca7fe65beaee391d30da42e937db621564Steve Block} 321d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 322d0825bca7fe65beaee391d30da42e937db621564Steve Block 323d0825bca7fe65beaee391d30da42e937db621564Steve Blockbool WorkerContext::isContextThread() const 324d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 325d0825bca7fe65beaee391d30da42e937db621564Steve Block return currentThread() == thread()->threadID(); 326d0825bca7fe65beaee391d30da42e937db621564Steve Block} 327d0825bca7fe65beaee391d30da42e937db621564Steve Block 3282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool WorkerContext::isJSExecutionForbidden() const 32921939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 33021939df44de1705786c545cd1bf519d47250322dBen Murdoch return m_script->isExecutionForbidden(); 33121939df44de1705786c545cd1bf519d47250322dBen Murdoch} 33221939df44de1705786c545cd1bf519d47250322dBen Murdoch 333231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockEventTargetData* WorkerContext::eventTargetData() 334231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 335231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return &m_eventTargetData; 336231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 337231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 338231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockEventTargetData* WorkerContext::ensureEventTargetData() 339231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 340231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return &m_eventTargetData; 3410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 3420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 3435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if ENABLE(BLOB) 34465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochDOMURL* WorkerContext::webkitURL() const 3455ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 34665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_domURL) 34765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_domURL = DOMURL::create(this->scriptExecutionContext()); 34865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return m_domURL.get(); 3495ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 3505ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif 3515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 352bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if ENABLE(FILE_SYSTEM) 3532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WorkerContext::webkitRequestFileSystem(int type, long long size, PassRefPtr<FileSystemCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback) 354bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{ 355bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (!AsyncFileSystem::isAvailable() || !securityOrigin()->canAccessFileSystem()) { 356e14391e94c850b8bd03680c23b38978db68687a8John Reck DOMFileSystem::scheduleCallback(this, errorCallback, FileError::create(FileError::SECURITY_ERR)); 357bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return; 358bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen } 359bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 360bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen AsyncFileSystem::Type fileSystemType = static_cast<AsyncFileSystem::Type>(type); 3612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (fileSystemType != AsyncFileSystem::Temporary && fileSystemType != AsyncFileSystem::Persistent && fileSystemType != AsyncFileSystem::External) { 362e14391e94c850b8bd03680c23b38978db68687a8John Reck DOMFileSystem::scheduleCallback(this, errorCallback, FileError::create(FileError::INVALID_MODIFICATION_ERR)); 363bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return; 364bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen } 365bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 366a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch LocalFileSystem::localFileSystem().requestFileSystem(this, fileSystemType, size, FileSystemCallbacks::create(successCallback, errorCallback, this), false); 367a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch} 368a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 3692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochPassRefPtr<DOMFileSystemSync> WorkerContext::webkitRequestFileSystemSync(int type, long long size, ExceptionCode& ec) 370a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{ 371a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch ec = 0; 372a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (!AsyncFileSystem::isAvailable() || !securityOrigin()->canAccessFileSystem()) { 373e14391e94c850b8bd03680c23b38978db68687a8John Reck ec = FileException::SECURITY_ERR; 374a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return 0; 375a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch } 376a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 377a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch AsyncFileSystem::Type fileSystemType = static_cast<AsyncFileSystem::Type>(type); 3782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (fileSystemType != AsyncFileSystem::Temporary && fileSystemType != AsyncFileSystem::Persistent && fileSystemType != AsyncFileSystem::External) { 379e14391e94c850b8bd03680c23b38978db68687a8John Reck ec = FileException::INVALID_MODIFICATION_ERR; 380a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return 0; 381a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch } 382a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 383a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch FileSystemSyncCallbackHelper helper; 384a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch LocalFileSystem::localFileSystem().requestFileSystem(this, fileSystemType, size, FileSystemCallbacks::create(helper.successCallback(), helper.errorCallback(), this), true); 385a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return helper.getResult(ec); 386bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen} 387bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 3882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WorkerContext::webkitResolveLocalFileSystemURL(const String& url, PassRefPtr<EntryCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback) 3892bde8e466a4451c7319e3a072d118917957d6554Steve Block{ 3902bde8e466a4451c7319e3a072d118917957d6554Steve Block KURL completedURL = completeURL(url); 3912bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!AsyncFileSystem::isAvailable() || !securityOrigin()->canAccessFileSystem() || !securityOrigin()->canRequest(completedURL)) { 3922bde8e466a4451c7319e3a072d118917957d6554Steve Block DOMFileSystem::scheduleCallback(this, errorCallback, FileError::create(FileError::SECURITY_ERR)); 3932bde8e466a4451c7319e3a072d118917957d6554Steve Block return; 3942bde8e466a4451c7319e3a072d118917957d6554Steve Block } 3952bde8e466a4451c7319e3a072d118917957d6554Steve Block 3962bde8e466a4451c7319e3a072d118917957d6554Steve Block AsyncFileSystem::Type type; 3972bde8e466a4451c7319e3a072d118917957d6554Steve Block String filePath; 3982bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!completedURL.isValid() || !DOMFileSystemBase::crackFileSystemURL(completedURL, type, filePath)) { 3992bde8e466a4451c7319e3a072d118917957d6554Steve Block DOMFileSystem::scheduleCallback(this, errorCallback, FileError::create(FileError::ENCODING_ERR)); 4002bde8e466a4451c7319e3a072d118917957d6554Steve Block return; 4012bde8e466a4451c7319e3a072d118917957d6554Steve Block } 4022bde8e466a4451c7319e3a072d118917957d6554Steve Block 4032bde8e466a4451c7319e3a072d118917957d6554Steve Block LocalFileSystem::localFileSystem().readFileSystem(this, type, ResolveURICallbacks::create(successCallback, errorCallback, this, filePath)); 4042bde8e466a4451c7319e3a072d118917957d6554Steve Block} 4052bde8e466a4451c7319e3a072d118917957d6554Steve Block 4062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochPassRefPtr<EntrySync> WorkerContext::webkitResolveLocalFileSystemSyncURL(const String& url, ExceptionCode& ec) 4072bde8e466a4451c7319e3a072d118917957d6554Steve Block{ 4082bde8e466a4451c7319e3a072d118917957d6554Steve Block ec = 0; 4092bde8e466a4451c7319e3a072d118917957d6554Steve Block KURL completedURL = completeURL(url); 4102bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!AsyncFileSystem::isAvailable() || !securityOrigin()->canAccessFileSystem() || !securityOrigin()->canRequest(completedURL)) { 4112bde8e466a4451c7319e3a072d118917957d6554Steve Block ec = FileException::SECURITY_ERR; 4122bde8e466a4451c7319e3a072d118917957d6554Steve Block return 0; 4132bde8e466a4451c7319e3a072d118917957d6554Steve Block } 4142bde8e466a4451c7319e3a072d118917957d6554Steve Block 4152bde8e466a4451c7319e3a072d118917957d6554Steve Block AsyncFileSystem::Type type; 4162bde8e466a4451c7319e3a072d118917957d6554Steve Block String filePath; 4172bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!completedURL.isValid() || !DOMFileSystemBase::crackFileSystemURL(completedURL, type, filePath)) { 4182bde8e466a4451c7319e3a072d118917957d6554Steve Block ec = FileException::ENCODING_ERR; 4192bde8e466a4451c7319e3a072d118917957d6554Steve Block return 0; 4202bde8e466a4451c7319e3a072d118917957d6554Steve Block } 4212bde8e466a4451c7319e3a072d118917957d6554Steve Block 4222bde8e466a4451c7319e3a072d118917957d6554Steve Block FileSystemSyncCallbackHelper readFileSystemHelper; 4232bde8e466a4451c7319e3a072d118917957d6554Steve Block LocalFileSystem::localFileSystem().readFileSystem(this, type, FileSystemCallbacks::create(readFileSystemHelper.successCallback(), readFileSystemHelper.errorCallback(), this), true); 4242bde8e466a4451c7319e3a072d118917957d6554Steve Block RefPtr<DOMFileSystemSync> fileSystem = readFileSystemHelper.getResult(ec); 4252bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!fileSystem) 4262bde8e466a4451c7319e3a072d118917957d6554Steve Block return 0; 4272bde8e466a4451c7319e3a072d118917957d6554Steve Block 4282bde8e466a4451c7319e3a072d118917957d6554Steve Block RefPtr<EntrySync> entry = fileSystem->root()->getDirectory(filePath, 0, ec); 4292bde8e466a4451c7319e3a072d118917957d6554Steve Block if (ec == FileException::TYPE_MISMATCH_ERR) 4302bde8e466a4451c7319e3a072d118917957d6554Steve Block return fileSystem->root()->getFile(filePath, 0, ec); 4312bde8e466a4451c7319e3a072d118917957d6554Steve Block 4322bde8e466a4451c7319e3a072d118917957d6554Steve Block return entry.release(); 4332bde8e466a4451c7319e3a072d118917957d6554Steve Block} 4342bde8e466a4451c7319e3a072d118917957d6554Steve Block 435bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenCOMPILE_ASSERT(static_cast<int>(WorkerContext::TEMPORARY) == static_cast<int>(AsyncFileSystem::Temporary), enum_mismatch); 436bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenCOMPILE_ASSERT(static_cast<int>(WorkerContext::PERSISTENT) == static_cast<int>(AsyncFileSystem::Persistent), enum_mismatch); 4372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochCOMPILE_ASSERT(static_cast<int>(WorkerContext::EXTERNAL) == static_cast<int>(AsyncFileSystem::External), enum_mismatch); 438bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#endif 439bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 440bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWorkerContext::Observer::Observer(WorkerContext* context) 441bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen : m_context(context) 442bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{ 443bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen ASSERT(m_context && m_context->isContextThread()); 444bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_context->registerObserver(this); 445bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen} 446bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 447bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWorkerContext::Observer::~Observer() 448bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{ 449bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (!m_context) 450bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return; 451bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen ASSERT(m_context->isContextThread()); 452bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_context->unregisterObserver(this); 453bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen} 454bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 455bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid WorkerContext::Observer::stopObserving() 456bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{ 457bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (!m_context) 458bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return; 459bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen ASSERT(m_context->isContextThread()); 460bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_context->unregisterObserver(this); 461bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_context = 0; 462bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen} 463bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 464bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid WorkerContext::registerObserver(Observer* observer) 465bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{ 466bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen ASSERT(observer); 467bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_workerObservers.add(observer); 468bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen} 469bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 470bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid WorkerContext::unregisterObserver(Observer* observer) 471bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{ 472bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen ASSERT(observer); 473bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_workerObservers.remove(observer); 474bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen} 475bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 476bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid WorkerContext::notifyObserversOfStop() 477bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{ 478bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen HashSet<Observer*>::iterator iter = m_workerObservers.begin(); 479bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen while (iter != m_workerObservers.end()) { 480bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen WorkerContext::Observer* observer = *iter; 481bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen observer->stopObserving(); 482bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen observer->notifyStop(); 483bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen iter = m_workerObservers.begin(); 484bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen } 485bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen} 486bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 487635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} // namespace WebCore 488635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 489635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif // ENABLE(WORKERS) 490