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

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

Issue 1202593002: Move browser-to-renderer opener plumbing to frame routing IDs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@opener-create-opener-render-views
Patch Set: Remove suppress_opener Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/frame_host/render_frame_host_manager.h" 5 #include "content/browser/frame_host/render_frame_host_manager.h"
6 6
7 #include <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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698