summaryrefslogtreecommitdiffstats
path: root/dom/webauthn/WebAuthnTransactionChild.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/webauthn/WebAuthnTransactionChild.cpp')
-rw-r--r--dom/webauthn/WebAuthnTransactionChild.cpp87
1 files changed, 87 insertions, 0 deletions
diff --git a/dom/webauthn/WebAuthnTransactionChild.cpp b/dom/webauthn/WebAuthnTransactionChild.cpp
new file mode 100644
index 0000000000..15022ff981
--- /dev/null
+++ b/dom/webauthn/WebAuthnTransactionChild.cpp
@@ -0,0 +1,87 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/WebAuthnTransactionChild.h"
+
+namespace mozilla::dom {
+
+WebAuthnTransactionChild::WebAuthnTransactionChild(
+ WebAuthnManagerBase* aManager)
+ : mManager(aManager) {
+ MOZ_ASSERT(aManager);
+
+ // Retain a reference so the task object isn't deleted without IPDL's
+ // knowledge. The reference will be released by
+ // mozilla::ipc::BackgroundChildImpl::DeallocPWebAuthnTransactionChild.
+ NS_ADDREF_THIS();
+}
+
+mozilla::ipc::IPCResult WebAuthnTransactionChild::RecvConfirmRegister(
+ const uint64_t& aTransactionId,
+ const WebAuthnMakeCredentialResult& aResult) {
+ if (NS_WARN_IF(!mManager)) {
+ return IPC_FAIL_NO_REASON(this);
+ }
+
+ // We don't own the reference to mManager. We need to prevent its refcount
+ // going to 0 while we call anything that can reach the call to
+ // StopListeningForVisibilityEvents in WebAuthnManager::ClearTransaction
+ // (often via WebAuthnManager::RejectTransaction).
+ RefPtr<WebAuthnManagerBase> kungFuDeathGrip(mManager);
+ kungFuDeathGrip->FinishMakeCredential(aTransactionId, aResult);
+ return IPC_OK();
+}
+
+mozilla::ipc::IPCResult WebAuthnTransactionChild::RecvConfirmSign(
+ const uint64_t& aTransactionId, const WebAuthnGetAssertionResult& aResult) {
+ if (NS_WARN_IF(!mManager)) {
+ return IPC_FAIL_NO_REASON(this);
+ }
+
+ // We don't own the reference to mManager. We need to prevent its refcount
+ // going to 0 while we call anything that can reach the call to
+ // StopListeningForVisibilityEvents in WebAuthnManager::ClearTransaction
+ // (often via WebAuthnManager::RejectTransaction).
+ RefPtr<WebAuthnManagerBase> kungFuDeathGrip(mManager);
+ kungFuDeathGrip->FinishGetAssertion(aTransactionId, aResult);
+ return IPC_OK();
+}
+
+mozilla::ipc::IPCResult WebAuthnTransactionChild::RecvAbort(
+ const uint64_t& aTransactionId, const nsresult& aError) {
+ if (NS_WARN_IF(!mManager)) {
+ return IPC_FAIL_NO_REASON(this);
+ }
+
+ // We don't own the reference to mManager. We need to prevent its refcount
+ // going to 0 while we call anything that can reach the call to
+ // StopListeningForVisibilityEvents in WebAuthnManager::ClearTransaction
+ // (often via WebAuthnManager::RejectTransaction).
+ RefPtr<WebAuthnManagerBase> kungFuDeathGrip(mManager);
+ kungFuDeathGrip->RequestAborted(aTransactionId, aError);
+ return IPC_OK();
+}
+
+void WebAuthnTransactionChild::ActorDestroy(ActorDestroyReason why) {
+ // Called by either a __delete__ message from the parent, or when the
+ // channel disconnects. Clear out the child actor reference to be sure.
+ if (mManager) {
+ mManager->ActorDestroyed();
+ mManager = nullptr;
+ }
+}
+
+void WebAuthnTransactionChild::Disconnect() {
+ mManager = nullptr;
+
+ // The WebAuthnManager released us, but we're going to be held alive by the
+ // IPC layer. The parent will explicitly destroy us via Send__delete__(),
+ // after receiving the DestroyMe message.
+
+ SendDestroyMe();
+}
+
+} // namespace mozilla::dom