Bug 1300071 - Create an API to access DOM Promise's state; r?bz draft
authorKaku Kuo <tkuo@mozilla.com>
Wed, 07 Sep 2016 10:51:41 +0800
changeset 410914 da0dec0b8aad8041cc17d2e69f90a29e921e261a
parent 410066 8c9c4e816e86f903c1d820f3f29715dc070a5a4a
child 530626 d77cba06cf1bb7cf7f1c35e3a0afa6aea6f46fac
push id28787
push usertkuo@mozilla.com
push dateWed, 07 Sep 2016 06:23:04 +0000
reviewersbz
bugs1300071
milestone51.0a1
Bug 1300071 - Create an API to access DOM Promise's state; r?bz MozReview-Commit-ID: LI2Dafkzq5x
dom/promise/Promise.cpp
dom/promise/Promise.h
--- 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;