1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_VIEWS_TOOLBAR_RELOAD_BUTTON_H_
#define CHROME_BROWSER_UI_VIEWS_TOOLBAR_RELOAD_BUTTON_H_
#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "chrome/browser/ui/views/chrome_views_export.h"
#include "chrome/browser/ui/views/toolbar/toolbar_button.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "ui/base/mojom/menu_source_type.mojom-forward.h"
#include "ui/menus/simple_menu_model.h"
#include "ui/views/metadata/view_factory.h"
class CommandUpdater;
////////////////////////////////////////////////////////////////////////////////
//
// ReloadButton
//
// The reload button in the toolbar, which changes to a stop button when a page
// load is in progress. The change from stop back to reload may be delayed if
// the user is hovering the button, to prevent mis-clicks.
//
////////////////////////////////////////////////////////////////////////////////
class ReloadButton : public ToolbarButton,
public ui::SimpleMenuModel::Delegate {
METADATA_HEADER(ReloadButton, ToolbarButton)
public:
enum class Mode { kReload = 0, kStop };
explicit ReloadButton(CommandUpdater* command_updater);
ReloadButton(const ReloadButton&) = delete;
ReloadButton& operator=(const ReloadButton&) = delete;
~ReloadButton() override;
// Ask for a specified button state. If |force| is true this will be applied
// immediately.
void ChangeMode(Mode mode, bool force);
Mode visible_mode() const { return visible_mode_; }
void SetVectorIconsForMode(Mode mode,
const gfx::VectorIcon& icon,
const gfx::VectorIcon& touch_icon);
// Gets/Sets whether reload drop-down menu is enabled.
bool GetMenuEnabled() const;
void SetMenuEnabled(bool enable);
// ToolbarButton:
void OnMouseExited(const ui::MouseEvent& event) override;
bool ShouldShowMenu() override;
void ShowDropDownMenu(ui::mojom::MenuSourceType source_type) override;
void UpdateCachedTooltipText();
// ui::SimpleMenuModel::Delegate:
bool IsCommandIdChecked(int command_id) const override;
bool IsCommandIdEnabled(int command_id) const override;
bool IsCommandIdVisible(int command_id) const override;
bool GetAcceleratorForCommandId(int command_id,
ui::Accelerator* accelerator) const override;
void ExecuteCommand(int command_id, int event_flags) override;
private:
friend class ReloadButtonTest;
FRIEND_TEST_ALL_PREFIXES(ReloadButtonTest, TooltipText);
FRIEND_TEST_ALL_PREFIXES(ReloadButtonTest, TooltipTextAccessibility);
std::unique_ptr<ui::SimpleMenuModel> CreateMenuModel();
void SetVisibleMode(Mode mode);
void ButtonPressed(const ui::Event& event);
void ExecuteBrowserCommand(int command, int event_flags);
void OnDoubleClickTimer();
void OnStopToReloadTimer();
void UpdateAccessibleHasPopup();
base::OneShotTimer double_click_timer_;
// Timer to delay switching between reload and stop states.
base::OneShotTimer mode_switch_timer_;
// This may be NULL when testing.
raw_ptr<CommandUpdater, DanglingUntriaged> command_updater_;
// Vector icons to use for both modes.
base::raw_ref<const gfx::VectorIcon> reload_icon_;
base::raw_ref<const gfx::VectorIcon> reload_touch_icon_;
base::raw_ref<const gfx::VectorIcon> stop_icon_;
base::raw_ref<const gfx::VectorIcon> stop_touch_icon_;
// The mode we should be in assuming no timers are running.
Mode intended_mode_ = Mode::kReload;
// The currently-visible mode - this may differ from the intended mode.
Mode visible_mode_ = Mode::kReload;
// The delay times for the timers. These are members so that tests can modify
// them.
base::TimeDelta double_click_timer_delay_;
base::TimeDelta mode_switch_timer_delay_;
// Indicates if reload menu is enabled.
bool menu_enabled_ = false;
// TESTING ONLY
// True if we should pretend the button is hovered.
bool testing_mouse_hovered_ = false;
// Increments when we would tell the browser to "reload", so
// test code can tell whether we did so (as there may be no |browser_|).
int testing_reload_count_ = 0;
};
BEGIN_VIEW_BUILDER(CHROME_VIEWS_EXPORT, ReloadButton, ToolbarButton)
VIEW_BUILDER_PROPERTY(bool, MenuEnabled)
END_VIEW_BUILDER
DEFINE_VIEW_BUILDER(CHROME_VIEWS_EXPORT, ReloadButton)
#endif // CHROME_BROWSER_UI_VIEWS_TOOLBAR_RELOAD_BUTTON_H_
|