WebCore: Adding support for the optional creation callback that could be
[WebKit-https.git] / WebCore / workers / WorkerContext.h
1 /*
2  * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  *
25  */
26
27 #ifndef WorkerContext_h
28 #define WorkerContext_h
29
30 #if ENABLE(WORKERS)
31
32 #include "AtomicStringHash.h"
33 #include "Database.h"
34 #include "DatabaseCallback.h"
35 #include "EventListener.h"
36 #include "EventNames.h"
37 #include "EventTarget.h"
38 #include "ScriptExecutionContext.h"
39 #include "WorkerScriptController.h"
40 #include <wtf/Assertions.h>
41 #include <wtf/OwnPtr.h>
42 #include <wtf/PassRefPtr.h>
43 #include <wtf/RefCounted.h>
44 #include <wtf/RefPtr.h>
45
46 namespace WebCore {
47
48     class Database;
49     class NotificationCenter;
50     class ScheduledAction;
51     class WorkerLocation;
52     class WorkerNavigator;
53     class WorkerThread;
54
55     class WorkerContext : public RefCounted<WorkerContext>, public ScriptExecutionContext, public EventTarget {
56     public:
57         virtual ~WorkerContext();
58
59         virtual bool isWorkerContext() const { return true; }
60
61         virtual ScriptExecutionContext* scriptExecutionContext() const;
62
63         virtual bool isSharedWorkerContext() const { return false; }
64         virtual bool isDedicatedWorkerContext() const { return false; }
65
66         const KURL& url() const { return m_url; }
67         KURL completeURL(const String&) const;
68
69         virtual String userAgent(const KURL&) const;
70
71         WorkerScriptController* script() { return m_script.get(); }
72         void clearScript() { m_script.clear(); }
73
74         WorkerThread* thread() const { return m_thread; }
75
76         bool hasPendingActivity() const;
77
78         virtual void resourceRetrievedByXMLHttpRequest(unsigned long identifier, const ScriptString& sourceString);
79         virtual void scriptImported(unsigned long identifier, const String& sourceString);
80
81         virtual void postTask(PassOwnPtr<Task>); // Executes the task on context's thread asynchronously.
82
83         // WorkerGlobalScope
84         WorkerContext* self() { return this; }
85         WorkerLocation* location() const;
86         void close();
87
88         DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
89
90         // WorkerUtils
91         virtual void importScripts(const Vector<String>& urls, const String& callerURL, int callerLine, ExceptionCode&);
92         WorkerNavigator* navigator() const;
93
94         // Timers
95         int setTimeout(ScheduledAction*, int timeout);
96         void clearTimeout(int timeoutId);
97         int setInterval(ScheduledAction*, int timeout);
98         void clearInterval(int timeoutId);
99
100         // ScriptExecutionContext
101         virtual void reportException(const String& errorMessage, int lineNumber, const String& sourceURL);
102         virtual void addMessage(MessageDestination, MessageSource, MessageType, MessageLevel, const String& message, unsigned lineNumber, const String& sourceURL);
103
104 #if ENABLE(NOTIFICATIONS)
105         NotificationCenter* webkitNotifications() const;
106 #endif
107
108 #if ENABLE(DATABASE)
109         // HTML 5 client-side database
110         PassRefPtr<Database> openDatabase(const String& name, const String& version, const String& displayName, unsigned long estimatedSize, PassRefPtr<DatabaseCallback> creationCallback, ExceptionCode&);
111         // Not implemented yet.
112         virtual bool isDatabaseReadOnly() const { return false; }
113         // Not implemented yet.
114         virtual void databaseExceededQuota(const String&) { }
115 #endif
116         virtual bool isContextThread() const;
117
118
119         // These methods are used for GC marking. See JSWorkerContext::markChildren(MarkStack&) in
120         // JSWorkerContextCustom.cpp.
121         WorkerNavigator* optionalNavigator() const { return m_navigator.get(); }
122         WorkerLocation* optionalLocation() const { return m_location.get(); }
123
124         using RefCounted<WorkerContext>::ref;
125         using RefCounted<WorkerContext>::deref;
126
127         bool isClosing() { return m_closing; }
128
129     protected:
130         WorkerContext(const KURL&, const String&, WorkerThread*);
131
132     private:
133         virtual void refScriptExecutionContext() { ref(); }
134         virtual void derefScriptExecutionContext() { deref(); }
135
136         virtual void refEventTarget() { ref(); }
137         virtual void derefEventTarget() { deref(); }
138         virtual EventTargetData* eventTargetData();
139         virtual EventTargetData* ensureEventTargetData();
140
141         virtual const KURL& virtualURL() const;
142         virtual KURL virtualCompleteURL(const String&) const;
143
144         KURL m_url;
145         String m_userAgent;
146
147         mutable RefPtr<WorkerLocation> m_location;
148         mutable RefPtr<WorkerNavigator> m_navigator;
149
150         OwnPtr<WorkerScriptController> m_script;
151         WorkerThread* m_thread;
152
153 #if ENABLE_NOTIFICATIONS
154         mutable RefPtr<NotificationCenter> m_notifications;
155 #endif
156         bool m_closing;
157         EventTargetData m_eventTargetData;
158     };
159
160 } // namespace WebCore
161
162 #endif // ENABLE(WORKERS)
163
164 #endif // WorkerContext_h