| 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 |