Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(329)

Side by Side Diff: content/browser/web_contents/web_contents_impl.cc

Issue 972313002: Make <webview> use out-of-process iframe architecture. (Closed) Base URL: ssh://saopaulo.wat/mnt/dev/shared/src@testoopif2z-better-chrome
Patch Set: some review comments addressed Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698