Title: [292024] trunk/Source/WebKit
Revision
292024
Author
sihui_...@apple.com
Date
2022-03-28 22:54:56 -0700 (Mon, 28 Mar 2022)

Log Message

Add logging about process entering background to NetworkProcess::processDidResume
https://bugs.webkit.org/show_bug.cgi?id=238082
<rdar://problem/90844775>

Reviewed by Chris Dumez.

In rdar://82412733, we found network process can be suspended right after it receives processDidResume message.
For network process, processDidResume means process is not suspended and it is safe to perform database
operations. Let's add logging to check when and why processDidResume message is sent. If the logging confirms
that processDidResume message can be received when process is close to assertion timeout, we probably want to
ignore such message and resume database operations when application actually enters foreground.

* NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::prepareToSuspend):
(WebKit::NetworkProcess::applicationDidEnterBackground):
(WebKit::NetworkProcess::applicationWillEnterForeground):
(WebKit::NetworkProcess::processDidResume):
* NetworkProcess/NetworkProcess.h:
* NetworkProcess/NetworkProcess.messages.in:
* NetworkProcess/ios/NetworkProcessIOS.mm:
* UIProcess/API/Cocoa/WKWebViewTesting.mm:
(-[WKWebView _processDidResumeForTesting]):
* UIProcess/Cocoa/DownloadProxyMapCocoa.mm:
(WebKit::DownloadProxyMap::platformCreate):
(WebKit::DownloadProxyMap::platformDestroy):
* UIProcess/Downloads/DownloadProxyMap.cpp:
(WebKit::DownloadProxyMap::applicationDidEnterBackground): Deleted.
(WebKit::DownloadProxyMap::applicationWillEnterForeground): Deleted.
* UIProcess/Downloads/DownloadProxyMap.h:
(WebKit::DownloadProxyMap::isEmpty const):
* UIProcess/GPU/GPUProcessProxy.cpp:
(WebKit::GPUProcessProxy::sendProcessDidResume):
* UIProcess/GPU/GPUProcessProxy.h:
* UIProcess/Network/NetworkProcessProxy.cpp:
(WebKit::NetworkProcessProxy::NetworkProcessProxy):
(WebKit::NetworkProcessProxy::~NetworkProcessProxy):
(WebKit::NetworkProcessProxy::synthesizeAppIsBackground):
(WebKit::NetworkProcessProxy::sendProcessDidResume):
(WebKit::NetworkProcessProxy::applicationDidEnterBackground):
(WebKit::NetworkProcessProxy::applicationWillEnterForeground):
* UIProcess/Network/NetworkProcessProxy.h:
* UIProcess/Network/NetworkProcessProxyCocoa.mm:
(WebKit::NetworkProcessProxy::addBackgroundStateObservers):
(WebKit::NetworkProcessProxy::removeBackgroundStateObservers):
* UIProcess/ProcessThrottler.cpp:
(WebKit::ProcessThrottler::updateAssertionIfNeeded):
* UIProcess/ProcessThrottlerClient.h:
* UIProcess/WebAuthentication/WebAuthnProcessProxy.h:
* UIProcess/WebProcessProxy.cpp:
(WebKit::WebProcessProxy::sendProcessDidResume):
* UIProcess/WebProcessProxy.h:
* UIProcess/WebsiteData/WebsiteDataStore.cpp:
(WebKit::WebsiteDataStore::sendNetworkProcessDidResume):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (292023 => 292024)


--- trunk/Source/WebKit/ChangeLog	2022-03-29 04:33:07 UTC (rev 292023)
+++ trunk/Source/WebKit/ChangeLog	2022-03-29 05:54:56 UTC (rev 292024)
@@ -1,5 +1,61 @@
 2022-03-28  Sihui Liu  <sihui_...@apple.com>
 
+        Add logging about process entering background to NetworkProcess::processDidResume
+        https://bugs.webkit.org/show_bug.cgi?id=238082
+        <rdar://problem/90844775>
+
+        Reviewed by Chris Dumez.
+
+        In rdar://82412733, we found network process can be suspended right after it receives processDidResume message. 
+        For network process, processDidResume means process is not suspended and it is safe to perform database 
+        operations. Let's add logging to check when and why processDidResume message is sent. If the logging confirms
+        that processDidResume message can be received when process is close to assertion timeout, we probably want to 
+        ignore such message and resume database operations when application actually enters foreground.
+
+        * NetworkProcess/NetworkProcess.cpp:
+        (WebKit::NetworkProcess::prepareToSuspend):
+        (WebKit::NetworkProcess::applicationDidEnterBackground):
+        (WebKit::NetworkProcess::applicationWillEnterForeground):
+        (WebKit::NetworkProcess::processDidResume):
+        * NetworkProcess/NetworkProcess.h:
+        * NetworkProcess/NetworkProcess.messages.in:
+        * NetworkProcess/ios/NetworkProcessIOS.mm:
+        * UIProcess/API/Cocoa/WKWebViewTesting.mm:
+        (-[WKWebView _processDidResumeForTesting]):
+        * UIProcess/Cocoa/DownloadProxyMapCocoa.mm:
+        (WebKit::DownloadProxyMap::platformCreate):
+        (WebKit::DownloadProxyMap::platformDestroy):
+        * UIProcess/Downloads/DownloadProxyMap.cpp:
+        (WebKit::DownloadProxyMap::applicationDidEnterBackground): Deleted.
+        (WebKit::DownloadProxyMap::applicationWillEnterForeground): Deleted.
+        * UIProcess/Downloads/DownloadProxyMap.h:
+        (WebKit::DownloadProxyMap::isEmpty const):
+        * UIProcess/GPU/GPUProcessProxy.cpp:
+        (WebKit::GPUProcessProxy::sendProcessDidResume):
+        * UIProcess/GPU/GPUProcessProxy.h:
+        * UIProcess/Network/NetworkProcessProxy.cpp:
+        (WebKit::NetworkProcessProxy::NetworkProcessProxy):
+        (WebKit::NetworkProcessProxy::~NetworkProcessProxy):
+        (WebKit::NetworkProcessProxy::synthesizeAppIsBackground):
+        (WebKit::NetworkProcessProxy::sendProcessDidResume):
+        (WebKit::NetworkProcessProxy::applicationDidEnterBackground):
+        (WebKit::NetworkProcessProxy::applicationWillEnterForeground):
+        * UIProcess/Network/NetworkProcessProxy.h:
+        * UIProcess/Network/NetworkProcessProxyCocoa.mm:
+        (WebKit::NetworkProcessProxy::addBackgroundStateObservers):
+        (WebKit::NetworkProcessProxy::removeBackgroundStateObservers):
+        * UIProcess/ProcessThrottler.cpp:
+        (WebKit::ProcessThrottler::updateAssertionIfNeeded):
+        * UIProcess/ProcessThrottlerClient.h:
+        * UIProcess/WebAuthentication/WebAuthnProcessProxy.h:
+        * UIProcess/WebProcessProxy.cpp:
+        (WebKit::WebProcessProxy::sendProcessDidResume):
+        * UIProcess/WebProcessProxy.h:
+        * UIProcess/WebsiteData/WebsiteDataStore.cpp:
+        (WebKit::WebsiteDataStore::sendNetworkProcessDidResume):
+
+2022-03-28  Sihui Liu  <sihui_...@apple.com>
+
         Disable custom storage paths for IndexedDB and LocalStorage by default
         https://bugs.webkit.org/show_bug.cgi?id=236977
         <rdar://problem/89559929>

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp (292023 => 292024)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2022-03-29 04:33:07 UTC (rev 292023)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2022-03-29 05:54:56 UTC (rev 292024)
@@ -2129,7 +2129,7 @@
 
 void NetworkProcess::prepareToSuspend(bool isSuspensionImminent, CompletionHandler<void()>&& completionHandler)
 {
-    RELEASE_LOG(ProcessSuspension, "%p - NetworkProcess::prepareToSuspend(), isSuspensionImminent=%d", this, isSuspensionImminent);
+    RELEASE_LOG(ProcessSuspension, "%p - NetworkProcess::prepareToSuspend(), isSuspensionImminent=%d Process is %{public}sin background", this, isSuspensionImminent, m_enterBackgroundTimestamp ? "" : "not ");
 
     m_isSuspended = true;
     lowMemoryHandler(Critical::Yes);
@@ -2160,17 +2160,26 @@
 
 void NetworkProcess::applicationDidEnterBackground()
 {
+    if (!m_enterBackgroundTimestamp)
+        m_enterBackgroundTimestamp = MonotonicTime::now();
+
     m_downloadManager.applicationDidEnterBackground();
 }
 
 void NetworkProcess::applicationWillEnterForeground()
 {
+    if (m_enterBackgroundTimestamp)
+        m_enterBackgroundTimestamp = std::nullopt;
+
     m_downloadManager.applicationWillEnterForeground();
 }
 
-void NetworkProcess::processDidResume()
+void NetworkProcess::processDidResume(bool forForegroundActivity)
 {
-    RELEASE_LOG(ProcessSuspension, "%p - NetworkProcess::processDidResume()", this);
+    if (m_enterBackgroundTimestamp)
+        RELEASE_LOG(ProcessSuspension, "%p - NetworkProcess::processDidResume() forForegroundActivity=%d", this, forForegroundActivity);
+    else
+        RELEASE_LOG(ProcessSuspension, "%p - NetworkProcess::processDidResume() forForegroundActivity=%d Process has been in background for %f seconds", this, forForegroundActivity, (MonotonicTime::now() - m_enterBackgroundTimestamp.value()).value());
 
     m_isSuspended = false;
 

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.h (292023 => 292024)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2022-03-29 04:33:07 UTC (rev 292023)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2022-03-29 05:54:56 UTC (rev 292024)
@@ -174,7 +174,7 @@
 
     void processWillSuspendImminentlyForTestingSync(CompletionHandler<void()>&&);
     void prepareToSuspend(bool isSuspensionImminent, CompletionHandler<void()>&&);
-    void processDidResume();
+    void processDidResume(bool forForegroundActivity);
 
     CacheModel cacheModel() const { return m_cacheModel; }
 
@@ -527,6 +527,7 @@
     bool m_privateClickMeasurementEnabled { true };
     bool m_ftpEnabled { false };
     bool m_isSuspended { false };
+    std::optional<MonotonicTime> m_enterBackgroundTimestamp;
 };
 
 #if !PLATFORM(COCOA)

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in (292023 => 292024)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in	2022-03-29 04:33:07 UTC (rev 292023)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in	2022-03-29 05:54:56 UTC (rev 292024)
@@ -76,7 +76,7 @@
 
     ProcessWillSuspendImminentlyForTestingSync() -> () Synchronous
     PrepareToSuspend(bool isSuspensionImminent) -> ()
-    ProcessDidResume()
+    ProcessDidResume(bool forForegroundActivity)
 
     PreconnectTo(PAL::SessionID sessionID, WebKit::WebPageProxyIdentifier webPageProxyID, WebCore::PageIdentifier webPageID, URL url, String userAgent, enum:uint8_t WebCore::StoredCredentialsPolicy storedCredentialsPolicy, enum:bool std::optional<WebKit::NavigatingToAppBoundDomain> isNavigatingToAppBoundDomain, enum:bool WebKit::LastNavigationWasAppInitiated lastNavigationWasAppInitiated);
 

Modified: trunk/Source/WebKit/NetworkProcess/ios/NetworkProcessIOS.mm (292023 => 292024)


--- trunk/Source/WebKit/NetworkProcess/ios/NetworkProcessIOS.mm	2022-03-29 04:33:07 UTC (rev 292023)
+++ trunk/Source/WebKit/NetworkProcess/ios/NetworkProcessIOS.mm	2022-03-29 05:54:56 UTC (rev 292024)
@@ -33,6 +33,7 @@
 #import "ProcessAssertion.h"
 #import "SandboxInitializationParameters.h"
 #import "SecItemShim.h"
+#import <UIKit/UIKit.h>
 #import <WebCore/CertificateInfo.h>
 #import <WebCore/NotImplemented.h>
 #import <WebCore/WebCoreThreadSystemInterface.h>

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewTesting.mm (292023 => 292024)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewTesting.mm	2022-03-29 04:33:07 UTC (rev 292023)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewTesting.mm	2022-03-29 05:54:56 UTC (rev 292024)
@@ -213,7 +213,7 @@
 - (void)_processDidResumeForTesting
 {
     if (_page)
-        _page->process().sendProcessDidResume();
+        _page->process().sendProcessDidResume(WebKit::ProcessThrottlerClient::ResumeReason::ForegroundActivity);
 }
 
 - (void)_setAssertionTypeForTesting:(int)value

Modified: trunk/Source/WebKit/UIProcess/Cocoa/DownloadProxyMapCocoa.mm (292023 => 292024)


--- trunk/Source/WebKit/UIProcess/Cocoa/DownloadProxyMapCocoa.mm	2022-03-29 04:33:07 UTC (rev 292023)
+++ trunk/Source/WebKit/UIProcess/Cocoa/DownloadProxyMapCocoa.mm	2022-03-29 05:54:56 UTC (rev 292024)
@@ -36,26 +36,10 @@
 
 void DownloadProxyMap::platformCreate()
 {
-#if PLATFORM(IOS_FAMILY)
-    m_backgroundObserver = [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidEnterBackgroundNotification object:[UIApplication sharedApplication] queue:nil usingBlock:makeBlockPtr([weakThis = WeakPtr { *this }](NSNotification *) {
-        if (!weakThis)
-            return;
-        weakThis->applicationDidEnterBackground();
-    }).get()];
-    m_foregroundObserver = [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationWillEnterForegroundNotification object:[UIApplication sharedApplication] queue:nil usingBlock:makeBlockPtr([weakThis = WeakPtr { *this }](NSNotification *) {
-        if (!weakThis)
-            return;
-        weakThis->applicationWillEnterForeground();
-    }).get()];
-#endif
 }
 
 void DownloadProxyMap::platformDestroy()
 {
-#if PLATFORM(IOS_FAMILY)
-    [[NSNotificationCenter defaultCenter] removeObserver:m_backgroundObserver.get()];
-    [[NSNotificationCenter defaultCenter] removeObserver:m_foregroundObserver.get()];
-#endif
 }
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/UIProcess/Downloads/DownloadProxyMap.cpp (292023 => 292024)


--- trunk/Source/WebKit/UIProcess/Downloads/DownloadProxyMap.cpp	2022-03-29 04:33:07 UTC (rev 292023)
+++ trunk/Source/WebKit/UIProcess/Downloads/DownloadProxyMap.cpp	2022-03-29 05:54:56 UTC (rev 292024)
@@ -69,16 +69,6 @@
 }
 #endif
 
-void DownloadProxyMap::applicationDidEnterBackground()
-{
-    m_process.send(Messages::NetworkProcess::ApplicationDidEnterBackground(), 0);
-}
-
-void DownloadProxyMap::applicationWillEnterForeground()
-{
-    m_process.send(Messages::NetworkProcess::ApplicationWillEnterForeground(), 0);
-}
-
 DownloadProxy& DownloadProxyMap::createDownloadProxy(WebsiteDataStore& dataStore, WebProcessPool& processPool, const WebCore::ResourceRequest& resourceRequest, const FrameInfoData& frameInfo, WebPageProxy* originatingPage)
 {
     auto* legacyDownloadClient = processPool.legacyDownloadClient();

Modified: trunk/Source/WebKit/UIProcess/Downloads/DownloadProxyMap.h (292023 => 292024)


--- trunk/Source/WebKit/UIProcess/Downloads/DownloadProxyMap.h	2022-03-29 04:33:07 UTC (rev 292023)
+++ trunk/Source/WebKit/UIProcess/Downloads/DownloadProxyMap.h	2022-03-29 05:54:56 UTC (rev 292024)
@@ -61,12 +61,8 @@
     void downloadFinished(DownloadProxy&);
 
     bool isEmpty() const { return m_downloads.isEmpty(); }
-
     void invalidate();
 
-    void applicationDidEnterBackground();
-    void applicationWillEnterForeground();
-
 private:
     void platformCreate();
     void platformDestroy();
@@ -77,11 +73,6 @@
     bool m_shouldTakeAssertion { false };
     RefPtr<ProcessAssertion> m_downloadUIAssertion;
     RefPtr<ProcessAssertion> m_downloadNetworkingAssertion;
-
-#if PLATFORM(IOS_FAMILY)
-    RetainPtr<id> m_backgroundObserver;
-    RetainPtr<id> m_foregroundObserver;
-#endif
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp (292023 => 292024)


--- trunk/Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp	2022-03-29 04:33:07 UTC (rev 292023)
+++ trunk/Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp	2022-03-29 05:54:56 UTC (rev 292024)
@@ -578,7 +578,7 @@
     sendWithAsyncReply(Messages::GPUProcess::PrepareToSuspend(isSuspensionImminent == IsSuspensionImminent::Yes), WTFMove(completionHandler), 0, { }, ShouldStartProcessThrottlerActivity::No);
 }
 
-void GPUProcessProxy::sendProcessDidResume()
+void GPUProcessProxy::sendProcessDidResume(ResumeReason)
 {
     if (canSendMessage())
         send(Messages::GPUProcess::ProcessDidResume(), 0);

Modified: trunk/Source/WebKit/UIProcess/GPU/GPUProcessProxy.h (292023 => 292024)


--- trunk/Source/WebKit/UIProcess/GPU/GPUProcessProxy.h	2022-03-29 04:33:07 UTC (rev 292023)
+++ trunk/Source/WebKit/UIProcess/GPU/GPUProcessProxy.h	2022-03-29 05:54:56 UTC (rev 292024)
@@ -127,7 +127,7 @@
     // ProcessThrottlerClient
     ASCIILiteral clientName() const final { return "GPUProcess"_s; }
     void sendPrepareToSuspend(IsSuspensionImminent, CompletionHandler<void()>&&) final;
-    void sendProcessDidResume() final;
+    void sendProcessDidResume(ResumeReason) final;
 
     // ProcessLauncher::Client
     void didFinishLaunching(ProcessLauncher*, IPC::Connection::Identifier) override;

Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp (292023 => 292024)


--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp	2022-03-29 04:33:07 UTC (rev 292023)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp	2022-03-29 05:54:56 UTC (rev 292024)
@@ -269,6 +269,9 @@
     sendCreationParametersToNewProcess();
     updateProcessAssertion();
     networkProcessesSet().add(this);
+#if PLATFORM(IOS_FAMILY)
+    addBackgroundStateObservers();
+#endif
 }
 
 NetworkProcessProxy::~NetworkProcessProxy()
@@ -281,6 +284,9 @@
     if (m_downloadProxyMap)
         m_downloadProxyMap->invalidate();
     networkProcessesSet().remove(this);
+#if PLATFORM(IOS_FAMILY)
+    removeBackgroundStateObservers();
+#endif
 }
 
 void NetworkProcessProxy::getLaunchOptions(ProcessLauncher::LaunchOptions& launchOptions)
@@ -336,12 +342,10 @@
 
 void NetworkProcessProxy::synthesizeAppIsBackground(bool background)
 {
-    if (m_downloadProxyMap) {
-        if (background)
-            m_downloadProxyMap->applicationDidEnterBackground();
-        else
-            m_downloadProxyMap->applicationWillEnterForeground();
-    }
+    if (background)
+        applicationDidEnterBackground();
+    else
+        applicationWillEnterForeground();
 }
 
 DownloadProxy& NetworkProcessProxy::createDownloadProxy(WebsiteDataStore& dataStore, WebProcessPool& processPool, const ResourceRequest& resourceRequest, const FrameInfoData& frameInfo, WebPageProxy* originatingPage)
@@ -1396,10 +1400,10 @@
     sendWithAsyncReply(Messages::NetworkProcess::PrepareToSuspend(isSuspensionImminent == IsSuspensionImminent::Yes), WTFMove(completionHandler), 0, { }, ShouldStartProcessThrottlerActivity::No);
 }
 
-void NetworkProcessProxy::sendProcessDidResume()
+void NetworkProcessProxy::sendProcessDidResume(ResumeReason reason)
 {
     if (canSendMessage())
-        send(Messages::NetworkProcess::ProcessDidResume(), 0);
+        send(Messages::NetworkProcess::ProcessDidResume(reason == ResumeReason::ForegroundActivity), 0);
 }
 
 void NetworkProcessProxy::flushCookies(PAL::SessionID sessionID, CompletionHandler<void()>&& completionHandler)
@@ -1808,6 +1812,16 @@
     callback(std::nullopt);
 }
 
+void NetworkProcessProxy::applicationDidEnterBackground()
+{
+    send(Messages::NetworkProcess::ApplicationDidEnterBackground(), 0);
+}
+
+void NetworkProcessProxy::applicationWillEnterForeground()
+{
+    send(Messages::NetworkProcess::ApplicationWillEnterForeground(), 0);
+}
+
 } // namespace WebKit
 
 #undef MESSAGE_CHECK

Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h (292023 => 292024)


--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h	2022-03-29 04:33:07 UTC (rev 292023)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h	2022-03-29 05:54:56 UTC (rev 292024)
@@ -237,7 +237,7 @@
     void createSymLinkForFileUpgrade(const String& indexedDatabaseDirectory);
 
     // ProcessThrottlerClient
-    void sendProcessDidResume() final;
+    void sendProcessDidResume(ResumeReason) final;
     ASCIILiteral clientName() const final { return "NetworkProcess"_s; }
     
     static void setSuspensionAllowedForTesting(bool);
@@ -374,6 +374,13 @@
     void didExceedMemoryLimit();
 #endif
 
+    void applicationDidEnterBackground();
+    void applicationWillEnterForeground();
+#if PLATFORM(IOS_FAMILY)
+    void addBackgroundStateObservers();
+    void removeBackgroundStateObservers();
+#endif
+
     std::unique_ptr<DownloadProxyMap> m_downloadProxyMap;
 
     UniqueRef<API::CustomProtocolManagerClient> m_customProtocolManagerClient;
@@ -411,6 +418,11 @@
     WeakHashSet<WebsiteDataStore> m_websiteDataStores;
     UniqueRef<WebCookieManagerProxy> m_cookieManager;
     HashMap<DataTaskIdentifier, Ref<API::DataTask>> m_dataTasks;
+
+#if PLATFORM(IOS_FAMILY)
+    RetainPtr<id> m_backgroundObserver;
+    RetainPtr<id> m_foregroundObserver;
+#endif
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxyCocoa.mm (292023 => 292024)


--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxyCocoa.mm	2022-03-29 04:33:07 UTC (rev 292023)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxyCocoa.mm	2022-03-29 05:54:56 UTC (rev 292024)
@@ -27,9 +27,16 @@
 #import "NetworkProcessProxy.h"
 
 #import "LaunchServicesDatabaseXPCConstants.h"
+#import "NetworkProcessMessages.h"
 #import "WebProcessPool.h"
 #import "XPCEndpoint.h"
 
+#if PLATFORM(IOS_FAMILY)
+#import <UIKit/UIKit.h>
+#import <wtf/BlockPtr.h>
+#import <wtf/WeakPtr.h>
+#endif
+
 namespace WebKit {
 
 using namespace WebCore;
@@ -85,4 +92,26 @@
     return true;
 }
 
+#if PLATFORM(IOS_FAMILY)
+
+void NetworkProcessProxy::addBackgroundStateObservers()
+{
+    m_backgroundObserver = [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidEnterBackgroundNotification object:[UIApplication sharedApplication] queue:nil usingBlock:makeBlockPtr([weakThis = WeakPtr { *this }](NSNotification *) {
+        if (weakThis)
+            weakThis->applicationDidEnterBackground();
+    }).get()];
+    m_foregroundObserver = [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationWillEnterForegroundNotification object:[UIApplication sharedApplication] queue:nil usingBlock:makeBlockPtr([weakThis = WeakPtr { *this }](NSNotification *) {
+        if (weakThis)
+            weakThis->applicationWillEnterForeground();
+    }).get()];
 }
+
+void NetworkProcessProxy::removeBackgroundStateObservers()
+{
+    [[NSNotificationCenter defaultCenter] removeObserver:m_backgroundObserver.get()];
+    [[NSNotificationCenter defaultCenter] removeObserver:m_foregroundObserver.get()];
+}
+
+#endif
+
+}

Modified: trunk/Source/WebKit/UIProcess/ProcessThrottler.cpp (292023 => 292024)


--- trunk/Source/WebKit/UIProcess/ProcessThrottler.cpp	2022-03-29 04:33:07 UTC (rev 292023)
+++ trunk/Source/WebKit/UIProcess/ProcessThrottler.cpp	2022-03-29 05:54:56 UTC (rev 292024)
@@ -159,7 +159,7 @@
                 PROCESSTHROTTLER_RELEASE_LOG("updateAssertionIfNeeded: sending ProcessDidResume IPC because the process was suspended");
             else
                 PROCESSTHROTTLER_RELEASE_LOG("updateAssertionIfNeeded: sending ProcessDidResume IPC because the WebProcess is still processing request to suspend=%" PRIu64, *m_pendingRequestToSuspendID);
-            m_process.sendProcessDidResume();
+            m_process.sendProcessDidResume(expectedAssertionType() == ProcessAssertionType::Foreground ? ProcessThrottlerClient::ResumeReason::ForegroundActivity : ProcessThrottlerClient::ResumeReason::BackgroundActivity);
             clearPendingRequestToSuspend();
         }
     } else {

Modified: trunk/Source/WebKit/UIProcess/ProcessThrottlerClient.h (292023 => 292024)


--- trunk/Source/WebKit/UIProcess/ProcessThrottlerClient.h	2022-03-29 04:33:07 UTC (rev 292023)
+++ trunk/Source/WebKit/UIProcess/ProcessThrottlerClient.h	2022-03-29 05:54:56 UTC (rev 292024)
@@ -37,7 +37,8 @@
     virtual ~ProcessThrottlerClient() { }
 
     virtual void sendPrepareToSuspend(IsSuspensionImminent, CompletionHandler<void()>&&) = 0;
-    virtual void sendProcessDidResume() = 0;
+    enum ResumeReason : bool { ForegroundActivity, BackgroundActivity };
+    virtual void sendProcessDidResume(ResumeReason) = 0;
     virtual void didSetAssertionType(ProcessAssertionType) { };
     virtual ASCIILiteral clientName() const = 0;
 };

Modified: trunk/Source/WebKit/UIProcess/WebAuthentication/WebAuthnProcessProxy.h (292023 => 292024)


--- trunk/Source/WebKit/UIProcess/WebAuthentication/WebAuthnProcessProxy.h	2022-03-29 04:33:07 UTC (rev 292023)
+++ trunk/Source/WebKit/UIProcess/WebAuthentication/WebAuthnProcessProxy.h	2022-03-29 05:54:56 UTC (rev 292024)
@@ -55,7 +55,7 @@
     void updateProcessAssertion();
 
     // ProcessThrottlerClient
-    void sendProcessDidResume() final { }
+    void sendProcessDidResume(ResumeReason) final { }
     ASCIILiteral clientName() const final { return "WebAuthnProcess"_s; }
 
 private:

Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp (292023 => 292024)


--- trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp	2022-03-29 04:33:07 UTC (rev 292023)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp	2022-03-29 05:54:56 UTC (rev 292024)
@@ -1448,7 +1448,7 @@
     sendWithAsyncReply(Messages::WebProcess::PrepareToSuspend(isSuspensionImminent == IsSuspensionImminent::Yes), WTFMove(completionHandler), 0, { }, ShouldStartProcessThrottlerActivity::No);
 }
 
-void WebProcessProxy::sendProcessDidResume()
+void WebProcessProxy::sendProcessDidResume(ResumeReason)
 {
     WEBPROCESSPROXY_RELEASE_LOG(ProcessSuspension, "sendProcessDidResume:");
     if (canSendMessage())

Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.h (292023 => 292024)


--- trunk/Source/WebKit/UIProcess/WebProcessProxy.h	2022-03-29 04:33:07 UTC (rev 292023)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.h	2022-03-29 05:54:56 UTC (rev 292024)
@@ -327,7 +327,7 @@
 
     // ProcessThrottlerClient
     void sendPrepareToSuspend(IsSuspensionImminent, CompletionHandler<void()>&&) final;
-    void sendProcessDidResume() final;
+    void sendProcessDidResume(ResumeReason) final;
     void didSetAssertionType(ProcessAssertionType) final;
     ASCIILiteral clientName() const final { return "WebProcess"_s; }
 

Modified: trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp (292023 => 292024)


--- trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp	2022-03-29 04:33:07 UTC (rev 292023)
+++ trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp	2022-03-29 05:54:56 UTC (rev 292024)
@@ -1575,7 +1575,7 @@
 
 void WebsiteDataStore::sendNetworkProcessDidResume()
 {
-    networkProcess().sendProcessDidResume();
+    networkProcess().sendProcessDidResume(ProcessThrottlerClient::ResumeReason::ForegroundActivity);
 }
 
 bool WebsiteDataStore::resourceLoadStatisticsEnabled() const
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to