summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsail@chromium.org <sail@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-07 21:57:38 +0000
committersail@chromium.org <sail@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-07 21:57:38 +0000
commit16a78f3e74f9f7728302a7b568bc2a4433d7f1c0 (patch)
treed901f45e47cac880fbea0ccaae6c3c4880aeb45e
parent1276cc16c2ffd7c4dc2ed516791df93b8cefec22 (diff)
downloadchromium_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
-rw-r--r--chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_cell.h10
-rw-r--r--chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_cell.mm19
-rw-r--r--chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_editor.mm5
-rw-r--r--chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_unittest.mm26
-rw-r--r--chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.h2
-rw-r--r--chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.mm7
-rw-r--r--chrome/browser/ui/cocoa/omnibox/omnibox_view_mac_browsertest.mm49
-rw-r--r--chrome/chrome_tests.gypi1
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',