ServiceWorker registration should store any script fetched through importScripts
[WebKit-https.git] / Source / WebCore / workers / service / server / SWServerWorker.h
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 #pragma once
27
28 #if ENABLE(SERVICE_WORKER)
29
30 #include "ContentSecurityPolicyResponseHeaders.h"
31 #include "ServiceWorkerClientData.h"
32 #include "ServiceWorkerContextData.h"
33 #include "ServiceWorkerData.h"
34 #include "ServiceWorkerIdentifier.h"
35 #include "ServiceWorkerRegistrationKey.h"
36 #include "ServiceWorkerTypes.h"
37 #include <wtf/RefCounted.h>
38
39 namespace WebCore {
40
41 struct ClientOrigin;
42 class SWServer;
43 class SWServerRegistration;
44 class SWServerToContextConnection;
45 struct ServiceWorkerClientData;
46 struct ServiceWorkerClientIdentifier;
47 struct ServiceWorkerClientQueryOptions;
48 struct ServiceWorkerContextData;
49 struct ServiceWorkerJobDataIdentifier;
50 enum class WorkerType;
51
52 class SWServerWorker : public RefCounted<SWServerWorker> {
53 public:
54     template <typename... Args> static Ref<SWServerWorker> create(Args&&... args)
55     {
56         return adoptRef(*new SWServerWorker(std::forward<Args>(args)...));
57     }
58     
59     SWServerWorker(const SWServerWorker&) = delete;
60     WEBCORE_EXPORT ~SWServerWorker();
61
62     void terminate();
63
64     WEBCORE_EXPORT void whenActivated(WTF::Function<void(bool)>&&);
65
66     enum class State {
67         Running,
68         Terminating,
69         NotRunning,
70     };
71     bool isRunning() const { return m_state == State::Running; }
72     bool isTerminating() const { return m_state == State::Terminating; }
73     void setState(State);
74
75     SWServer& server() { return m_server; }
76     const ServiceWorkerRegistrationKey& registrationKey() const { return m_registrationKey; }
77     const URL& scriptURL() const { return m_data.scriptURL; }
78     const String& script() const { return m_script; }
79     WorkerType type() const { return m_data.type; }
80
81     ServiceWorkerIdentifier identifier() const { return m_data.identifier; }
82
83     ServiceWorkerState state() const { return m_data.state; }
84     void setState(ServiceWorkerState);
85
86     bool hasPendingEvents() const { return m_hasPendingEvents; }
87     void setHasPendingEvents(bool);
88
89     void scriptContextFailedToStart(const std::optional<ServiceWorkerJobDataIdentifier>&, const String& message);
90     void scriptContextStarted(const std::optional<ServiceWorkerJobDataIdentifier>&);
91     void didFinishInstall(const std::optional<ServiceWorkerJobDataIdentifier>&, bool wasSuccessful);
92     void didFinishActivation();
93     void contextTerminated();
94     WEBCORE_EXPORT std::optional<ServiceWorkerClientData> findClientByIdentifier(const ServiceWorkerClientIdentifier&) const;
95     void matchAll(const ServiceWorkerClientQueryOptions&, const ServiceWorkerClientsMatchAllCallback&);
96     void claim();
97     void setScriptResource(URL&&, ServiceWorkerContextData::ImportedScript&&);
98
99     void skipWaiting();
100     bool isSkipWaitingFlagSet() const { return m_isSkipWaitingFlagSet; }
101
102     WEBCORE_EXPORT static SWServerWorker* existingWorkerForIdentifier(ServiceWorkerIdentifier);
103     static HashMap<ServiceWorkerIdentifier, SWServerWorker*>& allWorkers();
104
105     const ServiceWorkerData& data() const { return m_data; }
106     ServiceWorkerContextData contextData() const;
107
108     const ClientOrigin& origin() const;
109     WEBCORE_EXPORT const SecurityOriginData& securityOrigin() const;
110
111     WEBCORE_EXPORT SWServerToContextConnection* contextConnection();
112
113 private:
114     SWServerWorker(SWServer&, SWServerRegistration&, const URL&, const String& script, const ContentSecurityPolicyResponseHeaders&,  WorkerType, ServiceWorkerIdentifier, HashMap<URL, ServiceWorkerContextData::ImportedScript>&&);
115
116     void callWhenActivatedHandler(bool success);
117
118     SWServer& m_server;
119     ServiceWorkerRegistrationKey m_registrationKey;
120     ServiceWorkerData m_data;
121     String m_script;
122     ContentSecurityPolicyResponseHeaders m_contentSecurityPolicy;
123     bool m_hasPendingEvents { false };
124     State m_state { State::NotRunning };
125     mutable std::optional<ClientOrigin> m_origin;
126     bool m_isSkipWaitingFlagSet { false };
127     Vector<Function<void(bool)>> m_whenActivatedHandlers;
128     HashMap<URL, ServiceWorkerContextData::ImportedScript> m_scriptResourceMap;
129 };
130
131 } // namespace WebCore
132
133 #endif // ENABLE(SERVICE_WORKER)