Diff
Modified: trunk/LayoutTests/ChangeLog (238273 => 238274)
--- trunk/LayoutTests/ChangeLog 2018-11-16 05:46:48 UTC (rev 238273)
+++ trunk/LayoutTests/ChangeLog 2018-11-16 09:09:34 UTC (rev 238274)
@@ -1,3 +1,23 @@
+2018-11-16 Antoine Quint <[email protected]>
+
+ PointerEvents should not require touch event listeners to be registered
+ https://bugs.webkit.org/show_bug.cgi?id=191333
+ <rdar://problem/45857523>
+
+ Reviewed by Dean Jackson.
+
+ Add two iOS tests that check that we dispatch pointer events when only those events are registered
+ and that we correctly account for calls to preventDefault(). To support pointer events test, we add
+ a new utility where we will be adding user interaction functions that should allow these tests to be
+ submitted to the WPT repository provided browsers implement their own versions of the UIController.
+
+ * TestExpectations:
+ * pointerevents/ios/pointer-events-dispatch-on-touch-expected.txt: Added.
+ * pointerevents/ios/pointer-events-dispatch-on-touch.html: Added.
+ * pointerevents/ios/pointer-events-prevent-default-expected.txt: Added.
+ * pointerevents/ios/pointer-events-prevent-default.html: Added.
+ * pointerevents/utils.js: Added.
+
2018-11-15 Zalan Bujtas <[email protected]>
[iOS] Do not get stuck in indeterminate content observation state.
Modified: trunk/LayoutTests/TestExpectations (238273 => 238274)
--- trunk/LayoutTests/TestExpectations 2018-11-16 05:46:48 UTC (rev 238273)
+++ trunk/LayoutTests/TestExpectations 2018-11-16 09:09:34 UTC (rev 238274)
@@ -49,6 +49,7 @@
http/tests/cookies/same-site [ Skip ]
system-preview [ Skip ]
editing/images [ Skip ]
+pointerevents/ios [ Skip ]
# window.showModalDialog is only tested in DumpRenderTree on Mac.
editing/execCommand/show-modal-dialog-during-execCommand.html [ Skip ]
Added: trunk/LayoutTests/pointerevents/ios/pointer-events-dispatch-on-touch-expected.txt (0 => 238274)
--- trunk/LayoutTests/pointerevents/ios/pointer-events-dispatch-on-touch-expected.txt (rev 0)
+++ trunk/LayoutTests/pointerevents/ios/pointer-events-dispatch-on-touch-expected.txt 2018-11-16 09:09:34 UTC (rev 238274)
@@ -0,0 +1,3 @@
+
+PASS Pointer events get dispatched in response to a touch.
+
Added: trunk/LayoutTests/pointerevents/ios/pointer-events-dispatch-on-touch.html (0 => 238274)
--- trunk/LayoutTests/pointerevents/ios/pointer-events-dispatch-on-touch.html (rev 0)
+++ trunk/LayoutTests/pointerevents/ios/pointer-events-dispatch-on-touch.html 2018-11-16 09:09:34 UTC (rev 238274)
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset=utf-8>
+<meta name="viewport" content="width=device-width, initial-scale=1">
+</head>
+<body>
+<script src=""
+<script src=""
+<script src=""
+<script>
+
+'use strict';
+
+target_test((target, test) => {
+ target.addEventListener("pointerdown", event => {
+ assert_true(event instanceof PointerEvent);
+ assert_equals(event.type, "pointerdown");
+ assert_equals(event.clientX, 50);
+ assert_equals(event.clientY, 50);
+ test.done();
+ });
+ ui.beginTouches({ x: 50, y: 50 });
+}, "Pointer events get dispatched in response to a touch.");
+
+</script>
+</body>
+</html>
\ No newline at end of file
Added: trunk/LayoutTests/pointerevents/ios/pointer-events-prevent-default-expected.txt (0 => 238274)
--- trunk/LayoutTests/pointerevents/ios/pointer-events-prevent-default-expected.txt (rev 0)
+++ trunk/LayoutTests/pointerevents/ios/pointer-events-prevent-default-expected.txt 2018-11-16 09:09:34 UTC (rev 238274)
@@ -0,0 +1,3 @@
+
+PASS Scrolling of content can be disabled by calling preventDefault() on a pointer event.
+
Added: trunk/LayoutTests/pointerevents/ios/pointer-events-prevent-default.html (0 => 238274)
--- trunk/LayoutTests/pointerevents/ios/pointer-events-prevent-default.html (rev 0)
+++ trunk/LayoutTests/pointerevents/ios/pointer-events-prevent-default.html 2018-11-16 09:09:34 UTC (rev 238274)
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset=utf-8>
+<meta name="viewport" content="width=device-width, initial-scale=1">
+</head>
+<body>
+<script src=""
+<script src=""
+<script src=""
+<script>
+
+'use strict';
+
+target_test((target, test) => {
+ target.style.overflowY = "scroll";
+ target.style.webkitOverflowScrolling = "touch";
+ target.appendChild(document.createElement("div")).setAttribute("style", "width: 100%; height: 200%");
+
+ const initialScrollTop = target.scrollTop;
+ target.addEventListener("pointerdown", event => event.preventDefault());
+ ui.swipe({ x: 100, y: 100 }, { x: 100, y: 50 }).then(() => {
+ assert_equals(target.scrollTop, initialScrollTop);
+ test.done();
+ });
+}, "Scrolling of content can be disabled by calling preventDefault() on a pointer event.");
+
+</script>
+</body>
+</html>
\ No newline at end of file
Added: trunk/LayoutTests/pointerevents/utils.js (0 => 238274)
--- trunk/LayoutTests/pointerevents/utils.js (rev 0)
+++ trunk/LayoutTests/pointerevents/utils.js 2018-11-16 09:09:34 UTC (rev 238274)
@@ -0,0 +1,117 @@
+
+function target_test(...args)
+{
+ if (args.length !== 2 && args.length !== 3) {
+ console.error(`target_test expected 2 or 3 arguments but got ${args.length}.`);
+ return;
+ }
+
+ const impliedOptions = args.length == 2;
+
+ let options = impliedOptions ? { } : args[0];
+ let continutation = args[impliedOptions ? 0 : 1];
+ let description = args[impliedOptions ? 1 : 2];
+
+ options.x = options.x || 0;
+ options.y = options.y || 0;
+ options.width = options.width || "100%";
+ options.height = options.height || "100%";
+
+ async_test(test => {
+ const target = document.body.appendChild(document.createElement("div"));
+ target.setAttribute("style", `
+ position: absolute;
+ left: ${options.x};
+ top: ${options.y};
+ width: ${options.width};
+ height: ${options.height};
+ `);
+ test.add_cleanup(() => target.remove());
+
+ continutation(target, test);
+ }, description);
+}
+
+const ui = new (class UIController {
+
+ beginTouches(options)
+ {
+ return this._run(`uiController.touchDownAtPoint(${options.x}, ${options.y}, ${options.numberOfTouches || 1})`);
+ }
+
+ swipe(from, to)
+ {
+ const durationInSeconds = 0.5;
+ return this._run(`uiController.dragFromPointToPoint(${from.x}, ${from.y}, ${to.x}, ${to.y}, ${durationInSeconds})`);
+ }
+
+ pinchOut(options)
+ {
+ options.x = options.x || 0;
+ options.y = options.y || 0;
+
+ const startEvent = {
+ inputType : "hand",
+ timeOffset : 0,
+ touches : [
+ { inputType : "finger",
+ phase : "moved",
+ id : 1,
+ x : options.x,
+ y : options.y,
+ pressure : 0
+ },
+ { inputType : "finger",
+ phase : "moved",
+ id : 2,
+ x : (options.x + options.width) / options.scale,
+ y : (options.y + options.height) / options.scale,
+ pressure : 0
+ }
+ ]
+ };
+
+ const endEvent = {
+ inputType : "hand",
+ timeOffset : 0.5,
+ touches : [
+ { inputType : "finger",
+ phase : "moved",
+ id : 1,
+ x : options.x,
+ y : options.y,
+ pressure : 0
+ },
+ { inputType : "finger",
+ phase : "moved",
+ id : 2,
+ x : options.x + options.width,
+ y : options.y + options.height,
+ pressure : 0
+ }
+ ]
+ };
+
+ return this._runEvents({
+ interpolate : "linear",
+ timestep: 0.1,
+ coordinateSpace : "content",
+ startEvent: startEvent,
+ endEvent: endEvent
+ });
+ }
+
+ _runEvents(events)
+ {
+ return this._run(`uiController.sendEventStream('${JSON.stringify({ events: [events] })}')`);
+ }
+
+ _run(command)
+ {
+ return new Promise(resolve => testRunner.runUIScript(`(function() {
+ (function() { ${command} })();
+ uiController.uiScriptComplete();
+ })();`, resolve));
+ }
+
+})();
Modified: trunk/Source/WebCore/ChangeLog (238273 => 238274)
--- trunk/Source/WebCore/ChangeLog 2018-11-16 05:46:48 UTC (rev 238273)
+++ trunk/Source/WebCore/ChangeLog 2018-11-16 09:09:34 UTC (rev 238274)
@@ -1,3 +1,21 @@
+2018-11-16 Antoine Quint <[email protected]>
+
+ PointerEvents should not require touch event listeners to be registered
+ https://bugs.webkit.org/show_bug.cgi?id=191333
+ <rdar://problem/45857523>
+
+ Reviewed by Dean Jackson.
+
+ Tests: pointerevents/ios/pointer-events-dispatch-on-touch.html
+ pointerevents/ios/pointer-events-prevent-default.html
+
+ * dom/EventNames.h:
+ (WebCore::EventNames::isTouchEventType const):
+ (WebCore::EventNames::touchAndPointerEventNames const):
+ (WebCore::EventNames::touchEventNames const): Deleted.
+ * dom/Node.cpp:
+ (WebCore::Node::moveNodeToNewDocument):
+
2018-11-15 Zalan Bujtas <[email protected]>
[iOS] Do not get stuck in indeterminate content observation state.
Modified: trunk/Source/WebCore/dom/EventNames.h (238273 => 238274)
--- trunk/Source/WebCore/dom/EventNames.h 2018-11-16 05:46:48 UTC (rev 238273)
+++ trunk/Source/WebCore/dom/EventNames.h 2018-11-16 09:09:34 UTC (rev 238274)
@@ -359,7 +359,7 @@
bool isGamepadEventType(const AtomicString& eventType) const;
#endif
- std::array<std::reference_wrapper<const AtomicString>, 5> touchEventNames() const;
+ std::array<std::reference_wrapper<const AtomicString>, 9> touchAndPointerEventNames() const;
std::array<std::reference_wrapper<const AtomicString>, 3> gestureEventNames() const;
private:
@@ -393,7 +393,11 @@
|| eventType == touchmoveEvent
|| eventType == touchendEvent
|| eventType == touchcancelEvent
- || eventType == touchforcechangeEvent;
+ || eventType == touchforcechangeEvent
+ || eventType == pointerdownEvent
+ || eventType == pointermoveEvent
+ || eventType == pointerupEvent
+ || eventType == pointercancelEvent;
}
inline bool EventNames::isWheelEventType(const AtomicString& eventType) const
@@ -402,9 +406,9 @@
|| eventType == mousewheelEvent;
}
-inline std::array<std::reference_wrapper<const AtomicString>, 5> EventNames::touchEventNames() const
+inline std::array<std::reference_wrapper<const AtomicString>, 9> EventNames::touchAndPointerEventNames() const
{
- return { { touchstartEvent, touchmoveEvent, touchendEvent, touchcancelEvent, touchforcechangeEvent } };
+ return { { touchstartEvent, touchmoveEvent, touchendEvent, touchcancelEvent, touchforcechangeEvent, pointerdownEvent, pointermoveEvent, pointerupEvent, pointercancelEvent } };
}
inline std::array<std::reference_wrapper<const AtomicString>, 3> EventNames::gestureEventNames() const
Modified: trunk/Source/WebCore/dom/Node.cpp (238273 => 238274)
--- trunk/Source/WebCore/dom/Node.cpp 2018-11-16 05:46:48 UTC (rev 238273)
+++ trunk/Source/WebCore/dom/Node.cpp 2018-11-16 09:09:34 UTC (rev 238274)
@@ -2079,7 +2079,7 @@
}
unsigned numTouchEventListeners = 0;
- for (auto& name : eventNames().touchEventNames())
+ for (auto& name : eventNames().touchAndPointerEventNames())
numTouchEventListeners += eventListeners(name).size();
for (unsigned i = 0; i < numTouchEventListeners; ++i) {
Modified: trunk/Source/WebKit/ChangeLog (238273 => 238274)
--- trunk/Source/WebKit/ChangeLog 2018-11-16 05:46:48 UTC (rev 238273)
+++ trunk/Source/WebKit/ChangeLog 2018-11-16 09:09:34 UTC (rev 238274)
@@ -1,3 +1,20 @@
+2018-11-16 Antoine Quint <[email protected]>
+
+ PointerEvents should not require touch event listeners to be registered
+ https://bugs.webkit.org/show_bug.cgi?id=191333
+ <rdar://problem/45857523>
+
+ Reviewed by Dean Jackson.
+
+ * UIProcess/WebPageProxy.cpp:
+ (WebKit::WebPageProxy::updateTouchEventTracking):
+ (WebKit::WebPageProxy::touchEventTrackingType const):
+ (WebKit::WebPageProxy::handleTouchEventSynchronously):
+ (WebKit::WebPageProxy::handleTouchEventAsynchronously):
+ (WebKit::WebPageProxy::handleTouchEvent):
+ (WebKit::WebPageProxy::resetState):
+ * UIProcess/WebPageProxy.h:
+
2018-11-15 Myles C. Maxfield <[email protected]>
WKPreferencesSetFontSmoothingLevel doesn't actually do anything
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (238273 => 238274)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2018-11-16 05:46:48 UTC (rev 238273)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2018-11-16 09:09:34 UTC (rev 238274)
@@ -2380,17 +2380,20 @@
trackingType = mergeTrackingTypes(trackingType, trackingTypeForLocation);
};
- updateTrackingType(m_touchEventTracking.touchForceChangedTracking, names.touchforcechangeEvent);
- updateTrackingType(m_touchEventTracking.touchStartTracking, names.touchstartEvent);
- updateTrackingType(m_touchEventTracking.touchMoveTracking, names.touchmoveEvent);
- updateTrackingType(m_touchEventTracking.touchEndTracking, names.touchendEvent);
+ updateTrackingType(m_touchAndPointerEventTracking.touchForceChangedTracking, names.touchforcechangeEvent);
+ updateTrackingType(m_touchAndPointerEventTracking.touchStartTracking, names.touchstartEvent);
+ updateTrackingType(m_touchAndPointerEventTracking.touchMoveTracking, names.touchmoveEvent);
+ updateTrackingType(m_touchAndPointerEventTracking.touchEndTracking, names.touchendEvent);
+ updateTrackingType(m_touchAndPointerEventTracking.touchStartTracking, names.pointerdownEvent);
+ updateTrackingType(m_touchAndPointerEventTracking.touchMoveTracking, names.pointermoveEvent);
+ updateTrackingType(m_touchAndPointerEventTracking.touchEndTracking, names.pointerupEvent);
}
#else
UNUSED_PARAM(touchStartEvent);
- m_touchEventTracking.touchForceChangedTracking = TrackingType::Synchronous;
- m_touchEventTracking.touchStartTracking = TrackingType::Synchronous;
- m_touchEventTracking.touchMoveTracking = TrackingType::Synchronous;
- m_touchEventTracking.touchEndTracking = TrackingType::Synchronous;
+ m_touchAndPointerEventTracking.touchForceChangedTracking = TrackingType::Synchronous;
+ m_touchAndPointerEventTracking.touchStartTracking = TrackingType::Synchronous;
+ m_touchAndPointerEventTracking.touchMoveTracking = TrackingType::Synchronous;
+ m_touchAndPointerEventTracking.touchEndTracking = TrackingType::Synchronous;
#endif // ENABLE(ASYNC_SCROLLING)
}
@@ -2405,20 +2408,20 @@
// WebCore should not have to set up its state correctly after some events were dismissed.
// For example, we don't want to send a TouchMoved without a TouchPressed.
// We send everything, WebCore updates its internal state and dispatch what is needed to the page.
- TrackingType globalTrackingType = m_touchEventTracking.isTrackingAnything() ? TrackingType::Asynchronous : TrackingType::NotTracking;
+ TrackingType globalTrackingType = m_touchAndPointerEventTracking.isTrackingAnything() ? TrackingType::Asynchronous : TrackingType::NotTracking;
- globalTrackingType = mergeTrackingTypes(globalTrackingType, m_touchEventTracking.touchForceChangedTracking);
+ globalTrackingType = mergeTrackingTypes(globalTrackingType, m_touchAndPointerEventTracking.touchForceChangedTracking);
for (auto& touchPoint : touchStartEvent.touchPoints()) {
switch (touchPoint.state()) {
case WebPlatformTouchPoint::TouchReleased:
- globalTrackingType = mergeTrackingTypes(globalTrackingType, m_touchEventTracking.touchEndTracking);
+ globalTrackingType = mergeTrackingTypes(globalTrackingType, m_touchAndPointerEventTracking.touchEndTracking);
break;
case WebPlatformTouchPoint::TouchPressed:
- globalTrackingType = mergeTrackingTypes(globalTrackingType, m_touchEventTracking.touchStartTracking);
+ globalTrackingType = mergeTrackingTypes(globalTrackingType, m_touchAndPointerEventTracking.touchStartTracking);
break;
case WebPlatformTouchPoint::TouchMoved:
case WebPlatformTouchPoint::TouchStationary:
- globalTrackingType = mergeTrackingTypes(globalTrackingType, m_touchEventTracking.touchMoveTracking);
+ globalTrackingType = mergeTrackingTypes(globalTrackingType, m_touchAndPointerEventTracking.touchMoveTracking);
break;
case WebPlatformTouchPoint::TouchCancelled:
globalTrackingType = mergeTrackingTypes(globalTrackingType, TrackingType::Asynchronous);
@@ -2483,7 +2486,7 @@
m_process->responsivenessTimer().stop();
if (event.allTouchPointsAreReleased())
- m_touchEventTracking.reset();
+ m_touchAndPointerEventTracking.reset();
}
void WebPageProxy::handleTouchEventAsynchronously(const NativeWebTouchEvent& event)
@@ -2498,7 +2501,7 @@
m_process->send(Messages::EventDispatcher::TouchEvent(m_pageID, event), 0);
if (event.allTouchPointsAreReleased())
- m_touchEventTracking.reset();
+ m_touchAndPointerEventTracking.reset();
}
#elif ENABLE(TOUCH_EVENTS)
@@ -2532,7 +2535,7 @@
}
if (event.allTouchPointsAreReleased())
- m_touchEventTracking.reset();
+ m_touchAndPointerEventTracking.reset();
}
#endif // ENABLE(TOUCH_EVENTS)
@@ -6265,7 +6268,7 @@
}
#if ENABLE(TOUCH_EVENTS)
- m_touchEventTracking.reset();
+ m_touchAndPointerEventTracking.reset();
#endif
#if ENABLE(GEOLOCATION)
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (238273 => 238274)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.h 2018-11-16 05:46:48 UTC (rev 238273)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h 2018-11-16 09:09:34 UTC (rev 238274)
@@ -2093,7 +2093,7 @@
touchEndTracking = WebCore::TrackingType::NotTracking;
}
};
- TouchEventTracking m_touchEventTracking;
+ TouchEventTracking m_touchAndPointerEventTracking;
#endif
#if ENABLE(TOUCH_EVENTS) && !ENABLE(IOS_TOUCH_EVENTS)
Deque<QueuedTouchEvents> m_touchEventQueue;