| // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| #include "content/browser/renderer_host/media/peer_connection_tracker_host.h" |
| |
| #include "base/power_monitor/power_monitor.h" |
| #include "content/browser/media/webrtc_internals.h" |
| #include "content/common/media/peer_connection_tracker_messages.h" |
| #include "content/public/browser/render_process_host.h" |
| |
| namespace content { |
| |
| PeerConnectionTrackerHost::PeerConnectionTrackerHost(int render_process_id) |
| : BrowserMessageFilter(PeerConnectionTrackerMsgStart), |
| render_process_id_(render_process_id) { |
| } |
| |
| bool PeerConnectionTrackerHost::OnMessageReceived(const IPC::Message& message) { |
| bool handled = true; |
| |
| IPC_BEGIN_MESSAGE_MAP(PeerConnectionTrackerHost, message) |
| IPC_MESSAGE_HANDLER(PeerConnectionTrackerHost_AddPeerConnection, |
| OnAddPeerConnection) |
| IPC_MESSAGE_HANDLER(PeerConnectionTrackerHost_RemovePeerConnection, |
| OnRemovePeerConnection) |
| IPC_MESSAGE_HANDLER(PeerConnectionTrackerHost_UpdatePeerConnection, |
| OnUpdatePeerConnection) |
| IPC_MESSAGE_HANDLER(PeerConnectionTrackerHost_AddStats, OnAddStats) |
| IPC_MESSAGE_HANDLER(PeerConnectionTrackerHost_GetUserMedia, OnGetUserMedia) |
| IPC_MESSAGE_UNHANDLED(handled = false) |
| IPC_END_MESSAGE_MAP() |
| return handled; |
| } |
| |
| void PeerConnectionTrackerHost::OverrideThreadForMessage( |
| const IPC::Message& message, BrowserThread::ID* thread) { |
| if (IPC_MESSAGE_CLASS(message) == PeerConnectionTrackerMsgStart) |
| *thread = BrowserThread::UI; |
| } |
| |
| PeerConnectionTrackerHost::~PeerConnectionTrackerHost() { |
| } |
| |
| void PeerConnectionTrackerHost::OnChannelConnected(int32 peer_pid) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| // Add PowerMonitor when connected to channel rather than in constructor due |
| // to thread safety concerns. Observers of PowerMonitor must be added and |
| // removed on the same thread. BrowserMessageFilter is created on the UI |
| // thread but can be destructed on the UI or IO thread because they are |
| // referenced by RenderProcessHostImpl on the UI thread and ChannelProxy on |
| // the IO thread. Using OnChannelConnected and OnChannelClosing guarantees |
| // execution on the IO thread. |
| base::PowerMonitor* power_monitor = base::PowerMonitor::Get(); |
| if (power_monitor) |
| power_monitor->AddObserver(this); |
| } |
| |
| void PeerConnectionTrackerHost::OnChannelClosing() { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| base::PowerMonitor* power_monitor = base::PowerMonitor::Get(); |
| if (power_monitor) |
| power_monitor->RemoveObserver(this); |
| } |
| |
| void PeerConnectionTrackerHost::OnAddPeerConnection( |
| const PeerConnectionInfo& info) { |
| WebRTCInternals::GetInstance()->OnAddPeerConnection( |
| render_process_id_, |
| peer_pid(), |
| info.lid, |
| info.url, |
| info.rtc_configuration, |
| info.constraints); |
| } |
| |
| void PeerConnectionTrackerHost::OnRemovePeerConnection(int lid) { |
| WebRTCInternals::GetInstance()->OnRemovePeerConnection(peer_pid(), lid); |
| } |
| |
| void PeerConnectionTrackerHost::OnUpdatePeerConnection( |
| int lid, const std::string& type, const std::string& value) { |
| WebRTCInternals::GetInstance()->OnUpdatePeerConnection( |
| peer_pid(), |
| lid, |
| type, |
| value); |
| } |
| |
| void PeerConnectionTrackerHost::OnAddStats(int lid, |
| const base::ListValue& value) { |
| WebRTCInternals::GetInstance()->OnAddStats(peer_pid(), lid, value); |
| } |
| |
| void PeerConnectionTrackerHost::OnGetUserMedia( |
| const std::string& origin, |
| bool audio, |
| bool video, |
| const std::string& audio_constraints, |
| const std::string& video_constraints) { |
| WebRTCInternals::GetInstance()->OnGetUserMedia(render_process_id_, |
| peer_pid(), |
| origin, |
| audio, |
| video, |
| audio_constraints, |
| video_constraints); |
| } |
| |
| void PeerConnectionTrackerHost::OnSuspend() { |
| BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| base::Bind(&PeerConnectionTrackerHost::SendOnSuspendOnUIThread, this)); |
| } |
| |
| void PeerConnectionTrackerHost::SendOnSuspendOnUIThread() { |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| content::RenderProcessHost* host = |
| content::RenderProcessHost::FromID(render_process_id_); |
| if (host) |
| host->Send(new PeerConnectionTracker_OnSuspend()); |
| } |
| |
| } // namespace content |