Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 394 | 394 |
| 395 // If the current render_frame_host_ isn't live, we should create it so | 395 // If the current render_frame_host_ isn't live, we should create it so |
| 396 // that we don't show a sad tab while the dest_render_frame_host fetches | 396 // that we don't show a sad tab while the dest_render_frame_host fetches |
| 397 // its first page. (Bug 1145340) | 397 // its first page. (Bug 1145340) |
| 398 if (dest_render_frame_host != render_frame_host_ && | 398 if (dest_render_frame_host != render_frame_host_ && |
| 399 !render_frame_host_->IsRenderFrameLive()) { | 399 !render_frame_host_->IsRenderFrameLive()) { |
| 400 // Note: we don't call InitRenderView here because we are navigating away | 400 // Note: we don't call InitRenderView here because we are navigating away |
| 401 // soon anyway, and we don't have the NavigationEntry for this host. | 401 // soon anyway, and we don't have the NavigationEntry for this host. |
| 402 delegate_->CreateRenderViewForRenderManager( | 402 delegate_->CreateRenderViewForRenderManager( |
| 403 render_frame_host_->render_view_host(), MSG_ROUTING_NONE, | 403 render_frame_host_->render_view_host(), MSG_ROUTING_NONE, |
| 404 MSG_ROUTING_NONE, frame_tree_node_->current_replication_state(), | 404 MSG_ROUTING_NONE, frame_tree_node_->current_replication_state()); |
| 405 frame_tree_node_->IsMainFrame()); | |
| 406 } | 405 } |
| 407 | 406 |
| 408 // If the renderer crashed, then try to create a new one to satisfy this | 407 // If the renderer crashed, then try to create a new one to satisfy this |
| 409 // navigation request. | 408 // navigation request. |
| 410 if (!dest_render_frame_host->IsRenderFrameLive()) { | 409 if (!dest_render_frame_host->IsRenderFrameLive()) { |
| 411 // Instruct the destination render frame host to set up a Mojo connection | 410 // Instruct the destination render frame host to set up a Mojo connection |
| 412 // with the new render frame if necessary. Note that this call needs to | 411 // with the new render frame if necessary. Note that this call needs to |
| 413 // occur before initializing the RenderView; the flow of creating the | 412 // occur before initializing the RenderView; the flow of creating the |
| 414 // RenderView can cause browser-side code to execute that expects the this | 413 // RenderView can cause browser-side code to execute that expects the this |
| 415 // RFH's ServiceRegistry to be initialized (e.g., if the site is a WebUI | 414 // RFH's ServiceRegistry to be initialized (e.g., if the site is a WebUI |
| 416 // site that is handled via Mojo, then Mojo WebUI code in //chrome will | 415 // site that is handled via Mojo, then Mojo WebUI code in //chrome will |
| 417 // add a service to this RFH's ServiceRegistry). | 416 // add a service to this RFH's ServiceRegistry). |
| 418 dest_render_frame_host->SetUpMojoIfNeeded(); | 417 dest_render_frame_host->SetUpMojoIfNeeded(); |
| 419 | 418 |
| 420 // Recreate the opener chain. | 419 // Recreate the opener chain. |
| 421 CreateOpenerProxiesIfNeeded(dest_render_frame_host->GetSiteInstance()); | 420 CreateOpenerProxiesIfNeeded(dest_render_frame_host->GetSiteInstance()); |
| 422 if (!InitRenderView(dest_render_frame_host->render_view_host(), | 421 if (!InitRenderView(dest_render_frame_host->render_view_host(), |
| 423 MSG_ROUTING_NONE, | 422 MSG_ROUTING_NONE)) |
| 424 frame_tree_node_->IsMainFrame())) | |
| 425 return nullptr; | 423 return nullptr; |
| 426 | 424 |
| 427 // 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 |
| 428 // 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() |
| 429 // on it later. | 427 // on it later. |
| 430 if (dest_render_frame_host != render_frame_host_) { | 428 if (dest_render_frame_host != render_frame_host_) { |
| 431 if (dest_render_frame_host->GetView()) | 429 if (dest_render_frame_host->GetView()) |
| 432 dest_render_frame_host->GetView()->Hide(); | 430 dest_render_frame_host->GetView()->Hide(); |
| 433 } else { | 431 } else { |
| 434 // TODO(nasko): This is a very ugly hack. The Chrome extensions process | 432 // TODO(nasko): This is a very ugly hack. The Chrome extensions process |
| (...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1037 } | 1035 } |
| 1038 DCHECK(navigation_rfh && | 1036 DCHECK(navigation_rfh && |
| 1039 (navigation_rfh == render_frame_host_.get() || | 1037 (navigation_rfh == render_frame_host_.get() || |
| 1040 navigation_rfh == speculative_render_frame_host_.get())); | 1038 navigation_rfh == speculative_render_frame_host_.get())); |
| 1041 | 1039 |
| 1042 // If the RenderFrame that needs to navigate is not live (its process was just | 1040 // If the RenderFrame that needs to navigate is not live (its process was just |
| 1043 // created or has crashed), initialize it. | 1041 // created or has crashed), initialize it. |
| 1044 if (!navigation_rfh->IsRenderFrameLive()) { | 1042 if (!navigation_rfh->IsRenderFrameLive()) { |
| 1045 // Recreate the opener chain. | 1043 // Recreate the opener chain. |
| 1046 CreateOpenerProxiesIfNeeded(navigation_rfh->GetSiteInstance()); | 1044 CreateOpenerProxiesIfNeeded(navigation_rfh->GetSiteInstance()); |
| 1047 if (!InitRenderView(navigation_rfh->render_view_host(), MSG_ROUTING_NONE, | 1045 if (!InitRenderView(navigation_rfh->render_view_host(), MSG_ROUTING_NONE)) { |
| 1048 frame_tree_node_->IsMainFrame())) { | |
| 1049 return nullptr; | 1046 return nullptr; |
| 1050 } | 1047 } |
| 1051 | 1048 |
| 1052 if (navigation_rfh == render_frame_host_) { | 1049 if (navigation_rfh == render_frame_host_) { |
| 1053 // TODO(nasko): This is a very ugly hack. The Chrome extensions process | 1050 // TODO(nasko): This is a very ugly hack. The Chrome extensions process |
| 1054 // manager still uses NotificationService and expects to see a | 1051 // manager still uses NotificationService and expects to see a |
| 1055 // RenderViewHost changed notification after WebContents and | 1052 // RenderViewHost changed notification after WebContents and |
| 1056 // RenderFrameHostManager are completely initialized. This should be | 1053 // RenderFrameHostManager are completely initialized. This should be |
| 1057 // removed once the process manager moves away from NotificationService. | 1054 // removed once the process manager moves away from NotificationService. |
| 1058 // See https://crbug.com/462682. | 1055 // See https://crbug.com/462682. |
| (...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1541 // to open a new tab to an interstitial-inducing URL, and then navigates | 1538 // to open a new tab to an interstitial-inducing URL, and then navigates |
| 1542 // the page to a different same-site URL. (This seems very unlikely in | 1539 // the page to a different same-site URL. (This seems very unlikely in |
| 1543 // practice.) | 1540 // practice.) |
| 1544 if (current_entry) | 1541 if (current_entry) |
| 1545 return current_entry->GetURL(); | 1542 return current_entry->GetURL(); |
| 1546 return current_instance->GetSiteURL(); | 1543 return current_instance->GetSiteURL(); |
| 1547 } | 1544 } |
| 1548 | 1545 |
| 1549 void RenderFrameHostManager::CreatePendingRenderFrameHost( | 1546 void RenderFrameHostManager::CreatePendingRenderFrameHost( |
| 1550 SiteInstance* old_instance, | 1547 SiteInstance* old_instance, |
| 1551 SiteInstance* new_instance, | 1548 SiteInstance* new_instance) { |
| 1552 bool is_main_frame) { | |
| 1553 int create_render_frame_flags = 0; | 1549 int create_render_frame_flags = 0; |
| 1554 if (is_main_frame) | |
| 1555 create_render_frame_flags |= CREATE_RF_FOR_MAIN_FRAME_NAVIGATION; | |
| 1556 | |
| 1557 if (delegate_->IsHidden()) | 1550 if (delegate_->IsHidden()) |
| 1558 create_render_frame_flags |= CREATE_RF_HIDDEN; | 1551 create_render_frame_flags |= CREATE_RF_HIDDEN; |
| 1559 | 1552 |
| 1560 if (pending_render_frame_host_) | 1553 if (pending_render_frame_host_) |
| 1561 CancelPending(); | 1554 CancelPending(); |
| 1562 | 1555 |
| 1563 // The process for the new SiteInstance may (if we're sharing a process with | 1556 // The process for the new SiteInstance may (if we're sharing a process with |
| 1564 // another host that already initialized it) or may not (we have our own | 1557 // another host that already initialized it) or may not (we have our own |
| 1565 // process or the existing process crashed) have been initialized. Calling | 1558 // process or the existing process crashed) have been initialized. Calling |
| 1566 // Init multiple times will be ignored, so this is safe. | 1559 // Init multiple times will be ignored, so this is safe. |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1667 // The process for the new SiteInstance may (if we're sharing a process with | 1660 // The process for the new SiteInstance may (if we're sharing a process with |
| 1668 // another host that already initialized it) or may not (we have our own | 1661 // another host that already initialized it) or may not (we have our own |
| 1669 // process or the existing process crashed) have been initialized. Calling | 1662 // process or the existing process crashed) have been initialized. Calling |
| 1670 // Init multiple times will be ignored, so this is safe. | 1663 // Init multiple times will be ignored, so this is safe. |
| 1671 if (!new_instance->GetProcess()->Init()) | 1664 if (!new_instance->GetProcess()->Init()) |
| 1672 return false; | 1665 return false; |
| 1673 | 1666 |
| 1674 CreateProxiesForNewRenderFrameHost(old_instance, new_instance); | 1667 CreateProxiesForNewRenderFrameHost(old_instance, new_instance); |
| 1675 | 1668 |
| 1676 int create_render_frame_flags = 0; | 1669 int create_render_frame_flags = 0; |
| 1677 if (frame_tree_node_->IsMainFrame()) | |
| 1678 create_render_frame_flags |= CREATE_RF_FOR_MAIN_FRAME_NAVIGATION; | |
| 1679 if (delegate_->IsHidden()) | 1670 if (delegate_->IsHidden()) |
| 1680 create_render_frame_flags |= CREATE_RF_HIDDEN; | 1671 create_render_frame_flags |= CREATE_RF_HIDDEN; |
| 1681 speculative_render_frame_host_ = | 1672 speculative_render_frame_host_ = |
| 1682 CreateRenderFrame(new_instance, speculative_web_ui_.get(), | 1673 CreateRenderFrame(new_instance, speculative_web_ui_.get(), |
| 1683 create_render_frame_flags, nullptr); | 1674 create_render_frame_flags, nullptr); |
| 1684 | 1675 |
| 1685 if (!speculative_render_frame_host_) { | 1676 if (!speculative_render_frame_host_) { |
| 1686 speculative_web_ui_.reset(); | 1677 speculative_web_ui_.reset(); |
| 1687 return false; | 1678 return false; |
| 1688 } | 1679 } |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 1713 | 1704 |
| 1714 // We are creating a pending, speculative or swapped out RFH here. We should | 1705 // We are creating a pending, speculative or swapped out RFH here. We should |
| 1715 // never create it in the same SiteInstance as our current RFH. | 1706 // never create it in the same SiteInstance as our current RFH. |
| 1716 CHECK_NE(render_frame_host_->GetSiteInstance(), instance); | 1707 CHECK_NE(render_frame_host_->GetSiteInstance(), instance); |
| 1717 | 1708 |
| 1718 // Check if we've already created an RFH for this SiteInstance. If so, try | 1709 // Check if we've already created an RFH for this SiteInstance. If so, try |
| 1719 // to re-use the existing one, which has already been initialized. We'll | 1710 // to re-use the existing one, which has already been initialized. We'll |
| 1720 // remove it from the list of proxy hosts below if it will be active. | 1711 // remove it from the list of proxy hosts below if it will be active. |
| 1721 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); | 1712 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); |
| 1722 if (proxy && proxy->render_frame_host()) { | 1713 if (proxy && proxy->render_frame_host()) { |
| 1714 RenderViewHost* render_view_host = proxy->GetRenderViewHost(); | |
| 1723 CHECK(!swapped_out_forbidden); | 1715 CHECK(!swapped_out_forbidden); |
| 1724 if (view_routing_id_ptr) | 1716 if (view_routing_id_ptr) |
| 1725 *view_routing_id_ptr = proxy->GetRenderViewHost()->GetRoutingID(); | 1717 *view_routing_id_ptr = proxy->GetRenderViewHost()->GetRoutingID(); |
| 1726 // Delete the existing RenderFrameProxyHost, but reuse the RenderFrameHost. | 1718 // Delete the existing RenderFrameProxyHost, but reuse the RenderFrameHost. |
| 1727 // Prevent the process from exiting while we're trying to use it. | 1719 // Prevent the process from exiting while we're trying to use it. |
| 1728 if (!swapped_out) { | 1720 if (!swapped_out) { |
| 1729 new_render_frame_host = proxy->PassFrameHostOwnership(); | 1721 new_render_frame_host = proxy->PassFrameHostOwnership(); |
| 1730 new_render_frame_host->GetProcess()->AddPendingView(); | 1722 new_render_frame_host->GetProcess()->AddPendingView(); |
| 1731 | 1723 |
| 1732 proxy_hosts_->Remove(instance->GetId()); | 1724 proxy_hosts_->Remove(instance->GetId()); |
| 1733 // NB |proxy| is deleted at this point. | 1725 // NB |proxy| is deleted at this point. |
| 1734 } | 1726 } |
| 1727 // If we are reusing the RenderViewHost and it doesn't already have a | |
| 1728 // RenderWidgetHostView, we need to create one if this is the main frame. | |
| 1729 if (!render_view_host->GetView() && frame_tree_node_->IsMainFrame()) | |
| 1730 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host); | |
| 1735 } else { | 1731 } else { |
| 1736 // Create a new RenderFrameHost if we don't find an existing one. | 1732 // Create a new RenderFrameHost if we don't find an existing one. |
| 1737 | 1733 |
| 1738 int32 widget_routing_id = MSG_ROUTING_NONE; | 1734 int32 widget_routing_id = MSG_ROUTING_NONE; |
| 1739 int32 surface_id = 0; | 1735 int32 surface_id = 0; |
| 1740 // A RenderFrame in a different process from its parent RenderFrame | 1736 // A RenderFrame in a different process from its parent RenderFrame |
| 1741 // requires a RenderWidget for input/layout/painting. | 1737 // requires a RenderWidget for input/layout/painting. |
| 1742 if (frame_tree_node_->parent() && | 1738 if (frame_tree_node_->parent() && |
| 1743 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() != | 1739 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() != |
| 1744 instance) { | 1740 instance) { |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 1761 new_render_frame_host->GetProcess()->AddPendingView(); | 1757 new_render_frame_host->GetProcess()->AddPendingView(); |
| 1762 } else { | 1758 } else { |
| 1763 proxy = new RenderFrameProxyHost( | 1759 proxy = new RenderFrameProxyHost( |
| 1764 new_render_frame_host->GetSiteInstance(), | 1760 new_render_frame_host->GetSiteInstance(), |
| 1765 new_render_frame_host->render_view_host(), frame_tree_node_); | 1761 new_render_frame_host->render_view_host(), frame_tree_node_); |
| 1766 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy)); | 1762 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy)); |
| 1767 proxy_routing_id = proxy->GetRoutingID(); | 1763 proxy_routing_id = proxy->GetRoutingID(); |
| 1768 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); | 1764 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); |
| 1769 } | 1765 } |
| 1770 | 1766 |
| 1771 success = InitRenderView(render_view_host, proxy_routing_id, | 1767 if (frame_tree_node_->IsMainFrame()) { |
| 1772 !!(flags & CREATE_RF_FOR_MAIN_FRAME_NAVIGATION)); | 1768 success = InitRenderView(render_view_host, proxy_routing_id); |
|
Charlie Reis
2015/09/02 20:13:08
Sanity check: What happens if this is a subframe a
| |
| 1769 | |
| 1770 // If we are reusing the RenderViewHost and it doesn't already have a | |
| 1771 // RenderWidgetHostView, we need to create one if this is the main frame. | |
| 1772 if (!swapped_out && !render_view_host->GetView()) | |
| 1773 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host); | |
| 1774 } | |
| 1775 | |
| 1773 if (success) { | 1776 if (success) { |
| 1774 // Remember that InitRenderView also created the RenderFrameProxy. | 1777 // Remember that InitRenderView also created the RenderFrameProxy. |
| 1775 if (swapped_out) | 1778 if (swapped_out) |
| 1776 proxy->set_render_frame_proxy_created(true); | 1779 proxy->set_render_frame_proxy_created(true); |
| 1777 if (frame_tree_node_->IsMainFrame()) { | 1780 if (frame_tree_node_->IsMainFrame()) { |
| 1778 // Don't show the main frame's view until we get a DidNavigate from it. | 1781 // Don't show the main frame's view until we get a DidNavigate from it. |
| 1779 // Only the RenderViewHost for the top-level RenderFrameHost has a | 1782 // Only the RenderViewHost for the top-level RenderFrameHost has a |
| 1780 // RenderWidgetHostView; RenderWidgetHosts for out-of-process iframes | 1783 // RenderWidgetHostView; RenderWidgetHosts for out-of-process iframes |
| 1781 // will be created later and hidden. | 1784 // will be created later and hidden. |
| 1782 if (render_view_host->GetView()) | 1785 if (render_view_host->GetView()) |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1847 return proxy->GetRoutingID(); | 1850 return proxy->GetRoutingID(); |
| 1848 | 1851 |
| 1849 if (!proxy) { | 1852 if (!proxy) { |
| 1850 proxy = | 1853 proxy = |
| 1851 new RenderFrameProxyHost(instance, render_view_host, frame_tree_node_); | 1854 new RenderFrameProxyHost(instance, render_view_host, frame_tree_node_); |
| 1852 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy)); | 1855 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy)); |
| 1853 } | 1856 } |
| 1854 | 1857 |
| 1855 if (SiteIsolationPolicy::IsSwappedOutStateForbidden() && | 1858 if (SiteIsolationPolicy::IsSwappedOutStateForbidden() && |
| 1856 frame_tree_node_->IsMainFrame()) { | 1859 frame_tree_node_->IsMainFrame()) { |
| 1857 InitRenderView(render_view_host, proxy->GetRoutingID(), true); | 1860 InitRenderView(render_view_host, proxy->GetRoutingID()); |
| 1858 proxy->set_render_frame_proxy_created(true); | 1861 proxy->set_render_frame_proxy_created(true); |
| 1859 } else { | 1862 } else { |
| 1860 proxy->InitRenderFrameProxy(); | 1863 proxy->InitRenderFrameProxy(); |
| 1861 } | 1864 } |
| 1862 | 1865 |
| 1863 return proxy->GetRoutingID(); | 1866 return proxy->GetRoutingID(); |
| 1864 } | 1867 } |
| 1865 | 1868 |
| 1866 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) { | 1869 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) { |
| 1867 for (const auto& pair : *proxy_hosts_) { | 1870 for (const auto& pair : *proxy_hosts_) { |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 1885 | 1888 |
| 1886 // Recreate the opener chain. | 1889 // Recreate the opener chain. |
| 1887 CreateOpenerProxiesIfNeeded(instance); | 1890 CreateOpenerProxiesIfNeeded(instance); |
| 1888 | 1891 |
| 1889 // If the proxy in |instance| doesn't exist, this RenderView is not swapped | 1892 // If the proxy in |instance| doesn't exist, this RenderView is not swapped |
| 1890 // out and shouldn't be reinitialized here. | 1893 // out and shouldn't be reinitialized here. |
| 1891 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); | 1894 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); |
| 1892 if (!proxy) | 1895 if (!proxy) |
| 1893 return; | 1896 return; |
| 1894 | 1897 |
| 1895 InitRenderView(render_view_host, proxy->GetRoutingID(), false); | 1898 InitRenderView(render_view_host, proxy->GetRoutingID()); |
| 1896 proxy->set_render_frame_proxy_created(true); | 1899 proxy->set_render_frame_proxy_created(true); |
| 1897 } | 1900 } |
| 1898 | 1901 |
| 1899 void RenderFrameHostManager::CreateOuterDelegateProxy( | 1902 void RenderFrameHostManager::CreateOuterDelegateProxy( |
| 1900 SiteInstance* outer_contents_site_instance, | 1903 SiteInstance* outer_contents_site_instance, |
| 1901 RenderFrameHostImpl* render_frame_host) { | 1904 RenderFrameHostImpl* render_frame_host) { |
| 1902 CHECK(BrowserPluginGuestMode::UseCrossProcessFramesForGuests()); | 1905 CHECK(BrowserPluginGuestMode::UseCrossProcessFramesForGuests()); |
| 1903 RenderFrameProxyHost* proxy = new RenderFrameProxyHost( | 1906 RenderFrameProxyHost* proxy = new RenderFrameProxyHost( |
| 1904 outer_contents_site_instance, nullptr, frame_tree_node_); | 1907 outer_contents_site_instance, nullptr, frame_tree_node_); |
| 1905 proxy_hosts_->Add(outer_contents_site_instance->GetId(), | 1908 proxy_hosts_->Add(outer_contents_site_instance->GetId(), |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 1920 } | 1923 } |
| 1921 | 1924 |
| 1922 void RenderFrameHostManager::SetRWHViewForInnerContents( | 1925 void RenderFrameHostManager::SetRWHViewForInnerContents( |
| 1923 RenderWidgetHostView* child_rwhv) { | 1926 RenderWidgetHostView* child_rwhv) { |
| 1924 DCHECK(ForInnerDelegate() && frame_tree_node_->IsMainFrame()); | 1927 DCHECK(ForInnerDelegate() && frame_tree_node_->IsMainFrame()); |
| 1925 GetProxyToOuterDelegate()->SetChildRWHView(child_rwhv); | 1928 GetProxyToOuterDelegate()->SetChildRWHView(child_rwhv); |
| 1926 } | 1929 } |
| 1927 | 1930 |
| 1928 bool RenderFrameHostManager::InitRenderView( | 1931 bool RenderFrameHostManager::InitRenderView( |
| 1929 RenderViewHostImpl* render_view_host, | 1932 RenderViewHostImpl* render_view_host, |
| 1930 int proxy_routing_id, | 1933 int proxy_routing_id) { |
| 1931 bool for_main_frame_navigation) { | |
| 1932 // Ensure the renderer process is initialized before creating the | 1934 // Ensure the renderer process is initialized before creating the |
| 1933 // RenderView. | 1935 // RenderView. |
| 1934 if (!render_view_host->GetProcess()->Init()) | 1936 if (!render_view_host->GetProcess()->Init()) |
| 1935 return false; | 1937 return false; |
| 1936 | 1938 |
| 1937 // We may have initialized this RenderViewHost for another RenderFrameHost. | 1939 // We may have initialized this RenderViewHost for another RenderFrameHost. |
| 1938 if (render_view_host->IsRenderViewLive()) | 1940 if (render_view_host->IsRenderViewLive()) |
| 1939 return true; | 1941 return true; |
| 1940 | 1942 |
| 1941 // If the ongoing navigation is to a WebUI and the RenderView is not in a | 1943 // If the ongoing navigation is to a WebUI and the RenderView is not in a |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 1958 CHECK(!ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( | 1960 CHECK(!ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( |
| 1959 render_view_host->GetProcess()->GetID())); | 1961 render_view_host->GetProcess()->GetID())); |
| 1960 } | 1962 } |
| 1961 } | 1963 } |
| 1962 | 1964 |
| 1963 int opener_frame_routing_id = | 1965 int opener_frame_routing_id = |
| 1964 GetOpenerRoutingID(render_view_host->GetSiteInstance()); | 1966 GetOpenerRoutingID(render_view_host->GetSiteInstance()); |
| 1965 | 1967 |
| 1966 return delegate_->CreateRenderViewForRenderManager( | 1968 return delegate_->CreateRenderViewForRenderManager( |
| 1967 render_view_host, opener_frame_routing_id, proxy_routing_id, | 1969 render_view_host, opener_frame_routing_id, proxy_routing_id, |
| 1968 frame_tree_node_->current_replication_state(), for_main_frame_navigation); | 1970 frame_tree_node_->current_replication_state()); |
| 1969 } | 1971 } |
| 1970 | 1972 |
| 1971 bool RenderFrameHostManager::InitRenderFrame( | 1973 bool RenderFrameHostManager::InitRenderFrame( |
| 1972 RenderFrameHostImpl* render_frame_host) { | 1974 RenderFrameHostImpl* render_frame_host) { |
| 1973 if (render_frame_host->IsRenderFrameLive()) | 1975 if (render_frame_host->IsRenderFrameLive()) |
| 1974 return true; | 1976 return true; |
| 1975 | 1977 |
| 1976 int parent_routing_id = MSG_ROUTING_NONE; | 1978 int parent_routing_id = MSG_ROUTING_NONE; |
| 1977 int previous_sibling_routing_id = MSG_ROUTING_NONE; | 1979 int previous_sibling_routing_id = MSG_ROUTING_NONE; |
| 1978 int proxy_routing_id = MSG_ROUTING_NONE; | 1980 int proxy_routing_id = MSG_ROUTING_NONE; |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2268 | 2270 |
| 2269 // New SiteInstance: create a pending RFH to navigate. | 2271 // New SiteInstance: create a pending RFH to navigate. |
| 2270 | 2272 |
| 2271 // This will possibly create (set to nullptr) a Web UI object for the | 2273 // This will possibly create (set to nullptr) a Web UI object for the |
| 2272 // pending page. We'll use this later to give the page special access. This | 2274 // pending page. We'll use this later to give the page special access. This |
| 2273 // must happen before the new renderer is created below so it will get | 2275 // must happen before the new renderer is created below so it will get |
| 2274 // bindings. It must also happen after the above conditional call to | 2276 // bindings. It must also happen after the above conditional call to |
| 2275 // CancelPending(), otherwise CancelPending may clear the pending_web_ui_ | 2277 // CancelPending(), otherwise CancelPending may clear the pending_web_ui_ |
| 2276 // and the page will not have its bindings set appropriately. | 2278 // and the page will not have its bindings set appropriately. |
| 2277 SetPendingWebUI(dest_url, bindings); | 2279 SetPendingWebUI(dest_url, bindings); |
| 2278 CreatePendingRenderFrameHost(current_instance, new_instance.get(), | 2280 CreatePendingRenderFrameHost(current_instance, new_instance.get()); |
| 2279 frame_tree_node_->IsMainFrame()); | |
| 2280 if (!pending_render_frame_host_) | 2281 if (!pending_render_frame_host_) |
| 2281 return nullptr; | 2282 return nullptr; |
| 2282 | 2283 |
| 2283 // Check if our current RFH is live before we set up a transition. | 2284 // Check if our current RFH is live before we set up a transition. |
| 2284 if (!render_frame_host_->IsRenderFrameLive()) { | 2285 if (!render_frame_host_->IsRenderFrameLive()) { |
| 2285 // The current RFH is not live. There's no reason to sit around with a | 2286 // The current RFH is not live. There's no reason to sit around with a |
| 2286 // sad tab or a newly created RFH while we wait for the pending RFH to | 2287 // sad tab or a newly created RFH while we wait for the pending RFH to |
| 2287 // navigate. Just switch to the pending RFH now and go back to normal. | 2288 // navigate. Just switch to the pending RFH now and go back to normal. |
| 2288 // (Note that we don't care about on{before}unload handlers if the current | 2289 // (Note that we don't care about on{before}unload handlers if the current |
| 2289 // RFH isn't live.) | 2290 // RFH isn't live.) |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2550 // Ensure that all the nodes in the opener's frame tree have | 2551 // Ensure that all the nodes in the opener's frame tree have |
| 2551 // RenderFrameProxyHosts for the new SiteInstance. | 2552 // RenderFrameProxyHosts for the new SiteInstance. |
| 2552 frame_tree->CreateProxiesForSiteInstance(nullptr, instance); | 2553 frame_tree->CreateProxiesForSiteInstance(nullptr, instance); |
| 2553 } else if (rvh && !rvh->IsRenderViewLive()) { | 2554 } else if (rvh && !rvh->IsRenderViewLive()) { |
| 2554 EnsureRenderViewInitialized(rvh, instance); | 2555 EnsureRenderViewInitialized(rvh, instance); |
| 2555 } else { | 2556 } else { |
| 2556 // Create a swapped out RenderView in the given SiteInstance if none exists, | 2557 // Create a swapped out RenderView in the given SiteInstance if none exists, |
| 2557 // setting its opener to the given route_id. Since the opener can point to | 2558 // setting its opener to the given route_id. Since the opener can point to |
| 2558 // a subframe, do this on the root frame of the opener's frame tree. | 2559 // a subframe, do this on the root frame of the opener's frame tree. |
| 2559 // Return the new view's route_id. | 2560 // Return the new view's route_id. |
| 2560 frame_tree->root()->render_manager()-> | 2561 frame_tree->root()->render_manager()->CreateRenderFrame( |
| 2561 CreateRenderFrame(instance, nullptr, | 2562 instance, nullptr, CREATE_RF_SWAPPED_OUT | CREATE_RF_HIDDEN, nullptr); |
| 2562 CREATE_RF_FOR_MAIN_FRAME_NAVIGATION | | |
| 2563 CREATE_RF_SWAPPED_OUT | CREATE_RF_HIDDEN, | |
| 2564 nullptr); | |
| 2565 } | 2563 } |
| 2566 } | 2564 } |
| 2567 | 2565 |
| 2568 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) { | 2566 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) { |
| 2569 if (!frame_tree_node_->opener()) | 2567 if (!frame_tree_node_->opener()) |
| 2570 return MSG_ROUTING_NONE; | 2568 return MSG_ROUTING_NONE; |
| 2571 | 2569 |
| 2572 return frame_tree_node_->opener() | 2570 return frame_tree_node_->opener() |
| 2573 ->render_manager() | 2571 ->render_manager() |
| 2574 ->GetRoutingIdForSiteInstance(instance); | 2572 ->GetRoutingIdForSiteInstance(instance); |
| 2575 } | 2573 } |
| 2576 | 2574 |
| 2577 } // namespace content | 2575 } // namespace content |
| OLD | NEW |