Diff
Modified: trunk/LayoutTests/ChangeLog (261381 => 261382)
--- trunk/LayoutTests/ChangeLog 2020-05-08 14:24:45 UTC (rev 261381)
+++ trunk/LayoutTests/ChangeLog 2020-05-08 15:02:23 UTC (rev 261382)
@@ -1,3 +1,23 @@
+2020-05-08 Simon Fraser <[email protected]>
+
+ Overflow scrollers in iframes don't get mouseMovedInContentArea()
+ https://bugs.webkit.org/show_bug.cgi?id=211347
+ <rdar://problem/62784560>
+
+ Reviewed by Tim Horton.
+
+ The ordering of callbacks in the scroll-animator tests changed, but in ways that don't materially
+ affect behavior. Two new real overlay scrollbar tests.
+
+ * fast/scrolling/mac/scrollbars/overflow-in-iframe-overlay-scrollbar-hovered-expected.txt: Added.
+ * fast/scrolling/mac/scrollbars/overflow-in-iframe-overlay-scrollbar-hovered.html: Added.
+ * fast/scrolling/mac/scrollbars/overflow-in-iframe-overlay-scrollbar-reveal-expected.txt: Added.
+ * fast/scrolling/mac/scrollbars/overflow-in-iframe-overlay-scrollbar-reveal.html: Added.
+ * fast/scrolling/scroll-animator-basic-events-expected.txt:
+ * fast/scrolling/scroll-animator-overlay-scrollbars-clicked-expected.txt:
+ * fast/scrolling/scroll-animator-overlay-scrollbars-hovered-expected.txt:
+ * fast/scrolling/scroll-animator-select-list-events-expected.txt:
+
2020-05-08 Jason Lawrence <[email protected]>
Flaky Test: media/track/track-in-band-metadata-display-order.html
Modified: trunk/LayoutTests/fast/scrolling/scroll-animator-basic-events-expected.txt (261381 => 261382)
--- trunk/LayoutTests/fast/scrolling/scroll-animator-basic-events-expected.txt 2020-05-08 14:24:45 UTC (rev 261381)
+++ trunk/LayoutTests/fast/scrolling/scroll-animator-basic-events-expected.txt 2020-05-08 15:02:23 UTC (rev 261382)
@@ -1,16 +1,14 @@
CONSOLE MESSAGE: MainFrameView: mouseEnteredContentArea
CONSOLE MESSAGE: MainFrameView: mouseMovedInContentArea
CONSOLE MESSAGE: RenderLayer: mouseEnteredContentArea
-CONSOLE MESSAGE: RenderLayer: mouseMovedInContentArea
+CONSOLE MESSAGE: RenderLayer: mouseEnteredVerticalScrollbar
CONSOLE MESSAGE: MainFrameView: mouseMovedInContentArea
-CONSOLE MESSAGE: RenderLayer: mouseEnteredVerticalScrollbar
CONSOLE MESSAGE: RenderLayer: mouseMovedInContentArea
-CONSOLE MESSAGE: MainFrameView: mouseMovedInContentArea
CONSOLE MESSAGE: RenderLayer: mouseIsDownInVerticalScrollbar
CONSOLE MESSAGE: RenderLayer: mouseIsUpInVerticalScrollbar
CONSOLE MESSAGE: RenderLayer: mouseExitedVerticalScrollbar
+CONSOLE MESSAGE: MainFrameView: mouseMovedInContentArea
CONSOLE MESSAGE: RenderLayer: mouseExitedContentArea
-CONSOLE MESSAGE: MainFrameView: mouseMovedInContentArea
This is a scrollable div.
PASS successfullyParsed is true
Modified: trunk/LayoutTests/fast/scrolling/scroll-animator-overlay-scrollbars-clicked-expected.txt (261381 => 261382)
--- trunk/LayoutTests/fast/scrolling/scroll-animator-overlay-scrollbars-clicked-expected.txt 2020-05-08 14:24:45 UTC (rev 261381)
+++ trunk/LayoutTests/fast/scrolling/scroll-animator-overlay-scrollbars-clicked-expected.txt 2020-05-08 15:02:23 UTC (rev 261382)
@@ -1,8 +1,7 @@
CONSOLE MESSAGE: MainFrameView: mouseEnteredContentArea
+CONSOLE MESSAGE: MainFrameView: mouseEnteredVerticalScrollbar
CONSOLE MESSAGE: MainFrameView: mouseMovedInContentArea
-CONSOLE MESSAGE: MainFrameView: mouseEnteredVerticalScrollbar
CONSOLE MESSAGE: FrameView: mouseEnteredContentArea
-CONSOLE MESSAGE: MainFrameView: mouseMovedInContentArea
CONSOLE MESSAGE: MainFrameView: mouseIsDownInVerticalScrollbar
CONSOLE MESSAGE: MainFrameView: mouseIsUpInVerticalScrollbar
CONSOLE MESSAGE: MainFrameView: mouseExitedVerticalScrollbar
Modified: trunk/LayoutTests/fast/scrolling/scroll-animator-overlay-scrollbars-hovered-expected.txt (261381 => 261382)
--- trunk/LayoutTests/fast/scrolling/scroll-animator-overlay-scrollbars-hovered-expected.txt 2020-05-08 14:24:45 UTC (rev 261381)
+++ trunk/LayoutTests/fast/scrolling/scroll-animator-overlay-scrollbars-hovered-expected.txt 2020-05-08 15:02:23 UTC (rev 261382)
@@ -2,7 +2,6 @@
CONSOLE MESSAGE: MainFrameView: mouseMovedInContentArea
CONSOLE MESSAGE: FrameView: mouseEnteredHorizontalScrollbar
CONSOLE MESSAGE: FrameView: mouseEnteredContentArea
-CONSOLE MESSAGE: MainFrameView: mouseMovedInContentArea
CONSOLE MESSAGE: FrameView: mouseExitedHorizontalScrollbar
CONSOLE MESSAGE: FrameView: mouseExitedContentArea
CONSOLE MESSAGE: MainFrameView: mouseMovedInContentArea
Modified: trunk/LayoutTests/fast/scrolling/scroll-animator-select-list-events-expected.txt (261381 => 261382)
--- trunk/LayoutTests/fast/scrolling/scroll-animator-select-list-events-expected.txt 2020-05-08 14:24:45 UTC (rev 261381)
+++ trunk/LayoutTests/fast/scrolling/scroll-animator-select-list-events-expected.txt 2020-05-08 15:02:23 UTC (rev 261382)
@@ -1,16 +1,14 @@
CONSOLE MESSAGE: MainFrameView: mouseEnteredContentArea
CONSOLE MESSAGE: MainFrameView: mouseMovedInContentArea
CONSOLE MESSAGE: RenderListBox: mouseEnteredContentArea
-CONSOLE MESSAGE: RenderListBox: mouseMovedInContentArea
+CONSOLE MESSAGE: RenderListBox: mouseEnteredVerticalScrollbar
CONSOLE MESSAGE: MainFrameView: mouseMovedInContentArea
-CONSOLE MESSAGE: RenderListBox: mouseEnteredVerticalScrollbar
CONSOLE MESSAGE: RenderListBox: mouseMovedInContentArea
-CONSOLE MESSAGE: MainFrameView: mouseMovedInContentArea
CONSOLE MESSAGE: RenderListBox: mouseIsDownInVerticalScrollbar
CONSOLE MESSAGE: RenderListBox: mouseIsUpInVerticalScrollbar
CONSOLE MESSAGE: RenderListBox: mouseExitedVerticalScrollbar
+CONSOLE MESSAGE: MainFrameView: mouseMovedInContentArea
CONSOLE MESSAGE: RenderListBox: mouseExitedContentArea
-CONSOLE MESSAGE: MainFrameView: mouseMovedInContentArea
Test for https://bugs.webkit.org/show_bug.cgi?id=153398.
Modified: trunk/LayoutTests/platform/mac-wk1/fast/scrolling/scroll-animator-basic-events-expected.txt (261381 => 261382)
--- trunk/LayoutTests/platform/mac-wk1/fast/scrolling/scroll-animator-basic-events-expected.txt 2020-05-08 14:24:45 UTC (rev 261381)
+++ trunk/LayoutTests/platform/mac-wk1/fast/scrolling/scroll-animator-basic-events-expected.txt 2020-05-08 15:02:23 UTC (rev 261382)
@@ -1,5 +1,4 @@
CONSOLE MESSAGE: RenderLayer: mouseEnteredContentArea
-CONSOLE MESSAGE: RenderLayer: mouseMovedInContentArea
CONSOLE MESSAGE: RenderLayer: mouseEnteredVerticalScrollbar
CONSOLE MESSAGE: RenderLayer: mouseMovedInContentArea
CONSOLE MESSAGE: RenderLayer: mouseIsDownInVerticalScrollbar
Modified: trunk/LayoutTests/platform/mac-wk1/fast/scrolling/scroll-animator-select-list-events-expected.txt (261381 => 261382)
--- trunk/LayoutTests/platform/mac-wk1/fast/scrolling/scroll-animator-select-list-events-expected.txt 2020-05-08 14:24:45 UTC (rev 261381)
+++ trunk/LayoutTests/platform/mac-wk1/fast/scrolling/scroll-animator-select-list-events-expected.txt 2020-05-08 15:02:23 UTC (rev 261382)
@@ -1,5 +1,4 @@
CONSOLE MESSAGE: RenderListBox: mouseEnteredContentArea
-CONSOLE MESSAGE: RenderListBox: mouseMovedInContentArea
CONSOLE MESSAGE: RenderListBox: mouseEnteredVerticalScrollbar
CONSOLE MESSAGE: RenderListBox: mouseMovedInContentArea
CONSOLE MESSAGE: RenderListBox: mouseIsDownInVerticalScrollbar
Modified: trunk/Source/WebCore/ChangeLog (261381 => 261382)
--- trunk/Source/WebCore/ChangeLog 2020-05-08 14:24:45 UTC (rev 261381)
+++ trunk/Source/WebCore/ChangeLog 2020-05-08 15:02:23 UTC (rev 261382)
@@ -1,3 +1,44 @@
+2020-05-08 Simon Fraser <[email protected]>
+
+ Overflow scrollers in iframes don't get mouseMovedInContentArea()
+ https://bugs.webkit.org/show_bug.cgi?id=211347
+ <rdar://problem/62784560>
+
+ Reviewed by Tim Horton.
+
+ We never dispatched mouseMovedInContentArea() on ScrollableAreas in subframes, so overlay scrollbar
+ interactions there were broken. This is because the code ran from EventHandler::mouseMoved(), which
+ only runs for the main frame.
+
+ Instead, move the mouseMovedInContentArea() dispatch down into updateMouseEventTargetNode() which
+ is run for each subframe. notifyScrollableAreasOfMouseEvents() takes an event name so we only dispatch
+ for mouseMove events. There's some complexity here related to whether the old and new ScrollableArea
+ targets are nested; this code doesn't try to do the right thing with nesting, but does handle the mouse
+ moving between the scrollable main frame and an overflow region.
+
+ enclosingScrollableArea() is fixed to return the FrameView. enclosingScrollableLayer() is flawed, as noted
+ in the RenderLayer.h comment.
+
+ Tests: fast/scrolling/mac/scrollbars/overflow-in-iframe-overlay-scrollbar-hovered.html
+ fast/scrolling/mac/scrollbars/overflow-in-iframe-overlay-scrollbar-reveal.html
+
+ * page/EventHandler.cpp:
+ (WebCore::EventHandler::enclosingScrollableArea):
+ (WebCore::EventHandler::mouseMoved):
+ (WebCore::EventHandler::handleMouseMoveEvent):
+ (WebCore::EventHandler::pointerCaptureElementDidChange):
+ (WebCore::EventHandler::updateMouseEventTargetNode):
+ (WebCore::EventHandler::notifyScrollableAreasOfMouseEvents):
+ (WebCore::EventHandler::dispatchMouseEvent):
+ (WebCore::enclosingScrollableArea): Deleted.
+ (WebCore::EventHandler::notifyScrollableAreasOfMouseEnterExit): Deleted.
+ * page/EventHandler.h:
+ * page/ios/EventHandlerIOS.mm:
+ (WebCore::EventHandler::dispatchSyntheticMouseOut):
+ * rendering/RenderLayer.cpp:
+ (WebCore::RenderLayer::debugDescription const):
+ * rendering/RenderLayer.h:
+
2020-05-08 Zalan Bujtas <[email protected]>
[LFC][TFC] The fixed logical width should be used as the max width for a cell
Modified: trunk/Source/WebCore/page/EventHandler.cpp (261381 => 261382)
--- trunk/Source/WebCore/page/EventHandler.cpp 2020-05-08 14:24:45 UTC (rev 261381)
+++ trunk/Source/WebCore/page/EventHandler.cpp 2020-05-08 15:02:23 UTC (rev 261382)
@@ -1900,12 +1900,15 @@
return swallowMouseUpEvent || swallowClickEvent || swallowMouseReleaseEvent;
}
-static ScrollableArea* enclosingScrollableArea(Node* node)
+ScrollableArea* EventHandler::enclosingScrollableArea(Node* node)
{
for (auto ancestor = node; ancestor; ancestor = ancestor->parentOrShadowHostNode()) {
- if (is<HTMLIFrameElement>(*ancestor) || is<HTMLHtmlElement>(*ancestor) || is<HTMLDocument>(*ancestor))
+ if (is<HTMLIFrameElement>(*ancestor))
return nullptr;
+ if (is<HTMLHtmlElement>(*ancestor) || is<HTMLDocument>(*ancestor))
+ break;
+
auto renderer = ancestor->renderer();
if (!renderer)
continue;
@@ -1920,10 +1923,13 @@
if (!layer)
return nullptr;
- return layer->enclosingScrollableLayer(IncludeSelfOrNot::IncludeSelf, CrossFrameBoundaries::No);
+ if (auto* scrollableLayer = layer->enclosingScrollableLayer(IncludeSelfOrNot::IncludeSelf, CrossFrameBoundaries::No)) {
+ if (!scrollableLayer->isRenderViewLayer())
+ return scrollableLayer;
+ }
}
- return nullptr;
+ return m_frame.view();
}
bool EventHandler::mouseMoved(const PlatformMouseEvent& event)
@@ -1942,16 +1948,6 @@
if (!page)
return result;
- if (auto scrolledArea = enclosingScrollableArea(hitTestResult.innerNode())) {
- if (FrameView* frameView = m_frame.view()) {
- if (frameView->containsScrollableArea(scrolledArea))
- scrolledArea->mouseMovedInContentArea();
- }
- }
-
- if (FrameView* frameView = m_frame.view())
- frameView->mouseMovedInContentArea();
-
hitTestResult.setToNonUserAgentShadowAncestor();
page->chrome().mouseDidMoveOverElement(hitTestResult, event.modifierFlags());
return result;
@@ -2043,7 +2039,7 @@
#endif
if (onlyUpdateScrollbars) {
if (shouldSendMouseEventsToInactiveWindows())
- updateMouseEventTargetNode(mouseEvent.targetNode(), platformMouseEvent, FireMouseOverOut::Yes);
+ updateMouseEventTargetNode(eventNames().mousemoveEvent, mouseEvent.targetNode(), platformMouseEvent, FireMouseOverOut::Yes);
return true;
}
@@ -2058,7 +2054,7 @@
if (newSubframe) {
// Update over/out state before passing the event to the subframe.
- updateMouseEventTargetNode(mouseEvent.targetNode(), platformMouseEvent, FireMouseOverOut::Yes);
+ updateMouseEventTargetNode(eventNames().mousemoveEvent, mouseEvent.targetNode(), platformMouseEvent, FireMouseOverOut::Yes);
// Event dispatch in updateMouseEventTargetNode may have caused the subframe of the target
// node to be detached from its FrameView, in which case the event should not be passed.
@@ -2545,7 +2541,7 @@
setCapturingMouseEventsElement(element);
// Now that we have a new capture element, we need to dispatch boundary mouse events.
- updateMouseEventTargetNode(element, m_lastPlatformMouseEvent, FireMouseOverOut::Yes);
+ updateMouseEventTargetNode(eventNames().gotpointercaptureEvent, element, m_lastPlatformMouseEvent, FireMouseOverOut::Yes);
}
MouseEventWithHitTestResults EventHandler::prepareMouseEvent(const HitTestRequest& request, const PlatformMouseEvent& mouseEvent)
@@ -2565,7 +2561,7 @@
return false;
}
-void EventHandler::updateMouseEventTargetNode(Node* targetNode, const PlatformMouseEvent& platformMouseEvent, FireMouseOverOut fireMouseOverOut)
+void EventHandler::updateMouseEventTargetNode(const AtomString& eventType, Node* targetNode, const PlatformMouseEvent& platformMouseEvent, FireMouseOverOut fireMouseOverOut)
{
Ref<Frame> protectedFrame(m_frame);
Element* targetElement = nullptr;
@@ -2587,7 +2583,7 @@
// Fire mouseout/mouseover if the mouse has shifted to a different node.
if (fireMouseOverOut == FireMouseOverOut::Yes) {
- notifyScrollableAreasOfMouseEnterExit(m_lastElementUnderMouse.get(), m_elementUnderMouse.get());
+ notifyScrollableAreasOfMouseEvents(eventType, m_lastElementUnderMouse.get(), m_elementUnderMouse.get());
if (m_lastElementUnderMouse && &m_lastElementUnderMouse->document() != m_frame.document()) {
m_lastElementUnderMouse = nullptr;
@@ -2644,7 +2640,7 @@
}
}
-void EventHandler::notifyScrollableAreasOfMouseEnterExit(Element* lastElementUnderMouse, Element* elementUnderMouse)
+void EventHandler::notifyScrollableAreasOfMouseEvents(const AtomString& eventType, Element* lastElementUnderMouse, Element* elementUnderMouse)
{
auto* frameView = m_frame.view();
if (!frameView)
@@ -2655,24 +2651,41 @@
if (!!lastElementUnderMouse != !!elementUnderMouse) {
if (elementUnderMouse) {
- frameView->mouseEnteredContentArea();
+ if (scrollableAreaForNodeUnderMouse != frameView)
+ frameView->mouseEnteredContentArea();
+
if (scrollableAreaForNodeUnderMouse)
scrollableAreaForNodeUnderMouse->mouseEnteredContentArea();
} else {
if (scrollableAreaForLastNode)
scrollableAreaForLastNode->mouseExitedContentArea();
- frameView->mouseExitedContentArea();
+
+ if (scrollableAreaForLastNode != frameView)
+ frameView->mouseExitedContentArea();
}
return;
}
-
- if ((!scrollableAreaForLastNode && !scrollableAreaForNodeUnderMouse) || scrollableAreaForLastNode == scrollableAreaForNodeUnderMouse)
+
+ if (!scrollableAreaForLastNode && !scrollableAreaForNodeUnderMouse)
return;
- if (scrollableAreaForLastNode)
+ // FIXME: This does doesn't handle nested ScrollableAreas well. It really needs to know
+ // the hierarchical relationship between scrollableAreaForLastNode and scrollableAreaForNodeUnderMouse.
+ bool movedBetweenScrollableaAreas = scrollableAreaForLastNode && scrollableAreaForNodeUnderMouse && (scrollableAreaForLastNode != scrollableAreaForNodeUnderMouse);
+ if (eventType == eventNames().mousemoveEvent) {
+ frameView->mouseMovedInContentArea();
+
+ if (!movedBetweenScrollableaAreas && scrollableAreaForNodeUnderMouse && scrollableAreaForNodeUnderMouse != frameView)
+ scrollableAreaForNodeUnderMouse->mouseMovedInContentArea();
+ }
+
+ if (!movedBetweenScrollableaAreas)
+ return;
+
+ if (scrollableAreaForLastNode && scrollableAreaForLastNode != frameView)
scrollableAreaForLastNode->mouseExitedContentArea();
- if (scrollableAreaForNodeUnderMouse)
+ if (scrollableAreaForNodeUnderMouse && scrollableAreaForNodeUnderMouse != frameView)
scrollableAreaForNodeUnderMouse->mouseEnteredContentArea();
}
@@ -2693,7 +2706,7 @@
{
Ref<Frame> protectedFrame(m_frame);
- updateMouseEventTargetNode(targetNode, platformMouseEvent, fireMouseOverOut);
+ updateMouseEventTargetNode(eventType, targetNode, platformMouseEvent, fireMouseOverOut);
if (m_elementUnderMouse && !m_elementUnderMouse->dispatchMouseEvent(platformMouseEvent, eventType, clickCount))
return false;
Modified: trunk/Source/WebCore/page/EventHandler.h (261381 => 261382)
--- trunk/Source/WebCore/page/EventHandler.h 2020-05-08 14:24:45 UTC (rev 261381)
+++ trunk/Source/WebCore/page/EventHandler.h 2020-05-08 15:02:23 UTC (rev 261382)
@@ -404,9 +404,10 @@
Node* nodeUnderMouse() const;
enum class FireMouseOverOut { No, Yes };
- void updateMouseEventTargetNode(Node*, const PlatformMouseEvent&, FireMouseOverOut);
+ void updateMouseEventTargetNode(const AtomString& eventType, Node*, const PlatformMouseEvent&, FireMouseOverOut);
- void notifyScrollableAreasOfMouseEnterExit(Element* lastElementUnderMouse, Element* elementUnderMouse);
+ ScrollableArea* enclosingScrollableArea(Node*);
+ void notifyScrollableAreasOfMouseEvents(const AtomString& eventType, Element* lastElementUnderMouse, Element* elementUnderMouse);
MouseEventWithHitTestResults prepareMouseEvent(const HitTestRequest&, const PlatformMouseEvent&);
Modified: trunk/Source/WebCore/page/ios/EventHandlerIOS.mm (261381 => 261382)
--- trunk/Source/WebCore/page/ios/EventHandlerIOS.mm 2020-05-08 14:24:45 UTC (rev 261381)
+++ trunk/Source/WebCore/page/ios/EventHandlerIOS.mm 2020-05-08 15:02:23 UTC (rev 261382)
@@ -35,6 +35,7 @@
#import "ContentChangeObserver.h"
#import "DataTransfer.h"
#import "DragState.h"
+#import "EventNames.h"
#import "FocusController.h"
#import "Frame.h"
#import "FrameView.h"
@@ -525,7 +526,7 @@
void EventHandler::dispatchSyntheticMouseOut(const PlatformMouseEvent& platformMouseEvent)
{
- updateMouseEventTargetNode(nullptr, platformMouseEvent, FireMouseOverOut::Yes);
+ updateMouseEventTargetNode(eventNames().mouseoutEvent, nullptr, platformMouseEvent, FireMouseOverOut::Yes);
}
void EventHandler::dispatchSyntheticMouseMove(const PlatformMouseEvent& platformMouseEvent)
Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (261381 => 261382)
--- trunk/Source/WebCore/rendering/RenderLayer.cpp 2020-05-08 14:24:45 UTC (rev 261381)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp 2020-05-08 15:02:23 UTC (rev 261382)
@@ -3639,7 +3639,7 @@
if (isComposited()) {
// Oh for better StringBuilder/TextStream integration.
TextStream stream;
- stream << *backing();
+ stream << " " << *backing();
builder.append(stream.release());
}
Modified: trunk/Source/WebCore/rendering/RenderLayer.h (261381 => 261382)
--- trunk/Source/WebCore/rendering/RenderLayer.h 2020-05-08 14:24:45 UTC (rev 261381)
+++ trunk/Source/WebCore/rendering/RenderLayer.h 2020-05-08 15:02:23 UTC (rev 261382)
@@ -462,6 +462,7 @@
void applyPostLayoutScrollPositionIfNeeded();
// Returns the nearest enclosing layer that is scrollable.
+ // FIXME: This can return the RenderView's layer when callers probably want the FrameView as a ScrollableArea.
RenderLayer* enclosingScrollableLayer(IncludeSelfOrNot, CrossFrameBoundaries) const;
void availableContentSizeChanged(AvailableSizeChangeReason) final;