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 <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <utility> | 10 #include <utility> |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 void RenderFrameHostManager::Init(SiteInstance* site_instance, | 87 void RenderFrameHostManager::Init(SiteInstance* site_instance, |
88 int32_t view_routing_id, | 88 int32_t view_routing_id, |
89 int32_t frame_routing_id, | 89 int32_t frame_routing_id, |
90 int32_t widget_routing_id) { | 90 int32_t widget_routing_id) { |
91 DCHECK(site_instance); | 91 DCHECK(site_instance); |
92 // TODO(avi): While RenderViewHostImpl is-a RenderWidgetHostImpl, this must | 92 // TODO(avi): While RenderViewHostImpl is-a RenderWidgetHostImpl, this must |
93 // hold true to avoid having two RenderWidgetHosts for the top-level frame. | 93 // hold true to avoid having two RenderWidgetHosts for the top-level frame. |
94 // https://crbug.com/545684 | 94 // https://crbug.com/545684 |
95 DCHECK(!frame_tree_node_->IsMainFrame() || | 95 DCHECK(!frame_tree_node_->IsMainFrame() || |
96 view_routing_id == widget_routing_id); | 96 view_routing_id == widget_routing_id); |
97 int flags = delegate_->IsHidden() ? CREATE_RF_HIDDEN : 0; | |
98 SetRenderFrameHost(CreateRenderFrameHost(site_instance, view_routing_id, | 97 SetRenderFrameHost(CreateRenderFrameHost(site_instance, view_routing_id, |
99 frame_routing_id, widget_routing_id, | 98 frame_routing_id, widget_routing_id, |
100 flags)); | 99 delegate_->IsHidden())); |
101 | 100 |
102 // Notify the delegate of the creation of the current RenderFrameHost. | 101 // Notify the delegate of the creation of the current RenderFrameHost. |
103 // Do this only for subframes, as the main frame case is taken care of by | 102 // Do this only for subframes, as the main frame case is taken care of by |
104 // WebContentsImpl::Init. | 103 // WebContentsImpl::Init. |
105 if (!frame_tree_node_->IsMainFrame()) { | 104 if (!frame_tree_node_->IsMainFrame()) { |
106 delegate_->NotifySwappedFromRenderManager( | 105 delegate_->NotifySwappedFromRenderManager( |
107 nullptr, render_frame_host_.get(), false); | 106 nullptr, render_frame_host_.get(), false); |
108 } | 107 } |
109 } | 108 } |
110 | 109 |
(...skipping 1324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1435 return render_frame_host_->last_successful_url(); | 1434 return render_frame_host_->last_successful_url(); |
1436 | 1435 |
1437 // Fall back to the SiteInstance's Site URL if the FrameTreeNode doen't have a | 1436 // Fall back to the SiteInstance's Site URL if the FrameTreeNode doen't have a |
1438 // current URL. | 1437 // current URL. |
1439 return current_instance->GetSiteURL(); | 1438 return current_instance->GetSiteURL(); |
1440 } | 1439 } |
1441 | 1440 |
1442 void RenderFrameHostManager::CreatePendingRenderFrameHost( | 1441 void RenderFrameHostManager::CreatePendingRenderFrameHost( |
1443 SiteInstance* old_instance, | 1442 SiteInstance* old_instance, |
1444 SiteInstance* new_instance) { | 1443 SiteInstance* new_instance) { |
1445 int create_render_frame_flags = 0; | |
1446 if (delegate_->IsHidden()) | |
1447 create_render_frame_flags |= CREATE_RF_HIDDEN; | |
1448 | |
1449 if (pending_render_frame_host_) | 1444 if (pending_render_frame_host_) |
1450 CancelPending(); | 1445 CancelPending(); |
1451 | 1446 |
1452 // The process for the new SiteInstance may (if we're sharing a process with | 1447 // The process for the new SiteInstance may (if we're sharing a process with |
1453 // another host that already initialized it) or may not (we have our own | 1448 // another host that already initialized it) or may not (we have our own |
1454 // process or the existing process crashed) have been initialized. Calling | 1449 // process or the existing process crashed) have been initialized. Calling |
1455 // Init multiple times will be ignored, so this is safe. | 1450 // Init multiple times will be ignored, so this is safe. |
1456 if (!new_instance->GetProcess()->Init()) | 1451 if (!new_instance->GetProcess()->Init()) |
1457 return; | 1452 return; |
1458 | 1453 |
1459 CreateProxiesForNewRenderFrameHost(old_instance, new_instance); | 1454 CreateProxiesForNewRenderFrameHost(old_instance, new_instance); |
1460 | 1455 |
1461 // Create a non-swapped-out RFH with the given opener. | 1456 // Create a non-swapped-out RFH with the given opener. |
1462 pending_render_frame_host_ = | 1457 pending_render_frame_host_ = |
1463 CreateRenderFrame(new_instance, create_render_frame_flags, nullptr); | 1458 CreateRenderFrame(new_instance, delegate_->IsHidden(), nullptr); |
1464 } | 1459 } |
1465 | 1460 |
1466 void RenderFrameHostManager::CreateProxiesForNewRenderFrameHost( | 1461 void RenderFrameHostManager::CreateProxiesForNewRenderFrameHost( |
1467 SiteInstance* old_instance, | 1462 SiteInstance* old_instance, |
1468 SiteInstance* new_instance) { | 1463 SiteInstance* new_instance) { |
1469 // Only create opener proxies if they are in the same BrowsingInstance. | 1464 // Only create opener proxies if they are in the same BrowsingInstance. |
1470 if (new_instance->IsRelatedSiteInstance(old_instance)) { | 1465 if (new_instance->IsRelatedSiteInstance(old_instance)) { |
1471 CreateOpenerProxies(new_instance, frame_tree_node_); | 1466 CreateOpenerProxies(new_instance, frame_tree_node_); |
1472 } else if (SiteIsolationPolicy::AreCrossProcessFramesPossible()) { | 1467 } else if (SiteIsolationPolicy::AreCrossProcessFramesPossible()) { |
1473 // Ensure that the frame tree has RenderFrameProxyHosts for the | 1468 // Ensure that the frame tree has RenderFrameProxyHosts for the |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1509 if (ancestor_rfh->GetSiteInstance() != current_instance) | 1504 if (ancestor_rfh->GetSiteInstance() != current_instance) |
1510 CreateRenderFrameProxy(ancestor_rfh->GetSiteInstance()); | 1505 CreateRenderFrameProxy(ancestor_rfh->GetSiteInstance()); |
1511 } | 1506 } |
1512 } | 1507 } |
1513 | 1508 |
1514 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( | 1509 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( |
1515 SiteInstance* site_instance, | 1510 SiteInstance* site_instance, |
1516 int32_t view_routing_id, | 1511 int32_t view_routing_id, |
1517 int32_t frame_routing_id, | 1512 int32_t frame_routing_id, |
1518 int32_t widget_routing_id, | 1513 int32_t widget_routing_id, |
1519 int flags) { | 1514 bool hidden) { |
1520 if (frame_routing_id == MSG_ROUTING_NONE) | 1515 if (frame_routing_id == MSG_ROUTING_NONE) |
1521 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID(); | 1516 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID(); |
1522 | 1517 |
1523 bool hidden = !!(flags & CREATE_RF_HIDDEN); | |
1524 | |
1525 // Create a RVH for main frames, or find the existing one for subframes. | 1518 // Create a RVH for main frames, or find the existing one for subframes. |
1526 FrameTree* frame_tree = frame_tree_node_->frame_tree(); | 1519 FrameTree* frame_tree = frame_tree_node_->frame_tree(); |
1527 RenderViewHostImpl* render_view_host = nullptr; | 1520 RenderViewHostImpl* render_view_host = nullptr; |
1528 if (frame_tree_node_->IsMainFrame()) { | 1521 if (frame_tree_node_->IsMainFrame()) { |
1529 render_view_host = frame_tree->CreateRenderViewHost( | 1522 render_view_host = frame_tree->CreateRenderViewHost( |
1530 site_instance, view_routing_id, frame_routing_id, false, hidden); | 1523 site_instance, view_routing_id, frame_routing_id, false, hidden); |
1531 // TODO(avi): It's a bit bizarre that this logic lives here instead of in | 1524 // TODO(avi): It's a bit bizarre that this logic lives here instead of in |
1532 // CreateRenderFrame(). It turns out that FrameTree::CreateRenderViewHost | 1525 // CreateRenderFrame(). It turns out that FrameTree::CreateRenderViewHost |
1533 // doesn't /always/ create a new RenderViewHost. It first tries to find an | 1526 // doesn't /always/ create a new RenderViewHost. It first tries to find an |
1534 // already existing one to reuse by a SiteInstance lookup. If it finds one, | 1527 // already existing one to reuse by a SiteInstance lookup. If it finds one, |
1535 // then the supplied routing IDs are completely ignored. | 1528 // then the supplied routing IDs are completely ignored. |
1536 // CreateRenderFrame() could do this lookup too, but it seems redundant to | 1529 // CreateRenderFrame() could do this lookup too, but it seems redundant to |
1537 // do this lookup in two places. This is a good yak shave to clean up, or, | 1530 // do this lookup in two places. This is a good yak shave to clean up, or, |
1538 // if just ignored, should be an easy cleanup once RenderViewHostImpl has-a | 1531 // if just ignored, should be an easy cleanup once RenderViewHostImpl has-a |
1539 // RenderWidgetHostImpl. https://crbug.com/545684 | 1532 // RenderWidgetHostImpl. https://crbug.com/545684 |
1540 if (view_routing_id == MSG_ROUTING_NONE) { | 1533 if (view_routing_id == MSG_ROUTING_NONE) { |
1541 widget_routing_id = render_view_host->GetRoutingID(); | 1534 widget_routing_id = render_view_host->GetRoutingID(); |
1542 } else { | 1535 } else { |
1543 DCHECK_EQ(view_routing_id, render_view_host->GetRoutingID()); | 1536 DCHECK_EQ(view_routing_id, render_view_host->GetRoutingID()); |
1544 } | 1537 } |
1545 } else { | 1538 } else { |
1546 render_view_host = frame_tree->GetRenderViewHost(site_instance); | 1539 render_view_host = frame_tree->GetRenderViewHost(site_instance); |
1547 CHECK(render_view_host); | 1540 CHECK(render_view_host); |
1548 } | 1541 } |
1549 | 1542 |
1550 return RenderFrameHostFactory::Create( | 1543 return RenderFrameHostFactory::Create( |
1551 site_instance, render_view_host, render_frame_delegate_, | 1544 site_instance, render_view_host, render_frame_delegate_, |
1552 render_widget_delegate_, frame_tree, frame_tree_node_, frame_routing_id, | 1545 render_widget_delegate_, frame_tree, frame_tree_node_, frame_routing_id, |
1553 widget_routing_id, flags); | 1546 widget_routing_id, hidden); |
1554 } | 1547 } |
1555 | 1548 |
1556 // PlzNavigate | 1549 // PlzNavigate |
1557 bool RenderFrameHostManager::CreateSpeculativeRenderFrameHost( | 1550 bool RenderFrameHostManager::CreateSpeculativeRenderFrameHost( |
1558 SiteInstance* old_instance, | 1551 SiteInstance* old_instance, |
1559 SiteInstance* new_instance) { | 1552 SiteInstance* new_instance) { |
1560 CHECK(new_instance); | 1553 CHECK(new_instance); |
1561 CHECK_NE(old_instance, new_instance); | 1554 CHECK_NE(old_instance, new_instance); |
1562 | 1555 |
1563 // The process for the new SiteInstance may (if we're sharing a process with | 1556 // The process for the new SiteInstance may (if we're sharing a process with |
1564 // another host that already initialized it) or may not (we have our own | 1557 // another host that already initialized it) or may not (we have our own |
1565 // process or the existing process crashed) have been initialized. Calling | 1558 // process or the existing process crashed) have been initialized. Calling |
1566 // Init multiple times will be ignored, so this is safe. | 1559 // Init multiple times will be ignored, so this is safe. |
1567 if (!new_instance->GetProcess()->Init()) | 1560 if (!new_instance->GetProcess()->Init()) |
1568 return false; | 1561 return false; |
1569 | 1562 |
1570 CreateProxiesForNewRenderFrameHost(old_instance, new_instance); | 1563 CreateProxiesForNewRenderFrameHost(old_instance, new_instance); |
1571 | 1564 |
1572 int create_render_frame_flags = 0; | |
1573 if (delegate_->IsHidden()) | |
1574 create_render_frame_flags |= CREATE_RF_HIDDEN; | |
1575 speculative_render_frame_host_ = | 1565 speculative_render_frame_host_ = |
1576 CreateRenderFrame(new_instance, create_render_frame_flags, nullptr); | 1566 CreateRenderFrame(new_instance, delegate_->IsHidden(), nullptr); |
1577 | 1567 |
1578 return !!speculative_render_frame_host_; | 1568 return !!speculative_render_frame_host_; |
1579 } | 1569 } |
1580 | 1570 |
1581 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame( | 1571 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame( |
1582 SiteInstance* instance, | 1572 SiteInstance* instance, |
1583 int flags, | 1573 bool hidden, |
1584 int* view_routing_id_ptr) { | 1574 int* view_routing_id_ptr) { |
1585 int32_t widget_routing_id = MSG_ROUTING_NONE; | 1575 int32_t widget_routing_id = MSG_ROUTING_NONE; |
1586 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); | 1576 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); |
1587 | 1577 |
1588 CHECK(instance); | 1578 CHECK(instance); |
1589 CHECK(SiteIsolationPolicy::AreCrossProcessFramesPossible() || | 1579 CHECK(SiteIsolationPolicy::AreCrossProcessFramesPossible() || |
1590 frame_tree_node_->IsMainFrame()); | 1580 frame_tree_node_->IsMainFrame()); |
1591 | 1581 |
1592 scoped_ptr<RenderFrameHostImpl> new_render_frame_host; | 1582 scoped_ptr<RenderFrameHostImpl> new_render_frame_host; |
1593 bool success = true; | 1583 bool success = true; |
1594 if (view_routing_id_ptr) | 1584 if (view_routing_id_ptr) |
1595 *view_routing_id_ptr = MSG_ROUTING_NONE; | 1585 *view_routing_id_ptr = MSG_ROUTING_NONE; |
1596 | 1586 |
1597 // We are creating a pending, speculative or swapped out RFH here. We should | 1587 // We are creating a pending, speculative or swapped out RFH here. We should |
1598 // never create it in the same SiteInstance as our current RFH. | 1588 // never create it in the same SiteInstance as our current RFH. |
1599 CHECK_NE(render_frame_host_->GetSiteInstance(), instance); | 1589 CHECK_NE(render_frame_host_->GetSiteInstance(), instance); |
1600 | 1590 |
1601 // A RenderFrame in a different process from its parent RenderFrame | 1591 // A RenderFrame in a different process from its parent RenderFrame |
1602 // requires a RenderWidget for input/layout/painting. | 1592 // requires a RenderWidget for input/layout/painting. |
1603 if (frame_tree_node_->parent() && | 1593 if (frame_tree_node_->parent() && |
1604 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() != | 1594 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() != |
1605 instance) { | 1595 instance) { |
1606 CHECK(SiteIsolationPolicy::AreCrossProcessFramesPossible()); | 1596 CHECK(SiteIsolationPolicy::AreCrossProcessFramesPossible()); |
1607 widget_routing_id = instance->GetProcess()->GetNextRoutingID(); | 1597 widget_routing_id = instance->GetProcess()->GetNextRoutingID(); |
1608 } | 1598 } |
1609 | 1599 |
1610 new_render_frame_host = CreateRenderFrameHost( | 1600 new_render_frame_host = CreateRenderFrameHost( |
1611 instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, widget_routing_id, flags); | 1601 instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, widget_routing_id, hidden); |
1612 RenderViewHostImpl* render_view_host = | 1602 RenderViewHostImpl* render_view_host = |
1613 new_render_frame_host->render_view_host(); | 1603 new_render_frame_host->render_view_host(); |
1614 | 1604 |
1615 // Prevent the process from exiting while we're trying to navigate in it. | 1605 // Prevent the process from exiting while we're trying to navigate in it. |
1616 new_render_frame_host->GetProcess()->AddPendingView(); | 1606 new_render_frame_host->GetProcess()->AddPendingView(); |
1617 | 1607 |
1618 if (frame_tree_node_->IsMainFrame()) { | 1608 if (frame_tree_node_->IsMainFrame()) { |
1619 success = InitRenderView(render_view_host, proxy); | 1609 success = InitRenderView(render_view_host, proxy); |
1620 | 1610 |
1621 // If we are reusing the RenderViewHost and it doesn't already have a | 1611 // If we are reusing the RenderViewHost and it doesn't already have a |
(...skipping 839 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2461 } else if (pending_render_frame_host_) { | 2451 } else if (pending_render_frame_host_) { |
2462 send_msg(pending_render_frame_host_.get(), | 2452 send_msg(pending_render_frame_host_.get(), |
2463 pending_render_frame_host_->GetRoutingID(), msg); | 2453 pending_render_frame_host_->GetRoutingID(), msg); |
2464 } | 2454 } |
2465 | 2455 |
2466 msg->set_routing_id(render_frame_host_->GetRoutingID()); | 2456 msg->set_routing_id(render_frame_host_->GetRoutingID()); |
2467 render_frame_host_->Send(msg); | 2457 render_frame_host_->Send(msg); |
2468 } | 2458 } |
2469 | 2459 |
2470 } // namespace content | 2460 } // namespace content |
OLD | NEW |