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 |