permission_request.cc 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. // Copyright 2015 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/permissions/permission_request.h"
  5. #include "base/notreached.h"
  6. #include "build/build_config.h"
  7. #include "components/permissions/permission_util.h"
  8. #include "components/permissions/request_type.h"
  9. #include "components/strings/grit/components_strings.h"
  10. #include "components/url_formatter/elide_url.h"
  11. #include "ui/base/l10n/l10n_util.h"
  12. #if BUILDFLAG(IS_ANDROID)
  13. #include "media/base/android/media_drm_bridge.h"
  14. #endif
  15. namespace permissions {
  16. PermissionRequest::PermissionRequest(
  17. const GURL& requesting_origin,
  18. RequestType request_type,
  19. bool has_gesture,
  20. PermissionDecidedCallback permission_decided_callback,
  21. base::OnceClosure delete_callback)
  22. : requesting_origin_(requesting_origin),
  23. request_type_(request_type),
  24. has_gesture_(has_gesture),
  25. permission_decided_callback_(std::move(permission_decided_callback)),
  26. delete_callback_(std::move(delete_callback)) {}
  27. PermissionRequest::~PermissionRequest() {
  28. DCHECK(delete_callback_.is_null());
  29. }
  30. bool PermissionRequest::IsDuplicateOf(PermissionRequest* other_request) const {
  31. return request_type() == other_request->request_type() &&
  32. requesting_origin() == other_request->requesting_origin();
  33. }
  34. #if BUILDFLAG(IS_ANDROID)
  35. std::u16string PermissionRequest::GetDialogMessageText() const {
  36. int message_id = 0;
  37. switch (request_type_) {
  38. case RequestType::kAccessibilityEvents:
  39. message_id = IDS_ACCESSIBILITY_EVENTS_INFOBAR_TEXT;
  40. break;
  41. case RequestType::kArSession:
  42. message_id = IDS_AR_INFOBAR_TEXT;
  43. break;
  44. case RequestType::kCameraStream:
  45. message_id = IDS_MEDIA_CAPTURE_VIDEO_ONLY_INFOBAR_TEXT;
  46. break;
  47. case RequestType::kClipboard:
  48. message_id = IDS_CLIPBOARD_INFOBAR_TEXT;
  49. break;
  50. case RequestType::kDiskQuota:
  51. // Handled by an override in `QuotaPermissionRequest`.
  52. NOTREACHED();
  53. break;
  54. case RequestType::kGeolocation:
  55. message_id = IDS_GEOLOCATION_INFOBAR_TEXT;
  56. break;
  57. case RequestType::kIdleDetection:
  58. message_id = IDS_IDLE_DETECTION_INFOBAR_TEXT;
  59. break;
  60. case RequestType::kMicStream:
  61. message_id = IDS_MEDIA_CAPTURE_AUDIO_ONLY_INFOBAR_TEXT;
  62. break;
  63. case RequestType::kMidiSysex:
  64. message_id = IDS_MIDI_SYSEX_INFOBAR_TEXT;
  65. break;
  66. case RequestType::kMultipleDownloads:
  67. message_id = IDS_MULTI_DOWNLOAD_WARNING;
  68. break;
  69. case RequestType::kNfcDevice:
  70. message_id = IDS_NFC_INFOBAR_TEXT;
  71. break;
  72. case RequestType::kNotifications:
  73. message_id = IDS_NOTIFICATIONS_INFOBAR_TEXT;
  74. break;
  75. case RequestType::kProtectedMediaIdentifier:
  76. message_id =
  77. media::MediaDrmBridge::IsPerOriginProvisioningSupported()
  78. ? IDS_PROTECTED_MEDIA_IDENTIFIER_PER_ORIGIN_PROVISIONING_INFOBAR_TEXT
  79. : IDS_PROTECTED_MEDIA_IDENTIFIER_PER_DEVICE_PROVISIONING_INFOBAR_TEXT;
  80. break;
  81. case RequestType::kStorageAccess:
  82. // Handled by `PermissionPromptAndroid::GetMessageText` directly.
  83. NOTREACHED();
  84. break;
  85. case RequestType::kVrSession:
  86. message_id = IDS_VR_INFOBAR_TEXT;
  87. break;
  88. }
  89. DCHECK_NE(0, message_id);
  90. return l10n_util::GetStringFUTF16(
  91. message_id, url_formatter::FormatUrlForSecurityDisplay(
  92. requesting_origin(),
  93. url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC));
  94. }
  95. #endif
  96. #if !BUILDFLAG(IS_ANDROID)
  97. IconId PermissionRequest::GetIconForChip() {
  98. return permissions::GetIconId(request_type_);
  99. }
  100. IconId PermissionRequest::GetBlockedIconForChip() {
  101. return permissions::GetBlockedIconId(request_type_);
  102. }
  103. absl::optional<std::u16string> PermissionRequest::GetRequestChipText() const {
  104. int message_id;
  105. switch (request_type_) {
  106. case RequestType::kArSession:
  107. message_id = IDS_AR_PERMISSION_CHIP;
  108. break;
  109. case RequestType::kCameraStream:
  110. message_id = IDS_MEDIA_CAPTURE_VIDEO_ONLY_PERMISSION_CHIP;
  111. break;
  112. case RequestType::kClipboard:
  113. message_id = IDS_CLIPBOARD_PERMISSION_CHIP;
  114. break;
  115. case RequestType::kGeolocation:
  116. message_id = IDS_GEOLOCATION_PERMISSION_CHIP;
  117. break;
  118. case RequestType::kIdleDetection:
  119. message_id = IDS_IDLE_DETECTION_PERMISSION_CHIP;
  120. break;
  121. case RequestType::kMicStream:
  122. message_id = IDS_MEDIA_CAPTURE_AUDIO_ONLY_PERMISSION_CHIP;
  123. break;
  124. case RequestType::kMidiSysex:
  125. message_id = IDS_MIDI_SYSEX_PERMISSION_CHIP;
  126. break;
  127. case RequestType::kNotifications:
  128. message_id = IDS_NOTIFICATION_PERMISSIONS_CHIP;
  129. break;
  130. case RequestType::kVrSession:
  131. message_id = IDS_VR_PERMISSION_CHIP;
  132. break;
  133. default:
  134. // TODO(bsep): We don't actually want to support having no string in the
  135. // long term, but writing them takes time. In the meantime, we fall back
  136. // to the existing UI when the string is missing.
  137. return absl::nullopt;
  138. }
  139. return l10n_util::GetStringUTF16(message_id);
  140. }
  141. absl::optional<std::u16string> PermissionRequest::GetQuietChipText() const {
  142. int message_id;
  143. switch (request_type_) {
  144. case RequestType::kGeolocation:
  145. message_id = IDS_GEOLOCATION_PERMISSION_BLOCKED_CHIP;
  146. break;
  147. case RequestType::kNotifications:
  148. message_id = IDS_NOTIFICATION_PERMISSIONS_BLOCKED_CHIP;
  149. break;
  150. default:
  151. return absl::nullopt;
  152. }
  153. return l10n_util::GetStringUTF16(message_id);
  154. }
  155. std::u16string PermissionRequest::GetMessageTextFragment() const {
  156. int message_id = 0;
  157. switch (request_type_) {
  158. case RequestType::kAccessibilityEvents:
  159. message_id = IDS_ACCESSIBILITY_EVENTS_PERMISSION_FRAGMENT;
  160. break;
  161. case RequestType::kArSession:
  162. message_id = IDS_AR_PERMISSION_FRAGMENT;
  163. break;
  164. case RequestType::kCameraPanTiltZoom:
  165. message_id = IDS_MEDIA_CAPTURE_CAMERA_PAN_TILT_ZOOM_PERMISSION_FRAGMENT;
  166. break;
  167. case RequestType::kCameraStream:
  168. message_id = IDS_MEDIA_CAPTURE_VIDEO_ONLY_PERMISSION_FRAGMENT;
  169. break;
  170. case RequestType::kClipboard:
  171. message_id = IDS_CLIPBOARD_PERMISSION_FRAGMENT;
  172. break;
  173. case RequestType::kDiskQuota:
  174. message_id = IDS_REQUEST_QUOTA_PERMISSION_FRAGMENT;
  175. break;
  176. case RequestType::kLocalFonts:
  177. message_id = IDS_FONT_ACCESS_PERMISSION_FRAGMENT;
  178. break;
  179. case RequestType::kGeolocation:
  180. message_id = IDS_GEOLOCATION_INFOBAR_PERMISSION_FRAGMENT;
  181. break;
  182. case RequestType::kIdleDetection:
  183. message_id = IDS_IDLE_DETECTION_PERMISSION_FRAGMENT;
  184. break;
  185. case RequestType::kMicStream:
  186. message_id = IDS_MEDIA_CAPTURE_AUDIO_ONLY_PERMISSION_FRAGMENT;
  187. break;
  188. case RequestType::kMidiSysex:
  189. message_id = IDS_MIDI_SYSEX_PERMISSION_FRAGMENT;
  190. break;
  191. case RequestType::kMultipleDownloads:
  192. message_id = IDS_MULTI_DOWNLOAD_PERMISSION_FRAGMENT;
  193. break;
  194. case RequestType::kNotifications:
  195. message_id = IDS_NOTIFICATION_PERMISSIONS_FRAGMENT;
  196. break;
  197. #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN)
  198. case RequestType::kProtectedMediaIdentifier:
  199. message_id = IDS_PROTECTED_MEDIA_IDENTIFIER_PERMISSION_FRAGMENT;
  200. break;
  201. #endif
  202. case RequestType::kRegisterProtocolHandler:
  203. // Handled by an override in `RegisterProtocolHandlerPermissionRequest`.
  204. NOTREACHED();
  205. return std::u16string();
  206. case RequestType::kStorageAccess:
  207. message_id = IDS_STORAGE_ACCESS_PERMISSION_FRAGMENT;
  208. break;
  209. case RequestType::kSecurityAttestation:
  210. message_id = IDS_SECURITY_KEY_ATTESTATION_PERMISSION_FRAGMENT;
  211. break;
  212. case RequestType::kU2fApiRequest:
  213. message_id = IDS_U2F_API_PERMISSION_FRAGMENT;
  214. break;
  215. case RequestType::kVrSession:
  216. message_id = IDS_VR_PERMISSION_FRAGMENT;
  217. break;
  218. case RequestType::kWindowPlacement:
  219. message_id = IDS_WINDOW_MANAGEMENT_PERMISSION_FRAGMENT;
  220. break;
  221. }
  222. DCHECK_NE(0, message_id);
  223. return l10n_util::GetStringUTF16(message_id);
  224. }
  225. #endif
  226. void PermissionRequest::PermissionGranted(bool is_one_time) {
  227. std::move(permission_decided_callback_)
  228. .Run(CONTENT_SETTING_ALLOW, is_one_time);
  229. }
  230. void PermissionRequest::PermissionDenied() {
  231. std::move(permission_decided_callback_)
  232. .Run(CONTENT_SETTING_BLOCK, /*is_one_time=*/false);
  233. }
  234. void PermissionRequest::Cancelled() {
  235. std::move(permission_decided_callback_)
  236. .Run(CONTENT_SETTING_DEFAULT, /*is_one_time=*/false);
  237. }
  238. void PermissionRequest::RequestFinished() {
  239. std::move(delete_callback_).Run();
  240. }
  241. PermissionRequestGestureType PermissionRequest::GetGestureType() const {
  242. return PermissionUtil::GetGestureType(has_gesture_);
  243. }
  244. ContentSettingsType PermissionRequest::GetContentSettingsType() const {
  245. auto type = RequestTypeToContentSettingsType(request_type_);
  246. if (type.has_value())
  247. return type.value();
  248. return ContentSettingsType::DEFAULT;
  249. }
  250. } // namespace permissions