Title: [89657] trunk/Source/WebCore
Revision
89657
Author
pfeld...@chromium.org
Date
2011-06-24 01:24:16 -0700 (Fri, 24 Jun 2011)

Log Message

2011-06-24  David Grogan  <dgro...@chromium.org>

        Reviewed by Pavel Feldman.

        Web Inspector: [REGRESSION r86838] line numbers do not scroll when script paused
        https://bugs.webkit.org/show_bug.cgi?id=61653

        roll out r86838

        No new tests - refactoring.

        * dom/Document.h:
        * dom/EventQueue.cpp:
        (WebCore::EventQueueTimer::EventQueueTimer):
        (WebCore::EventQueueTimer::fired):
        (WebCore::EventQueue::create):
        (WebCore::EventQueue::EventQueue):
        (WebCore::EventQueue::~EventQueue):
        (WebCore::EventQueue::enqueueEvent):
        (WebCore::EventQueue::cancelEvent):
        (WebCore::EventQueue::cancelQueuedEvents):
        (WebCore::EventQueue::pendingEventTimerFired):
        (WebCore::EventQueue::dispatchEvent):
        * dom/EventQueue.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (89656 => 89657)


--- trunk/Source/WebCore/ChangeLog	2011-06-24 08:02:11 UTC (rev 89656)
+++ trunk/Source/WebCore/ChangeLog	2011-06-24 08:24:16 UTC (rev 89657)
@@ -1,3 +1,28 @@
+2011-06-24  David Grogan  <dgro...@chromium.org>
+
+        Reviewed by Pavel Feldman.
+
+        Web Inspector: [REGRESSION r86838] line numbers do not scroll when script paused
+        https://bugs.webkit.org/show_bug.cgi?id=61653
+
+        roll out r86838
+
+        No new tests - refactoring.
+
+        * dom/Document.h:
+        * dom/EventQueue.cpp:
+        (WebCore::EventQueueTimer::EventQueueTimer):
+        (WebCore::EventQueueTimer::fired):
+        (WebCore::EventQueue::create):
+        (WebCore::EventQueue::EventQueue):
+        (WebCore::EventQueue::~EventQueue):
+        (WebCore::EventQueue::enqueueEvent):
+        (WebCore::EventQueue::cancelEvent):
+        (WebCore::EventQueue::cancelQueuedEvents):
+        (WebCore::EventQueue::pendingEventTimerFired):
+        (WebCore::EventQueue::dispatchEvent):
+        * dom/EventQueue.h:
+
 2011-06-24  Sheriff Bot  <webkit.review....@gmail.com>
 
         Unreviewed, rolling out r89594.

Modified: trunk/Source/WebCore/dom/Document.h (89656 => 89657)


--- trunk/Source/WebCore/dom/Document.h	2011-06-24 08:02:11 UTC (rev 89656)
+++ trunk/Source/WebCore/dom/Document.h	2011-06-24 08:24:16 UTC (rev 89657)
@@ -1358,7 +1358,7 @@
 
     bool m_usingGeolocation;
 
-    OwnPtr<EventQueue> m_eventQueue;
+    RefPtr<EventQueue> m_eventQueue;
 
     RefPtr<DocumentWeakReference> m_weakReference;
 

Modified: trunk/Source/WebCore/dom/EventQueue.cpp (89656 => 89657)


--- trunk/Source/WebCore/dom/EventQueue.cpp	2011-06-24 08:02:11 UTC (rev 89656)
+++ trunk/Source/WebCore/dom/EventQueue.cpp	2011-06-24 08:24:16 UTC (rev 89657)
@@ -33,6 +33,7 @@
 #include "EventNames.h"
 #include "RuntimeApplicationChecks.h"
 #include "ScriptExecutionContext.h"
+#include "SuspendableTimer.h"
 
 namespace WebCore {
     
@@ -42,79 +43,42 @@
     return applicationIsSafari() && (document->url().protocolIs("feed") || document->url().protocolIs("feeds"));
 }
 
-PassOwnPtr<EventQueue> EventQueue::create(ScriptExecutionContext* context)
+class EventQueueTimer : public SuspendableTimer {
+    WTF_MAKE_NONCOPYABLE(EventQueueTimer);
+public:
+    EventQueueTimer(EventQueue* eventQueue, ScriptExecutionContext* context)
+        : SuspendableTimer(context)
+        , m_eventQueue(eventQueue) { }
+
+private:
+    virtual void fired() { m_eventQueue->pendingEventTimerFired(); }
+    EventQueue* m_eventQueue;    
+};
+
+PassRefPtr<EventQueue> EventQueue::create(ScriptExecutionContext* context)
 {
-    return adoptPtr(new EventQueue(context));
+    return adoptRef(new EventQueue(context));
 }
 
 EventQueue::EventQueue(ScriptExecutionContext* context)
-    : m_scriptExecutionContext(context)
+    : m_pendingEventTimer(adoptPtr(new EventQueueTimer(this, context)))
 {
 }
 
 EventQueue::~EventQueue()
 {
-    cancelQueuedEvents();
 }
 
-class EventQueue::EventDispatcherTask : public ScriptExecutionContext::Task {
-public:
-    static PassOwnPtr<EventDispatcherTask> create(PassRefPtr<Event> event, EventQueue* eventQueue)
-    {
-        return adoptPtr(new EventDispatcherTask(event, eventQueue));
-    }
-
-    void dispatchEvent(ScriptExecutionContext*, PassRefPtr<Event> event)
-    {
-        EventTarget* eventTarget = event->target();
-        if (eventTarget->toDOMWindow())
-            eventTarget->toDOMWindow()->dispatchEvent(event, 0);
-        else
-            eventTarget->dispatchEvent(event);
-    }
-
-    virtual void performTask(ScriptExecutionContext* context)
-    {
-        if (m_isCancelled)
-            return;
-        m_eventQueue->removeEvent(m_event.get());
-        dispatchEvent(context, m_event);
-    }
-
-    void cancel()
-    {
-        m_isCancelled = true;
-        m_event.clear();
-    }
-
-private:
-    EventDispatcherTask(PassRefPtr<Event> event, EventQueue* eventQueue)
-        : m_event(event)
-        , m_eventQueue(eventQueue)
-        , m_isCancelled(false)
-    {
-    }
-
-    RefPtr<Event> m_event;
-    EventQueue* m_eventQueue;
-    bool m_isCancelled;
-};
-
-void EventQueue::removeEvent(Event* event)
+void EventQueue::enqueueEvent(PassRefPtr<Event> event)
 {
-    if (Node* node = event->target()->toNode())
-        m_nodesWithQueuedScrollEvents.remove(node);
-    m_eventTaskMap.remove(event);
+    ASSERT(event->target());
+    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);
 }
 
-void EventQueue::enqueueEvent(PassRefPtr<Event> prpEvent)
-{
-    RefPtr<Event> event = prpEvent;
-    OwnPtr<EventDispatcherTask> task = EventDispatcherTask::create(event, this);
-    m_eventTaskMap.add(event.release(), task.get());
-    m_scriptExecutionContext->postTask(task.release());
-}
-
 void EventQueue::enqueueOrDispatchScrollEvent(PassRefPtr<Node> target, ScrollEventTargetType targetType)
 {
     if (!target->document()->hasListenerType(Document::SCROLL_LISTENER))
@@ -138,22 +102,50 @@
 
 bool EventQueue::cancelEvent(Event* event)
 {
-    EventDispatcherTask* task = m_eventTaskMap.get(event);
-    if (!task)
-        return false;
-    task->cancel();
-    removeEvent(event);
-    return true;
+    bool found = m_queuedEvents.contains(event);
+    m_queuedEvents.remove(event);
+    if (m_queuedEvents.isEmpty())
+        m_pendingEventTimer->stop();
+    return found;
 }
 
 void EventQueue::cancelQueuedEvents()
 {
-    for (EventTaskMap::iterator it = m_eventTaskMap.begin(); it != m_eventTaskMap.end(); ++it) {
-        EventDispatcherTask* task = it->second;
-        task->cancel();
-    }
-    m_eventTaskMap.clear();
+    m_pendingEventTimer->stop();
+    m_queuedEvents.clear();
+}
+
+void EventQueue::pendingEventTimerFired()
+{
+    ASSERT(!m_pendingEventTimer->isActive());
+    ASSERT(!m_queuedEvents.isEmpty());
+
     m_nodesWithQueuedScrollEvents.clear();
+
+    // 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->toDOMWindow())
+        eventTarget->toDOMWindow()->dispatchEvent(event, 0);
+    else
+        eventTarget->dispatchEvent(event);
 }
+
+}

Modified: trunk/Source/WebCore/dom/EventQueue.h (89656 => 89657)


--- trunk/Source/WebCore/dom/EventQueue.h	2011-06-24 08:02:11 UTC (rev 89656)
+++ trunk/Source/WebCore/dom/EventQueue.h	2011-06-24 08:24:16 UTC (rev 89657)
@@ -27,24 +27,27 @@
 #ifndef EventQueue_h
 #define EventQueue_h
 
-#include <wtf/HashMap.h>
 #include <wtf/HashSet.h>
-#include <wtf/PassOwnPtr.h>
+#include <wtf/ListHashSet.h>
+#include <wtf/OwnPtr.h>
+#include <wtf/RefCounted.h>
+#include <wtf/RefPtr.h>
 
 namespace WebCore {
 
 class Event;
+class EventQueueTimer;
 class Node;
 class ScriptExecutionContext;
 
-class EventQueue {
+class EventQueue : public RefCounted<EventQueue> {
 public:
     enum ScrollEventTargetType {
         ScrollEventDocumentTarget,
         ScrollEventElementTarget
     };
 
-    static PassOwnPtr<EventQueue> create(ScriptExecutionContext*);
+    static PassRefPtr<EventQueue> create(ScriptExecutionContext*);
     ~EventQueue();
 
     void enqueueEvent(PassRefPtr<Event>);
@@ -55,14 +58,14 @@
 private:
     explicit EventQueue(ScriptExecutionContext*);
 
-    void removeEvent(Event*);
+    void pendingEventTimerFired();
+    void dispatchEvent(PassRefPtr<Event>);
 
+    OwnPtr<EventQueueTimer> m_pendingEventTimer;
+    ListHashSet<RefPtr<Event> > m_queuedEvents;
     HashSet<Node*> m_nodesWithQueuedScrollEvents;
-    ScriptExecutionContext* m_scriptExecutionContext;
-
-    class EventDispatcherTask;
-    typedef HashMap<RefPtr<Event>, EventDispatcherTask*> EventTaskMap;
-    EventTaskMap m_eventTaskMap;
+    
+    friend class EventQueueTimer;    
 };
 
 }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to