| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "core/events/PointerEventFactory.h" | 5 #include "core/events/PointerEventFactory.h" |
| 6 | 6 |
| 7 #include "core/frame/FrameView.h" | 7 #include "core/frame/FrameView.h" |
| 8 #include "platform/geometry/FloatSize.h" | 8 #include "platform/geometry/FloatSize.h" |
| 9 | 9 |
| 10 namespace blink { | 10 namespace blink { |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 buttons &= ~static_cast<unsigned>(WebPointerProperties::Buttons::Left); | 106 buttons &= ~static_cast<unsigned>(WebPointerProperties::Buttons::Left); |
| 107 } | 107 } |
| 108 pointerEventInit.setButtons(buttons); | 108 pointerEventInit.setButtons(buttons); |
| 109 | 109 |
| 110 pointerEventInit.setPointerId(pointerId); | 110 pointerEventInit.setPointerId(pointerId); |
| 111 pointerEventInit.setPointerType( | 111 pointerEventInit.setPointerType( |
| 112 pointerTypeNameForWebPointPointerType(pointerType)); | 112 pointerTypeNameForWebPointPointerType(pointerType)); |
| 113 pointerEventInit.setIsPrimary(isPrimary(pointerId)); | 113 pointerEventInit.setIsPrimary(isPrimary(pointerId)); |
| 114 } | 114 } |
| 115 | 115 |
| 116 void PointerEventFactory::setBubblesAndCancelable( | 116 void PointerEventFactory::setEventSpecificFields( |
| 117 PointerEventInit& pointerEventInit, | 117 PointerEventInit& pointerEventInit, |
| 118 const AtomicString& type) { | 118 const AtomicString& type) { |
| 119 pointerEventInit.setBubbles(type != EventTypeNames::pointerenter && | 119 pointerEventInit.setBubbles(type != EventTypeNames::pointerenter && |
| 120 type != EventTypeNames::pointerleave); | 120 type != EventTypeNames::pointerleave); |
| 121 pointerEventInit.setCancelable(type != EventTypeNames::pointerenter && | 121 pointerEventInit.setCancelable(type != EventTypeNames::pointerenter && |
| 122 type != EventTypeNames::pointerleave && | 122 type != EventTypeNames::pointerleave && |
| 123 type != EventTypeNames::pointercancel && | 123 type != EventTypeNames::pointercancel && |
| 124 type != EventTypeNames::gotpointercapture && | 124 type != EventTypeNames::gotpointercapture && |
| 125 type != EventTypeNames::lostpointercapture); | 125 type != EventTypeNames::lostpointercapture); |
| 126 |
| 127 pointerEventInit.setComposed(true); |
| 128 pointerEventInit.setDetail(0); |
| 126 } | 129 } |
| 127 | 130 |
| 128 PointerEvent* PointerEventFactory::create(const AtomicString& mouseEventName, | 131 PointerEvent* PointerEventFactory::create(const AtomicString& mouseEventName, |
| 129 const PlatformMouseEvent& mouseEvent, | 132 const PlatformMouseEvent& mouseEvent, |
| 130 LocalDOMWindow* view) { | 133 LocalDOMWindow* view) { |
| 131 DCHECK(mouseEventName == EventTypeNames::mousemove || | 134 DCHECK(mouseEventName == EventTypeNames::mousemove || |
| 132 mouseEventName == EventTypeNames::mousedown || | 135 mouseEventName == EventTypeNames::mousedown || |
| 133 mouseEventName == EventTypeNames::mouseup); | 136 mouseEventName == EventTypeNames::mouseup); |
| 134 | 137 |
| 135 AtomicString pointerEventName = | 138 AtomicString pointerEventName = |
| 136 pointerEventNameForMouseEventName(mouseEventName); | 139 pointerEventNameForMouseEventName(mouseEventName); |
| 137 unsigned buttons = | 140 unsigned buttons = |
| 138 MouseEvent::platformModifiersToButtons(mouseEvent.getModifiers()); | 141 MouseEvent::platformModifiersToButtons(mouseEvent.getModifiers()); |
| 139 PointerEventInit pointerEventInit; | 142 PointerEventInit pointerEventInit; |
| 140 | 143 |
| 141 setIdTypeButtons(pointerEventInit, mouseEvent.pointerProperties(), buttons); | 144 setIdTypeButtons(pointerEventInit, mouseEvent.pointerProperties(), buttons); |
| 142 setBubblesAndCancelable(pointerEventInit, pointerEventName); | 145 setEventSpecificFields(pointerEventInit, pointerEventName); |
| 143 | 146 |
| 144 pointerEventInit.setScreenX(mouseEvent.globalPosition().x()); | 147 pointerEventInit.setScreenX(mouseEvent.globalPosition().x()); |
| 145 pointerEventInit.setScreenY(mouseEvent.globalPosition().y()); | 148 pointerEventInit.setScreenY(mouseEvent.globalPosition().y()); |
| 146 | 149 |
| 147 IntPoint locationInFrameZoomed; | 150 IntPoint locationInFrameZoomed; |
| 148 if (view && view->frame() && view->frame()->view()) { | 151 if (view && view->frame() && view->frame()->view()) { |
| 149 LocalFrame* frame = view->frame(); | 152 LocalFrame* frame = view->frame(); |
| 150 FrameView* frameView = frame->view(); | 153 FrameView* frameView = frame->view(); |
| 151 IntPoint locationInContents = | 154 IntPoint locationInContents = |
| 152 frameView->rootFrameToContents(mouseEvent.position()); | 155 frameView->rootFrameToContents(mouseEvent.position()); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 202 DOMWindow* view) { | 205 DOMWindow* view) { |
| 203 const PlatformTouchPoint::TouchState pointState = touchPoint.state(); | 206 const PlatformTouchPoint::TouchState pointState = touchPoint.state(); |
| 204 | 207 |
| 205 bool pointerReleasedOrCancelled = | 208 bool pointerReleasedOrCancelled = |
| 206 pointState == PlatformTouchPoint::TouchReleased || | 209 pointState == PlatformTouchPoint::TouchReleased || |
| 207 pointState == PlatformTouchPoint::TouchCancelled; | 210 pointState == PlatformTouchPoint::TouchCancelled; |
| 208 bool pointerPressedOrReleased = | 211 bool pointerPressedOrReleased = |
| 209 pointState == PlatformTouchPoint::TouchPressed || | 212 pointState == PlatformTouchPoint::TouchPressed || |
| 210 pointState == PlatformTouchPoint::TouchReleased; | 213 pointState == PlatformTouchPoint::TouchReleased; |
| 211 | 214 |
| 212 bool isEnterOrLeave = false; | |
| 213 | |
| 214 PointerEventInit pointerEventInit; | 215 PointerEventInit pointerEventInit; |
| 215 | 216 |
| 216 setIdTypeButtons(pointerEventInit, touchPoint.pointerProperties(), | 217 setIdTypeButtons(pointerEventInit, touchPoint.pointerProperties(), |
| 217 pointerReleasedOrCancelled ? 0 : 1); | 218 pointerReleasedOrCancelled ? 0 : 1); |
| 218 | 219 |
| 219 pointerEventInit.setWidth(pointRadius.width()); | 220 pointerEventInit.setWidth(pointRadius.width()); |
| 220 pointerEventInit.setHeight(pointRadius.height()); | 221 pointerEventInit.setHeight(pointRadius.height()); |
| 221 pointerEventInit.setScreenX(touchPoint.screenPos().x()); | 222 pointerEventInit.setScreenX(touchPoint.screenPos().x()); |
| 222 pointerEventInit.setScreenY(touchPoint.screenPos().y()); | 223 pointerEventInit.setScreenY(touchPoint.screenPos().y()); |
| 223 pointerEventInit.setClientX(clientPoint.x()); | 224 pointerEventInit.setClientX(clientPoint.x()); |
| 224 pointerEventInit.setClientY(clientPoint.y()); | 225 pointerEventInit.setClientY(clientPoint.y()); |
| 225 pointerEventInit.setButton(static_cast<int>( | 226 pointerEventInit.setButton(static_cast<int>( |
| 226 pointerPressedOrReleased ? WebPointerProperties::Button::Left | 227 pointerPressedOrReleased ? WebPointerProperties::Button::Left |
| 227 : WebPointerProperties::Button::NoButton)); | 228 : WebPointerProperties::Button::NoButton)); |
| 228 pointerEventInit.setPressure( | 229 pointerEventInit.setPressure( |
| 229 getPointerEventPressure(touchPoint.force(), pointerEventInit.buttons())); | 230 getPointerEventPressure(touchPoint.force(), pointerEventInit.buttons())); |
| 230 pointerEventInit.setTiltX(touchPoint.pointerProperties().tiltX); | 231 pointerEventInit.setTiltX(touchPoint.pointerProperties().tiltX); |
| 231 pointerEventInit.setTiltY(touchPoint.pointerProperties().tiltY); | 232 pointerEventInit.setTiltY(touchPoint.pointerProperties().tiltY); |
| 232 pointerEventInit.setView(view); | 233 pointerEventInit.setView(view); |
| 233 | 234 |
| 234 UIEventWithKeyState::setFromPlatformModifiers(pointerEventInit, modifiers); | 235 UIEventWithKeyState::setFromPlatformModifiers(pointerEventInit, modifiers); |
| 235 | 236 |
| 236 pointerEventInit.setBubbles(!isEnterOrLeave); | 237 setEventSpecificFields(pointerEventInit, type); |
| 237 pointerEventInit.setCancelable( | |
| 238 !isEnterOrLeave && pointState != PlatformTouchPoint::TouchCancelled); | |
| 239 | 238 |
| 240 return PointerEvent::create(type, pointerEventInit); | 239 return PointerEvent::create(type, pointerEventInit); |
| 241 } | 240 } |
| 242 | 241 |
| 243 PointerEvent* PointerEventFactory::createPointerCancelEvent( | 242 PointerEvent* PointerEventFactory::createPointerCancelEvent( |
| 244 const int pointerId, | 243 const int pointerId, |
| 245 const WebPointerProperties::PointerType pointerType) { | 244 const WebPointerProperties::PointerType pointerType) { |
| 246 DCHECK(m_pointerIdMapping.contains(pointerId)); | 245 DCHECK(m_pointerIdMapping.contains(pointerId)); |
| 247 m_pointerIdMapping.set( | 246 m_pointerIdMapping.set( |
| 248 pointerId, | 247 pointerId, |
| 249 PointerAttributes(m_pointerIdMapping.get(pointerId).incomingId, false)); | 248 PointerAttributes(m_pointerIdMapping.get(pointerId).incomingId, false)); |
| 250 | 249 |
| 251 PointerEventInit pointerEventInit; | 250 PointerEventInit pointerEventInit; |
| 252 | 251 |
| 253 pointerEventInit.setPointerId(pointerId); | 252 pointerEventInit.setPointerId(pointerId); |
| 254 pointerEventInit.setPointerType( | 253 pointerEventInit.setPointerType( |
| 255 pointerTypeNameForWebPointPointerType(pointerType)); | 254 pointerTypeNameForWebPointPointerType(pointerType)); |
| 256 pointerEventInit.setIsPrimary(isPrimary(pointerId)); | 255 pointerEventInit.setIsPrimary(isPrimary(pointerId)); |
| 257 pointerEventInit.setBubbles(true); | 256 |
| 258 pointerEventInit.setCancelable(false); | 257 setEventSpecificFields(pointerEventInit, EventTypeNames::pointercancel); |
| 259 | 258 |
| 260 return PointerEvent::create(EventTypeNames::pointercancel, pointerEventInit); | 259 return PointerEvent::create(EventTypeNames::pointercancel, pointerEventInit); |
| 261 } | 260 } |
| 262 | 261 |
| 263 PointerEvent* PointerEventFactory::createPointerEventFrom( | 262 PointerEvent* PointerEventFactory::createPointerEventFrom( |
| 264 PointerEvent* pointerEvent, | 263 PointerEvent* pointerEvent, |
| 265 const AtomicString& type, | 264 const AtomicString& type, |
| 266 EventTarget* relatedTarget) { | 265 EventTarget* relatedTarget) { |
| 267 PointerEventInit pointerEventInit; | 266 PointerEventInit pointerEventInit; |
| 268 | 267 |
| 269 pointerEventInit.setPointerId(pointerEvent->pointerId()); | 268 pointerEventInit.setPointerId(pointerEvent->pointerId()); |
| 270 pointerEventInit.setPointerType(pointerEvent->pointerType()); | 269 pointerEventInit.setPointerType(pointerEvent->pointerType()); |
| 271 pointerEventInit.setIsPrimary(pointerEvent->isPrimary()); | 270 pointerEventInit.setIsPrimary(pointerEvent->isPrimary()); |
| 272 pointerEventInit.setWidth(pointerEvent->width()); | 271 pointerEventInit.setWidth(pointerEvent->width()); |
| 273 pointerEventInit.setHeight(pointerEvent->height()); | 272 pointerEventInit.setHeight(pointerEvent->height()); |
| 274 pointerEventInit.setScreenX(pointerEvent->screenX()); | 273 pointerEventInit.setScreenX(pointerEvent->screenX()); |
| 275 pointerEventInit.setScreenY(pointerEvent->screenY()); | 274 pointerEventInit.setScreenY(pointerEvent->screenY()); |
| 276 pointerEventInit.setClientX(pointerEvent->clientX()); | 275 pointerEventInit.setClientX(pointerEvent->clientX()); |
| 277 pointerEventInit.setClientY(pointerEvent->clientY()); | 276 pointerEventInit.setClientY(pointerEvent->clientY()); |
| 278 pointerEventInit.setButton(pointerEvent->button()); | 277 pointerEventInit.setButton(pointerEvent->button()); |
| 279 pointerEventInit.setButtons(pointerEvent->buttons()); | 278 pointerEventInit.setButtons(pointerEvent->buttons()); |
| 280 pointerEventInit.setPressure(pointerEvent->pressure()); | 279 pointerEventInit.setPressure(pointerEvent->pressure()); |
| 281 pointerEventInit.setTiltX(pointerEvent->tiltX()); | 280 pointerEventInit.setTiltX(pointerEvent->tiltX()); |
| 282 pointerEventInit.setTiltY(pointerEvent->tiltY()); | 281 pointerEventInit.setTiltY(pointerEvent->tiltY()); |
| 283 pointerEventInit.setView(pointerEvent->view()); | 282 pointerEventInit.setView(pointerEvent->view()); |
| 284 | 283 |
| 285 setBubblesAndCancelable(pointerEventInit, type); | 284 setEventSpecificFields(pointerEventInit, type); |
| 286 | 285 |
| 287 if (relatedTarget) | 286 if (relatedTarget) |
| 288 pointerEventInit.setRelatedTarget(relatedTarget); | 287 pointerEventInit.setRelatedTarget(relatedTarget); |
| 289 | 288 |
| 290 return PointerEvent::create(type, pointerEventInit); | 289 return PointerEvent::create(type, pointerEventInit); |
| 291 } | 290 } |
| 292 | 291 |
| 293 PointerEvent* PointerEventFactory::createPointerCaptureEvent( | 292 PointerEvent* PointerEventFactory::createPointerCaptureEvent( |
| 294 PointerEvent* pointerEvent, | 293 PointerEvent* pointerEvent, |
| 295 const AtomicString& type) { | 294 const AtomicString& type) { |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 424 const WebPointerProperties& properties) const { | 423 const WebPointerProperties& properties) const { |
| 425 if (properties.pointerType == WebPointerProperties::PointerType::Mouse) | 424 if (properties.pointerType == WebPointerProperties::PointerType::Mouse) |
| 426 return PointerEventFactory::s_mouseId; | 425 return PointerEventFactory::s_mouseId; |
| 427 IncomingId id(properties.pointerType, properties.id); | 426 IncomingId id(properties.pointerType, properties.id); |
| 428 if (m_pointerIncomingIdMapping.contains(id)) | 427 if (m_pointerIncomingIdMapping.contains(id)) |
| 429 return m_pointerIncomingIdMapping.get(id); | 428 return m_pointerIncomingIdMapping.get(id); |
| 430 return PointerEventFactory::s_invalidId; | 429 return PointerEventFactory::s_invalidId; |
| 431 } | 430 } |
| 432 | 431 |
| 433 } // namespace blink | 432 } // namespace blink |
| OLD | NEW |