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 |