diff options
author | sail@chromium.org <sail@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-07 21:57:38 +0000 |
---|---|---|
committer | sail@chromium.org <sail@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-07 21:57:38 +0000 |
commit | 16a78f3e74f9f7728302a7b568bc2a4433d7f1c0 (patch) | |
tree | d901f45e47cac880fbea0ccaae6c3c4880aeb45e | |
parent | 1276cc16c2ffd7c4dc2ed516791df93b8cefec22 (diff) | |
download | chromium_src-16a78f3e74f9f7728302a7b568bc2a4433d7f1c0.zip chromium_src-16a78f3e74f9f7728302a7b568bc2a4433d7f1c0.tar.gz chromium_src-16a78f3e74f9f7728302a7b568bc2a4433d7f1c0.tar.bz2 |
Alternate NTP: Hide omnibox focus on Mac
The new NTP page has a mode where the omnibox has focus but appears to be unfocused.
This CL implements that mode for Mac by hiding the insertion pointer and not drawing the focus ring.
BUG=160845
Review URL: https://chromiumcodereview.appspot.com/11466024
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@171855 0039d316-1c4b-4281-b951-d872f2087c98
8 files changed, 117 insertions, 2 deletions
diff --git a/chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_cell.h b/chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_cell.h index a4d5f58..dfa05a3 100644 --- a/chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_cell.h +++ b/chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_cell.h @@ -22,6 +22,10 @@ class LocationBarDecoration; // from outside in. Decorations are owned by |LocationBarViewMac|. std::vector<LocationBarDecoration*> leftDecorations_; std::vector<LocationBarDecoration*> rightDecorations_; + + // If YES then the text field will not draw a focus ring or show the insertion + // pointer. + BOOL hideFocusState_; } // Clear |leftDecorations_| and |rightDecorations_|. @@ -85,4 +89,10 @@ class LocationBarDecoration; - (void)updateToolTipsInRect:(NSRect)cellFrame ofView:(AutocompleteTextField*)controlView; +// Gets and sets |hideFocusState|. This allows the text field to have focus but +// to appear unfocused. +- (BOOL)hideFocusState; +- (void)setHideFocusState:(BOOL)hideFocusState + ofView:(AutocompleteTextField*)controlView; + @end 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 45a1e6a..3078fe4 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 @@ -736,4 +736,23 @@ static NSString* UnusedLegalNameForNewDropFile(NSURL* saveLocation, } } +- (BOOL)hideFocusState { + return hideFocusState_; +} + +- (void)setHideFocusState:(BOOL)hideFocusState + ofView:(AutocompleteTextField*)controlView { + if (hideFocusState_ == hideFocusState) + return; + hideFocusState_ = hideFocusState; + [controlView setNeedsDisplay:YES]; + NSTextView* fieldEditor = + base::mac::ObjCCastStrict<NSTextView>([controlView currentEditor]); + [fieldEditor updateInsertionPointStateAndRestartTimer:YES]; +} + +- (BOOL)showsFirstResponder { + return [super showsFirstResponder] && !hideFocusState_; +} + @end diff --git a/chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_editor.mm b/chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_editor.mm index 1148855..fc382fbb 100644 --- a/chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_editor.mm +++ b/chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_editor.mm @@ -45,6 +45,11 @@ BOOL ThePasteboardIsTooDamnBig() { @implementation AutocompleteTextFieldEditor +- (BOOL)shouldDrawInsertionPoint { + return [super shouldDrawInsertionPoint] && + ![[[self delegate] cell] hideFocusState]; +} + - (id)initWithFrame:(NSRect)frameRect { if ((self = [super initWithFrame:frameRect])) { dropHandler_.reset([[URLDropTargetHandler alloc] initWithView:self]); diff --git a/chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_unittest.mm b/chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_unittest.mm index 12b00a3..81cf137 100644 --- a/chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_unittest.mm +++ b/chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_unittest.mm @@ -4,6 +4,7 @@ #import <Cocoa/Cocoa.h> +#include "base/mac/foundation_util.h" #include "base/memory/scoped_nsobject.h" #import "chrome/browser/ui/cocoa/location_bar/autocomplete_text_field.h" #import "chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_cell.h" @@ -120,6 +121,11 @@ class AutocompleteTextFieldTest : public CocoaTest { } } + AutocompleteTextFieldEditor* FieldEditor() { + return base::mac::ObjCCastStrict<AutocompleteTextFieldEditor>( + [field_ currentEditor]); + } + AutocompleteTextField* field_; MockDecoration mock_left_decoration_; MockDecoration mock_right_decoration_; @@ -735,6 +741,26 @@ TEST_F(AutocompleteTextFieldTest, EditorGetsCorrectUndoManager) { EXPECT_EQ([field_ undoManagerForTextView:editor], [editor undoManager]); } +// Verify that hideFocusState correctly hides the focus ring and insertion +// pointer. +TEST_F(AutocompleteTextFieldTest, HideFocusState) { + [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; + [[field_ cell] setShowsFirstResponder:YES]; + + EXPECT_TRUE([[field_ cell] showsFirstResponder]); + EXPECT_TRUE([FieldEditor() shouldDrawInsertionPoint]); + + [[field_ cell] setHideFocusState:YES + ofView:field_]; + EXPECT_FALSE([[field_ cell] showsFirstResponder]); + EXPECT_FALSE([FieldEditor() shouldDrawInsertionPoint]); + + [[field_ cell] setHideFocusState:NO + ofView:field_]; + EXPECT_TRUE([[field_ cell] showsFirstResponder]); + EXPECT_TRUE([FieldEditor() shouldDrawInsertionPoint]); +} + TEST_F(AutocompleteTextFieldObserverTest, SendsEditingMessages) { // Many of these methods try to change the selection. EXPECT_CALL(field_observer_, SelectionRangeForProposedRange(A<NSRange>())) diff --git a/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.h b/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.h index f2ca470..41a32b8 100644 --- a/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.h +++ b/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.h @@ -98,6 +98,8 @@ class OmniboxViewMac : public OmniboxView, // Otherwise return the PNG image from the resource bundle. static NSImage* ImageForResource(int resource_id); + AutocompleteTextField* field() const { return field_; } + private: // Called when the user hits backspace in |field_|. Checks whether // keyword search is being terminated. Returns true if the diff --git a/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.mm b/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.mm index 2617beb..ea80bcd 100644 --- a/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.mm +++ b/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.mm @@ -13,6 +13,7 @@ #include "chrome/browser/autocomplete/autocomplete_match.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/ui/cocoa/event_utils.h" +#include "chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_cell.h" #include "chrome/browser/ui/cocoa/omnibox/omnibox_popup_view_mac.h" #include "chrome/browser/ui/omnibox/omnibox_edit_controller.h" #include "chrome/browser/ui/omnibox/omnibox_popup_model.h" @@ -360,11 +361,13 @@ void OmniboxViewMac::CloseOmniboxPopup() { } void OmniboxViewMac::SetFocus() { + model()->SetCaretVisibility(true); + FocusLocation(false); } void OmniboxViewMac::ApplyCaretVisibility() { - // TODO(mathp): implement for Mac. - NOTIMPLEMENTED(); + [[field_ cell] setHideFocusState:!model()->is_caret_visible() + ofView:field_]; } void OmniboxViewMac::SetText(const string16& display_text) { diff --git a/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac_browsertest.mm b/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac_browsertest.mm new file mode 100644 index 0000000..88022c5 --- /dev/null +++ b/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac_browsertest.mm @@ -0,0 +1,49 @@ +// Copyright (c) 2012 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/ui/cocoa/omnibox/omnibox_view_mac.h" + +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_window.h" +#import "chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_cell.h" +#include "chrome/browser/ui/omnibox/location_bar.h" +#include "chrome/test/base/in_process_browser_test.h" + +class OmniboxViewMacBrowserTest : public InProcessBrowserTest { + public: + OmniboxViewMac* GetOmnibox() { + return static_cast<OmniboxViewMac*>( + browser()->window()->GetLocationBar()->GetLocationEntry()); + } +}; + +// Verify that the OmniboxViewMac::SetFocus API works. +IN_PROC_BROWSER_TEST_F(OmniboxViewMacBrowserTest, SetFocus) { + EXPECT_FALSE([[GetOmnibox()->field() window] firstResponder] == + GetOmnibox()->field()); + GetOmnibox()->SetFocus(); + // Unfortunately there's no way to test that the field has keyboard focus. +} + +// Verify that the OmniboxViewMac::ApplyCaretVisibility API works. +IN_PROC_BROWSER_TEST_F(OmniboxViewMacBrowserTest, ApplyCaretVisibility) { + EXPECT_FALSE([[GetOmnibox()->field() cell] hideFocusState]); + + // |SetCaretVisibility(false)| should hide focus state. + GetOmnibox()->model()->SetCaretVisibility(false); + GetOmnibox()->ApplyCaretVisibility(); + EXPECT_TRUE([[GetOmnibox()->field() cell] hideFocusState]); + + // |SetCaretVisibility(true)| should show focus state. + GetOmnibox()->model()->SetCaretVisibility(true); + GetOmnibox()->ApplyCaretVisibility(); + EXPECT_FALSE([[GetOmnibox()->field() cell] hideFocusState]); + + // Focusing on the omnibox should show focus state. + GetOmnibox()->model()->SetCaretVisibility(false); + GetOmnibox()->ApplyCaretVisibility(); + EXPECT_TRUE([[GetOmnibox()->field() cell] hideFocusState]); + GetOmnibox()->SetFocus(); + EXPECT_FALSE([[GetOmnibox()->field() cell] hideFocusState]); +} diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index f2a060b..bd753d4 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -1154,6 +1154,7 @@ 'browser/ui/cocoa/extensions/media_galleries_dialog_cocoa_browsertest.mm', 'browser/ui/cocoa/intents/web_intent_inline_service_view_controller_browsertest.mm', 'browser/ui/cocoa/intents/web_intent_picker_view_controller_browsertest.mm', + 'browser/ui/cocoa/omnibox/omnibox_view_mac_browsertest.mm', 'browser/ui/cocoa/ssl_client_certificate_selector_cocoa_browsertest.mm', 'browser/ui/cocoa/tab_contents/previewable_contents_controller_browsertest.mm', 'browser/ui/cocoa/view_id_util_browsertest.mm', |