<!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>[243453] trunk/Source/WebKit</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/243453">243453</a></dd>
<dt>Author</dt> <dd>krollin@apple.com</dd>
<dt>Date</dt> <dd>2019-03-25 13:46:53 -0700 (Mon, 25 Mar 2019)</dd>
</dl>

<h3>Log Message</h3>
<pre>Add WebKit logging for first paint and other interesting layout milestones
https://bugs.webkit.org/show_bug.cgi?id=196159
<rdar://problem/49128952>

Reviewed by Simon Fraser.

Add some logging to indicate what layout milestones have been reached.
This should help us determine if there's a client, rendering, layout,
or some other issue when page content does not appear in the client
window.

The logging is being added to
WebFrameLoaderClient::dispatchDidReachLayoutMilestone. This seems like
a nice central place to capture layout milestones. However, it will
only log notifications that are being sent to clients. It does not
indicate all milestones that have occurred. That is, it does not
report milestones that are filtered out due to client disinterest.
There doesn't seem to be a good central place to capture all
milestones, regardless of client interest.

* Platform/Logging.h:
* WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
(WebKit::WebFrameLoaderClient::dispatchDidReachLayoutMilestone):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKitChangeLog">trunk/Source/WebKit/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitPlatformLoggingh">trunk/Source/WebKit/Platform/Logging.h</a></li>
<li><a href="#trunkSourceWebKitWebProcessWebCoreSupportWebFrameLoaderClientcpp">trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKitChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/ChangeLog (243452 => 243453)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/ChangeLog    2019-03-25 20:45:37 UTC (rev 243452)
+++ trunk/Source/WebKit/ChangeLog       2019-03-25 20:46:53 UTC (rev 243453)
</span><span class="lines">@@ -1,3 +1,29 @@
</span><ins>+2019-03-25  Keith Rollin  <krollin@apple.com>
+
+        Add WebKit logging for first paint and other interesting layout milestones
+        https://bugs.webkit.org/show_bug.cgi?id=196159
+        <rdar://problem/49128952>
+
+        Reviewed by Simon Fraser.
+
+        Add some logging to indicate what layout milestones have been reached.
+        This should help us determine if there's a client, rendering, layout,
+        or some other issue when page content does not appear in the client
+        window.
+
+        The logging is being added to
+        WebFrameLoaderClient::dispatchDidReachLayoutMilestone. This seems like
+        a nice central place to capture layout milestones. However, it will
+        only log notifications that are being sent to clients. It does not
+        indicate all milestones that have occurred. That is, it does not
+        report milestones that are filtered out due to client disinterest.
+        There doesn't seem to be a good central place to capture all
+        milestones, regardless of client interest.
+
+        * Platform/Logging.h:
+        * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
+        (WebKit::WebFrameLoaderClient::dispatchDidReachLayoutMilestone):
+
</ins><span class="cx"> 2019-03-25  Patrick Griffis  <pgriffis@igalia.com>
</span><span class="cx"> 
</span><span class="cx">         [GTK][WPE] Remove network access from web process sandbox
</span></span></pre></div>
<a id="trunkSourceWebKitPlatformLoggingh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/Platform/Logging.h (243452 => 243453)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/Platform/Logging.h   2019-03-25 20:45:37 UTC (rev 243452)
+++ trunk/Source/WebKit/Platform/Logging.h      2019-03-25 20:46:53 UTC (rev 243453)
</span><span class="lines">@@ -55,6 +55,7 @@
</span><span class="cx">     M(IPC) \
</span><span class="cx">     M(KeyHandling) \
</span><span class="cx">     M(Layers) \
</span><ins>+    M(Layout) \
</ins><span class="cx">     M(Loading) \
</span><span class="cx">     M(LocalStorageDatabaseTracker) \
</span><span class="cx">     M(MouseHandling) \
</span></span></pre></div>
<a id="trunkSourceWebKitWebProcessWebCoreSupportWebFrameLoaderClientcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp (243452 => 243453)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp   2019-03-25 20:45:37 UTC (rev 243452)
+++ trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp      2019-03-25 20:46:53 UTC (rev 243453)
</span><span class="lines">@@ -646,6 +646,8 @@
</span><span class="cx">     RefPtr<API::Object> userData;
</span><span class="cx"> 
</span><span class="cx">     if (milestones & DidFirstLayout) {
</span><ins>+        RELEASE_LOG(Layout, "%p - WebFrameLoaderClient::dispatchDidReachLayoutMilestone: dispatching DidFirstLayoutForFrame, page = %p", this, webPage);
+
</ins><span class="cx">         // FIXME: We should consider removing the old didFirstLayout API since this is doing double duty with the
</span><span class="cx">         // new didLayout API.
</span><span class="cx">         webPage->injectedBundleLoaderClient().didFirstLayoutForFrame(*webPage, *m_frame, userData);
</span><span class="lines">@@ -654,6 +656,7 @@
</span><span class="cx"> #if PLATFORM(MAC)
</span><span class="cx">         // FIXME: Do this on DidFirstVisuallyNonEmptyLayout when Mac Safari is able to handle it (<rdar://problem/17580021>)
</span><span class="cx">         if (m_frame->isMainFrame() && !m_didCompletePageTransition && !webPage->corePage()->settings().suppressesIncrementalRendering()) {
</span><ins>+            RELEASE_LOG(Layout, "%p - WebFrameLoaderClient::dispatchDidReachLayoutMilestone: dispatching didCompletePageTransition, page = %p", this, webPage);
</ins><span class="cx">             webPage->didCompletePageTransition();
</span><span class="cx">             m_didCompletePageTransition = true;
</span><span class="cx">         }
</span><span class="lines">@@ -665,11 +668,35 @@
</span><span class="cx"> #endif
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+#if !RELEASE_LOG_DISABLED
+    StringBuilder builder;
+    auto addIfSet = [&milestones, &builder] (WebCore::LayoutMilestone milestone, const String& toAdd) {
+        if (milestones.contains(milestone)) {
+            if (!builder.isEmpty())
+                builder.append(", ");
+            builder.append(toAdd);
+        }
+    };
+
+    addIfSet(DidFirstLayout, "DidFirstLayout"_s);
+    addIfSet(DidFirstVisuallyNonEmptyLayout, "DidFirstVisuallyNonEmptyLayout"_s);
+    addIfSet(DidHitRelevantRepaintedObjectsAreaThreshold, "DidHitRelevantRepaintedObjectsAreaThreshold"_s);
+    addIfSet(DidFirstFlushForHeaderLayer, "DidFirstFlushForHeaderLayer"_s);
+    addIfSet(DidFirstLayoutAfterSuppressedIncrementalRendering, "DidFirstLayoutAfterSuppressedIncrementalRendering"_s);
+    addIfSet(DidFirstPaintAfterSuppressedIncrementalRendering, "DidFirstPaintAfterSuppressedIncrementalRendering"_s);
+    addIfSet(ReachedSessionRestorationRenderTreeSizeThreshold, "ReachedSessionRestorationRenderTreeSizeThreshold"_s);
+    addIfSet(DidRenderSignificantAmountOfText, "DidRenderSignificantAmountOfText"_s);
+    addIfSet(DidFirstMeaningfulPaint, "DidFirstMeaningfulPaint"_s);
+
+    RELEASE_LOG(Layout, "%p - WebFrameLoaderClient::dispatchDidReachLayoutMilestone: dispatching DidReachLayoutMilestone, page = %p, milestones = %{public}s", this, webPage, builder.toString().utf8().data());
+#endif
+
</ins><span class="cx">     // Send this after DidFirstLayout-specific calls since some clients expect to get those messages first.
</span><span class="cx">     webPage->dispatchDidReachLayoutMilestone(milestones);
</span><span class="cx"> 
</span><span class="cx">     if (milestones & DidFirstVisuallyNonEmptyLayout) {
</span><span class="cx">         if (m_frame->isMainFrame() && !m_didCompletePageTransition && !webPage->corePage()->settings().suppressesIncrementalRendering()) {
</span><ins>+            RELEASE_LOG(Layout, "%p - WebFrameLoaderClient::dispatchDidReachLayoutMilestone: dispatching didCompletePageTransition, page = %p", this, webPage);
</ins><span class="cx">             webPage->didCompletePageTransition();
</span><span class="cx">             m_didCompletePageTransition = true;
</span><span class="cx">         }
</span><span class="lines">@@ -676,6 +703,7 @@
</span><span class="cx"> 
</span><span class="cx">         // FIXME: We should consider removing the old didFirstVisuallyNonEmptyLayoutForFrame API since this is doing
</span><span class="cx">         // double duty with the new didLayout API.
</span><ins>+        RELEASE_LOG(Layout, "%p - WebFrameLoaderClient::dispatchDidReachLayoutMilestone: dispatching DidFirstVisuallyNonEmptyLayoutForFrame, page = %p", this, webPage);
</ins><span class="cx">         webPage->injectedBundleLoaderClient().didFirstVisuallyNonEmptyLayoutForFrame(*webPage, *m_frame, userData);
</span><span class="cx">         webPage->send(Messages::WebPageProxy::DidFirstVisuallyNonEmptyLayoutForFrame(m_frame->frameID(), UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())));
</span><span class="cx">     }
</span></span></pre>
</div>
</div>

</body>
</html>