Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/frame_host/render_frame_host_manager.h" | 5 #include "content/browser/frame_host/render_frame_host_manager.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 270 // Instruct the destination render frame host to set up a Mojo connection | 270 // Instruct the destination render frame host to set up a Mojo connection |
| 271 // with the new render frame if necessary. Note that this call needs to | 271 // with the new render frame if necessary. Note that this call needs to |
| 272 // occur before initializing the RenderView; the flow of creating the | 272 // occur before initializing the RenderView; the flow of creating the |
| 273 // RenderView can cause browser-side code to execute that expects the this | 273 // RenderView can cause browser-side code to execute that expects the this |
| 274 // RFH's ServiceRegistry to be initialized (e.g., if the site is a WebUI | 274 // RFH's ServiceRegistry to be initialized (e.g., if the site is a WebUI |
| 275 // site that is handled via Mojo, then Mojo WebUI code in //chrome will | 275 // site that is handled via Mojo, then Mojo WebUI code in //chrome will |
| 276 // add a service to this RFH's ServiceRegistry). | 276 // add a service to this RFH's ServiceRegistry). |
| 277 dest_render_frame_host->SetUpMojoIfNeeded(); | 277 dest_render_frame_host->SetUpMojoIfNeeded(); |
| 278 | 278 |
| 279 // Recreate the opener chain. | 279 // Recreate the opener chain. |
| 280 int opener_route_id = | 280 CreateOpenerProxiesIfNeeded(dest_render_frame_host->GetSiteInstance()); |
| 281 CreateOpenerProxiesIfNeeded(dest_render_frame_host->GetSiteInstance()); | |
| 282 if (!InitRenderView(dest_render_frame_host->render_view_host(), | 281 if (!InitRenderView(dest_render_frame_host->render_view_host(), |
| 283 opener_route_id, | |
| 284 MSG_ROUTING_NONE, | 282 MSG_ROUTING_NONE, |
| 285 frame_tree_node_->IsMainFrame())) | 283 frame_tree_node_->IsMainFrame(), |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |