From cf013e0dba9242ae9217856fb829d8c6a01b3821 Mon Sep 17 00:00:00 2001 From: "tkent@chromium.org" Date: Mon, 6 Sep 2010 03:25:09 +0000 Subject: 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 --- chrome/browser/cocoa/tab_window_controller.h | 2 ++ chrome/browser/cocoa/tab_window_controller.mm | 11 ++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) (limited to 'chrome/browser/cocoa') 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 focusBeforeOverlay_; scoped_nsobject 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]; -- cgit v1.1