| Index: content/renderer/media/media_stream_impl.h
|
| diff --git a/content/renderer/media/media_stream_impl.h b/content/renderer/media/media_stream_impl.h
|
| index ad960201f361df85e1c55c96ba6b3241288ae89e..0effc2a9074863c3dc6764625a4d2839a3332a31 100644
|
| --- a/content/renderer/media/media_stream_impl.h
|
| +++ b/content/renderer/media/media_stream_impl.h
|
| @@ -16,7 +16,7 @@
|
| #include "base/memory/weak_ptr.h"
|
| #include "base/threading/non_thread_safe.h"
|
| #include "content/common/content_export.h"
|
| -#include "content/public/renderer/render_view_observer.h"
|
| +#include "content/public/renderer/render_frame_observer.h"
|
| #include "content/renderer/media/media_stream_dispatcher_eventhandler.h"
|
| #include "content/renderer/media/media_stream_source.h"
|
| #include "third_party/WebKit/public/platform/WebMediaStream.h"
|
| @@ -38,20 +38,23 @@ class VideoCapturerDelegate;
|
| // (via MediaStreamDispatcher and MediaStreamDispatcherHost)
|
| // in the browser process. It must be created, called and destroyed on the
|
| // render thread.
|
| -// MediaStreamImpl have weak pointers to a MediaStreamDispatcher.
|
| class CONTENT_EXPORT MediaStreamImpl
|
| - : public RenderViewObserver,
|
| + : public RenderFrameObserver,
|
| NON_EXPORTED_BASE(public blink::WebUserMediaClient),
|
| public MediaStreamDispatcherEventHandler,
|
| - public base::SupportsWeakPtr<MediaStreamImpl>,
|
| NON_EXPORTED_BASE(public base::NonThreadSafe) {
|
| public:
|
| + // |render_frame| and |dependency_factory| must outlive this instance.
|
| MediaStreamImpl(
|
| - RenderView* render_view,
|
| - MediaStreamDispatcher* media_stream_dispatcher,
|
| - PeerConnectionDependencyFactory* dependency_factory);
|
| + RenderFrame* render_frame,
|
| + PeerConnectionDependencyFactory* dependency_factory,
|
| + scoped_ptr<MediaStreamDispatcher> media_stream_dispatcher);
|
| virtual ~MediaStreamImpl();
|
|
|
| + MediaStreamDispatcher* media_stream_dispatcher() const {
|
| + return media_stream_dispatcher_.get();
|
| + }
|
| +
|
| // blink::WebUserMediaClient implementation
|
| virtual void requestUserMedia(
|
| const blink::WebUserMediaRequest& user_media_request);
|
| @@ -82,9 +85,8 @@ class CONTENT_EXPORT MediaStreamImpl
|
| const StreamDeviceInfo& device_info) OVERRIDE;
|
| virtual void OnDeviceOpenFailed(int request_id) OVERRIDE;
|
|
|
| - // RenderViewObserver OVERRIDE
|
| - virtual void FrameDetached(blink::WebFrame* frame) OVERRIDE;
|
| - virtual void FrameWillClose(blink::WebFrame* frame) OVERRIDE;
|
| + // RenderFrameObserver OVERRIDE
|
| + virtual void FrameWillClose() OVERRIDE;
|
|
|
| protected:
|
| // Called when |source| has been stopped from JavaScript.
|
| @@ -119,7 +121,6 @@ class CONTENT_EXPORT MediaStreamImpl
|
| ResourcesReady;
|
|
|
| UserMediaRequestInfo(int request_id,
|
| - blink::WebFrame* frame,
|
| const blink::WebUserMediaRequest& request,
|
| bool enable_automatic_output_device_selection);
|
| ~UserMediaRequestInfo();
|
| @@ -128,7 +129,6 @@ class CONTENT_EXPORT MediaStreamImpl
|
| // OnStreamGenerated.
|
| bool generated;
|
| const bool enable_automatic_output_device_selection;
|
| - blink::WebFrame* frame; // WebFrame that requested the MediaStream.
|
| blink::WebMediaStream web_stream;
|
| blink::WebUserMediaRequest request;
|
|
|
| @@ -160,17 +160,7 @@ class CONTENT_EXPORT MediaStreamImpl
|
| };
|
| typedef ScopedVector<UserMediaRequestInfo> UserMediaRequests;
|
|
|
| - struct LocalStreamSource {
|
| - LocalStreamSource(blink::WebFrame* frame,
|
| - const blink::WebMediaStreamSource& source)
|
| - : frame(frame), source(source) {
|
| - }
|
| - // |frame| is the WebFrame that requested |source|. NULL in unit tests.
|
| - // TODO(perkj): Change so that |frame| is not NULL in unit tests.
|
| - blink::WebFrame* frame;
|
| - blink::WebMediaStreamSource source;
|
| - };
|
| - typedef std::vector<LocalStreamSource> LocalStreamSources;
|
| + typedef std::vector<blink::WebMediaStreamSource> LocalStreamSources;
|
|
|
| struct MediaDevicesRequestInfo;
|
| typedef ScopedVector<MediaDevicesRequestInfo> MediaDevicesRequests;
|
| @@ -181,7 +171,6 @@ class CONTENT_EXPORT MediaStreamImpl
|
| const StreamDeviceInfo& device,
|
| blink::WebMediaStreamSource::Type type,
|
| const blink::WebMediaConstraints& constraints,
|
| - blink::WebFrame* frame,
|
| blink::WebMediaStreamSource* webkit_source);
|
|
|
| void CreateVideoTracks(
|
| @@ -210,7 +199,7 @@ class CONTENT_EXPORT MediaStreamImpl
|
| MediaDevicesRequestInfo* FindMediaDevicesRequestInfo(int request_id);
|
| MediaDevicesRequestInfo* FindMediaDevicesRequestInfo(
|
| const blink::WebMediaDevicesRequest& request);
|
| - void DeleteMediaDevicesRequestInfo(MediaDevicesRequestInfo* request);
|
| + void CancelAndDeleteMediaDevicesRequest(MediaDevicesRequestInfo* request);
|
|
|
| // Returns the source that use a device with |device.session_id|
|
| // and |device.device.id|. NULL if such source doesn't exist.
|
| @@ -224,11 +213,11 @@ class CONTENT_EXPORT MediaStreamImpl
|
| // It's valid for the lifetime of RenderThread.
|
| // TODO(xians): Remove this dependency once audio do not need it for local
|
| // audio.
|
| - PeerConnectionDependencyFactory* dependency_factory_;
|
| + PeerConnectionDependencyFactory* const dependency_factory_;
|
|
|
| - // media_stream_dispatcher_ is a weak reference, owned by RenderView. It's
|
| - // valid for the lifetime of RenderView.
|
| - MediaStreamDispatcher* media_stream_dispatcher_;
|
| + // MediaStreamImpl owns MediaStreamDispatcher instead of RenderFrameImpl
|
| + // (or RenderFrameObserver) to ensure tear-down occurs in the right order.
|
| + const scoped_ptr<MediaStreamDispatcher> media_stream_dispatcher_;
|
|
|
| LocalStreamSources local_sources_;
|
|
|
| @@ -237,6 +226,10 @@ class CONTENT_EXPORT MediaStreamImpl
|
| // Requests to enumerate media devices.
|
| MediaDevicesRequests media_devices_requests_;
|
|
|
| + // Note: This member must be the last to ensure all outstanding weak pointers
|
| + // are invalidated first.
|
| + base::WeakPtrFactory<MediaStreamImpl> weak_factory_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(MediaStreamImpl);
|
| };
|
|
|
|
|