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

Changeset 242675 in webkit


Ignore:
Timestamp:
Mar 9, 2019, 4:09:05 PM (7 years ago)
Author:
Alan Bujtas
Message:

[ContentChangeObserver] Start observing for content change between touchEnd and mouseMoved start
https://bugs.webkit.org/show_bug.cgi?id=195510
<rdar://problem/48735695>

Reviewed by Simon Fraser.

Source/WebCore:

This patch covers the observation of async changes triggered by touchStart/touchEnd (animations, timers, style recalcs).

Test: fast/events/touch/ios/content-observation/visibility-change-after-touch-end.html

  • page/ios/ContentChangeObserver.cpp:

(WebCore::ContentChangeObserver::didCancelTouchEvent):
(WebCore::ContentChangeObserver::adjustObservedState):

  • page/ios/ContentChangeObserver.h:

(WebCore::ContentChangeObserver::setIsInBetweenTouchEndAndMouseMoved):
(WebCore::ContentChangeObserver::isInBetweenTouchEndAndMouseMoved const):
(WebCore::ContentChangeObserver::isObservingContentChanges const):

Source/WebKit:

  • WebProcess/WebPage/ios/WebPageIOS.mm:

(WebKit::WebPage::cancelPotentialTapInFrame):

LayoutTests:

  • fast/events/touch/ios/content-observation/visibility-change-after-touch-end-expected.txt: Added.
  • fast/events/touch/ios/content-observation/visibility-change-after-touch-end.html: Added.
Location:
trunk
Files:
2 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r242665 r242675  
     12019-03-09  Zalan Bujtas  <zalan@apple.com>
     2
     3        [ContentChangeObserver] Start observing for content change between touchEnd and mouseMoved start
     4        https://bugs.webkit.org/show_bug.cgi?id=195510
     5        <rdar://problem/48735695>
     6
     7        Reviewed by Simon Fraser.
     8
     9        * fast/events/touch/ios/content-observation/visibility-change-after-touch-end-expected.txt: Added.
     10        * fast/events/touch/ios/content-observation/visibility-change-after-touch-end.html: Added.
     11
    1122019-03-08  Ryan Haddad  <ryanhaddad@apple.com>
    213
  • trunk/Source/WebCore/ChangeLog

    r242670 r242675  
     12019-03-09  Zalan Bujtas  <zalan@apple.com>
     2
     3        [ContentChangeObserver] Start observing for content change between touchEnd and mouseMoved start
     4        https://bugs.webkit.org/show_bug.cgi?id=195510
     5        <rdar://problem/48735695>
     6
     7        Reviewed by Simon Fraser.
     8
     9        This patch covers the observation of async changes triggered by touchStart/touchEnd (animations, timers, style recalcs).
     10
     11        Test: fast/events/touch/ios/content-observation/visibility-change-after-touch-end.html
     12
     13        * page/ios/ContentChangeObserver.cpp:
     14        (WebCore::ContentChangeObserver::didCancelTouchEvent):
     15        (WebCore::ContentChangeObserver::adjustObservedState):
     16        * page/ios/ContentChangeObserver.h:
     17        (WebCore::ContentChangeObserver::setIsInBetweenTouchEndAndMouseMoved):
     18        (WebCore::ContentChangeObserver::isInBetweenTouchEndAndMouseMoved const):
     19        (WebCore::ContentChangeObserver::isObservingContentChanges const):
     20
    1212019-03-08  Simon Fraser  <simon.fraser@apple.com>
    222
  • trunk/Source/WebCore/page/ios/ContentChangeObserver.cpp

    r242661 r242675  
    8989}
    9090
     91void ContentChangeObserver::willNotProceedWithClick()
     92{
     93    LOG(ContentObservation, "willNotProceedWithClick: click will not happen.");
     94    setIsBetweenTouchEndAndMouseMoved(false);
     95    // FIXME: Add support for preventDefault() and long press.
     96}
     97
    9198void ContentChangeObserver::domTimerExecuteDidStart(const DOMTimer& timer)
    9299{
     
    248255        setHasNoChangeState();
    249256        clearObservedDOMTimers();
    250         m_isMouseMovedPrecededByTouch = true;
    251257        setShouldObserveDOMTimerScheduling(true);
    252258        break;
    253259    case Event::EndedTouchStartEventDispatching:
    254260        setShouldObserveDOMTimerScheduling(false);
     261        setIsBetweenTouchEndAndMouseMoved(true);
    255262        break;
    256263    case Event::StartedMouseMovedEventDispatching:
    257264        ASSERT(!m_document.hasPendingStyleRecalc());
    258         if (!m_isMouseMovedPrecededByTouch) {
     265        if (!isBetweenTouchEndAndMouseMoved()) {
    259266            setHasNoChangeState();
    260267            clearObservedDOMTimers();
    261268        }
     269        setIsBetweenTouchEndAndMouseMoved(false);
    262270        setShouldObserveDOMTimerScheduling(true);
    263         m_isMouseMovedPrecededByTouch = false;
    264271        break;
    265272    case Event::EndedMouseMovedEventDispatching:
  • trunk/Source/WebCore/page/ios/ContentChangeObserver.h

    r242661 r242675  
    5050    void didInstallDOMTimer(const DOMTimer&, Seconds timeout, bool singleShot);
    5151    void didRemoveDOMTimer(const DOMTimer&);
     52    WEBCORE_EXPORT void willNotProceedWithClick();
    5253    void didSuspendActiveDOMObjects();
    5354    void willDetachPage();
     
    124125    bool isWaitingForStyleRecalc() const { return m_isWaitingForStyleRecalc; }
    125126
    126     bool isObservingContentChanges() const { return m_mouseMovedEventIsBeingDispatched || m_touchEventIsBeingDispatched || m_observedDomTimerIsBeingExecuted || m_isInObservedStyleRecalc || m_contentObservationTimer.isActive(); }
     127    bool isObservingContentChanges() const;
    127128
    128129    void cancelPendingActivities();
     
    135136    bool hasObservedDOMTimer() const { return !m_DOMTimerList.isEmpty(); }
    136137    bool hasDeterminateState() const;
     138
     139    void setIsBetweenTouchEndAndMouseMoved(bool isBetween) { m_isBetweenTouchEndAndMouseMoved = isBetween; }
     140    bool isBetweenTouchEndAndMouseMoved() const { return m_isBetweenTouchEndAndMouseMoved; }
    137141
    138142    bool hasPendingActivity() const { return hasObservedDOMTimer() || m_document.hasPendingStyleRecalc() || isObservationTimeWindowActive(); }
     
    169173    bool m_isObservingDOMTimerScheduling { false };
    170174    bool m_observedDomTimerIsBeingExecuted { false };
    171     bool m_isMouseMovedPrecededByTouch { false };
    172175    bool m_mouseMovedEventIsBeingDispatched { false };
     176    bool m_isBetweenTouchEndAndMouseMoved { false };
    173177};
    174178
     
    189193}
    190194
    191 }
     195inline bool ContentChangeObserver::isObservingContentChanges() const
     196{
     197    return m_touchEventIsBeingDispatched
     198        || m_isBetweenTouchEndAndMouseMoved
     199        || m_mouseMovedEventIsBeingDispatched
     200        || m_observedDomTimerIsBeingExecuted
     201        || m_isInObservedStyleRecalc
     202        || m_contentObservationTimer.isActive();
     203    }
     204}
     205
    192206#endif
  • trunk/Source/WebKit/ChangeLog

    r242666 r242675  
     12019-03-09  Zalan Bujtas  <zalan@apple.com>
     2
     3        [ContentChangeObserver] Start observing for content change between touchEnd and mouseMoved start
     4        https://bugs.webkit.org/show_bug.cgi?id=195510
     5        <rdar://problem/48735695>
     6
     7        Reviewed by Simon Fraser.
     8
     9        * WebProcess/WebPage/ios/WebPageIOS.mm:
     10        (WebKit::WebPage::cancelPotentialTapInFrame):
     11
    1122019-03-08  Chris Dumez  <cdumez@apple.com>
    213
  • trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm

    r242628 r242675  
    866866{
    867867    if (m_potentialTapNode) {
    868         Frame* potentialTapFrame = m_potentialTapNode->document().frame();
     868        m_potentialTapNode->document().contentChangeObserver().willNotProceedWithClick();
     869        auto* potentialTapFrame = m_potentialTapNode->document().frame();
    869870        if (potentialTapFrame && !potentialTapFrame->tree().isDescendantOf(frame.coreFrame()))
    870871            return;
Note: See TracChangeset for help on using the changeset viewer.