Bug 1300071 - Create an API to access DOM Promise's state; r?bz
MozReview-Commit-ID: LI2Dafkzq5x
--- a/dom/promise/Promise.cpp
+++ b/dom/promise/Promise.cpp
@@ -3181,10 +3181,35 @@ uint64_t
Promise::GetID() {
if (mID != 0) {
return mID;
}
return mID = ++gIDGenerator;
}
#endif // SPIDERMONKEY_PROMISE
+#ifndef SPIDERMONKEY_PROMISE
+Promise::PromiseState
+Promise::State() const
+{
+ return mState;
+}
+#else // SPIDERMONKEY_PROMISE
+Promise::PromiseState
+Promise::State() const
+{
+ JS::Rooted<JSObject*> p(RootingCx(), PromiseObj());
+ const JS::PromiseState state = JS::GetPromiseState(p);
+
+ if (state == JS::PromiseState::Fulfilled) {
+ return PromiseState::Resolved;
+ }
+
+ if (state == JS::PromiseState::Rejected) {
+ return PromiseState::Rejected;
+ }
+
+ return PromiseState::Pending;
+}
+#endif // SPIDERMONKEY_PROMISE
+
} // namespace dom
} // namespace mozilla
--- a/dom/promise/Promise.h
+++ b/dom/promise/Promise.h
@@ -308,16 +308,24 @@ public:
#ifdef SPIDERMONKEY_PROMISE
// Create a dom::Promise from a given SpiderMonkey Promise object.
// aPromiseObj MUST be in the compartment of aGlobal's global JS object.
static already_AddRefed<Promise>
CreateFromExisting(nsIGlobalObject* aGlobal,
JS::Handle<JSObject*> aPromiseObj);
#endif // SPIDERMONKEY_PROMISE
+ enum class PromiseState {
+ Pending,
+ Resolved,
+ Rejected
+ };
+
+ PromiseState State() const;
+
protected:
struct PromiseCapability;
// Do NOT call this unless you're Promise::Create or
// Promise::CreateFromExisting. I wish we could enforce that from inside this
// class too, somehow.
explicit Promise(nsIGlobalObject* aGlobal);
@@ -364,22 +372,16 @@ protected:
bool WasNotifiedAsUncaught() const
{
return mWasNotifiedAsUncaught;
}
#endif // SPIDERMONKEY_PROMISE
private:
- enum PromiseState {
- Pending,
- Resolved,
- Rejected
- };
-
#ifndef SPIDERMONKEY_PROMISE
friend class PromiseDebugging;
void SetState(PromiseState aState)
{
MOZ_ASSERT(mState == Pending);
MOZ_ASSERT(aState != Pending);
mState = aState;