Index: content/browser/tab_contents/tab_contents.cc |
diff --git a/content/browser/tab_contents/tab_contents.cc b/content/browser/tab_contents/tab_contents.cc |
index 9a763e9a85b67e6b0c41c754b37ee8ea1bcd56d7..95e00096b01038b0bf6c6cb7803fc0588ba9712c 100644 |
--- a/content/browser/tab_contents/tab_contents.cc |
+++ b/content/browser/tab_contents/tab_contents.cc |
@@ -571,27 +571,34 @@ TabContents* TabContents::OpenURL(const OpenURLParams& params) { |
bool TabContents::NavigateToPendingEntry( |
NavigationController::ReloadType reload_type) { |
- return NavigateToEntry(*controller_.pending_entry(), reload_type); |
+ return NavigateToEntry(controller_.pending_entry(), reload_type); |
} |
bool TabContents::NavigateToEntry( |
- const NavigationEntry& entry, |
+ NavigationEntry* entry, |
NavigationController::ReloadType reload_type) { |
// The renderer will reject IPC messages with URLs longer than |
// this limit, so don't attempt to navigate with a longer URL. |
- if (entry.url().spec().size() > content::kMaxURLChars) |
+ if (entry->url().spec().size() > content::kMaxURLChars) |
return false; |
- RenderViewHost* dest_render_view_host = render_manager_.Navigate(entry); |
+ RenderViewHost* dest_render_view_host = render_manager_.Navigate(*entry); |
if (!dest_render_view_host) |
return false; // Unable to create the desired render view host. |
+ // If we were forced to swap the entry's existing SiteInstance, we need to |
+ // update it before the navigation begins so that we can find it when the |
+ // navigation commits. |
+ if (entry->site_instance() && |
+ entry->site_instance() != dest_render_view_host->site_instance()) |
+ entry->set_site_instance(dest_render_view_host->site_instance()); |
+ |
// For security, we should never send non-Web-UI URLs to a Web UI renderer. |
// Double check that here. |
int enabled_bindings = dest_render_view_host->enabled_bindings(); |
bool is_allowed_in_web_ui_renderer = content::GetContentClient()-> |
browser()->GetWebUIFactory()->IsURLAcceptableForWebUI(browser_context(), |
- entry.url()); |
+ entry->url()); |
CHECK(!(enabled_bindings & content::BINDINGS_POLICY_WEB_UI) || |
is_allowed_in_web_ui_renderer); |
@@ -600,7 +607,7 @@ bool TabContents::NavigateToEntry( |
if (devtools_manager) { // NULL in unit tests. |
devtools_manager->OnNavigatingToPendingEntry(render_view_host(), |
dest_render_view_host, |
- entry.url()); |
+ entry->url()); |
} |
// Used for page load time metrics. |
@@ -608,24 +615,24 @@ bool TabContents::NavigateToEntry( |
// Navigate in the desired RenderViewHost. |
ViewMsg_Navigate_Params navigate_params; |
- MakeNavigateParams(entry, controller_, delegate_, reload_type, |
+ MakeNavigateParams(*entry, controller_, delegate_, reload_type, |
&navigate_params); |
dest_render_view_host->Navigate(navigate_params); |
- if (entry.page_id() == -1) { |
+ if (entry->page_id() == -1) { |
// HACK!! This code suppresses javascript: URLs from being added to |
// session history, which is what we want to do for javascript: URLs that |
// do not generate content. What we really need is a message from the |
// renderer telling us that a new page was not created. The same message |
// could be used for mailto: URLs and the like. |
- if (entry.url().SchemeIs(chrome::kJavaScriptScheme)) |
+ if (entry->url().SchemeIs(chrome::kJavaScriptScheme)) |
return false; |
} |
// Notify observers about navigation. |
FOR_EACH_OBSERVER(TabContentsObserver, |
observers_, |
- NavigateToPendingEntry(entry.url(), reload_type)); |
+ NavigateToPendingEntry(entry->url(), reload_type)); |
if (delegate_) |
delegate_->DidNavigateToPendingEntry(this); |
@@ -1075,7 +1082,7 @@ void TabContents::OnGoToEntryAtOffset(int offset) { |
content::PageTransitionFromInt( |
entry->transition_type() | |
content::PAGE_TRANSITION_FORWARD_BACK)); |
- NavigateToEntry(*entry, NavigationController::NO_RELOAD); |
+ NavigateToEntry(entry, NavigationController::NO_RELOAD); |
// If the entry is being restored and doesn't have a SiteInstance yet, fill |
// it in now that we know. This allows us to find the entry when it commits. |