Changeset 258159 in webkit for trunk/Source/WebCore/xml/XMLHttpRequestProgressEventThrottle.cpp
- Timestamp:
- Mar 9, 2020, 1:17:21 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/xml/XMLHttpRequestProgressEventThrottle.cpp
r251366 r258159 30 30 #include "EventNames.h" 31 31 #include "EventTarget.h" 32 #include "XMLHttpRequest.h" 32 33 #include "XMLHttpRequestProgressEvent.h" 33 34 … … 36 37 const Seconds XMLHttpRequestProgressEventThrottle::minimumProgressEventDispatchingInterval { 50_ms }; // 50 ms per specification. 37 38 38 XMLHttpRequestProgressEventThrottle::XMLHttpRequestProgressEventThrottle( EventTarget& target)39 XMLHttpRequestProgressEventThrottle::XMLHttpRequestProgressEventThrottle(XMLHttpRequest& target) 39 40 : m_target(target) 40 41 , m_dispatchThrottledProgressEventTimer(target.scriptExecutionContext(), *this, &XMLHttpRequestProgressEventThrottle::dispatchThrottledProgressEventTimerFired) 41 , m_dispatchDeferredEventsAfterResumingTimer(target.scriptExecutionContext(), *this, &XMLHttpRequestProgressEventThrottle::dispatchDeferredEventsAfterResuming)42 42 { 43 43 m_dispatchThrottledProgressEventTimer.suspendIfNeeded(); 44 m_dispatchDeferredEventsAfterResumingTimer.suspendIfNeeded();45 44 } 46 45 … … 82 81 void XMLHttpRequestProgressEventThrottle::dispatchEventWhenPossible(Event& event) 83 82 { 84 if (m_shouldDeferEventsDueToSuspension) { 85 if (m_eventsDeferredDueToSuspension.size() > 1 && event.type() == eventNames().readystatechangeEvent && event.type() == m_eventsDeferredDueToSuspension.last()->type()) { 86 // Readystatechange events are state-less so avoid repeating two identical events in a row on resume. 87 return; 88 } 89 m_eventsDeferredDueToSuspension.append(event); 90 } else 83 if (m_shouldDeferEventsDueToSuspension) 84 m_target.queueTaskToDispatchEvent(m_target, TaskSource::Networking, makeRef(event)); 85 else 91 86 m_target.dispatchEvent(event); 92 87 } … … 118 113 } 119 114 120 void XMLHttpRequestProgressEventThrottle::dispatchDeferredEventsAfterResuming()121 {122 ASSERT(m_shouldDeferEventsDueToSuspension);123 m_shouldDeferEventsDueToSuspension = false;124 125 // Take over the deferred events before dispatching them which can potentially add more.126 auto eventsDeferredDueToSuspension = WTFMove(m_eventsDeferredDueToSuspension);127 128 flushProgressEvent();129 130 for (auto& deferredEvent : eventsDeferredDueToSuspension)131 dispatchEventWhenPossible(deferredEvent);132 }133 134 115 void XMLHttpRequestProgressEventThrottle::dispatchThrottledProgressEventTimerFired() 135 116 { … … 148 129 { 149 130 m_shouldDeferEventsDueToSuspension = true; 131 132 if (m_hasPendingThrottledProgressEvent) { 133 m_target.queueTaskKeepingObjectAlive(m_target, TaskSource::Networking, [this] { 134 flushProgressEvent(); 135 }); 136 } 150 137 } 151 138 152 139 void XMLHttpRequestProgressEventThrottle::resume() 153 140 { 154 if (m_eventsDeferredDueToSuspension.isEmpty() && !m_hasPendingThrottledProgressEvent){141 m_target.queueTaskKeepingObjectAlive(m_target, TaskSource::Networking, [this] { 155 142 m_shouldDeferEventsDueToSuspension = false; 156 return; 157 } 158 159 m_dispatchDeferredEventsAfterResumingTimer.startOneShot(0_s); 143 }); 160 144 } 161 145
Note:
See TracChangeset
for help on using the changeset viewer.