<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[185123] trunk/Source/WebKit2</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/185123">185123</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2015-06-02 14:30:27 -0700 (Tue, 02 Jun 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[iOS][WK2] Always mark layers as volatile for background pages
https://bugs.webkit.org/show_bug.cgi?id=145547
&lt;rdar://problem/20663184&gt;

Reviewed by Simon Fraser.

We previously marked layers as volatile when the WebProcess was about
to be suspended. Most of the time the WebProcess gets suspended when a
page goes into the background. However, it is not always true (see
radar), in which case the layers won't be marked as volatile and use
memory even though they are not visible.

We now mark layers as volatile as soon as the page goes into the
background, instead of relying on the WebProcess suspension mechanism
to do so.

A new ApplicationDidEnterBackground IPC message from the UIProcess to
the WebProcess is added (in addition to the pre-existing
ApplicationWillEnterForeground one). When the WebProcess receives this
message, it will freeze the layer tree state and mark the layers as
volatile (with a timer to keep retrying if needed), similarly to what
is already done in WebProcess::actualPrepareToSuspend().
When the ApplicationWillEnterForeground is received, we unfreeze the
layer tree state. The layers' volatile state will be automatically
updated when they are displayed (see setBufferVolatility() call in
RemoteLayerBackingStore::display()).

* UIProcess/WebPageProxy.h:
* UIProcess/ios/WKContentView.mm:
(-[WKContentView _applicationDidEnterBackground:]):
* UIProcess/ios/WebPageProxyIOS.mm:
(WebKit::WebPageProxy::applicationDidEnterBackground):
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::WebPage):
(WebKit::WebPage::setLayerTreeStateIsFrozen):
(WebKit::WebPage::markLayersVolatileImmediatelyIfPossible):
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/WebPage.messages.in:
* WebProcess/WebPage/ios/WebPageIOS.mm:
(WebKit::WebPage::volatilityTimerFired):
(WebKit::WebPage::applicationDidEnterBackground):
(WebKit::WebPage::applicationWillEnterForeground):
* WebProcess/WebProcess.cpp:
(WebKit::WebProcess::markAllLayersVolatileIfPossible):
(WebKit::WebProcess::setAllLayerTreeStatesFrozen):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxyh">trunk/Source/WebKit2/UIProcess/WebPageProxy.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessiosWKContentViewmm">trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessiosWebPageProxyIOSmm">trunk/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagecpp">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPageh">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagemessagesin">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageiosWebPageIOSmm">trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebProcesscpp">trunk/Source/WebKit2/WebProcess/WebProcess.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (185122 => 185123)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-06-02 21:24:10 UTC (rev 185122)
+++ trunk/Source/WebKit2/ChangeLog        2015-06-02 21:30:27 UTC (rev 185123)
</span><span class="lines">@@ -1,3 +1,51 @@
</span><ins>+2015-06-02  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        [iOS][WK2] Always mark layers as volatile for background pages
+        https://bugs.webkit.org/show_bug.cgi?id=145547
+        &lt;rdar://problem/20663184&gt;
+
+        Reviewed by Simon Fraser.
+
+        We previously marked layers as volatile when the WebProcess was about
+        to be suspended. Most of the time the WebProcess gets suspended when a
+        page goes into the background. However, it is not always true (see
+        radar), in which case the layers won't be marked as volatile and use
+        memory even though they are not visible.
+
+        We now mark layers as volatile as soon as the page goes into the
+        background, instead of relying on the WebProcess suspension mechanism
+        to do so.
+
+        A new ApplicationDidEnterBackground IPC message from the UIProcess to
+        the WebProcess is added (in addition to the pre-existing
+        ApplicationWillEnterForeground one). When the WebProcess receives this
+        message, it will freeze the layer tree state and mark the layers as
+        volatile (with a timer to keep retrying if needed), similarly to what
+        is already done in WebProcess::actualPrepareToSuspend().
+        When the ApplicationWillEnterForeground is received, we unfreeze the
+        layer tree state. The layers' volatile state will be automatically
+        updated when they are displayed (see setBufferVolatility() call in
+        RemoteLayerBackingStore::display()).
+
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/ios/WKContentView.mm:
+        (-[WKContentView _applicationDidEnterBackground:]):
+        * UIProcess/ios/WebPageProxyIOS.mm:
+        (WebKit::WebPageProxy::applicationDidEnterBackground):
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::WebPage):
+        (WebKit::WebPage::setLayerTreeStateIsFrozen):
+        (WebKit::WebPage::markLayersVolatileImmediatelyIfPossible):
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/WebPage.messages.in:
+        * WebProcess/WebPage/ios/WebPageIOS.mm:
+        (WebKit::WebPage::volatilityTimerFired):
+        (WebKit::WebPage::applicationDidEnterBackground):
+        (WebKit::WebPage::applicationWillEnterForeground):
+        * WebProcess/WebProcess.cpp:
+        (WebKit::WebProcess::markAllLayersVolatileIfPossible):
+        (WebKit::WebProcess::setAllLayerTreeStatesFrozen):
+
</ins><span class="cx"> 2015-06-02  Brady Eidson  &lt;beidson@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         WebKit policy delegate should suggest if a navigation should be allowed to open URLs externally.
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (185122 => 185123)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2015-06-02 21:24:10 UTC (rev 185122)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2015-06-02 21:30:27 UTC (rev 185123)
</span><span class="lines">@@ -498,6 +498,7 @@
</span><span class="cx">     void setAssistedNodeValue(const String&amp;);
</span><span class="cx">     void setAssistedNodeValueAsNumber(double);
</span><span class="cx">     void setAssistedNodeSelectedIndex(uint32_t index, bool allowMultipleSelection = false);
</span><ins>+    void applicationDidEnterBackground();
</ins><span class="cx">     void applicationWillEnterForeground();
</span><span class="cx">     void applicationWillResignActive();
</span><span class="cx">     void applicationDidBecomeActive();
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessiosWKContentViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm (185122 => 185123)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm        2015-06-02 21:24:10 UTC (rev 185122)
+++ trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm        2015-06-02 21:30:27 UTC (rev 185123)
</span><span class="lines">@@ -549,6 +549,7 @@
</span><span class="cx"> - (void)_applicationDidEnterBackground:(NSNotification*)notification
</span><span class="cx"> {
</span><span class="cx">     _isBackground = YES;
</span><ins>+    _page-&gt;applicationDidEnterBackground();
</ins><span class="cx">     _page-&gt;viewStateDidChange(ViewState::AllFlags &amp; ~ViewState::IsInWindow);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessiosWebPageProxyIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm (185122 => 185123)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm        2015-06-02 21:24:10 UTC (rev 185122)
+++ trunk/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm        2015-06-02 21:30:27 UTC (rev 185123)
</span><span class="lines">@@ -593,6 +593,11 @@
</span><span class="cx">     m_pageClient.didUpdateBlockSelectionWithTouch(touch, flags, growThreshold, shrinkThreshold);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebPageProxy::applicationDidEnterBackground()
+{
+    m_process-&gt;send(Messages::WebPage::ApplicationDidEnterBackground(), m_pageID);
+}
+
</ins><span class="cx"> void WebPageProxy::applicationWillEnterForeground()
</span><span class="cx"> {
</span><span class="cx">     m_process-&gt;send(Messages::WebPage::ApplicationWillEnterForeground(), m_pageID);
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (185122 => 185123)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2015-06-02 21:24:10 UTC (rev 185122)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2015-06-02 21:30:27 UTC (rev 185123)
</span><span class="lines">@@ -328,6 +328,7 @@
</span><span class="cx">     , m_availableScreenSize(parameters.availableScreenSize)
</span><span class="cx">     , m_deviceOrientation(0)
</span><span class="cx">     , m_inDynamicSizeUpdate(false)
</span><ins>+    , m_volatilityTimer(*this, &amp;WebPage::volatilityTimerFired)
</ins><span class="cx"> #endif
</span><span class="cx">     , m_inspectorClient(0)
</span><span class="cx">     , m_backgroundColor(Color::white)
</span><span class="lines">@@ -1860,6 +1861,24 @@
</span><span class="cx">     return g_currentEvent;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebPage::setLayerTreeStateIsFrozen(bool frozen)
+{
+    auto* drawingArea = this-&gt;drawingArea();
+    if (!drawingArea)
+        return;
+
+    drawingArea-&gt;setLayerTreeStateIsFrozen(frozen);
+}
+
+bool WebPage::markLayersVolatileImmediatelyIfPossible()
+{
+    auto* drawingArea = this-&gt;drawingArea();
+    if (!drawingArea)
+        return true;
+
+    return drawingArea-&gt;markLayersVolatileImmediatelyIfPossible();
+}
+
</ins><span class="cx"> class CurrentEvent {
</span><span class="cx"> public:
</span><span class="cx">     explicit CurrentEvent(const WebEvent&amp; event)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h (185122 => 185123)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2015-06-02 21:24:10 UTC (rev 185122)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2015-06-02 21:30:27 UTC (rev 185123)
</span><span class="lines">@@ -553,6 +553,9 @@
</span><span class="cx">     void disableInspectorNodeSearch();
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+    void setLayerTreeStateIsFrozen(bool);
+    bool markLayersVolatileImmediatelyIfPossible();
+
</ins><span class="cx">     NotificationPermissionRequestManager* notificationPermissionRequestManager();
</span><span class="cx"> 
</span><span class="cx">     void pageDidScroll();
</span><span class="lines">@@ -789,6 +792,7 @@
</span><span class="cx">     bool scaleWasSetByUIProcess() const { return m_scaleWasSetByUIProcess; }
</span><span class="cx">     void willStartUserTriggeredZooming();
</span><span class="cx">     void applicationWillResignActive();
</span><ins>+    void applicationDidEnterBackground();
</ins><span class="cx">     void applicationWillEnterForeground();
</span><span class="cx">     void applicationDidBecomeActive();
</span><span class="cx">     void zoomToRect(WebCore::FloatRect, double minimumScale, double maximumScale);
</span><span class="lines">@@ -918,6 +922,7 @@
</span><span class="cx">     void sendTapHighlightForNodeIfNecessary(uint64_t requestID, WebCore::Node*);
</span><span class="cx">     void resetTextAutosizingBeforeLayoutIfNeeded(const WebCore::FloatSize&amp; oldSize, const WebCore::FloatSize&amp; newSize);
</span><span class="cx">     WebCore::VisiblePosition visiblePositionInFocusedNodeForPoint(WebCore::Frame&amp;, const WebCore::IntPoint&amp;);
</span><ins>+    void volatilityTimerFired();
</ins><span class="cx"> #endif
</span><span class="cx"> #if !PLATFORM(COCOA)
</span><span class="cx">     static const char* interpretKeyEvent(const WebCore::KeyboardEvent*);
</span><span class="lines">@@ -1340,6 +1345,7 @@
</span><span class="cx">     RefPtr&lt;WebCore::Node&gt; m_pendingSyntheticClickNode;
</span><span class="cx">     WebCore::FloatPoint m_pendingSyntheticClickLocation;
</span><span class="cx">     WebCore::FloatRect m_previousExposedContentRect;
</span><ins>+    WebCore::Timer m_volatilityTimer;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     WebInspectorClient* m_inspectorClient;
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagemessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in (185122 => 185123)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in        2015-06-02 21:24:10 UTC (rev 185122)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in        2015-06-02 21:30:27 UTC (rev 185123)
</span><span class="lines">@@ -88,6 +88,7 @@
</span><span class="cx">     SetAssistedNodeValueAsNumber(double value)
</span><span class="cx">     SetAssistedNodeSelectedIndex(uint32_t index, bool allowMultipleSelection)
</span><span class="cx">     ApplicationWillResignActive()
</span><ins>+    ApplicationDidEnterBackground()
</ins><span class="cx">     ApplicationWillEnterForeground()
</span><span class="cx">     ApplicationDidBecomeActive()
</span><span class="cx">     ContentSizeCategoryDidChange(String contentSizeCategory)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageiosWebPageIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm (185122 => 185123)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm        2015-06-02 21:24:10 UTC (rev 185122)
+++ trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm        2015-06-02 21:30:27 UTC (rev 185123)
</span><span class="lines">@@ -2718,8 +2718,28 @@
</span><span class="cx">     [[NSNotificationCenter defaultCenter] postNotificationName:WebUIApplicationWillResignActiveNotification object:nil];
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebPage::volatilityTimerFired()
+{
+    if (!markLayersVolatileImmediatelyIfPossible())
+        return;
+
+    m_volatilityTimer.stop();
+}
+
+void WebPage::applicationDidEnterBackground()
+{
+    setLayerTreeStateIsFrozen(true);
+    if (markLayersVolatileImmediatelyIfPossible())
+        return;
+
+    m_volatilityTimer.startRepeating(std::chrono::milliseconds(200));
+}
+
</ins><span class="cx"> void WebPage::applicationWillEnterForeground()
</span><span class="cx"> {
</span><ins>+    m_volatilityTimer.stop();
+    setLayerTreeStateIsFrozen(false);
+
</ins><span class="cx">     [[NSNotificationCenter defaultCenter] postNotificationName:WebUIApplicationWillEnterForegroundNotification object:nil];
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebProcesscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebProcess.cpp (185122 => 185123)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebProcess.cpp        2015-06-02 21:24:10 UTC (rev 185122)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.cpp        2015-06-02 21:30:27 UTC (rev 185123)
</span><span class="lines">@@ -1266,20 +1266,16 @@
</span><span class="cx"> bool WebProcess::markAllLayersVolatileIfPossible()
</span><span class="cx"> {
</span><span class="cx">     bool successfullyMarkedAllLayersVolatile = true;
</span><del>-    for (auto&amp; page : m_pageMap.values()) {
-        if (auto drawingArea = page-&gt;drawingArea())
-            successfullyMarkedAllLayersVolatile &amp;= drawingArea-&gt;markLayersVolatileImmediatelyIfPossible();
-    }
</del><ins>+    for (auto&amp; page : m_pageMap.values())
+        successfullyMarkedAllLayersVolatile &amp;= page-&gt;markLayersVolatileImmediatelyIfPossible();
</ins><span class="cx"> 
</span><span class="cx">     return successfullyMarkedAllLayersVolatile;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebProcess::setAllLayerTreeStatesFrozen(bool frozen)
</span><span class="cx"> {
</span><del>-    for (auto&amp; page : m_pageMap.values()) {
-        if (auto drawingArea = page-&gt;drawingArea())
-            drawingArea-&gt;setLayerTreeStateIsFrozen(frozen);
-    }
</del><ins>+    for (auto&amp; page : m_pageMap.values())
+        page-&gt;setLayerTreeStateIsFrozen(frozen);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebProcess::processSuspensionCleanupTimerFired()
</span></span></pre>
</div>
</div>

</body>
</html>