Title: [243388] trunk/Source/WebKit
Revision
243388
Author
[email protected]
Date
2019-03-22 10:40:51 -0700 (Fri, 22 Mar 2019)

Log Message

Implement WebProcess freezer opt-in completely on WebContent process side
https://bugs.webkit.org/show_bug.cgi?id=196149

Reviewed by Brady Eidson.

Implement WebProcess freezer opt-in completely on WebContent process side, we do not need
to involve the UIProcess with this and rely on IPC which may be fragile.

In the future, we may want to set freezable state from the UIProcess when the API supports
it. We can move the logic to be fully on the UIProcess side then. In the mean time, it is
likely best not to rely on IPC and process coordination for this.

* UIProcess/WebProcessProxy.cpp:
(WebKit::globalPageMap):
(WebKit::WebProcessProxy::WebProcessProxy):
(WebKit::WebProcessProxy::setIsInProcessCache):
(WebKit::WebProcessProxy::markIsNoLongerInPrewarmedPool):
(WebKit::WebProcessProxy::didFinishLaunching):
(WebKit::WebProcessProxy::validateFreezerStatus): Deleted.
* UIProcess/WebProcessProxy.h:
(WebKit::WebProcessProxy::removeProvisionalPageProxy):
(WebKit::WebProcessProxy::WebPageProxyMap::WebPageProxyMap): Deleted.
(WebKit::WebProcessProxy::WebPageProxyMap::size const): Deleted.
(WebKit::WebProcessProxy::WebPageProxyMap::values): Deleted.
(WebKit::WebProcessProxy::WebPageProxyMap::values const): Deleted.
(WebKit::WebProcessProxy::WebPageProxyMap::begin): Deleted.
(WebKit::WebProcessProxy::WebPageProxyMap::end): Deleted.
(WebKit::WebProcessProxy::WebPageProxyMap::get): Deleted.
(WebKit::WebProcessProxy::WebPageProxyMap::contains const): Deleted.
(WebKit::WebProcessProxy::WebPageProxyMap::isEmpty const): Deleted.
(WebKit::WebProcessProxy::WebPageProxyMap::set): Deleted.
(WebKit::WebProcessProxy::WebPageProxyMap::take): Deleted.
* WebProcess/WebProcess.cpp:
(WebKit::WebProcess::setIsInProcessCache):
(WebKit::WebProcess::markIsNoLongerPrewarmed):
(WebKit::WebProcess::actualPrepareToSuspend):
(WebKit::WebProcess::setFreezable): Deleted.
* WebProcess/WebProcess.h:
* WebProcess/WebProcess.messages.in:
* WebProcess/cocoa/WebProcessCocoa.mm:
(WebKit::WebProcess::updateProcessName):
(WebKit::WebProcess::shouldFreezeOnSuspension const):
(WebKit::WebProcess::updateFreezerStatus):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (243387 => 243388)


--- trunk/Source/WebKit/ChangeLog	2019-03-22 17:40:14 UTC (rev 243387)
+++ trunk/Source/WebKit/ChangeLog	2019-03-22 17:40:51 UTC (rev 243388)
@@ -1,5 +1,51 @@
 2019-03-22  Chris Dumez  <[email protected]>
 
+        Implement WebProcess freezer opt-in completely on WebContent process side
+        https://bugs.webkit.org/show_bug.cgi?id=196149
+
+        Reviewed by Brady Eidson.
+
+        Implement WebProcess freezer opt-in completely on WebContent process side, we do not need
+        to involve the UIProcess with this and rely on IPC which may be fragile.
+
+        In the future, we may want to set freezable state from the UIProcess when the API supports
+        it. We can move the logic to be fully on the UIProcess side then. In the mean time, it is
+        likely best not to rely on IPC and process coordination for this.
+
+        * UIProcess/WebProcessProxy.cpp:
+        (WebKit::globalPageMap):
+        (WebKit::WebProcessProxy::WebProcessProxy):
+        (WebKit::WebProcessProxy::setIsInProcessCache):
+        (WebKit::WebProcessProxy::markIsNoLongerInPrewarmedPool):
+        (WebKit::WebProcessProxy::didFinishLaunching):
+        (WebKit::WebProcessProxy::validateFreezerStatus): Deleted.
+        * UIProcess/WebProcessProxy.h:
+        (WebKit::WebProcessProxy::removeProvisionalPageProxy):
+        (WebKit::WebProcessProxy::WebPageProxyMap::WebPageProxyMap): Deleted.
+        (WebKit::WebProcessProxy::WebPageProxyMap::size const): Deleted.
+        (WebKit::WebProcessProxy::WebPageProxyMap::values): Deleted.
+        (WebKit::WebProcessProxy::WebPageProxyMap::values const): Deleted.
+        (WebKit::WebProcessProxy::WebPageProxyMap::begin): Deleted.
+        (WebKit::WebProcessProxy::WebPageProxyMap::end): Deleted.
+        (WebKit::WebProcessProxy::WebPageProxyMap::get): Deleted.
+        (WebKit::WebProcessProxy::WebPageProxyMap::contains const): Deleted.
+        (WebKit::WebProcessProxy::WebPageProxyMap::isEmpty const): Deleted.
+        (WebKit::WebProcessProxy::WebPageProxyMap::set): Deleted.
+        (WebKit::WebProcessProxy::WebPageProxyMap::take): Deleted.
+        * WebProcess/WebProcess.cpp:
+        (WebKit::WebProcess::setIsInProcessCache):
+        (WebKit::WebProcess::markIsNoLongerPrewarmed):
+        (WebKit::WebProcess::actualPrepareToSuspend):
+        (WebKit::WebProcess::setFreezable): Deleted.
+        * WebProcess/WebProcess.h:
+        * WebProcess/WebProcess.messages.in:
+        * WebProcess/cocoa/WebProcessCocoa.mm:
+        (WebKit::WebProcess::updateProcessName):
+        (WebKit::WebProcess::shouldFreezeOnSuspension const):
+        (WebKit::WebProcess::updateFreezerStatus):
+
+2019-03-22  Chris Dumez  <[email protected]>
+
         Prewarmed processes should be usable with any website data store
         https://bugs.webkit.org/show_bug.cgi?id=196104
 

Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp (243387 => 243388)


--- trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp	2019-03-22 17:40:14 UTC (rev 243387)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp	2019-03-22 17:40:51 UTC (rev 243388)
@@ -115,10 +115,10 @@
     return ++uniquePageID;
 }
 
-static WebProcessProxy::WebPageProxyMap::MapType& globalPageMap()
+static WebProcessProxy::WebPageProxyMap& globalPageMap()
 {
     ASSERT(isMainThreadOrCheckDisabled());
-    static NeverDestroyed<WebProcessProxy::WebPageProxyMap::MapType> pageMap;
+    static NeverDestroyed<WebProcessProxy::WebPageProxyMap> pageMap;
     return pageMap;
 }
 
@@ -136,7 +136,6 @@
     , m_backgroundResponsivenessTimer(*this)
     , m_processPool(processPool, isPrewarmed == IsPrewarmed::Yes ? IsWeak::Yes : IsWeak::No)
     , m_mayHaveUniversalFileReadSandboxExtension(false)
-    , m_pageMap(*this)
     , m_numberOfTimesSuddenTerminationWasDisabled(0)
     , m_throttler(*this, processPool.shouldTakeUIBackgroundAssertion())
     , m_isResponsive(NoOrMaybe::Maybe)
@@ -188,18 +187,6 @@
 #endif
 }
 
-void WebProcessProxy::validateFreezerStatus()
-{
-#if PLATFORM(IOS_FAMILY)
-    bool value = !m_isPrewarmed && !m_isInProcessCache && !m_pageMap.isEmpty() && !isServiceWorkerProcess();
-    if (m_currentIsFreezableValue != WTF::nullopt && m_currentIsFreezableValue == value)
-        return;
-
-    m_currentIsFreezableValue = value;
-    send(Messages::WebProcess::SetFreezable(value), 0);
-#endif
-}
-
 void WebProcessProxy::setIsInProcessCache(bool value)
 {
     ASSERT(m_isInProcessCache != value);
@@ -215,8 +202,6 @@
         RELEASE_ASSERT(m_processPool);
         m_processPool.setIsWeak(IsWeak::No);
     }
-    
-    validateFreezerStatus();
 }
 
 void WebProcessProxy::setWebsiteDataStore(WebsiteDataStore& dataStore)
@@ -400,8 +385,6 @@
     RELEASE_ASSERT(m_processPool);
     m_processPool.setIsWeak(IsWeak::No);
 
-    validateFreezerStatus();
-
     send(Messages::WebProcess::MarkIsNoLongerPrewarmed(), 0);
 }
 
@@ -795,8 +778,6 @@
 
     unblockAccessibilityServerIfNeeded();
 #endif
-
-    validateFreezerStatus();
 }
 
 WebFrameProxy* WebProcessProxy::webFrame(uint64_t frameID) const

Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.h (243387 => 243388)


--- trunk/Source/WebKit/UIProcess/WebProcessProxy.h	2019-03-22 17:40:14 UTC (rev 243387)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.h	2019-03-22 17:40:51 UTC (rev 243388)
@@ -96,6 +96,7 @@
 class WebProcessProxy : public AuxiliaryProcessProxy, public ResponsivenessTimer::Client, public ThreadSafeRefCounted<WebProcessProxy>, public CanMakeWeakPtr<WebProcessProxy>, private ProcessThrottlerClient {
 public:
     typedef HashMap<uint64_t, RefPtr<WebFrameProxy>> WebFrameProxyMap;
+    typedef HashMap<uint64_t, WebPageProxy*> WebPageProxyMap;
     typedef HashMap<uint64_t, RefPtr<API::UserInitiatedAction>> UserInitiatedActionMap;
 
     enum class IsPrewarmed {
@@ -135,45 +136,6 @@
 
     void addProvisionalPageProxy(ProvisionalPageProxy& provisionalPage) { ASSERT(!m_provisionalPages.contains(&provisionalPage)); m_provisionalPages.add(&provisionalPage); }
     void removeProvisionalPageProxy(ProvisionalPageProxy& provisionalPage) { ASSERT(m_provisionalPages.contains(&provisionalPage)); m_provisionalPages.remove(&provisionalPage); }
-
-    class WebPageProxyMap {
-    public:
-        WebPageProxyMap(WebProcessProxy& proxy)
-            : m_proxy(proxy)
-        {
-        }
-
-        typedef HashMap<uint64_t, WebPageProxy*> MapType;
-        using ValuesConstIteratorRange = MapType::ValuesConstIteratorRange;
-
-        auto size() const { return m_map.size(); }
-        auto values() { return m_map.values(); }
-        auto values() const { return m_map.values(); }
-        auto begin() { return m_map.begin(); }
-        auto end() { return m_map.end(); }
-        auto get(uint64_t key) { return m_map.get(key); }
-        auto contains(uint64_t key) const { return m_map.contains(key); }
-        auto isEmpty() const { return m_map.isEmpty(); }
-
-        auto set(uint64_t key, WebPageProxy* value)
-        {
-            auto result = m_map.set(key, value);
-            m_proxy.validateFreezerStatus();
-            return result;
-        }
-
-        auto take(uint64_t key)
-        {
-            auto result = m_map.take(key);
-            m_proxy.validateFreezerStatus();
-            return result;
-        }
-
-    private:
-        WebProcessProxy& m_proxy;
-        MapType m_map;
-    };
-
     
     typename WebPageProxyMap::ValuesConstIteratorRange pages() const { return m_pageMap.values(); }
     unsigned pageCount() const { return m_pageMap.size(); }
@@ -508,7 +470,6 @@
     unsigned m_suspendedPageCount { 0 };
     bool m_hasCommittedAnyProvisionalLoads { false };
     bool m_isPrewarmed;
-    Optional<bool> m_currentIsFreezableValue;
 
 #if PLATFORM(WATCHOS)
     ProcessThrottler::BackgroundActivityToken m_backgroundActivityTokenForFullscreenFormControls;

Modified: trunk/Source/WebKit/WebProcess/WebProcess.cpp (243387 => 243388)


--- trunk/Source/WebKit/WebProcess/WebProcess.cpp	2019-03-22 17:40:14 UTC (rev 243387)
+++ trunk/Source/WebKit/WebProcess/WebProcess.cpp	2019-03-22 17:40:51 UTC (rev 243388)
@@ -150,10 +150,6 @@
 #include <_javascript_Core/RemoteInspector.h>
 #endif
 
-#if PLATFORM(IOS_FAMILY)
-#include <bmalloc/MemoryStatusSPI.h>
-#endif
-
 // This should be less than plugInAutoStartExpirationTimeThreshold in PlugInAutoStartProvider.
 static const Seconds plugInAutoStartExpirationTimeUpdateThreshold { 29 * 24 * 60 * 60 };
 
@@ -507,7 +503,7 @@
 
 void WebProcess::setIsInProcessCache(bool isInProcessCache)
 {
-#if PLATFORM(MAC)
+#if PLATFORM(COCOA)
     if (isInProcessCache) {
         ASSERT(m_processType == ProcessType::WebContent);
         m_processType = ProcessType::CachedWebContent;
@@ -524,7 +520,7 @@
 
 void WebProcess::markIsNoLongerPrewarmed()
 {
-#if PLATFORM(MAC)
+#if PLATFORM(COCOA)
     ASSERT(m_processType == ProcessType::PrewarmedWebContent);
     m_processType = ProcessType::WebContent;
 
@@ -1469,6 +1465,7 @@
 
 #if PLATFORM(IOS_FAMILY)
     accessibilityProcessSuspendedNotification(true);
+    updateFreezerStatus();
 #endif
 
     markAllLayersVolatile([this, shouldAcknowledgeWhenReadyToSuspend](bool success) {
@@ -1884,15 +1881,7 @@
     PlatformKeyboardEvent::setCurrentModifierState({ });
 }
 
-void WebProcess::setFreezable(bool freezable)
-{
 #if PLATFORM(IOS_FAMILY)
-    auto result = memorystatus_control(MEMORYSTATUS_CMD_SET_PROCESS_IS_FREEZABLE, getpid(), freezable ? 1 : 0, nullptr, 0);
-    ASSERT_UNUSED(result, !result);
-#endif
-}
-
-#if PLATFORM(IOS_FAMILY)
 void WebProcess::unblockAccessibilityServer(const SandboxExtension::Handle& handle)
 {
     bool ok = SandboxExtension::consumePermanently(handle);

Modified: trunk/Source/WebKit/WebProcess/WebProcess.h (243387 => 243388)


--- trunk/Source/WebKit/WebProcess/WebProcess.h	2019-03-22 17:40:14 UTC (rev 243387)
+++ trunk/Source/WebKit/WebProcess/WebProcess.h	2019-03-22 17:40:51 UTC (rev 243388)
@@ -411,7 +411,6 @@
     void didReceiveSyncWebProcessMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&);
 
 #if PLATFORM(MAC)
-    void updateProcessName();
     void setScreenProperties(const WebCore::ScreenProperties&);
 #if ENABLE(WEBPROCESS_WINDOWSERVER_BLOCKING)
     void scrollerStylePreferenceChanged(bool useOverlayScrollbars);
@@ -420,8 +419,15 @@
 #endif
 #endif
 
+#if PLATFORM(COCOA)
+    void updateProcessName();
+#endif
+
 #if PLATFORM(IOS)
     void backlightLevelDidChange(float backlightLevel);
+
+    bool shouldFreezeOnSuspension() const;
+    void updateFreezerStatus();
 #endif
 
 #if ENABLE(VIDEO)
@@ -430,7 +436,6 @@
 #endif
 
     void clearCurrentModifierStateForTesting();
-    void setFreezable(bool);
 
     RefPtr<WebConnectionToUIProcess> m_webConnection;
 
@@ -505,12 +510,15 @@
     std::unique_ptr<WebCore::CPUMonitor> m_cpuMonitor;
     Optional<double> m_cpuLimit;
 
-    enum class ProcessType { Inspector, ServiceWorker, PrewarmedWebContent, CachedWebContent, WebContent };
-    ProcessType m_processType { ProcessType::WebContent };
     String m_uiProcessName;
     WebCore::RegistrableDomain m_registrableDomain;
 #endif
 
+#if PLATFORM(COCOA)
+    enum class ProcessType { Inspector, ServiceWorker, PrewarmedWebContent, CachedWebContent, WebContent };
+    ProcessType m_processType { ProcessType::WebContent };
+#endif
+
     HashMap<WebCore::UserGestureToken *, uint64_t> m_userGestureTokens;
 
 #if PLATFORM(WAYLAND)

Modified: trunk/Source/WebKit/WebProcess/WebProcess.messages.in (243387 => 243388)


--- trunk/Source/WebKit/WebProcess/WebProcess.messages.in	2019-03-22 17:40:14 UTC (rev 243387)
+++ trunk/Source/WebKit/WebProcess/WebProcess.messages.in	2019-03-22 17:40:51 UTC (rev 243388)
@@ -162,6 +162,4 @@
 #if PLATFORM(IOS_FAMILY)
     UnblockAccessibilityServer(WebKit::SandboxExtension::Handle handle)
 #endif
-
-    SetFreezable(bool freezable)
 }

Modified: trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm (243387 => 243388)


--- trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm	2019-03-22 17:40:14 UTC (rev 243387)
+++ trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm	2019-03-22 17:40:51 UTC (rev 243388)
@@ -62,6 +62,7 @@
 #import <WebCore/NSScrollerImpDetails.h>
 #import <WebCore/PerformanceLogging.h>
 #import <WebCore/RuntimeApplicationChecks.h>
+#import <WebCore/SWContextManager.h>
 #import <algorithm>
 #import <dispatch/dispatch.h>
 #import <objc/runtime.h>
@@ -80,6 +81,10 @@
 #endif
 
 #if PLATFORM(IOS_FAMILY)
+#include <bmalloc/MemoryStatusSPI.h>
+#endif
+
+#if PLATFORM(IOS_FAMILY)
 #import "WKAccessibilityWebPageObjectIOS.h"
 #import <UIKit/UIAccessibility.h>
 #import <pal/spi/ios/GraphicsServicesSPI.h>
@@ -237,9 +242,9 @@
 #endif
 }
 
-#if PLATFORM(MAC)
 void WebProcess::updateProcessName()
 {
+#if PLATFORM(MAC)
     NSString *applicationName;
     switch (m_processType) {
     case ProcessType::Inspector:
@@ -273,8 +278,8 @@
         ASSERT(!actualApplicationName.isEmpty());
 #endif
     });
+#endif // PLATFORM(MAC)
 }
-#endif // PLATFORM(MAC)
 
 static void registerWithAccessibility()
 {
@@ -681,6 +686,36 @@
 {
     UIAccessibilityPostNotification(kAXPidStatusChangedNotification, @{ @"pid" : @(getpid()), @"suspended" : @(suspended) });
 }
+
+bool WebProcess::shouldFreezeOnSuspension() const
+{
+    switch (m_processType) {
+    case ProcessType::Inspector:
+    case ProcessType::ServiceWorker:
+    case ProcessType::PrewarmedWebContent:
+    case ProcessType::CachedWebContent:
+        return false;
+    case ProcessType::WebContent:
+        break;
+    }
+
+    for (auto& page : m_pageMap.values()) {
+        if (!page->isSuspended())
+            return false;
+    }
+
+    return true;
+}
+
+void WebProcess::updateFreezerStatus()
+{
+    bool isFreezable = shouldFreezeOnSuspension();
+    auto result = memorystatus_control(MEMORYSTATUS_CMD_SET_PROCESS_IS_FREEZABLE, getpid(), isFreezable ? 1 : 0, nullptr, 0);
+    if (result)
+        RELEASE_LOG_ERROR(ProcessSuspension, "%p - WebProcess::updateFreezerStatus() isFreezable: %d, error: %d", this, isFreezable, result);
+    else
+        RELEASE_LOG(ProcessSuspension, "%p - WebProcess::updateFreezerStatus() isFreezable: %d, success", this, isFreezable);
+}
 #endif
 
 #if PLATFORM(MAC) && ENABLE(WEBPROCESS_WINDOWSERVER_BLOCKING)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to