diff options
Diffstat (limited to 'Source/WebCore/xml/XMLHttpRequestProgressEventThrottle.cpp')
-rw-r--r-- | Source/WebCore/xml/XMLHttpRequestProgressEventThrottle.cpp | 45 |
1 files changed, 21 insertions, 24 deletions
diff --git a/Source/WebCore/xml/XMLHttpRequestProgressEventThrottle.cpp b/Source/WebCore/xml/XMLHttpRequestProgressEventThrottle.cpp index 615e515bb..36662656b 100644 --- a/Source/WebCore/xml/XMLHttpRequestProgressEventThrottle.cpp +++ b/Source/WebCore/xml/XMLHttpRequestProgressEventThrottle.cpp @@ -27,6 +27,7 @@ #include "config.h" #include "XMLHttpRequestProgressEventThrottle.h" +#include "EventNames.h" #include "EventTarget.h" #include "XMLHttpRequestProgressEvent.h" @@ -41,7 +42,7 @@ XMLHttpRequestProgressEventThrottle::XMLHttpRequestProgressEventThrottle(EventTa , m_loaded(0) , m_total(0) , m_deferEvents(false) - , m_dispatchDeferredEventsTimer(this, &XMLHttpRequestProgressEventThrottle::dispatchDeferredEvents) + , m_dispatchDeferredEventsTimer(*this, &XMLHttpRequestProgressEventThrottle::dispatchDeferredEvents) { ASSERT(target); } @@ -55,6 +56,9 @@ void XMLHttpRequestProgressEventThrottle::dispatchThrottledProgressEvent(bool le m_lengthComputable = lengthComputable; m_loaded = loaded; m_total = total; + + if (!m_target->hasEventListeners(eventNames().progressEvent)) + return; if (m_deferEvents) { // Only store the latest progress event while suspended. @@ -63,8 +67,7 @@ void XMLHttpRequestProgressEventThrottle::dispatchThrottledProgressEvent(bool le } if (!isActive()) { - // The timer is not active so the least frequent event for now is every byte. - // Just go ahead and dispatch the event. + // The timer is not active so the least frequent event for now is every byte. Just dispatch the event. // We should not have any throttled progress event. ASSERT(!m_hasThrottledProgressEvent); @@ -79,7 +82,7 @@ void XMLHttpRequestProgressEventThrottle::dispatchThrottledProgressEvent(bool le m_hasThrottledProgressEvent = true; } -void XMLHttpRequestProgressEventThrottle::dispatchReadyStateChangeEvent(PassRefPtr<Event> event, ProgressEventAction progressEventAction) +void XMLHttpRequestProgressEventThrottle::dispatchReadyStateChangeEvent(Event& event, ProgressEventAction progressEventAction) { if (progressEventAction == FlushProgressEvent) flushProgressEvent(); @@ -87,11 +90,10 @@ void XMLHttpRequestProgressEventThrottle::dispatchReadyStateChangeEvent(PassRefP dispatchEvent(event); } -void XMLHttpRequestProgressEventThrottle::dispatchEvent(PassRefPtr<Event> event) +void XMLHttpRequestProgressEventThrottle::dispatchEvent(Event& event) { - ASSERT(event); if (m_deferEvents) { - if (m_deferredEvents.size() > 1 && event->type() == eventNames().readystatechangeEvent && event->type() == m_deferredEvents.last()->type()) { + if (m_deferredEvents.size() > 1 && event.type() == eventNames().readystatechangeEvent && event.type() == m_deferredEvents.last()->type()) { // Readystatechange events are state-less so avoid repeating two identical events in a row on resume. return; } @@ -100,7 +102,7 @@ void XMLHttpRequestProgressEventThrottle::dispatchEvent(PassRefPtr<Event> event) m_target->dispatchEvent(event); } -void XMLHttpRequestProgressEventThrottle::dispatchProgressEvent(const AtomicString &type) +void XMLHttpRequestProgressEventThrottle::dispatchProgressEvent(const AtomicString& type) { ASSERT(type == eventNames().loadstartEvent || type == eventNames().progressEvent || type == eventNames().loadEvent || type == eventNames().loadendEvent || type == eventNames().abortEvent || type == eventNames().errorEvent || type == eventNames().timeoutEvent); @@ -110,51 +112,46 @@ void XMLHttpRequestProgressEventThrottle::dispatchProgressEvent(const AtomicStri m_total = 0; } - dispatchEvent(XMLHttpRequestProgressEvent::create(type, m_lengthComputable, m_loaded, m_total)); + if (m_target->hasEventListeners(type)) + dispatchEvent(XMLHttpRequestProgressEvent::create(type, m_lengthComputable, m_loaded, m_total)); } void XMLHttpRequestProgressEventThrottle::flushProgressEvent() { if (m_deferEvents && m_deferredProgressEvent) { // Move the progress event to the queue, to get it in the right order on resume. - m_deferredEvents.append(m_deferredProgressEvent); - m_deferredProgressEvent = 0; + m_deferredEvents.append(m_deferredProgressEvent.releaseNonNull()); return; } if (!hasEventToDispatch()) return; - PassRefPtr<Event> event = XMLHttpRequestProgressEvent::create(eventNames().progressEvent, m_lengthComputable, m_loaded, m_total); + Ref<Event> event = XMLHttpRequestProgressEvent::create(eventNames().progressEvent, m_lengthComputable, m_loaded, m_total); m_hasThrottledProgressEvent = false; // We stop the timer as this is called when no more events are supposed to occur. stop(); - dispatchEvent(event); + dispatchEvent(WTFMove(event)); } -void XMLHttpRequestProgressEventThrottle::dispatchDeferredEvents(Timer<XMLHttpRequestProgressEventThrottle>* timer) +void XMLHttpRequestProgressEventThrottle::dispatchDeferredEvents() { - ASSERT_UNUSED(timer, timer == &m_dispatchDeferredEventsTimer); ASSERT(m_deferEvents); m_deferEvents = false; // Take over the deferred events before dispatching them which can potentially add more. - Vector<RefPtr<Event>> deferredEvents; - m_deferredEvents.swap(deferredEvents); + auto deferredEvents = WTFMove(m_deferredEvents); - RefPtr<Event> deferredProgressEvent = m_deferredProgressEvent; - m_deferredProgressEvent = 0; + RefPtr<Event> deferredProgressEvent = WTFMove(m_deferredProgressEvent); - Vector<RefPtr<Event>>::const_iterator it = deferredEvents.begin(); - const Vector<RefPtr<Event>>::const_iterator end = deferredEvents.end(); - for (; it != end; ++it) - dispatchEvent(*it); + for (auto& deferredEvent : deferredEvents) + dispatchEvent(deferredEvent); // The progress event will be in the m_deferredEvents vector if the load was finished while suspended. // If not, just send the most up-to-date progress on resume. if (deferredProgressEvent) - dispatchEvent(deferredProgressEvent); + dispatchEvent(*deferredProgressEvent); } void XMLHttpRequestProgressEventThrottle::fired() |