Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(67)

Side by Side Diff: content/renderer/media/media_stream_impl.h

Issue 364123002: [Cross-Site Isolation] Migrate entire MediaStream verticals to be per-RenderFrame. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 #ifndef CONTENT_RENDERER_MEDIA_MEDIA_STREAM_IMPL_H_ 5 #ifndef CONTENT_RENDERER_MEDIA_MEDIA_STREAM_IMPL_H_
6 #define CONTENT_RENDERER_MEDIA_MEDIA_STREAM_IMPL_H_ 6 #define CONTENT_RENDERER_MEDIA_MEDIA_STREAM_IMPL_H_
7 7
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/basictypes.h" 11 #include "base/basictypes.h"
12 #include "base/compiler_specific.h" 12 #include "base/compiler_specific.h"
13 #include "base/memory/ref_counted.h" 13 #include "base/memory/ref_counted.h"
14 #include "base/memory/scoped_ptr.h" 14 #include "base/memory/scoped_ptr.h"
15 #include "base/memory/scoped_vector.h" 15 #include "base/memory/scoped_vector.h"
16 #include "base/memory/weak_ptr.h" 16 #include "base/memory/weak_ptr.h"
17 #include "base/threading/non_thread_safe.h" 17 #include "base/threading/non_thread_safe.h"
18 #include "content/common/content_export.h" 18 #include "content/common/content_export.h"
19 #include "content/public/renderer/render_view_observer.h" 19 #include "content/public/renderer/render_frame_observer.h"
20 #include "content/renderer/media/media_stream_dispatcher_eventhandler.h" 20 #include "content/renderer/media/media_stream_dispatcher_eventhandler.h"
21 #include "content/renderer/media/media_stream_source.h" 21 #include "content/renderer/media/media_stream_source.h"
22 #include "third_party/WebKit/public/platform/WebMediaStream.h" 22 #include "third_party/WebKit/public/platform/WebMediaStream.h"
23 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h" 23 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
24 #include "third_party/WebKit/public/platform/WebVector.h" 24 #include "third_party/WebKit/public/platform/WebVector.h"
25 #include "third_party/WebKit/public/web/WebMediaDevicesRequest.h" 25 #include "third_party/WebKit/public/web/WebMediaDevicesRequest.h"
26 #include "third_party/WebKit/public/web/WebUserMediaClient.h" 26 #include "third_party/WebKit/public/web/WebUserMediaClient.h"
27 #include "third_party/WebKit/public/web/WebUserMediaRequest.h" 27 #include "third_party/WebKit/public/web/WebUserMediaRequest.h"
28 #include "third_party/libjingle/source/talk/app/webrtc/mediastreaminterface.h" 28 #include "third_party/libjingle/source/talk/app/webrtc/mediastreaminterface.h"
29 29
30 namespace content { 30 namespace content {
31 class PeerConnectionDependencyFactory; 31 class PeerConnectionDependencyFactory;
32 class MediaStreamDispatcher; 32 class MediaStreamDispatcher;
33 class MediaStreamVideoSource; 33 class MediaStreamVideoSource;
34 class VideoCapturerDelegate; 34 class VideoCapturerDelegate;
35 35
36 // MediaStreamImpl is a delegate for the Media Stream GetUserMedia API. 36 // MediaStreamImpl is a delegate for the Media Stream GetUserMedia API.
37 // It ties together WebKit and MediaStreamManager 37 // It ties together WebKit and MediaStreamManager
38 // (via MediaStreamDispatcher and MediaStreamDispatcherHost) 38 // (via MediaStreamDispatcher and MediaStreamDispatcherHost)
39 // in the browser process. It must be created, called and destroyed on the 39 // in the browser process. It must be created, called and destroyed on the
40 // render thread. 40 // render thread.
41 // MediaStreamImpl have weak pointers to a MediaStreamDispatcher.
42 class CONTENT_EXPORT MediaStreamImpl 41 class CONTENT_EXPORT MediaStreamImpl
43 : public RenderViewObserver, 42 : public RenderFrameObserver,
44 NON_EXPORTED_BASE(public blink::WebUserMediaClient), 43 NON_EXPORTED_BASE(public blink::WebUserMediaClient),
45 public MediaStreamDispatcherEventHandler, 44 public MediaStreamDispatcherEventHandler,
46 public base::SupportsWeakPtr<MediaStreamImpl>,
47 NON_EXPORTED_BASE(public base::NonThreadSafe) { 45 NON_EXPORTED_BASE(public base::NonThreadSafe) {
48 public: 46 public:
47 // |render_frame| and |dependency_factory| must outlive this instance.
49 MediaStreamImpl( 48 MediaStreamImpl(
50 RenderView* render_view, 49 RenderFrame* render_frame,
51 MediaStreamDispatcher* media_stream_dispatcher, 50 PeerConnectionDependencyFactory* dependency_factory,
52 PeerConnectionDependencyFactory* dependency_factory); 51 scoped_ptr<MediaStreamDispatcher> media_stream_dispatcher);
53 virtual ~MediaStreamImpl(); 52 virtual ~MediaStreamImpl();
54 53
54 MediaStreamDispatcher* media_stream_dispatcher() const {
55 return media_stream_dispatcher_.get();
tommi (sloooow) - chröme 2014/07/09 07:46:55 add a thread check?
miu 2014/07/09 19:48:07 A valid concern, but I think it's unnecessary: 1)
56 }
57
55 // blink::WebUserMediaClient implementation 58 // blink::WebUserMediaClient implementation
56 virtual void requestUserMedia( 59 virtual void requestUserMedia(
57 const blink::WebUserMediaRequest& user_media_request); 60 const blink::WebUserMediaRequest& user_media_request);
58 virtual void cancelUserMediaRequest( 61 virtual void cancelUserMediaRequest(
59 const blink::WebUserMediaRequest& user_media_request); 62 const blink::WebUserMediaRequest& user_media_request);
60 virtual void requestMediaDevices( 63 virtual void requestMediaDevices(
61 const blink::WebMediaDevicesRequest& media_devices_request) OVERRIDE; 64 const blink::WebMediaDevicesRequest& media_devices_request) OVERRIDE;
62 virtual void cancelMediaDevicesRequest( 65 virtual void cancelMediaDevicesRequest(
63 const blink::WebMediaDevicesRequest& media_devices_request) OVERRIDE; 66 const blink::WebMediaDevicesRequest& media_devices_request) OVERRIDE;
64 67
(...skipping 10 matching lines...) Expand all
75 const StreamDeviceInfo& device_info) OVERRIDE; 78 const StreamDeviceInfo& device_info) OVERRIDE;
76 virtual void OnDevicesEnumerated( 79 virtual void OnDevicesEnumerated(
77 int request_id, 80 int request_id,
78 const StreamDeviceInfoArray& device_array) OVERRIDE; 81 const StreamDeviceInfoArray& device_array) OVERRIDE;
79 virtual void OnDeviceOpened( 82 virtual void OnDeviceOpened(
80 int request_id, 83 int request_id,
81 const std::string& label, 84 const std::string& label,
82 const StreamDeviceInfo& device_info) OVERRIDE; 85 const StreamDeviceInfo& device_info) OVERRIDE;
83 virtual void OnDeviceOpenFailed(int request_id) OVERRIDE; 86 virtual void OnDeviceOpenFailed(int request_id) OVERRIDE;
84 87
85 // RenderViewObserver OVERRIDE 88 // RenderFrameObserver OVERRIDE
86 virtual void FrameDetached(blink::WebFrame* frame) OVERRIDE; 89 virtual void FrameWillClose() OVERRIDE;
87 virtual void FrameWillClose(blink::WebFrame* frame) OVERRIDE;
88 90
89 protected: 91 protected:
90 // Called when |source| has been stopped from JavaScript. 92 // Called when |source| has been stopped from JavaScript.
91 void OnLocalSourceStopped(const blink::WebMediaStreamSource& source); 93 void OnLocalSourceStopped(const blink::WebMediaStreamSource& source);
92 94
93 // These methods are virtual for test purposes. A test can override them to 95 // These methods are virtual for test purposes. A test can override them to
94 // test requesting local media streams. The function notifies WebKit that the 96 // test requesting local media streams. The function notifies WebKit that the
95 // |request| have completed. 97 // |request| have completed.
96 virtual void GetUserMediaRequestSucceeded( 98 virtual void GetUserMediaRequestSucceeded(
97 const blink::WebMediaStream& stream, 99 const blink::WebMediaStream& stream,
(...skipping 14 matching lines...) Expand all
112 // Class for storing information about a WebKit request to create a 114 // Class for storing information about a WebKit request to create a
113 // MediaStream. 115 // MediaStream.
114 class UserMediaRequestInfo 116 class UserMediaRequestInfo
115 : public base::SupportsWeakPtr<UserMediaRequestInfo> { 117 : public base::SupportsWeakPtr<UserMediaRequestInfo> {
116 public: 118 public:
117 typedef base::Callback<void(UserMediaRequestInfo* request_info, 119 typedef base::Callback<void(UserMediaRequestInfo* request_info,
118 content::MediaStreamRequestResult result)> 120 content::MediaStreamRequestResult result)>
119 ResourcesReady; 121 ResourcesReady;
120 122
121 UserMediaRequestInfo(int request_id, 123 UserMediaRequestInfo(int request_id,
122 blink::WebFrame* frame,
123 const blink::WebUserMediaRequest& request, 124 const blink::WebUserMediaRequest& request,
124 bool enable_automatic_output_device_selection); 125 bool enable_automatic_output_device_selection);
125 ~UserMediaRequestInfo(); 126 ~UserMediaRequestInfo();
126 int request_id; 127 int request_id;
127 // True if MediaStreamDispatcher has generated the stream, see 128 // True if MediaStreamDispatcher has generated the stream, see
128 // OnStreamGenerated. 129 // OnStreamGenerated.
129 bool generated; 130 bool generated;
130 const bool enable_automatic_output_device_selection; 131 const bool enable_automatic_output_device_selection;
131 blink::WebFrame* frame; // WebFrame that requested the MediaStream.
132 blink::WebMediaStream web_stream; 132 blink::WebMediaStream web_stream;
133 blink::WebUserMediaRequest request; 133 blink::WebUserMediaRequest request;
134 134
135 void StartAudioTrack(const blink::WebMediaStreamTrack& track, 135 void StartAudioTrack(const blink::WebMediaStreamTrack& track,
136 const blink::WebMediaConstraints& constraints); 136 const blink::WebMediaConstraints& constraints);
137 137
138 blink::WebMediaStreamTrack CreateAndStartVideoTrack( 138 blink::WebMediaStreamTrack CreateAndStartVideoTrack(
139 const blink::WebMediaStreamSource& source, 139 const blink::WebMediaStreamSource& source,
140 const blink::WebMediaConstraints& constraints); 140 const blink::WebMediaConstraints& constraints);
141 141
(...skipping 11 matching lines...) Expand all
153 void CheckAllTracksStarted(); 153 void CheckAllTracksStarted();
154 154
155 ResourcesReady ready_callback_; 155 ResourcesReady ready_callback_;
156 bool request_failed_; 156 bool request_failed_;
157 // Sources used in this request. 157 // Sources used in this request.
158 std::vector<blink::WebMediaStreamSource> sources_; 158 std::vector<blink::WebMediaStreamSource> sources_;
159 std::vector<MediaStreamSource*> sources_waiting_for_callback_; 159 std::vector<MediaStreamSource*> sources_waiting_for_callback_;
160 }; 160 };
161 typedef ScopedVector<UserMediaRequestInfo> UserMediaRequests; 161 typedef ScopedVector<UserMediaRequestInfo> UserMediaRequests;
162 162
163 struct LocalStreamSource { 163 typedef std::vector<blink::WebMediaStreamSource> LocalStreamSources;
164 LocalStreamSource(blink::WebFrame* frame,
165 const blink::WebMediaStreamSource& source)
166 : frame(frame), source(source) {
167 }
168 // |frame| is the WebFrame that requested |source|. NULL in unit tests.
169 // TODO(perkj): Change so that |frame| is not NULL in unit tests.
170 blink::WebFrame* frame;
171 blink::WebMediaStreamSource source;
172 };
173 typedef std::vector<LocalStreamSource> LocalStreamSources;
174 164
175 struct MediaDevicesRequestInfo; 165 struct MediaDevicesRequestInfo;
176 typedef ScopedVector<MediaDevicesRequestInfo> MediaDevicesRequests; 166 typedef ScopedVector<MediaDevicesRequestInfo> MediaDevicesRequests;
177 167
178 // Creates a WebKit representation of stream sources based on 168 // Creates a WebKit representation of stream sources based on
179 // |devices| from the MediaStreamDispatcher. 169 // |devices| from the MediaStreamDispatcher.
180 void InitializeSourceObject( 170 void InitializeSourceObject(
181 const StreamDeviceInfo& device, 171 const StreamDeviceInfo& device,
182 blink::WebMediaStreamSource::Type type, 172 blink::WebMediaStreamSource::Type type,
183 const blink::WebMediaConstraints& constraints, 173 const blink::WebMediaConstraints& constraints,
184 blink::WebFrame* frame,
185 blink::WebMediaStreamSource* webkit_source); 174 blink::WebMediaStreamSource* webkit_source);
186 175
187 void CreateVideoTracks( 176 void CreateVideoTracks(
188 const StreamDeviceInfoArray& devices, 177 const StreamDeviceInfoArray& devices,
189 const blink::WebMediaConstraints& constraints, 178 const blink::WebMediaConstraints& constraints,
190 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks, 179 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks,
191 UserMediaRequestInfo* request); 180 UserMediaRequestInfo* request);
192 181
193 void CreateAudioTracks( 182 void CreateAudioTracks(
194 const StreamDeviceInfoArray& devices, 183 const StreamDeviceInfoArray& devices,
195 const blink::WebMediaConstraints& constraints, 184 const blink::WebMediaConstraints& constraints,
196 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks, 185 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks,
197 UserMediaRequestInfo* request); 186 UserMediaRequestInfo* request);
198 187
199 // Callback function triggered when all native versions of the 188 // Callback function triggered when all native versions of the
200 // underlying media sources and tracks have been created and started. 189 // underlying media sources and tracks have been created and started.
201 void OnCreateNativeTracksCompleted( 190 void OnCreateNativeTracksCompleted(
202 UserMediaRequestInfo* request, 191 UserMediaRequestInfo* request,
203 content::MediaStreamRequestResult result); 192 content::MediaStreamRequestResult result);
204 193
205 UserMediaRequestInfo* FindUserMediaRequestInfo(int request_id); 194 UserMediaRequestInfo* FindUserMediaRequestInfo(int request_id);
206 UserMediaRequestInfo* FindUserMediaRequestInfo( 195 UserMediaRequestInfo* FindUserMediaRequestInfo(
207 const blink::WebUserMediaRequest& request); 196 const blink::WebUserMediaRequest& request);
208 void DeleteUserMediaRequestInfo(UserMediaRequestInfo* request); 197 void DeleteUserMediaRequestInfo(UserMediaRequestInfo* request);
209 198
210 MediaDevicesRequestInfo* FindMediaDevicesRequestInfo(int request_id); 199 MediaDevicesRequestInfo* FindMediaDevicesRequestInfo(int request_id);
211 MediaDevicesRequestInfo* FindMediaDevicesRequestInfo( 200 MediaDevicesRequestInfo* FindMediaDevicesRequestInfo(
212 const blink::WebMediaDevicesRequest& request); 201 const blink::WebMediaDevicesRequest& request);
213 void DeleteMediaDevicesRequestInfo(MediaDevicesRequestInfo* request); 202 void CancelAndDeleteMediaDevicesRequest(MediaDevicesRequestInfo* request);
214 203
215 // Returns the source that use a device with |device.session_id| 204 // Returns the source that use a device with |device.session_id|
216 // and |device.device.id|. NULL if such source doesn't exist. 205 // and |device.device.id|. NULL if such source doesn't exist.
217 const blink::WebMediaStreamSource* FindLocalSource( 206 const blink::WebMediaStreamSource* FindLocalSource(
218 const StreamDeviceInfo& device) const; 207 const StreamDeviceInfo& device) const;
219 208
220 void StopLocalSource(const blink::WebMediaStreamSource& source, 209 void StopLocalSource(const blink::WebMediaStreamSource& source,
221 bool notify_dispatcher); 210 bool notify_dispatcher);
222 211
223 // Weak ref to a PeerConnectionDependencyFactory, owned by the RenderThread. 212 // Weak ref to a PeerConnectionDependencyFactory, owned by the RenderThread.
224 // It's valid for the lifetime of RenderThread. 213 // It's valid for the lifetime of RenderThread.
225 // TODO(xians): Remove this dependency once audio do not need it for local 214 // TODO(xians): Remove this dependency once audio do not need it for local
226 // audio. 215 // audio.
227 PeerConnectionDependencyFactory* dependency_factory_; 216 PeerConnectionDependencyFactory* const dependency_factory_;
228 217
229 // media_stream_dispatcher_ is a weak reference, owned by RenderView. It's 218 // MediaStreamImpl owns MediaStreamDispatcher instead of RenderFrameImpl
230 // valid for the lifetime of RenderView. 219 // (or RenderFrameObserver) to ensure tear-down occurs in the right order.
231 MediaStreamDispatcher* media_stream_dispatcher_; 220 const scoped_ptr<MediaStreamDispatcher> media_stream_dispatcher_;
232 221
233 LocalStreamSources local_sources_; 222 LocalStreamSources local_sources_;
234 223
235 UserMediaRequests user_media_requests_; 224 UserMediaRequests user_media_requests_;
236 225
237 // Requests to enumerate media devices. 226 // Requests to enumerate media devices.
238 MediaDevicesRequests media_devices_requests_; 227 MediaDevicesRequests media_devices_requests_;
239 228
229 // Note: This member must be the last to ensure all outstanding weak pointers
230 // are invalidated first.
231 base::WeakPtrFactory<MediaStreamImpl> weak_factory_;
232
240 DISALLOW_COPY_AND_ASSIGN(MediaStreamImpl); 233 DISALLOW_COPY_AND_ASSIGN(MediaStreamImpl);
241 }; 234 };
242 235
243 } // namespace content 236 } // namespace content
244 237
245 #endif // CONTENT_RENDERER_MEDIA_MEDIA_STREAM_IMPL_H_ 238 #endif // CONTENT_RENDERER_MEDIA_MEDIA_STREAM_IMPL_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698