| 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/pepper_plugin_delegate_impl.h" | 5 #include "content/renderer/pepper_plugin_delegate_impl.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 #include <map> |
| 8 #include <queue> | 9 #include <queue> |
| 9 | 10 |
| 10 #include "base/bind.h" | 11 #include "base/bind.h" |
| 11 #include "base/callback.h" | 12 #include "base/callback.h" |
| 12 #include "base/command_line.h" | 13 #include "base/command_line.h" |
| 13 #include "base/file_path.h" | 14 #include "base/file_path.h" |
| 14 #include "base/file_util_proxy.h" | 15 #include "base/file_util_proxy.h" |
| 15 #include "base/logging.h" | 16 #include "base/logging.h" |
| 16 #include "base/memory/scoped_ptr.h" | |
| 17 #include "base/memory/weak_ptr.h" | |
| 18 #include "base/string_split.h" | 17 #include "base/string_split.h" |
| 19 #include "base/sync_socket.h" | 18 #include "base/sync_socket.h" |
| 20 #include "base/time.h" | 19 #include "base/time.h" |
| 21 #include "content/common/child_process.h" | 20 #include "content/common/child_process.h" |
| 22 #include "content/common/child_process_messages.h" | 21 #include "content/common/child_process_messages.h" |
| 23 #include "content/common/child_thread.h" | 22 #include "content/common/child_thread.h" |
| 24 #include "content/common/file_system/file_system_dispatcher.h" | 23 #include "content/common/file_system/file_system_dispatcher.h" |
| 25 #include "content/common/file_system_messages.h" | 24 #include "content/common/file_system_messages.h" |
| 26 #include "content/common/media/audio_messages.h" | 25 #include "content/common/media/audio_messages.h" |
| 27 #include "content/common/pepper_file_messages.h" | 26 #include "content/common/pepper_file_messages.h" |
| 28 #include "content/common/pepper_plugin_registry.h" | 27 #include "content/common/pepper_plugin_registry.h" |
| 29 #include "content/common/pepper_messages.h" | 28 #include "content/common/pepper_messages.h" |
| 30 #include "content/common/quota_dispatcher.h" | 29 #include "content/common/quota_dispatcher.h" |
| 31 #include "content/common/view_messages.h" | 30 #include "content/common/view_messages.h" |
| 32 #include "content/public/common/content_switches.h" | 31 #include "content/public/common/content_switches.h" |
| 33 #include "content/public/renderer/content_renderer_client.h" | 32 #include "content/public/renderer/content_renderer_client.h" |
| 34 #include "content/renderer/gamepad_shared_memory_reader.h" | 33 #include "content/renderer/gamepad_shared_memory_reader.h" |
| 35 #include "content/renderer/gpu/command_buffer_proxy.h" | 34 #include "content/renderer/gpu/command_buffer_proxy.h" |
| 36 #include "content/renderer/gpu/gpu_channel_host.h" | 35 #include "content/renderer/gpu/gpu_channel_host.h" |
| 37 #include "content/renderer/gpu/renderer_gl_context.h" | 36 #include "content/renderer/gpu/renderer_gl_context.h" |
| 38 #include "content/renderer/gpu/webgraphicscontext3d_command_buffer_impl.h" | 37 #include "content/renderer/gpu/webgraphicscontext3d_command_buffer_impl.h" |
| 39 #include "content/renderer/media/audio_input_message_filter.h" | 38 #include "content/renderer/media/audio_input_message_filter.h" |
| 40 #include "content/renderer/media/audio_message_filter.h" | 39 #include "content/renderer/media/audio_message_filter.h" |
| 40 #include "content/renderer/media/media_stream_dispatcher.h" |
| 41 #include "content/renderer/media/media_stream_dispatcher_eventhandler.h" |
| 41 #include "content/renderer/media/video_capture_impl_manager.h" | 42 #include "content/renderer/media/video_capture_impl_manager.h" |
| 42 #include "content/renderer/p2p/p2p_transport_impl.h" | 43 #include "content/renderer/p2p/p2p_transport_impl.h" |
| 43 #include "content/renderer/pepper_platform_context_3d_impl.h" | 44 #include "content/renderer/pepper_platform_context_3d_impl.h" |
| 44 #include "content/renderer/pepper_platform_video_decoder_impl.h" | 45 #include "content/renderer/pepper_platform_video_decoder_impl.h" |
| 45 #include "content/renderer/render_thread_impl.h" | 46 #include "content/renderer/render_thread_impl.h" |
| 46 #include "content/renderer/render_view_impl.h" | 47 #include "content/renderer/render_view_impl.h" |
| 47 #include "content/renderer/render_widget_fullscreen_pepper.h" | 48 #include "content/renderer/render_widget_fullscreen_pepper.h" |
| 48 #include "content/renderer/webplugin_delegate_proxy.h" | 49 #include "content/renderer/webplugin_delegate_proxy.h" |
| 49 #include "ipc/ipc_channel_handle.h" | 50 #include "ipc/ipc_channel_handle.h" |
| 50 #include "media/audio/audio_manager_base.h" | 51 #include "media/audio/audio_manager_base.h" |
| 51 #include "media/video/capture/video_capture_proxy.h" | 52 #include "media/video/capture/video_capture_proxy.h" |
| 52 #include "ppapi/c/dev/pp_video_dev.h" | 53 #include "ppapi/c/dev/pp_video_dev.h" |
| 53 #include "ppapi/c/pp_errors.h" | 54 #include "ppapi/c/pp_errors.h" |
| 54 #include "ppapi/c/private/ppb_flash.h" | 55 #include "ppapi/c/private/ppb_flash.h" |
| 55 #include "ppapi/c/private/ppb_flash_net_connector.h" | 56 #include "ppapi/c/private/ppb_flash_net_connector.h" |
| 56 #include "ppapi/proxy/host_dispatcher.h" | 57 #include "ppapi/proxy/host_dispatcher.h" |
| 57 #include "ppapi/proxy/ppapi_messages.h" | 58 #include "ppapi/proxy/ppapi_messages.h" |
| 59 #include "ppapi/shared_impl/ppb_device_ref_shared.h" |
| 58 #include "ppapi/shared_impl/platform_file.h" | 60 #include "ppapi/shared_impl/platform_file.h" |
| 59 #include "ppapi/shared_impl/ppapi_preferences.h" | 61 #include "ppapi/shared_impl/ppapi_preferences.h" |
| 60 #include "third_party/WebKit/Source/WebKit/chromium/public/WebCursorInfo.h" | 62 #include "third_party/WebKit/Source/WebKit/chromium/public/WebCursorInfo.h" |
| 61 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" | 63 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" |
| 62 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFileChooserComplet
ion.h" | 64 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFileChooserComplet
ion.h" |
| 63 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFileChooserParams.
h" | 65 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFileChooserParams.
h" |
| 64 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" | 66 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
| 65 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" | 67 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" |
| 66 #include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginContainer.h" | 68 #include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginContainer.h" |
| 67 #include "third_party/WebKit/Source/WebKit/chromium/public/WebScreenInfo.h" | 69 #include "third_party/WebKit/Source/WebKit/chromium/public/WebScreenInfo.h" |
| (...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 580 NOTREACHED(); | 582 NOTREACHED(); |
| 581 } | 583 } |
| 582 virtual void DidFail(quota::QuotaStatusCode error) OVERRIDE { | 584 virtual void DidFail(quota::QuotaStatusCode error) OVERRIDE { |
| 583 callback_.Run(0); | 585 callback_.Run(0); |
| 584 } | 586 } |
| 585 private: | 587 private: |
| 586 PluginCallback callback_; | 588 PluginCallback callback_; |
| 587 }; | 589 }; |
| 588 | 590 |
| 589 class PlatformVideoCaptureImpl | 591 class PlatformVideoCaptureImpl |
| 590 : public webkit::ppapi::PluginDelegate::PlatformVideoCapture { | 592 : public webkit::ppapi::PluginDelegate::PlatformVideoCapture, |
| 593 public media::VideoCapture::EventHandler { |
| 591 public: | 594 public: |
| 592 PlatformVideoCaptureImpl(media::VideoCapture::EventHandler* handler) | 595 PlatformVideoCaptureImpl( |
| 593 : handler_proxy_(new media::VideoCaptureHandlerProxy( | 596 const base::WeakPtr<PepperPluginDelegateImpl>& plugin_delegate, |
| 594 handler, base::MessageLoopProxy::current())) { | 597 const std::string& device_id, |
| 598 webkit::ppapi::PluginDelegate::PlatformVideoCaptureEventHandler* handler); |
| 599 virtual ~PlatformVideoCaptureImpl(); |
| 600 |
| 601 // webkit::ppapi::PluginDelegate::PlatformVideoCapture implementation. |
| 602 virtual void StartCapture(EventHandler* handler, |
| 603 const VideoCaptureCapability& capability) OVERRIDE; |
| 604 virtual void StopCapture(EventHandler* handler) OVERRIDE; |
| 605 virtual void FeedBuffer(scoped_refptr<VideoFrameBuffer> buffer) OVERRIDE; |
| 606 virtual bool CaptureStarted() OVERRIDE; |
| 607 virtual int CaptureWidth() OVERRIDE; |
| 608 virtual int CaptureHeight() OVERRIDE; |
| 609 virtual int CaptureFrameRate() OVERRIDE; |
| 610 virtual void DetachEventHandler() OVERRIDE; |
| 611 |
| 612 // media::VideoCapture::EventHandler implementation |
| 613 virtual void OnStarted(VideoCapture* capture) OVERRIDE; |
| 614 virtual void OnStopped(VideoCapture* capture) OVERRIDE; |
| 615 virtual void OnPaused(VideoCapture* capture) OVERRIDE; |
| 616 virtual void OnError(VideoCapture* capture, int error_code) OVERRIDE; |
| 617 virtual void OnRemoved(VideoCapture* capture) OVERRIDE; |
| 618 virtual void OnBufferReady(VideoCapture* capture, |
| 619 scoped_refptr<VideoFrameBuffer> buffer) OVERRIDE; |
| 620 virtual void OnDeviceInfoReceived( |
| 621 VideoCapture* capture, |
| 622 const media::VideoCaptureParams& device_info) OVERRIDE; |
| 623 |
| 624 private: |
| 625 void Initialize(); |
| 626 |
| 627 void OnDeviceOpened(int request_id, |
| 628 bool succeeded, |
| 629 const std::string& label); |
| 630 |
| 631 base::WeakPtr<PepperPluginDelegateImpl> plugin_delegate_; |
| 632 |
| 633 std::string device_id_; |
| 634 std::string label_; |
| 635 int session_id_; |
| 636 |
| 637 scoped_ptr<media::VideoCaptureHandlerProxy> handler_proxy_; |
| 638 |
| 639 webkit::ppapi::PluginDelegate::PlatformVideoCaptureEventHandler* handler_; |
| 640 |
| 641 media::VideoCapture* video_capture_; |
| 642 |
| 643 // StartCapture() must be balanced by StopCapture(), otherwise this object |
| 644 // will leak. |
| 645 bool unbalanced_start_; |
| 646 }; |
| 647 |
| 648 PlatformVideoCaptureImpl::PlatformVideoCaptureImpl( |
| 649 const base::WeakPtr<PepperPluginDelegateImpl>& plugin_delegate, |
| 650 const std::string& device_id, |
| 651 webkit::ppapi::PluginDelegate::PlatformVideoCaptureEventHandler* handler) |
| 652 : plugin_delegate_(plugin_delegate), |
| 653 device_id_(device_id), |
| 654 session_id_(0), |
| 655 ALLOW_THIS_IN_INITIALIZER_LIST( |
| 656 handler_proxy_(new media::VideoCaptureHandlerProxy( |
| 657 this, base::MessageLoopProxy::current()))), |
| 658 handler_(handler), |
| 659 video_capture_(NULL), |
| 660 unbalanced_start_(false) { |
| 661 if (device_id.empty()) { |
| 662 // "1" is the session ID for the default device. |
| 663 session_id_ = 1; |
| 664 Initialize(); |
| 665 } else { |
| 666 // We need to open the device and obtain the label and session ID before |
| 667 // initializing. |
| 668 if (plugin_delegate_) { |
| 669 plugin_delegate_->OpenDevice( |
| 670 PP_DEVICETYPE_DEV_VIDEOCAPTURE, device_id, |
| 671 base::Bind(&PlatformVideoCaptureImpl::OnDeviceOpened, this)); |
| 672 } |
| 673 } |
| 674 } |
| 675 |
| 676 PlatformVideoCaptureImpl::~PlatformVideoCaptureImpl() { |
| 677 if (video_capture_) { |
| 595 VideoCaptureImplManager* manager = | 678 VideoCaptureImplManager* manager = |
| 596 RenderThreadImpl::current()->video_capture_impl_manager(); | 679 RenderThreadImpl::current()->video_capture_impl_manager(); |
| 597 // 1 means the "default" video capture device. | 680 manager->RemoveDevice(session_id_, handler_proxy_.get()); |
| 598 // TODO(piman): Add a way to enumerate devices and pass them through the | 681 } |
| 599 // API. | 682 |
| 600 video_capture_ = manager->AddDevice(1, handler_proxy_.get()); | 683 if (plugin_delegate_ && !label_.empty()) |
| 601 } | 684 plugin_delegate_->CloseDevice(label_); |
| 602 | 685 } |
| 603 // Overrides from media::VideoCapture::EventHandler | 686 |
| 604 virtual ~PlatformVideoCaptureImpl() { | 687 void PlatformVideoCaptureImpl::StartCapture( |
| 605 VideoCaptureImplManager* manager = | 688 EventHandler* handler, |
| 606 RenderThreadImpl::current()->video_capture_impl_manager(); | 689 const VideoCaptureCapability& capability) { |
| 607 manager->RemoveDevice(1, handler_proxy_.get()); | 690 DCHECK(handler == handler_); |
| 608 } | 691 |
| 609 | 692 if (unbalanced_start_) |
| 610 virtual void StartCapture( | 693 return; |
| 611 EventHandler* handler, | 694 |
| 612 const VideoCaptureCapability& capability) OVERRIDE { | 695 if (video_capture_) { |
| 613 DCHECK(handler == handler_proxy_->proxied()); | 696 unbalanced_start_ = true; |
| 697 AddRef(); // Will be balanced in OnRemoved(). |
| 614 video_capture_->StartCapture(handler_proxy_.get(), capability); | 698 video_capture_->StartCapture(handler_proxy_.get(), capability); |
| 615 } | 699 } |
| 616 | 700 } |
| 617 virtual void StopCapture(EventHandler* handler) OVERRIDE { | 701 |
| 618 DCHECK(handler == handler_proxy_->proxied()); | 702 void PlatformVideoCaptureImpl::StopCapture(EventHandler* handler) { |
| 703 DCHECK(handler == handler_); |
| 704 if (!unbalanced_start_) |
| 705 return; |
| 706 |
| 707 if (video_capture_) { |
| 708 unbalanced_start_ = false; |
| 619 video_capture_->StopCapture(handler_proxy_.get()); | 709 video_capture_->StopCapture(handler_proxy_.get()); |
| 620 } | 710 } |
| 621 | 711 } |
| 622 virtual void FeedBuffer(scoped_refptr<VideoFrameBuffer> buffer) OVERRIDE { | 712 |
| 713 void PlatformVideoCaptureImpl::FeedBuffer( |
| 714 scoped_refptr<VideoFrameBuffer> buffer) { |
| 715 if (video_capture_) |
| 623 video_capture_->FeedBuffer(buffer); | 716 video_capture_->FeedBuffer(buffer); |
| 624 } | 717 } |
| 625 | 718 |
| 626 virtual bool CaptureStarted() OVERRIDE { | 719 bool PlatformVideoCaptureImpl::CaptureStarted() { |
| 627 return handler_proxy_->state().started; | 720 return handler_proxy_->state().started; |
| 628 } | 721 } |
| 629 | 722 |
| 630 virtual int CaptureWidth() OVERRIDE { | 723 int PlatformVideoCaptureImpl::CaptureWidth() { |
| 631 return handler_proxy_->state().width; | 724 return handler_proxy_->state().width; |
| 632 } | 725 } |
| 633 | 726 |
| 634 virtual int CaptureHeight() OVERRIDE { | 727 int PlatformVideoCaptureImpl::CaptureHeight() { |
| 635 return handler_proxy_->state().height; | 728 return handler_proxy_->state().height; |
| 636 } | 729 } |
| 637 | 730 |
| 638 virtual int CaptureFrameRate() OVERRIDE { | 731 int PlatformVideoCaptureImpl::CaptureFrameRate() { |
| 639 return handler_proxy_->state().frame_rate; | 732 return handler_proxy_->state().frame_rate; |
| 640 } | 733 } |
| 641 | 734 |
| 642 private: | 735 void PlatformVideoCaptureImpl::DetachEventHandler() { |
| 643 scoped_ptr<media::VideoCaptureHandlerProxy> handler_proxy_; | 736 handler_ = NULL; |
| 644 media::VideoCapture* video_capture_; | 737 StopCapture(NULL); |
| 645 }; | 738 } |
| 739 |
| 740 void PlatformVideoCaptureImpl::OnStarted(VideoCapture* capture) { |
| 741 if (handler_) |
| 742 handler_->OnStarted(capture); |
| 743 } |
| 744 |
| 745 void PlatformVideoCaptureImpl::OnStopped(VideoCapture* capture) { |
| 746 if (handler_) |
| 747 handler_->OnStopped(capture); |
| 748 } |
| 749 |
| 750 void PlatformVideoCaptureImpl::OnPaused(VideoCapture* capture) { |
| 751 if (handler_) |
| 752 handler_->OnPaused(capture); |
| 753 } |
| 754 |
| 755 void PlatformVideoCaptureImpl::OnError(VideoCapture* capture, int error_code) { |
| 756 if (handler_) |
| 757 handler_->OnError(capture, error_code); |
| 758 } |
| 759 |
| 760 void PlatformVideoCaptureImpl::OnRemoved(VideoCapture* capture) { |
| 761 if (handler_) |
| 762 handler_->OnRemoved(capture); |
| 763 |
| 764 Release(); // Balance the AddRef() in StartCapture(). |
| 765 } |
| 766 |
| 767 void PlatformVideoCaptureImpl::OnBufferReady( |
| 768 VideoCapture* capture, |
| 769 scoped_refptr<VideoFrameBuffer> buffer) { |
| 770 if (handler_) { |
| 771 handler_->OnBufferReady(capture, buffer); |
| 772 } else { |
| 773 // Even after handler_ is detached, we have to return buffers that are in |
| 774 // flight to us. Otherwise VideoCaptureController will not tear down. |
| 775 FeedBuffer(buffer); |
| 776 } |
| 777 } |
| 778 |
| 779 void PlatformVideoCaptureImpl::OnDeviceInfoReceived( |
| 780 VideoCapture* capture, |
| 781 const media::VideoCaptureParams& device_info) { |
| 782 if (handler_) |
| 783 handler_->OnDeviceInfoReceived(capture, device_info); |
| 784 } |
| 785 |
| 786 void PlatformVideoCaptureImpl::Initialize() { |
| 787 VideoCaptureImplManager* manager = |
| 788 RenderThreadImpl::current()->video_capture_impl_manager(); |
| 789 video_capture_ = manager->AddDevice(session_id_, handler_proxy_.get()); |
| 790 } |
| 791 |
| 792 void PlatformVideoCaptureImpl::OnDeviceOpened(int request_id, |
| 793 bool succeeded, |
| 794 const std::string& label) { |
| 795 succeeded = succeeded && plugin_delegate_; |
| 796 if (succeeded) { |
| 797 label_ = label; |
| 798 session_id_ = plugin_delegate_->GetSessionID(PP_DEVICETYPE_DEV_VIDEOCAPTURE, |
| 799 label); |
| 800 Initialize(); |
| 801 } |
| 802 |
| 803 if (handler_) |
| 804 handler_->OnInitialized(this, succeeded); |
| 805 } |
| 806 |
| 807 media_stream::MediaStreamType FromPepperDeviceType(PP_DeviceType_Dev type) { |
| 808 switch (type) { |
| 809 case PP_DEVICETYPE_DEV_INVALID: |
| 810 return media_stream::kNoService; |
| 811 case PP_DEVICETYPE_DEV_AUDIOCAPTURE: |
| 812 return media_stream::kAudioCapture; |
| 813 case PP_DEVICETYPE_DEV_VIDEOCAPTURE: |
| 814 return media_stream::kVideoCapture; |
| 815 default: |
| 816 NOTREACHED(); |
| 817 return media_stream::kNoService; |
| 818 } |
| 819 } |
| 820 |
| 821 PP_DeviceType_Dev FromMediaStreamType(media_stream::MediaStreamType type) { |
| 822 switch (type) { |
| 823 case media_stream::kNoService: |
| 824 return PP_DEVICETYPE_DEV_INVALID; |
| 825 case media_stream::kAudioCapture: |
| 826 return PP_DEVICETYPE_DEV_AUDIOCAPTURE; |
| 827 case media_stream::kVideoCapture: |
| 828 return PP_DEVICETYPE_DEV_VIDEOCAPTURE; |
| 829 default: |
| 830 NOTREACHED(); |
| 831 return PP_DEVICETYPE_DEV_INVALID; |
| 832 } |
| 833 } |
| 834 |
| 835 ppapi::DeviceRefData FromStreamDeviceInfo( |
| 836 const media_stream::StreamDeviceInfo& info) { |
| 837 ppapi::DeviceRefData data; |
| 838 data.id = info.device_id; |
| 839 data.name = info.name; |
| 840 data.type = FromMediaStreamType(info.stream_type); |
| 841 return data; |
| 842 } |
| 646 | 843 |
| 647 } // namespace | 844 } // namespace |
| 648 | 845 |
| 649 BrokerDispatcherWrapper::BrokerDispatcherWrapper() { | 846 BrokerDispatcherWrapper::BrokerDispatcherWrapper() { |
| 650 } | 847 } |
| 651 | 848 |
| 652 BrokerDispatcherWrapper::~BrokerDispatcherWrapper() { | 849 BrokerDispatcherWrapper::~BrokerDispatcherWrapper() { |
| 653 } | 850 } |
| 654 | 851 |
| 655 bool BrokerDispatcherWrapper::Init( | 852 bool BrokerDispatcherWrapper::Init( |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 837 } | 1034 } |
| 838 | 1035 |
| 839 // TOOD(ddorwin): Change the IPC to asynchronous: Queue an object containing | 1036 // TOOD(ddorwin): Change the IPC to asynchronous: Queue an object containing |
| 840 // client and plugin_socket.release(), then return. | 1037 // client and plugin_socket.release(), then return. |
| 841 // That message handler will then call client->BrokerConnected() with the | 1038 // That message handler will then call client->BrokerConnected() with the |
| 842 // saved pipe handle. | 1039 // saved pipe handle. |
| 843 // Temporarily, just call back. | 1040 // Temporarily, just call back. |
| 844 client->BrokerConnected(ppapi::PlatformFileToInt(plugin_handle), result); | 1041 client->BrokerConnected(ppapi::PlatformFileToInt(plugin_handle), result); |
| 845 } | 1042 } |
| 846 | 1043 |
| 1044 class PepperPluginDelegateImpl::DeviceEnumerationEventHandler |
| 1045 : public MediaStreamDispatcherEventHandler { |
| 1046 public: |
| 1047 DeviceEnumerationEventHandler() : next_id_(1) { |
| 1048 } |
| 1049 |
| 1050 virtual ~DeviceEnumerationEventHandler() { |
| 1051 DCHECK(enumerate_callbacks_.empty()); |
| 1052 DCHECK(open_callbacks_.empty()); |
| 1053 } |
| 1054 |
| 1055 int RegisterEnumerateDevicesCallback( |
| 1056 const EnumerateDevicesCallback& callback) { |
| 1057 enumerate_callbacks_[next_id_] = callback; |
| 1058 return next_id_++; |
| 1059 } |
| 1060 |
| 1061 int RegisterOpenDeviceCallback(const OpenDeviceCallback& callback) { |
| 1062 open_callbacks_[next_id_] = callback; |
| 1063 return next_id_++; |
| 1064 } |
| 1065 |
| 1066 // MediaStreamDispatcherEventHandler implementation. |
| 1067 virtual void OnStreamGenerated( |
| 1068 int request_id, |
| 1069 const std::string& label, |
| 1070 const media_stream::StreamDeviceInfoArray& audio_device_array, |
| 1071 const media_stream::StreamDeviceInfoArray& video_device_array) OVERRIDE { |
| 1072 } |
| 1073 |
| 1074 virtual void OnStreamGenerationFailed(int request_id) OVERRIDE { |
| 1075 } |
| 1076 |
| 1077 virtual void OnVideoDeviceFailed(const std::string& label, |
| 1078 int index) OVERRIDE { |
| 1079 } |
| 1080 |
| 1081 virtual void OnAudioDeviceFailed(const std::string& label, |
| 1082 int index) OVERRIDE { |
| 1083 } |
| 1084 |
| 1085 virtual void OnDevicesEnumerated( |
| 1086 int request_id, |
| 1087 const media_stream::StreamDeviceInfoArray& device_array) OVERRIDE { |
| 1088 NotifyDevicesEnumerated(request_id, true, device_array); |
| 1089 } |
| 1090 |
| 1091 virtual void OnDevicesEnumerationFailed(int request_id) OVERRIDE { |
| 1092 NotifyDevicesEnumerated(request_id, false, |
| 1093 media_stream::StreamDeviceInfoArray()); |
| 1094 } |
| 1095 |
| 1096 virtual void OnDeviceOpened( |
| 1097 int request_id, |
| 1098 const std::string& label, |
| 1099 const media_stream::StreamDeviceInfo& device_info) OVERRIDE { |
| 1100 NotifyDeviceOpened(request_id, true, label); |
| 1101 } |
| 1102 |
| 1103 virtual void OnDeviceOpenFailed(int request_id) OVERRIDE { |
| 1104 NotifyDeviceOpened(request_id, false, ""); |
| 1105 } |
| 1106 |
| 1107 private: |
| 1108 void NotifyDevicesEnumerated( |
| 1109 int request_id, |
| 1110 bool succeeded, |
| 1111 const media_stream::StreamDeviceInfoArray& device_array) { |
| 1112 EnumerateCallbackMap::iterator iter = enumerate_callbacks_.find(request_id); |
| 1113 if (iter == enumerate_callbacks_.end()) { |
| 1114 NOTREACHED(); |
| 1115 return; |
| 1116 } |
| 1117 |
| 1118 EnumerateDevicesCallback callback = iter->second; |
| 1119 enumerate_callbacks_.erase(iter); |
| 1120 |
| 1121 std::vector<ppapi::DeviceRefData> devices; |
| 1122 if (succeeded) { |
| 1123 devices.reserve(device_array.size()); |
| 1124 for (media_stream::StreamDeviceInfoArray::const_iterator info = |
| 1125 device_array.begin(); info != device_array.end(); ++info) { |
| 1126 devices.push_back(FromStreamDeviceInfo(*info)); |
| 1127 } |
| 1128 } |
| 1129 callback.Run(request_id, succeeded, devices); |
| 1130 } |
| 1131 |
| 1132 void NotifyDeviceOpened(int request_id, |
| 1133 bool succeeded, |
| 1134 const std::string& label) { |
| 1135 OpenCallbackMap::iterator iter = open_callbacks_.find(request_id); |
| 1136 if (iter == open_callbacks_.end()) { |
| 1137 NOTREACHED(); |
| 1138 return; |
| 1139 } |
| 1140 |
| 1141 OpenDeviceCallback callback = iter->second; |
| 1142 open_callbacks_.erase(iter); |
| 1143 |
| 1144 callback.Run(request_id, succeeded, label); |
| 1145 } |
| 1146 |
| 1147 int next_id_; |
| 1148 |
| 1149 typedef std::map<int, EnumerateDevicesCallback> EnumerateCallbackMap; |
| 1150 EnumerateCallbackMap enumerate_callbacks_; |
| 1151 |
| 1152 typedef std::map<int, OpenDeviceCallback> OpenCallbackMap; |
| 1153 OpenCallbackMap open_callbacks_; |
| 1154 |
| 1155 DISALLOW_COPY_AND_ASSIGN(DeviceEnumerationEventHandler); |
| 1156 }; |
| 1157 |
| 847 PepperPluginDelegateImpl::PepperPluginDelegateImpl(RenderViewImpl* render_view) | 1158 PepperPluginDelegateImpl::PepperPluginDelegateImpl(RenderViewImpl* render_view) |
| 848 : content::RenderViewObserver(render_view), | 1159 : content::RenderViewObserver(render_view), |
| 849 render_view_(render_view), | 1160 render_view_(render_view), |
| 850 has_saved_context_menu_action_(false), | 1161 has_saved_context_menu_action_(false), |
| 851 saved_context_menu_action_(0), | 1162 saved_context_menu_action_(0), |
| 852 focused_plugin_(NULL), | 1163 focused_plugin_(NULL), |
| 853 mouse_lock_owner_(NULL), | 1164 mouse_lock_owner_(NULL), |
| 854 mouse_locked_(false), | 1165 mouse_locked_(false), |
| 855 pending_lock_request_(false), | 1166 pending_lock_request_(false), |
| 856 pending_unlock_request_(false), | 1167 pending_unlock_request_(false), |
| 857 last_mouse_event_target_(NULL) { | 1168 last_mouse_event_target_(NULL), |
| 1169 device_enumeration_event_handler_(new DeviceEnumerationEventHandler()) { |
| 858 } | 1170 } |
| 859 | 1171 |
| 860 PepperPluginDelegateImpl::~PepperPluginDelegateImpl() { | 1172 PepperPluginDelegateImpl::~PepperPluginDelegateImpl() { |
| 861 DCHECK(!mouse_lock_owner_); | 1173 DCHECK(!mouse_lock_owner_); |
| 862 } | 1174 } |
| 863 | 1175 |
| 864 scoped_refptr<webkit::ppapi::PluginModule> | 1176 scoped_refptr<webkit::ppapi::PluginModule> |
| 865 PepperPluginDelegateImpl::CreatePepperPluginModule( | 1177 PepperPluginDelegateImpl::CreatePepperPluginModule( |
| 866 const webkit::WebPluginInfo& webplugin_info, | 1178 const webkit::WebPluginInfo& webplugin_info, |
| 867 bool* pepper_plugin_was_registered) { | 1179 bool* pepper_plugin_was_registered) { |
| (...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1221 if (!render_view_->webkit_preferences().accelerated_plugins_enabled) | 1533 if (!render_view_->webkit_preferences().accelerated_plugins_enabled) |
| 1222 return NULL; | 1534 return NULL; |
| 1223 return new PlatformContext3DImpl(this); | 1535 return new PlatformContext3DImpl(this); |
| 1224 #else | 1536 #else |
| 1225 return NULL; | 1537 return NULL; |
| 1226 #endif | 1538 #endif |
| 1227 } | 1539 } |
| 1228 | 1540 |
| 1229 webkit::ppapi::PluginDelegate::PlatformVideoCapture* | 1541 webkit::ppapi::PluginDelegate::PlatformVideoCapture* |
| 1230 PepperPluginDelegateImpl::CreateVideoCapture( | 1542 PepperPluginDelegateImpl::CreateVideoCapture( |
| 1231 media::VideoCapture::EventHandler* handler) { | 1543 const std::string& device_id, |
| 1232 return new PlatformVideoCaptureImpl(handler); | 1544 PlatformVideoCaptureEventHandler* handler) { |
| 1545 return new PlatformVideoCaptureImpl(AsWeakPtr(), device_id, handler); |
| 1233 } | 1546 } |
| 1234 | 1547 |
| 1235 webkit::ppapi::PluginDelegate::PlatformVideoDecoder* | 1548 webkit::ppapi::PluginDelegate::PlatformVideoDecoder* |
| 1236 PepperPluginDelegateImpl::CreateVideoDecoder( | 1549 PepperPluginDelegateImpl::CreateVideoDecoder( |
| 1237 media::VideoDecodeAccelerator::Client* client, | 1550 media::VideoDecodeAccelerator::Client* client, |
| 1238 int32 command_buffer_route_id) { | 1551 int32 command_buffer_route_id) { |
| 1239 return new PlatformVideoDecoderImpl(client, command_buffer_route_id); | 1552 return new PlatformVideoDecoderImpl(client, command_buffer_route_id); |
| 1240 } | 1553 } |
| 1241 | 1554 |
| 1242 void PepperPluginDelegateImpl::NumberOfFindResultsChanged(int identifier, | 1555 void PepperPluginDelegateImpl::NumberOfFindResultsChanged(int identifier, |
| (...skipping 794 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2037 void PepperPluginDelegateImpl::SampleGamepads(WebKit::WebGamepads* data) { | 2350 void PepperPluginDelegateImpl::SampleGamepads(WebKit::WebGamepads* data) { |
| 2038 if (!gamepad_shared_memory_reader_.get()) | 2351 if (!gamepad_shared_memory_reader_.get()) |
| 2039 gamepad_shared_memory_reader_.reset(new content::GamepadSharedMemoryReader); | 2352 gamepad_shared_memory_reader_.reset(new content::GamepadSharedMemoryReader); |
| 2040 gamepad_shared_memory_reader_->SampleGamepads(*data); | 2353 gamepad_shared_memory_reader_->SampleGamepads(*data); |
| 2041 } | 2354 } |
| 2042 | 2355 |
| 2043 bool PepperPluginDelegateImpl::IsPageVisible() const { | 2356 bool PepperPluginDelegateImpl::IsPageVisible() const { |
| 2044 return !render_view_->is_hidden(); | 2357 return !render_view_->is_hidden(); |
| 2045 } | 2358 } |
| 2046 | 2359 |
| 2360 int PepperPluginDelegateImpl::EnumerateDevices( |
| 2361 PP_DeviceType_Dev type, |
| 2362 const EnumerateDevicesCallback& callback) { |
| 2363 int request_id = |
| 2364 device_enumeration_event_handler_->RegisterEnumerateDevicesCallback( |
| 2365 callback); |
| 2366 render_view_->media_stream_dispatcher()->EnumerateDevices( |
| 2367 request_id, device_enumeration_event_handler_.get(), |
| 2368 FromPepperDeviceType(type), ""); |
| 2369 return request_id; |
| 2370 } |
| 2371 |
| 2047 bool PepperPluginDelegateImpl::OnMessageReceived(const IPC::Message& message) { | 2372 bool PepperPluginDelegateImpl::OnMessageReceived(const IPC::Message& message) { |
| 2048 bool handled = true; | 2373 bool handled = true; |
| 2049 IPC_BEGIN_MESSAGE_MAP(PepperPluginDelegateImpl, message) | 2374 IPC_BEGIN_MESSAGE_MAP(PepperPluginDelegateImpl, message) |
| 2050 IPC_MESSAGE_HANDLER(PpapiMsg_PPBTCPSocket_ConnectACK, | 2375 IPC_MESSAGE_HANDLER(PpapiMsg_PPBTCPSocket_ConnectACK, |
| 2051 OnTCPSocketConnectACK) | 2376 OnTCPSocketConnectACK) |
| 2052 IPC_MESSAGE_HANDLER(PpapiMsg_PPBTCPSocket_SSLHandshakeACK, | 2377 IPC_MESSAGE_HANDLER(PpapiMsg_PPBTCPSocket_SSLHandshakeACK, |
| 2053 OnTCPSocketSSLHandshakeACK) | 2378 OnTCPSocketSSLHandshakeACK) |
| 2054 IPC_MESSAGE_HANDLER(PpapiMsg_PPBTCPSocket_ReadACK, OnTCPSocketReadACK) | 2379 IPC_MESSAGE_HANDLER(PpapiMsg_PPBTCPSocket_ReadACK, OnTCPSocketReadACK) |
| 2055 IPC_MESSAGE_HANDLER(PpapiMsg_PPBTCPSocket_WriteACK, OnTCPSocketWriteACK) | 2380 IPC_MESSAGE_HANDLER(PpapiMsg_PPBTCPSocket_WriteACK, OnTCPSocketWriteACK) |
| 2056 IPC_MESSAGE_HANDLER(PpapiMsg_PPBUDPSocket_BindACK, OnUDPSocketBindACK) | 2381 IPC_MESSAGE_HANDLER(PpapiMsg_PPBUDPSocket_BindACK, OnUDPSocketBindACK) |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2138 webkit::ppapi::PPB_UDPSocket_Private_Impl* socket = | 2463 webkit::ppapi::PPB_UDPSocket_Private_Impl* socket = |
| 2139 udp_sockets_.Lookup(socket_id); | 2464 udp_sockets_.Lookup(socket_id); |
| 2140 if (socket) | 2465 if (socket) |
| 2141 socket->OnSendToCompleted(succeeded, bytes_written); | 2466 socket->OnSendToCompleted(succeeded, bytes_written); |
| 2142 } | 2467 } |
| 2143 | 2468 |
| 2144 int PepperPluginDelegateImpl::GetRoutingId() const { | 2469 int PepperPluginDelegateImpl::GetRoutingId() const { |
| 2145 return render_view_->routing_id(); | 2470 return render_view_->routing_id(); |
| 2146 } | 2471 } |
| 2147 | 2472 |
| 2473 int PepperPluginDelegateImpl::OpenDevice(PP_DeviceType_Dev type, |
| 2474 const std::string& device_id, |
| 2475 const OpenDeviceCallback& callback) { |
| 2476 int request_id = |
| 2477 device_enumeration_event_handler_->RegisterOpenDeviceCallback(callback); |
| 2478 render_view_->media_stream_dispatcher()->OpenDevice( |
| 2479 request_id, device_enumeration_event_handler_.get(), device_id, |
| 2480 FromPepperDeviceType(type), ""); |
| 2481 return request_id; |
| 2482 } |
| 2483 |
| 2484 void PepperPluginDelegateImpl::CloseDevice(const std::string& label) { |
| 2485 render_view_->media_stream_dispatcher()->CloseDevice(label); |
| 2486 } |
| 2487 |
| 2488 int PepperPluginDelegateImpl::GetSessionID(PP_DeviceType_Dev type, |
| 2489 const std::string& label) { |
| 2490 switch (type) { |
| 2491 case PP_DEVICETYPE_DEV_AUDIOCAPTURE: |
| 2492 return render_view_->media_stream_dispatcher()->audio_session_id(label, |
| 2493 0); |
| 2494 case PP_DEVICETYPE_DEV_VIDEOCAPTURE: |
| 2495 return render_view_->media_stream_dispatcher()->video_session_id(label, |
| 2496 0); |
| 2497 default: |
| 2498 NOTREACHED(); |
| 2499 return 0; |
| 2500 } |
| 2501 } |
| 2502 |
| 2148 RendererGLContext* | 2503 RendererGLContext* |
| 2149 PepperPluginDelegateImpl::GetParentContextForPlatformContext3D() { | 2504 PepperPluginDelegateImpl::GetParentContextForPlatformContext3D() { |
| 2150 WebGraphicsContext3DCommandBufferImpl* context = | 2505 WebGraphicsContext3DCommandBufferImpl* context = |
| 2151 static_cast<WebGraphicsContext3DCommandBufferImpl*>( | 2506 static_cast<WebGraphicsContext3DCommandBufferImpl*>( |
| 2152 render_view_->webview()->graphicsContext3D()); | 2507 render_view_->webview()->graphicsContext3D()); |
| 2153 if (!context) | 2508 if (!context) |
| 2154 return NULL; | 2509 return NULL; |
| 2155 if (!context->makeContextCurrent() || context->isContextLost()) | 2510 if (!context->makeContextCurrent() || context->isContextLost()) |
| 2156 return NULL; | 2511 return NULL; |
| 2157 | 2512 |
| 2158 RendererGLContext* parent_context = context->context(); | 2513 RendererGLContext* parent_context = context->context(); |
| 2159 if (!parent_context) | 2514 if (!parent_context) |
| 2160 return NULL; | 2515 return NULL; |
| 2161 return parent_context; | 2516 return parent_context; |
| 2162 } | 2517 } |
| 2163 | 2518 |
| 2164 bool PepperPluginDelegateImpl::CanUseSocketAPIs() { | 2519 bool PepperPluginDelegateImpl::CanUseSocketAPIs() { |
| 2165 WebView* webview = render_view_->webview(); | 2520 WebView* webview = render_view_->webview(); |
| 2166 WebFrame* main_frame = webview ? webview->mainFrame() : NULL; | 2521 WebFrame* main_frame = webview ? webview->mainFrame() : NULL; |
| 2167 GURL url(main_frame ? GURL(main_frame->document().url()) : GURL()); | 2522 GURL url(main_frame ? GURL(main_frame->document().url()) : GURL()); |
| 2168 if (!url.is_valid()) | 2523 if (!url.is_valid()) |
| 2169 return false; | 2524 return false; |
| 2170 | 2525 |
| 2171 return content::GetContentClient()->renderer()->AllowSocketAPI(url); | 2526 return content::GetContentClient()->renderer()->AllowSocketAPI(url); |
| 2172 } | 2527 } |
| OLD | NEW |