Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 "chrome/browser/media/media_capture_devices_dispatcher.h" | 5 #include "chrome/browser/media/media_capture_devices_dispatcher.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/prefs/pref_service.h" | 9 #include "base/prefs/pref_service.h" |
| 10 #include "base/prefs/scoped_user_pref_update.h" | 10 #include "base/prefs/scoped_user_pref_update.h" |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 98 const std::string hexencoded_origin_hash = | 98 const std::string hexencoded_origin_hash = |
| 99 base::HexEncode(origin_hash.data(), origin_hash.length()); | 99 base::HexEncode(origin_hash.data(), origin_hash.length()); |
| 100 return | 100 return |
| 101 hexencoded_origin_hash == "3C2705BC432E7C51CA8553FDC5BEE873FF2468EE" || | 101 hexencoded_origin_hash == "3C2705BC432E7C51CA8553FDC5BEE873FF2468EE" || |
| 102 hexencoded_origin_hash == "50F02B8A668CAB274527D58356F07C2143080FCC"; | 102 hexencoded_origin_hash == "50F02B8A668CAB274527D58356F07C2143080FCC"; |
| 103 #else | 103 #else |
| 104 return false; | 104 return false; |
| 105 #endif | 105 #endif |
| 106 } | 106 } |
| 107 | 107 |
| 108 #if defined(OS_CHROMEOS) | |
| 109 // Returns true of the security origin is associated with casting. | |
| 110 bool IsOriginForCasting(const GURL& origin) { | |
| 111 #if defined(OFFICIAL_BUILD) | |
| 112 // Whitelisted tab casting extensions. | |
| 113 if (origin.spec() == "chrome-extension://pkedcjkdefgpdelpbcmbmeomcjbeemfm/" || | |
| 114 origin.spec() == "chrome-extension://fmfcbgogabcbclcofgocippekhfcmgfj/" || | |
| 115 origin.spec() == "chrome-extension://hfaagokkkhdbgiakmmlclaapfelnkoah/") { | |
| 116 return true; | |
| 117 } | |
| 118 // Check against hashed origins. | |
| 119 const std::string origin_hash = base::SHA1HashString(origin.spec()); | |
| 120 DCHECK_EQ(origin_hash.length(), base::kSHA1Length); | |
| 121 const std::string hexencoded_origin_hash = | |
| 122 base::HexEncode(origin_hash.data(), origin_hash.length()); | |
| 123 return | |
| 124 hexencoded_origin_hash == "3C2705BC432E7C51CA8553FDC5BEE873FF2468EE" || | |
|
Sergey Ulanov
2014/01/17 18:39:32
These do not need to be hashed anymore.
hshi1
2014/01/17 19:31:28
Done (removed hash for public release ID; left a T
| |
| 125 hexencoded_origin_hash == "50F02B8A668CAB274527D58356F07C2143080FCC"; | |
| 126 #else | |
| 127 return false; | |
| 128 #endif | |
| 129 } | |
| 130 #endif | |
| 131 | |
| 108 // Helper to get title of the calling application shown in the screen capture | 132 // Helper to get title of the calling application shown in the screen capture |
| 109 // notification. | 133 // notification. |
| 110 base::string16 GetApplicationTitle(content::WebContents* web_contents, | 134 base::string16 GetApplicationTitle(content::WebContents* web_contents, |
| 111 const extensions::Extension* extension) { | 135 const extensions::Extension* extension) { |
| 112 // Use extension name as title for extensions and origin for drive-by web. | 136 // Use extension name as title for extensions and origin for drive-by web. |
| 113 std::string title; | 137 std::string title; |
| 114 if (extension) { | 138 if (extension) { |
| 115 title = extension->name(); | 139 title = extension->name(); |
| 116 } else { | 140 } else { |
| 117 title = web_contents->GetURL().GetOrigin().spec(); | 141 title = web_contents->GetURL().GetOrigin().spec(); |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 388 #endif // !defined(OS_CHROMEOS) | 412 #endif // !defined(OS_CHROMEOS) |
| 389 | 413 |
| 390 bool capture_audio = | 414 bool capture_audio = |
| 391 (request.audio_type == content::MEDIA_LOOPBACK_AUDIO_CAPTURE && | 415 (request.audio_type == content::MEDIA_LOOPBACK_AUDIO_CAPTURE && |
| 392 loopback_audio_supported); | 416 loopback_audio_supported); |
| 393 | 417 |
| 394 // Unless we're being invoked from a component extension, register to | 418 // Unless we're being invoked from a component extension, register to |
| 395 // display the notification for stream capture. | 419 // display the notification for stream capture. |
| 396 bool display_notification = !component_extension; | 420 bool display_notification = !component_extension; |
| 397 | 421 |
| 398 ui = GetDevicesForDesktopCapture(devices, screen_id, capture_audio, | 422 ui = GetDevicesForDesktopCapture(devices, screen_id, capture_audio, |
| 399 display_notification, application_title); | 423 display_notification, application_title); |
| 400 } | 424 } |
| 401 } | 425 } |
| 402 | 426 |
| 403 callback.Run(devices, ui.Pass()); | 427 callback.Run(devices, ui.Pass()); |
| 404 } | 428 } |
| 405 | 429 |
| 406 void MediaCaptureDevicesDispatcher::ProcessTabCaptureAccessRequest( | 430 void MediaCaptureDevicesDispatcher::ProcessTabCaptureAccessRequest( |
| 407 content::WebContents* web_contents, | 431 content::WebContents* web_contents, |
| 408 const content::MediaStreamRequest& request, | 432 const content::MediaStreamRequest& request, |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 650 BrowserThread::PostTask( | 674 BrowserThread::PostTask( |
| 651 BrowserThread::UI, FROM_HERE, | 675 BrowserThread::UI, FROM_HERE, |
| 652 base::Bind(&MediaCaptureDevicesDispatcher::UpdateVideoDevicesOnUIThread, | 676 base::Bind(&MediaCaptureDevicesDispatcher::UpdateVideoDevicesOnUIThread, |
| 653 base::Unretained(this), devices)); | 677 base::Unretained(this), devices)); |
| 654 } | 678 } |
| 655 | 679 |
| 656 void MediaCaptureDevicesDispatcher::OnMediaRequestStateChanged( | 680 void MediaCaptureDevicesDispatcher::OnMediaRequestStateChanged( |
| 657 int render_process_id, | 681 int render_process_id, |
| 658 int render_view_id, | 682 int render_view_id, |
| 659 int page_request_id, | 683 int page_request_id, |
| 684 const GURL& security_origin, | |
| 660 const content::MediaStreamDevice& device, | 685 const content::MediaStreamDevice& device, |
| 661 content::MediaRequestState state) { | 686 content::MediaRequestState state) { |
| 662 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 687 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 663 BrowserThread::PostTask( | 688 BrowserThread::PostTask( |
| 664 BrowserThread::UI, FROM_HERE, | 689 BrowserThread::UI, FROM_HERE, |
| 665 base::Bind( | 690 base::Bind( |
| 666 &MediaCaptureDevicesDispatcher::UpdateMediaRequestStateOnUIThread, | 691 &MediaCaptureDevicesDispatcher::UpdateMediaRequestStateOnUIThread, |
| 667 base::Unretained(this), render_process_id, render_view_id, | 692 base::Unretained(this), render_process_id, render_view_id, |
| 668 page_request_id, device, state)); | 693 page_request_id, security_origin, device, state)); |
| 669 } | 694 } |
| 670 | 695 |
| 671 void MediaCaptureDevicesDispatcher::OnAudioStreamPlayingChanged( | 696 void MediaCaptureDevicesDispatcher::OnAudioStreamPlayingChanged( |
| 672 int render_process_id, int render_view_id, int stream_id, | 697 int render_process_id, int render_view_id, int stream_id, |
| 673 bool is_playing, float power_dbfs, bool clipped) { | 698 bool is_playing, float power_dbfs, bool clipped) { |
| 674 audio_stream_indicator_->UpdateWebContentsStatus( | 699 audio_stream_indicator_->UpdateWebContentsStatus( |
| 675 render_process_id, render_view_id, stream_id, | 700 render_process_id, render_view_id, stream_id, |
| 676 is_playing, power_dbfs, clipped); | 701 is_playing, power_dbfs, clipped); |
| 677 } | 702 } |
| 678 | 703 |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 702 devices_enumerated_ = true; | 727 devices_enumerated_ = true; |
| 703 video_devices_ = devices; | 728 video_devices_ = devices; |
| 704 FOR_EACH_OBSERVER(Observer, observers_, | 729 FOR_EACH_OBSERVER(Observer, observers_, |
| 705 OnUpdateVideoDevices(video_devices_)); | 730 OnUpdateVideoDevices(video_devices_)); |
| 706 } | 731 } |
| 707 | 732 |
| 708 void MediaCaptureDevicesDispatcher::UpdateMediaRequestStateOnUIThread( | 733 void MediaCaptureDevicesDispatcher::UpdateMediaRequestStateOnUIThread( |
| 709 int render_process_id, | 734 int render_process_id, |
| 710 int render_view_id, | 735 int render_view_id, |
| 711 int page_request_id, | 736 int page_request_id, |
| 737 const GURL& security_origin, | |
| 712 const content::MediaStreamDevice& device, | 738 const content::MediaStreamDevice& device, |
| 713 content::MediaRequestState state) { | 739 content::MediaRequestState state) { |
| 714 // Track desktop capture sessions. Tracking is necessary to avoid unbalanced | 740 // Track desktop capture sessions. Tracking is necessary to avoid unbalanced |
| 715 // session counts since not all requests will reach MEDIA_REQUEST_STATE_DONE, | 741 // session counts since not all requests will reach MEDIA_REQUEST_STATE_DONE, |
| 716 // but they will all reach MEDIA_REQUEST_STATE_CLOSING. | 742 // but they will all reach MEDIA_REQUEST_STATE_CLOSING. |
| 717 if (device.type == content::MEDIA_DESKTOP_VIDEO_CAPTURE) { | 743 if (device.type == content::MEDIA_DESKTOP_VIDEO_CAPTURE) { |
| 718 if (state == content::MEDIA_REQUEST_STATE_DONE) { | 744 if (state == content::MEDIA_REQUEST_STATE_DONE) { |
| 719 DesktopCaptureSession session = { render_process_id, render_view_id, | 745 DesktopCaptureSession session = { render_process_id, render_view_id, |
| 720 page_request_id }; | 746 page_request_id }; |
| 721 desktop_capture_sessions_.push_back(session); | 747 desktop_capture_sessions_.push_back(session); |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 748 queue.erase(it); | 774 queue.erase(it); |
| 749 found = true; | 775 found = true; |
| 750 break; | 776 break; |
| 751 } | 777 } |
| 752 } | 778 } |
| 753 if (found) | 779 if (found) |
| 754 break; | 780 break; |
| 755 } | 781 } |
| 756 } | 782 } |
| 757 | 783 |
| 784 #if defined(OS_CHROMEOS) | |
| 785 if (IsOriginForCasting(security_origin) && IsVideoMediaType(device.type)) { | |
| 786 // Notify ash that casting state has changed. | |
| 787 if (state == content::MEDIA_REQUEST_STATE_DONE) { | |
| 788 ash::Shell::GetInstance()->OnCastingStateChanged(true); | |
| 789 } else if (state == content::MEDIA_REQUEST_STATE_CLOSING) { | |
| 790 ash::Shell::GetInstance()->OnCastingStateChanged(false); | |
| 791 } | |
| 792 } | |
| 793 #endif | |
| 794 | |
| 758 FOR_EACH_OBSERVER(Observer, observers_, | 795 FOR_EACH_OBSERVER(Observer, observers_, |
| 759 OnRequestUpdate(render_process_id, | 796 OnRequestUpdate(render_process_id, |
| 760 render_view_id, | 797 render_view_id, |
| 761 device, | 798 device, |
| 762 state)); | 799 state)); |
| 763 } | 800 } |
| 764 | 801 |
| 765 void MediaCaptureDevicesDispatcher::OnCreatingAudioStreamOnUIThread( | 802 void MediaCaptureDevicesDispatcher::OnCreatingAudioStreamOnUIThread( |
| 766 int render_process_id, | 803 int render_process_id, |
| 767 int render_view_id) { | 804 int render_view_id) { |
| 768 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 805 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 769 FOR_EACH_OBSERVER(Observer, observers_, | 806 FOR_EACH_OBSERVER(Observer, observers_, |
| 770 OnCreatingAudioStream(render_process_id, render_view_id)); | 807 OnCreatingAudioStream(render_process_id, render_view_id)); |
| 771 } | 808 } |
| 772 | 809 |
| 773 bool MediaCaptureDevicesDispatcher::IsDesktopCaptureInProgress() { | 810 bool MediaCaptureDevicesDispatcher::IsDesktopCaptureInProgress() { |
| 774 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 811 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 775 return desktop_capture_sessions_.size() > 0; | 812 return desktop_capture_sessions_.size() > 0; |
| 776 } | 813 } |
| OLD | NEW |