Diff
Modified: trunk/Source/WebKit/Platform/spi/ios/RunningBoardServicesSPI.h (294404 => 294405)
--- trunk/Source/WebKit/Platform/spi/ios/RunningBoardServicesSPI.h 2022-05-18 17:28:13 UTC (rev 294404)
+++ trunk/Source/WebKit/Platform/spi/ios/RunningBoardServicesSPI.h 2022-05-18 17:51:25 UTC (rev 294405)
@@ -131,14 +131,24 @@
@interface RBSProcessMonitor : NSObject <NSCopying>
+ (instancetype)monitorWithConfiguration:(NS_NOESCAPE RBSProcessMonitorConfigurator)block;
+- (void)invalidate;
@end
@interface RBSProcessPredicate : NSObject <RBSProcessMatching>
+ (RBSProcessPredicate *)predicateMatchingHandle:(RBSProcessHandle *)process;
+typedef NS_OPTIONS(NSUInteger, RBSProcessStateValues) {
+ RBSProcessStateValueNone = 0,
+ RBSProcessStateValueTaskState = (1 << 0),
+ RBSProcessStateValueTags = (1 << 1),
+ RBSProcessStateValueTerminationResistance = (1 << 2),
+ RBSProcessStateValueLegacyAssertions = (1 << 3),
+ RBSProcessStateValueModernAssertions = (1 << 4),
+};
@end
@interface RBSProcessStateDescriptor : NSObject <NSCopying>
+ (instancetype)descriptor;
+@property (nonatomic, readwrite, assign) RBSProcessStateValues values;
@property (nonatomic, readwrite, copy, nullable) NSArray<NSString *> *endowmentNamespaces;
@end
Modified: trunk/Source/WebKit/SourcesCocoa.txt (294404 => 294405)
--- trunk/Source/WebKit/SourcesCocoa.txt 2022-05-18 17:28:13 UTC (rev 294404)
+++ trunk/Source/WebKit/SourcesCocoa.txt 2022-05-18 17:51:25 UTC (rev 294405)
@@ -491,6 +491,7 @@
UIProcess/ios/InputViewUpdateDeferrer.mm
UIProcess/ios/PageClientImplIOS.mm
UIProcess/ios/ProcessAssertionIOS.mm
+UIProcess/ios/ProcessStateMonitor.mm
UIProcess/ios/SmartMagnificationController.mm
UIProcess/ios/TextCheckerIOS.mm
UIProcess/ios/ViewGestureControllerIOS.mm
Modified: trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm (294404 => 294405)
--- trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm 2022-05-18 17:28:13 UTC (rev 294404)
+++ trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm 2022-05-18 17:51:25 UTC (rev 294405)
@@ -38,6 +38,7 @@
#import "NetworkProcessMessages.h"
#import "NetworkProcessProxy.h"
#import "PreferenceObserver.h"
+#import "ProcessThrottler.h"
#import "SandboxUtilities.h"
#import "TextChecker.h"
#import "UserInterfaceIdiom.h"
@@ -1051,6 +1052,15 @@
for (auto& processPool : allProcessPools())
processPool->applicationIsAboutToSuspend();
}
+
+void WebProcessPool::setProcessesShouldSuspend(bool shouldSuspend)
+{
+ WEBPROCESSPOOL_RELEASE_LOG(ProcessSuspension, "setProcessesShouldSuspend: Processes should suspend %d", shouldSuspend);
+
+ for (auto& process : m_processes)
+ process->throttler().setAllowsActivities(!shouldSuspend);
+}
+
#endif
void WebProcessPool::initializeClassesForParameterCoding()
Modified: trunk/Source/WebKit/UIProcess/ProcessThrottler.cpp (294404 => 294405)
--- trunk/Source/WebKit/UIProcess/ProcessThrottler.cpp 2022-05-18 17:28:13 UTC (rev 294404)
+++ trunk/Source/WebKit/UIProcess/ProcessThrottler.cpp 2022-05-18 17:51:25 UTC (rev 294405)
@@ -52,16 +52,30 @@
invalidateAllActivities();
}
-void ProcessThrottler::addActivity(ForegroundActivity& activity)
+bool ProcessThrottler::addActivity(ForegroundActivity& activity)
{
+ if (!m_allowsActivities) {
+ if (!activity.isQuietActivity())
+ PROCESSTHROTTLER_RELEASE_LOG("addActivity: not allowed to add foreground activity %s", activity.name().characters());
+ return false;
+ }
+
m_foregroundActivities.add(&activity);
updateAssertionIfNeeded();
+ return true;
}
-void ProcessThrottler::addActivity(BackgroundActivity& activity)
+bool ProcessThrottler::addActivity(BackgroundActivity& activity)
{
+ if (!m_allowsActivities) {
+ if (!activity.isQuietActivity())
+ PROCESSTHROTTLER_RELEASE_LOG("addActivity: not allowed to add background activity %s", activity.name().characters());
+ return false;
+ }
+
m_backgroundActivities.add(&activity);
updateAssertionIfNeeded();
+ return true;
}
void ProcessThrottler::removeActivity(ForegroundActivity& activity)
@@ -257,6 +271,18 @@
return std::get<UniqueRef<ProcessThrottler::ForegroundActivity>>(activity)->isValid();
}
+void ProcessThrottler::setAllowsActivities(bool allow)
+{
+ if (m_allowsActivities == allow)
+ return;
+
+ PROCESSTHROTTLER_RELEASE_LOG("setAllowsActivities %d", allow);
+ m_allowsActivities = allow;
+
+ if (!allow)
+ invalidateAllActivities();
+}
+
ProcessThrottler::TimedActivity::TimedActivity(Seconds timeout, ProcessThrottler::ActivityVariant&& activity)
: m_timer(RunLoop::main(), this, &TimedActivity::activityTimedOut)
, m_timeout(timeout)
Modified: trunk/Source/WebKit/UIProcess/ProcessThrottler.h (294404 => 294405)
--- trunk/Source/WebKit/UIProcess/ProcessThrottler.h 2022-05-18 17:28:13 UTC (rev 294404)
+++ trunk/Source/WebKit/UIProcess/ProcessThrottler.h 2022-05-18 17:51:25 UTC (rev 294405)
@@ -64,7 +64,11 @@
: m_throttler(&throttler)
, m_name(name)
{
- throttler.addActivity(*this);
+ if (!throttler.addActivity(*this)) {
+ m_throttler = nullptr;
+ return;
+ }
+
if (!isQuietActivity()) {
PROCESSTHROTTLER_ACTIVITY_RELEASE_LOG("Activity: Starting %" PUBLIC_LOG_STRING " activity / '%" PUBLIC_LOG_STRING "'",
type == ActivityType::Foreground ? "foreground" : "background", m_name.characters());
@@ -78,12 +82,12 @@
}
bool isValid() const { return !!m_throttler; }
+ ASCIILiteral name() const { return m_name; }
+ bool isQuietActivity() const { return !m_name.characters(); }
private:
friend class ProcessThrottler;
- bool isQuietActivity() const { return !m_name.characters(); }
-
void invalidate()
{
ASSERT(isValid());
@@ -125,6 +129,7 @@
void didConnectToProcess(ProcessID);
bool shouldBeRunnable() const { return m_foregroundActivities.size() || m_backgroundActivities.size(); }
+ void setAllowsActivities(bool);
private:
ProcessAssertionType expectedAssertionType();
@@ -135,8 +140,8 @@
void sendPrepareToSuspendIPC(IsSuspensionImminent);
void processReadyToSuspend();
- void addActivity(ForegroundActivity&);
- void addActivity(BackgroundActivity&);
+ bool addActivity(ForegroundActivity&);
+ bool addActivity(BackgroundActivity&);
void removeActivity(ForegroundActivity&);
void removeActivity(BackgroundActivity&);
void invalidateAllActivities();
@@ -155,6 +160,7 @@
HashSet<BackgroundActivity*> m_backgroundActivities;
std::optional<uint64_t> m_pendingRequestToSuspendID;
bool m_shouldTakeUIBackgroundAssertion;
+ bool m_allowsActivities { true };
};
inline auto ProcessThrottler::foregroundActivity(ASCIILiteral name) -> UniqueRef<ForegroundActivity>
Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.h (294404 => 294405)
--- trunk/Source/WebKit/UIProcess/WebProcessPool.h 2022-05-18 17:28:13 UTC (rev 294404)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.h 2022-05-18 17:51:25 UTC (rev 294405)
@@ -236,6 +236,7 @@
#if PLATFORM(IOS_FAMILY)
void applicationIsAboutToSuspend();
static void notifyProcessPoolsApplicationIsAboutToSuspend();
+ void setProcessesShouldSuspend(bool);
#endif
void handleMemoryPressureWarning(Critical);
Modified: trunk/Source/WebKit/UIProcess/ios/ProcessAssertionIOS.mm (294404 => 294405)
--- trunk/Source/WebKit/UIProcess/ios/ProcessAssertionIOS.mm 2022-05-18 17:28:13 UTC (rev 294404)
+++ trunk/Source/WebKit/UIProcess/ios/ProcessAssertionIOS.mm 2022-05-18 17:51:25 UTC (rev 294405)
@@ -29,6 +29,7 @@
#if PLATFORM(IOS_FAMILY)
#import "Logging.h"
+#import "ProcessStateMonitor.h"
#import "RunningBoardServicesSPI.h"
#import "WebProcessPool.h"
#import <UIKit/UIApplication.h>
@@ -73,6 +74,7 @@
std::atomic<bool> _backgroundTaskWasInvalidated;
WeakHashSet<ProcessAndUIAssertion> _assertionsNeedingBackgroundTask;
dispatch_block_t _pendingTaskReleaseTask;
+ std::unique_ptr<WebKit::ProcessStateMonitor> m_processStateMonitor;
}
+ (WKProcessAssertionBackgroundTaskManager *)shared
@@ -92,11 +94,20 @@
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationWillEnterForegroundNotification object:[UIApplication sharedApplication] queue:nil usingBlock:^(NSNotification *) {
[self _cancelPendingReleaseTask];
[self _updateBackgroundTask];
+
+ m_processStateMonitor = nullptr;
}];
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidEnterBackgroundNotification object:[UIApplication sharedApplication] queue:nil usingBlock:^(NSNotification *) {
if (![self _hasBackgroundTask])
WebKit::WebProcessPool::notifyProcessPoolsApplicationIsAboutToSuspend();
+
+ if (!m_processStateMonitor) {
+ m_processStateMonitor = makeUnique<WebKit::ProcessStateMonitor>([](bool suspended) {
+ for (auto& processPool : WebKit::WebProcessPool::allProcessPools())
+ processPool->setProcessesShouldSuspend(suspended);
+ });
+ }
}];
return self;
@@ -242,8 +253,11 @@
return;
RELEASE_LOG(ProcessSuspension, "%p - WKProcessAssertionBackgroundTaskManager: endBackgroundTask", self);
- if (processHasActiveRunTimeLimitation())
+ if (processHasActiveRunTimeLimitation()) {
WebKit::WebProcessPool::notifyProcessPoolsApplicationIsAboutToSuspend();
+ if (m_processStateMonitor)
+ m_processStateMonitor->processWillBeSuspendedImmediately();
+ }
[_backgroundTask removeObserver:self];
[_backgroundTask invalidate];
Added: trunk/Source/WebKit/UIProcess/ios/ProcessStateMonitor.h (0 => 294405)
--- trunk/Source/WebKit/UIProcess/ios/ProcessStateMonitor.h (rev 0)
+++ trunk/Source/WebKit/UIProcess/ios/ProcessStateMonitor.h 2022-05-18 17:51:25 UTC (rev 294405)
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2022 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if PLATFORM(IOS_FAMILY)
+
+#import <wtf/RetainPtr.h>
+#import <wtf/RunLoop.h>
+
+OBJC_CLASS RBSProcessMonitor;
+
+namespace WebKit {
+
+class ProcessStateMonitor : public CanMakeWeakPtr<ProcessStateMonitor> {
+ WTF_MAKE_FAST_ALLOCATED;
+public:
+ ProcessStateMonitor(Function<void(bool)>&& becomeSuspendedHandler);
+ ~ProcessStateMonitor();
+ void processWillBeSuspendedImmediately();
+
+private:
+ void processDidBecomeRunning();
+ void processWillBeSuspended(Seconds timeout);
+ void suspendTimerFired();
+ void checkRemainingRunTime();
+
+ enum class State : uint8_t { Running, WillSuspend, Suspended };
+ State m_state { State::Running };
+ Function<void(bool)> m_becomeSuspendedHandler;
+ RunLoop::Timer<ProcessStateMonitor> m_suspendTimer;
+ RetainPtr<RBSProcessMonitor> m_rbsMonitor;
+};
+
+} // namespace WebKit
+
+#endif // PLATFORM(IOS_FAMILY)
Added: trunk/Source/WebKit/UIProcess/ios/ProcessStateMonitor.mm (0 => 294405)
--- trunk/Source/WebKit/UIProcess/ios/ProcessStateMonitor.mm (rev 0)
+++ trunk/Source/WebKit/UIProcess/ios/ProcessStateMonitor.mm 2022-05-18 17:51:25 UTC (rev 294405)
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2022 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+#import "ProcessStateMonitor.h"
+
+#if PLATFORM(IOS_FAMILY)
+
+#import "Logging.h"
+#import "NetworkProcessMessages.h"
+#import "ProcessAssertion.h"
+#import "RunningBoardServicesSPI.h"
+
+namespace WebKit {
+
+static constexpr double maxPrepareForSuspensionDelayInSecond = 15;
+
+ProcessStateMonitor::ProcessStateMonitor(Function<void(bool)>&& becomeSuspendedHandler)
+ : m_becomeSuspendedHandler(WTFMove(becomeSuspendedHandler))
+ , m_suspendTimer(RunLoop::main(), [this] { suspendTimerFired(); })
+{
+ RELEASE_LOG(ProcessSuspension, "%p - ProcessStateMonitor::ProcessStateMonitor", this);
+ RELEASE_ASSERT(RunLoop::isMain());
+
+ m_rbsMonitor = [RBSProcessMonitor monitorWithConfiguration:[weakThis = WeakPtr { *this }](id<RBSProcessMonitorConfiguring> config) mutable {
+ RBSProcessStateDescriptor *descriptor = [RBSProcessStateDescriptor descriptor];
+ [descriptor setValues:RBSProcessStateValueLegacyAssertions | RBSProcessStateValueModernAssertions];
+ [config setStateDescriptor:descriptor];
+ [config setPredicates:@[[RBSProcessPredicate predicateMatchingHandle:[RBSProcessHandle currentProcess]]]];
+ [config setUpdateHandler:[weakThis = WTFMove(weakThis)](RBSProcessMonitor *monitor, RBSProcessHandle *process, RBSProcessStateUpdate *update) {
+ ensureOnMainRunLoop([weakThis] {
+ if (weakThis)
+ weakThis->checkRemainingRunTime();
+ });
+ }];
+ }];
+
+ checkRemainingRunTime();
+}
+
+ProcessStateMonitor::~ProcessStateMonitor()
+{
+ RELEASE_LOG(ProcessSuspension, "%p - ProcessStateMonitor::~ProcessStateMonitor", this);
+ RELEASE_ASSERT(RunLoop::isMain());
+
+ [m_rbsMonitor.get() invalidate];
+ processDidBecomeRunning();
+}
+
+void ProcessStateMonitor::processDidBecomeRunning()
+{
+ if (m_state == State::Running)
+ return;
+
+ if (m_state == State::Suspended)
+ m_becomeSuspendedHandler(false);
+ else {
+ ASSERT(m_suspendTimer.isActive());
+ m_suspendTimer.stop();
+ }
+
+ m_state = State::Running;
+}
+
+void ProcessStateMonitor::processWillBeSuspended(Seconds timeout)
+{
+ if (m_state != State::Running)
+ return;
+
+ RELEASE_LOG(ProcessSuspension, "%p - ProcessStateMonitor::processWillBeSuspended starts timer for %fs", this, timeout.value());
+ ASSERT(!m_suspendTimer.isActive());
+ m_suspendTimer.startOneShot(timeout);
+ m_state = State::WillSuspend;
+}
+
+void ProcessStateMonitor::processWillBeSuspendedImmediately()
+{
+ if (m_state == State::Suspended)
+ return;
+
+ RELEASE_LOG(ProcessSuspension, "%p - ProcessStateMonitor::processWillBeSuspendedImmediately", this);
+ m_suspendTimer.stop();
+ m_becomeSuspendedHandler(true);
+ m_state = State::Suspended;
+}
+
+void ProcessStateMonitor::suspendTimerFired()
+{
+ if (m_state != State::WillSuspend)
+ return;
+
+ RELEASE_LOG(ProcessSuspension, "%p - ProcessStateMonitor::suspendTimerFired", this);
+ processWillBeSuspendedImmediately();
+}
+
+void ProcessStateMonitor::checkRemainingRunTime()
+{
+ double remainingRunTime = [[[RBSProcessHandle currentProcess] activeLimitations] runTime];
+ if (remainingRunTime == RBSProcessTimeLimitationNone)
+ return processDidBecomeRunning();
+
+ if (remainingRunTime <= maxPrepareForSuspensionDelayInSecond)
+ return processWillBeSuspendedImmediately();
+
+ processWillBeSuspended(Seconds(remainingRunTime - maxPrepareForSuspensionDelayInSecond));
+}
+
+} // namespace WebKit
+
+#endif // PLATFORM(IOS_FAMILY)
Modified: trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj (294404 => 294405)
--- trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj 2022-05-18 17:28:13 UTC (rev 294404)
+++ trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj 2022-05-18 17:51:25 UTC (rev 294405)
@@ -1511,6 +1511,7 @@
93D6B7B4255268D50058DD3A /* SpeechRecognitionPermissionRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D6B7AF255268A10058DD3A /* SpeechRecognitionPermissionRequest.h */; };
93D6B7B5255268D70058DD3A /* SpeechRecognitionPermissionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D6B7B2255268A20058DD3A /* SpeechRecognitionPermissionManager.h */; };
93D6B7B925534A170058DD3A /* WKSpeechRecognitionPermissionCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D6B7B725534A110058DD3A /* WKSpeechRecognitionPermissionCallback.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 93E05E40282CD560000B69EB /* ProcessStateMonitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E05E3E282CD55D000B69EB /* ProcessStateMonitor.h */; };
93E6A4EE1BC5DD3900F8A0E7 /* _WKHitTestResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E6A4ED1BC5DD3900F8A0E7 /* _WKHitTestResult.h */; settings = {ATTRIBUTES = (Private, ); }; };
93E799852756FA550074008A /* WebFileSystemStorageConnectionMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93E799822756FA540074008A /* WebFileSystemStorageConnectionMessageReceiver.cpp */; };
93E799872756FAB40074008A /* WebFileSystemStorageConnectionMessagesReplies.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E799832756FA540074008A /* WebFileSystemStorageConnectionMessagesReplies.h */; };
@@ -5831,6 +5832,8 @@
93D6B7B2255268A20058DD3A /* SpeechRecognitionPermissionManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpeechRecognitionPermissionManager.h; sourceTree = "<group>"; };
93D6B7B725534A110058DD3A /* WKSpeechRecognitionPermissionCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKSpeechRecognitionPermissionCallback.h; sourceTree = "<group>"; };
93D6B7B825534A120058DD3A /* WKSpeechRecognitionPermissionCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKSpeechRecognitionPermissionCallback.cpp; sourceTree = "<group>"; };
+ 93E05E3E282CD55D000B69EB /* ProcessStateMonitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProcessStateMonitor.h; path = ios/ProcessStateMonitor.h; sourceTree = "<group>"; };
+ 93E05E3F282CD55F000B69EB /* ProcessStateMonitor.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ProcessStateMonitor.mm; path = ios/ProcessStateMonitor.mm; sourceTree = "<group>"; };
93E6A4ED1BC5DD3900F8A0E7 /* _WKHitTestResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKHitTestResult.h; sourceTree = "<group>"; };
93E7997E2756F6700074008A /* WebFileSystemStorageConnection.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = WebFileSystemStorageConnection.messages.in; sourceTree = "<group>"; };
93E799812756FA530074008A /* WebFileSystemStorageConnectionMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebFileSystemStorageConnectionMessages.h; sourceTree = "<group>"; };
@@ -9259,6 +9262,8 @@
0FCB4E3618BBE044000FCFC9 /* PageClientImplIOS.h */,
0FCB4E3718BBE044000FCFC9 /* PageClientImplIOS.mm */,
86F9536218FF550B001DB2EF /* ProcessAssertionIOS.mm */,
+ 93E05E3E282CD55D000B69EB /* ProcessStateMonitor.h */,
+ 93E05E3F282CD55F000B69EB /* ProcessStateMonitor.mm */,
2DAF06D418BD1A470081CEB1 /* SmartMagnificationController.h */,
2DAF06D818BD23BA0081CEB1 /* SmartMagnificationController.messages.in */,
2DAF06D518BD1A470081CEB1 /* SmartMagnificationController.mm */,
@@ -14559,6 +14564,7 @@
5CB9310926E8439A0032B1C0 /* PrivateClickMeasurementXPCUtilities.h in Headers */,
86F9536518FF58F5001DB2EF /* ProcessAssertion.h in Headers */,
BC1A7C581136E19C00FB7167 /* ProcessLauncher.h in Headers */,
+ 93E05E40282CD560000B69EB /* ProcessStateMonitor.h in Headers */,
463FD4821EB94EC000A2982C /* ProcessTerminationReason.h in Headers */,
86E67A251910B9D100004AB7 /* ProcessThrottler.h in Headers */,
83048AE61ACA45DC0082C832 /* ProcessThrottlerClient.h in Headers */,