Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(462)

Side by Side Diff: Source/WebCore/page/EventHandler.cpp

Issue 14096013: Implement select element list box with shadow DOM. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@shadowselect
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv ed. 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv ed.
3 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) 3 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org)
4 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies) 4 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies)
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions 7 * modification, are permitted provided that the following conditions
8 * are met: 8 * are met:
9 * 1. Redistributions of source code must retain the above copyright 9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 656 matching lines...) Expand 10 before | Expand all | Expand 10 after
667 bool swallowEvent = false; 667 bool swallowEvent = false;
668 m_mousePressed = true; 668 m_mousePressed = true;
669 m_selectionInitiationState = HaveNotStartedSelection; 669 m_selectionInitiationState = HaveNotStartedSelection;
670 670
671 if (event.event().clickCount() == 2) 671 if (event.event().clickCount() == 2)
672 swallowEvent = handleMousePressEventDoubleClick(event); 672 swallowEvent = handleMousePressEventDoubleClick(event);
673 else if (event.event().clickCount() >= 3) 673 else if (event.event().clickCount() >= 3)
674 swallowEvent = handleMousePressEventTripleClick(event); 674 swallowEvent = handleMousePressEventTripleClick(event);
675 else 675 else
676 swallowEvent = handleMousePressEventSingleClick(event); 676 swallowEvent = handleMousePressEventSingleClick(event);
677 677
678 m_mouseDownMayStartAutoscroll = m_mouseDownMayStartSelect 678 m_mouseDownMayStartAutoscroll = m_mouseDownMayStartSelect
679 || (m_mousePressNode && m_mousePressNode->renderBox() && m_mousePressNod e->renderBox()->canBeProgramaticallyScrolled()); 679 || (m_mousePressNode && m_mousePressNode->renderBox() && m_mousePressNod e->renderBox()->canBeProgramaticallyScrolled());
680 680
681 return swallowEvent; 681 return swallowEvent;
682 } 682 }
683 683
684 bool EventHandler::handleMouseDraggedEvent(const MouseEventWithHitTestResults& e vent) 684 bool EventHandler::handleMouseDraggedEvent(const MouseEventWithHitTestResults& e vent)
685 { 685 {
686 if (!m_mousePressed) 686 if (!m_mousePressed)
687 return false; 687 return false;
688 688
689 if (handleDrag(event, ShouldCheckDragHysteresis)) 689 if (handleDrag(event, ShouldCheckDragHysteresis))
690 return true; 690 return true;
691 691
692 Node* targetNode = event.targetNode(); 692 if (event.event().button() != LeftButton || !event.targetNode())
693 if (event.event().button() != LeftButton || !targetNode)
694 return false; 693 return false;
695 694
696 RenderObject* renderer = targetNode->renderer();
697 if (!renderer) {
698 Node* parent = EventPathWalker::parent(targetNode);
699 if (!parent)
700 return false;
701
702 renderer = parent->renderer();
703 if (!renderer || !renderer->isListBox())
704 return false;
705 }
706
707 m_mouseDownMayStartDrag = false; 695 m_mouseDownMayStartDrag = false;
708 696
709 if (m_mouseDownMayStartAutoscroll && !panScrollInProgress()) {
710 m_autoscrollController->startAutoscrollForSelection(renderer);
711 m_mouseDownMayStartAutoscroll = false;
712 }
713
714 if (m_selectionInitiationState != ExtendedSelection) { 697 if (m_selectionInitiationState != ExtendedSelection) {
715 HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::DisallowShadowContent); 698 HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::DisallowShadowContent);
716 HitTestResult result(m_mouseDownPos); 699 HitTestResult result(m_mouseDownPos);
717 m_frame->document()->renderView()->hitTest(request, result); 700 m_frame->document()->renderView()->hitTest(request, result);
718 701
719 updateSelectionForMouseDrag(result); 702 updateSelectionForMouseDrag(result);
720 } 703 }
721 updateSelectionForMouseDrag(event.hitTestResult()); 704 updateSelectionForMouseDrag(event.hitTestResult());
722 return true; 705 return true;
723 } 706 }
(...skipping 910 matching lines...) Expand 10 before | Expand all | Expand 10 after
1634 return true; 1617 return true;
1635 } 1618 }
1636 1619
1637 bool swallowEvent = false; 1620 bool swallowEvent = false;
1638 RefPtr<Frame> newSubframe = m_capturingMouseEventsNode.get() ? subframeForTa rgetNode(m_capturingMouseEventsNode.get()) : subframeForHitTestResult(mev); 1621 RefPtr<Frame> newSubframe = m_capturingMouseEventsNode.get() ? subframeForTa rgetNode(m_capturingMouseEventsNode.get()) : subframeForHitTestResult(mev);
1639 1622
1640 // We want mouseouts to happen first, from the inside out. First send a mov e event to the last subframe so that it will fire mouseouts. 1623 // We want mouseouts to happen first, from the inside out. First send a mov e event to the last subframe so that it will fire mouseouts.
1641 if (m_lastMouseMoveEventSubframe && m_lastMouseMoveEventSubframe->tree()->is DescendantOf(m_frame) && m_lastMouseMoveEventSubframe != newSubframe) 1624 if (m_lastMouseMoveEventSubframe && m_lastMouseMoveEventSubframe->tree()->is DescendantOf(m_frame) && m_lastMouseMoveEventSubframe != newSubframe)
1642 passMouseMoveEventToSubframe(mev, m_lastMouseMoveEventSubframe.get()); 1625 passMouseMoveEventToSubframe(mev, m_lastMouseMoveEventSubframe.get());
1643 1626
1627 Node* targetNode = mev.targetNode();
1628
1644 if (newSubframe) { 1629 if (newSubframe) {
1645 // Update over/out state before passing the event to the subframe. 1630 // Update over/out state before passing the event to the subframe.
1646 updateMouseEventTargetNode(mev.targetNode(), mouseEvent, true); 1631 updateMouseEventTargetNode(targetNode, mouseEvent, true);
1647 1632
1648 // Event dispatch in updateMouseEventTargetNode may have caused the subf rame of the target 1633 // Event dispatch in updateMouseEventTargetNode may have caused the subf rame of the target
1649 // node to be detached from its FrameView, in which case the event shoul d not be passed. 1634 // node to be detached from its FrameView, in which case the event shoul d not be passed.
1650 if (newSubframe->view()) 1635 if (newSubframe->view())
1651 swallowEvent |= passMouseMoveEventToSubframe(mev, newSubframe.get(), hoveredNode); 1636 swallowEvent |= passMouseMoveEventToSubframe(mev, newSubframe.get(), hoveredNode);
1652 } else { 1637 } else {
1653 if (scrollbar && !m_mousePressed) 1638 if (scrollbar && !m_mousePressed)
1654 scrollbar->mouseMoved(mouseEvent); // Handle hover effects on platfo rms that support visual feedback on scrollbar hovering. 1639 scrollbar->mouseMoved(mouseEvent); // Handle hover effects on platfo rms that support visual feedback on scrollbar hovering.
1655 if (FrameView* view = m_frame->view()) { 1640 if (FrameView* view = m_frame->view()) {
1656 OptionalCursor optionalCursor = selectCursor(mev, scrollbar); 1641 OptionalCursor optionalCursor = selectCursor(mev, scrollbar);
1657 if (optionalCursor.isCursorChange()) { 1642 if (optionalCursor.isCursorChange()) {
1658 m_currentMouseCursor = optionalCursor.cursor(); 1643 m_currentMouseCursor = optionalCursor.cursor();
1659 view->setCursor(m_currentMouseCursor); 1644 view->setCursor(m_currentMouseCursor);
1660 } 1645 }
1661 } 1646 }
1662 } 1647 }
1663 1648
1664 m_lastMouseMoveEventSubframe = newSubframe; 1649 m_lastMouseMoveEventSubframe = newSubframe;
1665 1650
1666 if (swallowEvent) 1651 if (swallowEvent)
1667 return true; 1652 return true;
1668 1653
1669 swallowEvent = !dispatchMouseEvent(eventNames().mousemoveEvent, mev.targetNo de(), false, 0, mouseEvent, true); 1654 swallowEvent = !dispatchMouseEvent(eventNames().mousemoveEvent, targetNode, false, 0, mouseEvent, true);
1655
1656 RenderObject* renderer = targetNode ? targetNode->renderer() : 0;
1657
1658 if (renderer && m_mouseDownMayStartAutoscroll && !panScrollInProgress()) {
1659 m_autoscrollController->startAutoscrollForSelection(renderer);
1660 m_mouseDownMayStartAutoscroll = false;
1661 }
1662
1670 if (!swallowEvent) 1663 if (!swallowEvent)
1671 swallowEvent = handleMouseDraggedEvent(mev); 1664 swallowEvent = handleMouseDraggedEvent(mev);
1672 1665
1673 return swallowEvent; 1666 return swallowEvent;
1674 } 1667 }
1675 1668
1676 void EventHandler::invalidateClick() 1669 void EventHandler::invalidateClick()
1677 { 1670 {
1678 m_clickCount = 0; 1671 m_clickCount = 0;
1679 m_clickNode = 0; 1672 m_clickNode = 0;
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
1991 void EventHandler::setCapturingMouseEventsNode(PassRefPtr<Node> n) 1984 void EventHandler::setCapturingMouseEventsNode(PassRefPtr<Node> n)
1992 { 1985 {
1993 m_capturingMouseEventsNode = n; 1986 m_capturingMouseEventsNode = n;
1994 m_eventHandlerWillResetCapturingMouseEventsNode = false; 1987 m_eventHandlerWillResetCapturingMouseEventsNode = false;
1995 } 1988 }
1996 1989
1997 MouseEventWithHitTestResults EventHandler::prepareMouseEvent(const HitTestReques t& request, const PlatformMouseEvent& mev) 1990 MouseEventWithHitTestResults EventHandler::prepareMouseEvent(const HitTestReques t& request, const PlatformMouseEvent& mev)
1998 { 1991 {
1999 ASSERT(m_frame); 1992 ASSERT(m_frame);
2000 ASSERT(m_frame->document()); 1993 ASSERT(m_frame->document());
2001 1994
2002 return m_frame->document()->prepareMouseEvent(request, documentPointForWindo wPoint(m_frame, mev.position()), mev); 1995 return m_frame->document()->prepareMouseEvent(request, documentPointForWindo wPoint(m_frame, mev.position()), mev);
2003 } 1996 }
2004 1997
2005 #if ENABLE(SVG) 1998 #if ENABLE(SVG)
2006 static inline SVGElementInstance* instanceAssociatedWithShadowTreeElement(Node* referenceNode) 1999 static inline SVGElementInstance* instanceAssociatedWithShadowTreeElement(Node* referenceNode)
2007 { 2000 {
2008 if (!referenceNode || !referenceNode->isSVGElement()) 2001 if (!referenceNode || !referenceNode->isSVGElement())
2009 return 0; 2002 return 0;
2010 2003
2011 ShadowRoot* shadowRoot = referenceNode->containingShadowRoot(); 2004 ShadowRoot* shadowRoot = referenceNode->containingShadowRoot();
(...skipping 1988 matching lines...) Expand 10 before | Expand all | Expand 10 after
4000 unsigned EventHandler::accessKeyModifiers() 3993 unsigned EventHandler::accessKeyModifiers()
4001 { 3994 {
4002 #if OS(DARWIN) 3995 #if OS(DARWIN)
4003 return PlatformEvent::CtrlKey | PlatformEvent::AltKey; 3996 return PlatformEvent::CtrlKey | PlatformEvent::AltKey;
4004 #else 3997 #else
4005 return PlatformEvent::AltKey; 3998 return PlatformEvent::AltKey;
4006 #endif 3999 #endif
4007 } 4000 }
4008 4001
4009 } // namespace WebCore 4002 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698