~mmach/netext73/webkit2gtk

« back to all changes in this revision

Viewing changes to Source/WebKit/GPUProcess/GPUProcess.cpp

  • Committer: mmach
  • Date: 2023-06-16 17:21:37 UTC
  • Revision ID: netbit73@gmail.com-20230616172137-2rqx6yr96ga9g3kp
1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) 2019 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 "GPUProcess.h"
 
28
 
 
29
#if ENABLE(GPU_PROCESS)
 
30
 
 
31
#include "ArgumentCoders.h"
 
32
#include "Attachment.h"
 
33
#include "AuxiliaryProcessMessages.h"
 
34
#include "DataReference.h"
 
35
#include "GPUConnectionToWebProcess.h"
 
36
#include "GPUProcessCreationParameters.h"
 
37
#include "GPUProcessSessionParameters.h"
 
38
#include "Logging.h"
 
39
#include "SandboxExtension.h"
 
40
#include "WebPageProxyMessages.h"
 
41
#include "WebProcessPoolMessages.h"
 
42
#include <WebCore/LogInitialization.h>
 
43
#include <WebCore/MockAudioSharedUnit.h>
 
44
#include <wtf/Algorithms.h>
 
45
#include <wtf/CallbackAggregator.h>
 
46
#include <wtf/OptionSet.h>
 
47
#include <wtf/ProcessPrivilege.h>
 
48
#include <wtf/RunLoop.h>
 
49
#include <wtf/UniqueRef.h>
 
50
#include <wtf/text/AtomString.h>
 
51
 
 
52
namespace WebKit {
 
53
using namespace WebCore;
 
54
 
 
55
 
 
56
GPUProcess::GPUProcess(AuxiliaryProcessInitializationParameters&& parameters)
 
57
{
 
58
    initialize(WTFMove(parameters));
 
59
}
 
60
 
 
61
GPUProcess::~GPUProcess()
 
62
{
 
63
}
 
64
 
 
65
void GPUProcess::createGPUConnectionToWebProcess(ProcessIdentifier identifier, PAL::SessionID sessionID, CompletionHandler<void(Optional<IPC::Attachment>&&)>&& completionHandler)
 
66
{
 
67
    auto ipcConnection = createIPCConnectionPair();
 
68
    if (!ipcConnection) {
 
69
        completionHandler({ });
 
70
        return;
 
71
    }
 
72
 
 
73
    auto newConnection = GPUConnectionToWebProcess::create(*this, identifier, ipcConnection->first, sessionID);
 
74
 
 
75
    ASSERT(!m_webProcessConnections.contains(identifier));
 
76
    m_webProcessConnections.add(identifier, WTFMove(newConnection));
 
77
 
 
78
    completionHandler(WTFMove(ipcConnection->second));
 
79
}
 
80
 
 
81
void GPUProcess::removeGPUConnectionToWebProcess(GPUConnectionToWebProcess& connection)
 
82
{
 
83
    ASSERT(m_webProcessConnections.contains(connection.webProcessIdentifier()));
 
84
    m_webProcessConnections.remove(connection.webProcessIdentifier());
 
85
}
 
86
 
 
87
void GPUProcess::connectionToWebProcessClosed(IPC::Connection& connection)
 
88
{
 
89
}
 
90
 
 
91
bool GPUProcess::shouldTerminate()
 
92
{
 
93
    return m_webProcessConnections.isEmpty();
 
94
}
 
95
 
 
96
void GPUProcess::didClose(IPC::Connection&)
 
97
{
 
98
    ASSERT(RunLoop::isMain());
 
99
}
 
100
 
 
101
void GPUProcess::lowMemoryHandler(Critical critical)
 
102
{
 
103
    WTF::releaseFastMallocFreeMemory();
 
104
}
 
105
 
 
106
void GPUProcess::initializeGPUProcess(GPUProcessCreationParameters&& parameters)
 
107
{
 
108
    WTF::Thread::setCurrentThreadIsUserInitiated();
 
109
    AtomString::init();
 
110
 
 
111
#if ENABLE(MEDIA_STREAM)
 
112
    setMockCaptureDevicesEnabled(parameters.useMockCaptureDevices);
 
113
    SandboxExtension::consumePermanently(parameters.cameraSandboxExtensionHandle);
 
114
    SandboxExtension::consumePermanently(parameters.microphoneSandboxExtensionHandle);
 
115
#if PLATFORM(IOS)
 
116
    SandboxExtension::consumePermanently(parameters.tccSandboxExtensionHandle);
 
117
#endif
 
118
#endif
 
119
}
 
120
 
 
121
void GPUProcess::prepareToSuspend(bool isSuspensionImminent, CompletionHandler<void()>&& completionHandler)
 
122
{
 
123
    RELEASE_LOG(ProcessSuspension, "%p - GPUProcess::prepareToSuspend(), isSuspensionImminent: %d", this, isSuspensionImminent);
 
124
 
 
125
    lowMemoryHandler(Critical::Yes);
 
126
}
 
127
 
 
128
void GPUProcess::processDidResume()
 
129
{
 
130
    RELEASE_LOG(ProcessSuspension, "%p - GPUProcess::processDidResume()", this);
 
131
    resume();
 
132
}
 
133
 
 
134
void GPUProcess::resume()
 
135
{
 
136
}
 
137
 
 
138
void GPUProcess::processDidTransitionToForeground()
 
139
{
 
140
}
 
141
 
 
142
void GPUProcess::processDidTransitionToBackground()
 
143
{
 
144
}
 
145
 
 
146
GPUConnectionToWebProcess* GPUProcess::webProcessConnection(ProcessIdentifier identifier) const
 
147
{
 
148
    return m_webProcessConnections.get(identifier);
 
149
}
 
150
 
 
151
void GPUProcess::setMockCaptureDevicesEnabled(bool isEnabled)
 
152
{
 
153
#if ENABLE(MEDIA_STREAM)
 
154
    // FIXME: Enable the audio session check by implementing an AudioSession for the GPUProcess.
 
155
    MockAudioSharedUnit::singleton().setDisableAudioSessionCheck(isEnabled);
 
156
    MockRealtimeMediaSourceCenter::setMockRealtimeMediaSourceCenterEnabled(isEnabled);
 
157
#endif
 
158
}
 
159
 
 
160
void GPUProcess::addSession(PAL::SessionID sessionID, GPUProcessSessionParameters&& parameters)
 
161
{
 
162
    ASSERT(!m_sessions.contains(sessionID));
 
163
    SandboxExtension::consumePermanently(parameters.mediaCacheDirectorySandboxExtensionHandle);
 
164
#if ENABLE(LEGACY_ENCRYPTED_MEDIA)
 
165
    SandboxExtension::consumePermanently(parameters.mediaKeysStorageDirectorySandboxExtensionHandle);
 
166
#endif
 
167
 
 
168
    m_sessions.add(sessionID, GPUSession {
 
169
        WTFMove(parameters.mediaCacheDirectory)
 
170
#if ENABLE(LEGACY_ENCRYPTED_MEDIA)
 
171
        , WTFMove(parameters.mediaKeysStorageDirectory)
 
172
#endif
 
173
    });
 
174
}
 
175
 
 
176
void GPUProcess::removeSession(PAL::SessionID sessionID)
 
177
{
 
178
    ASSERT(m_sessions.contains(sessionID));
 
179
    m_sessions.remove(sessionID);
 
180
}
 
181
 
 
182
const String& GPUProcess::mediaCacheDirectory(PAL::SessionID sessionID) const
 
183
{
 
184
    ASSERT(m_sessions.contains(sessionID));
 
185
    return m_sessions.find(sessionID)->value.mediaCacheDirectory;
 
186
}
 
187
 
 
188
#if ENABLE(LEGACY_ENCRYPTED_MEDIA)
 
189
const String& GPUProcess::mediaKeysStorageDirectory(PAL::SessionID sessionID) const
 
190
{
 
191
    ASSERT(m_sessions.contains(sessionID));
 
192
    return m_sessions.find(sessionID)->value.mediaKeysStorageDirectory;
 
193
}
 
194
#endif
 
195
 
 
196
} // namespace WebKit
 
197
 
 
198
#endif // ENABLE(GPU_PROCESS)