void Promise::Then(JSContext* aCx, // aCalleeGlobal may not be in the compartment of aCx, when called over // Xrays. JS::Handle<JSObject*> aCalleeGlobal, AnyCallback* aResolveCallback, AnyCallback* aRejectCallback, JS::MutableHandle<JS::Value> aRetval, ErrorResult& aRv) { NS_ASSERT_OWNINGTHREAD(Promise); // Let's hope this does the right thing with Xrays... Ensure everything is // just in the caller compartment; that ought to do the trick. In theory we // should consider aCalleeGlobal, but in practice our only caller is // DOMRequest::Then, which is not working with a Promise subclass, so things // should be OK. JS::Rooted<JSObject*> promise(aCx, PromiseObj()); if (!JS_WrapObject(aCx, &promise)) { aRv.NoteJSContextException(aCx); return; } JS::Rooted<JSObject*> resolveCallback(aCx); if (aResolveCallback) { resolveCallback = aResolveCallback->CallbackOrNull(); if (!JS_WrapObject(aCx, &resolveCallback)) { aRv.NoteJSContextException(aCx); return; } } JS::Rooted<JSObject*> rejectCallback(aCx); if (aRejectCallback) { rejectCallback = aRejectCallback->CallbackOrNull(); if (!JS_WrapObject(aCx, &rejectCallback)) { aRv.NoteJSContextException(aCx); return; } } JS::Rooted<JSObject*> retval(aCx); retval = JS::CallOriginalPromiseThen(aCx, promise, resolveCallback, rejectCallback); if (!retval) { aRv.NoteJSContextException(aCx); return; } aRetval.setObject(*retval); }
void WorkerDebuggerGlobalScope::CreateSandbox(JSContext* aCx, const nsAString& aName, JS::Handle<JSObject*> aPrototype, JS::MutableHandle<JSObject*> aResult, ErrorResult& aRv) { mWorkerPrivate->AssertIsOnWorkerThread(); aResult.set(nullptr); JS::Rooted<JS::Value> protoVal(aCx); protoVal.setObjectOrNull(aPrototype); JS::Rooted<JSObject*> sandbox(aCx, SimpleGlobalObject::Create(SimpleGlobalObject::GlobalType::WorkerDebuggerSandbox, protoVal)); if (!sandbox) { aRv.Throw(NS_ERROR_OUT_OF_MEMORY); return; } if (!JS_WrapObject(aCx, &sandbox)) { aRv.NoteJSContextException(aCx); return; } aResult.set(sandbox); }
void BrowsingContext::GetOpener(JSContext* aCx, JS::MutableHandle<JS::Value> aOpener, ErrorResult& aError) const { RefPtr<BrowsingContext> opener = GetOpener(); if (!opener) { aOpener.setNull(); return; } if (!ToJSValue(aCx, WindowProxyHolder(opener), aOpener)) { aError.NoteJSContextException(aCx); } }
void VREyeParameters::GetOffset(JSContext* aCx, JS::MutableHandle<JSObject*> aRetval, ErrorResult& aRv) { if (!mOffset) { // Lazily create the Float32Array mOffset = dom::Float32Array::Create(aCx, this, 3, mEyeTranslation.components); if (!mOffset) { aRv.NoteJSContextException(aCx); return; } } aRetval.set(mOffset); }
// static already_AddRefed<Promise> Promise::Reject(nsIGlobalObject* aGlobal, JSContext* aCx, JS::Handle<JS::Value> aValue, ErrorResult& aRv) { JSAutoCompartment ac(aCx, aGlobal->GetGlobalJSObject()); JS::Rooted<JSObject*> p(aCx, JS::CallOriginalPromiseReject(aCx, aValue)); if (!p) { aRv.NoteJSContextException(aCx); return nullptr; } return CreateFromExisting(aGlobal, p); }
// static already_AddRefed<Promise> Promise::All(const GlobalObject& aGlobal, const nsTArray<RefPtr<Promise>>& aPromiseList, ErrorResult& aRv) { nsCOMPtr<nsIGlobalObject> global; global = do_QueryInterface(aGlobal.GetAsSupports()); if (!global) { aRv.Throw(NS_ERROR_UNEXPECTED); return nullptr; } JSContext* cx = aGlobal.Context(); JS::AutoObjectVector promises(cx); if (!promises.reserve(aPromiseList.Length())) { aRv.NoteJSContextException(cx); return nullptr; } for (auto& promise : aPromiseList) { JS::Rooted<JSObject*> promiseObj(cx, promise->PromiseObj()); // Just in case, make sure these are all in the context compartment. if (!JS_WrapObject(cx, &promiseObj)) { aRv.NoteJSContextException(cx); return nullptr; } promises.infallibleAppend(promiseObj); } JS::Rooted<JSObject*> result(cx, JS::GetWaitForAllPromise(cx, promises)); if (!result) { aRv.NoteJSContextException(cx); return nullptr; } return CreateFromExisting(global, result); }
void VRStageParameters::GetSittingToStandingTransform(JSContext* aCx, JS::MutableHandle<JSObject*> aRetval, ErrorResult& aRv) { if (!mSittingToStandingTransformArray) { // Lazily create the Float32Array mSittingToStandingTransformArray = dom::Float32Array::Create(aCx, this, 16, mSittingToStandingTransform.components); if (!mSittingToStandingTransformArray) { aRv.NoteJSContextException(aCx); return; } } aRetval.set(mSittingToStandingTransformArray); }
void VRFrameData::LazyCreateMatrix(JS::Heap<JSObject*>& aArray, gfx::Matrix4x4& aMat, JSContext* aCx, JS::MutableHandle<JSObject*> aRetval, ErrorResult& aRv) { if (!aArray) { // Lazily create the Float32Array aArray = dom::Float32Array::Create(aCx, this, 16, aMat.components); if (!aArray) { aRv.NoteJSContextException(aCx); return; } } if (aArray) { JS::ExposeObjectToActiveJS(aArray); } aRetval.set(aArray); }