credentialId, }, } ); } // `getAutoFillEntries` may not return all of the credentials on the device // (in particular it will not include credentials with a protection policy // that forbids silent discovery), so we include a catch-all entry in the // list. If the user selects this entry, the WebAuthn transaction will // proceed using the modal UI. yield new ParentAutocompleteOption( "chrome://browser/content/logos/passkey.svg", formattedLabels[formattedLabels.length - 1], "", "PasswordManager:promptForAuthenticator", { selection: { transactionId, }, } ); } /** * * @param {int} browsingContextId the browsing context ID associated with this request * @param {string} formOrigin * @param {string} scenarioName can be "SignUpFormScenario" or undefined * @param {string} isWebAuthn indicates whether "webauthn" was included in the input's autocomplete value * @returns {ParentAutocompleteOption} the optional WebAuthn autocomplete item */ async autocompleteItemsAsync( browsingContextId, formOrigin, scenarioName, isWebAuthn ) { const result = []; if (scenarioName !== "SignUpFormScenario" || isWebAuthn) { for await (const item of this.#getAutocompleteItemsAsync( browsingContextId, formOrigin )) { result.push(item); } } return result; } async promptForAuthenticator(browser, selection) { lazy.log.info("Prompting to authenticate with relying party."); if (selection.credentialId) { lazy.webauthnService.selectAutoFillEntry( selection.transactionId, selection.credentialId ); } else { lazy.webauthnService.resumeConditionalGet(selection.transactionId); } } } export const WebAuthnFeature = new WebAuthnSupport(); PK