short-circuit_permissions_checks_in_mediastreamdevicescontroller.patch 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
  2. From: Jeremy Rose <[email protected]>
  3. Date: Tue, 12 Jul 2022 16:51:43 -0700
  4. Subject: short-circuit permissions checks in MediaStreamDevicesController
  5. The //components/permissions architecture is complicated and not that
  6. widely used in Chromium, and mostly oriented around showing permissions
  7. UI and/or remembering per-site permissions, which we're not interested
  8. in.
  9. Since we do a permissions check prior to invoking the
  10. MediaStreamDevicesController, and don't (yet) provide the ability to set
  11. granular permissions (e.g. allow video but not audio), just
  12. short-circuit all the permissions checks in MSDC for now to allow us to
  13. unduplicate this code.
  14. diff --git a/components/webrtc/media_stream_devices_controller.cc b/components/webrtc/media_stream_devices_controller.cc
  15. index 13929e4f6c1997a9071a2d1e3982a8c8feac84e4..a9719f72b9994537665c7f6a433ea8499b42122d 100644
  16. --- a/components/webrtc/media_stream_devices_controller.cc
  17. +++ b/components/webrtc/media_stream_devices_controller.cc
  18. @@ -57,7 +57,8 @@ bool PermissionIsRequested(blink::PermissionType permission,
  19. void MediaStreamDevicesController::RequestPermissions(
  20. const content::MediaStreamRequest& request,
  21. MediaStreamDeviceEnumerator* enumerator,
  22. - ResultCallback callback) {
  23. + ResultCallback callback,
  24. + bool previously_approved) {
  25. content::RenderFrameHost* rfh = content::RenderFrameHost::FromID(
  26. request.render_process_id, request.render_frame_id);
  27. // The RFH may have been destroyed by the time the request is processed.
  28. @@ -92,7 +93,7 @@ void MediaStreamDevicesController::RequestPermissions(
  29. std::move(callback)));
  30. std::vector<blink::PermissionType> permission_types;
  31. -
  32. +#if 0
  33. content::PermissionController* permission_controller =
  34. web_contents->GetBrowserContext()->GetPermissionController();
  35. @@ -165,19 +166,26 @@ void MediaStreamDevicesController::RequestPermissions(
  36. requested_audio_capture_device_ids;
  37. permission_request_description.requested_video_capture_device_ids =
  38. requested_video_capture_device_ids;
  39. -
  40. +#endif
  41. // It is OK to ignore `request.security_origin` because it will be calculated
  42. // from `render_frame_host` and we always ignore `requesting_origin` for
  43. // `AUDIO_CAPTURE` and `VIDEO_CAPTURE`.
  44. // `render_frame_host->GetMainFrame()->GetLastCommittedOrigin()` will be used
  45. // instead.
  46. - rfh->GetBrowserContext()
  47. - ->GetPermissionController()
  48. - ->RequestPermissionsFromCurrentDocument(
  49. - rfh, permission_request_description,
  50. - base::BindOnce(
  51. - &MediaStreamDevicesController::PromptAnsweredGroupedRequest,
  52. - std::move(controller)));
  53. + if (previously_approved) {
  54. + controller->PromptAnsweredGroupedRequest({blink::mojom::PermissionStatus::GRANTED /*audio*/,
  55. + blink::mojom::PermissionStatus::GRANTED /*video*/});
  56. + } else {
  57. + rfh->GetBrowserContext()
  58. + ->GetPermissionController()
  59. + ->RequestPermissionsFromCurrentDocument(
  60. + rfh,
  61. + content::PermissionRequestDescription(permission_types,
  62. + request.user_gesture),
  63. + base::BindOnce(
  64. + &MediaStreamDevicesController::PromptAnsweredGroupedRequest,
  65. + std::move(controller)));
  66. + }
  67. }
  68. MediaStreamDevicesController::~MediaStreamDevicesController() {
  69. @@ -426,6 +434,7 @@ bool MediaStreamDevicesController::PermissionIsBlockedForReason(
  70. return false;
  71. }
  72. +#if 0
  73. // TODO(raymes): This function wouldn't be needed if
  74. // PermissionManager::RequestPermissions returned a denial reason.
  75. content::PermissionResult result =
  76. @@ -436,6 +445,7 @@ bool MediaStreamDevicesController::PermissionIsBlockedForReason(
  77. DCHECK_EQ(blink::mojom::PermissionStatus::DENIED, result.status);
  78. return true;
  79. }
  80. +#endif
  81. return false;
  82. }
  83. diff --git a/components/webrtc/media_stream_devices_controller.h b/components/webrtc/media_stream_devices_controller.h
  84. index 4d3bf184243a4c1296f41070e934730a3bd2620e..78610ff9fb93cfa1c9aae898d6f8c83520fc860a 100644
  85. --- a/components/webrtc/media_stream_devices_controller.h
  86. +++ b/components/webrtc/media_stream_devices_controller.h
  87. @@ -48,7 +48,8 @@ class MediaStreamDevicesController {
  88. // synchronously or asynchronously returned via |callback|.
  89. static void RequestPermissions(const content::MediaStreamRequest& request,
  90. MediaStreamDeviceEnumerator* enumerator,
  91. - ResultCallback callback);
  92. + ResultCallback callback,
  93. + bool previously_approved = false);
  94. ~MediaStreamDevicesController();