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

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

Issue 869813003: Implement elementsFromPoint (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fix typeo Created 5 years, 11 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 871 matching lines...) Expand 10 before | Expand all | Expand 10 after
882 882
883 // RenderView::hitTest causes a layout, and we don't want to hit that until the first 883 // RenderView::hitTest causes a layout, and we don't want to hit that until the first
884 // layout because until then, there is nothing shown on the screen - the use r can't 884 // layout because until then, there is nothing shown on the screen - the use r can't
885 // have intentionally clicked on something belonging to this page. Furthermo re, 885 // have intentionally clicked on something belonging to this page. Furthermo re,
886 // mousemove events before the first layout should not lead to a premature l ayout() 886 // mousemove events before the first layout should not lead to a premature l ayout()
887 // happening, which could show a flash of white. 887 // happening, which could show a flash of white.
888 // See also the similar code in Document::prepareMouseEvent. 888 // See also the similar code in Document::prepareMouseEvent.
889 if (!m_frame->contentRenderer() || !m_frame->view() || !m_frame->view()->did FirstLayout()) 889 if (!m_frame->contentRenderer() || !m_frame->view() || !m_frame->view()->did FirstLayout())
890 return result; 890 return result;
891 891
892 if (padding.width() || padding.height())
893 hitType |= HitTestRequest::ListBased;
Rick Byers 2015/02/04 10:34:03 Perhaps we should require callers to opt-in to lis
pdr. 2015/02/17 04:10:13 Added back! I took this out thinking it would be e
894
892 // hitTestResultAtPoint is specifically used to hitTest into all frames, thu s it always allows child frame content. 895 // hitTestResultAtPoint is specifically used to hitTest into all frames, thu s it always allows child frame content.
893 HitTestRequest request(hitType | HitTestRequest::AllowChildFrameContent); 896 HitTestRequest request(hitType | HitTestRequest::AllowChildFrameContent);
894 m_frame->contentRenderer()->hitTest(request, result); 897 m_frame->contentRenderer()->hitTest(request, result);
895 if (!request.readOnly()) 898 if (!request.readOnly())
896 m_frame->document()->updateHoverActiveState(request, result.innerElement ()); 899 m_frame->document()->updateHoverActiveState(request, result.innerElement ());
897 900
898 return result; 901 return result;
899 } 902 }
900 903
901 void EventHandler::stopAutoscroll() 904 void EventHandler::stopAutoscroll()
(...skipping 1691 matching lines...) Expand 10 before | Expand all | Expand 10 after
2593 // scrollbars being untouchable. 2596 // scrollbars being untouchable.
2594 if (result.scrollbar()) { 2597 if (result.scrollbar()) {
2595 targetNode = 0; 2598 targetNode = 0;
2596 return false; 2599 return false;
2597 } 2600 }
2598 2601
2599 IntPoint touchCenter = m_frame->view()->contentsToWindow(result.roundedPoint InMainFrame()); 2602 IntPoint touchCenter = m_frame->view()->contentsToWindow(result.roundedPoint InMainFrame());
2600 IntRect touchRect = m_frame->view()->contentsToWindow(result.hitTestLocation ().boundingBox()); 2603 IntRect touchRect = m_frame->view()->contentsToWindow(result.hitTestLocation ().boundingBox());
2601 2604
2602 WillBeHeapVector<RefPtrWillBeMember<Node>, 11> nodes; 2605 WillBeHeapVector<RefPtrWillBeMember<Node>, 11> nodes;
2603 copyToVector(result.rectBasedTestResult(), nodes); 2606 copyToVector(result.listBasedTestResult(), nodes);
2604 2607
2605 // FIXME: the explicit Vector conversion copies into a temporary and is wast eful. 2608 // FIXME: the explicit Vector conversion copies into a temporary and is wast eful.
2606 return findBestClickableCandidate(targetNode, targetPoint, touchCenter, touc hRect, WillBeHeapVector<RefPtrWillBeMember<Node>> (nodes)); 2609 return findBestClickableCandidate(targetNode, targetPoint, touchCenter, touc hRect, WillBeHeapVector<RefPtrWillBeMember<Node>> (nodes));
2607 } 2610 }
2608 2611
2609 bool EventHandler::bestContextMenuNodeForHitTestResult(const HitTestResult& resu lt, IntPoint& targetPoint, Node*& targetNode) 2612 bool EventHandler::bestContextMenuNodeForHitTestResult(const HitTestResult& resu lt, IntPoint& targetPoint, Node*& targetNode)
2610 { 2613 {
2611 ASSERT(result.isRectBasedTest()); 2614 ASSERT(result.isRectBasedTest());
2612 IntPoint touchCenter = m_frame->view()->contentsToWindow(result.roundedPoint InMainFrame()); 2615 IntPoint touchCenter = m_frame->view()->contentsToWindow(result.roundedPoint InMainFrame());
2613 IntRect touchRect = m_frame->view()->contentsToWindow(result.hitTestLocation ().boundingBox()); 2616 IntRect touchRect = m_frame->view()->contentsToWindow(result.hitTestLocation ().boundingBox());
2614 WillBeHeapVector<RefPtrWillBeMember<Node>, 11> nodes; 2617 WillBeHeapVector<RefPtrWillBeMember<Node>, 11> nodes;
2615 copyToVector(result.rectBasedTestResult(), nodes); 2618 copyToVector(result.listBasedTestResult(), nodes);
2616 2619
2617 // FIXME: the explicit Vector conversion copies into a temporary and is wast eful. 2620 // FIXME: the explicit Vector conversion copies into a temporary and is wast eful.
2618 return findBestContextMenuCandidate(targetNode, targetPoint, touchCenter, to uchRect, WillBeHeapVector<RefPtrWillBeMember<Node>>(nodes)); 2621 return findBestContextMenuCandidate(targetNode, targetPoint, touchCenter, to uchRect, WillBeHeapVector<RefPtrWillBeMember<Node>>(nodes));
2619 } 2622 }
2620 2623
2621 bool EventHandler::bestZoomableAreaForTouchPoint(const IntPoint& touchCenter, co nst IntSize& touchRadius, IntRect& targetArea, Node*& targetNode) 2624 bool EventHandler::bestZoomableAreaForTouchPoint(const IntPoint& touchCenter, co nst IntSize& touchRadius, IntRect& targetArea, Node*& targetNode)
2622 { 2625 {
2623 IntPoint hitTestPoint = m_frame->view()->windowToContents(touchCenter); 2626 IntPoint hitTestPoint = m_frame->view()->windowToContents(touchCenter);
2624 HitTestResult result = hitTestResultAtPoint(hitTestPoint, HitTestRequest::Re adOnly | HitTestRequest::Active, LayoutSize(touchRadius)); 2627 HitTestResult result = hitTestResultAtPoint(hitTestPoint, HitTestRequest::Re adOnly | HitTestRequest::Active, LayoutSize(touchRadius));
2625 2628
2626 IntRect touchRect(touchCenter - touchRadius, touchRadius + touchRadius); 2629 IntRect touchRect(touchCenter - touchRadius, touchRadius + touchRadius);
2627 WillBeHeapVector<RefPtrWillBeMember<Node>, 11> nodes; 2630 WillBeHeapVector<RefPtrWillBeMember<Node>, 11> nodes;
2628 copyToVector(result.rectBasedTestResult(), nodes); 2631 copyToVector(result.listBasedTestResult(), nodes);
2629 2632
2630 // FIXME: the explicit Vector conversion copies into a temporary and is wast eful. 2633 // FIXME: the explicit Vector conversion copies into a temporary and is wast eful.
2631 return findBestZoomableArea(targetNode, targetArea, touchCenter, touchRect, WillBeHeapVector<RefPtrWillBeMember<Node>>(nodes)); 2634 return findBestZoomableArea(targetNode, targetArea, touchCenter, touchRect, WillBeHeapVector<RefPtrWillBeMember<Node>>(nodes));
2632 } 2635 }
2633 2636
2634 GestureEventWithHitTestResults EventHandler::targetGestureEvent(const PlatformGe stureEvent& gestureEvent, bool readOnly) 2637 GestureEventWithHitTestResults EventHandler::targetGestureEvent(const PlatformGe stureEvent& gestureEvent, bool readOnly)
2635 { 2638 {
2636 TRACE_EVENT0("input", "EventHandler::targetGestureEvent"); 2639 TRACE_EVENT0("input", "EventHandler::targetGestureEvent");
2637 2640
2638 ASSERT(m_frame == m_frame->localFrameRoot()); 2641 ASSERT(m_frame == m_frame->localFrameRoot());
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
2689 applyTouchAdjustment(&adjustedEvent, &hitTestResult); 2692 applyTouchAdjustment(&adjustedEvent, &hitTestResult);
2690 2693
2691 // Do a new hit-test at the (adjusted) gesture co-ordinates. This is necessa ry because 2694 // Do a new hit-test at the (adjusted) gesture co-ordinates. This is necessa ry because
2692 // rect-based hit testing and touch adjustment sometimes return a different node than 2695 // rect-based hit testing and touch adjustment sometimes return a different node than
2693 // what a point-based hit test would return for the same point. 2696 // what a point-based hit test would return for the same point.
2694 // FIXME: Fix touch adjustment to avoid the need for a redundant hit test. h ttp://crbug.com/398914 2697 // FIXME: Fix touch adjustment to avoid the need for a redundant hit test. h ttp://crbug.com/398914
2695 if (shouldApplyTouchAdjustment(gestureEvent)) { 2698 if (shouldApplyTouchAdjustment(gestureEvent)) {
2696 LocalFrame* hitFrame = hitTestResult.innerNodeFrame(); 2699 LocalFrame* hitFrame = hitTestResult.innerNodeFrame();
2697 if (!hitFrame) 2700 if (!hitFrame)
2698 hitFrame = m_frame; 2701 hitFrame = m_frame;
2699 hitTestResult = hitTestResultInFrame(hitFrame, hitFrame->view()->windowT oContents(adjustedEvent.position()), hitType | HitTestRequest::ReadOnly); 2702 hitTestResult = hitTestResultInFrame(hitFrame, hitFrame->view()->windowT oContents(adjustedEvent.position()), (hitType | HitTestRequest::ReadOnly) & ~Hit TestRequest::ListBased);
2700 } 2703 }
2701 2704
2702 // If we did a rect-based hit test it must be resolved to the best single no de by now to 2705 // If we did a rect-based hit test it must be resolved to the best single no de by now to
2703 // ensure consumers don't accidentally use one of the other candidates. 2706 // ensure consumers don't accidentally use one of the other candidates.
2704 ASSERT(!hitTestResult.isRectBasedTest()); 2707 ASSERT(!hitTestResult.isRectBasedTest());
2705 2708
2706 return GestureEventWithHitTestResults(adjustedEvent, hitTestResult); 2709 return GestureEventWithHitTestResults(adjustedEvent, hitTestResult);
2707 } 2710 }
2708 2711
2709 HitTestRequest::HitTestRequestType EventHandler::getHitTypeForGestureType(Platfo rmEvent::Type type) 2712 HitTestRequest::HitTestRequestType EventHandler::getHitTypeForGestureType(Platfo rmEvent::Type type)
(...skipping 1196 matching lines...) Expand 10 before | Expand all | Expand 10 after
3906 unsigned EventHandler::accessKeyModifiers() 3909 unsigned EventHandler::accessKeyModifiers()
3907 { 3910 {
3908 #if OS(MACOSX) 3911 #if OS(MACOSX)
3909 return PlatformEvent::CtrlKey | PlatformEvent::AltKey; 3912 return PlatformEvent::CtrlKey | PlatformEvent::AltKey;
3910 #else 3913 #else
3911 return PlatformEvent::AltKey; 3914 return PlatformEvent::AltKey;
3912 #endif 3915 #endif
3913 } 3916 }
3914 3917
3915 } // namespace blink 3918 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698