diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/modules/credentialmanager/public_key_credential.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/modules/credentialmanager/public_key_credential.cc | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/chromium/third_party/blink/renderer/modules/credentialmanager/public_key_credential.cc b/chromium/third_party/blink/renderer/modules/credentialmanager/public_key_credential.cc index e4a5d1c3afb..e219eb6b405 100644 --- a/chromium/third_party/blink/renderer/modules/credentialmanager/public_key_credential.cc +++ b/chromium/third_party/blink/renderer/modules/credentialmanager/public_key_credential.cc @@ -7,7 +7,8 @@ #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" -#include "third_party/blink/renderer/core/dom/exception_code.h" +#include "third_party/blink/renderer/modules/credentialmanager/credential_manager_proxy.h" +#include "third_party/blink/renderer/modules/credentialmanager/scoped_promise_resolver.h" #include "third_party/blink/renderer/platform/bindings/script_state.h" namespace blink { @@ -15,6 +16,12 @@ namespace blink { namespace { // https://www.w3.org/TR/webauthn/#dom-publickeycredential-type-slot: constexpr char kPublicKeyCredentialType[] = "public-key"; + +void OnIsUserVerifyingComplete( + std::unique_ptr<ScopedPromiseResolver> scoped_resolver, + bool available) { + scoped_resolver->Release()->Resolve(available); +} } // namespace PublicKeyCredential* PublicKeyCredential::Create( @@ -38,9 +45,23 @@ PublicKeyCredential::PublicKeyCredential( ScriptPromise PublicKeyCredential::isUserVerifyingPlatformAuthenticatorAvailable( ScriptState* script_state) { - return ScriptPromise::RejectWithDOMException( - script_state, - DOMException::Create(kNotSupportedError, "Operation not implemented.")); + ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state); + ScriptPromise promise = resolver->Promise(); + + // Ignore calls if the current realm execution context is no longer valid, + // e.g., because the responsible document was detached. + DCHECK(resolver->GetExecutionContext()); + if (resolver->GetExecutionContext()->IsContextDestroyed()) { + resolver->Reject(); + return promise; + } + + auto* authenticator = + CredentialManagerProxy::From(script_state)->Authenticator(); + authenticator->IsUserVerifyingPlatformAuthenticatorAvailable(WTF::Bind( + &OnIsUserVerifyingComplete, + WTF::Passed(std::make_unique<ScopedPromiseResolver>(resolver)))); + return promise; } void PublicKeyCredential::getClientExtensionResults( |