diff options
author | Ben Murdoch <benm@google.com> | 2011-05-24 11:24:40 +0100 |
---|---|---|
committer | Ben Murdoch <benm@google.com> | 2011-06-02 09:53:15 +0100 |
commit | 81bc750723a18f21cd17d1b173cd2a4dda9cea6e (patch) | |
tree | 7a9e5ed86ff429fd347a25153107221543909b19 /Source/WebCore/dom/EventQueue.cpp | |
parent | 94088a6d336c1dd80a1e734af51e96abcbb689a7 (diff) | |
download | external_webkit-81bc750723a18f21cd17d1b173cd2a4dda9cea6e.zip external_webkit-81bc750723a18f21cd17d1b173cd2a4dda9cea6e.tar.gz external_webkit-81bc750723a18f21cd17d1b173cd2a4dda9cea6e.tar.bz2 |
Merge WebKit at r80534: Intial merge by Git
Change-Id: Ia7a83357124c9e1cdb1debf55d9661ec0bd09a61
Diffstat (limited to 'Source/WebCore/dom/EventQueue.cpp')
-rw-r--r-- | Source/WebCore/dom/EventQueue.cpp | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/Source/WebCore/dom/EventQueue.cpp b/Source/WebCore/dom/EventQueue.cpp index 5a1abe8..8e544c1 100644 --- a/Source/WebCore/dom/EventQueue.cpp +++ b/Source/WebCore/dom/EventQueue.cpp @@ -47,6 +47,11 @@ private: EventQueue* m_eventQueue; }; +PassRefPtr<EventQueue> EventQueue::create(ScriptExecutionContext* context) +{ + return adoptRef(new EventQueue(context)); +} + EventQueue::EventQueue(ScriptExecutionContext* context) : m_pendingEventTimer(adoptPtr(new EventQueueTimer(this, context))) { @@ -59,7 +64,8 @@ EventQueue::~EventQueue() void EventQueue::enqueueEvent(PassRefPtr<Event> event) { ASSERT(event->target()); - m_queuedEvents.append(event); + bool wasAdded = m_queuedEvents.add(event).second; + ASSERT_UNUSED(wasAdded, wasAdded); // It should not have already been in the list. if (!m_pendingEventTimer->isActive()) m_pendingEventTimer->startOneShot(0); @@ -77,25 +83,43 @@ void EventQueue::enqueueScrollEvent(PassRefPtr<Node> target, ScrollEventTargetTy enqueueEvent(scrollEvent.release()); } +bool EventQueue::cancelEvent(Event* event) +{ + bool found = m_queuedEvents.contains(event); + m_queuedEvents.remove(event); + if (m_queuedEvents.isEmpty()) + m_pendingEventTimer->stop(); + return found; +} + void EventQueue::pendingEventTimerFired() { ASSERT(!m_pendingEventTimer->isActive()); + ASSERT(!m_queuedEvents.isEmpty()); - Vector<RefPtr<Event> > queuedEvents; - queuedEvents.swap(m_queuedEvents); - m_nodesWithQueuedScrollEvents.clear(); - for (size_t i = 0; i < queuedEvents.size(); i++) - dispatchEvent(queuedEvents[i].release()); + // Insert a marker for where we should stop. + ASSERT(!m_queuedEvents.contains(0)); + bool wasAdded = m_queuedEvents.add(0).second; + ASSERT_UNUSED(wasAdded, wasAdded); // It should not have already been in the list. + + RefPtr<EventQueue> protector(this); + + while (!m_queuedEvents.isEmpty()) { + ListHashSet<RefPtr<Event> >::iterator iter = m_queuedEvents.begin(); + RefPtr<Event> event = *iter; + m_queuedEvents.remove(iter); + if (!event) + break; + dispatchEvent(event.get()); + } } void EventQueue::dispatchEvent(PassRefPtr<Event> event) { EventTarget* eventTarget = event->target(); - if (eventTarget->toNode()) - eventTarget->dispatchEvent(event); - else if (eventTarget->toDOMWindow()) + if (eventTarget->toDOMWindow()) eventTarget->toDOMWindow()->dispatchEvent(event, 0); else eventTarget->dispatchEvent(event); |