summaryrefslogtreecommitdiffstats
path: root/chrome/browser/cocoa
diff options
context:
space:
mode:
authortkent@chromium.org <tkent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-06 03:25:09 +0000
committertkent@chromium.org <tkent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-06 03:25:09 +0000
commitcf013e0dba9242ae9217856fb829d8c6a01b3821 (patch)
tree520b8784582ed525236d78c6d932e6f2c79571b1 /chrome/browser/cocoa
parentba56560d692519545de5ec15af06898acadcb17e (diff)
downloadchromium_src-cf013e0dba9242ae9217856fb829d8c6a01b3821.zip
chromium_src-cf013e0dba9242ae9217856fb829d8c6a01b3821.tar.gz
chromium_src-cf013e0dba9242ae9217856fb829d8c6a01b3821.tar.bz2
TabWindowControlller: did save/restore the first responder at the beginning/end of a drag.
The problem was, replacing the first responder results [RenderWidgethostViewCocoa resignFirstResponder], which make the focus lost via render_widget_host_->Blur(). This lost happened immediately AFTER the dragging process. So we have no change to recover the focus. This change reset the first responder BEFORE the draggin process, and restore it after that. This makes [RWHVCocoa resignResponder] and [RWHVCocoa becomeFirstResponder] called in appropriate order, which calls RVH::Blur() and RVH::Focus() accordingly. BUG=30894 TEST=manual Patch by morrita@google Original code review: http://codereview.chromium.org/3150031/show git-svn-id: svn://svn.chromium.org/chrome/trunk/src@58620 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/cocoa')
-rw-r--r--chrome/browser/cocoa/tab_window_controller.h2
-rw-r--r--chrome/browser/cocoa/tab_window_controller.mm11
2 files changed, 12 insertions, 1 deletions
diff --git a/chrome/browser/cocoa/tab_window_controller.h b/chrome/browser/cocoa/tab_window_controller.h
index 538bf77..c4bdf79 100644
--- a/chrome/browser/cocoa/tab_window_controller.h
+++ b/chrome/browser/cocoa/tab_window_controller.h
@@ -32,6 +32,7 @@
#include "base/scoped_nsobject.h"
@class FastResizeView;
+@class FocusTracker;
@class TabStripView;
@class TabView;
@@ -46,6 +47,7 @@
NSView* cachedContentView_; // Used during dragging for identifying which
// view is the proper content area in the overlay
// (weak)
+ scoped_nsobject<FocusTracker> focusBeforeOverlay_;
scoped_nsobject<NSMutableSet> lockedTabs_;
BOOL closeDeferred_; // If YES, call performClose: in removeOverlay:.
// Difference between height of window content area and height of the
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];