Index: content/browser/web_contents/web_contents_impl.cc |
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc |
index 340f8a4bd6a1155acf9eccec38c6667b701d909e..8aae9c069b1087977979d64e235ff94260cc06f0 100644 |
--- a/content/browser/web_contents/web_contents_impl.cc |
+++ b/content/browser/web_contents/web_contents_impl.cc |
@@ -220,6 +220,13 @@ void MakeNavigateParams(const NavigationEntryImpl& entry, |
params->base_url_for_data_url = entry.GetBaseURLForDataURL(); |
params->history_url_for_data_url = entry.GetVirtualURL(); |
} |
+ |
+ // TODO(creis): Store the renderer-specific frame ID on params. We'll |
+ // eventually use the RenderFrameHost routing ID, but for now we may need to |
+ // search the RenderViewHost's frame_id_map. |
+ //int64 frame_id = -1; |
+ //params->frame_id = frame_id; |
+ |
params->referrer = entry.GetReferrer(); |
params->transition = entry.GetTransitionType(); |
params->page_state = entry.GetPageState(); |
@@ -341,7 +348,7 @@ WebContentsImpl::WebContentsImpl( |
#if defined(OS_WIN) && defined(USE_AURA) |
accessible_parent_(NULL), |
#endif |
- render_manager_(this, this, this), |
+ frame_tree_(this, this, this), |
is_loading_(false), |
crashed_status_(base::TERMINATION_STATUS_STILL_RUNNING), |
crashed_error_code_(0), |
@@ -407,7 +414,7 @@ WebContentsImpl::~WebContentsImpl() { |
} |
#endif |
- RenderViewHost* pending_rvh = render_manager_.pending_render_view_host(); |
+ RenderViewHost* pending_rvh = GetRenderManager()->pending_render_view_host(); |
if (pending_rvh) { |
FOR_EACH_OBSERVER(WebContentsObserver, |
observers_, |
@@ -416,7 +423,7 @@ WebContentsImpl::~WebContentsImpl() { |
FOR_EACH_OBSERVER(WebContentsObserver, |
observers_, |
- RenderViewDeleted(render_manager_.current_host())); |
+ RenderViewDeleted(GetRenderManager()->current_host())); |
FOR_EACH_OBSERVER(WebContentsObserver, |
observers_, |
@@ -464,7 +471,7 @@ BrowserPluginGuest* WebContentsImpl::CreateGuest( |
} |
RenderViewHostManager* WebContentsImpl::GetRenderManagerForTesting() { |
- return &render_manager_; |
+ return GetRenderManager(); |
} |
bool WebContentsImpl::OnMessageReceived(RenderViewHost* render_view_host, |
@@ -598,12 +605,12 @@ void WebContentsImpl::SetDelegate(WebContentsDelegate* delegate) { |
} |
RenderProcessHost* WebContentsImpl::GetRenderProcessHost() const { |
- RenderViewHostImpl* host = render_manager_.current_host(); |
+ RenderViewHostImpl* host = GetRenderManager()->current_host(); |
return host ? host->GetProcess() : NULL; |
} |
RenderViewHost* WebContentsImpl::GetRenderViewHost() const { |
- return render_manager_.current_host(); |
+ return GetRenderManager()->current_host(); |
} |
void WebContentsImpl::GetRenderViewHostAtPosition( |
@@ -643,7 +650,7 @@ int WebContentsImpl::GetFullscreenWidgetRoutingID() const { |
} |
RenderWidgetHostView* WebContentsImpl::GetRenderWidgetHostView() const { |
- return render_manager_.GetRenderWidgetHostView(); |
+ return GetRenderManager()->GetRenderWidgetHostView(); |
} |
RenderWidgetHostViewPort* WebContentsImpl::GetRenderWidgetHostViewPort() const { |
@@ -681,12 +688,12 @@ WebUI* WebContentsImpl::CreateWebUI(const GURL& url) { |
} |
WebUI* WebContentsImpl::GetWebUI() const { |
- return render_manager_.web_ui() ? render_manager_.web_ui() |
- : render_manager_.pending_web_ui(); |
+ return GetRenderManager()->web_ui() ? GetRenderManager()->web_ui() |
+ : GetRenderManager()->pending_web_ui(); |
} |
WebUI* WebContentsImpl::GetCommittedWebUI() const { |
- return render_manager_.web_ui(); |
+ return GetRenderManager()->web_ui(); |
} |
void WebContentsImpl::SetUserAgentOverride(const std::string& override) { |
@@ -733,8 +740,8 @@ const string16& WebContentsImpl::GetTitle() const { |
if (entry) { |
return entry->GetTitleForDisplay(accept_languages); |
} |
- WebUI* our_web_ui = render_manager_.pending_web_ui() ? |
- render_manager_.pending_web_ui() : render_manager_.web_ui(); |
+ WebUI* our_web_ui = GetRenderManager()->pending_web_ui() ? |
+ GetRenderManager()->pending_web_ui() : GetRenderManager()->web_ui(); |
if (our_web_ui) { |
// Don't override the title in view source mode. |
entry = controller_.GetVisibleEntry(); |
@@ -795,13 +802,13 @@ void WebContentsImpl::CopyMaxPageIDsFrom(WebContents* web_contents) { |
} |
SiteInstance* WebContentsImpl::GetSiteInstance() const { |
- return render_manager_.current_host()->GetSiteInstance(); |
+ return GetRenderManager()->current_host()->GetSiteInstance(); |
} |
SiteInstance* WebContentsImpl::GetPendingSiteInstance() const { |
- RenderViewHost* dest_rvh = render_manager_.pending_render_view_host() ? |
- render_manager_.pending_render_view_host() : |
- render_manager_.current_host(); |
+ RenderViewHost* dest_rvh = GetRenderManager()->pending_render_view_host() ? |
+ GetRenderManager()->pending_render_view_host() : |
+ GetRenderManager()->current_host(); |
return dest_rvh->GetSiteInstance(); |
} |
@@ -960,7 +967,7 @@ bool WebContentsImpl::NeedToFireBeforeUnload() { |
} |
void WebContentsImpl::Stop() { |
- render_manager_.Stop(); |
+ GetRenderManager()->Stop(); |
FOR_EACH_OBSERVER(WebContentsObserver, observers_, NavigationStopped()); |
} |
@@ -1007,7 +1014,7 @@ void WebContentsImpl::Init(const WebContents::CreateParams& params) { |
// init calls back into us via its delegate to ask if it should be hidden. |
should_normally_be_visible_ = !params.initially_hidden; |
- render_manager_.Init( |
+ GetRenderManager()->Init( |
params.browser_context, params.site_instance, params.routing_id, |
params.main_frame_routing_id); |
@@ -1574,7 +1581,7 @@ void WebContentsImpl::RenderViewForInterstitialPageCreated( |
void WebContentsImpl::AttachInterstitialPage( |
InterstitialPageImpl* interstitial_page) { |
DCHECK(interstitial_page); |
- render_manager_.set_interstitial_page(interstitial_page); |
+ GetRenderManager()->set_interstitial_page(interstitial_page); |
// Cancel any visible dialogs so that they don't interfere with the |
// interstitial. |
@@ -1587,7 +1594,7 @@ void WebContentsImpl::AttachInterstitialPage( |
void WebContentsImpl::DetachInterstitialPage() { |
if (GetInterstitialPage()) |
- render_manager_.remove_interstitial_page(); |
+ GetRenderManager()->remove_interstitial_page(); |
FOR_EACH_OBSERVER(WebContentsObserver, observers_, |
DidDetachInterstitialPage()); |
} |
@@ -1605,8 +1612,16 @@ bool WebContentsImpl::NavigateToEntry( |
return false; |
} |
+ // TODO(creis): We need to store the frame ID on entry and use that to find |
+ // the correct RenderManager. |
+ int64 frame_tree_node_id = frame_tree_.root()->frame_tree_node_id(); |
+ if (entry.frame_tree_node_id() != -1) |
+ frame_tree_node_id = entry.frame_tree_node_id(); |
+ |
+ RenderViewHostManager* manager = |
+ frame_tree_.FindByID(frame_tree_node_id)->render_manager(); |
RenderViewHostImpl* dest_render_view_host = |
- static_cast<RenderViewHostImpl*>(render_manager_.Navigate(entry)); |
+ static_cast<RenderViewHostImpl*>(manager->Navigate(entry)); |
if (!dest_render_view_host) |
return false; // Unable to create the desired render view host. |
@@ -1633,6 +1648,10 @@ bool WebContentsImpl::NavigateToEntry( |
current_load_start_ = base::TimeTicks::Now(); |
// Navigate in the desired RenderViewHost. |
+ // TODO(creis): Put frame ID in ViewMsg_Navigate_Params so that we can tell |
+ // the renderer which frame to navigate. Problem: it has to be the frame ID |
+ // in the destination renderer process, not the frame ID in the open params. |
+ // Or... just handle named frames for now. |
ViewMsg_Navigate_Params navigate_params; |
MakeNavigateParams(entry, controller_, delegate_, reload_type, |
&navigate_params); |
@@ -1665,7 +1684,7 @@ void WebContentsImpl::SetHistoryLengthAndPrune( |
int32 minimum_page_id) { |
// SetHistoryLengthAndPrune doesn't work when there are pending cross-site |
// navigations. Callers should ensure that this is the case. |
- if (render_manager_.pending_render_view_host()) { |
+ if (GetRenderManager()->pending_render_view_host()) { |
NOTREACHED(); |
return; |
} |
@@ -1685,18 +1704,18 @@ void WebContentsImpl::SetHistoryLengthAndPrune( |
void WebContentsImpl::FocusThroughTabTraversal(bool reverse) { |
if (ShowingInterstitialPage()) { |
- render_manager_.interstitial_page()->FocusThroughTabTraversal(reverse); |
+ GetRenderManager()->interstitial_page()->FocusThroughTabTraversal(reverse); |
return; |
} |
GetRenderViewHostImpl()->SetInitialFocus(reverse); |
} |
bool WebContentsImpl::ShowingInterstitialPage() const { |
- return render_manager_.interstitial_page() != NULL; |
+ return GetRenderManager()->interstitial_page() != NULL; |
} |
InterstitialPage* WebContentsImpl::GetInterstitialPage() const { |
- return render_manager_.interstitial_page(); |
+ return GetRenderManager()->interstitial_page(); |
} |
bool WebContentsImpl::IsSavable() { |
@@ -1970,6 +1989,13 @@ void WebContentsImpl::DidStartProvisionalLoadForFrame( |
render_view_host->GetProcess(); |
RenderViewHost::FilterURL(render_process_host, false, &validated_url); |
+ // TODO(creis): This is a hack for now, until we mirror the frame tree and do |
+ // cross-process subframe navigations in actual subframes. |
+ NavigationEntryImpl* pending_entry = |
+ NavigationEntryImpl::FromNavigationEntry(controller_.GetPendingEntry()); |
+ if (pending_entry && pending_entry->frame_tree_node_id() != -1) |
+ is_main_frame = false; |
+ |
if (is_main_frame) { |
DidChangeLoadProgress(0); |
@@ -1978,8 +2004,6 @@ void WebContentsImpl::DidStartProvisionalLoadForFrame( |
// SiteInstance, and ensure the address bar updates accordingly. We don't |
// know the referrer or extra headers at this point, but the referrer will |
// be set properly upon commit. |
- NavigationEntryImpl* pending_entry = |
- NavigationEntryImpl::FromNavigationEntry(controller_.GetPendingEntry()); |
bool has_browser_initiated_pending_entry = pending_entry && |
!pending_entry->is_renderer_initiated(); |
if (!has_browser_initiated_pending_entry && !is_error_page) { |
@@ -2088,7 +2112,7 @@ void WebContentsImpl::DidFailProvisionalLoadWithError( |
return; |
} |
- render_manager_.RendererAbortedProvisionalLoad(render_view_host); |
+ GetRenderManager()->RendererAbortedProvisionalLoad(render_view_host); |
} |
// Do not usually clear the pending entry if one exists, so that the user's |
@@ -2491,7 +2515,7 @@ void WebContentsImpl::SetIsLoading(RenderViewHost* render_view_host, |
upload_position_ = 0; |
} |
- render_manager_.SetIsLoading(is_loading); |
+ GetRenderManager()->SetIsLoading(is_loading); |
is_loading_ = is_loading; |
waiting_for_response_ = is_loading; |
@@ -2676,9 +2700,8 @@ RenderViewHostDelegateView* WebContentsImpl::GetDelegateView() { |
return render_view_host_delegate_view_; |
} |
-RenderViewHostDelegate::RendererManagement* |
-WebContentsImpl::GetRendererManagementDelegate() { |
- return &render_manager_; |
+RenderViewHostManager* WebContentsImpl::GetRenderManager() const { |
+ return frame_tree_.root()->render_manager(); |
} |
RendererPreferences WebContentsImpl::GetRendererPrefs( |
@@ -2718,8 +2741,8 @@ void WebContentsImpl::RenderViewCreated(RenderViewHost* render_view_host) { |
// When we're creating views, we're still doing initial setup, so we always |
// use the pending Web UI rather than any possibly existing committed one. |
- if (render_manager_.pending_web_ui()) |
- render_manager_.pending_web_ui()->RenderViewCreated(render_view_host); |
+ if (GetRenderManager()->pending_web_ui()) |
+ GetRenderManager()->pending_web_ui()->RenderViewCreated(render_view_host); |
NavigationEntry* entry = controller_.GetPendingEntry(); |
if (entry && entry->IsViewSourceMode()) { |
@@ -2782,7 +2805,7 @@ void WebContentsImpl::RenderViewTerminated(RenderViewHost* rvh, |
void WebContentsImpl::RenderViewDeleted(RenderViewHost* rvh) { |
ClearPowerSaveBlockers(rvh); |
- render_manager_.RenderViewDeleted(rvh); |
+ GetRenderManager()->RenderViewDeleted(rvh); |
FOR_EACH_OBSERVER(WebContentsObserver, observers_, RenderViewDeleted(rvh)); |
} |
@@ -2816,11 +2839,31 @@ void WebContentsImpl::DidGetRedirectForResourceRequest( |
void WebContentsImpl::DidNavigate( |
RenderViewHost* rvh, |
- const ViewHostMsg_FrameNavigate_Params& params) { |
- if (frame_tree_.IsFirstNavigationAfterSwap()) { |
+ const ViewHostMsg_FrameNavigate_Params& orig_params) { |
+ ViewHostMsg_FrameNavigate_Params params(orig_params); |
+ RenderViewHostImpl* rvhi = static_cast<RenderViewHostImpl*>(rvh); |
+ if (!rvhi->HasFrameTreeNodeID(params.frame_id)) { |
// First navigation should be a main frame navigation. |
- DCHECK(PageTransitionIsMainFrame(params.transition)); |
- frame_tree_.OnFirstNavigationAfterSwap(params.frame_id); |
+ //DCHECK(PageTransitionIsMainFrame(params.transition)); |
+ rvhi->RegisterFrameTreeNodeID(params.frame_id, |
+ frame_tree_.root()->frame_tree_node_id()); |
+ } |
+ |
+ // Look up the FrameTreeNode ID that the renderer-specific frame ID |
+ // corresponds to. |
+ int frame_tree_node_id = rvhi->GetFrameTreeNodeID(params.frame_id); |
+ |
+ // TODO(creis): In the short term, cross-process subframe navigations are |
+ // happening in the pending RenderViewHost's top-level frame. (We need to |
+ // both mirror the frame tree and get the navigation to occur in the correct |
+ // subframe to fix this.) Until then, we should check whether we have a |
+ // pending NavigationEntry with a frame ID and if so, treat the cross-process |
+ // "main frame" navigation as a subframe navigation. |
+ NavigationEntryImpl* pending_entry = NavigationEntryImpl::FromNavigationEntry( |
+ controller_.GetPendingEntry()); |
+ if (pending_entry && pending_entry->frame_tree_node_id() != -1) { |
+ params.transition = PAGE_TRANSITION_AUTO_SUBFRAME; |
+ frame_tree_node_id = pending_entry->frame_tree_node_id(); |
} |
if (PageTransitionIsMainFrame(params.transition)) { |
@@ -2832,9 +2875,16 @@ void WebContentsImpl::DidNavigate( |
// that may have just been swapped out. |
if (delegate_ && delegate_->CanOverscrollContent()) |
controller_.TakeScreenshot(); |
+ } |
- render_manager_.DidNavigateMainFrame(rvh); |
+ FrameTreeNode* frame = frame_tree_.FindByID(frame_tree_node_id); |
+ if (!frame) { |
+ // Just for debugging. We can't trust the renderer to lie about the ID. |
+ NOTREACHED(); |
+ return; |
} |
+ // TODO(creis): Rename to DidNavigateFrame. |
+ frame->render_manager()->DidNavigateMainFrame(rvh); |
// Update the site of the SiteInstance if it doesn't have one yet, unless |
// assigning a site is not necessary for this URL. In that case, the |
@@ -2862,7 +2912,7 @@ void WebContentsImpl::DidNavigate( |
// For now, keep track of each frame's URL in its FrameTreeNode. This lets |
// us estimate our process count for implementing OOP iframes. |
// TODO(creis): Remove this when we track which pages commit in each frame. |
- frame_tree_.SetFrameUrl(params.frame_id, params.url); |
+ frame_tree_.SetFrameUrl(frame_tree_node_id, params.url); |
// Send notification about committed provisional loads. This notification is |
// different from the NAV_ENTRY_COMMITTED notification which doesn't include |
@@ -2918,7 +2968,9 @@ void WebContentsImpl::UpdateState(RenderViewHost* rvh, |
const PageState& page_state) { |
// Ensure that this state update comes from either the active RVH or one of |
// the swapped out RVHs. We don't expect to hear from any other RVHs. |
- DCHECK(rvh == GetRenderViewHost() || render_manager_.IsOnSwappedOutList(rvh)); |
+ // TODO(creis): This should go through RenderFrameHost. |
+ //DCHECK(rvh == GetRenderViewHost() || |
+ // GetRenderManager()->IsOnSwappedOutList(rvh)); |
// We must be prepared to handle state updates for any page, these occur |
// when the user is scrolling and entering form data, as well as when we're |
@@ -3001,7 +3053,9 @@ void WebContentsImpl::SwappedOut(RenderViewHost* rvh) { |
delegate_->SwappedOut(this); |
// Allow the navigation to proceed. |
- render_manager_.SwappedOut(rvh); |
+ // TODO(creis): We can't make progress until we use the correct RVHM here. |
+ // Otherwise there's no pending_nav_params_ in the subframe RVHM. |
+ GetRenderManager()->SwappedOut(rvh); |
} |
void WebContentsImpl::RequestMove(const gfx::Rect& new_bounds) { |
@@ -3059,7 +3113,7 @@ void WebContentsImpl::DidDisownOpener(RenderViewHost* rvh) { |
// Notify all swapped out RenderViewHosts for this tab. This is important |
// in case we go back to them, or if another window in those processes tries |
// to access window.opener. |
- render_manager_.DidDisownOpener(rvh); |
+ GetRenderManager()->DidDisownOpener(rvh); |
} |
void WebContentsImpl::DidAccessInitialDocument() { |
@@ -3126,7 +3180,13 @@ void WebContentsImpl::RequestTransferURL( |
GetSiteInstance(), url)) |
dest_url = GURL(kAboutBlankURL); |
- OpenURLParams params(dest_url, referrer, source_frame_id, disposition, |
+ int64 frame_tree_node_id = -1; |
+ if (source_frame_id != -1) { |
+ frame_tree_node_id = static_cast<RenderViewHostImpl*>( |
+ GetRenderViewHost())->GetFrameTreeNodeID(source_frame_id); |
+ } |
+ OpenURLParams params(dest_url, referrer, source_frame_id, |
+ frame_tree_node_id, disposition, |
page_transition, true /* is_renderer_initiated */); |
if (redirect_chain.size() > 0) |
params.redirect_chain = redirect_chain; |
@@ -3134,13 +3194,13 @@ void WebContentsImpl::RequestTransferURL( |
params.should_replace_current_entry = should_replace_current_entry; |
params.user_gesture = user_gesture; |
- if (render_manager_.web_ui()) { |
+ if (GetRenderManager()->web_ui()) { |
// Web UI pages sometimes want to override the page transition type for |
// link clicks (e.g., so the new tab page can specify AUTO_BOOKMARK for |
// automatically generated suggestions). We don't override other types |
// like TYPED because they have different implications (e.g., autocomplete). |
if (PageTransitionCoreTypeIs(params.transition, PAGE_TRANSITION_LINK)) |
- params.transition = render_manager_.web_ui()->GetLinkTransitionType(); |
+ params.transition = GetRenderManager()->web_ui()->GetLinkTransitionType(); |
// Note also that we hide the referrer for Web UI pages. We don't really |
// want web sites to see a referrer of "chrome://blah" (and some |
@@ -3337,13 +3397,13 @@ WebPreferences WebContentsImpl::GetWebkitPrefs() { |
GURL url = controller_.GetActiveEntry() |
? controller_.GetActiveEntry()->GetURL() : GURL::EmptyGURL(); |
- return render_manager_.current_host()->GetWebkitPrefs(url); |
+ return GetRenderManager()->current_host()->GetWebkitPrefs(url); |
} |
int WebContentsImpl::CreateSwappedOutRenderView( |
SiteInstance* instance) { |
- return render_manager_.CreateRenderView(instance, MSG_ROUTING_NONE, |
- true, true); |
+ return GetRenderManager()->CreateRenderFrame(instance, MSG_ROUTING_NONE, |
+ true, true); |
} |
void WebContentsImpl::OnUserGesture() { |
@@ -3380,7 +3440,7 @@ void WebContentsImpl::RendererUnresponsive(RenderViewHost* rvh, |
// Pretend the handler fired so tab closing continues as if it had. |
rvhi->set_sudden_termination_allowed(true); |
- if (!render_manager_.ShouldCloseTabOnUnresponsiveRenderer()) |
+ if (!GetRenderManager()->ShouldCloseTabOnUnresponsiveRenderer()) |
return; |
// If the tab hangs in the beforeunload/unload handler there's really |
@@ -3497,22 +3557,23 @@ int WebContentsImpl::CreateOpenerRenderViews(SiteInstance* instance) { |
// If any of the renderers (current, pending, or swapped out) for this |
// WebContents has the same SiteInstance, use it. |
- if (render_manager_.current_host()->GetSiteInstance() == instance) |
- return render_manager_.current_host()->GetRoutingID(); |
+ if (GetRenderManager()->current_host()->GetSiteInstance() == instance) |
+ return GetRenderManager()->current_host()->GetRoutingID(); |
- if (render_manager_.pending_render_view_host() && |
- render_manager_.pending_render_view_host()->GetSiteInstance() == instance) |
- return render_manager_.pending_render_view_host()->GetRoutingID(); |
+ if (GetRenderManager()->pending_render_view_host() && |
+ GetRenderManager()->pending_render_view_host()->GetSiteInstance() == |
+ instance) |
+ return GetRenderManager()->pending_render_view_host()->GetRoutingID(); |
- RenderViewHostImpl* rvh = render_manager_.GetSwappedOutRenderViewHost( |
+ RenderViewHostImpl* rvh = GetRenderManager()->GetSwappedOutRenderViewHost( |
instance); |
if (rvh) |
return rvh->GetRoutingID(); |
// Create a swapped out RenderView in the given SiteInstance if none exists, |
// setting its opener to the given route_id. Return the new view's route_id. |
- return render_manager_.CreateRenderView(instance, opener_route_id, |
- true, true); |
+ return GetRenderManager()->CreateRenderFrame(instance, opener_route_id, |
+ true, true); |
} |
NavigationControllerImpl& WebContentsImpl::GetControllerForRenderManager() { |