Changeset 195659 in webkit
- Timestamp:
- Jan 27, 2016 2:24:57 AM (8 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r195656 r195659 1 2016-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 1 27 2016-01-26 Sam Weinig <sam@webkit.org> 2 28 -
trunk/Source/WebCore/page/EventHandler.cpp
r194819 r195659 1754 1754 } 1755 1755 1756 static RenderLayer* layerForNode(Node* node)1756 static ScrollableArea* enclosingScrollableArea(Node* node) 1757 1757 { 1758 1758 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; 1770 1776 } 1771 1777 … … 1785 1791 return result; 1786 1792 1787 if ( RenderLayer* layer = layerForNode(hoveredNode.innerNode())) {1793 if (auto scrolledArea = enclosingScrollableArea(hoveredNode.innerNode())) { 1788 1794 if (FrameView* frameView = m_frame.view()) { 1789 if (frameView->containsScrollableArea( layer))1790 layer->mouseMovedInContentArea();1795 if (frameView->containsScrollableArea(scrolledArea)) 1796 scrolledArea->mouseMovedInContentArea(); 1791 1797 } 1792 1798 } … … 2361 2367 // Fire mouseout/mouseover if the mouse has shifted to a different node. 2362 2368 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()); 2365 2371 Page* page = m_frame.page(); 2366 2372 … … 2371 2377 frameView->mouseExitedContentArea(); 2372 2378 } 2373 } else if (page && ( layerForLastNode && (!layerForNodeUnderMouse || layerForNodeUnderMouse != layerForLastNode))) {2379 } else if (page && (scrollableAreaForLastNode && (!scrollableAreaForNodeUnderMouse || scrollableAreaForNodeUnderMouse != scrollableAreaForLastNode))) { 2374 2380 // The mouse has moved between layers. 2375 2381 if (Frame* frame = m_lastElementUnderMouse->document().frame()) { 2376 2382 if (FrameView* frameView = frame->view()) { 2377 if (frameView->containsScrollableArea( layerForLastNode))2378 layerForLastNode->mouseExitedContentArea();2383 if (frameView->containsScrollableArea(scrollableAreaForLastNode)) 2384 scrollableAreaForLastNode->mouseExitedContentArea(); 2379 2385 } 2380 2386 } … … 2387 2393 frameView->mouseEnteredContentArea(); 2388 2394 } 2389 } else if (page && ( layerForNodeUnderMouse && (!layerForLastNode || layerForNodeUnderMouse != layerForLastNode))) {2395 } else if (page && (scrollableAreaForNodeUnderMouse && (!scrollableAreaForLastNode || scrollableAreaForNodeUnderMouse != scrollableAreaForLastNode))) { 2390 2396 // The mouse has moved between layers. 2391 2397 if (Frame* frame = m_elementUnderMouse->document().frame()) { 2392 2398 if (FrameView* frameView = frame->view()) { 2393 if (frameView->containsScrollableArea( layerForNodeUnderMouse))2394 layerForNodeUnderMouse->mouseEnteredContentArea();2399 if (frameView->containsScrollableArea(scrollableAreaForNodeUnderMouse)) 2400 scrollableAreaForNodeUnderMouse->mouseEnteredContentArea(); 2395 2401 } 2396 2402 }
Note: See TracChangeset
for help on using the changeset viewer.