⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 240634 in webkit


Ignore:
Timestamp:
Jan 28, 2019, 7:15:02 PM (8 years ago)
Author:
graouts@webkit.org
Message:

Implement capture for Pointer Events on iOS
https://bugs.webkit.org/show_bug.cgi?id=193917
<rdar://problem/47605689>

Reviewed by Dean Jackson.

Source/WebCore:

We add a new PointerCaptureController object which gets notified upon dispatch of pointer events
to implement implicit pointer capture, dispatch the gotpointercapture and lostpointercaptiure events,
and implement the Element APIs for pointer capture: hasPointerCapture(), setPointerCapture() and
releasePointerCapture().

Tests: pointerevents/ios/pointer-events-implicit-capture-has-pointer-capture-in-pointer-down.html

pointerevents/ios/pointer-events-implicit-capture-release-exception.html
pointerevents/ios/pointer-events-implicit-capture-release.html
pointerevents/ios/pointer-events-implicit-capture.html
pointerevents/ios/pointer-events-set-pointer-capture-exceptions.html

  • Sources.txt:
  • WebCore.xcodeproj/project.pbxproj:
  • dom/Element.cpp:

(WebCore::Element::setPointerCapture):
(WebCore::Element::releasePointerCapture):
(WebCore::Element::hasPointerCapture):

  • dom/Element.h:
  • dom/Element.idl:
  • dom/EventNames.h:
  • dom/PointerEvent.h:
  • page/Page.cpp:

(WebCore::Page::Page):

  • page/Page.h:

(WebCore::Page::pointerCaptureController const):

  • page/PointerCaptureController.cpp: Added.

(WebCore::PointerCaptureController::PointerCaptureController):
(WebCore::PointerCaptureController::setPointerCapture):
(WebCore::PointerCaptureController::releasePointerCapture):
(WebCore::PointerCaptureController::hasPointerCapture):
(WebCore::PointerCaptureController::pointerLockWasApplied):
(WebCore::PointerCaptureController::touchEndedOrWasCancelledForIdentifier):
(WebCore::PointerCaptureController::pointerEventWillBeDispatched):
(WebCore::PointerCaptureController::pointerEventWasDispatched):
(WebCore::PointerCaptureController::processPendingPointerCapture):

  • page/PointerCaptureController.h: Added.
  • page/PointerLockController.cpp:

(WebCore::PointerLockController::requestPointerLock):

  • page/PointerLockController.h:

LayoutTests:

New tests for implicit pointer capture and the Element APIs related to pointer capture.

  • pointerevents/ios/pointer-events-implicit-capture-expected.txt: Added.
  • pointerevents/ios/pointer-events-implicit-capture-has-pointer-capture-in-pointer-down-expected.txt: Added.
  • pointerevents/ios/pointer-events-implicit-capture-has-pointer-capture-in-pointer-down.html: Added.
  • pointerevents/ios/pointer-events-implicit-capture-release-exception-expected.txt: Added.
  • pointerevents/ios/pointer-events-implicit-capture-release-exception.html: Added.
  • pointerevents/ios/pointer-events-implicit-capture-release-expected.txt: Added.
  • pointerevents/ios/pointer-events-implicit-capture-release.html: Added.
  • pointerevents/ios/pointer-events-implicit-capture.html: Added.
  • pointerevents/ios/pointer-events-set-pointer-capture-exceptions-expected.txt: Added.
  • pointerevents/ios/pointer-events-set-pointer-capture-exceptions.html: Added.
Location:
trunk
Files:
12 added
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r240632 r240634  
     12019-01-28  Antoine Quint  <graouts@apple.com>
     2
     3        Implement capture for Pointer Events on iOS
     4        https://bugs.webkit.org/show_bug.cgi?id=193917
     5        <rdar://problem/47605689>
     6
     7        Reviewed by Dean Jackson.
     8
     9        New tests for implicit pointer capture and the Element APIs related to pointer capture.
     10
     11        * pointerevents/ios/pointer-events-implicit-capture-expected.txt: Added.
     12        * pointerevents/ios/pointer-events-implicit-capture-has-pointer-capture-in-pointer-down-expected.txt: Added.
     13        * pointerevents/ios/pointer-events-implicit-capture-has-pointer-capture-in-pointer-down.html: Added.
     14        * pointerevents/ios/pointer-events-implicit-capture-release-exception-expected.txt: Added.
     15        * pointerevents/ios/pointer-events-implicit-capture-release-exception.html: Added.
     16        * pointerevents/ios/pointer-events-implicit-capture-release-expected.txt: Added.
     17        * pointerevents/ios/pointer-events-implicit-capture-release.html: Added.
     18        * pointerevents/ios/pointer-events-implicit-capture.html: Added.
     19        * pointerevents/ios/pointer-events-set-pointer-capture-exceptions-expected.txt: Added.
     20        * pointerevents/ios/pointer-events-set-pointer-capture-exceptions.html: Added.
     21
    1222019-01-28  Dean Jackson  <dino@apple.com>
    223
  • trunk/Source/WebCore/ChangeLog

    r240633 r240634  
     12019-01-28  Antoine Quint  <graouts@apple.com>
     2
     3        Implement capture for Pointer Events on iOS
     4        https://bugs.webkit.org/show_bug.cgi?id=193917
     5        <rdar://problem/47605689>
     6
     7        Reviewed by Dean Jackson.
     8
     9        We add a new PointerCaptureController object which gets notified upon dispatch of pointer events
     10        to implement implicit pointer capture, dispatch the gotpointercapture and lostpointercaptiure events,
     11        and implement the Element APIs for pointer capture: hasPointerCapture(), setPointerCapture() and
     12        releasePointerCapture().
     13
     14        Tests: pointerevents/ios/pointer-events-implicit-capture-has-pointer-capture-in-pointer-down.html
     15               pointerevents/ios/pointer-events-implicit-capture-release-exception.html
     16               pointerevents/ios/pointer-events-implicit-capture-release.html
     17               pointerevents/ios/pointer-events-implicit-capture.html
     18               pointerevents/ios/pointer-events-set-pointer-capture-exceptions.html
     19
     20        * Sources.txt:
     21        * WebCore.xcodeproj/project.pbxproj:
     22        * dom/Element.cpp:
     23        (WebCore::Element::setPointerCapture):
     24        (WebCore::Element::releasePointerCapture):
     25        (WebCore::Element::hasPointerCapture):
     26        * dom/Element.h:
     27        * dom/Element.idl:
     28        * dom/EventNames.h:
     29        * dom/PointerEvent.h:
     30        * page/Page.cpp:
     31        (WebCore::Page::Page):
     32        * page/Page.h:
     33        (WebCore::Page::pointerCaptureController const):
     34        * page/PointerCaptureController.cpp: Added.
     35        (WebCore::PointerCaptureController::PointerCaptureController):
     36        (WebCore::PointerCaptureController::setPointerCapture):
     37        (WebCore::PointerCaptureController::releasePointerCapture):
     38        (WebCore::PointerCaptureController::hasPointerCapture):
     39        (WebCore::PointerCaptureController::pointerLockWasApplied):
     40        (WebCore::PointerCaptureController::touchEndedOrWasCancelledForIdentifier):
     41        (WebCore::PointerCaptureController::pointerEventWillBeDispatched):
     42        (WebCore::PointerCaptureController::pointerEventWasDispatched):
     43        (WebCore::PointerCaptureController::processPendingPointerCapture):
     44        * page/PointerCaptureController.h: Added.
     45        * page/PointerLockController.cpp:
     46        (WebCore::PointerLockController::requestPointerLock):
     47        * page/PointerLockController.h:
     48
    1492019-01-28  Andy Estes  <aestes@apple.com>
    250
  • trunk/Source/WebCore/Sources.txt

    r240552 r240634  
    15241524page/PerformanceTiming.cpp
    15251525page/PerformanceUserTiming.cpp
     1526page/PointerCaptureController.cpp
    15261527page/PointerLockController.cpp
    15271528page/PrintContext.cpp
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r240579 r240634  
    21182118                71A57DF2154BE25C0009D120 /* SVGPathUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 71A57DF0154BE25C0009D120 /* SVGPathUtilities.h */; };
    21192119                71B28427203CEC4C0036AA5D /* JSCSSAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 71B28426203CEC0D0036AA5D /* JSCSSAnimation.h */; settings = {ATTRIBUTES = (Private, ); }; };
     2120                71B5AB2621F1D9F400376E5C /* PointerCaptureController.h in Headers */ = {isa = PBXBuildFile; fileRef = 71B5AB2421F1D9E200376E5C /* PointerCaptureController.h */; };
    21202121                71B7EE0D21B5C6870031C1EF /* TouchAction.h in Headers */ = {isa = PBXBuildFile; fileRef = 71AEE4EB21B5A49C00DDB036 /* TouchAction.h */; settings = {ATTRIBUTES = (Private, ); }; };
    21212122                71C29E32203CE781008F36D2 /* CSSAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 71C29E30203CE76B008F36D2 /* CSSAnimation.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    94119412                71B28424203CEC0B0036AA5D /* JSCSSAnimation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSCSSAnimation.cpp; sourceTree = "<group>"; };
    94129413                71B28426203CEC0D0036AA5D /* JSCSSAnimation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSCSSAnimation.h; sourceTree = "<group>"; };
     9414                71B5AB2421F1D9E200376E5C /* PointerCaptureController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PointerCaptureController.h; sourceTree = "<group>"; };
     9415                71B5AB2521F1D9E300376E5C /* PointerCaptureController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PointerCaptureController.cpp; sourceTree = "<group>"; };
    94139416                71C29E2E203CE76B008F36D2 /* CSSAnimation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CSSAnimation.cpp; sourceTree = "<group>"; };
    94149417                71C29E30203CE76B008F36D2 /* CSSAnimation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSAnimation.h; sourceTree = "<group>"; };
     
    2041420417                                A554B5F11E383936001D4E03 /* PerformanceUserTiming.h */,
    2041520418                                31D591B116697A6C00E6BF02 /* PlugInClient.h */,
     20419                                71B5AB2521F1D9E300376E5C /* PointerCaptureController.cpp */,
     20420                                71B5AB2421F1D9E200376E5C /* PointerCaptureController.h */,
    2041620421                                5CFC434E192406A900A0D3B5 /* PointerLockController.cpp */,
    2041720422                                5CFC434F192406A900A0D3B5 /* PointerLockController.h */,
     
    3195731962                                6550B6A6099DF0270090D781 /* Text.h in Headers */,
    3195831963                                93309E17099E64920056E581 /* TextAffinity.h in Headers */,
     31964                                71B5AB2621F1D9F400376E5C /* PointerCaptureController.h in Headers */,
    3195931965                                CE7B2DB51586ABAD0098B3FA /* TextAlternativeWithRange.h in Headers */,
    3196031966                                0F54DCE61881051D003EEDBB /* TextAutoSizing.h in Headers */,
  • trunk/Source/WebCore/dom/Element.cpp

    r240596 r240634  
    7979#include "NodeRenderStyle.h"
    8080#include "PlatformWheelEvent.h"
     81#include "PointerCaptureController.h"
    8182#include "PointerLockController.h"
    8283#include "RenderFragmentContainer.h"
     
    34353436#endif
    34363437
     3438#if ENABLE(POINTER_EVENTS)
     3439ExceptionOr<void> Element::setPointerCapture(int32_t pointerId)
     3440{
     3441    if (document().page())
     3442        return document().page()->pointerCaptureController().setPointerCapture(this, pointerId);
     3443    return { };
     3444}
     3445
     3446ExceptionOr<void> Element::releasePointerCapture(int32_t pointerId)
     3447{
     3448    if (document().page())
     3449        return document().page()->pointerCaptureController().releasePointerCapture(this, pointerId);
     3450    return { };
     3451}
     3452
     3453bool Element::hasPointerCapture(int32_t pointerId)
     3454{
     3455    if (document().page())
     3456        return document().page()->pointerCaptureController().hasPointerCapture(this, pointerId);
     3457    return false;
     3458}
     3459#endif
     3460
    34373461#if ENABLE(POINTER_LOCK)
    34383462void Element::requestPointerLock()
  • trunk/Source/WebCore/dom/Element.h

    r240579 r240634  
    498498#endif
    499499
     500#if ENABLE(POINTER_EVENTS)
     501    ExceptionOr<void> setPointerCapture(int32_t);
     502    ExceptionOr<void> releasePointerCapture(int32_t);
     503    bool hasPointerCapture(int32_t);
     504#endif
     505
    500506#if ENABLE(POINTER_LOCK)
    501507    WEBCORE_EXPORT void requestPointerLock();
  • trunk/Source/WebCore/dom/Element.idl

    r237717 r240634  
    9999    [Conditional=FULLSCREEN_API, EnabledBySetting=FullScreen] void webkitRequestFullscreen(); // Prefixed W3C version.
    100100
     101    // Extensions from Pointer Events API (https://w3c.github.io/pointerevents/#extensions-to-the-element-interface).
     102    [Conditional=POINTER_EVENTS, EnabledAtRuntime=PointerEvents, MayThrowException] void setPointerCapture(long pointerId);
     103    [Conditional=POINTER_EVENTS, EnabledAtRuntime=PointerEvents, MayThrowException] void releasePointerCapture(long pointerId);
     104    [Conditional=POINTER_EVENTS, EnabledAtRuntime=PointerEvents] boolean hasPointerCapture(long pointerId);
     105
    101106    // Extensions from Pointer Lock API (https://w3c.github.io/pointerlock/#extensions-to-the-element-interface).
    102107    [Conditional=POINTER_LOCK] void requestPointerLock();
  • trunk/Source/WebCore/dom/EventNames.h

    r238274 r240634  
    141141    macro(gesturetap) \
    142142    macro(gesturetapdown) \
     143    macro(gotpointercapture) \
    143144    macro(hashchange) \
    144145    macro(icecandidate) \
     
    163164    macro(loadingerror) \
    164165    macro(loadstart) \
     166    macro(lostpointercapture) \
    165167    macro(mark) \
    166168    macro(merchantvalidation) \
  • trunk/Source/WebCore/dom/PointerEvent.h

    r240632 r240634  
    4040public:
    4141    struct Init : MouseEventInit {
    42         long pointerId { 0 };
     42        int32_t pointerId { 0 };
    4343        double width { 1 };
    4444        double height { 1 };
     
    5757    }
    5858
     59#if ENABLE(POINTER_EVENTS)
     60    static Ref<PointerEvent> createForPointerCapture(const AtomicString& type, const PointerEvent& pointerEvent)
     61    {
     62        Init initializer;
     63        initializer.bubbles = true;
     64        initializer.pointerId = pointerEvent.pointerId();
     65        initializer.isPrimary = pointerEvent.isPrimary();
     66        initializer.pointerType = pointerEvent.pointerType();
     67        return adoptRef(*new PointerEvent(type, WTFMove(initializer)));
     68    }
     69#endif
     70
    5971    static Ref<PointerEvent> createForBindings()
    6072    {
     
    6880    virtual ~PointerEvent();
    6981
    70     long pointerId() const { return m_pointerId; }
     82    int32_t pointerId() const { return m_pointerId; }
    7183    double width() const { return m_width; }
    7284    double height() const { return m_height; }
     
    90102#endif
    91103
    92     long m_pointerId { 0 };
     104    int32_t m_pointerId { 0 };
    93105    double m_width { 1 };
    94106    double m_height { 1 };
  • trunk/Source/WebCore/page/Page.cpp

    r240437 r240634  
    8787#include "PluginInfoProvider.h"
    8888#include "PluginViewBase.h"
     89#include "PointerCaptureController.h"
    8990#include "PointerLockController.h"
    9091#include "ProgressTracker.h"
     
    215216    , m_userInputBridge(std::make_unique<UserInputBridge>(*this))
    216217    , m_inspectorController(std::make_unique<InspectorController>(*this, pageConfiguration.inspectorClient))
     218#if ENABLE(POINTER_EVENTS)
     219    , m_pointerCaptureController(std::make_unique<PointerCaptureController>())
     220#endif
    217221#if ENABLE(POINTER_LOCK)
    218222    , m_pointerLockController(std::make_unique<PointerLockController>(*this))
  • trunk/Source/WebCore/page/Page.h

    r240139 r240634  
    123123class PluginInfoProvider;
    124124class PluginViewBase;
     125class PointerCaptureController;
    125126class PointerLockController;
    126127class ProgressTracker;
     
    245246    UserInputBridge& userInputBridge() const { return *m_userInputBridge; }
    246247    InspectorController& inspectorController() const { return *m_inspectorController; }
     248#if ENABLE(POINTER_EVENTS)
     249    PointerCaptureController& pointerCaptureController() const { return *m_pointerCaptureController; }
     250#endif
    247251#if ENABLE(POINTER_LOCK)
    248252    PointerLockController& pointerLockController() const { return *m_pointerLockController; }
     
    748752    const std::unique_ptr<UserInputBridge> m_userInputBridge;
    749753    const std::unique_ptr<InspectorController> m_inspectorController;
     754#if ENABLE(POINTER_EVENTS)
     755    const std::unique_ptr<PointerCaptureController> m_pointerCaptureController;
     756#endif
    750757#if ENABLE(POINTER_LOCK)
    751758    const std::unique_ptr<PointerLockController> m_pointerLockController;
  • trunk/Source/WebCore/page/PointerLockController.cpp

    r239469 r240634  
    7272        m_element = target;
    7373        enqueueEvent(eventNames().pointerlockchangeEvent, target);
     74#if ENABLE(POINTER_EVENTS)
     75        m_page.pointerCaptureController().pointerLockWasApplied();
     76#endif
    7477    } else {
    7578        m_lockPending = true;
  • trunk/Source/WebCore/page/PointerLockController.h

    r239469 r240634  
    2828
    2929#include <wtf/RefPtr.h>
     30#include <wtf/WeakPtr.h>
    3031#include <wtf/text/AtomicString.h>
    3132
Note: See TracChangeset for help on using the changeset viewer.