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

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

Issue 1306053008: Avoid creating a RenderWidgetHostView for proxies. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: recreate WidgetViews when reusing RenderView Created 5 years, 3 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 379 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 390
391 // If the current render_frame_host_ isn't live, we should create it so 391 // If the current render_frame_host_ isn't live, we should create it so
392 // that we don't show a sad tab while the dest_render_frame_host fetches 392 // that we don't show a sad tab while the dest_render_frame_host fetches
393 // its first page. (Bug 1145340) 393 // its first page. (Bug 1145340)
394 if (dest_render_frame_host != render_frame_host_ && 394 if (dest_render_frame_host != render_frame_host_ &&
395 !render_frame_host_->IsRenderFrameLive()) { 395 !render_frame_host_->IsRenderFrameLive()) {
396 // Note: we don't call InitRenderView here because we are navigating away 396 // Note: we don't call InitRenderView here because we are navigating away
397 // soon anyway, and we don't have the NavigationEntry for this host. 397 // soon anyway, and we don't have the NavigationEntry for this host.
398 delegate_->CreateRenderViewForRenderManager( 398 delegate_->CreateRenderViewForRenderManager(
399 render_frame_host_->render_view_host(), MSG_ROUTING_NONE, 399 render_frame_host_->render_view_host(), MSG_ROUTING_NONE,
400 MSG_ROUTING_NONE, frame_tree_node_->current_replication_state(), 400 MSG_ROUTING_NONE, frame_tree_node_->current_replication_state());
401 frame_tree_node_->IsMainFrame());
402 } 401 }
403 402
404 // If the renderer crashed, then try to create a new one to satisfy this 403 // If the renderer crashed, then try to create a new one to satisfy this
405 // navigation request. 404 // navigation request.
406 if (!dest_render_frame_host->IsRenderFrameLive()) { 405 if (!dest_render_frame_host->IsRenderFrameLive()) {
407 // Instruct the destination render frame host to set up a Mojo connection 406 // Instruct the destination render frame host to set up a Mojo connection
408 // with the new render frame if necessary. Note that this call needs to 407 // with the new render frame if necessary. Note that this call needs to
409 // occur before initializing the RenderView; the flow of creating the 408 // occur before initializing the RenderView; the flow of creating the
410 // RenderView can cause browser-side code to execute that expects the this 409 // RenderView can cause browser-side code to execute that expects the this
411 // RFH's ServiceRegistry to be initialized (e.g., if the site is a WebUI 410 // RFH's ServiceRegistry to be initialized (e.g., if the site is a WebUI
412 // site that is handled via Mojo, then Mojo WebUI code in //chrome will 411 // site that is handled via Mojo, then Mojo WebUI code in //chrome will
413 // add a service to this RFH's ServiceRegistry). 412 // add a service to this RFH's ServiceRegistry).
414 dest_render_frame_host->SetUpMojoIfNeeded(); 413 dest_render_frame_host->SetUpMojoIfNeeded();
415 414
416 // Recreate the opener chain. 415 // Recreate the opener chain.
417 CreateOpenerProxiesIfNeeded(dest_render_frame_host->GetSiteInstance()); 416 CreateOpenerProxiesIfNeeded(dest_render_frame_host->GetSiteInstance());
418 if (!InitRenderView(dest_render_frame_host->render_view_host(), 417 if (!InitRenderView(dest_render_frame_host->render_view_host(),
419 MSG_ROUTING_NONE, 418 MSG_ROUTING_NONE))
420 frame_tree_node_->IsMainFrame()))
421 return nullptr; 419 return nullptr;
422 420
423 // Now that we've created a new renderer, be sure to hide it if it isn't 421 // Now that we've created a new renderer, be sure to hide it if it isn't
424 // our primary one. Otherwise, we might crash if we try to call Show() 422 // our primary one. Otherwise, we might crash if we try to call Show()
425 // on it later. 423 // on it later.
426 if (dest_render_frame_host != render_frame_host_) { 424 if (dest_render_frame_host != render_frame_host_) {
427 if (dest_render_frame_host->GetView()) 425 if (dest_render_frame_host->GetView())
428 dest_render_frame_host->GetView()->Hide(); 426 dest_render_frame_host->GetView()->Hide();
429 } else { 427 } else {
430 // TODO(nasko): This is a very ugly hack. The Chrome extensions process 428 // TODO(nasko): This is a very ugly hack. The Chrome extensions process
(...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after
1010 } 1008 }
1011 DCHECK(navigation_rfh && 1009 DCHECK(navigation_rfh &&
1012 (navigation_rfh == render_frame_host_.get() || 1010 (navigation_rfh == render_frame_host_.get() ||
1013 navigation_rfh == speculative_render_frame_host_.get())); 1011 navigation_rfh == speculative_render_frame_host_.get()));
1014 1012
1015 // If the RenderFrame that needs to navigate is not live (its process was just 1013 // If the RenderFrame that needs to navigate is not live (its process was just
1016 // created or has crashed), initialize it. 1014 // created or has crashed), initialize it.
1017 if (!navigation_rfh->IsRenderFrameLive()) { 1015 if (!navigation_rfh->IsRenderFrameLive()) {
1018 // Recreate the opener chain. 1016 // Recreate the opener chain.
1019 CreateOpenerProxiesIfNeeded(navigation_rfh->GetSiteInstance()); 1017 CreateOpenerProxiesIfNeeded(navigation_rfh->GetSiteInstance());
1020 if (!InitRenderView(navigation_rfh->render_view_host(), MSG_ROUTING_NONE, 1018 if (!InitRenderView(navigation_rfh->render_view_host(), MSG_ROUTING_NONE)) {
1021 frame_tree_node_->IsMainFrame())) {
1022 return nullptr; 1019 return nullptr;
1023 } 1020 }
1024 1021
1025 if (navigation_rfh == render_frame_host_) { 1022 if (navigation_rfh == render_frame_host_) {
1026 // TODO(nasko): This is a very ugly hack. The Chrome extensions process 1023 // TODO(nasko): This is a very ugly hack. The Chrome extensions process
1027 // manager still uses NotificationService and expects to see a 1024 // manager still uses NotificationService and expects to see a
1028 // RenderViewHost changed notification after WebContents and 1025 // RenderViewHost changed notification after WebContents and
1029 // RenderFrameHostManager are completely initialized. This should be 1026 // RenderFrameHostManager are completely initialized. This should be
1030 // removed once the process manager moves away from NotificationService. 1027 // removed once the process manager moves away from NotificationService.
1031 // See https://crbug.com/462682. 1028 // See https://crbug.com/462682.
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after
1514 // to open a new tab to an interstitial-inducing URL, and then navigates 1511 // to open a new tab to an interstitial-inducing URL, and then navigates
1515 // the page to a different same-site URL. (This seems very unlikely in 1512 // the page to a different same-site URL. (This seems very unlikely in
1516 // practice.) 1513 // practice.)
1517 if (current_entry) 1514 if (current_entry)
1518 return current_entry->GetURL(); 1515 return current_entry->GetURL();
1519 return current_instance->GetSiteURL(); 1516 return current_instance->GetSiteURL();
1520 } 1517 }
1521 1518
1522 void RenderFrameHostManager::CreatePendingRenderFrameHost( 1519 void RenderFrameHostManager::CreatePendingRenderFrameHost(
1523 SiteInstance* old_instance, 1520 SiteInstance* old_instance,
1524 SiteInstance* new_instance, 1521 SiteInstance* new_instance) {
1525 bool is_main_frame) {
1526 int create_render_frame_flags = 0; 1522 int create_render_frame_flags = 0;
1527 if (is_main_frame)
1528 create_render_frame_flags |= CREATE_RF_FOR_MAIN_FRAME_NAVIGATION;
1529
1530 if (delegate_->IsHidden()) 1523 if (delegate_->IsHidden())
1531 create_render_frame_flags |= CREATE_RF_HIDDEN; 1524 create_render_frame_flags |= CREATE_RF_HIDDEN;
1532 1525
1533 if (pending_render_frame_host_) 1526 if (pending_render_frame_host_)
1534 CancelPending(); 1527 CancelPending();
1535 1528
1536 // The process for the new SiteInstance may (if we're sharing a process with 1529 // The process for the new SiteInstance may (if we're sharing a process with
1537 // another host that already initialized it) or may not (we have our own 1530 // another host that already initialized it) or may not (we have our own
1538 // process or the existing process crashed) have been initialized. Calling 1531 // process or the existing process crashed) have been initialized. Calling
1539 // Init multiple times will be ignored, so this is safe. 1532 // Init multiple times will be ignored, so this is safe.
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
1652 // another host that already initialized it) or may not (we have our own 1645 // another host that already initialized it) or may not (we have our own
1653 // process or the existing process crashed) have been initialized. Calling 1646 // process or the existing process crashed) have been initialized. Calling
1654 // Init multiple times will be ignored, so this is safe. 1647 // Init multiple times will be ignored, so this is safe.
1655 if (!new_instance->GetProcess()->Init()) 1648 if (!new_instance->GetProcess()->Init())
1656 return false; 1649 return false;
1657 1650
1658 int create_render_frame_flags = 0; 1651 int create_render_frame_flags = 0;
1659 CreateProxiesForNewRenderFrameHost(old_instance, new_instance, 1652 CreateProxiesForNewRenderFrameHost(old_instance, new_instance,
1660 &create_render_frame_flags); 1653 &create_render_frame_flags);
1661 1654
1662 if (frame_tree_node_->IsMainFrame())
1663 create_render_frame_flags |= CREATE_RF_FOR_MAIN_FRAME_NAVIGATION;
1664 if (delegate_->IsHidden()) 1655 if (delegate_->IsHidden())
1665 create_render_frame_flags |= CREATE_RF_HIDDEN; 1656 create_render_frame_flags |= CREATE_RF_HIDDEN;
1666 speculative_render_frame_host_ = 1657 speculative_render_frame_host_ =
1667 CreateRenderFrame(new_instance, speculative_web_ui_.get(), 1658 CreateRenderFrame(new_instance, speculative_web_ui_.get(),
1668 create_render_frame_flags, nullptr); 1659 create_render_frame_flags, nullptr);
1669 1660
1670 if (!speculative_render_frame_host_) { 1661 if (!speculative_render_frame_host_) {
1671 speculative_web_ui_.reset(); 1662 speculative_web_ui_.reset();
1672 return false; 1663 return false;
1673 } 1664 }
(...skipping 24 matching lines...) Expand all
1698 1689
1699 // We are creating a pending, speculative or swapped out RFH here. We should 1690 // We are creating a pending, speculative or swapped out RFH here. We should
1700 // never create it in the same SiteInstance as our current RFH. 1691 // never create it in the same SiteInstance as our current RFH.
1701 CHECK_NE(render_frame_host_->GetSiteInstance(), instance); 1692 CHECK_NE(render_frame_host_->GetSiteInstance(), instance);
1702 1693
1703 // Check if we've already created an RFH for this SiteInstance. If so, try 1694 // Check if we've already created an RFH for this SiteInstance. If so, try
1704 // to re-use the existing one, which has already been initialized. We'll 1695 // to re-use the existing one, which has already been initialized. We'll
1705 // remove it from the list of proxy hosts below if it will be active. 1696 // remove it from the list of proxy hosts below if it will be active.
1706 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); 1697 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance);
1707 if (proxy && proxy->render_frame_host()) { 1698 if (proxy && proxy->render_frame_host()) {
1699 RenderViewHost* render_view_host = proxy->GetRenderViewHost();
1708 CHECK(!swapped_out_forbidden); 1700 CHECK(!swapped_out_forbidden);
1709 if (view_routing_id_ptr) 1701 if (view_routing_id_ptr)
1710 *view_routing_id_ptr = proxy->GetRenderViewHost()->GetRoutingID(); 1702 *view_routing_id_ptr = proxy->GetRenderViewHost()->GetRoutingID();
1711 // Delete the existing RenderFrameProxyHost, but reuse the RenderFrameHost. 1703 // Delete the existing RenderFrameProxyHost, but reuse the RenderFrameHost.
1712 // Prevent the process from exiting while we're trying to use it. 1704 // Prevent the process from exiting while we're trying to use it.
1713 if (!swapped_out) { 1705 if (!swapped_out) {
1714 new_render_frame_host = proxy->PassFrameHostOwnership(); 1706 new_render_frame_host = proxy->PassFrameHostOwnership();
1715 new_render_frame_host->GetProcess()->AddPendingView(); 1707 new_render_frame_host->GetProcess()->AddPendingView();
1716 1708
1717 proxy_hosts_->Remove(instance->GetId()); 1709 proxy_hosts_->Remove(instance->GetId());
1718 // NB |proxy| is deleted at this point. 1710 // NB |proxy| is deleted at this point.
1719 } 1711 }
1712 if (!render_view_host->GetView())
Charlie Reis 2015/08/28 18:58:26 nit: This needs braces, since the body doesn't fit
lfg 2015/08/28 21:18:40 Done.
1713 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host,
1714 MSG_ROUTING_NONE);
1720 } else { 1715 } else {
1721 // Create a new RenderFrameHost if we don't find an existing one. 1716 // Create a new RenderFrameHost if we don't find an existing one.
1722 new_render_frame_host = CreateRenderFrameHost(instance, MSG_ROUTING_NONE, 1717 new_render_frame_host = CreateRenderFrameHost(instance, MSG_ROUTING_NONE,
1723 MSG_ROUTING_NONE, flags); 1718 MSG_ROUTING_NONE, flags);
1724 RenderViewHostImpl* render_view_host = 1719 RenderViewHostImpl* render_view_host =
1725 new_render_frame_host->render_view_host(); 1720 new_render_frame_host->render_view_host();
1726 int proxy_routing_id = MSG_ROUTING_NONE; 1721 int proxy_routing_id = MSG_ROUTING_NONE;
1727 1722
1728 // Prevent the process from exiting while we're trying to navigate in it. 1723 // Prevent the process from exiting while we're trying to navigate in it.
1729 // Otherwise, if the new RFH is swapped out already, store it. 1724 // Otherwise, if the new RFH is swapped out already, store it.
1730 if (!swapped_out) { 1725 if (!swapped_out) {
1731 new_render_frame_host->GetProcess()->AddPendingView(); 1726 new_render_frame_host->GetProcess()->AddPendingView();
1732 } else { 1727 } else {
1733 proxy = new RenderFrameProxyHost( 1728 proxy = new RenderFrameProxyHost(
1734 new_render_frame_host->GetSiteInstance(), 1729 new_render_frame_host->GetSiteInstance(),
1735 new_render_frame_host->render_view_host(), frame_tree_node_); 1730 new_render_frame_host->render_view_host(), frame_tree_node_);
1736 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy)); 1731 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy));
1737 proxy_routing_id = proxy->GetRoutingID(); 1732 proxy_routing_id = proxy->GetRoutingID();
1738 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); 1733 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass());
1739 } 1734 }
1740 1735
1741 success = InitRenderView(render_view_host, proxy_routing_id, 1736 success = InitRenderView(render_view_host, proxy_routing_id);
1742 !!(flags & CREATE_RF_FOR_MAIN_FRAME_NAVIGATION)); 1737 if (proxy_routing_id == MSG_ROUTING_NONE && !render_view_host->GetView())
1738 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host,
1739 proxy_routing_id);
Charlie Reis 2015/08/28 18:58:26 We're only calling this if proxy_routing_id is MSG
lfg 2015/08/28 21:18:40 No, I switched the interface to take a bool. What
1740
1743 if (success) { 1741 if (success) {
1744 // Remember that InitRenderView also created the RenderFrameProxy. 1742 // Remember that InitRenderView also created the RenderFrameProxy.
1745 if (swapped_out) 1743 if (swapped_out)
1746 proxy->set_render_frame_proxy_created(true); 1744 proxy->set_render_frame_proxy_created(true);
1747 if (frame_tree_node_->IsMainFrame()) { 1745 if (frame_tree_node_->IsMainFrame()) {
1748 // Don't show the main frame's view until we get a DidNavigate from it. 1746 // Don't show the main frame's view until we get a DidNavigate from it.
1749 // Only the RenderViewHost for the top-level RenderFrameHost has a 1747 // Only the RenderViewHost for the top-level RenderFrameHost has a
1750 // RenderWidgetHostView; RenderWidgetHosts for out-of-process iframes 1748 // RenderWidgetHostView; RenderWidgetHosts for out-of-process iframes
1751 // will be created later and hidden. 1749 // will be created later and hidden.
1752 if (render_view_host->GetView()) 1750 if (render_view_host->GetView())
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1817 return proxy->GetRoutingID(); 1815 return proxy->GetRoutingID();
1818 1816
1819 if (!proxy) { 1817 if (!proxy) {
1820 proxy = 1818 proxy =
1821 new RenderFrameProxyHost(instance, render_view_host, frame_tree_node_); 1819 new RenderFrameProxyHost(instance, render_view_host, frame_tree_node_);
1822 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy)); 1820 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy));
1823 } 1821 }
1824 1822
1825 if (SiteIsolationPolicy::IsSwappedOutStateForbidden() && 1823 if (SiteIsolationPolicy::IsSwappedOutStateForbidden() &&
1826 frame_tree_node_->IsMainFrame()) { 1824 frame_tree_node_->IsMainFrame()) {
1827 InitRenderView(render_view_host, proxy->GetRoutingID(), true); 1825 InitRenderView(render_view_host, proxy->GetRoutingID());
1828 proxy->set_render_frame_proxy_created(true); 1826 proxy->set_render_frame_proxy_created(true);
1829 } else { 1827 } else {
1830 proxy->InitRenderFrameProxy(); 1828 proxy->InitRenderFrameProxy();
1831 } 1829 }
1832 1830
1833 return proxy->GetRoutingID(); 1831 return proxy->GetRoutingID();
1834 } 1832 }
1835 1833
1836 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) { 1834 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) {
1837 for (const auto& pair : *proxy_hosts_) { 1835 for (const auto& pair : *proxy_hosts_) {
(...skipping 17 matching lines...) Expand all
1855 1853
1856 // Recreate the opener chain. 1854 // Recreate the opener chain.
1857 CreateOpenerProxiesIfNeeded(instance); 1855 CreateOpenerProxiesIfNeeded(instance);
1858 1856
1859 // If the proxy in |instance| doesn't exist, this RenderView is not swapped 1857 // If the proxy in |instance| doesn't exist, this RenderView is not swapped
1860 // out and shouldn't be reinitialized here. 1858 // out and shouldn't be reinitialized here.
1861 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); 1859 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance);
1862 if (!proxy) 1860 if (!proxy)
1863 return; 1861 return;
1864 1862
1865 InitRenderView(render_view_host, proxy->GetRoutingID(), false); 1863 InitRenderView(render_view_host, proxy->GetRoutingID());
1866 proxy->set_render_frame_proxy_created(true); 1864 proxy->set_render_frame_proxy_created(true);
1867 } 1865 }
1868 1866
1869 void RenderFrameHostManager::CreateOuterDelegateProxy( 1867 void RenderFrameHostManager::CreateOuterDelegateProxy(
1870 SiteInstance* outer_contents_site_instance, 1868 SiteInstance* outer_contents_site_instance,
1871 RenderFrameHostImpl* render_frame_host) { 1869 RenderFrameHostImpl* render_frame_host) {
1872 CHECK(BrowserPluginGuestMode::UseCrossProcessFramesForGuests()); 1870 CHECK(BrowserPluginGuestMode::UseCrossProcessFramesForGuests());
1873 RenderFrameProxyHost* proxy = new RenderFrameProxyHost( 1871 RenderFrameProxyHost* proxy = new RenderFrameProxyHost(
1874 outer_contents_site_instance, nullptr, frame_tree_node_); 1872 outer_contents_site_instance, nullptr, frame_tree_node_);
1875 proxy_hosts_->Add(outer_contents_site_instance->GetId(), 1873 proxy_hosts_->Add(outer_contents_site_instance->GetId(),
(...skipping 14 matching lines...) Expand all
1890 } 1888 }
1891 1889
1892 void RenderFrameHostManager::SetRWHViewForInnerContents( 1890 void RenderFrameHostManager::SetRWHViewForInnerContents(
1893 RenderWidgetHostView* child_rwhv) { 1891 RenderWidgetHostView* child_rwhv) {
1894 DCHECK(ForInnerDelegate() && frame_tree_node_->IsMainFrame()); 1892 DCHECK(ForInnerDelegate() && frame_tree_node_->IsMainFrame());
1895 GetProxyToOuterDelegate()->SetChildRWHView(child_rwhv); 1893 GetProxyToOuterDelegate()->SetChildRWHView(child_rwhv);
1896 } 1894 }
1897 1895
1898 bool RenderFrameHostManager::InitRenderView( 1896 bool RenderFrameHostManager::InitRenderView(
1899 RenderViewHostImpl* render_view_host, 1897 RenderViewHostImpl* render_view_host,
1900 int proxy_routing_id, 1898 int proxy_routing_id) {
1901 bool for_main_frame_navigation) {
1902 // Ensure the renderer process is initialized before creating the 1899 // Ensure the renderer process is initialized before creating the
1903 // RenderView. 1900 // RenderView.
1904 if (!render_view_host->GetProcess()->Init()) 1901 if (!render_view_host->GetProcess()->Init())
1905 return false; 1902 return false;
1906 1903
1907 // We may have initialized this RenderViewHost for another RenderFrameHost. 1904 // We may have initialized this RenderViewHost for another RenderFrameHost.
1908 if (render_view_host->IsRenderViewLive()) 1905 if (render_view_host->IsRenderViewLive())
1909 return true; 1906 return true;
1910 1907
1911 // If the ongoing navigation is to a WebUI and the RenderView is not in a 1908 // If the ongoing navigation is to a WebUI and the RenderView is not in a
(...skipping 16 matching lines...) Expand all
1928 CHECK(!ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( 1925 CHECK(!ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings(
1929 render_view_host->GetProcess()->GetID())); 1926 render_view_host->GetProcess()->GetID()));
1930 } 1927 }
1931 } 1928 }
1932 1929
1933 int opener_frame_routing_id = 1930 int opener_frame_routing_id =
1934 GetOpenerRoutingID(render_view_host->GetSiteInstance()); 1931 GetOpenerRoutingID(render_view_host->GetSiteInstance());
1935 1932
1936 return delegate_->CreateRenderViewForRenderManager( 1933 return delegate_->CreateRenderViewForRenderManager(
1937 render_view_host, opener_frame_routing_id, proxy_routing_id, 1934 render_view_host, opener_frame_routing_id, proxy_routing_id,
1938 frame_tree_node_->current_replication_state(), for_main_frame_navigation); 1935 frame_tree_node_->current_replication_state());
1939 } 1936 }
1940 1937
1941 bool RenderFrameHostManager::InitRenderFrame( 1938 bool RenderFrameHostManager::InitRenderFrame(
1942 RenderFrameHostImpl* render_frame_host) { 1939 RenderFrameHostImpl* render_frame_host) {
1943 if (render_frame_host->IsRenderFrameLive()) 1940 if (render_frame_host->IsRenderFrameLive())
1944 return true; 1941 return true;
1945 1942
1946 int parent_routing_id = MSG_ROUTING_NONE; 1943 int parent_routing_id = MSG_ROUTING_NONE;
1947 int previous_sibling_routing_id = MSG_ROUTING_NONE; 1944 int previous_sibling_routing_id = MSG_ROUTING_NONE;
1948 int proxy_routing_id = MSG_ROUTING_NONE; 1945 int proxy_routing_id = MSG_ROUTING_NONE;
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
2238 2235
2239 // New SiteInstance: create a pending RFH to navigate. 2236 // New SiteInstance: create a pending RFH to navigate.
2240 2237
2241 // This will possibly create (set to nullptr) a Web UI object for the 2238 // This will possibly create (set to nullptr) a Web UI object for the
2242 // pending page. We'll use this later to give the page special access. This 2239 // pending page. We'll use this later to give the page special access. This
2243 // must happen before the new renderer is created below so it will get 2240 // must happen before the new renderer is created below so it will get
2244 // bindings. It must also happen after the above conditional call to 2241 // bindings. It must also happen after the above conditional call to
2245 // CancelPending(), otherwise CancelPending may clear the pending_web_ui_ 2242 // CancelPending(), otherwise CancelPending may clear the pending_web_ui_
2246 // and the page will not have its bindings set appropriately. 2243 // and the page will not have its bindings set appropriately.
2247 SetPendingWebUI(dest_url, bindings); 2244 SetPendingWebUI(dest_url, bindings);
2248 CreatePendingRenderFrameHost(current_instance, new_instance.get(), 2245 CreatePendingRenderFrameHost(current_instance, new_instance.get());
2249 frame_tree_node_->IsMainFrame());
2250 if (!pending_render_frame_host_) 2246 if (!pending_render_frame_host_)
2251 return nullptr; 2247 return nullptr;
2252 2248
2253 // Check if our current RFH is live before we set up a transition. 2249 // Check if our current RFH is live before we set up a transition.
2254 if (!render_frame_host_->IsRenderFrameLive()) { 2250 if (!render_frame_host_->IsRenderFrameLive()) {
2255 // The current RFH is not live. There's no reason to sit around with a 2251 // The current RFH is not live. There's no reason to sit around with a
2256 // sad tab or a newly created RFH while we wait for the pending RFH to 2252 // sad tab or a newly created RFH while we wait for the pending RFH to
2257 // navigate. Just switch to the pending RFH now and go back to normal. 2253 // navigate. Just switch to the pending RFH now and go back to normal.
2258 // (Note that we don't care about on{before}unload handlers if the current 2254 // (Note that we don't care about on{before}unload handlers if the current
2259 // RFH isn't live.) 2255 // RFH isn't live.)
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
2505 // Ensure that all the nodes in the opener's frame tree have 2501 // Ensure that all the nodes in the opener's frame tree have
2506 // RenderFrameProxyHosts for the new SiteInstance. 2502 // RenderFrameProxyHosts for the new SiteInstance.
2507 frame_tree->CreateProxiesForSiteInstance(nullptr, instance); 2503 frame_tree->CreateProxiesForSiteInstance(nullptr, instance);
2508 } else if (rvh && !rvh->IsRenderViewLive()) { 2504 } else if (rvh && !rvh->IsRenderViewLive()) {
2509 EnsureRenderViewInitialized(rvh, instance); 2505 EnsureRenderViewInitialized(rvh, instance);
2510 } else { 2506 } else {
2511 // Create a swapped out RenderView in the given SiteInstance if none exists, 2507 // Create a swapped out RenderView in the given SiteInstance if none exists,
2512 // setting its opener to the given route_id. Since the opener can point to 2508 // setting its opener to the given route_id. Since the opener can point to
2513 // a subframe, do this on the root frame of the opener's frame tree. 2509 // a subframe, do this on the root frame of the opener's frame tree.
2514 // Return the new view's route_id. 2510 // Return the new view's route_id.
2515 frame_tree->root()->render_manager()-> 2511 frame_tree->root()->render_manager()->CreateRenderFrame(
2516 CreateRenderFrame(instance, nullptr, 2512 instance, nullptr, CREATE_RF_SWAPPED_OUT | CREATE_RF_HIDDEN, nullptr);
2517 CREATE_RF_FOR_MAIN_FRAME_NAVIGATION |
2518 CREATE_RF_SWAPPED_OUT | CREATE_RF_HIDDEN,
2519 nullptr);
2520 } 2513 }
2521 } 2514 }
2522 2515
2523 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) { 2516 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) {
2524 if (!frame_tree_node_->opener()) 2517 if (!frame_tree_node_->opener())
2525 return MSG_ROUTING_NONE; 2518 return MSG_ROUTING_NONE;
2526 2519
2527 return frame_tree_node_->opener() 2520 return frame_tree_node_->opener()
2528 ->render_manager() 2521 ->render_manager()
2529 ->GetRoutingIdForSiteInstance(instance); 2522 ->GetRoutingIdForSiteInstance(instance);
2530 } 2523 }
2531 2524
2532 } // namespace content 2525 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698