Bug 968836 - fix a few already_AddRefed members in MediaManager.cpp; r=jesup
--- a/dom/media/MediaManager.cpp
+++ b/dom/media/MediaManager.cpp
@@ -1,8 +1,10 @@
+/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */
+/* vim: set ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "MediaManager.h"
#include "MediaStreamGraph.h"
#include "GetUserMediaRequest.h"
@@ -220,70 +222,69 @@ private:
* so that it may be called on the main thread. The error callback is also
* passed so it can be released correctly.
*/
class DeviceSuccessCallbackRunnable: public nsRunnable
{
public:
DeviceSuccessCallbackRunnable(
uint64_t aWindowID,
- already_AddRefed<nsIGetUserMediaDevicesSuccessCallback> aSuccess,
- already_AddRefed<nsIDOMGetUserMediaErrorCallback> aError,
+ nsCOMPtr<nsIGetUserMediaDevicesSuccessCallback>& aSuccess,
+ nsCOMPtr<nsIDOMGetUserMediaErrorCallback>& aError,
nsTArray<nsCOMPtr<nsIMediaDevice> >* aDevices)
- : mSuccess(aSuccess)
- , mError(aError)
- , mDevices(aDevices)
+ : mDevices(aDevices)
, mWindowID(aWindowID)
- , mManager(MediaManager::GetInstance()) {}
+ , mManager(MediaManager::GetInstance())
+ {
+ mSuccess.swap(aSuccess);
+ mError.swap(aError);
+ }
NS_IMETHOD
Run()
{
NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
- nsCOMPtr<nsIGetUserMediaDevicesSuccessCallback> success(mSuccess);
- nsCOMPtr<nsIDOMGetUserMediaErrorCallback> error(mError);
-
// Only run if window is still on our active list.
if (!mManager->IsWindowStillActive(mWindowID)) {
return NS_OK;
}
nsCOMPtr<nsIWritableVariant> devices =
do_CreateInstance("@mozilla.org/variant;1");
int32_t len = mDevices->Length();
if (len == 0) {
// XXX
// We should in the future return an empty array, and dynamically add
// devices to the dropdowns if things are hotplugged while the
// requester is up.
- error->OnError(NS_LITERAL_STRING("NO_DEVICES_FOUND"));
+ mError->OnError(NS_LITERAL_STRING("NO_DEVICES_FOUND"));
return NS_OK;
}
nsTArray<nsIMediaDevice*> tmp(len);
for (int32_t i = 0; i < len; i++) {
tmp.AppendElement(mDevices->ElementAt(i));
}
devices->SetAsArray(nsIDataType::VTYPE_INTERFACE,
&NS_GET_IID(nsIMediaDevice),
mDevices->Length(),
const_cast<void*>(
static_cast<const void*>(tmp.Elements())
));
- success->OnSuccess(devices);
+ mSuccess->OnSuccess(devices);
return NS_OK;
}
private:
- already_AddRefed<nsIGetUserMediaDevicesSuccessCallback> mSuccess;
- already_AddRefed<nsIDOMGetUserMediaErrorCallback> mError;
+ nsCOMPtr<nsIGetUserMediaDevicesSuccessCallback> mSuccess;
+ nsCOMPtr<nsIDOMGetUserMediaErrorCallback> mError;
nsAutoPtr<nsTArray<nsCOMPtr<nsIMediaDevice> > > mDevices;
uint64_t mWindowID;
nsRefPtr<MediaManager> mManager;
};
// Handle removing GetUserMediaCallbackMediaStreamListener from main thread
class GetUserMediaListenerRemove: public nsRunnable
{
@@ -1094,23 +1095,25 @@ public:
ScopedDeletePtr<SourceSet> s (GetSources(backend, mConstraints.mAudiom,
&MediaEngine::EnumerateAudioDevices,
mLoopbackAudioDevice));
final->MoveElementsFrom(*s);
}
NS_DispatchToMainThread(new DeviceSuccessCallbackRunnable(mWindowId,
mSuccess, mError,
final.forget()));
+ // DeviceSuccessCallbackRunnable should have taken these.
+ MOZ_ASSERT(!mSuccess && !mError);
return NS_OK;
}
private:
MediaStreamConstraintsInternal mConstraints;
- already_AddRefed<nsIGetUserMediaDevicesSuccessCallback> mSuccess;
- already_AddRefed<nsIDOMGetUserMediaErrorCallback> mError;
+ nsCOMPtr<nsIGetUserMediaDevicesSuccessCallback> mSuccess;
+ nsCOMPtr<nsIDOMGetUserMediaErrorCallback> mError;
nsRefPtr<MediaManager> mManager;
uint64_t mWindowId;
const nsString mCallId;
// Audio & Video loopback devices to be used based on
// the preference settings. This is currently used for
// automated media tests only.
char* mLoopbackAudioDevice;
char* mLoopbackVideoDevice;