File: extensions_menu_main_page_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 (177 lines) | stat: -rw-r--r-- 6,815 bytes parent folder | download | duplicates (6)
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
// Copyright 2022 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_MAIN_PAGE_VIEW_H_
#define CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSIONS_MENU_MAIN_PAGE_VIEW_H_

#include <string_view>

#include "base/memory/raw_ptr.h"
#include "build/branding_buildflags.h"
#include "chrome/browser/ui/toolbar/toolbar_actions_model.h"
#include "chrome/browser/ui/views/extensions/extensions_menu_item_view.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "ui/views/layout/flex_layout_view.h"
#include "ui/views/view.h"

namespace content {
class WebContents;
}

namespace ui {
class ImageModel;
}  // namespace ui

namespace views {
class Label;
class ToggleButton;
}  // namespace views

class Browser;
class ExtensionsMenuHandler;
class ToolbarActionsModel;
class ExtensionMenuItemView;
class ExtensionActionViewController;

// The main view of the extensions menu.
class ExtensionsMenuMainPageView : public views::View {
  METADATA_HEADER(ExtensionsMenuMainPageView, views::View)

 public:
  explicit ExtensionsMenuMainPageView(Browser* browser,
                                      ExtensionsMenuHandler* menu_handler);
  ~ExtensionsMenuMainPageView() override;
  ExtensionsMenuMainPageView(const ExtensionsMenuMainPageView&) = delete;
  const ExtensionsMenuMainPageView& operator=(
      const ExtensionsMenuMainPageView&) = delete;

  // Creates and adds a menu item for `action_controller` at `index` for a
  // newly-added extension.
  void CreateAndInsertMenuItem(
      std::unique_ptr<ExtensionActionViewController> action_controller,
      extensions::ExtensionId extension_id,
      bool is_enterprise,
      ExtensionMenuItemView::SiteAccessToggleState site_access_toggle_state,
      ExtensionMenuItemView::SitePermissionsButtonState
          site_permissions_button_state,
      ExtensionMenuItemView::SitePermissionsButtonAccess
          site_permissions_button_access,
      int index);

  // Removes the menu item corresponding to `action_id`.
  void RemoveMenuItem(const ToolbarActionsModel::ActionId& action_id);

  // Returns the menu items.
  std::vector<ExtensionMenuItemView*> GetMenuItems() const;

  // Updates the site settings views with the given parameters.
  void UpdateSiteSettings(const std::u16string& current_site,
                          int label_id,
                          bool is_tooltip_visible,
                          bool is_toggle_visible,
                          bool is_toggle_on);

  // Shows the reload section in the menu. Takes precedence over the requests
  // section.
  void ShowReloadSection();

  // Show the requests section in the menu if there are any items in
  // `requests_entries_` and reload section is not visible.
  void MaybeShowRequestsSection();

  // Adds or updates the extension entry in the `requests_access_section_` with
  // the given information. Doesn't update the requests section view
  // visibility.
  void AddOrUpdateExtensionRequestingAccess(const extensions::ExtensionId& id,
                                            const std::u16string& name,
                                            const ui::ImageModel& icon,
                                            int index);

  // Remove the entry in the `requests_access_section_` corresponding to `id`,
  // if existent. Doesn't update the requests section view visibility.
  void RemoveExtensionRequestingAccess(const extensions::ExtensionId& id);

  // Clears the entries in the `request_access_section_`, if existent. Doesn't
  // update the requests section view visibility.
  void ClearExtensionsRequestingAccess();

  // Accessors used by tests:
  // Returns the currently-showing menu items.
  std::u16string_view GetSiteSettingLabelForTesting() const;
  const views::View* site_settings_tooltip() const;
  views::ToggleButton* GetSiteSettingsToggleForTesting() {
    return site_settings_toggle_;
  }
  const views::View* reload_section() const;
  const views::View* requests_section() const;
  std::vector<extensions::ExtensionId>
  GetExtensionsRequestingAccessForTesting();
  views::View* GetExtensionRequestingAccessEntryForTesting(
      const extensions::ExtensionId& extension_id);

 private:
  content::WebContents* GetActiveWebContents() const;

  // Returns the request entry for `extension_id` if existent.
  views::View* GetExtensionRequestEntry(
      const extensions::ExtensionId& extension_id) const;

  // Returns the header builder, which contains information about the site.
  [[nodiscard]] views::Builder<views::FlexLayoutView> CreateHeaderBuilder(
      gfx::Insets margins,
      views::FlexSpecification stretch_specification);

  // Returns the site settings section builder, which contains information and
  // access controls for the site.
  [[nodiscard]] views::Builder<views::FlexLayoutView> CreateSiteSettingsBuilder(
      gfx::Insets margins,
      views::FlexSpecification);

  // Returns the contents builder, which contains the reload section, the access
  // requests section and the menu items section on a scrollable view.
  [[nodiscard]] views::Builder<views::ScrollView> CreateContentsBuilder(
      gfx::Insets scroll_margins,
      gfx::Insets contents_margins,
      gfx::Insets reload_button_margins,
      gfx::Insets menu_items_margins);

#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
  // Returns the webstore button builder.
  [[nodiscard]] views::Builder<HoverButton> CreateWebstoreButtonBuilder();
#endif

  // Returns the manage extensions button builder.
  [[nodiscard]] views::Builder<HoverButton> CreateManageButtonBuilder();

  const raw_ptr<Browser> browser_;
  const raw_ptr<ExtensionsMenuHandler> menu_handler_;

  // Site settings section.
  raw_ptr<views::Label> site_settings_label_;
  raw_ptr<views::View> site_settings_tooltip_;
  raw_ptr<views::ToggleButton> site_settings_toggle_;

  // Reload section.
  raw_ptr<views::View> reload_section_;

  // Site access requests section.
  raw_ptr<views::View> requests_section_;
  // View that holds the requests entries in `requests_section_`.
  raw_ptr<views::View> requests_entries_view_;
  // A collection of all the requests entries in `requests_section_`. This is
  // separated for easy insertion and removal of requests entries.
  std::map<extensions::ExtensionId, raw_ptr<views::View, CtnExperimental>>
      requests_entries_;

  // Menu items section. The children are guaranteed to only be
  // ExtensionMenuItemViews.
  raw_ptr<views::View> menu_items_ = nullptr;
};

BEGIN_VIEW_BUILDER(/* no export */, ExtensionsMenuMainPageView, views::View)
END_VIEW_BUILDER

DEFINE_VIEW_BUILDER(/* no export */, ExtensionsMenuMainPageView)

#endif  // CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSIONS_MENU_MAIN_PAGE_VIEW_H_