Files
obsidian-vault/work/notes/webkit-macos-version-mapping.md
T

292 lines
12 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: WebKit release ↔ macOS build mapping
tags: [webkit, safari, macos, crash, ravel, reference]
created: 2026-10-06
updated: 2026-10-06
sources:
- ~/Downloads/WebKit_sparse
- https://ravel.dbg.re
- https://github.com/mdn/browser-compat-data/blob/main/browsers/safari.json
---
# WebKit release ↔ macOS build mapping
## Коротко
DuckDuckGo поддерживает macOS **12.3+** (`main/macOS/Configuration/Common.xcconfig`).
Точное соответствие строится для **конкретного macOS build**, а не только для major/minor:
```text
macOS version + build
→ UUID WebKit из crash log
→ тот же UUID в Ravel
→ CFBundleVersion системного WebKit
→ убрать macOS SYSTEM_VERSION_PREFIX
→ FULL_VERSION WebKit
→ найти WebKit source tag/branch
→ проверить нужный commit или изменение кода
```
Если точный source tag ещё не опубликован, соответствие заканчивается на версии бинарника. Наличие конкретного source fix тогда нельзя доказать одним номером версии.
## Не путать версии
| Значение | Пример | Назначение |
|---|---:|---|
| macOS version | `27.0.1` | Marketing version |
| macOS build | `26A434` | Точная сборка ОС; ключ для Ravel |
| Mach-O UUID | `70BEE322-…` | Точная идентичность бинарника WebKit |
| WebKit `CFBundleVersion` | `22625.1.29.11.28` | Версия системного framework |
| `SYSTEM_VERSION_PREFIX` | `22` | Префикс, зависящий от macOS major |
| WebKit `FULL_VERSION` | `625.1.29.11.28` | Версия release train без системного префикса |
| WebKit source tag | `WebKit-7625.1.29.11.28` | Ожидаемое имя тега исходников |
| HTTP User-Agent | `AppleWebKit/605.1.15` | Заморожен; для маппинга непригоден |
## Базовые release-линейки macOS 12+
Это соответствие **GA macOS major → Safari major → базовая WebKit-линейка**. Оно не заменяет проверку конкретного macOS build: Safari/WebKit обновляется внутри одного macOS major.
| macOS | Минимум DDG | Prefix | Safari GA | WebKit base | Production bundle base | Expected source-tag family |
|---|---:|---:|---:|---:|---:|---|
| 12 Monterey | 12.3 | `17` | 15 | `612.1.27` | `17612.1.27` | `WebKit-7612.1.27.*` |
| 13 Ventura | да | `18` | 16 | `614.1.25` | `18614.1.25` | `WebKit-7614.1.25.*` |
| 14 Sonoma | да | `19` | 17 | `616.1.27` | `19616.1.27` | `WebKit-7616.1.27.*` |
| 15 Sequoia | да | `20` | 18 | `619.1.26` | `20619.1.26` | `WebKit-7619.1.26.*` |
| 26 Tahoe | да | `21` | 26 | `622.1.22` | `21622.1.22` | `WebKit-7622.1.22.*` |
| 27 Golden Gate | да | `22` | 27 | `625.1.29` | `22625.1.29` | `WebKit-7625.1.29.*` |
| 27.2 beta | да | `22` | 27.2 | `625.2.4` | `22625.2.4` | ожидается `WebKit-7625.2.4.*` |
Источники базовых версий: MDN `browsers/safari.json` и Apple Safari release notes. Prefix 12–14 подтверждается `Configurations/Version.xcconfig` в `WebKit-7616.1.27`; prefix 15–30 — текущим `Configurations/Version.xcconfig`.
## Точные сборки, проверенные через Ravel
Ravel сейчас индексирует не все исторические macOS. Отсутствие записи означает пробел покрытия Ravel, а не отсутствие WebKit в macOS.
| macOS | Build | WebKit UUID | CFBundleVersion | FULL_VERSION |
|---|---|---|---:|---:|
| 26.5.2 | `25F84` | `49B21D99-8716-31B8-8686-71B287325F1D` | `21624.2.5.11.8` | `624.2.5.11.8` |
| 26.6 | `25G72` | `B090AABF-9A3B-3110-9DA9-F0F40FCEC972` | `21624.4.5.11.5` | `624.4.5.11.5` |
| 26.6.1 | `25G76` | `B090AABF-9A3B-3110-9DA9-F0F40FCEC972` | `21624.4.5.11.5` | `624.4.5.11.5` |
| 26.6.2 | `25G83` | `844AF253-CAF6-3623-9DAD-A055C5274E62` | `21624.5.1.11.3` | `624.5.1.11.3` |
| 27.0.1 | `26A434` | `70BEE322-37EE-3B22-8012-4F76BA105C29` | `22625.1.29.11.28` | `625.1.29.11.28` |
| 27.2 beta | `26B5086k` | `6F6AB57E-1492-3950-9962-85B6AFD430A3` | `22625.2.4.1` | `625.2.4.1` |
| 27.2 beta 2 | `26B5091g` | `56B4AA44-CB66-3641-8B22-723C39B5BC6E` | `22625.2.5.11.1` | `625.2.5.11.1` |
| 27.2 beta 3 | `26B5101f` | `B32D7081-AE42-3A2E-ACBB-CF4D4BE4F296` | `22625.2.7.1` | `625.2.7.1` |
Пример показывает, почему нужен UUID: macOS 26.6 и 26.6.1 используют один и тот же WebKit binary — совпадают и UUID, и `CFBundleVersion`.
## Полная методика
### 1. Извлечь macOS build и UUID из crash log
```bash
rg 'OS Version:|WebKit \(arm64e\)' <file.crash>
```
Нужны:
```text
OS Version: macOS 27.0.1 (26A434)
WebKit (arm64e) <70BEE322-37EE-3B22-8012-4F76BA105C29>
```
UUID сравнивать без учёта регистра и дефисов. Для Intel и Apple Silicon UUID могут различаться; архитектура должна совпадать.
### 2. Найти тот же бинарник в Ravel
Искать путь:
```text
/System/Library/Frameworks/WebKit.framework/Versions/A/WebKit
```
URL-шаблон:
```text
https://ravel.dbg.re/binary?build=<MACOS_BUILD>&domain=dyld_cache&path=%2FSystem%2FLibrary%2FFrameworks%2FWebKit.framework%2FVersions%2FA%2FWebKit
```
Проверить в `Binary metadata and fingerprint`:
1. macOS build;
2. архитектуру;
3. UUID — должен совпасть с crash log.
В `Quick search` искать начало bundle version: `17`, `18`, `19`, `20`, `21` или `22`. В restricted strings находится полный номер вроде `22625.1.29.11.28`.
### 3. Получить версию непосредственно на Mac
```bash
sw_vers
defaults read /System/Library/Frameworks/WebKit.framework/Resources/Info CFBundleVersion
```
Из приложения:
```swift
let webKitBundleVersion = Bundle(for: WKWebView.self)
.object(forInfoDictionaryKey: "CFBundleVersion") as? String
```
Это проверено на macOS 26.7.1: возвращается `21624.5.1.11.3`.
### 4. Убрать системный prefix
Production WebKit собирает номер так:
```text
CFBundleVersion = SYSTEM_VERSION_PREFIX + FULL_VERSION
```
| macOS | Prefix |
|---|---:|
| 12 | `17` |
| 13 | `18` |
| 14 | `19` |
| 15 | `20` |
| 16 / 26 | `21` |
| 27 | `22` |
| 28 | `23` |
| 29 | `24` |
| 30 | `25` |
Пример:
```text
22625.1.29.11.28 - prefix 22 = 625.1.29.11.28
```
### 5. Построить имя source tag
Современные Apple release tags обычно называются:
```text
WebKit-7<FULL_VERSION>
```
Пример:
```text
FULL_VERSION: 625.1.29.11.28
candidate tag: WebKit-7625.1.29.11.28
```
Проверить точный тег:
```bash
git ls-remote --tags origin \
'WebKit-7625.1.29.11.28' \
'WebKit-7625.1.29.11.28^{}'
```
Если точного тега нет, найти опубликованную семью:
```bash
git ls-remote --tags origin 'WebKit-7625.1.29*'
git ls-remote --heads origin 'safari-7625*'
```
Отсутствующий exact tag нельзя заменять ближайшим и считать точным соответствием. Ближайший тег даёт только нижнюю или верхнюю границу.
### 6. Проверить наличие fix в source release
Надёжнее проверять изменённый код, а не только ancestry: Apple может cherry-pick fix с другим commit SHA.
Для текущего бага:
```bash
git show <TAG>:Source/WebKit/UIProcess/WebFrameProxy.h \
| rg 'commitCertificateInfo'
```
Старая версия:
```cpp
void commitCertificateInfo(const URL&);
```
Исправленная версия (`318982@main`):
```cpp
void commitCertificateInfo(const URL&, bool hasCertificateInfo);
```
Дополнительно искать bug id и commit message:
```bash
git log <TAG> --grep='321456'
git log <TAG> --grep='Send bool indicating presence of CertificateInfo'
```
### 7. Если exact source tag отсутствует
Остаются три уровня доказательства:
1. точный UUID + `CFBundleVersion` — доказана версия бинарника;
2. символ crash stack или disassembly — можно доказать конкретную сигнатуру/поведение бинарника;
3. воспроизведение теста на нужном macOS build — можно доказать наличие или отсутствие бага.
Версия STP не доказывает версию системного WebKit: Safari Technology Preview — отдельная сборка.
## Текущий баг: результат сопоставления
### macOS 27.0.1
```text
macOS: 27.0.1 (26A434)
Crash UUID: 70BEE322-37EE-3B22-8012-4F76BA105C29
Ravel UUID: 70BEE322-37EE-3B22-8012-4F76BA105C29
CFBundleVersion: 22625.1.29.11.28
Prefix: 22
FULL_VERSION: 625.1.29.11.28
Expected tag: WebKit-7625.1.29.11.28
```
Exact tag `.11.28` публично не найден; опубликована `.11.27`. Базовая ветка `WebKit-7625.1.29` содержит старую одноаргументную сигнатуру. Crash stack также показывает:
```text
WebKit::WebFrameProxy::commitCertificateInfo(WTF::URL const&)
```
Вывод: **в macOS 27.0.1 fix отсутствует**.
### macOS 27.2 beta
Ravel подтверждает бинарные версии `625.2.4.1`, `625.2.5.11.1` и `625.2.7.1` для beta 1–3. Публичных `WebKit-7625.2.*` tags/branches пока нет.
Fix `318982@main` вошёл в STP 251, но это не доказывает его inclusion в системный WebKit macOS 27.2.
Вывод: **macOS 27.2 — сильный кандидат на первую исправленную версию, но source inclusion пока не доказан**.
## Телеметрия DuckDuckGo
Текущие pixels не отправляют точный `CFBundleVersion` WebKit. HTTP UA использовать нельзя: WebKit намеренно возвращает замороженный `AppleWebKit/605.1.15`.
Для корреляции crash/pixel с таблицей выше нужен параметр:
```text
webkit_build=22625.1.29.11.28
```
Получать его через `Bundle(for: WKWebView.self).CFBundleVersion`, а не через `WebKitVersionProvider`, который парсит замороженный UA.
## Источники
- `~/Downloads/WebKit_sparse/Configurations/Version.xcconfig`
- `~/Downloads/WebKit_sparse/Source/WebCore/platform/mac/UserAgentMac.mm`
- `main/macOS/Configuration/Common.xcconfig`
- [Ravel binary catalogue](https://ravel.dbg.re/browse)
- [MDN Safari → WebKit versions](https://github.com/mdn/browser-compat-data/blob/main/browsers/safari.json)
- [Safari release notes](https://developer.apple.com/documentation/safari-release-notes)
- [WebKit commit 318982@main](https://commits.webkit.org/318982@main)
- [Safari Technology Preview 251](https://webkit.org/blog/18194/release-notes-for-safari-technology-preview-251/)
## Ограничения
- Ravel находится в beta и имеет неполное покрытие.
- Один macOS major содержит много Safari/WebKit updates; базовая таблица не заменяет lookup конкретного build.
- Совпадение версии без UUID слабее, чем совпадение версии и UUID.
- Exact tag может быть опубликован позже бинарника Apple.
- Cherry-pick может иметь другой SHA; проверять итоговый код в release tag.