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

Changeset 280917 in webkit


Ignore:
Timestamp:
Aug 11, 2021, 10:22:04 AM (5 years ago)
Author:
Alan Coon
Message:

Apply patch. rdar://problem/80288774

Location:
branches/safari-611.3.10.0-branch/Source/WebCore/page
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/safari-611.3.10.0-branch/Source/WebCore/page/PointerCaptureController.cpp

    r275575 r280917  
    5050Element* PointerCaptureController::pointerCaptureElement(Document* document, PointerID pointerId) const
    5151{
    52     auto iterator = m_activePointerIdsToCapturingData.find(pointerId);
    53     if (iterator != m_activePointerIdsToCapturingData.end()) {
    54         auto pointerCaptureElement = iterator->value.targetOverride;
     52    if (auto capturingData = m_activePointerIdsToCapturingData.get(pointerId)) {
     53        auto pointerCaptureElement = capturingData->targetOverride;
    5554        if (pointerCaptureElement && &pointerCaptureElement->document() == document)
    5655            return pointerCaptureElement.get();
     
    6463
    6564    // 1. If the pointerId provided as the method's argument does not match any of the active pointers, then throw a DOMException with the name NotFoundError.
    66     auto iterator = m_activePointerIdsToCapturingData.find(pointerId);
    67     if (iterator == m_activePointerIdsToCapturingData.end())
     65    RefPtr capturingData = m_activePointerIdsToCapturingData.get(pointerId);
     66    if (!capturingData)
    6867        return Exception { NotFoundError };
    6968
     
    8281    // 4. If the pointer is not in the active buttons state, then terminate these steps.
    8382    // 5. For the specified pointerId, set the pending pointer capture target override to the Element on which this method was invoked.
    84     auto& capturingData = iterator->value;
    85     if (capturingData.pointerIsPressed)
    86         capturingData.pendingTargetOverride = capturingTarget;
     83    if (capturingData->pointerIsPressed)
     84        capturingData->pendingTargetOverride = capturingTarget;
    8785
    8886    updateHaveAnyCapturingElement();
     
    9997    // 1. If the pointerId provided as the method's argument does not match any of the active pointers and these steps are not
    10098    // being invoked as a result of the implicit release of pointer capture, then throw a DOMException with the name NotFoundError.
    101     auto iterator = m_activePointerIdsToCapturingData.find(pointerId);
    102     if (iterator == m_activePointerIdsToCapturingData.end())
     99    RefPtr capturingData = m_activePointerIdsToCapturingData.get(pointerId);
     100    if (!capturingData)
    103101        return Exception { NotFoundError };
    104102
     
    108106
    109107    // 3. For the specified pointerId, clear the pending pointer capture target override, if set.
    110     iterator->value.pendingTargetOverride = nullptr;
     108    capturingData->pendingTargetOverride = nullptr;
    111109   
    112110    // FIXME: This leaves value.targetOverride set: webkit.org/b/221342.
     
    127125        return false;
    128126
    129     auto iterator = m_activePointerIdsToCapturingData.find(pointerId);
    130     return iterator != m_activePointerIdsToCapturingData.end() && iterator->value.pendingTargetOverride == capturingTarget;
     127    auto capturingData = m_activePointerIdsToCapturingData.get(pointerId);
     128    return capturingData && capturingData->pendingTargetOverride == capturingTarget;
    131129}
    132130
     
    138136    // method has been called if any element is set to be captured or pending to be captured.
    139137    for (auto& capturingData : m_activePointerIdsToCapturingData.values()) {
    140         capturingData.pendingTargetOverride = nullptr;
    141         capturingData.targetOverride = nullptr;
     138        capturingData->pendingTargetOverride = nullptr;
     139        capturingData->targetOverride = nullptr;
    142140    }
    143141
     
    150148        return;
    151149
    152     for (auto& keyAndValue : m_activePointerIdsToCapturingData) {
    153         auto& capturingData = keyAndValue.value;
    154         if (capturingData.pendingTargetOverride == &element || capturingData.targetOverride == &element) {
     150    for (auto [pointerId, capturingData] : m_activePointerIdsToCapturingData) {
     151        if (capturingData->pendingTargetOverride == &element || capturingData->targetOverride == &element) {
    155152            // https://w3c.github.io/pointerevents/#implicit-release-of-pointer-capture
    156153            // When the pointer capture target override is no longer connected, the pending pointer capture target override and pointer capture target
    157154            // override nodes SHOULD be cleared and also a PointerEvent named lostpointercapture corresponding to the captured pointer SHOULD be fired
    158155            // at the document.
    159             ASSERT(isInBounds<PointerID>(keyAndValue.key));
    160             auto pointerId = static_cast<PointerID>(keyAndValue.key);
    161             auto pointerType = capturingData.pointerType;
     156            ASSERT(isInBounds<PointerID>(pointerId));
     157            auto pointerType = capturingData->pointerType;
    162158            releasePointerCapture(&element, pointerId);
    163159            // FIXME: Spec doesn't specify which task source to use.
     
    173169    m_haveAnyCapturingElement = false;
    174170
    175     CapturingData capturingData;
    176     capturingData.pointerType = PointerEvent::mousePointerType();
    177     m_activePointerIdsToCapturingData.add(mousePointerID, capturingData);
     171    m_activePointerIdsToCapturingData.add(mousePointerID, CapturingData::create(PointerEvent::mousePointerType()));
    178172}
    179173
     
    181175{
    182176    m_haveAnyCapturingElement = WTF::anyOf(m_activePointerIdsToCapturingData.values(), [&](auto& capturingData) {
    183         return capturingData.hasAnyElement();
     177        return capturingData->hasAnyElement();
    184178    });
    185179}
     
    193187bool PointerCaptureController::hasCancelledPointerEventForIdentifier(PointerID pointerId) const
    194188{
    195     auto iterator = m_activePointerIdsToCapturingData.find(pointerId);
    196     return iterator != m_activePointerIdsToCapturingData.end() && iterator->value.cancelled;
     189    RefPtr capturingData = m_activePointerIdsToCapturingData.get(pointerId);
     190    return capturingData && capturingData->cancelled;
    197191}
    198192
    199193bool PointerCaptureController::preventsCompatibilityMouseEventsForIdentifier(PointerID pointerId) const
    200194{
    201     auto iterator = m_activePointerIdsToCapturingData.find(pointerId);
    202     return iterator != m_activePointerIdsToCapturingData.end() && iterator->value.preventsCompatibilityMouseEvents;
     195    RefPtr capturingData = m_activePointerIdsToCapturingData.get(pointerId);
     196    return capturingData && capturingData->preventsCompatibilityMouseEvents;
    203197}
    204198
     
    206200static bool hierarchyHasCapturingEventListeners(Element* target, const AtomString& eventName)
    207201{
    208     for (ContainerNode* curr = target; curr; curr = curr->parentInComposedTree()) {
    209         if (curr->hasCapturingEventListeners(eventName))
     202    for (RefPtr<ContainerNode> currentNode = target; currentNode; currentNode = currentNode->parentInComposedTree()) {
     203        if (currentNode->hasCapturingEventListeners(eventName))
    210204            return true;
    211205    }
     
    215209void PointerCaptureController::dispatchEventForTouchAtIndex(EventTarget& target, const PlatformTouchEvent& platformTouchEvent, unsigned index, bool isPrimary, WindowProxy& view)
    216210{
    217     ASSERT(is<Element>(target));
     211    RELEASE_ASSERT(is<Element>(target));
    218212
    219213    auto dispatchOverOrOutEvent = [&](const String& type, EventTarget* target) {
     
    221215    };
    222216
    223     auto dispatchEnterOrLeaveEvent = [&](const String& type) {
    224         auto* targetElement = &downcast<Element>(target);
    225 
     217    auto dispatchEnterOrLeaveEvent = [&](const String& type, Element& targetElement) {
    226218        bool hasCapturingListenerInHierarchy = false;
    227         for (ContainerNode* curr = targetElement; curr; curr = curr->parentInComposedTree()) {
    228             if (curr->hasCapturingEventListeners(type)) {
     219        for (RefPtr<ContainerNode> currentNode = &targetElement; currentNode; currentNode = currentNode->parentInComposedTree()) {
     220            if (currentNode->hasCapturingEventListeners(type)) {
    229221                hasCapturingListenerInHierarchy = true;
    230222                break;
     
    233225
    234226        Vector<Ref<Element>, 32> targetChain;
    235         for (Element* element = targetElement; element; element = element->parentElementInComposedTree()) {
     227        for (RefPtr element = &targetElement; element; element = element->parentElementInComposedTree()) {
    236228            if (hasCapturingListenerInHierarchy || element->hasEventListeners(type))
    237229                targetChain.append(*element);
     
    249241    auto pointerEvent = PointerEvent::create(platformTouchEvent, index, isPrimary, view);
    250242
    251     auto& capturingData = ensureCapturingDataForPointerEvent(pointerEvent);
     243    Ref capturingData = ensureCapturingDataForPointerEvent(pointerEvent);
    252244
    253245    // Check if the target changed, which would require dispatching boundary events.
    254     RefPtr<Element> previousTarget = capturingData.previousTarget;
     246    RefPtr<Element> previousTarget = capturingData->previousTarget;
    255247    RefPtr<Element> currentTarget = downcast<Element>(&target);
    256248
    257     capturingData.previousTarget = currentTarget;
     249    capturingData->previousTarget = currentTarget;
    258250
    259251    if (pointerEvent->type() == eventNames().pointermoveEvent && previousTarget != currentTarget) {
     
    266258
    267259        Vector<Ref<Element>, 32> leftElementsChain;
    268         for (Element* element = previousTarget.get(); element; element = element->parentElementInComposedTree())
     260        for (RefPtr element = previousTarget.get(); element; element = element->parentElementInComposedTree())
    269261            leftElementsChain.append(*element);
    270262        Vector<Ref<Element>, 32> enteredElementsChain;
    271         for (Element* element = currentTarget.get(); element; element = element->parentElementInComposedTree())
     263        for (RefPtr element = currentTarget.get(); element; element = element->parentElementInComposedTree())
    272264            enteredElementsChain.append(*element);
    273265
     
    305297        // pointerenter prior to dispatching the pointerdown event.
    306298        dispatchOverOrOutEvent(eventNames().pointeroverEvent, currentTarget.get());
    307         dispatchEnterOrLeaveEvent(eventNames().pointerenterEvent);
     299        dispatchEnterOrLeaveEvent(eventNames().pointerenterEvent, *currentTarget);
    308300    }
    309301
     
    315307        // pointer event named pointerleave after dispatching the pointerup event.
    316308        dispatchOverOrOutEvent(eventNames().pointeroutEvent, currentTarget.get());
    317         dispatchEnterOrLeaveEvent(eventNames().pointerleaveEvent);
    318         capturingData.previousTarget = nullptr;
     309        dispatchEnterOrLeaveEvent(eventNames().pointerleaveEvent, *currentTarget);
     310        capturingData->previousTarget = nullptr;
    319311
    320312        touchWithIdentifierWasRemoved(pointerEvent->pointerId());
     
    328320    // for instance in the case of a long press to initiate a system drag.
    329321    for (auto& capturingData : m_activePointerIdsToCapturingData.values()) {
    330         if (capturingData.pointerType == PointerEvent::touchPointerType() && capturingData.pointerIsPressed && !capturingData.cancelled)
     322        if (capturingData->pointerType == PointerEvent::touchPointerType() && capturingData->pointerIsPressed && !capturingData->cancelled)
    331323            return nullptr;
    332324    }
     
    335327    const auto& names = eventNames();
    336328
    337     auto iterator = m_activePointerIdsToCapturingData.find(pointerId);
    338     bool pointerIsPressed = iterator != m_activePointerIdsToCapturingData.end() ? iterator->value.pointerIsPressed : false;
     329    RefPtr capturingData = m_activePointerIdsToCapturingData.get(pointerId);
     330    bool pointerIsPressed = capturingData ? capturingData->pointerIsPressed : false;
    339331
    340332    short newButton = mouseEvent.button();
    341     short previousMouseButton = iterator != m_activePointerIdsToCapturingData.end() ? iterator->value.previousMouseButton : -1;
     333    short previousMouseButton = capturingData ? capturingData->previousMouseButton : -1;
    342334    short button = (type == names.mousemoveEvent && newButton == previousMouseButton) ? -1 : newButton;
    343335
     
    361353
    362354    auto pointerEvent = PointerEvent::create(button, mouseEvent, pointerId, pointerType);
    363     if (iterator != m_activePointerIdsToCapturingData.end())
    364         iterator->value.previousMouseButton = newButton;
     355    if (capturingData)
     356        capturingData->previousMouseButton = newButton;
    365357    else if (pointerEvent)
    366         ensureCapturingDataForPointerEvent(*pointerEvent).previousMouseButton = newButton;
     358        ensureCapturingDataForPointerEvent(*pointerEvent)->previousMouseButton = newButton;
    367359
    368360    return pointerEvent;
     
    398390
    399391    if (event.pointerType() != PointerEvent::touchPointerType()) {
    400         auto iterator = m_activePointerIdsToCapturingData.find(pointerId);
    401         if (iterator != m_activePointerIdsToCapturingData.end())
    402             iterator->value.pointerIsPressed = isPointerdown;
     392        if (RefPtr capturingData = m_activePointerIdsToCapturingData.get(pointerId))
     393            capturingData->pointerIsPressed = isPointerdown;
    403394        return;
    404395    }
     
    419410    // to the target (as normal) indicating that capture is active.
    420411
    421     auto& capturingData = ensureCapturingDataForPointerEvent(event);
    422     capturingData.pointerIsPressed = true;
     412    auto capturingData = ensureCapturingDataForPointerEvent(event);
     413    capturingData->pointerIsPressed = true;
    423414    setPointerCapture(downcast<Element>(target), pointerId);
    424415}
    425416
    426 PointerCaptureController::CapturingData& PointerCaptureController::ensureCapturingDataForPointerEvent(const PointerEvent& event)
    427 {
    428     return m_activePointerIdsToCapturingData.ensure(event.pointerId(), [&event] {
    429         CapturingData capturingData;
    430         capturingData.pointerType = event.pointerType();
    431         return capturingData;
     417auto PointerCaptureController::ensureCapturingDataForPointerEvent(const PointerEvent& event) -> Ref<CapturingData>
     418{
     419    return m_activePointerIdsToCapturingData.ensure(event.pointerId(), [pointerType = event.pointerType()] {
     420        return CapturingData::create(pointerType);
    432421    }).iterator->value;
    433422}
     
    435424void PointerCaptureController::pointerEventWasDispatched(const PointerEvent& event)
    436425{
    437     auto iterator = m_activePointerIdsToCapturingData.find(event.pointerId());
    438     if (iterator != m_activePointerIdsToCapturingData.end()) {
    439         auto& capturingData = iterator->value;
    440         capturingData.isPrimary = event.isPrimary();
    441 
    442         // Immediately after firing the pointerup or pointercancel events, a user agent MUST clear the pending pointer capture target
    443         // override for the pointerId of the pointerup or pointercancel event that was just dispatched, and then run Process Pending
    444         // Pointer Capture steps to fire lostpointercapture if necessary.
    445         // https://w3c.github.io/pointerevents/#implicit-release-of-pointer-capture
    446         if (event.type() == eventNames().pointerupEvent) {
    447             capturingData.pendingTargetOverride = nullptr;
    448             processPendingPointerCapture(event.pointerId());
    449         }
    450 
    451         // If a mouse pointer has moved while it isn't pressed, make sure we reset the preventsCompatibilityMouseEvents flag since
    452         // we could otherwise prevent compatibility mouse events while those are only supposed to be prevented while the pointer is pressed.
    453         if (event.type() == eventNames().pointermoveEvent && capturingData.pointerType == PointerEvent::mousePointerType() && !capturingData.pointerIsPressed)
    454             capturingData.preventsCompatibilityMouseEvents = false;
    455 
    456         // If the pointer event dispatched was pointerdown and the event was canceled, then set the PREVENT MOUSE EVENT flag for this pointerType.
    457         // https://www.w3.org/TR/pointerevents/#mapping-for-devices-that-support-hover
    458         if (event.type() == eventNames().pointerdownEvent)
    459             capturingData.preventsCompatibilityMouseEvents = event.defaultPrevented();
    460     }
     426    RefPtr capturingData = m_activePointerIdsToCapturingData.get(event.pointerId());
     427    if (!capturingData)
     428        return;
     429
     430    capturingData->isPrimary = event.isPrimary();
     431
     432    // Immediately after firing the pointerup or pointercancel events, a user agent MUST clear the pending pointer capture target
     433    // override for the pointerId of the pointerup or pointercancel event that was just dispatched, and then run Process Pending
     434    // Pointer Capture steps to fire lostpointercapture if necessary.
     435    // https://w3c.github.io/pointerevents/#implicit-release-of-pointer-capture
     436    if (event.type() == eventNames().pointerupEvent) {
     437        capturingData->pendingTargetOverride = nullptr;
     438        processPendingPointerCapture(event.pointerId());
     439    }
     440
     441    // If a mouse pointer has moved while it isn't pressed, make sure we reset the preventsCompatibilityMouseEvents flag since
     442    // we could otherwise prevent compatibility mouse events while those are only supposed to be prevented while the pointer is pressed.
     443    if (event.type() == eventNames().pointermoveEvent && capturingData->pointerType == PointerEvent::mousePointerType() && !capturingData->pointerIsPressed)
     444        capturingData->preventsCompatibilityMouseEvents = false;
     445
     446    // If the pointer event dispatched was pointerdown and the event was canceled, then set the PREVENT MOUSE EVENT flag for this pointerType.
     447    // https://www.w3.org/TR/pointerevents/#mapping-for-devices-that-support-hover
     448    if (event.type() == eventNames().pointerdownEvent)
     449        capturingData->preventsCompatibilityMouseEvents = event.defaultPrevented();
    461450}
    462451
     
    480469    // the pointer with no capture.
    481470
    482     auto iterator = m_activePointerIdsToCapturingData.find(pointerId);
    483     if (iterator == m_activePointerIdsToCapturingData.end())
    484         return;
    485 
    486     auto& capturingData = iterator->value;
    487     if (capturingData.cancelled)
    488         return;
    489 
    490     capturingData.pendingTargetOverride = nullptr;
    491     capturingData.cancelled = true;
     471    RefPtr capturingData = m_activePointerIdsToCapturingData.get(pointerId);
     472    if (!capturingData || capturingData->cancelled)
     473        return;
     474
     475    capturingData->pendingTargetOverride = nullptr;
     476    capturingData->cancelled = true;
    492477
    493478#if ENABLE(TOUCH_EVENTS) && PLATFORM(IOS_FAMILY)
    494     capturingData.previousTarget = nullptr;
     479    capturingData->previousTarget = nullptr;
    495480#endif
    496481
    497482    auto target = [&]() -> RefPtr<Element> {
    498         if (capturingData.targetOverride)
    499             return capturingData.targetOverride;
     483        if (capturingData->targetOverride)
     484            return capturingData->targetOverride;
    500485        constexpr OptionSet<HitTestRequest::RequestType> hitType { HitTestRequest::ReadOnly, HitTestRequest::Active, HitTestRequest::DisallowUserAgentShadowContent, HitTestRequest::AllowChildFrameContent };
    501         return m_page.mainFrame().eventHandler().hitTestResultAtPoint(documentPoint, hitType).innerNonSharedElement();
     486        return Ref(m_page.mainFrame())->eventHandler().hitTestResultAtPoint(documentPoint, hitType).innerNonSharedElement();
    502487    }();
    503488
     
    507492    // After firing the pointercancel event, a user agent MUST also fire a pointer event named pointerout
    508493    // followed by firing a pointer event named pointerleave.
    509     auto isPrimary = capturingData.isPrimary ? PointerEvent::IsPrimary::Yes : PointerEvent::IsPrimary::No;
    510     auto cancelEvent = PointerEvent::create(eventNames().pointercancelEvent, pointerId, capturingData.pointerType, isPrimary);
     494    auto isPrimary = capturingData->isPrimary ? PointerEvent::IsPrimary::Yes : PointerEvent::IsPrimary::No;
     495    auto cancelEvent = PointerEvent::create(eventNames().pointercancelEvent, pointerId, capturingData->pointerType, isPrimary);
    511496    target->dispatchEvent(cancelEvent);
    512     target->dispatchEvent(PointerEvent::create(eventNames().pointeroutEvent, pointerId, capturingData.pointerType, isPrimary));
    513     target->dispatchEvent(PointerEvent::create(eventNames().pointerleaveEvent, pointerId, capturingData.pointerType, isPrimary));
     497    target->dispatchEvent(PointerEvent::create(eventNames().pointeroutEvent, pointerId, capturingData->pointerType, isPrimary));
     498    target->dispatchEvent(PointerEvent::create(eventNames().pointerleaveEvent, pointerId, capturingData->pointerType, isPrimary));
    514499    processPendingPointerCapture(pointerId);
    515500}
     
    517502void PointerCaptureController::processPendingPointerCapture(PointerID pointerId)
    518503{
    519     auto iterator = m_activePointerIdsToCapturingData.find(pointerId);
    520     if (iterator == m_activePointerIdsToCapturingData.end())
     504    RefPtr capturingData = m_activePointerIdsToCapturingData.get(pointerId);
     505    if (!capturingData)
    521506        return;
    522507
     
    526511    m_processingPendingPointerCapture = true;
    527512
    528     auto& capturingData = iterator->value;
    529 
    530513    // Cache the pending target override since it could be modified during the dispatch of events in this function.
    531     auto pendingTargetOverride = capturingData.pendingTargetOverride;
     514    auto pendingTargetOverride = capturingData->pendingTargetOverride;
    532515
    533516    // https://w3c.github.io/pointerevents/#process-pending-pointer-capture
    534517    // 1. If the pointer capture target override for this pointer is set and is not equal to the pending pointer capture target override,
    535518    // then fire a pointer event named lostpointercapture at the pointer capture target override node.
    536     if (capturingData.targetOverride && capturingData.targetOverride != pendingTargetOverride) {
    537         if (capturingData.targetOverride->isConnected())
    538             capturingData.targetOverride->dispatchEvent(PointerEvent::createForPointerCapture(eventNames().lostpointercaptureEvent, pointerId, capturingData.isPrimary, capturingData.pointerType));
    539         if (capturingData.pointerType == PointerEvent::mousePointerType()) {
    540             if (auto* frame = capturingData.targetOverride->document().frame())
     519    if (capturingData->targetOverride && capturingData->targetOverride != pendingTargetOverride) {
     520        if (capturingData->targetOverride->isConnected())
     521            capturingData->targetOverride->dispatchEvent(PointerEvent::createForPointerCapture(eventNames().lostpointercaptureEvent, pointerId, capturingData->isPrimary, capturingData->pointerType));
     522        if (capturingData->pointerType == PointerEvent::mousePointerType()) {
     523            if (RefPtr frame = capturingData->targetOverride->document().frame())
    541524                frame->eventHandler().pointerCaptureElementDidChange(nullptr);
    542525        }
     
    545528    // 2. If the pending pointer capture target override for this pointer is set and is not equal to the pointer capture target override,
    546529    // then fire a pointer event named gotpointercapture at the pending pointer capture target override.
    547     if (capturingData.pendingTargetOverride && capturingData.targetOverride != pendingTargetOverride) {
    548         if (capturingData.pointerType == PointerEvent::mousePointerType()) {
    549             if (auto* frame = pendingTargetOverride->document().frame())
     530    if (capturingData->pendingTargetOverride && capturingData->targetOverride != pendingTargetOverride) {
     531        if (capturingData->pointerType == PointerEvent::mousePointerType()) {
     532            if (RefPtr frame = pendingTargetOverride->document().frame())
    550533                frame->eventHandler().pointerCaptureElementDidChange(pendingTargetOverride.get());
    551534        }
    552         pendingTargetOverride->dispatchEvent(PointerEvent::createForPointerCapture(eventNames().gotpointercaptureEvent, pointerId, capturingData.isPrimary, capturingData.pointerType));
     535        pendingTargetOverride->dispatchEvent(PointerEvent::createForPointerCapture(eventNames().gotpointercaptureEvent, pointerId, capturingData->isPrimary, capturingData->pointerType));
    553536    }
    554537
    555538    // 3. Set the pointer capture target override to the pending pointer capture target override, if set. Otherwise, clear the pointer
    556539    // capture target override.
    557     capturingData.targetOverride = pendingTargetOverride;
     540    capturingData->targetOverride = pendingTargetOverride;
    558541
    559542    m_processingPendingPointerCapture = false;
  • branches/safari-611.3.10.0-branch/Source/WebCore/page/PointerCaptureController.h

    r275575 r280917  
    7070
    7171private:
    72     struct CapturingData {
     72    struct CapturingData : public RefCounted<CapturingData> {
     73        static Ref<CapturingData> create(const String& pointerType)
     74        {
     75            return adoptRef(*new CapturingData(pointerType));
     76        }
     77
    7378        RefPtr<Element> pendingTargetOverride;
    7479        RefPtr<Element> targetOverride;
     
    8994        bool pointerIsPressed { false };
    9095        short previousMouseButton { -1 };
     96
     97    private:
     98        CapturingData(const String& pointerType)
     99            : pointerType(pointerType)
     100        { }
    91101    };
    92102
    93     CapturingData& ensureCapturingDataForPointerEvent(const PointerEvent&);
     103    Ref<CapturingData> ensureCapturingDataForPointerEvent(const PointerEvent&);
    94104    void pointerEventWillBeDispatched(const PointerEvent&, EventTarget*);
    95105    void pointerEventWasDispatched(const PointerEvent&);
     
    100110    // While PointerID is defined as int32_t, we use int64_t here so that we may use a value outside of the int32_t range to have safe
    101111    // empty and removed values, allowing any int32_t to be provided through the API for lookup in this hashmap.
    102     using PointerIdToCapturingDataMap = HashMap<int64_t, CapturingData, WTF::IntHash<int64_t>, WTF::SignedWithZeroKeyHashTraits<int64_t>>;
     112    using PointerIdToCapturingDataMap = HashMap<int64_t, Ref<CapturingData>, WTF::IntHash<int64_t>, WTF::SignedWithZeroKeyHashTraits<int64_t>>;
    103113    PointerIdToCapturingDataMap m_activePointerIdsToCapturingData;
    104114    bool m_processingPendingPointerCapture { false };
Note: See TracChangeset for help on using the changeset viewer.