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

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

Issue 1457203002: Make WebContentsImpl aware of all of its RWHs. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix RW destruction by Shutdown Created 5 years, 1 month 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 410 matching lines...) Expand 10 before | Expand all | Expand 10 after
421 421
422 // Delete all RFH pending shutdown, which will lead the corresponding RVH to 422 // Delete all RFH pending shutdown, which will lead the corresponding RVH to
423 // shutdown and be deleted as well. 423 // shutdown and be deleted as well.
424 frame_tree_.ForEach( 424 frame_tree_.ForEach(
425 base::Bind(&RenderFrameHostManager::ClearRFHsPendingShutdown)); 425 base::Bind(&RenderFrameHostManager::ClearRFHsPendingShutdown));
426 426
427 ClearAllPowerSaveBlockers(); 427 ClearAllPowerSaveBlockers();
428 428
429 for (std::set<RenderWidgetHostImpl*>::iterator iter = 429 for (std::set<RenderWidgetHostImpl*>::iterator iter =
430 created_widgets_.begin(); iter != created_widgets_.end(); ++iter) { 430 created_widgets_.begin(); iter != created_widgets_.end(); ++iter) {
431 (*iter)->DetachDelegate(); 431 (*iter)->DetachDelegate();
lazyboy 2015/11/20 23:52:05 not sure if this is an issue, but: Technically the
Charlie Reis 2015/11/21 01:19:19 I don't follow your concern here. DetachDelegate
lazyboy 2015/11/21 02:22:59 Sorry for not being precise, this is just a hypoth
432 } 432 }
433 created_widgets_.clear(); 433 created_widgets_.clear();
434 434
435 // Clear out any JavaScript state. 435 // Clear out any JavaScript state.
436 if (dialog_manager_) 436 if (dialog_manager_)
437 dialog_manager_->ResetDialogState(this); 437 dialog_manager_->ResetDialogState(this);
438 438
439 if (color_chooser_info_.get()) 439 if (color_chooser_info_.get())
440 color_chooser_info_->chooser->End(); 440 color_chooser_info_->chooser->End();
441 441
(...skipping 844 matching lines...) Expand 10 before | Expand all | Expand 10 after
1286 observers_, 1286 observers_,
1287 DidCloneToNewWebContents(this, tc)); 1287 DidCloneToNewWebContents(this, tc));
1288 return tc; 1288 return tc;
1289 } 1289 }
1290 1290
1291 void WebContentsImpl::Observe(int type, 1291 void WebContentsImpl::Observe(int type,
1292 const NotificationSource& source, 1292 const NotificationSource& source,
1293 const NotificationDetails& details) { 1293 const NotificationDetails& details) {
1294 switch (type) { 1294 switch (type) {
1295 case NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED: { 1295 case NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED: {
1296 RenderWidgetHost* host = Source<RenderWidgetHost>(source).ptr(); 1296 RenderWidgetHostImpl* host = Source<RenderWidgetHostImpl>(source).ptr();
1297
1298 std::set<RenderWidgetHostImpl*>::iterator iter =
1299 created_widgets_.find(host);
1300 if (iter != created_widgets_.end())
1301 created_widgets_.erase(iter);
Charlie Reis 2015/11/20 18:41:41 Why is this part necessary? Won't we take care of
Avi (use Gerrit) 2015/11/20 19:06:30 Side comment: Why do you check to see if the widge
lazyboy 2015/11/20 23:52:05 Thanks I've updated the relevant places. (Side eff
lazyboy 2015/11/20 23:52:05 Yes it would have, however there's a WCI::is_being
Charlie Reis 2015/11/21 01:19:19 Hmm, that CL didn't add any tests to prevent regre
lazyboy 2015/11/21 02:22:59 Yes, I've tried with and without flash fullscreen.
1302
1297 RenderWidgetHostView* view = host->GetView(); 1303 RenderWidgetHostView* view = host->GetView();
1298 if (view == GetFullscreenRenderWidgetHostView()) { 1304 if (view == GetFullscreenRenderWidgetHostView()) {
1299 // We cannot just call view_->RestoreFocus() here. On some platforms, 1305 // We cannot just call view_->RestoreFocus() here. On some platforms,
1300 // attempting to focus the currently-invisible WebContentsView will be 1306 // attempting to focus the currently-invisible WebContentsView will be
1301 // flat-out ignored. Therefore, this boolean is used to track whether 1307 // flat-out ignored. Therefore, this boolean is used to track whether
1302 // we will request focus after the fullscreen widget has been 1308 // we will request focus after the fullscreen widget has been
1303 // destroyed. 1309 // destroyed.
1304 fullscreen_widget_had_focus_at_shutdown_ = (view && view->HasFocus()); 1310 fullscreen_widget_had_focus_at_shutdown_ = (view && view->HasFocus());
1305 } else { 1311 } else {
1306 for (PendingWidgetViews::iterator i = pending_widget_views_.begin(); 1312 for (PendingWidgetViews::iterator i = pending_widget_views_.begin();
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
1481 } 1487 }
1482 1488
1483 void WebContentsImpl::LostCapture(RenderWidgetHostImpl* render_widget_host) { 1489 void WebContentsImpl::LostCapture(RenderWidgetHostImpl* render_widget_host) {
1484 if (!RenderViewHostImpl::From(render_widget_host)) 1490 if (!RenderViewHostImpl::From(render_widget_host))
1485 return; 1491 return;
1486 1492
1487 if (delegate_) 1493 if (delegate_)
1488 delegate_->LostCapture(); 1494 delegate_->LostCapture();
1489 } 1495 }
1490 1496
1497 void WebContentsImpl::RenderWidgetCreated(
1498 RenderWidgetHostImpl* render_widget_host) {
1499 std::set<RenderWidgetHostImpl*>::iterator iter =
1500 created_widgets_.find(render_widget_host);
Avi (use Gerrit) 2015/11/20 19:06:30 You totally can use "auto" here.
lazyboy 2015/11/20 23:52:05 Not required anymore.
1501 if (iter == created_widgets_.end())
1502 created_widgets_.insert(render_widget_host);
Avi (use Gerrit) 2015/11/20 19:06:30 Same thing; you should be able to blindly insert.
lazyboy 2015/11/20 23:52:05 Done.
1503 }
1504
1491 void WebContentsImpl::RenderWidgetDeleted( 1505 void WebContentsImpl::RenderWidgetDeleted(
1492 RenderWidgetHostImpl* render_widget_host) { 1506 RenderWidgetHostImpl* render_widget_host) {
1493 if (is_being_destroyed_) { 1507 if (is_being_destroyed_) {
1494 // |created_widgets_| might have been destroyed. 1508 // |created_widgets_| might have been destroyed.
1495 return; 1509 return;
1496 } 1510 }
1497 1511
1498 std::set<RenderWidgetHostImpl*>::iterator iter = 1512 std::set<RenderWidgetHostImpl*>::iterator iter =
1499 created_widgets_.find(render_widget_host); 1513 created_widgets_.find(render_widget_host);
1500 if (iter != created_widgets_.end()) 1514 if (iter != created_widgets_.end())
1501 created_widgets_.erase(iter); 1515 created_widgets_.erase(iter);
Avi (use Gerrit) 2015/11/20 19:06:30 ... same here, though it's not your code.
lazyboy 2015/11/20 23:52:05 Done.
1502 1516
1503 if (render_widget_host && 1517 if (render_widget_host &&
1504 render_widget_host->GetRoutingID() == fullscreen_widget_routing_id_) { 1518 render_widget_host->GetRoutingID() == fullscreen_widget_routing_id_) {
1505 if (delegate_ && delegate_->EmbedsFullscreenWidget()) 1519 if (delegate_ && delegate_->EmbedsFullscreenWidget())
1506 delegate_->ExitFullscreenModeForTab(this); 1520 delegate_->ExitFullscreenModeForTab(this);
1507 FOR_EACH_OBSERVER(WebContentsObserver, 1521 FOR_EACH_OBSERVER(WebContentsObserver,
1508 observers_, 1522 observers_,
1509 DidDestroyFullscreenWidget( 1523 DidDestroyFullscreenWidget(
1510 fullscreen_widget_routing_id_)); 1524 fullscreen_widget_routing_id_));
1511 fullscreen_widget_routing_id_ = MSG_ROUTING_NONE; 1525 fullscreen_widget_routing_id_ = MSG_ROUTING_NONE;
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
1901 if (process_handle != base::kNullProcessHandle) { 1915 if (process_handle != base::kNullProcessHandle) {
1902 RecordAction( 1916 RecordAction(
1903 base::UserMetricsAction("Terminate_ProcessMismatch_CreateNewWidget")); 1917 base::UserMetricsAction("Terminate_ProcessMismatch_CreateNewWidget"));
1904 rph->Shutdown(RESULT_CODE_KILLED, false); 1918 rph->Shutdown(RESULT_CODE_KILLED, false);
1905 } 1919 }
1906 return; 1920 return;
1907 } 1921 }
1908 1922
1909 RenderWidgetHostImpl* widget_host = 1923 RenderWidgetHostImpl* widget_host =
1910 new RenderWidgetHostImpl(this, process, route_id, IsHidden()); 1924 new RenderWidgetHostImpl(this, process, route_id, IsHidden());
1911 created_widgets_.insert(widget_host);
1912 1925
1913 RenderWidgetHostViewBase* widget_view = 1926 RenderWidgetHostViewBase* widget_view =
1914 static_cast<RenderWidgetHostViewBase*>( 1927 static_cast<RenderWidgetHostViewBase*>(
1915 view_->CreateViewForPopupWidget(widget_host)); 1928 view_->CreateViewForPopupWidget(widget_host));
1916 if (!widget_view) 1929 if (!widget_view)
1917 return; 1930 return;
1918 if (!is_fullscreen) { 1931 if (!is_fullscreen) {
1919 // Popups should not get activated. 1932 // Popups should not get activated.
1920 widget_view->SetPopupType(popup_type); 1933 widget_view->SetPopupType(popup_type);
1921 } 1934 }
(...skipping 2852 matching lines...) Expand 10 before | Expand all | Expand 10 after
4774 return NULL; 4787 return NULL;
4775 } 4788 }
4776 4789
4777 void WebContentsImpl::SetForceDisableOverscrollContent(bool force_disable) { 4790 void WebContentsImpl::SetForceDisableOverscrollContent(bool force_disable) {
4778 force_disable_overscroll_content_ = force_disable; 4791 force_disable_overscroll_content_ = force_disable;
4779 if (view_) 4792 if (view_)
4780 view_->SetOverscrollControllerEnabled(CanOverscrollContent()); 4793 view_->SetOverscrollControllerEnabled(CanOverscrollContent());
4781 } 4794 }
4782 4795
4783 } // namespace content 4796 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698