# chrome-json-extensions benchmark

`chrome-extension-json-formatter` 記事 (4 locale) の比較表に載せる実測値の再現スクリプト一式。CLAUDE.md「数値の根拠提示 / 捏造禁止」ルール準拠。記事本文の数値は本ディレクトリの `results.json` と完全一致させる。

## What it measures

測定対象は `extensions.json` に登録した 7 拡張 (2026-07-09 に Chrome ウェブストアで実在確認済み)。

| 列 | 取得方法 | スクリプト |
|---|---|---|
| Manifest V3 対応 | CRX 展開後の manifest.json の `manifest_version` | `fetch_extensions.mjs` (自動) |
| ホスト権限スコープ | manifest.json の `permissions` / `host_permissions` / `content_scripts[].matches` | `fetch_extensions.mjs` (自動) |
| 自動整形の上限 (1/10/50/100MB) | ローカル HTTP サーバから `Content-Type: application/json` で配信した JSON を拡張ロード済み Chromium で開き、整形完了セレクタの出現をハング検出付きで待つ | `measure.mjs` (自動) |
| インストールサイズ | Chrome ウェブストア掲載ページの「サイズ」表示値を手動転記 (取得日 + 出典 URL を results.json に記録)。CRX の実バイト数を突き合わせ用に自動計測 | 手動 + `fetch_extensions.mjs` |
| 最終更新日 | Chrome ウェブストア掲載ページ表示値を手動転記 (取得日 + 出典 URL を記録) | 手動 |
| オープンソースか | 公開リポジトリの実在確認 (URL + 確認日を記録) | 手動 |

## How to reproduce

```bash
cd scripts/benchmarks/chrome-json-extensions
npm install
node gen_samples.mjs        # テスト用 JSON 生成 (シード固定、byte-identical 再現)
node fetch_extensions.mjs   # CRX ダウンロード + manifest 抽出
node measure.mjs            # 自動整形ベンチ → results-raw.json
```

前提: FormatArc はローカル `chrome-extension/dist/` を読むため、事前に拡張のビルドが必要。

## Measurement protocol

- 判定は 4 値: `formatted` (整形完了セレクタ出現) / `skipped` (60 秒待ってもセレクタなしだがページは応答 = 拡張が整形を放棄) / `hang` (main thread ping 10 秒無応答) / `crash` (renderer クラッシュ)
- 拡張 × サイズごとに warmup 1 回 (MV3 service worker のコールドスタート除去) + 本試行 4 回
- 中央値 = 4 試行を昇順ソートした 2, 3 番目の平均。hang/crash/skipped は +Infinity 扱いで、中央値が Infinity のセルは非 formatted 判定
- サイズは昇順に実行し、非 formatted 判定が出たらそれ以上のサイズは `not_tested_after_hang` として打ち切り (打ち切りも results.json に明記)
- 1 拡張 = 1 個の使い捨て Playwright persistent context (プロファイル間干渉防止)
- 記事の「自動整形上限」列は outcome=formatted となった最大サイズを載せ、hang / skipped の区別は脚注で示す

## Caveats

- Playwright bundled Chromium (channel: chromium, headed) での測定。branded Chrome stable はバージョン 137 以降 `--load-extension` フラグを無視するため本ベンチには使えない。branded Chrome とは数百 ms 単位の差が出うる (Chromium バージョンを results.json に記録)
- CRX ダウンロードは非公式 update エンドポイント経由。取得不能時は実 Chrome にインストールしてプロファイルからコピー、それも不能なら "N/A (data not accessible <date>)" と記録
- FormatArc はポップアップ型 (activeTab のみ) でページ自動整形機能を持たないため、自動整形上限は N/A (measure.mjs の対象外)。これは仕様であり測定漏れではない
- Simple JSON Viewer は 2020 年から更新停止で Manifest V2 の疑い。現行 Chromium でロード不能な場合は `not_loadable` として記録する (それ自体が「競合記事が実態確認せずに推薦している」ことを示す記事素材)
- `extensions.json` の `formatted_selector` は初期値が仮置き (`selector_verified: false`)。実測前に各拡張を手動ロードして検証・修正すること
- ストア表示値 (サイズ / 最終更新日) は手動転記が正。スクレイプ値の無検証転記は別種の捏造リスクになるため行わない

## Files

- `extensions.json` — 対象 7 拡張のレジストリ (コミット対象)
- `gen_samples.mjs` — テスト JSON 生成 (samples/ は gitignore、再生成で byte-identical)
- `fetch_extensions.mjs` — CRX 取得 + manifest 事実抽出 (extensions-cache/ は gitignore)
- `measure.mjs` — 自動整形ベンチ本体 (results-raw.json は gitignore)
- `results.json` — 記事数値の唯一の根拠 (7/11 の実測後に作成してコミット)

## History

- 2026-07-09: 初版。7 拡張の実在確認で当初リストの RESTbird / JSON Awesome が Chrome ウェブストアに存在しないと判明 (出典が競合 AI 生成記事のみ)、JSON Lite / JSON Viewer (teocci) に差し替えた上でレジストリを確定 (詳細: `docs/seo/chrome-extension-decision-2026-07-08.md` 更新履歴)
- 2026-07-11: 本実測完了、results.json 初版コミット。実測前に全 6 autoformat 拡張の formatted_selector を実 DOM で検証 (仮置き selector は 4 拡張で不一致と判明し修正、素の Chromium 147 が application/json ページに挿入する pre + div.json-formatter-container への偽陽性 selector も排除)。simple-json-viewer (MV2) は Chromium 起動自体が 180 秒 timeout する not_loadable と確定 (清浄環境で 2 回再現)。json-viewer-pro のみ実行時間制約で 2 run 分割 (プロトコル遵守、results.json の run_note 参照)。ストア表示値 7 件は WebFetch 転記 + fetch_store_meta.mjs draft 突き合わせで確定
