Home | History | Annotate | Download | only in omnibox
      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.
      4 
      5 // This file defines the interface class OmniboxView.  Each toolkit will
      6 // implement the edit view differently, so that code is inherently platform
      7 // specific.  However, the OmniboxEditModel needs to do some communication with
      8 // the view.  Since the model is shared between platforms, we need to define an
      9 // interface that all view implementations will share.
     10 
     11 #ifndef CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_VIEW_H_
     12 #define CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_VIEW_H_
     13 
     14 #include <string>
     15 
     16 #include "base/strings/string16.h"
     17 #include "base/strings/string_util.h"
     18 #include "base/strings/utf_string_conversions.h"
     19 #include "chrome/browser/autocomplete/autocomplete_match.h"
     20 #include "chrome/browser/ui/omnibox/omnibox_edit_model.h"
     21 #include "content/public/common/url_constants.h"
     22 #include "ui/base/window_open_disposition.h"
     23 #include "ui/gfx/native_widget_types.h"
     24 
     25 class CommandUpdater;
     26 class GURL;
     27 class OmniboxEditController;
     28 class OmniboxViewMacTest;
     29 class Profile;
     30 class ToolbarModel;
     31 
     32 namespace content {
     33 class WebContents;
     34 }
     35 
     36 class OmniboxView {
     37  public:
     38   virtual ~OmniboxView();
     39 
     40   // Used by the automation system for getting at the model from the view.
     41   OmniboxEditModel* model() { return model_.get(); }
     42   const OmniboxEditModel* model() const { return model_.get(); }
     43 
     44   CommandUpdater* command_updater() { return command_updater_; }
     45   const CommandUpdater* command_updater() const { return command_updater_; }
     46 
     47   // Handle mouse release events concerning the origin chip.
     48   void HandleOriginChipMouseRelease();
     49 
     50   // Shared cross-platform focus handling.
     51   void OnDidKillFocus();
     52 
     53   // For use when switching tabs, this saves the current state onto the tab so
     54   // that it can be restored during a later call to Update().
     55   virtual void SaveStateToTab(content::WebContents* tab) = 0;
     56 
     57   // Called when the window's active tab changes.
     58   virtual void OnTabChanged(const content::WebContents* web_contents) = 0;
     59 
     60   // Called when any relevant state changes other than changing tabs.
     61   virtual void Update() = 0;
     62 
     63   // Asks the browser to load the specified match, using the supplied
     64   // disposition. |alternate_nav_url|, if non-empty, contains the
     65   // alternate navigation URL for for this match. See comments on
     66   // AutocompleteResult::GetAlternateNavURL().
     67   //
     68   // |pasted_text| should only be set if this call is due to a
     69   // Paste-And-Go/Search action.
     70   //
     71   // |selected_line| is passed to SendOpenNotification(); see comments there.
     72   //
     73   // This may close the popup.
     74   virtual void OpenMatch(const AutocompleteMatch& match,
     75                          WindowOpenDisposition disposition,
     76                          const GURL& alternate_nav_url,
     77                          const base::string16& pasted_text,
     78                          size_t selected_line);
     79 
     80   // Returns the current text of the edit control, which could be the
     81   // "temporary" text set by the popup, the "permanent" text set by the
     82   // browser, or just whatever the user has currently typed.
     83   virtual base::string16 GetText() const = 0;
     84 
     85   // |true| if the user is in the process of editing the field, or if
     86   // the field is empty.
     87   bool IsEditingOrEmpty() const;
     88 
     89   // Returns the resource ID of the icon to show for the current text.
     90   int GetIcon() const;
     91 
     92   // Returns the hint text that can be displayed when there is no text in the
     93   // omnibox.
     94   base::string16 GetHintText() const;
     95 
     96   // The user text is the text the user has manually keyed in.  When present,
     97   // this is shown in preference to the permanent text; hitting escape will
     98   // revert to the permanent text.
     99   void SetUserText(const base::string16& text);
    100   virtual void SetUserText(const base::string16& text,
    101                            const base::string16& display_text,
    102                            bool update_popup);
    103 
    104   // Sets the window text and the caret position. |notify_text_changed| is true
    105   // if the model should be notified of the change.
    106   virtual void SetWindowTextAndCaretPos(const base::string16& text,
    107                                         size_t caret_pos,
    108                                         bool update_popup,
    109                                         bool notify_text_changed) = 0;
    110 
    111   // Sets the edit to forced query mode.  Practically speaking, this means that
    112   // if the edit is not in forced query mode, its text is set to "?" with the
    113   // cursor at the end, and if the edit is in forced query mode (its first
    114   // non-whitespace character is '?'), the text after the '?' is selected.
    115   //
    116   // In the future we should display the search engine UI for the default engine
    117   // rather than '?'.
    118   virtual void SetForcedQuery() = 0;
    119 
    120   // Returns true if all text is selected or there is no text at all.
    121   virtual bool IsSelectAll() const = 0;
    122 
    123   // Returns true if the user deleted the suggested text.
    124   virtual bool DeleteAtEndPressed() = 0;
    125 
    126   // Fills |start| and |end| with the indexes of the current selection's bounds.
    127   // It is not guaranteed that |*start < *end|, as the selection can be
    128   // directed.  If there is no selection, |start| and |end| will both be equal
    129   // to the current cursor position.
    130   virtual void GetSelectionBounds(size_t* start, size_t* end) const = 0;
    131 
    132   // Selects all the text in the edit.  Use this in place of SetSelAll() to
    133   // avoid selecting the "phantom newline" at the end of the edit.
    134   virtual void SelectAll(bool reversed) = 0;
    135 
    136   // Sets focus, disables search term replacement, reverts the omnibox, and
    137   // selects all.
    138   void ShowURL();
    139 
    140   // Enables search term replacement and reverts the omnibox.
    141   void HideURL();
    142 
    143   // Re-enables search term replacement on the ToolbarModel, and reverts the
    144   // edit and popup back to their unedited state (permanent text showing, popup
    145   // closed, no user input in progress).
    146   virtual void RevertAll();
    147 
    148   // Like RevertAll(), but does not touch the search term replacement state.
    149   void RevertWithoutResettingSearchTermReplacement();
    150 
    151   // Updates the autocomplete popup and other state after the text has been
    152   // changed by the user.
    153   virtual void UpdatePopup() = 0;
    154 
    155   // Closes the autocomplete popup, if it's open. The name |ClosePopup|
    156   // conflicts with the OSX class override as that has a base class that also
    157   // defines a method with that name.
    158   virtual void CloseOmniboxPopup();
    159 
    160   // Sets the focus to the autocomplete view.
    161   virtual void SetFocus() = 0;
    162 
    163   // Shows or hides the caret based on whether the model's is_caret_visible() is
    164   // true.
    165   virtual void ApplyCaretVisibility() = 0;
    166 
    167   // Called when the temporary text in the model may have changed.
    168   // |display_text| is the new text to show; |save_original_selection| is true
    169   // when there wasn't previously a temporary text and thus we need to save off
    170   // the user's existing selection. |notify_text_changed| is true if the model
    171   // should be notified of the change.
    172   virtual void OnTemporaryTextMaybeChanged(const base::string16& display_text,
    173                                            bool save_original_selection,
    174                                            bool notify_text_changed) = 0;
    175 
    176   // Called when the inline autocomplete text in the model may have changed.
    177   // |display_text| is the new text to show; |user_text_length| is the length of
    178   // the user input portion of that (so, up to but not including the inline
    179   // autocompletion).  Returns whether the display text actually changed.
    180   virtual bool OnInlineAutocompleteTextMaybeChanged(
    181       const base::string16& display_text, size_t user_text_length) = 0;
    182 
    183   // Called when the inline autocomplete text in the model has been cleared.
    184   virtual void OnInlineAutocompleteTextCleared() = 0;
    185 
    186   // Called when the temporary text has been reverted by the user.  This will
    187   // reset the user's original selection.
    188   virtual void OnRevertTemporaryText() = 0;
    189 
    190   // Checkpoints the current edit state before an operation that might trigger
    191   // a new autocomplete run to open or modify the popup. Call this before
    192   // user-initiated edit actions that trigger autocomplete, but *not* for
    193   // automatic changes to the textfield that should not affect autocomplete.
    194   virtual void OnBeforePossibleChange() = 0;
    195   // OnAfterPossibleChange() returns true if there was a change that caused it
    196   // to call UpdatePopup().
    197   virtual bool OnAfterPossibleChange() = 0;
    198 
    199   // Returns the gfx::NativeView of the edit view.
    200   virtual gfx::NativeView GetNativeView() const = 0;
    201 
    202   // Gets the relative window for the pop up window of OmniboxPopupView. The pop
    203   // up window will be shown under the relative window. When an IME is attached
    204   // to the rich edit control, the IME window is the relative window. Otherwise,
    205   // the top-most window is the relative window.
    206   virtual gfx::NativeView GetRelativeWindowForPopup() const = 0;
    207 
    208   // Shows |input| as gray suggested text after what the user has typed.
    209   virtual void SetGrayTextAutocompletion(const base::string16& input) = 0;
    210 
    211   // Returns the current gray suggested text.
    212   virtual base::string16 GetGrayTextAutocompletion() const = 0;
    213 
    214   // Returns the width in pixels needed to display the current text. The
    215   // returned value includes margins.
    216   virtual int GetTextWidth() const = 0;
    217 
    218   // Returns the omnibox's width in pixels.
    219   virtual int GetWidth() const = 0;
    220 
    221   // Returns true if the user is composing something in an IME.
    222   virtual bool IsImeComposing() const = 0;
    223 
    224   // Returns true if we know for sure that an IME is showing a popup window,
    225   // which may overlap the omnibox's popup window.
    226   virtual bool IsImeShowingPopup() const;
    227 
    228   // Display a virtual keybaord or alternate input view if enabled.
    229   virtual void ShowImeIfNeeded();
    230 
    231   // Returns true if the view is displaying UI that indicates that query
    232   // refinement will take place when the user selects the current match.  For
    233   // search matches, this will cause the omnibox to search over the existing
    234   // corpus (e.g. Images) rather than start a new Web search.  This method will
    235   // only ever return true on mobile ports.
    236   virtual bool IsIndicatingQueryRefinement() const;
    237 
    238   // Called after a |match| has been opened for the given |profile| and
    239   // |web_contents|.
    240   virtual void OnMatchOpened(const AutocompleteMatch& match,
    241                              Profile* profile,
    242                              content::WebContents* web_contents) const;
    243 
    244   // Returns |text| with any leading javascript schemas stripped.
    245   static base::string16 StripJavascriptSchemas(const base::string16& text);
    246 
    247   // First, calls StripJavascriptSchemas().  Then automatically collapses
    248   // internal whitespace as follows:
    249   // * If the only whitespace in |text| is newlines, users are most likely
    250   // pasting in URLs split into multiple lines by terminals, email programs,
    251   // etc. So all newlines are removed.
    252   // * Otherwise, users may be pasting in search data, e.g. street addresses. In
    253   // this case, runs of whitespace are collapsed down to single spaces.
    254   static base::string16 SanitizeTextForPaste(const base::string16& text);
    255 
    256   // Returns the current clipboard contents as a string that can be pasted in.
    257   // In addition to just getting CF_UNICODETEXT out, this can also extract URLs
    258   // from bookmarks on the clipboard.
    259   static base::string16 GetClipboardText();
    260 
    261  protected:
    262   OmniboxView(Profile* profile,
    263               OmniboxEditController* controller,
    264               CommandUpdater* command_updater);
    265 
    266   // Internally invoked whenever the text changes in some way.
    267   virtual void TextChanged();
    268 
    269   // Return the number of characters in the current buffer. The name
    270   // |GetTextLength| can't be used as the Windows override of this class
    271   // inherits from a class that defines a method with that name.
    272   virtual int GetOmniboxTextLength() const = 0;
    273 
    274   // Try to parse the current text as a URL and colorize the components.
    275   virtual void EmphasizeURLComponents() = 0;
    276 
    277   OmniboxEditController* controller() { return controller_; }
    278   const OmniboxEditController* controller() const { return controller_; }
    279 
    280  private:
    281   friend class OmniboxViewMacTest;
    282   FRIEND_TEST_ALL_PREFIXES(InstantExtendedTest, ShowURL);
    283 
    284   // |model_| can be NULL in tests.
    285   scoped_ptr<OmniboxEditModel> model_;
    286   OmniboxEditController* controller_;
    287 
    288   // The object that handles additional command functionality exposed on the
    289   // edit, such as invoking the keyword editor.
    290   CommandUpdater* command_updater_;
    291 };
    292 
    293 #endif  // CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_VIEW_H_
    294