Skip to content

Add an autofill module #706

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 20 commits into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
123 changes: 122 additions & 1 deletion index.bs
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ spec: WEBDRIVER; urlPrefix: https://w3c.github.io/webdriver/
text: input cancel list; url: dfn-input-cancel-list
text: intermediary node; url: dfn-intermediary-nodes
text: invalid argument; url: dfn-invalid-argument
text: invalid element state; url: dfn-invalid-element-state
text: invalid selector; url: dfn-invalid-selector
text: invalid session id; url: dfn-invalid-session-id
text: is element origin; url: dfn-is-element-origin
Expand Down Expand Up @@ -191,9 +192,12 @@ spec: HTML; urlPrefix: https://html.spec.whatwg.org/multipage/
text: activation notification; url: interaction.html#activation-notification
text: active window; url: document-sequences.html#nav-window
text: alert; url: timers-and-user-prompts.html#dom-alert
text: autofill; url: form-control-infrastructure.html#autofill
text: autofill detail tokens; url: form-control-infrastructure.html#autofill-detail-tokens
text: close; url: document-sequences.html#close-a-top-level-traversable
text: disabled; url: form-control-infrastructure.html#concept-fe-disabled
text: File Upload state; url: input.html#file-upload-state-(type=file)
text: form-associated element; url: forms.html#form-associated-element
text: confirm; url: timers-and-user-prompts.html#dom-confirm
text: context mode; url: /canvas.html#offscreencanvas-context-mode
text: create a classic script; url: webappapis.html#creating-a-classic-script
Expand Down Expand Up @@ -299,6 +303,9 @@ spec: RFC9110; urlPrefix: https://httpwg.org/specs/rfc9110.html
type: dfn
text: field-name token; url: #fields.names
text: method token; url: #method.overview
spec:infra; urlPrefix: https://infra.spec.whatwg.org/
type:dfn;
text:user agent
</pre>

<pre class="biblio">
Expand Down Expand Up @@ -436,7 +443,8 @@ CommandData = (
ScriptCommand //
SessionCommand //
StorageCommand //
WebExtensionCommand
WebExtensionCommand //
AutofillCommand
)

EmptyParams = {
Expand Down Expand Up @@ -662,6 +670,7 @@ with the following additional codes:
<pre class="cddl local-cddl">
ErrorCode = "invalid argument" /
"invalid selector" /
"invalid element state" /
"invalid session id" /
"invalid web extension" /
"move target out of bounds" /
Expand Down Expand Up @@ -11984,6 +11993,118 @@ The [=remote end steps=] given |session| and |command parameters| are:

</div>

## The autofill Module ## {#module-autofill}

The <dfn export for=modules>autofill module</dfn> contains functionality for triggering autofill.

### Definition ### {#module-autofill-definition}

[=remote end definition=]

<pre class="cddl remote-cddl">

AutofillCommand = (
autofill.trigger //
autofill.setAddress
)
</pre>

### Commands ### {#module-autofill-commands}

#### The autofill.trigger Command #### {#command-autofill-trigger}

The <dfn export for=commands>autofill.trigger</dfn> command triggers autofill
on a particular form field using the provided fields.

<dl>
<dt>Command Type</dt>
<dd>
<pre class="cddl remote-cddl">
autofill.trigger = (
method: "autofill.trigger",
params: autofill.TriggerParameters
)

autofill.TriggerParameters = {
context: browsingContext.BrowsingContext,
element: script.SharedReference,
field: autofill.Field
}

autofill.Field = {
name: autofill.FieldName,
value: text
}

autofill.setAddress = (
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe each command should have its own section

method: "autofill.setAddress",
Copy link
Contributor

@sadym-chromium sadym-chromium Apr 8, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm a bit confused by this API:

  1. autofill.trigger has a single param element with field {name, value}. Does it mean it triggers the autofill only on a single field? What about multi-field addresses?
  2. What is the point of autofill.setAddress, if the only way to trigger that autofill is autofill.trigger, which provides values?

params: autofill.AddressParameters
)

autofill.AddressParameters = {
context: browsingContext.BrowsingContext,
fields: [* autofill.Field]
}
</pre>
</dd>
<dt>Return Type</dt>
<dd>
<pre class="cddl">
EmptyResult
</pre>
</dd>
</dl>

<div algorithm="remote end steps for autofill.trigger">

The [=remote end steps=] with |session| and |command parameters| are:

1. Let |navigable id| be the value of the <code>navigable</code> field of
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
1. Let |navigable id| be the value of the <code>navigable</code> field of
1. Let |navigable id| be the value of the <code>context</code> field of

|command parameters|.

1. Let |navigable| be the result of [=trying=] to [=get a navigable=]
with |navigable id|.

1. Let |document| be |navigable|'s [=active document=].

1. Let |environment settings| be the [=environment settings object=] whose
[=relevant global object=]'s <a>associated <code>Document</code></a> is
|document|.

1. Let |realm| be |environment settings|' [=realm execution context=]'s
Realm component.

1. Let |element id| be the value of the <code>element</code> field of
|command parameters|.

1. Let |element| be the result of [=trying=] to [=deserialize remote reference=]
with the |element id|, |realm|, and |session|.

1. Let |field| be the value of the <code>field</code> field of |command
parameters|.

1. If |element| is not a [=form-associated element=] or |element|'s [=form owner=] is
null, return an [=error=] with [=error code=] [=invalid element state=].

1. If user agent cannot autofill |field|, return an [=error=] with
[=error code=] [=unsupported operation=].

1. The user agent should [=autofill=] |element| and |element|'s [=form
owner=], while taking into account the contents of |field|.

1. Return [=success=] with data null.
Comment on lines +12089 to +12095
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
1. If user agent cannot autofill |field|, return an [=error=] with
[=error code=] [=unsupported operation=].
1. The user agent should [=autofill=] |element| and |element|'s [=form
owner=], while taking into account the contents of |field|.
1. Return [=success=] with data null.
1. Run implementation-specific steps to [=autofill=] |element| and |element|'s [=form owner=], while taking into account the contents of |field|. If this is not possible return [=error=] with error code [=unsupported operation=].
1. Return [=success=] with data null.


</div>

#### The autofill.FieldName Type #### {#type-autofill-FieldName}

<pre class="cddl remote-cddl local-cddl">
autofill.FieldName = text;
</pre>

The <code>autofill.FieldName</code> is a token. Valid token values are defined in
[=autofill detail tokens=].

### Events ### {#module-input-events}

#### The input.fileDialogOpened Event #### {#event-input-fileDialogOpened}
Expand Down