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

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

Issue 10171018: Create swapped-out opener RVHs after a process swap. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove parameter comments. Created 8 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 | Annotate | Revision Log
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/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 BrowserContext* browser_context, 229 BrowserContext* browser_context,
230 SiteInstance* site_instance, 230 SiteInstance* site_instance,
231 int routing_id, 231 int routing_id,
232 const WebContents* base_web_contents, 232 const WebContents* base_web_contents,
233 SessionStorageNamespace* session_storage_namespace) { 233 SessionStorageNamespace* session_storage_namespace) {
234 return new WebContentsImpl( 234 return new WebContentsImpl(
235 browser_context, 235 browser_context,
236 site_instance, 236 site_instance,
237 routing_id, 237 routing_id,
238 static_cast<const WebContentsImpl*>(base_web_contents), 238 static_cast<const WebContentsImpl*>(base_web_contents),
239 NULL,
239 static_cast<SessionStorageNamespaceImpl*>(session_storage_namespace)); 240 static_cast<SessionStorageNamespaceImpl*>(session_storage_namespace));
240 } 241 }
241 } 242 }
242 243
243 // WebContentsImpl ------------------------------------------------------------- 244 // WebContentsImpl -------------------------------------------------------------
244 245
245 WebContentsImpl::WebContentsImpl( 246 WebContentsImpl::WebContentsImpl(
246 content::BrowserContext* browser_context, 247 content::BrowserContext* browser_context,
247 SiteInstance* site_instance, 248 SiteInstance* site_instance,
248 int routing_id, 249 int routing_id,
249 const WebContentsImpl* base_web_contents, 250 const WebContentsImpl* base_web_contents,
251 WebContentsImpl* opener,
250 SessionStorageNamespaceImpl* session_storage_namespace) 252 SessionStorageNamespaceImpl* session_storage_namespace)
251 : delegate_(NULL), 253 : delegate_(NULL),
252 ALLOW_THIS_IN_INITIALIZER_LIST(controller_( 254 ALLOW_THIS_IN_INITIALIZER_LIST(controller_(
253 this, browser_context, session_storage_namespace)), 255 this, browser_context, session_storage_namespace)),
256 opener_(opener),
254 ALLOW_THIS_IN_INITIALIZER_LIST(render_manager_(this, this)), 257 ALLOW_THIS_IN_INITIALIZER_LIST(render_manager_(this, this)),
255 is_loading_(false), 258 is_loading_(false),
256 crashed_status_(base::TERMINATION_STATUS_STILL_RUNNING), 259 crashed_status_(base::TERMINATION_STATUS_STILL_RUNNING),
257 crashed_error_code_(0), 260 crashed_error_code_(0),
258 waiting_for_response_(false), 261 waiting_for_response_(false),
259 load_state_(net::LOAD_STATE_IDLE, string16()), 262 load_state_(net::LOAD_STATE_IDLE, string16()),
260 upload_size_(0), 263 upload_size_(0),
261 upload_position_(0), 264 upload_position_(0),
262 displayed_insecure_content_(false), 265 displayed_insecure_content_(false),
263 capturing_contents_(false), 266 capturing_contents_(false),
264 is_being_destroyed_(false), 267 is_being_destroyed_(false),
265 notify_disconnection_(false), 268 notify_disconnection_(false),
266 dialog_creator_(NULL), 269 dialog_creator_(NULL),
267 #if defined(OS_WIN) 270 #if defined(OS_WIN)
268 message_box_active_(CreateEvent(NULL, TRUE, FALSE, NULL)), 271 message_box_active_(CreateEvent(NULL, TRUE, FALSE, NULL)),
269 #endif 272 #endif
270 is_showing_before_unload_dialog_(false), 273 is_showing_before_unload_dialog_(false),
271 opener_web_ui_type_(WebUI::kNoWebUI), 274 opener_web_ui_type_(WebUI::kNoWebUI),
272 closed_by_user_gesture_(false), 275 closed_by_user_gesture_(false),
273 minimum_zoom_percent_( 276 minimum_zoom_percent_(
274 static_cast<int>(content::kMinimumZoomFactor * 100)), 277 static_cast<int>(content::kMinimumZoomFactor * 100)),
275 maximum_zoom_percent_( 278 maximum_zoom_percent_(
276 static_cast<int>(content::kMaximumZoomFactor * 100)), 279 static_cast<int>(content::kMaximumZoomFactor * 100)),
277 temporary_zoom_settings_(false), 280 temporary_zoom_settings_(false),
278 content_restrictions_(0), 281 content_restrictions_(0),
279 view_type_(content::VIEW_TYPE_WEB_CONTENTS), 282 view_type_(content::VIEW_TYPE_WEB_CONTENTS),
280 has_opener_(false),
281 color_chooser_(NULL) { 283 color_chooser_(NULL) {
282 render_manager_.Init(browser_context, site_instance, routing_id); 284 render_manager_.Init(browser_context, site_instance, routing_id);
283 285
284 view_.reset(content::GetContentClient()->browser()-> 286 view_.reset(content::GetContentClient()->browser()->
285 OverrideCreateWebContentsView(this)); 287 OverrideCreateWebContentsView(this));
286 if (!view_.get()) { 288 if (!view_.get()) {
287 content::WebContentsViewDelegate* delegate = 289 content::WebContentsViewDelegate* delegate =
288 content::GetContentClient()->browser()->GetWebContentsViewDelegate( 290 content::GetContentClient()->browser()->GetWebContentsViewDelegate(
289 this); 291 this);
290 #if defined(USE_AURA) 292 #if defined(USE_AURA)
291 view_.reset(new WebContentsViewAura(this, delegate)); 293 view_.reset(new WebContentsViewAura(this, delegate));
292 #elif defined(OS_WIN) 294 #elif defined(OS_WIN)
293 view_.reset(new WebContentsViewWin(this, delegate)); 295 view_.reset(new WebContentsViewWin(this, delegate));
294 #elif defined(TOOLKIT_GTK) 296 #elif defined(TOOLKIT_GTK)
295 view_.reset(new content::WebContentsViewGtk(this, delegate)); 297 view_.reset(new content::WebContentsViewGtk(this, delegate));
296 #elif defined(OS_MACOSX) 298 #elif defined(OS_MACOSX)
297 view_.reset(web_contents_view_mac::CreateWebContentsView(this, delegate)); 299 view_.reset(web_contents_view_mac::CreateWebContentsView(this, delegate));
298 #elif defined(OS_ANDROID) 300 #elif defined(OS_ANDROID)
299 view_.reset(new WebContentsViewAndroid(this)); 301 view_.reset(new WebContentsViewAndroid(this));
300 #endif 302 #endif
301 (void)delegate; 303 (void)delegate;
302 } 304 }
303 CHECK(view_.get()); 305 CHECK(view_.get());
304 306
305 // We have the initial size of the view be based on the size of the view of 307 // We have the initial size of the view be based on the size of the view of
306 // the passed in WebContents. 308 // the passed in WebContents.
307 view_->CreateView(base_web_contents ? 309 view_->CreateView(base_web_contents ?
308 base_web_contents->GetView()->GetContainerSize() : gfx::Size()); 310 base_web_contents->GetView()->GetContainerSize() : gfx::Size());
309 311
312 // Listen for whether our opener gets destroyed.
313 if (opener_) {
314 registrar_.Add(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED,
315 content::Source<WebContents>(opener_));
316 }
317
310 #if defined(ENABLE_JAVA_BRIDGE) 318 #if defined(ENABLE_JAVA_BRIDGE)
311 java_bridge_dispatcher_host_manager_.reset( 319 java_bridge_dispatcher_host_manager_.reset(
312 new JavaBridgeDispatcherHostManager(this)); 320 new JavaBridgeDispatcherHostManager(this));
313 #endif 321 #endif
314 322
315 browser_plugin_web_contents_observer_.reset( 323 browser_plugin_web_contents_observer_.reset(
316 new content::BrowserPluginWebContentsObserver(this)); 324 new content::BrowserPluginWebContentsObserver(this));
317 } 325 }
318 326
319 WebContentsImpl::~WebContentsImpl() { 327 WebContentsImpl::~WebContentsImpl() {
(...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after
901 !static_cast<RenderViewHostImpl*>( 909 !static_cast<RenderViewHostImpl*>(
902 GetRenderViewHost())->SuddenTerminationAllowed(); 910 GetRenderViewHost())->SuddenTerminationAllowed();
903 } 911 }
904 912
905 void WebContentsImpl::Stop() { 913 void WebContentsImpl::Stop() {
906 render_manager_.Stop(); 914 render_manager_.Stop();
907 FOR_EACH_OBSERVER(WebContentsObserver, observers_, StopNavigation()); 915 FOR_EACH_OBSERVER(WebContentsObserver, observers_, StopNavigation());
908 } 916 }
909 917
910 WebContents* WebContentsImpl::Clone() { 918 WebContents* WebContentsImpl::Clone() {
911 // We create a new SiteInstance so that the new tab won't share processes 919 // We use our current SiteInstance since the cloned entry will use it anyway.
912 // with the old one. This can be changed in the future if we need it to share 920 // We pass |this| for the |base_web_contents| to size the view correctly, and
913 // processes for some reason. 921 // our own opener so that the cloned page can access it if it was before.
914 WebContentsImpl* tc = new WebContentsImpl( 922 WebContentsImpl* tc = new WebContentsImpl(
915 GetBrowserContext(), 923 GetBrowserContext(), GetSiteInstance(),
916 SiteInstance::Create(GetBrowserContext()), 924 MSG_ROUTING_NONE, this, opener_, NULL);
917 MSG_ROUTING_NONE, this, NULL);
918 tc->GetControllerImpl().CopyStateFrom(controller_); 925 tc->GetControllerImpl().CopyStateFrom(controller_);
919 return tc; 926 return tc;
920 } 927 }
921 928
922 void WebContentsImpl::AddNewContents(WebContents* new_contents, 929 void WebContentsImpl::AddNewContents(WebContents* new_contents,
923 WindowOpenDisposition disposition, 930 WindowOpenDisposition disposition,
924 const gfx::Rect& initial_pos, 931 const gfx::Rect& initial_pos,
925 bool user_gesture) { 932 bool user_gesture) {
926 if (!delegate_) 933 if (!delegate_)
927 return; 934 return;
(...skipping 11 matching lines...) Expand all
939 } 946 }
940 947
941 void WebContentsImpl::GetContainerBounds(gfx::Rect* out) const { 948 void WebContentsImpl::GetContainerBounds(gfx::Rect* out) const {
942 view_->GetContainerBounds(out); 949 view_->GetContainerBounds(out);
943 } 950 }
944 951
945 void WebContentsImpl::Focus() { 952 void WebContentsImpl::Focus() {
946 view_->Focus(); 953 view_->Focus();
947 } 954 }
948 955
956 void WebContentsImpl::Observe(int type,
957 const content::NotificationSource& source,
958 const content::NotificationDetails& details) {
959 switch (type) {
960 case content::NOTIFICATION_WEB_CONTENTS_DESTROYED:
961 OnWebContentsDestroyed(
962 content::Source<content::WebContents>(source).ptr());
963 break;
964 default:
965 NOTREACHED();
966 }
967 }
968
969 void WebContentsImpl::OnWebContentsDestroyed(WebContents* web_contents) {
970 // Clear the opener if it has been closed.
971 if (web_contents == opener_) {
972 registrar_.Remove(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED,
973 content::Source<WebContents>(opener_));
974 opener_ = NULL;
975 }
976 }
977
949 void WebContentsImpl::AddObserver(WebContentsObserver* observer) { 978 void WebContentsImpl::AddObserver(WebContentsObserver* observer) {
950 observers_.AddObserver(observer); 979 observers_.AddObserver(observer);
951 } 980 }
952 981
953 void WebContentsImpl::RemoveObserver(WebContentsObserver* observer) { 982 void WebContentsImpl::RemoveObserver(WebContentsObserver* observer) {
954 observers_.RemoveObserver(observer); 983 observers_.RemoveObserver(observer);
955 } 984 }
956 985
957 void WebContentsImpl::Activate() { 986 void WebContentsImpl::Activate() {
958 if (delegate_) 987 if (delegate_)
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after
1389 return render_manager_.pending_web_ui(); 1418 return render_manager_.pending_web_ui();
1390 return render_manager_.web_ui(); 1419 return render_manager_.web_ui();
1391 } 1420 }
1392 1421
1393 bool WebContentsImpl::GotResponseToLockMouseRequest(bool allowed) { 1422 bool WebContentsImpl::GotResponseToLockMouseRequest(bool allowed) {
1394 return GetRenderViewHost() ? 1423 return GetRenderViewHost() ?
1395 GetRenderViewHostImpl()->GotResponseToLockMouseRequest(allowed) : false; 1424 GetRenderViewHostImpl()->GotResponseToLockMouseRequest(allowed) : false;
1396 } 1425 }
1397 1426
1398 bool WebContentsImpl::HasOpener() const { 1427 bool WebContentsImpl::HasOpener() const {
1399 return has_opener_; 1428 return opener_ != NULL;
1400 } 1429 }
1401 1430
1402 void WebContentsImpl::DidChooseColorInColorChooser(int color_chooser_id, 1431 void WebContentsImpl::DidChooseColorInColorChooser(int color_chooser_id,
1403 SkColor color) { 1432 SkColor color) {
1404 GetRenderViewHost()->Send(new ViewMsg_DidChooseColorResponse( 1433 GetRenderViewHost()->Send(new ViewMsg_DidChooseColorResponse(
1405 GetRenderViewHost()->GetRoutingID(), color_chooser_id, color)); 1434 GetRenderViewHost()->GetRoutingID(), color_chooser_id, color));
1406 } 1435 }
1407 1436
1408 void WebContentsImpl::DidEndColorChooser(int color_chooser_id) { 1437 void WebContentsImpl::DidEndColorChooser(int color_chooser_id) {
1409 GetRenderViewHost()->Send(new ViewMsg_DidEndColorChooser( 1438 GetRenderViewHost()->Send(new ViewMsg_DidEndColorChooser(
(...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after
1981 return view_type_; 2010 return view_type_;
1982 } 2011 }
1983 2012
1984 gfx::Rect WebContentsImpl::GetRootWindowResizerRect() const { 2013 gfx::Rect WebContentsImpl::GetRootWindowResizerRect() const {
1985 if (delegate_) 2014 if (delegate_)
1986 return delegate_->GetRootWindowResizerRect(); 2015 return delegate_->GetRootWindowResizerRect();
1987 return gfx::Rect(); 2016 return gfx::Rect();
1988 } 2017 }
1989 2018
1990 void WebContentsImpl::RenderViewCreated(RenderViewHost* render_view_host) { 2019 void WebContentsImpl::RenderViewCreated(RenderViewHost* render_view_host) {
2020 // Don't send notifications if we are just creating a swapped-out RVH for
2021 // the opener chain. These won't be used for view-source or WebUI, so it's
2022 // ok to return early.
2023 if (static_cast<RenderViewHostImpl*>(render_view_host)->is_swapped_out())
2024 return;
2025
1991 content::NotificationService::current()->Notify( 2026 content::NotificationService::current()->Notify(
1992 content::NOTIFICATION_RENDER_VIEW_HOST_CREATED_FOR_TAB, 2027 content::NOTIFICATION_RENDER_VIEW_HOST_CREATED_FOR_TAB,
1993 content::Source<WebContents>(this), 2028 content::Source<WebContents>(this),
1994 content::Details<RenderViewHost>(render_view_host)); 2029 content::Details<RenderViewHost>(render_view_host));
1995 NavigationEntry* entry = controller_.GetActiveEntry(); 2030 NavigationEntry* entry = controller_.GetActiveEntry();
1996 if (!entry) 2031 if (!entry)
1997 return; 2032 return;
1998 2033
1999 // When we're creating views, we're still doing initial setup, so we always 2034 // When we're creating views, we're still doing initial setup, so we always
2000 // use the pending Web UI rather than any possibly existing committed one. 2035 // use the pending Web UI rather than any possibly existing committed one.
(...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after
2528 // later. In case of tab duplication this resizing to 0x0 prevents setting 2563 // later. In case of tab duplication this resizing to 0x0 prevents setting
2529 // normal size later so just ignore it. 2564 // normal size later so just ignore it.
2530 if (!size.IsEmpty()) 2565 if (!size.IsEmpty())
2531 view_->SizeContents(size); 2566 view_->SizeContents(size);
2532 } 2567 }
2533 2568
2534 void WebContentsImpl::NotifySwappedFromRenderManager() { 2569 void WebContentsImpl::NotifySwappedFromRenderManager() {
2535 NotifySwapped(); 2570 NotifySwapped();
2536 } 2571 }
2537 2572
2573 int WebContentsImpl::CreateOpenerRenderViewsForRenderManager(
2574 SiteInstance* instance) {
2575 if (!opener_)
2576 return MSG_ROUTING_NONE;
2577
2578 // Recursively create RenderViews for anything else in the opener chain.
2579 return opener_->CreateOpenerRenderViews(instance);
2580 }
2581
2582 int WebContentsImpl::CreateOpenerRenderViews(SiteInstance* instance) {
2583 int opener_route_id = MSG_ROUTING_NONE;
2584
2585 // If this tab has an opener, ensure it has a RenderView in the given
2586 // SiteInstance as well.
2587 if (opener_)
2588 opener_route_id = opener_->CreateOpenerRenderViews(instance);
2589
2590 // Create a swapped out RenderView in the given SiteInstance if none exists,
2591 // setting its opener to the given route_id. Return the new view's route_id.
2592 return render_manager_.CreateRenderView(instance, opener_route_id, true);
2593 }
2594
2538 NavigationControllerImpl& WebContentsImpl::GetControllerForRenderManager() { 2595 NavigationControllerImpl& WebContentsImpl::GetControllerForRenderManager() {
2539 return GetControllerImpl(); 2596 return GetControllerImpl();
2540 } 2597 }
2541 2598
2542 WebUIImpl* WebContentsImpl::CreateWebUIForRenderManager(const GURL& url) { 2599 WebUIImpl* WebContentsImpl::CreateWebUIForRenderManager(const GURL& url) {
2543 return static_cast<WebUIImpl*>(CreateWebUI(url)); 2600 return static_cast<WebUIImpl*>(CreateWebUI(url));
2544 } 2601 }
2545 2602
2546 NavigationEntry* 2603 NavigationEntry*
2547 WebContentsImpl::GetLastCommittedNavigationEntryForRenderManager() { 2604 WebContentsImpl::GetLastCommittedNavigationEntryForRenderManager() {
2548 return controller_.GetLastCommittedEntry(); 2605 return controller_.GetLastCommittedEntry();
2549 } 2606 }
2550 2607
2551 bool WebContentsImpl::CreateRenderViewForRenderManager( 2608 bool WebContentsImpl::CreateRenderViewForRenderManager(
2552 RenderViewHost* render_view_host) { 2609 RenderViewHost* render_view_host, int opener_route_id) {
2553 // Can be NULL during tests. 2610 // Can be NULL during tests.
2554 RenderWidgetHostView* rwh_view = view_->CreateViewForWidget(render_view_host); 2611 RenderWidgetHostView* rwh_view = view_->CreateViewForWidget(render_view_host);
2555 2612
2556 // Now that the RenderView has been created, we need to tell it its size. 2613 // Now that the RenderView has been created, we need to tell it its size.
2557 if (rwh_view) 2614 if (rwh_view)
2558 rwh_view->SetSize(view_->GetContainerSize()); 2615 rwh_view->SetSize(view_->GetContainerSize());
2559 2616
2560 // Make sure we use the correct starting page_id in the new RenderView. 2617 // Make sure we use the correct starting page_id in the new RenderView.
2561 UpdateMaxPageIDIfNecessary(render_view_host); 2618 UpdateMaxPageIDIfNecessary(render_view_host);
2562 int32 max_page_id = 2619 int32 max_page_id =
2563 GetMaxPageIDForSiteInstance(render_view_host->GetSiteInstance()); 2620 GetMaxPageIDForSiteInstance(render_view_host->GetSiteInstance());
2564 2621
2565 if (!static_cast<RenderViewHostImpl*>( 2622 if (!static_cast<RenderViewHostImpl*>(
2566 render_view_host)->CreateRenderView(string16(), max_page_id)) 2623 render_view_host)->CreateRenderView(string16(), opener_route_id,
2624 max_page_id)) {
2567 return false; 2625 return false;
2626 }
2568 2627
2569 #if defined(OS_LINUX) || defined(OS_OPENBSD) 2628 #if defined(OS_LINUX) || defined(OS_OPENBSD)
2570 // Force a ViewMsg_Resize to be sent, needed to make plugins show up on 2629 // Force a ViewMsg_Resize to be sent, needed to make plugins show up on
2571 // linux. See crbug.com/83941. 2630 // linux. See crbug.com/83941.
2572 if (rwh_view) { 2631 if (rwh_view) {
2573 if (RenderWidgetHost* render_widget_host = rwh_view->GetRenderWidgetHost()) 2632 if (RenderWidgetHost* render_widget_host = rwh_view->GetRenderWidgetHost())
2574 render_widget_host->WasResized(); 2633 render_widget_host->WasResized();
2575 } 2634 }
2576 #endif 2635 #endif
2577 2636
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
2626 void WebContentsImpl::CreateViewAndSetSizeForRVH(RenderViewHost* rvh) { 2685 void WebContentsImpl::CreateViewAndSetSizeForRVH(RenderViewHost* rvh) {
2627 RenderWidgetHostView* rwh_view = GetView()->CreateViewForWidget(rvh); 2686 RenderWidgetHostView* rwh_view = GetView()->CreateViewForWidget(rvh);
2628 // Can be NULL during tests. 2687 // Can be NULL during tests.
2629 if (rwh_view) 2688 if (rwh_view)
2630 rwh_view->SetSize(GetView()->GetContainerSize()); 2689 rwh_view->SetSize(GetView()->GetContainerSize());
2631 } 2690 }
2632 2691
2633 RenderViewHostImpl* WebContentsImpl::GetRenderViewHostImpl() { 2692 RenderViewHostImpl* WebContentsImpl::GetRenderViewHostImpl() {
2634 return static_cast<RenderViewHostImpl*>(GetRenderViewHost()); 2693 return static_cast<RenderViewHostImpl*>(GetRenderViewHost());
2635 } 2694 }
OLDNEW
« no previous file with comments | « content/browser/web_contents/web_contents_impl.h ('k') | content/browser/web_contents/web_contents_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698