Add checked casts for ScriptExecutionContext.
[WebKit-https.git] / Source / WebCore / workers / WorkerGlobalScope.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 WorkerGlobalScope_h
28 #define WorkerGlobalScope_h
29
30 #include "ContentSecurityPolicy.h"
31 #include "EventListener.h"
32 #include "EventNames.h"
33 #include "EventTarget.h"
34 #include "GroupSettings.h"
35 #include "ScriptExecutionContext.h"
36 #include "WorkerEventQueue.h"
37 #include "WorkerScriptController.h"
38 #include <wtf/Assertions.h>
39 #include <wtf/HashMap.h>
40 #include <wtf/OwnPtr.h>
41 #include <wtf/PassRefPtr.h>
42 #include <wtf/RefCounted.h>
43 #include <wtf/RefPtr.h>
44 #include <wtf/text/AtomicStringHash.h>
45
46 namespace WebCore {
47
48     class Blob;
49     class ScheduledAction;
50     class WorkerInspectorController;
51     class WorkerLocation;
52     class WorkerNavigator;
53     class WorkerThread;
54
55     class WorkerGlobalScope : public RefCounted<WorkerGlobalScope>, public ScriptExecutionContext, public EventTargetWithInlineData {
56     public:
57         virtual ~WorkerGlobalScope();
58
59         virtual bool isWorkerGlobalScope() const override { return true; }
60
61         virtual ScriptExecutionContext* scriptExecutionContext() const override final { return const_cast<WorkerGlobalScope*>(this); }
62
63         virtual bool isSharedWorkerGlobalScope() const { return false; }
64         virtual bool isDedicatedWorkerGlobalScope() const { return false; }
65
66         virtual const URL& url() const override final { return m_url; }
67         virtual URL completeURL(const String&) const override final;
68
69         const GroupSettings* groupSettings() { return m_groupSettings.get(); }
70         virtual String userAgent(const URL&) const override;
71
72         virtual void disableEval(const String& errorMessage) override;
73
74         WorkerScriptController* script() { return m_script.get(); }
75         void clearScript() { m_script.clear(); }
76
77         WorkerThread& thread() const { return m_thread; }
78
79         bool hasPendingActivity() const;
80
81         virtual void postTask(PassOwnPtr<Task>) override; // Executes the task on context's thread asynchronously.
82
83         // WorkerGlobalScope
84         WorkerGlobalScope* self() { return this; }
85         WorkerLocation* location() const;
86         void close();
87
88         DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
89         DEFINE_ATTRIBUTE_EVENT_LISTENER(offline);
90         DEFINE_ATTRIBUTE_EVENT_LISTENER(online);
91
92         // WorkerUtils
93         virtual void importScripts(const Vector<String>& urls, ExceptionCode&);
94         WorkerNavigator* navigator() const;
95
96         // Timers
97         int setTimeout(PassOwnPtr<ScheduledAction>, int timeout);
98         void clearTimeout(int timeoutId);
99         int setInterval(PassOwnPtr<ScheduledAction>, int timeout);
100         void clearInterval(int timeoutId);
101
102         virtual bool isContextThread() const override;
103         virtual bool isJSExecutionForbidden() const override;
104
105 #if ENABLE(INSPECTOR)
106         WorkerInspectorController& workerInspectorController() { return *m_workerInspectorController; }
107 #endif
108         // These methods are used for GC marking. See JSWorkerGlobalScope::visitChildrenVirtual(SlotVisitor&) in
109         // JSWorkerGlobalScopeCustom.cpp.
110         WorkerNavigator* optionalNavigator() const { return m_navigator.get(); }
111         WorkerLocation* optionalLocation() const { return m_location.get(); }
112
113         using RefCounted<WorkerGlobalScope>::ref;
114         using RefCounted<WorkerGlobalScope>::deref;
115
116         bool isClosing() { return m_closing; }
117
118         // An observer interface to be notified when the worker thread is getting stopped.
119         class Observer {
120             WTF_MAKE_NONCOPYABLE(Observer);
121         public:
122             Observer(WorkerGlobalScope*);
123             virtual ~Observer();
124             virtual void notifyStop() = 0;
125             void stopObserving();
126         private:
127             WorkerGlobalScope* m_context;
128         };
129         friend class Observer;
130         void registerObserver(Observer*);
131         void unregisterObserver(Observer*);
132         void notifyObserversOfStop();
133
134         virtual SecurityOrigin* topOrigin() const override { return m_topOrigin.get(); }
135
136         virtual void addConsoleMessage(MessageSource, MessageLevel, const String& message, unsigned long requestIdentifier = 0) override;
137
138 #if ENABLE(SUBTLE_CRYPTO)
139         virtual bool wrapCryptoKey(const Vector<uint8_t>& key, Vector<uint8_t>& wrappedKey) override;
140         virtual bool unwrapCryptoKey(const Vector<uint8_t>& wrappedKey, Vector<uint8_t>& key) override;
141 #endif
142
143     protected:
144         WorkerGlobalScope(const URL&, const String& userAgent, std::unique_ptr<GroupSettings>, WorkerThread&, PassRefPtr<SecurityOrigin> topOrigin);
145         void applyContentSecurityPolicyFromString(const String& contentSecurityPolicy, ContentSecurityPolicy::HeaderType);
146
147         virtual void logExceptionToConsole(const String& errorMessage, const String& sourceURL, int lineNumber, int columnNumber, PassRefPtr<Inspector::ScriptCallStack>) override;
148         void addMessageToWorkerConsole(MessageSource, MessageLevel, const String& message, const String& sourceURL, unsigned lineNumber, unsigned columnNumber, PassRefPtr<Inspector::ScriptCallStack>, JSC::ExecState* = 0, unsigned long requestIdentifier = 0);
149
150     private:
151         virtual void refScriptExecutionContext() override { ref(); }
152         virtual void derefScriptExecutionContext() override { deref(); }
153
154         virtual void refEventTarget() override final { ref(); }
155         virtual void derefEventTarget() override final { deref(); }
156
157         virtual void addMessage(MessageSource, MessageLevel, const String& message, const String& sourceURL, unsigned lineNumber, unsigned columnNumber, PassRefPtr<Inspector::ScriptCallStack>, JSC::ExecState* = 0, unsigned long requestIdentifier = 0) override;
158
159         virtual EventTarget* errorEventTarget() override;
160
161         virtual WorkerEventQueue& eventQueue() const override final;
162
163         URL m_url;
164         String m_userAgent;
165         std::unique_ptr<GroupSettings> m_groupSettings;
166
167         mutable RefPtr<WorkerLocation> m_location;
168         mutable RefPtr<WorkerNavigator> m_navigator;
169
170         OwnPtr<WorkerScriptController> m_script;
171         WorkerThread& m_thread;
172
173 #if ENABLE(INSPECTOR)
174         const std::unique_ptr<WorkerInspectorController> m_workerInspectorController;
175 #endif
176         bool m_closing;
177
178         HashSet<Observer*> m_workerObservers;
179
180         mutable WorkerEventQueue m_eventQueue;
181
182         RefPtr<SecurityOrigin> m_topOrigin;
183     };
184
185 SCRIPT_EXECUTION_CONTEXT_TYPE_CASTS(WorkerGlobalScope)
186
187 } // namespace WebCore
188
189 #endif // WorkerGlobalScope_h