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

Side by Side Diff: content/browser/renderer_host/media/media_devices_dispatcher_host.cc

Issue 2474923002: Fix race in MediaDevicesPermissionChecker. (Closed)
Patch Set: Fix rebase Created 4 years, 1 month 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 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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_devices_dispatcher_host.h" 5 #include "content/browser/renderer_host/media/media_devices_dispatcher_host.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 MediaDevicesDispatcherHost::MediaDevicesDispatcherHost( 81 MediaDevicesDispatcherHost::MediaDevicesDispatcherHost(
82 int render_process_id, 82 int render_process_id,
83 int render_frame_id, 83 int render_frame_id,
84 const std::string& device_id_salt, 84 const std::string& device_id_salt,
85 MediaStreamManager* media_stream_manager) 85 MediaStreamManager* media_stream_manager)
86 : render_process_id_(render_process_id), 86 : render_process_id_(render_process_id),
87 render_frame_id_(render_frame_id), 87 render_frame_id_(render_frame_id),
88 device_id_salt_(device_id_salt), 88 device_id_salt_(device_id_salt),
89 group_id_salt_(ResourceContext::CreateRandomMediaDeviceIDSalt()), 89 group_id_salt_(ResourceContext::CreateRandomMediaDeviceIDSalt()),
90 media_stream_manager_(media_stream_manager), 90 media_stream_manager_(media_stream_manager),
91 permission_checker_(base::MakeUnique<MediaDevicesPermissionChecker>()),
91 weak_factory_(this) { 92 weak_factory_(this) {
92 DCHECK_CURRENTLY_ON(BrowserThread::IO); 93 DCHECK_CURRENTLY_ON(BrowserThread::IO);
93 } 94 }
94 95
95 MediaDevicesDispatcherHost::~MediaDevicesDispatcherHost() { 96 MediaDevicesDispatcherHost::~MediaDevicesDispatcherHost() {
96 DCHECK_CURRENTLY_ON(BrowserThread::IO); 97 DCHECK_CURRENTLY_ON(BrowserThread::IO);
97 for (size_t i = 0; i < NUM_MEDIA_DEVICE_TYPES; ++i) { 98 for (size_t i = 0; i < NUM_MEDIA_DEVICE_TYPES; ++i) {
98 if (!device_change_subscriptions_[i].empty()) { 99 if (!device_change_subscriptions_[i].empty()) {
99 media_stream_manager_->media_devices_manager() 100 media_stream_manager_->media_devices_manager()
100 ->UnsubscribeDeviceChangeNotifications( 101 ->UnsubscribeDeviceChangeNotifications(
(...skipping 21 matching lines...) Expand all
122 bad_message::ReceivedBadMessage(render_process_id_, 123 bad_message::ReceivedBadMessage(render_process_id_,
123 bad_message::MDDH_UNAUTHORIZED_ORIGIN); 124 bad_message::MDDH_UNAUTHORIZED_ORIGIN);
124 return; 125 return;
125 } 126 }
126 127
127 MediaDevicesManager::BoolDeviceTypes devices_to_enumerate; 128 MediaDevicesManager::BoolDeviceTypes devices_to_enumerate;
128 devices_to_enumerate[MEDIA_DEVICE_TYPE_AUDIO_INPUT] = request_audio_input; 129 devices_to_enumerate[MEDIA_DEVICE_TYPE_AUDIO_INPUT] = request_audio_input;
129 devices_to_enumerate[MEDIA_DEVICE_TYPE_VIDEO_INPUT] = request_video_input; 130 devices_to_enumerate[MEDIA_DEVICE_TYPE_VIDEO_INPUT] = request_video_input;
130 devices_to_enumerate[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT] = request_audio_output; 131 devices_to_enumerate[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT] = request_audio_output;
131 132
132 permission_checker_.CheckPermissions( 133 permission_checker_->CheckPermissions(
133 devices_to_enumerate, render_process_id_, render_frame_id_, 134 devices_to_enumerate, render_process_id_, render_frame_id_,
134 security_origin, 135 security_origin,
135 base::Bind(&MediaDevicesDispatcherHost::DoEnumerateDevices, 136 base::Bind(&MediaDevicesDispatcherHost::DoEnumerateDevices,
136 weak_factory_.GetWeakPtr(), devices_to_enumerate, 137 weak_factory_.GetWeakPtr(), devices_to_enumerate,
137 security_origin, client_callback)); 138 security_origin, client_callback));
138 } 139 }
139 140
140 void MediaDevicesDispatcherHost::SubscribeDeviceChangeNotifications( 141 void MediaDevicesDispatcherHost::SubscribeDeviceChangeNotifications(
141 MediaDeviceType type, 142 MediaDeviceType type,
142 uint32_t subscription_id, 143 uint32_t subscription_id,
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 if (!render_frame_host) 224 if (!render_frame_host)
224 return; 225 return;
225 226
226 render_frame_host->GetRemoteInterfaces()->GetInterface( 227 render_frame_host->GetRemoteInterfaces()->GetInterface(
227 mojo::GetProxy(&media_devices_listener)); 228 mojo::GetProxy(&media_devices_listener));
228 if (!media_devices_listener) 229 if (!media_devices_listener)
229 return; 230 return;
230 } 231 }
231 232
232 for (const auto& subscription : subscriptions) { 233 for (const auto& subscription : subscriptions) {
233 bool has_permission = permission_checker_.CheckPermissionOnUIThread( 234 bool has_permission = permission_checker_->CheckPermissionOnUIThread(
234 type, render_process_id_, render_frame_id_, 235 type, render_process_id_, render_frame_id_,
235 subscription.security_origin); 236 subscription.security_origin);
236 media_devices_listener->OnDevicesChanged( 237 media_devices_listener->OnDevicesChanged(
237 type, subscription.subscription_id, 238 type, subscription.subscription_id,
238 TranslateMediaDeviceInfoArray( 239 TranslateMediaDeviceInfoArray(
239 has_permission, device_id_salt_, group_id_salt_, 240 has_permission, device_id_salt_, group_id_salt_,
240 subscription.security_origin, device_infos)); 241 subscription.security_origin, device_infos));
241 } 242 }
242 } 243 }
243 244
244 void MediaDevicesDispatcherHost::SetPermissionChecker( 245 void MediaDevicesDispatcherHost::SetPermissionChecker(
245 const MediaDevicesPermissionChecker& permission_checker) { 246 std::unique_ptr<MediaDevicesPermissionChecker> permission_checker) {
246 DCHECK_CURRENTLY_ON(BrowserThread::IO); 247 DCHECK_CURRENTLY_ON(BrowserThread::IO);
247 permission_checker_ = permission_checker; 248 DCHECK(permission_checker);
249 permission_checker_ = std::move(permission_checker);
248 } 250 }
249 251
250 void MediaDevicesDispatcherHost::SetDeviceChangeListenerForTesting( 252 void MediaDevicesDispatcherHost::SetDeviceChangeListenerForTesting(
251 ::mojom::MediaDevicesListenerPtr listener) { 253 ::mojom::MediaDevicesListenerPtr listener) {
252 DCHECK_CURRENTLY_ON(BrowserThread::UI); 254 DCHECK_CURRENTLY_ON(BrowserThread::UI);
253 device_change_listener_ = std::move(listener); 255 device_change_listener_ = std::move(listener);
254 } 256 }
255 257
256 void MediaDevicesDispatcherHost::DoEnumerateDevices( 258 void MediaDevicesDispatcherHost::DoEnumerateDevices(
257 const MediaDevicesManager::BoolDeviceTypes& requested_types, 259 const MediaDevicesManager::BoolDeviceTypes& requested_types,
(...skipping 23 matching lines...) Expand all
281 for (const auto& device_info : enumeration[i]) { 283 for (const auto& device_info : enumeration[i]) {
282 result[i].push_back(TranslateDeviceInfo(has_permissions[i], 284 result[i].push_back(TranslateDeviceInfo(has_permissions[i],
283 device_id_salt_, group_id_salt_, 285 device_id_salt_, group_id_salt_,
284 security_origin, device_info)); 286 security_origin, device_info));
285 } 287 }
286 } 288 }
287 client_callback.Run(result); 289 client_callback.Run(result);
288 } 290 }
289 291
290 } // namespace content 292 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698