diff --git a/content/base/public/nsHostObjectProtocolHandler.h b/content/base/public/nsHostObjectProtocolHandler.h index 0e8b334025ef..8df8c7db228f 100644 --- a/content/base/public/nsHostObjectProtocolHandler.h +++ b/content/base/public/nsHostObjectProtocolHandler.h @@ -18,10 +18,10 @@ #define RTSPURI_SCHEME "rtsp" class nsIDOMBlob; +class nsIDOMMediaStream; class nsIPrincipal; namespace mozilla { -class DOMMediaStream; namespace dom { class MediaSource; } @@ -122,7 +122,7 @@ extern nsresult NS_GetStreamForBlobURI(nsIURI* aURI, nsIInputStream** aStream); extern nsresult -NS_GetStreamForMediaStreamURI(nsIURI* aURI, mozilla::DOMMediaStream** aStream); +NS_GetStreamForMediaStreamURI(nsIURI* aURI, nsIDOMMediaStream** aStream); extern nsresult NS_GetSourceForMediaSourceURI(nsIURI* aURI, mozilla::dom::MediaSource** aSource); diff --git a/content/base/src/nsHostObjectProtocolHandler.cpp b/content/base/src/nsHostObjectProtocolHandler.cpp index 70d7b2311a5b..9956c383999a 100644 --- a/content/base/src/nsHostObjectProtocolHandler.cpp +++ b/content/base/src/nsHostObjectProtocolHandler.cpp @@ -11,7 +11,7 @@ #include "nsNetUtil.h" #include "nsIPrincipal.h" #include "nsDOMFile.h" -#include "DOMMediaStream.h" +#include "nsIDOMMediaStream.h" #include "mozilla/dom/MediaSource.h" #include "nsIMemoryReporter.h" #include "mozilla/Preferences.h" @@ -24,7 +24,7 @@ using mozilla::LoadInfo; // Hash table struct DataInfo { - // mObject is expected to be an nsIDOMBlob, DOMMediaStream, or MediaSource + // mObject is expected to be an nsIDOMBlob, nsIDOMMediaStream, or MediaSource nsCOMPtr mObject; nsCOMPtr mPrincipal; nsCString mStack; @@ -605,17 +605,20 @@ NS_GetStreamForBlobURI(nsIURI* aURI, nsIInputStream** aStream) } nsresult -NS_GetStreamForMediaStreamURI(nsIURI* aURI, mozilla::DOMMediaStream** aStream) +NS_GetStreamForMediaStreamURI(nsIURI* aURI, nsIDOMMediaStream** aStream) { NS_ASSERTION(IsMediaStreamURI(aURI), "Only call this with mediastream URIs"); *aStream = nullptr; - nsresult rv = CallQueryInterface(GetDataObject(aURI), aStream); - if (NS_FAILED(rv)) { + nsCOMPtr stream = do_QueryInterface(GetDataObject(aURI)); + if (!stream) { return NS_ERROR_DOM_BAD_URI; } - return rv; + + *aStream = stream; + NS_ADDREF(*aStream); + return NS_OK; } NS_IMETHODIMP diff --git a/content/html/content/public/HTMLMediaElement.h b/content/html/content/public/HTMLMediaElement.h index c27fc7d99429..923dde489e93 100755 --- a/content/html/content/public/HTMLMediaElement.h +++ b/content/html/content/public/HTMLMediaElement.h @@ -527,7 +527,6 @@ public: already_AddRefed GetMozSrcObject() const; void SetMozSrcObject(DOMMediaStream& aValue); - void SetMozSrcObject(DOMMediaStream* aValue); bool MozPreservesPitch() const { diff --git a/content/html/content/src/HTMLMediaElement.cpp b/content/html/content/src/HTMLMediaElement.cpp index eada45937e70..91f47a39d5eb 100755 --- a/content/html/content/src/HTMLMediaElement.cpp +++ b/content/html/content/src/HTMLMediaElement.cpp @@ -509,6 +509,14 @@ HTMLMediaElement::GetMozSrcObject() const return stream.forget(); } +NS_IMETHODIMP +HTMLMediaElement::GetMozSrcObject(nsIDOMMediaStream** aStream) +{ + nsRefPtr stream = GetMozSrcObject(); + stream.forget(aStream); + return NS_OK; +} + void HTMLMediaElement::SetMozSrcObject(DOMMediaStream& aValue) { @@ -516,10 +524,12 @@ HTMLMediaElement::SetMozSrcObject(DOMMediaStream& aValue) Load(); } -void -HTMLMediaElement::SetMozSrcObject(DOMMediaStream* aValue) +NS_IMETHODIMP +HTMLMediaElement::SetMozSrcObject(nsIDOMMediaStream* aStream) { - SetMozSrcObject(*aValue); + DOMMediaStream* stream = static_cast(aStream); + SetMozSrcObject(*stream); + return NS_OK; } /* readonly attribute nsIDOMHTMLMediaElement mozAutoplayEnabled; */ @@ -1134,7 +1144,7 @@ nsresult HTMLMediaElement::LoadResource() } if (IsMediaStreamURI(mLoadingSrc)) { - nsRefPtr stream; + nsCOMPtr stream; rv = NS_GetStreamForMediaStreamURI(mLoadingSrc, getter_AddRefs(stream)); if (NS_FAILED(rv)) { nsCString specUTF8; @@ -1144,7 +1154,7 @@ nsresult HTMLMediaElement::LoadResource() ReportLoadError("MediaLoadInvalidURI", params, ArrayLength(params)); return rv; } - SetupSrcMediaStreamPlayback(stream); + SetupSrcMediaStreamPlayback(static_cast(stream.get())); return NS_OK; } @@ -1863,6 +1873,13 @@ HTMLMediaElement::MozCaptureStream(ErrorResult& aRv) return stream.forget(); } +NS_IMETHODIMP HTMLMediaElement::MozCaptureStream(nsIDOMMediaStream** aStream) +{ + ErrorResult rv; + *aStream = MozCaptureStream(rv).take(); + return rv.ErrorCode(); +} + already_AddRefed HTMLMediaElement::MozCaptureStreamUntilEnded(ErrorResult& aRv) { @@ -1875,6 +1892,13 @@ HTMLMediaElement::MozCaptureStreamUntilEnded(ErrorResult& aRv) return stream.forget(); } +NS_IMETHODIMP HTMLMediaElement::MozCaptureStreamUntilEnded(nsIDOMMediaStream** aStream) +{ + ErrorResult rv; + *aStream = MozCaptureStreamUntilEnded(rv).take(); + return rv.ErrorCode(); +} + NS_IMETHODIMP HTMLMediaElement::GetMozAudioCaptured(bool* aCaptured) { *aCaptured = MozAudioCaptured(); diff --git a/content/media/DOMMediaStream.cpp b/content/media/DOMMediaStream.cpp index b6fcace53396..5fee7364fba1 100644 --- a/content/media/DOMMediaStream.cpp +++ b/content/media/DOMMediaStream.cpp @@ -19,20 +19,34 @@ using namespace mozilla; using namespace mozilla::dom; -NS_IMPL_CYCLE_COLLECTION_INHERITED(DOMMediaStream, - DOMEventTargetHelper, - mWindow, - mTracks, - mConsumersToKeepAlive); +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(DOMMediaStream) + NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY + NS_INTERFACE_MAP_ENTRY(nsISupports) + NS_INTERFACE_MAP_ENTRY(nsIDOMMediaStream) +NS_INTERFACE_MAP_END -NS_IMPL_ADDREF_INHERITED(DOMMediaStream, DOMEventTargetHelper) -NS_IMPL_RELEASE_INHERITED(DOMMediaStream, DOMEventTargetHelper) +NS_IMPL_CYCLE_COLLECTING_ADDREF(DOMMediaStream) +NS_IMPL_CYCLE_COLLECTING_RELEASE(DOMMediaStream) -NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(DOMMediaStream) - NS_INTERFACE_MAP_ENTRY(DOMMediaStream) -NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper) +NS_IMPL_CYCLE_COLLECTION_CLASS(DOMMediaStream) -NS_IMPL_ISUPPORTS_INHERITED0(DOMLocalMediaStream, DOMMediaStream) +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(DOMMediaStream) + tmp->Destroy(); + NS_IMPL_CYCLE_COLLECTION_UNLINK(mWindow) + NS_IMPL_CYCLE_COLLECTION_UNLINK(mTracks) + NS_IMPL_CYCLE_COLLECTION_UNLINK(mConsumersToKeepAlive) + NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER +NS_IMPL_CYCLE_COLLECTION_UNLINK_END +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(DOMMediaStream) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWindow) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mTracks) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mConsumersToKeepAlive) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END +NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(DOMMediaStream) + +NS_IMPL_ISUPPORTS_INHERITED(DOMLocalMediaStream, DOMMediaStream, + nsIDOMLocalMediaStream) NS_IMPL_CYCLE_COLLECTION_INHERITED(DOMAudioNodeMediaStream, DOMMediaStream, mStreamNode) @@ -79,12 +93,8 @@ public: track = stream->GetDOMTrackFor(mID); } if (mEvents & MediaStreamListener::TRACK_EVENT_ENDED) { - if (track) { - track->NotifyEnded(); - stream->NotifyMediaStreamTrackEnded(track); - } else { - NS_ERROR("track ended but not found"); - } + track->NotifyEnded(); + stream->NotifyMediaStreamTrackEnded(track); } return NS_OK; } diff --git a/content/media/DOMMediaStream.h b/content/media/DOMMediaStream.h index 66aecc16bbc5..c5a82d4b12be 100644 --- a/content/media/DOMMediaStream.h +++ b/content/media/DOMMediaStream.h @@ -6,13 +6,13 @@ #ifndef NSDOMMEDIASTREAM_H_ #define NSDOMMEDIASTREAM_H_ +#include "nsIDOMMediaStream.h" #include "nsCycleCollectionParticipant.h" #include "nsWrapperCache.h" #include "StreamBuffer.h" #include "nsIDOMWindow.h" #include "nsIPrincipal.h" #include "mozilla/PeerIdentity.h" -#include "mozilla/DOMEventTargetHelper.h" class nsXPCClassInfo; @@ -48,14 +48,11 @@ class MediaTrackListListener; class MediaStreamDirectListener; -#define NS_DOMMEDIASTREAM_IID \ -{ 0x8cb65468, 0x66c0, 0x444e, \ - { 0x89, 0x9f, 0x89, 0x1d, 0x9e, 0xd2, 0xbe, 0x7c } } - /** * DOM wrapper for MediaStreams. */ -class DOMMediaStream : public DOMEventTargetHelper +class DOMMediaStream : public nsIDOMMediaStream, + public nsWrapperCache { friend class DOMLocalMediaStream; typedef dom::MediaStreamTrack MediaStreamTrack; @@ -72,11 +69,8 @@ public: DOMMediaStream(); - NS_DECL_ISUPPORTS_INHERITED - NS_REALLY_FORWARD_NSIDOMEVENTTARGET(DOMEventTargetHelper) - NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(DOMMediaStream, - DOMEventTargetHelper) - NS_DECLARE_STATIC_IID_ACCESSOR(NS_DOMMEDIASTREAM_IID) + NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(DOMMediaStream) + NS_DECL_CYCLE_COLLECTING_ISUPPORTS nsIDOMWindow* GetParentObject() const { @@ -299,20 +293,13 @@ private: nsAutoPtr mPeerIdentity; }; -NS_DEFINE_STATIC_IID_ACCESSOR(DOMMediaStream, - NS_DOMMEDIASTREAM_IID) - -#define NS_DOMLOCALMEDIASTREAM_IID \ -{ 0xb1437260, 0xec61, 0x4dfa, \ - { 0x92, 0x54, 0x04, 0x44, 0xe2, 0xb5, 0x94, 0x9c } } - -class DOMLocalMediaStream : public DOMMediaStream +class DOMLocalMediaStream : public DOMMediaStream, + public nsIDOMLocalMediaStream { public: DOMLocalMediaStream() {} NS_DECL_ISUPPORTS_INHERITED - NS_DECLARE_STATIC_IID_ACCESSOR(NS_DOMLOCALMEDIASTREAM_IID) virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE; @@ -336,9 +323,6 @@ protected: virtual ~DOMLocalMediaStream(); }; -NS_DEFINE_STATIC_IID_ACCESSOR(DOMLocalMediaStream, - NS_DOMLOCALMEDIASTREAM_IID) - class DOMAudioNodeMediaStream : public DOMMediaStream { typedef dom::AudioNode AudioNode; diff --git a/content/media/webspeech/recognition/SpeechRecognition.cpp b/content/media/webspeech/recognition/SpeechRecognition.cpp index 1092e2f17ba4..490f258f40cf 100644 --- a/content/media/webspeech/recognition/SpeechRecognition.cpp +++ b/content/media/webspeech/recognition/SpeechRecognition.cpp @@ -935,11 +935,8 @@ NS_IMPL_ISUPPORTS(SpeechRecognition::GetUserMediaSuccessCallback, nsIDOMGetUserM NS_IMETHODIMP SpeechRecognition::GetUserMediaSuccessCallback::OnSuccess(nsISupports* aStream) { - DOMLocalMediaStream *localStream = nullptr; - nsresult rv = CallQueryInterface(aStream, &localStream); - if (NS_SUCCEEDED(rv)) { - mRecognition->StartRecording(localStream); - } + nsCOMPtr localStream = do_QueryInterface(aStream); + mRecognition->StartRecording(static_cast(localStream.get())); return NS_OK; } diff --git a/dom/interfaces/html/nsIDOMHTMLMediaElement.idl b/dom/interfaces/html/nsIDOMHTMLMediaElement.idl index d7012347f28e..5ff618ba5f7f 100644 --- a/dom/interfaces/html/nsIDOMHTMLMediaElement.idl +++ b/dom/interfaces/html/nsIDOMHTMLMediaElement.idl @@ -8,6 +8,8 @@ #include "nsIDOMMediaError.idl" #include "nsIDOMTimeRanges.idl" +interface nsIDOMMediaStream; + /** * The nsIDOMHTMLMediaElement interface is an interface to be implemented by the HTML *