Skip to content

fix(формы): подсказки браузера в полях с маской и в окне Предприятия - #1871

Open
AnnaSIceberg wants to merge 3 commits into
ivanarama:mainfrom
AnnaSIceberg:fix/masked-input-autofill
Open

AnnaSIceberg wants to merge 3 commits into
ivanarama:mainfrom
AnnaSIceberg:fix/masked-input-autofill

Conversation

@AnnaSIceberg

@AnnaSIceberg AnnaSIceberg commented Oct 3, 2026 •

Copy link
Copy Markdown

Режим работы

  • Эксперимент: PR остаётся Draft, гипотеза или контракт ещё меняются
  • Поставка: результат проверен, текущий HEAD готов к конвейеру

Ветка от upstream main 5aa723cf. Заявки нет: находка из эксплуатации CC2, исправление небольшое, поэтому сразу Draft PR (CONTRIBUTING).

Что было

Оператор вводит телефон в поле с маской (000)000-00-00 и видит выпадающий список телефонов из прошлых звонков: «+7 999 999-99-99», «8888888888» и т. д., с пунктами «Настроить / Закрыть». Это автозаполнение Яндекс Браузера из его профиля. Платформа ставит полям autocomplete="off" (#595), но Яндекс для телефонов на него не смотрит.

У окна Предприятия в лаунчере (WebView2) своё автозаполнение форм (IsGeneralAutofillEnabled, по умолчанию TRUE). Оно так же запоминает введённое в окне и подсказывает это потом.

Что стало

  • Поле с input_mask получает autocomplete="one-time-code", остальные текстовые поля — прежний off. Это и поле объекта, и реквизит формы: оба места шаблона managed-element; значение выбирает функция шаблона inputAutocomplete.
  • Окно WebView2 (third_party/webview_go, метод embed): через ICoreWebView2Settings4 выключено IsGeneralAutofillEnabled (по умолчанию TRUE); IsPasswordAutosaveEnabled (по умолчанию FALSE) ставится в FALSE явно. Если интерфейса нет (старый runtime), окно открывается как раньше. Патч помечен onebase patch и описан в README vendored-копии.

Почему one-time-code

Варианты проверены вручную в Яндекс Браузере на тестовой странице: поля с подписью «Мобильный», плейсхолдером маски и inputmode="numeric".

Вариант Подсказки
autocomplete="off" (как сейчас) есть
one-time-code нет
nope (нестандартное значение) нет
new-password нет
off + readonly до фокуса есть
off без inputmode есть
off + aria-autocomplete="none" есть
  • new-password зовёт менеджер паролей;
  • nope держится на том, что браузер не узнаёт значение, и может перестать работать.

one-time-code — стандартный токен HTML для поля кода подтверждения: браузер может подставить в него пришедший одноразовый код (так делает Safari), но сохранённые телефоны в Яндекс Браузере на таком поле больше не подсказываются — это проверено вручную. Это обход для телефонов в Яндексе, а не гарантия отсутствия любых подсказок во всех браузерах; GET-тест проверяет выдаваемый атрибут, а не поведение браузеров.

Подсказки гасятся только у полей с маской: на них пришла жалоба, и там их точно не бывает к месту. Остальные поля не трогал, у них прежний off.

Ответ на ревью (круг 1)

Коммит 3a669103, только тексты, код не менялся:

  1. third_party/webview_go/README.md и комментарий патча в webview.h: умолчания названы раздельно (IsGeneralAutofillEnabled = TRUE, IsPasswordAutosaveEnabled = FALSE), патч явно ставит оба в FALSE.
  2. internal/ui/templates.go (inputAutocomplete) и internal/ui/masked_input_autocomplete_test.go: реальная семантика one-time-code (код подтверждения, Safari его подсказывает) и ограничение проверенным эффектом — подсказки телефонов в Яндекс Браузере; тест проверяет атрибут.

Хвост ревью (три TestRunServiceInstallPrint* на macOS) — вне diff, не трогал.

Проверки

  • internal/ui/masked_input_autocomplete_test.go. Форма отдаётся обычным GET (formEdit). Проверяется, что поле объекта с маской и реквизит формы с маской получают one-time-code, а реквизит без маски — off.
  • Мутационная проверка. Если вернуть off для полей с маской, тест краснеет.
  • UI: браузерный autofill в поле «Наименование» мешает значения всех справочников #595. TestObjectForm_StringInputSuppressesAutofill зелёный.
  • WebView2. go build -tags webview -ldflags="-H windowsgui" ./cmd/onebase (mingw64) собирается. Работу настройки в живом окне глазами не проверял: свежий профиль WebView2 пуст, и подсказкам неоткуда взяться.
  • Локальный прогон. go test ./internal/ui/ и go vet ./internal/ui/ — зелёные; gofmt — чисто.

🤖 Generated with Claude Code

Поле с input_mask получает autocomplete="one-time-code": Яндекс Браузер
на "off" (ivanarama#595) не смотрит и подсказывает сохранённые телефоны. В окне
WebView2 выключены автозаполнение форм и сохранение паролей.

Generated-with: Claude Code
@AnnaSIceberg
AnnaSIceberg marked this pull request as ready for review October 3, 2026 16:04
@ivanarama

Copy link
Copy Markdown
Owner

Ревью. (круг 1)
Reviewed-SHA: f526617
Outcome-Label: changes-requested
Что меняется: PR #1871, HEAD f526617: текстовые поля управляемых форм с input_mask получают autocomplete=one-time-code в обеих ветках managed-element, поля без маски сохраняют off; Windows WebView2 отключает общее автозаполнение и сохранение новых паролей через необязательный ICoreWebView2Settings4.
Проверено: Полностью прочитаны diff пяти файлов и контекст рендеринга managed-element, GET formEdit, шаблонной FuncMap, Windows embed и vendored WebView2 SDK; аудит выполнен в detached worktree точного HEAD, base 5aa723c; IID Settings4 совпадает с SDK, полученный интерфейс освобождается, отсутствие интерфейса не препятствует открытию окна; git diff --check base...HEAD и gofmt -l трёх изменённых Go-файлов: чисто; исходники worktree после проверок не изменены; go build ./...: успешно на darwin/amd64, Go 1.26.6; go test -count=1 ./internal/ui ./internal/launcher ./internal/app ./internal/cli ./internal/api: UI, launcher, app и API прошли; CLI имеет только три падения TestRunServiceInstallPrintCarriesExplicitHost, TestRunServiceInstallPrintDefaultsToLoopback и TestRunServiceInstallPrintInheritsRegistryHost, отдельно классифицированные контрольным прогоном на base; go vet ./internal/ui ./internal/launcher ./internal/app ./internal/cli ./internal/api: успешно; go run ./cmd/onebase check --project examples/trade: OK, ошибок не найдено; TestManagedInputMaskBehavior отдельно выполнен с Node.js v22.21.0 в PATH: PASS; основной прогон UI также включает новый GET-тест TestManagedForm_MaskedInputSuppressesBrowserAutofill и регрессионный TestObjectForm_StringInputSuppressesAutofill; Мутационный прогон нового GET-теста с go -overlay и templates_managed.go из base: ожидаемый FAIL, оба поля с маской возвращают off вместо one-time-code; реальный worktree HEAD при этом не менялся; Повторный go test -count=1 -run '^TestRunServiceInstallPrint(CarriesExplicitHost|DefaultsToLoopback|InheritsRegistryHost)$' -v ./internal/cli на HEAD и неизменённом base воспроизводит те же три ошибки: автоустановка сервиса не поддерживается на darwin; service.go и service_test.go не входят в diff; это существующая проблема тестов на macOS, не регрессия PR; Все восемь обязательных CI exact HEAD подтверждены через commits/f52661737cdb98c0c8227770e6e7babae82e488d/check-runs и Actions run 37134514936: build, lint, postgres-integration, vuln, smoke, e2e, test-windows и launcher-webview-build имеют SUCCESS; Windows GUI build и tagged launcher tests выполнены в CI; живое окно WebView2 и профиль Яндекс Браузера локально не проверялись; Семантика настройки WebView2 сверена с Microsoft ICoreWebView2Settings4, а autocomplete=one-time-code — с HTML Standard и документацией WebKit; полный go test ./... не запускался, круг затронутых пакетов и потребителей определён.
Блокирующее: 1) [P2] third_party/webview_go/README.md:19–20: исправить утверждение «По умолчанию они включены» для обеих настроек. У IsGeneralAutofillEnabled значение по умолчанию TRUE, а у IsPasswordAutosaveEnabled — FALSE. Новый README описывает исходное поведение SDK неверно; следует раздельно назвать значения по умолчанию и сказать, что патч явно устанавливает оба свойства в FALSE. Источник: Microsoft ICoreWebView2Settings4; 2) [P2] internal/ui/templates.go:4194–4195 и internal/ui/masked_input_autocomplete_test.go:15: исправить общее утверждение, что one-time-code браузеры не подсказывают. Этот токен обозначает поле кода подтверждения и разрешает соответствующее автозаполнение; Safari/WebKit использует его именно для предложения одноразовых кодов. Это проверенный автором обход подсказок сохранённых телефонных номеров в Яндекс Браузере, а не гарантия отключения всех браузерных подсказок. Нужно ограничить комментарии подтверждённым эффектом для телефонов в Яндексе и указать реальную семантику токена; GET-тест проверяет выдаваемый атрибут, а не поведение всех браузеров. Источники: HTML Standard и WebKit: One time codes.
Хвост:

  1. [заявка] Существующая проблема вне diff: три TestRunServiceInstallPrint* в internal/cli/service_test.go падают на macOS даже с print=true, поскольку runServiceInstall в internal/cli/service.go выбирает реализацию только для linux/windows и на darwin возвращает ошибку до печати. Воспроизведено одинаковым точечным go test -count=1 -run '^TestRunServiceInstallPrint(CarriesExplicitHost|DefaultsToLoopback|InheritsRegistryHost)$' -v ./internal/cli на HEAD f526617 и base 5aa723c в одной среде darwin/amd64. Следует согласовать тесты с поддерживаемыми платформами либо определить поведение --print на darwin; PR fix(формы): подсказки браузера в полях с маской и в окне Предприятия #1871 это не блокирует → заголовок: «Три теста CLI service --print падают на macOS из-за неподдерживаемого darwin»
    Вердикт: есть замечания.

@ivanarama

Copy link
Copy Markdown
Owner

PromptPilot service marker: REVIEW result publication claimed.

@ivanarama ivanarama added the changes-requested Ревью: есть замечания — фиксер дорабатывает label Oct 3, 2026
@ivanarama

Copy link
Copy Markdown
Owner

PromptPilot service marker: REVIEW result committed.

Ревью ivanarama#1871 (круг 1): IsPasswordAutosaveEnabled по умолчанию FALSE, а
не TRUE — README и комментарий патча называют умолчания раздельно, патч
ставит оба в FALSE явно. one-time-code по стандарту — поле кода
подтверждения (Safari подставляет в него коды); комментарии говорят о
проверенном эффекте — подсказки телефонов в Яндекс Браузере пропадают, а
тест проверяет атрибут, не поведение браузеров. Код не менялся.

Generated-with: Claude Code
@AnnaSIceberg

Copy link
Copy Markdown
Author

Замечания ревью (круг 1) исправлены: HEAD 3a66910341aa8caa93d6f2f9cf0e7192901c9e13.

  1. third_party/webview_go/README.md и комментарий патча в webview.h: умолчания названы раздельно (IsGeneralAutofillEnabled = TRUE, IsPasswordAutosaveEnabled = FALSE), патч явно ставит оба в FALSE.
  2. internal/ui/templates.go (inputAutocomplete) и internal/ui/masked_input_autocomplete_test.go: one-time-code описан по стандарту (поле кода подтверждения, Safari подставляет в него коды); утверждение ограничено проверенным эффектом — подсказки телефонов в Яндекс Браузере; тест проверяет выдаваемый атрибут, а не поведение браузеров.

Только тексты, код не менялся. Описание PR поправлено так же. CI на этом SHA зелёный целиком: https://github.com/ivanarama/onebase/actions/runs/37332110391

Прошу повторное ревью нового HEAD.

@ivanarama ivanarama removed the changes-requested Ревью: есть замечания — фиксер дорабатывает label Oct 8, 2026
@ivanarama

Copy link
Copy Markdown
Owner

HEAD изменился после ревью: завершённое заключение относится к f52661737cdb98c0c8227770e6e7babae82e488d, текущий HEAD — 1e4bd48defda10284652564200be0485faf97146. Метка changes-requested снята и её отсутствие проверено; PR возвращён в REVIEW для нового заключения текущего SHA.

@ivanarama

Copy link
Copy Markdown
Owner

Ревью. (круг 2)
Reviewed-SHA: 1e4bd48
Outcome-Label: reviewed
Что меняется: PR #1871, HEAD 1e4bd48: текстовые поля управляемых форм с input_mask получают autocomplete="one-time-code" в обеих ветках managed-element, поля без маски сохраняют off; Windows WebView2 отключает общее автозаполнение и сохранение новых паролей через необязательный ICoreWebView2Settings4; оба блокирующих замечания первого ревью исправлены.
Проверено: Аудит выполнен в detached worktree точного HEAD 1e4bd48 относительно base 66a9a10; прочитан полный diff пяти файлов и контекст FuncMap, managed-element, публичного GET formEdit, тестовых фикстур и Windows embed; IID ICoreWebView2Settings4 совпадает с vendored WebView2.h; настройки применяются до навигации, полученный интерфейс освобождается, отсутствие интерфейса сохраняет путь открытия окна; Исправленные умолчания IsGeneralAutofillEnabled=TRUE и IsPasswordAutosaveEnabled=FALSE сверены с Microsoft ICoreWebView2Settings4; README описывает отключение общего автозаполнения и сохранения паролей, не отключение уже сохранённых паролей; Семантика one-time-code как поля одноразового кода и возможность его предложения Safari сверены с HTML Standard и WebKit; комментарии и описание PR ограничивают подтверждённый автором эффект телефонными подсказками Яндекс Браузера и отделяют его от проверки HTML-атрибута; git diff --check base...HEAD и gofmt -l трёх изменённых Go-файлов: чисто; git status worktree после проверок пуст; go build ./...: успешно на darwin/amd64, Go 1.26.6; go test -count=1 ./internal/ui ./internal/launcher ./internal/app ./internal/cli ./internal/api: UI, launcher, app и API прошли; в CLI ровно три падения TestRunServiceInstallPrint*, классифицированные контрольным прогоном на base; go vet ./internal/ui ./internal/launcher ./internal/app ./internal/cli ./internal/api: успешно; go run ./cmd/onebase check --project examples/trade: OK, ошибок не найдено; Точечный GET-прогон TestManagedForm_MaskedInputSuppressesBrowserAutofill и TestObjectForm_StringInputSuppressesAutofill: PASS; первое покрывает поля объекта и реквизиты формы с маской и реквизит без маски, второе сохраняет off у обычного поля объекта; В первом UI-прогоне Node-тесты были пропущены из-за PATH; связанный с diff TestManagedInputMaskBehavior отдельно выполнен с Node.js v22.21.0 в PATH: PASS без SKIP; Мутационная проверка нового GET-теста с go -overlay и templates_managed.go из base: ожидаемый FAIL, оба поля с маской отдают off вместо one-time-code; реальные исходники worktree не менялись; Повторный go test -count=1 -run '^TestRunServiceInstallPrint(CarriesExplicitHost|DefaultsToLoopback|InheritsRegistryHost)$' -v ./internal/cli на HEAD и неизменённом base воспроизводит одинаковые три ошибки неподдерживаемого darwin; service.go и service_test.go отсутствуют в diff, это существующая проблема вне PR; Все восемь обязательных CI точного HEAD повторно подтверждены через commits/1e4bd48defda10284652564200be0485faf97146/check-runs: build, lint, postgres-integration, vuln, smoke, e2e, test-windows, launcher-webview-build имеют SUCCESS; CI run 37584987098; Windows GUI build с -tags webview и tagged-тесты internal/launcher подтверждены зелёным launcher-webview-build и его workflow; локальный Windows runtime недоступен, живое окно WebView2 и профиль Яндекс Браузера в этом аудите не проверялись; Полный go test ./... не запускался: затронутые пакеты и потребители определены, обязательный CI точного HEAD успешен.
Блокирующее: нет.
Хвост:

  1. [заявка] Существующая проблема вне diff: три TestRunServiceInstallPrint* в internal/cli/service_test.go падают на macOS даже с print=true, поскольку runServiceInstall в internal/cli/service.go выбирает реализацию только для linux/windows и на darwin возвращает ошибку до печати. Воспроизведено одинаковым точечным go test -count=1 -run '^TestRunServiceInstallPrint(CarriesExplicitHost|DefaultsToLoopback|InheritsRegistryHost)$' -v ./internal/cli на HEAD 1e4bd48 и неизменённом base 66a9a10 в одной среде darwin/amd64. Следует согласовать тесты с поддерживаемыми платформами либо определить поведение --print на darwin; PR fix(формы): подсказки браузера в полях с маской и в окне Предприятия #1871 это не блокирует → заголовок: «Три теста CLI service --print падают на macOS из-за неподдерживаемого darwin»
    Вердикт: годится к мержу.

@ivanarama

Copy link
Copy Markdown
Owner

PromptPilot service marker: REVIEW result publication claimed.

@ivanarama ivanarama added the reviewed Ревью: блокирующего нет — ждёт ship label Oct 8, 2026
@ivanarama

Copy link
Copy Markdown
Owner

PromptPilot service marker: REVIEW result committed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

reviewed Ревью: блокирующего нет — ждёт ship

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants