File: embedded_permission_prompt_base_view.h

package info (click to toggle)
chromium 138.0.7204.183-1~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm-proposed-updates
  • size: 6,080,960 kB
  • sloc: cpp: 34,937,079; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,954; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,811; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (134 lines) | stat: -rw-r--r-- 4,910 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
// Copyright 2023 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_PERMISSIONS_EMBEDDED_PERMISSION_PROMPT_BASE_VIEW_H_
#define CHROME_BROWSER_UI_VIEWS_PERMISSIONS_EMBEDDED_PERMISSION_PROMPT_BASE_VIEW_H_

#include <string>

#include "base/memory/raw_ptr.h"
#include "chrome/browser/ui/views/permissions/embedded_permission_prompt_view_delegate.h"
#include "chrome/browser/ui/views/permissions/permission_prompt_base_view.h"
#include "components/favicon_base/favicon_types.h"
#include "components/permissions/features.h"
#include "components/permissions/permission_prompt.h"
#include "ui/base/interaction/element_identifier.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "ui/base/ui_base_types.h"
#include "ui/gfx/vector_icon_types.h"
#include "ui/views/controls/styled_label.h"
#include "ui/views/layout/flex_layout_view.h"

class Browser;

// Base view used for embedded permission prompts dialogs.
// It looks like this:
//
// |-------------------------------------------------|
// |                                              [X]|
// | Title (optional)                                |
// |-------------------------------------------------|
// |Icon1(optional)|RequestMessage1                  |
// |Icon2(optional)|RequestMessage2                  |
// |...                                              |
// |-------------------------------------------------|
// |                 Button1                         |
// |                 Button2                         |
// |                 ...                             |
// |-------------------------------------------------|

// Subclasses need to implement at least:
// GetRequestLinesConfiguration - provides the info for the main body of the
// prompt.
// GetButtonsConfiguration - provides the info for the buttons section.
// RunButtonCallback - called when a button is pressed.
// GetWindowTitle/GetAccessibleWindowTitle - inherited from
// views::BubbleDialogDelegateView.

class EmbeddedPermissionPromptBaseView : public PermissionPromptBaseView {
  METADATA_HEADER(EmbeddedPermissionPromptBaseView, PermissionPromptBaseView)

 public:
  DECLARE_CLASS_ELEMENT_IDENTIFIER_VALUE(kMainViewId);
  DECLARE_CLASS_ELEMENT_IDENTIFIER_VALUE(kLabelViewId1);
  DECLARE_CLASS_ELEMENT_IDENTIFIER_VALUE(kLabelViewId2);
  DECLARE_CLASS_ELEMENT_IDENTIFIER_VALUE(kTitleViewId);

  EmbeddedPermissionPromptBaseView(
      Browser* browser,
      base::WeakPtr<EmbeddedPermissionPromptViewDelegate> delegate);
  EmbeddedPermissionPromptBaseView(const EmbeddedPermissionPromptBaseView&) =
      delete;
  EmbeddedPermissionPromptBaseView& operator=(
      const EmbeddedPermissionPromptBaseView&) = delete;
  ~EmbeddedPermissionPromptBaseView() override;

  void Show();
  void UpdateAnchor(views::Widget* widget);
  void ClosingPermission();
  virtual void PrepareToClose();
  permissions::feature_params::PermissionElementPromptPosition
  GetPromptPosition() const;

  // views::BubbleDialogDelegateView:
  bool ShouldShowCloseButton() const override;
  void Init() override;
  void AddedToWidget() override;

 protected:
  enum class ButtonType {
    kAllow = 0,
    kPolicyOK = 1,
    kContinueAllowing = 2,
    kStopAllowing = 3,
    kClose = 4,
    kAllowThisTime = 5,
    kContinueNotAllowing = 6,
    kSystemSettings = 7,
  };

  struct RequestLineConfiguration {
    const raw_ptr<const gfx::VectorIcon> icon;
    std::u16string message;
  };

  struct ButtonConfiguration {
    std::u16string label;
    ButtonType type;
    ui::ButtonStyle style;
    ui::ElementIdentifier identifier;
  };

  static int GetViewId(ButtonType button) { return static_cast<int>(button); }
  static ButtonType GetButtonType(int button_id) {
    return static_cast<ButtonType>(button_id);
  }

  // Configuration that needs to be implemented by subclasses
  virtual std::vector<RequestLineConfiguration> GetRequestLinesConfiguration()
      const = 0;
  virtual std::vector<ButtonConfiguration> GetButtonsConfiguration() const = 0;
  const virtual gfx::VectorIcon& GetIcon() const;
  virtual bool ShowLoadingIcon() const;

  base::WeakPtr<EmbeddedPermissionPromptViewDelegate>& delegate() {
    return delegate_;
  }
  const base::WeakPtr<EmbeddedPermissionPromptViewDelegate>& delegate() const {
    return delegate_;
  }

 private:
  void CreateWidget();
  void ShowWidget();
  void AddRequestLine(const RequestLineConfiguration& line, std::size_t index);
  void AddButton(views::View& buttons_container,
                 const ButtonConfiguration& button);
  std::unique_ptr<views::FlexLayoutView> CreateLoadingIcon();
  gfx::Rect GetBubbleBounds() override;
  gfx::Rect element_rect_;
  base::WeakPtr<EmbeddedPermissionPromptViewDelegate> delegate_;
};

#endif  // CHROME_BROWSER_UI_VIEWS_PERMISSIONS_EMBEDDED_PERMISSION_PROMPT_BASE_VIEW_H_