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

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: Make <webview> work without --site-per-process as well Created 5 years, 7 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 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 int identifier) 279 int identifier)
280 : render_process_id(render_process_id), 280 : render_process_id(render_process_id),
281 render_frame_id(render_frame_id), 281 render_frame_id(render_frame_id),
282 chooser(chooser), 282 chooser(chooser),
283 identifier(identifier) { 283 identifier(identifier) {
284 } 284 }
285 285
286 WebContentsImpl::ColorChooserInfo::~ColorChooserInfo() { 286 WebContentsImpl::ColorChooserInfo::~ColorChooserInfo() {
287 } 287 }
288 288
289 // WebContentsImpl::WebContentsNode --------------------------------------------
290 WebContentsImpl::WebContentsNode::WebContentsNode()
291 : parent_web_contents_(NULL) {
Charlie Reis 2015/04/30 23:06:46 nullptr
lazyboy 2015/05/05 07:28:14 Done.
292 }
293
294 WebContentsImpl::WebContentsNode::~WebContentsNode() {
Charlie Reis 2015/04/30 23:06:47 Is there any way for us to enforce that a child We
lazyboy 2015/05/05 07:28:14 Should we keep vector<WebContents*> children_ insi
295 }
296
289 // WebContentsImpl ------------------------------------------------------------- 297 // WebContentsImpl -------------------------------------------------------------
290 298
291 WebContentsImpl::WebContentsImpl(BrowserContext* browser_context, 299 WebContentsImpl::WebContentsImpl(BrowserContext* browser_context,
292 WebContentsImpl* opener) 300 WebContentsImpl* opener)
293 : delegate_(NULL), 301 : delegate_(NULL),
294 controller_(this, browser_context), 302 controller_(this, browser_context),
295 render_view_host_delegate_view_(NULL), 303 render_view_host_delegate_view_(NULL),
296 opener_(opener), 304 opener_(opener),
297 created_with_opener_(!!opener), 305 created_with_opener_(!!opener),
298 #if defined(OS_WIN) 306 #if defined(OS_WIN)
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
612 const GURL& WebContentsImpl::GetLastCommittedURL() const { 620 const GURL& WebContentsImpl::GetLastCommittedURL() const {
613 // We may not have a navigation entry yet. 621 // We may not have a navigation entry yet.
614 NavigationEntry* entry = controller_.GetLastCommittedEntry(); 622 NavigationEntry* entry = controller_.GetLastCommittedEntry();
615 return entry ? entry->GetVirtualURL() : GURL::EmptyGURL(); 623 return entry ? entry->GetVirtualURL() : GURL::EmptyGURL();
616 } 624 }
617 625
618 WebContentsDelegate* WebContentsImpl::GetDelegate() { 626 WebContentsDelegate* WebContentsImpl::GetDelegate() {
619 return delegate_; 627 return delegate_;
620 } 628 }
621 629
630 int WebContentsImpl::AttachLocalFrameToGuest(WebContents* embedder_web_contents,
631 int embedder_frame_process_id,
632 int embedder_frame_routing_id) {
633 DCHECK(base::CommandLine::ForCurrentProcess()->HasSwitch(
Charlie Reis 2015/04/30 23:06:46 CHECK
lazyboy 2015/05/05 07:28:14 Done.
634 switches::kSitePerProcess));
635 // 1. Create a link to our parent WebContents.
636 node_.set_parent_web_contents(
637 static_cast<WebContentsImpl*>(embedder_web_contents));
638
639 RenderFrameHostImpl* embedder_frame =
640 RenderFrameHostImpl::FromID(embedder_frame_process_id,
641 embedder_frame_routing_id);
642 DCHECK(embedder_frame);
643
644 // 2. Create a swapped out RVH and a proxy in our render manager, pointing
645 // to embedder site instance. The swapped out RVH will be used to send
Charlie Reis 2015/04/30 23:06:47 the embedder's SiteInstance.
lazyboy 2015/05/05 07:28:14 Done.
646 // postMessage to guest.
Charlie Reis 2015/04/30 23:06:46 Alex pointed out that postMessage doesn't go throu
lazyboy 2015/05/05 07:28:14 I've changed the CL to use <iframe>.contentWindow
647 int swapped_out_render_view_routing_id = MSG_ROUTING_NONE;
648 int proxy_to_embedder_routing_id = MSG_ROUTING_NONE;
649 GetRenderManager()->CreateEmbedderProxy(
650 embedder_frame->GetSiteInstance(),
651 &swapped_out_render_view_routing_id,
652 &proxy_to_embedder_routing_id);
653
654 // 3. Swap the embedder's initial frame pointing to guest with the proxy
Charlie Reis 2015/04/30 23:06:47 initial frame for the guest
lazyboy 2015/05/05 07:28:14 Done.
655 // we've created above.
656 // The proxy has a CPFC and it uses the swapped out RV as its RenderWidget,
657 // which gives us input and rendering.
658 embedder_frame->frame_tree_node()->render_manager()
659 ->ReplaceWithGuestProxy(proxy_to_embedder_routing_id);
660
661 // The swapped out render view routing ID will be used to send
662 // postMessage.
663 return swapped_out_render_view_routing_id;
Charlie Reis 2015/04/30 23:06:46 Is this needed, given that postMessage should go t
lazyboy 2015/05/05 07:28:14 Not anymore. this function returns void now.
664 }
665
622 void WebContentsImpl::SetDelegate(WebContentsDelegate* delegate) { 666 void WebContentsImpl::SetDelegate(WebContentsDelegate* delegate) {
623 // TODO(cbentzel): remove this debugging code? 667 // TODO(cbentzel): remove this debugging code?
624 if (delegate == delegate_) 668 if (delegate == delegate_)
625 return; 669 return;
626 if (delegate_) 670 if (delegate_)
627 delegate_->Detach(this); 671 delegate_->Detach(this);
628 delegate_ = delegate; 672 delegate_ = delegate;
629 if (delegate_) { 673 if (delegate_) {
630 delegate_->Attach(this); 674 delegate_->Attach(this);
631 // Ensure the visible RVH reflects the new delegate's preferences. 675 // Ensure the visible RVH reflects the new delegate's preferences.
(...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after
1197 params.main_frame_routing_id == MSG_ROUTING_NONE) || 1241 params.main_frame_routing_id == MSG_ROUTING_NONE) ||
1198 (params.routing_id != MSG_ROUTING_NONE && 1242 (params.routing_id != MSG_ROUTING_NONE &&
1199 params.main_frame_routing_id != MSG_ROUTING_NONE)); 1243 params.main_frame_routing_id != MSG_ROUTING_NONE));
1200 GetRenderManager()->Init( 1244 GetRenderManager()->Init(
1201 params.browser_context, params.site_instance, params.routing_id, 1245 params.browser_context, params.site_instance, params.routing_id,
1202 params.main_frame_routing_id); 1246 params.main_frame_routing_id);
1203 1247
1204 WebContentsViewDelegate* delegate = 1248 WebContentsViewDelegate* delegate =
1205 GetContentClient()->browser()->GetWebContentsViewDelegate(this); 1249 GetContentClient()->browser()->GetWebContentsViewDelegate(this);
1206 1250
1207 if (browser_plugin_guest_) { 1251 if (browser_plugin_guest_ &&
1252 !base::CommandLine::ForCurrentProcess()->HasSwitch(
1253 switches::kSitePerProcess)) {
1208 scoped_ptr<WebContentsView> platform_view(CreateWebContentsView( 1254 scoped_ptr<WebContentsView> platform_view(CreateWebContentsView(
1209 this, delegate, &render_view_host_delegate_view_)); 1255 this, delegate, &render_view_host_delegate_view_));
1210 1256
1211 WebContentsViewGuest* rv = new WebContentsViewGuest( 1257 WebContentsViewGuest* rv = new WebContentsViewGuest(
1212 this, browser_plugin_guest_.get(), platform_view.Pass(), 1258 this, browser_plugin_guest_.get(), platform_view.Pass(),
1213 render_view_host_delegate_view_); 1259 render_view_host_delegate_view_);
1214 render_view_host_delegate_view_ = rv; 1260 render_view_host_delegate_view_ = rv;
1215 view_.reset(rv); 1261 view_.reset(rv);
1216 } else { 1262 } else {
1217 // Regular WebContentsView. 1263 // Regular WebContentsView.
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
1500 if (delegate_) 1546 if (delegate_)
1501 delegate_->LostMouseLock(); 1547 delegate_->LostMouseLock();
1502 } 1548 }
1503 1549
1504 void WebContentsImpl::CreateNewWindow( 1550 void WebContentsImpl::CreateNewWindow(
1505 int render_process_id, 1551 int render_process_id,
1506 int route_id, 1552 int route_id,
1507 int main_frame_route_id, 1553 int main_frame_route_id,
1508 const ViewHostMsg_CreateWindow_Params& params, 1554 const ViewHostMsg_CreateWindow_Params& params,
1509 SessionStorageNamespace* session_storage_namespace) { 1555 SessionStorageNamespace* session_storage_namespace) {
1556 // TODO(lazyboy): CreateNewWindow doesn't work for <webview> yet.
1557 DCHECK(0);
Charlie Reis 2015/04/30 23:06:47 This needs updating to work in non-site-per-proces
lazyboy 2015/05/05 07:28:14 This doesn't break until we use new window from <w
1510 // We usually create the new window in the same BrowsingInstance (group of 1558 // We usually create the new window in the same BrowsingInstance (group of
1511 // script-related windows), by passing in the current SiteInstance. However, 1559 // script-related windows), by passing in the current SiteInstance. However,
1512 // if the opener is being suppressed (in a non-guest), we create a new 1560 // if the opener is being suppressed (in a non-guest), we create a new
1513 // SiteInstance in its own BrowsingInstance. 1561 // SiteInstance in its own BrowsingInstance.
1514 bool is_guest = BrowserPluginGuest::IsGuest(this); 1562 bool is_guest = BrowserPluginGuest::IsGuest(this);
1515 1563
1516 // If the opener is to be suppressed, the new window can be in any process. 1564 // If the opener is to be suppressed, the new window can be in any process.
1517 // Since routing ids are process specific, we must not have one passed in 1565 // Since routing ids are process specific, we must not have one passed in
1518 // as argument here. 1566 // as argument here.
1519 DCHECK(!params.opener_suppressed || route_id == MSG_ROUTING_NONE); 1567 DCHECK(!params.opener_suppressed || route_id == MSG_ROUTING_NONE);
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
1721 void WebContentsImpl::ShowCreatedWidget(int route_id, 1769 void WebContentsImpl::ShowCreatedWidget(int route_id,
1722 bool is_fullscreen, 1770 bool is_fullscreen,
1723 const gfx::Rect& initial_rect) { 1771 const gfx::Rect& initial_rect) {
1724 RenderWidgetHostViewBase* widget_host_view = 1772 RenderWidgetHostViewBase* widget_host_view =
1725 static_cast<RenderWidgetHostViewBase*>(GetCreatedWidget(route_id)); 1773 static_cast<RenderWidgetHostViewBase*>(GetCreatedWidget(route_id));
1726 if (!widget_host_view) 1774 if (!widget_host_view)
1727 return; 1775 return;
1728 1776
1729 RenderWidgetHostView* view = NULL; 1777 RenderWidgetHostView* view = NULL;
1730 BrowserPluginGuest* guest = GetBrowserPluginGuest(); 1778 BrowserPluginGuest* guest = GetBrowserPluginGuest();
1731 if (guest && guest->embedder_web_contents()) { 1779 if (guest && guest->embedder_web_contents() &&
1780 base::CommandLine::ForCurrentProcess()->HasSwitch(
1781 switches::kSitePerProcess)) {
1732 view = guest->embedder_web_contents()->GetRenderWidgetHostView(); 1782 view = guest->embedder_web_contents()->GetRenderWidgetHostView();
1733 } else { 1783 } else {
1734 view = GetRenderWidgetHostView(); 1784 view = GetRenderWidgetHostView();
1735 } 1785 }
1736 1786
1737 if (is_fullscreen) { 1787 if (is_fullscreen) {
1738 DCHECK_EQ(MSG_ROUTING_NONE, fullscreen_widget_routing_id_); 1788 DCHECK_EQ(MSG_ROUTING_NONE, fullscreen_widget_routing_id_);
1739 view_->StoreFocus(); 1789 view_->StoreFocus();
1740 fullscreen_widget_routing_id_ = route_id; 1790 fullscreen_widget_routing_id_ = route_id;
1741 if (delegate_ && delegate_->EmbedsFullscreenWidget()) { 1791 if (delegate_ && delegate_->EmbedsFullscreenWidget()) {
(...skipping 2422 matching lines...) Expand 10 before | Expand all | Expand 10 after
4164 int proxy_routing_id, 4214 int proxy_routing_id,
4165 bool for_main_frame_navigation) { 4215 bool for_main_frame_navigation) {
4166 TRACE_EVENT0("browser,navigation", 4216 TRACE_EVENT0("browser,navigation",
4167 "WebContentsImpl::CreateRenderViewForRenderManager"); 4217 "WebContentsImpl::CreateRenderViewForRenderManager");
4168 // Can be NULL during tests. 4218 // Can be NULL during tests.
4169 RenderWidgetHostViewBase* rwh_view; 4219 RenderWidgetHostViewBase* rwh_view;
4170 // TODO(kenrb): RenderWidgetHostViewChildFrame special casing is temporary 4220 // TODO(kenrb): RenderWidgetHostViewChildFrame special casing is temporary
4171 // until RenderWidgetHost is attached to RenderFrameHost. We need to special 4221 // until RenderWidgetHost is attached to RenderFrameHost. We need to special
4172 // case this because RWH is still a base class of RenderViewHost, and child 4222 // case this because RWH is still a base class of RenderViewHost, and child
4173 // frame RWHVs are unique in that they do not have their own WebContents. 4223 // frame RWHVs are unique in that they do not have their own WebContents.
4174 if (!for_main_frame_navigation) { 4224 bool is_guest_in_site_per_process = !!browser_plugin_guest_.get() &&
4225 base::CommandLine::ForCurrentProcess()->HasSwitch(
4226 switches::kSitePerProcess);
4227 if (!for_main_frame_navigation || is_guest_in_site_per_process) {
Charlie Reis 2015/04/30 23:06:46 Sounds like you might not need this if you don't p
lazyboy 2015/05/05 07:28:14 Not passing CREATE_RF_FOR_MAIN_FRAME_NAVIGATION st
4175 RenderWidgetHostViewChildFrame* rwh_view_child = 4228 RenderWidgetHostViewChildFrame* rwh_view_child =
4176 new RenderWidgetHostViewChildFrame(render_view_host); 4229 new RenderWidgetHostViewChildFrame(render_view_host);
4177 rwh_view = rwh_view_child; 4230 rwh_view = rwh_view_child;
4231 if (is_guest_in_site_per_process)
4232 GetRenderManager()->UpdateGuestRWHView(rwh_view_child);
4178 } else { 4233 } else {
4179 rwh_view = view_->CreateViewForWidget(render_view_host, false); 4234 rwh_view = view_->CreateViewForWidget(render_view_host, false);
4180 } 4235 }
4181 4236
4182 // Now that the RenderView has been created, we need to tell it its size. 4237 // Now that the RenderView has been created, we need to tell it its size.
4183 if (rwh_view) 4238 if (rwh_view)
4184 rwh_view->SetSize(GetSizeForNewRenderView()); 4239 rwh_view->SetSize(GetSizeForNewRenderView());
4185 4240
4186 // Make sure we use the correct starting page_id in the new RenderView. 4241 // Make sure we use the correct starting page_id in the new RenderView.
4187 UpdateMaxPageIDIfNecessary(render_view_host); 4242 UpdateMaxPageIDIfNecessary(render_view_host);
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
4306 last_reported_encoding_ = encoding; 4361 last_reported_encoding_ = encoding;
4307 4362
4308 canonical_encoding_ = GetContentClient()->browser()-> 4363 canonical_encoding_ = GetContentClient()->browser()->
4309 GetCanonicalEncodingNameByAliasName(encoding); 4364 GetCanonicalEncodingNameByAliasName(encoding);
4310 } 4365 }
4311 4366
4312 bool WebContentsImpl::IsHidden() { 4367 bool WebContentsImpl::IsHidden() {
4313 return capturer_count_ == 0 && !should_normally_be_visible_; 4368 return capturer_count_ == 0 && !should_normally_be_visible_;
4314 } 4369 }
4315 4370
4371 int64 WebContentsImpl::GetEmbedderFrameTreeNodeID() {
4372 if (node_.parent_web_contents()) {
4373 return node_.parent_web_contents()->GetFrameTree()->root()
4374 ->frame_tree_node_id();
4375 }
4376 return -1;
4377 }
4378
4316 RenderFrameHostManager* WebContentsImpl::GetRenderManager() const { 4379 RenderFrameHostManager* WebContentsImpl::GetRenderManager() const {
4317 return frame_tree_.root()->render_manager(); 4380 return frame_tree_.root()->render_manager();
4318 } 4381 }
4319 4382
4320 BrowserPluginGuest* WebContentsImpl::GetBrowserPluginGuest() const { 4383 BrowserPluginGuest* WebContentsImpl::GetBrowserPluginGuest() const {
4321 return browser_plugin_guest_.get(); 4384 return browser_plugin_guest_.get();
4322 } 4385 }
4323 4386
4324 void WebContentsImpl::SetBrowserPluginGuest(BrowserPluginGuest* guest) { 4387 void WebContentsImpl::SetBrowserPluginGuest(BrowserPluginGuest* guest) {
4325 CHECK(!browser_plugin_guest_); 4388 CHECK(!browser_plugin_guest_);
4389 CHECK(guest);
4326 browser_plugin_guest_.reset(guest); 4390 browser_plugin_guest_.reset(guest);
4327 } 4391 }
4328 4392
4329 BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() const { 4393 BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() const {
4330 return browser_plugin_embedder_.get(); 4394 return browser_plugin_embedder_.get();
4331 } 4395 }
4332 4396
4333 void WebContentsImpl::CreateBrowserPluginEmbedderIfNecessary() { 4397 void WebContentsImpl::CreateBrowserPluginEmbedderIfNecessary() {
4334 if (browser_plugin_embedder_) 4398 if (browser_plugin_embedder_)
4335 return; 4399 return;
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
4422 node->render_manager()->ResumeResponseDeferredAtStart(); 4486 node->render_manager()->ResumeResponseDeferredAtStart();
4423 } 4487 }
4424 4488
4425 void WebContentsImpl::SetForceDisableOverscrollContent(bool force_disable) { 4489 void WebContentsImpl::SetForceDisableOverscrollContent(bool force_disable) {
4426 force_disable_overscroll_content_ = force_disable; 4490 force_disable_overscroll_content_ = force_disable;
4427 if (view_) 4491 if (view_)
4428 view_->SetOverscrollControllerEnabled(CanOverscrollContent()); 4492 view_->SetOverscrollControllerEnabled(CanOverscrollContent());
4429 } 4493 }
4430 4494
4431 } // namespace content 4495 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698