[MPArch Guest View] Support Media Access permissions
- Create Guest variants of the Media Access queries on the GuestPageHolder::Delegate. - Pass RenderFrameHost into SupportsStreamType. - Look up the RenderFrameHost from the request object. Bug: 40202416 Change-Id: Iac31b817892d7222c041b1a78a3e905de2a2f9b2 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6157121 Reviewed-by: Mark Foltz <mfoltz@chromium.org> Reviewed-by: Robbie McElrath <rmcelrath@chromium.org> Reviewed-by: Kevin McNee <mcnee@chromium.org> Commit-Queue: Dave Tapuska <dtapuska@chromium.org> Cr-Commit-Position: refs/heads/main@{#1405643}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
6572dc4750
commit
ddcf18f3b0
chrome/browser
apps
guest_view
controlled_frame
media
chromeos_login_and_lock_media_access_handler.ccchromeos_login_and_lock_media_access_handler.hextension_media_access_handler.ccextension_media_access_handler.hmedia_access_handler.h
webrtc
desktop_capture_access_handler.ccdesktop_capture_access_handler.hdisplay_media_access_handler.ccdisplay_media_access_handler.hmedia_capture_devices_dispatcher.ccmedia_capture_devices_dispatcher_unittest.ccpermission_bubble_media_access_handler.ccpermission_bubble_media_access_handler.htab_capture_access_handler.cctab_capture_access_handler.h
components/guest_view/browser
content
browser
public
browser
extensions/browser/guest_view/web_view
@@ -159,8 +159,11 @@ void MediaStreamUIProxy::Core::RequestAccess(
|
||||
return;
|
||||
}
|
||||
|
||||
RenderFrameHostImpl* host = RenderFrameHostImpl::FromID(
|
||||
request->render_process_id, request->render_frame_id);
|
||||
|
||||
render_delegate->RequestMediaAccessPermission(
|
||||
*request,
|
||||
host, *request,
|
||||
base::BindOnce(&Core::ProcessAccessRequestResponse, weak_this_,
|
||||
request->render_process_id, request->render_frame_id));
|
||||
}
|
||||
|
@@ -38,7 +38,8 @@ namespace content {
|
||||
namespace {
|
||||
class MockRenderFrameHostDelegate : public RenderFrameHostDelegate {
|
||||
public:
|
||||
void RequestMediaAccessPermission(const MediaStreamRequest& request,
|
||||
void RequestMediaAccessPermission(RenderFrameHostImpl* render_frame_host,
|
||||
const MediaStreamRequest& request,
|
||||
MediaResponseCallback callback) override {
|
||||
return RequestMediaAccessPermission(request, &callback);
|
||||
}
|
||||
@@ -632,7 +633,8 @@ class MediaStreamUIProxyPermissionsPolicyTest
|
||||
private:
|
||||
class TestRFHDelegate : public RenderFrameHostDelegate {
|
||||
public:
|
||||
void RequestMediaAccessPermission(const MediaStreamRequest& request,
|
||||
void RequestMediaAccessPermission(RenderFrameHostImpl* render_frame_host,
|
||||
const MediaStreamRequest& request,
|
||||
MediaResponseCallback callback) override {
|
||||
blink::mojom::StreamDevicesSet stream_devices_set;
|
||||
stream_devices_set.stream_devices.emplace_back(
|
||||
|
@@ -49,6 +49,7 @@ bool RenderFrameHostDelegate::DidAddMessageToConsole(
|
||||
}
|
||||
|
||||
void RenderFrameHostDelegate::RequestMediaAccessPermission(
|
||||
RenderFrameHostImpl* render_frame_host,
|
||||
const MediaStreamRequest& request,
|
||||
MediaResponseCallback callback) {
|
||||
LOG(ERROR) << "RenderFrameHostDelegate::RequestMediaAccessPermission: "
|
||||
|
@@ -289,8 +289,10 @@ class CONTENT_EXPORT RenderFrameHostDelegate {
|
||||
// The render frame has requested access to media devices listed in
|
||||
// |request|, and the client should grant or deny that permission by
|
||||
// calling |callback|.
|
||||
virtual void RequestMediaAccessPermission(const MediaStreamRequest& request,
|
||||
MediaResponseCallback callback);
|
||||
virtual void RequestMediaAccessPermission(
|
||||
RenderFrameHostImpl* render_frame_host,
|
||||
const MediaStreamRequest& request,
|
||||
MediaResponseCallback callback);
|
||||
|
||||
// Called when a renderer requests to select an audio output device.
|
||||
// |request| contains parameters for audio output device selection.
|
||||
|
@@ -5385,6 +5385,7 @@ void WebContentsImpl::CreateMediaPlayerHostForRenderFrameHost(
|
||||
}
|
||||
|
||||
void WebContentsImpl::RequestMediaAccessPermission(
|
||||
RenderFrameHostImpl* render_frame_host,
|
||||
const MediaStreamRequest& request,
|
||||
MediaResponseCallback callback) {
|
||||
OPTIONAL_TRACE_EVENT2("content",
|
||||
@@ -5392,14 +5393,22 @@ void WebContentsImpl::RequestMediaAccessPermission(
|
||||
"render_process_id", request.render_process_id,
|
||||
"render_frame_id", request.render_frame_id);
|
||||
|
||||
if (delegate_) {
|
||||
if (GuestPageHolderImpl* guest =
|
||||
render_frame_host
|
||||
? GuestPageHolderImpl::FromRenderFrameHost(*render_frame_host)
|
||||
: nullptr) {
|
||||
if (auto* delegate = guest->delegate()) {
|
||||
delegate->GuestRequestMediaAccessPermission(request, std::move(callback));
|
||||
return;
|
||||
}
|
||||
} else if (delegate_) {
|
||||
delegate_->RequestMediaAccessPermission(this, request, std::move(callback));
|
||||
} else {
|
||||
std::move(callback).Run(
|
||||
blink::mojom::StreamDevicesSet(),
|
||||
blink::mojom::MediaStreamRequestResult::FAILED_DUE_TO_SHUTDOWN,
|
||||
std::unique_ptr<MediaStreamUI>());
|
||||
return;
|
||||
}
|
||||
std::move(callback).Run(
|
||||
blink::mojom::StreamDevicesSet(),
|
||||
blink::mojom::MediaStreamRequestResult::FAILED_DUE_TO_SHUTDOWN,
|
||||
std::unique_ptr<MediaStreamUI>());
|
||||
}
|
||||
|
||||
void WebContentsImpl::ProcessSelectAudioOutput(
|
||||
@@ -5426,6 +5435,15 @@ bool WebContentsImpl::CheckMediaAccessPermission(
|
||||
|
||||
DCHECK(type == blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE ||
|
||||
type == blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE);
|
||||
|
||||
if (auto* guest =
|
||||
GuestPageHolderImpl::FromRenderFrameHost(*render_frame_host)) {
|
||||
if (auto* delegate = guest->delegate()) {
|
||||
return delegate->GuestCheckMediaAccessPermission(render_frame_host,
|
||||
security_origin, type);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return delegate_ && delegate_->CheckMediaAccessPermission(
|
||||
render_frame_host, security_origin, type);
|
||||
}
|
||||
|
@@ -959,7 +959,8 @@ class CONTENT_EXPORT WebContentsImpl
|
||||
RenderFrameHostImpl* frame_host,
|
||||
mojo::PendingAssociatedReceiver<media::mojom::MediaPlayerHost> receiver)
|
||||
override;
|
||||
void RequestMediaAccessPermission(const MediaStreamRequest& request,
|
||||
void RequestMediaAccessPermission(RenderFrameHostImpl* render_frame_host,
|
||||
const MediaStreamRequest& request,
|
||||
MediaResponseCallback callback) override;
|
||||
|
||||
void ProcessSelectAudioOutput(const SelectAudioOutputRequest& request,
|
||||
|
@@ -3383,7 +3383,7 @@ TEST_F(WebContentsImplTest, RequestMediaAccessPermissionNoDelegate) {
|
||||
/*captured_surface_control_active=*/false);
|
||||
bool callback_run = false;
|
||||
contents()->RequestMediaAccessPermission(
|
||||
dummy_request,
|
||||
contents()->GetPrimaryMainFrame(), dummy_request,
|
||||
base::BindLambdaForTesting(
|
||||
[&callback_run](
|
||||
const blink::mojom::StreamDevicesSet& stream_devices_set,
|
||||
|
@@ -12,6 +12,7 @@
|
||||
#include "base/process/kill.h"
|
||||
#include "base/supports_user_data.h"
|
||||
#include "content/common/content_export.h"
|
||||
#include "content/public/browser/media_stream_request.h"
|
||||
#include "ui/base/window_open_disposition.h"
|
||||
#include "url/gurl.h"
|
||||
|
||||
@@ -101,6 +102,19 @@ class GuestPageHolder : public base::SupportsUserData {
|
||||
// Close the current window.
|
||||
virtual void GuestClose() = 0;
|
||||
|
||||
// Asks permission to use the camera and/or microphone.
|
||||
// See `WebContentsDelegate::RequestMediaAccessPermission`
|
||||
virtual void GuestRequestMediaAccessPermission(
|
||||
const MediaStreamRequest& request,
|
||||
MediaResponseCallback callback) = 0;
|
||||
|
||||
// Checks if we have permission to access the microphone or camera.
|
||||
// See `WebContentsDelegate::CheckMediaAccessPermission`
|
||||
virtual bool GuestCheckMediaAccessPermission(
|
||||
RenderFrameHost* render_frame_host,
|
||||
const url::Origin& security_origin,
|
||||
blink::mojom::MediaStreamType type) = 0;
|
||||
|
||||
// TODO(40202416): Guest implementations need to be informed of several
|
||||
// other events that they currently get through primary main frame specific
|
||||
// WebContentsObserver methods (e.g.
|
||||
|
Reference in New Issue
Block a user