| Index: chrome/browser/renderer_host/render_widget_host_view_mac.mm
|
| ===================================================================
|
| --- chrome/browser/renderer_host/render_widget_host_view_mac.mm (revision 30652)
|
| +++ chrome/browser/renderer_host/render_widget_host_view_mac.mm (working copy)
|
| @@ -5,7 +5,7 @@
|
| #include "chrome/browser/renderer_host/render_widget_host_view_mac.h"
|
|
|
| #include "base/histogram.h"
|
| -#include "base/scoped_nsobject.h"
|
| +#import "base/scoped_nsobject.h"
|
| #include "base/string_util.h"
|
| #include "base/sys_string_conversions.h"
|
| #include "chrome/browser/browser_trial.h"
|
| @@ -289,6 +289,11 @@
|
| [subview renderWidgetHostViewMac]->ShutdownHost();
|
| }
|
|
|
| + // We've been told to 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
|
| @@ -549,8 +554,7 @@
|
| if (ignoreKeyEvents_)
|
| return;
|
|
|
| - // TODO(avi): Possibly kill self? See RenderWidgetHostViewWin::OnKeyEvent and
|
| - // http://b/issue?id=1192881 .
|
| + scoped_nsobject<RenderWidgetHostViewCocoa> keepSelfAlive([self retain]);
|
|
|
| // Don't cancel child popups; the key events are probably what's triggering
|
| // the popup in the first place.
|
| @@ -586,7 +590,14 @@
|
| // To send an onkeydown() event before an onkeypress() event, we should
|
| // dispatch this NSKeyDown event AFTER sending it to the renderer.
|
| // (See <https://bugs.webkit.org/show_bug.cgi?id=25119>).
|
| - if ([theEvent type] == NSKeyDown)
|
| + //
|
| + // If this object's retainCount is 1, the only reference is the one held by
|
| + // keepSelfAlive. All other references may have been destroyed in the
|
| + // RenderWidgetHost::ForwardKeyboardEvent call above if it resulted in tab
|
| + // closure. Were it not for that single reference, this object would
|
| + // already be deallocated. In that case, there's no point in calling
|
| + // -interpretKeyEvents:.
|
| + if ([self retainCount] > 1 && [theEvent type] == NSKeyDown)
|
| [self interpretKeyEvents:[NSArray arrayWithObject:theEvent]];
|
|
|
| // Possibly autohide the cursor.
|
| @@ -1250,4 +1261,3 @@
|
| }
|
|
|
| @end
|
| -
|
|
|