| 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 <algorithm> | 7 #include <algorithm> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/stl_util.h" | 12 #include "base/stl_util.h" |
| 13 #include "base/trace_event/trace_event.h" | 13 #include "base/trace_event/trace_event.h" |
| 14 #include "content/browser/child_process_security_policy_impl.h" | 14 #include "content/browser/child_process_security_policy_impl.h" |
| 15 #include "content/browser/devtools/render_frame_devtools_agent_host.h" | 15 #include "content/browser/devtools/render_frame_devtools_agent_host.h" |
| 16 #include "content/browser/frame_host/cross_site_transferring_request.h" | 16 #include "content/browser/frame_host/cross_site_transferring_request.h" |
| 17 #include "content/browser/frame_host/debug_urls.h" | 17 #include "content/browser/frame_host/debug_urls.h" |
| 18 #include "content/browser/frame_host/frame_navigation_entry.h" | 18 #include "content/browser/frame_host/frame_navigation_entry.h" |
| 19 #include "content/browser/frame_host/interstitial_page_impl.h" | 19 #include "content/browser/frame_host/interstitial_page_impl.h" |
| 20 #include "content/browser/frame_host/navigation_controller_impl.h" | 20 #include "content/browser/frame_host/navigation_controller_impl.h" |
| 21 #include "content/browser/frame_host/navigation_entry_impl.h" | 21 #include "content/browser/frame_host/navigation_entry_impl.h" |
| 22 #include "content/browser/frame_host/navigation_handle_impl.h" | 22 #include "content/browser/frame_host/navigation_handle_impl.h" |
| 23 #include "content/browser/frame_host/navigation_request.h" | 23 #include "content/browser/frame_host/navigation_request.h" |
| 24 #include "content/browser/frame_host/navigator.h" | 24 #include "content/browser/frame_host/navigator.h" |
| 25 #include "content/browser/frame_host/render_frame_host_factory.h" | 25 #include "content/browser/frame_host/render_frame_host_factory.h" |
| 26 #include "content/browser/frame_host/render_frame_host_impl.h" | 26 #include "content/browser/frame_host/render_frame_host_impl.h" |
| 27 #include "content/browser/frame_host/render_frame_proxy_host.h" | 27 #include "content/browser/frame_host/render_frame_proxy_host.h" |
| 28 #include "content/browser/gpu/gpu_surface_tracker.h" | |
| 29 #include "content/browser/renderer_host/render_process_host_impl.h" | 28 #include "content/browser/renderer_host/render_process_host_impl.h" |
| 30 #include "content/browser/renderer_host/render_view_host_factory.h" | 29 #include "content/browser/renderer_host/render_view_host_factory.h" |
| 31 #include "content/browser/renderer_host/render_view_host_impl.h" | 30 #include "content/browser/renderer_host/render_view_host_impl.h" |
| 32 #include "content/browser/site_instance_impl.h" | 31 #include "content/browser/site_instance_impl.h" |
| 33 #include "content/browser/webui/web_ui_controller_factory_registry.h" | 32 #include "content/browser/webui/web_ui_controller_factory_registry.h" |
| 34 #include "content/browser/webui/web_ui_impl.h" | 33 #include "content/browser/webui/web_ui_impl.h" |
| 35 #include "content/common/frame_messages.h" | 34 #include "content/common/frame_messages.h" |
| 36 #include "content/common/site_isolation_policy.h" | 35 #include "content/common/site_isolation_policy.h" |
| 37 #include "content/common/view_messages.h" | 36 #include "content/common/view_messages.h" |
| 38 #include "content/public/browser/content_browser_client.h" | 37 #include "content/public/browser/content_browser_client.h" |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 251 web_ui_.reset(); | 250 web_ui_.reset(); |
| 252 | 251 |
| 253 // We should always have a current RenderFrameHost except in some tests. | 252 // We should always have a current RenderFrameHost except in some tests. |
| 254 SetRenderFrameHost(scoped_ptr<RenderFrameHostImpl>()); | 253 SetRenderFrameHost(scoped_ptr<RenderFrameHostImpl>()); |
| 255 } | 254 } |
| 256 | 255 |
| 257 void RenderFrameHostManager::Init(BrowserContext* browser_context, | 256 void RenderFrameHostManager::Init(BrowserContext* browser_context, |
| 258 SiteInstance* site_instance, | 257 SiteInstance* site_instance, |
| 259 int32 view_routing_id, | 258 int32 view_routing_id, |
| 260 int32 frame_routing_id, | 259 int32 frame_routing_id, |
| 261 int32 widget_routing_id, | 260 int32 widget_routing_id) { |
| 262 int32 surface_id) { | |
| 263 // Create a RenderViewHost and RenderFrameHost, once we have an instance. It | 261 // Create a RenderViewHost and RenderFrameHost, once we have an instance. It |
| 264 // is important to immediately give this SiteInstance to a RenderViewHost so | 262 // is important to immediately give this SiteInstance to a RenderViewHost so |
| 265 // that the SiteInstance is ref counted. | 263 // that the SiteInstance is ref counted. |
| 266 if (!site_instance) | 264 if (!site_instance) |
| 267 site_instance = SiteInstance::Create(browser_context); | 265 site_instance = SiteInstance::Create(browser_context); |
| 268 | 266 |
| 269 int flags = delegate_->IsHidden() ? CREATE_RF_HIDDEN : 0; | 267 int flags = delegate_->IsHidden() ? CREATE_RF_HIDDEN : 0; |
| 270 SetRenderFrameHost(CreateRenderFrameHost(site_instance, view_routing_id, | 268 SetRenderFrameHost(CreateRenderFrameHost(site_instance, view_routing_id, |
| 271 frame_routing_id, widget_routing_id, | 269 frame_routing_id, widget_routing_id, |
| 272 surface_id, flags)); | 270 flags)); |
| 273 | 271 |
| 274 // Notify the delegate of the creation of the current RenderFrameHost. | 272 // Notify the delegate of the creation of the current RenderFrameHost. |
| 275 // Do this only for subframes, as the main frame case is taken care of by | 273 // Do this only for subframes, as the main frame case is taken care of by |
| 276 // WebContentsImpl::Init. | 274 // WebContentsImpl::Init. |
| 277 if (!frame_tree_node_->IsMainFrame()) { | 275 if (!frame_tree_node_->IsMainFrame()) { |
| 278 delegate_->NotifySwappedFromRenderManager( | 276 delegate_->NotifySwappedFromRenderManager( |
| 279 nullptr, render_frame_host_.get(), false); | 277 nullptr, render_frame_host_.get(), false); |
| 280 } | 278 } |
| 281 } | 279 } |
| 282 | 280 |
| (...skipping 1349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1632 if (ancestor_rfh->GetSiteInstance() != current_instance) | 1630 if (ancestor_rfh->GetSiteInstance() != current_instance) |
| 1633 CreateRenderFrameProxy(ancestor_rfh->GetSiteInstance()); | 1631 CreateRenderFrameProxy(ancestor_rfh->GetSiteInstance()); |
| 1634 } | 1632 } |
| 1635 } | 1633 } |
| 1636 | 1634 |
| 1637 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( | 1635 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( |
| 1638 SiteInstance* site_instance, | 1636 SiteInstance* site_instance, |
| 1639 int32 view_routing_id, | 1637 int32 view_routing_id, |
| 1640 int32 frame_routing_id, | 1638 int32 frame_routing_id, |
| 1641 int32 widget_routing_id, | 1639 int32 widget_routing_id, |
| 1642 int32 surface_id, | |
| 1643 int flags) { | 1640 int flags) { |
| 1644 if (frame_routing_id == MSG_ROUTING_NONE) | 1641 if (frame_routing_id == MSG_ROUTING_NONE) |
| 1645 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID(); | 1642 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID(); |
| 1646 | 1643 |
| 1647 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); | 1644 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); |
| 1648 bool hidden = !!(flags & CREATE_RF_HIDDEN); | 1645 bool hidden = !!(flags & CREATE_RF_HIDDEN); |
| 1649 | 1646 |
| 1650 // Create a RVH for main frames, or find the existing one for subframes. | 1647 // Create a RVH for main frames, or find the existing one for subframes. |
| 1651 FrameTree* frame_tree = frame_tree_node_->frame_tree(); | 1648 FrameTree* frame_tree = frame_tree_node_->frame_tree(); |
| 1652 RenderViewHostImpl* render_view_host = nullptr; | 1649 RenderViewHostImpl* render_view_host = nullptr; |
| 1653 if (frame_tree_node_->IsMainFrame()) { | 1650 if (frame_tree_node_->IsMainFrame()) { |
| 1654 render_view_host = frame_tree->CreateRenderViewHost( | 1651 render_view_host = frame_tree->CreateRenderViewHost( |
| 1655 site_instance, view_routing_id, frame_routing_id, swapped_out, hidden); | 1652 site_instance, view_routing_id, frame_routing_id, swapped_out, hidden); |
| 1656 } else { | 1653 } else { |
| 1657 render_view_host = frame_tree->GetRenderViewHost(site_instance); | 1654 render_view_host = frame_tree->GetRenderViewHost(site_instance); |
| 1658 CHECK(render_view_host); | 1655 CHECK(render_view_host); |
| 1659 } | 1656 } |
| 1660 | 1657 |
| 1661 return RenderFrameHostFactory::Create( | 1658 return RenderFrameHostFactory::Create( |
| 1662 site_instance, render_view_host, render_frame_delegate_, | 1659 site_instance, render_view_host, render_frame_delegate_, |
| 1663 render_widget_delegate_, frame_tree, frame_tree_node_, frame_routing_id, | 1660 render_widget_delegate_, frame_tree, frame_tree_node_, frame_routing_id, |
| 1664 widget_routing_id, surface_id, flags); | 1661 widget_routing_id, flags); |
| 1665 } | 1662 } |
| 1666 | 1663 |
| 1667 // PlzNavigate | 1664 // PlzNavigate |
| 1668 bool RenderFrameHostManager::CreateSpeculativeRenderFrameHost( | 1665 bool RenderFrameHostManager::CreateSpeculativeRenderFrameHost( |
| 1669 const GURL& url, | 1666 const GURL& url, |
| 1670 SiteInstance* old_instance, | 1667 SiteInstance* old_instance, |
| 1671 SiteInstance* new_instance, | 1668 SiteInstance* new_instance, |
| 1672 int bindings) { | 1669 int bindings) { |
| 1673 CHECK(new_instance); | 1670 CHECK(new_instance); |
| 1674 CHECK_NE(old_instance, new_instance); | 1671 CHECK_NE(old_instance, new_instance); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1748 | 1745 |
| 1749 // If we are reusing the RenderViewHost and it doesn't already have a | 1746 // If we are reusing the RenderViewHost and it doesn't already have a |
| 1750 // RenderWidgetHostView, we need to create one if this is the main frame. | 1747 // RenderWidgetHostView, we need to create one if this is the main frame. |
| 1751 if (!render_view_host->GetView() && frame_tree_node_->IsMainFrame()) | 1748 if (!render_view_host->GetView() && frame_tree_node_->IsMainFrame()) |
| 1752 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host); | 1749 delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host); |
| 1753 } | 1750 } |
| 1754 } else { | 1751 } else { |
| 1755 // Create a new RenderFrameHost if we don't find an existing one. | 1752 // Create a new RenderFrameHost if we don't find an existing one. |
| 1756 | 1753 |
| 1757 int32 widget_routing_id = MSG_ROUTING_NONE; | 1754 int32 widget_routing_id = MSG_ROUTING_NONE; |
| 1758 int32 surface_id = 0; | |
| 1759 // A RenderFrame in a different process from its parent RenderFrame | 1755 // A RenderFrame in a different process from its parent RenderFrame |
| 1760 // requires a RenderWidget for input/layout/painting. | 1756 // requires a RenderWidget for input/layout/painting. |
| 1761 if (frame_tree_node_->parent() && | 1757 if (frame_tree_node_->parent() && |
| 1762 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() != | 1758 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() != |
| 1763 instance) { | 1759 instance) { |
| 1764 CHECK(SiteIsolationPolicy::AreCrossProcessFramesPossible()); | 1760 CHECK(SiteIsolationPolicy::AreCrossProcessFramesPossible()); |
| 1765 widget_routing_id = instance->GetProcess()->GetNextRoutingID(); | 1761 widget_routing_id = instance->GetProcess()->GetNextRoutingID(); |
| 1766 surface_id = GpuSurfaceTracker::Get()->AddSurfaceForRenderer( | |
| 1767 instance->GetProcess()->GetID(), widget_routing_id); | |
| 1768 } | 1762 } |
| 1769 | 1763 |
| 1770 new_render_frame_host = | 1764 new_render_frame_host = CreateRenderFrameHost( |
| 1771 CreateRenderFrameHost(instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, | 1765 instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, widget_routing_id, flags); |
| 1772 widget_routing_id, surface_id, flags); | |
| 1773 RenderViewHostImpl* render_view_host = | 1766 RenderViewHostImpl* render_view_host = |
| 1774 new_render_frame_host->render_view_host(); | 1767 new_render_frame_host->render_view_host(); |
| 1775 int proxy_routing_id = MSG_ROUTING_NONE; | 1768 int proxy_routing_id = MSG_ROUTING_NONE; |
| 1776 | 1769 |
| 1777 // Prevent the process from exiting while we're trying to navigate in it. | 1770 // Prevent the process from exiting while we're trying to navigate in it. |
| 1778 // Otherwise, if the new RFH is swapped out already, store it. | 1771 // Otherwise, if the new RFH is swapped out already, store it. |
| 1779 if (!swapped_out) { | 1772 if (!swapped_out) { |
| 1780 new_render_frame_host->GetProcess()->AddPendingView(); | 1773 new_render_frame_host->GetProcess()->AddPendingView(); |
| 1781 } else { | 1774 } else { |
| 1782 proxy = new RenderFrameProxyHost( | 1775 proxy = new RenderFrameProxyHost( |
| (...skipping 816 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2599 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) { | 2592 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) { |
| 2600 if (!frame_tree_node_->opener()) | 2593 if (!frame_tree_node_->opener()) |
| 2601 return MSG_ROUTING_NONE; | 2594 return MSG_ROUTING_NONE; |
| 2602 | 2595 |
| 2603 return frame_tree_node_->opener() | 2596 return frame_tree_node_->opener() |
| 2604 ->render_manager() | 2597 ->render_manager() |
| 2605 ->GetRoutingIdForSiteInstance(instance); | 2598 ->GetRoutingIdForSiteInstance(instance); |
| 2606 } | 2599 } |
| 2607 | 2600 |
| 2608 } // namespace content | 2601 } // namespace content |
| OLD | NEW |