| Index: chrome/browser/gtk/reload_button_gtk.cc | 
| diff --git a/chrome/browser/gtk/reload_button_gtk.cc b/chrome/browser/gtk/reload_button_gtk.cc | 
| index 05494b248ee4bb631d05d040656f6652095abbf3..e5e88574db9ccdb0d0c553e9e1358e20e8919086 100644 | 
| --- a/chrome/browser/gtk/reload_button_gtk.cc | 
| +++ b/chrome/browser/gtk/reload_button_gtk.cc | 
| @@ -32,7 +32,7 @@ ReloadButtonGtk::ReloadButtonGtk(LocationBarViewGtk* location_bar, | 
| theme_provider_(browser ? | 
| GtkThemeProvider::GetFrom(browser->profile()) : NULL), | 
| reload_(theme_provider_, IDR_RELOAD, IDR_RELOAD_P, IDR_RELOAD_H, 0), | 
| -      stop_(theme_provider_, IDR_STOP, IDR_STOP_P, IDR_STOP_H, 0), | 
| +      stop_(theme_provider_, IDR_STOP, IDR_STOP_P, IDR_STOP_H, IDR_STOP_D), | 
| widget_(gtk_chrome_button_new()) { | 
| gtk_widget_set_size_request(widget(), reload_.Width(), reload_.Height()); | 
|  | 
| @@ -75,8 +75,30 @@ void ReloadButtonGtk::ChangeMode(Mode mode, bool force) { | 
| timer_.Stop(); | 
| visible_mode_ = mode; | 
|  | 
| +    stop_.set_paint_override(-1); | 
| +    gtk_chrome_button_unset_paint_state(GTK_CHROME_BUTTON(widget_.get())); | 
| + | 
| UpdateThemeButtons(); | 
| gtk_widget_queue_draw(widget()); | 
| +  } else if (visible_mode_ != MODE_RELOAD) { | 
| +    // If you read the views implementation of reload_button.cc, you'll see | 
| +    // that instead of screwing with paint states, the views implementation | 
| +    // just changes whether the view is enabled. We can't do that here because | 
| +    // changing the widget state to GTK_STATE_INSENSITIVE will cause a cascade | 
| +    // of messages on all its children and will also trigger a synthesized | 
| +    // leave notification and prevent the real leave notification from turning | 
| +    // the button back to normal. So instead, override the stop_ paint state | 
| +    // for chrome-theme mode, and use this as a flag to discard click events. | 
| +    stop_.set_paint_override(GTK_STATE_INSENSITIVE); | 
| + | 
| +    // Also set the gtk_chrome_button paint state to insensitive to hide | 
| +    // the border drawn around the stop icon. | 
| +    gtk_chrome_button_set_paint_state(GTK_CHROME_BUTTON(widget_.get()), | 
| +                                      GTK_STATE_INSENSITIVE); | 
| + | 
| +    // If we're in GTK theme mode, we need to also render the correct icon for | 
| +    // the stop/insensitive since we won't be using |stop_| to render the icon. | 
| +    UpdateThemeButtons(); | 
| } | 
| } | 
|  | 
| @@ -98,6 +120,11 @@ void ReloadButtonGtk::OnButtonTimer() { | 
|  | 
| void ReloadButtonGtk::OnClicked(GtkWidget* sender) { | 
| if (visible_mode_ == MODE_STOP) { | 
| +    // The stop button is disabled because the user hovered over the button | 
| +    // until the stop action is no longer selectable. | 
| +    if (stop_.paint_override() == GTK_STATE_INSENSITIVE) | 
| +      return; | 
| + | 
| if (browser_) | 
| browser_->Stop(); | 
|  | 
| @@ -182,13 +209,29 @@ void ReloadButtonGtk::UpdateThemeButtons() { | 
| bool use_gtk = theme_provider_ && theme_provider_->UseGtkTheme(); | 
|  | 
| if (use_gtk) { | 
| -    GdkPixbuf* pixbuf = gtk_widget_render_icon(widget(), | 
| -        (intended_mode_ == MODE_RELOAD) ? GTK_STOCK_REFRESH : GTK_STOCK_STOP, | 
| -        GTK_ICON_SIZE_SMALL_TOOLBAR, NULL); | 
| - | 
| -    gtk_button_set_image(GTK_BUTTON(widget()), | 
| -                         gtk_image_new_from_pixbuf(pixbuf)); | 
| -    g_object_unref(pixbuf); | 
| +    gtk_widget_ensure_style(widget()); | 
| +    GtkIconSet* icon_set = gtk_style_lookup_icon_set( | 
| +        widget()->style, | 
| +        (visible_mode_ == MODE_RELOAD) ? GTK_STOCK_REFRESH : GTK_STOCK_STOP); | 
| +    if (icon_set) { | 
| +      GtkStateType state = static_cast<GtkStateType>( | 
| +          GTK_WIDGET_STATE(widget())); | 
| +      if (visible_mode_ == MODE_STOP && stop_.paint_override() != -1) | 
| +        state = static_cast<GtkStateType>(stop_.paint_override()); | 
| + | 
| +      GdkPixbuf* pixbuf = gtk_icon_set_render_icon( | 
| +          icon_set, | 
| +          widget()->style, | 
| +          gtk_widget_get_direction(widget()), | 
| +          state, | 
| +          GTK_ICON_SIZE_SMALL_TOOLBAR, | 
| +          widget(), | 
| +          NULL); | 
| + | 
| +      gtk_button_set_image(GTK_BUTTON(widget()), | 
| +                           gtk_image_new_from_pixbuf(pixbuf)); | 
| +      g_object_unref(pixbuf); | 
| +    } | 
|  | 
| gtk_widget_set_size_request(widget(), -1, -1); | 
| GtkRequisition req; | 
|  |