OLD | NEW |
| (Empty) |
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_GTK_LOCATION_BAR_VIEW_GTK_H_ | |
6 #define CHROME_BROWSER_UI_GTK_LOCATION_BAR_VIEW_GTK_H_ | |
7 | |
8 #include <gtk/gtk.h> | |
9 | |
10 #include <map> | |
11 #include <string> | |
12 | |
13 #include "base/basictypes.h" | |
14 #include "base/callback.h" | |
15 #include "base/compiler_specific.h" | |
16 #include "base/memory/scoped_ptr.h" | |
17 #include "base/memory/scoped_vector.h" | |
18 #include "base/memory/weak_ptr.h" | |
19 #include "base/prefs/pref_member.h" | |
20 #include "chrome/browser/extensions/extension_action.h" | |
21 #include "chrome/browser/extensions/extension_action_icon_factory.h" | |
22 #include "chrome/browser/extensions/extension_context_menu_model.h" | |
23 #include "chrome/browser/ui/gtk/bubble/bubble_gtk.h" | |
24 #include "chrome/browser/ui/gtk/menu_gtk.h" | |
25 #include "chrome/browser/ui/omnibox/location_bar.h" | |
26 #include "chrome/browser/ui/omnibox/omnibox_edit_controller.h" | |
27 #include "chrome/browser/ui/view_ids.h" | |
28 #include "chrome/common/content_settings_types.h" | |
29 #include "content/public/browser/notification_observer.h" | |
30 #include "content/public/browser/notification_registrar.h" | |
31 #include "content/public/common/page_transition_types.h" | |
32 #include "ui/base/gtk/gtk_signal.h" | |
33 #include "ui/base/gtk/owned_widget_gtk.h" | |
34 #include "ui/base/window_open_disposition.h" | |
35 #include "ui/gfx/animation/animation_delegate.h" | |
36 #include "ui/gfx/animation/slide_animation.h" | |
37 #include "url/gurl.h" | |
38 | |
39 class Browser; | |
40 class CommandUpdater; | |
41 class ContentSettingImageModel; | |
42 class ContentSettingBubbleGtk; | |
43 class ExtensionAction; | |
44 class GtkThemeService; | |
45 class OmniboxViewGtk; | |
46 | |
47 namespace content { | |
48 class WebContents; | |
49 } | |
50 | |
51 namespace gfx { | |
52 class Image; | |
53 } | |
54 | |
55 namespace ui { | |
56 class Accelerator; | |
57 } | |
58 | |
59 class LocationBarViewGtk : public OmniboxEditController, | |
60 public LocationBar, | |
61 public LocationBarTesting, | |
62 public content::NotificationObserver { | |
63 public: | |
64 explicit LocationBarViewGtk(Browser* browser); | |
65 virtual ~LocationBarViewGtk(); | |
66 | |
67 void Init(bool popup_window_mode); | |
68 | |
69 // Returns the widget the caller should host. You must call Init() first. | |
70 GtkWidget* widget() { return hbox_.get(); } | |
71 | |
72 // Returns the widget the page info bubble should point to. | |
73 GtkWidget* location_icon_widget() const { return location_icon_image_; } | |
74 | |
75 // Returns the widget the extension installed bubble should point to. | |
76 GtkWidget* location_entry_widget() const { return entry_box_; } | |
77 | |
78 Browser* browser() const { return browser_; } | |
79 | |
80 // Sets |preview_enabled| for the PageActionViewGtk associated with this | |
81 // |page_action|. If |preview_enabled| is true, the view will display the | |
82 // page action's icon even though it has not been activated by the extension. | |
83 // This is used by the ExtensionInstalledBubbleGtk to preview what the icon | |
84 // will look like for the user upon installation of the extension. | |
85 void SetPreviewEnabledPageAction(ExtensionAction *page_action, | |
86 bool preview_enabled); | |
87 | |
88 // Retrieves the GtkWidget which is associated with PageActionView | |
89 // corresponding to |page_action|. | |
90 GtkWidget* GetPageActionWidget(ExtensionAction* page_action); | |
91 | |
92 // Show the bookmark bubble. | |
93 void ShowStarBubble(const GURL& url, bool newly_boomkarked); | |
94 | |
95 // Happens when the zoom changes for the active tab. |can_show_bubble| will be | |
96 // true if it was a user action and a bubble could be shown. | |
97 void ZoomChangedForActiveTab(bool can_show_bubble); | |
98 | |
99 // Returns the zoom widget. Used by the zoom bubble for an anchor. | |
100 GtkWidget* zoom_widget() { return zoom_.get(); } | |
101 | |
102 // Returns the manage passwords widget. Used by the manage passwords bubble | |
103 // for an anchor. | |
104 GtkWidget* manage_passwords_icon_widget() { | |
105 return manage_passwords_icon_.get(); | |
106 } | |
107 | |
108 // Set the starred state of the bookmark star. | |
109 void SetStarred(bool starred); | |
110 | |
111 // OmniboxEditController: | |
112 virtual void Update(const content::WebContents* contents) OVERRIDE; | |
113 virtual void OnChanged() OVERRIDE; | |
114 virtual void OnSetFocus() OVERRIDE; | |
115 virtual void ShowURL() OVERRIDE; | |
116 virtual InstantController* GetInstant() OVERRIDE; | |
117 virtual content::WebContents* GetWebContents() OVERRIDE; | |
118 virtual ToolbarModel* GetToolbarModel() OVERRIDE; | |
119 virtual const ToolbarModel* GetToolbarModel() const OVERRIDE; | |
120 | |
121 // LocationBar: | |
122 virtual void ShowFirstRunBubble() OVERRIDE; | |
123 virtual GURL GetDestinationURL() const OVERRIDE; | |
124 virtual WindowOpenDisposition GetWindowOpenDisposition() const OVERRIDE; | |
125 virtual content::PageTransition GetPageTransition() const OVERRIDE; | |
126 virtual void AcceptInput() OVERRIDE; | |
127 virtual void FocusLocation(bool select_all) OVERRIDE; | |
128 virtual void FocusSearch() OVERRIDE; | |
129 virtual void UpdateContentSettingsIcons() OVERRIDE; | |
130 virtual void UpdateManagePasswordsIconAndBubble() OVERRIDE; | |
131 virtual void UpdatePageActions() OVERRIDE; | |
132 virtual void InvalidatePageActions() OVERRIDE; | |
133 virtual void UpdateOpenPDFInReaderPrompt() OVERRIDE; | |
134 virtual void UpdateGeneratedCreditCardView() OVERRIDE; | |
135 virtual void SaveStateToContents(content::WebContents* contents) OVERRIDE; | |
136 virtual void Revert() OVERRIDE; | |
137 virtual const OmniboxView* GetOmniboxView() const OVERRIDE; | |
138 virtual OmniboxView* GetOmniboxView() OVERRIDE; | |
139 virtual LocationBarTesting* GetLocationBarForTesting() OVERRIDE; | |
140 | |
141 // LocationBarTesting: | |
142 virtual int PageActionCount() OVERRIDE; | |
143 virtual int PageActionVisibleCount() OVERRIDE; | |
144 virtual ExtensionAction* GetPageAction(size_t index) OVERRIDE; | |
145 virtual ExtensionAction* GetVisiblePageAction(size_t index) OVERRIDE; | |
146 virtual void TestPageActionPressed(size_t index) OVERRIDE; | |
147 virtual bool GetBookmarkStarVisibility() OVERRIDE; | |
148 | |
149 // content::NotificationObserver: | |
150 virtual void Observe(int type, | |
151 const content::NotificationSource& source, | |
152 const content::NotificationDetails& details) OVERRIDE; | |
153 | |
154 // Edit background color. | |
155 static const GdkColor kBackgroundColor; | |
156 | |
157 // Superclass for content settings icons shown at the left side of the | |
158 // location bar. | |
159 class PageToolViewGtk : public gfx::AnimationDelegate { | |
160 public: | |
161 PageToolViewGtk(); | |
162 virtual ~PageToolViewGtk(); | |
163 | |
164 GtkWidget* widget() { return alignment_.get(); } | |
165 | |
166 bool IsVisible(); | |
167 | |
168 virtual void Update(content::WebContents* web_contents) = 0; | |
169 | |
170 // Overridden from gfx::AnimationDelegate: | |
171 virtual void AnimationProgressed(const gfx::Animation* animation) OVERRIDE; | |
172 virtual void AnimationEnded(const gfx::Animation* animation) OVERRIDE; | |
173 virtual void AnimationCanceled(const gfx::Animation* animation) OVERRIDE; | |
174 | |
175 protected: | |
176 // Theme constants for solid background elements. | |
177 virtual GdkColor GetButtonBorderColor() const = 0; | |
178 virtual GdkColor GetGradientTopColor() const = 0; | |
179 virtual GdkColor GetGradientBottomColor() const = 0; | |
180 | |
181 // Delegate for ButtonPressed message. | |
182 virtual void OnClick(GtkWidget* sender) = 0; | |
183 | |
184 // Start the process of showing the label. | |
185 void StartAnimating(); | |
186 | |
187 // Slide the label shut. | |
188 void CloseAnimation(); | |
189 | |
190 CHROMEGTK_CALLBACK_1(PageToolViewGtk, gboolean, OnButtonPressed, GdkEvent*); | |
191 CHROMEGTK_CALLBACK_1(PageToolViewGtk, gboolean, OnExpose, GdkEventExpose*); | |
192 | |
193 // The widgets for this view. | |
194 ui::OwnedWidgetGtk alignment_; | |
195 ui::OwnedWidgetGtk event_box_; | |
196 GtkWidget* hbox_; | |
197 ui::OwnedWidgetGtk image_; | |
198 | |
199 // Explanatory text (e.g. "popup blocked"). | |
200 ui::OwnedWidgetGtk label_; | |
201 | |
202 // When we show explanatory text, we slide it in/out. | |
203 gfx::SlideAnimation animation_; | |
204 | |
205 // The label's default requisition (cached so we can animate accordingly). | |
206 GtkRequisition label_req_; | |
207 | |
208 base::WeakPtrFactory<PageToolViewGtk> weak_factory_; | |
209 | |
210 private: | |
211 DISALLOW_COPY_AND_ASSIGN(PageToolViewGtk); | |
212 }; | |
213 | |
214 private: | |
215 // OmniboxEditController: | |
216 virtual void HideURL() OVERRIDE; | |
217 | |
218 class PageActionViewGtk : | |
219 public ExtensionActionIconFactory::Observer, | |
220 public content::NotificationObserver, | |
221 public ExtensionContextMenuModel::PopupDelegate { | |
222 public: | |
223 PageActionViewGtk(LocationBarViewGtk* owner, ExtensionAction* page_action); | |
224 virtual ~PageActionViewGtk(); | |
225 | |
226 GtkWidget* widget() { return event_box_.get(); } | |
227 | |
228 ExtensionAction* page_action() { return page_action_; } | |
229 | |
230 void set_preview_enabled(bool preview_enabled) { | |
231 preview_enabled_ = preview_enabled; | |
232 } | |
233 | |
234 bool IsVisible(); | |
235 | |
236 // Called to notify the PageAction that it should determine whether to be | |
237 // visible or hidden. |contents| is the WebContents that is active, |url| | |
238 // is the current page URL. | |
239 void UpdateVisibility(content::WebContents* contents, const GURL& url); | |
240 | |
241 // Overriden from ExtensionActionIconFactory::Observer. | |
242 virtual void OnIconUpdated() OVERRIDE; | |
243 | |
244 // Simulate left mouse click on the page action button. | |
245 void TestActivatePageAction(); | |
246 | |
247 // Implement the content::NotificationObserver interface. | |
248 virtual void Observe(int type, | |
249 const content::NotificationSource& source, | |
250 const content::NotificationDetails& details) OVERRIDE; | |
251 | |
252 // Overridden from ExtensionContextMenuModel::PopupDelegate: | |
253 virtual void InspectPopup(ExtensionAction* action) OVERRIDE; | |
254 | |
255 private: | |
256 // Connect the accelerator for the page action popup. | |
257 void ConnectPageActionAccelerator(); | |
258 | |
259 // Disconnect the accelerator for the page action popup. | |
260 void DisconnectPageActionAccelerator(); | |
261 | |
262 CHROMEGTK_CALLBACK_1(PageActionViewGtk, gboolean, OnButtonPressed, | |
263 GdkEventButton*); | |
264 CHROMEGTK_CALLBACK_1(PageActionViewGtk, gboolean, OnExposeEvent, | |
265 GdkEventExpose*); | |
266 CHROMEGTK_CALLBACK_0(PageActionViewGtk, void, OnRealize); | |
267 | |
268 // The accelerator handler for when the shortcuts to open the popup is | |
269 // struck. | |
270 static gboolean OnGtkAccelerator(GtkAccelGroup* accel_group, | |
271 GObject* acceleratable, | |
272 guint keyval, | |
273 GdkModifierType modifier, | |
274 void* user_data); | |
275 | |
276 // The location bar view that owns us. | |
277 LocationBarViewGtk* owner_; | |
278 | |
279 // The PageAction that this view represents. The PageAction is not owned by | |
280 // us, it resides in the extension of this particular profile. | |
281 ExtensionAction* page_action_; | |
282 | |
283 // The object that will be used to get the extension action icon for us. | |
284 // It may load the icon asynchronously (in which case the initial icon | |
285 // returned by the factory will be transparent), so we have to observe it | |
286 // for updates to the icon. | |
287 scoped_ptr<ExtensionActionIconFactory> icon_factory_; | |
288 | |
289 // The widgets for this page action. | |
290 ui::OwnedWidgetGtk event_box_; | |
291 ui::OwnedWidgetGtk image_; | |
292 | |
293 // The tab id we are currently showing the icon for. | |
294 int current_tab_id_; | |
295 | |
296 // The URL we are currently showing the icon for. | |
297 GURL current_url_; | |
298 | |
299 // The native browser window of the location bar that owns us. | |
300 gfx::NativeWindow window_; | |
301 | |
302 // The Notification registrar. | |
303 content::NotificationRegistrar registrar_; | |
304 | |
305 // The accelerator group used to handle accelerators, owned by this object. | |
306 GtkAccelGroup* accel_group_; | |
307 | |
308 // The keybinding accelerator registered to show the page action popup. | |
309 scoped_ptr<ui::Accelerator> page_action_keybinding_; | |
310 | |
311 // This is used for post-install visual feedback. The page_action icon | |
312 // is briefly shown even if it hasn't been enabled by its extension. | |
313 bool preview_enabled_; | |
314 | |
315 // The context menu view and model for this extension action. | |
316 scoped_ptr<MenuGtk> context_menu_; | |
317 scoped_refptr<ExtensionContextMenuModel> context_menu_model_; | |
318 | |
319 DISALLOW_COPY_AND_ASSIGN(PageActionViewGtk); | |
320 }; | |
321 friend class PageActionViewGtk; | |
322 | |
323 // Creates, initializes, and packs the location icon, EV certificate name, | |
324 // and optional border. | |
325 void BuildSiteTypeArea(); | |
326 | |
327 // Enable or disable the location icon/EV certificate as a drag source for | |
328 // the URL. | |
329 void SetSiteTypeDragSource(); | |
330 | |
331 GtkWidget* site_type_area() { return site_type_alignment_; } | |
332 | |
333 CHROMEGTK_CALLBACK_1(LocationBarViewGtk, gboolean, HandleExpose, | |
334 GdkEventExpose*); | |
335 CHROMEGTK_CALLBACK_1(LocationBarViewGtk, gboolean, OnIconReleased, | |
336 GdkEventButton*); | |
337 CHROMEGTK_CALLBACK_4(LocationBarViewGtk, void, OnIconDragData, | |
338 GdkDragContext*, GtkSelectionData*, guint, guint); | |
339 CHROMEGTK_CALLBACK_1(LocationBarViewGtk, void, OnIconDragBegin, | |
340 GdkDragContext*); | |
341 CHROMEGTK_CALLBACK_1(LocationBarViewGtk, void, OnIconDragEnd, | |
342 GdkDragContext*); | |
343 CHROMEGTK_CALLBACK_1(LocationBarViewGtk, void, OnHboxSizeAllocate, | |
344 GtkAllocation*); | |
345 CHROMEGTK_CALLBACK_1(LocationBarViewGtk, void, OnEntryBoxSizeAllocate, | |
346 GtkAllocation*); | |
347 CHROMEGTK_CALLBACK_1(LocationBarViewGtk, gboolean, OnZoomButtonPress, | |
348 GdkEventButton*); | |
349 CHROMEGTK_CALLBACK_1(LocationBarViewGtk, gboolean, | |
350 OnManagePasswordsIconButtonPress, GdkEventButton*); | |
351 CHROMEGTK_CALLBACK_1(LocationBarViewGtk, void, OnStarButtonSizeAllocate, | |
352 GtkAllocation*); | |
353 CHROMEGTK_CALLBACK_1(LocationBarViewGtk, gboolean, OnStarButtonPress, | |
354 GdkEventButton*); | |
355 | |
356 // Updates the site type area: changes the icon and shows/hides the EV | |
357 // certificate information. | |
358 void UpdateSiteTypeArea(); | |
359 | |
360 // Updates the maximum size of the EV certificate label. | |
361 void UpdateEVCertificateLabelSize(); | |
362 | |
363 // Set the keyword text for the Search BLAH: keyword box. | |
364 void SetKeywordLabel(const base::string16& keyword); | |
365 | |
366 // Set the keyword text for the "Press tab to search BLAH" hint box. | |
367 void SetKeywordHintLabel(const base::string16& keyword); | |
368 | |
369 void ShowFirstRunBubbleInternal(); | |
370 | |
371 // Shows the zoom bubble. | |
372 void ShowZoomBubble(); | |
373 | |
374 // Shows the manage password bubble. | |
375 void ShowManagePasswordsBubble(); | |
376 | |
377 // Show or hide |tab_to_search_box_| and |tab_to_search_hint_| according to | |
378 // the value of |show_selected_keyword_|, |show_keyword_hint_|, and the | |
379 // available horizontal space in the location bar. | |
380 void AdjustChildrenVisibility(); | |
381 | |
382 // Helpers to build create the various buttons that show up in the location | |
383 // bar. | |
384 GtkWidget* CreateIconButton( | |
385 GtkWidget** image, | |
386 int image_id, | |
387 ViewID debug_id, | |
388 int tooltip_id, | |
389 gboolean (click_callback)(GtkWidget*, GdkEventButton*, gpointer)); | |
390 void CreateZoomButton(); | |
391 void CreateManagePasswordsIconButton(); | |
392 void CreateStarButton(); | |
393 | |
394 // Helpers to update state of the various buttons that show up in the | |
395 // location bar. | |
396 void UpdateZoomIcon(); | |
397 void UpdateManagePasswordsIcon(); | |
398 void UpdateStarIcon(); | |
399 | |
400 // Shows the managepassword bubble in case there is a password to be saved. | |
401 void ShowManagePasswordsBubbleIfNeeded(); | |
402 | |
403 // Returns true if we should only show the URL and none of the extras like | |
404 // the star button or page actions. | |
405 bool ShouldOnlyShowLocation(); | |
406 | |
407 // The outermost widget we want to be hosted. | |
408 ui::OwnedWidgetGtk hbox_; | |
409 | |
410 // Zoom button. | |
411 ui::OwnedWidgetGtk zoom_; | |
412 GtkWidget* zoom_image_; | |
413 | |
414 // Manage passwords button. | |
415 ui::OwnedWidgetGtk manage_passwords_icon_; | |
416 GtkWidget* manage_passwords_icon_image_; | |
417 | |
418 // Star button. | |
419 ui::OwnedWidgetGtk star_; | |
420 GtkWidget* star_image_; | |
421 bool starred_; | |
422 bool star_sized_; // True after a size-allocate signal to the star widget. | |
423 | |
424 // Action to execute after the star icon has been sized, can refer to a NULL | |
425 // function to indicate no such action should be taken. | |
426 base::Closure on_star_sized_; | |
427 | |
428 // An icon to the left of the address bar. | |
429 GtkWidget* site_type_alignment_; | |
430 GtkWidget* site_type_event_box_; | |
431 GtkWidget* location_icon_image_; | |
432 GtkWidget* drag_icon_; | |
433 bool enable_location_drag_; | |
434 // TODO(pkasting): Split this label off and move the rest of the items to the | |
435 // left of the address bar. | |
436 GtkWidget* security_info_label_; | |
437 | |
438 // Content setting icons. | |
439 ui::OwnedWidgetGtk content_setting_hbox_; | |
440 ScopedVector<PageToolViewGtk> content_setting_views_; | |
441 | |
442 // Extension page actions. | |
443 std::vector<ExtensionAction*> page_actions_; | |
444 | |
445 // Extension page action icons. | |
446 ui::OwnedWidgetGtk page_action_hbox_; | |
447 ScopedVector<PageActionViewGtk> page_action_views_; | |
448 | |
449 // The widget that contains our tab hints and the location bar. | |
450 GtkWidget* entry_box_; | |
451 | |
452 // Area on the left shown when in tab to search mode. | |
453 GtkWidget* tab_to_search_alignment_; | |
454 GtkWidget* tab_to_search_box_; | |
455 GtkWidget* tab_to_search_magnifier_; | |
456 GtkWidget* tab_to_search_full_label_; | |
457 GtkWidget* tab_to_search_partial_label_; | |
458 | |
459 // Hint to user that they can tab-to-search by hitting tab. | |
460 GtkWidget* tab_to_search_hint_; | |
461 GtkWidget* tab_to_search_hint_leading_label_; | |
462 GtkWidget* tab_to_search_hint_icon_; | |
463 GtkWidget* tab_to_search_hint_trailing_label_; | |
464 | |
465 scoped_ptr<OmniboxViewGtk> omnibox_view_; | |
466 | |
467 // Alignment used to wrap |omnibox_view_|. | |
468 GtkWidget* omnibox_view_alignment_; | |
469 | |
470 Browser* browser_; | |
471 | |
472 // When true, the location bar view is read only and also is has a slightly | |
473 // different presentation (font size / color). This is used for popups. | |
474 bool popup_window_mode_; | |
475 | |
476 // Provides colors and rendering mode. | |
477 GtkThemeService* theme_service_; | |
478 | |
479 content::NotificationRegistrar registrar_; | |
480 | |
481 // Width of the main |hbox_|. Used to properly elide the EV certificate. | |
482 int hbox_width_; | |
483 | |
484 // Width of the hbox that holds |tab_to_search_box_|, |omnibox_view_| and | |
485 // |tab_to_search_hint_|. | |
486 int entry_box_width_; | |
487 | |
488 // Indicate if |tab_to_search_box_| should be shown. | |
489 bool show_selected_keyword_; | |
490 | |
491 // Indicate if |tab_to_search_hint_| should be shown. | |
492 bool show_keyword_hint_; | |
493 | |
494 // The last search keyword that was shown via the |tab_to_search_box_|. | |
495 base::string16 last_keyword_; | |
496 | |
497 // Used to change the visibility of the star decoration. | |
498 BooleanPrefMember edit_bookmarks_enabled_; | |
499 | |
500 // Used to remember the URL and title text when drag&drop has begun. | |
501 GURL drag_url_; | |
502 base::string16 drag_title_; | |
503 | |
504 // Used to schedule a task for the first run bubble. | |
505 base::WeakPtrFactory<LocationBarViewGtk> weak_ptr_factory_; | |
506 | |
507 DISALLOW_COPY_AND_ASSIGN(LocationBarViewGtk); | |
508 }; | |
509 | |
510 #endif // CHROME_BROWSER_UI_GTK_LOCATION_BAR_VIEW_GTK_H_ | |
OLD | NEW |