3c46b277065a1c2005f41a992229b39012485fa6
[WebKit-https.git] / Source / WebCore / workers / service / context / ServiceWorkerThread.cpp
1 /*
2  * Copyright (C) 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. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "ServiceWorkerThread.h"
28
29 #if ENABLE(SERVICE_WORKER)
30
31 #include "ContentSecurityPolicyResponseHeaders.h"
32 #include "SecurityOrigin.h"
33 #include "ServiceWorkerGlobalScope.h"
34 #include "WorkerLoaderProxy.h"
35 #include "WorkerObjectProxy.h"
36 #include <pal/SessionID.h>
37 #include <runtime/RuntimeFlags.h>
38 #include <wtf/NeverDestroyed.h>
39
40 using namespace PAL;
41
42 namespace WebCore {
43
44 class ServiceWorkerThreadProxy : public WorkerLoaderProxy, public WorkerObjectProxy {
45 public:
46     static ServiceWorkerThreadProxy& sharedDummyProxy()
47     {
48         static NeverDestroyed<ServiceWorkerThreadProxy> proxy;
49         return proxy;
50     }
51
52 private:
53     void postTaskToLoader(ScriptExecutionContext::Task&&) final { };
54     bool postTaskForModeToWorkerGlobalScope(ScriptExecutionContext::Task&&, const String&) final { return false; };
55     void postExceptionToWorkerObject(const String&, int, int, const String&) final { };
56     void postMessageToPageInspector(const String&) final { };
57     void workerGlobalScopeDestroyed() final { };
58     void postMessageToWorkerObject(Ref<SerializedScriptValue>&&, std::unique_ptr<MessagePortChannelArray>&&) final { };
59     void confirmMessageFromWorkerObject(bool) final { };
60     void reportPendingActivity(bool) final { };
61 };
62
63 // FIXME: Use a valid WorkerLoaderProxy
64 // FIXME: Use a valid WorkerReportingProxy
65 // FIXME: Use a valid WorkerObjectProxy
66 // FIXME: Use a valid IDBConnection
67 // FIXME: Use a valid SocketProvider
68 // FIXME: Use a valid user agent
69 // FIXME: Use valid runtime flags
70
71 ServiceWorkerThread::ServiceWorkerThread(uint64_t serverConnectionIdentifier, const ServiceWorkerContextData& data, PAL::SessionID)
72     : WorkerThread(data.scriptURL, data.workerID, ASCIILiteral("WorkerUserAgent"), data.script, ServiceWorkerThreadProxy::sharedDummyProxy(), ServiceWorkerThreadProxy::sharedDummyProxy(), WorkerThreadStartMode::Normal, ContentSecurityPolicyResponseHeaders { }, false, SecurityOrigin::create(data.scriptURL).get(), MonotonicTime::now(), nullptr, nullptr, JSC::RuntimeFlags::createAllEnabled(), SessionID::defaultSessionID())
73     , m_serverConnectionIdentifier(serverConnectionIdentifier)
74     , m_data(data.isolatedCopy())
75     , m_workerObjectProxy(ServiceWorkerThreadProxy::sharedDummyProxy())
76 {
77 }
78
79 ServiceWorkerThread::~ServiceWorkerThread() = default;
80
81 Ref<WorkerGlobalScope> ServiceWorkerThread::createWorkerGlobalScope(const URL& url, const String& identifier, const String& userAgent, const ContentSecurityPolicyResponseHeaders&, bool shouldBypassMainWorldContentSecurityPolicy, Ref<SecurityOrigin>&& topOrigin, MonotonicTime timeOrigin, PAL::SessionID sessionID)
82 {
83     return ServiceWorkerGlobalScope::create(m_serverConnectionIdentifier, m_data, url, identifier, userAgent, *this, shouldBypassMainWorldContentSecurityPolicy, WTFMove(topOrigin), timeOrigin, idbConnectionProxy(), socketProvider(), sessionID);
84 }
85
86 void ServiceWorkerThread::runEventLoop()
87 {
88     // FIXME: There will be ServiceWorker specific things to do here.
89     WorkerThread::runEventLoop();
90 }
91
92 } // namespace WebCore
93
94 #endif // ENABLE(SERVICE_WORKER)