/* static */ already_AddRefed<Promise> Promise::Constructor(const GlobalObject& aGlobal, JSContext* aCx, PromiseInit& aInit, ErrorResult& aRv) { MOZ_ASSERT(PrefEnabled()); nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(aGlobal.Get()); if (!window) { aRv.Throw(NS_ERROR_UNEXPECTED); return nullptr; } nsRefPtr<Promise> promise = new Promise(window); aInit.Call(promise, *promise->mResolver, aRv, CallbackObject::eRethrowExceptions); aRv.WouldReportJSException(); if (aRv.IsJSException()) { Optional<JS::Handle<JS::Value> > value(aCx); aRv.StealJSException(aCx, &value.Value()); Maybe<JSAutoCompartment> ac; EnterCompartment(ac, aCx, value); promise->mResolver->Reject(aCx, value); } return promise.forget(); }
// static bool TouchEvent::LegacyAPIEnabled(nsIDocShell* aDocShell, bool aCallerIsSystem) { return (aCallerIsSystem || StaticPrefs::dom_w3c_touch_events_legacy_apis_enabled() || (aDocShell && aDocShell->GetTouchEventsOverride() == nsIDocShell::TOUCHEVENTS_OVERRIDE_ENABLED)) && PrefEnabled(aDocShell); }
/* static */ bool OffscreenCanvas::PrefEnabledOnWorkerThread(JSContext* aCx, JSObject* aObj) { if (NS_IsMainThread()) { return true; } return PrefEnabled(aCx, aObj); }
/* static */ already_AddRefed<Promise> Promise::Reject(const GlobalObject& aGlobal, JSContext* aCx, JS::Handle<JS::Value> aValue, ErrorResult& aRv) { MOZ_ASSERT(PrefEnabled()); nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(aGlobal.Get()); if (!window) { aRv.Throw(NS_ERROR_UNEXPECTED); return nullptr; } nsRefPtr<Promise> promise = new Promise(window); Optional<JS::Handle<JS::Value> > value(aCx, aValue); promise->mResolver->Reject(aCx, value); return promise.forget(); }
/* static */ bool Promise::EnabledForScope(JSContext* aCx, JSObject* /* unused */) { // Enable if the pref is enabled or if we're chrome or if we're a // certified app. if (PrefEnabled()) { return true; } // Note that we have no concept of a certified app in workers. // XXXbz well, why not? if (!NS_IsMainThread()) { return workers::GetWorkerPrivateFromContext(aCx)->IsChromeWorker(); } nsIPrincipal* prin = nsContentUtils::GetSubjectPrincipal(); return nsContentUtils::IsSystemPrincipal(prin) || prin->GetAppStatus() == nsIPrincipal::APP_STATUS_CERTIFIED; }
already_AddRefed<WebSocket> WebSocket::Constructor(JSContext* aCx, nsISupports* aGlobal, const nsAString& aUrl, const Sequence<nsString>& aProtocols, ErrorResult& aRv) { if (!PrefEnabled()) { aRv.Throw(NS_ERROR_DOM_SECURITY_ERR); return nullptr; } nsCOMPtr<nsIScriptObjectPrincipal> scriptPrincipal = do_QueryInterface(aGlobal); if (!scriptPrincipal) { aRv.Throw(NS_ERROR_FAILURE); return nullptr; } nsCOMPtr<nsIPrincipal> principal = scriptPrincipal->GetPrincipal(); if (!principal) { aRv.Throw(NS_ERROR_FAILURE); return nullptr; } nsCOMPtr<nsIScriptGlobalObject> sgo = do_QueryInterface(aGlobal); if (!sgo) { aRv.Throw(NS_ERROR_FAILURE); return nullptr; } nsCOMPtr<nsPIDOMWindow> ownerWindow = do_QueryInterface(aGlobal); if (!ownerWindow) { aRv.Throw(NS_ERROR_FAILURE); return nullptr; } nsTArray<nsString> protocolArray; for (uint32_t index = 0, len = aProtocols.Length(); index < len; ++index) { const nsString& protocolElement = aProtocols[index]; if (protocolElement.IsEmpty()) { aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR); return nullptr; } if (protocolArray.Contains(protocolElement)) { aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR); return nullptr; } if (protocolElement.FindChar(',') != -1) /* interferes w/list */ { aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR); return nullptr; } protocolArray.AppendElement(protocolElement); } nsRefPtr<WebSocket> webSocket = new WebSocket(); nsresult rv = webSocket->Init(aCx, principal, ownerWindow, aUrl, protocolArray); if (NS_FAILED(rv)) { aRv.Throw(rv); return nullptr; } return webSocket.forget(); }