Index: content/renderer/render_view_impl.cc |
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc |
index 3ccf69a41919d9518ea4466726a3d03fed111a64..43b012c7b2ea14ed9a2eb394ca45763b14b4db1f 100644 |
--- a/content/renderer/render_view_impl.cc |
+++ b/content/renderer/render_view_impl.cc |
@@ -954,6 +954,7 @@ void RenderViewImpl::Initialize(RenderViewImplParams* params) { |
// RenderViewImpl::frameDetached(). |
webview()->setMainFrame(WebFrame::create(main_render_frame_.get())); |
main_render_frame_->MainWebFrameCreated(webview()->mainFrame()); |
+ main_render_frame_->set_web_frame(webview()->mainFrame()); |
if (switches::IsTouchDragDropEnabled()) |
webview()->settings()->setTouchDragDropEnabled(true); |
@@ -2010,7 +2011,16 @@ void RenderViewImpl::UpdateURL(WebFrame* frame) { |
DCHECK(!navigation_state->history_list_was_cleared()); |
params.history_list_was_cleared = false; |
- Send(new ViewHostMsg_FrameNavigate(routing_id_, params)); |
+ // Don't send this message while the subframe is swapped out. |
+ // TODO(creis): This whole method should move to RenderFrame. |
+ // TODO(creis): How did this work before for top-level frames? |
+ bool frame_is_swapped_out = false; |
+ if (frame->parent()) { |
+ RenderFrameImpl* rf = RenderFrameImpl::FindByWebFrame(frame); |
+ frame_is_swapped_out = rf->is_swapped_out(); |
+ } |
+ if (!frame_is_swapped_out) |
+ Send(new ViewHostMsg_FrameNavigate(routing_id_, params)); |
} |
last_page_id_sent_to_browser_ = |
@@ -3859,6 +3869,15 @@ void RenderViewImpl::didFinishLoad(WebFrame* frame) { |
FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidFinishLoad(frame)); |
+ // Don't send this message while the subframe is swapped out. |
+ // TODO(creis): This whole method should move to RenderFrame. |
+ // TODO(creis): How did this work before for top-level frames? |
+ if (frame->parent()) { |
+ RenderFrameImpl* rf = RenderFrameImpl::FindByWebFrame(frame); |
+ if (rf && rf->is_swapped_out()) |
+ return; |
+ } |
+ |
Send(new ViewHostMsg_DidFinishLoad(routing_id_, |
frame->identifier(), |
ds->request().url(), |
@@ -5311,7 +5330,15 @@ void RenderViewImpl::NavigateToSwappedOutURL(blink::WebFrame* frame) { |
// synchronously. Otherwise a new navigation can interrupt the navigation |
// to kSwappedOutURL. If that happens to be to the page we had been |
// showing, then WebKit will never send a commit and we'll be left spinning. |
- CHECK(is_swapped_out_); |
+ // TODO(creis): Until we move this to RenderFrame, we may call this from a |
+ // swapped out RenderFrame while our own is_swapped_out_ is false. |
+ // TODO(creis): How did this work before for top-level frames? |
+ bool is_swapped_out = is_swapped_out_; |
+ if (frame->parent()) { |
+ RenderFrameImpl* rf = RenderFrameImpl::FindByWebFrame(frame); |
+ is_swapped_out |= rf->is_swapped_out(); |
+ } |
+ CHECK(is_swapped_out); |
GURL swappedOutURL(kSwappedOutURL); |
WebURLRequest request(swappedOutURL); |
frame->loadRequest(request); |