Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/web_contents/web_contents_impl.h" | 5 #include "content/browser/web_contents/web_contents_impl.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/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
| (...skipping 1190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1201 params.main_frame_routing_id == MSG_ROUTING_NONE) || | 1201 params.main_frame_routing_id == MSG_ROUTING_NONE) || |
| 1202 (params.routing_id != MSG_ROUTING_NONE && | 1202 (params.routing_id != MSG_ROUTING_NONE && |
| 1203 params.main_frame_routing_id != MSG_ROUTING_NONE)); | 1203 params.main_frame_routing_id != MSG_ROUTING_NONE)); |
| 1204 GetRenderManager()->Init( | 1204 GetRenderManager()->Init( |
| 1205 params.browser_context, params.site_instance, params.routing_id, | 1205 params.browser_context, params.site_instance, params.routing_id, |
| 1206 params.main_frame_routing_id); | 1206 params.main_frame_routing_id); |
| 1207 | 1207 |
| 1208 WebContentsViewDelegate* delegate = | 1208 WebContentsViewDelegate* delegate = |
| 1209 GetContentClient()->browser()->GetWebContentsViewDelegate(this); | 1209 GetContentClient()->browser()->GetWebContentsViewDelegate(this); |
| 1210 | 1210 |
| 1211 if (browser_plugin_guest_) { | 1211 // if (browser_plugin_guest_) { |
| 1212 scoped_ptr<WebContentsView> platform_view(CreateWebContentsView( | 1212 // scoped_ptr<WebContentsView> platform_view(CreateWebContentsView( |
| 1213 this, delegate, &render_view_host_delegate_view_)); | 1213 // this, delegate, &render_view_host_delegate_view_)); |
| 1214 | 1214 // |
| 1215 WebContentsViewGuest* rv = new WebContentsViewGuest( | 1215 // WebContentsViewGuest* rv = new WebContentsViewGuest( |
| 1216 this, browser_plugin_guest_.get(), platform_view.Pass(), | 1216 // this, browser_plugin_guest_.get(), platform_view.Pass(), |
| 1217 render_view_host_delegate_view_); | 1217 // render_view_host_delegate_view_); |
| 1218 render_view_host_delegate_view_ = rv; | 1218 // render_view_host_delegate_view_ = rv; |
| 1219 view_.reset(rv); | 1219 // view_.reset(rv); |
| 1220 } else { | 1220 // } else { |
| 1221 // Regular WebContentsView. | 1221 // Regular WebContentsView. |
| 1222 view_.reset(CreateWebContentsView( | 1222 view_.reset(CreateWebContentsView( |
| 1223 this, delegate, &render_view_host_delegate_view_)); | 1223 this, delegate, &render_view_host_delegate_view_)); |
| 1224 } | 1224 // } |
| 1225 CHECK(render_view_host_delegate_view_); | 1225 CHECK(render_view_host_delegate_view_); |
| 1226 CHECK(view_.get()); | 1226 CHECK(view_.get()); |
| 1227 | 1227 |
| 1228 gfx::Size initial_size = params.initial_size; | 1228 gfx::Size initial_size = params.initial_size; |
| 1229 view_->CreateView(initial_size, params.context); | 1229 view_->CreateView(initial_size, params.context); |
| 1230 | 1230 |
| 1231 // Listen for whether our opener gets destroyed. | 1231 // Listen for whether our opener gets destroyed. |
| 1232 if (opener_) | 1232 if (opener_) |
| 1233 AddDestructionObserver(opener_); | 1233 AddDestructionObserver(opener_); |
| 1234 | 1234 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1267 } | 1267 } |
| 1268 | 1268 |
| 1269 // Ensure that observers are notified of the creation of this WebContents's | 1269 // Ensure that observers are notified of the creation of this WebContents's |
| 1270 // main RenderFrameHost. It must be done here for main frames, since the | 1270 // main RenderFrameHost. It must be done here for main frames, since the |
| 1271 // NotifySwappedFromRenderManager expects view_ to already be created and that | 1271 // NotifySwappedFromRenderManager expects view_ to already be created and that |
| 1272 // happens after RenderFrameHostManager::Init. | 1272 // happens after RenderFrameHostManager::Init. |
| 1273 NotifySwappedFromRenderManager( | 1273 NotifySwappedFromRenderManager( |
| 1274 nullptr, GetRenderManager()->current_frame_host(), true); | 1274 nullptr, GetRenderManager()->current_frame_host(), true); |
| 1275 } | 1275 } |
| 1276 | 1276 |
| 1277 int WebContentsImpl::AttachLocalFrameToGuest(WebContents* embedder_web_contents, | |
| 1278 int embedder_frame_routing_id) { | |
| 1279 // 1. Create a link to our parent WebContents. | |
| 1280 node_.set_parent_web_contents( | |
| 1281 static_cast<WebContentsImpl*>(embedder_web_contents)); | |
| 1282 | |
| 1283 // 2. Create a swapped out RVH and a proxy in our render manager, pointing | |
| 1284 // to embedder site instance. The swapped out RVH will be used to send | |
| 1285 // postMessage to guest. | |
| 1286 int swapped_out_render_view_routing_id = MSG_ROUTING_NONE; | |
| 1287 int proxy_to_embedder_routing_id = GetRenderManager()->CreateEmbedderProxy( | |
| 1288 embedder_web_contents->GetSiteInstance(), | |
|
Charlie Reis
2015/04/08 23:42:11
What if the embedder WebContents has the <webview>
lazyboy
2015/04/14 01:38:03
Done.
| |
| 1289 &swapped_out_render_view_routing_id); | |
| 1290 | |
| 1291 // 3. Swap the embedder's initial frame pointing to guest with the proxy | |
| 1292 // we've created above. | |
| 1293 // The proxy has a CPFC and it uses the swapped out RV as its RenderWidget, | |
| 1294 // which gives us input and rendering. | |
| 1295 RenderFrameHostImpl* embedder_frame = | |
| 1296 RenderFrameHostImpl::FromID( | |
| 1297 embedder_web_contents->GetRenderProcessHost()->GetID(), | |
|
Charlie Reis
2015/04/08 23:42:11
Same. We have to pass in the process ID, because
lazyboy
2015/04/14 01:38:04
Done.
| |
| 1298 embedder_frame_routing_id); | |
| 1299 DCHECK(embedder_frame); | |
| 1300 embedder_frame->frame_tree_node()->render_manager() | |
| 1301 ->ReplaceWithGuestProxy(proxy_to_embedder_routing_id); | |
| 1302 | |
| 1303 // The swapped out render view routing ID will be used to send | |
| 1304 // postMessage. | |
| 1305 return swapped_out_render_view_routing_id; | |
| 1306 } | |
| 1307 | |
| 1277 void WebContentsImpl::OnWebContentsDestroyed(WebContentsImpl* web_contents) { | 1308 void WebContentsImpl::OnWebContentsDestroyed(WebContentsImpl* web_contents) { |
| 1278 RemoveDestructionObserver(web_contents); | 1309 RemoveDestructionObserver(web_contents); |
| 1279 | 1310 |
| 1280 // Clear the opener if it has been closed. | 1311 // Clear the opener if it has been closed. |
| 1281 if (web_contents == opener_) { | 1312 if (web_contents == opener_) { |
| 1282 opener_ = NULL; | 1313 opener_ = NULL; |
| 1283 return; | 1314 return; |
| 1284 } | 1315 } |
| 1285 // Clear a pending contents that has been closed before being shown. | 1316 // Clear a pending contents that has been closed before being shown. |
| 1286 for (PendingContents::iterator iter = pending_contents_.begin(); | 1317 for (PendingContents::iterator iter = pending_contents_.begin(); |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1524 if (delegate_) | 1555 if (delegate_) |
| 1525 delegate_->LostMouseLock(); | 1556 delegate_->LostMouseLock(); |
| 1526 } | 1557 } |
| 1527 | 1558 |
| 1528 void WebContentsImpl::CreateNewWindow( | 1559 void WebContentsImpl::CreateNewWindow( |
| 1529 int render_process_id, | 1560 int render_process_id, |
| 1530 int route_id, | 1561 int route_id, |
| 1531 int main_frame_route_id, | 1562 int main_frame_route_id, |
| 1532 const ViewHostMsg_CreateWindow_Params& params, | 1563 const ViewHostMsg_CreateWindow_Params& params, |
| 1533 SessionStorageNamespace* session_storage_namespace) { | 1564 SessionStorageNamespace* session_storage_namespace) { |
| 1565 // TODO(lazyboy): CreateNewWindow doesn't work for <webview> yet. | |
| 1566 DCHECK(0); | |
| 1534 // We usually create the new window in the same BrowsingInstance (group of | 1567 // We usually create the new window in the same BrowsingInstance (group of |
| 1535 // script-related windows), by passing in the current SiteInstance. However, | 1568 // script-related windows), by passing in the current SiteInstance. However, |
| 1536 // if the opener is being suppressed (in a non-guest), we create a new | 1569 // if the opener is being suppressed (in a non-guest), we create a new |
| 1537 // SiteInstance in its own BrowsingInstance. | 1570 // SiteInstance in its own BrowsingInstance. |
| 1538 bool is_guest = BrowserPluginGuest::IsGuest(this); | 1571 bool is_guest = BrowserPluginGuest::IsGuest(this); |
| 1539 | 1572 |
| 1540 // If the opener is to be suppressed, the new window can be in any process. | 1573 // If the opener is to be suppressed, the new window can be in any process. |
| 1541 // Since routing ids are process specific, we must not have one passed in | 1574 // Since routing ids are process specific, we must not have one passed in |
| 1542 // as argument here. | 1575 // as argument here. |
| 1543 DCHECK(!params.opener_suppressed || route_id == MSG_ROUTING_NONE); | 1576 DCHECK(!params.opener_suppressed || route_id == MSG_ROUTING_NONE); |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1744 | 1777 |
| 1745 void WebContentsImpl::ShowCreatedWidget(int route_id, | 1778 void WebContentsImpl::ShowCreatedWidget(int route_id, |
| 1746 bool is_fullscreen, | 1779 bool is_fullscreen, |
| 1747 const gfx::Rect& initial_rect) { | 1780 const gfx::Rect& initial_rect) { |
| 1748 RenderWidgetHostViewBase* widget_host_view = | 1781 RenderWidgetHostViewBase* widget_host_view = |
| 1749 static_cast<RenderWidgetHostViewBase*>(GetCreatedWidget(route_id)); | 1782 static_cast<RenderWidgetHostViewBase*>(GetCreatedWidget(route_id)); |
| 1750 if (!widget_host_view) | 1783 if (!widget_host_view) |
| 1751 return; | 1784 return; |
| 1752 | 1785 |
| 1753 RenderWidgetHostView* view = NULL; | 1786 RenderWidgetHostView* view = NULL; |
| 1754 BrowserPluginGuest* guest = GetBrowserPluginGuest(); | 1787 // BrowserPluginGuest* guest = GetBrowserPluginGuest(); |
| 1755 if (guest && guest->embedder_web_contents()) { | 1788 // if (guest && guest->embedder_web_contents()) { |
| 1756 view = guest->embedder_web_contents()->GetRenderWidgetHostView(); | 1789 // view = guest->embedder_web_contents()->GetRenderWidgetHostView(); |
| 1757 } else { | 1790 // } else { |
| 1758 view = GetRenderWidgetHostView(); | 1791 view = GetRenderWidgetHostView(); |
| 1759 } | 1792 // } |
| 1760 | 1793 |
| 1761 if (is_fullscreen) { | 1794 if (is_fullscreen) { |
| 1762 DCHECK_EQ(MSG_ROUTING_NONE, fullscreen_widget_routing_id_); | 1795 DCHECK_EQ(MSG_ROUTING_NONE, fullscreen_widget_routing_id_); |
| 1763 view_->StoreFocus(); | 1796 view_->StoreFocus(); |
| 1764 fullscreen_widget_routing_id_ = route_id; | 1797 fullscreen_widget_routing_id_ = route_id; |
| 1765 if (delegate_ && delegate_->EmbedsFullscreenWidget()) { | 1798 if (delegate_ && delegate_->EmbedsFullscreenWidget()) { |
| 1766 widget_host_view->InitAsChild(GetRenderWidgetHostView()->GetNativeView()); | 1799 widget_host_view->InitAsChild(GetRenderWidgetHostView()->GetNativeView()); |
| 1767 delegate_->EnterFullscreenModeForTab(this, GURL()); | 1800 delegate_->EnterFullscreenModeForTab(this, GURL()); |
| 1768 } else { | 1801 } else { |
| 1769 widget_host_view->InitAsFullscreen(view); | 1802 widget_host_view->InitAsFullscreen(view); |
| (...skipping 2554 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4324 int proxy_routing_id, | 4357 int proxy_routing_id, |
| 4325 bool for_main_frame_navigation) { | 4358 bool for_main_frame_navigation) { |
| 4326 TRACE_EVENT0("browser,navigation", | 4359 TRACE_EVENT0("browser,navigation", |
| 4327 "WebContentsImpl::CreateRenderViewForRenderManager"); | 4360 "WebContentsImpl::CreateRenderViewForRenderManager"); |
| 4328 // Can be NULL during tests. | 4361 // Can be NULL during tests. |
| 4329 RenderWidgetHostViewBase* rwh_view; | 4362 RenderWidgetHostViewBase* rwh_view; |
| 4330 // TODO(kenrb): RenderWidgetHostViewChildFrame special casing is temporary | 4363 // TODO(kenrb): RenderWidgetHostViewChildFrame special casing is temporary |
| 4331 // until RenderWidgetHost is attached to RenderFrameHost. We need to special | 4364 // until RenderWidgetHost is attached to RenderFrameHost. We need to special |
| 4332 // case this because RWH is still a base class of RenderViewHost, and child | 4365 // case this because RWH is still a base class of RenderViewHost, and child |
| 4333 // frame RWHVs are unique in that they do not have their own WebContents. | 4366 // frame RWHVs are unique in that they do not have their own WebContents. |
| 4334 if (!for_main_frame_navigation) { | 4367 bool is_guest = !!browser_plugin_guest_.get(); |
| 4368 if (!for_main_frame_navigation || is_guest) { | |
| 4335 RenderWidgetHostViewChildFrame* rwh_view_child = | 4369 RenderWidgetHostViewChildFrame* rwh_view_child = |
| 4336 new RenderWidgetHostViewChildFrame(render_view_host); | 4370 new RenderWidgetHostViewChildFrame(render_view_host); |
| 4337 rwh_view = rwh_view_child; | 4371 rwh_view = rwh_view_child; |
| 4338 } else { | 4372 } else { |
| 4339 rwh_view = view_->CreateViewForWidget(render_view_host, false); | 4373 rwh_view = view_->CreateViewForWidget(render_view_host, false); |
| 4340 } | 4374 } |
| 4341 | 4375 |
| 4342 // Now that the RenderView has been created, we need to tell it its size. | 4376 // Now that the RenderView has been created, we need to tell it its size. |
| 4343 if (rwh_view) | 4377 if (rwh_view) |
| 4344 rwh_view->SetSize(GetSizeForNewRenderView()); | 4378 rwh_view->SetSize(GetSizeForNewRenderView()); |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4466 last_reported_encoding_ = encoding; | 4500 last_reported_encoding_ = encoding; |
| 4467 | 4501 |
| 4468 canonical_encoding_ = GetContentClient()->browser()-> | 4502 canonical_encoding_ = GetContentClient()->browser()-> |
| 4469 GetCanonicalEncodingNameByAliasName(encoding); | 4503 GetCanonicalEncodingNameByAliasName(encoding); |
| 4470 } | 4504 } |
| 4471 | 4505 |
| 4472 bool WebContentsImpl::IsHidden() { | 4506 bool WebContentsImpl::IsHidden() { |
| 4473 return capturer_count_ == 0 && !should_normally_be_visible_; | 4507 return capturer_count_ == 0 && !should_normally_be_visible_; |
| 4474 } | 4508 } |
| 4475 | 4509 |
| 4510 int64 WebContentsImpl::GetParentFrameTreeNodeID() { | |
| 4511 if (node_.parent_web_contents()) { | |
| 4512 return node_.parent_web_contents()->GetFrameTree()->root() | |
| 4513 ->frame_tree_node_id(); | |
| 4514 } | |
| 4515 return -1; | |
| 4516 } | |
| 4517 | |
| 4476 RenderFrameHostManager* WebContentsImpl::GetRenderManager() const { | 4518 RenderFrameHostManager* WebContentsImpl::GetRenderManager() const { |
| 4477 return frame_tree_.root()->render_manager(); | 4519 return frame_tree_.root()->render_manager(); |
| 4478 } | 4520 } |
| 4479 | 4521 |
| 4480 RenderViewHostImpl* WebContentsImpl::GetRenderViewHostImpl() { | 4522 RenderViewHostImpl* WebContentsImpl::GetRenderViewHostImpl() { |
| 4481 return static_cast<RenderViewHostImpl*>(GetRenderViewHost()); | 4523 return static_cast<RenderViewHostImpl*>(GetRenderViewHost()); |
| 4482 } | 4524 } |
| 4483 | 4525 |
| 4484 BrowserPluginGuest* WebContentsImpl::GetBrowserPluginGuest() const { | 4526 BrowserPluginGuest* WebContentsImpl::GetBrowserPluginGuest() const { |
| 4485 return browser_plugin_guest_.get(); | 4527 return browser_plugin_guest_.get(); |
| 4486 } | 4528 } |
| 4487 | 4529 |
| 4488 void WebContentsImpl::SetBrowserPluginGuest(BrowserPluginGuest* guest) { | 4530 void WebContentsImpl::SetBrowserPluginGuest(BrowserPluginGuest* guest) { |
| 4489 CHECK(!browser_plugin_guest_); | 4531 CHECK(!browser_plugin_guest_); |
| 4532 CHECK(guest); | |
| 4490 browser_plugin_guest_.reset(guest); | 4533 browser_plugin_guest_.reset(guest); |
| 4491 } | 4534 } |
| 4492 | 4535 |
| 4493 BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() const { | 4536 BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() const { |
| 4494 return browser_plugin_embedder_.get(); | 4537 return browser_plugin_embedder_.get(); |
| 4495 } | 4538 } |
| 4496 | 4539 |
| 4497 void WebContentsImpl::CreateBrowserPluginEmbedderIfNecessary() { | 4540 void WebContentsImpl::CreateBrowserPluginEmbedderIfNecessary() { |
| 4498 if (browser_plugin_embedder_) | 4541 if (browser_plugin_embedder_) |
| 4499 return; | 4542 return; |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4586 node->render_manager()->ResumeResponseDeferredAtStart(); | 4629 node->render_manager()->ResumeResponseDeferredAtStart(); |
| 4587 } | 4630 } |
| 4588 | 4631 |
| 4589 void WebContentsImpl::SetForceDisableOverscrollContent(bool force_disable) { | 4632 void WebContentsImpl::SetForceDisableOverscrollContent(bool force_disable) { |
| 4590 force_disable_overscroll_content_ = force_disable; | 4633 force_disable_overscroll_content_ = force_disable; |
| 4591 if (view_) | 4634 if (view_) |
| 4592 view_->SetOverscrollControllerEnabled(CanOverscrollContent()); | 4635 view_->SetOverscrollControllerEnabled(CanOverscrollContent()); |
| 4593 } | 4636 } |
| 4594 | 4637 |
| 4595 } // namespace content | 4638 } // namespace content |
| OLD | NEW |