void BluetoothDevice::SetPropertyByValue(const BluetoothNamedValue& aValue) { const nsString& name = aValue.name(); const BluetoothValue& value = aValue.value(); if (name.EqualsLiteral("Name")) { mName = value.get_nsString(); } else if (name.EqualsLiteral("Path")) { MOZ_ASSERT(value.get_nsString().Length() > 0); mPath = value.get_nsString(); } else if (name.EqualsLiteral("Address")) { mAddress = value.get_nsString(); } else if (name.EqualsLiteral("Class")) { mClass = value.get_uint32_t(); } else if (name.EqualsLiteral("Icon")) { mIcon = value.get_nsString(); } else if (name.EqualsLiteral("Connected")) { mConnected = value.get_bool(); } else if (name.EqualsLiteral("Paired")) { mPaired = value.get_bool(); } else if (name.EqualsLiteral("UUIDs")) { mUuids = value.get_ArrayOfnsString(); AutoJSAPI jsapi; if (!jsapi.Init(GetOwner())) { BT_WARNING("Failed to initialise AutoJSAPI!"); return; } JSContext* cx = jsapi.cx(); JS::Rooted<JSObject*> uuids(cx); if (NS_FAILED(nsTArrayToJSArray(cx, mUuids, &uuids))) { BT_WARNING("Cannot set JS UUIDs object!"); return; } mJsUuids = uuids; Root(); } else if (name.EqualsLiteral("Services")) { mServices = value.get_ArrayOfnsString(); AutoJSAPI jsapi; if (!jsapi.Init(GetOwner())) { BT_WARNING("Failed to initialise AutoJSAPI!"); return; } JSContext* cx = jsapi.cx(); JS::Rooted<JSObject*> services(cx); if (NS_FAILED(nsTArrayToJSArray(cx, mServices, &services))) { BT_WARNING("Cannot set JS Services object!"); return; } mJsServices = services; Root(); } else { nsCString warningMsg; warningMsg.AssignLiteral("Not handling device property: "); warningMsg.Append(NS_ConvertUTF16toUTF8(name)); BT_WARNING(warningMsg.get()); } }
void IDBRequest::SetResultCallback(ResultCallback* aCallback) { AssertIsOnOwningThread(); MOZ_ASSERT(aCallback); MOZ_ASSERT(!mHaveResultOrErrorCode); MOZ_ASSERT(mResultVal.isUndefined()); MOZ_ASSERT(!mError); // See if our window is still valid. if (NS_WARN_IF(NS_FAILED(CheckInnerWindowCorrectness()))) { SetError(NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR); return; } AutoJSAPI autoJS; Maybe<JSAutoCompartment> ac; if (GetScriptOwner()) { // If we have a script owner we want the SafeJSContext and then to enter the // script owner's compartment. autoJS.Init(); JS::ExposeObjectToActiveJS(GetScriptOwner()); ac.emplace(autoJS.cx(), GetScriptOwner()); } else { // Otherwise our owner is a window and we use that to initialize. MOZ_ASSERT(GetOwner()); if (!autoJS.Init(GetOwner())) { IDB_WARNING("Failed to initialize AutoJSAPI!"); SetError(NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR); return; } } JSContext* cx = autoJS.cx(); AssertIsRooted(); JS::Rooted<JS::Value> result(cx); nsresult rv = aCallback->GetResult(cx, &result); if (NS_WARN_IF(NS_FAILED(rv))) { // This can only fail if the structured clone contains a mutable file // and the child is not in the main thread and main process. // In that case CreateAndWrapMutableFile() returns false which shows up // as NS_ERROR_DOM_DATA_CLONE_ERR here. MOZ_ASSERT(rv == NS_ERROR_DOM_DATA_CLONE_ERR); // We are not setting a result or an error object here since we want to // throw an exception when the 'result' property is being touched. return; } mError = nullptr; mResultVal = result; mHaveResultOrErrorCode = true; }
void FileReader::OnLoadEndArrayBuffer() { AutoJSAPI jsapi; if (!jsapi.Init(GetParentObject())) { FreeDataAndDispatchError(NS_ERROR_FAILURE); return; } RootResultArrayBuffer(); JSContext* cx = jsapi.cx(); mResultArrayBuffer = JS_NewArrayBufferWithContents(cx, mDataLen, mFileData); if (mResultArrayBuffer) { mFileData = nullptr; // Transfer ownership FreeDataAndDispatchSuccess(); return; } // Let's handle the error status. JS::Rooted<JS::Value> exceptionValue(cx); if (!JS_GetPendingException(cx, &exceptionValue) || // This should not really happen, exception should always be an object. !exceptionValue.isObject()) { JS_ClearPendingException(jsapi.cx()); FreeDataAndDispatchError(NS_ERROR_OUT_OF_MEMORY); return; } JS_ClearPendingException(jsapi.cx()); JS::Rooted<JSObject*> exceptionObject(cx, &exceptionValue.toObject()); JSErrorReport* er = JS_ErrorFromException(cx, exceptionObject); if (!er || er->message()) { FreeDataAndDispatchError(NS_ERROR_OUT_OF_MEMORY); return; } nsAutoString errorName; JSFlatString* name = js::GetErrorTypeName(cx, er->exnType); if (name) { AssignJSFlatString(errorName, name); } nsAutoCString errorMsg(er->message().c_str()); nsAutoCString errorNameC = NS_LossyConvertUTF16toASCII(errorName); // XXX Code selected arbitrarily mError = new DOMException(NS_ERROR_DOM_INVALID_STATE_ERR, errorMsg, errorNameC, DOMException_Binding::INVALID_STATE_ERR); FreeDataAndDispatchError(); }
void ThrowAndReport(nsPIDOMWindow* aWindow, nsresult aRv, const char* aMessage) { AutoJSAPI jsapi; if (NS_WARN_IF(!jsapi.InitWithLegacyErrorReporting(aWindow))) { return; } Throw(jsapi.cx(), aRv, aMessage); (void) JS_ReportPendingException(jsapi.cx()); }
bool AllowCPOWsInAddon(const nsACString& addonIdStr, bool allow) { JSAddonId* addonId; // We enter the junk scope just to allocate a string, which actually will go // in the system zone. AutoJSAPI jsapi; jsapi.Init(xpc::PrivilegedJunkScope()); addonId = NewAddonId(jsapi.cx(), addonIdStr); if (!addonId) return false; return XPCWrappedNativeScope::AllowCPOWsInAddon(jsapi.cx(), addonId, allow); }
void ThrowAndReport(nsPIDOMWindow* aWindow, nsresult aRv, const char* aMessage) { MOZ_ASSERT(aRv != NS_ERROR_UNCATCHABLE_EXCEPTION, "Doesn't make sense to report uncatchable exceptions!"); AutoJSAPI jsapi; if (NS_WARN_IF(!jsapi.InitWithLegacyErrorReporting(aWindow))) { return; } Throw(jsapi.cx(), aRv, aMessage); (void) JS_ReportPendingException(jsapi.cx()); }
bool SetAddonInterposition(const nsACString& addonIdStr, nsIAddonInterposition* interposition) { JSAddonId* addonId; // We enter the junk scope just to allocate a string, which actually will go // in the system zone. AutoJSAPI jsapi; if (!jsapi.Init(xpc::PrivilegedJunkScope())) return false; addonId = NewAddonId(jsapi.cx(), addonIdStr); if (!addonId) return false; return XPCWrappedNativeScope::SetAddonInterposition(jsapi.cx(), addonId, interposition); }
void IDBRequest::SetResultCallback(ResultCallback* aCallback) { AssertIsOnOwningThread(); MOZ_ASSERT(aCallback); MOZ_ASSERT(!mHaveResultOrErrorCode); MOZ_ASSERT(mResultVal.isUndefined()); MOZ_ASSERT(!mError); // See if our window is still valid. if (NS_WARN_IF(NS_FAILED(CheckInnerWindowCorrectness()))) { IDB_REPORT_INTERNAL_ERR(); SetError(NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR); return; } AutoJSAPI autoJS; Maybe<JSAutoCompartment> ac; if (GetScriptOwner()) { // If we have a script owner we want the SafeJSContext and then to enter the // script owner's compartment. autoJS.Init(); ac.emplace(autoJS.cx(), GetScriptOwner()); } else { // Otherwise our owner is a window and we use that to initialize. MOZ_ASSERT(GetOwner()); if (!autoJS.InitWithLegacyErrorReporting(GetOwner())) { IDB_WARNING("Failed to initialize AutoJSAPI!"); SetError(NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR); return; } } JSContext* cx = autoJS.cx(); AssertIsRooted(); JS::Rooted<JS::Value> result(cx); nsresult rv = aCallback->GetResult(cx, &result); if (NS_WARN_IF(NS_FAILED(rv))) { SetError(rv); mResultVal.setUndefined(); } else { mError = nullptr; mResultVal = result; } mHaveResultOrErrorCode = true; }
bool WrapperAnswer::RecvGetPropertyDescriptor(const ObjectId &objId, const JSIDVariant &idVar, ReturnStatus *rs, PPropertyDescriptor *out) { AutoJSAPI jsapi; if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects()))) return false; JSContext *cx = jsapi.cx(); EmptyDesc(out); RootedObject obj(cx, findObjectById(cx, objId)); if (!obj) return fail(cx, rs); LOG("%s.getPropertyDescriptor(%s)", ReceiverObj(objId), Identifier(idVar)); RootedId id(cx); if (!fromJSIDVariant(cx, idVar, &id)) return fail(cx, rs); Rooted<JSPropertyDescriptor> desc(cx); if (!JS_GetPropertyDescriptorById(cx, obj, id, &desc)) return fail(cx, rs); if (!fromDescriptor(cx, desc, out)) return fail(cx, rs); return ok(rs); }
bool WrapperAnswer::RecvInstanceOf(const ObjectId &objId, const JSIID &iid, ReturnStatus *rs, bool *instanceof) { AutoJSAPI jsapi; if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects()))) return false; JSContext *cx = jsapi.cx(); *instanceof = false; RootedObject obj(cx, findObjectById(cx, objId)); if (!obj) return fail(cx, rs); LOG("%s.instanceOf()", ReceiverObj(objId)); nsID nsiid; ConvertID(iid, &nsiid); nsresult rv = xpc::HasInstance(cx, obj, &nsiid, instanceof); if (rv != NS_OK) return fail(cx, rs); return ok(rs); }
bool WrapperAnswer::RecvGetPropertyKeys(const ObjectId &objId, const uint32_t &flags, ReturnStatus *rs, nsTArray<JSIDVariant> *ids) { AutoJSAPI jsapi; if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects()))) return false; JSContext *cx = jsapi.cx(); RootedObject obj(cx, findObjectById(cx, objId)); if (!obj) return fail(cx, rs); LOG("%s.getPropertyKeys()", ReceiverObj(objId)); AutoIdVector props(cx); if (!js::GetPropertyKeys(cx, obj, flags, &props)) return fail(cx, rs); for (size_t i = 0; i < props.length(); i++) { JSIDVariant id; if (!toJSIDVariant(cx, props[i], &id)) return fail(cx, rs); ids->AppendElement(id); } return ok(rs); }
bool WrapperAnswer::RecvRegExpToShared(const ObjectId &objId, ReturnStatus *rs, nsString *source, uint32_t *flags) { AutoJSAPI jsapi; if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects()))) return false; JSContext *cx = jsapi.cx(); RootedObject obj(cx, findObjectById(cx, objId)); if (!obj) return fail(cx, rs); MOZ_RELEASE_ASSERT(JS_ObjectIsRegExp(cx, obj)); RootedString sourceJSStr(cx, JS_GetRegExpSource(cx, obj)); if (!sourceJSStr) return fail(cx, rs); nsAutoJSString sourceStr; if (!sourceStr.init(cx, sourceJSStr)) return fail(cx, rs); source->Assign(sourceStr); *flags = JS_GetRegExpFlags(cx, obj); return ok(rs); }
bool WrapperAnswer::RecvGetPrototypeOf(const ObjectId &objId, ReturnStatus *rs, ObjectOrNullVariant *result) { *result = NullVariant(); AutoJSAPI jsapi; if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects()))) return false; JSContext *cx = jsapi.cx(); RootedObject obj(cx, findObjectById(cx, objId)); if (!obj) return fail(cx, rs); JS::RootedObject proto(cx); if (!JS_GetPrototype(cx, obj, &proto)) return fail(cx, rs); if (!toObjectOrNullVariant(cx, proto, result)) return fail(cx, rs); LOG("getPrototypeOf(%s)", ReceiverObj(objId)); return ok(rs); }
nsresult MediaKeyStatusMap::UpdateInternal(const nsTArray<CDMCaps::KeyStatus>& keys) { AutoJSAPI jsapi; if (NS_WARN_IF(!jsapi.Init(mParent))) { return NS_ERROR_FAILURE; } jsapi.TakeOwnershipOfErrorReporting(); JSContext* cx = jsapi.cx(); JS::Rooted<JSObject*> map(cx, mMap); if (!JS::MapClear(cx, map)) { return NS_ERROR_FAILURE; } for (size_t i = 0; i < keys.Length(); i++) { const auto& ks = keys[i]; JS::Rooted<JS::Value> key(cx); JS::Rooted<JS::Value> val(cx); if (!ToJSValue(cx, TypedArrayCreator<ArrayBuffer>(ks.mId), &key) || !ToJSString(cx, ks.mStatus, &val) || !JS::MapSet(cx, map, key, val)) { return NS_ERROR_OUT_OF_MEMORY; } } return NS_OK; }
NS_IMETHOD OnPushEndpoint(nsresult aStatus, const nsAString& aEndpoint) override { AssertIsOnMainThread(); mCallbackCalled = true; if (!mProxy) { return NS_OK; } MutexAutoLock lock(mProxy->GetCleanUpLock()); if (mProxy->IsClean()) { return NS_OK; } AutoJSAPI jsapi; jsapi.Init(); nsRefPtr<GetSubscriptionResultRunnable> r = new GetSubscriptionResultRunnable(mProxy, aStatus, aEndpoint, mScope); if (!r->Dispatch(jsapi.cx())) { ReleasePromiseWorkerProxy(mProxy.forget()); } return NS_OK; }
nsresult MobileConnectionCallback::NotifySendCancelMmiSuccessWithStrings(const nsAString& aServiceCode, const nsAString& aStatusMessage, uint32_t aCount, const char16_t** aAdditionalInformation) { AutoJSAPI jsapi; if (NS_WARN_IF(!jsapi.Init(mWindow))) { return NS_ERROR_FAILURE; } JSContext* cx = jsapi.cx(); RootedDictionary<MozMMIResult> result(cx); result.mServiceCode.Assign(aServiceCode); result.mStatusMessage.Assign(aStatusMessage); nsTArray<nsString> additionalInformation; for (uint32_t i = 0; i < aCount; i++) { additionalInformation.AppendElement(nsDependentString(aAdditionalInformation[i])); } JS::Rooted<JS::Value> jsAdditionalInformation(cx); if (!ToJSValue(cx, additionalInformation, &jsAdditionalInformation)) { JS_ClearPendingException(cx); return NS_ERROR_TYPE_ERR; } result.mAdditionalInformation.Construct().SetAsObject() = &jsAdditionalInformation.toObject(); return NotifySendCancelMmiSuccess(result); }
virtual bool MainThreadRun() override { AssertIsOnMainThread(); // Initialise an AutoJSAPI with the target window. AutoJSAPI jsapi; if (NS_WARN_IF(!jsapi.Init(mBackingStore->GetParentObject()))) { mRv.Throw(NS_ERROR_UNEXPECTED); return true; } JSContext* cx = jsapi.cx(); JS::Rooted<JS::Value> value(cx); if (!mObjBuffer.read(cx, &value)) { JS_ClearPendingException(cx); mRv.Throw(NS_ERROR_DOM_DATA_CLONE_ERR); return true; } nsRefPtr<Promise> promise = mBackingStore->Add(cx, value, mId, mRevisionId, mRv); promise->AppendNativeHandler(mPromiseWorkerProxy); return true; }
void Promise::CreateWrapper(JS::Handle<JSObject*> aDesiredProto, ErrorResult& aRv) { AutoJSAPI jsapi; if (!jsapi.Init(mGlobal)) { aRv.Throw(NS_ERROR_UNEXPECTED); return; } JSContext* cx = jsapi.cx(); JSFunction* doNothingFunc = JS_NewFunction(cx, DoNothingPromiseExecutor, /* nargs = */ 2, /* flags = */ 0, nullptr); if (!doNothingFunc) { JS_ClearPendingException(cx); aRv.Throw(NS_ERROR_OUT_OF_MEMORY); return; } JS::Rooted<JSObject*> doNothingObj(cx, JS_GetFunctionObject(doNothingFunc)); mPromiseObj = JS::NewPromiseObject(cx, doNothingObj, aDesiredProto); if (!mPromiseObj) { JS_ClearPendingException(cx); aRv.Throw(NS_ERROR_OUT_OF_MEMORY); return; } }
nsresult nsXBLProtoImpl::CompilePrototypeMembers(nsXBLPrototypeBinding* aBinding) { // We want to pre-compile our implementation's members against a "prototype context". Then when we actually // bind the prototype to a real xbl instance, we'll clone the pre-compiled JS into the real instance's // context. AutoJSAPI jsapi; if (NS_WARN_IF(!jsapi.Init(xpc::CompilationScope()))) return NS_ERROR_FAILURE; JSContext* cx = jsapi.cx(); mPrecompiledMemberHolder = JS_NewObjectWithGivenProto(cx, nullptr, nullptr); if (!mPrecompiledMemberHolder) return NS_ERROR_OUT_OF_MEMORY; // Now that we have a class object installed, we walk our member list and compile each of our // properties and methods in turn. JS::Rooted<JSObject*> rootedHolder(cx, mPrecompiledMemberHolder); for (nsXBLProtoImplMember* curr = mMembers; curr; curr = curr->GetNext()) { nsresult rv = curr->CompileMember(jsapi, mClassName, rootedHolder); if (NS_FAILED(rv)) { DestroyMembers(); return rv; } } return NS_OK; }
already_AddRefed<DOMRequest> nsBrowserElement::Download(const nsAString& aUrl, const BrowserElementDownloadOptions& aOptions, ErrorResult& aRv) { NS_ENSURE_TRUE(IsBrowserElementOrThrow(aRv), nullptr); NS_ENSURE_TRUE(IsNotWidgetOrThrow(aRv), nullptr); nsCOMPtr<nsIDOMDOMRequest> req; nsCOMPtr<nsIXPConnectWrappedJS> wrappedObj = do_QueryInterface(mBrowserElementAPI); MOZ_ASSERT(wrappedObj, "Failed to get wrapped JS from XPCOM component."); AutoJSAPI jsapi; jsapi.Init(wrappedObj->GetJSObject()); JSContext* cx = jsapi.cx(); JS::Rooted<JS::Value> options(cx); if (!ToJSValue(cx, aOptions, &options)) { aRv.Throw(NS_ERROR_OUT_OF_MEMORY); return nullptr; } nsresult rv = mBrowserElementAPI->Download(aUrl, options, getter_AddRefs(req)); if (NS_WARN_IF(NS_FAILED(rv))) { aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); return nullptr; } return req.forget().downcast<DOMRequest>(); }
NS_IMETHODIMP nsScriptErrorWithStack::ToString(nsACString& /*UTF8*/ aResult) { MOZ_ASSERT(NS_IsMainThread()); nsCString message; nsresult rv = nsScriptErrorBase::ToString(message); NS_ENSURE_SUCCESS(rv, rv); if (!mStack) { aResult.Assign(message); return NS_OK; } AutoJSAPI jsapi; if (!jsapi.Init(mStack)) { return NS_ERROR_FAILURE; } JSContext* cx = jsapi.cx(); JS::RootedObject stack(cx, mStack); nsCString stackString = FormatStackString(cx, stack); nsCString combined = message + NS_LITERAL_CSTRING("\n") + stackString; aResult.Assign(combined); return NS_OK; }
NS_IMETHODIMP MobileConnectionCallback::NotifyGetNetworksSuccess(uint32_t aCount, nsIMobileNetworkInfo** aNetworks) { nsTArray<nsRefPtr<MobileNetworkInfo>> results; for (uint32_t i = 0; i < aCount; i++) { nsRefPtr<MobileNetworkInfo> networkInfo = new MobileNetworkInfo(mWindow); networkInfo->Update(aNetworks[i]); results.AppendElement(networkInfo); } AutoJSAPI jsapi; if (NS_WARN_IF(!jsapi.Init(mWindow))) { return NS_ERROR_FAILURE; } JSContext* cx = jsapi.cx(); JS::Rooted<JS::Value> jsResult(cx); if (!ToJSValue(cx, results, &jsResult)) { JS_ClearPendingException(cx); return NS_ERROR_TYPE_ERR; } return NotifySuccess(jsResult); }
already_AddRefed<DOMRequest> nsBrowserElement::ExecuteScript(const nsAString& aScript, const BrowserElementExecuteScriptOptions& aOptions, ErrorResult& aRv) { NS_ENSURE_TRUE(IsBrowserElementOrThrow(aRv), nullptr); NS_ENSURE_TRUE(IsNotWidgetOrThrow(aRv), nullptr); nsCOMPtr<nsIDOMDOMRequest> req; nsCOMPtr<nsIXPConnectWrappedJS> wrappedObj = do_QueryInterface(mBrowserElementAPI); MOZ_ASSERT(wrappedObj, "Failed to get wrapped JS from XPCOM component."); AutoJSAPI jsapi; jsapi.Init(wrappedObj->GetJSObject()); JSContext* cx = jsapi.cx(); JS::Rooted<JS::Value> options(cx); aRv.MightThrowJSException(); if (!ToJSValue(cx, aOptions, &options)) { aRv.StealExceptionFromJSContext(cx); return nullptr; } nsresult rv = mBrowserElementAPI->ExecuteScript(aScript, options, getter_AddRefs(req)); if (NS_FAILED(rv)) { if (rv == NS_ERROR_INVALID_ARG) { aRv.Throw(NS_ERROR_DOM_INVALID_ACCESS_ERR); } else { aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); } return nullptr; } return req.forget().downcast<DOMRequest>(); }
bool WrapperAnswer::RecvHas(const ObjectId &objId, const JSIDVariant &idVar, ReturnStatus *rs, bool *bp) { AutoJSAPI jsapi; if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects()))) return false; JSContext *cx = jsapi.cx(); *bp = false; RootedObject obj(cx, findObjectById(cx, objId)); if (!obj) return fail(cx, rs); LOG("%s.has(%s)", ReceiverObj(objId), Identifier(idVar)); RootedId id(cx); if (!fromJSIDVariant(cx, idVar, &id)) return fail(cx, rs); bool found; if (!JS_HasPropertyById(cx, obj, id, &found)) return fail(cx, rs); *bp = !!found; return ok(rs); }
bool WebAudioDecodeJob::AllocateBuffer() { MOZ_ASSERT(!mOutput); MOZ_ASSERT(NS_IsMainThread()); AutoJSAPI jsapi; if (NS_WARN_IF(!jsapi.Init(mContext->GetOwner()))) { return false; } JSContext* cx = jsapi.cx(); // Now create the AudioBuffer ErrorResult rv; mOutput = AudioBuffer::Create(mContext, mChannelBuffers.Length(), mWriteIndex, mContext->SampleRate(), cx, rv); if (rv.Failed()) { return false; } for (uint32_t i = 0; i < mChannelBuffers.Length(); ++i) { mOutput->SetRawChannelContents(i, mChannelBuffers[i]); } return true; }
virtual bool MainThreadRun() override { AssertIsOnMainThread(); // Initialise an AutoJSAPI with the target window. AutoJSAPI jsapi; if (NS_WARN_IF(!jsapi.Init(mBackingStore->GetParentObject()))) { mRv.Throw(NS_ERROR_UNEXPECTED); return true; } JSContext* cx = jsapi.cx(); JS::Rooted<JS::Value> value(cx); Read(mBackingStore->GetParentObject(), cx, &value, mRv); if (NS_WARN_IF(mRv.Failed())) { return true; } nsRefPtr<Promise> promise = mBackingStore->Put(cx, value, mId, mRevisionId, mRv); promise->AppendNativeHandler(mPromiseWorkerProxy); return true; }
virtual bool MainThreadRun() override { AssertIsOnMainThread(); // Initialise an AutoJSAPI with the target window. AutoJSAPI jsapi; if (NS_WARN_IF(!jsapi.Init(mBackingStore->GetParentObject()))) { mResult = NS_ERROR_UNEXPECTED; return true; } JSContext* cx = jsapi.cx(); ErrorResult rv; JS::Rooted<JS::Value> value(cx); Read(mBackingStore->GetParentObject(), cx, &value, rv); if (NS_WARN_IF(rv.Failed())) { rv.SuppressException(); mResult = NS_ERROR_DOM_DATA_CLONE_ERR; return true; } RefPtr<Promise> promise = mBackingStore->Add(cx, value, mId, mRevisionId, rv); if (NS_WARN_IF(rv.Failed())) { rv.SuppressException(); mResult = NS_ERROR_FAILURE; return true; } promise->AppendNativeHandler(mPromiseWorkerProxy); return true; }
bool WrapperAnswer::RecvDefineProperty(const ObjectId &objId, const JSIDVariant &idVar, const PPropertyDescriptor &descriptor, ReturnStatus *rs) { AutoJSAPI jsapi; if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects()))) return false; JSContext *cx = jsapi.cx(); RootedObject obj(cx, findObjectById(cx, objId)); if (!obj) return fail(cx, rs); LOG("define %s[%s]", ReceiverObj(objId), Identifier(idVar)); RootedId id(cx); if (!fromJSIDVariant(cx, idVar, &id)) return fail(cx, rs); Rooted<JSPropertyDescriptor> desc(cx); if (!toDescriptor(cx, descriptor, &desc)) return fail(cx, rs); bool ignored; if (!js_DefineOwnProperty(cx, obj, id, desc, &ignored)) return fail(cx, rs); return ok(rs); }
NS_IMETHODIMP PresentationConnection::NotifyMessage(const nsAString& aSessionId, const nsACString& aData) { if (!aSessionId.Equals(mId)) { return NS_ERROR_INVALID_ARG; } // No message should be expected when the session is not connected. if (NS_WARN_IF(mState != PresentationConnectionState::Connected)) { return NS_ERROR_DOM_INVALID_STATE_ERR; } // Transform the data. AutoJSAPI jsapi; if (!jsapi.Init(GetOwner())) { return NS_ERROR_FAILURE; } JSContext* cx = jsapi.cx(); JS::Rooted<JS::Value> jsData(cx); NS_ConvertUTF8toUTF16 utf16Data(aData); if(NS_WARN_IF(!ToJSValue(cx, utf16Data, &jsData))) { return NS_ERROR_FAILURE; } return DispatchMessageEvent(jsData); }
bool WrapperAnswer::RecvDelete(const ObjectId &objId, const JSIDVariant &idVar, ReturnStatus *rs, bool *success) { AutoJSAPI jsapi; if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects()))) return false; JSContext *cx = jsapi.cx(); *success = false; RootedObject obj(cx, findObjectById(cx, objId)); if (!obj) return fail(cx, rs); LOG("delete %s[%s]", ReceiverObj(objId), Identifier(idVar)); RootedId id(cx); if (!fromJSIDVariant(cx, idVar, &id)) return fail(cx, rs); if (!JS_DeletePropertyById2(cx, obj, id, success)) return fail(cx, rs); return ok(rs); }