Index: chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_cell.mm |
diff --git a/chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_cell.mm b/chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_cell.mm |
index ac7a62b6cae8aa8bb33f52e219d486ad9cc55d0c..2b8e4479f688d7a03152db142830627d9706501d 100644 |
--- a/chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_cell.mm |
+++ b/chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_cell.mm |
@@ -165,6 +165,12 @@ size_t CalculatePositionsInFrame( |
} // namespace |
+@interface AutocompleteTextFieldCell () |
+// Post an OnSetFocus notification to the observer of |controlView|. |
+- (void)focusNotificationFor:(NSEvent*)event |
+ ofView:(AutocompleteTextField*)controlView; |
+@end |
+ |
@implementation AutocompleteTextFieldCell |
@synthesize isPopupMode = isPopupMode_; |
@@ -411,6 +417,12 @@ size_t CalculatePositionsInFrame( |
- (BOOL)mouseDown:(NSEvent*)theEvent |
inRect:(NSRect)cellFrame |
ofView:(AutocompleteTextField*)controlView { |
+ // Check if this mouseDown was the reason the control became firstResponder. |
+ // If not, discard focus event. |
+ base::scoped_nsobject<NSEvent> focusEvent(focusEvent_.release()); |
+ if (![theEvent isEqual:focusEvent_]) |
Scott Hess - ex-Googler
2014/02/27 21:09:36
focusEvent (no _), focusEvent_ is nil.
|
+ focusEvent.reset(); |
+ |
LocationBarDecoration* decoration = |
[self decorationForEvent:theEvent inRect:cellFrame ofView:controlView]; |
if (!decoration || !decoration->AcceptsMousePress()) |
@@ -481,6 +493,9 @@ size_t CalculatePositionsInFrame( |
ofView:controlView |
untilMouseUp:YES]; |
+ // Post delayed focus notification, if necessary. |
+ [self focusNotificationFor:focusEvent ofView:controlView]; |
Scott Hess - ex-Googler
2014/02/27 21:09:36
Yeah, I think so. Nothing has occurred to me abou
groby-ooo-7-16
2014/02/27 23:15:27
Well, we need to accept firstResponder for the top
|
+ |
// Set the proper state (hover or normal) once the mouse has been released, |
// and call |OnMousePressed| if the button was released while the mouse was |
// within the bounds of the button. |
@@ -807,4 +822,31 @@ static NSString* UnusedLegalNameForNewDropFile(NSURL* saveLocation, |
return [super showsFirstResponder] && !hideFocusState_; |
} |
+- (void)focusNotificationFor:(NSEvent*)event |
+ ofView:(AutocompleteTextField*)controlView { |
+ if ([controlView observer] && event) { |
+ const bool controlDown = ([event modifierFlags] & NSControlKeyMask) != 0; |
+ [controlView observer]->OnSetFocus(controlDown); |
+ } |
+} |
Scott Hess - ex-Googler
2014/02/27 21:09:36
I can't tell if the following is clearer or not, s
groby-ooo-7-16
2014/02/27 23:15:27
Except this is only called from button decorations
|
+ |
+- (void)handleFocusEvent:(NSEvent*)event |
+ ofView:(AutocompleteTextField*)controlView { |
+ // Only intercept left button click. All other events cause immediate focus. |
+ if ([event type] == NSLeftMouseDown) { |
+ LocationBarDecoration* decoration = |
+ [self decorationForEvent:event |
+ inRect:[controlView bounds] |
+ ofView:controlView]; |
+ // Only ButtonDecorations need a delayed focus handling. |
+ if (decoration && decoration->AsButtonDecoration()) { |
+ focusEvent_.reset([event retain]); |
+ return; |
+ } |
+ } |
+ |
+ // Handle event immediately. |
+ [self focusNotificationFor:event ofView:controlView]; |
+} |
+ |
@end |