[SCM] WebKit Debian packaging branch, webkit-1.3, updated. upstream/1.3.7-4207-g178b198
mihaip at chromium.org
mihaip at chromium.org
Mon Feb 21 00:30:10 UTC 2011
The following commit has been merged in the webkit-1.3 branch:
commit a69f705273bff719ccb0bf2527e3bb1361f59c49
Author: mihaip at chromium.org <mihaip at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Tue Feb 1 09:20:59 2011 +0000
2011-02-01 Mihai Parparita <mihaip at chromium.org>
Reviewed by James Robinson.
Async event handlers should not fire within a modal dialog
https://bugs.webkit.org/show_bug.cgi?id=53202
Add tests for a scroll event triggered right before a modal dialog is
shown.
* fast/events/scroll-event-during-modal-dialog-expected.txt: Added.
* fast/events/scroll-event-during-modal-dialog.html: Added.
2011-02-01 Mihai Parparita <mihaip at chromium.org>
Reviewed by James Robinson.
Async event handlers should not fire within a modal dialog
https://bugs.webkit.org/show_bug.cgi?id=53202
Asychronous events that use EventQueue would currently fire while a
modal dialog (e.g. window.alert()) was up. Change EventQueue to use a
SuspendableTimer (which automatically gets suspended while dialogs are
up and in other cases where JS execution is not allowed).
Test: fast/events/scroll-event-during-modal-dialog.html
* dom/Document.cpp:
(WebCore::Document::Document):
* dom/EventQueue.cpp:
(WebCore::EventQueueTimer::EventQueueTimer):
(WebCore::EventQueueTimer::fired):
(WebCore::EventQueue::EventQueue):
(WebCore::EventQueue::enqueueEvent):
(WebCore::EventQueue::pendingEventTimerFired):
* dom/EventQueue.h:
(WebCore::EventQueue::create):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@77230 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 37d58ab..1068d9f 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,16 @@
+2011-02-01 Mihai Parparita <mihaip at chromium.org>
+
+ Reviewed by James Robinson.
+
+ Async event handlers should not fire within a modal dialog
+ https://bugs.webkit.org/show_bug.cgi?id=53202
+
+ Add tests for a scroll event triggered right before a modal dialog is
+ shown.
+
+ * fast/events/scroll-event-during-modal-dialog-expected.txt: Added.
+ * fast/events/scroll-event-during-modal-dialog.html: Added.
+
2011-02-01 Kent Tamura <tkent at chromium.org>
Reviewed by Dan Bernstein.
diff --git a/LayoutTests/fast/events/scroll-event-during-modal-dialog-expected.txt b/LayoutTests/fast/events/scroll-event-during-modal-dialog-expected.txt
new file mode 100644
index 0000000..b5514b8
--- /dev/null
+++ b/LayoutTests/fast/events/scroll-event-during-modal-dialog-expected.txt
@@ -0,0 +1,13 @@
+Tests that scroll events are not fired while modal dialogs are displayed.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Scrolling window
+Showing modal dialog
+Returned from modal dialog
+Scroll handler fired
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/events/scroll-event-during-modal-dialog.html b/LayoutTests/fast/events/scroll-event-during-modal-dialog.html
new file mode 100644
index 0000000..346dfb6
--- /dev/null
+++ b/LayoutTests/fast/events/scroll-event-during-modal-dialog.html
@@ -0,0 +1,34 @@
+<html>
+<link rel="stylesheet" href="../js/resources/js-test-style.css">
+<script src="../js/resources/js-test-pre.js"></script>
+<body style="min-height: 2000px">
+<p id="description"></p>
+<div id="console"></div>
+
+<script type="text/javascript">
+description('Tests that scroll events are not fired while modal dialogs are displayed.');
+
+var triggeredCaptureListener = false;
+var triggeredBubbleListener = false;
+
+onscroll = function()
+{
+ debug('Scroll handler fired');
+ finishJSTest();
+}
+
+onload = function()
+{
+ debug('Scrolling window');
+ window.scrollTo(200, 200);
+ debug('Showing modal dialog');
+ showModalDialog('resources/scroll-event-modal-dialog.html');
+ debug('Returned from modal dialog');
+}
+
+var successfullyParsed = true;
+var jsTestIsAsync = true;
+</script>
+<script src="../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 073ea1c..cb8be3a 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,28 @@
+2011-02-01 Mihai Parparita <mihaip at chromium.org>
+
+ Reviewed by James Robinson.
+
+ Async event handlers should not fire within a modal dialog
+ https://bugs.webkit.org/show_bug.cgi?id=53202
+
+ Asychronous events that use EventQueue would currently fire while a
+ modal dialog (e.g. window.alert()) was up. Change EventQueue to use a
+ SuspendableTimer (which automatically gets suspended while dialogs are
+ up and in other cases where JS execution is not allowed).
+
+ Test: fast/events/scroll-event-during-modal-dialog.html
+
+ * dom/Document.cpp:
+ (WebCore::Document::Document):
+ * dom/EventQueue.cpp:
+ (WebCore::EventQueueTimer::EventQueueTimer):
+ (WebCore::EventQueueTimer::fired):
+ (WebCore::EventQueue::EventQueue):
+ (WebCore::EventQueue::enqueueEvent):
+ (WebCore::EventQueue::pendingEventTimerFired):
+ * dom/EventQueue.h:
+ (WebCore::EventQueue::create):
+
2011-02-01 Roland Steiner <rolandsteiner at chromium.org>
Reviewed by Dimitri Glazkov.
diff --git a/Source/WebCore/dom/Document.cpp b/Source/WebCore/dom/Document.cpp
index cb9a2ab..7f69f51 100644
--- a/Source/WebCore/dom/Document.cpp
+++ b/Source/WebCore/dom/Document.cpp
@@ -408,7 +408,7 @@ Document::Document(Frame* frame, const KURL& url, bool isXHTML, bool isHTML, con
, m_normalWorldWrapperCache(0)
#endif
, m_usingGeolocation(false)
- , m_eventQueue(adoptPtr(new EventQueue))
+ , m_eventQueue(EventQueue::create(this))
#if ENABLE(WML)
, m_containsWMLContent(false)
#endif
diff --git a/Source/WebCore/dom/EventQueue.cpp b/Source/WebCore/dom/EventQueue.cpp
index a43929e..a3daae6 100644
--- a/Source/WebCore/dom/EventQueue.cpp
+++ b/Source/WebCore/dom/EventQueue.cpp
@@ -28,14 +28,31 @@
#include "EventQueue.h"
#include "DOMWindow.h"
-#include "Document.h"
#include "Event.h"
#include "EventNames.h"
+#include "ScriptExecutionContext.h"
+#include "SuspendableTimer.h"
namespace WebCore {
-EventQueue::EventQueue()
- : m_pendingEventTimer(this, &EventQueue::pendingEventTimerFired)
+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;
+};
+
+EventQueue::EventQueue(ScriptExecutionContext* context)
+ : m_pendingEventTimer(adoptPtr(new EventQueueTimer(this, context)))
+{
+}
+
+EventQueue::~EventQueue()
{
}
@@ -44,8 +61,8 @@ void EventQueue::enqueueEvent(PassRefPtr<Event> event)
ASSERT(event->target()->toNode() || event->target()->toDOMWindow());
m_queuedEvents.append(event);
- if (!m_pendingEventTimer.isActive())
- m_pendingEventTimer.startOneShot(0);
+ if (!m_pendingEventTimer->isActive())
+ m_pendingEventTimer->startOneShot(0);
}
void EventQueue::enqueueScrollEvent(PassRefPtr<Node> target, ScrollEventTargetType targetType)
@@ -60,9 +77,9 @@ void EventQueue::enqueueScrollEvent(PassRefPtr<Node> target, ScrollEventTargetTy
enqueueEvent(scrollEvent.release());
}
-void EventQueue::pendingEventTimerFired(Timer<EventQueue>*)
+void EventQueue::pendingEventTimerFired()
{
- ASSERT(!m_pendingEventTimer.isActive());
+ ASSERT(!m_pendingEventTimer->isActive());
Vector<RefPtr<Event> > queuedEvents;
queuedEvents.swap(m_queuedEvents);
diff --git a/Source/WebCore/dom/EventQueue.h b/Source/WebCore/dom/EventQueue.h
index 7f8d5fb..a589ed8 100644
--- a/Source/WebCore/dom/EventQueue.h
+++ b/Source/WebCore/dom/EventQueue.h
@@ -27,38 +27,51 @@
#ifndef EventQueue_h
#define EventQueue_h
-#include "Timer.h"
#include <wtf/HashSet.h>
#include <wtf/Noncopyable.h>
+#include <wtf/OwnPtr.h>
+#include <wtf/PassOwnPtr.h>
#include <wtf/RefPtr.h>
#include <wtf/Vector.h>
namespace WebCore {
class Event;
+class EventQueueTimer;
class Node;
+class ScriptExecutionContext;
class EventQueue {
WTF_MAKE_NONCOPYABLE(EventQueue);
+
public:
enum ScrollEventTargetType {
ScrollEventDocumentTarget,
ScrollEventElementTarget
};
- EventQueue();
+ static PassOwnPtr<EventQueue> create(ScriptExecutionContext* context)
+ {
+ return adoptPtr(new EventQueue(context));
+ }
+
+ ~EventQueue();
void enqueueEvent(PassRefPtr<Event>);
void enqueueScrollEvent(PassRefPtr<Node>, ScrollEventTargetType);
private:
- void pendingEventTimerFired(Timer<EventQueue>*);
+ explicit EventQueue(ScriptExecutionContext*);
+
+ void pendingEventTimerFired();
void dispatchEvent(PassRefPtr<Event>);
- Timer<EventQueue> m_pendingEventTimer;
+ OwnPtr<EventQueueTimer> m_pendingEventTimer;
Vector<RefPtr<Event> > m_queuedEvents;
HashSet<Node*> m_nodesWithQueuedScrollEvents;
+
+ friend class EventQueueTimer;
};
}
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list