リソース取得の優先度

背景(実測)

#gallery を表示すると画像 3 枚が alt テキストのままになる。 画像は要求されているが、取得順が後ろすぎて実行時間内に届かない。

ordinal=10..13  Noto Sans JP(1 本 5.3MB × 4 = 約 21MB)
ordinal=14      /img/top8.jpg      ← 画像はフォントの後ろ

現状の順序は投入順(HTML/CSS に現れた順)でしかない。 font_queue と IMAGE_QUEUE が別々にあるため、 種類をまたいだ順序付けができない。

方針

打ち切りはしない(spec/resource_loading.md R-2)。 最後まで取得する。順序だけを変える。

優先度(小さいほど先)

優先度 種類 理由
0 CSS レンダリングをブロックする。これが無いと何も正しく描けない
1 表示領域内の画像 いま見えている内容そのもの
2 Web フォント font-display: swap なら代替フォントで先に描ける
3 表示領域外の画像 まだ見えていない
4 スクリプト このエンジンでは描画への寄与が最も小さい

このサイトの CSS は @font-face に font-display: swap を指定している。 仕様上、フォントより表示領域内の画像を先に取るのが正しい。

不変条件

モジュール

web_engine/fetch_priority.rs(純粋・no_std・グローバル状態なし)

pub enum ResourceKind { Css, Image, Font, Script }

pub fn priority(kind: ResourceKind, in_viewport: bool, font_swap: bool) -> u8;

/// 2 つの投入項目の順序(優先度が同じなら投入順)。
pub fn should_fetch_before(a: (u8, u32), b: (u8, u32)) -> bool;