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