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

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: add basic postMessage test 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::WebContentsTreeNode ----------------------------------------
290 WebContentsImpl::WebContentsTreeNode::WebContentsTreeNode()
291 : parent_web_contents_(nullptr) {
292 }
293
294 WebContentsImpl::WebContentsTreeNode::~WebContentsTreeNode() {
295 // TODO(lazyboy): Enforce that a child WebContentsTreeNode gets deleted
296 // before its parent. Otherwise the child could have a stale pointer to its
297 // parent WebContents, risking a use-after-free.
298 }
299
289 // WebContentsImpl ------------------------------------------------------------- 300 // WebContentsImpl -------------------------------------------------------------
290 301
291 WebContentsImpl::WebContentsImpl(BrowserContext* browser_context, 302 WebContentsImpl::WebContentsImpl(BrowserContext* browser_context,
292 WebContentsImpl* opener) 303 WebContentsImpl* opener)
293 : delegate_(NULL), 304 : delegate_(NULL),
294 controller_(this, browser_context), 305 controller_(this, browser_context),
295 render_view_host_delegate_view_(NULL), 306 render_view_host_delegate_view_(NULL),
296 opener_(opener), 307 opener_(opener),
297 created_with_opener_(!!opener), 308 created_with_opener_(!!opener),
298 #if defined(OS_WIN) 309 #if defined(OS_WIN)
(...skipping 831 matching lines...) Expand 10 before | Expand all | Expand 10 after
1130 bool WebContentsImpl::NeedToFireBeforeUnload() { 1141 bool WebContentsImpl::NeedToFireBeforeUnload() {
1131 // TODO(creis): Should we fire even for interstitial pages? 1142 // TODO(creis): Should we fire even for interstitial pages?
1132 return WillNotifyDisconnection() && !ShowingInterstitialPage() && 1143 return WillNotifyDisconnection() && !ShowingInterstitialPage() &&
1133 !GetRenderViewHost()->SuddenTerminationAllowed(); 1144 !GetRenderViewHost()->SuddenTerminationAllowed();
1134 } 1145 }
1135 1146
1136 void WebContentsImpl::DispatchBeforeUnload(bool for_cross_site_transition) { 1147 void WebContentsImpl::DispatchBeforeUnload(bool for_cross_site_transition) {
1137 GetMainFrame()->DispatchBeforeUnload(for_cross_site_transition); 1148 GetMainFrame()->DispatchBeforeUnload(for_cross_site_transition);
1138 } 1149 }
1139 1150
1151 void WebContentsImpl::AttachToEmbedderFrame(WebContents* embedder_web_contents,
1152 RenderFrameHost* embedder_frame) {
1153 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch(
1154 switches::kSitePerProcess));
1155 // Create a link to our parent WebContents.
1156 node_.set_parent_web_contents(
1157 static_cast<WebContentsImpl*>(embedder_web_contents));
1158
1159 DCHECK(embedder_frame);
1160
1161 // Create a swapped out RVH and a proxy in our render manager, pointing
1162 // to the embedder's SiteInstance. The swapped out RVH will be used to send
1163 // postMessage to guest.
1164 int proxy_to_embedder_routing_id = GetRenderManager()->CreateEmbedderProxy(
1165 embedder_frame->GetSiteInstance());
1166
1167 // Swap the embedder's initial frame for the guest with the proxy
1168 // we've created above.
1169 // The proxy has a CPFC and it uses the swapped out RV as its RenderWidget,
1170 // which gives us input and rendering.
1171 static_cast<RenderFrameHostImpl*>(embedder_frame)
1172 ->frame_tree_node()
1173 ->render_manager()
1174 ->ReplaceWithGuestProxy(proxy_to_embedder_routing_id);
1175 }
1176
1140 void WebContentsImpl::Stop() { 1177 void WebContentsImpl::Stop() {
1141 GetRenderManager()->Stop(); 1178 GetRenderManager()->Stop();
1142 FOR_EACH_OBSERVER(WebContentsObserver, observers_, NavigationStopped()); 1179 FOR_EACH_OBSERVER(WebContentsObserver, observers_, NavigationStopped());
1143 } 1180 }
1144 1181
1145 WebContents* WebContentsImpl::Clone() { 1182 WebContents* WebContentsImpl::Clone() {
1146 // We use our current SiteInstance since the cloned entry will use it anyway. 1183 // We use our current SiteInstance since the cloned entry will use it anyway.
1147 // We pass our own opener so that the cloned page can access it if it was 1184 // We pass our own opener so that the cloned page can access it if it was
1148 // before. 1185 // before.
1149 CreateParams create_params(GetBrowserContext(), GetSiteInstance()); 1186 CreateParams create_params(GetBrowserContext(), GetSiteInstance());
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1202 (params.routing_id != MSG_ROUTING_NONE && 1239 (params.routing_id != MSG_ROUTING_NONE &&
1203 params.main_frame_routing_id != MSG_ROUTING_NONE)); 1240 params.main_frame_routing_id != MSG_ROUTING_NONE));
1204 GetRenderManager()->Init( 1241 GetRenderManager()->Init(
1205 params.browser_context, params.site_instance, params.routing_id, 1242 params.browser_context, params.site_instance, params.routing_id,
1206 params.main_frame_routing_id); 1243 params.main_frame_routing_id);
1207 frame_tree_.root()->SetFrameName(params.main_frame_name); 1244 frame_tree_.root()->SetFrameName(params.main_frame_name);
1208 1245
1209 WebContentsViewDelegate* delegate = 1246 WebContentsViewDelegate* delegate =
1210 GetContentClient()->browser()->GetWebContentsViewDelegate(this); 1247 GetContentClient()->browser()->GetWebContentsViewDelegate(this);
1211 1248
1212 if (browser_plugin_guest_) { 1249 if (browser_plugin_guest_ &&
1250 !base::CommandLine::ForCurrentProcess()->HasSwitch(
1251 switches::kSitePerProcess)) {
1213 scoped_ptr<WebContentsView> platform_view(CreateWebContentsView( 1252 scoped_ptr<WebContentsView> platform_view(CreateWebContentsView(
1214 this, delegate, &render_view_host_delegate_view_)); 1253 this, delegate, &render_view_host_delegate_view_));
1215 1254
1216 WebContentsViewGuest* rv = new WebContentsViewGuest( 1255 WebContentsViewGuest* rv = new WebContentsViewGuest(
1217 this, browser_plugin_guest_.get(), platform_view.Pass(), 1256 this, browser_plugin_guest_.get(), platform_view.Pass(),
1218 render_view_host_delegate_view_); 1257 render_view_host_delegate_view_);
1219 render_view_host_delegate_view_ = rv; 1258 render_view_host_delegate_view_ = rv;
1220 view_.reset(rv); 1259 view_.reset(rv);
1221 } else { 1260 } else {
1222 // Regular WebContentsView. 1261 // Regular WebContentsView.
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
1511 int route_id, 1550 int route_id,
1512 int main_frame_route_id, 1551 int main_frame_route_id,
1513 const ViewHostMsg_CreateWindow_Params& params, 1552 const ViewHostMsg_CreateWindow_Params& params,
1514 SessionStorageNamespace* session_storage_namespace) { 1553 SessionStorageNamespace* session_storage_namespace) {
1515 // We usually create the new window in the same BrowsingInstance (group of 1554 // We usually create the new window in the same BrowsingInstance (group of
1516 // script-related windows), by passing in the current SiteInstance. However, 1555 // script-related windows), by passing in the current SiteInstance. However,
1517 // if the opener is being suppressed (in a non-guest), we create a new 1556 // if the opener is being suppressed (in a non-guest), we create a new
1518 // SiteInstance in its own BrowsingInstance. 1557 // SiteInstance in its own BrowsingInstance.
1519 bool is_guest = BrowserPluginGuest::IsGuest(this); 1558 bool is_guest = BrowserPluginGuest::IsGuest(this);
1520 1559
1560 if (is_guest &&
1561 base::CommandLine::ForCurrentProcess()->HasSwitch(
1562 switches::kSitePerProcess)) {
1563 // TODO(lazyboy): CreateNewWindow doesn't work for <webview> yet.
Charlie Reis 2015/05/19 07:12:31 for OOPIF-based <webview> yet
lazyboy 2015/05/21 23:23:47 Done.
1564 NOTREACHED();
1565 }
1566
1521 // If the opener is to be suppressed, the new window can be in any process. 1567 // If the opener is to be suppressed, the new window can be in any process.
1522 // Since routing ids are process specific, we must not have one passed in 1568 // Since routing ids are process specific, we must not have one passed in
1523 // as argument here. 1569 // as argument here.
1524 DCHECK(!params.opener_suppressed || route_id == MSG_ROUTING_NONE); 1570 DCHECK(!params.opener_suppressed || route_id == MSG_ROUTING_NONE);
1525 1571
1526 scoped_refptr<SiteInstance> site_instance = 1572 scoped_refptr<SiteInstance> site_instance =
1527 params.opener_suppressed && !is_guest ? 1573 params.opener_suppressed && !is_guest ?
1528 SiteInstance::CreateForURL(GetBrowserContext(), params.target_url) : 1574 SiteInstance::CreateForURL(GetBrowserContext(), params.target_url) :
1529 GetSiteInstance(); 1575 GetSiteInstance();
1530 1576
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
1730 void WebContentsImpl::ShowCreatedWidget(int route_id, 1776 void WebContentsImpl::ShowCreatedWidget(int route_id,
1731 bool is_fullscreen, 1777 bool is_fullscreen,
1732 const gfx::Rect& initial_rect) { 1778 const gfx::Rect& initial_rect) {
1733 RenderWidgetHostViewBase* widget_host_view = 1779 RenderWidgetHostViewBase* widget_host_view =
1734 static_cast<RenderWidgetHostViewBase*>(GetCreatedWidget(route_id)); 1780 static_cast<RenderWidgetHostViewBase*>(GetCreatedWidget(route_id));
1735 if (!widget_host_view) 1781 if (!widget_host_view)
1736 return; 1782 return;
1737 1783
1738 RenderWidgetHostView* view = NULL; 1784 RenderWidgetHostView* view = NULL;
1739 BrowserPluginGuest* guest = GetBrowserPluginGuest(); 1785 BrowserPluginGuest* guest = GetBrowserPluginGuest();
1740 if (guest && guest->embedder_web_contents()) { 1786 if (guest && guest->embedder_web_contents() &&
1787 base::CommandLine::ForCurrentProcess()->HasSwitch(
1788 switches::kSitePerProcess)) {
1741 view = guest->embedder_web_contents()->GetRenderWidgetHostView(); 1789 view = guest->embedder_web_contents()->GetRenderWidgetHostView();
1742 } else { 1790 } else {
1743 view = GetRenderWidgetHostView(); 1791 view = GetRenderWidgetHostView();
1744 } 1792 }
1745 1793
1746 if (is_fullscreen) { 1794 if (is_fullscreen) {
1747 DCHECK_EQ(MSG_ROUTING_NONE, fullscreen_widget_routing_id_); 1795 DCHECK_EQ(MSG_ROUTING_NONE, fullscreen_widget_routing_id_);
1748 view_->StoreFocus(); 1796 view_->StoreFocus();
1749 fullscreen_widget_routing_id_ = route_id; 1797 fullscreen_widget_routing_id_ = route_id;
1750 if (delegate_ && delegate_->EmbedsFullscreenWidget()) { 1798 if (delegate_ && delegate_->EmbedsFullscreenWidget()) {
(...skipping 2412 matching lines...) Expand 10 before | Expand all | Expand 10 after
4163 int proxy_routing_id, 4211 int proxy_routing_id,
4164 bool for_main_frame_navigation) { 4212 bool for_main_frame_navigation) {
4165 TRACE_EVENT0("browser,navigation", 4213 TRACE_EVENT0("browser,navigation",
4166 "WebContentsImpl::CreateRenderViewForRenderManager"); 4214 "WebContentsImpl::CreateRenderViewForRenderManager");
4167 // Can be NULL during tests. 4215 // Can be NULL during tests.
4168 RenderWidgetHostViewBase* rwh_view; 4216 RenderWidgetHostViewBase* rwh_view;
4169 // TODO(kenrb): RenderWidgetHostViewChildFrame special casing is temporary 4217 // TODO(kenrb): RenderWidgetHostViewChildFrame special casing is temporary
4170 // until RenderWidgetHost is attached to RenderFrameHost. We need to special 4218 // until RenderWidgetHost is attached to RenderFrameHost. We need to special
4171 // case this because RWH is still a base class of RenderViewHost, and child 4219 // case this because RWH is still a base class of RenderViewHost, and child
4172 // frame RWHVs are unique in that they do not have their own WebContents. 4220 // frame RWHVs are unique in that they do not have their own WebContents.
4173 if (!for_main_frame_navigation) { 4221 bool is_guest_in_site_per_process =
4222 !!browser_plugin_guest_.get() &&
4223 base::CommandLine::ForCurrentProcess()->HasSwitch(
4224 switches::kSitePerProcess);
4225 if (!for_main_frame_navigation || is_guest_in_site_per_process) {
4174 RenderWidgetHostViewChildFrame* rwh_view_child = 4226 RenderWidgetHostViewChildFrame* rwh_view_child =
4175 new RenderWidgetHostViewChildFrame(render_view_host); 4227 new RenderWidgetHostViewChildFrame(render_view_host);
4176 rwh_view = rwh_view_child; 4228 rwh_view = rwh_view_child;
4229 if (is_guest_in_site_per_process)
4230 GetRenderManager()->SetGuestRWHView(rwh_view_child);
4177 } else { 4231 } else {
4178 rwh_view = view_->CreateViewForWidget(render_view_host, false); 4232 rwh_view = view_->CreateViewForWidget(render_view_host, false);
4179 } 4233 }
4180 4234
4181 // Now that the RenderView has been created, we need to tell it its size. 4235 // Now that the RenderView has been created, we need to tell it its size.
4182 if (rwh_view) 4236 if (rwh_view)
4183 rwh_view->SetSize(GetSizeForNewRenderView()); 4237 rwh_view->SetSize(GetSizeForNewRenderView());
4184 4238
4185 // Make sure we use the correct starting page_id in the new RenderView. 4239 // Make sure we use the correct starting page_id in the new RenderView.
4186 UpdateMaxPageIDIfNecessary(render_view_host); 4240 UpdateMaxPageIDIfNecessary(render_view_host);
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
4307 last_reported_encoding_ = encoding; 4361 last_reported_encoding_ = encoding;
4308 4362
4309 canonical_encoding_ = GetContentClient()->browser()-> 4363 canonical_encoding_ = GetContentClient()->browser()->
4310 GetCanonicalEncodingNameByAliasName(encoding); 4364 GetCanonicalEncodingNameByAliasName(encoding);
4311 } 4365 }
4312 4366
4313 bool WebContentsImpl::IsHidden() { 4367 bool WebContentsImpl::IsHidden() {
4314 return capturer_count_ == 0 && !should_normally_be_visible_; 4368 return capturer_count_ == 0 && !should_normally_be_visible_;
4315 } 4369 }
4316 4370
4371 int64 WebContentsImpl::GetEmbedderFrameTreeNodeID() {
4372 if (node_.parent_web_contents()) {
4373 return node_.parent_web_contents()
4374 ->GetFrameTree()
4375 ->root()
4376 ->frame_tree_node_id();
4377 }
4378 return -1;
4379 }
4380
4317 RenderFrameHostManager* WebContentsImpl::GetRenderManager() const { 4381 RenderFrameHostManager* WebContentsImpl::GetRenderManager() const {
4318 return frame_tree_.root()->render_manager(); 4382 return frame_tree_.root()->render_manager();
4319 } 4383 }
4320 4384
4321 BrowserPluginGuest* WebContentsImpl::GetBrowserPluginGuest() const { 4385 BrowserPluginGuest* WebContentsImpl::GetBrowserPluginGuest() const {
4322 return browser_plugin_guest_.get(); 4386 return browser_plugin_guest_.get();
4323 } 4387 }
4324 4388
4325 void WebContentsImpl::SetBrowserPluginGuest(BrowserPluginGuest* guest) { 4389 void WebContentsImpl::SetBrowserPluginGuest(BrowserPluginGuest* guest) {
4326 CHECK(!browser_plugin_guest_); 4390 CHECK(!browser_plugin_guest_);
4391 CHECK(guest);
4327 browser_plugin_guest_.reset(guest); 4392 browser_plugin_guest_.reset(guest);
4328 } 4393 }
4329 4394
4330 BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() const { 4395 BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() const {
4331 return browser_plugin_embedder_.get(); 4396 return browser_plugin_embedder_.get();
4332 } 4397 }
4333 4398
4334 void WebContentsImpl::CreateBrowserPluginEmbedderIfNecessary() { 4399 void WebContentsImpl::CreateBrowserPluginEmbedderIfNecessary() {
4335 if (browser_plugin_embedder_) 4400 if (browser_plugin_embedder_)
4336 return; 4401 return;
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
4423 node->render_manager()->ResumeResponseDeferredAtStart(); 4488 node->render_manager()->ResumeResponseDeferredAtStart();
4424 } 4489 }
4425 4490
4426 void WebContentsImpl::SetForceDisableOverscrollContent(bool force_disable) { 4491 void WebContentsImpl::SetForceDisableOverscrollContent(bool force_disable) {
4427 force_disable_overscroll_content_ = force_disable; 4492 force_disable_overscroll_content_ = force_disable;
4428 if (view_) 4493 if (view_)
4429 view_->SetOverscrollControllerEnabled(CanOverscrollContent()); 4494 view_->SetOverscrollControllerEnabled(CanOverscrollContent());
4430 } 4495 }
4431 4496
4432 } // namespace content 4497 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698