1a89f2a5c89fab7f30e056b70ee7952662bd4482
[WebKit-https.git] / Source / WebCore / workers / WorkerMessagingProxy.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 "WorkerGlobalScopeProxy.h"
29 #include "WorkerLoaderProxy.h"
30 #include "WorkerObjectProxy.h"
31
32 namespace WebCore {
33
34 class DedicatedWorkerThread;
35 class WorkerInspectorProxy;
36
37 class WorkerMessagingProxy final : public WorkerGlobalScopeProxy, public WorkerObjectProxy, public WorkerLoaderProxy {
38     WTF_MAKE_FAST_ALLOCATED;
39 public:
40     explicit WorkerMessagingProxy(Worker&);
41
42 private:
43     virtual ~WorkerMessagingProxy();
44
45     // Implementations of WorkerGlobalScopeProxy.
46     // (Only use these functions in the worker object thread.)
47     void startWorkerGlobalScope(const URL& scriptURL, const String& userAgent, const String& sourceCode, const ContentSecurityPolicyResponseHeaders&, bool shouldBypassMainWorldContentSecurityPolicy, JSC::RuntimeFlags) final;
48     void terminateWorkerGlobalScope() final;
49     void postMessageToWorkerGlobalScope(RefPtr<SerializedScriptValue>&&, std::unique_ptr<MessagePortChannelArray>) final;
50     bool hasPendingActivity() const final;
51     void workerObjectDestroyed() final;
52     void notifyNetworkStateChange(bool isOnline) final;
53
54     // Implementations of WorkerObjectProxy.
55     // (Only use these functions in the worker context thread.)
56     void postMessageToWorkerObject(RefPtr<SerializedScriptValue>&&, std::unique_ptr<MessagePortChannelArray>) final;
57     void postExceptionToWorkerObject(const String& errorMessage, int lineNumber, int columnNumber, const String& sourceURL) final;
58     void postMessageToPageInspector(const String&) final;
59     void confirmMessageFromWorkerObject(bool hasPendingActivity) final;
60     void reportPendingActivity(bool hasPendingActivity) final;
61     void workerGlobalScopeClosed() final;
62     void workerGlobalScopeDestroyed() final;
63
64     // Implementation of WorkerLoaderProxy.
65     // These functions are called on different threads to schedule loading
66     // requests and to send callbacks back to WorkerGlobalScope.
67     void postTaskToLoader(ScriptExecutionContext::Task&&) final;
68     bool postTaskForModeToWorkerGlobalScope(ScriptExecutionContext::Task&&, const String& mode) final;
69
70     void workerThreadCreated(DedicatedWorkerThread&);
71
72     // Only use this method on the worker object thread.
73     bool askedToTerminate() const { return m_askedToTerminate; }
74
75     void workerGlobalScopeDestroyedInternal();
76     void reportPendingActivityInternal(bool confirmingMessage, bool hasPendingActivity);
77     Worker* workerObject() const { return m_workerObject; }
78
79     RefPtr<ScriptExecutionContext> m_scriptExecutionContext;
80     std::unique_ptr<WorkerInspectorProxy> m_inspectorProxy;
81     Worker* m_workerObject;
82     bool m_mayBeDestroyed { false };
83     RefPtr<DedicatedWorkerThread> m_workerThread;
84
85     unsigned m_unconfirmedMessageCount { 0 }; // Unconfirmed messages from worker object to worker thread.
86     bool m_workerThreadHadPendingActivity { false }; // The latest confirmation from worker thread reported that it was still active.
87
88     bool m_askedToTerminate { false };
89
90     Vector<std::unique_ptr<ScriptExecutionContext::Task>> m_queuedEarlyTasks; // Tasks are queued here until there's a thread object created.
91 };
92
93 } // namespace WebCore