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 <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 // Instruct the destination render frame host to set up a Mojo connection | 270 // Instruct the destination render frame host to set up a Mojo connection |
271 // with the new render frame if necessary. Note that this call needs to | 271 // with the new render frame if necessary. Note that this call needs to |
272 // occur before initializing the RenderView; the flow of creating the | 272 // occur before initializing the RenderView; the flow of creating the |
273 // RenderView can cause browser-side code to execute that expects the this | 273 // RenderView can cause browser-side code to execute that expects the this |
274 // RFH's ServiceRegistry to be initialized (e.g., if the site is a WebUI | 274 // RFH's ServiceRegistry to be initialized (e.g., if the site is a WebUI |
275 // site that is handled via Mojo, then Mojo WebUI code in //chrome will | 275 // site that is handled via Mojo, then Mojo WebUI code in //chrome will |
276 // add a service to this RFH's ServiceRegistry). | 276 // add a service to this RFH's ServiceRegistry). |
277 dest_render_frame_host->SetUpMojoIfNeeded(); | 277 dest_render_frame_host->SetUpMojoIfNeeded(); |
278 | 278 |
279 // Recreate the opener chain. | 279 // Recreate the opener chain. |
280 int opener_route_id = | 280 CreateOpenerProxiesIfNeeded(dest_render_frame_host->GetSiteInstance()); |
281 CreateOpenerProxiesIfNeeded(dest_render_frame_host->GetSiteInstance()); | |
282 if (!InitRenderView(dest_render_frame_host->render_view_host(), | 281 if (!InitRenderView(dest_render_frame_host->render_view_host(), |
283 opener_route_id, | |
284 MSG_ROUTING_NONE, | 282 MSG_ROUTING_NONE, |
285 frame_tree_node_->IsMainFrame())) | 283 frame_tree_node_->IsMainFrame())) |
286 return NULL; | 284 return NULL; |
287 | 285 |
288 // Now that we've created a new renderer, be sure to hide it if it isn't | 286 // Now that we've created a new renderer, be sure to hide it if it isn't |
289 // our primary one. Otherwise, we might crash if we try to call Show() | 287 // our primary one. Otherwise, we might crash if we try to call Show() |
290 // on it later. | 288 // on it later. |
291 if (dest_render_frame_host != render_frame_host_) { | 289 if (dest_render_frame_host != render_frame_host_) { |
292 if (dest_render_frame_host->GetView()) | 290 if (dest_render_frame_host->GetView()) |
293 dest_render_frame_host->GetView()->Hide(); | 291 dest_render_frame_host->GetView()->Hide(); |
(...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
856 } | 854 } |
857 } | 855 } |
858 DCHECK(navigation_rfh && | 856 DCHECK(navigation_rfh && |
859 (navigation_rfh == render_frame_host_.get() || | 857 (navigation_rfh == render_frame_host_.get() || |
860 navigation_rfh == speculative_render_frame_host_.get())); | 858 navigation_rfh == speculative_render_frame_host_.get())); |
861 | 859 |
862 // If the RenderFrame that needs to navigate is not live (its process was just | 860 // If the RenderFrame that needs to navigate is not live (its process was just |
863 // created or has crashed), initialize it. | 861 // created or has crashed), initialize it. |
864 if (!navigation_rfh->IsRenderFrameLive()) { | 862 if (!navigation_rfh->IsRenderFrameLive()) { |
865 // Recreate the opener chain. | 863 // Recreate the opener chain. |
866 int opener_route_id = | 864 CreateOpenerProxiesIfNeeded(navigation_rfh->GetSiteInstance()); |
867 CreateOpenerProxiesIfNeeded(navigation_rfh->GetSiteInstance()); | 865 if (!InitRenderView(navigation_rfh->render_view_host(), MSG_ROUTING_NONE, |
868 if (!InitRenderView(navigation_rfh->render_view_host(), opener_route_id, | 866 frame_tree_node_->IsMainFrame())) { |
869 MSG_ROUTING_NONE, frame_tree_node_->IsMainFrame())) { | |
870 return nullptr; | 867 return nullptr; |
871 } | 868 } |
872 | 869 |
873 if (navigation_rfh == render_frame_host_) { | 870 if (navigation_rfh == render_frame_host_) { |
874 // TODO(nasko): This is a very ugly hack. The Chrome extensions process | 871 // TODO(nasko): This is a very ugly hack. The Chrome extensions process |
875 // manager still uses NotificationService and expects to see a | 872 // manager still uses NotificationService and expects to see a |
876 // RenderViewHost changed notification after WebContents and | 873 // RenderViewHost changed notification after WebContents and |
877 // RenderFrameHostManager are completely initialized. This should be | 874 // RenderFrameHostManager are completely initialized. This should be |
878 // removed once the process manager moves away from NotificationService. | 875 // removed once the process manager moves away from NotificationService. |
879 // See https://crbug.com/462682. | 876 // See https://crbug.com/462682. |
(...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1392 if (pending_render_frame_host_) | 1389 if (pending_render_frame_host_) |
1393 CancelPending(); | 1390 CancelPending(); |
1394 | 1391 |
1395 // The process for the new SiteInstance may (if we're sharing a process with | 1392 // The process for the new SiteInstance may (if we're sharing a process with |
1396 // another host that already initialized it) or may not (we have our own | 1393 // another host that already initialized it) or may not (we have our own |
1397 // process or the existing process crashed) have been initialized. Calling | 1394 // process or the existing process crashed) have been initialized. Calling |
1398 // Init multiple times will be ignored, so this is safe. | 1395 // Init multiple times will be ignored, so this is safe. |
1399 if (!new_instance->GetProcess()->Init()) | 1396 if (!new_instance->GetProcess()->Init()) |
1400 return; | 1397 return; |
1401 | 1398 |
1402 int opener_route_id = CreateProxiesForNewRenderFrameHost( | 1399 CreateProxiesForNewRenderFrameHost(old_instance, new_instance, |
1403 old_instance, new_instance, &create_render_frame_flags); | 1400 &create_render_frame_flags); |
1404 | 1401 |
1405 // Create a non-swapped-out RFH with the given opener. | 1402 // Create a non-swapped-out RFH with the given opener. |
1406 pending_render_frame_host_ = | 1403 pending_render_frame_host_ = CreateRenderFrame( |
1407 CreateRenderFrame(new_instance, pending_web_ui(), opener_route_id, | 1404 new_instance, pending_web_ui(), create_render_frame_flags, nullptr); |
1408 create_render_frame_flags, nullptr); | |
1409 } | 1405 } |
1410 | 1406 |
1411 int RenderFrameHostManager::CreateProxiesForNewRenderFrameHost( | 1407 void RenderFrameHostManager::CreateProxiesForNewRenderFrameHost( |
1412 SiteInstance* old_instance, | 1408 SiteInstance* old_instance, |
1413 SiteInstance* new_instance, | 1409 SiteInstance* new_instance, |
1414 int* create_render_frame_flags) { | 1410 int* create_render_frame_flags) { |
1415 int opener_route_id = MSG_ROUTING_NONE; | |
1416 // Only create opener proxies if they are in the same BrowsingInstance. | 1411 // Only create opener proxies if they are in the same BrowsingInstance. |
1417 if (new_instance->IsRelatedSiteInstance(old_instance)) | 1412 if (new_instance->IsRelatedSiteInstance(old_instance)) |
1418 opener_route_id = CreateOpenerProxiesIfNeeded(new_instance); | 1413 CreateOpenerProxiesIfNeeded(new_instance); |
1419 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 1414 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
1420 switches::kSitePerProcess)) { | 1415 switches::kSitePerProcess)) { |
1421 // Ensure that the frame tree has RenderFrameProxyHosts for the new | 1416 // Ensure that the frame tree has RenderFrameProxyHosts for the new |
1422 // SiteInstance in all nodes except the current one. We do this for all | 1417 // SiteInstance in all nodes except the current one. We do this for all |
1423 // frames in the tree, whether they are in the same BrowsingInstance or not. | 1418 // frames in the tree, whether they are in the same BrowsingInstance or not. |
1424 // We will still check whether two frames are in the same BrowsingInstance | 1419 // We will still check whether two frames are in the same BrowsingInstance |
1425 // before we allow them to interact (e.g., postMessage). | 1420 // before we allow them to interact (e.g., postMessage). |
1426 frame_tree_node_->frame_tree()->CreateProxiesForSiteInstance( | 1421 frame_tree_node_->frame_tree()->CreateProxiesForSiteInstance( |
1427 frame_tree_node_, new_instance); | 1422 frame_tree_node_, new_instance); |
1428 // RenderFrames in different processes from their parent RenderFrames | 1423 // RenderFrames in different processes from their parent RenderFrames |
1429 // in the frame tree require RenderWidgets for rendering and processing | 1424 // in the frame tree require RenderWidgets for rendering and processing |
1430 // input events. | 1425 // input events. |
1431 if (frame_tree_node_->parent() && | 1426 if (frame_tree_node_->parent() && |
1432 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() != | 1427 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() != |
1433 new_instance) | 1428 new_instance) |
1434 *create_render_frame_flags |= CREATE_RF_NEEDS_RENDER_WIDGET_HOST; | 1429 *create_render_frame_flags |= CREATE_RF_NEEDS_RENDER_WIDGET_HOST; |
1435 } | 1430 } |
1436 return opener_route_id; | |
1437 } | 1431 } |
1438 | 1432 |
1439 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( | 1433 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( |
1440 SiteInstance* site_instance, | 1434 SiteInstance* site_instance, |
1441 int view_routing_id, | 1435 int view_routing_id, |
1442 int frame_routing_id, | 1436 int frame_routing_id, |
1443 int flags) { | 1437 int flags) { |
1444 if (frame_routing_id == MSG_ROUTING_NONE) | 1438 if (frame_routing_id == MSG_ROUTING_NONE) |
1445 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID(); | 1439 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID(); |
1446 | 1440 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1484 speculative_web_ui_ = CreateWebUI(url, bindings); | 1478 speculative_web_ui_ = CreateWebUI(url, bindings); |
1485 | 1479 |
1486 // The process for the new SiteInstance may (if we're sharing a process with | 1480 // The process for the new SiteInstance may (if we're sharing a process with |
1487 // another host that already initialized it) or may not (we have our own | 1481 // another host that already initialized it) or may not (we have our own |
1488 // process or the existing process crashed) have been initialized. Calling | 1482 // process or the existing process crashed) have been initialized. Calling |
1489 // Init multiple times will be ignored, so this is safe. | 1483 // Init multiple times will be ignored, so this is safe. |
1490 if (!new_instance->GetProcess()->Init()) | 1484 if (!new_instance->GetProcess()->Init()) |
1491 return false; | 1485 return false; |
1492 | 1486 |
1493 int create_render_frame_flags = 0; | 1487 int create_render_frame_flags = 0; |
1494 int opener_route_id = CreateProxiesForNewRenderFrameHost( | 1488 CreateProxiesForNewRenderFrameHost(old_instance, new_instance, |
1495 old_instance, new_instance, &create_render_frame_flags); | 1489 &create_render_frame_flags); |
1496 | 1490 |
1497 if (frame_tree_node_->IsMainFrame()) | 1491 if (frame_tree_node_->IsMainFrame()) |
1498 create_render_frame_flags |= CREATE_RF_FOR_MAIN_FRAME_NAVIGATION; | 1492 create_render_frame_flags |= CREATE_RF_FOR_MAIN_FRAME_NAVIGATION; |
1499 if (delegate_->IsHidden()) | 1493 if (delegate_->IsHidden()) |
1500 create_render_frame_flags |= CREATE_RF_HIDDEN; | 1494 create_render_frame_flags |= CREATE_RF_HIDDEN; |
1501 speculative_render_frame_host_ = | 1495 speculative_render_frame_host_ = |
1502 CreateRenderFrame(new_instance, speculative_web_ui_.get(), | 1496 CreateRenderFrame(new_instance, speculative_web_ui_.get(), |
1503 opener_route_id, create_render_frame_flags, nullptr); | 1497 create_render_frame_flags, nullptr); |
1504 | 1498 |
1505 if (!speculative_render_frame_host_) { | 1499 if (!speculative_render_frame_host_) { |
1506 speculative_web_ui_.reset(); | 1500 speculative_web_ui_.reset(); |
1507 return false; | 1501 return false; |
1508 } | 1502 } |
1509 return true; | 1503 return true; |
1510 } | 1504 } |
1511 | 1505 |
1512 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame( | 1506 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame( |
1513 SiteInstance* instance, | 1507 SiteInstance* instance, |
1514 WebUIImpl* web_ui, | 1508 WebUIImpl* web_ui, |
1515 int opener_route_id, | |
1516 int flags, | 1509 int flags, |
1517 int* view_routing_id_ptr) { | 1510 int* view_routing_id_ptr) { |
1518 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); | 1511 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); |
1519 bool swapped_out_forbidden = IsSwappedOutStateForbidden(); | 1512 bool swapped_out_forbidden = IsSwappedOutStateForbidden(); |
1520 bool is_site_per_process = base::CommandLine::ForCurrentProcess()->HasSwitch( | 1513 bool is_site_per_process = base::CommandLine::ForCurrentProcess()->HasSwitch( |
1521 switches::kSitePerProcess); | 1514 switches::kSitePerProcess); |
1522 | 1515 |
1523 CHECK(instance); | 1516 CHECK(instance); |
1524 CHECK_IMPLIES(swapped_out_forbidden, !swapped_out); | 1517 CHECK_IMPLIES(swapped_out_forbidden, !swapped_out); |
1525 CHECK_IMPLIES(!is_site_per_process, frame_tree_node_->IsMainFrame()); | 1518 CHECK_IMPLIES(!is_site_per_process, frame_tree_node_->IsMainFrame()); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1567 new_render_frame_host->GetProcess()->AddPendingView(); | 1560 new_render_frame_host->GetProcess()->AddPendingView(); |
1568 } else { | 1561 } else { |
1569 proxy = new RenderFrameProxyHost( | 1562 proxy = new RenderFrameProxyHost( |
1570 new_render_frame_host->GetSiteInstance(), | 1563 new_render_frame_host->GetSiteInstance(), |
1571 new_render_frame_host->render_view_host(), frame_tree_node_); | 1564 new_render_frame_host->render_view_host(), frame_tree_node_); |
1572 proxy_hosts_[instance->GetId()] = proxy; | 1565 proxy_hosts_[instance->GetId()] = proxy; |
1573 proxy_routing_id = proxy->GetRoutingID(); | 1566 proxy_routing_id = proxy->GetRoutingID(); |
1574 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); | 1567 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); |
1575 } | 1568 } |
1576 | 1569 |
1577 success = | 1570 success = InitRenderView(render_view_host, proxy_routing_id, |
1578 InitRenderView(render_view_host, opener_route_id, proxy_routing_id, | 1571 !!(flags & CREATE_RF_FOR_MAIN_FRAME_NAVIGATION)); |
1579 !!(flags & CREATE_RF_FOR_MAIN_FRAME_NAVIGATION)); | |
1580 if (success) { | 1572 if (success) { |
1581 // Remember that InitRenderView also created the RenderFrameProxy. | 1573 // Remember that InitRenderView also created the RenderFrameProxy. |
1582 if (swapped_out) | 1574 if (swapped_out) |
1583 proxy->set_render_frame_proxy_created(true); | 1575 proxy->set_render_frame_proxy_created(true); |
1584 if (frame_tree_node_->IsMainFrame()) { | 1576 if (frame_tree_node_->IsMainFrame()) { |
1585 // Don't show the main frame's view until we get a DidNavigate from it. | 1577 // Don't show the main frame's view until we get a DidNavigate from it. |
1586 // Only the RenderViewHost for the top-level RenderFrameHost has a | 1578 // Only the RenderViewHost for the top-level RenderFrameHost has a |
1587 // RenderWidgetHostView; RenderWidgetHosts for out-of-process iframes | 1579 // RenderWidgetHostView; RenderWidgetHosts for out-of-process iframes |
1588 // will be created later and hidden. | 1580 // will be created later and hidden. |
1589 if (render_view_host->GetView()) | 1581 if (render_view_host->GetView()) |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1654 return proxy->GetRoutingID(); | 1646 return proxy->GetRoutingID(); |
1655 | 1647 |
1656 if (!proxy) { | 1648 if (!proxy) { |
1657 proxy = new RenderFrameProxyHost( | 1649 proxy = new RenderFrameProxyHost( |
1658 instance, render_view_host, frame_tree_node_); | 1650 instance, render_view_host, frame_tree_node_); |
1659 proxy_hosts_[instance->GetId()] = proxy; | 1651 proxy_hosts_[instance->GetId()] = proxy; |
1660 } | 1652 } |
1661 | 1653 |
1662 if (RenderFrameHostManager::IsSwappedOutStateForbidden() && | 1654 if (RenderFrameHostManager::IsSwappedOutStateForbidden() && |
1663 frame_tree_node_->IsMainFrame()) { | 1655 frame_tree_node_->IsMainFrame()) { |
1664 InitRenderView( | 1656 InitRenderView(render_view_host, proxy->GetRoutingID(), true); |
1665 render_view_host, MSG_ROUTING_NONE, proxy->GetRoutingID(), true); | |
1666 proxy->set_render_frame_proxy_created(true); | 1657 proxy->set_render_frame_proxy_created(true); |
1667 } else { | 1658 } else { |
1668 proxy->InitRenderFrameProxy(); | 1659 proxy->InitRenderFrameProxy(); |
1669 } | 1660 } |
1670 | 1661 |
1671 return proxy->GetRoutingID(); | 1662 return proxy->GetRoutingID(); |
1672 } | 1663 } |
1673 | 1664 |
1674 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) { | 1665 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) { |
1675 for (const auto& pair : proxy_hosts_) { | 1666 for (const auto& pair : proxy_hosts_) { |
1676 child->render_manager()->CreateRenderFrameProxy( | 1667 child->render_manager()->CreateRenderFrameProxy( |
1677 pair.second->GetSiteInstance()); | 1668 pair.second->GetSiteInstance()); |
1678 } | 1669 } |
1679 } | 1670 } |
1680 | 1671 |
1681 void RenderFrameHostManager::EnsureRenderViewInitialized( | 1672 void RenderFrameHostManager::EnsureRenderViewInitialized( |
1682 RenderViewHostImpl* render_view_host, | 1673 RenderViewHostImpl* render_view_host, |
1683 SiteInstance* instance) { | 1674 SiteInstance* instance) { |
1684 DCHECK(frame_tree_node_->IsMainFrame()); | 1675 DCHECK(frame_tree_node_->IsMainFrame()); |
1685 | 1676 |
1686 if (render_view_host->IsRenderViewLive()) | 1677 if (render_view_host->IsRenderViewLive()) |
1687 return; | 1678 return; |
1688 | 1679 |
1689 // Recreate the opener chain. | 1680 // Recreate the opener chain. |
1690 int opener_route_id = CreateOpenerProxiesIfNeeded(instance); | 1681 CreateOpenerProxiesIfNeeded(instance); |
1691 | 1682 |
1692 // If the proxy in |instance| doesn't exist, this RenderView is not swapped | 1683 // If the proxy in |instance| doesn't exist, this RenderView is not swapped |
1693 // out and shouldn't be reinitialized here. | 1684 // out and shouldn't be reinitialized here. |
1694 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); | 1685 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); |
1695 if (!proxy) | 1686 if (!proxy) |
1696 return; | 1687 return; |
1697 | 1688 |
1698 InitRenderView(render_view_host, opener_route_id, proxy->GetRoutingID(), | 1689 InitRenderView(render_view_host, proxy->GetRoutingID(), false); |
1699 false); | |
1700 proxy->set_render_frame_proxy_created(true); | 1690 proxy->set_render_frame_proxy_created(true); |
1701 } | 1691 } |
1702 | 1692 |
1703 void RenderFrameHostManager::CreateOuterDelegateProxy( | 1693 void RenderFrameHostManager::CreateOuterDelegateProxy( |
1704 SiteInstance* outer_contents_site_instance, | 1694 SiteInstance* outer_contents_site_instance, |
1705 RenderFrameHostImpl* render_frame_host) { | 1695 RenderFrameHostImpl* render_frame_host) { |
1706 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( | 1696 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
1707 switches::kSitePerProcess)); | 1697 switches::kSitePerProcess)); |
1708 RenderFrameProxyHost* proxy = new RenderFrameProxyHost( | 1698 RenderFrameProxyHost* proxy = new RenderFrameProxyHost( |
1709 outer_contents_site_instance, nullptr, frame_tree_node_); | 1699 outer_contents_site_instance, nullptr, frame_tree_node_); |
(...skipping 14 matching lines...) Expand all Loading... |
1724 } | 1714 } |
1725 | 1715 |
1726 void RenderFrameHostManager::SetRWHViewForInnerContents( | 1716 void RenderFrameHostManager::SetRWHViewForInnerContents( |
1727 RenderWidgetHostView* child_rwhv) { | 1717 RenderWidgetHostView* child_rwhv) { |
1728 DCHECK(ForInnerDelegate()); | 1718 DCHECK(ForInnerDelegate()); |
1729 GetProxyToOuterDelegate()->SetChildRWHView(child_rwhv); | 1719 GetProxyToOuterDelegate()->SetChildRWHView(child_rwhv); |
1730 } | 1720 } |
1731 | 1721 |
1732 bool RenderFrameHostManager::InitRenderView( | 1722 bool RenderFrameHostManager::InitRenderView( |
1733 RenderViewHostImpl* render_view_host, | 1723 RenderViewHostImpl* render_view_host, |
1734 int opener_route_id, | |
1735 int proxy_routing_id, | 1724 int proxy_routing_id, |
1736 bool for_main_frame_navigation) { | 1725 bool for_main_frame_navigation) { |
1737 // Ensure the renderer process is initialized before creating the | 1726 // Ensure the renderer process is initialized before creating the |
1738 // RenderView. | 1727 // RenderView. |
1739 if (!render_view_host->GetProcess()->Init()) | 1728 if (!render_view_host->GetProcess()->Init()) |
1740 return false; | 1729 return false; |
1741 | 1730 |
1742 // We may have initialized this RenderViewHost for another RenderFrameHost. | 1731 // We may have initialized this RenderViewHost for another RenderFrameHost. |
1743 if (render_view_host->IsRenderViewLive()) | 1732 if (render_view_host->IsRenderViewLive()) |
1744 return true; | 1733 return true; |
(...skipping 13 matching lines...) Expand all Loading... |
1758 render_view_host->AllowBindings(dest_web_ui->GetBindings()); | 1747 render_view_host->AllowBindings(dest_web_ui->GetBindings()); |
1759 } else { | 1748 } else { |
1760 // Ensure that we don't create an unprivileged RenderView in a WebUI-enabled | 1749 // Ensure that we don't create an unprivileged RenderView in a WebUI-enabled |
1761 // process unless it's swapped out. | 1750 // process unless it's swapped out. |
1762 if (render_view_host->is_active()) { | 1751 if (render_view_host->is_active()) { |
1763 CHECK(!ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( | 1752 CHECK(!ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( |
1764 render_view_host->GetProcess()->GetID())); | 1753 render_view_host->GetProcess()->GetID())); |
1765 } | 1754 } |
1766 } | 1755 } |
1767 | 1756 |
| 1757 int opener_frame_routing_id = |
| 1758 GetOpenerRoutingID(render_view_host->GetSiteInstance()); |
| 1759 |
1768 return delegate_->CreateRenderViewForRenderManager( | 1760 return delegate_->CreateRenderViewForRenderManager( |
1769 render_view_host, | 1761 render_view_host, opener_frame_routing_id, proxy_routing_id, |
1770 opener_route_id, | 1762 frame_tree_node_->current_replication_state(), for_main_frame_navigation); |
1771 proxy_routing_id, | |
1772 frame_tree_node_->current_replication_state(), | |
1773 for_main_frame_navigation); | |
1774 } | 1763 } |
1775 | 1764 |
1776 bool RenderFrameHostManager::InitRenderFrame( | 1765 bool RenderFrameHostManager::InitRenderFrame( |
1777 RenderFrameHostImpl* render_frame_host) { | 1766 RenderFrameHostImpl* render_frame_host) { |
1778 if (render_frame_host->IsRenderFrameLive()) | 1767 if (render_frame_host->IsRenderFrameLive()) |
1779 return true; | 1768 return true; |
1780 | 1769 |
1781 int parent_routing_id = MSG_ROUTING_NONE; | 1770 int parent_routing_id = MSG_ROUTING_NONE; |
1782 int previous_sibling_routing_id = MSG_ROUTING_NONE; | 1771 int previous_sibling_routing_id = MSG_ROUTING_NONE; |
1783 int proxy_routing_id = MSG_ROUTING_NONE; | 1772 int proxy_routing_id = MSG_ROUTING_NONE; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1819 return delegate_->CreateRenderFrameForRenderManager( | 1808 return delegate_->CreateRenderFrameForRenderManager( |
1820 render_frame_host, parent_routing_id, previous_sibling_routing_id, | 1809 render_frame_host, parent_routing_id, previous_sibling_routing_id, |
1821 proxy_routing_id); | 1810 proxy_routing_id); |
1822 } | 1811 } |
1823 | 1812 |
1824 int RenderFrameHostManager::GetRoutingIdForSiteInstance( | 1813 int RenderFrameHostManager::GetRoutingIdForSiteInstance( |
1825 SiteInstance* site_instance) { | 1814 SiteInstance* site_instance) { |
1826 if (render_frame_host_->GetSiteInstance() == site_instance) | 1815 if (render_frame_host_->GetSiteInstance() == site_instance) |
1827 return render_frame_host_->GetRoutingID(); | 1816 return render_frame_host_->GetRoutingID(); |
1828 | 1817 |
1829 RenderFrameProxyHostMap::iterator iter = | 1818 // If there is a matching pending RFH, only return it if swapped out is |
1830 proxy_hosts_.find(site_instance->GetId()); | 1819 // allowed, since otherwise there should be a proxy that should be used |
1831 if (iter != proxy_hosts_.end()) | 1820 // instead. |
1832 return iter->second->GetRoutingID(); | 1821 if (pending_render_frame_host_ && |
| 1822 pending_render_frame_host_->GetSiteInstance() == site_instance && |
| 1823 !RenderFrameHostManager::IsSwappedOutStateForbidden()) |
| 1824 return pending_render_frame_host_->GetRoutingID(); |
| 1825 |
| 1826 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(site_instance); |
| 1827 if (proxy) |
| 1828 return proxy->GetRoutingID(); |
1833 | 1829 |
1834 return MSG_ROUTING_NONE; | 1830 return MSG_ROUTING_NONE; |
1835 } | 1831 } |
1836 | 1832 |
1837 void RenderFrameHostManager::CommitPending() { | 1833 void RenderFrameHostManager::CommitPending() { |
1838 TRACE_EVENT1("navigation", "RenderFrameHostManager::CommitPending", | 1834 TRACE_EVENT1("navigation", "RenderFrameHostManager::CommitPending", |
1839 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); | 1835 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); |
1840 bool browser_side_navigation = | 1836 bool browser_side_navigation = |
1841 base::CommandLine::ForCurrentProcess()->HasSwitch( | 1837 base::CommandLine::ForCurrentProcess()->HasSwitch( |
1842 switches::kEnableBrowserSideNavigation); | 1838 switches::kEnableBrowserSideNavigation); |
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2265 | 2261 |
2266 void RenderFrameHostManager::DeleteRenderFrameProxyHost( | 2262 void RenderFrameHostManager::DeleteRenderFrameProxyHost( |
2267 SiteInstance* instance) { | 2263 SiteInstance* instance) { |
2268 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); | 2264 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); |
2269 if (iter != proxy_hosts_.end()) { | 2265 if (iter != proxy_hosts_.end()) { |
2270 delete iter->second; | 2266 delete iter->second; |
2271 proxy_hosts_.erase(iter); | 2267 proxy_hosts_.erase(iter); |
2272 } | 2268 } |
2273 } | 2269 } |
2274 | 2270 |
2275 int RenderFrameHostManager::CreateOpenerProxiesIfNeeded( | 2271 void RenderFrameHostManager::CreateOpenerProxiesIfNeeded( |
2276 SiteInstance* instance) { | 2272 SiteInstance* instance) { |
2277 FrameTreeNode* opener = frame_tree_node_->opener(); | 2273 FrameTreeNode* opener = frame_tree_node_->opener(); |
2278 if (!opener) | 2274 if (!opener) |
2279 return MSG_ROUTING_NONE; | 2275 return; |
2280 | 2276 |
2281 // Create proxies for the opener chain. | 2277 // Create proxies for the opener chain. |
2282 return opener->render_manager()->CreateOpenerProxies(instance); | 2278 opener->render_manager()->CreateOpenerProxies(instance); |
2283 } | 2279 } |
2284 | 2280 |
2285 int RenderFrameHostManager::CreateOpenerProxies(SiteInstance* instance) { | 2281 void RenderFrameHostManager::CreateOpenerProxies(SiteInstance* instance) { |
2286 int opener_route_id = MSG_ROUTING_NONE; | |
2287 | |
2288 // If this tab has an opener, recursively create proxies for the nodes on its | 2282 // If this tab has an opener, recursively create proxies for the nodes on its |
2289 // frame tree. | 2283 // frame tree. |
2290 // TODO(alexmos): Once we allow frame openers to be updated (which can happen | 2284 // TODO(alexmos): Once we allow frame openers to be updated (which can happen |
2291 // via window.open(url, "target_frame")), this will need to be resilient to | 2285 // via window.open(url, "target_frame")), this will need to be resilient to |
2292 // cycles. It will also need to handle tabs that have multiple openers (e.g., | 2286 // cycles. It will also need to handle tabs that have multiple openers (e.g., |
2293 // main frame and subframe could have different openers, each of which must | 2287 // main frame and subframe could have different openers, each of which must |
2294 // be traversed). | 2288 // be traversed). |
2295 FrameTreeNode* opener = frame_tree_node_->opener(); | 2289 FrameTreeNode* opener = frame_tree_node_->opener(); |
2296 if (opener) | 2290 if (opener) |
2297 opener_route_id = opener->render_manager()->CreateOpenerProxies(instance); | 2291 opener->render_manager()->CreateOpenerProxies(instance); |
2298 | 2292 |
2299 // If any of the RenderViews (current, pending, or swapped out) for this | 2293 // If any of the RenderViews (current, pending, or swapped out) for this |
2300 // FrameTree has the same SiteInstance, use it. If such a RenderView exists, | 2294 // FrameTree has the same SiteInstance, then we can return early, since |
2301 // that implies that proxies for all nodes in the tree should also exist | 2295 // proxies for other nodes in the tree should also exist (when in |
2302 // (when in site-per-process mode), so it is safe to exit early. | 2296 // site-per-process mode). |
2303 FrameTree* frame_tree = frame_tree_node_->frame_tree(); | 2297 FrameTree* frame_tree = frame_tree_node_->frame_tree(); |
2304 RenderViewHostImpl* rvh = frame_tree->GetRenderViewHost(instance); | 2298 RenderViewHostImpl* rvh = frame_tree->GetRenderViewHost(instance); |
2305 if (rvh && rvh->IsRenderViewLive()) | 2299 if (rvh && rvh->IsRenderViewLive()) |
2306 return rvh->GetRoutingID(); | 2300 return; |
2307 | 2301 |
2308 int render_view_routing_id = MSG_ROUTING_NONE; | |
2309 if (RenderFrameHostManager::IsSwappedOutStateForbidden()) { | 2302 if (RenderFrameHostManager::IsSwappedOutStateForbidden()) { |
2310 // Ensure that all the nodes in the opener's frame tree have | 2303 // Ensure that all the nodes in the opener's frame tree have |
2311 // RenderFrameProxyHosts for the new SiteInstance. | 2304 // RenderFrameProxyHosts for the new SiteInstance. |
2312 frame_tree->CreateProxiesForSiteInstance(nullptr, instance); | 2305 frame_tree->CreateProxiesForSiteInstance(nullptr, instance); |
2313 rvh = frame_tree->GetRenderViewHost(instance); | |
2314 render_view_routing_id = rvh->GetRoutingID(); | |
2315 } else if (rvh && !rvh->IsRenderViewLive()) { | 2306 } else if (rvh && !rvh->IsRenderViewLive()) { |
2316 EnsureRenderViewInitialized(rvh, instance); | 2307 EnsureRenderViewInitialized(rvh, instance); |
2317 render_view_routing_id = rvh->GetRoutingID(); | |
2318 } else { | 2308 } else { |
2319 // Create a swapped out RenderView in the given SiteInstance if none exists, | 2309 // Create a swapped out RenderView in the given SiteInstance if none exists, |
2320 // setting its opener to the given route_id. Since the opener can point to | 2310 // setting its opener to the given route_id. Since the opener can point to |
2321 // a subframe, do this on the root frame of the opener's frame tree. | 2311 // a subframe, do this on the root frame of the opener's frame tree. |
2322 // Return the new view's route_id. | 2312 // Return the new view's route_id. |
2323 frame_tree->root()->render_manager()-> | 2313 frame_tree->root()->render_manager()-> |
2324 CreateRenderFrame(instance, nullptr, opener_route_id, | 2314 CreateRenderFrame(instance, nullptr, |
2325 CREATE_RF_FOR_MAIN_FRAME_NAVIGATION | | 2315 CREATE_RF_FOR_MAIN_FRAME_NAVIGATION | |
2326 CREATE_RF_SWAPPED_OUT | CREATE_RF_HIDDEN, | 2316 CREATE_RF_SWAPPED_OUT | CREATE_RF_HIDDEN, |
2327 &render_view_routing_id); | 2317 nullptr); |
2328 } | 2318 } |
2329 return render_view_routing_id; | 2319 } |
| 2320 |
| 2321 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) { |
| 2322 if (!frame_tree_node_->opener()) |
| 2323 return MSG_ROUTING_NONE; |
| 2324 |
| 2325 return frame_tree_node_->opener() |
| 2326 ->render_manager() |
| 2327 ->GetRoutingIdForSiteInstance(instance); |
2330 } | 2328 } |
2331 | 2329 |
2332 } // namespace content | 2330 } // namespace content |
OLD | NEW |