Home | History | Annotate | Download | only in location_bar
      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 #ifndef CHROME_BROWSER_UI_COCOA_LOCATION_BAR_LOCATION_BAR_VIEW_MAC_H_
      6 #define CHROME_BROWSER_UI_COCOA_LOCATION_BAR_LOCATION_BAR_VIEW_MAC_H_
      7 
      8 #include <string>
      9 
     10 #import <Cocoa/Cocoa.h>
     11 
     12 #include "base/memory/scoped_ptr.h"
     13 #include "base/memory/scoped_vector.h"
     14 #include "base/memory/weak_ptr.h"
     15 #include "base/prefs/pref_member.h"
     16 #include "chrome/browser/ui/browser.h"
     17 #include "chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.h"
     18 #include "chrome/browser/ui/omnibox/location_bar.h"
     19 #include "chrome/browser/ui/omnibox/omnibox_edit_controller.h"
     20 #include "chrome/browser/ui/search/search_model_observer.h"
     21 #include "chrome/common/content_settings_types.h"
     22 
     23 @class AutocompleteTextField;
     24 class CommandUpdater;
     25 class ContentSettingDecoration;
     26 class EVBubbleDecoration;
     27 class GeneratedCreditCardDecoration;
     28 class KeywordHintDecoration;
     29 class LocationBarDecoration;
     30 class LocationIconDecoration;
     31 class MicSearchDecoration;
     32 class OriginChipDecoration;
     33 class PageActionDecoration;
     34 class Profile;
     35 class SearchButtonDecoration;
     36 class SelectedKeywordDecoration;
     37 class StarDecoration;
     38 class TranslateDecoration;
     39 class ZoomDecoration;
     40 class ZoomDecorationTest;
     41 
     42 // A C++ bridge class that represents the location bar UI element to
     43 // the portable code.  Wires up an OmniboxViewMac instance to
     44 // the location bar text field, which handles most of the work.
     45 
     46 class LocationBarViewMac : public LocationBar,
     47                            public LocationBarTesting,
     48                            public OmniboxEditController,
     49                            public content::NotificationObserver,
     50                            public SearchModelObserver {
     51  public:
     52   LocationBarViewMac(AutocompleteTextField* field,
     53                      CommandUpdater* command_updater,
     54                      Profile* profile,
     55                      Browser* browser);
     56   virtual ~LocationBarViewMac();
     57 
     58   // Overridden from LocationBar:
     59   virtual void ShowFirstRunBubble() OVERRIDE;
     60   virtual GURL GetDestinationURL() const OVERRIDE;
     61   virtual WindowOpenDisposition GetWindowOpenDisposition() const OVERRIDE;
     62   virtual content::PageTransition GetPageTransition() const OVERRIDE;
     63   virtual void AcceptInput() OVERRIDE;
     64   virtual void FocusLocation(bool select_all) OVERRIDE;
     65   virtual void FocusSearch() OVERRIDE;
     66   virtual void UpdateContentSettingsIcons() OVERRIDE;
     67   virtual void UpdateManagePasswordsIconAndBubble() OVERRIDE {};
     68   virtual void UpdatePageActions() OVERRIDE;
     69   virtual void InvalidatePageActions() OVERRIDE;
     70   virtual void UpdateOpenPDFInReaderPrompt() OVERRIDE;
     71   virtual void UpdateGeneratedCreditCardView() OVERRIDE;
     72   virtual void SaveStateToContents(content::WebContents* contents) OVERRIDE;
     73   virtual void Revert() OVERRIDE;
     74   virtual const OmniboxView* GetOmniboxView() const OVERRIDE;
     75   virtual OmniboxView* GetOmniboxView() OVERRIDE;
     76   virtual LocationBarTesting* GetLocationBarForTesting() OVERRIDE;
     77 
     78   // Overridden from LocationBarTesting:
     79   virtual int PageActionCount() OVERRIDE;
     80   virtual int PageActionVisibleCount() OVERRIDE;
     81   virtual ExtensionAction* GetPageAction(size_t index) OVERRIDE;
     82   virtual ExtensionAction* GetVisiblePageAction(size_t index) OVERRIDE;
     83   virtual void TestPageActionPressed(size_t index) OVERRIDE;
     84   virtual bool GetBookmarkStarVisibility() OVERRIDE;
     85 
     86   // Set/Get the editable state of the field.
     87   void SetEditable(bool editable);
     88   bool IsEditable();
     89 
     90   // Set the starred state of the bookmark star.
     91   void SetStarred(bool starred);
     92 
     93   // Set whether or not the translate icon is lit.
     94   void SetTranslateIconLit(bool on);
     95 
     96   // Happens when the zoom changes for the active tab. |can_show_bubble| is
     97   // false when the change in zoom for the active tab wasn't an explicit user
     98   // action (e.g. switching tabs, creating a new tab, creating a new browser).
     99   // Additionally, |can_show_bubble| will only be true when the bubble wouldn't
    100   // be obscured by other UI (wrench menu) or redundant (+/- from wrench).
    101   void ZoomChangedForActiveTab(bool can_show_bubble);
    102 
    103   // Checks if the bookmark star should be enabled or not.
    104   bool IsStarEnabled() const;
    105 
    106   // Get the point in window coordinates on the star for the bookmark bubble to
    107   // aim at. Only works if IsStarEnabled returns YES.
    108   NSPoint GetBookmarkBubblePoint() const;
    109 
    110   // Get the point in window coordinates on the star for the Translate bubble to
    111   // aim at.
    112   NSPoint GetTranslateBubblePoint() const;
    113 
    114   // Get the point in window coordinates in the security icon at which the page
    115   // info bubble aims.
    116   NSPoint GetPageInfoBubblePoint() const;
    117 
    118   // Get the point in window coordinates in the "generated cc" icon at which the
    119   // corresponding info bubble aims.
    120   NSPoint GetGeneratedCreditCardBubblePoint() const;
    121 
    122   // When any image decorations change, call this to ensure everything is
    123   // redrawn and laid out if necessary.
    124   void OnDecorationsChanged();
    125 
    126   // Layout the various decorations which live in the field.
    127   void Layout();
    128 
    129   // Re-draws |decoration| if it's already being displayed.
    130   void RedrawDecoration(LocationBarDecoration* decoration);
    131 
    132   // Sets preview_enabled_ for the PageActionImageView associated with this
    133   // |page_action|. If |preview_enabled|, the location bar will display the
    134   // PageAction icon even if it has not been activated by the extension.
    135   // This is used by the ExtensionInstalledBubble to preview what the icon
    136   // will look like for the user upon installation of the extension.
    137   void SetPreviewEnabledPageAction(ExtensionAction* page_action,
    138                                    bool preview_enabled);
    139 
    140   // Retrieve the frame for the given |page_action|.
    141   NSRect GetPageActionFrame(ExtensionAction* page_action);
    142 
    143   // Return |page_action|'s info-bubble point in window coordinates.
    144   // This function should always be called with a visible page action.
    145   // If |page_action| is not a page action or not visible, NOTREACHED()
    146   // is called and this function returns |NSZeroPoint|.
    147   NSPoint GetPageActionBubblePoint(ExtensionAction* page_action);
    148 
    149   // OmniboxEditController:
    150   virtual void Update(const content::WebContents* contents) OVERRIDE;
    151   virtual void OnChanged() OVERRIDE;
    152   virtual void OnSetFocus() OVERRIDE;
    153   virtual void ShowURL() OVERRIDE;
    154   virtual void EndOriginChipAnimations(bool cancel_fade) OVERRIDE;
    155   virtual InstantController* GetInstant() OVERRIDE;
    156   virtual content::WebContents* GetWebContents() OVERRIDE;
    157   virtual ToolbarModel* GetToolbarModel() OVERRIDE;
    158   virtual const ToolbarModel* GetToolbarModel() const OVERRIDE;
    159 
    160   NSImage* GetKeywordImage(const base::string16& keyword);
    161 
    162   AutocompleteTextField* GetAutocompleteTextField() { return field_; }
    163 
    164 
    165   // content::NotificationObserver:
    166   virtual void Observe(int type,
    167                        const content::NotificationSource& source,
    168                        const content::NotificationDetails& details) OVERRIDE;
    169 
    170   // SearchModelObserver:
    171   virtual void ModelChanged(const SearchModel::State& old_state,
    172                             const SearchModel::State& new_state) OVERRIDE;
    173 
    174   Browser* browser() const { return browser_; }
    175 
    176   // Activates the page action for the extension that has the given id.
    177   void ActivatePageAction(const std::string& extension_id);
    178 
    179  protected:
    180   // OmniboxEditController:
    181   virtual void HideURL() OVERRIDE;
    182 
    183  private:
    184   friend ZoomDecorationTest;
    185 
    186   // Posts |notification| to the default notification center.
    187   void PostNotification(NSString* notification);
    188 
    189   // Return the decoration for |page_action|.
    190   PageActionDecoration* GetPageActionDecoration(ExtensionAction* page_action);
    191 
    192   // Clear the page-action decorations.
    193   void DeletePageActionDecorations();
    194 
    195   void OnEditBookmarksEnabledChanged();
    196 
    197   // Re-generate the page-action decorations from the profile's
    198   // extension service.
    199   void RefreshPageActionDecorations();
    200 
    201   // Updates visibility of the content settings icons based on the current
    202   // tab contents state.
    203   bool RefreshContentSettingsDecorations();
    204 
    205   void ShowFirstRunBubbleInternal();
    206 
    207   // Updates the translate decoration in the omnibox with the current translate
    208   // state.
    209   void UpdateTranslateDecoration();
    210 
    211   // Updates the zoom decoration in the omnibox with the current zoom level.
    212   void UpdateZoomDecoration();
    213 
    214   // Ensures the star decoration is visible or hidden, as required.
    215   void UpdateStarDecorationVisibility();
    216 
    217   // Updates the voice search decoration. Returns true if the visible state was
    218   // changed.
    219   bool UpdateMicSearchDecorationVisibility();
    220 
    221   scoped_ptr<OmniboxViewMac> omnibox_view_;
    222 
    223   AutocompleteTextField* field_;  // owned by tab controller
    224 
    225   // A decoration that shows an icon to the left of the address.
    226   scoped_ptr<LocationIconDecoration> location_icon_decoration_;
    227 
    228   // A decoration that shows the keyword-search bubble on the left.
    229   scoped_ptr<SelectedKeywordDecoration> selected_keyword_decoration_;
    230 
    231   // A decoration that shows a lock icon and ev-cert label in a bubble
    232   // on the left.
    233   scoped_ptr<EVBubbleDecoration> ev_bubble_decoration_;
    234 
    235   // Bookmark star right of page actions.
    236   scoped_ptr<StarDecoration> star_decoration_;
    237 
    238   // Translate icon at the end of the ominibox.
    239   scoped_ptr<TranslateDecoration> translate_decoration_;
    240 
    241   // A zoom icon at the end of the omnibox, which shows at non-standard zoom
    242   // levels.
    243   scoped_ptr<ZoomDecoration> zoom_decoration_;
    244 
    245   // The installed page actions.
    246   std::vector<ExtensionAction*> page_actions_;
    247 
    248   // Decorations for the installed Page Actions.
    249   ScopedVector<PageActionDecoration> page_action_decorations_;
    250 
    251   // The content blocked decorations.
    252   ScopedVector<ContentSettingDecoration> content_setting_decorations_;
    253 
    254   // Keyword hint decoration displayed on the right-hand side.
    255   scoped_ptr<KeywordHintDecoration> keyword_hint_decoration_;
    256 
    257   // The voice search icon.
    258   scoped_ptr<MicSearchDecoration> mic_search_decoration_;
    259 
    260   // Generated CC hint decoration.
    261   scoped_ptr<GeneratedCreditCardDecoration> generated_credit_card_decoration_;
    262 
    263   // The right-hand-side search button that is shown on search result pages.
    264   scoped_ptr<SearchButtonDecoration> search_button_decoration_;
    265 
    266   // The left-hand-side origin chip.
    267   scoped_ptr<OriginChipDecoration> origin_chip_decoration_;
    268 
    269   Browser* browser_;
    270 
    271   // Used to register for notifications received by NotificationObserver.
    272   content::NotificationRegistrar registrar_;
    273 
    274   // Used to schedule a task for the first run info bubble.
    275   base::WeakPtrFactory<LocationBarViewMac> weak_ptr_factory_;
    276 
    277   // Used to change the visibility of the star decoration.
    278   BooleanPrefMember edit_bookmarks_enabled_;
    279 
    280   DISALLOW_COPY_AND_ASSIGN(LocationBarViewMac);
    281 };
    282 
    283 #endif  // CHROME_BROWSER_UI_COCOA_LOCATION_BAR_LOCATION_BAR_VIEW_MAC_H_
    284