Index: content/browser/frame_host/render_frame_host_manager.cc |
diff --git a/content/browser/frame_host/render_frame_host_manager.cc b/content/browser/frame_host/render_frame_host_manager.cc |
index 0321d7b9a334ba7d80a0ee2fe1bd331a9cf4fe9b..ac36d9eca78f0a250104bd7c9abd2c7e79d16065 100644 |
--- a/content/browser/frame_host/render_frame_host_manager.cc |
+++ b/content/browser/frame_host/render_frame_host_manager.cc |
@@ -25,6 +25,7 @@ |
#include "content/browser/renderer_host/render_view_host_factory.h" |
#include "content/browser/renderer_host/render_view_host_impl.h" |
#include "content/browser/site_instance_impl.h" |
+#include "content/browser/transition_request_manager.h" |
#include "content/browser/webui/web_ui_controller_factory_registry.h" |
#include "content/browser/webui/web_ui_impl.h" |
#include "content/common/view_messages.h" |
@@ -59,6 +60,16 @@ RenderFrameHostManager::PendingNavigationParams::PendingNavigationParams( |
RenderFrameHostManager::PendingNavigationParams::~PendingNavigationParams() {} |
+RenderFrameHostManager::TransitionParams::TransitionParams( |
+ const GlobalRequestID& global_request_id, |
+ const GURL& transition_url) |
+ : global_request_id(global_request_id), |
+ transition_url(transition_url) { |
+} |
+ |
+RenderFrameHostManager::TransitionParams::~TransitionParams() { |
+} |
+ |
bool RenderFrameHostManager::ClearRFHsPendingShutdown(FrameTreeNode* node) { |
node->render_manager()->pending_delete_hosts_.clear(); |
return true; |
@@ -358,22 +369,31 @@ void RenderFrameHostManager::OnCrossSiteResponse( |
void RenderFrameHostManager::OnDeferredAfterResponseStarted( |
const GlobalRequestID& global_request_id, |
- RenderFrameHostImpl* pending_render_frame_host) { |
- DCHECK(!response_started_id_.get()); |
+ RenderFrameHostImpl* pending_render_frame_host, |
+ const GURL& transition_url) { |
+ DCHECK(!response_started_params_.get()); |
+ |
+ TransitionRequestManager::GetInstance()->AddPendingTransitionProcessID( |
+ transition_url, pending_render_frame_host->GetProcess()->GetID()); |
- response_started_id_.reset(new GlobalRequestID(global_request_id)); |
+ response_started_params_.reset( |
+ new TransitionParams(global_request_id, transition_url)); |
} |
void RenderFrameHostManager::ResumeResponseDeferredAtStart() { |
- DCHECK(response_started_id_.get()); |
+ DCHECK(response_started_params_.get()); |
RenderProcessHostImpl* process = |
static_cast<RenderProcessHostImpl*>(render_frame_host_->GetProcess()); |
- process->ResumeResponseDeferredAtStart(*response_started_id_); |
+ process->ResumeResponseDeferredAtStart( |
+ response_started_params_->global_request_id); |
+ |
+ TransitionRequestManager::GetInstance()->ClearPendingTransitionProcessID( |
+ response_started_params_->transition_url); |
render_frame_host_->SetHasPendingTransitionRequest(false); |
- response_started_id_.reset(); |
+ response_started_params_.reset(); |
} |
void RenderFrameHostManager::SwappedOut( |
@@ -760,6 +780,14 @@ SiteInstance* RenderFrameHostManager::GetSiteInstanceForEntry( |
// navigation commits (in DidNavigate), unless the navigation entry was |
// restored or it's a Web UI as described below. |
if (!current_site_instance->HasSite()) { |
+ // If the virtual transition url is set, we should use it instead so that |
+ // when GetProcess() is called, the virtual transition url is used to |
+ // retrieve the correct renderer. |
+ if (!entry.GetVirtualURLForTransition().is_empty()) { |
+ return SiteInstance::CreateForURL(browser_context, |
+ entry.GetVirtualURLForTransition()); |
+ } |
+ |
// If we've already created a SiteInstance for our destination, we don't |
// want to use this unused SiteInstance; use the existing one. (We don't |
// do this check if the current_instance has a site, because for now, we |