Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(804)

Unified Diff: content/browser/renderer_host/media/media_stream_ui_proxy.cc

Issue 562263002: Check media permissions through RenderFrameHostDelegate. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@render_frame_get_sources
Patch Set: Rebase Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/media/media_stream_ui_proxy.cc
diff --git a/content/browser/renderer_host/media/media_stream_ui_proxy.cc b/content/browser/renderer_host/media/media_stream_ui_proxy.cc
index 837577ae98713a8aaf7f4f8d6fa6f286a05e20a2..c4eb0d7363fbd8c016407dec7c895930cccb5ecf 100644
--- a/content/browser/renderer_host/media/media_stream_ui_proxy.cc
+++ b/content/browser/renderer_host/media/media_stream_ui_proxy.cc
@@ -20,6 +20,10 @@ class MediaStreamUIProxy::Core {
~Core();
void RequestAccess(const MediaStreamRequest& request);
+ bool CheckAccess(const GURL& security_origin,
+ MediaStreamType type,
+ int process_id,
+ int frame_id);
void OnStarted(gfx::NativeViewId* window_id);
private:
@@ -27,6 +31,8 @@ class MediaStreamUIProxy::Core {
content::MediaStreamRequestResult result,
scoped_ptr<MediaStreamUI> stream_ui);
void ProcessStopRequestFromUI();
+ RenderFrameHostDelegate* GetRenderFrameHostDelegate(int render_process_id,
+ int render_frame_id);
base::WeakPtr<MediaStreamUIProxy> proxy_;
scoped_ptr<MediaStreamUI> ui_;
@@ -55,14 +61,8 @@ void MediaStreamUIProxy::Core::RequestAccess(
const MediaStreamRequest& request) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- RenderFrameHostDelegate* render_delegate;
- if (test_render_delegate_) {
- render_delegate = test_render_delegate_;
- } else {
- RenderFrameHostImpl* const host = RenderFrameHostImpl::FromID(
- request.render_process_id, request.render_frame_id);
- render_delegate = host ? host->delegate() : NULL;
- }
+ RenderFrameHostDelegate* render_delegate = GetRenderFrameHostDelegate(
+ request.render_process_id, request.render_frame_id);
// Tab may have gone away, or has no delegate from which to request access.
if (!render_delegate) {
@@ -78,6 +78,20 @@ void MediaStreamUIProxy::Core::RequestAccess(
weak_factory_.GetWeakPtr()));
}
+bool MediaStreamUIProxy::Core::CheckAccess(const GURL& security_origin,
+ MediaStreamType type,
+ int render_process_id,
+ int render_frame_id) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+ RenderFrameHostDelegate* render_delegate =
+ GetRenderFrameHostDelegate(render_process_id, render_frame_id);
+ if (!render_delegate)
+ return false;
+
+ return render_delegate->CheckMediaAccessPermission(security_origin, type);
+}
+
void MediaStreamUIProxy::Core::OnStarted(gfx::NativeViewId* window_id) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (ui_) {
@@ -107,6 +121,16 @@ void MediaStreamUIProxy::Core::ProcessStopRequestFromUI() {
base::Bind(&MediaStreamUIProxy::ProcessStopRequestFromUI, proxy_));
}
+RenderFrameHostDelegate* MediaStreamUIProxy::Core::GetRenderFrameHostDelegate(
+ int render_process_id,
+ int render_frame_id) {
+ if (test_render_delegate_)
+ return test_render_delegate_;
+ RenderFrameHostImpl* host =
+ RenderFrameHostImpl::FromID(render_process_id, render_frame_id);
+ return host ? host->delegate() : NULL;
+}
+
// static
scoped_ptr<MediaStreamUIProxy> MediaStreamUIProxy::Create() {
return scoped_ptr<MediaStreamUIProxy>(new MediaStreamUIProxy(NULL));
@@ -141,6 +165,28 @@ void MediaStreamUIProxy::RequestAccess(
base::Bind(&Core::RequestAccess, base::Unretained(core_.get()), request));
}
+void MediaStreamUIProxy::CheckAccess(
+ const GURL& security_origin,
+ MediaStreamType type,
+ int render_process_id,
+ int render_frame_id,
+ const base::Callback<void(bool)>& callback) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+ BrowserThread::PostTaskAndReplyWithResult(
+ BrowserThread::UI,
+ FROM_HERE,
+ base::Bind(&Core::CheckAccess,
+ base::Unretained(core_.get()),
+ security_origin,
+ type,
+ render_process_id,
+ render_frame_id),
+ base::Bind(&MediaStreamUIProxy::OnCheckedAccess,
+ weak_factory_.GetWeakPtr(),
+ callback));
+}
+
void MediaStreamUIProxy::OnStarted(const base::Closure& stop_callback,
const WindowIdCallback& window_id_callback) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
@@ -160,13 +206,6 @@ void MediaStreamUIProxy::OnStarted(const base::Closure& stop_callback,
base::Owned(window_id)));
}
-void MediaStreamUIProxy::OnWindowId(const WindowIdCallback& window_id_callback,
- gfx::NativeViewId* window_id) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- if (!window_id_callback.is_null())
- window_id_callback.Run(*window_id);
-}
-
void MediaStreamUIProxy::ProcessAccessRequestResponse(
const MediaStreamDevices& devices,
content::MediaStreamRequestResult result) {
@@ -187,8 +226,25 @@ void MediaStreamUIProxy::ProcessStopRequestFromUI() {
cb.Run();
}
+void MediaStreamUIProxy::OnWindowId(const WindowIdCallback& window_id_callback,
+ gfx::NativeViewId* window_id) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ if (!window_id_callback.is_null())
+ window_id_callback.Run(*window_id);
+}
+
+void MediaStreamUIProxy::OnCheckedAccess(
+ const base::Callback<void(bool)>& callback,
+ bool have_access) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ if (!callback.is_null())
+ callback.Run(have_access);
+}
+
FakeMediaStreamUIProxy::FakeMediaStreamUIProxy()
- : MediaStreamUIProxy(NULL) {
+ : MediaStreamUIProxy(NULL),
+ mic_access_(true),
+ camera_access_(true) {
}
FakeMediaStreamUIProxy::~FakeMediaStreamUIProxy() {}
@@ -198,6 +254,14 @@ void FakeMediaStreamUIProxy::SetAvailableDevices(
devices_ = devices;
}
+void FakeMediaStreamUIProxy::SetMicAccess(bool access) {
+ mic_access_ = access;
+}
+
+void FakeMediaStreamUIProxy::SetCameraAccess(bool access) {
+ camera_access_ = access;
+}
+
void FakeMediaStreamUIProxy::RequestAccess(
const MediaStreamRequest& request,
const ResponseCallback& response_callback) {
@@ -242,7 +306,7 @@ void FakeMediaStreamUIProxy::RequestAccess(
}
}
- // Fail the request if a device exist for the requested type.
+ // Fail the request if a device doesn't exist for the requested type.
if ((request.audio_type != MEDIA_NO_SERVICE && !accepted_audio) ||
(request.video_type != MEDIA_NO_SERVICE && !accepted_video)) {
devices_to_use.clear();
@@ -258,6 +322,33 @@ void FakeMediaStreamUIProxy::RequestAccess(
MEDIA_DEVICE_OK));
}
+void FakeMediaStreamUIProxy::CheckAccess(
+ const GURL& security_origin,
+ MediaStreamType type,
+ int render_process_id,
+ int render_frame_id,
+ const base::Callback<void(bool)>& callback) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE ||
+ type == MEDIA_DEVICE_VIDEO_CAPTURE);
+
+ bool have_access = false;
+ if (CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+ switches::kUseFakeUIForMediaStream) != "deny") {
+ have_access =
+ type == MEDIA_DEVICE_AUDIO_CAPTURE ? mic_access_ : camera_access_;
+ }
+
+ BrowserThread::PostTask(
+ BrowserThread::IO,
+ FROM_HERE,
+ base::Bind(&MediaStreamUIProxy::OnCheckedAccess,
+ weak_factory_.GetWeakPtr(),
+ callback,
+ have_access));
+ return;
+}
+
void FakeMediaStreamUIProxy::OnStarted(
const base::Closure& stop_callback,
const WindowIdCallback& window_id_callback) {}

Powered by Google App Engine
This is Rietveld 408576698