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_COCOA_LOCATION_BAR_LOCATION_BAR_VIEW_MAC_H_
6 #define CHROME_BROWSER_UI_COCOA_LOCATION_BAR_LOCATION_BAR_VIEW_MAC_H_
10 #import <Cocoa/Cocoa.h>
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/location_bar/location_bar.h"
19 #include "chrome/browser/ui/omnibox/chrome_omnibox_edit_controller.h"
20 #include "chrome/browser/ui/search/search_model_observer.h"
21 #include "components/content_settings/core/common/content_settings_types.h"
22 #include "components/ui/zoom/zoom_event_manager_observer.h"
24 @
class AutocompleteTextField
;
26 class ContentSettingDecoration
;
27 class EVBubbleDecoration
;
28 class GeneratedCreditCardDecoration
;
29 class KeywordHintDecoration
;
30 class LocationBarDecoration
;
31 class LocationIconDecoration
;
32 class ManagePasswordsDecoration
;
33 class MicSearchDecoration
;
34 class PageActionDecoration
;
36 class SelectedKeywordDecoration
;
38 class TranslateDecoration
;
40 class ZoomDecorationTest
;
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.
46 class LocationBarViewMac
: public LocationBar
,
47 public LocationBarTesting
,
48 public ChromeOmniboxEditController
,
49 public SearchModelObserver
,
50 public ui_zoom::ZoomEventManagerObserver
{
52 LocationBarViewMac(AutocompleteTextField
* field
,
53 CommandUpdater
* command_updater
,
56 ~LocationBarViewMac() override
;
58 // Overridden from LocationBar:
59 void ShowFirstRunBubble() override
;
60 GURL
GetDestinationURL() const override
;
61 WindowOpenDisposition
GetWindowOpenDisposition() const override
;
62 ui::PageTransition
GetPageTransition() const override
;
63 void AcceptInput() override
;
64 void FocusLocation(bool select_all
) override
;
65 void FocusSearch() override
;
66 void UpdateContentSettingsIcons() override
;
67 void UpdateManagePasswordsIconAndBubble() override
;
68 void UpdatePageActions() override
;
69 void UpdateBookmarkStarVisibility() override
;
70 void UpdateLocationBarVisibility(bool visible
, bool animate
) override
;
71 bool ShowPageActionPopup(const extensions::Extension
* extension
,
72 bool grant_active_tab
) override
;
73 void UpdateOpenPDFInReaderPrompt() override
;
74 void UpdateGeneratedCreditCardView() override
;
75 void SaveStateToContents(content::WebContents
* contents
) override
;
76 void Revert() override
;
77 const OmniboxView
* GetOmniboxView() const override
;
78 OmniboxView
* GetOmniboxView() override
;
79 LocationBarTesting
* GetLocationBarForTesting() override
;
81 // Overridden from LocationBarTesting:
82 int PageActionCount() override
;
83 int PageActionVisibleCount() override
;
84 ExtensionAction
* GetPageAction(size_t index
) override
;
85 ExtensionAction
* GetVisiblePageAction(size_t index
) override
;
86 void TestPageActionPressed(size_t index
) override
;
87 bool GetBookmarkStarVisibility() override
;
89 // Set/Get the editable state of the field.
90 void SetEditable(bool editable
);
93 // Set the starred state of the bookmark star.
94 void SetStarred(bool starred
);
96 // Set whether or not the translate icon is lit.
97 void SetTranslateIconLit(bool on
);
99 // Happens when the zoom changes for the active tab. |can_show_bubble| is
100 // false when the change in zoom for the active tab wasn't an explicit user
101 // action (e.g. switching tabs, creating a new tab, creating a new browser).
102 // Additionally, |can_show_bubble| will only be true when the bubble wouldn't
103 // be obscured by other UI (wrench menu) or redundant (+/- from wrench).
104 void ZoomChangedForActiveTab(bool can_show_bubble
);
106 // Checks if the bookmark star should be enabled or not.
107 bool IsStarEnabled() const;
109 // Get the point in window coordinates on the star for the bookmark bubble to
110 // aim at. Only works if IsStarEnabled returns YES.
111 NSPoint
GetBookmarkBubblePoint() const;
113 // Get the point in window coordinates on the star for the Translate bubble to
115 NSPoint
GetTranslateBubblePoint() const;
117 // Get the point in window coordinates in the lock icon for the Manage
118 // Passwords bubble to aim at.
119 NSPoint
GetManagePasswordsBubblePoint() const;
121 // Get the point in window coordinates in the security icon at which the page
123 NSPoint
GetPageInfoBubblePoint() const;
125 // Get the point in window coordinates in the "generated cc" icon at which the
126 // corresponding info bubble aims.
127 NSPoint
GetGeneratedCreditCardBubblePoint() const;
129 // When any image decorations change, call this to ensure everything is
130 // redrawn and laid out if necessary.
131 void OnDecorationsChanged();
133 // Layout the various decorations which live in the field.
136 // Re-draws |decoration| if it's already being displayed.
137 void RedrawDecoration(LocationBarDecoration
* decoration
);
139 // Sets preview_enabled_ for the PageActionImageView associated with this
140 // |page_action|. If |preview_enabled|, the location bar will display the
141 // PageAction icon even if it has not been activated by the extension.
142 // This is used by the ExtensionInstalledBubble to preview what the icon
143 // will look like for the user upon installation of the extension.
144 void SetPreviewEnabledPageAction(ExtensionAction
* page_action
,
145 bool preview_enabled
);
147 // Retrieve the frame for the given |page_action|.
148 NSRect
GetPageActionFrame(ExtensionAction
* page_action
);
150 // Return |page_action|'s info-bubble point in window coordinates.
151 // This function should always be called with a visible page action.
152 // If |page_action| is not a page action or not visible, NOTREACHED()
153 // is called and this function returns |NSZeroPoint|.
154 NSPoint
GetPageActionBubblePoint(ExtensionAction
* page_action
);
156 // Updates the controller, and, if |contents| is non-null, restores saved
157 // state that the tab holds.
158 void Update(const content::WebContents
* contents
);
160 // Clears any location bar state stored for |contents|.
161 void ResetTabState(content::WebContents
* contents
);
163 // ChromeOmniboxEditController:
164 void UpdateWithoutTabRestore() override
;
165 void OnChanged() override
;
166 void OnSetFocus() override
;
167 void ShowURL() override
;
168 ToolbarModel
* GetToolbarModel() override
;
169 const ToolbarModel
* GetToolbarModel() const override
;
170 content::WebContents
* GetWebContents() override
;
172 NSImage
* GetKeywordImage(const base::string16
& keyword
);
174 AutocompleteTextField
* GetAutocompleteTextField() { return field_
; }
176 ManagePasswordsDecoration
* manage_passwords_decoration() {
177 return manage_passwords_decoration_
.get();
180 // SearchModelObserver:
181 void ModelChanged(const SearchModel::State
& old_state
,
182 const SearchModel::State
& new_state
) override
;
184 Browser
* browser() const { return browser_
; }
186 // ZoomManagerObserver:
187 // Updates the view for the zoom icon when default zoom levels change.
188 void OnDefaultZoomLevelChanged() override
;
191 friend ZoomDecorationTest
;
193 // Posts |notification| to the default notification center.
194 void PostNotification(NSString
* notification
);
196 // Return the decoration for |page_action|.
197 PageActionDecoration
* GetPageActionDecoration(ExtensionAction
* page_action
);
199 // Clear the page-action decorations.
200 void DeletePageActionDecorations();
202 void OnEditBookmarksEnabledChanged();
204 // Re-generate the page-action decorations from the profile's
205 // extension service.
206 void RefreshPageActionDecorations();
208 // Whether the page actions represented by |page_action_decorations_| differ
209 // in ordering or value from |page_actions|.
210 bool PageActionsDiffer(
211 const std::vector
<ExtensionAction
*>& page_actions
) const;
213 // Updates visibility of the content settings icons based on the current
214 // tab contents state.
215 bool RefreshContentSettingsDecorations();
217 void ShowFirstRunBubbleInternal();
219 // Updates the translate decoration in the omnibox with the current translate
221 void UpdateTranslateDecoration();
223 // Updates the zoom decoration in the omnibox with the current zoom level.
224 // Returns whether any updates were made.
225 bool UpdateZoomDecoration(bool default_zoom_changed
);
227 // Updates the voice search decoration. Returns true if the visible state was
229 bool UpdateMicSearchDecorationVisibility();
231 scoped_ptr
<OmniboxViewMac
> omnibox_view_
;
233 AutocompleteTextField
* field_
; // owned by tab controller
235 // A decoration that shows an icon to the left of the address.
236 scoped_ptr
<LocationIconDecoration
> location_icon_decoration_
;
238 // A decoration that shows the keyword-search bubble on the left.
239 scoped_ptr
<SelectedKeywordDecoration
> selected_keyword_decoration_
;
241 // A decoration that shows a lock icon and ev-cert label in a bubble
243 scoped_ptr
<EVBubbleDecoration
> ev_bubble_decoration_
;
245 // Bookmark star right of page actions.
246 scoped_ptr
<StarDecoration
> star_decoration_
;
248 // Translate icon at the end of the ominibox.
249 scoped_ptr
<TranslateDecoration
> translate_decoration_
;
251 // A zoom icon at the end of the omnibox, which shows at non-standard zoom
253 scoped_ptr
<ZoomDecoration
> zoom_decoration_
;
255 // Decorations for the installed Page Actions.
256 ScopedVector
<PageActionDecoration
> page_action_decorations_
;
258 // The content blocked decorations.
259 ScopedVector
<ContentSettingDecoration
> content_setting_decorations_
;
261 // Keyword hint decoration displayed on the right-hand side.
262 scoped_ptr
<KeywordHintDecoration
> keyword_hint_decoration_
;
264 // The voice search icon.
265 scoped_ptr
<MicSearchDecoration
> mic_search_decoration_
;
267 // Generated CC hint decoration.
268 scoped_ptr
<GeneratedCreditCardDecoration
> generated_credit_card_decoration_
;
270 // The right-hand-side button to manage passwords associated with a page.
271 scoped_ptr
<ManagePasswordsDecoration
> manage_passwords_decoration_
;
275 // Used to change the visibility of the star decoration.
276 BooleanPrefMember edit_bookmarks_enabled_
;
278 // Used to schedule a task for the first run info bubble.
279 base::WeakPtrFactory
<LocationBarViewMac
> weak_ptr_factory_
;
281 DISALLOW_COPY_AND_ASSIGN(LocationBarViewMac
);
284 #endif // CHROME_BROWSER_UI_COCOA_LOCATION_BAR_LOCATION_BAR_VIEW_MAC_H_