Index: content/browser/tab_contents/render_view_host_manager.cc |
diff --git a/content/browser/tab_contents/render_view_host_manager.cc b/content/browser/tab_contents/render_view_host_manager.cc |
index accb225b1c5808bb66ad55cab9b8864091770437..d827a087282cc5269e76233f4a8f4840aca65e37 100644 |
--- a/content/browser/tab_contents/render_view_host_manager.cc |
+++ b/content/browser/tab_contents/render_view_host_manager.cc |
@@ -393,9 +393,19 @@ SiteInstance* RenderViewHostManager::GetSiteInstanceForEntry( |
SiteInstance* curr_instance) { |
// NOTE: This is only called when ShouldTransitionCrossSite is true. |
- // If the entry has an instance already, we should use it. |
- if (entry.site_instance()) |
- return entry.site_instance(); |
+ const GURL& dest_url = entry.url(); |
+ NavigationController& controller = delegate_->GetControllerForRenderManager(); |
+ Profile* profile = controller.profile(); |
+ |
+ // If the entry has an instance already we should use it, unless the URL |
+ // is part of an app that has been installed or uninstalled since the last |
+ // visit. |
+ if (entry.site_instance()) { |
+ if (entry.site_instance()->HasWrongProcessForURL(dest_url)) |
+ return curr_instance->GetRelatedSiteInstance(dest_url); |
+ else |
+ return entry.site_instance(); |
+ } |
// (UGLY) HEURISTIC, process-per-site only: |
// |
@@ -411,10 +421,6 @@ SiteInstance* RenderViewHostManager::GetSiteInstanceForEntry( |
entry.transition_type() == PageTransition::GENERATED) |
return curr_instance; |
- const GURL& dest_url = entry.url(); |
- NavigationController& controller = delegate_->GetControllerForRenderManager(); |
- Profile* profile = controller.profile(); |
- |
// If we haven't used our SiteInstance (and thus RVH) yet, then we can use it |
// for this entry. We won't commit the SiteInstance to this site until the |
// navigation commits (in DidNavigate), unless the navigation entry was |
@@ -480,7 +486,11 @@ SiteInstance* RenderViewHostManager::GetSiteInstanceForEntry( |
const GURL& current_url = (curr_entry) ? curr_entry->url() : |
curr_instance->site(); |
- if (SiteInstance::IsSameWebSite(profile, current_url, dest_url)) { |
+ // Use the current SiteInstance for same site navigations, as long as the |
+ // process type is correct. (The URL may have been installed as an app since |
+ // the last time we visited it.) |
+ if (SiteInstance::IsSameWebSite(profile, current_url, dest_url) && |
+ !curr_instance->HasWrongProcessForURL(dest_url)) { |
return curr_instance; |
} else if (ShouldSwapProcessesForNavigation(curr_entry, &entry)) { |
// When we're swapping, we need to force the site instance AND browsing |