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