Index: content/browser/frame_host/render_frame_host_impl.cc |
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc |
index 7f8aaf3a1587d572ac0907c13bee18d6ca451ce0..5df06c417d4ccd324a7c315ae88fb1fe1c15c1c5 100644 |
--- a/content/browser/frame_host/render_frame_host_impl.cc |
+++ b/content/browser/frame_host/render_frame_host_impl.cc |
@@ -388,6 +388,10 @@ bool RenderFrameHostImpl::OnMessageReceived(const IPC::Message &msg) { |
// The following message is synthetic and doesn't come from RenderFrame, but |
// from RenderProcessHost. |
IPC_MESSAGE_HANDLER(FrameHostMsg_RenderProcessGone, OnRenderProcessGone) |
+ IPC_MESSAGE_HANDLER(FrameHostMsg_DidStartLoading, OnDidStartLoading) |
+ IPC_MESSAGE_HANDLER(FrameHostMsg_DidStopLoading, OnDidStopLoading) |
+ IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeLoadProgress, |
+ OnDidChangeLoadProgress) |
#if defined(OS_MACOSX) || defined(OS_ANDROID) |
IPC_MESSAGE_HANDLER(FrameHostMsg_ShowPopup, OnShowPopup) |
IPC_MESSAGE_HANDLER(FrameHostMsg_HidePopup, OnHidePopup) |
@@ -847,11 +851,11 @@ void RenderFrameHostImpl::OnDidCommitProvisionalLoad(const IPC::Message& msg) { |
} |
void RenderFrameHostImpl::OnDidDropNavigation() { |
- // At the end of Navigate(), the delegate's DidStartLoading is called to force |
- // the spinner to start, even if the renderer didn't yet begin the load. If it |
- // turns out that the renderer dropped the navigation, we need to turn off the |
- // spinner. |
- delegate_->DidStopLoading(); |
+ // At the end of Navigate(), the FrameTreeNode's DidStartLoading is called to |
+ // force the spinner to start, even if the renderer didn't yet begin the load. |
+ // If it turns out that the renderer dropped the navigation, the spinner needs |
+ // to be turned off. |
+ frame_tree_node_->DidStopLoading(); |
} |
RenderWidgetHostImpl* RenderFrameHostImpl::GetRenderWidgetHost() { |
@@ -1430,6 +1434,45 @@ void RenderFrameHostImpl::OnToggleFullscreen(bool enter_fullscreen) { |
render_view_host_->WasResized(); |
} |
+void RenderFrameHostImpl::OnDidStartLoading(bool to_different_document) { |
+ // Any main frame load to a new document should reset the load since it will |
+ // replace the current page and any frames. |
+ if (to_different_document && !GetParent()) |
+ is_loading_ = false; |
+ |
+ // This method should never be called when the frame is loading. |
+ // Unfortunately, it can happen if a history navigation happens during a |
+ // BeforeUnload or Unload event. |
+ // TODO(fdegans): Change this to a DCHECK after LoadEventProgress has been |
+ // refactored in Blink. See crbug.com/466089 |
+ if (is_loading_) { |
+ LOG(WARNING) << "OnDidStartLoading was called twice."; |
+ return; |
+ } |
+ |
+ frame_tree_node_->DidStartLoading(to_different_document); |
+ is_loading_ = true; |
+} |
+ |
+void RenderFrameHostImpl::OnDidStopLoading() { |
+ // This method should never be called when the frame is not loading. |
+ // Unfortunately, it can happen if a history navigation happens during a |
+ // BeforeUnload or Unload event. |
+ // TODO(fdegans): Change this to a DCHECK after LoadEventProgress has been |
+ // refactored in Blink. See crbug.com/466089 |
+ if (!is_loading_) { |
+ LOG(WARNING) << "OnDidStopLoading was called twice."; |
+ return; |
+ } |
+ |
+ is_loading_ = false; |
+ frame_tree_node_->DidStopLoading(); |
+} |
+ |
+void RenderFrameHostImpl::OnDidChangeLoadProgress(double load_progress) { |
+ frame_tree_node_->DidChangeLoadProgress(load_progress); |
+} |
+ |
#if defined(OS_MACOSX) || defined(OS_ANDROID) |
void RenderFrameHostImpl::OnShowPopup( |
const FrameHostMsg_ShowPopup_Params& params) { |
@@ -1588,19 +1631,19 @@ void RenderFrameHostImpl::Navigate( |
request_params)); |
} |
- // Force the throbber to start. We do this because Blink's "started |
- // loading" message will be received asynchronously from the UI of the |
- // browser. But we want to keep the throbber in sync with what's happening |
- // in the UI. For example, we want to start throbbing immediately when the |
- // user navigates even if the renderer is delayed. There is also an issue |
- // with the throbber starting because the WebUI (which controls whether the |
- // favicon is displayed) happens synchronously. If the start loading |
- // messages was asynchronous, then the default favicon would flash in. |
+ // Force the throbber to start. This is done because Blink's "started loading" |
+ // message will be received asynchronously from the UI of the browser. But the |
+ // throbber needs to be kept in sync with what's happening in the UI. For |
+ // example, the throbber will start immediately when the user navigates even |
+ // if the renderer is delayed. There is also an issue with the throbber |
+ // starting because the WebUI (which controls whether the favicon is |
+ // displayed) happens synchronously. If the start loading messages was |
+ // asynchronous, then the default favicon would flash in. |
// |
- // Blink doesn't send throb notifications for JavaScript URLs, so we |
- // don't want to either. |
+ // Blink doesn't send throb notifications for JavaScript URLs, so it is not |
+ // done here either. |
if (!common_params.url.SchemeIs(url::kJavaScriptScheme)) |
- delegate_->DidStartLoading(this, true); |
+ frame_tree_node_->DidStartLoading(true); |
} |
void RenderFrameHostImpl::NavigateToURL(const GURL& url) { |