summaryrefslogtreecommitdiff
path: root/Source/WebCore/loader/ProgressTracker.cpp
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@digia.com>2013-09-13 12:51:20 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-19 20:50:05 +0200
commitd441d6f39bb846989d95bcf5caf387b42414718d (patch)
treee367e64a75991c554930278175d403c072de6bb8 /Source/WebCore/loader/ProgressTracker.cpp
parent0060b2994c07842f4c59de64b5e3e430525c4b90 (diff)
downloadqtwebkit-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.cpp48
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();
+}
}