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

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

Issue 1415303002: Refactor RFHM::InitRenderView to take in RenderFrameProxyHost parameter (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
« no previous file with comments | « content/browser/frame_host/render_frame_host_manager.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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(), 421 if (!InitRenderView(dest_render_frame_host->render_view_host(), nullptr))
422 MSG_ROUTING_NONE))
423 return nullptr; 422 return nullptr;
424 423
425 // Now that we've created a new renderer, be sure to hide it if it isn't 424 // Now that we've created a new renderer, be sure to hide it if it isn't
426 // our primary one. Otherwise, we might crash if we try to call Show() 425 // our primary one. Otherwise, we might crash if we try to call Show()
427 // on it later. 426 // on it later.
428 if (dest_render_frame_host != render_frame_host_) { 427 if (dest_render_frame_host != render_frame_host_) {
429 if (dest_render_frame_host->GetView()) 428 if (dest_render_frame_host->GetView())
430 dest_render_frame_host->GetView()->Hide(); 429 dest_render_frame_host->GetView()->Hide();
431 } else { 430 } else {
432 // After a renderer crash we'd have marked the host as invisible, so we 431 // 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
1070 } 1069 }
1071 DCHECK(navigation_rfh && 1070 DCHECK(navigation_rfh &&
1072 (navigation_rfh == render_frame_host_.get() || 1071 (navigation_rfh == render_frame_host_.get() ||
1073 navigation_rfh == speculative_render_frame_host_.get())); 1072 navigation_rfh == speculative_render_frame_host_.get()));
1074 1073
1075 // If the RenderFrame that needs to navigate is not live (its process was just 1074 // If the RenderFrame that needs to navigate is not live (its process was just
1076 // created or has crashed), initialize it. 1075 // created or has crashed), initialize it.
1077 if (!navigation_rfh->IsRenderFrameLive()) { 1076 if (!navigation_rfh->IsRenderFrameLive()) {
1078 // Recreate the opener chain. 1077 // Recreate the opener chain.
1079 CreateOpenerProxies(navigation_rfh->GetSiteInstance(), frame_tree_node_); 1078 CreateOpenerProxies(navigation_rfh->GetSiteInstance(), frame_tree_node_);
1080 if (!InitRenderView(navigation_rfh->render_view_host(), MSG_ROUTING_NONE)) { 1079 if (!InitRenderView(navigation_rfh->render_view_host(), nullptr)) {
1081 return nullptr; 1080 return nullptr;
1082 } 1081 }
1083 1082
1084 if (navigation_rfh == render_frame_host_) { 1083 if (navigation_rfh == render_frame_host_) {
1085 // TODO(nasko): This is a very ugly hack. The Chrome extensions process 1084 // TODO(nasko): This is a very ugly hack. The Chrome extensions process
1086 // manager still uses NotificationService and expects to see a 1085 // manager still uses NotificationService and expects to see a
1087 // RenderViewHost changed notification after WebContents and 1086 // RenderViewHost changed notification after WebContents and
1088 // RenderFrameHostManager are completely initialized. This should be 1087 // RenderFrameHostManager are completely initialized. This should be
1089 // removed once the process manager moves away from NotificationService. 1088 // removed once the process manager moves away from NotificationService.
1090 // See https://crbug.com/462682. 1089 // See https://crbug.com/462682.
(...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after
1796 // RenderWidgetHostView, we need to create one if this is the main frame. 1795 // RenderWidgetHostView, we need to create one if this is the main frame.
1797 if (!render_view_host->GetWidget()->GetView() && 1796 if (!render_view_host->GetWidget()->GetView() &&
1798 frame_tree_node_->IsMainFrame()) { 1797 frame_tree_node_->IsMainFrame()) {
1799 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host); 1798 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host);
1800 } 1799 }
1801 } 1800 }
1802 } else { 1801 } else {
1803 // Create a new RenderFrameHost if we don't find an existing one. 1802 // Create a new RenderFrameHost if we don't find an existing one.
1804 1803
1805 int32 widget_routing_id = MSG_ROUTING_NONE; 1804 int32 widget_routing_id = MSG_ROUTING_NONE;
1805 proxy = nullptr;
1806
1806 // A RenderFrame in a different process from its parent RenderFrame 1807 // A RenderFrame in a different process from its parent RenderFrame
1807 // requires a RenderWidget for input/layout/painting. 1808 // requires a RenderWidget for input/layout/painting.
1808 if (frame_tree_node_->parent() && 1809 if (frame_tree_node_->parent() &&
1809 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() != 1810 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() !=
1810 instance) { 1811 instance) {
1811 CHECK(SiteIsolationPolicy::AreCrossProcessFramesPossible()); 1812 CHECK(SiteIsolationPolicy::AreCrossProcessFramesPossible());
1812 widget_routing_id = instance->GetProcess()->GetNextRoutingID(); 1813 widget_routing_id = instance->GetProcess()->GetNextRoutingID();
1813 } 1814 }
1814 1815
1815 new_render_frame_host = CreateRenderFrameHost( 1816 new_render_frame_host = CreateRenderFrameHost(
1816 instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, widget_routing_id, flags); 1817 instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, widget_routing_id, flags);
1817 RenderViewHostImpl* render_view_host = 1818 RenderViewHostImpl* render_view_host =
1818 new_render_frame_host->render_view_host(); 1819 new_render_frame_host->render_view_host();
1819 int proxy_routing_id = MSG_ROUTING_NONE;
1820 1820
1821 // 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.
1822 // Otherwise, if the new RFH is swapped out already, store it. 1822 // Otherwise, if the new RFH is swapped out already, store it.
1823 if (!swapped_out) { 1823 if (!swapped_out) {
1824 new_render_frame_host->GetProcess()->AddPendingView(); 1824 new_render_frame_host->GetProcess()->AddPendingView();
1825 } else { 1825 } else {
1826 proxy = new RenderFrameProxyHost( 1826 proxy = new RenderFrameProxyHost(
1827 new_render_frame_host->GetSiteInstance(), 1827 new_render_frame_host->GetSiteInstance(),
1828 new_render_frame_host->render_view_host(), frame_tree_node_); 1828 new_render_frame_host->render_view_host(), frame_tree_node_);
1829 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();
1831 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); 1830 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass());
1832 } 1831 }
1833 1832
1834 if (frame_tree_node_->IsMainFrame()) { 1833 if (frame_tree_node_->IsMainFrame()) {
1835 success = InitRenderView(render_view_host, proxy_routing_id); 1834 success = InitRenderView(render_view_host, proxy);
1836 1835
1837 // If we are reusing the RenderViewHost and it doesn't already have a 1836 // If we are reusing the RenderViewHost and it doesn't already have a
1838 // RenderWidgetHostView, we need to create one if this is the main frame. 1837 // RenderWidgetHostView, we need to create one if this is the main frame.
1839 if (!swapped_out && !render_view_host->GetWidget()->GetView()) 1838 if (!swapped_out && !render_view_host->GetWidget()->GetView())
1840 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host); 1839 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host);
1841 } else { 1840 } else {
1842 DCHECK(render_view_host->IsRenderViewLive()); 1841 DCHECK(render_view_host->IsRenderViewLive());
1843 } 1842 }
1844 1843
1845 if (success) { 1844 if (success) {
1846 // Remember that InitRenderView also created the RenderFrameProxy.
1847 if (swapped_out)
1848 proxy->set_render_frame_proxy_created(true);
1849 if (frame_tree_node_->IsMainFrame()) { 1845 if (frame_tree_node_->IsMainFrame()) {
1850 // Don't show the main frame's view until we get a DidNavigate from it. 1846 // Don't show the main frame's view until we get a DidNavigate from it.
1851 // Only the RenderViewHost for the top-level RenderFrameHost has a 1847 // Only the RenderViewHost for the top-level RenderFrameHost has a
1852 // RenderWidgetHostView; RenderWidgetHosts for out-of-process iframes 1848 // RenderWidgetHostView; RenderWidgetHosts for out-of-process iframes
1853 // will be created later and hidden. 1849 // will be created later and hidden.
1854 if (render_view_host->GetWidget()->GetView()) 1850 if (render_view_host->GetWidget()->GetView())
1855 render_view_host->GetWidget()->GetView()->Hide(); 1851 render_view_host->GetWidget()->GetView()->Hide();
1856 } 1852 }
1857 // RenderViewHost for |instance| might exist prior to calling 1853 // RenderViewHost for |instance| might exist prior to calling
1858 // CreateRenderFrame. In such a case, InitRenderView will not create the 1854 // CreateRenderFrame. In such a case, InitRenderView will not create the
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1919 return proxy->GetRoutingID(); 1915 return proxy->GetRoutingID();
1920 1916
1921 if (!proxy) { 1917 if (!proxy) {
1922 proxy = 1918 proxy =
1923 new RenderFrameProxyHost(instance, render_view_host, frame_tree_node_); 1919 new RenderFrameProxyHost(instance, render_view_host, frame_tree_node_);
1924 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy)); 1920 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy));
1925 } 1921 }
1926 1922
1927 if (SiteIsolationPolicy::IsSwappedOutStateForbidden() && 1923 if (SiteIsolationPolicy::IsSwappedOutStateForbidden() &&
1928 frame_tree_node_->IsMainFrame()) { 1924 frame_tree_node_->IsMainFrame()) {
1929 InitRenderView(render_view_host, proxy->GetRoutingID()); 1925 InitRenderView(render_view_host, proxy);
1930 proxy->set_render_frame_proxy_created(true);
1931 } else { 1926 } else {
1932 proxy->InitRenderFrameProxy(); 1927 proxy->InitRenderFrameProxy();
1933 } 1928 }
1934 1929
1935 return proxy->GetRoutingID(); 1930 return proxy->GetRoutingID();
1936 } 1931 }
1937 1932
1938 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) { 1933 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) {
1939 for (const auto& pair : *proxy_hosts_) { 1934 for (const auto& pair : *proxy_hosts_) {
1940 // Do not create proxies for subframes in the outer delegate's process, 1935 // Do not create proxies for subframes in the outer delegate's process,
(...skipping 13 matching lines...) Expand all
1954 1949
1955 if (render_view_host->IsRenderViewLive()) 1950 if (render_view_host->IsRenderViewLive())
1956 return; 1951 return;
1957 1952
1958 // If the proxy in |instance| doesn't exist, this RenderView is not swapped 1953 // If the proxy in |instance| doesn't exist, this RenderView is not swapped
1959 // out and shouldn't be reinitialized here. 1954 // out and shouldn't be reinitialized here.
1960 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); 1955 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance);
1961 if (!proxy) 1956 if (!proxy)
1962 return; 1957 return;
1963 1958
1964 InitRenderView(render_view_host, proxy->GetRoutingID()); 1959 InitRenderView(render_view_host, proxy);
1965 proxy->set_render_frame_proxy_created(true);
1966 } 1960 }
1967 1961
1968 void RenderFrameHostManager::CreateOuterDelegateProxy( 1962 void RenderFrameHostManager::CreateOuterDelegateProxy(
1969 SiteInstance* outer_contents_site_instance, 1963 SiteInstance* outer_contents_site_instance,
1970 RenderFrameHostImpl* render_frame_host) { 1964 RenderFrameHostImpl* render_frame_host) {
1971 CHECK(BrowserPluginGuestMode::UseCrossProcessFramesForGuests()); 1965 CHECK(BrowserPluginGuestMode::UseCrossProcessFramesForGuests());
1972 RenderFrameProxyHost* proxy = new RenderFrameProxyHost( 1966 RenderFrameProxyHost* proxy = new RenderFrameProxyHost(
1973 outer_contents_site_instance, nullptr, frame_tree_node_); 1967 outer_contents_site_instance, nullptr, frame_tree_node_);
1974 proxy_hosts_->Add(outer_contents_site_instance->GetId(), 1968 proxy_hosts_->Add(outer_contents_site_instance->GetId(),
1975 make_scoped_ptr(proxy)); 1969 make_scoped_ptr(proxy));
(...skipping 13 matching lines...) Expand all
1989 } 1983 }
1990 1984
1991 void RenderFrameHostManager::SetRWHViewForInnerContents( 1985 void RenderFrameHostManager::SetRWHViewForInnerContents(
1992 RenderWidgetHostView* child_rwhv) { 1986 RenderWidgetHostView* child_rwhv) {
1993 DCHECK(ForInnerDelegate() && frame_tree_node_->IsMainFrame()); 1987 DCHECK(ForInnerDelegate() && frame_tree_node_->IsMainFrame());
1994 GetProxyToOuterDelegate()->SetChildRWHView(child_rwhv); 1988 GetProxyToOuterDelegate()->SetChildRWHView(child_rwhv);
1995 } 1989 }
1996 1990
1997 bool RenderFrameHostManager::InitRenderView( 1991 bool RenderFrameHostManager::InitRenderView(
1998 RenderViewHostImpl* render_view_host, 1992 RenderViewHostImpl* render_view_host,
1999 int proxy_routing_id) { 1993 RenderFrameProxyHost* proxy) {
2000 // Ensure the renderer process is initialized before creating the 1994 // Ensure the renderer process is initialized before creating the
2001 // RenderView. 1995 // RenderView.
2002 if (!render_view_host->GetProcess()->Init()) 1996 if (!render_view_host->GetProcess()->Init())
2003 return false; 1997 return false;
2004 1998
2005 // We may have initialized this RenderViewHost for another RenderFrameHost. 1999 // We may have initialized this RenderViewHost for another RenderFrameHost.
2006 if (render_view_host->IsRenderViewLive()) 2000 if (render_view_host->IsRenderViewLive())
2007 return true; 2001 return true;
2008 2002
2009 // If |render_view_host| is not for a proxy and the navigation is to a WebUI, 2003 // If |render_view_host| is not for a proxy and the navigation is to a WebUI,
2010 // and if the RenderView is not in a guest process, tell |render_view_host| 2004 // and if the RenderView is not in a guest process, tell |render_view_host|
2011 // about any bindings it will need enabled. 2005 // about any bindings it will need enabled.
2012 // TODO(carlosk): Move WebUI to RenderFrameHost in https://crbug.com/508850. 2006 // TODO(carlosk): Move WebUI to RenderFrameHost in https://crbug.com/508850.
2013 WebUIImpl* dest_web_ui = nullptr; 2007 WebUIImpl* dest_web_ui = nullptr;
2014 DCHECK_EQ(render_view_host->is_active(), 2008 if (!proxy) {
2015 proxy_routing_id == MSG_ROUTING_NONE);
2016 if (proxy_routing_id == MSG_ROUTING_NONE) {
2017 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 2009 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
2018 switches::kEnableBrowserSideNavigation)) { 2010 switches::kEnableBrowserSideNavigation)) {
2019 dest_web_ui = 2011 dest_web_ui =
2020 should_reuse_web_ui_ ? web_ui_.get() : speculative_web_ui_.get(); 2012 should_reuse_web_ui_ ? web_ui_.get() : speculative_web_ui_.get();
2021 } else { 2013 } else {
2022 dest_web_ui = pending_web_ui(); 2014 dest_web_ui = pending_web_ui();
2023 } 2015 }
2024 } 2016 }
2025 if (dest_web_ui && !render_view_host->GetProcess()->IsForGuestsOnly()) { 2017 if (dest_web_ui && !render_view_host->GetProcess()->IsForGuestsOnly()) {
2026 render_view_host->AllowBindings(dest_web_ui->GetBindings()); 2018 render_view_host->AllowBindings(dest_web_ui->GetBindings());
2027 } else { 2019 } else {
2028 // Ensure that we don't create an unprivileged RenderView in a WebUI-enabled 2020 // Ensure that we don't create an unprivileged RenderView in a WebUI-enabled
2029 // process unless it's swapped out. 2021 // process unless it's swapped out.
2030 if (render_view_host->is_active()) { 2022 if (render_view_host->is_active()) {
2031 CHECK(!ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( 2023 CHECK(!ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings(
2032 render_view_host->GetProcess()->GetID())); 2024 render_view_host->GetProcess()->GetID()));
2033 } 2025 }
2034 } 2026 }
2035 2027
2036 int opener_frame_routing_id = 2028 int opener_frame_routing_id =
2037 GetOpenerRoutingID(render_view_host->GetSiteInstance()); 2029 GetOpenerRoutingID(render_view_host->GetSiteInstance());
2038 2030
2039 return delegate_->CreateRenderViewForRenderManager( 2031 bool created = delegate_->CreateRenderViewForRenderManager(
2040 render_view_host, opener_frame_routing_id, proxy_routing_id, 2032 render_view_host, opener_frame_routing_id,
2033 proxy ? proxy->GetRoutingID() : MSG_ROUTING_NONE,
2041 frame_tree_node_->current_replication_state()); 2034 frame_tree_node_->current_replication_state());
2035
2036 if (created && proxy)
2037 proxy->set_render_frame_proxy_created(true);
2038
2039 return created;
2042 } 2040 }
2043 2041
2044 bool RenderFrameHostManager::InitRenderFrame( 2042 bool RenderFrameHostManager::InitRenderFrame(
2045 RenderFrameHostImpl* render_frame_host) { 2043 RenderFrameHostImpl* render_frame_host) {
2046 if (render_frame_host->IsRenderFrameLive()) 2044 if (render_frame_host->IsRenderFrameLive())
2047 return true; 2045 return true;
2048 2046
2049 SiteInstance* site_instance = render_frame_host->GetSiteInstance(); 2047 SiteInstance* site_instance = render_frame_host->GetSiteInstance();
2050 2048
2051 int opener_routing_id = MSG_ROUTING_NONE; 2049 int opener_routing_id = MSG_ROUTING_NONE;
(...skipping 598 matching lines...) Expand 10 before | Expand all | Expand 10 after
2650 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) { 2648 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) {
2651 if (!frame_tree_node_->opener()) 2649 if (!frame_tree_node_->opener())
2652 return MSG_ROUTING_NONE; 2650 return MSG_ROUTING_NONE;
2653 2651
2654 return frame_tree_node_->opener() 2652 return frame_tree_node_->opener()
2655 ->render_manager() 2653 ->render_manager()
2656 ->GetRoutingIdForSiteInstance(instance); 2654 ->GetRoutingIdForSiteInstance(instance);
2657 } 2655 }
2658 2656
2659 } // namespace content 2657 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/frame_host/render_frame_host_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698