demo · v135

Error name probe

Catch errors from navigator.credentials.create() and compare the browser's error.name with the legacy payment path and the Chrome 135+ aligned path. The key migration is SecurityError to NotAllowedError for the missing-activation payment create failure.

PublicKeyCredential: ? activation: ?

matrix

conditionpre-135 legacyChrome 135+ alignedthis browser
payment credential create in the activationless iframe envelopeSecurityErrorNotAllowedError
top-level create without a usable authenticator or user consentNotAllowedErrorNotAllowedError
AbortController abort()AbortErrorAbortError

error log

Ready.

recommended catch block

try {
  await navigator.credentials.create({ publicKey });
} catch (error) {
  switch (error.name) {
    case "NotAllowedError":
      showActivationOrCancelHint();
      break;
    case "SecurityError":
      showPolicyOrOriginFailure();
      break;
    case "AbortError":
      showAbortedHint();
      break;
    default:
      report(error);
  }
}

see also