Shrink more enum classes
[WebKit-https.git] / Source / WebCore / workers / WorkerThread.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 #pragma once
27
28 #include "WorkerRunLoop.h"
29 #include <JavaScriptCore/RuntimeFlags.h>
30 #include <memory>
31 #include <wtf/Forward.h>
32 #include <wtf/Function.h>
33 #include <wtf/RefCounted.h>
34
35 namespace PAL {
36 class SessionID;
37 }
38
39 namespace WebCore {
40
41 class ContentSecurityPolicyResponseHeaders;
42 class URL;
43 class NotificationClient;
44 class SecurityOrigin;
45 class SocketProvider;
46 class WorkerGlobalScope;
47 class WorkerLoaderProxy;
48 class WorkerDebuggerProxy;
49 class WorkerReportingProxy;
50
51 enum class WorkerThreadStartMode {
52     Normal,
53     WaitForInspector,
54 };
55
56 namespace IDBClient {
57 class IDBConnectionProxy;
58 }
59
60 struct WorkerThreadStartupData;
61
62 class WorkerThread : public ThreadSafeRefCounted<WorkerThread> {
63 public:
64     virtual ~WorkerThread();
65
66     WEBCORE_EXPORT void start(WTF::Function<void(const String&)>&& evaluateCallback);
67     void stop(WTF::Function<void()>&& terminatedCallback);
68
69     Thread* thread() const { return m_thread.get(); }
70     WorkerRunLoop& runLoop() { return m_runLoop; }
71     WorkerLoaderProxy& workerLoaderProxy() const { return m_workerLoaderProxy; }
72     WorkerDebuggerProxy& workerDebuggerProxy() const { return m_workerDebuggerProxy; }
73     WorkerReportingProxy& workerReportingProxy() const { return m_workerReportingProxy; }
74
75     // Number of active worker threads.
76     WEBCORE_EXPORT static unsigned workerThreadCount();
77     static void releaseFastMallocFreeMemoryInAllThreads();
78
79 #if ENABLE(NOTIFICATIONS)
80     NotificationClient* getNotificationClient() { return m_notificationClient; }
81     void setNotificationClient(NotificationClient* client) { m_notificationClient = client; }
82 #endif
83
84     void startRunningDebuggerTasks();
85     void stopRunningDebuggerTasks();
86     
87     JSC::RuntimeFlags runtimeFlags() const { return m_runtimeFlags; }
88
89 protected:
90     WorkerThread(const URL&, const String& name, const String& identifier, const String& userAgent, bool isOnline, const String& sourceCode, WorkerLoaderProxy&, WorkerDebuggerProxy&, WorkerReportingProxy&, WorkerThreadStartMode, const ContentSecurityPolicyResponseHeaders&, bool shouldBypassMainWorldContentSecurityPolicy, const SecurityOrigin& topOrigin, MonotonicTime timeOrigin, IDBClient::IDBConnectionProxy*, SocketProvider*, JSC::RuntimeFlags, PAL::SessionID);
91
92     // Factory method for creating a new worker context for the thread.
93     virtual Ref<WorkerGlobalScope> createWorkerGlobalScope(const URL&, Ref<SecurityOrigin>&&, const String& name, const String& identifier, const String& userAgent, bool isOnline, const ContentSecurityPolicyResponseHeaders&, bool shouldBypassMainWorldContentSecurityPolicy, Ref<SecurityOrigin>&& topOrigin, MonotonicTime timeOrigin, PAL::SessionID) = 0;
94
95     // Executes the event loop for the worker thread. Derived classes can override to perform actions before/after entering the event loop.
96     virtual void runEventLoop();
97
98     WorkerGlobalScope* workerGlobalScope() { return m_workerGlobalScope.get(); }
99
100     IDBClient::IDBConnectionProxy* idbConnectionProxy();
101     SocketProvider* socketProvider();
102
103 private:
104     void workerThread();
105     virtual bool isServiceWorkerThread() const { return false; }
106
107     RefPtr<Thread> m_thread;
108     WorkerRunLoop m_runLoop;
109     WorkerLoaderProxy& m_workerLoaderProxy;
110     WorkerDebuggerProxy& m_workerDebuggerProxy;
111     WorkerReportingProxy& m_workerReportingProxy;
112     JSC::RuntimeFlags m_runtimeFlags;
113     bool m_pausedForDebugger { false };
114
115     RefPtr<WorkerGlobalScope> m_workerGlobalScope;
116     Lock m_threadCreationAndWorkerGlobalScopeMutex;
117
118     std::unique_ptr<WorkerThreadStartupData> m_startupData;
119     
120     WTF::Function<void(const String&)> m_evaluateCallback;
121
122 #if ENABLE(NOTIFICATIONS)
123     NotificationClient* m_notificationClient { nullptr };
124 #endif
125
126 #if ENABLE(INDEXED_DATABASE)
127     RefPtr<IDBClient::IDBConnectionProxy> m_idbConnectionProxy;
128 #endif
129     RefPtr<SocketProvider> m_socketProvider;
130
131     WTF::Function<void()> m_stoppedCallback;
132 };
133
134 } // namespace WebCore