Changeset 195659 in webkit


Ignore:
Timestamp:
Jan 27, 2016 2:24:57 AM (8 years ago)
Author:
Carlos Garcia Campos
Message:

ScrollAnimator is not notified when mouse entered, moved or exited a RenderListBox
https://bugs.webkit.org/show_bug.cgi?id=153398

Reviewed by Michael Catanzaro.

EvenHandler is checking whether the enclosing layer of a node is
registered as scrollable area of its frame view. That doesn't work
for list boxes, because they are the scrollable area
themselves. Also when entering a list box the node under mouse is
not usually the list box itself, but any of its children, a
HTMLOptionElement or a HTMLOptGroupElement. Instead of comparing
layers, we should find the enclosing scrollable area of the target
elements and compare them to decide whether the mouse has entered,
left or moved a scrollable area.

  • page/EventHandler.cpp:

(WebCore::enclosingScrollableArea): Return the enclosing
scrollable area of the given node. If the node doesn't have a
renderer, it traverses its parents. If the renderer is a
RenderListBox it is returned, otherwhise the enclosing layer is
returned.
(WebCore::EventHandler::mouseMoved): Use enclosingScrollableArea.
(WebCore::EventHandler::updateMouseEventTargetNode): Ditto.

Location:
trunk/Source/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r195656 r195659  
     12016-01-27  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        ScrollAnimator is not notified when mouse entered, moved or exited a RenderListBox
     4        https://bugs.webkit.org/show_bug.cgi?id=153398
     5
     6        Reviewed by Michael Catanzaro.
     7
     8        EvenHandler is checking whether the enclosing layer of a node is
     9        registered as scrollable area of its frame view. That doesn't work
     10        for list boxes, because they are the scrollable area
     11        themselves. Also when entering a list box the node under mouse is
     12        not usually the list box itself, but any of its children, a
     13        HTMLOptionElement or a HTMLOptGroupElement. Instead of comparing
     14        layers, we should find the enclosing scrollable area of the target
     15        elements and compare them to decide whether the mouse has entered,
     16        left or moved a scrollable area.
     17
     18        * page/EventHandler.cpp:
     19        (WebCore::enclosingScrollableArea): Return the enclosing
     20        scrollable area of the given node. If the node doesn't have a
     21        renderer, it traverses its parents. If the renderer is a
     22        RenderListBox it is returned, otherwhise the enclosing layer is
     23        returned.
     24        (WebCore::EventHandler::mouseMoved): Use enclosingScrollableArea.
     25        (WebCore::EventHandler::updateMouseEventTargetNode): Ditto.
     26
    1272016-01-26  Sam Weinig  <sam@webkit.org>
    228
  • trunk/Source/WebCore/page/EventHandler.cpp

    r194819 r195659  
    17541754}
    17551755
    1756 static RenderLayer* layerForNode(Node* node)
     1756static ScrollableArea* enclosingScrollableArea(Node* node)
    17571757{
    17581758    if (!node)
    1759         return 0;
    1760 
    1761     auto renderer = node->renderer();
    1762     if (!renderer)
    1763         return 0;
    1764 
    1765     RenderLayer* layer = renderer->enclosingLayer();
    1766     if (!layer)
    1767         return 0;
    1768 
    1769     return layer;
     1759        return nullptr;
     1760
     1761    for (auto element = node; element; element = element->parentOrShadowHostNode()) {
     1762        if (is<HTMLIFrameElement>(*element) || is<HTMLHtmlElement>(*element) || is<HTMLDocument>(*element))
     1763            return nullptr;
     1764
     1765        auto renderer = element->renderer();
     1766        if (!renderer)
     1767            continue;
     1768
     1769        if (is<RenderListBox>(*renderer))
     1770            return downcast<RenderListBox>(renderer);
     1771
     1772        return renderer->enclosingLayer();
     1773    }
     1774
     1775    return nullptr;
    17701776}
    17711777
     
    17851791        return result;
    17861792
    1787     if (RenderLayer* layer = layerForNode(hoveredNode.innerNode())) {
     1793    if (auto scrolledArea = enclosingScrollableArea(hoveredNode.innerNode())) {
    17881794        if (FrameView* frameView = m_frame.view()) {
    1789             if (frameView->containsScrollableArea(layer))
    1790                 layer->mouseMovedInContentArea();
     1795            if (frameView->containsScrollableArea(scrolledArea))
     1796                scrolledArea->mouseMovedInContentArea();
    17911797        }
    17921798    }
     
    23612367    // Fire mouseout/mouseover if the mouse has shifted to a different node.
    23622368    if (fireMouseOverOut) {
    2363         RenderLayer* layerForLastNode = layerForNode(m_lastElementUnderMouse.get());
    2364         RenderLayer* layerForNodeUnderMouse = layerForNode(m_elementUnderMouse.get());
     2369        auto scrollableAreaForLastNode = enclosingScrollableArea(m_lastElementUnderMouse.get());
     2370        auto scrollableAreaForNodeUnderMouse = enclosingScrollableArea(m_elementUnderMouse.get());
    23652371        Page* page = m_frame.page();
    23662372
     
    23712377                    frameView->mouseExitedContentArea();
    23722378            }
    2373         } else if (page && (layerForLastNode && (!layerForNodeUnderMouse || layerForNodeUnderMouse != layerForLastNode))) {
     2379        } else if (page && (scrollableAreaForLastNode && (!scrollableAreaForNodeUnderMouse || scrollableAreaForNodeUnderMouse != scrollableAreaForLastNode))) {
    23742380            // The mouse has moved between layers.
    23752381            if (Frame* frame = m_lastElementUnderMouse->document().frame()) {
    23762382                if (FrameView* frameView = frame->view()) {
    2377                     if (frameView->containsScrollableArea(layerForLastNode))
    2378                         layerForLastNode->mouseExitedContentArea();
     2383                    if (frameView->containsScrollableArea(scrollableAreaForLastNode))
     2384                        scrollableAreaForLastNode->mouseExitedContentArea();
    23792385                }
    23802386            }
     
    23872393                    frameView->mouseEnteredContentArea();
    23882394            }
    2389         } else if (page && (layerForNodeUnderMouse && (!layerForLastNode || layerForNodeUnderMouse != layerForLastNode))) {
     2395        } else if (page && (scrollableAreaForNodeUnderMouse && (!scrollableAreaForLastNode || scrollableAreaForNodeUnderMouse != scrollableAreaForLastNode))) {
    23902396            // The mouse has moved between layers.
    23912397            if (Frame* frame = m_elementUnderMouse->document().frame()) {
    23922398                if (FrameView* frameView = frame->view()) {
    2393                     if (frameView->containsScrollableArea(layerForNodeUnderMouse))
    2394                         layerForNodeUnderMouse->mouseEnteredContentArea();
     2399                    if (frameView->containsScrollableArea(scrollableAreaForNodeUnderMouse))
     2400                        scrollableAreaForNodeUnderMouse->mouseEnteredContentArea();
    23952401                }
    23962402            }
Note: See TracChangeset for help on using the changeset viewer.