| 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 "content/renderer/media/user_media_client_impl.h" | 5 #include "content/renderer/media/user_media_client_impl.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/hash.h" | 9 #include "base/hash.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 492 DVLOG(1) << "UserMediaClientImpl::OnStreamGenerationFailed(" | 492 DVLOG(1) << "UserMediaClientImpl::OnStreamGenerationFailed(" |
| 493 << request_id << ")"; | 493 << request_id << ")"; |
| 494 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); | 494 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); |
| 495 if (!request_info) { | 495 if (!request_info) { |
| 496 // This can happen if the request is canceled or the frame reloads while | 496 // This can happen if the request is canceled or the frame reloads while |
| 497 // MediaStreamDispatcher is processing the request. | 497 // MediaStreamDispatcher is processing the request. |
| 498 DVLOG(1) << "Request ID not found"; | 498 DVLOG(1) << "Request ID not found"; |
| 499 return; | 499 return; |
| 500 } | 500 } |
| 501 | 501 |
| 502 GetUserMediaRequestFailed(&request_info->request, result, ""); | 502 GetUserMediaRequestFailed(request_info->request, result, ""); |
| 503 DeleteUserMediaRequestInfo(request_info); | 503 DeleteUserMediaRequestInfo(request_info); |
| 504 } | 504 } |
| 505 | 505 |
| 506 // Callback from MediaStreamDispatcher. | 506 // Callback from MediaStreamDispatcher. |
| 507 // The browser process has stopped a device used by a MediaStream. | 507 // The browser process has stopped a device used by a MediaStream. |
| 508 void UserMediaClientImpl::OnDeviceStopped( | 508 void UserMediaClientImpl::OnDeviceStopped( |
| 509 const std::string& label, | 509 const std::string& label, |
| 510 const StreamDeviceInfo& device_info) { | 510 const StreamDeviceInfo& device_info) { |
| 511 DCHECK(CalledOnValidThread()); | 511 DCHECK(CalledOnValidThread()); |
| 512 DVLOG(1) << "UserMediaClientImpl::OnDeviceStopped(" | 512 DVLOG(1) << "UserMediaClientImpl::OnDeviceStopped(" |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 647 } | 647 } |
| 648 | 648 |
| 649 void UserMediaClientImpl::OnCreateNativeTracksCompleted( | 649 void UserMediaClientImpl::OnCreateNativeTracksCompleted( |
| 650 UserMediaRequestInfo* request, | 650 UserMediaRequestInfo* request, |
| 651 MediaStreamRequestResult result, | 651 MediaStreamRequestResult result, |
| 652 const blink::WebString& result_name) { | 652 const blink::WebString& result_name) { |
| 653 DVLOG(1) << "UserMediaClientImpl::OnCreateNativeTracksComplete(" | 653 DVLOG(1) << "UserMediaClientImpl::OnCreateNativeTracksComplete(" |
| 654 << "{request_id = " << request->request_id << "} " | 654 << "{request_id = " << request->request_id << "} " |
| 655 << "{result = " << result << "})"; | 655 << "{result = " << result << "})"; |
| 656 | 656 |
| 657 // Completing the request can lead to that blink call | 657 if (result == content::MEDIA_DEVICE_OK) |
| 658 // cancelUserMediaRequest with the blink request and the UserMediaClientImpl | 658 GetUserMediaRequestSucceeded(request->web_stream, request->request); |
| 659 // is destroyed. Therefore, we copy (blink objects are smart pointers) the | 659 else |
| 660 // following objects and delete |request| before completing the blink request. | 660 GetUserMediaRequestFailed(request->request, result, result_name); |
| 661 blink::WebMediaStream stream = request->web_stream; | 661 |
| 662 blink::WebUserMediaRequest blink_request = request->request; | |
| 663 blink::WebString result_name_copy = result_name; | |
| 664 DeleteUserMediaRequestInfo(request); | 662 DeleteUserMediaRequestInfo(request); |
| 665 | |
| 666 if (result == content::MEDIA_DEVICE_OK) | |
| 667 GetUserMediaRequestSucceeded(stream, &blink_request); | |
| 668 else | |
| 669 GetUserMediaRequestFailed(&blink_request, result, result_name_copy); | |
| 670 } | 663 } |
| 671 | 664 |
| 672 void UserMediaClientImpl::OnDevicesEnumerated( | 665 void UserMediaClientImpl::OnDevicesEnumerated( |
| 673 int request_id, | 666 int request_id, |
| 674 const StreamDeviceInfoArray& device_array) { | 667 const StreamDeviceInfoArray& device_array) { |
| 675 DVLOG(1) << "UserMediaClientImpl::OnDevicesEnumerated(" << request_id << ")"; | 668 DVLOG(1) << "UserMediaClientImpl::OnDevicesEnumerated(" << request_id << ")"; |
| 676 | 669 |
| 677 MediaDevicesRequestInfo* request = FindMediaDevicesRequestInfo(request_id); | 670 MediaDevicesRequestInfo* request = FindMediaDevicesRequestInfo(request_id); |
| 678 DCHECK(request); | 671 DCHECK(request); |
| 679 | 672 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 717 } | 710 } |
| 718 | 711 |
| 719 void UserMediaClientImpl::OnDeviceOpenFailed(int request_id) { | 712 void UserMediaClientImpl::OnDeviceOpenFailed(int request_id) { |
| 720 DVLOG(1) << "UserMediaClientImpl::VideoDeviceOpenFailed(" | 713 DVLOG(1) << "UserMediaClientImpl::VideoDeviceOpenFailed(" |
| 721 << request_id << ")"; | 714 << request_id << ")"; |
| 722 NOTIMPLEMENTED(); | 715 NOTIMPLEMENTED(); |
| 723 } | 716 } |
| 724 | 717 |
| 725 void UserMediaClientImpl::GetUserMediaRequestSucceeded( | 718 void UserMediaClientImpl::GetUserMediaRequestSucceeded( |
| 726 const blink::WebMediaStream& stream, | 719 const blink::WebMediaStream& stream, |
| 727 blink::WebUserMediaRequest* request_info) { | 720 blink::WebUserMediaRequest request_info) { |
| 728 DVLOG(1) << "UserMediaClientImpl::GetUserMediaRequestSucceeded"; | 721 // Completing the getUserMedia request can lead to that the RenderFrame and |
| 722 // the UserMediaClientImpl is destroyed if the JavaScript code request the |
| 723 // frame to be destroyed within the scope of the callback. Therefore, |
| 724 // post a task to complete the request with a clean stack. |
| 725 base::MessageLoop::current()->PostTask( |
| 726 FROM_HERE, |
| 727 base::Bind(&UserMediaClientImpl::DelayedGetUserMediaRequestSucceeded, |
| 728 weak_factory_.GetWeakPtr(), stream, request_info)); |
| 729 } |
| 730 |
| 731 void UserMediaClientImpl::DelayedGetUserMediaRequestSucceeded( |
| 732 const blink::WebMediaStream& stream, |
| 733 blink::WebUserMediaRequest request_info) { |
| 734 DVLOG(1) << "UserMediaClientImpl::DelayedGetUserMediaRequestSucceeded"; |
| 729 LogUserMediaRequestResult(MEDIA_DEVICE_OK); | 735 LogUserMediaRequestResult(MEDIA_DEVICE_OK); |
| 730 request_info->requestSucceeded(stream); | 736 request_info.requestSucceeded(stream); |
| 731 } | 737 } |
| 732 | 738 |
| 733 void UserMediaClientImpl::GetUserMediaRequestFailed( | 739 void UserMediaClientImpl::GetUserMediaRequestFailed( |
| 734 blink::WebUserMediaRequest* request_info, | 740 blink::WebUserMediaRequest request_info, |
| 741 MediaStreamRequestResult result, |
| 742 const blink::WebString& result_name) { |
| 743 // Completing the getUserMedia request can lead to that the RenderFrame and |
| 744 // the UserMediaClientImpl is destroyed if the JavaScript code request the |
| 745 // frame to be destroyed within the scope of the callback. Therefore, |
| 746 // post a task to complete the request with a clean stack. |
| 747 base::MessageLoop::current()->PostTask( |
| 748 FROM_HERE, |
| 749 base::Bind(&UserMediaClientImpl::DelayedGetUserMediaRequestFailed, |
| 750 weak_factory_.GetWeakPtr(), request_info, result, |
| 751 result_name)); |
| 752 } |
| 753 |
| 754 void UserMediaClientImpl::DelayedGetUserMediaRequestFailed( |
| 755 blink::WebUserMediaRequest request_info, |
| 735 MediaStreamRequestResult result, | 756 MediaStreamRequestResult result, |
| 736 const blink::WebString& result_name) { | 757 const blink::WebString& result_name) { |
| 737 LogUserMediaRequestResult(result); | 758 LogUserMediaRequestResult(result); |
| 738 switch (result) { | 759 switch (result) { |
| 739 case MEDIA_DEVICE_OK: | 760 case MEDIA_DEVICE_OK: |
| 740 case NUM_MEDIA_REQUEST_RESULTS: | 761 case NUM_MEDIA_REQUEST_RESULTS: |
| 741 NOTREACHED(); | 762 NOTREACHED(); |
| 742 return; | 763 return; |
| 743 case MEDIA_DEVICE_PERMISSION_DENIED: | 764 case MEDIA_DEVICE_PERMISSION_DENIED: |
| 744 request_info->requestDenied(); | 765 request_info.requestDenied(); |
| 745 return; | 766 return; |
| 746 case MEDIA_DEVICE_PERMISSION_DISMISSED: | 767 case MEDIA_DEVICE_PERMISSION_DISMISSED: |
| 747 request_info->requestFailedUASpecific("PermissionDismissedError"); | 768 request_info.requestFailedUASpecific("PermissionDismissedError"); |
| 748 return; | 769 return; |
| 749 case MEDIA_DEVICE_INVALID_STATE: | 770 case MEDIA_DEVICE_INVALID_STATE: |
| 750 request_info->requestFailedUASpecific("InvalidStateError"); | 771 request_info.requestFailedUASpecific("InvalidStateError"); |
| 751 return; | 772 return; |
| 752 case MEDIA_DEVICE_NO_HARDWARE: | 773 case MEDIA_DEVICE_NO_HARDWARE: |
| 753 request_info->requestFailedUASpecific("DevicesNotFoundError"); | 774 request_info.requestFailedUASpecific("DevicesNotFoundError"); |
| 754 return; | 775 return; |
| 755 case MEDIA_DEVICE_INVALID_SECURITY_ORIGIN: | 776 case MEDIA_DEVICE_INVALID_SECURITY_ORIGIN: |
| 756 request_info->requestFailedUASpecific("InvalidSecurityOriginError"); | 777 request_info.requestFailedUASpecific("InvalidSecurityOriginError"); |
| 757 return; | 778 return; |
| 758 case MEDIA_DEVICE_TAB_CAPTURE_FAILURE: | 779 case MEDIA_DEVICE_TAB_CAPTURE_FAILURE: |
| 759 request_info->requestFailedUASpecific("TabCaptureError"); | 780 request_info.requestFailedUASpecific("TabCaptureError"); |
| 760 return; | 781 return; |
| 761 case MEDIA_DEVICE_SCREEN_CAPTURE_FAILURE: | 782 case MEDIA_DEVICE_SCREEN_CAPTURE_FAILURE: |
| 762 request_info->requestFailedUASpecific("ScreenCaptureError"); | 783 request_info.requestFailedUASpecific("ScreenCaptureError"); |
| 763 return; | 784 return; |
| 764 case MEDIA_DEVICE_CAPTURE_FAILURE: | 785 case MEDIA_DEVICE_CAPTURE_FAILURE: |
| 765 request_info->requestFailedUASpecific("DeviceCaptureError"); | 786 request_info.requestFailedUASpecific("DeviceCaptureError"); |
| 766 return; | 787 return; |
| 767 case MEDIA_DEVICE_CONSTRAINT_NOT_SATISFIED: | 788 case MEDIA_DEVICE_CONSTRAINT_NOT_SATISFIED: |
| 768 request_info->requestFailedConstraint(result_name); | 789 request_info.requestFailedConstraint(result_name); |
| 769 return; | 790 return; |
| 770 case MEDIA_DEVICE_TRACK_START_FAILURE: | 791 case MEDIA_DEVICE_TRACK_START_FAILURE: |
| 771 request_info->requestFailedUASpecific("TrackStartError"); | 792 request_info.requestFailedUASpecific("TrackStartError"); |
| 772 return; | 793 return; |
| 773 case MEDIA_DEVICE_NOT_SUPPORTED: | 794 case MEDIA_DEVICE_NOT_SUPPORTED: |
| 774 request_info->requestFailedUASpecific("MediaDeviceNotSupported"); | 795 request_info.requestFailedUASpecific("MediaDeviceNotSupported"); |
| 775 return; | 796 return; |
| 776 case MEDIA_DEVICE_FAILED_DUE_TO_SHUTDOWN: | 797 case MEDIA_DEVICE_FAILED_DUE_TO_SHUTDOWN: |
| 777 request_info->requestFailedUASpecific("MediaDeviceFailedDueToShutdown"); | 798 request_info.requestFailedUASpecific("MediaDeviceFailedDueToShutdown"); |
| 778 return; | 799 return; |
| 779 } | 800 } |
| 780 NOTREACHED(); | 801 NOTREACHED(); |
| 781 request_info->requestFailed(); | 802 request_info.requestFailed(); |
| 782 } | 803 } |
| 783 | 804 |
| 784 void UserMediaClientImpl::EnumerateDevicesSucceded( | 805 void UserMediaClientImpl::EnumerateDevicesSucceded( |
| 785 blink::WebMediaDevicesRequest* request, | 806 blink::WebMediaDevicesRequest* request, |
| 786 blink::WebVector<blink::WebMediaDeviceInfo>& devices) { | 807 blink::WebVector<blink::WebMediaDeviceInfo>& devices) { |
| 787 request->requestSucceeded(devices); | 808 request->requestSucceeded(devices); |
| 788 } | 809 } |
| 789 | 810 |
| 790 void UserMediaClientImpl::EnumerateSourcesSucceded( | 811 void UserMediaClientImpl::EnumerateSourcesSucceded( |
| 791 blink::WebMediaStreamTrackSourcesRequest* request, | 812 blink::WebMediaStreamTrackSourcesRequest* request, |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1064 return; | 1085 return; |
| 1065 } | 1086 } |
| 1066 } | 1087 } |
| 1067 } | 1088 } |
| 1068 | 1089 |
| 1069 bool UserMediaClientImpl::UserMediaRequestInfo::HasPendingSources() const { | 1090 bool UserMediaClientImpl::UserMediaRequestInfo::HasPendingSources() const { |
| 1070 return !sources_waiting_for_callback_.empty(); | 1091 return !sources_waiting_for_callback_.empty(); |
| 1071 } | 1092 } |
| 1072 | 1093 |
| 1073 } // namespace content | 1094 } // namespace content |
| OLD | NEW |