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

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: More cleanup 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(),
284 false))
286 return NULL; 285 return NULL;
287 286
288 // Now that we've created a new renderer, be sure to hide it if it isn't 287 // 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() 288 // our primary one. Otherwise, we might crash if we try to call Show()
290 // on it later. 289 // on it later.
291 if (dest_render_frame_host != render_frame_host_) { 290 if (dest_render_frame_host != render_frame_host_) {
292 if (dest_render_frame_host->GetView()) 291 if (dest_render_frame_host->GetView())
293 dest_render_frame_host->GetView()->Hide(); 292 dest_render_frame_host->GetView()->Hide();
294 } else { 293 } else {
295 // TODO(nasko): This is a very ugly hack. The Chrome extensions process 294 // TODO(nasko): This is a very ugly hack. The Chrome extensions process
(...skipping 560 matching lines...) Expand 10 before | Expand all | Expand 10 after
856 } 855 }
857 } 856 }
858 DCHECK(navigation_rfh && 857 DCHECK(navigation_rfh &&
859 (navigation_rfh == render_frame_host_.get() || 858 (navigation_rfh == render_frame_host_.get() ||
860 navigation_rfh == speculative_render_frame_host_.get())); 859 navigation_rfh == speculative_render_frame_host_.get()));
861 860
862 // If the RenderFrame that needs to navigate is not live (its process was just 861 // If the RenderFrame that needs to navigate is not live (its process was just
863 // created or has crashed), initialize it. 862 // created or has crashed), initialize it.
864 if (!navigation_rfh->IsRenderFrameLive()) { 863 if (!navigation_rfh->IsRenderFrameLive()) {
865 // Recreate the opener chain. 864 // Recreate the opener chain.
866 int opener_route_id = 865 CreateOpenerProxiesIfNeeded(navigation_rfh->GetSiteInstance());
867 CreateOpenerProxiesIfNeeded(navigation_rfh->GetSiteInstance()); 866 if (!InitRenderView(navigation_rfh->render_view_host(), MSG_ROUTING_NONE,
868 if (!InitRenderView(navigation_rfh->render_view_host(), opener_route_id, 867 frame_tree_node_->IsMainFrame(), false)) {
nasko 2015/07/07 16:26:21 Sprinkling a ton of extra "false" params is buggin
alexmos 2015/07/08 04:42:18 Yeah, I agree it's pretty annoying. One alternati
nasko 2015/07/08 09:35:19 Yeah, I think the flag version is probably not wor
alexmos 2015/07/08 15:09:27 I suppose the scenario here is some page A opening
alexmos 2015/07/09 02:43:23 Thinking more about this, I think we may actually
869 MSG_ROUTING_NONE, frame_tree_node_->IsMainFrame())) {
870 return nullptr; 868 return nullptr;
871 } 869 }
872 870
873 if (navigation_rfh == render_frame_host_) { 871 if (navigation_rfh == render_frame_host_) {
874 // TODO(nasko): This is a very ugly hack. The Chrome extensions process 872 // TODO(nasko): This is a very ugly hack. The Chrome extensions process
875 // manager still uses NotificationService and expects to see a 873 // manager still uses NotificationService and expects to see a
876 // RenderViewHost changed notification after WebContents and 874 // RenderViewHost changed notification after WebContents and
877 // RenderFrameHostManager are completely initialized. This should be 875 // RenderFrameHostManager are completely initialized. This should be
878 // removed once the process manager moves away from NotificationService. 876 // removed once the process manager moves away from NotificationService.
879 // See https://crbug.com/462682. 877 // See https://crbug.com/462682.
(...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after
1392 if (pending_render_frame_host_) 1390 if (pending_render_frame_host_)
1393 CancelPending(); 1391 CancelPending();
1394 1392
1395 // The process for the new SiteInstance may (if we're sharing a process with 1393 // 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 1394 // another host that already initialized it) or may not (we have our own
1397 // process or the existing process crashed) have been initialized. Calling 1395 // process or the existing process crashed) have been initialized. Calling
1398 // Init multiple times will be ignored, so this is safe. 1396 // Init multiple times will be ignored, so this is safe.
1399 if (!new_instance->GetProcess()->Init()) 1397 if (!new_instance->GetProcess()->Init())
1400 return; 1398 return;
1401 1399
1402 int opener_route_id = CreateProxiesForNewRenderFrameHost( 1400 CreateProxiesForNewRenderFrameHost(old_instance, new_instance,
1403 old_instance, new_instance, &create_render_frame_flags); 1401 &create_render_frame_flags);
1404 1402
1405 // Create a non-swapped-out RFH with the given opener. 1403 // Create a non-swapped-out RFH with the given opener.
1406 pending_render_frame_host_ = 1404 pending_render_frame_host_ = CreateRenderFrame(
1407 CreateRenderFrame(new_instance, pending_web_ui(), opener_route_id, 1405 new_instance, pending_web_ui(), create_render_frame_flags, nullptr);
1408 create_render_frame_flags, nullptr);
1409 } 1406 }
1410 1407
1411 int RenderFrameHostManager::CreateProxiesForNewRenderFrameHost( 1408 void RenderFrameHostManager::CreateProxiesForNewRenderFrameHost(
1412 SiteInstance* old_instance, 1409 SiteInstance* old_instance,
1413 SiteInstance* new_instance, 1410 SiteInstance* new_instance,
1414 int* create_render_frame_flags) { 1411 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. 1412 // Only create opener proxies if they are in the same BrowsingInstance.
1417 if (new_instance->IsRelatedSiteInstance(old_instance)) 1413 if (new_instance->IsRelatedSiteInstance(old_instance))
1418 opener_route_id = CreateOpenerProxiesIfNeeded(new_instance); 1414 CreateOpenerProxiesIfNeeded(new_instance);
1419 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 1415 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
1420 switches::kSitePerProcess)) { 1416 switches::kSitePerProcess)) {
1421 // Ensure that the frame tree has RenderFrameProxyHosts for the new 1417 // Ensure that the frame tree has RenderFrameProxyHosts for the new
1422 // SiteInstance in all nodes except the current one. We do this for all 1418 // 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. 1419 // 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 1420 // We will still check whether two frames are in the same BrowsingInstance
1425 // before we allow them to interact (e.g., postMessage). 1421 // before we allow them to interact (e.g., postMessage).
1426 frame_tree_node_->frame_tree()->CreateProxiesForSiteInstance( 1422 frame_tree_node_->frame_tree()->CreateProxiesForSiteInstance(
1427 frame_tree_node_, new_instance); 1423 frame_tree_node_, new_instance);
1428 // RenderFrames in different processes from their parent RenderFrames 1424 // RenderFrames in different processes from their parent RenderFrames
1429 // in the frame tree require RenderWidgets for rendering and processing 1425 // in the frame tree require RenderWidgets for rendering and processing
1430 // input events. 1426 // input events.
1431 if (frame_tree_node_->parent() && 1427 if (frame_tree_node_->parent() &&
1432 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() != 1428 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() !=
1433 new_instance) 1429 new_instance)
1434 *create_render_frame_flags |= CREATE_RF_NEEDS_RENDER_WIDGET_HOST; 1430 *create_render_frame_flags |= CREATE_RF_NEEDS_RENDER_WIDGET_HOST;
1435 } 1431 }
1436 return opener_route_id;
1437 } 1432 }
1438 1433
1439 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( 1434 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost(
1440 SiteInstance* site_instance, 1435 SiteInstance* site_instance,
1441 int view_routing_id, 1436 int view_routing_id,
1442 int frame_routing_id, 1437 int frame_routing_id,
1443 int flags) { 1438 int flags) {
1444 if (frame_routing_id == MSG_ROUTING_NONE) 1439 if (frame_routing_id == MSG_ROUTING_NONE)
1445 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID(); 1440 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID();
1446 1441
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1484 speculative_web_ui_ = CreateWebUI(url, bindings); 1479 speculative_web_ui_ = CreateWebUI(url, bindings);
1485 1480
1486 // The process for the new SiteInstance may (if we're sharing a process with 1481 // 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 1482 // another host that already initialized it) or may not (we have our own
1488 // process or the existing process crashed) have been initialized. Calling 1483 // process or the existing process crashed) have been initialized. Calling
1489 // Init multiple times will be ignored, so this is safe. 1484 // Init multiple times will be ignored, so this is safe.
1490 if (!new_instance->GetProcess()->Init()) 1485 if (!new_instance->GetProcess()->Init())
1491 return false; 1486 return false;
1492 1487
1493 int create_render_frame_flags = 0; 1488 int create_render_frame_flags = 0;
1494 int opener_route_id = CreateProxiesForNewRenderFrameHost( 1489 CreateProxiesForNewRenderFrameHost(old_instance, new_instance,
1495 old_instance, new_instance, &create_render_frame_flags); 1490 &create_render_frame_flags);
1496 1491
1497 if (frame_tree_node_->IsMainFrame()) 1492 if (frame_tree_node_->IsMainFrame())
1498 create_render_frame_flags |= CREATE_RF_FOR_MAIN_FRAME_NAVIGATION; 1493 create_render_frame_flags |= CREATE_RF_FOR_MAIN_FRAME_NAVIGATION;
1499 if (delegate_->IsHidden()) 1494 if (delegate_->IsHidden())
1500 create_render_frame_flags |= CREATE_RF_HIDDEN; 1495 create_render_frame_flags |= CREATE_RF_HIDDEN;
1501 speculative_render_frame_host_ = 1496 speculative_render_frame_host_ =
1502 CreateRenderFrame(new_instance, speculative_web_ui_.get(), 1497 CreateRenderFrame(new_instance, speculative_web_ui_.get(),
1503 opener_route_id, create_render_frame_flags, nullptr); 1498 create_render_frame_flags, nullptr);
1504 1499
1505 if (!speculative_render_frame_host_) { 1500 if (!speculative_render_frame_host_) {
1506 speculative_web_ui_.reset(); 1501 speculative_web_ui_.reset();
1507 return false; 1502 return false;
1508 } 1503 }
1509 return true; 1504 return true;
1510 } 1505 }
1511 1506
1512 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame( 1507 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame(
1513 SiteInstance* instance, 1508 SiteInstance* instance,
1514 WebUIImpl* web_ui, 1509 WebUIImpl* web_ui,
1515 int opener_route_id,
1516 int flags, 1510 int flags,
1517 int* view_routing_id_ptr) { 1511 int* view_routing_id_ptr) {
1518 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); 1512 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT);
1519 bool swapped_out_forbidden = IsSwappedOutStateForbidden(); 1513 bool swapped_out_forbidden = IsSwappedOutStateForbidden();
1520 bool is_site_per_process = base::CommandLine::ForCurrentProcess()->HasSwitch( 1514 bool is_site_per_process = base::CommandLine::ForCurrentProcess()->HasSwitch(
1521 switches::kSitePerProcess); 1515 switches::kSitePerProcess);
1522 1516
1523 CHECK(instance); 1517 CHECK(instance);
1524 CHECK_IMPLIES(swapped_out_forbidden, !swapped_out); 1518 CHECK_IMPLIES(swapped_out_forbidden, !swapped_out);
1525 CHECK_IMPLIES(!is_site_per_process, frame_tree_node_->IsMainFrame()); 1519 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(); 1561 new_render_frame_host->GetProcess()->AddPendingView();
1568 } else { 1562 } else {
1569 proxy = new RenderFrameProxyHost( 1563 proxy = new RenderFrameProxyHost(
1570 new_render_frame_host->GetSiteInstance(), 1564 new_render_frame_host->GetSiteInstance(),
1571 new_render_frame_host->render_view_host(), frame_tree_node_); 1565 new_render_frame_host->render_view_host(), frame_tree_node_);
1572 proxy_hosts_[instance->GetId()] = proxy; 1566 proxy_hosts_[instance->GetId()] = proxy;
1573 proxy_routing_id = proxy->GetRoutingID(); 1567 proxy_routing_id = proxy->GetRoutingID();
1574 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); 1568 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass());
1575 } 1569 }
1576 1570
1577 success = 1571 success = InitRenderView(render_view_host, proxy_routing_id,
1578 InitRenderView(render_view_host, opener_route_id, proxy_routing_id, 1572 !!(flags & CREATE_RF_FOR_MAIN_FRAME_NAVIGATION),
1579 !!(flags & CREATE_RF_FOR_MAIN_FRAME_NAVIGATION)); 1573 !!(flags & CREATE_RF_SUPPRESS_OPENER));
1580 if (success) { 1574 if (success) {
1581 // Remember that InitRenderView also created the RenderFrameProxy. 1575 // Remember that InitRenderView also created the RenderFrameProxy.
1582 if (swapped_out) 1576 if (swapped_out)
1583 proxy->set_render_frame_proxy_created(true); 1577 proxy->set_render_frame_proxy_created(true);
1584 if (frame_tree_node_->IsMainFrame()) { 1578 if (frame_tree_node_->IsMainFrame()) {
1585 // Don't show the main frame's view until we get a DidNavigate from it. 1579 // 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 1580 // Only the RenderViewHost for the top-level RenderFrameHost has a
1587 // RenderWidgetHostView; RenderWidgetHosts for out-of-process iframes 1581 // RenderWidgetHostView; RenderWidgetHosts for out-of-process iframes
1588 // will be created later and hidden. 1582 // will be created later and hidden.
1589 if (render_view_host->GetView()) 1583 if (render_view_host->GetView())
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1622 } 1616 }
1623 1617
1624 // Returns the new RFH if it isn't swapped out. 1618 // Returns the new RFH if it isn't swapped out.
1625 if (success && !swapped_out) { 1619 if (success && !swapped_out) {
1626 DCHECK(new_render_frame_host->GetSiteInstance() == instance); 1620 DCHECK(new_render_frame_host->GetSiteInstance() == instance);
1627 return new_render_frame_host.Pass(); 1621 return new_render_frame_host.Pass();
1628 } 1622 }
1629 return nullptr; 1623 return nullptr;
1630 } 1624 }
1631 1625
1632 int RenderFrameHostManager::CreateRenderFrameProxy(SiteInstance* instance) { 1626 int RenderFrameHostManager::CreateRenderFrameProxy(SiteInstance* instance,
1627 bool suppress_opener) {
1633 // A RenderFrameProxyHost should never be created in the same SiteInstance as 1628 // A RenderFrameProxyHost should never be created in the same SiteInstance as
1634 // the current RFH. 1629 // the current RFH.
1635 CHECK(instance); 1630 CHECK(instance);
1636 CHECK_NE(instance, render_frame_host_->GetSiteInstance()); 1631 CHECK_NE(instance, render_frame_host_->GetSiteInstance());
1637 1632
1638 RenderViewHostImpl* render_view_host = nullptr; 1633 RenderViewHostImpl* render_view_host = nullptr;
1639 1634
1640 // Ensure a RenderViewHost exists for |instance|, as it creates the page 1635 // Ensure a RenderViewHost exists for |instance|, as it creates the page
1641 // level structure in Blink. 1636 // level structure in Blink.
1642 if (RenderFrameHostManager::IsSwappedOutStateForbidden()) { 1637 if (RenderFrameHostManager::IsSwappedOutStateForbidden()) {
(...skipping 11 matching lines...) Expand all
1654 return proxy->GetRoutingID(); 1649 return proxy->GetRoutingID();
1655 1650
1656 if (!proxy) { 1651 if (!proxy) {
1657 proxy = new RenderFrameProxyHost( 1652 proxy = new RenderFrameProxyHost(
1658 instance, render_view_host, frame_tree_node_); 1653 instance, render_view_host, frame_tree_node_);
1659 proxy_hosts_[instance->GetId()] = proxy; 1654 proxy_hosts_[instance->GetId()] = proxy;
1660 } 1655 }
1661 1656
1662 if (RenderFrameHostManager::IsSwappedOutStateForbidden() && 1657 if (RenderFrameHostManager::IsSwappedOutStateForbidden() &&
1663 frame_tree_node_->IsMainFrame()) { 1658 frame_tree_node_->IsMainFrame()) {
1664 InitRenderView( 1659 InitRenderView(render_view_host, proxy->GetRoutingID(), true,
1665 render_view_host, MSG_ROUTING_NONE, proxy->GetRoutingID(), true); 1660 suppress_opener);
1666 proxy->set_render_frame_proxy_created(true); 1661 proxy->set_render_frame_proxy_created(true);
1667 } else { 1662 } else {
1668 proxy->InitRenderFrameProxy(); 1663 proxy->InitRenderFrameProxy();
1669 } 1664 }
1670 1665
1671 return proxy->GetRoutingID(); 1666 return proxy->GetRoutingID();
1672 } 1667 }
1673 1668
1674 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) { 1669 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) {
1675 for (const auto& pair : proxy_hosts_) { 1670 for (const auto& pair : proxy_hosts_) {
1676 child->render_manager()->CreateRenderFrameProxy( 1671 child->render_manager()->CreateRenderFrameProxy(
1677 pair.second->GetSiteInstance()); 1672 pair.second->GetSiteInstance(), false);
1678 } 1673 }
1679 } 1674 }
1680 1675
1681 void RenderFrameHostManager::EnsureRenderViewInitialized( 1676 void RenderFrameHostManager::EnsureRenderViewInitialized(
1682 RenderViewHostImpl* render_view_host, 1677 RenderViewHostImpl* render_view_host,
1683 SiteInstance* instance) { 1678 SiteInstance* instance) {
1684 DCHECK(frame_tree_node_->IsMainFrame()); 1679 DCHECK(frame_tree_node_->IsMainFrame());
1685 1680
1686 if (render_view_host->IsRenderViewLive()) 1681 if (render_view_host->IsRenderViewLive())
1687 return; 1682 return;
1688 1683
1689 // Recreate the opener chain. 1684 // Recreate the opener chain.
1690 int opener_route_id = CreateOpenerProxiesIfNeeded(instance); 1685 CreateOpenerProxiesIfNeeded(instance);
1691 1686
1692 // If the proxy in |instance| doesn't exist, this RenderView is not swapped 1687 // If the proxy in |instance| doesn't exist, this RenderView is not swapped
1693 // out and shouldn't be reinitialized here. 1688 // out and shouldn't be reinitialized here.
1694 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); 1689 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance);
1695 if (!proxy) 1690 if (!proxy)
1696 return; 1691 return;
1697 1692
1698 InitRenderView(render_view_host, opener_route_id, proxy->GetRoutingID(), 1693 InitRenderView(render_view_host, proxy->GetRoutingID(), false, false);
1699 false);
1700 proxy->set_render_frame_proxy_created(true); 1694 proxy->set_render_frame_proxy_created(true);
1701 } 1695 }
1702 1696
1703 void RenderFrameHostManager::CreateOuterDelegateProxy( 1697 void RenderFrameHostManager::CreateOuterDelegateProxy(
1704 SiteInstance* outer_contents_site_instance, 1698 SiteInstance* outer_contents_site_instance,
1705 RenderFrameHostImpl* render_frame_host) { 1699 RenderFrameHostImpl* render_frame_host) {
1706 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( 1700 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch(
1707 switches::kSitePerProcess)); 1701 switches::kSitePerProcess));
1708 RenderFrameProxyHost* proxy = new RenderFrameProxyHost( 1702 RenderFrameProxyHost* proxy = new RenderFrameProxyHost(
1709 outer_contents_site_instance, nullptr, frame_tree_node_); 1703 outer_contents_site_instance, nullptr, frame_tree_node_);
(...skipping 14 matching lines...) Expand all
1724 } 1718 }
1725 1719
1726 void RenderFrameHostManager::SetRWHViewForInnerContents( 1720 void RenderFrameHostManager::SetRWHViewForInnerContents(
1727 RenderWidgetHostView* child_rwhv) { 1721 RenderWidgetHostView* child_rwhv) {
1728 DCHECK(ForInnerDelegate()); 1722 DCHECK(ForInnerDelegate());
1729 GetProxyToOuterDelegate()->SetChildRWHView(child_rwhv); 1723 GetProxyToOuterDelegate()->SetChildRWHView(child_rwhv);
1730 } 1724 }
1731 1725
1732 bool RenderFrameHostManager::InitRenderView( 1726 bool RenderFrameHostManager::InitRenderView(
1733 RenderViewHostImpl* render_view_host, 1727 RenderViewHostImpl* render_view_host,
1734 int opener_route_id,
1735 int proxy_routing_id, 1728 int proxy_routing_id,
1736 bool for_main_frame_navigation) { 1729 bool for_main_frame_navigation,
1730 bool suppress_opener) {
1737 // Ensure the renderer process is initialized before creating the 1731 // Ensure the renderer process is initialized before creating the
1738 // RenderView. 1732 // RenderView.
1739 if (!render_view_host->GetProcess()->Init()) 1733 if (!render_view_host->GetProcess()->Init())
1740 return false; 1734 return false;
1741 1735
1742 // We may have initialized this RenderViewHost for another RenderFrameHost. 1736 // We may have initialized this RenderViewHost for another RenderFrameHost.
1743 if (render_view_host->IsRenderViewLive()) 1737 if (render_view_host->IsRenderViewLive())
1744 return true; 1738 return true;
1745 1739
1746 // If the ongoing navigation is to a WebUI and the RenderView is not in a 1740 // If the ongoing navigation is to a WebUI and the RenderView is not in a
(...skipping 11 matching lines...) Expand all
1758 render_view_host->AllowBindings(dest_web_ui->GetBindings()); 1752 render_view_host->AllowBindings(dest_web_ui->GetBindings());
1759 } else { 1753 } else {
1760 // Ensure that we don't create an unprivileged RenderView in a WebUI-enabled 1754 // Ensure that we don't create an unprivileged RenderView in a WebUI-enabled
1761 // process unless it's swapped out. 1755 // process unless it's swapped out.
1762 if (render_view_host->is_active()) { 1756 if (render_view_host->is_active()) {
1763 CHECK(!ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( 1757 CHECK(!ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings(
1764 render_view_host->GetProcess()->GetID())); 1758 render_view_host->GetProcess()->GetID()));
1765 } 1759 }
1766 } 1760 }
1767 1761
1762 int opener_frame_routing_id = MSG_ROUTING_NONE;
1763 if (!suppress_opener) {
1764 opener_frame_routing_id =
1765 GetOpenerRoutingID(render_view_host->GetSiteInstance());
1766 }
1767
1768 return delegate_->CreateRenderViewForRenderManager( 1768 return delegate_->CreateRenderViewForRenderManager(
1769 render_view_host, 1769 render_view_host, opener_frame_routing_id, proxy_routing_id,
1770 opener_route_id, 1770 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 } 1771 }
1775 1772
1776 bool RenderFrameHostManager::InitRenderFrame( 1773 bool RenderFrameHostManager::InitRenderFrame(
1777 RenderFrameHostImpl* render_frame_host) { 1774 RenderFrameHostImpl* render_frame_host) {
1778 if (render_frame_host->IsRenderFrameLive()) 1775 if (render_frame_host->IsRenderFrameLive())
1779 return true; 1776 return true;
1780 1777
1781 int parent_routing_id = MSG_ROUTING_NONE; 1778 int parent_routing_id = MSG_ROUTING_NONE;
1782 int previous_sibling_routing_id = MSG_ROUTING_NONE; 1779 int previous_sibling_routing_id = MSG_ROUTING_NONE;
1783 int proxy_routing_id = MSG_ROUTING_NONE; 1780 int proxy_routing_id = MSG_ROUTING_NONE;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1819 return delegate_->CreateRenderFrameForRenderManager( 1816 return delegate_->CreateRenderFrameForRenderManager(
1820 render_frame_host, parent_routing_id, previous_sibling_routing_id, 1817 render_frame_host, parent_routing_id, previous_sibling_routing_id,
1821 proxy_routing_id); 1818 proxy_routing_id);
1822 } 1819 }
1823 1820
1824 int RenderFrameHostManager::GetRoutingIdForSiteInstance( 1821 int RenderFrameHostManager::GetRoutingIdForSiteInstance(
1825 SiteInstance* site_instance) { 1822 SiteInstance* site_instance) {
1826 if (render_frame_host_->GetSiteInstance() == site_instance) 1823 if (render_frame_host_->GetSiteInstance() == site_instance)
1827 return render_frame_host_->GetRoutingID(); 1824 return render_frame_host_->GetRoutingID();
1828 1825
1829 RenderFrameProxyHostMap::iterator iter = 1826 if (pending_render_frame_host_ &&
1830 proxy_hosts_.find(site_instance->GetId()); 1827 pending_render_frame_host_->GetSiteInstance() == site_instance)
1831 if (iter != proxy_hosts_.end()) 1828 return pending_render_frame_host_->GetRoutingID();
alexmos 2015/07/06 23:56:42 See WebContentsImplTest.FindOpenerRVHWhenPending f
nasko 2015/07/07 16:26:21 This has me slightly concerned. If we have already
alexmos 2015/07/08 04:42:18 Interestingly, if I reorder the pending RFH and th
nasko 2015/07/08 09:35:19 Thanks for the thorough explanation. Yes, indeed t
1832 return iter->second->GetRoutingID(); 1829
1830 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(site_instance);
1831 if (proxy)
1832 return proxy->GetRoutingID();
1833 1833
1834 return MSG_ROUTING_NONE; 1834 return MSG_ROUTING_NONE;
1835 } 1835 }
1836 1836
1837 void RenderFrameHostManager::CommitPending() { 1837 void RenderFrameHostManager::CommitPending() {
1838 TRACE_EVENT1("navigation", "RenderFrameHostManager::CommitPending", 1838 TRACE_EVENT1("navigation", "RenderFrameHostManager::CommitPending",
1839 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); 1839 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id());
1840 bool browser_side_navigation = 1840 bool browser_side_navigation =
1841 base::CommandLine::ForCurrentProcess()->HasSwitch( 1841 base::CommandLine::ForCurrentProcess()->HasSwitch(
1842 switches::kEnableBrowserSideNavigation); 1842 switches::kEnableBrowserSideNavigation);
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after
2265 2265
2266 void RenderFrameHostManager::DeleteRenderFrameProxyHost( 2266 void RenderFrameHostManager::DeleteRenderFrameProxyHost(
2267 SiteInstance* instance) { 2267 SiteInstance* instance) {
2268 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); 2268 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId());
2269 if (iter != proxy_hosts_.end()) { 2269 if (iter != proxy_hosts_.end()) {
2270 delete iter->second; 2270 delete iter->second;
2271 proxy_hosts_.erase(iter); 2271 proxy_hosts_.erase(iter);
2272 } 2272 }
2273 } 2273 }
2274 2274
2275 int RenderFrameHostManager::CreateOpenerProxiesIfNeeded( 2275 void RenderFrameHostManager::CreateOpenerProxiesIfNeeded(
2276 SiteInstance* instance) { 2276 SiteInstance* instance) {
2277 FrameTreeNode* opener = frame_tree_node_->opener(); 2277 FrameTreeNode* opener = frame_tree_node_->opener();
2278 if (!opener) 2278 if (!opener)
2279 return MSG_ROUTING_NONE; 2279 return;
2280 2280
2281 // Create proxies for the opener chain. 2281 // Create proxies for the opener chain.
2282 return opener->render_manager()->CreateOpenerProxies(instance); 2282 opener->render_manager()->CreateOpenerProxies(instance);
2283 } 2283 }
2284 2284
2285 int RenderFrameHostManager::CreateOpenerProxies(SiteInstance* instance) { 2285 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 2286 // If this tab has an opener, recursively create proxies for the nodes on its
2289 // frame tree. 2287 // frame tree.
2290 // TODO(alexmos): Once we allow frame openers to be updated (which can happen 2288 // 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 2289 // 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., 2290 // 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 2291 // main frame and subframe could have different openers, each of which must
2294 // be traversed). 2292 // be traversed).
2295 FrameTreeNode* opener = frame_tree_node_->opener(); 2293 FrameTreeNode* opener = frame_tree_node_->opener();
2296 if (opener) 2294 if (opener)
2297 opener_route_id = opener->render_manager()->CreateOpenerProxies(instance); 2295 opener->render_manager()->CreateOpenerProxies(instance);
2298 2296
2299 // If any of the RenderViews (current, pending, or swapped out) for this 2297 // 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, 2298 // 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 2299 // 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. 2300 // site-per-process mode).
2303 FrameTree* frame_tree = frame_tree_node_->frame_tree(); 2301 FrameTree* frame_tree = frame_tree_node_->frame_tree();
2304 RenderViewHostImpl* rvh = frame_tree->GetRenderViewHost(instance); 2302 RenderViewHostImpl* rvh = frame_tree->GetRenderViewHost(instance);
2305 if (rvh && rvh->IsRenderViewLive()) 2303 if (rvh && rvh->IsRenderViewLive())
2306 return rvh->GetRoutingID(); 2304 return;
2307 2305
2308 int render_view_routing_id = MSG_ROUTING_NONE;
2309 if (RenderFrameHostManager::IsSwappedOutStateForbidden()) { 2306 if (RenderFrameHostManager::IsSwappedOutStateForbidden()) {
2310 // Ensure that all the nodes in the opener's frame tree have 2307 // Ensure that all the nodes in the opener's frame tree have
2311 // RenderFrameProxyHosts for the new SiteInstance. 2308 // RenderFrameProxyHosts for the new SiteInstance.
2312 frame_tree->CreateProxiesForSiteInstance(nullptr, instance); 2309 frame_tree->CreateProxiesForSiteInstance(nullptr, instance);
2313 rvh = frame_tree->GetRenderViewHost(instance);
2314 render_view_routing_id = rvh->GetRoutingID();
2315 } else if (rvh && !rvh->IsRenderViewLive()) { 2310 } else if (rvh && !rvh->IsRenderViewLive()) {
2316 EnsureRenderViewInitialized(rvh, instance); 2311 EnsureRenderViewInitialized(rvh, instance);
2317 render_view_routing_id = rvh->GetRoutingID();
2318 } else { 2312 } else {
2319 // Create a swapped out RenderView in the given SiteInstance if none exists, 2313 // 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 2314 // 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. 2315 // a subframe, do this on the root frame of the opener's frame tree.
2322 // Return the new view's route_id. 2316 // Return the new view's route_id.
2323 frame_tree->root()->render_manager()-> 2317 frame_tree->root()->render_manager()->
2324 CreateRenderFrame(instance, nullptr, opener_route_id, 2318 CreateRenderFrame(instance, nullptr,
2325 CREATE_RF_FOR_MAIN_FRAME_NAVIGATION | 2319 CREATE_RF_FOR_MAIN_FRAME_NAVIGATION |
2326 CREATE_RF_SWAPPED_OUT | CREATE_RF_HIDDEN, 2320 CREATE_RF_SWAPPED_OUT | CREATE_RF_HIDDEN,
2327 &render_view_routing_id); 2321 nullptr);
2328 } 2322 }
2329 return render_view_routing_id; 2323 }
2324
2325 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) {
2326 if (!frame_tree_node_->opener())
2327 return MSG_ROUTING_NONE;
2328 return frame_tree_node_->opener()
nasko 2015/07/07 16:26:21 nit: Empty line between the two returns makes it s
alexmos 2015/07/08 04:42:18 Done.
2329 ->render_manager()
2330 ->GetRoutingIdForSiteInstance(instance);
2330 } 2331 }
2331 2332
2332 } // namespace content 2333 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698