Index: content/renderer/media/webrtc/peer_connection_dependency_factory.cc |
diff --git a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc |
index 270cf169851d51f21a8a5377d7bacf87f2b222e7..17ad9ba1186cd2b5716692b1c0154c6d92612b44 100644 |
--- a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc |
+++ b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc |
@@ -396,7 +396,17 @@ PeerConnectionDependencyFactory::CreatePeerConnection( |
// which means the permission will be granted automatically. This could be the |
// case when either the experiment is not enabled or the preference is not |
// enforced. |
- scoped_ptr<media::MediaPermission> media_permission; |
+ // |
+ // Note on |media_permission| lifetime: |media_permission| is owned by a frame |
+ // (RenderFrameImpl). It is also stored as an indirect member of |
+ // RTCPeerConnectionHandler (through PeerConnection/PeerConnectionInterface -> |
+ // P2PPortAllocator -> FilteringNetworkManager -> |media_permission|). |
+ // The RTCPeerConnectionHandler is owned as RTCPeerConnection::m_peerHandler |
+ // in Blink, which will be reset in RTCPeerConnection::stop(). Since |
+ // ActiveDOMObject::stop() is guaranteed to be called before a frame is |
+ // detached, it is impossible for RTCPeerConnectionHandler to outlive the |
+ // frame. Therefore using a raw pointer of |media_permission| is safe here. |
+ media::MediaPermission* media_permission = nullptr; |
if (!GetContentClient() |
->renderer() |
->ShouldEnforceWebRTCRoutingPreferences()) { |
@@ -453,10 +463,8 @@ PeerConnectionDependencyFactory::CreatePeerConnection( |
if (create_media_permission) { |
content::RenderFrameImpl* render_frame = |
content::RenderFrameImpl::FromWebFrame(web_frame); |
- if (render_frame) { |
- media_permission = render_frame->CreateMediaPermissionProxy( |
- chrome_worker_thread_.task_runner()); |
- } |
+ if (render_frame) |
+ media_permission = render_frame->GetMediaPermission(); |
DCHECK(media_permission); |
} |
} |
@@ -467,11 +475,10 @@ PeerConnectionDependencyFactory::CreatePeerConnection( |
scoped_ptr<rtc::NetworkManager> network_manager; |
if (port_config.enable_multiple_routes) { |
- media::MediaPermission* media_permission_ptr = media_permission.get(); |
FilteringNetworkManager* filtering_network_manager = |
new FilteringNetworkManager(network_manager_, requesting_origin, |
- std::move(media_permission)); |
- if (media_permission_ptr) { |
+ media_permission); |
+ if (media_permission) { |
// Start permission check earlier to reduce any impact to call set up |
// time. It's safe to use Unretained here since both destructor and |
// Initialize can only be called on the worker thread. |