Bug 1322964 - Use Then with single lambda in GeckoMediaPluginServiceParent::GetContentParent - r=cpearce
Instead of capturing a raw pointer in two lambdas, we can now capture a safer
UniquePtr (inside a UniquePtrForCpp11Lambda for now) inside the one lambda we
chain to the initialization promise.
MozReview-Commit-ID: G1IGOc7a9QV
--- a/dom/media/gmp/GMPServiceParent.cpp
+++ b/dom/media/gmp/GMPServiceParent.cpp
@@ -536,40 +536,42 @@ GeckoMediaPluginServiceParent::GetConten
const nsTArray<nsCString>& aTags)
{
RefPtr<AbstractThread> thread(GetAbstractGMPThread());
if (!thread) {
return GetGMPContentParentPromise::CreateAndReject(NS_ERROR_FAILURE, __func__);
}
typedef MozPromiseHolder<GetGMPContentParentPromise> PromiseHolder;
- PromiseHolder* rawHolder = new PromiseHolder();
+ // TODO: Use UniquePtr when C++14 allows moving it into the lambda below.
+ UniquePtrForCpp11Lambda<PromiseHolder> holder(new PromiseHolder());
RefPtr<GeckoMediaPluginServiceParent> self(this);
- RefPtr<GetGMPContentParentPromise> promise = rawHolder->Ensure(__func__);
+ RefPtr<GetGMPContentParentPromise> promise = holder->Ensure(__func__);
nsCString nodeId(aNodeId);
nsTArray<nsCString> tags(aTags);
nsCString api(aAPI);
RefPtr<GMPCrashHelper> helper(aHelper);
EnsureInitialized()->Then(thread, __func__,
- [self, tags, api, nodeId, helper, rawHolder]() -> void {
- UniquePtr<PromiseHolder> holder(rawHolder);
+ [self, tags, api, nodeId, helper, holder]
+ (const GenericPromise::ResolveOrRejectValue& aValue) mutable -> void
+ {
+ if (aValue.IsReject()) {
+ NS_WARNING("GMPService::EnsureInitialized failed.");
+ holder->Reject(NS_ERROR_FAILURE, __func__);
+ return;
+ }
RefPtr<GMPParent> gmp = self->SelectPluginForAPI(nodeId, api, tags);
LOGD(("%s: %p returning %p for api %s", __FUNCTION__, (void *)self, (void *)gmp, api.get()));
if (!gmp) {
NS_WARNING("GeckoMediaPluginServiceParent::GetContentParentFrom failed");
holder->Reject(NS_ERROR_FAILURE, __func__);
return;
}
self->ConnectCrashHelper(gmp->GetPluginId(), helper);
- gmp->GetGMPContentParent(Move(holder));
- },
- [rawHolder]() -> void {
- UniquePtr<PromiseHolder> holder(rawHolder);
- NS_WARNING("GMPService::EnsureInitialized failed.");
- holder->Reject(NS_ERROR_FAILURE, __func__);
+ gmp->GetGMPContentParent(Move(holder.UPtr()));
});
return promise;
}
void
GeckoMediaPluginServiceParent::InitializePlugins(
AbstractThread* aAbstractGMPThread)