diff options
author | tkent@chromium.org <tkent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-06 03:25:09 +0000 |
---|---|---|
committer | tkent@chromium.org <tkent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-06 03:25:09 +0000 |
commit | cf013e0dba9242ae9217856fb829d8c6a01b3821 (patch) | |
tree | 520b8784582ed525236d78c6d932e6f2c79571b1 /chrome/browser/cocoa | |
parent | ba56560d692519545de5ec15af06898acadcb17e (diff) | |
download | chromium_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.h | 2 | ||||
-rw-r--r-- | chrome/browser/cocoa/tab_window_controller.mm | 11 |
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]; |