Bug 1328130. Part 1 - add ->Track(). r=gerald

MozReview-Commit-ID: FW7Urv6nyOS

--HG--
extra : rebase_source : 256576fa8b1e5bb6587e280512619f5d7e74a0cc
extra : intermediate-source : 82d0eea2d53edd8d538bc2d0fd0116046fb489b7
extra : source : 9f4301a98b836ec5fc4ca9e49e6a32f0232b71e5
This commit is contained in:
JW Wang 2017-01-11 15:38:37 +08:00
parent 9e123aa5bd
commit bc040ae51e

View File

@ -116,6 +116,7 @@ protected:
};
template<typename T> class MozPromiseHolder;
template<typename T> class MozPromiseRequestHolder;
template<typename ResolveValueT, typename RejectValueT, bool IsExclusive>
class MozPromise : public MozPromiseRefcountable
{
@ -749,10 +750,23 @@ private:
return p;
}
// Allow calling ->Then() again for more promise chaining.
RefPtr<MozPromise> operator->()
template <typename... Ts>
auto Then(Ts&&... aArgs)
-> decltype(DeclVal<MozPromise>().Then(Forward<Ts>(aArgs)...))
{
return *this;
return static_cast<RefPtr<MozPromise>>(*this)->Then(Forward<Ts>(aArgs)...);
}
void Track(MozPromiseRequestHolder<MozPromise>& aRequestHolder)
{
aRequestHolder.Track(*this);
}
// Allow calling ->Then() again for more promise chaining or ->Track() to
// end chaining and track the request for future disconnection.
ThenCommand* operator->()
{
return this;
}
private:
@ -1058,6 +1072,12 @@ public:
mRequest = aRequest;
}
void Track(RefPtr<typename PromiseType::Request>&& aRequest)
{
MOZ_DIAGNOSTIC_ASSERT(!Exists());
mRequest = Move(aRequest);
}
void Complete()
{
MOZ_DIAGNOSTIC_ASSERT(Exists());