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

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

Issue 1918173002: Add support for device-change notifications to MediaStreamDispatcher and MediaStreamDispatcherHost (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase and palmer's comments Created 4 years, 8 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_dispatcher_host.cc
diff --git a/content/browser/renderer_host/media/media_stream_dispatcher_host.cc b/content/browser/renderer_host/media/media_stream_dispatcher_host.cc
index 1a1323b4137e906ff0973e243400885035d6b518..dbc73cf7b04c0c7cced8517f82480199d89d8017 100644
--- a/content/browser/renderer_host/media/media_stream_dispatcher_host.cc
+++ b/content/browser/renderer_host/media/media_stream_dispatcher_host.cc
@@ -4,10 +4,16 @@
#include "content/browser/renderer_host/media/media_stream_dispatcher_host.h"
+#include <algorithm>
+
+#include "base/command_line.h"
+#include "base/memory/ptr_util.h"
#include "content/browser/browser_main_loop.h"
+#include "content/browser/renderer_host/media/media_stream_ui_proxy.h"
#include "content/common/media/media_stream_messages.h"
#include "content/common/media/media_stream_options.h"
#include "content/public/browser/render_process_host.h"
+#include "content/public/common/content_switches.h"
#include "url/gurl.h"
namespace content {
@@ -15,12 +21,14 @@ namespace content {
MediaStreamDispatcherHost::MediaStreamDispatcherHost(
int render_process_id,
const ResourceContext::SaltCallback& salt_callback,
- MediaStreamManager* media_stream_manager)
+ MediaStreamManager* media_stream_manager,
+ bool use_fake_ui)
: BrowserMessageFilter(MediaStreamMsgStart),
render_process_id_(render_process_id),
salt_callback_(salt_callback),
- media_stream_manager_(media_stream_manager) {
-}
+ media_stream_manager_(media_stream_manager),
+ use_fake_ui_(use_fake_ui),
+ weak_factory_(this) {}
void MediaStreamDispatcherHost::StreamGenerated(
int render_frame_id,
@@ -45,7 +53,6 @@ void MediaStreamDispatcherHost::StreamGenerationFailed(
<< ", {page_request_id = " << page_request_id << "}"
<< ", { result= " << result << "})";
-
Send(new MediaStreamMsg_StreamGenerationFailed(render_frame_id,
page_request_id,
result));
@@ -93,8 +100,16 @@ void MediaStreamDispatcherHost::DevicesChanged(MediaStreamType type) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
DVLOG(1) << "MediaStreamDispatcherHost::DevicesChanged("
<< "{type = " << type << "})";
- // TODO(guidou): check permissions and forward notifications to renderer.
- // crbug.com/388648
+ for (const auto& subscriber : device_change_subscribers_) {
+ std::unique_ptr<MediaStreamUIProxy> ui_proxy = CreateMediaStreamUIProxy();
+ ui_proxy->CheckAccess(
+ subscriber.security_origin, type, render_process_id_,
+ subscriber.render_frame_id,
+ base::Bind(&MediaStreamDispatcherHost::HandleCheckAccessResponse,
+ weak_factory_.GetWeakPtr(),
+ base::Passed(std::move(ui_proxy)),
+ subscriber.render_frame_id));
+ }
}
bool MediaStreamDispatcherHost::OnMessageReceived(const IPC::Message& message) {
@@ -113,6 +128,10 @@ bool MediaStreamDispatcherHost::OnMessageReceived(const IPC::Message& message) {
OnOpenDevice)
IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CloseDevice,
OnCloseDevice)
+ IPC_MESSAGE_HANDLER(MediaStreamHostMsg_SubscribeToDeviceChangeNotifications,
+ OnSubscribeToDeviceChangeNotifications)
+ IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CancelDeviceChangeNotifications,
+ OnCancelDeviceChangeNotifications)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
return handled;
@@ -123,6 +142,8 @@ void MediaStreamDispatcherHost::OnChannelClosing() {
// Since the IPC sender is gone, close all requesting/requested streams.
media_stream_manager_->CancelAllRequests(render_process_id_);
+ if (!device_change_subscribers_.empty())
+ media_stream_manager_->CancelDeviceChangeNotifications(this);
}
MediaStreamDispatcherHost::~MediaStreamDispatcherHost() {
@@ -222,4 +243,61 @@ void MediaStreamDispatcherHost::OnCloseDevice(
media_stream_manager_->CancelRequest(label);
}
+void MediaStreamDispatcherHost::OnSubscribeToDeviceChangeNotifications(
+ int render_frame_id,
+ const url::Origin& security_origin) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ DVLOG(1)
+ << "MediaStreamDispatcherHost::OnSubscribeToDeviceChangeNotifications("
+ << render_frame_id << ", " << security_origin << ")";
+ DCHECK(
+ std::find_if(
+ device_change_subscribers_.begin(), device_change_subscribers_.end(),
+ [render_frame_id](const DeviceChangeSubscriberInfo& subscriber_info) {
+ return subscriber_info.render_frame_id == render_frame_id;
+ }) == device_change_subscribers_.end());
+
+ if (device_change_subscribers_.empty())
+ media_stream_manager_->SubscribeToDeviceChangeNotifications(this);
+
+ device_change_subscribers_.push_back({render_frame_id, security_origin});
+}
+
+void MediaStreamDispatcherHost::OnCancelDeviceChangeNotifications(
+ int render_frame_id) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ DVLOG(1) << "MediaStreamDispatcherHost::CancelDeviceChangeNotifications("
+ << render_frame_id << ")";
+ auto it = std::find_if(
+ device_change_subscribers_.begin(), device_change_subscribers_.end(),
+ [render_frame_id](const DeviceChangeSubscriberInfo& subscriber_info) {
+ return subscriber_info.render_frame_id == render_frame_id;
+ });
+ CHECK(it != device_change_subscribers_.end());
+ device_change_subscribers_.erase(it);
+ if (device_change_subscribers_.empty())
+ media_stream_manager_->CancelDeviceChangeNotifications(this);
+}
+
+std::unique_ptr<MediaStreamUIProxy>
+MediaStreamDispatcherHost::CreateMediaStreamUIProxy() {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ if (use_fake_ui_ ||
+ base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kUseFakeUIForMediaStream)) {
+ return base::WrapUnique(new FakeMediaStreamUIProxy());
+ }
+
+ return MediaStreamUIProxy::Create();
+}
+
+void MediaStreamDispatcherHost::HandleCheckAccessResponse(
+ std::unique_ptr<MediaStreamUIProxy> ui_proxy,
+ int render_frame_id,
+ bool have_access) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ if (have_access)
+ Send(new MediaStreamMsg_DevicesChanged(render_frame_id));
+}
+
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698