Bug 1201197 - add dedicated listener to enumerateDevices.
--- a/dom/media/MediaManager.cpp
+++ b/dom/media/MediaManager.cpp
@@ -2063,29 +2063,46 @@ MediaManager::EnumerateDevices(nsPIDOMWi
nsIDOMGetUserMediaErrorCallback* aOnFailure)
{
MOZ_ASSERT(NS_IsMainThread());
NS_ENSURE_TRUE(!sInShutdown, NS_ERROR_FAILURE);
nsCOMPtr<nsIGetUserMediaDevicesSuccessCallback> onSuccess(aOnSuccess);
nsCOMPtr<nsIDOMGetUserMediaErrorCallback> onFailure(aOnFailure);
uint64_t windowId = aWindow->WindowID();
- AddWindowID(windowId);
+ StreamListeners* listeners = AddWindowID(windowId);
+
+ // Create a disabled listener to act as a placeholder
+ nsRefPtr<GetUserMediaCallbackMediaStreamListener> listener =
+ new GetUserMediaCallbackMediaStreamListener(mMediaThread, windowId);
+
+ // No need for locking because we always do this in the main thread.
+ listeners->AppendElement(listener);
bool fake = Preferences::GetBool("media.navigator.streams.fake");
nsRefPtr<PledgeSourceSet> p = EnumerateDevicesImpl(windowId,
dom::MediaSourceEnum::Camera,
dom::MediaSourceEnum::Microphone,
fake);
- p->Then([onSuccess](SourceSet*& aDevices) mutable {
+ p->Then([onSuccess, windowId, listener](SourceSet*& aDevices) mutable {
ScopedDeletePtr<SourceSet> devices(aDevices); // grab result
+ nsRefPtr<MediaManager> mgr = MediaManager_GetInstance();
+ if (!mgr) {
+ return;
+ }
+ mgr->RemoveFromWindowList(windowId, listener);
nsCOMPtr<nsIWritableVariant> array = MediaManager_ToJSArray(*devices);
onSuccess->OnSuccess(array);
- }, [onFailure](MediaStreamError& reason) mutable {
+ }, [onFailure, windowId, listener](MediaStreamError& reason) mutable {
+ nsRefPtr<MediaManager> mgr = MediaManager_GetInstance();
+ if (!mgr) {
+ return;
+ }
+ mgr->RemoveFromWindowList(windowId, listener);
onFailure->OnError(&reason);
});
return NS_OK;
}
/*
* GetUserMediaDevices - called by the UI-part of getUserMedia from chrome JS.
*/