summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/dom/EventQueue.cpp
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2011-05-24 11:24:40 +0100
committerBen Murdoch <benm@google.com>2011-06-02 09:53:15 +0100
commit81bc750723a18f21cd17d1b173cd2a4dda9cea6e (patch)
tree7a9e5ed86ff429fd347a25153107221543909b19 /Source/WebCore/dom/EventQueue.cpp
parent94088a6d336c1dd80a1e734af51e96abcbb689a7 (diff)
downloadexternal_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.cpp42
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);