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

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

Issue 185863003: [Media] Add user gesture reporting for API calls to midi and media streams. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix test merge Created 6 years, 9 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 | Annotate | Revision Log
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_manager.h" 5 #include "content/browser/renderer_host/media/media_stream_manager.h"
6 6
7 #include <list> 7 #include <list>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 // several subclasses of DeviceRequest and move some of the responsibility of 166 // several subclasses of DeviceRequest and move some of the responsibility of
167 // the MediaStreamManager to the subclasses to get rid of the way too many if 167 // the MediaStreamManager to the subclasses to get rid of the way too many if
168 // statements in MediaStreamManager. 168 // statements in MediaStreamManager.
169 class MediaStreamManager::DeviceRequest { 169 class MediaStreamManager::DeviceRequest {
170 public: 170 public:
171 DeviceRequest(MediaStreamRequester* requester, 171 DeviceRequest(MediaStreamRequester* requester,
172 int requesting_process_id, 172 int requesting_process_id,
173 int requesting_view_id, 173 int requesting_view_id,
174 int page_request_id, 174 int page_request_id,
175 const GURL& security_origin, 175 const GURL& security_origin,
176 bool user_gesture,
176 MediaStreamRequestType request_type, 177 MediaStreamRequestType request_type,
177 const StreamOptions& options, 178 const StreamOptions& options,
178 const ResourceContext::SaltCallback& salt_callback) 179 const ResourceContext::SaltCallback& salt_callback)
179 : requester(requester), 180 : requester(requester),
180 requesting_process_id(requesting_process_id), 181 requesting_process_id(requesting_process_id),
181 requesting_view_id(requesting_view_id), 182 requesting_view_id(requesting_view_id),
182 page_request_id(page_request_id), 183 page_request_id(page_request_id),
183 security_origin(security_origin), 184 security_origin(security_origin),
185 user_gesture(user_gesture),
184 request_type(request_type), 186 request_type(request_type),
185 options(options), 187 options(options),
186 salt_callback(salt_callback), 188 salt_callback(salt_callback),
187 state_(NUM_MEDIA_TYPES, MEDIA_REQUEST_STATE_NOT_REQUESTED), 189 state_(NUM_MEDIA_TYPES, MEDIA_REQUEST_STATE_NOT_REQUESTED),
188 audio_type_(MEDIA_NO_SERVICE), 190 audio_type_(MEDIA_NO_SERVICE),
189 video_type_(MEDIA_NO_SERVICE) { 191 video_type_(MEDIA_NO_SERVICE) {
190 } 192 }
191 193
192 ~DeviceRequest() {} 194 ~DeviceRequest() {}
193 195
(...skipping 13 matching lines...) Expand all
207 209
208 // Creates a MediaStreamRequest object that is used by this request when UI 210 // Creates a MediaStreamRequest object that is used by this request when UI
209 // is asked for permission and device selection. 211 // is asked for permission and device selection.
210 void CreateUIRequest(const std::string& requested_audio_device_id, 212 void CreateUIRequest(const std::string& requested_audio_device_id,
211 const std::string& requested_video_device_id) { 213 const std::string& requested_video_device_id) {
212 DCHECK(!ui_request_); 214 DCHECK(!ui_request_);
213 ui_request_.reset(new MediaStreamRequest(requesting_process_id, 215 ui_request_.reset(new MediaStreamRequest(requesting_process_id,
214 requesting_view_id, 216 requesting_view_id,
215 page_request_id, 217 page_request_id,
216 security_origin, 218 security_origin,
219 user_gesture,
217 request_type, 220 request_type,
218 requested_audio_device_id, 221 requested_audio_device_id,
219 requested_video_device_id, 222 requested_video_device_id,
220 audio_type_, 223 audio_type_,
221 video_type_)); 224 video_type_));
222 } 225 }
223 226
224 // Creates a tab capture specific MediaStreamRequest object that is used by 227 // Creates a tab capture specific MediaStreamRequest object that is used by
225 // this request when UI is asked for permission and device selection. 228 // this request when UI is asked for permission and device selection.
226 void CreateTabCatureUIRequest(int target_render_process_id, 229 void CreateTabCatureUIRequest(int target_render_process_id,
227 int target_render_view_id, 230 int target_render_view_id,
228 const std::string& tab_capture_id) { 231 const std::string& tab_capture_id) {
229 DCHECK(!ui_request_); 232 DCHECK(!ui_request_);
230 ui_request_.reset(new MediaStreamRequest(target_render_process_id, 233 ui_request_.reset(new MediaStreamRequest(target_render_process_id,
231 target_render_view_id, 234 target_render_view_id,
232 page_request_id, 235 page_request_id,
233 security_origin, 236 security_origin,
237 user_gesture,
234 request_type, 238 request_type,
235 "", 239 "",
236 "", 240 "",
237 audio_type_, 241 audio_type_,
238 video_type_)); 242 video_type_));
239 ui_request_->tab_capture_device_id = tab_capture_id; 243 ui_request_->tab_capture_device_id = tab_capture_id;
240 } 244 }
241 245
242 const MediaStreamRequest* UIRequest() const { return ui_request_.get(); } 246 const MediaStreamRequest* UIRequest() const { return ui_request_.get(); }
243 247
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 // will receive a handle to the MediaStream. This may be different from 296 // will receive a handle to the MediaStream. This may be different from
293 // MediaStreamRequest::render_view_id which in the tab capture case 297 // MediaStreamRequest::render_view_id which in the tab capture case
294 // specifies the target renderer from which audio and video is captured. 298 // specifies the target renderer from which audio and video is captured.
295 const int requesting_view_id; 299 const int requesting_view_id;
296 300
297 // An ID the render view provided to identify this request. 301 // An ID the render view provided to identify this request.
298 const int page_request_id; 302 const int page_request_id;
299 303
300 const GURL security_origin; 304 const GURL security_origin;
301 305
306 const bool user_gesture;
307
302 const MediaStreamRequestType request_type; 308 const MediaStreamRequestType request_type;
303 309
304 const StreamOptions options; 310 const StreamOptions options;
305 311
306 ResourceContext::SaltCallback salt_callback; 312 ResourceContext::SaltCallback salt_callback;
307 313
308 StreamDeviceInfoArray devices; 314 StreamDeviceInfoArray devices;
309 315
310 // Callback to the requester which audio/video devices have been selected. 316 // Callback to the requester which audio/video devices have been selected.
311 // It can be null if the requester has no interest to know the result. 317 // It can be null if the requester has no interest to know the result.
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
382 const MediaRequestResponseCallback& callback) { 388 const MediaRequestResponseCallback& callback) {
383 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 389 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
384 390
385 // TODO(perkj): The argument list with NULL parameters to DeviceRequest 391 // TODO(perkj): The argument list with NULL parameters to DeviceRequest
386 // suggests that this is the wrong design. Can this be refactored? 392 // suggests that this is the wrong design. Can this be refactored?
387 DeviceRequest* request = new DeviceRequest(NULL, 393 DeviceRequest* request = new DeviceRequest(NULL,
388 render_process_id, 394 render_process_id,
389 render_view_id, 395 render_view_id,
390 page_request_id, 396 page_request_id,
391 security_origin, 397 security_origin,
398 false, // user gesture
392 MEDIA_DEVICE_ACCESS, 399 MEDIA_DEVICE_ACCESS,
393 options, 400 options,
394 base::Bind(&ReturnEmptySalt)); 401 base::Bind(&ReturnEmptySalt));
395 402
396 const std::string& label = AddRequest(request); 403 const std::string& label = AddRequest(request);
397 404
398 request->callback = callback; 405 request->callback = callback;
399 // Post a task and handle the request asynchronously. The reason is that the 406 // Post a task and handle the request asynchronously. The reason is that the
400 // requester won't have a label for the request until this function returns 407 // requester won't have a label for the request until this function returns
401 // and thus can not handle a response. Using base::Unretained is safe since 408 // and thus can not handle a response. Using base::Unretained is safe since
402 // MediaStreamManager is deleted on the UI thread, after the IO thread has 409 // MediaStreamManager is deleted on the UI thread, after the IO thread has
403 // been stopped. 410 // been stopped.
404 BrowserThread::PostTask( 411 BrowserThread::PostTask(
405 BrowserThread::IO, FROM_HERE, 412 BrowserThread::IO, FROM_HERE,
406 base::Bind(&MediaStreamManager::SetupRequest, 413 base::Bind(&MediaStreamManager::SetupRequest,
407 base::Unretained(this), label)); 414 base::Unretained(this), label));
408 return label; 415 return label;
409 } 416 }
410 417
411 void MediaStreamManager::GenerateStream(MediaStreamRequester* requester, 418 void MediaStreamManager::GenerateStream(MediaStreamRequester* requester,
412 int render_process_id, 419 int render_process_id,
413 int render_view_id, 420 int render_view_id,
414 const ResourceContext::SaltCallback& sc, 421 const ResourceContext::SaltCallback& sc,
415 int page_request_id, 422 int page_request_id,
416 const StreamOptions& options, 423 const StreamOptions& options,
417 const GURL& security_origin) { 424 const GURL& security_origin,
425 bool user_gesture) {
418 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 426 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
419 DVLOG(1) << "GenerateStream()"; 427 DVLOG(1) << "GenerateStream()";
420 if (CommandLine::ForCurrentProcess()->HasSwitch( 428 if (CommandLine::ForCurrentProcess()->HasSwitch(
421 switches::kUseFakeUIForMediaStream)) { 429 switches::kUseFakeUIForMediaStream)) {
422 UseFakeUI(scoped_ptr<FakeMediaStreamUIProxy>()); 430 UseFakeUI(scoped_ptr<FakeMediaStreamUIProxy>());
423 } 431 }
424 432
425 DeviceRequest* request = new DeviceRequest(requester, 433 DeviceRequest* request = new DeviceRequest(requester,
426 render_process_id, 434 render_process_id,
427 render_view_id, 435 render_view_id,
428 page_request_id, 436 page_request_id,
429 security_origin, 437 security_origin,
438 user_gesture,
430 MEDIA_GENERATE_STREAM, 439 MEDIA_GENERATE_STREAM,
431 options, 440 options,
432 sc); 441 sc);
433 442
434 const std::string& label = AddRequest(request); 443 const std::string& label = AddRequest(request);
435 444
436 // Post a task and handle the request asynchronously. The reason is that the 445 // Post a task and handle the request asynchronously. The reason is that the
437 // requester won't have a label for the request until this function returns 446 // requester won't have a label for the request until this function returns
438 // and thus can not handle a response. Using base::Unretained is safe since 447 // and thus can not handle a response. Using base::Unretained is safe since
439 // MediaStreamManager is deleted on the UI thread, after the IO thread has 448 // MediaStreamManager is deleted on the UI thread, after the IO thread has
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
612 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 621 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
613 DCHECK(requester); 622 DCHECK(requester);
614 DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE || 623 DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE ||
615 type == MEDIA_DEVICE_VIDEO_CAPTURE); 624 type == MEDIA_DEVICE_VIDEO_CAPTURE);
616 625
617 DeviceRequest* request = new DeviceRequest(requester, 626 DeviceRequest* request = new DeviceRequest(requester,
618 render_process_id, 627 render_process_id,
619 render_view_id, 628 render_view_id,
620 page_request_id, 629 page_request_id,
621 security_origin, 630 security_origin,
631 false, // user gesture
622 MEDIA_ENUMERATE_DEVICES, 632 MEDIA_ENUMERATE_DEVICES,
623 StreamOptions(), 633 StreamOptions(),
624 sc); 634 sc);
625 if (IsAudioMediaType(type)) 635 if (IsAudioMediaType(type))
626 request->SetAudioType(type); 636 request->SetAudioType(type);
627 else if (IsVideoMediaType(type)) 637 else if (IsVideoMediaType(type))
628 request->SetVideoType(type); 638 request->SetVideoType(type);
629 639
630 const std::string& label = AddRequest(request); 640 const std::string& label = AddRequest(request);
631 // Post a task and handle the request asynchronously. The reason is that the 641 // Post a task and handle the request asynchronously. The reason is that the
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
691 options.mandatory_video.push_back( 701 options.mandatory_video.push_back(
692 StreamOptions::Constraint(kMediaStreamSourceInfoId, device_id)); 702 StreamOptions::Constraint(kMediaStreamSourceInfoId, device_id));
693 } else { 703 } else {
694 NOTREACHED(); 704 NOTREACHED();
695 } 705 }
696 DeviceRequest* request = new DeviceRequest(requester, 706 DeviceRequest* request = new DeviceRequest(requester,
697 render_process_id, 707 render_process_id,
698 render_view_id, 708 render_view_id,
699 page_request_id, 709 page_request_id,
700 security_origin, 710 security_origin,
711 false, // user gesture
701 MEDIA_OPEN_DEVICE, 712 MEDIA_OPEN_DEVICE,
702 options, 713 options,
703 sc); 714 sc);
704 715
705 const std::string& label = AddRequest(request); 716 const std::string& label = AddRequest(request);
706 // Post a task and handle the request asynchronously. The reason is that the 717 // Post a task and handle the request asynchronously. The reason is that the
707 // requester won't have a label for the request until this function returns 718 // requester won't have a label for the request until this function returns
708 // and thus can not handle a response. Using base::Unretained is safe since 719 // and thus can not handle a response. Using base::Unretained is safe since
709 // MediaStreamManager is deleted on the UI thread, after the IO thread has 720 // MediaStreamManager is deleted on the UI thread, after the IO thread has
710 // been stopped. 721 // been stopped.
(...skipping 1170 matching lines...) Expand 10 before | Expand all | Expand 10 after
1881 if (it->device.type == MEDIA_DESKTOP_VIDEO_CAPTURE) { 1892 if (it->device.type == MEDIA_DESKTOP_VIDEO_CAPTURE) {
1882 video_capture_manager_->SetDesktopCaptureWindowId(it->session_id, 1893 video_capture_manager_->SetDesktopCaptureWindowId(it->session_id,
1883 window_id); 1894 window_id);
1884 break; 1895 break;
1885 } 1896 }
1886 } 1897 }
1887 } 1898 }
1888 } 1899 }
1889 1900
1890 } // namespace content 1901 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698