mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-04 13:07:52 +00:00
Backout bug 926746 part 3 (replaced with bug 945334) rs=jesup
This commit is contained in:
parent
54c1a6c666
commit
17baba88fd
@ -142,35 +142,31 @@ static nsresult ValidateTrackConstraints(
|
||||
}
|
||||
|
||||
ErrorCallbackRunnable::ErrorCallbackRunnable(
|
||||
nsMainThreadPtrHandle<nsIDOMGetUserMediaSuccessCallback>& aSuccess,
|
||||
nsMainThreadPtrHandle<nsIDOMGetUserMediaErrorCallback>& aError,
|
||||
already_AddRefed<nsIDOMGetUserMediaSuccessCallback> aSuccess,
|
||||
already_AddRefed<nsIDOMGetUserMediaErrorCallback> aError,
|
||||
const nsAString& aErrorMsg, uint64_t aWindowID)
|
||||
: mSuccess(aSuccess)
|
||||
, mError(aError)
|
||||
, mErrorMsg(aErrorMsg)
|
||||
, mWindowID(aWindowID)
|
||||
, mManager(MediaManager::GetInstance()){
|
||||
}
|
||||
|
||||
ErrorCallbackRunnable::ErrorCallbackRunnable(
|
||||
nsMainThreadPtrHandle<nsIDOMGetUserMediaErrorCallback>& aError,
|
||||
const nsAString& aErrorMsg, uint64_t aWindowID)
|
||||
: mError(aError)
|
||||
, mErrorMsg(aErrorMsg)
|
||||
, mWindowID(aWindowID)
|
||||
, mManager(MediaManager::GetInstance()) {
|
||||
}
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
ErrorCallbackRunnable::Run()
|
||||
{
|
||||
// Only run if the window is still active.
|
||||
NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
|
||||
if (mError.get() && mManager->IsWindowStillActive(mWindowID)) {
|
||||
// This is safe since we're on main-thread, and the windowlist can only
|
||||
// be invalidated from the main-thread (see OnNavigation)
|
||||
mError->OnError(mErrorMsg);
|
||||
|
||||
nsCOMPtr<nsIDOMGetUserMediaSuccessCallback> success(mSuccess);
|
||||
nsCOMPtr<nsIDOMGetUserMediaErrorCallback> error(mError);
|
||||
|
||||
if (!(mManager->IsWindowStillActive(mWindowID))) {
|
||||
return NS_OK;
|
||||
}
|
||||
// This is safe since we're on main-thread, and the windowlist can only
|
||||
// be invalidated from the main-thread (see OnNavigation)
|
||||
error->OnError(mErrorMsg);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@ -184,8 +180,8 @@ class SuccessCallbackRunnable : public nsRunnable
|
||||
{
|
||||
public:
|
||||
SuccessCallbackRunnable(
|
||||
nsMainThreadPtrHandle<nsIDOMGetUserMediaSuccessCallback>& aSuccess,
|
||||
nsMainThreadPtrHandle<nsIDOMGetUserMediaErrorCallback>& aError,
|
||||
already_AddRefed<nsIDOMGetUserMediaSuccessCallback> aSuccess,
|
||||
already_AddRefed<nsIDOMGetUserMediaErrorCallback> aError,
|
||||
nsIDOMFile* aFile, uint64_t aWindowID)
|
||||
: mSuccess(aSuccess)
|
||||
, mError(aError)
|
||||
@ -199,17 +195,21 @@ public:
|
||||
// Only run if the window is still active.
|
||||
NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
|
||||
|
||||
if (mSuccess.get() && mManager->IsWindowStillActive(mWindowID)) {
|
||||
// This is safe since we're on main-thread, and the windowlist can only
|
||||
// be invalidated from the main-thread (see OnNavigation)
|
||||
mSuccess->OnSuccess(mFile);
|
||||
nsCOMPtr<nsIDOMGetUserMediaSuccessCallback> success(mSuccess);
|
||||
nsCOMPtr<nsIDOMGetUserMediaErrorCallback> error(mError);
|
||||
|
||||
if (!(mManager->IsWindowStillActive(mWindowID))) {
|
||||
return NS_OK;
|
||||
}
|
||||
// This is safe since we're on main-thread, and the windowlist can only
|
||||
// be invalidated from the main-thread (see OnNavigation)
|
||||
success->OnSuccess(mFile);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
nsMainThreadPtrHandle<nsIDOMGetUserMediaSuccessCallback> mSuccess;
|
||||
nsMainThreadPtrHandle<nsIDOMGetUserMediaErrorCallback> mError;
|
||||
already_AddRefed<nsIDOMGetUserMediaSuccessCallback> mSuccess;
|
||||
already_AddRefed<nsIDOMGetUserMediaErrorCallback> mError;
|
||||
nsCOMPtr<nsIDOMFile> mFile;
|
||||
uint64_t mWindowID;
|
||||
nsRefPtr<MediaManager> mManager; // get ref to this when creating the runnable
|
||||
@ -459,8 +459,8 @@ class GetUserMediaStreamRunnable : public nsRunnable
|
||||
{
|
||||
public:
|
||||
GetUserMediaStreamRunnable(
|
||||
nsMainThreadPtrHandle<nsIDOMGetUserMediaSuccessCallback>& aSuccess,
|
||||
nsMainThreadPtrHandle<nsIDOMGetUserMediaErrorCallback>& aError,
|
||||
already_AddRefed<nsIDOMGetUserMediaSuccessCallback> aSuccess,
|
||||
already_AddRefed<nsIDOMGetUserMediaErrorCallback> aError,
|
||||
uint64_t aWindowID,
|
||||
GetUserMediaCallbackMediaStreamListener* aListener,
|
||||
MediaEngineSource* aAudioSource,
|
||||
@ -479,9 +479,9 @@ public:
|
||||
{
|
||||
public:
|
||||
TracksAvailableCallback(MediaManager* aManager,
|
||||
nsMainThreadPtrHandle<nsIDOMGetUserMediaSuccessCallback>& aSuccess,
|
||||
uint64_t aWindowID,
|
||||
DOMMediaStream* aStream)
|
||||
nsIDOMGetUserMediaSuccessCallback* aSuccess,
|
||||
uint64_t aWindowID,
|
||||
DOMMediaStream* aStream)
|
||||
: mWindowID(aWindowID), mSuccess(aSuccess), mManager(aManager),
|
||||
mStream(aStream) {}
|
||||
virtual void NotifyTracksAvailable(DOMMediaStream* aStream) MOZ_OVERRIDE
|
||||
@ -501,7 +501,7 @@ public:
|
||||
mSuccess->OnSuccess(aStream);
|
||||
}
|
||||
uint64_t mWindowID;
|
||||
nsMainThreadPtrHandle<nsIDOMGetUserMediaSuccessCallback> mSuccess;
|
||||
nsRefPtr<nsIDOMGetUserMediaSuccessCallback> mSuccess;
|
||||
nsRefPtr<MediaManager> mManager;
|
||||
// Keep the DOMMediaStream alive until the NotifyTracksAvailable callback
|
||||
// has fired, otherwise we might immediately destroy the DOMMediaStream and
|
||||
@ -537,8 +537,9 @@ public:
|
||||
nsRefPtr<nsDOMUserMediaStream> trackunion =
|
||||
nsDOMUserMediaStream::CreateTrackUnionStream(window, hints);
|
||||
if (!trackunion) {
|
||||
nsCOMPtr<nsIDOMGetUserMediaErrorCallback> error = mError.forget();
|
||||
LOG(("Returning error for getUserMedia() - no stream"));
|
||||
mError->OnError(NS_LITERAL_STRING("NO_STREAM"));
|
||||
error->OnError(NS_LITERAL_STRING("NO_STREAM"));
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@ -578,7 +579,7 @@ public:
|
||||
new MediaOperationRunnable(MEDIA_START, mListener, trackunion,
|
||||
tracksAvailableCallback,
|
||||
mAudioSource, mVideoSource, false, mWindowID,
|
||||
mError));
|
||||
mError.forget()));
|
||||
mediaThread->Dispatch(runnable, NS_DISPATCH_NORMAL);
|
||||
|
||||
#ifdef MOZ_WEBRTC
|
||||
@ -608,12 +609,14 @@ public:
|
||||
}
|
||||
#endif
|
||||
|
||||
// We won't need mError now.
|
||||
mError = nullptr;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
nsMainThreadPtrHandle<nsIDOMGetUserMediaSuccessCallback> mSuccess;
|
||||
nsMainThreadPtrHandle<nsIDOMGetUserMediaErrorCallback> mError;
|
||||
nsRefPtr<nsIDOMGetUserMediaSuccessCallback> mSuccess;
|
||||
nsRefPtr<nsIDOMGetUserMediaErrorCallback> mError;
|
||||
nsRefPtr<MediaEngineSource> mAudioSource;
|
||||
nsRefPtr<MediaEngineSource> mVideoSource;
|
||||
uint64_t mWindowID;
|
||||
@ -741,13 +744,13 @@ class GetUserMediaRunnable : public nsRunnable
|
||||
public:
|
||||
GetUserMediaRunnable(
|
||||
const MediaStreamConstraintsInternal& aConstraints,
|
||||
nsIDOMGetUserMediaSuccessCallback* aSuccess,
|
||||
nsIDOMGetUserMediaErrorCallback* aError,
|
||||
already_AddRefed<nsIDOMGetUserMediaSuccessCallback> aSuccess,
|
||||
already_AddRefed<nsIDOMGetUserMediaErrorCallback> aError,
|
||||
uint64_t aWindowID, GetUserMediaCallbackMediaStreamListener *aListener,
|
||||
MediaEnginePrefs &aPrefs)
|
||||
: mConstraints(aConstraints)
|
||||
, mSuccess(new nsMainThreadPtrHolder<nsIDOMGetUserMediaSuccessCallback>(aSuccess))
|
||||
, mError(new nsMainThreadPtrHolder<nsIDOMGetUserMediaErrorCallback>(aError))
|
||||
, mSuccess(aSuccess)
|
||||
, mError(aError)
|
||||
, mWindowID(aWindowID)
|
||||
, mListener(aListener)
|
||||
, mPrefs(aPrefs)
|
||||
@ -762,14 +765,14 @@ public:
|
||||
*/
|
||||
GetUserMediaRunnable(
|
||||
const MediaStreamConstraintsInternal& aConstraints,
|
||||
nsIDOMGetUserMediaSuccessCallback* aSuccess,
|
||||
nsIDOMGetUserMediaErrorCallback* aError,
|
||||
already_AddRefed<nsIDOMGetUserMediaSuccessCallback> aSuccess,
|
||||
already_AddRefed<nsIDOMGetUserMediaErrorCallback> aError,
|
||||
uint64_t aWindowID, GetUserMediaCallbackMediaStreamListener *aListener,
|
||||
MediaEnginePrefs &aPrefs,
|
||||
MediaEngine* aBackend)
|
||||
: mConstraints(aConstraints)
|
||||
, mSuccess(new nsMainThreadPtrHolder<nsIDOMGetUserMediaSuccessCallback>(aSuccess))
|
||||
, mError(new nsMainThreadPtrHolder<nsIDOMGetUserMediaErrorCallback>(aError))
|
||||
, mSuccess(aSuccess)
|
||||
, mError(aError)
|
||||
, mWindowID(aWindowID)
|
||||
, mListener(aListener)
|
||||
, mPrefs(aPrefs)
|
||||
@ -842,7 +845,8 @@ public:
|
||||
// This will re-check the window being alive on main-thread
|
||||
// Note: we must remove the listener on MainThread as well
|
||||
NS_DispatchToMainThread(new ErrorCallbackRunnable(
|
||||
mSuccess, mError, aErrorMsg, mWindowID));
|
||||
mSuccess, mError, aErrorMsg, mWindowID
|
||||
));
|
||||
|
||||
// MUST happen after ErrorCallbackRunnable Run()s, as it checks the active window list
|
||||
NS_DispatchToMainThread(new GetUserMediaListenerRemove(mWindowID, mListener));
|
||||
@ -913,8 +917,9 @@ public:
|
||||
rv = aAudioSource->Allocate(mPrefs);
|
||||
if (NS_FAILED(rv)) {
|
||||
LOG(("Failed to allocate audiosource %d",rv));
|
||||
NS_DispatchToMainThread(new ErrorCallbackRunnable(mSuccess, mError,
|
||||
NS_LITERAL_STRING("HARDWARE_UNAVAILABLE"), mWindowID));
|
||||
NS_DispatchToMainThread(new ErrorCallbackRunnable(
|
||||
mSuccess, mError, NS_LITERAL_STRING("HARDWARE_UNAVAILABLE"), mWindowID
|
||||
));
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -925,8 +930,9 @@ public:
|
||||
if (aAudioSource) {
|
||||
aAudioSource->Deallocate();
|
||||
}
|
||||
NS_DispatchToMainThread(new ErrorCallbackRunnable(mSuccess, mError,
|
||||
NS_LITERAL_STRING("HARDWARE_UNAVAILABLE"), mWindowID));
|
||||
NS_DispatchToMainThread(new ErrorCallbackRunnable(
|
||||
mSuccess, mError, NS_LITERAL_STRING("HARDWARE_UNAVAILABLE"), mWindowID
|
||||
));
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -946,8 +952,9 @@ public:
|
||||
{
|
||||
nsresult rv = aSource->Allocate(mPrefs);
|
||||
if (NS_FAILED(rv)) {
|
||||
NS_DispatchToMainThread(new ErrorCallbackRunnable(mSuccess, mError,
|
||||
NS_LITERAL_STRING("HARDWARE_UNAVAILABLE"), mWindowID));
|
||||
NS_DispatchToMainThread(new ErrorCallbackRunnable(
|
||||
mSuccess, mError, NS_LITERAL_STRING("HARDWARE_UNAVAILABLE"), mWindowID
|
||||
));
|
||||
return;
|
||||
}
|
||||
|
||||
@ -967,8 +974,8 @@ public:
|
||||
private:
|
||||
MediaStreamConstraintsInternal mConstraints;
|
||||
|
||||
nsMainThreadPtrHandle<nsIDOMGetUserMediaSuccessCallback> mSuccess;
|
||||
nsMainThreadPtrHandle<nsIDOMGetUserMediaErrorCallback> mError;
|
||||
already_AddRefed<nsIDOMGetUserMediaSuccessCallback> mSuccess;
|
||||
already_AddRefed<nsIDOMGetUserMediaErrorCallback> mError;
|
||||
uint64_t mWindowID;
|
||||
nsRefPtr<GetUserMediaCallbackMediaStreamListener> mListener;
|
||||
nsRefPtr<MediaDevice> mAudioDevice;
|
||||
@ -1312,12 +1319,12 @@ MediaManager::GetUserMedia(JSContext* aCx, bool aPrivileged,
|
||||
*/
|
||||
if (c.mFake) {
|
||||
// Fake stream from default backend.
|
||||
gUMRunnable = new GetUserMediaRunnable(c, onSuccess,
|
||||
onError, windowID, listener, mPrefs, new MediaEngineDefault());
|
||||
gUMRunnable = new GetUserMediaRunnable(c, onSuccess.forget(),
|
||||
onError.forget(), windowID, listener, mPrefs, new MediaEngineDefault());
|
||||
} else {
|
||||
// Stream from default device from WebRTC backend.
|
||||
gUMRunnable = new GetUserMediaRunnable(c, onSuccess,
|
||||
onError, windowID, listener, mPrefs);
|
||||
gUMRunnable = new GetUserMediaRunnable(c, onSuccess.forget(),
|
||||
onError.forget(), windowID, listener, mPrefs);
|
||||
}
|
||||
|
||||
#ifdef MOZ_B2G_CAMERA
|
||||
@ -1782,7 +1789,7 @@ GetUserMediaCallbackMediaStreamListener::Invalidate()
|
||||
runnable = new MediaOperationRunnable(MEDIA_STOP,
|
||||
this, nullptr, nullptr,
|
||||
mAudioSource, mVideoSource,
|
||||
mFinished, mWindowID);
|
||||
mFinished, mWindowID, nullptr);
|
||||
mMediaThread->Dispatch(runnable, NS_DISPATCH_NORMAL);
|
||||
}
|
||||
|
||||
|
@ -14,7 +14,6 @@
|
||||
#include "nsObserverService.h"
|
||||
#include "nsIPrefService.h"
|
||||
#include "nsIPrefBranch.h"
|
||||
#include "nsProxyRelease.h"
|
||||
|
||||
#include "nsPIDOMWindow.h"
|
||||
#include "nsIDOMNavigatorUserMedia.h"
|
||||
@ -214,7 +213,7 @@ class GetUserMediaNotificationEvent: public nsRunnable
|
||||
already_AddRefed<DOMMediaStream> aStream,
|
||||
DOMMediaStream::OnTracksAvailableCallback* aOnTracksAvailableCallback,
|
||||
bool aIsAudio, bool aIsVideo, uint64_t aWindowID,
|
||||
nsMainThreadPtrHandle<nsIDOMGetUserMediaErrorCallback> aError)
|
||||
already_AddRefed<nsIDOMGetUserMediaErrorCallback> aError)
|
||||
: mStream(aStream), mOnTracksAvailableCallback(aOnTracksAvailableCallback),
|
||||
mStatus(aStatus), mIsAudio(aIsAudio), mIsVideo(aIsVideo), mWindowID(aWindowID),
|
||||
mError(aError) {}
|
||||
@ -233,7 +232,7 @@ class GetUserMediaNotificationEvent: public nsRunnable
|
||||
bool mIsAudio;
|
||||
bool mIsVideo;
|
||||
uint64_t mWindowID;
|
||||
nsMainThreadPtrHandle<nsIDOMGetUserMediaErrorCallback> mError;
|
||||
nsRefPtr<nsIDOMGetUserMediaErrorCallback> mError;
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
@ -252,16 +251,13 @@ class ErrorCallbackRunnable : public nsRunnable
|
||||
{
|
||||
public:
|
||||
ErrorCallbackRunnable(
|
||||
nsMainThreadPtrHandle<nsIDOMGetUserMediaSuccessCallback>& aSuccess,
|
||||
nsMainThreadPtrHandle<nsIDOMGetUserMediaErrorCallback>& aError,
|
||||
const nsAString& aErrorMsg, uint64_t aWindowID);
|
||||
ErrorCallbackRunnable(
|
||||
nsMainThreadPtrHandle<nsIDOMGetUserMediaErrorCallback>& aError,
|
||||
already_AddRefed<nsIDOMGetUserMediaSuccessCallback> aSuccess,
|
||||
already_AddRefed<nsIDOMGetUserMediaErrorCallback> aError,
|
||||
const nsAString& aErrorMsg, uint64_t aWindowID);
|
||||
NS_IMETHOD Run();
|
||||
private:
|
||||
nsMainThreadPtrHandle<nsIDOMGetUserMediaSuccessCallback> mSuccess;
|
||||
nsMainThreadPtrHandle<nsIDOMGetUserMediaErrorCallback> mError;
|
||||
already_AddRefed<nsIDOMGetUserMediaSuccessCallback> mSuccess;
|
||||
already_AddRefed<nsIDOMGetUserMediaErrorCallback> mError;
|
||||
const nsString mErrorMsg;
|
||||
uint64_t mWindowID;
|
||||
nsRefPtr<MediaManager> mManager; // get ref to this when creating the runnable
|
||||
@ -295,7 +291,7 @@ public:
|
||||
MediaEngineSource* aVideoSource,
|
||||
bool aNeedsFinish,
|
||||
uint64_t aWindowID,
|
||||
nsMainThreadPtrHandle<nsIDOMGetUserMediaErrorCallback> aError)
|
||||
already_AddRefed<nsIDOMGetUserMediaErrorCallback> aError)
|
||||
: mType(aType)
|
||||
, mStream(aStream)
|
||||
, mOnTracksAvailableCallback(aOnTracksAvailableCallback)
|
||||
@ -307,25 +303,6 @@ public:
|
||||
, mError(aError)
|
||||
{}
|
||||
|
||||
MediaOperationRunnable(MediaOperation aType,
|
||||
GetUserMediaCallbackMediaStreamListener* aListener,
|
||||
DOMMediaStream* aStream,
|
||||
DOMMediaStream::OnTracksAvailableCallback* aOnTracksAvailableCallback,
|
||||
MediaEngineSource* aAudioSource,
|
||||
MediaEngineSource* aVideoSource,
|
||||
bool aNeedsFinish,
|
||||
uint64_t aWindowID)
|
||||
: mType(aType)
|
||||
, mStream(aStream)
|
||||
, mOnTracksAvailableCallback(aOnTracksAvailableCallback)
|
||||
, mAudioSource(aAudioSource)
|
||||
, mVideoSource(aVideoSource)
|
||||
, mListener(aListener)
|
||||
, mFinish(aNeedsFinish)
|
||||
, mWindowID(aWindowID)
|
||||
, mError(nullptr)
|
||||
{}
|
||||
|
||||
~MediaOperationRunnable()
|
||||
{
|
||||
// MediaStreams can be released on any thread.
|
||||
@ -339,7 +316,8 @@ public:
|
||||
nsString log;
|
||||
|
||||
log.AssignASCII(errorLog, strlen(errorLog));
|
||||
NS_DispatchToMainThread(new ErrorCallbackRunnable(mError, log, mWindowID));
|
||||
NS_DispatchToMainThread(new ErrorCallbackRunnable(nullptr, mError.forget(),
|
||||
log, mWindowID));
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@ -390,7 +368,7 @@ public:
|
||||
mOnTracksAvailableCallback.forget(),
|
||||
mAudioSource != nullptr,
|
||||
mVideoSource != nullptr,
|
||||
mWindowID, mError);
|
||||
mWindowID, mError.forget());
|
||||
NS_DispatchToMainThread(event, NS_DISPATCH_NORMAL);
|
||||
}
|
||||
break;
|
||||
@ -437,7 +415,7 @@ private:
|
||||
nsRefPtr<GetUserMediaCallbackMediaStreamListener> mListener; // threadsafe
|
||||
bool mFinish;
|
||||
uint64_t mWindowID;
|
||||
nsMainThreadPtrHandle<nsIDOMGetUserMediaErrorCallback> mError;
|
||||
nsRefPtr<nsIDOMGetUserMediaErrorCallback> mError;
|
||||
};
|
||||
|
||||
typedef nsTArray<nsRefPtr<GetUserMediaCallbackMediaStreamListener> > StreamListeners;
|
||||
|
Loading…
x
Reference in New Issue
Block a user