summaryrefslogtreecommitdiffstats
path: root/chrome/browser/cocoa/tab_window_controller.mm
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/cocoa/tab_window_controller.mm')
-rw-r--r--chrome/browser/cocoa/tab_window_controller.mm11
1 files changed, 10 insertions, 1 deletions
diff --git a/chrome/browser/cocoa/tab_window_controller.mm b/chrome/browser/cocoa/tab_window_controller.mm
index c1701f1..4e886eb 100644
--- a/chrome/browser/cocoa/tab_window_controller.mm
+++ b/chrome/browser/cocoa/tab_window_controller.mm
@@ -6,6 +6,7 @@
#include "app/theme_provider.h"
#include "base/logging.h"
+#import "chrome/browser/cocoa/focus_tracker.h"
#import "chrome/browser/cocoa/tab_strip_view.h"
#import "chrome/browser/cocoa/themed_window.h"
@@ -193,13 +194,21 @@
[overlayWindow_ setDelegate:self];
cachedContentView_ = [window contentView];
[window addChildWindow:overlayWindow_ ordered:NSWindowAbove];
+ // Sets explictly nil to the responder and then restores it.
+ // Leaving the first responder non-null here
+ // causes [RenderWidgethostViewCocoa resignFirstResponder] and
+ // following RenderWidgetHost::Blur(), which results unexpected
+ // focus lost.
+ focusBeforeOverlay_.reset([[FocusTracker alloc] initWithWindow:window]);
+ [window makeFirstResponder:nil];
[self moveViewsBetweenWindowAndOverlay:useOverlay];
[overlayWindow_ orderFront:nil];
} else if (!useOverlay && overlayWindow_) {
DCHECK(cachedContentView_);
[window setContentView:cachedContentView_];
[self moveViewsBetweenWindowAndOverlay:useOverlay];
- [window makeFirstResponder:cachedContentView_];
+ [focusBeforeOverlay_ restoreFocusInWindow:window];
+ focusBeforeOverlay_.reset(nil);
[window display];
[window removeChildWindow:overlayWindow_];
[overlayWindow_ orderOut:nil];