reload_button.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/views/toolbar/reload_button.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/command_updater.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/search.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/search/search_model.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/location_bar_view.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/models/simple_menu_model.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/theme_provider.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/window_open_disposition.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/metrics.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Contents of the Reload drop-down menu.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kReloadMenuItems[]  = {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_RELOAD_MENU_NORMAL_RELOAD_ITEM,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_RELOAD_MENU_HARD_RELOAD_ITEM,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDS_RELOAD_MENU_EMPTY_AND_HARD_RELOAD_ITEM,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace
337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// ReloadButton ---------------------------------------------------------------
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// static
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst char ReloadButton::kViewClassName[] = "ReloadButton";
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ReloadButton::ReloadButton(LocationBarView* location_bar,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           CommandUpdater* command_updater)
42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    : ToolbarButton(this, CreateMenuModel()),
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      location_bar_(location_bar),
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      command_updater_(command_updater),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      intended_mode_(MODE_RELOAD),
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      visible_mode_(MODE_RELOAD),
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      double_click_timer_delay_(
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::TimeDelta::FromMilliseconds(views::GetDoubleClickInterval())),
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      stop_to_reload_timer_delay_(base::TimeDelta::FromMilliseconds(1350)),
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      menu_enabled_(false),
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testing_mouse_hovered_(false),
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testing_reload_count_(0) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ReloadButton::~ReloadButton() {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReloadButton::ChangeMode(Mode mode, bool force) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  intended_mode_ = mode;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the change is forced, or the user isn't hovering the icon, or it's safe
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to change it to the other image type, make the change immediately;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // otherwise we'll let it happen later.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (force || (!IsMouseHovered() && !testing_mouse_hovered_) ||
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ((mode == MODE_STOP) ?
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !double_click_timer_.IsRunning() : (visible_mode_ != MODE_STOP))) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double_click_timer_.Stop();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    stop_to_reload_timer_.Stop();
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (mode != visible_mode_)
70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      ChangeModeInternal(mode);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetEnabled(true);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We want to disable the button if we're preventing a change from stop to
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reload due to hovering, but not if we're preventing a change from reload to
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // stop due to the double-click timer running.  (Disabled reload state is only
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // applicable when instant extended API is enabled and mode is NTP, which is
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // handled just above.)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (visible_mode_ != MODE_RELOAD) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetEnabled(false);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Go ahead and change to reload after a bit, which allows repeated reloads
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // without moving the mouse.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!stop_to_reload_timer_.IsRunning()) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      stop_to_reload_timer_.Start(FROM_HERE, stop_to_reload_timer_delay_, this,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  &ReloadButton::OnStopToReloadTimer);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ReloadButton::LoadImages() {
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ChangeModeInternal(visible_mode_);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SchedulePaint();
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PreferredSizeChanged();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ReloadButton::OnMouseExited(const ui::MouseEvent& event) {
98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ToolbarButton::OnMouseExited(event);
997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!IsMenuShowing())
1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ChangeMode(intended_mode_, true);
1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool ReloadButton::GetTooltipText(const gfx::Point& p,
104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                  base::string16* tooltip) const {
1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int reload_tooltip = menu_enabled_ ?
1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      IDS_TOOLTIP_RELOAD_WITH_MENU : IDS_TOOLTIP_RELOAD;
1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int text_id = (visible_mode_ == MODE_RELOAD) ?
1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      reload_tooltip : IDS_TOOLTIP_STOP;
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  tooltip->assign(l10n_util::GetStringUTF16(text_id));
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return true;
1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst char* ReloadButton::GetClassName() const {
1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return kViewClassName;
1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ReloadButton::GetAccessibleState(ui::AXViewState* state) {
1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (menu_enabled_)
119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ToolbarButton::GetAccessibleState(state);
1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  else
1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    CustomButton::GetAccessibleState(state);
1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool ReloadButton::ShouldShowMenu() {
1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return menu_enabled_ && (visible_mode_ == MODE_RELOAD);
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ReloadButton::ShowDropDownMenu(ui::MenuSourceType source_type) {
129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ToolbarButton::ShowDropDownMenu(source_type);  // Blocks.
1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ChangeMode(intended_mode_, true);
1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReloadButton::ButtonPressed(views::Button* /* button */,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const ui::Event& event) {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearPendingMenu();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (visible_mode_ == MODE_STOP) {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (command_updater_)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      command_updater_->ExecuteCommandWithDisposition(IDC_STOP, CURRENT_TAB);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The user has clicked, so we can feel free to update the button,
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // even if the mouse is still hovering.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChangeMode(MODE_RELOAD, true);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (!double_click_timer_.IsRunning()) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Shift-clicking or ctrl-clicking the reload button means we should ignore
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // any cached content.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int command;
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int flags = event.flags();
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (event.IsShiftDown() || event.IsControlDown()) {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      command = IDC_RELOAD_IGNORING_CACHE;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Mask off Shift and Control so they don't affect the disposition below.
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags &= ~(ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      command = IDC_RELOAD;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Start a timer - while this timer is running, the reload button cannot be
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // changed to a stop button.  We do not set |intended_mode_| to MODE_STOP
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // here as the browser will do that when it actually starts loading (which
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // may happen synchronously, thus the need to do this before telling the
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // browser to execute the reload command).
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double_click_timer_.Start(FROM_HERE, double_click_timer_delay_, this,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              &ReloadButton::OnDoubleClickTimer);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExecuteBrowserCommand(command, flags);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++testing_reload_count_;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ReloadButton::IsCommandIdChecked(int command_id) const {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ReloadButton::IsCommandIdEnabled(int command_id) const {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ReloadButton::IsCommandIdVisible(int command_id) const {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ReloadButton::GetAcceleratorForCommandId(int command_id,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::Accelerator* accelerator) {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (command_id) {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDS_RELOAD_MENU_NORMAL_RELOAD_ITEM:
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetWidget()->GetAccelerator(IDC_RELOAD, accelerator);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDS_RELOAD_MENU_HARD_RELOAD_ITEM:
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetWidget()->GetAccelerator(IDC_RELOAD_IGNORING_CACHE, accelerator);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetWidget()->GetAccelerator(command_id, accelerator);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReloadButton::ExecuteCommand(int command_id, int event_flags) {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int browser_command = 0;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (command_id) {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDS_RELOAD_MENU_NORMAL_RELOAD_ITEM:
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser_command = IDC_RELOAD;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDS_RELOAD_MENU_HARD_RELOAD_ITEM:
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser_command = IDC_RELOAD_IGNORING_CACHE;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDS_RELOAD_MENU_EMPTY_AND_HARD_RELOAD_ITEM:
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser_command = IDC_RELOAD_CLEARING_CACHE;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExecuteBrowserCommand(browser_command, event_flags);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::SimpleMenuModel* ReloadButton::CreateMenuModel() {
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::SimpleMenuModel* menu_model = new ui::SimpleMenuModel(this);
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kReloadMenuItems); ++i)
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    menu_model->AddItemWithStringId(kReloadMenuItems[i], kReloadMenuItems[i]);
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return menu_model;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReloadButton::ExecuteBrowserCommand(int command, int event_flags) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!command_updater_)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition =
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::DispositionFromEventFlags(event_flags);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((disposition == CURRENT_TAB) && location_bar_) {
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Forcibly reset the location bar, since otherwise it won't discard any
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ongoing user edits, since it doesn't realize this is a user-initiated
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // action.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    location_bar_->Revert();
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_updater_->ExecuteCommandWithDisposition(command, disposition);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReloadButton::ChangeModeInternal(Mode mode) {
236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ui::ThemeProvider* tp = GetThemeProvider();
237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // |tp| can be NULL in unit tests.
238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (tp) {
239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SetImage(views::Button::STATE_NORMAL, *(tp->GetImageSkiaNamed(
240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        (mode == MODE_RELOAD) ? IDR_RELOAD : IDR_STOP)));
241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SetImage(views::Button::STATE_DISABLED, *(tp->GetImageSkiaNamed(
242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        (mode == MODE_RELOAD) ? IDR_RELOAD_D : IDR_STOP_D)));
243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  visible_mode_ = mode;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SchedulePaint();
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReloadButton::OnDoubleClickTimer() {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!IsMenuShowing())
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChangeMode(intended_mode_, false);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReloadButton::OnStopToReloadTimer() {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!IsMenuShowing());
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChangeMode(intended_mode_, true);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
258