diff options
author | rohitrao@chromium.org <rohitrao@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-15 18:01:58 +0000 |
---|---|---|
committer | rohitrao@chromium.org <rohitrao@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-15 18:01:58 +0000 |
commit | 59f3e6d0f59a671ed2f50d14abbec2708cb709b1 (patch) | |
tree | 36b3687d077ef4d5c0e9657c6520175550fadd00 /chrome/browser/cocoa/focus_tracker.mm | |
parent | d88453afb9292607a16321e23785e5ee2417f776 (diff) | |
download | chromium_src-59f3e6d0f59a671ed2f50d14abbec2708cb709b1.zip chromium_src-59f3e6d0f59a671ed2f50d14abbec2708cb709b1.tar.gz chromium_src-59f3e6d0f59a671ed2f50d14abbec2708cb709b1.tar.bz2 |
[Mac] Restore focus to the previously focused view when dismissing the find bar.
If a result was found, restore focus to the tab contents. This allows for
keyboard navigation using the find bar.
Now with fix for valgrind failure. This CL reverts 26219, which in turn reverted 26214.
BUG=http://crbug.com/12657
BUG=http://crbug.com/21374
TEST=See test case in bug 21374
Review URL: http://codereview.chromium.org/205010
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@26231 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/cocoa/focus_tracker.mm')
-rw-r--r-- | chrome/browser/cocoa/focus_tracker.mm | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/chrome/browser/cocoa/focus_tracker.mm b/chrome/browser/cocoa/focus_tracker.mm new file mode 100644 index 0000000..ecbb864 --- /dev/null +++ b/chrome/browser/cocoa/focus_tracker.mm @@ -0,0 +1,46 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "chrome/browser/cocoa/focus_tracker.h" + +#include "base/logging.h" + +@implementation FocusTracker + +- (id)initWithWindow:(NSWindow*)window { + if ((self = [super init])) { + NSResponder* current_focus = [window firstResponder]; + + // Special case NSTextViews, because they are removed from the + // view hierarchy when their text field does not have focus. If + // an NSTextView is the current first responder, save a pointer to + // its NSTextField delegate instead. + if ([current_focus isKindOfClass:[NSTextView class]]) { + id delegate = [(NSTextView*)current_focus delegate]; + if ([delegate isKindOfClass:[NSTextField class]]) + current_focus = delegate; + else + current_focus = nil; + } + + if ([current_focus isKindOfClass:[NSView class]]) { + NSView* current_focus_view = (NSView*)current_focus; + focusedView_.reset([current_focus_view retain]); + } + } + + return self; +} + +- (BOOL)restoreFocusInWindow:(NSWindow*)window { + if (!focusedView_.get()) + return NO; + + if ([focusedView_ window] && [focusedView_ window] == window) + return [window makeFirstResponder:focusedView_.get()]; + + return NO; +} + +@end |