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