diff options
author | Allan Sandfeld Jensen <allan.jensen@digia.com> | 2013-09-13 12:51:20 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-19 20:50:05 +0200 |
commit | d441d6f39bb846989d95bcf5caf387b42414718d (patch) | |
tree | e367e64a75991c554930278175d403c072de6bb8 /Source/WebCore/loader/ProgressTracker.cpp | |
parent | 0060b2994c07842f4c59de64b5e3e430525c4b90 (diff) | |
download | qtwebkit-d441d6f39bb846989d95bcf5caf387b42414718d.tar.gz |
Import Qt5x2 branch of QtWebkit for Qt 5.2
Importing a new snapshot of webkit.
Change-Id: I2d01ad12cdc8af8cb015387641120a9d7ea5f10c
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@digia.com>
Diffstat (limited to 'Source/WebCore/loader/ProgressTracker.cpp')
-rw-r--r-- | Source/WebCore/loader/ProgressTracker.cpp | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/Source/WebCore/loader/ProgressTracker.cpp b/Source/WebCore/loader/ProgressTracker.cpp index 4f2b7ecd3..7aefa2170 100644 --- a/Source/WebCore/loader/ProgressTracker.cpp +++ b/Source/WebCore/loader/ProgressTracker.cpp @@ -31,6 +31,7 @@ #include "FrameLoader.h" #include "FrameLoaderStateMachine.h" #include "FrameLoaderClient.h" +#include "InspectorInstrumentation.h" #include "Logging.h" #include "ResourceResponse.h" #include <wtf/text/CString.h> @@ -50,6 +51,13 @@ static const double finalProgressValue = 0.9; // 1.0 - initialProgressValue static const int progressItemDefaultEstimatedLength = 1024 * 16; +// Check if the load is progressing this often. +static const double progressHeartbeatInterval = 0.1; +// How many heartbeats must pass without progress before deciding the load is currently stalled. +static const unsigned loadStalledHeartbeatCount = 4; +// How many bytes are required between heartbeats to consider it progress. +static const unsigned minumumBytesPerHeartbeatForProgress = 1024; + struct ProgressItem { WTF_MAKE_NONCOPYABLE(ProgressItem); WTF_MAKE_FAST_ALLOCATED; public: @@ -73,6 +81,9 @@ ProgressTracker::ProgressTracker() , m_finalProgressChangedSent(false) , m_progressValue(0) , m_numProgressTrackedFrames(0) + , m_progressHeartbeatTimer(this, &ProgressTracker::progressHeartbeatTimerFired) + , m_heartbeatsWithNoProgress(0) + , m_totalBytesReceivedBeforePreviousHeartbeat(0) { } @@ -102,6 +113,10 @@ void ProgressTracker::reset() m_finalProgressChangedSent = false; m_numProgressTrackedFrames = 0; m_originatingProgressFrame = 0; + + m_heartbeatsWithNoProgress = 0; + m_totalBytesReceivedBeforePreviousHeartbeat = 0; + m_progressHeartbeatTimer.stop(); } void ProgressTracker::progressStarted(Frame* frame) @@ -114,12 +129,16 @@ void ProgressTracker::progressStarted(Frame* frame) reset(); m_progressValue = initialProgressValue; m_originatingProgressFrame = frame; - + + m_progressHeartbeatTimer.startRepeating(progressHeartbeatInterval); + m_originatingProgressFrame->loader()->loadProgressingStatusChanged(); + m_originatingProgressFrame->loader()->client()->postProgressStartedNotification(); } m_numProgressTrackedFrames++; frame->loader()->client()->didChangeEstimatedProgress(); + InspectorInstrumentation::frameStartedLoading(frame); } void ProgressTracker::progressCompleted(Frame* frame) @@ -155,6 +174,9 @@ void ProgressTracker::finalProgressComplete() frame->loader()->client()->setMainFrameDocumentReady(true); frame->loader()->client()->postProgressFinishedNotification(); + frame->loader()->loadProgressingStatusChanged(); + + InspectorInstrumentation::frameStoppedLoading(frame.get()); } void ProgressTracker::incrementProgress(unsigned long identifier, const ResourceResponse& response) @@ -261,5 +283,29 @@ unsigned long ProgressTracker::createUniqueIdentifier() return ++s_uniqueIdentifier; } +bool ProgressTracker::isMainLoadProgressing() const +{ + if (!m_originatingProgressFrame) + return false; + // See if the load originated from a subframe. + if (m_originatingProgressFrame->tree()->parent()) + return false; + return m_progressValue && m_progressValue < finalProgressValue && m_heartbeatsWithNoProgress < loadStalledHeartbeatCount; +} + +void ProgressTracker::progressHeartbeatTimerFired(Timer<ProgressTracker>*) +{ + if (m_totalBytesReceived < m_totalBytesReceivedBeforePreviousHeartbeat + minumumBytesPerHeartbeatForProgress) + ++m_heartbeatsWithNoProgress; + else + m_heartbeatsWithNoProgress = 0; + + m_totalBytesReceivedBeforePreviousHeartbeat = m_totalBytesReceived; + + m_originatingProgressFrame->loader()->loadProgressingStatusChanged(); + + if (m_progressValue >= finalProgressValue) + m_progressHeartbeatTimer.stop(); +} } |