c91909182915ed15838cda88130b5acda6410f11
[WebKit-https.git] / Source / WebKit / Shared / ChildProcess.h
1 /*
2  * Copyright (C) 2010-2018 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 #ifndef ChildProcess_h
27 #define ChildProcess_h
28
29 #include "Connection.h"
30 #include "MessageReceiverMap.h"
31 #include "MessageSender.h"
32 #include <WebCore/Process.h>
33 #include <WebCore/UserActivity.h>
34 #include <wtf/HashMap.h>
35 #include <wtf/RunLoop.h>
36 #include <wtf/text/StringHash.h>
37 #include <wtf/text/WTFString.h>
38
39 namespace WebKit {
40
41 class SandboxInitializationParameters;
42 struct ChildProcessInitializationParameters;
43
44 class ChildProcess : protected IPC::Connection::Client, public IPC::MessageSender {
45     WTF_MAKE_NONCOPYABLE(ChildProcess);
46
47 public:
48     enum class ProcessType : uint8_t {
49         WebContent,
50         Network,
51         Storage,
52         Plugin
53     };
54
55     void initialize(const ChildProcessInitializationParameters&);
56
57     // disable and enable termination of the process. when disableTermination is called, the
58     // process won't terminate unless a corresponding disableTermination call is made.
59     void disableTermination();
60     void enableTermination();
61
62     void addMessageReceiver(IPC::StringReference messageReceiverName, IPC::MessageReceiver&);
63     void addMessageReceiver(IPC::StringReference messageReceiverName, uint64_t destinationID, IPC::MessageReceiver&);
64     void removeMessageReceiver(IPC::StringReference messageReceiverName, uint64_t destinationID);
65     void removeMessageReceiver(IPC::StringReference messageReceiverName);
66     void removeMessageReceiver(IPC::MessageReceiver&);
67
68     void setProcessSuppressionEnabled(bool);
69
70 #if PLATFORM(COCOA)
71     void setApplicationIsDaemon();
72     void launchServicesCheckIn();
73     void setQOS(int latencyQOS, int throughputQOS);
74 #endif
75
76     IPC::Connection* parentProcessConnection() const { return m_connection.get(); }
77
78     IPC::MessageReceiverMap& messageReceiverMap() { return m_messageReceiverMap; }
79
80 protected:
81     explicit ChildProcess();
82     virtual ~ChildProcess();
83
84     void setTerminationTimeout(Seconds seconds) { m_terminationTimeout = seconds; }
85
86     virtual void initializeProcess(const ChildProcessInitializationParameters&);
87     virtual void initializeProcessName(const ChildProcessInitializationParameters&);
88     virtual void initializeSandbox(const ChildProcessInitializationParameters&, SandboxInitializationParameters&);
89     virtual void initializeConnection(IPC::Connection*);
90
91     virtual bool shouldTerminate() = 0;
92     virtual void terminate();
93
94     virtual bool shouldCallExitWhenConnectionIsClosed() const { return true; }
95     virtual void stopRunLoop();
96
97 #if USE(APPKIT)
98     static void stopNSAppRunLoop();
99 #endif
100     
101 #if PLATFORM(MAC) && ENABLE(WEBPROCESS_NSRUNLOOP)
102     static void stopNSRunLoop();
103 #endif
104
105     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
106
107     void registerURLSchemeServiceWorkersCanHandle(const String&) const;
108 #if OS(LINUX)
109     void didReceiveMemoryPressureEvent(bool isCritical);
110 #endif
111
112 private:
113     virtual bool shouldOverrideQuarantine() { return true; }
114
115     // IPC::MessageSender
116     IPC::Connection* messageSenderConnection() override;
117     uint64_t messageSenderDestinationID() override;
118
119     // IPC::Connection::Client.
120     void didReceiveInvalidMessage(IPC::Connection&, IPC::StringReference messageReceiverName, IPC::StringReference messageName) final;
121     void didClose(IPC::Connection&) override;
122
123     void shutDown();
124
125     void terminationTimerFired();
126
127     void platformInitialize();
128     void platformStopRunLoop();
129
130     // The timeout, in seconds, before this process will be terminated if termination
131     // has been enabled. If the timeout is 0 seconds, the process will be terminated immediately.
132     Seconds m_terminationTimeout;
133
134     // A termination counter; when the counter reaches zero, the process will be terminated
135     // after a given period of time.
136     unsigned m_terminationCounter;
137
138     RunLoop::Timer<ChildProcess> m_terminationTimer;
139
140     RefPtr<IPC::Connection> m_connection;
141     IPC::MessageReceiverMap m_messageReceiverMap;
142
143     UserActivity m_processSuppressionDisabled;
144
145 #if PLATFORM(COCOA)
146     OSObjectPtr<xpc_object_t> m_priorityBoostMessage;
147 #endif
148 };
149
150 struct ChildProcessInitializationParameters {
151     String uiProcessName;
152     String clientIdentifier;
153     std::optional<WebCore::ProcessIdentifier> processIdentifier;
154     IPC::Connection::Identifier connectionIdentifier;
155     HashMap<String, String> extraInitializationData;
156     ChildProcess::ProcessType processType;
157 #if PLATFORM(COCOA)
158     OSObjectPtr<xpc_object_t> priorityBoostMessage;
159 #endif
160 };
161
162 } // namespace WebKit
163
164 #endif // ChildProcess_h