<!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>[153562] trunk/Source/WebKit/blackberry</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/153562">153562</a></dd>
<dt>Author</dt> <dd>zhajiang@rim.com</dd>
<dt>Date</dt> <dd>2013-07-31 19:20:22 -0700 (Wed, 31 Jul 2013)</dd>
</dl>

<h3>Log Message</h3>
<pre>[BlackBerry] Page scrolls when width equals device width and initial scale is greater than 0.92
https://bugs.webkit.org/show_bug.cgi?id=119365

Patch by Jacky Jiang &lt;zhajiang@blackberry.com&gt; on 2013-07-31
Reviewed by Rob Buis.
Internally reviewed by Gen Mak and Konrad Piascik.

JIRA 445423
layoutSize (deviceScreenSize/devicePixelRatio) is FloatSize as devicePixelRatio
is float. We have to round that to IntSize as ScrollView needs IntSize
fixedLayoutSize. Based on conversion result, zoomToFitWidthScale will
hardly equal to zoomToFitHeightScale in this case. And unfortunately
zoomToFitHeightScale is a little bit greater than zoomToFitWidthScale
in this case so that we have to pick up zoomToFitHeightScale which makes
the page scollable horizontally.
The way to fix that is to define an accurate contentsSize area which
potentially has float layoutSize rounding error and can cause upexpected
scroll based on the ideal contentsSize area first, and then don't scroll
only if the scale is zoomToFitScale as &quot;contentsSize &gt; visibleViewportSize&quot;
still works well if the scale is larger than zoomToFitScale.

* Api/WebPage.cpp:
(BlackBerry::WebKit::WebPagePrivate::hasFloatLayoutSizeRoundingError):
* Api/WebPage_p.h:
* WebKitSupport/WebKitThreadViewportAccessor.cpp:
(BlackBerry::WebKit::WebKitThreadViewportAccessor::cannotScrollIfHasFloatLayoutSizeRoundingError):
* WebKitSupport/WebKitThreadViewportAccessor.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKitblackberryApiWebPagecpp">trunk/Source/WebKit/blackberry/Api/WebPage.cpp</a></li>
<li><a href="#trunkSourceWebKitblackberryApiWebPage_ph">trunk/Source/WebKit/blackberry/Api/WebPage_p.h</a></li>
<li><a href="#trunkSourceWebKitblackberryChangeLog">trunk/Source/WebKit/blackberry/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitblackberryWebKitSupportWebKitThreadViewportAccessorcpp">trunk/Source/WebKit/blackberry/WebKitSupport/WebKitThreadViewportAccessor.cpp</a></li>
<li><a href="#trunkSourceWebKitblackberryWebKitSupportWebKitThreadViewportAccessorh">trunk/Source/WebKit/blackberry/WebKitSupport/WebKitThreadViewportAccessor.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKitblackberryApiWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/blackberry/Api/WebPage.cpp (153561 => 153562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/blackberry/Api/WebPage.cpp        2013-08-01 02:17:16 UTC (rev 153561)
+++ trunk/Source/WebKit/blackberry/Api/WebPage.cpp        2013-08-01 02:20:22 UTC (rev 153562)
</span><span class="lines">@@ -1695,6 +1695,17 @@
</span><span class="cx">     return std::min(zoomToFitScale, maximumImageDocumentZoomToFitScale);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool WebPagePrivate::hasFloatLayoutSizeRoundingError() const
+{
+    int contentsWidth = contentsSize().width();
+    int contentsHeight = contentsSize().height();
+    float devicePixelRatio = m_webSettings-&gt;devicePixelRatio();
+    float idealContentsWidth = static_cast&lt;float&gt;(transformedActualVisibleSize().width()) / devicePixelRatio;
+    float idealContentsHeight = static_cast&lt;float&gt;(transformedActualVisibleSize().height()) / devicePixelRatio;
+    return devicePixelRatio &gt; 1 &amp;&amp; contentsWidth &lt; idealContentsWidth &amp;&amp; (contentsWidth + 1) &gt; idealContentsWidth
+        &amp;&amp; contentsHeight &lt; idealContentsHeight &amp;&amp; (contentsHeight + 1) &gt; idealContentsHeight;
+}
+
</ins><span class="cx"> bool WebPagePrivate::respectViewport() const
</span><span class="cx"> {
</span><span class="cx">     return m_forceRespectViewportArguments || contentsSize().width() &lt;= m_virtualViewportSize.width() + 1;
</span></span></pre></div>
<a id="trunkSourceWebKitblackberryApiWebPage_ph"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/blackberry/Api/WebPage_p.h (153561 => 153562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/blackberry/Api/WebPage_p.h        2013-08-01 02:17:16 UTC (rev 153561)
+++ trunk/Source/WebKit/blackberry/Api/WebPage_p.h        2013-08-01 02:20:22 UTC (rev 153562)
</span><span class="lines">@@ -247,6 +247,12 @@
</span><span class="cx">     // Various scale factors.
</span><span class="cx">     double currentScale() const { return m_transformationMatrix-&gt;m11(); }
</span><span class="cx">     double zoomToFitScale() const;
</span><ins>+
+    // When layoutSize is rounded from FloatSize to IntSize, it happens that contents
+    // can not be zoomed to fit the visible viewport both horizontally and vertically
+    // due to rounding error only and causes unexpected scroll.
+    bool hasFloatLayoutSizeRoundingError() const;
+
</ins><span class="cx">     bool respectViewport() const;
</span><span class="cx">     double initialScale() const;
</span><span class="cx">     void setInitialScale(double scale) { m_initialScale = scale; }
</span></span></pre></div>
<a id="trunkSourceWebKitblackberryChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/blackberry/ChangeLog (153561 => 153562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/blackberry/ChangeLog        2013-08-01 02:17:16 UTC (rev 153561)
+++ trunk/Source/WebKit/blackberry/ChangeLog        2013-08-01 02:20:22 UTC (rev 153562)
</span><span class="lines">@@ -1,3 +1,32 @@
</span><ins>+2013-07-31  Jacky Jiang  &lt;zhajiang@blackberry.com&gt;
+
+        [BlackBerry] Page scrolls when width equals device width and initial scale is greater than 0.92
+        https://bugs.webkit.org/show_bug.cgi?id=119365
+
+        Reviewed by Rob Buis.
+        Internally reviewed by Gen Mak and Konrad Piascik.
+
+        JIRA 445423
+        layoutSize (deviceScreenSize/devicePixelRatio) is FloatSize as devicePixelRatio
+        is float. We have to round that to IntSize as ScrollView needs IntSize
+        fixedLayoutSize. Based on conversion result, zoomToFitWidthScale will
+        hardly equal to zoomToFitHeightScale in this case. And unfortunately
+        zoomToFitHeightScale is a little bit greater than zoomToFitWidthScale
+        in this case so that we have to pick up zoomToFitHeightScale which makes
+        the page scollable horizontally.
+        The way to fix that is to define an accurate contentsSize area which
+        potentially has float layoutSize rounding error and can cause upexpected
+        scroll based on the ideal contentsSize area first, and then don't scroll
+        only if the scale is zoomToFitScale as &quot;contentsSize &gt; visibleViewportSize&quot;
+        still works well if the scale is larger than zoomToFitScale.
+
+        * Api/WebPage.cpp:
+        (BlackBerry::WebKit::WebPagePrivate::hasFloatLayoutSizeRoundingError):
+        * Api/WebPage_p.h:
+        * WebKitSupport/WebKitThreadViewportAccessor.cpp:
+        (BlackBerry::WebKit::WebKitThreadViewportAccessor::cannotScrollIfHasFloatLayoutSizeRoundingError):
+        * WebKitSupport/WebKitThreadViewportAccessor.h:
+
</ins><span class="cx"> 2013-07-27  Jacky Jiang  &lt;zhajiang@blackberry.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Replace all uses of GraphicsLayer::create function with the one that takes a GraphicsLayerFactory
</span></span></pre></div>
<a id="trunkSourceWebKitblackberryWebKitSupportWebKitThreadViewportAccessorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/blackberry/WebKitSupport/WebKitThreadViewportAccessor.cpp (153561 => 153562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/blackberry/WebKitSupport/WebKitThreadViewportAccessor.cpp        2013-08-01 02:17:16 UTC (rev 153561)
+++ trunk/Source/WebKit/blackberry/WebKitSupport/WebKitThreadViewportAccessor.cpp        2013-08-01 02:20:22 UTC (rev 153562)
</span><span class="lines">@@ -88,5 +88,15 @@
</span><span class="cx">     return m_webPagePrivate-&gt;currentScale();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool WebKitThreadViewportAccessor::cannotScrollIfHasFloatLayoutSizeRoundingError() const
+{
+    ASSERT(Platform::webKitThreadMessageClient()-&gt;isCurrentThread());
+
+    // floatLayoutSizeRoundingError can cause inaccurate pixelContentsSize and result in
+    // unexpected scroll only when the current scale is zoomToFitScale. We have to exclude this case.
+    return m_webPagePrivate-&gt;hasFloatLayoutSizeRoundingError()
+        &amp;&amp; fabsf(m_webPagePrivate-&gt;currentScale() - m_webPagePrivate-&gt;zoomToFitScale()) &lt; FLT_EPSILON;
+}
+
</ins><span class="cx"> } // namespace WebKit
</span><span class="cx"> } // namespace BlackBerry
</span></span></pre></div>
<a id="trunkSourceWebKitblackberryWebKitSupportWebKitThreadViewportAccessorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/blackberry/WebKitSupport/WebKitThreadViewportAccessor.h (153561 => 153562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/blackberry/WebKitSupport/WebKitThreadViewportAccessor.h        2013-08-01 02:17:16 UTC (rev 153561)
+++ trunk/Source/WebKit/blackberry/WebKitSupport/WebKitThreadViewportAccessor.h        2013-08-01 02:20:22 UTC (rev 153562)
</span><span class="lines">@@ -36,6 +36,8 @@
</span><span class="cx"> 
</span><span class="cx">     virtual double scale() const;
</span><span class="cx"> 
</span><ins>+    virtual bool cannotScrollIfHasFloatLayoutSizeRoundingError() const;
+
</ins><span class="cx"> private:
</span><span class="cx">     Platform::ViewportAccessor* m_originalAccessor;
</span><span class="cx">     WebPagePrivate* m_webPagePrivate;
</span></span></pre>
</div>
</div>

</body>
</html>