Bug 1322964 - Use Then with single lambda in GeckoMediaPluginServiceParent::GetContentParent - r=cpearce draft
authorGerald Squelart <gsquelart@mozilla.com>
Fri, 09 Dec 2016 09:27:29 -1000
changeset 455218 bfc6a2b1f7bf2e7bc04fcacc443446de75e807e4
parent 455217 cabe8cb049d17101100f48d8b561505c9cfdbf42
child 540915 a7985836577db95dd57ddc03205c8c81359e7f42
push id40159
push usergsquelart@mozilla.com
push dateTue, 03 Jan 2017 05:39:28 +0000
reviewerscpearce
bugs1322964
milestone53.0a1
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
dom/media/gmp/GMPServiceParent.cpp
--- 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)