172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/location_bar_view_gtk.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <algorithm>
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <vector>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/command_line.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/i18n/rtl.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/logging.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h"
17513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/app/chrome_command_ids.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/accessibility_events.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/alternate_nav_url_fetcher.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autocomplete/autocomplete_edit_view_gtk.h"
21513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/autocomplete/autocomplete_popup_model.h"
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/command_updater.h"
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/content_setting_bubble_model.h"
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/content_setting_image_model.h"
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/defaults.h"
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_browser_event_router.h"
2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/extensions/extension_service.h"
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/extensions/extension_tabs_module.h"
29513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/instant/instant_controller.h"
3021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/search_engines/template_url.h"
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/search_engines/template_url_model.h"
334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h"
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_list.h"
35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/gtk/bookmarks/bookmark_bubble_gtk.h"
36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/gtk/bookmarks/bookmark_utils_gtk.h"
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/cairo_cached_surface.h"
3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/content_setting_bubble_gtk.h"
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/gtk/extensions/extension_popup_gtk.h"
4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/first_run_bubble.h"
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/gtk/gtk_theme_service.h"
4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/gtk_util.h"
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/nine_box.h"
4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/rounded_window.h"
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/view_id_util.h"
4621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/omnibox/location_bar_util.h"
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/common/chrome_switches.h"
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension.h"
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension_action.h"
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension_resource.h"
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/pref_names.h"
52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_service.h"
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/page_transition_types.h"
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h"
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/theme_resources.h"
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_util.h"
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/dragdrop/gtk_dnd_util.h"
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h"
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/canvas_skia_paint.h"
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/font.h"
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/gtk_util.h"
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/glue/window_open_disposition.h"
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// We are positioned with a little bit of extra space that we don't use now.
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kTopMargin = 1;
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kBottomMargin = 1;
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kLeftMargin = 1;
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kRightMargin = 1;
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// We draw a border on the top and bottom (but not on left or right).
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kBorderThickness = 1;
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Left margin of first run bubble.
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kFirstRunBubbleLeftMargin = 8;
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Extra vertical spacing for first run bubble.
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kFirstRunBubbleTopMargin = 5;
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Spacing needed to align the bubble with the left side of the omnibox.
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst int kFirstRunBubbleLeftSpacing = 4;
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The padding around the top, bottom, and sides of the location bar hbox.
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// We don't want to edit control's text to be right against the edge,
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// as well the tab to search box and other widgets need to have the padding on
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// top and bottom to avoid drawing larger than the location bar space.
873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst int kHboxBorder = 2;
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Padding between the elements in the bar.
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst int kInnerPadding = 2;
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Padding between the right of the star and the edge of the URL entry.
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kStarRightPadding = 2;
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Colors used to draw the EV certificate rounded bubble.
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst GdkColor kEvSecureTextColor = GDK_COLOR_RGB(0x07, 0x95, 0x00);
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst GdkColor kEvSecureBackgroundColor = GDK_COLOR_RGB(0xef, 0xfc, 0xef);
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst GdkColor kEvSecureBorderColor = GDK_COLOR_RGB(0x90, 0xc3, 0x90);
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Colors used to draw the Tab to Search rounded bubble.
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst GdkColor kKeywordBackgroundColor = GDK_COLOR_RGB(0xf0, 0xf4, 0xfa);
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst GdkColor kKeywordBorderColor = GDK_COLOR_RGB(0xcb, 0xde, 0xf7);
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use weak gray for showing search and keyword hint text.
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst GdkColor kHintTextColor = GDK_COLOR_RGB(0x75, 0x75, 0x75);
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Size of the rounding of the "Search site for:" box.
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kCornerSize = 3;
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// The time, in ms, that the content setting label is fully displayed, for the
111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// cases where we animate it into and out of view.
112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst int kContentSettingImageDisplayTime = 3200;
113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// The time, in ms, of the animation (open and close).
114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst int kContentSettingImageAnimationTime = 150;
115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Color of border of content setting area (icon/label).
117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst GdkColor kContentSettingBorderColor = GDK_COLOR_RGB(0xe9, 0xb9, 0x66);
118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Colors for the background gradient.
119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst double kContentSettingTopColor[] = { 0xff / 255.0,
120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                           0xf8 / 255.0,
121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                           0xd4 / 255.0 };
122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst double kContentSettingBottomColor[] = { 0xff / 255.0,
123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                              0xe6 / 255.0,
124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                              0xaf / 255.0 };
125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// If widget is visible, increment the int pointed to by count.
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Suitible for use with gtk_container_foreach.
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CountVisibleWidgets(GtkWidget* widget, gpointer count) {
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (GTK_WIDGET_VISIBLE(widget))
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *static_cast<int*>(count) += 1;
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LocationBarViewGtk
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst GdkColor LocationBarViewGtk::kBackgroundColor =
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GDK_COLOR_RGB(255, 255, 255);
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochLocationBarViewGtk::LocationBarViewGtk(Browser* browser)
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : star_image_(NULL),
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      starred_(false),
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      site_type_alignment_(NULL),
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      site_type_event_box_(NULL),
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      location_icon_image_(NULL),
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      drag_icon_(NULL),
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      enable_location_drag_(false),
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      security_info_label_(NULL),
151dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      tab_to_search_alignment_(NULL),
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      tab_to_search_box_(NULL),
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      tab_to_search_full_label_(NULL),
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      tab_to_search_partial_label_(NULL),
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      tab_to_search_hint_(NULL),
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      tab_to_search_hint_leading_label_(NULL),
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      tab_to_search_hint_icon_(NULL),
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      tab_to_search_hint_trailing_label_(NULL),
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      profile_(NULL),
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      command_updater_(browser->command_updater()),
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      toolbar_model_(browser->toolbar_model()),
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      browser_(browser),
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      disposition_(CURRENT_TAB),
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      transition_(PageTransition::TYPED),
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      first_run_bubble_(this),
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      popup_window_mode_(false),
167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      theme_service_(NULL),
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      hbox_width_(0),
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      entry_box_width_(0),
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      show_selected_keyword_(false),
171dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      show_keyword_hint_(false) {
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochLocationBarViewGtk::~LocationBarViewGtk() {
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // All of our widgets should have be children of / owned by the alignment.
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  star_.Destroy();
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  hbox_.Destroy();
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  content_setting_hbox_.Destroy();
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  page_action_hbox_.Destroy();
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::Init(bool popup_window_mode) {
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  popup_window_mode_ = popup_window_mode;
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create the widget first, so we can pass it to the AutocompleteEditViewGtk.
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  hbox_.Own(gtk_hbox_new(FALSE, kInnerPadding));
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_container_set_border_width(GTK_CONTAINER(hbox_.get()), kHboxBorder);
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We will paint for the alignment, to paint the background and border.
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_set_app_paintable(hbox_.get(), TRUE);
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Redraw the whole location bar when it changes size (e.g., when toggling
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the home button on/off.
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_set_redraw_on_allocate(hbox_.get(), TRUE);
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now initialize the AutocompleteEditViewGtk.
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  location_entry_.reset(new AutocompleteEditViewGtk(this,
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                    toolbar_model_,
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                    profile_,
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                    command_updater_,
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                    popup_window_mode_,
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                    hbox_.get()));
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  location_entry_->Init();
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  g_signal_connect(hbox_.get(), "expose-event",
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   G_CALLBACK(&HandleExposeThunk), this);
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BuildSiteTypeArea();
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Put |tab_to_search_box_|, |location_entry_|, and |tab_to_search_hint_| into
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // a sub hbox, so that we can make this part horizontally shrinkable without
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // affecting other elements in the location bar.
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_box_ = gtk_hbox_new(FALSE, kInnerPadding);
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_show(entry_box_);
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_set_size_request(entry_box_, 0, -1);
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_box_pack_start(GTK_BOX(hbox_.get()), entry_box_, TRUE, TRUE, 0);
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We need to adjust the visibility of the search hint widgets according to
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the horizontal space in the |entry_box_|.
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  g_signal_connect(entry_box_, "size-allocate",
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   G_CALLBACK(&OnEntryBoxSizeAllocateThunk), this);
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Tab to search (the keyword box on the left hand side).
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab_to_search_full_label_ = gtk_label_new(NULL);
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab_to_search_partial_label_ = gtk_label_new(NULL);
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* tab_to_search_label_hbox = gtk_hbox_new(FALSE, 0);
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_box_pack_start(GTK_BOX(tab_to_search_label_hbox),
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     tab_to_search_full_label_, FALSE, FALSE, 0);
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_box_pack_start(GTK_BOX(tab_to_search_label_hbox),
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     tab_to_search_partial_label_, FALSE, FALSE, 0);
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* tab_to_search_hbox = gtk_hbox_new(FALSE, 0);
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab_to_search_magnifier_ = gtk_image_new_from_pixbuf(
2323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      rb.GetPixbufNamed(IDR_KEYWORD_SEARCH_MAGNIFIER));
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_box_pack_start(GTK_BOX(tab_to_search_hbox), tab_to_search_magnifier_,
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     FALSE, FALSE, 0);
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_util::CenterWidgetInHBox(tab_to_search_hbox, tab_to_search_label_hbox,
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               false, 0);
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This creates a box around the keyword text with a border, background color,
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // and padding around the text.
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab_to_search_box_ = gtk_util::CreateGtkBorderBin(
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      tab_to_search_hbox, NULL, 1, 1, 1, 3);
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_set_name(tab_to_search_box_, "chrome-tab-to-search-box");
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_util::ActAsRoundedWindow(tab_to_search_box_, kKeywordBorderColor,
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kCornerSize,
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               gtk_util::ROUNDED_ALL, gtk_util::BORDER_ALL);
246dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
247dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Put the event box in an alignment to get the padding correct.
248dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  tab_to_search_alignment_ = gtk_alignment_new(0, 0, 1, 1);
249dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gtk_container_add(GTK_CONTAINER(tab_to_search_alignment_),
250dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                    tab_to_search_box_);
251dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gtk_box_pack_start(GTK_BOX(entry_box_), tab_to_search_alignment_,
252dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                     FALSE, FALSE, 0);
253dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Show all children widgets of |tab_to_search_box_| initially, except
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |tab_to_search_partial_label_|.
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_show_all(tab_to_search_box_);
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_hide(tab_to_search_partial_label_);
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  location_entry_alignment_ = gtk_alignment_new(0.0, 0.0, 1.0, 1.0);
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_container_add(GTK_CONTAINER(location_entry_alignment_),
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    location_entry_->GetNativeView());
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_box_pack_start(GTK_BOX(entry_box_), location_entry_alignment_,
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     TRUE, TRUE, 0);
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Tab to search notification (the hint on the right hand side).
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab_to_search_hint_ = gtk_hbox_new(FALSE, 0);
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_set_name(tab_to_search_hint_, "chrome-tab-to-search-hint");
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab_to_search_hint_leading_label_ = gtk_label_new(NULL);
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_set_sensitive(tab_to_search_hint_leading_label_, FALSE);
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab_to_search_hint_icon_ = gtk_image_new_from_pixbuf(
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      rb.GetPixbufNamed(IDR_LOCATION_BAR_KEYWORD_HINT_TAB));
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab_to_search_hint_trailing_label_ = gtk_label_new(NULL);
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_set_sensitive(tab_to_search_hint_trailing_label_, FALSE);
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_box_pack_start(GTK_BOX(tab_to_search_hint_),
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     tab_to_search_hint_leading_label_,
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     FALSE, FALSE, 0);
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_box_pack_start(GTK_BOX(tab_to_search_hint_),
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     tab_to_search_hint_icon_,
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     FALSE, FALSE, 0);
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_box_pack_start(GTK_BOX(tab_to_search_hint_),
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     tab_to_search_hint_trailing_label_,
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     FALSE, FALSE, 0);
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Show all children widgets of |tab_to_search_hint_| initially.
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_show_all(tab_to_search_hint_);
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_hide(tab_to_search_hint_);
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // tab_to_search_hint_ gets hidden initially in OnChanged.  Hiding it here
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // doesn't work, someone is probably calling show_all on our parent box.
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_box_pack_end(GTK_BOX(entry_box_), tab_to_search_hint_, FALSE, FALSE, 0);
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We don't show the star in popups, app windows, etc.
2913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (browser_defaults::bookmarks_enabled && !ShouldOnlyShowLocation()) {
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CreateStarButton();
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_box_pack_end(GTK_BOX(hbox_.get()), star_.get(), FALSE, FALSE, 0);
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  content_setting_hbox_.Own(gtk_hbox_new(FALSE, kInnerPadding + 1));
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_set_name(content_setting_hbox_.get(),
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                      "chrome-content-setting-hbox");
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_box_pack_end(GTK_BOX(hbox_.get()), content_setting_hbox_.get(),
3003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                   FALSE, FALSE, 1);
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (int i = 0; i < CONTENT_SETTINGS_NUM_TYPES; ++i) {
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ContentSettingImageViewGtk* content_setting_view =
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        new ContentSettingImageViewGtk(
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            static_cast<ContentSettingsType>(i), this, profile_);
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    content_setting_views_.push_back(content_setting_view);
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_box_pack_end(GTK_BOX(content_setting_hbox_.get()),
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     content_setting_view->widget(), FALSE, FALSE, 0);
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  page_action_hbox_.Own(gtk_hbox_new(FALSE, kInnerPadding));
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_set_name(page_action_hbox_.get(),
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                      "chrome-page-action-hbox");
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_box_pack_end(GTK_BOX(hbox_.get()), page_action_hbox_.get(),
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   FALSE, FALSE, 0);
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now that we've created the widget hierarchy, connect to the main |hbox_|'s
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // size-allocate so we can do proper resizing and eliding on
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |security_info_label_|.
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  g_signal_connect(hbox_.get(), "size-allocate",
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   G_CALLBACK(&OnHboxSizeAllocateThunk), this);
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  registrar_.Add(this,
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 NotificationType::BROWSER_THEME_CHANGED,
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 NotificationService::AllSources());
326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  edit_bookmarks_enabled_.Init(prefs::kEditBookmarksEnabled,
327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                               profile_->GetPrefs(), this);
328ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
329ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  theme_service_ = GtkThemeService::GetFrom(profile_);
330ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  theme_service_->InitThemesFor(this);
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::BuildSiteTypeArea() {
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  location_icon_image_ = gtk_image_new();
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_set_name(location_icon_image_, "chrome-location-icon");
3363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GtkWidget* icon_alignment = gtk_alignment_new(0, 0, 1, 1);
3383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  gtk_alignment_set_padding(GTK_ALIGNMENT(icon_alignment), 0, 0, 2, 0);
3393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  gtk_container_add(GTK_CONTAINER(icon_alignment), location_icon_image_);
3403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  gtk_widget_show_all(icon_alignment);
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  security_info_label_ = gtk_label_new(NULL);
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_label_set_ellipsize(GTK_LABEL(security_info_label_),
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          PANGO_ELLIPSIZE_MIDDLE);
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_modify_fg(GTK_WIDGET(security_info_label_), GTK_STATE_NORMAL,
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       &kEvSecureTextColor);
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_set_name(security_info_label_,
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                      "chrome-location-bar-security-info-label");
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3503f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  GtkWidget* site_type_hbox = gtk_hbox_new(FALSE, 1);
3513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  gtk_box_pack_start(GTK_BOX(site_type_hbox), icon_alignment,
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     FALSE, FALSE, 0);
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_box_pack_start(GTK_BOX(site_type_hbox), security_info_label_,
3543f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                     FALSE, FALSE, 2);
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  site_type_event_box_ = gtk_event_box_new();
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_modify_bg(site_type_event_box_, GTK_STATE_NORMAL,
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       &kEvSecureBackgroundColor);
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  g_signal_connect(site_type_event_box_, "drag-data-get",
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   G_CALLBACK(&OnIconDragDataThunk), this);
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  g_signal_connect(site_type_event_box_, "drag-begin",
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   G_CALLBACK(&OnIconDragBeginThunk), this);
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  g_signal_connect(site_type_event_box_, "drag-end",
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   G_CALLBACK(&OnIconDragEndThunk), this);
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make the event box not visible so it does not paint a background.
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_event_box_set_visible_window(GTK_EVENT_BOX(site_type_event_box_),
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   FALSE);
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_set_name(site_type_event_box_,
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                      "chrome-location-icon-eventbox");
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_container_add(GTK_CONTAINER(site_type_event_box_),
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    site_type_hbox);
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Put the event box in an alignment to get the padding correct.
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  site_type_alignment_ = gtk_alignment_new(0, 0, 1, 1);
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_container_add(GTK_CONTAINER(site_type_alignment_),
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    site_type_event_box_);
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_box_pack_start(GTK_BOX(hbox_.get()), site_type_alignment_,
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     FALSE, FALSE, 0);
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  gtk_widget_set_tooltip_text(location_icon_image_,
38272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      l10n_util::GetStringUTF8(IDS_TOOLTIP_LOCATION_ICON).c_str());
38372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  g_signal_connect(site_type_event_box_, "button-release-event",
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   G_CALLBACK(&OnIconReleasedThunk), this);
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::SetSiteTypeDragSource() {
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool enable = !location_entry()->IsEditingOrEmpty();
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (enable_location_drag_ == enable)
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enable_location_drag_ = enable;
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!enable) {
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_drag_source_unset(site_type_event_box_);
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_drag_source_set(site_type_event_box_, GDK_BUTTON1_MASK,
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                      NULL, 0, GDK_ACTION_COPY);
40172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ui::SetSourceTargetListFromCodeMask(site_type_event_box_,
40272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                      ui::TEXT_PLAIN |
40372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                      ui::TEXT_URI_LIST |
40472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                      ui::CHROME_NAMED_URL);
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::SetProfile(Profile* profile) {
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  profile_ = profile;
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTabContents* LocationBarViewGtk::GetTabContents() const {
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return browser_->GetSelectedTabContents();
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::SetPreviewEnabledPageAction(
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ExtensionAction *page_action,
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool preview_enabled) {
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(page_action);
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  UpdatePageActions();
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (ScopedVector<PageActionViewGtk>::iterator iter =
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       page_action_views_.begin(); iter != page_action_views_.end();
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       ++iter) {
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if ((*iter)->page_action() == page_action) {
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      (*iter)->set_preview_enabled(preview_enabled);
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      UpdatePageActions();
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return;
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGtkWidget* LocationBarViewGtk::GetPageActionWidget(
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ExtensionAction *page_action) {
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(page_action);
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (ScopedVector<PageActionViewGtk>::iterator iter =
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           page_action_views_.begin();
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       iter != page_action_views_.end();
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       ++iter) {
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if ((*iter)->page_action() == page_action)
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return (*iter)->widget();
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return NULL;
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::Update(const TabContents* contents) {
445ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  UpdateStarIcon();
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  UpdateSiteTypeArea();
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  UpdateContentSettingsIcons();
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  UpdatePageActions();
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  location_entry_->Update(contents);
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The security level (background color) could have changed, etc.
451ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (theme_service_->UseGtkTheme()) {
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // In GTK mode, we need our parent to redraw, as it draws the text entry
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // border.
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_widget_queue_draw(widget()->parent);
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_widget_queue_draw(widget());
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
460513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid LocationBarViewGtk::OnAutocompleteAccept(const GURL& url,
461513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    WindowOpenDisposition disposition,
462513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    PageTransition::Type transition,
463513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const GURL& alternate_nav_url) {
464513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (url.is_valid()) {
465513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    location_input_ = UTF8ToWide(url.spec());
466513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    disposition_ = disposition;
467513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    transition_ = transition;
468513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
469513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (command_updater_) {
470513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      if (!alternate_nav_url.is_valid()) {
471513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        command_updater_->ExecuteCommand(IDC_OPEN_CURRENT_URL);
472513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      } else {
473513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        AlternateNavURLFetcher* fetcher =
474513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch            new AlternateNavURLFetcher(alternate_nav_url);
475513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        // The AlternateNavURLFetcher will listen for the pending navigation
476513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        // notification that will be issued as a result of the "open URL." It
477513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        // will automatically install itself into that navigation controller.
478513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        command_updater_->ExecuteCommand(IDC_OPEN_CURRENT_URL);
479513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        if (fetcher->state() == AlternateNavURLFetcher::NOT_STARTED) {
480513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          // I'm not sure this should be reachable, but I'm not also sure enough
481513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          // that it shouldn't to stick in a NOTREACHED().  In any case, this is
482513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          // harmless.
483513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          delete fetcher;
484513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        } else {
485513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          // The navigation controller will delete the fetcher.
486513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        }
487513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      }
488513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::OnChanged() {
493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  UpdateSiteTypeArea();
494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const string16 keyword(location_entry_->model()->keyword());
496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const bool is_keyword_hint = location_entry_->model()->is_keyword_hint();
497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  show_selected_keyword_ = !keyword.empty() && !is_keyword_hint;
498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  show_keyword_hint_ = !keyword.empty() && is_keyword_hint;
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (show_selected_keyword_)
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SetKeywordLabel(keyword);
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (show_keyword_hint_)
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SetKeywordHintLabel(keyword);
505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AdjustChildrenVisibility();
507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid LocationBarViewGtk::OnSelectionBoundsChanged() {
5104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  NOTIMPLEMENTED();
5114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
5124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::CreateStarButton() {
514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  star_image_ = gtk_image_new();
515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* alignment = gtk_alignment_new(0, 0, 1, 1);
517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 0, 0,
518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            0, kStarRightPadding);
519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_container_add(GTK_CONTAINER(alignment), star_image_);
520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  star_.Own(gtk_event_box_new());
522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_event_box_set_visible_window(GTK_EVENT_BOX(star_.get()), FALSE);
523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_container_add(GTK_CONTAINER(star_.get()), alignment);
524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_show_all(star_.get());
525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ViewIDUtil::SetID(star_.get(), VIEW_ID_STAR_BUTTON);
526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_set_tooltip_text(star_.get(),
528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      l10n_util::GetStringUTF8(IDS_TOOLTIP_STAR).c_str());
529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  g_signal_connect(star_.get(), "button-press-event",
530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   G_CALLBACK(OnStarButtonPressThunk), this);
531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::OnInputInProgress(bool in_progress) {
534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is identical to the Windows code, except that we don't proxy the call
535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // back through the Toolbar, and just access the model here.
536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The edit should make sure we're only notified when something changes.
537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(toolbar_model_->input_in_progress() != in_progress);
538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  toolbar_model_->set_input_in_progress(in_progress);
540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Update(NULL);
541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::OnKillFocus() {
544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::OnSetFocus() {
547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AccessibilityTextBoxInfo info(
548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      profile_,
549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      l10n_util::GetStringUTF8(IDS_ACCNAME_LOCATION).c_str(),
550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      false);
551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationService::current()->Notify(
552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationType::ACCESSIBILITY_CONTROL_FOCUSED,
553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Source<Profile>(profile_),
554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Details<AccessibilityTextBoxInfo>(&info));
555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Update the keyword and search hint states.
557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OnChanged();
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
560ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenSkBitmap LocationBarViewGtk::GetFavicon() const {
561ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return GetTabContents()->GetFavicon();
562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 LocationBarViewGtk::GetTitle() const {
56572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return GetTabContents()->GetTitle();
566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
568dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenInstantController* LocationBarViewGtk::GetInstant() {
569dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return browser_->instant();
570dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
571dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
572ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTabContentsWrapper* LocationBarViewGtk::GetTabContentsWrapper() const {
573dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return browser_->GetSelectedTabContentsWrapper();
574dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
575dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::ShowFirstRunBubble(FirstRun::BubbleType bubble_type) {
577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We need the browser window to be shown before we can show the bubble, but
578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // we get called before that's happened.
579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Task* task = first_run_bubble_.NewRunnableMethod(
580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      &LocationBarViewGtk::ShowFirstRunBubbleInternal, bubble_type);
581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->PostTask(FROM_HERE, task);
582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
584ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid LocationBarViewGtk::SetSuggestedText(const string16& text,
585ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                          InstantCompleteBehavior behavior) {
586ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  location_entry_->model()->SetSuggestedText(text, behavior);
5873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
5883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::wstring LocationBarViewGtk::GetInputString() const {
590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return location_input_;
591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
593c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWindowOpenDisposition LocationBarViewGtk::GetWindowOpenDisposition() const {
594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return disposition_;
595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
597c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochPageTransition::Type LocationBarViewGtk::GetPageTransition() const {
598c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return transition_;
599c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
600c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::AcceptInput() {
602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  location_entry_->model()->AcceptInput(CURRENT_TAB, false);
603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::FocusLocation(bool select_all) {
606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  location_entry_->SetFocus();
607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (select_all)
608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    location_entry_->SelectAll(true);
609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::FocusSearch() {
612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  location_entry_->SetFocus();
613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  location_entry_->SetForcedQuery();
614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::UpdateContentSettingsIcons() {
617201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  TabContents* tab_contents = GetTabContents();
618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool any_visible = false;
619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (ScopedVector<ContentSettingImageViewGtk>::iterator i(
620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           content_setting_views_.begin());
621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       i != content_setting_views_.end(); ++i) {
622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    (*i)->UpdateFromTabContents(
623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        toolbar_model_->input_in_progress() ? NULL : tab_contents);
624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    any_visible = (*i)->IsVisible() || any_visible;
625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If there are no visible content things, hide the top level box so it
628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // doesn't mess with padding.
629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (any_visible)
630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_widget_show(content_setting_hbox_.get());
631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  else
632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_widget_hide(content_setting_hbox_.get());
633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
634c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
635c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::UpdatePageActions() {
636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<ExtensionAction*> page_actions;
63721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ExtensionService* service = profile_->GetExtensionService();
638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!service)
639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Find all the page actions.
642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t i = 0; i < service->extensions()->size(); ++i) {
643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (service->extensions()->at(i)->page_action())
644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      page_actions.push_back(service->extensions()->at(i)->page_action());
645c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
646c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Initialize on the first call, or re-inialize if more extensions have been
648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // loaded or added after startup.
649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (page_actions.size() != page_action_views_.size()) {
650c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    page_action_views_.reset();  // Delete the old views (if any).
651c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
652c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (size_t i = 0; i < page_actions.size(); ++i) {
653c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      page_action_views_.push_back(
654c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          new PageActionViewGtk(this, profile_, page_actions[i]));
655c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gtk_box_pack_end(GTK_BOX(page_action_hbox_.get()),
656c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       page_action_views_[i]->widget(), FALSE, FALSE, 0);
657c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
658c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NotificationService::current()->Notify(
659c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        NotificationType::EXTENSION_PAGE_ACTION_COUNT_CHANGED,
660c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        Source<LocationBar>(this),
661c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        NotificationService::NoDetails());
662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
664c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabContents* contents = GetTabContents();
665c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!page_action_views_.empty() && contents) {
666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GURL url = GURL(WideToUTF8(toolbar_model_->GetText()));
667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    for (size_t i = 0; i < page_action_views_.size(); i++) {
6693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      page_action_views_[i]->UpdateVisibility(
6703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          toolbar_model_->input_in_progress() ? NULL : contents, url);
6713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
672c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
673c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
674c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If there are no visible page actions, hide the hbox too, so that it does
675c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // not affect the padding in the location bar.
676c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (PageActionVisibleCount() && !ShouldOnlyShowLocation())
677c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_widget_show(page_action_hbox_.get());
678c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  else
679c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_widget_hide(page_action_hbox_.get());
680c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
681c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
682c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::InvalidatePageActions() {
683c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  size_t count_before = page_action_views_.size();
684c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  page_action_views_.reset();
685c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (page_action_views_.size() != count_before) {
686c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NotificationService::current()->Notify(
687c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        NotificationType::EXTENSION_PAGE_ACTION_COUNT_CHANGED,
688c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        Source<LocationBar>(this),
689c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        NotificationService::NoDetails());
690c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
691c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
692c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
693c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::SaveStateToContents(TabContents* contents) {
694c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  location_entry_->SaveStateToTab(contents);
695c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
696c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
697c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::Revert() {
698c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  location_entry_->RevertAll();
699c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
700c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst AutocompleteEditView* LocationBarViewGtk::location_entry() const {
7023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return location_entry_.get();
7033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7053345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickAutocompleteEditView* LocationBarViewGtk::location_entry() {
7063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return location_entry_.get();
7073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7093345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickLocationBarTesting* LocationBarViewGtk::GetLocationBarForTesting() {
7103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return this;
7113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
71321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenint LocationBarViewGtk::PageActionCount() {
71421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return page_action_views_.size();
71521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
71621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
717c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint LocationBarViewGtk::PageActionVisibleCount() {
718c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int count = 0;
719c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_container_foreach(GTK_CONTAINER(page_action_hbox_.get()),
720c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        CountVisibleWidgets, &count);
721c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return count;
722c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
723c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
724c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochExtensionAction* LocationBarViewGtk::GetPageAction(size_t index) {
725c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (index >= page_action_views_.size()) {
726c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NOTREACHED();
727c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return NULL;
728c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
729c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
730c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return page_action_views_[index]->page_action();
731c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
732c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
733c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochExtensionAction* LocationBarViewGtk::GetVisiblePageAction(size_t index) {
734c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  size_t visible_index = 0;
735c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t i = 0; i < page_action_views_.size(); ++i) {
736c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (page_action_views_[i]->IsVisible()) {
737c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (index == visible_index++)
738c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        return page_action_views_[i]->page_action();
739c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
740c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
741c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
742c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NOTREACHED();
743c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return NULL;
744c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
745c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
746c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::TestPageActionPressed(size_t index) {
747c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (index >= page_action_views_.size()) {
748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NOTREACHED();
749c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
750c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
752c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  page_action_views_[index]->TestActivatePageAction();
753c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
754c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
755c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::Observe(NotificationType type,
756c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 const NotificationSource& source,
757c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 const NotificationDetails& details) {
758ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (type.value == NotificationType::PREF_CHANGED) {
759ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    UpdateStarIcon();
760ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
761ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
762ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
763ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK_EQ(type.value, NotificationType::BROWSER_THEME_CHANGED);
764c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
765ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (theme_service_->UseGtkTheme()) {
766c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_widget_modify_bg(tab_to_search_box_, GTK_STATE_NORMAL, NULL);
767c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
768ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    GdkColor border_color = theme_service_->GetGdkColor(
769ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        ThemeService::COLOR_FRAME);
770c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_util::SetRoundedWindowBorderColor(tab_to_search_box_, border_color);
771c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
772c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_util::SetLabelColor(tab_to_search_full_label_, NULL);
773c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_util::SetLabelColor(tab_to_search_partial_label_, NULL);
774c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_util::SetLabelColor(tab_to_search_hint_leading_label_, NULL);
775c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_util::SetLabelColor(tab_to_search_hint_trailing_label_, NULL);
776c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
777c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_util::UndoForceFontSize(security_info_label_);
778c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_util::UndoForceFontSize(tab_to_search_full_label_);
779c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_util::UndoForceFontSize(tab_to_search_partial_label_);
780c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_util::UndoForceFontSize(tab_to_search_hint_leading_label_);
781c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_util::UndoForceFontSize(tab_to_search_hint_trailing_label_);
782c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
783c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_alignment_set_padding(GTK_ALIGNMENT(location_entry_alignment_),
784c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              0, 0, 0, 0);
785dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    gtk_alignment_set_padding(GTK_ALIGNMENT(tab_to_search_alignment_),
786dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                              1, 1, 1, 0);
787dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    gtk_alignment_set_padding(GTK_ALIGNMENT(site_type_alignment_),
788dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                              1, 1, 1, 0);
789c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
790c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_widget_modify_bg(tab_to_search_box_, GTK_STATE_NORMAL,
791c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         &kKeywordBackgroundColor);
792c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_util::SetRoundedWindowBorderColor(tab_to_search_box_,
793c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          kKeywordBorderColor);
794c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
795513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    gtk_util::SetLabelColor(tab_to_search_full_label_, &gtk_util::kGdkBlack);
796513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    gtk_util::SetLabelColor(tab_to_search_partial_label_, &gtk_util::kGdkBlack);
797c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_util::SetLabelColor(tab_to_search_hint_leading_label_,
798c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            &kHintTextColor);
799c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_util::SetLabelColor(tab_to_search_hint_trailing_label_,
800c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            &kHintTextColor);
801c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
802c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Until we switch to vector graphics, force the font size of labels.
8033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // 12.1px = 9pt @ 96dpi
8043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    gtk_util::ForceFontSizePixels(security_info_label_, 12.1);
805c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_util::ForceFontSizePixels(tab_to_search_full_label_,
806c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        browser_defaults::kAutocompleteEditFontPixelSize);
807c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_util::ForceFontSizePixels(tab_to_search_partial_label_,
808c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        browser_defaults::kAutocompleteEditFontPixelSize);
809c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_util::ForceFontSizePixels(tab_to_search_hint_leading_label_,
810c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        browser_defaults::kAutocompleteEditFontPixelSize);
811c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_util::ForceFontSizePixels(tab_to_search_hint_trailing_label_,
812c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        browser_defaults::kAutocompleteEditFontPixelSize);
813c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
814dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const int top_bottom = popup_window_mode_ ? kBorderThickness : 0;
815dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    gtk_alignment_set_padding(GTK_ALIGNMENT(location_entry_alignment_),
816dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                              kTopMargin + kBorderThickness,
817dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                              kBottomMargin + kBorderThickness,
818dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                              top_bottom, top_bottom);
819dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    gtk_alignment_set_padding(GTK_ALIGNMENT(tab_to_search_alignment_),
820dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                              1, 1, 0, 0);
821dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    gtk_alignment_set_padding(GTK_ALIGNMENT(site_type_alignment_),
822dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                              1, 1, 0, 0);
823c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
824c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
825c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  UpdateStarIcon();
826c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  UpdateSiteTypeArea();
827c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  UpdateContentSettingsIcons();
828c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
829c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
830c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochgboolean LocationBarViewGtk::HandleExpose(GtkWidget* widget,
831c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          GdkEventExpose* event) {
832c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If we're not using GTK theming, draw our own border over the edge pixels
833c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // of the background.
834c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!profile_ ||
835ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      !GtkThemeService::GetFrom(profile_)->UseGtkTheme()) {
836c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int left, center, right;
837c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (popup_window_mode_) {
838c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      left = right = IDR_LOCATIONBG_POPUPMODE_EDGE;
839c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      center = IDR_LOCATIONBG_POPUPMODE_CENTER;
840c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else {
841c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      left = IDR_LOCATIONBG_L;
842c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      center = IDR_LOCATIONBG_C;
843c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      right = IDR_LOCATIONBG_R;
844c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
845c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
846c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NineBox background(left, center, right,
847c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       0, 0, 0, 0, 0, 0);
848c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    background.RenderToWidget(widget);
849c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
850c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
851c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return FALSE;  // Continue propagating the expose.
852c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
853c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
854c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::UpdateSiteTypeArea() {
855dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // The icon is always visible except when the |tab_to_search_alignment_| is
856dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // visible.
857c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!location_entry_->model()->keyword().empty() &&
858c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      !location_entry_->model()->is_keyword_hint()) {
859c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_widget_hide(site_type_area());
860c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
861c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
862c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
863c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int resource_id = location_entry_->GetIcon();
864c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_image_set_from_pixbuf(GTK_IMAGE(location_icon_image_),
865ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                            theme_service_->GetPixbufNamed(resource_id));
866c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
867c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (toolbar_model_->GetSecurityLevel() == ToolbarModel::EV_SECURE) {
868c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!gtk_util::IsActingAsRoundedWindow(site_type_event_box_)) {
869c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // Fun fact: If wee try to make |site_type_event_box_| act as a
870c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // rounded window while it doesn't have a visible window, GTK interprets
871c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // this as a sign that it should paint the skyline texture into the
872c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // omnibox.
873c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gtk_event_box_set_visible_window(GTK_EVENT_BOX(site_type_event_box_),
874c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       TRUE);
875c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
876c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gtk_util::ActAsRoundedWindow(site_type_event_box_,
877c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   kEvSecureBorderColor,
878c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   kCornerSize,
879c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   gtk_util::ROUNDED_ALL,
880c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   gtk_util::BORDER_ALL);
881c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
882c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
883c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::wstring info_text = toolbar_model_->GetEVCertName();
884c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_label_set_text(GTK_LABEL(security_info_label_),
885c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       WideToUTF8(info_text).c_str());
886c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
887c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    UpdateEVCertificateLabelSize();
888c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
889c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_widget_show(GTK_WIDGET(security_info_label_));
890c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
891c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (gtk_util::IsActingAsRoundedWindow(site_type_event_box_)) {
892c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gtk_util::StopActingAsRoundedWindow(site_type_event_box_);
893c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
894c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gtk_event_box_set_visible_window(GTK_EVENT_BOX(site_type_event_box_),
895c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       FALSE);
896c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
897c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
898c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_widget_hide(GTK_WIDGET(security_info_label_));
899c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
900c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
901dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (location_entry()->IsEditingOrEmpty()) {
902dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Do not show the tooltip if the user has been editing the location
903dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // bar, or the location bar is at the NTP.
904dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    gtk_widget_set_tooltip_text(location_icon_image_, "");
905dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else {
906dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    gtk_widget_set_tooltip_text(location_icon_image_,
907dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        l10n_util::GetStringUTF8(IDS_TOOLTIP_LOCATION_ICON).c_str());
908dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
909dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
910c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_show(site_type_area());
911c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
912c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetSiteTypeDragSource();
913c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
914c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
915c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::UpdateEVCertificateLabelSize() {
916c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Figure out the width of the average character.
917c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PangoLayout* layout = gtk_label_get_layout(GTK_LABEL(security_info_label_));
918c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PangoContext* context = pango_layout_get_context(layout);
919c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PangoFontMetrics* metrics = pango_context_get_metrics(
920c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      context,
921c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gtk_widget_get_style(security_info_label_)->font_desc,
922c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      pango_context_get_language(context));
923c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int char_width =
924c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      pango_font_metrics_get_approximate_char_width(metrics) / PANGO_SCALE;
925c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
926c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The EV label should never take up more than half the hbox. We try to
927c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // correct our inaccurate measurement units ("the average character width")
928c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // by dividing more than an even 2.
929c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int text_area = security_info_label_->allocation.width +
930c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  entry_box_->allocation.width;
931c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int max_chars = static_cast<int>(static_cast<float>(text_area) /
932c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   static_cast<float>(char_width) / 2.75);
933c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Don't let the label be smaller than 10 characters so that the country
934c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // code is always visible.
935c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_label_set_max_width_chars(GTK_LABEL(security_info_label_),
936c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                std::max(10, max_chars));
937c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
938c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  pango_font_metrics_unref(metrics);
939c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
940c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
94172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid LocationBarViewGtk::SetKeywordLabel(const string16& keyword) {
942c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (keyword.empty())
943c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
944c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
945c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(profile_);
946c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!profile_->GetTemplateURLModel())
947c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
948c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
949c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_extension_keyword;
95072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const string16 short_name = profile_->GetTemplateURLModel()->
951c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GetKeywordShortName(keyword, &is_extension_keyword);
952c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int message_id = is_extension_keyword ?
953c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      IDS_OMNIBOX_EXTENSION_KEYWORD_TEXT : IDS_OMNIBOX_KEYWORD_TEXT;
9543f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  string16 full_name = l10n_util::GetStringFUTF16(message_id,
95572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                                  short_name);
9563f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  string16 partial_name = l10n_util::GetStringFUTF16(
9573f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      message_id,
95872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      WideToUTF16Hack(
95972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          location_bar_util::CalculateMinString(UTF16ToWideHack(short_name))));
960c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_label_set_text(GTK_LABEL(tab_to_search_full_label_),
9613f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                     UTF16ToUTF8(full_name).c_str());
962c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_label_set_text(GTK_LABEL(tab_to_search_partial_label_),
9633f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                     UTF16ToUTF8(partial_name).c_str());
964c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
965c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (last_keyword_ != keyword) {
966c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    last_keyword_ = keyword;
967c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
968c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (is_extension_keyword) {
969c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const TemplateURL* template_url =
970c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          profile_->GetTemplateURLModel()->GetTemplateURLForKeyword(keyword);
97121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      const SkBitmap& bitmap = profile_->GetExtensionService()->
972c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          GetOmniboxIcon(template_url->GetExtensionId());
973c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&bitmap);
974c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gtk_image_set_from_pixbuf(GTK_IMAGE(tab_to_search_magnifier_), pixbuf);
975c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      g_object_unref(pixbuf);
976c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else {
977c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ResourceBundle& rb = ResourceBundle::GetSharedInstance();
978c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gtk_image_set_from_pixbuf(GTK_IMAGE(tab_to_search_magnifier_),
979c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                rb.GetPixbufNamed(IDR_OMNIBOX_SEARCH));
980c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
981c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
982c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
983c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid LocationBarViewGtk::SetKeywordHintLabel(const string16& keyword) {
985c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (keyword.empty())
986c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
987c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
988c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(profile_);
989c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!profile_->GetTemplateURLModel())
990c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
991c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
992c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_extension_keyword;
99372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const string16 short_name = profile_->GetTemplateURLModel()->
994c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GetKeywordShortName(keyword, &is_extension_keyword);
995c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int message_id = is_extension_keyword ?
996c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      IDS_OMNIBOX_EXTENSION_KEYWORD_HINT : IDS_OMNIBOX_KEYWORD_HINT;
997c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<size_t> content_param_offsets;
9983f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  const string16 keyword_hint = l10n_util::GetStringFUTF16(
9993f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      message_id,
10003f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      string16(),
100172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      short_name,
10023f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      &content_param_offsets);
1003c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (content_param_offsets.size() != 2) {
1004c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // See comments on an identical NOTREACHED() in search_provider.cc.
1005c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NOTREACHED();
1006c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
1007c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
1008c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
10093f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  std::string leading(UTF16ToUTF8(
1010c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      keyword_hint.substr(0, content_param_offsets.front())));
10113f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  std::string trailing(UTF16ToUTF8(
1012c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      keyword_hint.substr(content_param_offsets.front())));
1013c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_label_set_text(GTK_LABEL(tab_to_search_hint_leading_label_),
1014c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     leading.c_str());
1015c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_label_set_text(GTK_LABEL(tab_to_search_hint_trailing_label_),
1016c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     trailing.c_str());
1017c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1018c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1019c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::ShowFirstRunBubbleInternal(
1020c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FirstRun::BubbleType bubble_type) {
1021c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!location_entry_.get() || !widget()->window)
1022c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
1023c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1024ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  gfx::Rect bounds = gtk_util::WidgetBounds(location_icon_image_);
1025ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bounds.set_x(bounds.x() + kFirstRunBubbleLeftSpacing);
1026c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1027ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  FirstRunBubble::Show(profile_, location_icon_image_, bounds, bubble_type);
1028c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1029c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1030c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochgboolean LocationBarViewGtk::OnIconReleased(GtkWidget* sender,
1031c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            GdkEventButton* event) {
1032c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabContents* tab = GetTabContents();
1033c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1034c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (event->button == 1) {
1035c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Do not show page info if the user has been editing the location
1036c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // bar, or the location bar is at the NTP.
1037c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (location_entry()->IsEditingOrEmpty())
1038c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return FALSE;
1039c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1040c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // (0,0) event coordinates indicates that the release came at the end of
1041c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // a drag.
1042c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (event->x == 0 && event->y == 0)
1043c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return FALSE;
1044c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1045c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NavigationEntry* nav_entry = tab->controller().GetActiveEntry();
1046c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!nav_entry) {
1047c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTREACHED();
1048c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return FALSE;
1049c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
1050c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    tab->ShowPageInfo(nav_entry->url(), nav_entry->ssl(), true);
1051c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return TRUE;
1052c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (event->button == 2) {
1053c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // When the user middle clicks on the location icon, try to open the
1054c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // contents of the PRIMARY selection in the current tab.
1055c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // If the click was outside our bounds, do nothing.
1056c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!gtk_util::WidgetBounds(sender).Contains(
1057c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            gfx::Point(event->x, event->y))) {
1058c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return FALSE;
1059c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
1060c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1061c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GURL url;
1062c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!gtk_util::URLFromPrimarySelection(profile_, &url))
1063c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return FALSE;
1064c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1065c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    tab->OpenURL(url, GURL(), CURRENT_TAB, PageTransition::TYPED);
1066c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return TRUE;
1067c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
1068c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1069c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return FALSE;
1070c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1071c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1072c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::OnIconDragData(GtkWidget* sender,
1073c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        GdkDragContext* context,
1074c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        GtkSelectionData* data,
1075c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        guint info, guint time) {
1076c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabContents* tab = GetTabContents();
1077c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!tab)
1078c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
107972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ui::WriteURLWithName(data, tab->GetURL(), tab->GetTitle(), info);
1080c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1081c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1082c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::OnIconDragBegin(GtkWidget* sender,
1083c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         GdkDragContext* context) {
1084ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SkBitmap favicon = GetFavicon();
1085c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&favicon);
1086c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!pixbuf)
1087c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
10883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  drag_icon_ = bookmark_utils::GetDragRepresentation(pixbuf,
1089ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      GetTitle(), theme_service_);
1090c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  g_object_unref(pixbuf);
1091c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_drag_set_icon_widget(context, drag_icon_, 0, 0);
1092c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1093c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1094c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::OnIconDragEnd(GtkWidget* sender,
1095c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       GdkDragContext* context) {
1096c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(drag_icon_);
1097c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_destroy(drag_icon_);
1098c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  drag_icon_ = NULL;
1099c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::OnHboxSizeAllocate(GtkWidget* sender,
1102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            GtkAllocation* allocation) {
1103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (hbox_width_ != allocation->width) {
1104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    hbox_width_ = allocation->width;
1105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    UpdateEVCertificateLabelSize();
1106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
1107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::OnEntryBoxSizeAllocate(GtkWidget* sender,
1110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                GtkAllocation* allocation) {
1111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (entry_box_width_ != allocation->width) {
1112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    entry_box_width_ = allocation->width;
1113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AdjustChildrenVisibility();
1114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
1115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochgboolean LocationBarViewGtk::OnStarButtonPress(GtkWidget* widget,
1118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                               GdkEventButton* event) {
1119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser_->ExecuteCommand(IDC_BOOKMARK_PAGE);
1120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return FALSE;
1121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::ShowStarBubble(const GURL& url,
1124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        bool newly_bookmarked) {
1125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!star_.get())
1126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
1127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BookmarkBubbleGtk::Show(star_.get(), profile_, url, newly_bookmarked);
1129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::SetStarred(bool starred) {
1132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (starred == starred_)
1133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
1134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  starred_ = starred;
1136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  UpdateStarIcon();
1137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::UpdateStarIcon() {
1140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!star_.get())
1141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
1142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool star_enabled = !toolbar_model_->input_in_progress() &&
1143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      edit_bookmarks_enabled_.GetValue();
1144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  command_updater_->UpdateCommandEnabled(IDC_BOOKMARK_PAGE, star_enabled);
1145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (star_enabled) {
1146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    gtk_widget_show_all(star_.get());
1147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    gtk_image_set_from_pixbuf(GTK_IMAGE(star_image_),
1148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        theme_service_->GetPixbufNamed(
1149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            starred_ ? IDR_STAR_LIT : IDR_STAR));
1150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else {
1151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    gtk_widget_hide_all(star_.get());
1152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool LocationBarViewGtk::ShouldOnlyShowLocation() {
1156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return browser_->type() != Browser::TYPE_NORMAL;
1157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::AdjustChildrenVisibility() {
1160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int text_width = location_entry_->TextWidth();
1161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int available_width = entry_box_width_ - text_width - kInnerPadding;
1162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1163dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Only one of |tab_to_search_alignment_| and |tab_to_search_hint_| can be
1164dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // visible at the same time.
1165dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!show_selected_keyword_ && GTK_WIDGET_VISIBLE(tab_to_search_alignment_))
1166dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    gtk_widget_hide(tab_to_search_alignment_);
116772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  else if (!show_keyword_hint_ && GTK_WIDGET_VISIBLE(tab_to_search_hint_))
1168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_widget_hide(tab_to_search_hint_);
1169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (show_selected_keyword_) {
1171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GtkRequisition box, full_label, partial_label;
1172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_widget_size_request(tab_to_search_box_, &box);
1173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_widget_size_request(tab_to_search_full_label_, &full_label);
1174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_widget_size_request(tab_to_search_partial_label_, &partial_label);
1175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int full_partial_width_diff = full_label.width - partial_label.width;
1176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int full_box_width;
1177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int partial_box_width;
1178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (GTK_WIDGET_VISIBLE(tab_to_search_full_label_)) {
1179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      full_box_width = box.width;
1180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      partial_box_width = full_box_width - full_partial_width_diff;
1181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else {
1182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      partial_box_width = box.width;
1183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      full_box_width = partial_box_width + full_partial_width_diff;
1184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
1185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (partial_box_width >= entry_box_width_ - kInnerPadding) {
1187dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      gtk_widget_hide(tab_to_search_alignment_);
1188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else if (full_box_width >= available_width) {
1189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gtk_widget_hide(tab_to_search_full_label_);
1190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gtk_widget_show(tab_to_search_partial_label_);
1191dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      gtk_widget_show(tab_to_search_alignment_);
1192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else if (full_box_width < available_width) {
1193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gtk_widget_hide(tab_to_search_partial_label_);
1194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gtk_widget_show(tab_to_search_full_label_);
1195dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      gtk_widget_show(tab_to_search_alignment_);
1196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
1197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (show_keyword_hint_) {
1198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GtkRequisition leading, icon, trailing;
1199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_widget_size_request(tab_to_search_hint_leading_label_, &leading);
1200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_widget_size_request(tab_to_search_hint_icon_, &icon);
1201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_widget_size_request(tab_to_search_hint_trailing_label_, &trailing);
1202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int full_width = leading.width + icon.width + trailing.width;
1203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (icon.width >= entry_box_width_ - kInnerPadding) {
1205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gtk_widget_hide(tab_to_search_hint_);
1206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else if (full_width >= available_width) {
1207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gtk_widget_hide(tab_to_search_hint_leading_label_);
1208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gtk_widget_hide(tab_to_search_hint_trailing_label_);
1209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gtk_widget_show(tab_to_search_hint_);
1210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else if (full_width < available_width) {
1211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gtk_widget_show(tab_to_search_hint_leading_label_);
1212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gtk_widget_show(tab_to_search_hint_trailing_label_);
1213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gtk_widget_show(tab_to_search_hint_);
1214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
1215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
1216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
1219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LocationBarViewGtk::ContentSettingImageViewGtk
1220c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochLocationBarViewGtk::ContentSettingImageViewGtk::ContentSettingImageViewGtk(
1221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ContentSettingsType content_type,
1222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const LocationBarViewGtk* parent,
1223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Profile* profile)
1224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : content_setting_image_model_(
1225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          ContentSettingImageModel::CreateContentSettingImageModel(
1226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              content_type)),
1227dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      alignment_(gtk_alignment_new(0, 0, 1, 1)),
1228dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      event_box_(gtk_event_box_new()),
1229dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      hbox_(gtk_hbox_new(FALSE, kInnerPadding)),
1230dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      image_(gtk_image_new()),
1231dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      label_(gtk_label_new(NULL)),
1232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      parent_(parent),
1233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      profile_(profile),
1234dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      info_bubble_(NULL),
1235dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      animation_(this),
1236dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      method_factory_(this) {
1237dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gtk_alignment_set_padding(GTK_ALIGNMENT(alignment_.get()), 1, 1, 0, 0);
1238dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gtk_container_add(GTK_CONTAINER(alignment_.get()), event_box_.get());
1239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make the event box not visible so it does not paint a background.
1241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_event_box_set_visible_window(GTK_EVENT_BOX(event_box_.get()), FALSE);
1242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  g_signal_connect(event_box_.get(), "button-press-event",
1243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   G_CALLBACK(&OnButtonPressedThunk), this);
1244dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  g_signal_connect(event_box_.get(), "expose-event",
1245dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                   G_CALLBACK(&OnExposeThunk), this);
1246dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1247dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gtk_widget_set_no_show_all(label_.get(), TRUE);
1248dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gtk_label_set_line_wrap(GTK_LABEL(label_.get()), FALSE);
1249dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1250dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gtk_box_pack_start(GTK_BOX(hbox_), image_.get(), FALSE, FALSE, 0);
1251dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gtk_box_pack_start(GTK_BOX(hbox_), label_.get(), FALSE, FALSE, 0);
1252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1253dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // The +1 accounts for the pixel that is devoted to drawing the border.
1254dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gtk_container_set_border_width(GTK_CONTAINER(hbox_), kHboxBorder + 1);
1255dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1256dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gtk_container_add(GTK_CONTAINER(event_box_.get()), hbox_);
1257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_hide(widget());
1258dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1259dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  animation_.SetSlideDuration(kContentSettingImageAnimationTime);
1260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1262c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochLocationBarViewGtk::ContentSettingImageViewGtk::~ContentSettingImageViewGtk() {
1263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  image_.Destroy();
1264dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  label_.Destroy();
1265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  event_box_.Destroy();
1266dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  alignment_.Destroy();
1267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (info_bubble_)
1269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    info_bubble_->Close();
1270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::ContentSettingImageViewGtk::UpdateFromTabContents(
1273201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    TabContents* tab_contents) {
1274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  content_setting_image_model_->UpdateFromTabContents(tab_contents);
1275dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!content_setting_image_model_->is_visible()) {
1276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_widget_hide(widget());
1277dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
1278dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
1279dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1280dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gtk_image_set_from_pixbuf(GTK_IMAGE(image_.get()),
1281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      GtkThemeService::GetFrom(profile_)->GetPixbufNamed(
1282dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          content_setting_image_model_->get_icon()));
1283dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1284dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gtk_widget_set_tooltip_text(widget(),
1285dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      content_setting_image_model_->get_tooltip().c_str());
1286dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gtk_widget_show_all(widget());
1287dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1288dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TabSpecificContentSettings* content_settings = tab_contents ?
1289dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      tab_contents->GetTabSpecificContentSettings() : NULL;
1290dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!content_settings || content_settings->IsBlockageIndicated(
1291dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      content_setting_image_model_->get_content_settings_type()))
1292dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
1293dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1294dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // The content blockage was not yet indicated to the user. Start indication
1295dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // animation and clear "not yet shown" flag.
1296dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  content_settings->SetBlockageHasBeenIndicated(
1297dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      content_setting_image_model_->get_content_settings_type());
1298dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1299dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int label_string_id =
1300dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      content_setting_image_model_->explanatory_string_id();
1301dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Check if the animation is enabled and if the string for animation is
1302dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // available. If there's no string for the content type, we don't animate.
1303dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (CommandLine::ForCurrentProcess()->HasSwitch(
1304dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      switches::kDisableBlockContentAnimation) || !label_string_id)
1305dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
1306dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1307dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gtk_label_set_text(GTK_LABEL(label_.get()),
1308dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      l10n_util::GetStringUTF8(label_string_id).c_str());
1309dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  StartAnimating();
1310dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
1311dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1312dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid LocationBarViewGtk::ContentSettingImageViewGtk::StartAnimating() {
1313dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (animation_.IsShowing() || animation_.IsClosing())
1314dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
1315dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1316dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gtk_event_box_set_visible_window(GTK_EVENT_BOX(event_box_.get()), TRUE);
1317dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gtk_util::ActAsRoundedWindow(event_box_.get(), kContentSettingBorderColor,
1318dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                               kCornerSize,
1319dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                               gtk_util::ROUNDED_ALL, gtk_util::BORDER_ALL);
1320dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1321dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gtk_widget_set_size_request(label_.get(), -1, -1);
1322dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gtk_widget_size_request(label_.get(), &label_req_);
1323dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gtk_widget_set_size_request(label_.get(), 0, -1);
1324dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gtk_widget_show(label_.get());
1325dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1326dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  animation_.Show();
1327dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
1328dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1329dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid LocationBarViewGtk::ContentSettingImageViewGtk::CloseAnimation() {
1330dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  animation_.Hide();
1331dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
1332dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1333dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid LocationBarViewGtk::ContentSettingImageViewGtk::AnimationProgressed(
1334dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const ui::Animation* animation) {
1335dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gtk_widget_set_size_request(
1336dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      label_.get(),
1337dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      animation->GetCurrentValue() * label_req_.width,
1338dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      -1);
1339dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
1340dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1341dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid LocationBarViewGtk::ContentSettingImageViewGtk::AnimationEnded(
1342dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const ui::Animation* animation) {
1343dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (animation_.IsShowing()) {
1344dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    MessageLoop::current()->PostDelayedTask(FROM_HERE,
1345dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        method_factory_.NewRunnableMethod(
1346dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen            &ContentSettingImageViewGtk::CloseAnimation),
1347dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        kContentSettingImageDisplayTime);
1348dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else {
1349dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    gtk_widget_hide(label_.get());
1350dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    gtk_util::StopActingAsRoundedWindow(event_box_.get());
1351dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    gtk_event_box_set_visible_window(GTK_EVENT_BOX(event_box_.get()), FALSE);
1352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
1353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1355dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid LocationBarViewGtk::ContentSettingImageViewGtk::AnimationCanceled(
1356dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const ui::Animation* animation) {
1357dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
1358dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochgboolean LocationBarViewGtk::ContentSettingImageViewGtk::OnButtonPressed(
1360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GtkWidget* sender, GdkEvent* event) {
1361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabContents* tab_contents = parent_->GetTabContents();
1362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!tab_contents)
1363dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return TRUE;
1364dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const ContentSettingsType content_settings_type =
1365dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      content_setting_image_model_->get_content_settings_type();
1366dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (content_settings_type == CONTENT_SETTINGS_TYPE_PRERENDER)
1367dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return TRUE;
1368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url = tab_contents->GetURL();
1369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::wstring display_host;
1370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  net::AppendFormattedHost(url,
1371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      UTF8ToWide(profile_->GetPrefs()->GetString(prefs::kAcceptLanguages)),
1372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      &display_host,
1373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NULL, NULL);
1374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  info_bubble_ = new ContentSettingBubbleGtk(
1376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      sender, this,
1377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
1378dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          tab_contents, profile_, content_settings_type),
1379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      profile_, tab_contents);
1380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return TRUE;
1381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1383dc0f95d653279beabeb9817299e2902918ba123eKristian Monsengboolean LocationBarViewGtk::ContentSettingImageViewGtk::OnExpose(
1384dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    GtkWidget* sender, GdkEventExpose* event) {
1385dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!(animation_.IsShowing() || animation_.IsClosing()))
1386dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return FALSE;
1387dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1388dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const int height = sender->allocation.height;
1389dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1390dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  cairo_t* cr = gdk_cairo_create(GDK_DRAWABLE(sender->window));
1391dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gdk_cairo_rectangle(cr, &event->area);
1392dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  cairo_clip(cr);
1393dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1394dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  cairo_pattern_t* pattern = cairo_pattern_create_linear(0, 0, 0, height);
1395dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1396dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  cairo_pattern_add_color_stop_rgb(pattern, 0.0,
1397dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   kContentSettingTopColor[0],
1398dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   kContentSettingTopColor[1],
1399dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   kContentSettingTopColor[2]);
1400dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  cairo_pattern_add_color_stop_rgb(pattern, 1.0,
1401dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   kContentSettingBottomColor[0],
1402dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   kContentSettingBottomColor[1],
1403dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   kContentSettingBottomColor[2]);
1404dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  cairo_set_source(cr, pattern);
1405dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  cairo_paint(cr);
1406dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  cairo_pattern_destroy(pattern);
1407dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  cairo_destroy(cr);
1408dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1409dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return FALSE;
1410dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
1411dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::ContentSettingImageViewGtk::InfoBubbleClosing(
1413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    InfoBubbleGtk* info_bubble,
1414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool closed_by_escape) {
1415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  info_bubble_ = NULL;
1416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
1419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LocationBarViewGtk::PageActionViewGtk
1420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1421c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochLocationBarViewGtk::PageActionViewGtk::PageActionViewGtk(
1422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    LocationBarViewGtk* owner, Profile* profile,
1423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ExtensionAction* page_action)
1424731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    : owner_(NULL),
1425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      profile_(profile),
1426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      page_action_(page_action),
1427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      last_icon_pixbuf_(NULL),
1428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      tracker_(this),
1429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      preview_enabled_(false) {
1430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  event_box_.Own(gtk_event_box_new());
1431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_set_size_request(event_box_.get(),
1432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              Extension::kPageActionIconMaxSize,
1433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              Extension::kPageActionIconMaxSize);
1434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make the event box not visible so it does not paint a background.
1436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_event_box_set_visible_window(GTK_EVENT_BOX(event_box_.get()), FALSE);
1437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  g_signal_connect(event_box_.get(), "button-press-event",
1438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   G_CALLBACK(&OnButtonPressedThunk), this);
1439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  g_signal_connect_after(event_box_.get(), "expose-event",
1440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         G_CALLBACK(OnExposeEventThunk), this);
1441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  image_.Own(gtk_image_new());
1443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_container_add(GTK_CONTAINER(event_box_.get()), image_.get());
1444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
144521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const Extension* extension = profile->GetExtensionService()->
1446513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      GetExtensionById(page_action->extension_id(), false);
1447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(extension);
1448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Load all the icons declared in the manifest. This is the contents of the
1450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // icons array, plus the default_icon property, if any.
1451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<std::string> icon_paths(*page_action->icon_paths());
1452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!page_action_->default_icon_path().empty())
1453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    icon_paths.push_back(page_action_->default_icon_path());
1454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (std::vector<std::string>::iterator iter = icon_paths.begin();
1456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       iter != icon_paths.end(); ++iter) {
1457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    tracker_.LoadImage(extension, extension->GetResource(*iter),
1458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       gfx::Size(Extension::kPageActionIconMaxSize,
1459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 Extension::kPageActionIconMaxSize),
1460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       ImageLoadingTracker::DONT_CACHE);
1461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
1462731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1463731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // We set the owner last of all so that we can determine whether we are in
1464731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // the process of initializing this class or not.
1465731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  owner_ = owner;
1466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1468c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochLocationBarViewGtk::PageActionViewGtk::~PageActionViewGtk() {
1469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  image_.Destroy();
1470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  event_box_.Destroy();
1471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (PixbufMap::iterator iter = pixbufs_.begin(); iter != pixbufs_.end();
1472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       ++iter) {
1473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    g_object_unref(iter->second);
1474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
1475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (last_icon_pixbuf_)
1476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    g_object_unref(last_icon_pixbuf_);
1477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::PageActionViewGtk::UpdateVisibility(
1480ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    TabContents* contents, const GURL& url) {
1481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Save this off so we can pass it back to the extension when the action gets
1482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // executed. See PageActionImageView::OnMousePressed.
14833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  current_tab_id_ = contents ? ExtensionTabUtil::GetTabId(contents) : -1;
1484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  current_url_ = url;
1485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool visible = contents &&
14873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      (preview_enabled_ || page_action_->GetIsVisible(current_tab_id_));
1488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (visible) {
1489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Set the tooltip.
14903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    gtk_widget_set_tooltip_text(event_box_.get(),
1491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        page_action_->GetTitle(current_tab_id_).c_str());
1492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Set the image.
1494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // It can come from three places. In descending order of priority:
1495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // - The developer can set it dynamically by path or bitmap. It will be in
1496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    //   page_action_->GetIcon().
1497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // - The developer can set it dyanmically by index. It will be in
1498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    //   page_action_->GetIconIndex().
1499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // - It can be set in the manifest by path. It will be in page_action_->
1500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    //   default_icon_path().
1501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // First look for a dynamically set bitmap.
1503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SkBitmap icon = page_action_->GetIcon(current_tab_id_);
1504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GdkPixbuf* pixbuf = NULL;
1505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!icon.isNull()) {
1506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (icon.pixelRef() != last_icon_skbitmap_.pixelRef()) {
1507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        if (last_icon_pixbuf_)
1508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          g_object_unref(last_icon_pixbuf_);
1509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        last_icon_skbitmap_ = icon;
1510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        last_icon_pixbuf_ = gfx::GdkPixbufFromSkBitmap(&icon);
1511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
1512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      DCHECK(last_icon_pixbuf_);
1513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      pixbuf = last_icon_pixbuf_;
1514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else {
1515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // Otherwise look for a dynamically set index, or fall back to the
1516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // default path.
1517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int icon_index = page_action_->GetIconIndex(current_tab_id_);
15183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      std::string icon_path = (icon_index < 0) ?
15193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          page_action_->default_icon_path() :
15203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          page_action_->icon_paths()->at(icon_index);
1521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (!icon_path.empty()) {
1522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        PixbufMap::iterator iter = pixbufs_.find(icon_path);
1523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        if (iter != pixbufs_.end())
1524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          pixbuf = iter->second;
1525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
1526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
1527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The pixbuf might not be loaded yet.
1528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (pixbuf)
1529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gtk_image_set_from_pixbuf(GTK_IMAGE(image_.get()), pixbuf);
1530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
1531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool old_visible = IsVisible();
1533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (visible)
1534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_widget_show_all(event_box_.get());
1535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  else
1536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gtk_widget_hide_all(event_box_.get());
1537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (visible != old_visible) {
1539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NotificationService::current()->Notify(
1540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        NotificationType::EXTENSION_PAGE_ACTION_VISIBILITY_CHANGED,
1541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        Source<ExtensionAction>(page_action_),
1542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        Details<TabContents>(contents));
1543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
1544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::PageActionViewGtk::OnImageLoaded(
1547ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SkBitmap* image, const ExtensionResource& resource, int index) {
1548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We loaded icons()->size() icons, plus one extra if the page action had
1549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // a default icon.
1550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int total_icons = static_cast<int>(page_action_->icon_paths()->size());
1551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!page_action_->default_icon_path().empty())
1552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    total_icons++;
1553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(index < total_icons);
1554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Map the index of the loaded image back to its name. If we ever get an
1556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // index greater than the number of icons, it must be the default icon.
1557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (image) {
1558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(image);
1559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (index < static_cast<int>(page_action_->icon_paths()->size()))
1560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      pixbufs_[page_action_->icon_paths()->at(index)] = pixbuf;
1561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    else
1562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      pixbufs_[page_action_->default_icon_path()] = pixbuf;
1563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
1564c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1565731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // If we have no owner, that means this class is still being constructed and
1566731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // we should not UpdatePageActions, since it leads to the PageActions being
1567731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // destroyed again and new ones recreated (causing an infinite loop).
1568731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (owner_)
1569731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    owner_->UpdatePageActions();
1570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::PageActionViewGtk::TestActivatePageAction() {
157372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  GdkEventButton event = {};
157472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  event.button = 1;
1575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OnButtonPressed(widget(), &event);
1576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid LocationBarViewGtk::PageActionViewGtk::InspectPopup(
1579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ExtensionAction* action) {
1580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ShowPopup(true);
1581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool LocationBarViewGtk::PageActionViewGtk::ShowPopup(bool devtools) {
1584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!page_action_->HasPopup(current_tab_id_))
1585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
1586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionPopupGtk::Show(
1588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      page_action_->GetPopupUrl(current_tab_id_),
1589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      owner_->browser_,
1590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      event_box_.get(),
1591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      devtools);
1592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
1593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochgboolean LocationBarViewGtk::PageActionViewGtk::OnButtonPressed(
1596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GtkWidget* sender,
159772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    GdkEventButton* event) {
159872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (event->button != 3) {
1599c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!ShowPopup(false)) {
160072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ExtensionService* service = profile_->GetExtensionService();
160172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      service->browser_event_router()->PageActionExecuted(
1602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          profile_,
1603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          page_action_->extension_id(),
1604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          page_action_->id(),
1605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          current_tab_id_,
1606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          current_url_.spec(),
160772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          event->button);
1608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
1609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
161021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    const Extension* extension = profile_->GetExtensionService()->
1611513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        GetExtensionById(page_action()->extension_id(), false);
1612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
161372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (extension->ShowConfigureContextMenus()) {
161472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      context_menu_model_ =
161572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          new ExtensionContextMenuModel(extension, owner_->browser_, this);
161672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      context_menu_.reset(
161772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          new MenuGtk(NULL, context_menu_model_.get()));
161872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      context_menu_->PopupForWidget(sender, event->button, event->time);
161972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
1620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
1621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return TRUE;
1623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochgboolean LocationBarViewGtk::PageActionViewGtk::OnExposeEvent(
1626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GtkWidget* widget, GdkEventExpose* event) {
1627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabContents* contents = owner_->GetTabContents();
1628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!contents)
1629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return FALSE;
1630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int tab_id = ExtensionTabUtil::GetTabId(contents);
1632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (tab_id < 0)
1633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return FALSE;
1634c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1635c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string badge_text = page_action_->GetBadgeText(tab_id);
1636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (badge_text.empty())
1637c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return FALSE;
1638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::CanvasSkiaPaint canvas(event, false);
1640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect bounding_rect(widget->allocation);
1641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  page_action_->PaintBadge(&canvas, bounding_rect, tab_id);
1642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return FALSE;
1643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1644