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

Side by Side Diff: content/browser/renderer_host/render_widget_host_impl.cc

Issue 536063002: Clean up RenderWidgetHostView destruction (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Safer scheme Created 6 years, 3 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/renderer_host/render_widget_host_impl.h" 5 #include "content/browser/renderer_host/render_widget_host_impl.h"
6 6
7 #include <math.h> 7 #include <math.h>
8 #include <set> 8 #include <set>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 if (BrowserPluginGuest::IsGuest(rvh) || 228 if (BrowserPluginGuest::IsGuest(rvh) ||
229 !base::CommandLine::ForCurrentProcess()->HasSwitch( 229 !base::CommandLine::ForCurrentProcess()->HasSwitch(
230 switches::kDisableHangMonitor)) { 230 switches::kDisableHangMonitor)) {
231 hang_monitor_timeout_.reset(new TimeoutMonitor( 231 hang_monitor_timeout_.reset(new TimeoutMonitor(
232 base::Bind(&RenderWidgetHostImpl::RendererIsUnresponsive, 232 base::Bind(&RenderWidgetHostImpl::RendererIsUnresponsive,
233 weak_factory_.GetWeakPtr()))); 233 weak_factory_.GetWeakPtr())));
234 } 234 }
235 } 235 }
236 236
237 RenderWidgetHostImpl::~RenderWidgetHostImpl() { 237 RenderWidgetHostImpl::~RenderWidgetHostImpl() {
238 SetView(NULL); 238 if (view_) {
239 view_->Destroy();
240 DCHECK(!view_);
241 }
239 242
240 GpuSurfaceTracker::Get()->RemoveSurface(surface_id_); 243 GpuSurfaceTracker::Get()->RemoveSurface(surface_id_);
241 surface_id_ = 0; 244 surface_id_ = 0;
242 245
243 process_->RemoveRoute(routing_id_); 246 process_->RemoveRoute(routing_id_);
244 g_routing_id_widget_map.Get().erase( 247 g_routing_id_widget_map.Get().erase(
245 RenderWidgetHostID(process_->GetID(), routing_id_)); 248 RenderWidgetHostID(process_->GetID(), routing_id_));
246 249
247 if (delegate_) 250 if (delegate_)
248 delegate_->RenderWidgetDeleted(this); 251 delegate_->RenderWidgetDeleted(this);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 306
304 return scoped_ptr<RenderWidgetHostIterator>(hosts); 307 return scoped_ptr<RenderWidgetHostIterator>(hosts);
305 } 308 }
306 309
307 // static 310 // static
308 RenderWidgetHostImpl* RenderWidgetHostImpl::From(RenderWidgetHost* rwh) { 311 RenderWidgetHostImpl* RenderWidgetHostImpl::From(RenderWidgetHost* rwh) {
309 return rwh->AsRenderWidgetHostImpl(); 312 return rwh->AsRenderWidgetHostImpl();
310 } 313 }
311 314
312 void RenderWidgetHostImpl::SetView(RenderWidgetHostViewBase* view) { 315 void RenderWidgetHostImpl::SetView(RenderWidgetHostViewBase* view) {
316 DCHECK(view);
313 view_ = view; 317 view_ = view;
314 318
315 GpuSurfaceTracker::Get()->SetSurfaceHandle( 319 GpuSurfaceTracker::Get()->SetSurfaceHandle(
316 surface_id_, GetCompositingSurface()); 320 surface_id_, GetCompositingSurface());
317 321
318 synthetic_gesture_controller_.reset(); 322 synthetic_gesture_controller_.reset();
319 } 323 }
320 324
321 RenderProcessHost* RenderWidgetHostImpl::GetProcess() const { 325 RenderProcessHost* RenderWidgetHostImpl::GetProcess() const {
322 return process_; 326 return process_;
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
646 } 650 }
647 651
648 void RenderWidgetHostImpl::SetActive(bool active) { 652 void RenderWidgetHostImpl::SetActive(bool active) {
649 Send(new ViewMsg_SetActive(routing_id_, active)); 653 Send(new ViewMsg_SetActive(routing_id_, active));
650 } 654 }
651 655
652 void RenderWidgetHostImpl::LostMouseLock() { 656 void RenderWidgetHostImpl::LostMouseLock() {
653 Send(new ViewMsg_MouseLockLost(routing_id_)); 657 Send(new ViewMsg_MouseLockLost(routing_id_));
654 } 658 }
655 659
656 void RenderWidgetHostImpl::ViewDestroyed() { 660 void RenderWidgetHostImpl::ViewDestroyed(RenderWidgetHostViewBase* view) {
661 // If the view has been changed, then do not re-set the view pointer when the
662 // old view is destroyed.
663 if (view != view_)
664 return;
657 RejectMouseLockOrUnlockIfNecessary(); 665 RejectMouseLockOrUnlockIfNecessary();
658 666 view_ = NULL;
659 // TODO(evanm): tracking this may no longer be necessary;
660 // eliminate this function if so.
661 SetView(NULL);
662 } 667 }
663 668
664 void RenderWidgetHostImpl::CopyFromBackingStore( 669 void RenderWidgetHostImpl::CopyFromBackingStore(
665 const gfx::Rect& src_subrect, 670 const gfx::Rect& src_subrect,
666 const gfx::Size& accelerated_dst_size, 671 const gfx::Size& accelerated_dst_size,
667 const base::Callback<void(bool, const SkBitmap&)>& callback, 672 const base::Callback<void(bool, const SkBitmap&)>& callback,
668 const SkColorType color_type) { 673 const SkColorType color_type) {
669 if (view_) { 674 if (view_) {
670 TRACE_EVENT0("browser", 675 TRACE_EVENT0("browser",
671 "RenderWidgetHostImpl::CopyFromBackingStore::FromCompositingSurface"); 676 "RenderWidgetHostImpl::CopyFromBackingStore::FromCompositingSurface");
(...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after
1211 process_->WidgetRestored(); 1216 process_->WidgetRestored();
1212 is_hidden_ = false; 1217 is_hidden_ = false;
1213 } 1218 }
1214 1219
1215 // Reset this to ensure the hung renderer mechanism is working properly. 1220 // Reset this to ensure the hung renderer mechanism is working properly.
1216 in_flight_event_count_ = 0; 1221 in_flight_event_count_ = 0;
1217 1222
1218 if (view_) { 1223 if (view_) {
1219 GpuSurfaceTracker::Get()->SetSurfaceHandle(surface_id_, 1224 GpuSurfaceTracker::Get()->SetSurfaceHandle(surface_id_,
1220 gfx::GLSurfaceHandle()); 1225 gfx::GLSurfaceHandle());
1221 view_->RenderProcessGone(status, exit_code); 1226 view_->Destroy();
1222 view_ = NULL; // The View should be deleted by RenderProcessGone. 1227 DCHECK(!view_);
1223 } 1228 }
1224 1229
1225 // Reconstruct the input router to ensure that it has fresh state for a new 1230 // Reconstruct the input router to ensure that it has fresh state for a new
1226 // renderer. Otherwise it may be stuck waiting for the old renderer to ack an 1231 // renderer. Otherwise it may be stuck waiting for the old renderer to ack an
1227 // event. (In particular, the above call to view_->RenderProcessGone will 1232 // event. (In particular, the above call to view_->RenderProcessGone will
1228 // destroy the aura window, which may dispatch a synthetic mouse move.) 1233 // destroy the aura window, which may dispatch a synthetic mouse move.)
1229 input_router_.reset(new InputRouterImpl( 1234 input_router_.reset(new InputRouterImpl(
1230 process_, this, this, routing_id_, GetInputRouterConfigForPlatform())); 1235 process_, this, this, routing_id_, GetInputRouterConfigForPlatform()));
1231 1236
1232 synthetic_gesture_controller_.reset(); 1237 synthetic_gesture_controller_.reset();
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1326 void RenderWidgetHostImpl::Destroy() { 1331 void RenderWidgetHostImpl::Destroy() {
1327 NotificationService::current()->Notify( 1332 NotificationService::current()->Notify(
1328 NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, 1333 NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED,
1329 Source<RenderWidgetHost>(this), 1334 Source<RenderWidgetHost>(this),
1330 NotificationService::NoDetails()); 1335 NotificationService::NoDetails());
1331 1336
1332 // Tell the view to die. 1337 // Tell the view to die.
1333 // Note that in the process of the view shutting down, it can call a ton 1338 // Note that in the process of the view shutting down, it can call a ton
1334 // of other messages on us. So if you do any other deinitialization here, 1339 // of other messages on us. So if you do any other deinitialization here,
1335 // do it after this call to view_->Destroy(). 1340 // do it after this call to view_->Destroy().
1336 if (view_) 1341 if (view_) {
1337 view_->Destroy(); 1342 view_->Destroy();
1343 DCHECK(!view_);
1344 }
1338 1345
1339 delete this; 1346 delete this;
1340 } 1347 }
1341 1348
1342 void RenderWidgetHostImpl::RendererIsUnresponsive() { 1349 void RenderWidgetHostImpl::RendererIsUnresponsive() {
1343 NotificationService::current()->Notify( 1350 NotificationService::current()->Notify(
1344 NOTIFICATION_RENDER_WIDGET_HOST_HANG, 1351 NOTIFICATION_RENDER_WIDGET_HOST_HANG,
1345 Source<RenderWidgetHost>(this), 1352 Source<RenderWidgetHost>(this),
1346 NotificationService::NoDetails()); 1353 NotificationService::NoDetails());
1347 is_unresponsive_ = true; 1354 is_unresponsive_ = true;
(...skipping 963 matching lines...) Expand 10 before | Expand all | Expand 10 after
2311 } 2318 }
2312 #endif 2319 #endif
2313 2320
2314 SkColorType RenderWidgetHostImpl::PreferredReadbackFormat() { 2321 SkColorType RenderWidgetHostImpl::PreferredReadbackFormat() {
2315 if (view_) 2322 if (view_)
2316 return view_->PreferredReadbackFormat(); 2323 return view_->PreferredReadbackFormat();
2317 return kN32_SkColorType; 2324 return kN32_SkColorType;
2318 } 2325 }
2319 2326
2320 } // namespace content 2327 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/render_widget_host_impl.h ('k') | content/browser/renderer_host/render_widget_host_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698