Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1615)

Side by Side Diff: content/browser/frame_host/render_frame_host_manager.cc

Issue 1412333002: Revert of Properly recreate swapped out RenderView. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/frame_host/render_frame_host_manager.h" 5 #include "content/browser/frame_host/render_frame_host_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 // occur before initializing the RenderView; the flow of creating the 411 // occur before initializing the RenderView; the flow of creating the
412 // RenderView can cause browser-side code to execute that expects the this 412 // RenderView can cause browser-side code to execute that expects the this
413 // RFH's ServiceRegistry to be initialized (e.g., if the site is a WebUI 413 // RFH's ServiceRegistry to be initialized (e.g., if the site is a WebUI
414 // site that is handled via Mojo, then Mojo WebUI code in //chrome will 414 // site that is handled via Mojo, then Mojo WebUI code in //chrome will
415 // add a service to this RFH's ServiceRegistry). 415 // add a service to this RFH's ServiceRegistry).
416 dest_render_frame_host->SetUpMojoIfNeeded(); 416 dest_render_frame_host->SetUpMojoIfNeeded();
417 417
418 // Recreate the opener chain. 418 // Recreate the opener chain.
419 CreateOpenerProxies(dest_render_frame_host->GetSiteInstance(), 419 CreateOpenerProxies(dest_render_frame_host->GetSiteInstance(),
420 frame_tree_node_); 420 frame_tree_node_);
421 if (!InitRenderView(dest_render_frame_host->render_view_host(), nullptr)) 421 if (!InitRenderView(dest_render_frame_host->render_view_host(),
422 MSG_ROUTING_NONE))
422 return nullptr; 423 return nullptr;
423 424
424 // Now that we've created a new renderer, be sure to hide it if it isn't 425 // Now that we've created a new renderer, be sure to hide it if it isn't
425 // our primary one. Otherwise, we might crash if we try to call Show() 426 // our primary one. Otherwise, we might crash if we try to call Show()
426 // on it later. 427 // on it later.
427 if (dest_render_frame_host != render_frame_host_) { 428 if (dest_render_frame_host != render_frame_host_) {
428 if (dest_render_frame_host->GetView()) 429 if (dest_render_frame_host->GetView())
429 dest_render_frame_host->GetView()->Hide(); 430 dest_render_frame_host->GetView()->Hide();
430 } else { 431 } else {
431 // After a renderer crash we'd have marked the host as invisible, so we 432 // After a renderer crash we'd have marked the host as invisible, so we
(...skipping 637 matching lines...) Expand 10 before | Expand all | Expand 10 after
1069 } 1070 }
1070 DCHECK(navigation_rfh && 1071 DCHECK(navigation_rfh &&
1071 (navigation_rfh == render_frame_host_.get() || 1072 (navigation_rfh == render_frame_host_.get() ||
1072 navigation_rfh == speculative_render_frame_host_.get())); 1073 navigation_rfh == speculative_render_frame_host_.get()));
1073 1074
1074 // If the RenderFrame that needs to navigate is not live (its process was just 1075 // If the RenderFrame that needs to navigate is not live (its process was just
1075 // created or has crashed), initialize it. 1076 // created or has crashed), initialize it.
1076 if (!navigation_rfh->IsRenderFrameLive()) { 1077 if (!navigation_rfh->IsRenderFrameLive()) {
1077 // Recreate the opener chain. 1078 // Recreate the opener chain.
1078 CreateOpenerProxies(navigation_rfh->GetSiteInstance(), frame_tree_node_); 1079 CreateOpenerProxies(navigation_rfh->GetSiteInstance(), frame_tree_node_);
1079 if (!InitRenderView(navigation_rfh->render_view_host(), nullptr)) { 1080 if (!InitRenderView(navigation_rfh->render_view_host(), MSG_ROUTING_NONE)) {
1080 return nullptr; 1081 return nullptr;
1081 } 1082 }
1082 1083
1083 if (navigation_rfh == render_frame_host_) { 1084 if (navigation_rfh == render_frame_host_) {
1084 // TODO(nasko): This is a very ugly hack. The Chrome extensions process 1085 // TODO(nasko): This is a very ugly hack. The Chrome extensions process
1085 // manager still uses NotificationService and expects to see a 1086 // manager still uses NotificationService and expects to see a
1086 // RenderViewHost changed notification after WebContents and 1087 // RenderViewHost changed notification after WebContents and
1087 // RenderFrameHostManager are completely initialized. This should be 1088 // RenderFrameHostManager are completely initialized. This should be
1088 // removed once the process manager moves away from NotificationService. 1089 // removed once the process manager moves away from NotificationService.
1089 // See https://crbug.com/462682. 1090 // See https://crbug.com/462682.
(...skipping 696 matching lines...) Expand 10 before | Expand all | Expand 10 after
1786 // Prevent the process from exiting while we're trying to use it. 1787 // Prevent the process from exiting while we're trying to use it.
1787 if (!swapped_out) { 1788 if (!swapped_out) {
1788 new_render_frame_host = proxy->PassFrameHostOwnership(); 1789 new_render_frame_host = proxy->PassFrameHostOwnership();
1789 new_render_frame_host->GetProcess()->AddPendingView(); 1790 new_render_frame_host->GetProcess()->AddPendingView();
1790 1791
1791 proxy_hosts_->Remove(instance->GetId()); 1792 proxy_hosts_->Remove(instance->GetId());
1792 // NB |proxy| is deleted at this point. 1793 // NB |proxy| is deleted at this point.
1793 1794
1794 // If we are reusing the RenderViewHost and it doesn't already have a 1795 // If we are reusing the RenderViewHost and it doesn't already have a
1795 // RenderWidgetHostView, we need to create one if this is the main frame. 1796 // RenderWidgetHostView, we need to create one if this is the main frame.
1796 if (render_view_host->IsRenderViewLive() && 1797 if (!render_view_host->GetWidget()->GetView() &&
1797 !render_view_host->GetWidget()->GetView() &&
1798 frame_tree_node_->IsMainFrame()) { 1798 frame_tree_node_->IsMainFrame()) {
1799 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host); 1799 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host);
1800 } 1800 }
1801 } 1801 }
1802 } else { 1802 } else {
1803 // Create a new RenderFrameHost if we don't find an existing one. 1803 // Create a new RenderFrameHost if we don't find an existing one.
1804 1804
1805 int32 widget_routing_id = MSG_ROUTING_NONE; 1805 int32 widget_routing_id = MSG_ROUTING_NONE;
1806 // A RenderFrame in a different process from its parent RenderFrame 1806 // A RenderFrame in a different process from its parent RenderFrame
1807 // requires a RenderWidget for input/layout/painting. 1807 // requires a RenderWidget for input/layout/painting.
1808 if (frame_tree_node_->parent() && 1808 if (frame_tree_node_->parent() &&
1809 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() != 1809 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() !=
1810 instance) { 1810 instance) {
1811 CHECK(SiteIsolationPolicy::AreCrossProcessFramesPossible()); 1811 CHECK(SiteIsolationPolicy::AreCrossProcessFramesPossible());
1812 widget_routing_id = instance->GetProcess()->GetNextRoutingID(); 1812 widget_routing_id = instance->GetProcess()->GetNextRoutingID();
1813 } 1813 }
1814 1814
1815 new_render_frame_host = CreateRenderFrameHost( 1815 new_render_frame_host = CreateRenderFrameHost(
1816 instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, widget_routing_id, flags); 1816 instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, widget_routing_id, flags);
1817 RenderViewHostImpl* render_view_host = 1817 RenderViewHostImpl* render_view_host =
1818 new_render_frame_host->render_view_host(); 1818 new_render_frame_host->render_view_host();
1819 int proxy_routing_id = MSG_ROUTING_NONE;
1819 1820
1820 // Prevent the process from exiting while we're trying to navigate in it. 1821 // Prevent the process from exiting while we're trying to navigate in it.
1821 // Otherwise, if the new RFH is swapped out already, store it. 1822 // Otherwise, if the new RFH is swapped out already, store it.
1822 if (!swapped_out) { 1823 if (!swapped_out) {
1823 new_render_frame_host->GetProcess()->AddPendingView(); 1824 new_render_frame_host->GetProcess()->AddPendingView();
1824 } else { 1825 } else {
1825 proxy = new RenderFrameProxyHost( 1826 proxy = new RenderFrameProxyHost(
1826 new_render_frame_host->GetSiteInstance(), 1827 new_render_frame_host->GetSiteInstance(),
1827 new_render_frame_host->render_view_host(), frame_tree_node_); 1828 new_render_frame_host->render_view_host(), frame_tree_node_);
1828 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy)); 1829 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy));
1830 proxy_routing_id = proxy->GetRoutingID();
1829 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); 1831 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass());
1830 } 1832 }
1831 1833
1832 if (frame_tree_node_->IsMainFrame()) { 1834 if (frame_tree_node_->IsMainFrame()) {
1833 success = InitRenderView(render_view_host, proxy); 1835 success = InitRenderView(render_view_host, proxy_routing_id);
1834 1836
1835 // If we are reusing the RenderViewHost and it doesn't already have a 1837 // If we are reusing the RenderViewHost and it doesn't already have a
1836 // RenderWidgetHostView, we need to create one if this is the main frame. 1838 // RenderWidgetHostView, we need to create one if this is the main frame.
1837 if (!swapped_out && !render_view_host->GetWidget()->GetView()) 1839 if (!swapped_out && !render_view_host->GetWidget()->GetView())
1838 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host); 1840 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host);
1839 } else { 1841 } else {
1840 DCHECK(render_view_host->IsRenderViewLive()); 1842 DCHECK(render_view_host->IsRenderViewLive());
1841 } 1843 }
1842 1844
1843 if (success) { 1845 if (success) {
1846 // Remember that InitRenderView also created the RenderFrameProxy.
1847 if (swapped_out)
1848 proxy->set_render_frame_proxy_created(true);
1844 if (frame_tree_node_->IsMainFrame()) { 1849 if (frame_tree_node_->IsMainFrame()) {
1845 // Don't show the main frame's view until we get a DidNavigate from it. 1850 // Don't show the main frame's view until we get a DidNavigate from it.
1846 // Only the RenderViewHost for the top-level RenderFrameHost has a 1851 // Only the RenderViewHost for the top-level RenderFrameHost has a
1847 // RenderWidgetHostView; RenderWidgetHosts for out-of-process iframes 1852 // RenderWidgetHostView; RenderWidgetHosts for out-of-process iframes
1848 // will be created later and hidden. 1853 // will be created later and hidden.
1849 if (render_view_host->GetWidget()->GetView()) 1854 if (render_view_host->GetWidget()->GetView())
1850 render_view_host->GetWidget()->GetView()->Hide(); 1855 render_view_host->GetWidget()->GetView()->Hide();
1851 } 1856 }
1852 // RenderViewHost for |instance| might exist prior to calling 1857 // RenderViewHost for |instance| might exist prior to calling
1853 // CreateRenderFrame. In such a case, InitRenderView will not create the 1858 // CreateRenderFrame. In such a case, InitRenderView will not create the
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1914 return proxy->GetRoutingID(); 1919 return proxy->GetRoutingID();
1915 1920
1916 if (!proxy) { 1921 if (!proxy) {
1917 proxy = 1922 proxy =
1918 new RenderFrameProxyHost(instance, render_view_host, frame_tree_node_); 1923 new RenderFrameProxyHost(instance, render_view_host, frame_tree_node_);
1919 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy)); 1924 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy));
1920 } 1925 }
1921 1926
1922 if (SiteIsolationPolicy::IsSwappedOutStateForbidden() && 1927 if (SiteIsolationPolicy::IsSwappedOutStateForbidden() &&
1923 frame_tree_node_->IsMainFrame()) { 1928 frame_tree_node_->IsMainFrame()) {
1924 InitRenderView(render_view_host, proxy); 1929 InitRenderView(render_view_host, proxy->GetRoutingID());
1930 proxy->set_render_frame_proxy_created(true);
1925 } else { 1931 } else {
1926 proxy->InitRenderFrameProxy(); 1932 proxy->InitRenderFrameProxy();
1927 } 1933 }
1928 1934
1929 return proxy->GetRoutingID(); 1935 return proxy->GetRoutingID();
1930 } 1936 }
1931 1937
1932 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) { 1938 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) {
1933 for (const auto& pair : *proxy_hosts_) { 1939 for (const auto& pair : *proxy_hosts_) {
1934 // Do not create proxies for subframes in the outer delegate's process, 1940 // Do not create proxies for subframes in the outer delegate's process,
(...skipping 13 matching lines...) Expand all
1948 1954
1949 if (render_view_host->IsRenderViewLive()) 1955 if (render_view_host->IsRenderViewLive())
1950 return; 1956 return;
1951 1957
1952 // If the proxy in |instance| doesn't exist, this RenderView is not swapped 1958 // If the proxy in |instance| doesn't exist, this RenderView is not swapped
1953 // out and shouldn't be reinitialized here. 1959 // out and shouldn't be reinitialized here.
1954 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); 1960 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance);
1955 if (!proxy) 1961 if (!proxy)
1956 return; 1962 return;
1957 1963
1958 InitRenderView(render_view_host, proxy); 1964 InitRenderView(render_view_host, proxy->GetRoutingID());
1965 proxy->set_render_frame_proxy_created(true);
1959 } 1966 }
1960 1967
1961 void RenderFrameHostManager::CreateOuterDelegateProxy( 1968 void RenderFrameHostManager::CreateOuterDelegateProxy(
1962 SiteInstance* outer_contents_site_instance, 1969 SiteInstance* outer_contents_site_instance,
1963 RenderFrameHostImpl* render_frame_host) { 1970 RenderFrameHostImpl* render_frame_host) {
1964 CHECK(BrowserPluginGuestMode::UseCrossProcessFramesForGuests()); 1971 CHECK(BrowserPluginGuestMode::UseCrossProcessFramesForGuests());
1965 RenderFrameProxyHost* proxy = new RenderFrameProxyHost( 1972 RenderFrameProxyHost* proxy = new RenderFrameProxyHost(
1966 outer_contents_site_instance, nullptr, frame_tree_node_); 1973 outer_contents_site_instance, nullptr, frame_tree_node_);
1967 proxy_hosts_->Add(outer_contents_site_instance->GetId(), 1974 proxy_hosts_->Add(outer_contents_site_instance->GetId(),
1968 make_scoped_ptr(proxy)); 1975 make_scoped_ptr(proxy));
(...skipping 13 matching lines...) Expand all
1982 } 1989 }
1983 1990
1984 void RenderFrameHostManager::SetRWHViewForInnerContents( 1991 void RenderFrameHostManager::SetRWHViewForInnerContents(
1985 RenderWidgetHostView* child_rwhv) { 1992 RenderWidgetHostView* child_rwhv) {
1986 DCHECK(ForInnerDelegate() && frame_tree_node_->IsMainFrame()); 1993 DCHECK(ForInnerDelegate() && frame_tree_node_->IsMainFrame());
1987 GetProxyToOuterDelegate()->SetChildRWHView(child_rwhv); 1994 GetProxyToOuterDelegate()->SetChildRWHView(child_rwhv);
1988 } 1995 }
1989 1996
1990 bool RenderFrameHostManager::InitRenderView( 1997 bool RenderFrameHostManager::InitRenderView(
1991 RenderViewHostImpl* render_view_host, 1998 RenderViewHostImpl* render_view_host,
1992 RenderFrameProxyHost* proxy) { 1999 int proxy_routing_id) {
1993 // Ensure the renderer process is initialized before creating the 2000 // Ensure the renderer process is initialized before creating the
1994 // RenderView. 2001 // RenderView.
1995 if (!render_view_host->GetProcess()->Init()) 2002 if (!render_view_host->GetProcess()->Init())
1996 return false; 2003 return false;
1997 2004
1998 // We may have initialized this RenderViewHost for another RenderFrameHost. 2005 // We may have initialized this RenderViewHost for another RenderFrameHost.
1999 if (render_view_host->IsRenderViewLive()) 2006 if (render_view_host->IsRenderViewLive())
2000 return true; 2007 return true;
2001 2008
2002 // If |render_view_host| is not for a proxy and the navigation is to a WebUI, 2009 // If |render_view_host| is not for a proxy and the navigation is to a WebUI,
2003 // and if the RenderView is not in a guest process, tell |render_view_host| 2010 // and if the RenderView is not in a guest process, tell |render_view_host|
2004 // about any bindings it will need enabled. 2011 // about any bindings it will need enabled.
2005 // TODO(carlosk): Move WebUI to RenderFrameHost in https://crbug.com/508850. 2012 // TODO(carlosk): Move WebUI to RenderFrameHost in https://crbug.com/508850.
2006 WebUIImpl* dest_web_ui = nullptr; 2013 WebUIImpl* dest_web_ui = nullptr;
2007 if (!proxy) { 2014 DCHECK_EQ(render_view_host->is_active(),
2015 proxy_routing_id == MSG_ROUTING_NONE);
2016 if (proxy_routing_id == MSG_ROUTING_NONE) {
2008 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 2017 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
2009 switches::kEnableBrowserSideNavigation)) { 2018 switches::kEnableBrowserSideNavigation)) {
2010 dest_web_ui = 2019 dest_web_ui =
2011 should_reuse_web_ui_ ? web_ui_.get() : speculative_web_ui_.get(); 2020 should_reuse_web_ui_ ? web_ui_.get() : speculative_web_ui_.get();
2012 } else { 2021 } else {
2013 dest_web_ui = pending_web_ui(); 2022 dest_web_ui = pending_web_ui();
2014 } 2023 }
2015 } 2024 }
2016 if (dest_web_ui && !render_view_host->GetProcess()->IsForGuestsOnly()) { 2025 if (dest_web_ui && !render_view_host->GetProcess()->IsForGuestsOnly()) {
2017 render_view_host->AllowBindings(dest_web_ui->GetBindings()); 2026 render_view_host->AllowBindings(dest_web_ui->GetBindings());
2018 } else { 2027 } else {
2019 // Ensure that we don't create an unprivileged RenderView in a WebUI-enabled 2028 // Ensure that we don't create an unprivileged RenderView in a WebUI-enabled
2020 // process unless it's swapped out. 2029 // process unless it's swapped out.
2021 if (render_view_host->is_active()) { 2030 if (render_view_host->is_active()) {
2022 CHECK(!ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( 2031 CHECK(!ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings(
2023 render_view_host->GetProcess()->GetID())); 2032 render_view_host->GetProcess()->GetID()));
2024 } 2033 }
2025 } 2034 }
2026 2035
2027 int opener_frame_routing_id = 2036 int opener_frame_routing_id =
2028 GetOpenerRoutingID(render_view_host->GetSiteInstance()); 2037 GetOpenerRoutingID(render_view_host->GetSiteInstance());
2029 2038
2030 bool created = delegate_->CreateRenderViewForRenderManager( 2039 return delegate_->CreateRenderViewForRenderManager(
2031 render_view_host, opener_frame_routing_id, 2040 render_view_host, opener_frame_routing_id, proxy_routing_id,
2032 proxy ? proxy->GetRoutingID() : MSG_ROUTING_NONE,
2033 frame_tree_node_->current_replication_state()); 2041 frame_tree_node_->current_replication_state());
2034
2035 if (created && proxy)
2036 proxy->set_render_frame_proxy_created(true);
2037
2038 return created;
2039 } 2042 }
2040 2043
2041 bool RenderFrameHostManager::InitRenderFrame( 2044 bool RenderFrameHostManager::InitRenderFrame(
2042 RenderFrameHostImpl* render_frame_host) { 2045 RenderFrameHostImpl* render_frame_host) {
2043 if (render_frame_host->IsRenderFrameLive()) 2046 if (render_frame_host->IsRenderFrameLive())
2044 return true; 2047 return true;
2045 2048
2046 SiteInstance* site_instance = render_frame_host->GetSiteInstance(); 2049 SiteInstance* site_instance = render_frame_host->GetSiteInstance();
2047 2050
2048 int opener_routing_id = MSG_ROUTING_NONE; 2051 int opener_routing_id = MSG_ROUTING_NONE;
(...skipping 598 matching lines...) Expand 10 before | Expand all | Expand 10 after
2647 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) { 2650 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) {
2648 if (!frame_tree_node_->opener()) 2651 if (!frame_tree_node_->opener())
2649 return MSG_ROUTING_NONE; 2652 return MSG_ROUTING_NONE;
2650 2653
2651 return frame_tree_node_->opener() 2654 return frame_tree_node_->opener()
2652 ->render_manager() 2655 ->render_manager()
2653 ->GetRoutingIdForSiteInstance(instance); 2656 ->GetRoutingIdForSiteInstance(instance);
2654 } 2657 }
2655 2658
2656 } // namespace content 2659 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698