OLD | NEW |
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 1616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1627 | 1627 |
1628 | 1628 |
1629 bool EventHandler::dispatchDragEvent(const AtomicString& eventType, Node* dragTa
rget, const PlatformMouseEvent& event, DataTransfer* dataTransfer) | 1629 bool EventHandler::dispatchDragEvent(const AtomicString& eventType, Node* dragTa
rget, const PlatformMouseEvent& event, DataTransfer* dataTransfer) |
1630 { | 1630 { |
1631 FrameView* view = m_frame->view(); | 1631 FrameView* view = m_frame->view(); |
1632 | 1632 |
1633 // FIXME: We might want to dispatch a dragleave even if the view is gone. | 1633 // FIXME: We might want to dispatch a dragleave even if the view is gone. |
1634 if (!view) | 1634 if (!view) |
1635 return false; | 1635 return false; |
1636 | 1636 |
| 1637 // FIXME: The drag event have to support for |buttons| attribute because |
| 1638 // the event is derived from mouse event. Please see crbug.com/276941. |
1637 RefPtrWillBeRawPtr<MouseEvent> me = MouseEvent::create(eventType, | 1639 RefPtrWillBeRawPtr<MouseEvent> me = MouseEvent::create(eventType, |
1638 true, true, m_frame->document()->domWindow(), | 1640 true, true, m_frame->document()->domWindow(), |
1639 0, event.globalPosition().x(), event.globalPosition().y(), event.positio
n().x(), event.position().y(), | 1641 0, event.globalPosition().x(), event.globalPosition().y(), event.positio
n().x(), event.position().y(), |
1640 event.movementDelta().x(), event.movementDelta().y(), | 1642 event.movementDelta().x(), event.movementDelta().y(), |
1641 event.ctrlKey(), event.altKey(), event.shiftKey(), event.metaKey(), | 1643 event.ctrlKey(), event.altKey(), event.shiftKey(), event.metaKey(), |
1642 0, nullptr, dataTransfer); | 1644 0, 0, nullptr, dataTransfer); |
1643 | 1645 |
1644 dragTarget->dispatchEvent(me.get(), IGNORE_EXCEPTION); | 1646 dragTarget->dispatchEvent(me.get(), IGNORE_EXCEPTION); |
1645 return me->defaultPrevented(); | 1647 return me->defaultPrevented(); |
1646 } | 1648 } |
1647 | 1649 |
1648 static bool targetIsFrame(Node* target, LocalFrame*& frame) | 1650 static bool targetIsFrame(Node* target, LocalFrame*& frame) |
1649 { | 1651 { |
1650 if (!isHTMLFrameElementBase(target)) | 1652 if (!isHTMLFrameElementBase(target)) |
1651 return false; | 1653 return false; |
1652 | 1654 |
(...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2224 } | 2226 } |
2225 | 2227 |
2226 bool EventHandler::handleGestureTap(const GestureEventWithHitTestResults& target
edEvent) | 2228 bool EventHandler::handleGestureTap(const GestureEventWithHitTestResults& target
edEvent) |
2227 { | 2229 { |
2228 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); | 2230 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); |
2229 const PlatformGestureEvent& gestureEvent = targetedEvent.event(); | 2231 const PlatformGestureEvent& gestureEvent = targetedEvent.event(); |
2230 HitTestRequest::HitTestRequestType hitType = getHitTypeForGestureType(gestur
eEvent.type()); | 2232 HitTestRequest::HitTestRequestType hitType = getHitTypeForGestureType(gestur
eEvent.type()); |
2231 | 2233 |
2232 UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture); | 2234 UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture); |
2233 | 2235 |
2234 unsigned modifierFlags = 0; | |
2235 if (gestureEvent.altKey()) | |
2236 modifierFlags |= PlatformEvent::AltKey; | |
2237 if (gestureEvent.ctrlKey()) | |
2238 modifierFlags |= PlatformEvent::CtrlKey; | |
2239 if (gestureEvent.metaKey()) | |
2240 modifierFlags |= PlatformEvent::MetaKey; | |
2241 if (gestureEvent.shiftKey()) | |
2242 modifierFlags |= PlatformEvent::ShiftKey; | |
2243 PlatformEvent::Modifiers modifiers = static_cast<PlatformEvent::Modifiers>(m
odifierFlags); | |
2244 | |
2245 HitTestResult currentHitTest = targetedEvent.hitTestResult(); | 2236 HitTestResult currentHitTest = targetedEvent.hitTestResult(); |
2246 | 2237 |
2247 // We use the adjusted position so the application isn't surprised to see a
event with | 2238 // We use the adjusted position so the application isn't surprised to see a
event with |
2248 // co-ordinates outside the target's bounds. | 2239 // co-ordinates outside the target's bounds. |
2249 IntPoint adjustedPoint = m_frame->view()->windowToContents(gestureEvent.posi
tion()); | 2240 IntPoint adjustedPoint = m_frame->view()->windowToContents(gestureEvent.posi
tion()); |
2250 | 2241 |
| 2242 unsigned modifiers = gestureEvent.modifiers(); |
2251 PlatformMouseEvent fakeMouseMove(gestureEvent.position(), gestureEvent.globa
lPosition(), | 2243 PlatformMouseEvent fakeMouseMove(gestureEvent.position(), gestureEvent.globa
lPosition(), |
2252 NoButton, PlatformEvent::MouseMoved, /* clickCount */ 0, | 2244 NoButton, PlatformEvent::MouseMoved, /* clickCount */ 0, |
2253 modifiers, PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); | 2245 static_cast<PlatformEvent::Modifiers>(modifiers), |
| 2246 PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); |
2254 dispatchMouseEvent(EventTypeNames::mousemove, currentHitTest.innerNode(), 0,
fakeMouseMove, true); | 2247 dispatchMouseEvent(EventTypeNames::mousemove, currentHitTest.innerNode(), 0,
fakeMouseMove, true); |
2255 | 2248 |
2256 // Do a new hit-test in case the mousemove event changed the DOM. | 2249 // Do a new hit-test in case the mousemove event changed the DOM. |
2257 // Note that if the original hit test wasn't over an element (eg. was over a
scrollbar) we | 2250 // Note that if the original hit test wasn't over an element (eg. was over a
scrollbar) we |
2258 // don't want to re-hit-test because it may be in the wrong frame (and there
's no way the page | 2251 // don't want to re-hit-test because it may be in the wrong frame (and there
's no way the page |
2259 // could have seen the event anyway). | 2252 // could have seen the event anyway). |
2260 // FIXME: Use a hit-test cache to avoid unnecessary hit tests. http://crbug.
com/398920 | 2253 // FIXME: Use a hit-test cache to avoid unnecessary hit tests. http://crbug.
com/398920 |
2261 if (currentHitTest.innerNode()) | 2254 if (currentHitTest.innerNode()) |
2262 currentHitTest = hitTestResultInFrame(m_frame, adjustedPoint, hitType); | 2255 currentHitTest = hitTestResultInFrame(m_frame, adjustedPoint, hitType); |
2263 m_clickNode = currentHitTest.innerNode(); | 2256 m_clickNode = currentHitTest.innerNode(); |
2264 if (m_clickNode && m_clickNode->isTextNode()) | 2257 if (m_clickNode && m_clickNode->isTextNode()) |
2265 m_clickNode = NodeRenderingTraversal::parent(*m_clickNode); | 2258 m_clickNode = NodeRenderingTraversal::parent(*m_clickNode); |
2266 | 2259 |
2267 PlatformMouseEvent fakeMouseDown(gestureEvent.position(), gestureEvent.globa
lPosition(), | 2260 PlatformMouseEvent fakeMouseDown(gestureEvent.position(), gestureEvent.globa
lPosition(), |
2268 LeftButton, PlatformEvent::MousePressed, gestureEvent.tapCount(), | 2261 LeftButton, PlatformEvent::MousePressed, gestureEvent.tapCount(), |
2269 modifiers, PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); | 2262 static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::LeftBut
tonDown), |
| 2263 PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); |
2270 bool swallowMouseDownEvent = !dispatchMouseEvent(EventTypeNames::mousedown,
currentHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseDown, true); | 2264 bool swallowMouseDownEvent = !dispatchMouseEvent(EventTypeNames::mousedown,
currentHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseDown, true); |
2271 if (!swallowMouseDownEvent) | 2265 if (!swallowMouseDownEvent) |
2272 swallowMouseDownEvent = handleMouseFocus(MouseEventWithHitTestResults(fa
keMouseDown, currentHitTest)); | 2266 swallowMouseDownEvent = handleMouseFocus(MouseEventWithHitTestResults(fa
keMouseDown, currentHitTest)); |
2273 if (!swallowMouseDownEvent) { | 2267 if (!swallowMouseDownEvent) { |
2274 swallowMouseDownEvent = handleMousePressEvent(MouseEventWithHitTestResul
ts(fakeMouseDown, currentHitTest)); | 2268 swallowMouseDownEvent = handleMousePressEvent(MouseEventWithHitTestResul
ts(fakeMouseDown, currentHitTest)); |
2275 // m_selectionInitiationState is initialized after dispatching mousedown
event. | 2269 // m_selectionInitiationState is initialized after dispatching mousedown
event. |
2276 m_selectionInitiationState = HaveNotStartedSelection; | 2270 m_selectionInitiationState = HaveNotStartedSelection; |
2277 } | 2271 } |
2278 | 2272 |
2279 // FIXME: Use a hit-test cache to avoid unnecessary hit tests. http://crbug.
com/398920 | 2273 // FIXME: Use a hit-test cache to avoid unnecessary hit tests. http://crbug.
com/398920 |
2280 if (currentHitTest.innerNode()) | 2274 if (currentHitTest.innerNode()) |
2281 currentHitTest = hitTestResultInFrame(m_frame, adjustedPoint, hitType); | 2275 currentHitTest = hitTestResultInFrame(m_frame, adjustedPoint, hitType); |
2282 PlatformMouseEvent fakeMouseUp(gestureEvent.position(), gestureEvent.globalP
osition(), | 2276 PlatformMouseEvent fakeMouseUp(gestureEvent.position(), gestureEvent.globalP
osition(), |
2283 LeftButton, PlatformEvent::MouseReleased, gestureEvent.tapCount(), | 2277 LeftButton, PlatformEvent::MouseReleased, gestureEvent.tapCount(), |
2284 modifiers, PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); | 2278 static_cast<PlatformEvent::Modifiers>(modifiers), |
| 2279 PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); |
2285 bool swallowMouseUpEvent = !dispatchMouseEvent(EventTypeNames::mouseup, curr
entHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseUp, false); | 2280 bool swallowMouseUpEvent = !dispatchMouseEvent(EventTypeNames::mouseup, curr
entHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseUp, false); |
2286 | 2281 |
2287 bool swallowClickEvent = false; | 2282 bool swallowClickEvent = false; |
2288 if (m_clickNode) { | 2283 if (m_clickNode) { |
2289 if (currentHitTest.innerNode()) { | 2284 if (currentHitTest.innerNode()) { |
2290 // Updates distribution because a mouseup (or mousedown) event liste
ner can make the | 2285 // Updates distribution because a mouseup (or mousedown) event liste
ner can make the |
2291 // tree dirty at dispatchMouseEvent() invocation above. | 2286 // tree dirty at dispatchMouseEvent() invocation above. |
2292 // Unless distribution is updated, commonAncestor would hit ASSERT. | 2287 // Unless distribution is updated, commonAncestor would hit ASSERT. |
2293 // Both m_clickNode and currentHitTest.innerNode()) don't need to be
updated | 2288 // Both m_clickNode and currentHitTest.innerNode()) don't need to be
updated |
2294 // because commonAncestor() will exit early if their documents are d
ifferent. | 2289 // because commonAncestor() will exit early if their documents are d
ifferent. |
2295 m_clickNode->document().updateDistributionForNodeIfNeeded(m_clickNod
e.get()); | 2290 m_clickNode->document().updateDistributionForNodeIfNeeded(m_clickNod
e.get()); |
2296 Node* clickTargetNode = currentHitTest.innerNode()->commonAncestor(*
m_clickNode, parentForClickEvent); | 2291 Node* clickTargetNode = currentHitTest.innerNode()->commonAncestor(*
m_clickNode, parentForClickEvent); |
2297 swallowClickEvent = !dispatchMouseEvent(EventTypeNames::click, click
TargetNode, gestureEvent.tapCount(), fakeMouseUp, true); | 2292 swallowClickEvent = !dispatchMouseEvent(EventTypeNames::click, click
TargetNode, gestureEvent.tapCount(), fakeMouseUp, true); |
2298 } | 2293 } |
2299 m_clickNode = nullptr; | 2294 m_clickNode = nullptr; |
2300 } | 2295 } |
2301 | 2296 |
2302 if (!swallowMouseUpEvent) | 2297 if (!swallowMouseUpEvent) |
2303 swallowMouseUpEvent = handleMouseReleaseEvent(MouseEventWithHitTestResul
ts(fakeMouseUp, currentHitTest)); | 2298 swallowMouseUpEvent = handleMouseReleaseEvent(MouseEventWithHitTestResul
ts(fakeMouseUp, currentHitTest)); |
2304 | 2299 |
2305 return swallowMouseDownEvent | swallowMouseUpEvent | swallowClickEvent; | 2300 return swallowMouseDownEvent | swallowMouseUpEvent | swallowClickEvent; |
2306 } | 2301 } |
2307 | 2302 |
2308 bool EventHandler::handleGestureLongPress(const GestureEventWithHitTestResults&
targetedEvent) | 2303 bool EventHandler::handleGestureLongPress(const GestureEventWithHitTestResults&
targetedEvent) |
2309 { | 2304 { |
2310 const PlatformGestureEvent& gestureEvent = targetedEvent.event(); | 2305 const PlatformGestureEvent& gestureEvent = targetedEvent.event(); |
2311 IntPoint adjustedPoint = gestureEvent.position(); | 2306 IntPoint adjustedPoint = gestureEvent.position(); |
2312 | 2307 |
| 2308 unsigned modifiers = gestureEvent.modifiers(); |
| 2309 |
2313 // FIXME: Ideally we should try to remove the extra mouse-specific hit-tests
here (re-using the | 2310 // FIXME: Ideally we should try to remove the extra mouse-specific hit-tests
here (re-using the |
2314 // supplied HitTestResult), but that will require some overhaul of the touch
drag-and-drop code | 2311 // supplied HitTestResult), but that will require some overhaul of the touch
drag-and-drop code |
2315 // and LongPress is such a special scenario that it's unlikely to matter muc
h in practice. | 2312 // and LongPress is such a special scenario that it's unlikely to matter muc
h in practice. |
2316 | 2313 |
2317 m_longTapShouldInvokeContextMenu = false; | 2314 m_longTapShouldInvokeContextMenu = false; |
2318 if (m_frame->settings() && m_frame->settings()->touchDragDropEnabled() && m_
frame->view()) { | 2315 if (m_frame->settings() && m_frame->settings()->touchDragDropEnabled() && m_
frame->view()) { |
2319 PlatformMouseEvent mouseDownEvent(adjustedPoint, gestureEvent.globalPosi
tion(), LeftButton, PlatformEvent::MousePressed, 1, | 2316 PlatformMouseEvent mouseDownEvent(adjustedPoint, gestureEvent.globalPosi
tion(), LeftButton, PlatformEvent::MousePressed, 1, |
2320 gestureEvent.shiftKey(), gestureEvent.ctrlKey(), gestureEvent.altKey
(), gestureEvent.metaKey(), PlatformMouseEvent::FromTouch, WTF::currentTime()); | 2317 static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::Lef
tButtonDown), |
| 2318 PlatformMouseEvent::FromTouch, WTF::currentTime()); |
2321 m_mouseDown = mouseDownEvent; | 2319 m_mouseDown = mouseDownEvent; |
2322 | 2320 |
2323 PlatformMouseEvent mouseDragEvent(adjustedPoint, gestureEvent.globalPosi
tion(), LeftButton, PlatformEvent::MouseMoved, 1, | 2321 PlatformMouseEvent mouseDragEvent(adjustedPoint, gestureEvent.globalPosi
tion(), LeftButton, PlatformEvent::MouseMoved, 1, |
2324 gestureEvent.shiftKey(), gestureEvent.ctrlKey(), gestureEvent.altKey
(), gestureEvent.metaKey(), PlatformMouseEvent::FromTouch, WTF::currentTime()); | 2322 static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::Lef
tButtonDown), |
| 2323 PlatformMouseEvent::FromTouch, WTF::currentTime()); |
2325 HitTestRequest request(HitTestRequest::ReadOnly); | 2324 HitTestRequest request(HitTestRequest::ReadOnly); |
2326 MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseDragE
vent); | 2325 MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseDragE
vent); |
2327 m_mouseDownMayStartDrag = true; | 2326 m_mouseDownMayStartDrag = true; |
2328 dragState().m_dragSrc = nullptr; | 2327 dragState().m_dragSrc = nullptr; |
2329 m_mouseDownPos = m_frame->view()->windowToContents(mouseDragEvent.positi
on()); | 2328 m_mouseDownPos = m_frame->view()->windowToContents(mouseDragEvent.positi
on()); |
2330 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); | 2329 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); |
2331 if (handleDrag(mev, DragInitiator::Touch)) { | 2330 if (handleDrag(mev, DragInitiator::Touch)) { |
2332 m_longTapShouldInvokeContextMenu = true; | 2331 m_longTapShouldInvokeContextMenu = true; |
2333 return true; | 2332 return true; |
2334 } | 2333 } |
(...skipping 485 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2820 #endif | 2819 #endif |
2821 | 2820 |
2822 PlatformMouseEvent mouseEvent(position, globalPosition, RightButton, eventTy
pe, 1, false, false, false, false, PlatformMouseEvent::RealOrIndistinguishable,
WTF::currentTime()); | 2821 PlatformMouseEvent mouseEvent(position, globalPosition, RightButton, eventTy
pe, 1, false, false, false, false, PlatformMouseEvent::RealOrIndistinguishable,
WTF::currentTime()); |
2823 | 2822 |
2824 handleMousePressEvent(mouseEvent); | 2823 handleMousePressEvent(mouseEvent); |
2825 return sendContextMenuEvent(mouseEvent); | 2824 return sendContextMenuEvent(mouseEvent); |
2826 } | 2825 } |
2827 | 2826 |
2828 bool EventHandler::sendContextMenuEventForGesture(const GestureEventWithHitTestR
esults& targetedEvent) | 2827 bool EventHandler::sendContextMenuEventForGesture(const GestureEventWithHitTestR
esults& targetedEvent) |
2829 { | 2828 { |
| 2829 unsigned modifiers = targetedEvent.event().modifiers(); |
2830 PlatformEvent::Type eventType = PlatformEvent::MousePressed; | 2830 PlatformEvent::Type eventType = PlatformEvent::MousePressed; |
2831 | 2831 |
2832 if (m_frame->settings()->showContextMenuOnMouseUp()) | 2832 if (m_frame->settings()->showContextMenuOnMouseUp()) |
2833 eventType = PlatformEvent::MouseReleased; | 2833 eventType = PlatformEvent::MouseReleased; |
| 2834 else |
| 2835 modifiers |= PlatformEvent::RightButtonDown; |
2834 | 2836 |
2835 PlatformMouseEvent mouseEvent(targetedEvent.event().position(), targetedEven
t.event().globalPosition(), RightButton, eventType, 1, false, false, false, fals
e, PlatformMouseEvent::FromTouch, WTF::currentTime()); | 2837 PlatformMouseEvent mouseEvent(targetedEvent.event().position(), targetedEven
t.event().globalPosition(), RightButton, eventType, 1, |
| 2838 static_cast<PlatformEvent::Modifiers>(modifiers), |
| 2839 PlatformMouseEvent::FromTouch, WTF::currentTime()); |
2836 // To simulate right-click behavior, we send a right mouse down and then | 2840 // To simulate right-click behavior, we send a right mouse down and then |
2837 // context menu event. | 2841 // context menu event. |
2838 // FIXME: Send HitTestResults to avoid redundant hit tests. | 2842 // FIXME: Send HitTestResults to avoid redundant hit tests. |
2839 handleMousePressEvent(mouseEvent); | 2843 handleMousePressEvent(mouseEvent); |
2840 return sendContextMenuEvent(mouseEvent); | 2844 return sendContextMenuEvent(mouseEvent); |
2841 // We do not need to send a corresponding mouse release because in case of | 2845 // We do not need to send a corresponding mouse release because in case of |
2842 // right-click, the context menu takes capture and consumes all events. | 2846 // right-click, the context menu takes capture and consumes all events. |
2843 } | 2847 } |
2844 | 2848 |
2845 void EventHandler::scheduleHoverStateUpdate() | 2849 void EventHandler::scheduleHoverStateUpdate() |
(...skipping 1015 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3861 unsigned EventHandler::accessKeyModifiers() | 3865 unsigned EventHandler::accessKeyModifiers() |
3862 { | 3866 { |
3863 #if OS(MACOSX) | 3867 #if OS(MACOSX) |
3864 return PlatformEvent::CtrlKey | PlatformEvent::AltKey; | 3868 return PlatformEvent::CtrlKey | PlatformEvent::AltKey; |
3865 #else | 3869 #else |
3866 return PlatformEvent::AltKey; | 3870 return PlatformEvent::AltKey; |
3867 #endif | 3871 #endif |
3868 } | 3872 } |
3869 | 3873 |
3870 } // namespace blink | 3874 } // namespace blink |
OLD | NEW |