| 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 #ifndef CONTENT_RENDERER_MEDIA_USER_MEDIA_CLIENT_IMPL_H_ | 5 #ifndef CONTENT_RENDERER_MEDIA_USER_MEDIA_CLIENT_IMPL_H_ |
| 6 #define CONTENT_RENDERER_MEDIA_USER_MEDIA_CLIENT_IMPL_H_ | 6 #define CONTENT_RENDERER_MEDIA_USER_MEDIA_CLIENT_IMPL_H_ |
| 7 | 7 |
| 8 #include <list> |
| 8 #include <memory> | 9 #include <memory> |
| 9 #include <string> | 10 #include <string> |
| 10 #include <vector> | 11 #include <vector> |
| 11 | 12 |
| 12 #include "base/compiler_specific.h" | 13 #include "base/compiler_specific.h" |
| 13 #include "base/macros.h" | 14 #include "base/macros.h" |
| 14 #include "base/memory/ref_counted.h" | 15 #include "base/memory/ref_counted.h" |
| 15 #include "base/memory/weak_ptr.h" | 16 #include "base/memory/weak_ptr.h" |
| 17 #include "base/optional.h" |
| 16 #include "base/threading/non_thread_safe.h" | 18 #include "base/threading/non_thread_safe.h" |
| 17 #include "content/common/content_export.h" | 19 #include "content/common/content_export.h" |
| 18 #include "content/common/media/media_devices.h" | 20 #include "content/common/media/media_devices.h" |
| 19 #include "content/common/media/media_devices.mojom.h" | 21 #include "content/common/media/media_devices.mojom.h" |
| 20 #include "content/public/renderer/render_frame_observer.h" | 22 #include "content/public/renderer/render_frame_observer.h" |
| 21 #include "content/renderer/media/media_devices_event_dispatcher.h" | 23 #include "content/renderer/media/media_devices_event_dispatcher.h" |
| 22 #include "content/renderer/media/media_stream_dispatcher_eventhandler.h" | 24 #include "content/renderer/media/media_stream_dispatcher_eventhandler.h" |
| 23 #include "content/renderer/media/media_stream_source.h" | 25 #include "content/renderer/media/media_stream_source.h" |
| 24 #include "services/service_manager/public/cpp/interface_provider.h" | 26 #include "services/service_manager/public/cpp/interface_provider.h" |
| 25 #include "third_party/WebKit/public/platform/WebMediaStream.h" | 27 #include "third_party/WebKit/public/platform/WebMediaStream.h" |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 const StreamDeviceInfo& device_info) override; | 91 const StreamDeviceInfo& device_info) override; |
| 90 void OnDeviceOpenFailed(int request_id) override; | 92 void OnDeviceOpenFailed(int request_id) override; |
| 91 | 93 |
| 92 // RenderFrameObserver override | 94 // RenderFrameObserver override |
| 93 void WillCommitProvisionalLoad() override; | 95 void WillCommitProvisionalLoad() override; |
| 94 | 96 |
| 95 void SetMediaDevicesDispatcherForTesting( | 97 void SetMediaDevicesDispatcherForTesting( |
| 96 ::mojom::MediaDevicesDispatcherHostPtr media_devices_dispatcher); | 98 ::mojom::MediaDevicesDispatcherHostPtr media_devices_dispatcher); |
| 97 | 99 |
| 98 protected: | 100 protected: |
| 99 // Called when |source| has been stopped from JavaScript. | |
| 100 void OnLocalSourceStopped(const blink::WebMediaStreamSource& source); | |
| 101 | |
| 102 // These methods are virtual for test purposes. A test can override them to | 101 // These methods are virtual for test purposes. A test can override them to |
| 103 // test requesting local media streams. The function notifies WebKit that the | 102 // test requesting local media streams. The function notifies WebKit that the |
| 104 // |request| have completed. | 103 // |request| have completed. |
| 105 virtual void GetUserMediaRequestSucceeded( | 104 virtual void GetUserMediaRequestSucceeded(const blink::WebMediaStream& stream, |
| 106 const blink::WebMediaStream& stream, | 105 blink::WebUserMediaRequest request); |
| 107 blink::WebUserMediaRequest request_info); | 106 virtual void GetUserMediaRequestFailed(blink::WebUserMediaRequest request, |
| 108 void DelayedGetUserMediaRequestSucceeded( | 107 MediaStreamRequestResult result, |
| 109 const blink::WebMediaStream& stream, | 108 const blink::WebString& result_name); |
| 110 blink::WebUserMediaRequest request_info); | |
| 111 virtual void GetUserMediaRequestFailed( | |
| 112 blink::WebUserMediaRequest request_info, | |
| 113 MediaStreamRequestResult result, | |
| 114 const blink::WebString& result_name); | |
| 115 void DelayedGetUserMediaRequestFailed( | |
| 116 blink::WebUserMediaRequest request_info, | |
| 117 MediaStreamRequestResult result, | |
| 118 const blink::WebString& result_name); | |
| 119 | 109 |
| 120 virtual void EnumerateDevicesSucceded( | 110 virtual void EnumerateDevicesSucceded( |
| 121 blink::WebMediaDevicesRequest* request, | 111 blink::WebMediaDevicesRequest* request, |
| 122 blink::WebVector<blink::WebMediaDeviceInfo>& devices); | 112 blink::WebVector<blink::WebMediaDeviceInfo>& devices); |
| 123 | 113 |
| 124 // Creates a MediaStreamAudioSource/MediaStreamVideoSource objects. | 114 // Creates a MediaStreamAudioSource/MediaStreamVideoSource objects. |
| 125 // These are virtual for test purposes. | 115 // These are virtual for test purposes. |
| 126 virtual MediaStreamAudioSource* CreateAudioSource( | 116 virtual MediaStreamAudioSource* CreateAudioSource( |
| 127 const StreamDeviceInfo& device, | 117 const StreamDeviceInfo& device, |
| 128 const blink::WebMediaConstraints& constraints, | 118 const blink::WebMediaConstraints& constraints, |
| 129 const MediaStreamSource::ConstraintsCallback& source_ready); | 119 const MediaStreamSource::ConstraintsCallback& source_ready); |
| 130 virtual MediaStreamVideoSource* CreateVideoSource( | 120 virtual MediaStreamVideoSource* CreateVideoSource( |
| 131 const StreamDeviceInfo& device, | 121 const StreamDeviceInfo& device, |
| 132 const MediaStreamSource::SourceStoppedCallback& stop_callback); | 122 const MediaStreamSource::SourceStoppedCallback& stop_callback); |
| 133 | 123 |
| 134 // Class for storing information about a WebKit request to create a | 124 // Returns no value if there is no request being processed. Use only for |
| 135 // MediaStream. | 125 // testing. |
| 136 class UserMediaRequestInfo | 126 // TODO(guidou): Remove this method once spec-compliant constraints algorithm |
| 137 : public base::SupportsWeakPtr<UserMediaRequestInfo> { | 127 // for audio is implemented. http://crbug.com/657733 |
| 138 public: | 128 base::Optional<bool> AutomaticOutputDeviceSelectionEnabledForCurrentRequest(); |
| 139 typedef base::Callback<void(UserMediaRequestInfo* request_info, | |
| 140 MediaStreamRequestResult result, | |
| 141 const blink::WebString& result_name)> | |
| 142 ResourcesReady; | |
| 143 | |
| 144 UserMediaRequestInfo(int request_id, | |
| 145 const blink::WebUserMediaRequest& request, | |
| 146 bool enable_automatic_output_device_selection); | |
| 147 ~UserMediaRequestInfo(); | |
| 148 int request_id; | |
| 149 // True if MediaStreamDispatcher has generated the stream, see | |
| 150 // OnStreamGenerated. | |
| 151 bool generated; | |
| 152 const bool enable_automatic_output_device_selection; | |
| 153 blink::WebMediaStream web_stream; | |
| 154 blink::WebUserMediaRequest request; | |
| 155 | |
| 156 void StartAudioTrack(const blink::WebMediaStreamTrack& track, | |
| 157 bool is_pending); | |
| 158 | |
| 159 blink::WebMediaStreamTrack CreateAndStartVideoTrack( | |
| 160 const blink::WebMediaStreamSource& source, | |
| 161 const blink::WebMediaConstraints& constraints); | |
| 162 | |
| 163 // Triggers |callback| when all sources used in this request have either | |
| 164 // successfully started, or a source has failed to start. | |
| 165 void CallbackOnTracksStarted(const ResourcesReady& callback); | |
| 166 | |
| 167 bool HasPendingSources() const; | |
| 168 | |
| 169 // Called when a local audio source has finished (or failed) initializing. | |
| 170 void OnAudioSourceStarted(MediaStreamSource* source, | |
| 171 MediaStreamRequestResult result, | |
| 172 const blink::WebString& result_name); | |
| 173 | |
| 174 private: | |
| 175 void OnTrackStarted( | |
| 176 MediaStreamSource* source, | |
| 177 MediaStreamRequestResult result, | |
| 178 const blink::WebString& result_name); | |
| 179 | |
| 180 // Cheks if the sources for all tracks have been started and if so, | |
| 181 // invoke the |ready_callback_|. Note that the caller should expect | |
| 182 // that |this| might be deleted when the function returns. | |
| 183 void CheckAllTracksStarted(); | |
| 184 | |
| 185 ResourcesReady ready_callback_; | |
| 186 MediaStreamRequestResult request_result_; | |
| 187 blink::WebString request_result_name_; | |
| 188 // Sources used in this request. | |
| 189 std::vector<blink::WebMediaStreamSource> sources_; | |
| 190 std::vector<MediaStreamSource*> sources_waiting_for_callback_; | |
| 191 }; | |
| 192 typedef std::vector<std::unique_ptr<UserMediaRequestInfo>> UserMediaRequests; | |
| 193 | |
| 194 protected: | |
| 195 // These methods can be accessed in unit tests. | |
| 196 UserMediaRequestInfo* FindUserMediaRequestInfo(int request_id); | |
| 197 UserMediaRequestInfo* FindUserMediaRequestInfo( | |
| 198 const blink::WebUserMediaRequest& request); | |
| 199 | |
| 200 void DeleteUserMediaRequestInfo(UserMediaRequestInfo* request); | |
| 201 | 129 |
| 202 private: | 130 private: |
| 131 class UserMediaRequestInfo; |
| 203 typedef std::vector<blink::WebMediaStreamSource> LocalStreamSources; | 132 typedef std::vector<blink::WebMediaStreamSource> LocalStreamSources; |
| 204 | 133 |
| 134 void MaybeProcessNextRequestInfo(); |
| 135 bool IsCurrentRequestInfo(int request_id) const; |
| 136 bool IsCurrentRequestInfo(const blink::WebUserMediaRequest& request) const; |
| 137 bool DeleteRequestInfo(const blink::WebUserMediaRequest& request); |
| 138 void DelayedGetUserMediaRequestSucceeded(const blink::WebMediaStream& stream, |
| 139 blink::WebUserMediaRequest request); |
| 140 void DelayedGetUserMediaRequestFailed(blink::WebUserMediaRequest request, |
| 141 MediaStreamRequestResult result, |
| 142 const blink::WebString& result_name); |
| 143 |
| 205 // RenderFrameObserver implementation. | 144 // RenderFrameObserver implementation. |
| 206 void OnDestruct() override; | 145 void OnDestruct() override; |
| 207 | 146 |
| 147 // Called when |source| has been stopped from JavaScript. |
| 148 void OnLocalSourceStopped(const blink::WebMediaStreamSource& source); |
| 149 |
| 208 // Creates a WebKit representation of stream sources based on | 150 // Creates a WebKit representation of stream sources based on |
| 209 // |devices| from the MediaStreamDispatcher. | 151 // |devices| from the MediaStreamDispatcher. |
| 210 blink::WebMediaStreamSource InitializeVideoSourceObject( | 152 blink::WebMediaStreamSource InitializeVideoSourceObject( |
| 211 const StreamDeviceInfo& device, | 153 const StreamDeviceInfo& device, |
| 212 const blink::WebMediaConstraints& constraints); | 154 const blink::WebMediaConstraints& constraints); |
| 213 | 155 |
| 214 blink::WebMediaStreamSource InitializeAudioSourceObject( | 156 blink::WebMediaStreamSource InitializeAudioSourceObject( |
| 215 const StreamDeviceInfo& device, | 157 const StreamDeviceInfo& device, |
| 216 const blink::WebMediaConstraints& constraints, | 158 const blink::WebMediaConstraints& constraints, |
| 217 bool* is_pending); | 159 bool* is_pending); |
| 218 | 160 |
| 219 void CreateVideoTracks( | 161 void CreateVideoTracks( |
| 220 const StreamDeviceInfoArray& devices, | 162 const StreamDeviceInfoArray& devices, |
| 221 const blink::WebMediaConstraints& constraints, | 163 const blink::WebMediaConstraints& constraints, |
| 222 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks, | 164 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks); |
| 223 UserMediaRequestInfo* request); | |
| 224 | 165 |
| 225 void CreateAudioTracks( | 166 void CreateAudioTracks( |
| 226 const StreamDeviceInfoArray& devices, | 167 const StreamDeviceInfoArray& devices, |
| 227 const blink::WebMediaConstraints& constraints, | 168 const blink::WebMediaConstraints& constraints, |
| 228 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks, | 169 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks); |
| 229 UserMediaRequestInfo* request); | |
| 230 | 170 |
| 231 // Callback function triggered when all native versions of the | 171 // Callback function triggered when all native versions of the |
| 232 // underlying media sources and tracks have been created and started. | 172 // underlying media sources and tracks have been created and started. |
| 233 void OnCreateNativeTracksCompleted(const std::string& label, | 173 void OnCreateNativeTracksCompleted(const std::string& label, |
| 234 UserMediaRequestInfo* request, | 174 UserMediaRequestInfo* request, |
| 235 MediaStreamRequestResult result, | 175 MediaStreamRequestResult result, |
| 236 const blink::WebString& result_name); | 176 const blink::WebString& result_name); |
| 237 | 177 |
| 238 void OnStreamGeneratedForCancelledRequest( | 178 void OnStreamGeneratedForCancelledRequest( |
| 239 const StreamDeviceInfoArray& audio_array, | 179 const StreamDeviceInfoArray& audio_array, |
| 240 const StreamDeviceInfoArray& video_array); | 180 const StreamDeviceInfoArray& video_array); |
| 241 | 181 |
| 242 static void OnAudioSourceStartedOnAudioThread( | 182 static void OnAudioSourceStartedOnAudioThread( |
| 243 scoped_refptr<base::SingleThreadTaskRunner> task_runner, | 183 scoped_refptr<base::SingleThreadTaskRunner> task_runner, |
| 244 base::WeakPtr<UserMediaClientImpl> weak_ptr, | 184 base::WeakPtr<UserMediaClientImpl> weak_ptr, |
| 245 MediaStreamSource* source, | 185 MediaStreamSource* source, |
| 246 MediaStreamRequestResult result, | 186 MediaStreamRequestResult result, |
| 247 const blink::WebString& result_name); | 187 const blink::WebString& result_name); |
| 248 | 188 |
| 249 void OnAudioSourceStarted(MediaStreamSource* source, | 189 void OnAudioSourceStarted(MediaStreamSource* source, |
| 250 MediaStreamRequestResult result, | 190 MediaStreamRequestResult result, |
| 251 const blink::WebString& result_name); | 191 const blink::WebString& result_name); |
| 252 | 192 |
| 253 void NotifyAllRequestsOfAudioSourceStarted( | 193 void NotifyCurrentRequestInfoOfAudioSourceStarted( |
| 254 MediaStreamSource* source, | 194 MediaStreamSource* source, |
| 255 MediaStreamRequestResult result, | 195 MediaStreamRequestResult result, |
| 256 const blink::WebString& result_name); | 196 const blink::WebString& result_name); |
| 257 | 197 |
| 258 using EnumerationResult = std::vector<MediaDeviceInfoArray>; | 198 using EnumerationResult = std::vector<MediaDeviceInfoArray>; |
| 259 void FinalizeEnumerateDevices(blink::WebMediaDevicesRequest request, | 199 void FinalizeEnumerateDevices(blink::WebMediaDevicesRequest request, |
| 260 const EnumerationResult& result); | 200 const EnumerationResult& result); |
| 261 | 201 |
| 262 void DeleteAllUserMediaRequests(); | 202 void DeleteAllUserMediaRequests(); |
| 263 | 203 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 282 | 222 |
| 283 // Returns true if we do find and remove the |source|. | 223 // Returns true if we do find and remove the |source|. |
| 284 // Otherwise returns false. | 224 // Otherwise returns false. |
| 285 bool RemoveLocalSource(const blink::WebMediaStreamSource& source); | 225 bool RemoveLocalSource(const blink::WebMediaStreamSource& source); |
| 286 | 226 |
| 287 void StopLocalSource(const blink::WebMediaStreamSource& source, | 227 void StopLocalSource(const blink::WebMediaStreamSource& source, |
| 288 bool notify_dispatcher); | 228 bool notify_dispatcher); |
| 289 | 229 |
| 290 const ::mojom::MediaDevicesDispatcherHostPtr& GetMediaDevicesDispatcher(); | 230 const ::mojom::MediaDevicesDispatcherHostPtr& GetMediaDevicesDispatcher(); |
| 291 | 231 |
| 292 struct RequestSettings; | |
| 293 | |
| 294 void SelectAudioInputDevice( | 232 void SelectAudioInputDevice( |
| 295 int request_id, | |
| 296 const blink::WebUserMediaRequest& user_media_request, | 233 const blink::WebUserMediaRequest& user_media_request, |
| 297 std::unique_ptr<StreamControls> controls, | |
| 298 const RequestSettings& request_settings, | |
| 299 const EnumerationResult& device_enumeration); | 234 const EnumerationResult& device_enumeration); |
| 300 | 235 |
| 301 void SetupVideoInput(int request_id, | 236 void SetupVideoInput(const blink::WebUserMediaRequest& user_media_request); |
| 302 const blink::WebUserMediaRequest& user_media_request, | |
| 303 std::unique_ptr<StreamControls> controls, | |
| 304 const RequestSettings& request_settings); | |
| 305 | 237 |
| 306 void SelectVideoDeviceSourceSettings( | 238 void SelectVideoDeviceSourceSettings( |
| 307 int request_id, | |
| 308 const blink::WebUserMediaRequest& user_media_request, | 239 const blink::WebUserMediaRequest& user_media_request, |
| 309 std::unique_ptr<StreamControls> controls, | |
| 310 const RequestSettings& request_settings, | |
| 311 std::vector<::mojom::VideoInputDeviceCapabilitiesPtr> | 240 std::vector<::mojom::VideoInputDeviceCapabilitiesPtr> |
| 312 video_input_capabilities); | 241 video_input_capabilities); |
| 313 | 242 |
| 314 void FinalizeSelectVideoDeviceSourceSettings( | 243 void FinalizeSelectVideoDeviceSourceSettings( |
| 315 int request_id, | |
| 316 const blink::WebUserMediaRequest& user_media_request, | 244 const blink::WebUserMediaRequest& user_media_request, |
| 317 std::unique_ptr<StreamControls> controls, | |
| 318 const RequestSettings& request_settings, | |
| 319 const VideoDeviceCaptureSourceSelectionResult& selection_result); | 245 const VideoDeviceCaptureSourceSelectionResult& selection_result); |
| 320 | 246 |
| 321 void FinalizeSelectVideoContentSourceSettings( | 247 void FinalizeSelectVideoContentSourceSettings( |
| 322 int request_id, | |
| 323 const blink::WebUserMediaRequest& user_media_request, | 248 const blink::WebUserMediaRequest& user_media_request, |
| 324 std::unique_ptr<StreamControls> controls, | |
| 325 const RequestSettings& request_settings, | |
| 326 const VideoContentCaptureSourceSelectionResult& selection_result); | 249 const VideoContentCaptureSourceSelectionResult& selection_result); |
| 327 | 250 |
| 328 void FinalizeRequestUserMedia( | 251 void GenerateStreamForCurrentRequestInfo(); |
| 329 int request_id, | |
| 330 const blink::WebUserMediaRequest& user_media_request, | |
| 331 std::unique_ptr<StreamControls> controls, | |
| 332 const RequestSettings& request_settings); | |
| 333 | 252 |
| 334 // Callback invoked by MediaDevicesEventDispatcher when a device-change | 253 // Callback invoked by MediaDevicesEventDispatcher when a device-change |
| 335 // notification arrives. | 254 // notification arrives. |
| 336 void DevicesChanged(MediaDeviceType device_type, | 255 void DevicesChanged(MediaDeviceType device_type, |
| 337 const MediaDeviceInfoArray& device_infos); | 256 const MediaDeviceInfoArray& device_infos); |
| 338 | 257 |
| 339 // Weak ref to a PeerConnectionDependencyFactory, owned by the RenderThread. | 258 // Weak ref to a PeerConnectionDependencyFactory, owned by the RenderThread. |
| 340 // It's valid for the lifetime of RenderThread. | 259 // It's valid for the lifetime of RenderThread. |
| 341 // TODO(xians): Remove this dependency once audio do not need it for local | 260 // TODO(xians): Remove this dependency once audio do not need it for local |
| 342 // audio. | 261 // audio. |
| 343 PeerConnectionDependencyFactory* const dependency_factory_; | 262 PeerConnectionDependencyFactory* const dependency_factory_; |
| 344 | 263 |
| 345 // UserMediaClientImpl owns MediaStreamDispatcher instead of RenderFrameImpl | 264 // UserMediaClientImpl owns MediaStreamDispatcher instead of RenderFrameImpl |
| 346 // (or RenderFrameObserver) to ensure tear-down occurs in the right order. | 265 // (or RenderFrameObserver) to ensure tear-down occurs in the right order. |
| 347 const std::unique_ptr<MediaStreamDispatcher> media_stream_dispatcher_; | 266 const std::unique_ptr<MediaStreamDispatcher> media_stream_dispatcher_; |
| 348 | 267 |
| 349 ::mojom::MediaDevicesDispatcherHostPtr media_devices_dispatcher_; | 268 ::mojom::MediaDevicesDispatcherHostPtr media_devices_dispatcher_; |
| 350 | 269 |
| 351 LocalStreamSources local_sources_; | 270 LocalStreamSources local_sources_; |
| 352 LocalStreamSources pending_local_sources_; | 271 LocalStreamSources pending_local_sources_; |
| 353 | 272 |
| 354 UserMediaRequests user_media_requests_; | 273 // UserMedia requests are processed sequentially. |current_request_info_| |
| 274 // contains the request currently being processed, if any, and |
| 275 // |pending_request_infos_| is a list of queued requests. |
| 276 std::unique_ptr<UserMediaRequestInfo> current_request_info_; |
| 277 std::list<std::unique_ptr<UserMediaRequestInfo>> pending_request_infos_; |
| 278 |
| 355 MediaDevicesEventDispatcher::SubscriptionIdList | 279 MediaDevicesEventDispatcher::SubscriptionIdList |
| 356 device_change_subscription_ids_; | 280 device_change_subscription_ids_; |
| 357 | 281 |
| 358 blink::WebMediaDeviceChangeObserver media_device_change_observer_; | 282 blink::WebMediaDeviceChangeObserver media_device_change_observer_; |
| 359 | 283 |
| 360 const scoped_refptr<base::TaskRunner> worker_task_runner_; | 284 const scoped_refptr<base::TaskRunner> worker_task_runner_; |
| 361 | 285 |
| 362 // Note: This member must be the last to ensure all outstanding weak pointers | 286 // Note: This member must be the last to ensure all outstanding weak pointers |
| 363 // are invalidated first. | 287 // are invalidated first. |
| 364 base::WeakPtrFactory<UserMediaClientImpl> weak_factory_; | 288 base::WeakPtrFactory<UserMediaClientImpl> weak_factory_; |
| 365 | 289 |
| 366 DISALLOW_COPY_AND_ASSIGN(UserMediaClientImpl); | 290 DISALLOW_COPY_AND_ASSIGN(UserMediaClientImpl); |
| 367 }; | 291 }; |
| 368 | 292 |
| 369 } // namespace content | 293 } // namespace content |
| 370 | 294 |
| 371 #endif // CONTENT_RENDERER_MEDIA_USER_MEDIA_CLIENT_IMPL_H_ | 295 #endif // CONTENT_RENDERER_MEDIA_USER_MEDIA_CLIENT_IMPL_H_ |
| OLD | NEW |