<!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>[167503] 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/167503">167503</a></dd>
<dt>Author</dt> <dd>simon.fraser@apple.com</dd>
<dt>Date</dt> <dd>2014-04-18 13:31:35 -0700 (Fri, 18 Apr 2014)</dd>
</dl>
<h3>Log Message</h3>
<pre>[iOS WK2] Make window.scroll() and window.scrollBy() work
https://bugs.webkit.org/show_bug.cgi?id=131848
<rdar://problem/16638319>
Reviewed by Beth Dakin.
The scrolling-related functions in DOMWindow were #ifdeffed for iOS
to use the hacky WK1-specific "actual scroll" functions, which do nothing
in WK2.
Fix by adding a scroll position wrapper (contentsScrollPosition) which does
the right thing on WK1 and WK2, and change almost all the places that used "actualScrollPosition"
to us it (with the exception of contentsScrollOffset() in MouseRelatedEvent.cpp, which has
confusing scaling behavior).
* dom/MouseRelatedEvent.cpp:
(WebCore::MouseRelatedEvent::MouseRelatedEvent):
* dom/TreeScope.cpp:
(WebCore::nodeFromPoint): Remove #ifdefs.
* html/HTMLBodyElement.cpp:
(WebCore::HTMLBodyElement::scrollLeft):
(WebCore::HTMLBodyElement::scrollTop):
* page/DOMWindow.cpp:
(WebCore::DOMWindow::scrollX):
(WebCore::DOMWindow::scrollY):
(WebCore::DOMWindow::scrollBy):
(WebCore::DOMWindow::scrollTo):
* platform/ScrollView.cpp:
(WebCore::ScrollView::contentsScrollPosition):
(WebCore::ScrollView::setContentsScrollPosition):
* platform/ScrollView.h:</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoredomMouseRelatedEventcpp">trunk/Source/WebCore/dom/MouseRelatedEvent.cpp</a></li>
<li><a href="#trunkSourceWebCoredomTreeScopecpp">trunk/Source/WebCore/dom/TreeScope.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLBodyElementcpp">trunk/Source/WebCore/html/HTMLBodyElement.cpp</a></li>
<li><a href="#trunkSourceWebCorepageDOMWindowcpp">trunk/Source/WebCore/page/DOMWindow.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 (167502 => 167503)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-04-18 20:17:59 UTC (rev 167502)
+++ trunk/Source/WebCore/ChangeLog        2014-04-18 20:31:35 UTC (rev 167503)
</span><span class="lines">@@ -1,5 +1,39 @@
</span><span class="cx"> 2014-04-18 Simon Fraser <simon.fraser@apple.com>
</span><span class="cx">
</span><ins>+ [iOS WK2] Make window.scroll() and window.scrollBy() work
+ https://bugs.webkit.org/show_bug.cgi?id=131848
+ <rdar://problem/16638319>
+
+ Reviewed by Beth Dakin.
+
+ The scrolling-related functions in DOMWindow were #ifdeffed for iOS
+ to use the hacky WK1-specific "actual scroll" functions, which do nothing
+ in WK2.
+
+ Fix by adding a scroll position wrapper (contentsScrollPosition) which does
+ the right thing on WK1 and WK2, and change almost all the places that used "actualScrollPosition"
+ to us it (with the exception of contentsScrollOffset() in MouseRelatedEvent.cpp, which has
+ confusing scaling behavior).
+
+ * dom/MouseRelatedEvent.cpp:
+ (WebCore::MouseRelatedEvent::MouseRelatedEvent):
+ * dom/TreeScope.cpp:
+ (WebCore::nodeFromPoint): Remove #ifdefs.
+ * html/HTMLBodyElement.cpp:
+ (WebCore::HTMLBodyElement::scrollLeft):
+ (WebCore::HTMLBodyElement::scrollTop):
+ * page/DOMWindow.cpp:
+ (WebCore::DOMWindow::scrollX):
+ (WebCore::DOMWindow::scrollY):
+ (WebCore::DOMWindow::scrollBy):
+ (WebCore::DOMWindow::scrollTo):
+ * platform/ScrollView.cpp:
+ (WebCore::ScrollView::contentsScrollPosition):
+ (WebCore::ScrollView::setContentsScrollPosition):
+ * platform/ScrollView.h:
+
+2014-04-18 Simon Fraser <simon.fraser@apple.com>
+
</ins><span class="cx"> Worse animation performance on pages with 3D transforms
</span><span class="cx"> https://bugs.webkit.org/show_bug.cgi?id=131838
</span><span class="cx"> <rdar://problem/16428630&15705876>
</span></span></pre></div>
<a id="trunkSourceWebCoredomMouseRelatedEventcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/MouseRelatedEvent.cpp (167502 => 167503)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/MouseRelatedEvent.cpp        2014-04-18 20:17:59 UTC (rev 167502)
+++ trunk/Source/WebCore/dom/MouseRelatedEvent.cpp        2014-04-18 20:31:35 UTC (rev 167503)
</span><span class="lines">@@ -74,11 +74,7 @@
</span><span class="cx"> Frame* frame = view() ? view()->frame() : 0;
</span><span class="cx"> if (frame && !isSimulated) {
</span><span class="cx"> if (FrameView* frameView = frame->view()) {
</span><del>-#if !PLATFORM(IOS)
- scrollPosition = frameView->scrollPosition();
-#else
- scrollPosition = frameView->actualScrollPosition();
-#endif
</del><ins>+ scrollPosition = frameView->contentsScrollPosition();
</ins><span class="cx"> adjustedPageLocation = frameView->windowToContents(windowLocation);
</span><span class="cx"> float scaleFactor = 1 / (frame->pageZoomFactor() * frame->frameScaleFactor());
</span><span class="cx"> if (scaleFactor != 1.0f) {
</span></span></pre></div>
<a id="trunkSourceWebCoredomTreeScopecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/TreeScope.cpp (167502 => 167503)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/TreeScope.cpp        2014-04-18 20:17:59 UTC (rev 167502)
+++ trunk/Source/WebCore/dom/TreeScope.cpp        2014-04-18 20:31:35 UTC (rev 167503)
</span><span class="lines">@@ -227,17 +227,19 @@
</span><span class="cx"> return nullptr;
</span><span class="cx">
</span><span class="cx"> float scaleFactor = frame->pageZoomFactor() * frame->frameScaleFactor();
</span><del>-#if !PLATFORM(IOS)
- IntPoint point = roundedIntPoint(FloatPoint(x * scaleFactor + frameView->scrollX(), y * scaleFactor + frameView->scrollY()));
</del><span class="cx">
</span><del>- if (!frameView->visibleContentRect().contains(point))
</del><ins>+ IntPoint scrollPosition = frameView->contentsScrollPosition();
+ IntPoint point = roundedIntPoint(FloatPoint(x * scaleFactor + scrollPosition.x(), y * scaleFactor + scrollPosition.y()));
+
+ IntRect visibleRect;
+#if PLATFORM(IOS)
+ visibleRect = frameView->unobscuredContentRect();
+#else
+ visibleRect = frameView->visibleContentRect();
+#endif
+ if (!visibleRect.contains(point))
</ins><span class="cx"> return nullptr;
</span><del>-#else
- IntPoint point = roundedIntPoint(FloatPoint(x * scaleFactor + frameView->actualScrollX(), y * scaleFactor + frameView->actualScrollY()));
</del><span class="cx">
</span><del>- if (!frameView->unobscuredContentRect().contains(point))
- return nullptr;
-#endif
</del><span class="cx"> HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::DisallowShadowContent);
</span><span class="cx"> HitTestResult result(point);
</span><span class="cx"> document->renderView()->hitTest(request, result);
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLBodyElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLBodyElement.cpp (167502 => 167503)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLBodyElement.cpp        2014-04-18 20:17:59 UTC (rev 167502)
+++ trunk/Source/WebCore/html/HTMLBodyElement.cpp        2014-04-18 20:31:35 UTC (rev 167503)
</span><span class="lines">@@ -218,11 +218,7 @@
</span><span class="cx"> FrameView* view = frame->view();
</span><span class="cx"> if (!view)
</span><span class="cx"> return 0;
</span><del>-#if PLATFORM(IOS)
- return adjustForZoom(view->actualScrollX(), *frame);
-#else
- return adjustForZoom(view->scrollX(), *frame);
-#endif
</del><ins>+ return adjustForZoom(view->contentsScrollPosition().x(), *frame);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void HTMLBodyElement::setScrollLeft(int scrollLeft)
</span><span class="lines">@@ -246,11 +242,7 @@
</span><span class="cx"> FrameView* view = frame->view();
</span><span class="cx"> if (!view)
</span><span class="cx"> return 0;
</span><del>-#if PLATFORM(IOS)
- return adjustForZoom(view->actualScrollY(), *frame);
-#else
- return adjustForZoom(view->scrollY(), *frame);
-#endif
</del><ins>+ return adjustForZoom(view->contentsScrollPosition().y(), *frame);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void HTMLBodyElement::setScrollTop(int scrollTop)
</span></span></pre></div>
<a id="trunkSourceWebCorepageDOMWindowcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/DOMWindow.cpp (167502 => 167503)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/DOMWindow.cpp        2014-04-18 20:17:59 UTC (rev 167502)
+++ trunk/Source/WebCore/page/DOMWindow.cpp        2014-04-18 20:31:35 UTC (rev 167503)
</span><span class="lines">@@ -1192,22 +1192,13 @@
</span><span class="cx"> if (!view)
</span><span class="cx"> return 0;
</span><span class="cx">
</span><del>- int scrollX;
-#if PLATFORM(IOS)
- scrollX = view->actualScrollX();
-#else
- scrollX = view->scrollX();
-#endif
</del><ins>+ int scrollX = view->contentsScrollPosition().x();
</ins><span class="cx"> if (!scrollX)
</span><span class="cx"> return 0;
</span><span class="cx">
</span><span class="cx"> m_frame->document()->updateLayoutIgnorePendingStylesheets();
</span><span class="cx">
</span><del>-#if PLATFORM(IOS)
- return view->mapFromLayoutToCSSUnits(view->actualScrollX());
-#else
- return view->mapFromLayoutToCSSUnits(view->scrollX());
-#endif
</del><ins>+ return view->mapFromLayoutToCSSUnits(view->contentsScrollPosition().x());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> int DOMWindow::scrollY() const
</span><span class="lines">@@ -1219,22 +1210,13 @@
</span><span class="cx"> if (!view)
</span><span class="cx"> return 0;
</span><span class="cx">
</span><del>- int scrollY;
-#if PLATFORM(IOS)
- scrollY = view->actualScrollY();
-#else
- scrollY = view->scrollY();
-#endif
</del><ins>+ int scrollY = view->contentsScrollPosition().y();
</ins><span class="cx"> if (!scrollY)
</span><span class="cx"> return 0;
</span><span class="cx">
</span><span class="cx"> m_frame->document()->updateLayoutIgnorePendingStylesheets();
</span><span class="cx">
</span><del>-#if PLATFORM(IOS)
- return view->mapFromLayoutToCSSUnits(view->actualScrollY());
-#else
- return view->mapFromLayoutToCSSUnits(view->scrollY());
-#endif
</del><ins>+ return view->mapFromLayoutToCSSUnits(view->contentsScrollPosition().y());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool DOMWindow::closed() const
</span><span class="lines">@@ -1446,11 +1428,7 @@
</span><span class="cx"> return;
</span><span class="cx">
</span><span class="cx"> IntSize scaledOffset(view->mapFromCSSToLayoutUnits(x), view->mapFromCSSToLayoutUnits(y));
</span><del>-#if PLATFORM(IOS)
- view->setActualScrollPosition(view->actualScrollPosition() + scaledOffset);
-#else
- view->scrollBy(scaledOffset);
-#endif
</del><ins>+ view->setContentsScrollPosition(view->contentsScrollPosition() + scaledOffset);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void DOMWindow::scrollTo(int x, int y) const
</span><span class="lines">@@ -1464,15 +1442,8 @@
</span><span class="cx"> if (!view)
</span><span class="cx"> return;
</span><span class="cx">
</span><del>-
-#if PLATFORM(IOS)
- int zoomedX = static_cast<int>(x * m_frame->pageZoomFactor() * m_frame->frameScaleFactor());
- int zoomedY = static_cast<int>(y * m_frame->pageZoomFactor() * m_frame->frameScaleFactor());
- view->setActualScrollPosition(IntPoint(zoomedX, zoomedY));
-#else
</del><span class="cx"> IntPoint layoutPos(view->mapFromCSSToLayoutUnits(x), view->mapFromCSSToLayoutUnits(y));
</span><del>- view->setScrollPosition(layoutPos);
-#endif
</del><ins>+ view->setContentsScrollPosition(layoutPos);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool DOMWindow::allowedToChangeWindowGeometry() const
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformScrollViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ScrollView.cpp (167502 => 167503)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ScrollView.cpp        2014-04-18 20:17:59 UTC (rev 167502)
+++ trunk/Source/WebCore/platform/ScrollView.cpp        2014-04-18 20:31:35 UTC (rev 167503)
</span><span class="lines">@@ -236,6 +236,24 @@
</span><span class="cx"> delegatesScrollingDidChange();
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+IntPoint ScrollView::contentsScrollPosition() const
+{
+#if PLATFORM(IOS)
+ if (platformWidget())
+ return actualScrollPosition();
+#endif
+ return scrollPosition();
+}
+
+void ScrollView::setContentsScrollPosition(const IntPoint& position)
+{
+#if PLATFORM(IOS)
+ if (platformWidget())
+ setActualScrollPosition(position);
+#endif
+ setScrollPosition(position);
+}
+
</ins><span class="cx"> #if !PLATFORM(IOS)
</span><span class="cx"> IntRect ScrollView::unobscuredContentRect(VisibleContentRectIncludesScrollbars scrollbarInclusion) const
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformScrollViewh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ScrollView.h (167502 => 167503)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ScrollView.h        2014-04-18 20:17:59 UTC (rev 167502)
+++ trunk/Source/WebCore/platform/ScrollView.h        2014-04-18 20:31:35 UTC (rev 167503)
</span><span class="lines">@@ -229,6 +229,10 @@
</span><span class="cx"> int scrollX() const { return scrollPosition().x(); }
</span><span class="cx"> int scrollY() const { return scrollPosition().y(); }
</span><span class="cx">
</span><ins>+ // Scroll position used by web-exposed features (has legacy iOS behavior).
+ IntPoint contentsScrollPosition() const;
+ void setContentsScrollPosition(const IntPoint&);
+
</ins><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx"> int actualScrollX() const { return unobscuredContentRect().x(); }
</span><span class="cx"> int actualScrollY() const { return unobscuredContentRect().y(); }
</span></span></pre>
</div>
</div>
</body>
</html>