File: permission_prompt_android.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 (134 lines) | stat: -rw-r--r-- 5,416 bytes parent folder | download | duplicates (3)
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 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_PERMISSION_PROMPT_ANDROID_H_
#define COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_PERMISSION_PROMPT_ANDROID_H_

#include <memory>
#include <vector>

#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "components/content_settings/core/common/content_settings_types.h"
#include "components/permissions/android/permission_prompt/permission_dialog_delegate.h"
#include "components/permissions/embedded_permission_prompt_flow_model.h"
#include "components/permissions/permission_prompt.h"
#include "components/permissions/permission_uma_util.h"
#include "components/permissions/permissions_client.h"
#include "ui/gfx/geometry/rect.h"

namespace content {
class WebContents;
}

namespace permissions {

// Virtual class that is the base class for all Android permission prompts.
class PermissionPromptAndroid : public PermissionPrompt {
 public:
  PermissionPromptAndroid(content::WebContents* web_contents,
                          Delegate* delegate);

  PermissionPromptAndroid(const PermissionPromptAndroid&) = delete;
  PermissionPromptAndroid& operator=(const PermissionPromptAndroid&) = delete;

  // Expect to be destroyed (and the UI needs to go) when:
  // 1. A navigation happens, tab/webcontents is being closed; with the current
  //    GetTabSwitchingBehavior() implementation, this instance survives the tab
  //    being backgrounded.
  // 2. The permission request is resolved (accept, deny, dismiss).
  // 3. A higher priority request comes in.
  ~PermissionPromptAndroid() override;

  // PermissionPrompt:
  bool UpdateAnchor() override;
  TabSwitchingBehavior GetTabSwitchingBehavior() override;
  std::optional<gfx::Rect> GetViewBoundsInScreen() const override;
  bool ShouldFinalizeRequestAfterDecided() const override;
  std::vector<permissions::ElementAnchoredBubbleVariant> GetPromptVariants()
      const override;
  bool IsAskPrompt() const override;
  std::optional<permissions::feature_params::PermissionElementPromptPosition>
  GetPromptPosition() const override;

  virtual EmbeddedPermissionPromptFlowModel::Variant GetEmbeddedPromptVariant()
      const;
  virtual void Closing();
  virtual void Accept();
  virtual void AcceptThisTime();
  virtual void Acknowledge() {}
  virtual void Deny();
  virtual void Resumed() {}
  virtual void SystemSettingsShown() {}
  virtual void SystemPermissionResolved(bool accepted) {}
  void SetManageClicked();
  void SetLearnMoreClicked();
  virtual bool ShouldCurrentRequestUseQuietUI();
  virtual std::optional<PermissionUiSelector::QuietUiReason>
  ReasonForUsingQuietUi() const;
  virtual base::android::ScopedJavaLocalRef<jstring> GetPositiveButtonText(
      JNIEnv* env,
      bool is_one_time) const;
  virtual base::android::ScopedJavaLocalRef<jstring> GetNegativeButtonText(
      JNIEnv* env,
      bool is_one_time) const;
  virtual base::android::ScopedJavaLocalRef<jstring>
  GetPositiveEphemeralButtonText(JNIEnv* env, bool is_one_time) const;
  virtual base::android::ScopedJavaLocalRef<jobjectArray> GetRadioButtonTexts(
      JNIEnv* env,
      bool is_one_time) const;

  // We show one permission at a time except for grouped mic+camera, for which
  // we still have a single icon and message text.
  size_t PermissionCount() const;
  ContentSettingsType GetContentSettingType(size_t position) const;
  virtual int GetIconId() const;
  virtual PermissionRequest::AnnotatedMessageText GetAnnotatedMessageText()
      const;
  virtual bool ShouldUseRequestingOriginFavicon() const;
  virtual const std::vector<base::WeakPtr<permissions::PermissionRequest>>&
  Requests() const;
  GURL GetRequestingOrigin() const;
  content::WebContents* web_contents() const { return web_contents_; }
  PermissionDialogDelegate* permission_dialog_delegate() const {
    return permission_dialog_delegate_.get();
  }
  void ClearPermissionDialogDelegate() { permission_dialog_delegate_.reset(); }

  base::android::ScopedJavaLocalRef<jintArray> GetContentSettingTypes(
      JNIEnv* env) const;
  base::android::ScopedJavaLocalRef<jintArray> GetBoldRanges(JNIEnv* env) const;

  bool IsShowing() const { return this == delegate()->GetCurrentPrompt(); }

 protected:
  Delegate* delegate() const { return delegate_; }

  void CreatePermissionDialogDelegate() {
    permission_dialog_delegate_ =
        PermissionDialogDelegate::Create(web_contents_, this);
  }

  // Check if grouped permission requests can only be Mic+Camera, Camera+Mic.
  void CheckValidRequestGroup(
      const std::vector<base::WeakPtr<PermissionRequest>>& requests) const;

 private:
  // PermissionPromptAndroid is owned by PermissionRequestManager, so it should
  // be safe to hold a raw WebContents pointer here because this class is
  // destroyed before the WebContents.
  const raw_ptr<content::WebContents> web_contents_;

  // |delegate_| is the PermissionRequestManager, which owns this object.
  const raw_ptr<Delegate> delegate_;

  std::vector<base::WeakPtr<PermissionRequest>> requests_;

  // Owns a `PermissionDialogDelegate` object.
  std::unique_ptr<PermissionDialogDelegate> permission_dialog_delegate_;
};

}  // namespace permissions

#endif  // COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_PERMISSION_PROMPT_ANDROID_H_