Flutter web autofill: before and after

The same demo app, built twice: once against the engine as it is today, once against the branch. Plus a plain HTML login form as a reference for how a password manager behaves when Flutter is not involved.

BeforeEngine at 78703736057, before this change AfterEngine with the change applied, at 5c1670ffc58 Plain HTMLNo Flutter at all. The reference.

What to try

  1. Open Before with a password manager installed and a saved login for this site. Invoke it from the email field, then reload and invoke it from the password field.
  2. Do exactly the same on After.
  3. Compare both against Plain HTML, which is how the manager behaves on an ordinary form.

The app shows each TextEditingController's value on screen, so you can see whether what the manager wrote actually reached the Flutter side, rather than only landing in the hidden DOM input. It also logs focus changes, which is where most of the trouble was.

What changes

On Before, a login form fills one field at a time at best: which half arrives depends on which field you invoked the manager from, and in several combinations nothing arrives at all. On After, Bitwarden, Proton Pass and Chrome's own manager each fill both fields from either field.

Clearing a field by hand also now reaches the proxy the manager reads, so a manager stops offering to save a password you have already deleted.

Deliberately out of scope: Google Password Manager's auto-submit on mobile. It is a separate behaviour with its own design questions and is left for a follow-up rather than folded in here.

Demo app source · pubspec.yaml · single file, no packages beyond Flutter.