Changeset 167698 in webkit


Ignore:
Timestamp:
Apr 22, 2014 10:53:05 PM (10 years ago)
Author:
benjamin@webkit.org
Message:

[iOS][WK2] Split iOS touch event dispatch for the regular touch event dispatch
https://bugs.webkit.org/show_bug.cgi?id=132033

Patch by Benjamin Poulain <bpoulain@apple.com> on 2014-04-22
Reviewed by Simon Fraser.

The generic touch event dispatching does not work well with iOS gesture recognizers.
Some events are required to be synchronous, while other needs can be asynchronous and
can even use event coalescing. We only need UI callback for the synchronous events.

Previously, that was implemented by changing the property ShouldSendEventsSynchronously
on WebPageProxy. That is causing issues when synchronous events are sent right after asynchronous
events because the responses in WebPageProxy::didReceiveEvent() easily get out of order.

This patch completely split the UIGestureRecognizerDispatching from the normal asynchronous event dispatching.

Synchronous events are sent directly to the WebProcess and report the result to the PageClient right away.

Asynchronous events are sent to the EventDispatcher where they are coalesced until the main thread is free
to process events.

There can be a race where a synchronous event comes before the asynchronous events are processed. In that case,
the synchronous event handler starts by getting the events out of the EventDispatcher and dispatch them first.

  • Shared/NativeWebTouchEvent.h:

(WebKit::NativeWebTouchEvent::uniqueId): Deleted.

  • Shared/ios/NativeWebTouchEventIOS.mm:

(WebKit::NativeWebTouchEvent::NativeWebTouchEvent):

  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::handleSynchronousTouchEvent):
(WebKit::WebPageProxy::sendAsynchronousTouchEvent):
(WebKit::WebPageProxy::didReceiveEvent):
(WebKit::WebPageProxy::resetStateAfterProcessExited):

  • UIProcess/WebPageProxy.h:
  • UIProcess/ios/WKContentViewInteraction.h:
  • UIProcess/ios/WKContentViewInteraction.mm:

(-[WKContentView _webTouchEventsRecognized:]):
(-[WKContentView _webTouchEvent:WebKit::preventsNativeGestures:]):

  • WebProcess/WebPage/EventDispatcher.cpp:

(WebKit::EventDispatcher::EventDispatcher):
(WebKit::EventDispatcher::clearQueuedTouchEventsForPage):
(WebKit::EventDispatcher::getQueuedTouchEventsForPage):
(WebKit::EventDispatcher::touchEvent):
(WebKit::EventDispatcher::dispatchTouchEvents):

  • WebProcess/WebPage/EventDispatcher.h:
  • WebProcess/WebPage/EventDispatcher.messages.in:
  • WebProcess/WebPage/WebPage.cpp:

(WebKit::WebPage::dispatchTouchEvent):
(WebKit::WebPage::touchEventSync):
(WebKit::WebPage::touchEvent):
(WebKit::WebPage::touchEventSyncForTesting):
(WebKit::WebPage::didCommitLoad):

  • WebProcess/WebPage/WebPage.h:
  • WebProcess/WebPage/WebPage.messages.in:
  • WebProcess/WebPage/ios/WebPageIOS.mm:

(WebKit::WebPage::dispatchAsynchronousTouchEventsQueue):

Location:
trunk/Source/WebKit2
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r167690 r167698  
     12014-04-22  Benjamin Poulain  <bpoulain@apple.com>
     2
     3        [iOS][WK2] Split iOS touch event dispatch for the regular touch event dispatch
     4        https://bugs.webkit.org/show_bug.cgi?id=132033
     5
     6        Reviewed by Simon Fraser.
     7
     8        The generic touch event dispatching does not work well with iOS gesture recognizers.
     9        Some events are required to be synchronous, while other needs can be asynchronous and
     10        can even use event coalescing. We only need UI callback for the synchronous events.
     11
     12        Previously, that was implemented by changing the property ShouldSendEventsSynchronously
     13        on WebPageProxy. That is causing issues when synchronous events are sent right after asynchronous
     14        events because the responses in WebPageProxy::didReceiveEvent() easily get out of order.
     15
     16        This patch completely split the UIGestureRecognizerDispatching from the normal asynchronous event dispatching.
     17
     18        Synchronous events are sent directly to the WebProcess and report the result to the PageClient right away.
     19
     20        Asynchronous events are sent to the EventDispatcher where they are coalesced until the main thread is free
     21        to process events.
     22
     23        There can be a race where a synchronous event comes before the asynchronous events are processed. In that case,
     24        the synchronous event handler starts by getting the events out of the EventDispatcher and dispatch them first.
     25
     26        * Shared/NativeWebTouchEvent.h:
     27        (WebKit::NativeWebTouchEvent::uniqueId): Deleted.
     28        * Shared/ios/NativeWebTouchEventIOS.mm:
     29        (WebKit::NativeWebTouchEvent::NativeWebTouchEvent):
     30        * UIProcess/WebPageProxy.cpp:
     31        (WebKit::WebPageProxy::handleSynchronousTouchEvent):
     32        (WebKit::WebPageProxy::sendAsynchronousTouchEvent):
     33        (WebKit::WebPageProxy::didReceiveEvent):
     34        (WebKit::WebPageProxy::resetStateAfterProcessExited):
     35        * UIProcess/WebPageProxy.h:
     36        * UIProcess/ios/WKContentViewInteraction.h:
     37        * UIProcess/ios/WKContentViewInteraction.mm:
     38        (-[WKContentView _webTouchEventsRecognized:]):
     39        (-[WKContentView _webTouchEvent:WebKit::preventsNativeGestures:]):
     40        * WebProcess/WebPage/EventDispatcher.cpp:
     41        (WebKit::EventDispatcher::EventDispatcher):
     42        (WebKit::EventDispatcher::clearQueuedTouchEventsForPage):
     43        (WebKit::EventDispatcher::getQueuedTouchEventsForPage):
     44        (WebKit::EventDispatcher::touchEvent):
     45        (WebKit::EventDispatcher::dispatchTouchEvents):
     46        * WebProcess/WebPage/EventDispatcher.h:
     47        * WebProcess/WebPage/EventDispatcher.messages.in:
     48        * WebProcess/WebPage/WebPage.cpp:
     49        (WebKit::WebPage::dispatchTouchEvent):
     50        (WebKit::WebPage::touchEventSync):
     51        (WebKit::WebPage::touchEvent):
     52        (WebKit::WebPage::touchEventSyncForTesting):
     53        (WebKit::WebPage::didCommitLoad):
     54        * WebProcess/WebPage/WebPage.h:
     55        * WebProcess/WebPage/WebPage.messages.in:
     56        * WebProcess/WebPage/ios/WebPageIOS.mm:
     57        (WebKit::WebPage::dispatchAsynchronousTouchEventsQueue):
     58
    1592014-04-22  Chris Fleizach  <cfleizach@apple.com>
    260
  • trunk/Source/WebKit2/Shared/NativeWebTouchEvent.h

    r164776 r167698  
    4949#if PLATFORM(IOS)
    5050    explicit NativeWebTouchEvent(UIWebTouchEventsGestureRecognizer *);
    51     unsigned uniqueId() const { return m_uniqueID; }
    5251#elif PLATFORM(GTK)
    5352    NativeWebTouchEvent(const NativeWebTouchEvent&);
     
    6160
    6261private:
    63 #if PLATFORM(IOS)
    64     unsigned m_uniqueID;
    65 #elif PLATFORM(GTK)
     62#if PLATFORM(GTK)
    6663    GUniquePtr<GdkEvent> m_nativeEvent;
    6764    const WebCore::GtkTouchContextHelper& m_touchContext;
  • trunk/Source/WebKit2/Shared/ios/NativeWebTouchEventIOS.mm

    r164776 r167698  
    3737
    3838namespace WebKit {
    39 
    40 static unsigned uniqueTouchEventIdIndex = 0;
    4139
    4240static inline WebEvent::Type webEventTypeForUIWebTouchEventType(UIWebTouchEventType type)
     
    10098NativeWebTouchEvent::NativeWebTouchEvent(UIWebTouchEventsGestureRecognizer *gestureRecognizer)
    10199    : WebTouchEvent(webEventTypeForUIWebTouchEventType(gestureRecognizer.type), static_cast<Modifiers>(0), WTF::currentTime(), extractWebTouchPoint(gestureRecognizer), positionForCGPoint(gestureRecognizer.locationInWindow), gestureRecognizer.inJavaScriptGesture, gestureRecognizer.scale, gestureRecognizer.rotation)
    102     , m_uniqueID(uniqueTouchEventIdIndex++)
    103100{
    104101}
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp

    r167686 r167698  
    14941494    return true;
    14951495}
    1496 
     1496#endif
     1497
     1498#if ENABLE(IOS_TOUCH_EVENTS)
     1499void WebPageProxy::handleTouchEventSynchronously(const NativeWebTouchEvent& event)
     1500{
     1501    if (!isValid())
     1502        return;
     1503
     1504    if (event.type() == WebEvent::TouchStart)
     1505        m_isTrackingTouchEvents = shouldStartTrackingTouchEvents(event);
     1506
     1507    if (!m_isTrackingTouchEvents)
     1508        return;
     1509
     1510    m_process->responsivenessTimer()->start();
     1511    bool handled = false;
     1512    m_process->sendSync(Messages::WebPage::TouchEventSync(event), Messages::WebPage::TouchEventSync::Reply(handled), m_pageID);
     1513    didReceiveEvent(event.type(), handled);
     1514    m_pageClient.doneWithTouchEvent(event, handled);
     1515    m_process->responsivenessTimer()->stop();
     1516
     1517    if (event.type() == WebEvent::TouchEnd || event.type() == WebEvent::TouchCancel)
     1518        m_isTrackingTouchEvents = false;
     1519}
     1520
     1521void WebPageProxy::handleTouchEventAsynchronously(const NativeWebTouchEvent& event)
     1522{
     1523    if (!isValid())
     1524        return;
     1525
     1526    ASSERT(event.type() != WebEvent::TouchStart);
     1527
     1528    if (!m_isTrackingTouchEvents)
     1529        return;
     1530
     1531    m_process->send(Messages::EventDispatcher::TouchEvent(m_pageID, event), 0);
     1532
     1533    if (event.type() == WebEvent::TouchEnd || event.type() == WebEvent::TouchCancel)
     1534        m_isTrackingTouchEvents = false;
     1535}
     1536
     1537#elif ENABLE(TOUCH_EVENTS)
    14971538void WebPageProxy::handleTouchEvent(const NativeWebTouchEvent& event)
    14981539{
     
    37983839        break;
    37993840    }
    3800 #if ENABLE(TOUCH_EVENTS)
     3841#if ENABLE(IOS_TOUCH_EVENTS)
     3842    case WebEvent::TouchStart:
     3843    case WebEvent::TouchMove:
     3844    case WebEvent::TouchEnd:
     3845    case WebEvent::TouchCancel:
     3846        break;
     3847#elif ENABLE(TOUCH_EVENTS)
    38013848    case WebEvent::TouchStart:
    38023849    case WebEvent::TouchMove:
     
    41544201    m_processingMouseMoveEvent = false;
    41554202
    4156 #if ENABLE(TOUCH_EVENTS)
     4203#if ENABLE(TOUCH_EVENTS) && !ENABLE(IOS_TOUCH_EVENTS)
    41574204    m_touchEventQueue.clear();
    41584205#endif
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.h

    r167686 r167698  
    695695    void handleWheelEvent(const NativeWebWheelEvent&);
    696696    void handleKeyboardEvent(const NativeWebKeyboardEvent&);
    697 #if ENABLE(TOUCH_EVENTS)
     697#if ENABLE(IOS_TOUCH_EVENTS)
     698    void handleTouchEventSynchronously(const NativeWebTouchEvent&);
     699    void handleTouchEventAsynchronously(const NativeWebTouchEvent&);
     700#elif ENABLE(TOUCH_EVENTS)
    698701    void handleTouchEvent(const NativeWebTouchEvent&);
    699702#endif
     
    15641567#if ENABLE(TOUCH_EVENTS)
    15651568    bool m_isTrackingTouchEvents;
     1569#endif
     1570#if ENABLE(TOUCH_EVENTS) && !ENABLE(IOS_TOUCH_EVENTS)
    15661571    Deque<QueuedTouchEvents> m_touchEventQueue;
    15671572#endif
     1573
    15681574#if ENABLE(INPUT_TYPE_COLOR)
    15691575    RefPtr<WebColorPicker> m_colorPicker;
  • trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.h

    r167280 r167698  
    8181
    8282    BOOL _canSendTouchEventsAsynchronously;
    83     unsigned _nativeWebTouchEventUniqueIdBeingSentSynchronously;
    8483
    8584    RetainPtr<UITapGestureRecognizer> _singleTapGestureRecognizer;
  • trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm

    r167624 r167698  
    292292{
    293293    NativeWebTouchEvent nativeWebTouchEvent(gestureRecognizer);
    294 
    295294    if (nativeWebTouchEvent.type() == WebKit::WebEvent::TouchStart)
    296295        _canSendTouchEventsAsynchronously = NO;
    297296
    298     if (!_canSendTouchEventsAsynchronously)
    299         _nativeWebTouchEventUniqueIdBeingSentSynchronously = nativeWebTouchEvent.uniqueId();
    300 
    301     _page->setShouldSendEventsSynchronously(!_canSendTouchEventsAsynchronously);
    302     _page->handleTouchEvent(nativeWebTouchEvent);
    303     _page->setShouldSendEventsSynchronously(false);
     297    if (_canSendTouchEventsAsynchronously)
     298        _page->handleTouchEventAsynchronously(nativeWebTouchEvent);
     299    else
     300        _page->handleTouchEventSynchronously(nativeWebTouchEvent);
    304301}
    305302
     
    344341{
    345342    if (preventsNativeGesture) {
    346         // If we are dispatching events synchronously and the event coming back is not the one we are sending, it is a callback
    347         // from an event sent asynchronously prior to the synchronous event. In that case, it should not use that information
    348         // to update UIWebTouchEventsGestureRecognizer.
    349         if (!_canSendTouchEventsAsynchronously && _nativeWebTouchEventUniqueIdBeingSentSynchronously != touchEvent.uniqueId())
    350             return;
    351 
    352343        _canSendTouchEventsAsynchronously = YES;
    353344        [_touchEventGestureRecognizer setDefaultPrevented:YES];
  • trunk/Source/WebKit2/WebProcess/WebPage/EventDispatcher.cpp

    r165746 r167698  
    11/*
    2  * Copyright (C) 2011 Apple Inc. All rights reserved.
     2 * Copyright (C) 2011, 2014 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    5555    : m_queue(WorkQueue::create("com.apple.WebKit.EventDispatcher"))
    5656    , m_recentWheelEventDeltaTracker(adoptPtr(new WheelEventDeltaTracker))
     57#if ENABLE(IOS_TOUCH_EVENTS)
     58    , m_touchEventsLock(SPINLOCK_INITIALIZER)
     59#endif
    5760{
    5861}
     
    144147}
    145148
     149#if ENABLE(IOS_TOUCH_EVENTS)
     150void EventDispatcher::clearQueuedTouchEventsForPage(const WebPage& webPage)
     151{
     152    SpinLockHolder locker(&m_touchEventsLock);
     153    m_touchEvents.remove(webPage.pageID());
     154}
     155
     156void EventDispatcher::getQueuedTouchEventsForPage(const WebPage& webPage, TouchEventQueue& destinationQueue)
     157{
     158    SpinLockHolder locker(&m_touchEventsLock);
     159    destinationQueue = std::move(m_touchEvents.take(webPage.pageID()));
     160}
     161
     162void EventDispatcher::touchEvent(uint64_t pageID, const WebKit::WebTouchEvent& touchEvent)
     163{
     164    bool updateListWasEmpty;
     165    {
     166        SpinLockHolder locker(&m_touchEventsLock);
     167        updateListWasEmpty = m_touchEvents.isEmpty();
     168        auto addResult = m_touchEvents.add(pageID, std::move(TouchEventQueue()));
     169        if (addResult.isNewEntry)
     170            addResult.iterator->value.append(touchEvent);
     171        else {
     172            TouchEventQueue& queuedEvents = addResult.iterator->value;
     173            ASSERT(!queuedEvents.isEmpty());
     174            const WebTouchEvent& lastTouchEvent = queuedEvents.last();
     175
     176            // Coalesce touch move events.
     177            WebEvent::Type type = lastTouchEvent.type();
     178            if (type == WebEvent::TouchMove)
     179                queuedEvents.last() = touchEvent;
     180            else
     181                queuedEvents.append(touchEvent);
     182        }
     183    }
     184
     185    if (updateListWasEmpty)
     186        RunLoop::main().dispatch(bind(&EventDispatcher::dispatchTouchEvents, this));
     187}
     188
     189void EventDispatcher::dispatchTouchEvents()
     190{
     191    HashMap<uint64_t, TouchEventQueue> localCopy;
     192    {
     193        SpinLockHolder locker(&m_touchEventsLock);
     194        localCopy.swap(m_touchEvents);
     195    }
     196
     197    for (auto& slot : localCopy) {
     198        if (WebPage* webPage = WebProcess::shared().webPage(slot.key))
     199            webPage->dispatchAsynchronousTouchEvents(slot.value);
     200    }
     201}
     202#endif
     203
    146204void EventDispatcher::dispatchWheelEvent(uint64_t pageID, const WebWheelEvent& wheelEvent)
    147205{
  • trunk/Source/WebKit2/WebProcess/WebPage/EventDispatcher.h

    r163180 r167698  
    11/*
    2  * Copyright (C) 2011 Apple Inc. All rights reserved.
     2 * Copyright (C) 2011, 2014 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    3030
    3131#include <WebCore/WheelEventDeltaTracker.h>
     32#include <WebEvent.h>
    3233#include <wtf/HashMap.h>
    3334#include <wtf/Noncopyable.h>
    3435#include <wtf/RefPtr.h>
     36#include <wtf/TCSpinLock.h>
    3537#include <wtf/ThreadingPrimitives.h>
    3638
     
    5557#endif
    5658
     59#if ENABLE(IOS_TOUCH_EVENTS)
     60    typedef Vector<WebTouchEvent, 1> TouchEventQueue;
     61
     62    void clearQueuedTouchEventsForPage(const WebPage&);
     63    void getQueuedTouchEventsForPage(const WebPage&, TouchEventQueue&);
     64#endif
     65
    5766    void initializeConnection(IPC::Connection*);
    5867
     
    6574    // Message handlers
    6675    void wheelEvent(uint64_t pageID, const WebWheelEvent&, bool canRubberBandAtLeft, bool canRubberBandAtRight, bool canRubberBandAtTop, bool canRubberBandAtBottom);
     76#if ENABLE(IOS_TOUCH_EVENTS)
     77    void touchEvent(uint64_t pageID, const WebTouchEvent&);
     78#endif
     79
    6780
    6881    // This is called on the main thread.
    6982    void dispatchWheelEvent(uint64_t pageID, const WebWheelEvent&);
     83#if ENABLE(IOS_TOUCH_EVENTS)
     84    void dispatchTouchEvents();
     85#endif
    7086
    7187#if ENABLE(ASYNC_SCROLLING)
     
    8096#endif
    8197    OwnPtr<WebCore::WheelEventDeltaTracker> m_recentWheelEventDeltaTracker;
     98#if ENABLE(IOS_TOUCH_EVENTS)
     99    SpinLock m_touchEventsLock;
     100    HashMap<uint64_t, TouchEventQueue> m_touchEvents;
     101#endif
    82102};
    83103
  • trunk/Source/WebKit2/WebProcess/WebPage/EventDispatcher.messages.in

    r160742 r167698  
    2323messages -> EventDispatcher {
    2424    WheelEvent(uint64_t pageID, WebKit::WebWheelEvent event, bool canRubberBandAtLeft, bool canRubberBandAtRight, bool canRubberBandAtTop, bool canRubberBandAtBottom)
     25#if ENABLE(IOS_TOUCH_EVENTS)
     26    TouchEvent(uint64_t pageID, WebKit::WebTouchEvent event)
     27#endif
    2528}
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp

    r167686 r167698  
    19491949    return page->mainFrame().eventHandler().handleTouchEvent(platform(touchEvent));
    19501950}
    1951 
     1951#endif
     1952
     1953#if ENABLE(IOS_TOUCH_EVENTS)
     1954void WebPage::dispatchTouchEvent(const WebTouchEvent& touchEvent, bool& handled)
     1955{
     1956    m_lastInteractionLocation = touchEvent.position();
     1957    CurrentEvent currentEvent(touchEvent);
     1958    handled = handleTouchEvent(touchEvent, m_page.get());
     1959}
     1960
     1961void WebPage::touchEventSync(const WebTouchEvent& touchEvent, bool& handled)
     1962{
     1963    EventDispatcher::TouchEventQueue queuedEvents;
     1964    WebProcess::shared().eventDispatcher().getQueuedTouchEventsForPage(*this, queuedEvents);
     1965    dispatchAsynchronousTouchEvents(queuedEvents);
     1966
     1967    dispatchTouchEvent(touchEvent, handled);
     1968}
     1969#elif ENABLE(TOUCH_EVENTS)
    19521970void WebPage::touchEvent(const WebTouchEvent& touchEvent)
    19531971{
    1954 #if PLATFORM(IOS)
    1955     m_lastInteractionLocation = touchEvent.position();
    1956 #endif
     1972
    19571973    bool handled = false;
    19581974    if (canHandleUserEvents()) {
     
    19661982void WebPage::touchEventSyncForTesting(const WebTouchEvent& touchEvent, bool& handled)
    19671983{
    1968 #if PLATFORM(IOS)
    1969     m_lastInteractionLocation = touchEvent.position();
    1970 #endif
    19711984    CurrentEvent currentEvent(touchEvent);
    19721985    handled = handleTouchEvent(touchEvent, m_page.get());
     
    42404253    m_userHasChangedPageScaleFactor = false;
    42414254
     4255    WebProcess::shared().eventDispatcher().clearQueuedTouchEventsForPage(*this);
     4256
    42424257    Document* document = frame->coreFrame()->document();
    42434258    if (document->isImageDocument())
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h

    r167686 r167698  
    479479    WebCore::IntRect rectForElementAtInteractionLocation();
    480480
     481    void dispatchAsynchronousTouchEvents(const Vector<WebTouchEvent, 1>& queue);
    481482#if ENABLE(INSPECTOR)
    482483    void showInspectorIndication();
     
    706707    void applicationDidBecomeActive();
    707708    void zoomToRect(WebCore::FloatRect, double minimumScale, double maximumScale);
     709    void dispatchTouchEvent(const WebTouchEvent&, bool& handled);
    708710#endif
    709711
     
    856858    void keyEvent(const WebKeyboardEvent&);
    857859    void keyEventSyncForTesting(const WebKeyboardEvent&, bool&);
    858 #if ENABLE(TOUCH_EVENTS)
     860#if ENABLE(IOS_TOUCH_EVENTS)
     861    void touchEventSync(const WebTouchEvent&, bool& handled);
     862#elif ENABLE(TOUCH_EVENTS)
    859863    void touchEvent(const WebTouchEvent&);
    860864    void touchEventSyncForTesting(const WebTouchEvent&, bool& handled);
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in

    r167686 r167698  
    8282#endif
    8383
    84 #if ENABLE(TOUCH_EVENTS)
     84#if ENABLE(IOS_TOUCH_EVENTS)
     85    TouchEventSync(WebKit::WebTouchEvent event) -> (bool handled)
     86#endif
     87#if !ENABLE(IOS_TOUCH_EVENTS) && ENABLE(TOUCH_EVENTS)
    8588    TouchEvent(WebKit::WebTouchEvent event)
    8689    TouchEventSyncForTesting(WebKit::WebTouchEvent event) -> (bool handled)
  • trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm

    r167624 r167698  
    20602060}
    20612061
     2062void WebPage::dispatchAsynchronousTouchEvents(const Vector<WebTouchEvent, 1>& queue)
     2063{
     2064    bool ignored;
     2065    for (const WebTouchEvent& event : queue)
     2066        dispatchTouchEvent(event, ignored);
     2067}
     2068
    20622069} // namespace WebKit
    20632070
Note: See TracChangeset for help on using the changeset viewer.