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 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
// Copyright 2019 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_EXTENSIONS_EXTENSIONS_MENU_ITEM_VIEW_H_
#define CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSIONS_MENU_ITEM_VIEW_H_
#include <memory>
#include "base/functional/callback_forward.h"
#include "base/functional/callback_helpers.h"
#include "base/memory/raw_ptr.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "ui/views/controls/button/button.h"
#include "ui/views/controls/button/toggle_button.h"
#include "ui/views/layout/flex_layout_view.h"
class Browser;
class ExtensionContextMenuController;
class ExtensionsMenuButton;
class HoverButton;
class ToolbarActionViewController;
class ToolbarActionsModel;
namespace views {
class ToggleButton;
} // namespace views
DECLARE_ELEMENT_IDENTIFIER_VALUE(kExtensionMenuItemViewElementId);
// Single row inside the extensions menu for every installed extension. Includes
// information about the extension, a button to pin the extension to the toolbar
// and a button for accessing the associated context menu.
class ExtensionMenuItemView : public views::FlexLayoutView {
METADATA_HEADER(ExtensionMenuItemView, views::FlexLayoutView)
public:
enum class SiteAccessToggleState {
// Button is not visible.
kHidden,
// Button is visible and off.
kOff,
// Button is visible and on.
kOn,
};
enum class SitePermissionsButtonState {
// Button is not visible.
kHidden,
// Button is visible, but disabled.
kDisabled,
// Button is visible and enabled.
kEnabled,
};
// Extension site access displayed in the site permissions button.
enum class SitePermissionsButtonAccess {
// Extension has no site access.
kNone,
// Extension has site access when clicked.
kOnClick,
// Extension has site access to this site.
kOnSite,
// Extension has site access to all sites.
kOnAllSites
};
ExtensionMenuItemView(Browser* browser,
std::unique_ptr<ToolbarActionViewController> controller,
bool allow_pinning);
// Constructor for the kExtensionsMenuAccessControl feature.
ExtensionMenuItemView(
Browser* browser,
bool is_enterprise,
std::unique_ptr<ToolbarActionViewController> controller,
base::RepeatingCallback<void(bool)> site_access_toggle_callback,
views::Button::PressedCallback site_permissions_button_callback);
ExtensionMenuItemView(const ExtensionMenuItemView&) = delete;
ExtensionMenuItemView& operator=(const ExtensionMenuItemView&) = delete;
~ExtensionMenuItemView() override;
// Updates the controller and child views to be on sync with the parent views.
void Update(SiteAccessToggleState site_access_toggle_state,
SitePermissionsButtonState site_permissions_button_state,
SitePermissionsButtonAccess site_permissions_button_access,
bool is_enterprise);
// Updates the pin button.
void UpdatePinButton(bool is_force_pinned, bool is_pinned);
// Updates the context menu button given `is_action_pinned`.
void UpdateContextMenuButton(bool is_action_pinned);
ToolbarActionViewController* view_controller() { return controller_.get(); }
const ToolbarActionViewController* view_controller() const {
return controller_.get();
}
bool IsContextMenuRunningForTesting() const;
ExtensionsMenuButton* primary_action_button_for_testing();
views::ToggleButton* site_access_toggle_for_testing();
HoverButton* context_menu_button_for_testing();
HoverButton* pin_button_for_testing();
HoverButton* site_permissions_button_for_testing();
private:
// Sets ups the context menu button controllers. Must be called by the
// constructor.
void SetupContextMenuButton();
// Handles the context menu button press. This is passed as a callback to
// `context_menu_button_`.
void OnContextMenuPressed();
// Handles the pin button press. This is passed as a callback to
// `pin_button_`.
void OnPinButtonPressed();
const raw_ptr<Browser> browser_;
// Controller responsible for an action that is shown in the toolbar.
std::unique_ptr<ToolbarActionViewController> controller_;
// Model for the browser actions toolbar that provides information such as the
// action pin status or visibility.
const raw_ptr<ToolbarActionsModel> model_;
raw_ptr<ExtensionsMenuButton> primary_action_button_;
raw_ptr<views::ToggleButton> site_access_toggle_ = nullptr;
// Button that displays the extension site access and opens its site
// permissions page.
raw_ptr<HoverButton> site_permissions_button_ = nullptr;
raw_ptr<HoverButton> pin_button_ = nullptr;
raw_ptr<HoverButton> context_menu_button_ = nullptr;
// Controller responsible for showing the context menu for an extension.
std::unique_ptr<ExtensionContextMenuController> context_menu_controller_;
};
BEGIN_VIEW_BUILDER(/* no export */,
ExtensionMenuItemView,
views::FlexLayoutView)
END_VIEW_BUILDER
DEFINE_VIEW_BUILDER(/* no export */, ExtensionMenuItemView)
#endif // CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSIONS_MENU_ITEM_VIEW_H_
|