File: extensions_menu_item_view.h

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (151 lines) | stat: -rw-r--r-- 5,240 bytes parent folder | download | duplicates (5)
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_