[2026-10-08] eagle: work/projects/cpm-web-extension-repro-and-fix-2026-10-08.md
This commit is contained in:
1 parent
a304ee1c43
commit
2770874009
1 file changed
+31
@@ -156,6 +156,37 @@ cd SharedPackages/WebExtensions && CPM_REPRO=1 swift test --filter CPMReproBackg
|
||||
|
||||
Возможный фикс после данных: при возврате приложения на передний план, если `context.errors` содержит error 6, — перезапустить background; либо не будить background, пока приложение в фоне (изменение extension или WebKit).
|
||||
|
||||
### Группа 1 («здоровый» снимок без смены Network-процесса) — разбор 8 октября
|
||||
|
||||
**Данные (`events_daily.tsv`, `stuck`):** iOS 748, macOS 228.
|
||||
- Самый частый хвост `bg_events` — `dealloc → view → proxy_on`, последний `view` моложе 30 с до снимка: iOS 219 (+154 при 1m), macOS 120 из 228. Сбой совпадает с **пробуждением background после idle-выгрузки**.
|
||||
- Около четверти iOS (и ~15% macOS) — после загрузки контекста: хвосты `load → view` / `base_url_changed → view`, `reason=extension.reload` (iOS 71, macOS 39).
|
||||
- macOS: `app_version_change=updated` у 144 из 228 (63%; в среднем по stuck — 52%).
|
||||
- `context_errors=none` у 675/748 iOS; память (`critical_memory_age`) почти везде `none`.
|
||||
- **Ответ часто опаздывает, а не теряется:** `recovered_without_extension_reload` с `recovery_from=initialization_failed` — iOS 3 023, macOS 547 (count). Монитор шлёт его, когда после сбоя ответ всё же пришёл.
|
||||
- Версии ОС: на macOS «здоровые» сбои есть и на 26.7, и на 27.0 (92 и 178 init в срезе сравнения ОС). Версии iOS в выгрузке нет — нужен запрос в ClickHouse.
|
||||
|
||||
**WebKit-баги (bugs.webkit.org, компонент WebKit Extensions, изменения с мая 2026):**
|
||||
- **320812 / 312231@main — медленная чистка при загрузке контекста (главная находка).** Начиная с 26.6, `WebExtensionContext::load()` при смене `baseURL` переименовывает localStorage/IndexedDB и удаляет **все** website data предыдущего origin, включая DiskCache (обход всего сетевого кэша на главном потоке Network-процесса). **`m_safeToInjectContent`, `addInjectedContent()` и загрузка background ждут окончания этой чистки.** У DDG `baseURL` новый при каждом запуске и каждом M4 reload. Код есть и в 7624.5.1.11.3 (macOS 26.7.1), и в 7625.1.29 (27.0). Фикс 318756@main (7 авг) попал в ветку safari-7625 (`316606.407@safari-7625-branch`); в какую сборку ОС — не проверено.
|
||||
- **324743** (fixed 22 сен, нет в 26.7/27.0) — worker считается загруженным до завершения регистрации. Зона «пробуждение после idle»; наши тесты пробуждения на Mac проходят, детерминированного репро нет.
|
||||
- **322881** (fixed 31 авг) — worker теряет clients после выгрузки и перезагрузки; CPM clients не использует.
|
||||
- **314194** (открыт) — в **Lockdown Mode** блокируются все service worker'ы, включая background extension → CPM никогда не работает. Доля пользователей DDG с Lockdown Mode неизвестна; сигнатура в наших данных не определена.
|
||||
- **319976** (fixed) — `loadBackgroundContentWithCompletionHandler` вызывал completion дважды при ошибке; мы используем этот API в gate.
|
||||
|
||||
**Репро медленной чистки на Mac** (`CPMReproExtensionLoadCleanupTests.swift`, нужен локальный сервер `CPM_REPRO_CACHE_URL` с `/fill.html?n=N`): кэш тестового процесса наполнен ~24 тыс. записями (у реального DDG на этом Mac — 18,7 тыс., 877 МБ).
|
||||
|
||||
| | Пустой кэш | ~24 тыс. записей |
|
||||
|---|---:|---:|
|
||||
| Перезапуск: content script выполнился на мс документа | 23 | 770–1 350 |
|
||||
| Перезапуск: background создан через | 0,2 с | 0,9–1,5 с |
|
||||
| Reload (как M4): content script на мс документа | — | 780–790 |
|
||||
|
||||
На быстром Mac задержка меньше 4 с монитора, поэтому сбоя нет. На iPhone с большим кэшем и медленным CPU нужно мерить (на тестовом iPhone кэш маленький: «Context will load» → «Background web view created» за 30–70 мс).
|
||||
|
||||
**Проверено и отброшено:**
|
||||
- Блокировка устройства: у iOS-приложения нет entitlement'а `default-data-protection` → класс `CompleteUntilFirstUserAuthentication`; файлы доступны при блокировке после первой разблокировки. Исключение — запуск до первой разблокировки, для него есть `protectedDataLoadGate`.
|
||||
- Устаревший URL вкладки на iOS (`addressBarURLFilter` не обновляет URL при межоригинном переходе со страницы): в `didCommit` `url = webView.url` выставляется синхронно до `init` → для обычной навигации ответ приходит с верным URL.
|
||||
|
||||
### Привязка вкладок на macOS (`tab_controller_match=false` + нет scripts, ~100 строк)
|
||||
|
||||
- **Гипотеза атрибуции не подтвердилась.** Путь в коде есть: выключение флага `webExtensions` вызывает `uninstallAllExtensions()` и обнуляет менеджер, включение создаёт новый с новым controller, а `WKWebViewConfiguration` старых вкладок не меняется. Но флаг `.webExtensions` = `remoteReleasable(WebExtensionsSubfeature.featureEnabled)` с `defaultValue: .enabled`, а подфичи `featureEnabled` нет ни во встроенном, ни в текущем удалённом `macos-config.json` → флаг всегда `enabled` (отсутствующая подфича возвращает `defaultValue`). Мигать нечему.
|
||||
|
||||
Reference in new issue
Block a user