<!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>[183510] trunk/Source/WebCore</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/183510">183510</a></dd>
<dt>Author</dt> <dd>simon.fraser@apple.com</dd>
<dt>Date</dt> <dd>2015-04-28 14:51:04 -0700 (Tue, 28 Apr 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Provide contentsToView() and viewToContents() functions on ScrollView, and use them
https://bugs.webkit.org/show_bug.cgi?id=144357

Reviewed by Tim Horton.

Too much code was consulting topContentInset() and headerHeight() directly. Replace
with calls to new contentsToView() and viewToContents() functions, which wrap the
exisiting documentScrollOffsetRelativeToViewOrigin().

Use the new functions in FrameView and ScrollView coordinate mapping functions.

No behavior change.

* page/FrameView.cpp:
(WebCore::FrameView::convertFromRendererToContainingView):
(WebCore::FrameView::convertFromContainingViewToRenderer):
* platform/ScrollView.cpp:
(WebCore::ScrollView::viewToContents):
(WebCore::ScrollView::contentsToView):
(WebCore::ScrollView::rootViewToContents):
(WebCore::ScrollView::contentsToRootView):
(WebCore::ScrollView::rootViewToTotalContents):
(WebCore::ScrollView::windowToContents):
(WebCore::ScrollView::contentsToWindow):
* platform/ScrollView.h:</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="#trunkSourceWebCoreplatformScrollViewcpp">trunk/Source/WebCore/platform/ScrollView.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformScrollViewh">trunk/Source/WebCore/platform/ScrollView.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (183509 => 183510)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-04-28 21:40:10 UTC (rev 183509)
+++ trunk/Source/WebCore/ChangeLog        2015-04-28 21:51:04 UTC (rev 183510)
</span><span class="lines">@@ -1,3 +1,31 @@
</span><ins>+2015-04-28  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+        Provide contentsToView() and viewToContents() functions on ScrollView, and use them
+        https://bugs.webkit.org/show_bug.cgi?id=144357
+
+        Reviewed by Tim Horton.
+
+        Too much code was consulting topContentInset() and headerHeight() directly. Replace
+        with calls to new contentsToView() and viewToContents() functions, which wrap the
+        exisiting documentScrollOffsetRelativeToViewOrigin().
+        
+        Use the new functions in FrameView and ScrollView coordinate mapping functions.
+        
+        No behavior change.
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::convertFromRendererToContainingView):
+        (WebCore::FrameView::convertFromContainingViewToRenderer):
+        * platform/ScrollView.cpp:
+        (WebCore::ScrollView::viewToContents):
+        (WebCore::ScrollView::contentsToView):
+        (WebCore::ScrollView::rootViewToContents):
+        (WebCore::ScrollView::contentsToRootView):
+        (WebCore::ScrollView::rootViewToTotalContents):
+        (WebCore::ScrollView::windowToContents):
+        (WebCore::ScrollView::contentsToWindow):
+        * platform/ScrollView.h:
+
</ins><span class="cx"> 2015-04-28  Eric Carlson  &lt;eric.carlson@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Mac] Simplify code to support media engines which do not support target playback
</span></span></pre></div>
<a id="trunkSourceWebCorepageFrameViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/FrameView.cpp (183509 => 183510)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/FrameView.cpp        2015-04-28 21:40:10 UTC (rev 183509)
+++ trunk/Source/WebCore/page/FrameView.cpp        2015-04-28 21:51:04 UTC (rev 183510)
</span><span class="lines">@@ -4199,9 +4199,8 @@
</span><span class="cx"> {
</span><span class="cx">     IntRect rect = snappedIntRect(enclosingLayoutRect(renderer-&gt;localToAbsoluteQuad(FloatRect(rendererRect)).boundingBox()));
</span><span class="cx"> 
</span><del>-    // Convert from page (&quot;absolute&quot;) to FrameView coordinates.
</del><span class="cx">     if (!delegatesScrolling())
</span><del>-        rect.moveBy(-scrollPosition() + IntPoint(0, headerHeight() + topContentInset(TopContentInsetType::WebCoreOrPlatformContentInset)));
</del><ins>+        rect = contentsToView(rect);
</ins><span class="cx"> 
</span><span class="cx">     return rect;
</span><span class="cx"> }
</span><span class="lines">@@ -4212,7 +4211,7 @@
</span><span class="cx">     
</span><span class="cx">     // Convert from FrameView coords into page (&quot;absolute&quot;) coordinates.
</span><span class="cx">     if (!delegatesScrolling())
</span><del>-        rect.moveBy(documentScrollPositionRelativeToViewOrigin());
</del><ins>+        rect = viewToContents(rect);
</ins><span class="cx"> 
</span><span class="cx">     // FIXME: we don't have a way to map an absolute rect down to a local quad, so just
</span><span class="cx">     // move the rect for now.
</span><span class="lines">@@ -4226,7 +4225,8 @@
</span><span class="cx"> 
</span><span class="cx">     // Convert from page (&quot;absolute&quot;) to FrameView coordinates.
</span><span class="cx">     if (!delegatesScrolling())
</span><del>-        point.moveBy(-scrollPosition() + IntPoint(0, headerHeight() + topContentInset(TopContentInsetType::WebCoreOrPlatformContentInset)));
</del><ins>+        point = contentsToView(point);
+
</ins><span class="cx">     return point;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -4236,7 +4236,7 @@
</span><span class="cx"> 
</span><span class="cx">     // Convert from FrameView coords into page (&quot;absolute&quot;) coordinates.
</span><span class="cx">     if (!delegatesScrolling())
</span><del>-        point = point + documentScrollPositionRelativeToViewOrigin();
</del><ins>+        point = viewToContents(point);
</ins><span class="cx"> 
</span><span class="cx">     return roundedIntPoint(renderer-&gt;absoluteToLocal(point, UseTransforms));
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformScrollViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ScrollView.cpp (183509 => 183510)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ScrollView.cpp        2015-04-28 21:40:10 UTC (rev 183509)
+++ trunk/Source/WebCore/platform/ScrollView.cpp        2015-04-28 21:51:04 UTC (rev 183510)
</span><span class="lines">@@ -864,13 +864,34 @@
</span><span class="cx">     hostWindow()-&gt;invalidateContentsForSlowScroll(updateRect);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+IntPoint ScrollView::viewToContents(const IntPoint&amp; point) const
+{
+    return point + documentScrollOffsetRelativeToViewOrigin();
+}
+
+IntPoint ScrollView::contentsToView(const IntPoint&amp; point) const
+{
+    return point - documentScrollOffsetRelativeToViewOrigin();
+}
+
+IntRect ScrollView::viewToContents(IntRect rect) const
+{
+    rect.move(documentScrollOffsetRelativeToViewOrigin());
+    return rect;
+}
+
+IntRect ScrollView::contentsToView(IntRect rect) const
+{
+    rect.move(-documentScrollOffsetRelativeToViewOrigin());
+    return rect;
+}
+
</ins><span class="cx"> IntPoint ScrollView::rootViewToContents(const IntPoint&amp; rootViewPoint) const
</span><span class="cx"> {
</span><span class="cx">     if (delegatesScrolling())
</span><span class="cx">         return convertFromRootView(rootViewPoint);
</span><span class="cx"> 
</span><del>-    IntPoint viewPoint = convertFromRootView(rootViewPoint);
-    return viewPoint + documentScrollOffsetRelativeToViewOrigin();
</del><ins>+    return viewToContents(convertFromRootView(rootViewPoint));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> IntPoint ScrollView::contentsToRootView(const IntPoint&amp; contentsPoint) const
</span><span class="lines">@@ -878,8 +899,7 @@
</span><span class="cx">     if (delegatesScrolling())
</span><span class="cx">         return convertToRootView(contentsPoint);
</span><span class="cx"> 
</span><del>-    IntPoint viewPoint = contentsPoint + IntSize(0, headerHeight() + topContentInset(TopContentInsetType::WebCoreOrPlatformContentInset)) - scrollOffset();
-    return convertToRootView(viewPoint);  
</del><ins>+    return convertToRootView(contentsToView(contentsPoint));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> IntRect ScrollView::rootViewToContents(const IntRect&amp; rootViewRect) const
</span><span class="lines">@@ -887,28 +907,25 @@
</span><span class="cx">     if (delegatesScrolling())
</span><span class="cx">         return convertFromRootView(rootViewRect);
</span><span class="cx"> 
</span><del>-    IntRect viewRect = convertFromRootView(rootViewRect);
-    viewRect.move(documentScrollOffsetRelativeToViewOrigin());
-    return viewRect;
</del><ins>+    return viewToContents(convertFromRootView(rootViewRect));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-IntRect ScrollView::contentsToRootView(const IntRect&amp; contentsRect) const
</del><ins>+IntPoint ScrollView::rootViewToTotalContents(const IntPoint&amp; rootViewPoint) const
</ins><span class="cx"> {
</span><span class="cx">     if (delegatesScrolling())
</span><del>-        return convertToRootView(contentsRect);
</del><ins>+        return convertFromRootView(rootViewPoint);
</ins><span class="cx"> 
</span><del>-    IntRect viewRect = contentsRect;
-    viewRect.move(-scrollOffset() + IntSize(0, headerHeight() + topContentInset(TopContentInsetType::WebCoreOrPlatformContentInset)));
-    return convertToRootView(viewRect);
</del><ins>+    IntPoint viewPoint = convertFromRootView(rootViewPoint);
+    // Like rootViewToContents(), but ignores headerHeight.
+    return viewPoint + scrollOffset() - IntSize(0, topContentInset(TopContentInsetType::WebCoreOrPlatformContentInset));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-IntPoint ScrollView::rootViewToTotalContents(const IntPoint&amp; rootViewPoint) const
</del><ins>+IntRect ScrollView::contentsToRootView(const IntRect&amp; contentsRect) const
</ins><span class="cx"> {
</span><span class="cx">     if (delegatesScrolling())
</span><del>-        return convertFromRootView(rootViewPoint);
</del><ins>+        return convertToRootView(contentsRect);
</ins><span class="cx"> 
</span><del>-    IntPoint viewPoint = convertFromRootView(rootViewPoint);
-    return viewPoint + scrollOffset() - IntSize(0, topContentInset(TopContentInsetType::WebCoreOrPlatformContentInset));
</del><ins>+    return convertToRootView(contentsToView(contentsRect));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> IntPoint ScrollView::windowToContents(const IntPoint&amp; windowPoint) const
</span><span class="lines">@@ -916,8 +933,7 @@
</span><span class="cx">     if (delegatesScrolling())
</span><span class="cx">         return convertFromContainingWindow(windowPoint);
</span><span class="cx"> 
</span><del>-    IntPoint viewPoint = convertFromContainingWindow(windowPoint);
-    return viewPoint + documentScrollOffsetRelativeToViewOrigin();
</del><ins>+    return viewToContents(convertFromContainingWindow(windowPoint));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> IntPoint ScrollView::contentsToWindow(const IntPoint&amp; contentsPoint) const
</span><span class="lines">@@ -925,8 +941,7 @@
</span><span class="cx">     if (delegatesScrolling())
</span><span class="cx">         return convertToContainingWindow(contentsPoint);
</span><span class="cx"> 
</span><del>-    IntPoint viewPoint = contentsPoint + IntSize(0, headerHeight() + topContentInset(TopContentInsetType::WebCoreOrPlatformContentInset)) - scrollOffset();
-    return convertToContainingWindow(viewPoint);  
</del><ins>+    return convertToContainingWindow(contentsToView(contentsPoint));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> IntRect ScrollView::windowToContents(const IntRect&amp; windowRect) const
</span><span class="lines">@@ -934,9 +949,7 @@
</span><span class="cx">     if (delegatesScrolling())
</span><span class="cx">         return convertFromContainingWindow(windowRect);
</span><span class="cx"> 
</span><del>-    IntRect viewRect = convertFromContainingWindow(windowRect);
-    viewRect.move(documentScrollOffsetRelativeToViewOrigin());
-    return viewRect;
</del><ins>+    return viewToContents(convertFromContainingWindow(windowRect));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> IntRect ScrollView::contentsToWindow(const IntRect&amp; contentsRect) const
</span><span class="lines">@@ -944,9 +957,7 @@
</span><span class="cx">     if (delegatesScrolling())
</span><span class="cx">         return convertToContainingWindow(contentsRect);
</span><span class="cx"> 
</span><del>-    IntRect viewRect = contentsRect;
-    viewRect.move(-scrollOffset() + IntSize(0, headerHeight() + topContentInset(TopContentInsetType::WebCoreOrPlatformContentInset)));
-    return convertToContainingWindow(viewRect);
</del><ins>+    return convertToContainingWindow(contentsToView(contentsRect));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> IntRect ScrollView::contentsToScreen(const IntRect&amp; rect) const
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformScrollViewh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ScrollView.h (183509 => 183510)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ScrollView.h        2015-04-28 21:40:10 UTC (rev 183509)
+++ trunk/Source/WebCore/platform/ScrollView.h        2015-04-28 21:51:04 UTC (rev 183510)
</span><span class="lines">@@ -292,6 +292,12 @@
</span><span class="cx">     IntRect rootViewToContents(const IntRect&amp;) const;
</span><span class="cx">     WEBCORE_EXPORT IntRect contentsToRootView(const IntRect&amp;) const;
</span><span class="cx"> 
</span><ins>+    IntPoint viewToContents(const IntPoint&amp;) const;
+    IntPoint contentsToView(const IntPoint&amp;) const;
+
+    IntRect viewToContents(IntRect) const;
+    IntRect contentsToView(IntRect) const;
+
</ins><span class="cx">     WEBCORE_EXPORT IntPoint rootViewToTotalContents(const IntPoint&amp;) const;
</span><span class="cx"> 
</span><span class="cx">     // Event coordinates are assumed to be in the coordinate space of a window that contains
</span></span></pre>
</div>
</div>

</body>
</html>