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 isn't live, then try to create a new one to satisfy this | 407 // If the renderer isn't live, 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 CreateOpenerProxies(dest_render_frame_host->GetSiteInstance(), | 420 CreateOpenerProxies(dest_render_frame_host->GetSiteInstance(), |
422 frame_tree_node_); | 421 frame_tree_node_); |
423 if (!InitRenderView(dest_render_frame_host->render_view_host(), | 422 if (!InitRenderView(dest_render_frame_host->render_view_host(), |
424 MSG_ROUTING_NONE, | 423 MSG_ROUTING_NONE)) |
425 frame_tree_node_->IsMainFrame())) | |
426 return nullptr; | 424 return nullptr; |
427 | 425 |
428 // Now that we've created a new renderer, be sure to hide it if it isn't | 426 // Now that we've created a new renderer, be sure to hide it if it isn't |
429 // our primary one. Otherwise, we might crash if we try to call Show() | 427 // our primary one. Otherwise, we might crash if we try to call Show() |
430 // on it later. | 428 // on it later. |
431 if (dest_render_frame_host != render_frame_host_) { | 429 if (dest_render_frame_host != render_frame_host_) { |
432 if (dest_render_frame_host->GetView()) | 430 if (dest_render_frame_host->GetView()) |
433 dest_render_frame_host->GetView()->Hide(); | 431 dest_render_frame_host->GetView()->Hide(); |
434 } else { | 432 } else { |
435 // After a renderer crash we'd have marked the host as invisible, so we | 433 // After a renderer crash we'd have marked the host as invisible, so we |
(...skipping 615 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1051 } | 1049 } |
1052 DCHECK(navigation_rfh && | 1050 DCHECK(navigation_rfh && |
1053 (navigation_rfh == render_frame_host_.get() || | 1051 (navigation_rfh == render_frame_host_.get() || |
1054 navigation_rfh == speculative_render_frame_host_.get())); | 1052 navigation_rfh == speculative_render_frame_host_.get())); |
1055 | 1053 |
1056 // If the RenderFrame that needs to navigate is not live (its process was just | 1054 // If the RenderFrame that needs to navigate is not live (its process was just |
1057 // created or has crashed), initialize it. | 1055 // created or has crashed), initialize it. |
1058 if (!navigation_rfh->IsRenderFrameLive()) { | 1056 if (!navigation_rfh->IsRenderFrameLive()) { |
1059 // Recreate the opener chain. | 1057 // Recreate the opener chain. |
1060 CreateOpenerProxies(navigation_rfh->GetSiteInstance(), frame_tree_node_); | 1058 CreateOpenerProxies(navigation_rfh->GetSiteInstance(), frame_tree_node_); |
1061 if (!InitRenderView(navigation_rfh->render_view_host(), MSG_ROUTING_NONE, | 1059 if (!InitRenderView(navigation_rfh->render_view_host(), MSG_ROUTING_NONE)) { |
1062 frame_tree_node_->IsMainFrame())) { | |
1063 return nullptr; | 1060 return nullptr; |
1064 } | 1061 } |
1065 | 1062 |
1066 if (navigation_rfh == render_frame_host_) { | 1063 if (navigation_rfh == render_frame_host_) { |
1067 // TODO(nasko): This is a very ugly hack. The Chrome extensions process | 1064 // TODO(nasko): This is a very ugly hack. The Chrome extensions process |
1068 // manager still uses NotificationService and expects to see a | 1065 // manager still uses NotificationService and expects to see a |
1069 // RenderViewHost changed notification after WebContents and | 1066 // RenderViewHost changed notification after WebContents and |
1070 // RenderFrameHostManager are completely initialized. This should be | 1067 // RenderFrameHostManager are completely initialized. This should be |
1071 // removed once the process manager moves away from NotificationService. | 1068 // removed once the process manager moves away from NotificationService. |
1072 // See https://crbug.com/462682. | 1069 // See https://crbug.com/462682. |
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1555 // to open a new tab to an interstitial-inducing URL, and then navigates | 1552 // to open a new tab to an interstitial-inducing URL, and then navigates |
1556 // the page to a different same-site URL. (This seems very unlikely in | 1553 // the page to a different same-site URL. (This seems very unlikely in |
1557 // practice.) | 1554 // practice.) |
1558 if (current_entry) | 1555 if (current_entry) |
1559 return current_entry->GetURL(); | 1556 return current_entry->GetURL(); |
1560 return current_instance->GetSiteURL(); | 1557 return current_instance->GetSiteURL(); |
1561 } | 1558 } |
1562 | 1559 |
1563 void RenderFrameHostManager::CreatePendingRenderFrameHost( | 1560 void RenderFrameHostManager::CreatePendingRenderFrameHost( |
1564 SiteInstance* old_instance, | 1561 SiteInstance* old_instance, |
1565 SiteInstance* new_instance, | 1562 SiteInstance* new_instance) { |
1566 bool is_main_frame) { | |
1567 int create_render_frame_flags = 0; | 1563 int create_render_frame_flags = 0; |
1568 if (is_main_frame) | |
1569 create_render_frame_flags |= CREATE_RF_FOR_MAIN_FRAME_NAVIGATION; | |
1570 | |
1571 if (delegate_->IsHidden()) | 1564 if (delegate_->IsHidden()) |
1572 create_render_frame_flags |= CREATE_RF_HIDDEN; | 1565 create_render_frame_flags |= CREATE_RF_HIDDEN; |
1573 | 1566 |
1574 if (pending_render_frame_host_) | 1567 if (pending_render_frame_host_) |
1575 CancelPending(); | 1568 CancelPending(); |
1576 | 1569 |
1577 // The process for the new SiteInstance may (if we're sharing a process with | 1570 // The process for the new SiteInstance may (if we're sharing a process with |
1578 // another host that already initialized it) or may not (we have our own | 1571 // another host that already initialized it) or may not (we have our own |
1579 // process or the existing process crashed) have been initialized. Calling | 1572 // process or the existing process crashed) have been initialized. Calling |
1580 // Init multiple times will be ignored, so this is safe. | 1573 // Init multiple times will be ignored, so this is safe. |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1684 // The process for the new SiteInstance may (if we're sharing a process with | 1677 // The process for the new SiteInstance may (if we're sharing a process with |
1685 // another host that already initialized it) or may not (we have our own | 1678 // another host that already initialized it) or may not (we have our own |
1686 // process or the existing process crashed) have been initialized. Calling | 1679 // process or the existing process crashed) have been initialized. Calling |
1687 // Init multiple times will be ignored, so this is safe. | 1680 // Init multiple times will be ignored, so this is safe. |
1688 if (!new_instance->GetProcess()->Init()) | 1681 if (!new_instance->GetProcess()->Init()) |
1689 return false; | 1682 return false; |
1690 | 1683 |
1691 CreateProxiesForNewRenderFrameHost(old_instance, new_instance); | 1684 CreateProxiesForNewRenderFrameHost(old_instance, new_instance); |
1692 | 1685 |
1693 int create_render_frame_flags = 0; | 1686 int create_render_frame_flags = 0; |
1694 if (frame_tree_node_->IsMainFrame()) | |
1695 create_render_frame_flags |= CREATE_RF_FOR_MAIN_FRAME_NAVIGATION; | |
1696 if (delegate_->IsHidden()) | 1687 if (delegate_->IsHidden()) |
1697 create_render_frame_flags |= CREATE_RF_HIDDEN; | 1688 create_render_frame_flags |= CREATE_RF_HIDDEN; |
1698 speculative_render_frame_host_ = | 1689 speculative_render_frame_host_ = |
1699 CreateRenderFrame(new_instance, speculative_web_ui_.get(), | 1690 CreateRenderFrame(new_instance, speculative_web_ui_.get(), |
1700 create_render_frame_flags, nullptr); | 1691 create_render_frame_flags, nullptr); |
1701 | 1692 |
1702 if (!speculative_render_frame_host_) { | 1693 if (!speculative_render_frame_host_) { |
1703 speculative_web_ui_.reset(); | 1694 speculative_web_ui_.reset(); |
1704 return false; | 1695 return false; |
1705 } | 1696 } |
(...skipping 24 matching lines...) Expand all Loading... |
1730 | 1721 |
1731 // We are creating a pending, speculative or swapped out RFH here. We should | 1722 // We are creating a pending, speculative or swapped out RFH here. We should |
1732 // never create it in the same SiteInstance as our current RFH. | 1723 // never create it in the same SiteInstance as our current RFH. |
1733 CHECK_NE(render_frame_host_->GetSiteInstance(), instance); | 1724 CHECK_NE(render_frame_host_->GetSiteInstance(), instance); |
1734 | 1725 |
1735 // Check if we've already created an RFH for this SiteInstance. If so, try | 1726 // Check if we've already created an RFH for this SiteInstance. If so, try |
1736 // to re-use the existing one, which has already been initialized. We'll | 1727 // to re-use the existing one, which has already been initialized. We'll |
1737 // remove it from the list of proxy hosts below if it will be active. | 1728 // remove it from the list of proxy hosts below if it will be active. |
1738 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); | 1729 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); |
1739 if (proxy && proxy->render_frame_host()) { | 1730 if (proxy && proxy->render_frame_host()) { |
| 1731 RenderViewHost* render_view_host = proxy->GetRenderViewHost(); |
1740 CHECK(!swapped_out_forbidden); | 1732 CHECK(!swapped_out_forbidden); |
1741 if (view_routing_id_ptr) | 1733 if (view_routing_id_ptr) |
1742 *view_routing_id_ptr = proxy->GetRenderViewHost()->GetRoutingID(); | 1734 *view_routing_id_ptr = proxy->GetRenderViewHost()->GetRoutingID(); |
1743 // Delete the existing RenderFrameProxyHost, but reuse the RenderFrameHost. | 1735 // Delete the existing RenderFrameProxyHost, but reuse the RenderFrameHost. |
1744 // Prevent the process from exiting while we're trying to use it. | 1736 // Prevent the process from exiting while we're trying to use it. |
1745 if (!swapped_out) { | 1737 if (!swapped_out) { |
1746 new_render_frame_host = proxy->PassFrameHostOwnership(); | 1738 new_render_frame_host = proxy->PassFrameHostOwnership(); |
1747 new_render_frame_host->GetProcess()->AddPendingView(); | 1739 new_render_frame_host->GetProcess()->AddPendingView(); |
1748 | 1740 |
1749 proxy_hosts_->Remove(instance->GetId()); | 1741 proxy_hosts_->Remove(instance->GetId()); |
1750 // NB |proxy| is deleted at this point. | 1742 // NB |proxy| is deleted at this point. |
1751 } | 1743 } |
| 1744 // If we are reusing the RenderViewHost and it doesn't already have a |
| 1745 // RenderWidgetHostView, we need to create one if this is the main frame. |
| 1746 if (!render_view_host->GetView() && frame_tree_node_->IsMainFrame()) |
| 1747 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host); |
1752 } else { | 1748 } else { |
1753 // Create a new RenderFrameHost if we don't find an existing one. | 1749 // Create a new RenderFrameHost if we don't find an existing one. |
1754 | 1750 |
1755 int32 widget_routing_id = MSG_ROUTING_NONE; | 1751 int32 widget_routing_id = MSG_ROUTING_NONE; |
1756 int32 surface_id = 0; | 1752 int32 surface_id = 0; |
1757 // A RenderFrame in a different process from its parent RenderFrame | 1753 // A RenderFrame in a different process from its parent RenderFrame |
1758 // requires a RenderWidget for input/layout/painting. | 1754 // requires a RenderWidget for input/layout/painting. |
1759 if (frame_tree_node_->parent() && | 1755 if (frame_tree_node_->parent() && |
1760 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() != | 1756 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() != |
1761 instance) { | 1757 instance) { |
(...skipping 16 matching lines...) Expand all Loading... |
1778 new_render_frame_host->GetProcess()->AddPendingView(); | 1774 new_render_frame_host->GetProcess()->AddPendingView(); |
1779 } else { | 1775 } else { |
1780 proxy = new RenderFrameProxyHost( | 1776 proxy = new RenderFrameProxyHost( |
1781 new_render_frame_host->GetSiteInstance(), | 1777 new_render_frame_host->GetSiteInstance(), |
1782 new_render_frame_host->render_view_host(), frame_tree_node_); | 1778 new_render_frame_host->render_view_host(), frame_tree_node_); |
1783 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy)); | 1779 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy)); |
1784 proxy_routing_id = proxy->GetRoutingID(); | 1780 proxy_routing_id = proxy->GetRoutingID(); |
1785 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); | 1781 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); |
1786 } | 1782 } |
1787 | 1783 |
1788 success = InitRenderView(render_view_host, proxy_routing_id, | 1784 if (frame_tree_node_->IsMainFrame()) { |
1789 !!(flags & CREATE_RF_FOR_MAIN_FRAME_NAVIGATION)); | 1785 success = InitRenderView(render_view_host, proxy_routing_id); |
| 1786 |
| 1787 // If we are reusing the RenderViewHost and it doesn't already have a |
| 1788 // RenderWidgetHostView, we need to create one if this is the main frame. |
| 1789 if (!swapped_out && !render_view_host->GetView()) |
| 1790 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host); |
| 1791 } else { |
| 1792 DCHECK(render_view_host->IsRenderViewLive()); |
| 1793 } |
| 1794 |
1790 if (success) { | 1795 if (success) { |
1791 // Remember that InitRenderView also created the RenderFrameProxy. | 1796 // Remember that InitRenderView also created the RenderFrameProxy. |
1792 if (swapped_out) | 1797 if (swapped_out) |
1793 proxy->set_render_frame_proxy_created(true); | 1798 proxy->set_render_frame_proxy_created(true); |
1794 if (frame_tree_node_->IsMainFrame()) { | 1799 if (frame_tree_node_->IsMainFrame()) { |
1795 // Don't show the main frame's view until we get a DidNavigate from it. | 1800 // Don't show the main frame's view until we get a DidNavigate from it. |
1796 // Only the RenderViewHost for the top-level RenderFrameHost has a | 1801 // Only the RenderViewHost for the top-level RenderFrameHost has a |
1797 // RenderWidgetHostView; RenderWidgetHosts for out-of-process iframes | 1802 // RenderWidgetHostView; RenderWidgetHosts for out-of-process iframes |
1798 // will be created later and hidden. | 1803 // will be created later and hidden. |
1799 if (render_view_host->GetView()) | 1804 if (render_view_host->GetView()) |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1864 return proxy->GetRoutingID(); | 1869 return proxy->GetRoutingID(); |
1865 | 1870 |
1866 if (!proxy) { | 1871 if (!proxy) { |
1867 proxy = | 1872 proxy = |
1868 new RenderFrameProxyHost(instance, render_view_host, frame_tree_node_); | 1873 new RenderFrameProxyHost(instance, render_view_host, frame_tree_node_); |
1869 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy)); | 1874 proxy_hosts_->Add(instance->GetId(), make_scoped_ptr(proxy)); |
1870 } | 1875 } |
1871 | 1876 |
1872 if (SiteIsolationPolicy::IsSwappedOutStateForbidden() && | 1877 if (SiteIsolationPolicy::IsSwappedOutStateForbidden() && |
1873 frame_tree_node_->IsMainFrame()) { | 1878 frame_tree_node_->IsMainFrame()) { |
1874 InitRenderView(render_view_host, proxy->GetRoutingID(), true); | 1879 InitRenderView(render_view_host, proxy->GetRoutingID()); |
1875 proxy->set_render_frame_proxy_created(true); | 1880 proxy->set_render_frame_proxy_created(true); |
1876 } else { | 1881 } else { |
1877 proxy->InitRenderFrameProxy(); | 1882 proxy->InitRenderFrameProxy(); |
1878 } | 1883 } |
1879 | 1884 |
1880 return proxy->GetRoutingID(); | 1885 return proxy->GetRoutingID(); |
1881 } | 1886 } |
1882 | 1887 |
1883 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) { | 1888 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) { |
1884 for (const auto& pair : *proxy_hosts_) { | 1889 for (const auto& pair : *proxy_hosts_) { |
(...skipping 14 matching lines...) Expand all Loading... |
1899 | 1904 |
1900 if (render_view_host->IsRenderViewLive()) | 1905 if (render_view_host->IsRenderViewLive()) |
1901 return; | 1906 return; |
1902 | 1907 |
1903 // If the proxy in |instance| doesn't exist, this RenderView is not swapped | 1908 // If the proxy in |instance| doesn't exist, this RenderView is not swapped |
1904 // out and shouldn't be reinitialized here. | 1909 // out and shouldn't be reinitialized here. |
1905 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); | 1910 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); |
1906 if (!proxy) | 1911 if (!proxy) |
1907 return; | 1912 return; |
1908 | 1913 |
1909 InitRenderView(render_view_host, proxy->GetRoutingID(), false); | 1914 InitRenderView(render_view_host, proxy->GetRoutingID()); |
1910 proxy->set_render_frame_proxy_created(true); | 1915 proxy->set_render_frame_proxy_created(true); |
1911 } | 1916 } |
1912 | 1917 |
1913 void RenderFrameHostManager::CreateOuterDelegateProxy( | 1918 void RenderFrameHostManager::CreateOuterDelegateProxy( |
1914 SiteInstance* outer_contents_site_instance, | 1919 SiteInstance* outer_contents_site_instance, |
1915 RenderFrameHostImpl* render_frame_host) { | 1920 RenderFrameHostImpl* render_frame_host) { |
1916 CHECK(BrowserPluginGuestMode::UseCrossProcessFramesForGuests()); | 1921 CHECK(BrowserPluginGuestMode::UseCrossProcessFramesForGuests()); |
1917 RenderFrameProxyHost* proxy = new RenderFrameProxyHost( | 1922 RenderFrameProxyHost* proxy = new RenderFrameProxyHost( |
1918 outer_contents_site_instance, nullptr, frame_tree_node_); | 1923 outer_contents_site_instance, nullptr, frame_tree_node_); |
1919 proxy_hosts_->Add(outer_contents_site_instance->GetId(), | 1924 proxy_hosts_->Add(outer_contents_site_instance->GetId(), |
(...skipping 14 matching lines...) Expand all Loading... |
1934 } | 1939 } |
1935 | 1940 |
1936 void RenderFrameHostManager::SetRWHViewForInnerContents( | 1941 void RenderFrameHostManager::SetRWHViewForInnerContents( |
1937 RenderWidgetHostView* child_rwhv) { | 1942 RenderWidgetHostView* child_rwhv) { |
1938 DCHECK(ForInnerDelegate() && frame_tree_node_->IsMainFrame()); | 1943 DCHECK(ForInnerDelegate() && frame_tree_node_->IsMainFrame()); |
1939 GetProxyToOuterDelegate()->SetChildRWHView(child_rwhv); | 1944 GetProxyToOuterDelegate()->SetChildRWHView(child_rwhv); |
1940 } | 1945 } |
1941 | 1946 |
1942 bool RenderFrameHostManager::InitRenderView( | 1947 bool RenderFrameHostManager::InitRenderView( |
1943 RenderViewHostImpl* render_view_host, | 1948 RenderViewHostImpl* render_view_host, |
1944 int proxy_routing_id, | 1949 int proxy_routing_id) { |
1945 bool for_main_frame_navigation) { | |
1946 // Ensure the renderer process is initialized before creating the | 1950 // Ensure the renderer process is initialized before creating the |
1947 // RenderView. | 1951 // RenderView. |
1948 if (!render_view_host->GetProcess()->Init()) | 1952 if (!render_view_host->GetProcess()->Init()) |
1949 return false; | 1953 return false; |
1950 | 1954 |
1951 // We may have initialized this RenderViewHost for another RenderFrameHost. | 1955 // We may have initialized this RenderViewHost for another RenderFrameHost. |
1952 if (render_view_host->IsRenderViewLive()) | 1956 if (render_view_host->IsRenderViewLive()) |
1953 return true; | 1957 return true; |
1954 | 1958 |
1955 // If the ongoing navigation is to a WebUI and the RenderView is not in a | 1959 // If the ongoing navigation is to a WebUI and the RenderView is not in a |
(...skipping 16 matching lines...) Expand all Loading... |
1972 CHECK(!ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( | 1976 CHECK(!ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( |
1973 render_view_host->GetProcess()->GetID())); | 1977 render_view_host->GetProcess()->GetID())); |
1974 } | 1978 } |
1975 } | 1979 } |
1976 | 1980 |
1977 int opener_frame_routing_id = | 1981 int opener_frame_routing_id = |
1978 GetOpenerRoutingID(render_view_host->GetSiteInstance()); | 1982 GetOpenerRoutingID(render_view_host->GetSiteInstance()); |
1979 | 1983 |
1980 return delegate_->CreateRenderViewForRenderManager( | 1984 return delegate_->CreateRenderViewForRenderManager( |
1981 render_view_host, opener_frame_routing_id, proxy_routing_id, | 1985 render_view_host, opener_frame_routing_id, proxy_routing_id, |
1982 frame_tree_node_->current_replication_state(), for_main_frame_navigation); | 1986 frame_tree_node_->current_replication_state()); |
1983 } | 1987 } |
1984 | 1988 |
1985 bool RenderFrameHostManager::InitRenderFrame( | 1989 bool RenderFrameHostManager::InitRenderFrame( |
1986 RenderFrameHostImpl* render_frame_host) { | 1990 RenderFrameHostImpl* render_frame_host) { |
1987 if (render_frame_host->IsRenderFrameLive()) | 1991 if (render_frame_host->IsRenderFrameLive()) |
1988 return true; | 1992 return true; |
1989 | 1993 |
1990 SiteInstance* site_instance = render_frame_host->GetSiteInstance(); | 1994 SiteInstance* site_instance = render_frame_host->GetSiteInstance(); |
1991 | 1995 |
1992 int opener_routing_id = MSG_ROUTING_NONE; | 1996 int opener_routing_id = MSG_ROUTING_NONE; |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2288 | 2292 |
2289 // New SiteInstance: create a pending RFH to navigate. | 2293 // New SiteInstance: create a pending RFH to navigate. |
2290 | 2294 |
2291 // This will possibly create (set to nullptr) a Web UI object for the | 2295 // This will possibly create (set to nullptr) a Web UI object for the |
2292 // pending page. We'll use this later to give the page special access. This | 2296 // pending page. We'll use this later to give the page special access. This |
2293 // must happen before the new renderer is created below so it will get | 2297 // must happen before the new renderer is created below so it will get |
2294 // bindings. It must also happen after the above conditional call to | 2298 // bindings. It must also happen after the above conditional call to |
2295 // CancelPending(), otherwise CancelPending may clear the pending_web_ui_ | 2299 // CancelPending(), otherwise CancelPending may clear the pending_web_ui_ |
2296 // and the page will not have its bindings set appropriately. | 2300 // and the page will not have its bindings set appropriately. |
2297 SetPendingWebUI(dest_url, bindings); | 2301 SetPendingWebUI(dest_url, bindings); |
2298 CreatePendingRenderFrameHost(current_instance, new_instance.get(), | 2302 CreatePendingRenderFrameHost(current_instance, new_instance.get()); |
2299 frame_tree_node_->IsMainFrame()); | |
2300 if (!pending_render_frame_host_) | 2303 if (!pending_render_frame_host_) |
2301 return nullptr; | 2304 return nullptr; |
2302 | 2305 |
2303 // Check if our current RFH is live before we set up a transition. | 2306 // Check if our current RFH is live before we set up a transition. |
2304 if (!render_frame_host_->IsRenderFrameLive()) { | 2307 if (!render_frame_host_->IsRenderFrameLive()) { |
2305 // The current RFH is not live. There's no reason to sit around with a | 2308 // The current RFH is not live. There's no reason to sit around with a |
2306 // sad tab or a newly created RFH while we wait for the pending RFH to | 2309 // sad tab or a newly created RFH while we wait for the pending RFH to |
2307 // navigate. Just switch to the pending RFH now and go back to normal. | 2310 // navigate. Just switch to the pending RFH now and go back to normal. |
2308 // (Note that we don't care about on{before}unload handlers if the current | 2311 // (Note that we don't care about on{before}unload handlers if the current |
2309 // RFH isn't live.) | 2312 // RFH isn't live.) |
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2569 (rvh == pending_render_view_host()); | 2572 (rvh == pending_render_view_host()); |
2570 if (rvh && rvh->IsRenderViewLive() && !need_proxy_for_pending_rvh) | 2573 if (rvh && rvh->IsRenderViewLive() && !need_proxy_for_pending_rvh) |
2571 return; | 2574 return; |
2572 | 2575 |
2573 if (rvh && !rvh->IsRenderViewLive()) { | 2576 if (rvh && !rvh->IsRenderViewLive()) { |
2574 EnsureRenderViewInitialized(rvh, instance); | 2577 EnsureRenderViewInitialized(rvh, instance); |
2575 } else { | 2578 } else { |
2576 // Create a swapped out RenderView in the given SiteInstance if none | 2579 // Create a swapped out RenderView in the given SiteInstance if none |
2577 // exists. Since an opener can point to a subframe, do this on the root | 2580 // exists. Since an opener can point to a subframe, do this on the root |
2578 // frame of the current opener's frame tree. | 2581 // frame of the current opener's frame tree. |
2579 frame_tree->root()->render_manager()-> | 2582 frame_tree->root()->render_manager()->CreateRenderFrame( |
2580 CreateRenderFrame(instance, nullptr, | 2583 instance, nullptr, CREATE_RF_SWAPPED_OUT | CREATE_RF_HIDDEN, nullptr); |
2581 CREATE_RF_FOR_MAIN_FRAME_NAVIGATION | | |
2582 CREATE_RF_SWAPPED_OUT | CREATE_RF_HIDDEN, | |
2583 nullptr); | |
2584 } | 2584 } |
2585 } | 2585 } |
2586 } | 2586 } |
2587 | 2587 |
2588 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) { | 2588 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) { |
2589 if (!frame_tree_node_->opener()) | 2589 if (!frame_tree_node_->opener()) |
2590 return MSG_ROUTING_NONE; | 2590 return MSG_ROUTING_NONE; |
2591 | 2591 |
2592 return frame_tree_node_->opener() | 2592 return frame_tree_node_->opener() |
2593 ->render_manager() | 2593 ->render_manager() |
2594 ->GetRoutingIdForSiteInstance(instance); | 2594 ->GetRoutingIdForSiteInstance(instance); |
2595 } | 2595 } |
2596 | 2596 |
2597 } // namespace content | 2597 } // namespace content |
OLD | NEW |