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_, >k_util::kGdkBlack); 796513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch gtk_util::SetLabelColor(tab_to_search_partial_label_, >k_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