Chromium Code Reviews| Index: Source/core/xml/XMLHttpRequest.cpp |
| diff --git a/Source/core/xml/XMLHttpRequest.cpp b/Source/core/xml/XMLHttpRequest.cpp |
| index 3e6bf6c9ed6e875d727eb210fdd20f233c178433..ea943c9983d1c5f9a5ccaa9f48e417af22f8de06 100644 |
| --- a/Source/core/xml/XMLHttpRequest.cpp |
| +++ b/Source/core/xml/XMLHttpRequest.cpp |
| @@ -58,12 +58,20 @@ |
| #include "wtf/ArrayBuffer.h" |
| #include "wtf/ArrayBufferView.h" |
| #include "wtf/Assertions.h" |
| +#include "wtf/CurrentTime.h" |
| #include "wtf/RefCountedLeakCounter.h" |
| #include "wtf/StdLibExtras.h" |
| #include "wtf/text/CString.h" |
| namespace blink { |
| +namespace { |
| + |
| +const double progressFireInterval = 0.05; // 0.05s |
| +const int progressFireMinimumSize = 1024 * 1024; // 1MB |
| + |
| +} // namespace |
| + |
| DEFINE_DEBUG_ONLY_GLOBAL(WTF::RefCountedLeakCounter, xmlHttpRequestCounter, ("XMLHttpRequest")); |
| struct XMLHttpRequestStaticData { |
| @@ -169,6 +177,8 @@ XMLHttpRequest::XMLHttpRequest(ExecutionContext* context, PassRefPtr<SecurityOri |
| , m_progressEventThrottle(this) |
| , m_responseTypeCode(ResponseTypeDefault) |
| , m_securityOrigin(securityOrigin) |
| + , m_previousProgressFireTime(0) |
| + , m_previousProgressRemainLength(0) |
| , m_async(true) |
| , m_includeCredentials(false) |
| , m_createdDocument(false) |
| @@ -413,19 +423,26 @@ XMLHttpRequestUpload* XMLHttpRequest::upload() |
| void XMLHttpRequest::trackProgress(int length) |
| { |
| m_receivedLength += length; |
| + double now = monotonicallyIncreasingTime(); |
| + bool shouldFire = |
| + now - m_previousProgressFireTime >= progressFireInterval || m_previousProgressRemainLength + length >= progressFireMinimumSize; |
|
tyoshino (SeeGerritForStatus)
2014/07/29 11:39:37
one line?
yhirano
2014/07/29 12:33:48
Done.
|
| + if (shouldFire) { |
| + m_previousProgressFireTime = now; |
| + m_previousProgressRemainLength = 0; |
| + } else { |
| + m_previousProgressRemainLength += length; |
| + } |
| - if (m_async) |
| + if (m_async && shouldFire) |
| dispatchProgressEventFromSnapshot(EventTypeNames::progress); |
|
tyoshino (SeeGerritForStatus)
2014/07/29 11:39:37
progress events are already throttled. the algorit
yhirano
2014/07/29 12:33:48
Done.
As discussed, we don't have to care about th
|
| if (m_state != LOADING) { |
| changeState(LOADING); |
| } else { |
| - // Firefox calls readyStateChanged every time it receives data. Do |
| - // the same to align with Firefox. |
| - // |
| // FIXME: Make our implementation and the spec consistent. This |
| // behavior was needed when the progress event was not available. |
| - dispatchReadyStateChangeEvent(); |
| + if (shouldFire) |
| + dispatchReadyStateChangeEvent(); |
| } |
| } |