<!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>[186786] trunk/Source</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/186786">186786</a></dd>
<dt>Author</dt> <dd>simon.fraser@apple.com</dd>
<dt>Date</dt> <dd>2015-07-13 15:24:10 -0700 (Mon, 13 Jul 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[iOS WK2] When choosing an initial viewport scale, take overflow on the &lt;body&gt; into account
https://bugs.webkit.org/show_bug.cgi?id=146918
rdar://problem/9222837

Reviewed by Tim Horton.

Use as input to the viewport scaling algorithm a contents size from the FrameView
that takes overflow on the viewport renderer into account. This prevents unexpected
viewports scaling on pages that have content that overflows their expressed contents size,
but apply overflow to the &lt;body&gt;.

Source/WebCore:

* page/FrameView.cpp:
(WebCore::FrameView::contentsSizeRespectingOverflow): Look for overflow:hidden on each axis of
the m_viewportRenderer, which is computed post-layout by calculateScrollbarModesForLayout()
and is used for scrollbar logic on OS X. Clip unscaledDocumentRect on each axis, and then
apply page scale.
* page/FrameView.h:

Source/WebKit2:

* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::mainFrameDidLayout): Use contentsSizeRespectingOverflow(),
rather than raw contentsSize(), to determine scaling.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorepageFrameViewcpp">trunk/Source/WebCore/page/FrameView.cpp</a></li>
<li><a href="#trunkSourceWebCorepageFrameViewh">trunk/Source/WebCore/page/FrameView.h</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagecpp">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (186785 => 186786)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-07-13 22:16:54 UTC (rev 186785)
+++ trunk/Source/WebCore/ChangeLog        2015-07-13 22:24:10 UTC (rev 186786)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2015-07-13  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+        [iOS WK2] When choosing an initial viewport scale, take overflow on the &lt;body&gt; into account
+        https://bugs.webkit.org/show_bug.cgi?id=146918
+        rdar://problem/9222837
+
+        Reviewed by Tim Horton.
+
+        Use as input to the viewport scaling algorithm a contents size from the FrameView
+        that takes overflow on the viewport renderer into account. This prevents unexpected
+        viewports scaling on pages that have content that overflows their expressed contents size,
+        but apply overflow to the &lt;body&gt;.
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::contentsSizeRespectingOverflow): Look for overflow:hidden on each axis of
+        the m_viewportRenderer, which is computed post-layout by calculateScrollbarModesForLayout()
+        and is used for scrollbar logic on OS X. Clip unscaledDocumentRect on each axis, and then
+        apply page scale.
+        * page/FrameView.h:
+
</ins><span class="cx"> 2015-07-13  Brent Fulgham  &lt;bfulgham@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Update WebCore Features.json
</span></span></pre></div>
<a id="trunkSourceWebCorepageFrameViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/FrameView.cpp (186785 => 186786)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/FrameView.cpp        2015-07-13 22:16:54 UTC (rev 186785)
+++ trunk/Source/WebCore/page/FrameView.cpp        2015-07-13 22:24:10 UTC (rev 186786)
</span><span class="lines">@@ -617,6 +617,29 @@
</span><span class="cx">     setContentsSize(size);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+IntSize FrameView::contentsSizeRespectingOverflow() const
+{
+    RenderView* renderView = this-&gt;renderView();
+    if (!renderView || !m_viewportRenderer || !is&lt;RenderBox&gt;(m_viewportRenderer) || !frame().isMainFrame())
+        return contentsSize();
+
+    ASSERT(frame().view() == this);
+
+    FloatRect contentRect = renderView-&gt;unscaledDocumentRect();
+    RenderBox&amp; viewportRendererBox = downcast&lt;RenderBox&gt;(*m_viewportRenderer);
+
+    if (m_viewportRenderer-&gt;style().overflowX() == OHIDDEN)
+        contentRect.setWidth(std::min&lt;float&gt;(contentRect.width(), viewportRendererBox.frameRect().width()));
+
+    if (m_viewportRenderer-&gt;style().overflowY() == OHIDDEN)
+        contentRect.setHeight(std::min&lt;float&gt;(contentRect.height(), viewportRendererBox.frameRect().height()));
+
+    if (renderView-&gt;hasTransform())
+        contentRect = renderView-&gt;layer()-&gt;currentTransform().mapRect(contentRect);
+
+    return IntSize(contentRect.size());
+}
+
</ins><span class="cx"> void FrameView::applyOverflowToViewport(RenderElement* renderer, ScrollbarMode&amp; hMode, ScrollbarMode&amp; vMode)
</span><span class="cx"> {
</span><span class="cx">     // Handle the overflow:hidden/scroll case for the body/html elements.  WinIE treats
</span></span></pre></div>
<a id="trunkSourceWebCorepageFrameViewh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/FrameView.h (186785 => 186786)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/FrameView.h        2015-07-13 22:16:54 UTC (rev 186785)
+++ trunk/Source/WebCore/page/FrameView.h        2015-07-13 22:24:10 UTC (rev 186786)
</span><span class="lines">@@ -105,6 +105,8 @@
</span><span class="cx">     virtual void setContentsSize(const IntSize&amp;) override;
</span><span class="cx">     virtual void updateContentsSize() override;
</span><span class="cx"> 
</span><ins>+    WEBCORE_EXPORT IntSize contentsSizeRespectingOverflow() const;
+
</ins><span class="cx">     void layout(bool allowSubtree = true);
</span><span class="cx">     WEBCORE_EXPORT bool didFirstLayout() const;
</span><span class="cx">     void layoutTimerFired();
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (186785 => 186786)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-07-13 22:16:54 UTC (rev 186785)
+++ trunk/Source/WebKit2/ChangeLog        2015-07-13 22:24:10 UTC (rev 186786)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2015-07-13  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+        [iOS WK2] When choosing an initial viewport scale, take overflow on the &lt;body&gt; into account
+        https://bugs.webkit.org/show_bug.cgi?id=146918
+        rdar://problem/9222837
+
+        Reviewed by Tim Horton.
+
+        Use as input to the viewport scaling algorithm a contents size from the FrameView
+        that takes overflow on the viewport renderer into account. This prevents unexpected
+        viewports scaling on pages that have content that overflows their expressed contents size,
+        but apply overflow to the &lt;body&gt;.
+
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::mainFrameDidLayout): Use contentsSizeRespectingOverflow(),
+        rather than raw contentsSize(), to determine scaling.
+
</ins><span class="cx"> 2015-07-13  Dan Bernstein  &lt;mitz@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Fixed the build.
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (186785 => 186786)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2015-07-13 22:16:54 UTC (rev 186785)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2015-07-13 22:24:10 UTC (rev 186786)
</span><span class="lines">@@ -3508,7 +3508,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     if (FrameView* frameView = mainFrameView()) {
</span><del>-        IntSize newContentSize = frameView-&gt;contentsSize();
</del><ins>+        IntSize newContentSize = frameView-&gt;contentsSizeRespectingOverflow();
</ins><span class="cx">         if (m_viewportConfiguration.contentsSize() != newContentSize) {
</span><span class="cx">             m_viewportConfiguration.setContentsSize(newContentSize);
</span><span class="cx">             viewportConfigurationChanged();
</span></span></pre>
</div>
</div>

</body>
</html>