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