Changeset 155356 in webkit
- Timestamp:
- Sep 9, 2013 9:58:20 AM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 27 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r155354 r155356 1 2013-09-08 Darin Adler <darin@apple.com> 2 3 Tighten up EventQueue classes a bit, less indirection and memory allocation 4 https://bugs.webkit.org/show_bug.cgi?id=121016 5 6 Reviewed by Andreas Kling. 7 8 * Modules/encryptedmedia/MediaKeySession.cpp: 9 (WebCore::MediaKeySession::MediaKeySession): Updated since event queue is now 10 a member rather than an OwnPtr. 11 (WebCore::MediaKeySession::close): Ditto. 12 (WebCore::MediaKeySession::keyRequestTimerFired): Ditto. 13 (WebCore::MediaKeySession::addKeyTimerFired): Ditto. 14 * Modules/encryptedmedia/MediaKeySession.h: Ditto. 15 16 * Modules/indexeddb/IDBDatabase.cpp: 17 (WebCore::IDBDatabase::closeConnection): Updated since ScriptExecutionContext's 18 eventQueue function now returns a reference rather than a pointer. Also, the 19 cancelEvent function takes a reference instead of a pointer. 20 (WebCore::IDBDatabase::enqueueEvent): Ditto. 21 * Modules/indexeddb/IDBRequest.cpp: 22 (WebCore::IDBRequest::abort): Ditto. 23 (WebCore::IDBRequest::enqueueEvent): Ditto. 24 * Modules/indexeddb/IDBTransaction.cpp: 25 (WebCore::IDBTransaction::enqueueEvent): Ditto. 26 27 * Modules/mediasource/MediaSource.cpp: 28 (WebCore::MediaSource::MediaSource): Updated since event queue is now a 29 member rather than an OwnPtr. Also use initialization instead of assignment 30 to set up source buffers. 31 (WebCore::MediaSource::hasPendingActivity): Ditto. 32 (WebCore::MediaSource::stop): Ditto. 33 (WebCore::MediaSource::scheduleEvent): Ditto. 34 * Modules/mediasource/MediaSource.h: Ditto. 35 36 * Modules/mediasource/SourceBufferList.cpp: 37 (WebCore::SourceBufferList::SourceBufferList): Take references instead of 38 pointers. 39 (WebCore::SourceBufferList::length): Changed type to unsigned instead of 40 unsigned long. This is an IDL "unsigned long", which corresponds to "unsigned" 41 in our C++ DOM implementation. 42 (WebCore::SourceBufferList::createAndFireEvent): Updated since event queue is 43 now a reference. 44 (WebCore::SourceBufferList::scriptExecutionContext): Updated since script 45 execution context is now a reference. 46 * Modules/mediasource/SourceBufferList.h: Ditto. 47 48 * dom/Document.cpp: 49 (WebCore::Document::Document): Updated since event queue is now a member rather 50 than a RefPtr. 51 (WebCore::Document::detach): Ditto. 52 (WebCore::Document::enqueueWindowEvent): Ditto. 53 (WebCore::Document::enqueueDocumentEvent): Ditto. 54 * dom/Document.h: Ditto. 55 56 * dom/DocumentEventQueue.cpp: Renamed DocumentEventQueueTimer to just Timer and 57 made it a class member of DocumentEventQueue. Also changed it to use references 58 instead of pointers and removed unneeded ScriptExecutionContext argument. 59 (WebCore::DocumentEventQueue::DocumentEventQueue): Updated to take a document 60 reference instead of a script execution context pointer. 61 (WebCore::DocumentEventQueue::enqueueEvent): Wrote the assertions in a clearer 62 style and do the assertions even when the queue is closed. 63 (WebCore::DocumentEventQueue::enqueueOrDispatchScrollEvent): Removed the unneeded 64 ScrollEventTargetType argument, since the policy is specific to the document node. 65 Made the argument a reference instead of a PassRefPtr, and rewrote the function 66 to be more straightforward and readable. 67 (WebCore::DocumentEventQueue::cancelEvent): Use the return value recently added to 68 the remove function to avoid the need for use of iterators and a find/remove pair. 69 (WebCore::DocumentEventQueue::pendingEventTimerFired): Rewrote this to use the 70 recently added ListHashSet takeFirst function. Also protect the document instead 71 of protecting just this object during the dispatch. Can't really protect the 72 event queue since it's no longer separately reference counted. 73 (WebCore::DocumentEventQueue::dispatchEvent): Changed this to take a reference and 74 added a FIXME about some curious code in here that needs a "why" comment. 75 * dom/DocumentEventQueue.h: Removed many unneeded includes, some unneeded forward 76 declarations, marked the class final, made it no longer derive from RefCounted, 77 removed ScrollEventTargetType and create, and did the other changes mentioned above. 78 79 * dom/EventQueue.h: Got rid of many uneeded includes, changed the argument type 80 of cancelEvent to Event& and rewrote the comment for close. 81 82 * dom/GenericEventQueue.cpp: 83 (WebCore::GenericEventQueue::GenericEventQueue): Updated to take a reference. 84 (WebCore::GenericEventQueue::enqueueEvent): Ditto. 85 (WebCore::GenericEventQueue::timerFired): Ditto. 86 * dom/GenericEventQueue.h: Changed this class to no longer derive from EventQueue 87 since there was no value coming from that polymorphism. Removed all the virtual 88 keywords from the class. Switched from pointers to references. Removed the unused 89 cancelEvent function. Removed the create function since this is always used as a 90 data member, not a pointer on the heap. 91 92 * dom/ScriptExecutionContext.h: Changed the return type of eventQueue to a reference. 93 94 * html/HTMLMediaElement.cpp: 95 (WebCore::HTMLMediaElement::HTMLMediaElement): Updated since event queue is now a 96 member rather than an OwnPtr. 97 (WebCore::HTMLMediaElement::~HTMLMediaElement): Ditto. 98 (WebCore::HTMLMediaElement::scheduleEvent): Ditto. 99 (WebCore::HTMLMediaElement::updateActiveTextTrackCues): Ditto. 100 (WebCore::HTMLMediaElement::cancelPendingEventsAndCallbacks): Ditto. 101 (WebCore::HTMLMediaElement::mediaPlayerKeyAdded): Ditto. 102 (WebCore::HTMLMediaElement::mediaPlayerKeyError): Ditto. 103 (WebCore::HTMLMediaElement::mediaPlayerKeyMessage): Ditto. 104 (WebCore::HTMLMediaElement::mediaPlayerKeyNeeded): Ditto. 105 (WebCore::HTMLMediaElement::stop): Ditto. 106 (WebCore::HTMLMediaElement::hasPendingActivity): Ditto. 107 * html/HTMLMediaElement.h: Ditto. 108 109 * page/EventHandler.cpp: 110 (WebCore::EventHandler::sendScrollEvent): Updated to remove the now-uneeded 111 ScrollEventTargetType argument, and also to use references instead of pointers. 112 * rendering/RenderLayer.cpp: 113 (WebCore::RenderLayer::scrollTo): Ditto. 114 * rendering/RenderListBox.cpp: 115 (WebCore::RenderListBox::scrollTo): Ditto. 116 117 * workers/WorkerEventQueue.cpp: 118 (WebCore::WorkerEventQueue::WorkerEventQueue): Updated to work with references 119 instead of pointers. 120 (WebCore::WorkerEventQueue::enqueueEvent): Ditto. 121 (WebCore::WorkerEventQueue::cancelEvent): Use the take function instead of a 122 get/remove pair, to eliminate double hashing. 123 * workers/WorkerEventQueue.h: Removed unneeded includes, forward declarations, 124 the create function, and the private removeEvent function. Marked class final. 125 126 * workers/WorkerGlobalScope.cpp: 127 (WebCore::WorkerGlobalScope::WorkerGlobalScope): Updated since eventQueue is 128 now a data member. 129 (WebCore::WorkerGlobalScope::eventQueue): Ditto. 130 * workers/WorkerGlobalScope.h: Made m_eventQueue a queue instead of a pointer 131 to a queue. Also made the eventQueue function private and final. 132 1 133 2013-09-09 Hans Muller <hmuller@adobe.com> 2 134 -
trunk/Source/WebCore/Modules/encryptedmedia/MediaKeySession.cpp
r142918 r155356 47 47 , m_keys(keys) 48 48 , m_keySystem(keySystem) 49 , m_asyncEventQueue( GenericEventQueue::create(this))49 , m_asyncEventQueue(*this) 50 50 , m_session(keys->cdm()->createSession()) 51 51 , m_keyRequestTimer(this, &MediaKeySession::keyRequestTimerFired) … … 69 69 m_session->releaseKeys(); 70 70 m_session = 0; 71 m_asyncEventQueue ->cancelAllEvents();71 m_asyncEventQueue.cancelAllEvents(); 72 72 } 73 73 … … 118 118 RefPtr<Event> event = Event::create(eventNames().webkitkeyerrorEvent, false, false); 119 119 event->setTarget(this); 120 m_asyncEventQueue ->enqueueEvent(event.release());120 m_asyncEventQueue.enqueueEvent(event.release()); 121 121 122 122 // 3.4. Abort the task. … … 135 135 RefPtr<MediaKeyMessageEvent> event = MediaKeyMessageEvent::create(eventNames().webkitkeymessageEvent, init); 136 136 event->setTarget(this); 137 m_asyncEventQueue ->enqueueEvent(event);137 m_asyncEventQueue.enqueueEvent(event.release()); 138 138 } 139 139 } … … 189 189 RefPtr<MediaKeyMessageEvent> event = MediaKeyMessageEvent::create(eventNames().webkitkeymessageEvent, init); 190 190 event->setTarget(this); 191 m_asyncEventQueue ->enqueueEvent(event);191 m_asyncEventQueue.enqueueEvent(event.release()); 192 192 } 193 193 … … 196 196 RefPtr<Event> keyaddedEvent = Event::create(eventNames().webkitkeyaddedEvent, false, false); 197 197 keyaddedEvent->setTarget(this); 198 m_asyncEventQueue ->enqueueEvent(keyaddedEvent);198 m_asyncEventQueue.enqueueEvent(keyaddedEvent.release()); 199 199 } 200 200 … … 212 212 RefPtr<Event> keyerrorEvent = Event::create(eventNames().webkitkeyerrorEvent, false, false); 213 213 keyerrorEvent->setTarget(this); 214 m_asyncEventQueue ->enqueueEvent(keyerrorEvent.release());214 m_asyncEventQueue.enqueueEvent(keyerrorEvent.release()); 215 215 216 216 // 2.8.4. Abort the task. -
trunk/Source/WebCore/Modules/encryptedmedia/MediaKeySession.h
r153926 r155356 85 85 String m_sessionId; 86 86 RefPtr<MediaKeyError> m_error; 87 OwnPtr<GenericEventQueue>m_asyncEventQueue;87 GenericEventQueue m_asyncEventQueue; 88 88 OwnPtr<CDMSession> m_session; 89 89 -
trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.cpp
r153926 r155356 293 293 return; 294 294 295 EventQueue *eventQueue = scriptExecutionContext()->eventQueue();295 EventQueue& eventQueue = scriptExecutionContext()->eventQueue(); 296 296 // Remove any pending versionchange events scheduled to fire on this 297 297 // connection. They would have been scheduled by the backend when another … … 299 299 // closed before they could fire. 300 300 for (size_t i = 0; i < m_enqueuedEvents.size(); ++i) { 301 bool removed = eventQueue ->cancelEvent(m_enqueuedEvents[i].get());301 bool removed = eventQueue.cancelEvent(*m_enqueuedEvents[i]); 302 302 ASSERT_UNUSED(removed, removed); 303 303 } … … 321 321 ASSERT(!m_contextStopped); 322 322 ASSERT(scriptExecutionContext()); 323 EventQueue* eventQueue = scriptExecutionContext()->eventQueue();324 323 event->setTarget(this); 325 eventQueue->enqueueEvent(event.get());324 scriptExecutionContext()->eventQueue().enqueueEvent(event.get()); 326 325 m_enqueuedEvents.append(event); 327 326 } -
trunk/Source/WebCore/Modules/indexeddb/IDBRequest.cpp
r153926 r155356 172 172 RefPtr<IDBRequest> self(this); 173 173 174 EventQueue *eventQueue = scriptExecutionContext()->eventQueue();174 EventQueue& eventQueue = scriptExecutionContext()->eventQueue(); 175 175 for (size_t i = 0; i < m_enqueuedEvents.size(); ++i) { 176 bool removed = eventQueue ->cancelEvent(m_enqueuedEvents[i].get());176 bool removed = eventQueue.cancelEvent(*m_enqueuedEvents[i]); 177 177 ASSERT_UNUSED(removed, removed); 178 178 } … … 553 553 ASSERT_WITH_MESSAGE(m_readyState == PENDING || m_didFireUpgradeNeededEvent, "When queueing event %s, m_readyState was %d", event->type().string().utf8().data(), m_readyState); 554 554 555 EventQueue* eventQueue = scriptExecutionContext()->eventQueue();556 555 event->setTarget(this); 557 556 558 if ( eventQueue->enqueueEvent(event.get()))557 if (scriptExecutionContext()->eventQueue().enqueueEvent(event.get())) 559 558 m_enqueuedEvents.append(event); 560 559 } -
trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp
r153926 r155356 433 433 return; 434 434 435 EventQueue* eventQueue = scriptExecutionContext()->eventQueue();436 435 event->setTarget(this); 437 eventQueue->enqueueEvent(event);436 scriptExecutionContext()->eventQueue().enqueueEvent(event); 438 437 } 439 438 -
trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp
r153926 r155356 53 53 : ActiveDOMObject(context) 54 54 , m_readyState(closedKeyword()) 55 , m_asyncEventQueue( GenericEventQueue::create(this))56 { 57 m_sourceBuffers = SourceBufferList::create(scriptExecutionContext(), m_asyncEventQueue.get());58 m_activeSourceBuffers = SourceBufferList::create(scriptExecutionContext(), m_asyncEventQueue.get()); 55 , m_asyncEventQueue(*this) 56 , m_sourceBuffers(SourceBufferList::create(scriptExecutionContext(), m_asyncEventQueue)) 57 , m_activeSourceBuffers(SourceBufferList::create(scriptExecutionContext(), m_asyncEventQueue)) 58 { 59 59 } 60 60 … … 303 303 bool MediaSource::hasPendingActivity() const 304 304 { 305 return m_private || m_asyncEventQueue->hasPendingEvents() 306 || ActiveDOMObject::hasPendingActivity(); 305 return m_private || m_asyncEventQueue.hasPendingEvents() || ActiveDOMObject::hasPendingActivity(); 307 306 } 308 307 … … 310 309 { 311 310 m_private.clear(); 312 m_asyncEventQueue ->cancelAllEvents();311 m_asyncEventQueue.cancelAllEvents(); 313 312 } 314 313 … … 325 324 void MediaSource::scheduleEvent(const AtomicString& eventName) 326 325 { 327 ASSERT(m_asyncEventQueue);328 329 326 RefPtr<Event> event = Event::create(eventName, false, false); 330 327 event->setTarget(this); 331 332 m_asyncEventQueue->enqueueEvent(event.release()); 328 m_asyncEventQueue.enqueueEvent(event.release()); 333 329 } 334 330 -
trunk/Source/WebCore/Modules/mediasource/MediaSource.h
r153926 r155356 95 95 OwnPtr<MediaSourcePrivate> m_private; 96 96 97 GenericEventQueue m_asyncEventQueue; 97 98 RefPtr<SourceBufferList> m_sourceBuffers; 98 99 RefPtr<SourceBufferList> m_activeSourceBuffers; 99 OwnPtr<GenericEventQueue> m_asyncEventQueue;100 100 }; 101 101 -
trunk/Source/WebCore/Modules/mediasource/SourceBufferList.cpp
r153926 r155356 40 40 namespace WebCore { 41 41 42 SourceBufferList::SourceBufferList(ScriptExecutionContext* context, 43 GenericEventQueue* asyncEventQueue) 42 SourceBufferList::SourceBufferList(ScriptExecutionContext& context, GenericEventQueue& asyncEventQueue) 44 43 : m_scriptExecutionContext(context) 45 44 , m_asyncEventQueue(asyncEventQueue) … … 47 46 } 48 47 49 unsigned longSourceBufferList::length() const48 unsigned SourceBufferList::length() const 50 49 { 51 50 return m_list.size(); … … 87 86 void SourceBufferList::createAndFireEvent(const AtomicString& eventName) 88 87 { 89 ASSERT(m_asyncEventQueue);90 91 88 RefPtr<Event> event = Event::create(eventName, false, false); 92 89 event->setTarget(this); 93 94 m_asyncEventQueue->enqueueEvent(event.release()); 90 m_asyncEventQueue.enqueueEvent(event.release()); 95 91 } 96 92 … … 102 98 ScriptExecutionContext* SourceBufferList::scriptExecutionContext() const 103 99 { 104 return m_scriptExecutionContext;100 return &m_scriptExecutionContext; 105 101 } 106 102 -
trunk/Source/WebCore/Modules/mediasource/SourceBufferList.h
r153926 r155356 45 45 class SourceBufferList : public RefCounted<SourceBufferList>, public EventTarget { 46 46 public: 47 static PassRefPtr<SourceBufferList> create(ScriptExecutionContext * context, GenericEventQueue*asyncEventQueue)47 static PassRefPtr<SourceBufferList> create(ScriptExecutionContext& context, GenericEventQueue& asyncEventQueue) 48 48 { 49 49 return adoptRef(new SourceBufferList(context, asyncEventQueue)); … … 51 51 virtual ~SourceBufferList() { } 52 52 53 unsigned l ong length() const;53 unsigned length() const; 54 54 SourceBuffer* item(unsigned index) const; 55 55 … … 78 78 79 79 EventTargetData m_eventTargetData; 80 ScriptExecutionContext *m_scriptExecutionContext;81 GenericEventQueue *m_asyncEventQueue;80 ScriptExecutionContext& m_scriptExecutionContext; 81 GenericEventQueue& m_asyncEventQueue; 82 82 83 83 Vector<RefPtr<SourceBuffer> > m_list; -
trunk/Source/WebCore/dom/Document.cpp
r155351 r155356 449 449 , m_isSrcdocDocument(false) 450 450 , m_renderView(0) 451 , m_eventQueue( DocumentEventQueue::create(this))451 , m_eventQueue(*this) 452 452 , m_weakFactory(this) 453 453 , m_idAttributeName(idAttr) … … 2058 2058 2059 2059 stopActiveDOMObjects(); 2060 m_eventQueue ->close();2060 m_eventQueue.close(); 2061 2061 #if ENABLE(FULLSCREEN_API) 2062 2062 m_fullScreenChangeEventTargetQueue.clear(); … … 3631 3631 { 3632 3632 event->setTarget(domWindow()); 3633 m_eventQueue ->enqueueEvent(event);3633 m_eventQueue.enqueueEvent(event); 3634 3634 } 3635 3635 … … 3637 3637 { 3638 3638 event->setTarget(this); 3639 m_eventQueue ->enqueueEvent(event);3639 m_eventQueue.enqueueEvent(event); 3640 3640 } 3641 3641 -
trunk/Source/WebCore/dom/Document.h
r155344 r155356 1011 1011 void enqueueHashchangeEvent(const String& oldURL, const String& newURL); 1012 1012 void enqueuePopstateEvent(PassRefPtr<SerializedScriptValue> stateObject); 1013 virtual DocumentEventQueue* eventQueue() const { return m_eventQueue.get(); }1013 DocumentEventQueue& eventQueue() const { return m_eventQueue; } 1014 1014 1015 1015 void addMediaCanStartListener(MediaCanStartListener*); … … 1448 1448 1449 1449 RenderView* m_renderView; 1450 RefPtr<DocumentEventQueue>m_eventQueue;1450 mutable DocumentEventQueue m_eventQueue; 1451 1451 1452 1452 WeakPtrFactory<Document> m_weakFactory; -
trunk/Source/WebCore/dom/DocumentEventQueue.cpp
r154962 r155356 1 1 /* 2 2 * Copyright (C) 2010 Google Inc. All Rights Reserved. 3 * Copyright (C) 2013 Apple Inc. All Rights Reserved. 3 4 * 4 5 * Redistribution and use in source and binary forms, with or without … … 32 33 #include "Event.h" 33 34 #include "EventNames.h" 34 #include "RuntimeApplicationChecks.h"35 #include "ScriptExecutionContext.h"36 35 #include "SuspendableTimer.h" 37 36 #include <wtf/Ref.h> … … 39 38 namespace WebCore { 40 39 41 class DocumentEventQueue Timer FINAL : public SuspendableTimer {40 class DocumentEventQueue::Timer FINAL : public SuspendableTimer { 42 41 public: 43 static PassOwnPtr< DocumentEventQueueTimer> create(DocumentEventQueue* eventQueue, ScriptExecutionContext* context)42 static PassOwnPtr<Timer> create(DocumentEventQueue& eventQueue) 44 43 { 45 return adoptPtr(new DocumentEventQueueTimer(eventQueue, context));44 return adoptPtr(new Timer(eventQueue)); 46 45 } 47 46 48 47 private: 49 DocumentEventQueueTimer(DocumentEventQueue* eventQueue, ScriptExecutionContext* context) 50 : SuspendableTimer(context) 51 , m_eventQueue(eventQueue) { } 48 Timer(DocumentEventQueue& eventQueue) 49 : SuspendableTimer(&eventQueue.m_document) 50 , m_eventQueue(eventQueue) 51 { 52 } 52 53 53 54 virtual void fired() OVERRIDE 54 55 { 55 56 ASSERT(!isSuspended()); 56 m_eventQueue ->pendingEventTimerFired();57 m_eventQueue.pendingEventTimerFired(); 57 58 } 58 59 59 DocumentEventQueue *m_eventQueue;60 DocumentEventQueue& m_eventQueue; 60 61 }; 61 62 62 PassRefPtr<DocumentEventQueue> DocumentEventQueue::create(ScriptExecutionContext* context) 63 { 64 return adoptRef(new DocumentEventQueue(context)); 65 } 66 67 DocumentEventQueue::DocumentEventQueue(ScriptExecutionContext* context) 68 : m_pendingEventTimer(DocumentEventQueueTimer::create(this, context)) 63 DocumentEventQueue::DocumentEventQueue(Document& document) 64 : m_document(document) 65 , m_pendingEventTimer(Timer::create(*this)) 69 66 , m_isClosed(false) 70 67 { … … 78 75 bool DocumentEventQueue::enqueueEvent(PassRefPtr<Event> event) 79 76 { 77 ASSERT(event->target()); 78 ASSERT(!m_queuedEvents.contains(event.get())); 79 80 80 if (m_isClosed) 81 81 return false; 82 82 83 ASSERT(event->target()); 84 bool wasAdded = m_queuedEvents.add(event).isNewEntry; 85 ASSERT_UNUSED(wasAdded, wasAdded); // It should not have already been in the list. 86 83 m_queuedEvents.add(event); 87 84 if (!m_pendingEventTimer->isActive()) 88 85 m_pendingEventTimer->startOneShot(0); 89 90 86 return true; 91 87 } 92 88 93 void DocumentEventQueue::enqueueOrDispatchScrollEvent( PassRefPtr<Node> target, ScrollEventTargetType targetType)89 void DocumentEventQueue::enqueueOrDispatchScrollEvent(Node& target) 94 90 { 95 if (!target->document().hasListenerType(Document::SCROLL_LISTENER)) 91 ASSERT(&target.document() == &m_document); 92 93 if (m_isClosed) 94 return; 95 96 if (!m_document.hasListenerType(Document::SCROLL_LISTENER)) 97 return; 98 99 if (!m_nodesWithQueuedScrollEvents.add(&target).isNewEntry) 96 100 return; 97 101 98 102 // Per the W3C CSSOM View Module, scroll events fired at the document should bubble, others should not. 99 bool canBubble = targetType == ScrollEventDocumentTarget; 100 RefPtr<Event> scrollEvent = Event::create(eventNames().scrollEvent, canBubble, false /* non cancelleable */); 101 102 if (!m_nodesWithQueuedScrollEvents.add(target.get()).isNewEntry) 103 return; 103 bool bubbles = target.isDocumentNode(); 104 bool cancelable = false; 104 105 105 scrollEvent->setTarget(target); 106 RefPtr<Event> scrollEvent = Event::create(eventNames().scrollEvent, bubbles, cancelable); 107 scrollEvent->setTarget(&target); 106 108 enqueueEvent(scrollEvent.release()); 107 109 } 108 110 109 bool DocumentEventQueue::cancelEvent(Event *event)111 bool DocumentEventQueue::cancelEvent(Event& event) 110 112 { 111 ListHashSet<RefPtr<Event>, 16>::iterator it = m_queuedEvents.find(event); 112 bool found = it != m_queuedEvents.end(); 113 if (found) 114 m_queuedEvents.remove(it); 113 bool found = m_queuedEvents.remove(&event); 115 114 if (m_queuedEvents.isEmpty()) 116 115 m_pendingEventTimer->cancel(); … … 133 132 134 133 // Insert a marker for where we should stop. 135 ASSERT(!m_queuedEvents.contains(0)); 136 bool wasAdded = m_queuedEvents.add(0).isNewEntry; 137 ASSERT_UNUSED(wasAdded, wasAdded); // It should not have already been in the list. 134 ASSERT(!m_queuedEvents.contains(nullptr)); 135 m_queuedEvents.add(nullptr); 138 136 139 Ref<Document EventQueue> protect(*this);137 Ref<Document> protect(m_document); 140 138 141 139 while (!m_queuedEvents.isEmpty()) { 142 ListHashSet<RefPtr<Event>, 16>::iterator iter = m_queuedEvents.begin(); 143 RefPtr<Event> event = *iter; 144 m_queuedEvents.remove(iter); 140 RefPtr<Event> event = m_queuedEvents.takeFirst(); 145 141 if (!event) 146 142 break; 147 dispatchEvent( event.get());143 dispatchEvent(*event); 148 144 } 149 145 } 150 146 151 void DocumentEventQueue::dispatchEvent( PassRefPtr<Event>event)147 void DocumentEventQueue::dispatchEvent(Event& event) 152 148 { 153 EventTarget* eventTarget = event->target(); 154 if (eventTarget->toDOMWindow()) 155 eventTarget->toDOMWindow()->dispatchEvent(event, 0); 149 // FIXME: Where did this special case for the DOM window come from? 150 // Why do we have this special case here instead of a virtual function on EventTarget? 151 EventTarget& eventTarget = *event.target(); 152 if (DOMWindow* window = eventTarget.toDOMWindow()) 153 window->dispatchEvent(&event, 0); 156 154 else 157 eventTarget ->dispatchEvent(event);155 eventTarget.dispatchEvent(&event); 158 156 } 159 157 -
trunk/Source/WebCore/dom/DocumentEventQueue.h
r148921 r155356 1 1 /* 2 2 * Copyright (C) 2010 Google Inc. All Rights Reserved. 3 * Copyright (C) 2013 Apple Inc. All Rights Reserved. 3 4 * 4 5 * Redistribution and use in source and binary forms, with or without … … 29 30 30 31 #include "EventQueue.h" 31 #include <wtf/Forward.h>32 32 #include <wtf/HashSet.h> 33 33 #include <wtf/ListHashSet.h> 34 34 #include <wtf/OwnPtr.h> 35 #include <wtf/RefCounted.h>36 #include <wtf/RefPtr.h>37 35 38 36 namespace WebCore { 39 37 38 class Document; 40 39 class Event; 41 class DocumentEventQueueTimer;42 40 class Node; 43 class ScriptExecutionContext;44 41 45 class DocumentEventQueue : public RefCounted<DocumentEventQueue>,public EventQueue {42 class DocumentEventQueue FINAL : public EventQueue { 46 43 public: 47 enum ScrollEventTargetType { 48 ScrollEventDocumentTarget, 49 ScrollEventElementTarget 50 }; 44 explicit DocumentEventQueue(Document&); 45 ~DocumentEventQueue(); 51 46 52 static PassRefPtr<DocumentEventQueue> create(ScriptExecutionContext*);53 virtual ~DocumentEventQueue();54 55 // EventQueue56 47 virtual bool enqueueEvent(PassRefPtr<Event>) OVERRIDE; 57 virtual bool cancelEvent(Event *) OVERRIDE;48 virtual bool cancelEvent(Event&) OVERRIDE; 58 49 virtual void close() OVERRIDE; 59 50 60 void enqueueOrDispatchScrollEvent( PassRefPtr<Node>, ScrollEventTargetType);51 void enqueueOrDispatchScrollEvent(Node&); 61 52 62 53 private: 63 explicit DocumentEventQueue(ScriptExecutionContext*); 54 void pendingEventTimerFired(); 55 void dispatchEvent(Event&); 64 56 65 void pendingEventTimerFired(); 66 void dispatchEvent(PassRefPtr<Event>); 57 class Timer; 67 58 68 OwnPtr<DocumentEventQueueTimer> m_pendingEventTimer; 59 Document& m_document; 60 OwnPtr<Timer> m_pendingEventTimer; 69 61 ListHashSet<RefPtr<Event>, 16> m_queuedEvents; 70 62 HashSet<Node*> m_nodesWithQueuedScrollEvents; 71 63 bool m_isClosed; 72 73 friend class DocumentEventQueueTimer;74 64 }; 75 65 -
trunk/Source/WebCore/dom/EventQueue.h
r100959 r155356 28 28 #define EventQueue_h 29 29 30 #include <wtf/HashMap.h> 31 #include <wtf/HashSet.h> 32 #include <wtf/PassOwnPtr.h> 30 #include <wtf/Forward.h> 33 31 34 32 namespace WebCore { … … 40 38 virtual ~EventQueue() { } 41 39 virtual bool enqueueEvent(PassRefPtr<Event>) = 0; 42 virtual bool cancelEvent(Event*) = 0; 43 // The accumulated and all the future events will be discarded, no events will be dispatched anymore. 44 virtual void close() = 0; 40 virtual bool cancelEvent(Event&) = 0; 41 virtual void close() = 0; // Discard accumulated events and all future events. No events will be dispatched after this. 45 42 }; 46 43 -
trunk/Source/WebCore/dom/GenericEventQueue.cpp
r151600 r155356 25 25 26 26 #include "config.h" 27 28 27 #include "GenericEventQueue.h" 29 28 30 29 #include "Event.h" 30 #include "EventTarget.h" 31 31 32 32 namespace WebCore { 33 33 34 PassOwnPtr<GenericEventQueue> GenericEventQueue::create(EventTarget* owner) 35 { 36 return adoptPtr(new GenericEventQueue(owner)); 37 } 38 39 GenericEventQueue::GenericEventQueue(EventTarget* owner) 34 GenericEventQueue::GenericEventQueue(EventTarget& owner) 40 35 : m_owner(owner) 41 36 , m_timer(this, &GenericEventQueue::timerFired) … … 53 48 return false; 54 49 55 if (event->target() == m_owner)50 if (event->target() == &m_owner) 56 51 event->setTarget(0); 57 52 … … 64 59 } 65 60 66 bool GenericEventQueue::cancelEvent(Event* event)67 {68 bool found = m_pendingEvents.contains(event);69 70 if (found)71 m_pendingEvents.remove(m_pendingEvents.find(event));72 73 if (m_pendingEvents.isEmpty())74 m_timer.stop();75 76 return found;77 }78 79 61 void GenericEventQueue::timerFired(Timer<GenericEventQueue>*) 80 62 { … … 82 64 ASSERT(!m_pendingEvents.isEmpty()); 83 65 84 Vector<RefPtr<Event> 66 Vector<RefPtr<Event>> pendingEvents; 85 67 m_pendingEvents.swap(pendingEvents); 86 68 87 RefPtr<EventTarget> protect( m_owner);69 RefPtr<EventTarget> protect(&m_owner); 88 70 for (unsigned i = 0; i < pendingEvents.size(); ++i) { 89 EventTarget * target = pendingEvents[i]->target() ?pendingEvents[i]->target() : m_owner;90 target ->dispatchEvent(pendingEvents[i].release());71 EventTarget& target = pendingEvents[i]->target() ? *pendingEvents[i]->target() : m_owner; 72 target.dispatchEvent(pendingEvents[i].release()); 91 73 } 92 74 } -
trunk/Source/WebCore/dom/GenericEventQueue.h
r128572 r155356 27 27 #define GenericEventQueue_h 28 28 29 #include "EventQueue.h"30 #include "EventTarget.h"31 29 #include "Timer.h" 32 #include <wtf/ PassOwnPtr.h>30 #include <wtf/Forward.h> 33 31 #include <wtf/RefPtr.h> 34 32 #include <wtf/Vector.h> … … 36 34 namespace WebCore { 37 35 38 class GenericEventQueue : public EventQueue { 39 WTF_MAKE_FAST_ALLOCATED; 36 class Event; 37 class EventTarget; 38 39 class GenericEventQueue { 40 40 public: 41 explicit GenericEventQueue(EventTarget*); 42 static PassOwnPtr<GenericEventQueue> create(EventTarget*); 43 virtual ~GenericEventQueue(); 41 explicit GenericEventQueue(EventTarget&); 42 ~GenericEventQueue(); 44 43 45 // EventQueue 46 virtual bool enqueueEvent(PassRefPtr<Event>) OVERRIDE; 47 virtual bool cancelEvent(Event*) OVERRIDE; 48 virtual void close() OVERRIDE; 44 bool enqueueEvent(PassRefPtr<Event>); 45 void close(); 49 46 50 47 void cancelAllEvents(); … … 54 51 void timerFired(Timer<GenericEventQueue>*); 55 52 56 EventTarget *m_owner;57 Vector<RefPtr<Event> 53 EventTarget& m_owner; 54 Vector<RefPtr<Event>> m_pendingEvents; 58 55 Timer<GenericEventQueue> m_timer; 59 60 56 bool m_isClosed; 61 57 }; -
trunk/Source/WebCore/dom/ScriptExecutionContext.h
r155304 r155356 151 151 virtual double timerAlignmentInterval() const; 152 152 153 virtual EventQueue *eventQueue() const = 0;153 virtual EventQueue& eventQueue() const = 0; 154 154 155 155 #if ENABLE(SQL_DATABASE) -
trunk/Source/WebCore/html/HTMLMediaElement.cpp
r155277 r155356 259 259 , m_playbackProgressTimer(this, &HTMLMediaElement::playbackProgressTimerFired) 260 260 , m_playedTimeRanges() 261 , m_asyncEventQueue( GenericEventQueue::create(this))261 , m_asyncEventQueue(*this) 262 262 , m_playbackRate(1.0f) 263 263 , m_defaultPlaybackRate(1.0f) … … 353 353 LOG(Media, "HTMLMediaElement::~HTMLMediaElement"); 354 354 355 m_asyncEventQueue ->close();355 m_asyncEventQueue.close(); 356 356 357 357 if (m_isWaitingUntilMediaCanStart) … … 705 705 // will trigger an ASSERT if this element has been marked for deletion. 706 706 707 m_asyncEventQueue ->enqueueEvent(event.release());707 m_asyncEventQueue.enqueueEvent(event.release()); 708 708 } 709 709 … … 1326 1326 event = Event::create(eventNames().enterEvent, false, false); 1327 1327 event->setTarget(eventTasks[i].second); 1328 m_asyncEventQueue ->enqueueEvent(event.release());1328 m_asyncEventQueue.enqueueEvent(event.release()); 1329 1329 1330 1330 event = Event::create(eventNames().exitEvent, false, false); 1331 1331 event->setTarget(eventTasks[i].second); 1332 m_asyncEventQueue ->enqueueEvent(event.release());1332 m_asyncEventQueue.enqueueEvent(event.release()); 1333 1333 } else { 1334 1334 if (eventTasks[i].first == eventTasks[i].second->startTime()) … … 1338 1338 1339 1339 event->setTarget(eventTasks[i].second); 1340 m_asyncEventQueue ->enqueueEvent(event.release());1340 m_asyncEventQueue.enqueueEvent(event.release()); 1341 1341 } 1342 1342 } … … 1352 1352 event->setTarget(affectedTracks[i]); 1353 1353 1354 m_asyncEventQueue ->enqueueEvent(event.release());1354 m_asyncEventQueue.enqueueEvent(event.release()); 1355 1355 1356 1356 // ... if the text track has a corresponding track element, to then fire a … … 1362 1362 event->setTarget(trackElement); 1363 1363 1364 m_asyncEventQueue ->enqueueEvent(event.release());1364 m_asyncEventQueue.enqueueEvent(event.release()); 1365 1365 } 1366 1366 } … … 1654 1654 { 1655 1655 LOG(Media, "HTMLMediaElement::cancelPendingEventsAndCallbacks"); 1656 m_asyncEventQueue ->cancelAllEvents();1656 m_asyncEventQueue.cancelAllEvents(); 1657 1657 1658 1658 auto sourceChildren = childrenOfType<HTMLSourceElement>(this); … … 1944 1944 RefPtr<Event> event = MediaKeyEvent::create(eventNames().webkitkeyaddedEvent, initializer); 1945 1945 event->setTarget(this); 1946 m_asyncEventQueue ->enqueueEvent(event.release());1946 m_asyncEventQueue.enqueueEvent(event.release()); 1947 1947 } 1948 1948 … … 1981 1981 RefPtr<Event> event = MediaKeyEvent::create(eventNames().webkitkeyerrorEvent, initializer); 1982 1982 event->setTarget(this); 1983 m_asyncEventQueue ->enqueueEvent(event.release());1983 m_asyncEventQueue.enqueueEvent(event.release()); 1984 1984 } 1985 1985 … … 1996 1996 RefPtr<Event> event = MediaKeyEvent::create(eventNames().webkitkeymessageEvent, initializer); 1997 1997 event->setTarget(this); 1998 m_asyncEventQueue ->enqueueEvent(event.release());1998 m_asyncEventQueue.enqueueEvent(event.release()); 1999 1999 } 2000 2000 … … 2016 2016 RefPtr<Event> event = MediaKeyEvent::create(eventNames().webkitneedkeyEvent, initializer); 2017 2017 event->setTarget(this); 2018 m_asyncEventQueue ->enqueueEvent(event.release());2018 m_asyncEventQueue.enqueueEvent(event.release()); 2019 2019 return true; 2020 2020 } … … 2037 2037 RefPtr<Event> event = MediaKeyNeededEvent::create(eventNames().webkitneedkeyEvent, initializer); 2038 2038 event->setTarget(this); 2039 m_asyncEventQueue ->enqueueEvent(event.release());2039 m_asyncEventQueue.enqueueEvent(event.release()); 2040 2040 2041 2041 return true; … … 4180 4180 cancelPendingEventsAndCallbacks(); 4181 4181 4182 m_asyncEventQueue ->close();4182 m_asyncEventQueue.close(); 4183 4183 4184 4184 // Once an active DOM object has been stopped it can not be restarted, so we can deallocate … … 4239 4239 bool HTMLMediaElement::hasPendingActivity() const 4240 4240 { 4241 return (hasAudio() && isPlaying()) || m_asyncEventQueue ->hasPendingEvents();4241 return (hasAudio() && isPlaying()) || m_asyncEventQueue.hasPendingEvents(); 4242 4242 } 4243 4243 -
trunk/Source/WebCore/html/HTMLMediaElement.h
r154970 r155356 627 627 Timer<HTMLMediaElement> m_playbackProgressTimer; 628 628 RefPtr<TimeRanges> m_playedTimeRanges; 629 OwnPtr<GenericEventQueue>m_asyncEventQueue;629 GenericEventQueue m_asyncEventQueue; 630 630 631 631 double m_playbackRate; -
trunk/Source/WebCore/page/EventHandler.cpp
r155344 r155356 3867 3867 setFrameWasScrolledByUser(); 3868 3868 if (m_frame.view() && m_frame.document()) 3869 m_frame.document()->eventQueue() ->enqueueOrDispatchScrollEvent(m_frame.document(), DocumentEventQueue::ScrollEventDocumentTarget);3869 m_frame.document()->eventQueue().enqueueOrDispatchScrollEvent(*m_frame.document()); 3870 3870 } 3871 3871 -
trunk/Source/WebCore/rendering/RenderLayer.cpp
r155301 r155356 2264 2264 // Schedule the scroll DOM event. 2265 2265 if (Node* node = renderer().node()) 2266 node->document().eventQueue() ->enqueueOrDispatchScrollEvent(renderer().node(), DocumentEventQueue::ScrollEventElementTarget);2266 node->document().eventQueue().enqueueOrDispatchScrollEvent(*node); 2267 2267 2268 2268 InspectorInstrumentation::didScrollLayer(&frame); -
trunk/Source/WebCore/rendering/RenderListBox.cpp
r154877 r155356 646 646 m_indexOffset = newOffset; 647 647 repaint(); 648 node()->document().eventQueue() ->enqueueOrDispatchScrollEvent(node(), DocumentEventQueue::ScrollEventElementTarget);648 node()->document().eventQueue().enqueueOrDispatchScrollEvent(*node()); 649 649 } 650 650 -
trunk/Source/WebCore/workers/WorkerEventQueue.cpp
r130612 r155356 36 36 namespace WebCore { 37 37 38 PassOwnPtr<WorkerEventQueue> WorkerEventQueue::create(ScriptExecutionContext* context) 39 { 40 return adoptPtr(new WorkerEventQueue(context)); 41 } 42 43 WorkerEventQueue::WorkerEventQueue(ScriptExecutionContext* context) 38 WorkerEventQueue::WorkerEventQueue(ScriptExecutionContext& context) 44 39 : m_scriptExecutionContext(context) 45 40 , m_isClosed(false) … … 52 47 } 53 48 54 class WorkerEventQueue::EventDispatcherTask : public ScriptExecutionContext::Task {49 class WorkerEventQueue::EventDispatcherTask FINAL : public ScriptExecutionContext::Task { 55 50 public: 56 static PassOwnPtr<EventDispatcherTask> create(PassRefPtr<Event> event, WorkerEventQueue *eventQueue)51 static PassOwnPtr<EventDispatcherTask> create(PassRefPtr<Event> event, WorkerEventQueue& eventQueue) 57 52 { 58 53 return adoptPtr(new EventDispatcherTask(event, eventQueue)); … … 62 57 { 63 58 if (m_event) 64 m_eventQueue ->removeEvent(m_event.get());59 m_eventQueue.m_eventTaskMap.remove(m_event.get()); 65 60 } 66 61 … … 70 65 } 71 66 72 virtual void performTask(ScriptExecutionContext* context) 67 virtual void performTask(ScriptExecutionContext* context) OVERRIDE 73 68 { 74 69 if (m_isCancelled) 75 70 return; 76 m_eventQueue ->removeEvent(m_event.get());71 m_eventQueue.m_eventTaskMap.remove(m_event.get()); 77 72 dispatchEvent(context, m_event); 78 73 m_event.clear(); … … 86 81 87 82 private: 88 EventDispatcherTask(PassRefPtr<Event> event, WorkerEventQueue *eventQueue)83 EventDispatcherTask(PassRefPtr<Event> event, WorkerEventQueue& eventQueue) 89 84 : m_event(event) 90 85 , m_eventQueue(eventQueue) … … 94 89 95 90 RefPtr<Event> m_event; 96 WorkerEventQueue *m_eventQueue;91 WorkerEventQueue& m_eventQueue; 97 92 bool m_isCancelled; 98 93 }; 99 100 void WorkerEventQueue::removeEvent(Event* event)101 {102 m_eventTaskMap.remove(event);103 }104 94 105 95 bool WorkerEventQueue::enqueueEvent(PassRefPtr<Event> prpEvent) … … 108 98 return false; 109 99 RefPtr<Event> event = prpEvent; 110 OwnPtr<EventDispatcherTask> task = EventDispatcherTask::create(event, this);100 OwnPtr<EventDispatcherTask> task = EventDispatcherTask::create(event, *this); 111 101 m_eventTaskMap.add(event.release(), task.get()); 112 m_scriptExecutionContext ->postTask(task.release());102 m_scriptExecutionContext.postTask(task.release()); 113 103 return true; 114 104 } 115 105 116 bool WorkerEventQueue::cancelEvent(Event *event)106 bool WorkerEventQueue::cancelEvent(Event& event) 117 107 { 118 EventDispatcherTask* task = m_eventTaskMap. get(event);108 EventDispatcherTask* task = m_eventTaskMap.take(&event); 119 109 if (!task) 120 110 return false; 121 111 task->cancel(); 122 removeEvent(event);123 112 return true; 124 113 } -
trunk/Source/WebCore/workers/WorkerEventQueue.h
r128572 r155356 30 30 #include "EventQueue.h" 31 31 #include <wtf/HashMap.h> 32 #include <wtf/HashSet.h>33 32 #include <wtf/PassOwnPtr.h> 34 #include <wtf/RefCounted.h>35 33 36 34 namespace WebCore { 37 35 38 class Event;39 class Node;40 36 class ScriptExecutionContext; 41 37 42 class WorkerEventQueue : public EventQueue { 43 WTF_MAKE_FAST_ALLOCATED; 38 class WorkerEventQueue FINAL : public EventQueue { 44 39 public: 45 46 static PassOwnPtr<WorkerEventQueue> create(ScriptExecutionContext*); 40 explicit WorkerEventQueue(ScriptExecutionContext&); 47 41 virtual ~WorkerEventQueue(); 48 42 49 // EventQueue50 43 virtual bool enqueueEvent(PassRefPtr<Event>) OVERRIDE; 51 virtual bool cancelEvent(Event *) OVERRIDE;44 virtual bool cancelEvent(Event&) OVERRIDE; 52 45 virtual void close() OVERRIDE; 53 46 54 47 private: 55 explicit WorkerEventQueue(ScriptExecutionContext*); 56 void removeEvent(Event*); 57 58 ScriptExecutionContext* m_scriptExecutionContext; 48 ScriptExecutionContext& m_scriptExecutionContext; 59 49 bool m_isClosed; 60 50 -
trunk/Source/WebCore/workers/WorkerGlobalScope.cpp
r155304 r155356 95 95 #endif 96 96 , m_closing(false) 97 , m_eventQueue( WorkerEventQueue::create(this))97 , m_eventQueue(*this) 98 98 , m_topOrigin(topOrigin) 99 99 { … … 366 366 } 367 367 368 WorkerEventQueue *WorkerGlobalScope::eventQueue() const369 { 370 return m_eventQueue .get();368 WorkerEventQueue& WorkerGlobalScope::eventQueue() const 369 { 370 return m_eventQueue; 371 371 } 372 372 -
trunk/Source/WebCore/workers/WorkerGlobalScope.h
r155304 r155356 105 105 void clearInterval(int timeoutId); 106 106 107 // ScriptExecutionContext108 virtual WorkerEventQueue* eventQueue() const OVERRIDE;109 110 107 virtual bool isContextThread() const OVERRIDE; 111 108 virtual bool isJSExecutionForbidden() const OVERRIDE; … … 163 160 virtual EventTarget* errorEventTarget() OVERRIDE; 164 161 162 virtual WorkerEventQueue& eventQueue() const OVERRIDE FINAL; 163 165 164 KURL m_url; 166 165 String m_userAgent; … … 181 180 HashSet<Observer*> m_workerObservers; 182 181 183 OwnPtr<WorkerEventQueue>m_eventQueue;182 mutable WorkerEventQueue m_eventQueue; 184 183 185 184 RefPtr<SecurityOrigin> m_topOrigin;
Note: See TracChangeset
for help on using the changeset viewer.