Index: ios/chrome/browser/ui/omnibox/omnibox_view_ios.h |
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_view_ios.h b/ios/chrome/browser/ui/omnibox/omnibox_view_ios.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f62acf6dd515bbbf6840f23e5b81edeee3d4436c |
--- /dev/null |
+++ b/ios/chrome/browser/ui/omnibox/omnibox_view_ios.h |
@@ -0,0 +1,173 @@ |
+// 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. |
+ |
+#ifndef IOS_CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_VIEW_IOS_H_ |
+#define IOS_CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_VIEW_IOS_H_ |
+ |
+#include <UIKit/UIKit.h> |
+ |
+#include <memory> |
+ |
+#include "base/mac/scoped_nsobject.h" |
+#include "components/omnibox/browser/omnibox_view.h" |
+#include "components/toolbar/toolbar_model.h" |
+#import "ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.h" |
+ |
+struct AutocompleteMatch; |
+class AutocompleteResult; |
+@class AutocompleteTextFieldDelegate; |
+class GURL; |
+@class OmniboxTextFieldIOS; |
+@protocol OmniboxPopupPositioner; |
+class WebOmniboxEditController; |
+class OmniboxPopupViewIOS; |
+@protocol PreloadProvider; |
+ |
+namespace ios { |
+class ChromeBrowserState; |
+} |
+ |
+// iOS implementation of OmniBoxView. Wraps a UITextField and |
+// interfaces with the rest of the autocomplete system. |
+class OmniboxViewIOS : public OmniboxView { |
+ public: |
+ // Retains |field|. |
+ OmniboxViewIOS(OmniboxTextFieldIOS* field, |
+ WebOmniboxEditController* controller, |
+ ios::ChromeBrowserState* browser_state, |
+ id<PreloadProvider> prerender, |
+ id<OmniboxPopupPositioner> positioner); |
+ ~OmniboxViewIOS() override; |
+ |
+ // OmniboxView implementation. |
+ void OpenMatch(const AutocompleteMatch& match, |
+ WindowOpenDisposition disposition, |
+ const GURL& alternate_nav_url, |
+ const base::string16& pasted_text, |
+ size_t selected_line) override; |
+ base::string16 GetText() const override; |
+ void SetWindowTextAndCaretPos(const base::string16& text, |
+ size_t caret_pos, |
+ bool update_popup, |
+ bool notify_text_changed) override; |
+ void RevertAll() override; |
+ void UpdatePopup() override; |
+ void OnTemporaryTextMaybeChanged(const base::string16& display_text, |
+ bool save_original_selection, |
+ bool notify_text_changed) override; |
+ bool OnInlineAutocompleteTextMaybeChanged(const base::string16& display_text, |
+ size_t user_text_length) override; |
+ void OnBeforePossibleChange() override; |
+ bool OnAfterPossibleChange(bool allow_keyword_ui_change) override; |
+ bool IsImeComposing() const override; |
+ bool IsIndicatingQueryRefinement() const override; |
+ |
+ // OmniboxView stubs. |
+ void Update() override {} |
+ void EnterKeywordModeForDefaultSearchProvider() override {} |
+ bool IsSelectAll() const override; |
+ bool DeleteAtEndPressed() override; |
+ void GetSelectionBounds(base::string16::size_type* start, |
+ base::string16::size_type* end) const override; |
+ void SelectAll(bool reversed) override {} |
+ void SetFocus() override {} |
+ void ApplyCaretVisibility() override {} |
+ void OnInlineAutocompleteTextCleared() override {} |
+ void OnRevertTemporaryText() override {} |
+ gfx::NativeView GetNativeView() const override; |
+ gfx::NativeView GetRelativeWindowForPopup() const override; |
+ int GetTextWidth() const override; |
+ int GetWidth() const override; |
+ |
+ // AutocompleteTextFieldDelegate methods |
+ void OnDidBeginEditing(); |
+ bool OnWillChange(NSRange range, NSString* new_text); |
+ void OnDidChange(bool processing_user_input); |
+ void OnDidEndEditing(); |
+ void OnAccept(); |
+ void OnClear(); |
+ bool OnCopy(); |
+ bool OnCopyURL(); |
+ bool CanCopyURL(); |
+ void WillPaste(); |
+ void OnDeleteBackward(); |
+ |
+ ios::ChromeBrowserState* browser_state() { return browser_state_; } |
+ |
+ // Updates this edit view to show the proper text, highlight and images. |
+ void UpdateAppearance(); |
+ |
+ // Clears the text from the omnibox. |
+ void ClearText(); |
+ |
+ // Set first result image. |
+ void SetLeftImage(const int imageId); |
+ |
+ // Hide keyboard and call OnDidEndEditing. This dismisses the keyboard and |
+ // also finalizes the editing state of the omnibox. |
+ void HideKeyboardAndEndEditing(); |
+ |
+ // Hide keyboard only. Used when omnibox popups grab focus but editing isn't |
+ // complete. |
+ void HideKeyboard(); |
+ |
+ // Focus the omnibox field. This is used when the omnibox popup copies a |
+ // search query to the omnibox so the user can modify it further. |
+ // This does not affect the popup state and is a NOOP if the omnibox is |
+ // already focused. |
+ void FocusOmnibox(); |
+ |
+ // Called when the popup results change. Used to update prerendering. |
+ void OnPopupResultsChanged(const AutocompleteResult& result); |
+ |
+ // Returns |true| if AutocompletePopupView is currently open. |
+ BOOL IsPopupOpen(); |
+ |
+ // Returns the resource ID of the icon to show for the current text. Takes |
+ // into account the security level of the page, and |offline_page|. |
+ int GetIcon(bool offline_page) const; |
+ |
+ protected: |
+ int GetOmniboxTextLength() const override; |
+ void EmphasizeURLComponents() override; |
+ |
+ private: |
+ // Calculates text attributes according to |display_text| and |
+ // returns them in an autoreleased object. |
+ NSAttributedString* ApplyTextAttributes(const base::string16& text); |
+ |
+ // Removes the query refinement chip from the omnibox. |
+ void RemoveQueryRefinementChip(); |
+ |
+ // Returns true if user input should currently be ignored. On iOS7, |
+ // modifying the contents of a text field while Siri is pending leads to a |
+ // UIKit crash. In order to sidestep that crash, OmniboxViewIOS checks that |
+ // voice search is not pending before attempting to process user actions that |
+ // may modify text field contents. |
+ // TODO(crbug.com/303212): Remove this workaround once the crash is fixed. |
+ bool ShouldIgnoreUserInputDueToPendingVoiceSearch(); |
+ |
+ ios::ChromeBrowserState* browser_state_; |
+ |
+ base::scoped_nsobject<OmniboxTextFieldIOS> field_; |
+ WebOmniboxEditController* controller_; // weak, owns us |
+ std::unique_ptr<OmniboxPopupViewIOS> popup_view_; |
+ id<PreloadProvider> preloader_; |
+ |
+ State state_before_change_; |
+ base::scoped_nsobject<NSString> marked_text_before_change_; |
+ NSRange current_selection_; |
+ NSRange old_selection_; |
+ |
+ // TODO(rohitrao): This is a monster hack, needed because closing the popup |
+ // ends up inadvertently triggering a new round of autocomplete. Fix the |
+ // underlying problem, which is that textDidChange: is called when closing the |
+ // popup, and then remove this hack. b/5877366. |
+ BOOL ignore_popup_updates_; |
+ |
+ // Bridges delegate method calls from |field_| to C++ land. |
+ base::scoped_nsobject<AutocompleteTextFieldDelegate> field_delegate_; |
+}; |
+ |
+#endif // IOS_CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_VIEW_IOS_H_ |