void IDBKeyRange::GetLower(JSContext* aCx, JS::MutableHandle<JS::Value> aResult, ErrorResult& aRv) { MOZ_ASSERT(NS_IsMainThread(), "Wrong thread!"); if (!mHaveCachedLowerVal) { if (!mRooted) { mozilla::HoldJSObjects(this); mRooted = true; } aRv = Lower().ToJSVal(aCx, mCachedLowerVal); if (aRv.Failed()) { return; } mHaveCachedLowerVal = true; } JS::ExposeValueToActiveJS(mCachedLowerVal); aResult.set(mCachedLowerVal); }
void IDBKeyRange::GetUpper(JSContext* aCx, JS::MutableHandle<JS::Value> aResult, ErrorResult& aRv) { AssertIsOnOwningThread(); if (!mHaveCachedUpperVal) { if (!mRooted) { mozilla::HoldJSObjects(this); mRooted = true; } aRv = Upper().ToJSVal(aCx, mCachedUpperVal); if (aRv.Failed()) { return; } mHaveCachedUpperVal = true; } JS::ExposeValueToActiveJS(mCachedUpperVal); aResult.set(mCachedUpperVal); }
/* static */ already_AddRefed<File> File::Constructor( const GlobalObject& aGlobal, const Sequence<OwningArrayBufferOrArrayBufferViewOrBlobOrString>& aData, const nsAString& aName, const FilePropertyBag& aBag, ErrorResult& aRv) { nsRefPtr<MultipartBlobImpl> impl = new MultipartBlobImpl(aName); impl->InitializeBlob(aGlobal.Context(), aData, aBag.mType, false, aRv); if (aRv.Failed()) { return nullptr; } MOZ_ASSERT(impl->IsFile()); if (aBag.mLastModified.WasPassed()) { impl->SetLastModified(aBag.mLastModified.Value()); } nsRefPtr<File> file = new File(aGlobal.GetAsSupports(), impl); return file.forget(); }
already_AddRefed<Promise> ServiceWorkerGlobalScope::Unregister(ErrorResult& aRv) { mWorkerPrivate->AssertIsOnWorkerThread(); MOZ_ASSERT(mWorkerPrivate->IsServiceWorker()); nsRefPtr<Promise> promise = Promise::Create(this, aRv); if (aRv.Failed()) { return nullptr; } nsRefPtr<WorkerScopeUnregisterRunnable> runnable = new WorkerScopeUnregisterRunnable(mWorkerPrivate, promise, mScope); // Ensure the AddFeature succeeded before dispatching. // Otherwise we let the promise remain pending since script is going to stop // soon anyway. if (runnable->WorkerPromise()) { NS_DispatchToMainThread(runnable); } return promise.forget(); }
already_AddRefed<PeriodicWave> AudioContext::CreatePeriodicWave(const Float32Array& aRealData, const Float32Array& aImagData, ErrorResult& aRv) { aRealData.ComputeLengthAndData(); aImagData.ComputeLengthAndData(); if (aRealData.Length() != aImagData.Length() || aRealData.Length() == 0 || aRealData.Length() > 4096) { aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR); return nullptr; } nsRefPtr<PeriodicWave> periodicWave = new PeriodicWave(this, aRealData.Data(), aImagData.Data(), aImagData.Length(), aRv); if (aRv.Failed()) { return nullptr; } return periodicWave.forget(); }
already_AddRefed<Promise> MediaKeys::SetServerCertificate(const ArrayBufferViewOrArrayBuffer& aCert, ErrorResult& aRv) { nsRefPtr<Promise> promise(MakePromise(aRv)); if (aRv.Failed()) { return nullptr; } if (!mProxy) { NS_WARNING("Tried to use a MediaKeys without a CDM"); promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR); return promise.forget(); } nsTArray<uint8_t> data; if (!CopyArrayBufferViewOrArrayBufferData(aCert, data)) { promise->MaybeReject(NS_ERROR_DOM_INVALID_ACCESS_ERR); return promise.forget(); } mProxy->SetServerCertificate(StorePromise(promise), data); return promise.forget(); }
/* DOMSVGMatrix getTransformToElement (in nsIDOMSVGElement element); */ NS_IMETHODIMP nsSVGGraphicElement::GetTransformToElement(nsIDOMSVGElement *element, nsISupports **_retval) { if (!element) return NS_ERROR_DOM_SVG_WRONG_TYPE_ERR; nsresult rv; *_retval = nullptr; nsCOMPtr<DOMSVGMatrix> ourScreenCTM; nsCOMPtr<DOMSVGMatrix> targetScreenCTM; nsCOMPtr<nsIDOMSVGLocatable> target = do_QueryInterface(element, &rv); if (NS_FAILED(rv)) return rv; // the easiest way to do this (if likely to increase rounding error): GetScreenCTM(getter_AddRefs(ourScreenCTM)); if (!ourScreenCTM) return NS_ERROR_DOM_SVG_MATRIX_NOT_INVERTABLE; target->GetScreenCTM(getter_AddRefs(targetScreenCTM)); if (!targetScreenCTM) return NS_ERROR_DOM_SVG_MATRIX_NOT_INVERTABLE; ErrorResult result; nsCOMPtr<DOMSVGMatrix> tmp = targetScreenCTM->Inverse(result); if (result.Failed()) return result.ErrorCode(); *_retval = tmp->Multiply(*ourScreenCTM).get(); // addrefs, so we don't return NS_OK; }
void WritableSharedMap::Set(JSContext* aCx, const nsACString& aName, JS::HandleValue aValue, ErrorResult& aRv) { StructuredCloneData holder; holder.Write(aCx, aValue, aRv); if (aRv.Failed()) { return; } if (!holder.InputStreams().IsEmpty()) { aRv.Throw(NS_ERROR_INVALID_ARG); return; } Entry* entry = mEntries.LookupOrAdd(aName, *this, aName); entry->TakeData(std::move(holder)); KeyChanged(aName); }
void CacheStorage::MaybeRunPendingRequests() { if (!mActor) { return; } for (uint32_t i = 0; i < mPendingRequests.Length(); ++i) { ErrorResult rv; nsAutoPtr<Entry> entry(mPendingRequests[i].forget()); AutoChildOpArgs args(this, entry->mArgs); if (entry->mRequest) { args.Add(entry->mRequest, IgnoreBody, PassThroughReferrer, IgnoreInvalidScheme, rv); } if (rv.Failed()) { entry->mPromise->MaybeReject(rv); continue; } mActor->ExecuteOp(mGlobal, entry->mPromise, args.SendAsOpArgs()); } mPendingRequests.Clear(); }
NS_INTERFACE_MAP_END ServiceWorkerClientInfo::ServiceWorkerClientInfo(nsIDocument* aDoc) : mWindowId(0) { MOZ_ASSERT(aDoc); nsresult rv = aDoc->GetId(mClientId); if (NS_FAILED(rv)) { NS_WARNING("Failed to get the UUID of the document."); } nsRefPtr<nsGlobalWindow> innerWindow = static_cast<nsGlobalWindow*>(aDoc->GetInnerWindow()); if (innerWindow) { // XXXcatalinb: The inner window can be null if the document is navigating // and was detached. mWindowId = innerWindow->WindowID(); } aDoc->GetURL(mUrl); mVisibilityState = aDoc->VisibilityState(); ErrorResult result; mFocused = aDoc->HasFocus(result); if (result.Failed()) { NS_WARNING("Failed to get focus information."); } nsRefPtr<nsGlobalWindow> outerWindow = static_cast<nsGlobalWindow*>(aDoc->GetWindow()); MOZ_ASSERT(outerWindow); if (!outerWindow->IsTopLevelWindow()) { mFrameType = FrameType::Nested; } else if (outerWindow->HadOriginalOpener()) { mFrameType = FrameType::Auxiliary; } else { mFrameType = FrameType::Top_level; } }
NS_IMETHODIMP inDOMUtils::SelectorMatchesElement(nsIDOMElement* aElement, nsIDOMCSSStyleRule* aRule, uint32_t aSelectorIndex, bool* aMatches) { nsCOMPtr<Element> element = do_QueryInterface(aElement); NS_ENSURE_ARG_POINTER(element); ErrorResult rv; nsCSSSelectorList* tail = GetSelectorAtIndex(aRule, aSelectorIndex, rv); if (rv.Failed()) { return rv.ErrorCode(); } // We want just the one list item, not the whole list tail nsAutoPtr<nsCSSSelectorList> sel(tail->Clone(false)); // SelectorListMatches does not handle selectors that begin with a // pseudo-element, which you can get from selectors like // |input::-moz-placeholder:hover|. This function doesn't take // a pseudo-element nsIAtom*, so we know we can't match. if (sel->mSelectors->IsPseudoElement()) { *aMatches = false; return NS_OK; } element->OwnerDoc()->FlushPendingLinkUpdates(); // XXXbz what exactly should we do with visited state here? TreeMatchContext matchingContext(false, nsRuleWalker::eRelevantLinkUnvisited, element->OwnerDoc(), TreeMatchContext::eNeverMatchVisited); *aMatches = nsCSSRuleProcessor::SelectorListMatches(element, matchingContext, sel); return NS_OK; }
already_AddRefed<Promise> BluetoothGatt::Disconnect(ErrorResult& aRv) { nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(GetParentObject()); if (!global) { aRv.Throw(NS_ERROR_FAILURE); return nullptr; } RefPtr<Promise> promise = Promise::Create(global, aRv); NS_ENSURE_TRUE(!aRv.Failed(), nullptr); BT_ENSURE_TRUE_REJECT( mConnectionState == BluetoothConnectionState::Connected, promise, NS_ERROR_DOM_INVALID_STATE_ERR); BluetoothService* bs = BluetoothService::Get(); BT_ENSURE_TRUE_REJECT(bs, promise, NS_ERROR_NOT_AVAILABLE); BluetoothUuid appUuid; BT_ENSURE_TRUE_REJECT(NS_SUCCEEDED(StringToUuid(mAppUuid, appUuid)), promise, NS_ERROR_DOM_OPERATION_ERR); BluetoothAddress deviceAddr; BT_ENSURE_TRUE_REJECT( NS_SUCCEEDED(StringToAddress(mDeviceAddr, deviceAddr)), promise, NS_ERROR_DOM_OPERATION_ERR); UpdateConnectionState(BluetoothConnectionState::Disconnecting); bs->DisconnectGattClientInternal( appUuid, deviceAddr, new BluetoothVoidReplyRunnable(nullptr, promise)); return promise.forget(); }
/* static */ nsresult CSPEvalChecker::CheckForWorker(JSContext* aCx, WorkerPrivate* aWorkerPrivate, const nsAString& aExpression, bool* aAllowEval) { MOZ_ASSERT(aWorkerPrivate); aWorkerPrivate->AssertIsOnWorkerThread(); MOZ_ASSERT(aAllowEval); // The value is set at any "return", but better to have a default value here. *aAllowEval = false; // Get the calling location. uint32_t lineNum = 0; uint32_t columnNum = 0; nsAutoString fileNameString; if (!nsJSUtils::GetCallingLocation(aCx, fileNameString, &lineNum, &columnNum)) { fileNameString.AssignLiteral("unknown"); } RefPtr<WorkerCSPCheckRunnable> r = new WorkerCSPCheckRunnable( aWorkerPrivate, aExpression, fileNameString, lineNum, columnNum); ErrorResult error; r->Dispatch(Canceling, error); if (NS_WARN_IF(error.Failed())) { *aAllowEval = false; return error.StealNSResult(); } nsresult rv = r->GetResult(aAllowEval); if (NS_WARN_IF(NS_FAILED(rv))) { *aAllowEval = false; return rv; } return NS_OK; }
void GetFileOrDirectoryTaskChild::SetSuccessRequestResult(const FileSystemResponseValue& aValue, ErrorResult& aRv) { MOZ_ASSERT(NS_IsMainThread(), "Only call on main thread!"); switch (aValue.type()) { case FileSystemResponseValue::TFileSystemFileResponse: { FileSystemFileResponse r = aValue; RefPtr<BlobImpl> blobImpl = static_cast<BlobChild*>(r.blobChild())->GetBlobImpl(); MOZ_ASSERT(blobImpl); mResultFile = File::Create(mFileSystem->GetParentObject(), blobImpl); MOZ_ASSERT(mResultFile); break; } case FileSystemResponseValue::TFileSystemDirectoryResponse: { FileSystemDirectoryResponse r = aValue; nsCOMPtr<nsIFile> file; aRv = NS_NewLocalFile(r.realPath(), true, getter_AddRefs(file)); if (NS_WARN_IF(aRv.Failed())) { return; } mResultDirectory = Directory::Create(mFileSystem->GetParentObject(), file, mFileSystem); MOZ_ASSERT(mResultDirectory); break; } default: { MOZ_CRASH("not reached"); break; } } }
already_AddRefed<Promise> AudioContext::Resume(ErrorResult& aRv) { nsCOMPtr<nsIGlobalObject> parentObject = do_QueryInterface(GetParentObject()); nsRefPtr<Promise> promise; promise = Promise::Create(parentObject, aRv); if (aRv.Failed()) { return nullptr; } if (mIsOffline) { promise->MaybeReject(NS_ERROR_DOM_NOT_SUPPORTED_ERR); return promise.forget(); } if (mAudioContextState == AudioContextState::Closed || mCloseCalled) { promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR); return promise.forget(); } if (mAudioContextState == AudioContextState::Running) { promise->MaybeResolve(JS::UndefinedHandleValue); return promise.forget(); } MediaStream* ds = DestinationStream(); if (ds) { ds->UnblockStreamIfNeeded(); } mPromiseGripArray.AppendElement(promise); Graph()->ApplyAudioContextOperation(DestinationStream()->AsAudioNodeStream(), AudioContextOperation::Resume, promise); return promise.forget(); }
already_AddRefed<Promise> BluetoothGatt::Connect(ErrorResult& aRv) { nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(GetParentObject()); if (!global) { aRv.Throw(NS_ERROR_FAILURE); return nullptr; } nsRefPtr<Promise> promise = Promise::Create(global, aRv); NS_ENSURE_TRUE(!aRv.Failed(), nullptr); BT_ENSURE_TRUE_REJECT( mConnectionState == BluetoothConnectionState::Disconnected, NS_ERROR_DOM_INVALID_STATE_ERR); BluetoothService* bs = BluetoothService::Get(); BT_ENSURE_TRUE_REJECT(bs, NS_ERROR_NOT_AVAILABLE); if (mAppUuid.IsEmpty()) { GenerateUuid(mAppUuid); BT_ENSURE_TRUE_REJECT(!mAppUuid.IsEmpty(), NS_ERROR_DOM_OPERATION_ERR); bs->RegisterBluetoothSignalHandler(mAppUuid, this); } UpdateConnectionState(BluetoothConnectionState::Connecting); nsRefPtr<BluetoothReplyRunnable> result = new BluetoothVoidReplyRunnable(nullptr /* DOMRequest */, promise, NS_LITERAL_STRING("ConnectGattClient")); bs->ConnectGattClientInternal(mAppUuid, mDeviceAddr, result); return promise.forget(); }
already_AddRefed<Promise> PresentationRequest::GetAvailability(ErrorResult& aRv) { PRES_DEBUG("%s:id[%s]\n", __func__, NS_ConvertUTF16toUTF8(mUrl).get()); nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(GetOwner()); if (NS_WARN_IF(!global)) { aRv.Throw(NS_ERROR_UNEXPECTED); return nullptr; } nsCOMPtr<nsIDocument> doc = GetOwner()->GetExtantDoc(); if (NS_WARN_IF(!doc)) { aRv.Throw(NS_ERROR_FAILURE); return nullptr; } RefPtr<Promise> promise = Promise::Create(global, aRv); if (NS_WARN_IF(aRv.Failed())) { return nullptr; } if (IsProhibitMixedSecurityContexts(doc) && !IsPrioriAuthenticatedURL(mUrl)) { promise->MaybeReject(NS_ERROR_DOM_SECURITY_ERR); return promise.forget(); } if (doc->GetSandboxFlags() & SANDBOXED_PRESENTATION) { promise->MaybeReject(NS_ERROR_DOM_SECURITY_ERR); return promise.forget(); } FindOrCreatePresentationAvailability(promise); return promise.forget(); }
already_AddRefed<Promise> BluetoothAdapter::StopDiscovery(ErrorResult& aRv) { nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(GetOwner()); if (!global) { aRv.Throw(NS_ERROR_FAILURE); return nullptr; } nsRefPtr<Promise> promise = Promise::Create(global, aRv); NS_ENSURE_TRUE(!aRv.Failed(), nullptr); /** * Ensure * - adapter is discovering, * - adapter is already enabled, and * - BluetoothService is available */ BT_ENSURE_TRUE_RESOLVE(mDiscovering, promise, JS::UndefinedHandleValue); BT_ENSURE_TRUE_REJECT(mState == BluetoothAdapterState::Enabled, promise, NS_ERROR_DOM_INVALID_STATE_ERR); BluetoothService* bs = BluetoothService::Get(); BT_ENSURE_TRUE_REJECT(bs, promise, NS_ERROR_NOT_AVAILABLE); BT_API2_LOGR(); nsRefPtr<BluetoothReplyRunnable> result = new BluetoothVoidReplyRunnable(nullptr /* DOMRequest */, promise, NS_LITERAL_STRING("StopDiscovery")); BT_ENSURE_TRUE_REJECT(NS_SUCCEEDED(bs->StopDiscoveryInternal(result)), promise, NS_ERROR_DOM_OPERATION_ERR); return promise.forget(); }
bool ReadTransfer(JSContext* aCx, JSStructuredCloneReader* aReader, uint32_t aTag, void* aContent, uint64_t aExtraData, void* aClosure, JS::MutableHandle<JSObject*> aReturnObject) { MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(aClosure); auto* closure = static_cast<StructuredCloneClosureInternalReadOnly*>(aClosure); if (aTag != SCTAG_DOM_MAP_MESSAGEPORT) { return false; } MOZ_ASSERT(aContent == 0); MOZ_ASSERT(aExtraData < closure->mClosure.mMessagePortIdentifiers.Length()); ErrorResult rv; nsRefPtr<MessagePort> port = MessagePort::Create(closure->mWindow, closure->mClosure.mMessagePortIdentifiers[aExtraData], rv); if (NS_WARN_IF(rv.Failed())) { return false; } closure->mMessagePorts.AppendElement(port); JS::Rooted<JS::Value> value(aCx); if (!GetOrCreateDOMReflector(aCx, port, &value)) { JS_ClearPendingException(aCx); return false; } aReturnObject.set(&value.toObject()); return true; }
already_AddRefed<Promise> BluetoothGattServer::AddService(BluetoothGattService& aService, ErrorResult& aRv) { nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(GetParentObject()); if (!global) { aRv.Throw(NS_ERROR_FAILURE); return nullptr; } RefPtr<Promise> promise = Promise::Create(global, aRv); NS_ENSURE_TRUE(!aRv.Failed(), nullptr); BT_ENSURE_TRUE_REJECT(mValid, promise, NS_ERROR_NOT_AVAILABLE); BT_ENSURE_TRUE_REJECT(!aService.IsActivated(), promise, NS_ERROR_INVALID_ARG); BluetoothService* bs = BluetoothService::Get(); BT_ENSURE_TRUE_REJECT(bs, promise, NS_ERROR_NOT_AVAILABLE); mPendingService = &aService; BluetoothUuid appUuid; if (NS_FAILED(StringToUuid(mAppUuid, appUuid))) { return false; } bs->GattServerAddServiceInternal(appUuid, mPendingService->GetServiceId(), mPendingService->GetHandleCount(), new AddServiceTask(this, mPendingService, promise)); return promise.forget(); }
already_AddRefed<Promise> AudioContext::Close(ErrorResult& aRv) { nsCOMPtr<nsIGlobalObject> parentObject = do_QueryInterface(GetParentObject()); nsRefPtr<Promise> promise; promise = Promise::Create(parentObject, aRv); if (aRv.Failed()) { return nullptr; } if (mIsOffline) { promise->MaybeReject(NS_ERROR_DOM_NOT_SUPPORTED_ERR); return promise.forget(); } if (mAudioContextState == AudioContextState::Closed) { promise->MaybeResolve(NS_ERROR_DOM_INVALID_STATE_ERR); return promise.forget(); } mCloseCalled = true; if (Destination()) { Destination()->DestroyAudioChannelAgent(); } mPromiseGripArray.AppendElement(promise); // This can be called when freeing a document, and the streams are dead at // this point, so we need extra null-checks. MediaStream* ds = DestinationStream(); if (ds) { Graph()->ApplyAudioContextOperation(ds->AsAudioNodeStream(), AudioContextOperation::Close, promise); } return promise.forget(); }
void CompareCache::ManageCacheResult(JSContext* aCx, JS::Handle<JS::Value> aValue) { AssertIsOnMainThread(); if (NS_WARN_IF(!aValue.isObject())) { mManager->CacheFinished(NS_ERROR_FAILURE, false); return; } JS::Rooted<JSObject*> obj(aCx, &aValue.toObject()); if (NS_WARN_IF(!obj)) { mManager->CacheFinished(NS_ERROR_FAILURE, false); return; } Cache* cache = nullptr; nsresult rv = UNWRAP_OBJECT(Cache, obj, cache); if (NS_WARN_IF(NS_FAILED(rv))) { mManager->CacheFinished(rv, false); return; } RequestOrUSVString request; request.SetAsUSVString().Rebind(mURL.Data(), mURL.Length()); ErrorResult error; CacheQueryOptions params; RefPtr<Promise> promise = cache->Match(request, params, error); if (NS_WARN_IF(error.Failed())) { mManager->CacheFinished(error.StealNSResult(), false); return; } promise->AppendNativeHandler(this); mState = WaitingForValue; }
void HTMLVideoElement::UpdateScreenWakeLock() { bool hidden = OwnerDoc()->Hidden(); if (mScreenWakeLock && (mPaused || hidden)) { ErrorResult rv; mScreenWakeLock->Unlock(rv); NS_WARN_IF_FALSE(!rv.Failed(), "Failed to unlock the wakelock."); mScreenWakeLock = nullptr; return; } if (!mScreenWakeLock && !mPaused && !hidden && HasVideo()) { nsRefPtr<power::PowerManagerService> pmService = power::PowerManagerService::GetInstance(); NS_ENSURE_TRUE_VOID(pmService); ErrorResult rv; mScreenWakeLock = pmService->NewWakeLock(NS_LITERAL_STRING("screen"), OwnerDoc()->GetInnerWindow(), rv); } }
void CSSAnimation::PauseFromStyle() { // Check if the pause state is being overridden if (mIsStylePaused) { return; } mIsStylePaused = true; ErrorResult rv; DoPause(rv); // pause() should only throw when *all* of the following conditions are true: // - we are in the idle state, and // - we have a negative playback rate, and // - we have an infinitely repeating animation // The first two conditions will never happen under regular style processing // but could happen if an author made modifications to the Animation object // and then updated animation-play-state. It's an unusual case and there's // no obvious way to pass on the exception information so we just silently // fail for now. if (rv.Failed()) { NS_WARNING("Unexpected exception pausing animation - silently failing"); } }
already_AddRefed<Promise> WorkerDataStore::Clear(JSContext* aCx, const nsAString& aRevisionId, ErrorResult& aRv) { WorkerPrivate* workerPrivate = GetWorkerPrivateFromContext(aCx); MOZ_ASSERT(workerPrivate); workerPrivate->AssertIsOnWorkerThread(); nsRefPtr<Promise> promise = Promise::Create(workerPrivate->GlobalScope(), aRv); if (aRv.Failed()) { return nullptr; } nsRefPtr<DataStoreClearRunnable> runnable = new DataStoreClearRunnable(workerPrivate, mBackingStore, promise, aRevisionId, aRv); runnable->Dispatch(aCx); return promise.forget(); }
already_AddRefed<Promise> BluetoothGattCharacteristic::ReadValue(ErrorResult& aRv) { nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(GetParentObject()); if (!global) { aRv.Throw(NS_ERROR_FAILURE); return nullptr; } RefPtr<Promise> promise = Promise::Create(global, aRv); NS_ENSURE_TRUE(!aRv.Failed(), nullptr); if (mAttRole == ATT_SERVER_ROLE) { promise->MaybeResolve(mValue); return promise.forget(); } BT_ENSURE_TRUE_REJECT(mProperties & GATT_CHAR_PROP_BIT_READ, promise, NS_ERROR_NOT_AVAILABLE); BluetoothService* bs = BluetoothService::Get(); BT_ENSURE_TRUE_REJECT(bs, promise, NS_ERROR_NOT_AVAILABLE); BluetoothUuid appUuid; BT_ENSURE_TRUE_REJECT(NS_SUCCEEDED(StringToUuid(mService->GetAppUuid(), appUuid)), promise, NS_ERROR_DOM_OPERATION_ERR); bs->GattClientReadCharacteristicValueInternal( appUuid, mService->GetServiceId(), mCharId, new ReadValueTask(this, promise)); return promise.forget(); }
already_AddRefed<dom::DOMRequest> BrowserElementAudioChannel::IsActive(ErrorResult& aRv) { MOZ_ASSERT(NS_IsMainThread()); AssertIsInMainProcess(); if (mState != eStateUnknown) { RefPtr<DOMRequest> domRequest = new DOMRequest(GetOwner()); nsCOMPtr<nsIRunnable> runnable = new IsActiveRunnable(GetOwner(), mFrameWindow, domRequest, mAudioChannel, mState == eStateActive); NS_DispatchToMainThread(runnable); return domRequest.forget(); } if (!mFrameWindow) { nsCOMPtr<nsIDOMDOMRequest> request; aRv = mBrowserElementAPI->IsAudioChannelActive((uint32_t)mAudioChannel, getter_AddRefs(request)); if (NS_WARN_IF(aRv.Failed())) { return nullptr; } return request.forget().downcast<DOMRequest>(); } RefPtr<DOMRequest> domRequest = new DOMRequest(GetOwner()); nsCOMPtr<nsIRunnable> runnable = new IsActiveRunnable(GetOwner(), mFrameWindow, domRequest, mAudioChannel); NS_DispatchToMainThread(runnable); return domRequest.forget(); }
already_AddRefed<PeriodicWave> AudioContext::CreatePeriodicWave(const Float32Array& aRealData, const Float32Array& aImagData, const PeriodicWaveConstraints& aConstraints, ErrorResult& aRv) { aRealData.ComputeLengthAndData(); aImagData.ComputeLengthAndData(); if (aRealData.Length() != aImagData.Length() || aRealData.Length() == 0) { aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR); return nullptr; } RefPtr<PeriodicWave> periodicWave = new PeriodicWave(this, aRealData.Data(), aImagData.Data(), aImagData.Length(), aConstraints.mDisableNormalization, aRv); if (aRv.Failed()) { return nullptr; } return periodicWave.forget(); }
already_AddRefed<Promise> Cache::PutAll(const nsTArray<nsRefPtr<Request>>& aRequestList, const nsTArray<nsRefPtr<Response>>& aResponseList, ErrorResult& aRv) { MOZ_ASSERT(aRequestList.Length() == aResponseList.Length()); if (NS_WARN_IF(!mActor)) { aRv.Throw(NS_ERROR_UNEXPECTED); return nullptr; } AutoChildOpArgs args(this, CachePutAllArgs()); for (uint32_t i = 0; i < aRequestList.Length(); ++i) { nsRefPtr<InternalRequest> ir = aRequestList[i]->GetInternalRequest(); args.Add(ir, ReadBody, TypeErrorOnInvalidScheme, *aResponseList[i], aRv); if (NS_WARN_IF(aRv.Failed())) { return nullptr; } } return ExecuteOp(args, aRv); }
already_AddRefed<Promise> ServiceWorkerRegistrationMainThread::Update(ErrorResult& aRv) { AssertIsOnMainThread(); nsCOMPtr<nsIGlobalObject> go = do_QueryInterface(GetOwner()); if (!go) { aRv.Throw(NS_ERROR_FAILURE); return nullptr; } RefPtr<Promise> promise = Promise::Create(go, aRv); if (NS_WARN_IF(aRv.Failed())) { return nullptr; } nsCOMPtr<nsIDocument> doc = GetOwner()->GetExtantDoc(); MOZ_ASSERT(doc); RefPtr<MainThreadUpdateCallback> cb = new MainThreadUpdateCallback(promise); UpdateInternal(doc->NodePrincipal(), mScope, cb); return promise.forget(); }