Index: chrome/browser/renderer_host/render_widget_host_view_mac.mm |
diff --git a/chrome/browser/renderer_host/render_widget_host_view_mac.mm b/chrome/browser/renderer_host/render_widget_host_view_mac.mm |
index 290dcf6cca83426c593e04ce88e0d3d7088ddd3c..de2325143d2d8367b1136c323f9b5d9746eda3cc 100644 |
--- a/chrome/browser/renderer_host/render_widget_host_view_mac.mm |
+++ b/chrome/browser/renderer_host/render_widget_host_view_mac.mm |
@@ -256,6 +256,13 @@ void RenderWidgetHostViewMac::Destroy() { |
[cocoa_view_ retain]; |
[cocoa_view_ removeFromSuperview]; |
[cocoa_view_ autorelease]; |
+ |
+ // We get this call just before |render_widget_host_| deletes |
+ // itself. But we are owned by |cocoa_view_|, which may be retained |
+ // by some other code. Examples are TabContentsViewMac's |
+ // |latent_focus_view_| and TabWindowController's |
+ // |cachedContentView_|. |
+ render_widget_host_ = NULL; |
} |
// Called from the renderer to tell us what the tooltip text should be. It |
@@ -395,7 +402,8 @@ void RenderWidgetHostViewMac::ShutdownHost() { |
- (void)mouseEvent:(NSEvent *)theEvent { |
const WebMouseEvent& event = |
WebInputEventFactory::mouseEvent(theEvent, self); |
- renderWidgetHostView_->render_widget_host_->ForwardMouseEvent(event); |
+ if (renderWidgetHostView_->render_widget_host_) |
+ renderWidgetHostView_->render_widget_host_->ForwardMouseEvent(event); |
} |
- (void)keyEvent:(NSEvent *)theEvent { |
@@ -403,21 +411,31 @@ void RenderWidgetHostViewMac::ShutdownHost() { |
// http://b/issue?id=1192881 . |
NativeWebKeyboardEvent event(theEvent); |
- renderWidgetHostView_->render_widget_host_->ForwardKeyboardEvent(event); |
+ if (renderWidgetHostView_->render_widget_host_) |
+ renderWidgetHostView_->render_widget_host_->ForwardKeyboardEvent(event); |
} |
- (void)scrollWheel:(NSEvent *)theEvent { |
const WebMouseWheelEvent& event = |
WebInputEventFactory::mouseWheelEvent(theEvent, self); |
- renderWidgetHostView_->render_widget_host_->ForwardWheelEvent(event); |
+ if (renderWidgetHostView_->render_widget_host_) |
+ renderWidgetHostView_->render_widget_host_->ForwardWheelEvent(event); |
} |
- (void)setFrame:(NSRect)frameRect { |
[super setFrame:frameRect]; |
- renderWidgetHostView_->render_widget_host_->WasResized(); |
+ if (renderWidgetHostView_->render_widget_host_) |
+ renderWidgetHostView_->render_widget_host_->WasResized(); |
} |
- (void)drawRect:(NSRect)dirtyRect { |
+ if (!renderWidgetHostView_->render_widget_host_) { |
+ // TODO(shess): Consider using something more noticable? |
+ [[NSColor whiteColor] set]; |
+ NSRectFill(dirtyRect); |
+ return; |
+ } |
+ |
DCHECK(renderWidgetHostView_->render_widget_host_->process()->HasConnection()); |
DCHECK(!renderWidgetHostView_->about_to_validate_and_paint_); |
@@ -509,29 +527,30 @@ void RenderWidgetHostViewMac::ShutdownHost() { |
} |
- (BOOL)canBecomeKeyView { |
+ if (!renderWidgetHostView_->render_widget_host_) |
+ return NO; |
+ |
return canBeKeyView_; |
} |
- (BOOL)acceptsFirstResponder { |
+ if (!renderWidgetHostView_->render_widget_host_) |
+ return NO; |
+ |
return canBeKeyView_; |
} |
- (BOOL)becomeFirstResponder { |
- if (![self superview]) { |
- // We're dead, so becoming first responder is probably a bad idea. |
+ if (!renderWidgetHostView_->render_widget_host_) |
return NO; |
- } |
renderWidgetHostView_->render_widget_host_->Focus(); |
return YES; |
} |
- (BOOL)resignFirstResponder { |
- if (![self superview]) { |
- // We're dead, so touching renderWidgetHostView_ is probably a bad |
- // idea. |
+ if (!renderWidgetHostView_->render_widget_host_) |
return YES; |
- } |
if (closeOnDeactivate_) |
renderWidgetHostView_->KillSelf(); |