chromiumの–timeoutはタイムアウトでは無い

chromium、headlessモードでscreenshotを撮影する時に詰まったのでメモ

結論

chromiumの–timeoutはタイムアウトでは無くDOMContentLoadedが発火してからのdelay

環境

  • Chromium 111.0.5563.64 snap

検証

test.htmlに検証用のサイトを作る
このサイトはDOMContentLoaded発火後からの時間を計測しweb上に表示する

<!-- test.html -->
<!-- 略 -->
<script>
    document.addEventListener('DOMContentLoaded', () => {
        const start = Date.now();
        setInterval(() => {
            document.getElementById("time").innerHTML = Date.now() - start + "ms";
        }, 100);
    });
</script>

<body>
    <p id="time">loading...</p>
</body>
<!-- 略 -->

検証で使うコマンドはシンプルで –timeout にミリ秒を指定する

chromium-browser --headless --window-size=1440,2000 --timeout=1000 --screenshot http://localhost/test.html
–timeout出力
0loading…
100101ms
10001000ms
20002001ms

DOMContentLoadedが発火した100ms後に最初の書換が行われるのでloading…のままなのは正しい
1ms遅延があるのは気にしないで良さそう

検証2

ページアクセス時ではなくDOMContentLoaded後に発火していることを確認するためにDOMContentLoadedの発火を遅くしてみる
重いことで有名なjQueryの非圧縮版をロードしてみる
自分の環境だと200msかかる

<!-- 略 -->
<script src="https://code.jquery.com/jquery-3.6.4.js"
 integrity="sha256-a9jBBRygX1Bh5lt8GZjXDzyOB+bWve9EiO7tROUtj/E=" crossorigin="anonymous"></script>
<!-- 略 -->
–timeout出力
0loading…
100100ms
10001000ms
20002000ms

構文解析が終わってしばらくした後に実行されているせいか検証1と違いtimeoutと出力に1ms以上の差がなかった

後書き

最初は time コマンドで計測しようとしたが出力に大きなブレがあり正確に測れなかった

カテゴリー