summaryrefslogtreecommitdiffstats
path: root/security/manager/ssl/NSSSocketControl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'security/manager/ssl/NSSSocketControl.cpp')
-rw-r--r--security/manager/ssl/NSSSocketControl.cpp54
1 files changed, 54 insertions, 0 deletions
diff --git a/security/manager/ssl/NSSSocketControl.cpp b/security/manager/ssl/NSSSocketControl.cpp
index e8f0f99dae..64c999701a 100644
--- a/security/manager/ssl/NSSSocketControl.cpp
+++ b/security/manager/ssl/NSSSocketControl.cpp
@@ -11,7 +11,9 @@
#include "nsISocketProvider.h"
#include "secerr.h"
#include "mozilla/Base64.h"
+#include "mozilla/dom/Promise.h"
#include "nsNSSCallbacks.h"
+#include "nsProxyRelease.h"
using namespace mozilla;
using namespace mozilla::psm;
@@ -293,6 +295,58 @@ NSSSocketControl::StartTLS() {
}
NS_IMETHODIMP
+NSSSocketControl::AsyncStartTLS(JSContext* aCx,
+ mozilla::dom::Promise** aPromise) {
+ MOZ_RELEASE_ASSERT(NS_IsMainThread());
+ NS_ENSURE_ARG_POINTER(aCx);
+ NS_ENSURE_ARG_POINTER(aPromise);
+
+ nsIGlobalObject* globalObject = xpc::CurrentNativeGlobal(aCx);
+ if (!globalObject) {
+ return NS_ERROR_UNEXPECTED;
+ }
+
+ ErrorResult result;
+ RefPtr<mozilla::dom::Promise> promise =
+ mozilla::dom::Promise::Create(globalObject, result);
+ if (result.Failed()) {
+ return result.StealNSResult();
+ }
+
+ nsCOMPtr<nsIEventTarget> target(
+ do_GetService(NS_SOCKETTRANSPORTSERVICE_CONTRACTID));
+ if (!target) {
+ return NS_ERROR_UNEXPECTED;
+ }
+
+ auto promiseHolder = MakeRefPtr<nsMainThreadPtrHolder<dom::Promise>>(
+ "AsyncStartTLS promise", promise);
+
+ nsCOMPtr<nsIRunnable> runnable(NS_NewRunnableFunction(
+ "AsyncStartTLS::StartTLS",
+ [promiseHolder = std::move(promiseHolder), self = RefPtr{this}]() {
+ nsresult rv = self->StartTLS();
+ NS_DispatchToMainThread(NS_NewRunnableFunction(
+ "AsyncStartTLS::Resolve", [rv, promiseHolder]() {
+ dom::Promise* promise = promiseHolder.get()->get();
+ if (NS_FAILED(rv)) {
+ promise->MaybeReject(rv);
+ } else {
+ promise->MaybeResolveWithUndefined();
+ }
+ }));
+ }));
+
+ nsresult rv = target->Dispatch(runnable, NS_DISPATCH_NORMAL);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+ promise.forget(aPromise);
+ return NS_OK;
+}
+
+NS_IMETHODIMP
NSSSocketControl::SetNPNList(nsTArray<nsCString>& protocolArray) {
COMMON_SOCKET_CONTROL_ASSERT_ON_OWNING_THREAD();
if (!mFd) return NS_ERROR_FAILURE;