File: permission_dialog_delegate.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 (140 lines) | stat: -rw-r--r-- 5,405 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
// 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_DIALOG_DELEGATE_H_
#define COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_PERMISSION_DIALOG_DELEGATE_H_

#include "base/android/scoped_java_ref.h"
#include "base/memory/raw_ptr.h"
#include "base/task/cancelable_task_tracker.h"
#include "components/content_settings/core/common/content_settings.h"
#include "components/favicon_base/favicon_callback.h"
#include "content/public/browser/web_contents_observer.h"

using base::android::JavaParamRef;

namespace content {
class WebContents;
class Page;
}  // namespace content

namespace permissions {

class PermissionDialogDelegate;
class PermissionPromptAndroid;

class PermissionDialogJavaDelegate {
 public:
  explicit PermissionDialogJavaDelegate(
      PermissionPromptAndroid* permission_prompt);
  virtual ~PermissionDialogJavaDelegate();

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

  virtual void CreateJavaDelegate(content::WebContents* web_contents,
                                  PermissionDialogDelegate* owner);
  virtual void CreateDialog(content::WebContents* web_contents);
  void GetAndUpdateRequestingOriginFavicon(content::WebContents* web_contents);
  void OnRequestingOriginFaviconLoaded(
      const favicon_base::FaviconRawBitmapResult& favicon_result);

  virtual void DismissDialog();

  virtual void UpdateDialog();

  virtual void NotifyPermissionAllowed();

 private:
  base::android::ScopedJavaGlobalRef<jobject> j_delegate_;
  raw_ptr<PermissionPromptAndroid, DanglingUntriaged> permission_prompt_;

  // The task tracker for loading favicons.
  base::CancelableTaskTracker favicon_tracker_;
};

// Delegate class for displaying a permission prompt as a modal dialog. Used as
// the native to Java interface to allow Java to communicate the user's
// decision.
class PermissionDialogDelegate : public content::WebContentsObserver {
 public:
  PermissionDialogDelegate(
      content::WebContents* web_contents,
      PermissionPromptAndroid* permission_prompt,
      std::unique_ptr<PermissionDialogJavaDelegate> java_delegate);
  ~PermissionDialogDelegate() override;

  // The interface for creating a modal dialog when the PermissionRequestManager
  // is enabled.
  static std::unique_ptr<PermissionDialogDelegate> Create(
      content::WebContents* web_contents,
      PermissionPromptAndroid* permission_prompt);

  static std::unique_ptr<PermissionDialogDelegate> CreateForTesting(
      content::WebContents* web_contents,
      PermissionPromptAndroid* permission_prompt,
      std::unique_ptr<PermissionDialogJavaDelegate> java_delegate);

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

  // JNI methods.
  void Accept(JNIEnv* env, const JavaParamRef<jobject>& obj);
  void AcceptThisTime(JNIEnv* env, const JavaParamRef<jobject>& obj);
  void Acknowledge(JNIEnv* env, const JavaParamRef<jobject>& obj);
  void Deny(JNIEnv* env, const JavaParamRef<jobject>& obj);
  void Dismissed(JNIEnv* env,
                 const JavaParamRef<jobject>& obj,
                 int dismissalType);
  void Resumed(JNIEnv* env, const JavaParamRef<jobject>& obj);
  void SystemSettingsShown(JNIEnv* env, const JavaParamRef<jobject>& obj);
  void SystemPermissionResolved(JNIEnv* env,
                                const JavaParamRef<jobject>& obj,
                                bool accepted);

  // Reset the java JNI object object. Called from Java once the permission
  // dialog has been responded to.
  void Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj);
  bool IsJavaDelegateDestroyed() const { return !java_delegate_; }

  // Notify Java side to update content view of the dialog associated with this
  // object.
  void UpdateDialog();

  // Notify Java side that the permission has been allowed. It's basically the
  // end if a permission flow and Java side can perform next task, such as
  // update permission icon or showing next dialog.
  void NotifyPermissionAllowed();

 private:
  // On navigation or page destruction, hide the dialog.
  void DismissDialog();

  void DestroyJavaDelegate() { java_delegate_.reset(); }

  // WebContentsObserver:
  void PrimaryPageChanged(content::Page&) override;
  void WebContentsDestroyed() override;

  base::android::ScopedJavaLocalRef<jstring> GetPositiveButtonText(
      JNIEnv* env,
      bool is_one_time) const;
  base::android::ScopedJavaLocalRef<jstring> GetNegativeButtonText(
      JNIEnv* env,
      bool is_one_time) const;
  base::android::ScopedJavaLocalRef<jstring> GetPositiveEphemeralButtonText(
      JNIEnv* env,
      bool is_one_time) const;
  // `permission_prompt_` owns and outlives this object, this is safe to use.
  raw_ptr<PermissionPromptAndroid> permission_prompt_;

  // The PermissionDialogJavaDelegate abstracts away JNI connectivity from
  // native to Java in order to facilicate unit testing.
  std::unique_ptr<PermissionDialogJavaDelegate> java_delegate_;
};

}  // namespace permissions

#endif  // COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_PERMISSION_DIALOG_DELEGATE_H_