[JSC] BuiltinNames' HashMap should be small
[WebKit.git] / Source / WebCore / workers / WorkerGlobalScope.h
1 /*
2  * Copyright (C) 2008-2017 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 #pragma once
28
29 #include "Base64Utilities.h"
30 #include "CacheStorageConnection.h"
31 #include "EventTarget.h"
32 #include "ImageBitmap.h"
33 #include "ScriptExecutionContext.h"
34 #include "Supplementable.h"
35 #include <wtf/URL.h>
36 #include "WorkerCacheStorageConnection.h"
37 #include "WorkerMessagePortChannelProvider.h"
38 #include "WorkerScriptController.h"
39 #include <JavaScriptCore/ConsoleMessage.h>
40 #include <memory>
41
42 namespace WebCore {
43
44 class CSSValuePool;
45 class ContentSecurityPolicyResponseHeaders;
46 class Crypto;
47 class EventLoopTaskGroup;
48 class Performance;
49 class ScheduledAction;
50 class WorkerEventLoop;
51 class WorkerInspectorController;
52 class WorkerLocation;
53 class WorkerNavigator;
54 class WorkerSWClientConnection;
55 class WorkerThread;
56 struct WorkerParameters;
57
58 namespace IDBClient {
59 class IDBConnectionProxy;
60 }
61
62 class WorkerGlobalScope : public RefCounted<WorkerGlobalScope>, public Supplementable<WorkerGlobalScope>, public ScriptExecutionContext, public EventTargetWithInlineData, public Base64Utilities {
63     WTF_MAKE_ISO_ALLOCATED(WorkerGlobalScope);
64 public:
65     virtual ~WorkerGlobalScope();
66
67     virtual bool isDedicatedWorkerGlobalScope() const { return false; }
68     virtual bool isServiceWorkerGlobalScope() const { return false; }
69
70     EventLoopTaskGroup& eventLoop() final;
71
72     const URL& url() const final { return m_url; }
73     String origin() const;
74     const String& identifier() const { return m_identifier; }
75
76 #if ENABLE(INDEXED_DATABASE)
77     IDBClient::IDBConnectionProxy* idbConnectionProxy() final;
78     void suspend();
79     void resume();
80 #endif
81
82     WorkerCacheStorageConnection& cacheStorageConnection();
83     MessagePortChannelProvider& messagePortChannelProvider();
84 #if ENABLE(SERVICE_WORKER)
85     WorkerSWClientConnection& swClientConnection();
86 #endif
87
88     WorkerScriptController* script() { return m_script.get(); }
89     void clearScript() { m_script = nullptr; }
90
91     WorkerInspectorController& inspectorController() const { return *m_inspectorController; }
92
93     WorkerThread& thread() const { return m_thread; }
94
95     using ScriptExecutionContext::hasPendingActivity;
96
97     void postTask(Task&&) final; // Executes the task on context's thread asynchronously.
98
99     WorkerGlobalScope& self() { return *this; }
100     WorkerLocation& location() const;
101     void close();
102
103     virtual ExceptionOr<void> importScripts(const Vector<String>& urls);
104     WorkerNavigator& navigator();
105
106     void setIsOnline(bool);
107
108     ExceptionOr<int> setTimeout(JSC::JSGlobalObject&, std::unique_ptr<ScheduledAction>, int timeout, Vector<JSC::Strong<JSC::Unknown>>&& arguments);
109     void clearTimeout(int timeoutId);
110     ExceptionOr<int> setInterval(JSC::JSGlobalObject&, std::unique_ptr<ScheduledAction>, int timeout, Vector<JSC::Strong<JSC::Unknown>>&& arguments);
111     void clearInterval(int timeoutId);
112
113     bool isContextThread() const final;
114     bool isSecureContext() const final;
115
116     WorkerNavigator* optionalNavigator() const { return m_navigator.get(); }
117     WorkerLocation* optionalLocation() const { return m_location.get(); }
118
119     using RefCounted::ref;
120     using RefCounted::deref;
121
122     bool isClosing() { return m_closing; }
123
124     void addConsoleMessage(std::unique_ptr<Inspector::ConsoleMessage>&&) final;
125
126     SecurityOrigin& topOrigin() const final { return m_topOrigin.get(); }
127
128     Crypto& crypto();
129     Performance& performance() const;
130
131     void prepareForTermination();
132
133     void removeAllEventListeners() final;
134
135     void createImageBitmap(ImageBitmap::Source&&, ImageBitmapOptions&&, ImageBitmap::Promise&&);
136     void createImageBitmap(ImageBitmap::Source&&, int sx, int sy, int sw, int sh, ImageBitmapOptions&&, ImageBitmap::Promise&&);
137
138     unsigned long createUniqueIdentifier() { return m_uniqueIdentifier++; }
139
140     CSSValuePool& cssValuePool();
141
142     ReferrerPolicy referrerPolicy() const final;
143
144 protected:
145     WorkerGlobalScope(const WorkerParameters&, Ref<SecurityOrigin>&&, WorkerThread&, Ref<SecurityOrigin>&& topOrigin, IDBClient::IDBConnectionProxy*, SocketProvider*);
146
147     void applyContentSecurityPolicyResponseHeaders(const ContentSecurityPolicyResponseHeaders&);
148
149 private:
150     void refScriptExecutionContext() final { ref(); }
151     void derefScriptExecutionContext() final { deref(); }
152
153     void refEventTarget() final { ref(); }
154     void derefEventTarget() final { deref(); }
155
156     void logExceptionToConsole(const String& errorMessage, const String& sourceURL, int lineNumber, int columnNumber, RefPtr<Inspector::ScriptCallStack>&&) final;
157
158     // The following addMessage and addConsoleMessage functions are deprecated.
159     // Callers should try to create the ConsoleMessage themselves.
160     void addMessage(MessageSource, MessageLevel, const String& message, const String& sourceURL, unsigned lineNumber, unsigned columnNumber, RefPtr<Inspector::ScriptCallStack>&&, JSC::JSGlobalObject*, unsigned long requestIdentifier) final;
161     void addConsoleMessage(MessageSource, MessageLevel, const String& message, unsigned long requestIdentifier) final;
162
163     bool isWorkerGlobalScope() const final { return true; }
164
165     ScriptExecutionContext* scriptExecutionContext() const final { return const_cast<WorkerGlobalScope*>(this); }
166     URL completeURL(const String&, ForceUTF8 = ForceUTF8::No) const final;
167     String userAgent(const URL&) const final;
168     void disableEval(const String& errorMessage) final;
169     void disableWebAssembly(const String& errorMessage) final;
170     EventTarget* errorEventTarget() final;
171     String resourceRequestIdentifier() const final { return m_identifier; }
172     SocketProvider* socketProvider() final;
173
174     bool shouldBypassMainWorldContentSecurityPolicy() const final { return m_shouldBypassMainWorldContentSecurityPolicy; }
175     bool isJSExecutionForbidden() const final;
176
177 #if ENABLE(WEB_CRYPTO)
178     bool wrapCryptoKey(const Vector<uint8_t>& key, Vector<uint8_t>& wrappedKey) final;
179     bool unwrapCryptoKey(const Vector<uint8_t>& wrappedKey, Vector<uint8_t>& key) final;
180 #endif
181
182 #if ENABLE(INDEXED_DATABASE)
183     void stopIndexedDatabase();
184 #endif
185
186     URL m_url;
187     String m_identifier;
188     String m_userAgent;
189
190     mutable RefPtr<WorkerLocation> m_location;
191     mutable RefPtr<WorkerNavigator> m_navigator;
192
193     WorkerThread& m_thread;
194     std::unique_ptr<WorkerScriptController> m_script;
195     std::unique_ptr<WorkerInspectorController> m_inspectorController;
196
197     bool m_closing { false };
198     bool m_isOnline;
199     bool m_shouldBypassMainWorldContentSecurityPolicy;
200
201     RefPtr<WorkerEventLoop> m_eventLoop;
202     std::unique_ptr<EventLoopTaskGroup> m_defaultTaskGroup;
203
204     Ref<SecurityOrigin> m_topOrigin;
205
206 #if ENABLE(INDEXED_DATABASE)
207     RefPtr<IDBClient::IDBConnectionProxy> m_connectionProxy;
208 #endif
209
210     RefPtr<SocketProvider> m_socketProvider;
211
212     RefPtr<Performance> m_performance;
213     mutable RefPtr<Crypto> m_crypto;
214
215     RefPtr<WorkerCacheStorageConnection> m_cacheStorageConnection;
216     std::unique_ptr<WorkerMessagePortChannelProvider> m_messagePortChannelProvider;
217     unsigned long m_uniqueIdentifier { 1 };
218 #if ENABLE(SERVICE_WORKER)
219     RefPtr<WorkerSWClientConnection> m_swClientConnection;
220 #endif
221     std::unique_ptr<CSSValuePool> m_cssValuePool;
222     ReferrerPolicy m_referrerPolicy;
223 };
224
225 } // namespace WebCore
226
227 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::WorkerGlobalScope)
228     static bool isType(const WebCore::ScriptExecutionContext& context) { return context.isWorkerGlobalScope(); }
229 SPECIALIZE_TYPE_TRAITS_END()