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