Changeset 77355
- Timestamp:
- 02/01/11 18:39:31 (22 months ago)
- Author:
- mihaip@chromium.org
- Message:
-
2011-02-01 Mihai Parparita <mihaip@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@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):
- page/SuspendableTimer.cpp: (WebCore::SuspendableTimer::SuspendableTimer): (WebCore::SuspendableTimer::suspend): (WebCore::SuspendableTimer::resume):
- page/SuspendableTimer.h:
- Location:
- trunk
- Files:
-
- 2 added
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r77347 r77355 1 2011-02-01 Mihai Parparita <mihaip@chromium.org> 2 3 Reviewed by James Robinson. 4 5 Async event handlers should not fire within a modal dialog 6 https://bugs.webkit.org/show_bug.cgi?id=53202 7 8 Add tests for a scroll event triggered right before a modal dialog is 9 shown. 10 11 * fast/events/scroll-event-during-modal-dialog-expected.txt: Added. 12 * fast/events/scroll-event-during-modal-dialog.html: Added. 13 1 14 2011-02-01 Kent Tamura <tkent@chromium.org> 2 15 -
trunk/Source/WebCore/ChangeLog
r77351 r77355 1 2011-02-01 Mihai Parparita <mihaip@chromium.org> 2 3 Reviewed by James Robinson. 4 5 Async event handlers should not fire within a modal dialog 6 https://bugs.webkit.org/show_bug.cgi?id=53202 7 8 Asychronous events that use EventQueue would currently fire while a 9 modal dialog (e.g. window.alert()) was up. Change EventQueue to use a 10 SuspendableTimer (which automatically gets suspended while dialogs are 11 up and in other cases where JS execution is not allowed). 12 13 Test: fast/events/scroll-event-during-modal-dialog.html 14 15 * dom/Document.cpp: 16 (WebCore::Document::Document): 17 * dom/EventQueue.cpp: 18 (WebCore::EventQueueTimer::EventQueueTimer): 19 (WebCore::EventQueueTimer::fired): 20 (WebCore::EventQueue::EventQueue): 21 (WebCore::EventQueue::enqueueEvent): 22 (WebCore::EventQueue::pendingEventTimerFired): 23 * dom/EventQueue.h: 24 (WebCore::EventQueue::create): 25 * page/SuspendableTimer.cpp: 26 (WebCore::SuspendableTimer::SuspendableTimer): 27 (WebCore::SuspendableTimer::suspend): 28 (WebCore::SuspendableTimer::resume): 29 * page/SuspendableTimer.h: 30 1 31 2011-02-01 Patrick Gansterer <paroga@webkit.org> 2 32 -
trunk/Source/WebCore/dom/Document.cpp
r77333 r77355 412 412 #endif 413 413 , m_usingGeolocation(false) 414 , m_eventQueue( adoptPtr(new EventQueue))414 , m_eventQueue(EventQueue::create(this)) 415 415 #if ENABLE(WML) 416 416 , m_containsWMLContent(false) -
trunk/Source/WebCore/dom/EventQueue.cpp
r77241 r77355 29 29 30 30 #include "DOMWindow.h" 31 #include "Document.h"32 31 #include "Event.h" 33 32 #include "EventNames.h" 33 #include "ScriptExecutionContext.h" 34 #include "SuspendableTimer.h" 34 35 35 36 namespace WebCore { 36 37 37 EventQueue::EventQueue() 38 : m_pendingEventTimer(this, &EventQueue::pendingEventTimerFired) 38 class EventQueueTimer : public SuspendableTimer { 39 WTF_MAKE_NONCOPYABLE(EventQueueTimer); 40 public: 41 EventQueueTimer(EventQueue* eventQueue, ScriptExecutionContext* context) 42 : SuspendableTimer(context) 43 , m_eventQueue(eventQueue) { } 44 45 private: 46 virtual void fired() { m_eventQueue->pendingEventTimerFired(); } 47 EventQueue* m_eventQueue; 48 }; 49 50 EventQueue::EventQueue(ScriptExecutionContext* context) 51 : m_pendingEventTimer(adoptPtr(new EventQueueTimer(this, context))) 52 { 53 } 54 55 EventQueue::~EventQueue() 39 56 { 40 57 } … … 45 62 m_queuedEvents.append(event); 46 63 47 if (!m_pendingEventTimer .isActive())48 m_pendingEventTimer .startOneShot(0);64 if (!m_pendingEventTimer->isActive()) 65 m_pendingEventTimer->startOneShot(0); 49 66 } 50 67 … … 61 78 } 62 79 63 void EventQueue::pendingEventTimerFired( Timer<EventQueue>*)80 void EventQueue::pendingEventTimerFired() 64 81 { 65 ASSERT(!m_pendingEventTimer .isActive());82 ASSERT(!m_pendingEventTimer->isActive()); 66 83 67 84 Vector<RefPtr<Event> > queuedEvents; -
trunk/Source/WebCore/dom/EventQueue.h
r77241 r77355 28 28 #define EventQueue_h 29 29 30 #include "Timer.h"31 30 #include <wtf/HashSet.h> 32 31 #include <wtf/Noncopyable.h> 32 #include <wtf/OwnPtr.h> 33 #include <wtf/PassOwnPtr.h> 33 34 #include <wtf/RefPtr.h> 34 35 #include <wtf/Vector.h> … … 37 38 38 39 class Event; 40 class EventQueueTimer; 39 41 class Node; 42 class ScriptExecutionContext; 40 43 41 44 class EventQueue { 42 45 WTF_MAKE_NONCOPYABLE(EventQueue); 43 46 47 44 48 public: 45 49 enum ScrollEventTargetType { … … 48 52 }; 49 53 50 EventQueue(); 54 static PassOwnPtr<EventQueue> create(ScriptExecutionContext* context) 55 { 56 return adoptPtr(new EventQueue(context)); 57 } 58 59 ~EventQueue(); 51 60 52 61 void enqueueEvent(PassRefPtr<Event>); … … 54 63 55 64 private: 56 void pendingEventTimerFired(Timer<EventQueue>*); 65 explicit EventQueue(ScriptExecutionContext*); 66 67 void pendingEventTimerFired(); 57 68 void dispatchEvent(PassRefPtr<Event>); 58 69 59 Timer<EventQueue> m_pendingEventTimer;70 OwnPtr<EventQueueTimer> m_pendingEventTimer; 60 71 Vector<RefPtr<Event> > m_queuedEvents; 61 72 HashSet<Node*> m_nodesWithQueuedScrollEvents; 73 74 friend class EventQueueTimer; 62 75 }; 63 76 -
trunk/Source/WebCore/page/SuspendableTimer.cpp