1 // Copyright 2015 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "components/permissions/permission_request.h"
9 #include "base/no_destructor.h"
10 #include "base/notreached.h"
11 #include "build/build_config.h"
12 #include "components/permissions/features.h"
13 #include "components/permissions/permission_util.h"
14 #include "components/permissions/request_type.h"
15 #include "components/strings/grit/components_strings.h"
16 #include "components/url_formatter/elide_url.h"
17 #include "ui/base/l10n/l10n_util.h"
19 namespace permissions {
21 PermissionRequest::PermissionRequest(
22 const GURL& requesting_origin,
23 RequestType request_type,
25 PermissionDecidedCallback permission_decided_callback,
26 base::OnceClosure delete_callback)
28 PermissionRequestData(request_type, has_gesture, requesting_origin)),
29 permission_decided_callback_(std::move(permission_decided_callback)),
30 delete_callback_(std::move(delete_callback)) {}
32 PermissionRequest::PermissionRequest(
33 PermissionRequestData request_data,
34 PermissionDecidedCallback permission_decided_callback,
35 base::OnceClosure delete_callback)
36 : data_(std::move(request_data)),
37 permission_decided_callback_(std::move(permission_decided_callback)),
38 delete_callback_(std::move(delete_callback)) {}
40 PermissionRequest::~PermissionRequest() {
41 DCHECK(delete_callback_.is_null());
44 RequestType PermissionRequest::request_type() const {
45 CHECK(data_.request_type);
46 return data_.request_type.value();
49 bool PermissionRequest::IsDuplicateOf(PermissionRequest* other_request) const {
50 return request_type() == other_request->request_type() &&
51 requesting_origin() == other_request->requesting_origin();
54 base::WeakPtr<PermissionRequest> PermissionRequest::GetWeakPtr() {
55 return weak_factory_.GetWeakPtr();
58 #if BUILDFLAG(IS_ANDROID)
59 std::u16string PermissionRequest::GetDialogMessageText() const {
61 switch (request_type()) {
62 case RequestType::kAccessibilityEvents:
63 message_id = IDS_ACCESSIBILITY_EVENTS_INFOBAR_TEXT;
65 case RequestType::kArSession:
66 message_id = IDS_AR_INFOBAR_TEXT;
68 case RequestType::kCameraStream:
69 message_id = IDS_MEDIA_CAPTURE_VIDEO_ONLY_INFOBAR_TEXT;
71 case RequestType::kClipboard:
72 message_id = IDS_CLIPBOARD_INFOBAR_TEXT;
74 case RequestType::kDiskQuota:
75 // Handled by an override in `QuotaPermissionRequest`.
78 case RequestType::kGeolocation:
79 message_id = IDS_GEOLOCATION_INFOBAR_TEXT;
81 case RequestType::kIdleDetection:
82 message_id = IDS_IDLE_DETECTION_INFOBAR_TEXT;
84 case RequestType::kMicStream:
85 message_id = IDS_MEDIA_CAPTURE_AUDIO_ONLY_INFOBAR_TEXT;
87 case RequestType::kMidi:
88 message_id = IDS_MIDI_INFOBAR_TEXT;
90 case RequestType::kMidiSysex:
91 message_id = IDS_MIDI_SYSEX_INFOBAR_TEXT;
93 case RequestType::kMultipleDownloads:
94 message_id = IDS_MULTI_DOWNLOAD_WARNING;
96 case RequestType::kNfcDevice:
97 message_id = IDS_NFC_INFOBAR_TEXT;
99 case RequestType::kNotifications:
100 message_id = IDS_NOTIFICATIONS_INFOBAR_TEXT;
102 case RequestType::kProtectedMediaIdentifier:
104 IDS_PROTECTED_MEDIA_IDENTIFIER_PER_ORIGIN_PROVISIONING_INFOBAR_TEXT;
106 case RequestType::kStorageAccess:
107 case RequestType::kTopLevelStorageAccess:
108 // Handled by `PermissionPromptAndroid::GetMessageText` directly.
111 case RequestType::kVrSession:
112 message_id = IDS_VR_INFOBAR_TEXT;
115 DCHECK_NE(0, message_id);
116 return l10n_util::GetStringFUTF16(
117 message_id, url_formatter::FormatUrlForSecurityDisplay(
119 url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC));
123 bool PermissionRequest::IsEmbeddedPermissionElementInitiated() const {
124 return data_.embedded_permission_element_initiated;
127 #if !BUILDFLAG(IS_ANDROID)
129 bool PermissionRequest::IsConfirmationChipSupported() {
130 return permissions::IsConfirmationChipSupported(request_type());
133 IconId PermissionRequest::GetIconForChip() {
134 return permissions::GetIconId(request_type());
137 IconId PermissionRequest::GetBlockedIconForChip() {
138 return permissions::GetBlockedIconId(request_type());
141 absl::optional<std::u16string> PermissionRequest::GetRequestChipText(
142 ChipTextType type) const {
143 static base::NoDestructor<std::map<RequestType, std::vector<int>>> kMessageIds(
144 {{RequestType::kArSession,
145 {IDS_AR_PERMISSION_CHIP, -1, -1, -1, -1, -1, -1, -1}},
146 {RequestType::kCameraStream,
147 {IDS_MEDIA_CAPTURE_VIDEO_ONLY_PERMISSION_CHIP, -1,
148 IDS_PERMISSIONS_PERMISSION_ALLOWED_CONFIRMATION,
149 IDS_PERMISSIONS_PERMISSION_ALLOWED_ONCE_CONFIRMATION,
150 IDS_PERMISSIONS_PERMISSION_NOT_ALLOWED_CONFIRMATION,
151 IDS_PERMISSIONS_CAMERA_ALLOWED_CONFIRMATION_SCREENREADER_ANNOUNCEMENT,
152 IDS_PERMISSIONS_CAMERA_ALLOWED_ONCE_CONFIRMATION_SCREENREADER_ANNOUNCEMENT,
153 IDS_PERMISSIONS_CAMERA_NOT_ALLOWED_CONFIRMATION_SCREENREADER_ANNOUNCEMENT}},
154 {RequestType::kClipboard,
155 {IDS_CLIPBOARD_PERMISSION_CHIP, -1, -1, -1, -1, -1, -1, -1}},
156 {RequestType::kGeolocation,
157 {IDS_GEOLOCATION_PERMISSION_CHIP,
158 IDS_GEOLOCATION_PERMISSION_BLOCKED_CHIP,
159 IDS_PERMISSIONS_PERMISSION_ALLOWED_CONFIRMATION,
160 IDS_PERMISSIONS_PERMISSION_ALLOWED_ONCE_CONFIRMATION,
161 IDS_PERMISSIONS_PERMISSION_NOT_ALLOWED_CONFIRMATION,
162 IDS_PERMISSIONS_GEOLOCATION_ALLOWED_CONFIRMATION_SCREENREADER_ANNOUNCEMENT,
163 IDS_PERMISSIONS_PERMISSION_ALLOWED_ONCE_CONFIRMATION,
164 IDS_PERMISSIONS_GEOLOCATION_NOT_ALLOWED_CONFIRMATION_SCREENREADER_ANNOUNCEMENT}},
165 {RequestType::kIdleDetection,
166 {IDS_IDLE_DETECTION_PERMISSION_CHIP, -1, -1, -1, -1, -1, -1, -1}},
167 {RequestType::kMicStream,
168 {IDS_MEDIA_CAPTURE_AUDIO_ONLY_PERMISSION_CHIP, -1,
169 IDS_PERMISSIONS_PERMISSION_ALLOWED_CONFIRMATION,
170 IDS_PERMISSIONS_PERMISSION_ALLOWED_ONCE_CONFIRMATION,
171 IDS_PERMISSIONS_PERMISSION_NOT_ALLOWED_CONFIRMATION,
172 IDS_PERMISSIONS_MICROPHONE_ALLOWED_CONFIRMATION_SCREENREADER_ANNOUNCEMENT,
173 IDS_PERMISSIONS_MICROPHONE_ALLOWED_ONCE_CONFIRMATION_SCREENREADER_ANNOUNCEMENT,
174 IDS_PERMISSIONS_MICROPHONE_NOT_ALLOWED_CONFIRMATION_SCREENREADER_ANNOUNCEMENT}},
176 {IDS_MIDI_PERMISSION_CHIP, -1, -1, -1, -1, -1, -1, -1}},
177 {RequestType::kMidiSysex,
178 {IDS_MIDI_SYSEX_PERMISSION_CHIP, -1, -1, -1, -1, -1, -1, -1}},
179 {RequestType::kNotifications,
180 {IDS_NOTIFICATION_PERMISSIONS_CHIP,
181 IDS_NOTIFICATION_PERMISSIONS_BLOCKED_CHIP,
182 IDS_PERMISSIONS_PERMISSION_ALLOWED_CONFIRMATION, -1,
183 IDS_PERMISSIONS_PERMISSION_NOT_ALLOWED_CONFIRMATION,
184 IDS_PERMISSIONS_NOTIFICATION_ALLOWED_CONFIRMATION_SCREENREADER_ANNOUNCEMENT,
186 IDS_PERMISSIONS_NOTIFICATION_NOT_ALLOWED_CONFIRMATION_SCREENREADER_ANNOUNCEMENT}},
187 {RequestType::kStorageAccess,
188 {IDS_SAA_PERMISSION_CHIP, -1,
189 IDS_PERMISSIONS_PERMISSION_ALLOWED_CONFIRMATION, -1,
190 IDS_PERMISSIONS_PERMISSION_NOT_ALLOWED_CONFIRMATION,
191 IDS_PERMISSIONS_SAA_ALLOWED_CONFIRMATION_SCREENREADER_ANNOUNCEMENT, -1,
192 IDS_PERMISSIONS_SAA_NOT_ALLOWED_CONFIRMATION_SCREENREADER_ANNOUNCEMENT}},
193 {RequestType::kVrSession,
194 {IDS_VR_PERMISSION_CHIP, -1, -1, -1, -1, -1, -1, -1}}});
196 auto messages = kMessageIds->find(request_type());
197 if (messages != kMessageIds->end() && messages->second[type] != -1)
198 return l10n_util::GetStringUTF16(messages->second[type]);
200 return absl::nullopt;
203 std::u16string PermissionRequest::GetMessageTextFragment() const {
205 switch (request_type()) {
206 case RequestType::kAccessibilityEvents:
207 message_id = IDS_ACCESSIBILITY_EVENTS_PERMISSION_FRAGMENT;
209 case RequestType::kArSession:
210 message_id = IDS_AR_PERMISSION_FRAGMENT;
212 case RequestType::kCameraPanTiltZoom:
213 message_id = IDS_MEDIA_CAPTURE_CAMERA_PAN_TILT_ZOOM_PERMISSION_FRAGMENT;
215 case RequestType::kCameraStream:
216 message_id = IDS_MEDIA_CAPTURE_VIDEO_ONLY_PERMISSION_FRAGMENT;
218 case RequestType::kClipboard:
219 message_id = IDS_CLIPBOARD_PERMISSION_FRAGMENT;
221 case RequestType::kDiskQuota:
222 message_id = IDS_REQUEST_QUOTA_PERMISSION_FRAGMENT;
224 case RequestType::kFileSystemAccess:
225 message_id = IDS_SITE_SETTINGS_TYPE_FILE_SYSTEM_ACCESS_WRITE;
227 case RequestType::kGeolocation:
228 message_id = IDS_GEOLOCATION_INFOBAR_PERMISSION_FRAGMENT;
230 case RequestType::kIdleDetection:
231 message_id = IDS_IDLE_DETECTION_PERMISSION_FRAGMENT;
233 case RequestType::kLocalFonts:
234 message_id = IDS_FONT_ACCESS_PERMISSION_FRAGMENT;
236 case RequestType::kMicStream:
237 message_id = IDS_MEDIA_CAPTURE_AUDIO_ONLY_PERMISSION_FRAGMENT;
239 case RequestType::kMidi:
240 message_id = IDS_MIDI_PERMISSION_FRAGMENT;
242 case RequestType::kMidiSysex:
243 message_id = IDS_MIDI_SYSEX_PERMISSION_FRAGMENT;
245 case RequestType::kMultipleDownloads:
246 message_id = IDS_MULTI_DOWNLOAD_PERMISSION_FRAGMENT;
248 case RequestType::kNotifications:
249 message_id = IDS_NOTIFICATION_PERMISSIONS_FRAGMENT;
251 #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN)
252 case RequestType::kProtectedMediaIdentifier:
253 message_id = IDS_PROTECTED_MEDIA_IDENTIFIER_PERMISSION_FRAGMENT;
256 case RequestType::kRegisterProtocolHandler:
257 // Handled by an override in `RegisterProtocolHandlerPermissionRequest`.
259 return std::u16string();
260 case RequestType::kStorageAccess:
261 case RequestType::kTopLevelStorageAccess:
262 message_id = IDS_STORAGE_ACCESS_PERMISSION_FRAGMENT;
264 case RequestType::kVrSession:
265 message_id = IDS_VR_PERMISSION_FRAGMENT;
267 case RequestType::kWindowManagement:
268 message_id = IDS_WINDOW_MANAGEMENT_PERMISSION_FRAGMENT;
271 DCHECK_NE(0, message_id);
272 return l10n_util::GetStringUTF16(message_id);
276 bool PermissionRequest::ShouldUseTwoOriginPrompt() const {
277 return request_type() == RequestType::kStorageAccess &&
278 base::FeatureList::IsEnabled(
279 permissions::features::kPermissionStorageAccessAPI);
282 void PermissionRequest::PermissionGranted(bool is_one_time) {
283 std::move(permission_decided_callback_)
284 .Run(CONTENT_SETTING_ALLOW, is_one_time,
285 /*is_final_decision=*/true);
288 void PermissionRequest::PermissionDenied() {
289 std::move(permission_decided_callback_)
290 .Run(CONTENT_SETTING_BLOCK, /*is_one_time=*/false,
291 /*is_final_decision=*/true);
294 void PermissionRequest::Cancelled(bool is_final_decision) {
295 permission_decided_callback_.Run(CONTENT_SETTING_DEFAULT,
296 /*is_one_time=*/false, is_final_decision);
299 void PermissionRequest::RequestFinished() {
300 std::move(delete_callback_).Run();
303 PermissionRequestGestureType PermissionRequest::GetGestureType() const {
304 return PermissionUtil::GetGestureType(data_.user_gesture);
307 ContentSettingsType PermissionRequest::GetContentSettingsType() const {
308 auto type = RequestTypeToContentSettingsType(request_type());
309 if (type.has_value())
311 return ContentSettingsType::DEFAULT;
314 std::u16string PermissionRequest::GetPermissionNameTextFragment() const {
316 switch (request_type()) {
317 case RequestType::kCameraStream:
318 message_id = IDS_CAMERA_PERMISSION_NAME_FRAGMENT;
320 case RequestType::kMicStream:
321 message_id = IDS_MICROPHONE_PERMISSION_NAME_FRAGMENT;
325 return std::u16string();
327 DCHECK_NE(0, message_id);
328 return l10n_util::GetStringUTF16(message_id);
331 void PermissionRequest::SetEmbeddedPermissionElementInitiatedForTesting(
332 bool embedded_permission_element_initiated) {
333 data_.embedded_permission_element_initiated =
334 embedded_permission_element_initiated;
337 } // namespace permissions