Index: Source/core/loader/FrameLoader.cpp |
diff --git a/Source/core/loader/FrameLoader.cpp b/Source/core/loader/FrameLoader.cpp |
index 5c6f689c26a2141192e15d7e42ccd73d29db6707..436ca2d9a43464cac5b8030d4ce4129efdad9a47 100644 |
--- a/Source/core/loader/FrameLoader.cpp |
+++ b/Source/core/loader/FrameLoader.cpp |
@@ -105,11 +105,48 @@ |
return type == FrameLoadTypeBackForward || type == FrameLoadTypeReload || type == FrameLoadTypeReloadFromOrigin; |
} |
+class FrameLoader::FrameProgressTracker { |
+public: |
+ static PassOwnPtr<FrameProgressTracker> create(LocalFrame* frame) { return adoptPtr(new FrameProgressTracker(frame)); } |
+ ~FrameProgressTracker() |
+ { |
+ ASSERT(!m_inProgress || m_frame->page()); |
+ if (m_inProgress) |
+ m_frame->page()->progress().progressCompleted(m_frame); |
+ } |
+ |
+ void progressStarted() |
+ { |
+ ASSERT(m_frame->page()); |
+ if (!m_inProgress) |
+ m_frame->page()->progress().progressStarted(m_frame); |
+ m_inProgress = true; |
+ } |
+ |
+ void progressCompleted() |
+ { |
+ ASSERT(m_inProgress); |
+ ASSERT(m_frame->page()); |
+ m_inProgress = false; |
+ m_frame->page()->progress().progressCompleted(m_frame); |
+ } |
+ |
+private: |
+ FrameProgressTracker(LocalFrame* frame) |
+ : m_frame(frame) |
+ , m_inProgress(false) |
+ { |
+ } |
+ |
+ LocalFrame* m_frame; |
+ bool m_inProgress; |
+}; |
+ |
FrameLoader::FrameLoader(LocalFrame* frame, FrameLoaderClient* client) |
: m_frame(frame) |
, m_client(client) |
, m_mixedContentChecker(frame) |
- , m_progressTracker(ProgressTracker::create(frame)) |
+ , m_progressTracker(FrameProgressTracker::create(m_frame)) |
, m_state(FrameStateProvisional) |
, m_loadType(FrameLoadTypeStandard) |
, m_fetchContext(FrameFetchContext::create(frame)) |
@@ -536,14 +573,14 @@ |
// don't fire them for fragment redirection that happens in window.onload handler. |
// See https://bugs.webkit.org/show_bug.cgi?id=31838 |
if (m_frame->document()->loadEventFinished()) |
- m_client->didStartLoading(NavigationWithinSameDocument); |
+ m_client->postProgressStartedNotification(NavigationWithinSameDocument); |
HistoryCommitType historyCommitType = updateBackForwardList == UpdateBackForwardList && m_currentItem ? StandardCommit : HistoryInertCommit; |
setHistoryItemStateForCommit(historyCommitType, sameDocumentNavigationSource == SameDocumentNavigationHistoryApi, data); |
m_client->dispatchDidNavigateWithinPage(m_currentItem.get(), historyCommitType); |
m_client->dispatchDidReceiveTitle(m_frame->document()->title()); |
if (m_frame->document()->loadEventFinished()) |
- m_client->didStopLoading(); |
+ m_client->postProgressFinishedNotification(); |
} |
void FrameLoader::loadInSameDocument(const KURL& url, PassRefPtr<SerializedScriptValue> stateObject, UpdateBackForwardListPolicy updateBackForwardList, ClientRedirectPolicy clientRedirect) |
@@ -1051,6 +1088,17 @@ |
checkLoadComplete(); |
} |
+int FrameLoader::numPendingOrLoadingRequests(bool recurse) const |
+{ |
+ if (!recurse) |
+ return m_frame->document()->fetcher()->requestCount(); |
+ |
+ int count = 0; |
+ for (LocalFrame* frame = m_frame; frame; frame = frame->tree().traverseNext(m_frame)) |
+ count += frame->document()->fetcher()->requestCount(); |
+ return count; |
+} |
+ |
String FrameLoader::userAgent(const KURL& url) const |
{ |
String userAgent = m_client->userAgent(url); |