File: extensions_menu_main_page_view.h

package info (click to toggle)
chromium 120.0.6099.224-1~deb11u1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 6,112,112 kB
  • sloc: cpp: 32,907,025; ansic: 8,148,123; javascript: 3,679,536; python: 2,031,248; asm: 959,718; java: 804,675; xml: 617,256; sh: 111,417; objc: 100,835; perl: 88,443; cs: 53,032; makefile: 29,579; fortran: 24,137; php: 21,162; tcl: 21,147; sql: 20,809; ruby: 17,735; pascal: 12,864; yacc: 8,045; lisp: 3,388; lex: 1,323; ada: 727; awk: 329; jsp: 267; csh: 117; exp: 43; sed: 37
file content (143 lines) | stat: -rw-r--r-- 5,373 bytes parent folder | download
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
// 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 "base/memory/raw_ptr_exclusion.h"
#include "chrome/browser/ui/toolbar/toolbar_actions_model.h"
#include "chrome/browser/ui/views/extensions/extensions_menu_item_view.h"
#include "ui/views/view.h"

#include "ui/base/metadata/metadata_header_macros.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;
class MessageSection;

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

  enum class MessageSectionState {
    // Site is restricted to all extensions.
    kRestrictedAccess,
    // User can customize each extension's access to the site.
    kUserCustomizedAccess,
    // User can customize each extension's access to the site, but a page
    // reload is required to reflect changes.
    kUserCustomizedAccessReload,
    // User blocked all extensions access to the site.
    kUserBlockedAccess,
    // User blocked all extensions access to the site, but a page
    // reload is required to reflect changes.
    kUserBlockedAccessReload,
  };

  explicit ExtensionsMenuMainPageView(Browser* browser,
                                      ExtensionsMenuHandler* menu_handler);
  ~ExtensionsMenuMainPageView() override = default;
  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 subheader with the given parameters. Does not update the menu
  // items (menu item updates are handled directly in such view).
  void UpdateSubheader(const std::u16string& current_site,
                       bool is_site_settings_toggle_visible,
                       bool is_site_settings_toggle_on);

  // Updates the message section given `state` and `has_enterprise_extensions`.
  void UpdateMessageSection(MessageSectionState state,
                            bool has_enterprise_extensions);

  // Adds or updates the extension entry in the `requests_access_section_` with
  // the given information.
  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.
  void RemoveExtensionRequestingAccess(const extensions::ExtensionId& id);

  // Accessors used by tests:
  // Returns the currently-showing menu items.
  const std::u16string& GetSubheaderSubtitleTextForTesting() const;
  views::ToggleButton* GetSiteSettingsToggleForTesting() {
    return site_settings_toggle_;
  }
  views::View* GetTextContainerForTesting();
  views::View* GetReloadContainerForTesting();
  views::View* GetRequestsAccessContainerForTesting();
  std::vector<extensions::ExtensionId>
  GetExtensionsRequestingAccessForTesting();
  views::View* GetExtensionRequestingAccessEntryForTesting(
      const extensions::ExtensionId& extension_id);

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

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

  // Subheader section.
  raw_ptr<views::Label> subheader_subtitle_;
  raw_ptr<views::ToggleButton> site_settings_toggle_;

  // Message section.
  raw_ptr<MessageSection> message_section_;

  // Menu items section.
  // The view containing the menu items. This is separated for easy insertion
  // and iteration of menu items. The children are guaranteed to only be
  // ExtensionMenuItemViews.
  // This field is not a raw_ptr<> because it was filtered by the rewriter for:
  // #addr-of
  RAW_PTR_EXCLUSION 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_