From 61bffae5df9b3e22f1762e1e51eab8967599b7c2 Mon Sep 17 00:00:00 2001 From: Jan Varga Date: Wed, 9 Oct 2024 22:16:49 +0000 Subject: [PATCH] Bug 1866402 - QM: Generalize the helper for mapping MozPromise values to support both exclusive and non-exclusive promises; r=dom-storage-reviewers,jari Differential Revision: https://phabricator.services.mozilla.com/D223276 --- dom/quota/MozPromiseUtils.h | 41 +++++++++++++++++++- dom/quota/test/gtest/TestMozPromiseUtils.cpp | 10 +++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/dom/quota/MozPromiseUtils.h b/dom/quota/MozPromiseUtils.h index 3e7b5f70f109..0b91a9e8966f 100644 --- a/dom/quota/MozPromiseUtils.h +++ b/dom/quota/MozPromiseUtils.h @@ -8,11 +8,31 @@ #define DOM_QUOTA_MOZPROMISEUTILS_H_ #include "mozilla/MozPromise.h" +#include "nsThreadUtils.h" namespace mozilla::dom::quota { +namespace detail { + +template +struct IsExclusiveMozPromise { + static constexpr bool value = false; +}; + +// Specialization for MozPromise +template +struct IsExclusiveMozPromise< + MozPromise> { + static constexpr bool value = IsExclusive; +}; + +} // namespace detail + template -RefPtr Map(RefPtr aPromise, F&& aFunc) { +auto Map(RefPtr aPromise, F&& aFunc) + -> std::enable_if_t< + detail::IsExclusiveMozPromise>::value, + RefPtr> { return aPromise->Then( GetCurrentSerialEventTarget(), __func__, [func = @@ -27,6 +47,25 @@ RefPtr Map(RefPtr aPromise, F&& aFunc) { }); } +template +auto Map(RefPtr aPromise, F&& aFunc) + -> std::enable_if_t< + !detail::IsExclusiveMozPromise>::value, + RefPtr> { + return aPromise->Then(GetCurrentSerialEventTarget(), __func__, + [func = std::forward(aFunc)]( + const typename U::ResolveOrRejectValue& aValue) { + if (aValue.IsReject()) { + return T::CreateAndReject(aValue.RejectValue(), + __func__); + } + + auto value = func(aValue); + + return T::CreateAndResolve(value, __func__); + }); +} + } // namespace mozilla::dom::quota #endif // DOM_QUOTA_MOZPROMISEUTILS_H_ diff --git a/dom/quota/test/gtest/TestMozPromiseUtils.cpp b/dom/quota/test/gtest/TestMozPromiseUtils.cpp index 343d389658e5..b95dfcc0b3de 100644 --- a/dom/quota/test/gtest/TestMozPromiseUtils.cpp +++ b/dom/quota/test/gtest/TestMozPromiseUtils.cpp @@ -9,6 +9,16 @@ namespace mozilla::dom::quota::test { +TEST(DOM_Quota_MozPromiseUtils, BoolPromiseToBoolPromise) +{ + auto value = QuotaManagerDependencyFixture::Await(Map( + BoolPromise::CreateAndResolve(true, __func__), + [](const BoolPromise::ResolveOrRejectValue& aValue) { return false; })); + + ASSERT_TRUE(value.IsResolve()); + ASSERT_FALSE(value.ResolveValue()); +} + TEST(DOM_Quota_MozPromiseUtils, ExclusiveBoolPromiseToBoolPromise) { auto value = QuotaManagerDependencyFixture::Await(