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