Commit 3bd09006 authored by nzolghadr's avatar nzolghadr Committed by Commit bot

Fix properties of got/lostpointercapture

Make the attributes of got/lostpointercapture the same
as the event that caused them to be fired. In the case
of the delayed processing that will be the very next
pointerevent. In the case of implicit release that
will be pointerup/cancel right before got/lostpointercapture
event.

BUG=632766

Review-Url: https://codereview.chromium.org/2199263005
Cr-Commit-Position: refs/heads/master@{#410409}
parent 06c60d09
......@@ -18,6 +18,7 @@ green received pointerdown
green received mousedown
green received gotpointercapture
green received pointermove
Capture pointer event attributes are correct!
green received mousemove
**** Move to grey box & jiggle *****
green received pointermove
......@@ -39,6 +40,7 @@ green received mousemove
green received pointerup
green received mouseup
green received lostpointercapture
Capture pointer event attributes are correct!
**** Jiggle in blue box *****
green received pointerout
green received pointerleave
......@@ -73,6 +75,7 @@ green received pointerdown
green received mousedown
green received gotpointercapture
green received pointermove
Capture pointer event attributes are correct!
green received mousemove
**** Move to grey box & jiggle *****
green received pointermove
......@@ -83,9 +86,10 @@ green received mousemove
green received pointermove
green received mousemove
**** Release the mouse outside of the page & move back to blue box ****
green received lostpointercapture
green received pointermove
Capture pointer event attributes are correct!
green received mousemove
green received lostpointercapture
green received pointerout
green received pointerleave
grey received pointerleave
......@@ -119,6 +123,7 @@ green received pointerdown
green received mousedown
green received gotpointercapture
green received pointermove
Capture pointer event attributes are correct!
green received mousemove
**** Move to grey box & jiggle *****
green received pointermove
......@@ -131,6 +136,7 @@ green received pointermove
green received mousemove
green received lostpointercapture
green received pointermove
Capture pointer event attributes are correct!
green received mousemove
green received pointerout
green received pointerleave
......@@ -195,6 +201,7 @@ green received pointerdown
green received mousedown
green received gotpointercapture
green received pointermove
Capture pointer event attributes are correct!
green received mousemove
**** Move to grey box & jiggle *****
green received pointermove
......@@ -207,6 +214,7 @@ green received pointermove
grey received mousemove
document received lostpointercapture
green received pointermove
Capture pointer event attributes are correct!
green received mousemove
blue received pointerover
blue received pointerenter
......
......@@ -41,6 +41,54 @@ var rect = document.getElementById("blue").getBoundingClientRect();
var x3 = rect.left + 5;
var y3 = rect.top + 5;
var lastPointerEvent = null;
var pointereventProperties = [
"clientX",
"clientY",
"layerX",
"layerY",
"movementX",
"movementY",
"offsetX",
"offsetY",
"pageX",
"pageY",
"screenX",
"screenY",
"x",
"y",
"button",
"buttons",
"pressure",
"tiltX",
"tiltY",
"width",
"height"
];
function checkPointerCaptureProperties(lastPointerEvent, currentPointerEvent) {
if (lastPointerEvent == null)
return false;
var isImmediateRelease = (lastPointerEvent.type == 'pointerup') &&
(currentPointerEvent.type == 'lostpointercapture');
var isDelayedCapture = lastPointerEvent.type.includes('pointercapture');
if (!isImmediateRelease && !isDelayedCapture)
return false;
for (var i = 0; i< pointereventProperties. length; i++) {
var property = pointereventProperties[i];
if (lastPointerEvent[property] !== currentPointerEvent[property]) {
debug("Capture pointer event attributes are incorrect!");
return true;
}
}
debug("Capture pointer event attributes are correct!");
return true
}
function init() {
var eventList = ["mouseenter", "mouseleave", "mouseover", "mouseout", "mousemove", "mousedown", "mouseup",
"pointerenter", "pointerleave", "pointerover", "pointerout", "pointermove", "pointerdown", "pointerup",
......@@ -49,6 +97,7 @@ function init() {
document.addEventListener("lostpointercapture", function(event) {
if (event.eventPhase == Event.AT_TARGET) {
debug("document received " + event.type);
lastPointerEvent = event;
}
});
["grey", "green", "blue"].forEach(function(id) {
......@@ -73,6 +122,12 @@ function init() {
removeElement = false;
}
}
if (checkPointerCaptureProperties(lastPointerEvent, event)) {
lastPointerEvent = null;
} else {
if (event.type.includes('pointer'))
lastPointerEvent = event;
}
}
});
});
......
......@@ -25,7 +25,7 @@ const char* pointerTypeNameForWebPointPointerType(WebPointerProperties::PointerT
case WebPointerProperties::PointerType::Mouse:
return "mouse";
}
ASSERT_NOT_REACHED();
NOTREACHED();
return "";
}
......@@ -47,7 +47,7 @@ const AtomicString& pointerEventNameForMouseEventName(
#undef RETURN_CORRESPONDING_PE_NAME
ASSERT_NOT_REACHED();
NOTREACHED();
return emptyAtom;
}
......@@ -78,13 +78,16 @@ void PointerEventFactory::setIdTypeButtons(PointerEventInit& pointerEventInit,
pointerEventInit.setIsPrimary(isPrimary(pointerId));
}
void PointerEventFactory::setBubblesAndCancelable(PointerEventInit& pointerEventInit,
const AtomicString& type)
void PointerEventFactory::setBubblesAndCancelable(
PointerEventInit& pointerEventInit, const AtomicString& type)
{
pointerEventInit.setBubbles(type != EventTypeNames::pointerenter
&& type != EventTypeNames::pointerleave);
pointerEventInit.setCancelable(type != EventTypeNames::pointerenter
&& type != EventTypeNames::pointerleave && type != EventTypeNames::pointercancel);
&& type != EventTypeNames::pointerleave
&& type != EventTypeNames::pointercancel
&& type != EventTypeNames::gotpointercapture
&& type != EventTypeNames::lostpointercapture);
}
PointerEvent* PointerEventFactory::create(
......@@ -193,7 +196,7 @@ PointerEvent* PointerEventFactory::create(const AtomicString& type,
PointerEvent* PointerEventFactory::createPointerCancelEvent(
const int pointerId, const WebPointerProperties::PointerType pointerType)
{
ASSERT(m_pointerIdMapping.contains(pointerId));
DCHECK(m_pointerIdMapping.contains(pointerId));
m_pointerIdMapping.set(pointerId, PointerAttributes(m_pointerIdMapping.get(pointerId).incomingId, false));
PointerEventInit pointerEventInit;
......@@ -207,33 +210,11 @@ PointerEvent* PointerEventFactory::createPointerCancelEvent(
return PointerEvent::create(EventTypeNames::pointercancel, pointerEventInit);
}
PointerEvent* PointerEventFactory::createPointerCaptureEvent(
PointerEvent* pointerEvent,
const AtomicString& type)
{
ASSERT(type == EventTypeNames::gotpointercapture
|| type == EventTypeNames::lostpointercapture);
PointerEventInit pointerEventInit;
pointerEventInit.setPointerId(pointerEvent->pointerId());
pointerEventInit.setPointerType(pointerEvent->pointerType());
pointerEventInit.setIsPrimary(pointerEvent->isPrimary());
pointerEventInit.setBubbles(true);
pointerEventInit.setCancelable(false);
return PointerEvent::create(type, pointerEventInit);
}
PointerEvent* PointerEventFactory::createPointerBoundaryEvent(
PointerEvent* PointerEventFactory::createPointerEventFrom(
PointerEvent* pointerEvent,
const AtomicString& type,
EventTarget* relatedTarget)
{
ASSERT(type == EventTypeNames::pointerout
|| type == EventTypeNames::pointerleave
|| type == EventTypeNames::pointerover
|| type == EventTypeNames::pointerenter);
PointerEventInit pointerEventInit;
pointerEventInit.setPointerId(pointerEvent->pointerId());
......@@ -260,6 +241,30 @@ PointerEvent* PointerEventFactory::createPointerBoundaryEvent(
return PointerEvent::create(type, pointerEventInit);
}
PointerEvent* PointerEventFactory::createPointerCaptureEvent(
PointerEvent* pointerEvent,
const AtomicString& type)
{
DCHECK(type == EventTypeNames::gotpointercapture
|| type == EventTypeNames::lostpointercapture);
return createPointerEventFrom(
pointerEvent, type, pointerEvent->relatedTarget());
}
PointerEvent* PointerEventFactory::createPointerBoundaryEvent(
PointerEvent* pointerEvent,
const AtomicString& type,
EventTarget* relatedTarget)
{
DCHECK(type == EventTypeNames::pointerout
|| type == EventTypeNames::pointerleave
|| type == EventTypeNames::pointerover
|| type == EventTypeNames::pointerenter);
return createPointerEventFrom(pointerEvent, type, relatedTarget);
}
PointerEventFactory::PointerEventFactory()
{
clear();
......
......@@ -102,6 +102,11 @@ private:
unsigned buttons);
void setBubblesAndCancelable(PointerEventInit&, const AtomicString& type);
// Creates pointerevents like boundary and capture events from another
// pointerevent (i.e. up/down/move events).
PointerEvent* createPointerEventFrom(
PointerEvent*, const AtomicString&, EventTarget*);
static const int s_invalidId;
int m_currentId;
......
......@@ -528,10 +528,16 @@ WebInputEventResult PointerEventManager::sendMousePointerEvent(
// This is for when the mouse is released outside of the page.
if (pointerEvent->type() == EventTypeNames::pointermove
&& !pointerEvent->buttons()
&& pointerEvent->isPrimary()) {
m_preventMouseEventForPointerType[toPointerTypeIndex(
mouseEvent.pointerProperties().pointerType)] = false;
&& !pointerEvent->buttons()) {
releasePointerCapture(pointerEvent->pointerId());
// Send got/lostpointercapture rightaway if necessary.
processPendingPointerCapture(pointerEvent);
if (pointerEvent->isPrimary()) {
m_preventMouseEventForPointerType[toPointerTypeIndex(
mouseEvent.pointerProperties().pointerType)] = false;
}
}
EventTarget* pointerEventTarget = processCaptureAndPositionOfPointerEvent(pointerEvent, target,
......@@ -575,9 +581,10 @@ WebInputEventResult PointerEventManager::sendMousePointerEvent(
nullptr, clickCount));
}
if (pointerEvent->buttons() == 0) {
releasePointerCapture(pointerEvent->pointerId());
if (pointerEvent->type() == EventTypeNames::pointerup
|| pointerEvent->type() == EventTypeNames::pointercancel) {
releasePointerCapture(pointerEvent->pointerId());
// Send got/lostpointercapture rightaway if necessary.
processPendingPointerCapture(pointerEvent);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment