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