OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/webrtc/peer_connection_dependency_factory.h" | 5 #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 << kConstraintEffectMap[i].constraint; | 132 << kConstraintEffectMap[i].constraint; |
133 } | 133 } |
134 } | 134 } |
135 } | 135 } |
136 } | 136 } |
137 | 137 |
138 class P2PPortAllocatorFactory | 138 class P2PPortAllocatorFactory |
139 : public rtc::RefCountedObject<webrtc::PortAllocatorFactoryInterface> { | 139 : public rtc::RefCountedObject<webrtc::PortAllocatorFactoryInterface> { |
140 public: | 140 public: |
141 P2PPortAllocatorFactory( | 141 P2PPortAllocatorFactory( |
142 scoped_ptr<media::MediaPermission> media_permission, | 142 media::MediaPermission* media_permission, |
143 const scoped_refptr<P2PSocketDispatcher>& socket_dispatcher, | 143 const scoped_refptr<P2PSocketDispatcher>& socket_dispatcher, |
144 rtc::NetworkManager* network_manager, | 144 rtc::NetworkManager* network_manager, |
145 rtc::PacketSocketFactory* socket_factory, | 145 rtc::PacketSocketFactory* socket_factory, |
146 const P2PPortAllocator::Config& config, | 146 const P2PPortAllocator::Config& config, |
147 const GURL& origin, | 147 const GURL& origin, |
148 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) | 148 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) |
149 : media_permission_(media_permission.Pass()), | 149 : media_permission_(media_permission), |
150 socket_dispatcher_(socket_dispatcher), | 150 socket_dispatcher_(socket_dispatcher), |
151 network_manager_(network_manager), | 151 network_manager_(network_manager), |
152 socket_factory_(socket_factory), | 152 socket_factory_(socket_factory), |
153 config_(config), | 153 config_(config), |
154 origin_(origin), | 154 origin_(origin), |
155 task_runner_(task_runner) {} | 155 task_runner_(task_runner) {} |
156 | 156 |
157 cricket::PortAllocator* CreatePortAllocator( | 157 cricket::PortAllocator* CreatePortAllocator( |
158 const std::vector<StunConfiguration>& stun_servers, | 158 const std::vector<StunConfiguration>& stun_servers, |
159 const std::vector<TurnConfiguration>& turn_configurations) override { | 159 const std::vector<TurnConfiguration>& turn_configurations) override { |
160 P2PPortAllocator::Config config = config_; | 160 P2PPortAllocator::Config config = config_; |
161 for (size_t i = 0; i < stun_servers.size(); ++i) { | 161 for (size_t i = 0; i < stun_servers.size(); ++i) { |
162 config.stun_servers.insert(rtc::SocketAddress( | 162 config.stun_servers.insert(rtc::SocketAddress( |
163 stun_servers[i].server.hostname(), | 163 stun_servers[i].server.hostname(), |
164 stun_servers[i].server.port())); | 164 stun_servers[i].server.port())); |
165 } | 165 } |
166 for (size_t i = 0; i < turn_configurations.size(); ++i) { | 166 for (size_t i = 0; i < turn_configurations.size(); ++i) { |
167 P2PPortAllocator::Config::RelayServerConfig relay_config; | 167 P2PPortAllocator::Config::RelayServerConfig relay_config; |
168 relay_config.server_address = turn_configurations[i].server.hostname(); | 168 relay_config.server_address = turn_configurations[i].server.hostname(); |
169 relay_config.port = turn_configurations[i].server.port(); | 169 relay_config.port = turn_configurations[i].server.port(); |
170 relay_config.username = turn_configurations[i].username; | 170 relay_config.username = turn_configurations[i].username; |
171 relay_config.password = turn_configurations[i].password; | 171 relay_config.password = turn_configurations[i].password; |
172 relay_config.transport_type = turn_configurations[i].transport_type; | 172 relay_config.transport_type = turn_configurations[i].transport_type; |
173 relay_config.secure = turn_configurations[i].secure; | 173 relay_config.secure = turn_configurations[i].secure; |
174 config.relays.push_back(relay_config); | 174 config.relays.push_back(relay_config); |
175 } | 175 } |
176 | 176 |
177 scoped_ptr<rtc::NetworkManager> network_manager; | 177 scoped_ptr<rtc::NetworkManager> network_manager; |
178 if (config.enable_multiple_routes) { | 178 if (config.enable_multiple_routes) { |
179 media::MediaPermission* media_permission = media_permission_.get(); | |
180 FilteringNetworkManager* filtering_network_manager = | 179 FilteringNetworkManager* filtering_network_manager = |
181 new FilteringNetworkManager(network_manager_, origin_, | 180 new FilteringNetworkManager(network_manager_, origin_, |
182 media_permission_.Pass()); | 181 media_permission_); |
183 if (media_permission) { | 182 if (media_permission_) { |
184 // Start permission check earlier to reduce any impact to call set up | 183 // Start permission check earlier to reduce any impact to call set up |
185 // time. It's safe to use Unretained here since both destructor and | 184 // time. It's safe to use Unretained here since both destructor and |
186 // Initialize can only be called on the worker thread. | 185 // Initialize can only be called on the worker thread. |
187 task_runner_->PostTask( | 186 task_runner_->PostTask( |
188 FROM_HERE, base::Bind(&FilteringNetworkManager::Initialize, | 187 FROM_HERE, base::Bind(&FilteringNetworkManager::Initialize, |
189 base::Unretained(filtering_network_manager))); | 188 base::Unretained(filtering_network_manager))); |
190 } | 189 } |
191 network_manager.reset(filtering_network_manager); | 190 network_manager.reset(filtering_network_manager); |
192 } else { | 191 } else { |
193 network_manager.reset(new EmptyNetworkManager(network_manager_)); | 192 network_manager.reset(new EmptyNetworkManager(network_manager_)); |
194 } | 193 } |
195 | 194 |
196 return new P2PPortAllocator(socket_dispatcher_, network_manager.Pass(), | 195 return new P2PPortAllocator(socket_dispatcher_, network_manager.Pass(), |
197 socket_factory_, config, origin_, task_runner_); | 196 socket_factory_, config, origin_, task_runner_); |
198 } | 197 } |
199 | 198 |
200 protected: | 199 protected: |
201 ~P2PPortAllocatorFactory() override {} | 200 ~P2PPortAllocatorFactory() override {} |
202 | 201 |
203 private: | 202 private: |
204 // Ownership of |media_permission_| will be passed to FilteringNetworkManager | 203 media::MediaPermission* media_permission_; |
205 // during CreatePortAllocator. | |
206 scoped_ptr<media::MediaPermission> media_permission_; | |
207 | |
208 scoped_refptr<P2PSocketDispatcher> socket_dispatcher_; | 204 scoped_refptr<P2PSocketDispatcher> socket_dispatcher_; |
209 rtc::NetworkManager* network_manager_; | 205 rtc::NetworkManager* network_manager_; |
210 rtc::PacketSocketFactory* socket_factory_; | 206 rtc::PacketSocketFactory* socket_factory_; |
211 P2PPortAllocator::Config config_; | 207 P2PPortAllocator::Config config_; |
212 GURL origin_; | 208 GURL origin_; |
213 | 209 |
214 // This is the worker thread where |media_permission_| and |network_manager_| | 210 // This is the worker thread where |network_manager_| live on. |
215 // live on. | |
216 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | 211 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
217 }; | 212 }; |
218 | 213 |
219 PeerConnectionDependencyFactory::PeerConnectionDependencyFactory( | 214 PeerConnectionDependencyFactory::PeerConnectionDependencyFactory( |
220 P2PSocketDispatcher* p2p_socket_dispatcher) | 215 P2PSocketDispatcher* p2p_socket_dispatcher) |
221 : network_manager_(NULL), | 216 : network_manager_(NULL), |
222 p2p_socket_dispatcher_(p2p_socket_dispatcher), | 217 p2p_socket_dispatcher_(p2p_socket_dispatcher), |
223 signaling_thread_(NULL), | 218 signaling_thread_(NULL), |
224 worker_thread_(NULL), | 219 worker_thread_(NULL), |
225 chrome_signaling_thread_("Chrome_libJingle_Signaling"), | 220 chrome_signaling_thread_("Chrome_libJingle_Signaling"), |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
464 | 459 |
465 // Copy the flag from Preference associated with this WebFrame. | 460 // Copy the flag from Preference associated with this WebFrame. |
466 P2PPortAllocator::Config port_config; | 461 P2PPortAllocator::Config port_config; |
467 | 462 |
468 // |media_permission| will be called to check mic/camera permission. If at | 463 // |media_permission| will be called to check mic/camera permission. If at |
469 // least one of them is granted, P2PPortAllocator is allowed to gather local | 464 // least one of them is granted, P2PPortAllocator is allowed to gather local |
470 // host IP addresses as ICE candidates. |media_permission| could be nullptr, | 465 // host IP addresses as ICE candidates. |media_permission| could be nullptr, |
471 // which means the permission will be granted automatically. This could be the | 466 // which means the permission will be granted automatically. This could be the |
472 // case when either the experiment is not enabled or the preference is not | 467 // case when either the experiment is not enabled or the preference is not |
473 // enforced. | 468 // enforced. |
474 scoped_ptr<media::MediaPermission> media_permission; | 469 media::MediaPermission* media_permission = nullptr; |
475 if (!GetContentClient() | 470 if (!GetContentClient() |
476 ->renderer() | 471 ->renderer() |
477 ->ShouldEnforceWebRTCRoutingPreferences()) { | 472 ->ShouldEnforceWebRTCRoutingPreferences()) { |
478 port_config.enable_multiple_routes = true; | 473 port_config.enable_multiple_routes = true; |
479 port_config.enable_nonproxied_udp = true; | 474 port_config.enable_nonproxied_udp = true; |
480 VLOG(3) << "WebRTC routing preferences will not be enforced"; | 475 VLOG(3) << "WebRTC routing preferences will not be enforced"; |
481 } else { | 476 } else { |
482 if (web_frame && web_frame->view()) { | 477 if (web_frame && web_frame->view()) { |
483 RenderViewImpl* renderer_view_impl = | 478 RenderViewImpl* renderer_view_impl = |
484 RenderViewImpl::FromWebView(web_frame->view()); | 479 RenderViewImpl::FromWebView(web_frame->view()); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
521 base::CommandLine::ForCurrentProcess()->HasSwitch( | 516 base::CommandLine::ForCurrentProcess()->HasSwitch( |
522 switches::kEnforceWebRtcIPPermissionCheck); | 517 switches::kEnforceWebRtcIPPermissionCheck); |
523 create_media_permission = | 518 create_media_permission = |
524 create_media_permission || | 519 create_media_permission || |
525 StartsWith(base::FieldTrialList::FindFullName( | 520 StartsWith(base::FieldTrialList::FindFullName( |
526 "WebRTC-LocalIPPermissionCheck"), | 521 "WebRTC-LocalIPPermissionCheck"), |
527 "Enabled", base::CompareCase::SENSITIVE); | 522 "Enabled", base::CompareCase::SENSITIVE); |
528 if (create_media_permission) { | 523 if (create_media_permission) { |
529 content::RenderFrameImpl* render_frame = | 524 content::RenderFrameImpl* render_frame = |
530 content::RenderFrameImpl::FromWebFrame(web_frame); | 525 content::RenderFrameImpl::FromWebFrame(web_frame); |
531 if (render_frame) { | 526 if (render_frame) |
532 media_permission = render_frame->CreateMediaPermissionProxy( | 527 media_permission = render_frame->GetMediaPermission(); |
533 chrome_worker_thread_.task_runner()); | |
534 } | |
535 DCHECK(media_permission); | 528 DCHECK(media_permission); |
536 } | 529 } |
537 } | 530 } |
538 } | 531 } |
539 | 532 |
540 const GURL& requesting_origin = | 533 const GURL& requesting_origin = |
541 GURL(web_frame->document().url().spec()).GetOrigin(); | 534 GURL(web_frame->document().url().spec()).GetOrigin(); |
542 | 535 |
543 scoped_refptr<P2PPortAllocatorFactory> pa_factory = | 536 scoped_refptr<P2PPortAllocatorFactory> pa_factory = |
544 new P2PPortAllocatorFactory( | 537 new P2PPortAllocatorFactory( |
545 media_permission.Pass(), p2p_socket_dispatcher_, network_manager_, | 538 media_permission, p2p_socket_dispatcher_, network_manager_, |
546 socket_factory_.get(), port_config, requesting_origin, | 539 socket_factory_.get(), port_config, requesting_origin, |
547 chrome_worker_thread_.task_runner()); | 540 chrome_worker_thread_.task_runner()); |
548 | 541 |
549 return GetPcFactory() | 542 return GetPcFactory() |
550 ->CreatePeerConnection(config, constraints, pa_factory.get(), | 543 ->CreatePeerConnection(config, constraints, pa_factory.get(), |
551 std::move(identity_store), observer) | 544 std::move(identity_store), observer) |
552 .get(); | 545 .get(); |
553 } | 546 } |
554 | 547 |
555 scoped_refptr<webrtc::MediaStreamInterface> | 548 scoped_refptr<webrtc::MediaStreamInterface> |
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
813 } | 806 } |
814 | 807 |
815 void PeerConnectionDependencyFactory::EnsureWebRtcAudioDeviceImpl() { | 808 void PeerConnectionDependencyFactory::EnsureWebRtcAudioDeviceImpl() { |
816 if (audio_device_.get()) | 809 if (audio_device_.get()) |
817 return; | 810 return; |
818 | 811 |
819 audio_device_ = new WebRtcAudioDeviceImpl(); | 812 audio_device_ = new WebRtcAudioDeviceImpl(); |
820 } | 813 } |
821 | 814 |
822 } // namespace content | 815 } // namespace content |
OLD | NEW |