Modified: tags/Safari-538.16.2/Source/WebCore/ChangeLog (163560 => 163561)
--- tags/Safari-538.16.2/Source/WebCore/ChangeLog 2014-02-06 21:24:17 UTC (rev 163560)
+++ tags/Safari-538.16.2/Source/WebCore/ChangeLog 2014-02-06 21:35:48 UTC (rev 163561)
@@ -1,3 +1,23 @@
+2014-02-06 Lucas Forschler <[email protected]>
+
+ Merge r163558
+
+ 2014-02-05 Brent Fulgham <[email protected]>
+
+ Wheel events don't latch to inner scrollable elements
+ https://bugs.webkit.org/show_bug.cgi?id=128225
+
+ Reviewed by Beth Dakin.
+
+ * page/EventHandler.cpp:
+ (WebCore::EventHandler::handleWheelEvent): Identify the case
+ where we have hit the end of a scroll, and treat that as a
+ valid 'handled' case. If the scroll event is just starting,
+ treat end-of-scroll as unhandled so the parent element can
+ handle things.
+ * page/WheelEventDeltaTracker.h:
+ (WebCore::WheelEventDeltaTracker::isFirstWheelEvent): Added.
+
2014-02-04 Lucas Forschler <[email protected]>
Rollout r163280. <rdar://problem/15971014>
Modified: tags/Safari-538.16.2/Source/WebCore/page/EventHandler.cpp (163560 => 163561)
--- tags/Safari-538.16.2/Source/WebCore/page/EventHandler.cpp 2014-02-06 21:24:17 UTC (rev 163560)
+++ tags/Safari-538.16.2/Source/WebCore/page/EventHandler.cpp 2014-02-06 21:35:48 UTC (rev 163561)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2013, 2014 Apple Inc. All rights reserved.
* Copyright (C) 2006 Alexey Proskuryakov ([email protected])
* Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies)
*
@@ -2553,6 +2553,35 @@
// We do another check on the frame view because the event handler can run JS which results in the frame getting destroyed.
view = m_frame.view();
+
+#if PLATFORM(MAC)
+ if (useLatchedWheelEventElement && m_latchedWheelEventElement == element) {
+ bool enclosingFrameIsMainFrame = view ? view->frame().isMainFrame() : false;
+
+ // If we are latched, and have nowhere to scroll, treat the scroll event as ended so that we don't
+ // cause the scroll to break free of the current scrolling widget.
+ if (!enclosingFrameIsMainFrame) {
+ bool didHandleWheelEvent = view ? view->wheelEvent(event) : false;
+ if (!didHandleWheelEvent) {
+ // If we are just starting a scroll event, and have nowhere left to scroll, allow
+ // the enclosing frame to handle the scroll.
+ didHandleWheelEvent = !m_recentWheelEventDeltaTracker->isFirstWheelEvent();
+ }
+
+ m_isHandlingWheelEvent = false;
+ return didHandleWheelEvent;
+ }
+
+ if (!m_recentWheelEventDeltaTracker->isFirstWheelEvent()) {
+ // When the main frame is our parent, and we have been scrolling within this region, we do not
+ // want to have the main frame consume any remaining scroll events. Keep them latched to this
+ // element.
+ m_isHandlingWheelEvent = false;
+ return true;
+ }
+ }
+#endif
+
bool didHandleEvent = view ? view->wheelEvent(event) : false;
m_isHandlingWheelEvent = false;
return didHandleEvent;
Modified: tags/Safari-538.16.2/Source/WebCore/page/WheelEventDeltaTracker.h (163560 => 163561)
--- tags/Safari-538.16.2/Source/WebCore/page/WheelEventDeltaTracker.h 2014-02-06 21:24:17 UTC (rev 163560)
+++ tags/Safari-538.16.2/Source/WebCore/page/WheelEventDeltaTracker.h 2014-02-06 21:35:48 UTC (rev 163561)
@@ -51,6 +51,7 @@
void endTrackingDeltas();
bool isTrackingDeltas() const { return m_isTrackingDeltas; }
+ bool isFirstWheelEvent() const { return m_recentWheelEventDeltas.size() <= 1; }
void recordWheelEventDelta(const PlatformWheelEvent&);
DominantScrollGestureDirection dominantScrollGestureDirection() const;