Менеджер паролей для браузера. Сохраняет и подставляет учётные данные на формах входа.
Три слоя без смешения ответственности:
┌─────────────────────────────────────────────────────────────────┐
│ Content script │
│ • Анализ DOM (через heuristics) │
│ • Вставка значений в поля │
│ • Перехват submit формы │
│ • Нет криптографии, нет storage │
└─────────────────────────────────────────────────────────────────┘
│
│ messages
▼
┌─────────────────────────────────────────────────────────────────┐
│ Background / Service worker │
│ • Хранение зашифрованных данных │
│ • Общение с backend │
│ • AES-GCM шифрование/расшифровка │
│ • Нет логики форм, нет DOM │
└─────────────────────────────────────────────────────────────────┘
│
│ HTTPS
▼
┌─────────────────────────────────────────────────────────────────┐
│ Heuristics layer (чистые функции) │
│ • findPasswordInputs(), findUsernameForPassword() │
│ • isVisibleInput(), countPasswordInputs() │
│ • Без browser.*, без chrome.*, без API расширения │
└─────────────────────────────────────────────────────────────────┘
При загрузке и при изменениях DOM (MutationObserver):
- Найти все
input[type="password"] - Отфильтровать: visible, не disabled, не readonly
- Для каждого — найти связанный username field
- Приоритет поиска username (детерминистично):
autocomplete="username"type="email"name/idсодержит: user, email, login
- 1 поле password → логин, сохраняем при submit
- 2+ поля password → регистрация/reset, не сохраняем (v1)
- Listener на
submitформы - Перед submit (асинхронно): взять username, password, отправить message в background
- Не блокировать submit — fire-and-forget
- При обнаружении пары password + username →
location.origin→ message в background - Если есть креды:
input.value = ...+dispatchEvent("input")+dispatchEvent("change") - Без событий React/Vue не увидят изменение
bun install
npx webpackИли через скрипт:
bun run build- ~80% сайтов (детерминистичная эвристика, без ML)
- Регистрация/сброс пароля — не сохраняем
- Без UI иконки у полей (опционально позже)