This source file includes following definitions.
- SetWidgetHeightRequest
- window_
- Init
- SetViewIDs
- Show
- Hide
- GetLocationBar
- UpdateForBookmarkBarVisibility
- ShowAppMenu
- EnabledStateChangedForCommand
- StoppedShowing
- GetIconSetForId
- AlwaysShowIconForCmd
- GetAcceleratorForCommandId
- Observe
- UpdateWebContents
- IsWrenchMenuShowing
- OnZoomLevelChanged
- SetUpDragForHomeButton
- UpdateRoundedness
- OnAlignmentExpose
- OnLocationHboxExpose
- OnButtonClick
- OnMenuButtonPressEvent
- OnDragDataReceived
- ShouldOnlyShowLocation
- RebuildWrenchMenu
- OnWrenchMenuButtonExpose
- UpdateShowHomeButton
#include "chrome/browser/ui/gtk/browser_toolbar_gtk.h"
#include <gdk/gdkkeysyms.h>
#include <gtk/gtk.h>
#include <X11/XF86keysym.h>
#include "base/base_paths.h"
#include "base/command_line.h"
#include "base/debug/trace_event.h"
#include "base/i18n/rtl.h"
#include "base/logging.h"
#include "base/memory/singleton.h"
#include "base/path_service.h"
#include "base/prefs/pref_service.h"
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/themes/theme_properties.h"
#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/global_error/global_error.h"
#include "chrome/browser/ui/global_error/global_error_service.h"
#include "chrome/browser/ui/global_error/global_error_service_factory.h"
#include "chrome/browser/ui/gtk/accelerators_gtk.h"
#include "chrome/browser/ui/gtk/back_forward_button_gtk.h"
#include "chrome/browser/ui/gtk/bookmarks/bookmark_sub_menu_model_gtk.h"
#include "chrome/browser/ui/gtk/browser_actions_toolbar_gtk.h"
#include "chrome/browser/ui/gtk/browser_window_gtk.h"
#include "chrome/browser/ui/gtk/custom_button.h"
#include "chrome/browser/ui/gtk/event_utils.h"
#include "chrome/browser/ui/gtk/gtk_chrome_button.h"
#include "chrome/browser/ui/gtk/gtk_theme_service.h"
#include "chrome/browser/ui/gtk/gtk_util.h"
#include "chrome/browser/ui/gtk/location_bar_view_gtk.h"
#include "chrome/browser/ui/gtk/reload_button_gtk.h"
#include "chrome/browser/ui/gtk/rounded_window.h"
#include "chrome/browser/ui/gtk/tabs/tab_strip_gtk.h"
#include "chrome/browser/ui/gtk/view_id_util.h"
#include "chrome/browser/ui/toolbar/encoding_menu_controller.h"
#include "chrome/browser/upgrade_detector.h"
#include "chrome/common/net/url_fixer_upper.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
#include "content/public/browser/host_zoom_map.h"
#include "content/public/browser/notification_details.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/user_metrics.h"
#include "content/public/browser/web_contents.h"
#include "grit/chromium_strings.h"
#include "grit/generated_resources.h"
#include "grit/theme_resources.h"
#include "ui/base/dragdrop/gtk_dnd_util.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/canvas_skia_paint.h"
#include "ui/gfx/gtk_util.h"
#include "ui/gfx/image/cairo_cached_surface.h"
#include "ui/gfx/skbitmap_operations.h"
using base::UserMetricsAction;
using content::HostZoomMap;
using content::WebContents;
namespace {
const int kToolbarLeftAreaPadding = 4;
const int kToolbarHeight = 29;
const int kTopBottomPadding = 3;
const int kToolbarHeightLocationBarOnly = kToolbarHeight - 2;
const int kToolbarWidgetSpacing = 1;
const int kToolbarCornerSize = 3;
void SetWidgetHeightRequest(GtkWidget* widget, gpointer user_data) {
  gtk_widget_set_size_request(widget, -1, GPOINTER_TO_INT(user_data));
}
}  
BrowserToolbarGtk::BrowserToolbarGtk(Browser* browser, BrowserWindowGtk* window)
    : toolbar_(NULL),
      location_bar_(new LocationBarViewGtk(browser)),
      is_wrench_menu_model_valid_(true),
      browser_(browser),
      window_(window) {
  wrench_menu_model_.reset(new WrenchMenuModel(this, browser_, false));
  chrome::AddCommandObserver(browser_, IDC_BACK, this);
  chrome::AddCommandObserver(browser_, IDC_FORWARD, this);
  chrome::AddCommandObserver(browser_, IDC_HOME, this);
  chrome::AddCommandObserver(browser_, IDC_BOOKMARK_PAGE, this);
  registrar_.Add(this,
                 chrome::NOTIFICATION_UPGRADE_RECOMMENDED,
                 content::NotificationService::AllSources());
  registrar_.Add(this,
                 chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED,
                 content::Source<Profile>(browser_->profile()));
}
BrowserToolbarGtk::~BrowserToolbarGtk() {
  chrome::RemoveCommandObserver(browser_, IDC_BACK, this);
  chrome::RemoveCommandObserver(browser_, IDC_FORWARD, this);
  chrome::RemoveCommandObserver(browser_, IDC_HOME, this);
  chrome::RemoveCommandObserver(browser_, IDC_BOOKMARK_PAGE, this);
  offscreen_entry_.Destroy();
  wrench_menu_.reset();
}
void BrowserToolbarGtk::Init(GtkWindow* top_level_window) {
  Profile* profile = browser_->profile();
  theme_service_ = GtkThemeService::GetFrom(profile);
  registrar_.Add(this,
                 chrome::NOTIFICATION_BROWSER_THEME_CHANGED,
                 content::Source<ThemeService>(theme_service_));
  offscreen_entry_.Own(gtk_entry_new());
  base::Closure callback =
      base::Bind(&BrowserToolbarGtk::SetUpDragForHomeButton,
                 base::Unretained(this));
  show_home_button_.Init(prefs::kShowHomeButton, profile->GetPrefs(),
                         base::Bind(&BrowserToolbarGtk::UpdateShowHomeButton,
                                    base::Unretained(this)));
  home_page_.Init(prefs::kHomePage, profile->GetPrefs(), callback);
  home_page_is_new_tab_page_.Init(prefs::kHomePageIsNewTabPage,
                                  profile->GetPrefs(),
                                  callback);
  event_box_ = gtk_event_box_new();
  
  
  if (!theme_service_->UsingNativeTheme())
    gtk_event_box_set_visible_window(GTK_EVENT_BOX(event_box_), FALSE);
  toolbar_ = gtk_hbox_new(FALSE, 0);
  alignment_ = gtk_alignment_new(0.0, 0.0, 1.0, 1.0);
  UpdateForBookmarkBarVisibility(false);
  g_signal_connect(alignment_, "expose-event",
                   G_CALLBACK(&OnAlignmentExposeThunk), this);
  gtk_container_add(GTK_CONTAINER(event_box_), alignment_);
  gtk_container_add(GTK_CONTAINER(alignment_), toolbar_);
  toolbar_left_ = gtk_hbox_new(FALSE, kToolbarWidgetSpacing);
  GtkSizeGroup* size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
  back_.reset(new BackForwardButtonGtk(browser_, false));
  g_signal_connect(back_->widget(), "clicked",
                   G_CALLBACK(OnButtonClickThunk), this);
  gtk_size_group_add_widget(size_group, back_->widget());
  gtk_box_pack_start(GTK_BOX(toolbar_left_), back_->widget(), FALSE,
                     FALSE, 0);
  forward_.reset(new BackForwardButtonGtk(browser_, true));
  g_signal_connect(forward_->widget(), "clicked",
                   G_CALLBACK(OnButtonClickThunk), this);
  gtk_size_group_add_widget(size_group, forward_->widget());
  gtk_box_pack_start(GTK_BOX(toolbar_left_), forward_->widget(), FALSE,
                     FALSE, 0);
  reload_.reset(new ReloadButtonGtk(location_bar_.get(), browser_));
  gtk_size_group_add_widget(size_group, reload_->widget());
  gtk_box_pack_start(GTK_BOX(toolbar_left_), reload_->widget(), FALSE, FALSE,
                     0);
  home_.reset(new CustomDrawButton(theme_service_, IDR_HOME, IDR_HOME_P,
      IDR_HOME_H, 0, GTK_STOCK_HOME, GTK_ICON_SIZE_SMALL_TOOLBAR));
  gtk_widget_set_tooltip_text(home_->widget(),
      l10n_util::GetStringUTF8(IDS_TOOLTIP_HOME).c_str());
  g_signal_connect(home_->widget(), "clicked",
                   G_CALLBACK(OnButtonClickThunk), this);
  gtk_size_group_add_widget(size_group, home_->widget());
  gtk_box_pack_start(GTK_BOX(toolbar_left_), home_->widget(), FALSE, FALSE,
                     kToolbarWidgetSpacing);
  gtk_util::SetButtonTriggersNavigation(home_->widget());
  gtk_box_pack_start(GTK_BOX(toolbar_), toolbar_left_, FALSE, FALSE,
                     kToolbarLeftAreaPadding);
  g_object_unref(size_group);
  location_hbox_ = gtk_hbox_new(FALSE, 0);
  location_bar_->Init(ShouldOnlyShowLocation());
  gtk_box_pack_start(GTK_BOX(location_hbox_), location_bar_->widget(), TRUE,
                     TRUE, 0);
  g_signal_connect(location_hbox_, "expose-event",
                   G_CALLBACK(OnLocationHboxExposeThunk), this);
  gtk_box_pack_start(GTK_BOX(toolbar_), location_hbox_, TRUE, TRUE,
      ShouldOnlyShowLocation() ? 1 : 0);
  if (!ShouldOnlyShowLocation()) {
    actions_toolbar_.reset(new BrowserActionsToolbarGtk(browser_));
    gtk_box_pack_start(GTK_BOX(toolbar_), actions_toolbar_->widget(),
                       FALSE, FALSE, 0);
  }
  wrench_menu_image_ = gtk_image_new_from_pixbuf(
      theme_service_->GetRTLEnabledPixbufNamed(IDR_TOOLS));
  wrench_menu_button_.reset(new CustomDrawButton(theme_service_, IDR_TOOLS,
      IDR_TOOLS_P, IDR_TOOLS_H, 0, wrench_menu_image_));
  GtkWidget* wrench_button = wrench_menu_button_->widget();
  gtk_widget_set_tooltip_text(
      wrench_button,
      l10n_util::GetStringUTF8(IDS_APPMENU_TOOLTIP).c_str());
  g_signal_connect(wrench_button, "button-press-event",
                   G_CALLBACK(OnMenuButtonPressEventThunk), this);
  gtk_widget_set_can_focus(wrench_button, FALSE);
  
  
  GtkWidget* wrench_box = gtk_alignment_new(0, 0, 1, 1);
  g_signal_connect_after(wrench_box, "expose-event",
                         G_CALLBACK(OnWrenchMenuButtonExposeThunk), this);
  gtk_container_add(GTK_CONTAINER(wrench_box), wrench_button);
  gtk_box_pack_start(GTK_BOX(toolbar_), wrench_box, FALSE, FALSE, 4);
  wrench_menu_.reset(new MenuGtk(this, wrench_menu_model_.get()));
  
  wrench_menu_model_->bookmark_sub_menu_model()->SetMenuGtk(wrench_menu_.get());
  zoom_subscription_ = HostZoomMap::GetForBrowserContext(
      browser()->profile())->AddZoomLevelChangedCallback(
          base::Bind(&BrowserToolbarGtk::OnZoomLevelChanged,
                     base::Unretained(this)));
  if (ShouldOnlyShowLocation()) {
    gtk_widget_show(event_box_);
    gtk_widget_show(alignment_);
    gtk_widget_show(toolbar_);
    gtk_widget_show_all(location_hbox_);
    gtk_widget_hide(reload_->widget());
  } else {
    gtk_widget_show_all(event_box_);
    if (actions_toolbar_->button_count() == 0)
      gtk_widget_hide(actions_toolbar_->widget());
  }
  
  UpdateShowHomeButton();
  SetUpDragForHomeButton();
  
  
  location_bar_->UpdateContentSettingsIcons();
  SetViewIDs();
  theme_service_->InitThemesFor(this);
}
void BrowserToolbarGtk::SetViewIDs() {
  ViewIDUtil::SetID(widget(), VIEW_ID_TOOLBAR);
  ViewIDUtil::SetID(back_->widget(), VIEW_ID_BACK_BUTTON);
  ViewIDUtil::SetID(forward_->widget(), VIEW_ID_FORWARD_BUTTON);
  ViewIDUtil::SetID(reload_->widget(), VIEW_ID_RELOAD_BUTTON);
  ViewIDUtil::SetID(home_->widget(), VIEW_ID_HOME_BUTTON);
  ViewIDUtil::SetID(location_bar_->widget(), VIEW_ID_OMNIBOX);
  ViewIDUtil::SetID(wrench_menu_button_->widget(), VIEW_ID_APP_MENU);
}
void BrowserToolbarGtk::Show() {
  gtk_widget_show(toolbar_);
}
void BrowserToolbarGtk::Hide() {
  gtk_widget_hide(toolbar_);
}
LocationBar* BrowserToolbarGtk::GetLocationBar() const {
  return location_bar_.get();
}
void BrowserToolbarGtk::UpdateForBookmarkBarVisibility(
    bool show_bottom_padding) {
  gtk_alignment_set_padding(GTK_ALIGNMENT(alignment_),
      ShouldOnlyShowLocation() ? 0 : kTopBottomPadding,
      !show_bottom_padding || ShouldOnlyShowLocation() ? 0 : kTopBottomPadding,
      0, 0);
}
void BrowserToolbarGtk::ShowAppMenu() {
  wrench_menu_->Cancel();
  if (!is_wrench_menu_model_valid_)
    RebuildWrenchMenu();
  wrench_menu_button_->SetPaintOverride(GTK_STATE_ACTIVE);
  content::RecordAction(UserMetricsAction("ShowAppMenu"));
  wrench_menu_->PopupAsFromKeyEvent(wrench_menu_button_->widget());
}
void BrowserToolbarGtk::EnabledStateChangedForCommand(int id, bool enabled) {
  GtkWidget* widget = NULL;
  switch (id) {
    case IDC_BACK:
      widget = back_->widget();
      break;
    case IDC_FORWARD:
      widget = forward_->widget();
      break;
    case IDC_HOME:
      if (home_.get())
        widget = home_->widget();
      break;
  }
  if (widget) {
    if (!enabled && gtk_widget_get_state(widget) == GTK_STATE_PRELIGHT) {
      
      
      
      
      gtk_widget_set_state(widget, GTK_STATE_NORMAL);
    }
    gtk_widget_set_sensitive(widget, enabled);
  }
}
void BrowserToolbarGtk::StoppedShowing() {
  
  
  gtk_chrome_button_set_hover_state(
      GTK_CHROME_BUTTON(wrench_menu_button_->widget()), 0.0);
  wrench_menu_button_->UnsetPaintOverride();
}
GtkIconSet* BrowserToolbarGtk::GetIconSetForId(int idr) {
  return theme_service_->GetIconSetForId(idr);
}
bool BrowserToolbarGtk::AlwaysShowIconForCmd(int command_id) const {
  return command_id == IDC_UPGRADE_DIALOG ||
      BookmarkSubMenuModel::IsBookmarkItemCommandId(command_id);
}
bool BrowserToolbarGtk::GetAcceleratorForCommandId(
    int id,
    ui::Accelerator* out_accelerator) {
  const ui::Accelerator* accelerator =
      AcceleratorsGtk::GetInstance()->GetPrimaryAcceleratorForCommand(id);
  if (!accelerator)
    return false;
  *out_accelerator = *accelerator;
  return true;
}
void BrowserToolbarGtk::Observe(int type,
                                const content::NotificationSource& source,
                                const content::NotificationDetails& details) {
  if (type == chrome::NOTIFICATION_BROWSER_THEME_CHANGED) {
    
    bool use_gtk = theme_service_->UsingNativeTheme();
    int border = use_gtk ? 0 : 2;
    gtk_container_set_border_width(
        GTK_CONTAINER(wrench_menu_button_->widget()), border);
    
    
    
    
    
    int toolbar_height = ShouldOnlyShowLocation() ?
                         kToolbarHeightLocationBarOnly : kToolbarHeight;
    gtk_container_foreach(GTK_CONTAINER(toolbar_), SetWidgetHeightRequest,
                          GINT_TO_POINTER(toolbar_height));
    gtk_widget_set_size_request(location_hbox_, -1,
                                use_gtk ? -1 : toolbar_height);
    
    
    
    gtk_event_box_set_visible_window(GTK_EVENT_BOX(event_box_), use_gtk);
    if (use_gtk) {
      
      
      gtk_image_set_from_pixbuf(
          GTK_IMAGE(wrench_menu_image_),
          theme_service_->GetRTLEnabledPixbufNamed(IDR_TOOLS));
    }
    UpdateRoundedness();
  } else if (type == chrome::NOTIFICATION_UPGRADE_RECOMMENDED) {
    
    gtk_widget_queue_draw(wrench_menu_button_->widget());
  } else if (type == chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED) {
    is_wrench_menu_model_valid_ = false;
    gtk_widget_queue_draw(wrench_menu_button_->widget());
  } else {
    NOTREACHED();
  }
}
void BrowserToolbarGtk::UpdateWebContents(WebContents* contents) {
  location_bar_->Update(contents);
  if (actions_toolbar_.get())
    actions_toolbar_->Update();
}
bool BrowserToolbarGtk::IsWrenchMenuShowing() const {
  return wrench_menu_.get() && gtk_widget_get_visible(wrench_menu_->widget());
}
void BrowserToolbarGtk::OnZoomLevelChanged(
    const HostZoomMap::ZoomLevelChange& change) {
  
  
  
  
  
  wrench_menu_model_->UpdateZoomControls();
  
  
  wrench_menu_->UpdateMenu();
}
void BrowserToolbarGtk::SetUpDragForHomeButton() {
  if (!home_page_.IsManaged() && !home_page_is_new_tab_page_.IsManaged()) {
    gtk_drag_dest_set(home_->widget(), GTK_DEST_DEFAULT_ALL,
                      NULL, 0, GDK_ACTION_COPY);
    static const int targets[] = { ui::TEXT_PLAIN, ui::TEXT_URI_LIST, -1 };
    ui::SetDestTargetList(home_->widget(), targets);
    drop_handler_.reset(new ui::GtkSignalRegistrar());
    drop_handler_->Connect(home_->widget(), "drag-data-received",
                           G_CALLBACK(OnDragDataReceivedThunk), this);
  } else {
    gtk_drag_dest_unset(home_->widget());
    drop_handler_.reset(NULL);
  }
}
bool BrowserToolbarGtk::UpdateRoundedness() {
  
  
  
  bool should_be_rounded = theme_service_->UsingNativeTheme() &&
      window_->ShouldDrawContentDropShadow();
  if (should_be_rounded == gtk_util::IsActingAsRoundedWindow(alignment_))
    return false;
  if (should_be_rounded) {
    gtk_util::ActAsRoundedWindow(alignment_, GdkColor(), kToolbarCornerSize,
                                 gtk_util::ROUNDED_TOP,
                                 gtk_util::BORDER_NONE);
  } else {
    gtk_util::StopActingAsRoundedWindow(alignment_);
  }
  return true;
}
gboolean BrowserToolbarGtk::OnAlignmentExpose(GtkWidget* widget,
                                              GdkEventExpose* e) {
  TRACE_EVENT0("ui::gtk", "BrowserToolbarGtk::OnAlignmentExpose");
  
  
  if (UpdateRoundedness())
    return TRUE;
  
  if (theme_service_->UsingNativeTheme())
    return FALSE;
  cairo_t* cr = gdk_cairo_create(gtk_widget_get_window(widget));
  gdk_cairo_rectangle(cr, &e->area);
  cairo_clip(cr);
  gfx::Point tabstrip_origin =
      window_->tabstrip()->GetTabStripOriginForWidget(widget);
  
  GdkColor color = theme_service_->GetGdkColor(
      ThemeProperties::COLOR_TOOLBAR);
  gdk_cairo_set_source_color(cr, &color);
  cairo_fill(cr);
  
  const int kCornerWidth = 4;
  
  
  const int kShadowThickness = 2;
  GtkAllocation allocation;
  gtk_widget_get_allocation(widget, &allocation);
  gfx::Rect area(e->area);
  gfx::Rect right(allocation.x + allocation.width - kCornerWidth,
                  allocation.y - kShadowThickness,
                  kCornerWidth,
                  allocation.height + kShadowThickness);
  gfx::Rect left(allocation.x - kShadowThickness,
                 allocation.y - kShadowThickness,
                 kCornerWidth,
                 allocation.height + kShadowThickness);
  if (window_->ShouldDrawContentDropShadow()) {
    
    area.Subtract(right);
    area.Subtract(left);
  }
  gfx::Image background = theme_service_->GetImageNamed(IDR_THEME_TOOLBAR);
  background.ToCairo()->SetSource(
      cr, widget, tabstrip_origin.x(), tabstrip_origin.y());
  cairo_pattern_set_extend(cairo_get_source(cr), CAIRO_EXTEND_REPEAT);
  cairo_rectangle(cr, area.x(), area.y(), area.width(), area.height());
  cairo_fill(cr);
  if (!window_->ShouldDrawContentDropShadow()) {
    
    cairo_destroy(cr);
    return FALSE;
  }
  bool draw_left_corner = left.Intersects(gfx::Rect(e->area));
  bool draw_right_corner = right.Intersects(gfx::Rect(e->area));
  if (draw_left_corner || draw_right_corner) {
    
    cairo_surface_t* target = cairo_surface_create_similar(
        cairo_get_target(cr),
        CAIRO_CONTENT_COLOR_ALPHA,
        allocation.x + allocation.width,
        allocation.y + allocation.height);
    cairo_t* copy_cr = cairo_create(target);
    ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
    cairo_set_operator(copy_cr, CAIRO_OPERATOR_SOURCE);
    if (draw_left_corner) {
      rb.GetNativeImageNamed(IDR_CONTENT_TOP_LEFT_CORNER_MASK).ToCairo()->
          SetSource(copy_cr, widget, left.x(), left.y());
      cairo_paint(copy_cr);
    }
    if (draw_right_corner) {
      rb.GetNativeImageNamed(IDR_CONTENT_TOP_RIGHT_CORNER_MASK).ToCairo()->
          SetSource(copy_cr, widget, right.x(), right.y());
      
      
      cairo_rectangle(copy_cr, right.x(), right.y(),
                      right.width(), right.height());
      cairo_fill(copy_cr);
    }
    
    
    background.ToCairo()->SetSource(copy_cr, widget,
                                     tabstrip_origin.x(), tabstrip_origin.y());
    cairo_set_operator(copy_cr, CAIRO_OPERATOR_IN);
    cairo_pattern_set_extend(cairo_get_source(copy_cr), CAIRO_EXTEND_REPEAT);
    cairo_paint(copy_cr);
    cairo_destroy(copy_cr);
    
    cairo_set_source_surface(cr, target, 0, 0);
    cairo_paint(cr);
    cairo_surface_destroy(target);
  }
  cairo_destroy(cr);
  return FALSE;  
}
gboolean BrowserToolbarGtk::OnLocationHboxExpose(GtkWidget* location_hbox,
                                                 GdkEventExpose* e) {
  TRACE_EVENT0("ui::gtk", "BrowserToolbarGtk::OnLocationHboxExpose");
  if (theme_service_->UsingNativeTheme()) {
    GtkAllocation allocation;
    gtk_widget_get_allocation(location_hbox, &allocation);
    gtk_util::DrawTextEntryBackground(offscreen_entry_.get(),
                                      location_hbox, &e->area,
                                      &allocation);
  }
  return FALSE;
}
void BrowserToolbarGtk::OnButtonClick(GtkWidget* button) {
  if ((button == back_->widget()) || (button == forward_->widget())) {
    if (event_utils::DispositionForCurrentButtonPressEvent() == CURRENT_TAB)
      location_bar_->Revert();
    return;
  }
  DCHECK(home_.get() && button == home_->widget()) <<
      "Unexpected button click callback";
  chrome::Home(browser_, event_utils::DispositionForCurrentButtonPressEvent());
}
gboolean BrowserToolbarGtk::OnMenuButtonPressEvent(GtkWidget* button,
                                                   GdkEventButton* event) {
  if (event->button != 1)
    return FALSE;
  if (!is_wrench_menu_model_valid_)
    RebuildWrenchMenu();
  wrench_menu_button_->SetPaintOverride(GTK_STATE_ACTIVE);
  wrench_menu_->PopupForWidget(button, event->button, event->time);
  return TRUE;
}
void BrowserToolbarGtk::OnDragDataReceived(GtkWidget* widget,
    GdkDragContext* drag_context, gint x, gint y,
    GtkSelectionData* data, guint info, guint time) {
  if (info != ui::TEXT_PLAIN) {
    NOTIMPLEMENTED() << "Only support plain text drops for now, sorry!";
    return;
  }
  GURL url(reinterpret_cast<const char*>(gtk_selection_data_get_data(data)));
  if (!url.is_valid())
    return;
  bool url_is_newtab = url.SchemeIs(content::kChromeUIScheme) &&
                       url.host() == chrome::kChromeUINewTabHost;
  home_page_is_new_tab_page_.SetValue(url_is_newtab);
  if (!url_is_newtab)
    home_page_.SetValue(url.spec());
}
bool BrowserToolbarGtk::ShouldOnlyShowLocation() const {
  
  return !browser_->is_type_tabbed();
}
void BrowserToolbarGtk::RebuildWrenchMenu() {
  wrench_menu_model_.reset(new WrenchMenuModel(this, browser_, false));
  wrench_menu_.reset(new MenuGtk(this, wrench_menu_model_.get()));
  
  wrench_menu_model_->bookmark_sub_menu_model()->SetMenuGtk(wrench_menu_.get());
  is_wrench_menu_model_valid_ = true;
}
gboolean BrowserToolbarGtk::OnWrenchMenuButtonExpose(GtkWidget* sender,
                                                     GdkEventExpose* expose) {
  TRACE_EVENT0("ui::gtk", "BrowserToolbarGtk::OnWrenchMenuButtonExpose");
  int resource_id = 0;
  if (UpgradeDetector::GetInstance()->notify_upgrade()) {
    resource_id = UpgradeDetector::GetInstance()->GetIconResourceID(
            UpgradeDetector::UPGRADE_ICON_TYPE_BADGE);
  } else {
    GlobalError* error = GlobalErrorServiceFactory::GetForProfile(
        browser_->profile())->GetHighestSeverityGlobalErrorWithWrenchMenuItem();
    if (error) {
      switch (error->GetSeverity()) {
        case GlobalError::SEVERITY_LOW:
          resource_id = IDR_UPDATE_BADGE;
          break;
        case GlobalError::SEVERITY_MEDIUM:
          resource_id = IDR_UPDATE_BADGE4;
          break;
        case GlobalError::SEVERITY_HIGH:
          resource_id = IDR_UPDATE_BADGE3;
          break;
      }
    }
  }
  if (!resource_id)
    return FALSE;
  GtkAllocation allocation;
  gtk_widget_get_allocation(sender, &allocation);
  
  const gfx::ImageSkia* badge = theme_service_->GetImageSkiaNamed(resource_id);
  gfx::CanvasSkiaPaint canvas(expose, false);
  int x_offset = base::i18n::IsRTL() ? 0 : allocation.width - badge->width();
  int y_offset = 0;
  canvas.DrawImageInt(*badge,
                      allocation.x + x_offset,
                      allocation.y + y_offset);
  return FALSE;
}
void BrowserToolbarGtk::UpdateShowHomeButton() {
  bool visible = show_home_button_.GetValue() && !ShouldOnlyShowLocation();
  gtk_widget_set_visible(home_->widget(), visible);
}