1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef CHROME_BROWSER_UI_VIEWS_OMNIBOX_OMNIBOX_VIEW_VIEWS_H_
6 #define CHROME_BROWSER_UI_VIEWS_OMNIBOX_OMNIBOX_VIEW_VIEWS_H_
11 #include "base/basictypes.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/memory/weak_ptr.h"
14 #include "chrome/browser/ui/toolbar/chrome_toolbar_model.h"
15 #include "components/omnibox/browser/omnibox_view.h"
16 #include "ui/base/window_open_disposition.h"
17 #include "ui/gfx/range/range.h"
18 #include "ui/views/controls/textfield/textfield.h"
19 #include "ui/views/controls/textfield/textfield_controller.h"
21 #if defined(OS_CHROMEOS)
22 #include "ui/base/ime/chromeos/input_method_manager.h"
26 class LocationBarView
;
27 class OmniboxPopupView
;
38 // Views-implementation of OmniboxView.
39 class OmniboxViewViews
41 public views::Textfield
,
42 #if defined(OS_CHROMEOS)
44 chromeos::input_method::InputMethodManager::CandidateWindowObserver
,
46 public views::TextfieldController
{
48 // The internal view class name.
49 static const char kViewClassName
[];
51 OmniboxViewViews(OmniboxEditController
* controller
,
53 CommandUpdater
* command_updater
,
54 bool popup_window_mode
,
55 LocationBarView
* location_bar
,
56 const gfx::FontList
& font_list
);
57 ~OmniboxViewViews() override
;
59 // Initialize, create the underlying views, etc.
62 // Exposes the RenderText for tests.
63 #if defined(UNIT_TEST)
64 gfx::RenderText
* GetRenderText() {
65 return views::Textfield::GetRenderText();
69 // For use when switching tabs, this saves the current state onto the tab so
70 // that it can be restored during a later call to Update().
71 void SaveStateToTab(content::WebContents
* tab
);
73 // Called when the window's active tab changes.
74 void OnTabChanged(const content::WebContents
* web_contents
);
76 // Called to clear the saved state for |web_contents|.
77 void ResetTabState(content::WebContents
* web_contents
);
80 void Update() override
;
81 base::string16
GetText() const override
;
82 void SetUserText(const base::string16
& text
,
83 const base::string16
& display_text
,
84 bool update_popup
) override
;
85 void SetForcedQuery() override
;
86 void GetSelectionBounds(base::string16::size_type
* start
,
87 base::string16::size_type
* end
) const override
;
88 void SelectAll(bool reversed
) override
;
89 void RevertAll() override
;
90 void SetFocus() override
;
91 int GetTextWidth() const override
;
92 bool IsImeComposing() const override
;
95 gfx::Size
GetMinimumSize() const override
;
96 void OnPaint(gfx::Canvas
* canvas
) override
;
97 void OnNativeThemeChanged(const ui::NativeTheme
* theme
) override
;
98 void ExecuteCommand(int command_id
, int event_flags
) override
;
101 FRIEND_TEST_ALL_PREFIXES(OmniboxViewViewsTest
, CloseOmniboxPopupOnTextDrag
);
103 // Update the field with |text| and set the selection.
104 void SetTextAndSelectedRange(const base::string16
& text
,
105 const gfx::Range
& range
);
107 // Returns the selected text.
108 base::string16
GetSelectedText() const;
110 // Paste text from the clipboard into the omnibox.
111 // Textfields implementation of Paste() pastes the contents of the clipboard
112 // as is. We want to strip whitespace and other things (see GetClipboardText()
113 // for details). The function invokes OnBefore/AfterPossibleChange() as
117 // Handle keyword hint tab-to-search and tabbing through dropdown results.
118 bool HandleEarlyTabActions(const ui::KeyEvent
& event
);
120 // Handles a request to change the value of this text field from software
121 // using an accessibility API (typically automation software, screen readers
122 // don't normally use this). Sets the value and clears the selection.
123 void AccessibilitySetValue(const base::string16
& new_value
);
125 // Updates |security_level_| based on the toolbar model's current value.
126 void UpdateSecurityLevel();
129 void SetWindowTextAndCaretPos(const base::string16
& text
,
132 bool notify_text_changed
) override
;
133 bool IsSelectAll() const override
;
134 bool DeleteAtEndPressed() override
;
135 void UpdatePopup() override
;
136 void ApplyCaretVisibility() override
;
137 void OnTemporaryTextMaybeChanged(const base::string16
& display_text
,
138 bool save_original_selection
,
139 bool notify_text_changed
) override
;
140 bool OnInlineAutocompleteTextMaybeChanged(const base::string16
& display_text
,
141 size_t user_text_length
) override
;
142 void OnInlineAutocompleteTextCleared() override
;
143 void OnRevertTemporaryText() override
;
144 void OnBeforePossibleChange() override
;
145 bool OnAfterPossibleChange() override
;
146 gfx::NativeView
GetNativeView() const override
;
147 gfx::NativeView
GetRelativeWindowForPopup() const override
;
148 void SetGrayTextAutocompletion(const base::string16
& input
) override
;
149 base::string16
GetGrayTextAutocompletion() const override
;
150 int GetWidth() const override
;
151 bool IsImeShowingPopup() const override
;
152 void ShowImeIfNeeded() override
;
153 void OnMatchOpened(const AutocompleteMatch
& match
) override
;
154 int GetOmniboxTextLength() const override
;
155 void EmphasizeURLComponents() override
;
158 bool OnKeyReleased(const ui::KeyEvent
& event
) override
;
159 bool IsItemForCommandIdDynamic(int command_id
) const override
;
160 base::string16
GetLabelForCommandId(int command_id
) const override
;
161 const char* GetClassName() const override
;
162 bool OnMousePressed(const ui::MouseEvent
& event
) override
;
163 bool OnMouseDragged(const ui::MouseEvent
& event
) override
;
164 void OnMouseReleased(const ui::MouseEvent
& event
) override
;
165 bool OnKeyPressed(const ui::KeyEvent
& event
) override
;
166 void OnGestureEvent(ui::GestureEvent
* event
) override
;
167 void AboutToRequestFocusFromTabTraversal(bool reverse
) override
;
168 bool SkipDefaultKeyEventProcessing(const ui::KeyEvent
& event
) override
;
169 void GetAccessibleState(ui::AXViewState
* state
) override
;
170 void OnFocus() override
;
171 void OnBlur() override
;
172 bool IsCommandIdEnabled(int command_id
) const override
;
173 base::string16
GetSelectionClipboardText() const override
;
174 void DoInsertChar(base::char16 ch
) override
;
176 // chromeos::input_method::InputMethodManager::CandidateWindowObserver:
177 #if defined(OS_CHROMEOS)
178 void CandidateWindowOpened(
179 chromeos::input_method::InputMethodManager
* manager
) override
;
180 void CandidateWindowClosed(
181 chromeos::input_method::InputMethodManager
* manager
) override
;
184 // views::TextfieldController:
185 void ContentsChanged(views::Textfield
* sender
,
186 const base::string16
& new_contents
) override
;
187 bool HandleKeyEvent(views::Textfield
* sender
,
188 const ui::KeyEvent
& key_event
) override
;
189 void OnBeforeUserAction(views::Textfield
* sender
) override
;
190 void OnAfterUserAction(views::Textfield
* sender
) override
;
191 void OnAfterCutOrCopy(ui::ClipboardType clipboard_type
) override
;
192 void OnWriteDragData(ui::OSExchangeData
* data
) override
;
193 void OnGetDragOperationsForTextfield(int* drag_operations
) override
;
194 void AppendDropFormats(
196 std::set
<ui::OSExchangeData::CustomFormat
>* custom_formats
) override
;
197 int OnDrop(const ui::OSExchangeData
& data
) override
;
198 void UpdateContextMenu(ui::SimpleMenuModel
* menu_contents
) override
;
202 // When true, the location bar view is read only and also is has a slightly
203 // different presentation (smaller font size). This is used for popups.
204 bool popup_window_mode_
;
206 scoped_ptr
<OmniboxPopupView
> popup_view_
;
208 SecurityStateModel::SecurityLevel security_level_
;
210 // Selection persisted across temporary text changes, like popup suggestions.
211 gfx::Range saved_temporary_selection_
;
213 // Holds the user's selection across focus changes. There is only a saved
214 // selection if this range IsValid().
215 gfx::Range saved_selection_for_focus_change_
;
217 // Tracking state before and after a possible change.
218 base::string16 text_before_change_
;
219 gfx::Range sel_before_change_
;
220 bool ime_composing_before_change_
;
222 // Was the delete key pressed with an empty selection at the end of the edit?
223 bool delete_at_end_pressed_
;
225 // |location_bar_view_| can be NULL in tests.
226 LocationBarView
* location_bar_view_
;
228 // True if the IME candidate window is open. When this is true, we want to
229 // avoid showing the popup. So far, the candidate window is detected only
231 bool ime_candidate_window_open_
;
233 // Should we select all the text when we see the mouse button get released?
234 // We select in response to a click that focuses the omnibox, but we defer
235 // until release, setting this variable back to false if we saw a drag, to
236 // allow the user to select just a portion of the text.
237 bool select_all_on_mouse_release_
;
239 // Indicates if we want to select all text in the omnibox when we get a
240 // GESTURE_TAP. We want to select all only when the textfield is not in focus
241 // and gets a tap. So we use this variable to remember focus state before tap.
242 bool select_all_on_gesture_tap_
;
244 // The time of the first character insert operation that has not yet been
245 // painted. Used to measure omnibox responsiveness with a histogram.
246 base::TimeTicks insert_char_time_
;
248 // Used to bind callback functions to this object.
249 base::WeakPtrFactory
<OmniboxViewViews
> weak_ptr_factory_
;
251 DISALLOW_COPY_AND_ASSIGN(OmniboxViewViews
);
254 #endif // CHROME_BROWSER_UI_VIEWS_OMNIBOX_OMNIBOX_VIEW_VIEWS_H_