[2026-10-08] eagle: work/projects/cpm-web-extension-repro-and-fix-2026-10-08.md
This commit is contained in:
1 parent
9325369d37
commit
efb83eee04
1 file changed
+8
@@ -192,6 +192,14 @@ cd SharedPackages/WebExtensions && CPM_REPRO=1 swift test --filter CPMReproBackg
|
||||
- Блокировка устройства: у iOS-приложения нет entitlement'а `default-data-protection` → класс `CompleteUntilFirstUserAuthentication`; файлы доступны при блокировке после первой разблокировки. Исключение — запуск до первой разблокировки, для него есть `protectedDataLoadGate`.
|
||||
- Устаревший URL вкладки на iOS (`addressBarURLFilter` не обновляет URL при межоригинном переходе со страницы): в `didCommit` `url = webView.url` выставляется синхронно до `init` → для обычной навигации ответ приходит с верным URL.
|
||||
|
||||
**Медленный старт worker'а на пробуждении — сигнатура группы 1 воспроизведена (8 октября, эксперимент, не закоммичено).** Тест `CPMReproWakeExperimentTests` в обоих worktree: после idle-выгрузки в начало background-скрипта на диске добавляется busy-wait (только на этот wake), через 1 с скрипт восстанавливается.
|
||||
- busy 0,3 / 1 / 2,5 с и задержка `activate` 1–3 с: сообщения ставятся в очередь и доставляются, задержка ответа = время старта. Потерь нет.
|
||||
- busy 5 с: `initialization_failed_after_other` с `bg_process_responsive=true`, `context_errors=none`, хвост `dealloc/view/proxy_on@30s` — как в проде. Ответ приходит через ~1 с после сбоя → `recovered_without_extension_reload(initialization_failed)`.
|
||||
- busy 12 с + следующая навигация после сбоя: второй сбой → `messaging_stuck_other` с той же сигнатурой → M4. M4 убивает медленный, но живой worker: `init` уже открытых документов теряется, новые навигации работают (`recovered_after_extension_reload`).
|
||||
- С фиксами (worktree A) то же самое. Рестарт на первом сбое (`onEpisodeStarted`) не сработал: проба отзывчивости по 1 с истекла на занятом процессе. Если же медленный старт не загружает CPU (например, ждёт I/O), проба ответит, и рестарт убьёт worker, который ещё грузится. Это нужно закрыть.
|
||||
- Чем реально вызван старт дольше 4 с на устройствах, неизвестно. Кандидаты: конкуренция за CPU с загружаемой вкладкой, запуск процесса без prewarm на iOS, низкий приоритет процесса extension (RunningBoard), занятый Network-процесс. Мерить на iPhone: от wake до первого `recv init`.
|
||||
- Speculative fix: (1) будить background заранее — при старте навигации или при выходе приложения на передний план, без блокировки; (2) не эскалировать в M4 и не рестартовать, пока background view моложе ~15 с; (3) телеметрия: возраст background view в секундах на момент сбоя и задержка позднего ответа на recovery-пикселе; (4) опционально держать background живым, пока приложение на переднем плане (цена — память одного WebContent-процесса).
|
||||
|
||||
**Стабильный `baseURL` (ветка `alex/cpm-stable-base-url`, не закоммичено): оценка.**
|
||||
- Объясняет только подгруппу «после load/reload» (~¼ iOS, ~15% macOS группы 1) и, вероятно, первый сбой после M4. Основная часть (пробуждение после idle) не затронута: чистка идёт только в `load()`.
|
||||
- Изменение: `context.baseURL = webkit-extension://<uniqueIdentifier>/`, где `uniqueIdentifier` = `UUID()` на установку/обновление (`WebExtensionManager+EmbeddedExtensions.swift:157`).
|
||||
|
||||
Reference in new issue
Block a user