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

Side by Side 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, 7 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/renderer_host/media/media_stream_dispatcher_host.h" 5 #include "content/browser/renderer_host/media/media_stream_dispatcher_host.h"
6 6
7 #include <algorithm>
8
9 #include "base/command_line.h"
10 #include "base/memory/ptr_util.h"
7 #include "content/browser/browser_main_loop.h" 11 #include "content/browser/browser_main_loop.h"
12 #include "content/browser/renderer_host/media/media_stream_ui_proxy.h"
8 #include "content/common/media/media_stream_messages.h" 13 #include "content/common/media/media_stream_messages.h"
9 #include "content/common/media/media_stream_options.h" 14 #include "content/common/media/media_stream_options.h"
10 #include "content/public/browser/render_process_host.h" 15 #include "content/public/browser/render_process_host.h"
16 #include "content/public/common/content_switches.h"
11 #include "url/gurl.h" 17 #include "url/gurl.h"
12 18
13 namespace content { 19 namespace content {
14 20
15 MediaStreamDispatcherHost::MediaStreamDispatcherHost( 21 MediaStreamDispatcherHost::MediaStreamDispatcherHost(
16 int render_process_id, 22 int render_process_id,
17 const ResourceContext::SaltCallback& salt_callback, 23 const ResourceContext::SaltCallback& salt_callback,
18 MediaStreamManager* media_stream_manager) 24 MediaStreamManager* media_stream_manager,
25 bool use_fake_ui)
19 : BrowserMessageFilter(MediaStreamMsgStart), 26 : BrowserMessageFilter(MediaStreamMsgStart),
20 render_process_id_(render_process_id), 27 render_process_id_(render_process_id),
21 salt_callback_(salt_callback), 28 salt_callback_(salt_callback),
22 media_stream_manager_(media_stream_manager) { 29 media_stream_manager_(media_stream_manager),
23 } 30 use_fake_ui_(use_fake_ui),
31 weak_factory_(this) {}
24 32
25 void MediaStreamDispatcherHost::StreamGenerated( 33 void MediaStreamDispatcherHost::StreamGenerated(
26 int render_frame_id, 34 int render_frame_id,
27 int page_request_id, 35 int page_request_id,
28 const std::string& label, 36 const std::string& label,
29 const StreamDeviceInfoArray& audio_devices, 37 const StreamDeviceInfoArray& audio_devices,
30 const StreamDeviceInfoArray& video_devices) { 38 const StreamDeviceInfoArray& video_devices) {
31 DCHECK_CURRENTLY_ON(BrowserThread::IO); 39 DCHECK_CURRENTLY_ON(BrowserThread::IO);
32 DVLOG(1) << "MediaStreamDispatcherHost::StreamGenerated(" 40 DVLOG(1) << "MediaStreamDispatcherHost::StreamGenerated("
33 << ", {label = " << label << "})"; 41 << ", {label = " << label << "})";
34 42
35 Send(new MediaStreamMsg_StreamGenerated( 43 Send(new MediaStreamMsg_StreamGenerated(
36 render_frame_id, page_request_id, label, audio_devices, video_devices)); 44 render_frame_id, page_request_id, label, audio_devices, video_devices));
37 } 45 }
38 46
39 void MediaStreamDispatcherHost::StreamGenerationFailed( 47 void MediaStreamDispatcherHost::StreamGenerationFailed(
40 int render_frame_id, 48 int render_frame_id,
41 int page_request_id, 49 int page_request_id,
42 content::MediaStreamRequestResult result) { 50 content::MediaStreamRequestResult result) {
43 DCHECK_CURRENTLY_ON(BrowserThread::IO); 51 DCHECK_CURRENTLY_ON(BrowserThread::IO);
44 DVLOG(1) << "MediaStreamDispatcherHost::StreamGenerationFailed(" 52 DVLOG(1) << "MediaStreamDispatcherHost::StreamGenerationFailed("
45 << ", {page_request_id = " << page_request_id << "}" 53 << ", {page_request_id = " << page_request_id << "}"
46 << ", { result= " << result << "})"; 54 << ", { result= " << result << "})";
47 55
48
49 Send(new MediaStreamMsg_StreamGenerationFailed(render_frame_id, 56 Send(new MediaStreamMsg_StreamGenerationFailed(render_frame_id,
50 page_request_id, 57 page_request_id,
51 result)); 58 result));
52 } 59 }
53 60
54 void MediaStreamDispatcherHost::DeviceStopped(int render_frame_id, 61 void MediaStreamDispatcherHost::DeviceStopped(int render_frame_id,
55 const std::string& label, 62 const std::string& label,
56 const StreamDeviceInfo& device) { 63 const StreamDeviceInfo& device) {
57 DCHECK_CURRENTLY_ON(BrowserThread::IO); 64 DCHECK_CURRENTLY_ON(BrowserThread::IO);
58 DVLOG(1) << "MediaStreamDispatcherHost::DeviceStopped(" 65 DVLOG(1) << "MediaStreamDispatcherHost::DeviceStopped("
(...skipping 27 matching lines...) Expand all
86 << ", {page_request_id = " << page_request_id << "})"; 93 << ", {page_request_id = " << page_request_id << "})";
87 94
88 Send(new MediaStreamMsg_DeviceOpened( 95 Send(new MediaStreamMsg_DeviceOpened(
89 render_frame_id, page_request_id, label, video_device)); 96 render_frame_id, page_request_id, label, video_device));
90 } 97 }
91 98
92 void MediaStreamDispatcherHost::DevicesChanged(MediaStreamType type) { 99 void MediaStreamDispatcherHost::DevicesChanged(MediaStreamType type) {
93 DCHECK_CURRENTLY_ON(BrowserThread::IO); 100 DCHECK_CURRENTLY_ON(BrowserThread::IO);
94 DVLOG(1) << "MediaStreamDispatcherHost::DevicesChanged(" 101 DVLOG(1) << "MediaStreamDispatcherHost::DevicesChanged("
95 << "{type = " << type << "})"; 102 << "{type = " << type << "})";
96 // TODO(guidou): check permissions and forward notifications to renderer. 103 for (const auto& subscriber : device_change_subscribers_) {
97 // crbug.com/388648 104 std::unique_ptr<MediaStreamUIProxy> ui_proxy = CreateMediaStreamUIProxy();
105 ui_proxy->CheckAccess(
106 subscriber.security_origin, type, render_process_id_,
107 subscriber.render_frame_id,
108 base::Bind(&MediaStreamDispatcherHost::HandleCheckAccessResponse,
109 weak_factory_.GetWeakPtr(),
110 base::Passed(std::move(ui_proxy)),
111 subscriber.render_frame_id));
112 }
98 } 113 }
99 114
100 bool MediaStreamDispatcherHost::OnMessageReceived(const IPC::Message& message) { 115 bool MediaStreamDispatcherHost::OnMessageReceived(const IPC::Message& message) {
101 bool handled = true; 116 bool handled = true;
102 IPC_BEGIN_MESSAGE_MAP(MediaStreamDispatcherHost, message) 117 IPC_BEGIN_MESSAGE_MAP(MediaStreamDispatcherHost, message)
103 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_GenerateStream, OnGenerateStream) 118 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_GenerateStream, OnGenerateStream)
104 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CancelGenerateStream, 119 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CancelGenerateStream,
105 OnCancelGenerateStream) 120 OnCancelGenerateStream)
106 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_StopStreamDevice, 121 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_StopStreamDevice,
107 OnStopStreamDevice) 122 OnStopStreamDevice)
108 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_EnumerateDevices, 123 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_EnumerateDevices,
109 OnEnumerateDevices) 124 OnEnumerateDevices)
110 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CancelEnumerateDevices, 125 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CancelEnumerateDevices,
111 OnCancelEnumerateDevices) 126 OnCancelEnumerateDevices)
112 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_OpenDevice, 127 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_OpenDevice,
113 OnOpenDevice) 128 OnOpenDevice)
114 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CloseDevice, 129 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CloseDevice,
115 OnCloseDevice) 130 OnCloseDevice)
131 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_SubscribeToDeviceChangeNotifications,
132 OnSubscribeToDeviceChangeNotifications)
133 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CancelDeviceChangeNotifications,
134 OnCancelDeviceChangeNotifications)
116 IPC_MESSAGE_UNHANDLED(handled = false) 135 IPC_MESSAGE_UNHANDLED(handled = false)
117 IPC_END_MESSAGE_MAP() 136 IPC_END_MESSAGE_MAP()
118 return handled; 137 return handled;
119 } 138 }
120 139
121 void MediaStreamDispatcherHost::OnChannelClosing() { 140 void MediaStreamDispatcherHost::OnChannelClosing() {
122 DVLOG(1) << "MediaStreamDispatcherHost::OnChannelClosing"; 141 DVLOG(1) << "MediaStreamDispatcherHost::OnChannelClosing";
123 142
124 // Since the IPC sender is gone, close all requesting/requested streams. 143 // Since the IPC sender is gone, close all requesting/requested streams.
125 media_stream_manager_->CancelAllRequests(render_process_id_); 144 media_stream_manager_->CancelAllRequests(render_process_id_);
145 if (!device_change_subscribers_.empty())
146 media_stream_manager_->CancelDeviceChangeNotifications(this);
126 } 147 }
127 148
128 MediaStreamDispatcherHost::~MediaStreamDispatcherHost() { 149 MediaStreamDispatcherHost::~MediaStreamDispatcherHost() {
129 } 150 }
130 151
131 void MediaStreamDispatcherHost::OnGenerateStream( 152 void MediaStreamDispatcherHost::OnGenerateStream(
132 int render_frame_id, 153 int render_frame_id,
133 int page_request_id, 154 int page_request_id,
134 const StreamControls& controls, 155 const StreamControls& controls,
135 const url::Origin& security_origin, 156 const url::Origin& security_origin,
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 void MediaStreamDispatcherHost::OnCloseDevice( 236 void MediaStreamDispatcherHost::OnCloseDevice(
216 int render_frame_id, 237 int render_frame_id,
217 const std::string& label) { 238 const std::string& label) {
218 DVLOG(1) << "MediaStreamDispatcherHost::OnCloseDevice(" 239 DVLOG(1) << "MediaStreamDispatcherHost::OnCloseDevice("
219 << render_frame_id << ", " 240 << render_frame_id << ", "
220 << label << ")"; 241 << label << ")";
221 242
222 media_stream_manager_->CancelRequest(label); 243 media_stream_manager_->CancelRequest(label);
223 } 244 }
224 245
246 void MediaStreamDispatcherHost::OnSubscribeToDeviceChangeNotifications(
247 int render_frame_id,
248 const url::Origin& security_origin) {
249 DCHECK_CURRENTLY_ON(BrowserThread::IO);
250 DVLOG(1)
251 << "MediaStreamDispatcherHost::OnSubscribeToDeviceChangeNotifications("
252 << render_frame_id << ", " << security_origin << ")";
253 DCHECK(
254 std::find_if(
255 device_change_subscribers_.begin(), device_change_subscribers_.end(),
256 [render_frame_id](const DeviceChangeSubscriberInfo& subscriber_info) {
257 return subscriber_info.render_frame_id == render_frame_id;
258 }) == device_change_subscribers_.end());
259
260 if (device_change_subscribers_.empty())
261 media_stream_manager_->SubscribeToDeviceChangeNotifications(this);
262
263 device_change_subscribers_.push_back({render_frame_id, security_origin});
264 }
265
266 void MediaStreamDispatcherHost::OnCancelDeviceChangeNotifications(
267 int render_frame_id) {
268 DCHECK_CURRENTLY_ON(BrowserThread::IO);
269 DVLOG(1) << "MediaStreamDispatcherHost::CancelDeviceChangeNotifications("
270 << render_frame_id << ")";
271 auto it = std::find_if(
272 device_change_subscribers_.begin(), device_change_subscribers_.end(),
273 [render_frame_id](const DeviceChangeSubscriberInfo& subscriber_info) {
274 return subscriber_info.render_frame_id == render_frame_id;
275 });
276 CHECK(it != device_change_subscribers_.end());
277 device_change_subscribers_.erase(it);
278 if (device_change_subscribers_.empty())
279 media_stream_manager_->CancelDeviceChangeNotifications(this);
280 }
281
282 std::unique_ptr<MediaStreamUIProxy>
283 MediaStreamDispatcherHost::CreateMediaStreamUIProxy() {
284 DCHECK_CURRENTLY_ON(BrowserThread::IO);
285 if (use_fake_ui_ ||
286 base::CommandLine::ForCurrentProcess()->HasSwitch(
287 switches::kUseFakeUIForMediaStream)) {
288 return base::WrapUnique(new FakeMediaStreamUIProxy());
289 }
290
291 return MediaStreamUIProxy::Create();
292 }
293
294 void MediaStreamDispatcherHost::HandleCheckAccessResponse(
295 std::unique_ptr<MediaStreamUIProxy> ui_proxy,
296 int render_frame_id,
297 bool have_access) {
298 DCHECK_CURRENTLY_ON(BrowserThread::IO);
299 if (have_access)
300 Send(new MediaStreamMsg_DevicesChanged(render_frame_id));
301 }
302
225 } // namespace content 303 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698