CSS フォント読み込みモジュール レベル 3

W3C 作業草案,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2023/WD-css-font-loading-3-20230406/
最新公開バージョン:
https://www.w3.org/TR/css-font-loading/
編集者草案:
https://drafts.csswg.org/css-font-loading/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/css-font-loading-3
フィードバック:
CSSWG Issue リポジトリ
仕様内の Issue
編集者:
Tab Atkins Jr. (Google)
元編集者:
(Mozilla)
この仕様の編集を提案:
GitHub エディター

概要

この CSS モジュールは、フォントリソースを動的に読み込むために使用されるイベントとインターフェイスについて説明します。

CSS は、構造化文書 (HTML や XML など)のレンダリングを 画面や紙などに記述するための言語です。

この文書のステータス

このセクションでは、この文書の公開時点でのステータスについて説明します。 現在の W3C 公開文書の一覧 およびこの技術報告書の最新リビジョンは、 https://www.w3.org/TR/ にある W3C 技術報告書索引で 確認できます。

この文書は、 CSS ワーキンググループによって作業草案として 勧告 トラックを使用して公開されました。 作業草案としての公開は、 W3C およびそのメンバーによる承認を意味するものではありません。

これは草案文書であり、 いつでも他の文書によって更新、置換 または廃止される可能性があります。 この文書を進行中の作業以外のものとして引用することは不適切です。

フィードバックは、 GitHub で Issue を提出すること(推奨)により送信してください。 タイトルには、次のように仕様コード “css-font-loading” を含めてください: “[css-font-loading] …コメントの要約…”。 すべての Issue とコメントはアーカイブされています。 または、フィードバックを(アーカイブされた)公開メーリングリスト www-style@w3.org に送信することもできます。

この文書は、2021年11月2日 W3C プロセス文書によって管理されています。

この文書は、W3C 特許ポリシーの下で運営されるグループによって作成されました。 W3C は、このグループの成果物に関連して行われた特許開示の公開 リストを管理しています。 そのページには、特許を開示するための手順も記載されています。 個人が、必須 クレームを含むとその個人が考える特許について実際に知っている場合、 W3C 特許 ポリシーのセクション 6に従ってその情報を開示しなければなりません。

1. はじめに

CSS では、作者が @font-face 規則を介して Web からカスタムフォントを読み込むことができます。 スタイルシートを作成する際には簡単に使用できますが、 スクリプトを介して動的に使用することははるかに困難です。

さらに、CSS では、ユーザーエージェントが実際にフォントをいつ読み込むかを選択できます。 フォントフェイスがページ上の何かによって現在使用されていない場合、 ほとんどのユーザーエージェントは関連するファイルをダウンロードしません。 つまり、後でそのフォントフェイスを使用すると、 ユーザーエージェントがようやく使用を認識してフォントファイルのダウンロードと解析を開始するため、遅延が発生します。

この仕様は、CSS のフォントフェイスに対するスクリプト用インターフェイスを定義し、 フォントフェイスを容易に作成できるようにし(FontFace インターフェイスを介して)、 スクリプトから読み込めるようにします(document.fonts を介して)。 また、個々のフォント、 またはページ全体のすべてのフォントの読み込み状態を追跡するためのメソッドも提供します。

この 仕様では、動作を定義するために通常の ES オブジェクトを使用している箇所がいくつかあります。 たとえば、内部で Promise を使用するさまざまな箇所や、 内部で Set を使用する FontFaceSet などです。 ここでの意図は、これらのオブジェクト (およびそのプロトタイプチェーン)が変更されていない初期状態であり、 作者が行ったいかなる操作にも影響されないことだと考えています。 これは適切な意図でしょうか? もしそうなら、この仕様ではどのように示すべきでしょうか?

1.1.

この仕様では Promise を使用します。 これは ECMAScript 6 で定義されています。 MDN には、Promise を紹介する有用な チュートリアル資料があります。

1.2. タスクソース

この仕様でタスクをキューに入れる場合は常に、 そのタスクを「font loading」タスクソースにキューに入れます。

2. FontFace インターフェイス

FontFace インターフェイスは、単一の使用可能なフォントフェイスを表します。 CSS の @font-face 規則は暗黙的に FontFace オブジェクトを定義します。 また、URL またはバイナリデータから手動で構築することもできます。

typedef (ArrayBuffer or ArrayBufferView) BinaryData;

dictionary FontFaceDescriptors {
  CSSOMString style = "normal";
  CSSOMString weight = "normal";
  CSSOMString stretch = "normal";
  CSSOMString unicodeRange = "U+0-10FFFF";
  CSSOMString variant = "normal";
  CSSOMString featureSettings = "normal";
  CSSOMString variationSettings = "normal";
  CSSOMString display = "auto";
  CSSOMString ascentOverride = "normal";
  CSSOMString descentOverride = "normal";
  CSSOMString lineGapOverride = "normal";
};

enum FontFaceLoadStatus { "unloaded", "loading", "loaded", "error" };

[Exposed=(Window,Worker)]
interface FontFace {
  constructor(CSSOMString family, (CSSOMString or BinaryData) source,
                optional FontFaceDescriptors descriptors = {});
  attribute CSSOMString family;
  attribute CSSOMString style;
  attribute CSSOMString weight;
  attribute CSSOMString stretch;
  attribute CSSOMString unicodeRange;
  attribute CSSOMString variant;
  attribute CSSOMString featureSettings;
  attribute CSSOMString variationSettings;
  attribute CSSOMString display;
  attribute CSSOMString ascentOverride;
  attribute CSSOMString descentOverride;
  attribute CSSOMString lineGapOverride;

  readonly attribute FontFaceLoadStatus status;

  Promise<FontFace> load();
  readonly attribute Promise<FontFace> loaded;
};

オブジェクトは文書間を移動できるため、 どの文書を参照しているのかが明確になるよう、 「the document」へのすべての言及を明確化する必要があります。

family, 型は CSSOMString
style, 型は CSSOMString
weight, 型は CSSOMString
stretch, 型は CSSOMString
unicodeRange, 型は CSSOMString

これらの属性はすべて、CSS の @font-face 規則で定義される記述子によって定義される、 フォントフェイスの対応する側面を表します。 これらは、対応する @font-face 記述子と同じ方法で解析されます。 これらはフォントマッチングアルゴリズムによって使用されますが、 それ以外の効果はありません。

たとえば、FontFacestyle"italic" の場合、その FontFace はイタリックのフォントフェイスを表します。 フォントフェイスを実際にイタリックにするわけではありません。

取得時には、この属性に関連付けられた文字列を返します。

設定時には、対応する @font-face 記述子の文法に従って文字列を解析します。 文法に一致しない場合は、 SyntaxError を投げます。 それ以外の場合は、属性を解析済みの値の直列化結果に設定します。

variant, 型は CSSOMString
featureSettings, 型は CSSOMString
variationSettings, 型は CSSOMString
display, 型は CSSOMString
ascentOverride, 型は CSSOMString
descentOverride, 型は CSSOMString
lineGapOverride, 型は CSSOMString

これらの属性は、CSS の @font-face 規則内の対応する記述子と同じ意味を持ち、 同じ方法で解析されます。

これらは、それをサポートするフォント内の特定の機能をオンまたはオフにします。 前述の属性とは異なり、 これらの属性は実際にフォントフェイスに影響します。

取得時には、この属性に関連付けられた文字列を返します。

設定時には、対応する @font-face 記述子の文法に従って文字列を解析します。 文法に一致しない場合は、 SyntaxError を投げます。 それ以外の場合は、属性を解析済みの値の直列化結果に設定します。

status, 型は FontFaceLoadStatus、読み取り専用

この属性は、フォントフェイスの現在の状態を反映します。 新しく作成された FontFace では "unloaded" でなければなりません。

作者がフォントフェイスの読み込みを明示的に要求したことにより変更される場合があります。 たとえば、FontFaceload() メソッドを介した場合です。 また、ユーザーエージェントが、 画面上にテキストを描画するためにそのフォントフェイスが必要であることを検出したため、 暗黙的に変更される場合もあります。

loaded, 型は Promise<FontFace>、 読み取り専用

この属性は、フォントフェイスの [[FontStatusPromise]] を反映します。

すべての FontFace オブジェクトは、内部に [[FontStatusPromise]] スロットを持ち、 これはフォントの状態を追跡します。 最初は保留状態であり、 フォントが正常に読み込まれて解析された場合に履行され、エラーが発生した場合に拒否されます。

すべての FontFace オブジェクトはさらに、 内部 [[Urls]] および [[Data]] スロットも持ちます。 そのうち一方は null で、もう一方は null ではありません(null ではない方は、 どのデータが渡されたかに基づいてコンストラクターによって設定されます)。

2.1. コンストラクター

FontFace は、 フォントフェイスファイルを指す URL、 またはフォントフェイスのバイナリ表現を含む ArrayBuffer (または ArrayBufferView) のいずれかから構築できます。

FontFace(family, source, descriptors) メソッドが呼び出された場合、 次の手順を実行します:

  1. font face を新しい FontFace オブジェクトとします。 font facestatus 属性を "unloaded" に設定し、 その内部 [[FontStatusPromise]] スロットを、新しい保留中の Promise オブジェクトに設定します。

    family 引数と、 descriptors 引数のメンバーを、 CSS の @font-face 規則の対応する記述子の文法に従って解析します。 source 引数が CSSOMString である場合、 CSS の src 記述子の文法に従って解析します。これは @font-face 規則の記述子です。 いずれかが正しく解析できなかった場合、 font face[[FontStatusPromise]] を "SyntaxError" という名前の DOMException で拒否し、 font face の対応する属性を空文字列に設定し、 font facestatus 属性を "error" に設定します。 それ以外の場合は、font face の対応する属性を解析済みの 値の直列化結果に設定します。

    注: これは、source 引数として URL をそのまま渡す、 たとえば "http://example.com/myFont.woff" のような形式では 動作しないことを意味する点に注意してください。少なくとも url() 関数で囲む必要があり、 "url(http://example.com/myFont.woff)" のようにします。 この不便さと引き換えに、 複数のフォールバックを指定したり、 各フォールバックのフォントタイプを指定したり、 ローカルフォントを簡単に参照したりできます。

    相対 URL を解決できるように、 ベース URL を定義する必要があります。 文書の URL にすべきでしょうか? これは Worker に対しても正しいでしょうか。 それとも Worker 自身の URL を使用すべきでしょうか? それは常に定義されているでしょうか?

    font face を返します。 font facestatus が "error" の場合、 このアルゴリズムを終了します。 それ以外の場合、 残りの手順を非同期で完了します。

  2. source 引数が CSSOMString であった場合、 font face の内部 [[Urls]] スロットをその文字列に設定します。

    source 引数が BinaryData であった場合、 font face の内部 [[Data]] スロットを渡された引数に設定します。

  3. font face[[Data]] スロットが null でない場合、 次の手順を同期的に実行するタスクをキューに入れます:

    1. font facestatus 属性を "loading" に設定します。

    2. font face が属する各 FontFaceSet について:

      1. FontFaceSet[[LoadingFonts]] リストが空の場合、FontFaceSet を loading に切り替えます

      2. font faceFontFaceSet[[LoadingFonts]] リストに追加します。

    非同期で、その中のデータをフォントとして解析することを試みます。 これが完了したら、 成功したか否かにかかわらず、 次の手順を同期的に実行するタスクをキューに入れます:

    1. 読み込みが成功した場合、font face は解析されたフォントを表すようになります。 font face[[FontStatusPromise]]font face で履行し、 その status 属性を "loaded" に設定します。

      font face が属する各 FontFaceSet について:

      1. font faceFontFaceSet[[LoadedFonts]] リストに追加します。

      2. font faceFontFaceSet[[LoadingFonts]] リストから削除します。 font がそのリストの最後の項目であった場合 (したがってリストが空になった場合)、FontFaceSet を loaded に切り替えます

    2. それ以外の場合、 font face[[FontStatusPromise]] を "SyntaxError" という名前の DOMException で拒否し、 font facestatus 属性を "error" に設定します。

      font face が属する各 FontFaceSet について:

      1. font faceFontFaceSet[[FailedFonts]] リストに追加します。

      2. font faceFontFaceSet[[LoadingFonts]] リストから削除します。 font がそのリストの最後の項目であった場合 (したがってリストが空になった場合)、FontFaceSet を loaded に切り替えます

注: 新しく構築された FontFace オブジェクトは、 文書に関連付けられた FontFaceSet または Worker スレッドのコンテキストに自動的に追加されません。 これは、新しく構築されたフォントをプリロードすることはできますが、 FontFaceSet に明示的に追加されるまでは実際には使用できないことを意味します。 FontFaceSet のより完全な説明については、次のセクションを参照してください。

2.2. load() メソッド

load() メソッドは、FontFace の URL ベースのフォントフェイスに対して、フォントデータの要求と読み込みを強制します。 バイナリデータから構築されたフォント、 またはすでに読み込み中もしくは読み込み済みのフォントに対しては、 何もしません。

load() メソッドが呼び出された場合、 次の手順を実行します:

  1. font face を、このメソッドが呼び出された FontFace オブジェクトとします。
  2. font face[[Urls]] スロットが null である、 またはその status 属性が "unloaded" 以外である場合、 font face[[FontStatusPromise]] を返し、これらの手順を中止します。
  3. それ以外の場合、 font facestatus 属性を "loading" に設定し、 font face[[FontStatusPromise]] を返して、 このアルゴリズムの残りを非同期で実行し続けます。
  4. font face[[Urls]] スロットの値を使用し、 [CSS-FONTS-3] で定義される方法でフォントの読み込みを試みます。 これは、@font-face 規則の src 記述子の値であるかのように扱います。
  5. 読み込み操作が完了したら、 成功したか否かにかかわらず、 次の手順を同期的に実行するタスクをキューに入れます:
    1. 読み込みの試行が失敗した場合、 font face[[FontStatusPromise]] を 名前が "NetworkError" の DOMException で拒否し、 font facestatus 属性を "error" に設定します。

      font face が属する各 FontFaceSet について:

      1. font faceFontFaceSet[[FailedFonts]] リストに追加します。

      2. font faceFontFaceSet[[LoadingFonts]] リストから削除します。 font がそのリストの最後の項目であった場合 (したがってリストが空になった場合)、FontFaceSet を loaded に切り替えます

    2. それ以外の場合、font face は読み込まれたフォントを表すようになります。 font face[[FontStatusPromise]]font face で履行し、font facestatus 属性を "loaded" に設定します。

      font face が属する各 FontFaceSet について:

      1. font faceFontFaceSet[[LoadedFonts]] リストに追加します。

      2. font faceFontFaceSet[[LoadingFonts]] リストから削除します。 font がそのリストの最後の項目であった場合 (したがってリストが空になった場合)、FontFaceSet を loaded に切り替えます

ユーザーエージェントは、 特定のフォントフェイスがページ上の何かをレンダリングするために必要であると判断した場合、 自らフォントの読み込みを開始できます。 この場合、 ここで説明されている対応する FontFaceload() メソッドを呼び出したかのように動作しなければなりません。

注: 一部の UA は「フォントキャッシュ」を利用しており、 同じフォントを同じページまたは同一オリジン内の複数のページで 複数回ダウンロードする必要をなくしています。 複数の FontFace オブジェクトを フォントキャッシュ内の同じエントリに対応付けることができます。 つまり、FontFace オブジェクトが、 FontFaceSet に含まれていなくても、 同じフォントデータを指す別の FontFace オブジェクトが (まったく別のページ上にある場合であっても!) 読み込まれたために、予期せず読み込みを開始する可能性があります。

2.3. CSS の @font-face 規則との相互作用

CSS の @font-face 規則は、対応する FontFace オブジェクトを自動的に定義し、 規則が解析されると、そのオブジェクトは文書の フォントソースに自動的に配置されます。 この FontFace オブジェクトは CSS 接続済みです。

@font-face 規則に対応する FontFace オブジェクトでは、 familystyleweightstretchunicodeRangevariant、 および featureSettings 属性が、 @font-face 規則内の対応する記述子と同じ値に設定されます。 両者の間には双方向の接続があります。 @font-face 記述子に加えられた変更は、 対応する FontFace 属性に即座に反映され、 その逆も同様です。

FontFace が 文書間で転送されると、CSS 接続済みではなくなります。

FontFace オブジェクトの内部 [[Urls]] スロットは、@font-face 規則の src 記述子の値に設定され、 src 記述子に加えられた変更を反映します。

それ以外の点では、CSS の @font-face 規則によって作成された FontFace オブジェクトは、 手動で作成されたものと同一です。

@font-face 規則が文書から削除された場合、対応する FontFace オブジェクトはもはや CSS 接続済みではありません。 この接続は、いかなる方法でも復元できません (ただし、@font-face をスタイルシートに再び追加すると、 まったく新しい FontFace オブジェクトが作成され、 これは CSS 接続済みになります)。

@font-face 規則の src 記述子が新しい値に変更された場合、 元の接続済み FontFace オブジェクトは CSS 接続済みであることを停止しなければなりません。 新しい src を反映する新しい FontFace を作成し、@font-faceCSS 接続しなければなりません。 (これにより、古い FontFace オブジェクトが、それが現れる任意の フォントソースから削除され、 新しいオブジェクトが追加されます。)

2.4. フォントに関する情報の検出

FontFace オブジェクトには、フォントファイルの内容に関するさまざまな読み取り専用情報が含まれます。

[Exposed=(Window,Worker)]
interface FontFaceFeatures {
  /* CSSWG では、ここに何を含めるかについてまだ議論中です */
};

[Exposed=(Window,Worker)]
interface FontFaceVariationAxis {
  readonly attribute DOMString name;
  readonly attribute DOMString axisTag;
  readonly attribute double minimumValue;
  readonly attribute double maximumValue;
  readonly attribute double defaultValue;
};

[Exposed=(Window,Worker)]
interface FontFaceVariations {
  readonly setlike<FontFaceVariationAxis>;
};

[Exposed=(Window,Worker)]
interface FontFacePalette {
  iterable<DOMString>;
  readonly attribute unsigned long length;
  getter DOMString (unsigned long index);
  readonly attribute boolean usableWithLightBackground;
  readonly attribute boolean usableWithDarkBackground;
};

[Exposed=(Window,Worker)]
interface FontFacePalettes {
  iterable<FontFacePalette>;
  readonly attribute unsigned long length;
  getter FontFacePalette (unsigned long index);
};

partial interface FontFace {
  readonly attribute FontFaceFeatures features;
  readonly attribute FontFaceVariations variations;
  readonly attribute FontFacePalettes palettes;
};

注: この読み取り専用データは、 font-feature-settingsfont-variation-settings、 および @font-palette-values で どの値が受け入れられるかを作者が把握できるようにすることを目的としています。

3. FontFaceSet インターフェイス

dictionary FontFaceSetLoadEventInit : EventInit {
  sequence<FontFace> fontfaces = [];
};

[Exposed=(Window,Worker)]
interface FontFaceSetLoadEvent : Event {
  constructor(CSSOMString type, optional FontFaceSetLoadEventInit eventInitDict = {});
  [SameObject] readonly attribute FrozenArray<FontFace> fontfaces;
};

enum FontFaceSetLoadStatus { "loading", "loaded" };

[Exposed=(Window,Worker)]
interface FontFaceSet : EventTarget {
  constructor(sequence<FontFace> initialFaces);

  setlike<FontFace>;
  FontFaceSet add(FontFace font);
  boolean delete(FontFace font);
  undefined clear();

  // 読み込み状態が変化したときのイベント
  attribute EventHandler onloading;
  attribute EventHandler onloadingdone;
  attribute EventHandler onloadingerror;

  // 必要に応じて読み込みを確認し、開始する
  // すべての読み込みが完了したときに Promise を履行する
  Promise<sequence<FontFace>> load(CSSOMString font, optional CSSOMString text = " ");

  // fontlist 内のすべてのフォントが読み込み済みかどうかを返す
  // (利用できない場合でも読み込みは開始しない)
  boolean check(CSSOMString font, optional CSSOMString text = " ");

  // フォント読み込みとレイアウト操作が完了したことを非同期で通知する
  readonly attribute Promise<FontFaceSet> ready;

  // 読み込み状態。1 つ以上のフォントが読み込み中なら "loading"、それ以外は "loaded"
  readonly attribute FontFaceSetLoadStatus status;
};
ready, 型は Promise<FontFaceSet>、 読み取り専用

この属性は FontFaceSet[[ReadyPromise]] スロットを反映します。

この Promise とその使用方法の詳細については、§ 3.4 ready 属性を参照してください。

FontFaceSet(initialFaces)

FontFaceSet コンストラクターは、呼び出されたとき、 initialFaces 引数を反復処理し、 各値をその set entries に追加しなければなりません。

反復順序

反復処理される場合、 すべての CSS 接続済み FontFace オブジェクトが最初に現れなければならず、 接続された @font-face 規則の文書順に並び、 その後に CSS 接続済みではない FontFace オブジェクトが、 挿入順に続かなければなりません。

集合エントリ

FontFaceSetフォントソースである場合、 その 集合エントリは、§ 4.2 CSS の @font-face 規則との相互作用で指定されているとおりに初期化されます。

それ以外の場合、その 集合エントリは初期状態では空です。

add(font)

add() メソッドが呼び出された場合、 次の手順を実行します:

  1. font がすでに FontFaceSet集合エントリに含まれている場合、 直ちにこのアルゴリズムの最後の手順へ進みます。

  2. fontCSS 接続済みである場合、 InvalidModificationError 例外を投げ、 直ちにこのアルゴリズムを終了します。

  3. font 引数を FontFaceSet集合エントリに追加します。

  4. fontstatus 属性が "loading" の場合:

    1. FontFaceSet[[LoadingFonts]] リストが空の場合、FontFaceSet を loading に切り替えます

    2. fontFontFaceSet[[LoadingFonts]] リストに追加します。

  5. FontFaceSet を返します。

delete(font)

delete() メソッドが呼び出された場合、 次の手順を実行します:

  1. fontCSS 接続済みである場合、 false を返し、直ちにこの アルゴリズムを終了します。

  2. deleted を、FontFaceSet集合エントリから font を削除した結果とします。

  3. fontFontFaceSet[[LoadedFonts]] または [[FailedFonts]] リストに存在する場合、 そこから削除します。

  4. fontFontFaceSet[[LoadingFonts]] リストに存在する場合、 そこから削除します。 font がそのリストの最後の項目であった場合 (したがってリストが空になった場合)、FontFaceSet を loaded に切り替えます

  5. deleted を返します。

clear()

clear() メソッドが呼び出された場合、 次の手順を実行します:

  1. FontFaceSet集合エントリ、 その [[LoadedFonts]] リスト、 およびその [[FailedFonts]] リストから、CSS 接続済みでないすべての項目を削除します。

  2. FontFaceSet[[LoadingFonts]] リストが空でない場合、 そのすべての項目を削除し、 その後 FontFaceSet を loaded に切り替えます

FontFaceSet オブジェクトには、内部 [[LoadingFonts]][[LoadedFonts]]、 および [[FailedFonts]] スロットもあり、 これらはすべて空のリストに初期化されます。 また、[[ReadyPromise]] スロットもあり、 これは新しい保留中の Promise に初期化されます。

フォントファミリーは使用された場合にのみ読み込まれるため、 コンテンツは、フォントの読み込みがいつ発生するかを把握する必要がある場合があります。 作者は、ここで定義されているイベントとメソッドを使用することで、 特定のフォントが利用可能であることに依存する処理をより細かく制御できます。

FontFaceSet は、次のいずれかが真である場合、環境で保留中です:

注: 考え方としては、FontFaceSet環境で保留中でなくなった時点で、 その後文書に何も変更が加えられない限り、 作者は、測定したときの要素のサイズや位置が「正しい」ことを前提にできるということです。 上記の条件がこの保証を完全に捉えていない場合は、 そうなるように修正する必要があります。

3.1. イベント

フォント読み込みイベントにより、各フォントを個別に監視する代わりに、 文書全体のフォント読み込み動作に簡単に応答できます。 loading イベントは 文書がフォントの読み込みを開始したときに発火し、 loadingdone および loadingerror イベントは、 文書のフォント読み込みが完了したときに発火し、 それぞれ、正常に読み込まれたフォント または読み込みに失敗したフォントを含みます。

以下は、FontFaceSet オブジェクトが IDL 属性としてサポートしなければならない イベントハンドラー(および対応するイベントハンドラーイベント型)です:

イベントハンドラー イベントハンドラーのイベント型
onloading loading
onloadingdone loadingdone
onloadingerror loadingerror

FontFaceSet target で、名前が e、任意の font faces を伴う フォント読み込みイベントを発火するとは、 FontFaceSetLoadEvent インターフェイスを使用して、名前が e単純イベントを発火することであり、 さらに次の条件も満たすことを意味します:

  1. fontfaces 属性は、font faces をフィルタリングして、 target に含まれる FontFace オブジェクトのみを含めた結果で初期化されます。

与えられた FontFaceSet について、 FontFaceSet を loading に切り替えるよう求められた場合、 ユーザーエージェントは次の手順を実行しなければなりません:

  1. font face set を、与えられた FontFaceSet とします。
  2. font face setstatus 属性を "loading" に設定します。
  3. font face set[[ReadyPromise]] スロットが現在履行済みの Promise を保持している場合、 新しい保留中の Promise に置き換えます。
  4. font face set で、名前が loadingフォント読み込みイベントを発火するタスクをキューに入れます。

与えられた FontFaceSet について、 FontFaceSet を loaded に切り替えるよう求められた場合、 ユーザーエージェントは次の手順を実行しなければなりません:

  1. font face set を、与えられた FontFaceSet とします。

  2. font face set環境で保留中である場合、 それを 環境で停止中としてマークし、 このアルゴリズムを終了します。

  3. font face setstatus 属性を "loaded" に設定します。

  4. font face set[[ReadyPromise]] 属性の値を font face set で履行します。

  5. 次の手順を同期的に実行するタスクをキューに入れます:

    1. loaded fonts を、font face set[[LoadedFonts]] スロットの(空の場合もある)内容とします。

    2. failed fonts を、font face set[[FailedFonts]] スロットの(空の場合もある)内容とします。

    3. [[LoadedFonts]] および [[FailedFonts]] スロットを空のリストにリセットします。

    4. font face set で、loaded fonts を伴う、名前が loadingdoneフォント読み込みイベントを発火します

    5. font face setfailed fonts が空でない場合、 font face set で、failed fonts を伴う、名前が loadingerrorフォント読み込み イベントを発火します

FontFaceSet環境で保留中から 環境で保留中ではない状態へ移行するたびに、 ユーザーエージェントは次の手順を実行しなければなりません:

  1. FontFaceSet環境で停止中であり、かつその [[LoadingFonts]] リストが空の場合、FontFaceSet を loaded に切り替えます

  2. FontFaceSet環境で停止中である場合、 そのマークを解除します。

FontFaceSet source から、与えられたフォント文字列 font、 任意のサンプルテキスト text、 および任意の allow system fonts フラグについて、 一致する フォントフェイスを検索するよう求められた場合、 次の手順を実行します:

  1. font プロパティの CSS 値構文を使用して font を解析します。 構文エラーが発生した場合、 構文エラーを返します。

    解析された値が CSS 全体キーワードである場合、 構文エラーを返します。

    すべての相対長を、対応するプロパティの初期値に対して絶対化します。 (たとえば、bolder のような相対フォントウェイトは、初期値 normal に対して評価されます。)

  2. text が明示的に指定されていない場合、 単一のスペース文字(U+0020 SPACE)を含む文字列とします。
  3. font family listfont から解析されたフォントファミリーのリストとし、 font stylefont から解析されたその他のフォントスタイル属性とします。
  4. available font faces を、source 内の 利用可能なフォントフェイスとします。 allow system fonts フラグが指定されている場合、 すべてのシステムフォントを available font faces に追加します。
  5. matched font faces を最初は空のリストとします。
  6. font family list 内の各ファミリーについて、 フォントマッチング規則を使用して、available font faces から font style に一致するフォントフェイスを選択し、 それらを matched font faces に追加します。 unicodeRange 属性を使用するため、これは単一のフォントフェイスだけではない場合があります。
  7. matched font faces が空の場合、 found faces フラグを false に設定します。 それ以外の場合は true に設定します。
  8. matched font faces 内の各フォントフェイスについて、 定義された unicode-range が、 text 内の少なくとも 1 文字のコードポイントを含まない場合、 そのフォントフェイスをリストから削除します。

    注: したがって、text が空文字列の場合、 すべてのフォントが削除されます。

  9. matched font facesfound faces フラグを返します。

3.2. load() メソッド

load() メソッドは、FontFaceSet において、指定されたフォントリスト内のすべてのフォントが 読み込み済みで利用可能かどうかを判定します。 いずれかのフォントがダウンロード可能なフォントで、まだ読み込まれていない場合、 ユーザーエージェントはそれら各フォントの読み込みを開始します。 これは Promise を返し、 すべてのフォントが読み込まれて使用可能になると履行され、 いずれかのフォントが正常に読み込めなかった場合は拒否されます。

load( font, text ) メソッドが 呼び出された場合、 次の手順を実行します:

  1. font face set を、このメソッドが呼び出された FontFaceSet オブジェクトとします。 promise を新しく作成された Promise オブジェクトとします。
  2. promise を返します。 残りの手順を非同期で完了します。
  3. 関数に渡された font および text 引数を使用して font face set から一致するフォントフェイスを検索しfont face list を戻り値とします (found faces フラグは無視します)。 構文エラーが返された場合、 promise を SyntaxError 例外で拒否し、 これらの手順を終了します。
  4. 次の手順を同期的に実行するタスクをキューに入れます:
    1. font face list 内のすべてのフォントフェイスについて、 それぞれの load() メソッドを呼び出します。
    2. font face list 内の各フォントフェイスの [[FontStatusPromise]] を 順番にすべて待機した結果で promise を解決します。

3.3. check() メソッド

check() メソッドは、FontFaceSet において、指定されたテキストを特定のフォントリストで「安全に」 レンダリングできるかどうか、すなわち後で「フォントスワップ」が発生しないかどうかを判定します。 指定されたテキストとフォントの組み合わせが、 未読み込みまたは現在読み込み中のフォントを使用しようとせずにレンダリングされる場合、 このメソッドは true を返します。 それ以外の場合は false を返します。

このメソッドの動作には、直感的ではない 2 つの特殊なケースがあることに注意してください:

check( font, text) メソッドが 呼び出された場合、 次の手順を実行します:

  1. font face set を、このメソッドが呼び出された FontFaceSet オブジェクトとします。
  2. 関数に渡された font および text 引数を使用し、システムフォントも含めて、 font face set から一致するフォントフェイスを検索しfont face list を返されたフォントフェイスのリスト、 found faces を返された found faces フラグとします。 構文エラーが返された場合、 SyntaxError 例外を投げ、 これらの手順を終了します。
  3. font face list が空である、 または font face list 内のすべてのフォントが、status 属性が "loaded" であるかシステムフォントである場合、 true を返します。 それ以外の場合は false を返します。

3.4. ready 属性

読み込まれるフォントの数は、特定のテキスト片にいくつのフォントが使用されるかに依存するため、 場合によっては、フォントを読み込む必要があるかどうかが事前には分からないことがあります。 ready 属性には、文書のフォント読み込みが完了したときに解決される Promise が含まれます。 これにより、作者は、フォント読み込みによって影響を受ける可能性のあるコンテンツを調べる前に、 どのフォントが読み込まれたか、または読み込まれていないかを追跡し続ける必要を避けられます。

注: 作者は、特定の ready promise が履行されるのは 1 回だけであるものの、 その履行後にさらにフォントが読み込まれる可能性があることに注意する必要があります。 これは、loadingdone イベントの発火を監視することに似ています。 ただし、ready Promise に渡されたコールバックは、 対象のフォントがすでに読み込まれているためフォント読み込みが発生しない場合でも、 常に呼び出されます。 どのフォントが必要か、また正確にいつ読み込まれるかを追跡する必要なしに、 コードをフォント読み込みと同期させる簡単な方法です。

注: ready promise が履行されるまでに、 ユーザーエージェントが複数回のフォント読み込みを繰り返す必要がある場合があることに注意してください。 これはフォントフォールバックの場合に発生することがあります。 たとえば、fontlist 内の 1 つのフォントが読み込まれたものの、 特定のグリフを含んでおらず、 fontlist 内の他のフォントを読み込む必要がある場合です。 ready promise は、レイアウト操作が完了し、 追加のフォント読み込みが不要になった後にのみ履行されます。

注: この ready 属性によって返される Promise は、 FontFaceload() メソッドによって返される Promise とは異なり、 常に履行されるだけで、 拒否されることはありません。

3.5. CSS フォント読み込みおよびマッチングとの相互作用

[CSS-FONTS-3] のフォントマッチングアルゴリズムがユーザーエージェントによって自動的に実行される場合、 マッチング対象となるフォントフェイスの集合は、文書の フォントソース内のフォントの集合に、 任意のローカルフォントフェイスを加えたものと正確に一致しなければなりません。

ユーザーエージェントがフォントフェイスを読み込む必要がある場合、 対応する FontFace オブジェクトの load() メソッドを呼び出すことによって読み込まなければなりません。

(これは、同じアルゴリズムを実行しなければならないという意味であり、 オブジェクトの load プロパティに現在格納されている値を文字どおり呼び出すという意味ではありません。)

フォントは、FontFaceSet に追加されると利用可能になります。 新しい @font-face 規則をスタイルシートに追加すると、 FontFace も新たに、 Document オブジェクトの FontFaceSet に追加されます。

新しい @font-face 規則を追加する場合:

document.styleSheets[0].insertRule(
  "@font-face { font-family: newfont; src: url(newfont.woff); }", 0);
document.body.style.fontFamily = "newfont, serif";

新しい FontFace オブジェクトを構築して document.fonts に追加する場合:

var f = new FontFace("newfont", "url(newfont.woff)");
document.fonts.add(f);
document.body.style.fontFamily = "newfont, serif";

どちらの場合も、フォントリソース “newfont.woff” の読み込みはレイアウトエンジンによって開始され、 他の @font-face 規則のフォントと同様に読み込まれます。

document.fonts への追加を省略すると、フォントは 決して読み込まれず、 テキストはデフォルトの serif フォントで表示されます:

var f = new FontFace("newfont", "url(newtest.woff)", {});

/* 新しい {{FontFace}} は {{FontFaceSet}} に追加されていないため、
   'font-family' プロパティからは認識できず、
   代わりに serif が使用される */
document.body.style.fontFamily = "newfont, serif";

フォントを使用する前に明示的にプリロードするには、 作者は、新しい FontFaceFontFaceSet に追加するのを、読み込みが完了するまで遅らせることができます:

var f = new FontFace("newfont", "url(newfont.woff)", {});
f.load().then(function (loadedFace) {
  document.fonts.add(loadedFace);
  document.body.style.fontFamily = "newfont, serif";
});

この場合、最初にフォントリソース “newfont.woff” がダウンロードされます。 ダウンロードが完了すると、 フォントは文書の FontFaceSet に追加され、 body のフォントが変更され、 レイアウトエンジンが新しいフォントリソースを使用します。

4. FontFaceSource ミックスイン

interface mixin FontFaceSource {
  readonly attribute FontFaceSet fonts;
};

Document includes FontFaceSource;
WorkerGlobalScope includes FontFaceSource;

何らかの方法でフォントを使用できる文書、Worker、またはその他のコンテキストは、FontFaceSource ミックスインを含まなければなりません。 コンテキストの fonts 属性の値は、その フォント ソースであり、 特に定義されていない限り、 フォント関連の操作で使用されるすべてのフォントを提供します。 「the font source」を参照する操作は、その操作が行われている関連コンテキストの フォントソースを参照するものとして解釈しなければなりません。

これらのコンテキストのいずれかで行われるフォント関連の操作について、 フォントソース内の FontFace オブジェクトが、その 利用可能なフォント フェイスです。

4.1. Worker の FontFaceSource

Worker 文書内では、フォント ソースは初期状態では空です。

注: FontFace オブジェクトは 通常どおり構築して追加でき、 これは Worker 内の CSS フォントマッチングに影響します (たとえば、OffscreenCanvas にテキストを描画する場合など)。

4.2. CSS の @font-face 規則との相互作用

文書の フォント ソース集合 エントリには、初期状態で、文書または Shadow Root の CSS スタイルシート内にあるすべての CSS @font-face 規則から、 すべての CSS 接続済み FontFace オブジェクトを 文書順で格納しなければなりません。 @font-face 規則がスタイルシートに追加または削除されたり、 @font-face 規則を含むスタイルシートが 追加または削除されたりすると、 対応する CSS 接続済み FontFace オブジェクトも 文書の フォントソースに追加または削除されなければならず、 この順序を維持しなければなりません。

手動で追加されたすべての FontFace オブジェクトは、 CSS 接続済みのものよりに並べなければなりません。

FontFaceSet オブジェクトの add() メソッドが CSS 接続済み FontFace オブジェクトを引数として呼び出された場合、 オブジェクトがすでに集合に含まれていれば、 操作は何もしないものでなければなりません。 それ以外の場合も、操作は何もしてはならず、 InvalidModificationError を投げなければなりません。

FontFaceSet オブジェクトの delete() メソッドが CSS 接続済み FontFace オブジェクトを引数として呼び出された場合、 操作は何もしないものでなければならず、 false を返さなければなりません。

注: 作者は、削除された FontFace への参照を、 フォントソースから自動的に削除された後でも保持できます。 ただし、§ 2.3 CSS の @font-face 規則との相互作用で指定されているとおり、 その時点で FontFace はもはや CSS 接続済みではありません。

注: この仕様の将来のバージョンでは、 ローカルフォントとやり取りしたり、照会したりする方法も定義されることが期待されています。

5. API の例

すべてのフォント読み込みが完了した後にのみコンテンツを表示する場合:
document.fonts.ready.then(function() {
  var content = document.getElementById("content");
  content.style.visibility = "visible";
});
ダウンロード可能なフォントを使用して canvas にテキストを描画し、 フォントのダウンロードを明示的に 開始して、完了後に描画する場合:
function drawStuff() {
  var ctx = document.getElementById("c").getContext("2d");

  ctx.fillStyle = "red";
  ctx.font = "50px MyDownloadableFont";
  ctx.fillText("こんにちは!", 100, 100);
}

document.fonts.load("50px MyDownloadableFont")
              .then(drawStuff, handleError);
リッチテキスト編集アプリケーションでは、編集操作が行われた後に テキスト要素を測定する必要がある場合があります。 スタイル変更によって追加のフォントをダウンロードする必要が生じる場合もあれば、 生じない場合もあり、またフォントがすでにダウンロード済みの場合もあるため、 測定処理はそれらのフォント読み込みが完了した後に 行う必要があります:
function measureTextElements() {
  // これで、ダウンロード可能なフォントのメトリックを使用して
  // コンテンツを測定できる
}

function doEditing() {
  // 追加のフォント読み込みを引き起こす可能性のあるコンテンツ/レイアウト操作
  document.fonts.ready.then(measureTextElements);
}
loadingdone イベントは、すべてのフォント関連の読み込みが完了し、かつ追加のフォント読み込みを発生させずに テキストのレイアウトが完了した後にのみ発火します:
<style>
@font-face {
  font-family: latin-serif;
  src: url(latinserif.woff) format("woff"); /* 漢字/かなを含まない */
}
@font-face {
  font-family: jpn-mincho;
  src: url(mincho.woff) format("woff");
}
@font-face {
  font-family: unused;
  src: url(unused.woff);
}

body { font-family: latin-serif, jpn-mincho; }
</style>
<p>納豆はいかがでしょうか

この状況では、ユーザーエージェントは最初に “latinserif.woff” をダウンロードし、 次にこれを使用して日本語テキストの描画を試みます。 しかし、そのフォントには日本語のグリフが存在しないため、 フォールバックが発生してフォント “mincho.woff” がダウンロードされます。 2 番目のフォントがダウンロードされ、日本語テキストがレイアウトされた後にのみ、loadingdone イベントが発火します。

"unused" フォントは読み込まれませんが、 それを使用しているテキストがないため、 UA はそのフォントを読み込もうとさえしていません。 したがって、loadingdone イベントに影響しません。

変更点

2014年5月 CSS Font Loading 最終草案作業草案からの変更点:

謝辞

Google Fonts チームの複数のメンバーがフォント読み込みイベントについて有益なフィードバックを提供してくれました。 Boris Zbarsky、Jonas Sicking、ms2ger からも同様にフィードバックをいただきました。

プライバシーに関する考慮事項

FontFaceSet オブジェクトは、ユーザーがインストールしているフォントに関する情報を漏洩しますが、 既存の @font-face 規則とまったく同じ方法です。 新しい情報が漏洩することはなく、 また、目立って容易な方法で漏洩することもありません。

セキュリティに関する考慮事項

この仕様について、セキュリティ上の考慮事項は提起されていません。

適合性

文書の表記規則

適合要件は、説明的な記述と RFC 2119 の用語を組み合わせて表現されます。この文書の規範的な部分におけるキーワード “MUST”、 “MUST NOT”、 “REQUIRED”、 “SHALL”、 “SHALL NOT”、 “SHOULD”、 “SHOULD NOT”、 “RECOMMENDED”、 “MAY”、および “OPTIONAL” は、 RFC 2119 に記載されているとおりに解釈されるものとします。 ただし、読みやすさのため、この仕様ではこれらの語がすべて大文字で 表記されるわけではありません。

この仕様のテキストは、明示的に非規範的と記されたセクション、 例、および注記を除き、すべて規範的です。 [RFC2119]

この仕様の例は、“for example” という語で導入されるか、 class="example" を使用して規範的なテキストから区別されます。 次のようになります:

これは参考情報としての例の一例です。

参考情報としての注記は “Note” という語で始まり、 class="note" を使用して規範的なテキストから区別されます。次のようになります:

注: これは参考情報としての注記です。

勧告事項は、特別な注意を促すようにスタイル設定された規範的なセクションであり、 <strong class="advisement"> を使用して他の規範的なテキストから区別されます。次のようになります: UA はアクセシブルな代替手段を提供しなければなりません。

適合クラス

この仕様への適合性は、 3 つの適合クラスについて定義されます:

スタイルシート
CSS スタイルシート
レンダラー
スタイルシートのセマンティクスを解釈し、それを使用する 文書をレンダリングする UA
オーサリングツール
スタイルシートを記述する UA

スタイルシートは、 このモジュールで定義された構文を使用するすべての記述が、汎用 CSS 文法およびこのモジュールで定義された各 機能の個別の文法に従って妥当である場合、この仕様に適合します。

レンダラーは、 適切な仕様で定義されているとおりにスタイルシートを 解釈することに加えて、この仕様で定義されたすべての機能を、 正しく解析し、それに応じて文書をレンダリングすることによって サポートする場合、この仕様に適合します。ただし、デバイスの制限により UA が文書を正しくレンダリングできないことによって、 UA が不適合になることはありません。(たとえば、UA は モノクロモニター上で色をレンダリングする必要はありません。)

オーサリングツールは、 汎用 CSS 文法およびこのモジュール内の各機能の 個別の文法に従って構文的に正しいスタイルシートを記述し、 このモジュールで説明されているスタイルシートのその他すべての適合要件を 満たす場合、この仕様に適合します。

部分的な実装

作者が前方互換の解析規則を利用して フォールバック値を指定できるようにするため、CSS レンダラーは、使用可能なレベルの サポートを持たないすべての at-rule、プロパティ、プロパティ値、キーワード、 およびその他の構文構造を無効として扱い(必要に応じて無視 しなければなりません。特に、ユーザーエージェントは、 単一の複数値プロパティ宣言において、サポートされていない コンポーネント値だけを選択的に無視し、サポートされている値を有効にしてはなりません。 いずれかの値が無効と見なされる場合 (サポートされていない値は無効と見なされなければなりません)、CSS では宣言全体を 無視する必要があります。

不安定な機能および 独自機能の実装

将来の安定した CSS 機能との衝突を避けるため、 CSSWG は、CSS の不安定な機能および独自拡張を実装する際に、ベストプラクティスに従うことを 推奨します。

非実験的な実装

仕様が勧告候補の段階に達すると、 非実験的な実装が可能になり、実装者は、仕様に従って 正しく実装されていることを実証できる任意の CR レベルの機能について、 接頭辞なしの実装をリリースするべきです。

実装間での CSS の相互運用性を確立し維持するため、 CSS ワーキンググループは、非実験的な CSS レンダラーに対し、CSS 機能の接頭辞なしの実装を リリースする前に、実装報告書(および必要に応じて、その 実装報告書に使用したテストケース)を W3C に提出するよう求めています。 W3C に提出されたテストケースは、CSS ワーキンググループによるレビューおよび修正の対象となります。

テストケースおよび実装報告書の提出に関する詳細情報は、 CSS ワーキンググループの Web サイト https://www.w3.org/Style/CSS/Test/ で確認できます。 質問は、public-css-testsuite@w3.org メーリング リストに送信してください。

索引

この仕様で定義される 用語

参照によって定義される 用語

参考文献

規範的参考文献

[CSS-FONT-LOADING-3]
Tab Atkins Jr.. CSS フォント読み込みモジュール レベル 3. 2014年5月22日. WD. URL: https://www.w3.org/TR/css-font-loading-3/
[CSS-FONTS-3]
John Daggett; Myles Maxfield; Chris Lilley. CSS フォント モジュール レベル 3. 2018年9月20日. REC. URL: https://www.w3.org/TR/css-fonts-3/
[CSS-FONTS-4]
John Daggett; Myles Maxfield; Chris Lilley. CSS フォント モジュール レベル 4. 2021年12月21日. WD. URL: https://www.w3.org/TR/css-fonts-4/
[CSS-FONTS-5]
Myles Maxfield; Chris Lilley. CSS フォントモジュール レベル 5. 2021年12月21日. WD. URL: https://www.w3.org/TR/css-fonts-5/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS 構文モジュール レベル 3. 2021年12月24日. CR. URL: https://www.w3.org/TR/css-syntax-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 値と単位 モジュール レベル 4. 2022年10月19日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSSOM-1]
Daniel Glazman; Emilio Cobos Álvarez. CSS オブジェクトモデル (CSSOM). 2021年8月26日. WD. URL: https://www.w3.org/TR/cssom-1/
[DOM]
Anne van Kesteren. DOM 標準. 現行標準. URL: https://dom.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML 標準. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
S. Bradner. 要件レベルを示すために RFC で使用する キーワード. 1997年3月. 現行のベストプラクティス. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 標準. 現行 標準. URL: https://webidl.spec.whatwg.org/

IDL 索引

typedef (ArrayBuffer or ArrayBufferView) BinaryData;

dictionary FontFaceDescriptors {
  CSSOMString style = "normal";
  CSSOMString weight = "normal";
  CSSOMString stretch = "normal";
  CSSOMString unicodeRange = "U+0-10FFFF";
  CSSOMString variant = "normal";
  CSSOMString featureSettings = "normal";
  CSSOMString variationSettings = "normal";
  CSSOMString display = "auto";
  CSSOMString ascentOverride = "normal";
  CSSOMString descentOverride = "normal";
  CSSOMString lineGapOverride = "normal";
};

enum FontFaceLoadStatus { "unloaded", "loading", "loaded", "error" };

[Exposed=(Window,Worker)]
interface FontFace {
  constructor(CSSOMString family, (CSSOMString or BinaryData) source,
                optional FontFaceDescriptors descriptors = {});
  attribute CSSOMString family;
  attribute CSSOMString style;
  attribute CSSOMString weight;
  attribute CSSOMString stretch;
  attribute CSSOMString unicodeRange;
  attribute CSSOMString variant;
  attribute CSSOMString featureSettings;
  attribute CSSOMString variationSettings;
  attribute CSSOMString display;
  attribute CSSOMString ascentOverride;
  attribute CSSOMString descentOverride;
  attribute CSSOMString lineGapOverride;

  readonly attribute FontFaceLoadStatus status;

  Promise<FontFace> load();
  readonly attribute Promise<FontFace> loaded;
};

[Exposed=(Window,Worker)]
interface FontFaceFeatures {
  /* CSSWG では、ここに何を含めるかについてまだ議論中です */
};

[Exposed=(Window,Worker)]
interface FontFaceVariationAxis {
  readonly attribute DOMString name;
  readonly attribute DOMString axisTag;
  readonly attribute double minimumValue;
  readonly attribute double maximumValue;
  readonly attribute double defaultValue;
};

[Exposed=(Window,Worker)]
interface FontFaceVariations {
  readonly setlike<FontFaceVariationAxis>;
};

[Exposed=(Window,Worker)]
interface FontFacePalette {
  iterable<DOMString>;
  readonly attribute unsigned long length;
  getter DOMString (unsigned long index);
  readonly attribute boolean usableWithLightBackground;
  readonly attribute boolean usableWithDarkBackground;
};

[Exposed=(Window,Worker)]
interface FontFacePalettes {
  iterable<FontFacePalette>;
  readonly attribute unsigned long length;
  getter FontFacePalette (unsigned long index);
};

partial interface FontFace {
  readonly attribute FontFaceFeatures features;
  readonly attribute FontFaceVariations variations;
  readonly attribute FontFacePalettes palettes;
};

dictionary FontFaceSetLoadEventInit : EventInit {
  sequence<FontFace> fontfaces = [];
};

[Exposed=(Window,Worker)]
interface FontFaceSetLoadEvent : Event {
  constructor(CSSOMString type, optional FontFaceSetLoadEventInit eventInitDict = {});
  [SameObject] readonly attribute FrozenArray<FontFace> fontfaces;
};

enum FontFaceSetLoadStatus { "loading", "loaded" };

[Exposed=(Window,Worker)]
interface FontFaceSet : EventTarget {
  constructor(sequence<FontFace> initialFaces);

  setlike<FontFace>;
  FontFaceSet add(FontFace font);
  boolean delete(FontFace font);
  undefined clear();

  // 読み込み状態が変化したときのイベント
  attribute EventHandler onloading;
  attribute EventHandler onloadingdone;
  attribute EventHandler onloadingerror;

  // 必要に応じて読み込みを確認し、開始する
  // すべての読み込みが完了したときに Promise を履行する
  Promise<sequence<FontFace>> load(CSSOMString font, optional CSSOMString text = " ");

  // fontlist 内のすべてのフォントが読み込み済みかどうかを返す
  // (利用できない場合でも読み込みは開始しない)
  boolean check(CSSOMString font, optional CSSOMString text = " ");

  // フォント読み込みとレイアウト操作が完了したことを非同期で通知する
  readonly attribute Promise<FontFaceSet> ready;

  // 読み込み状態。1 つ以上のフォントが読み込み中なら "loading"、それ以外は "loaded"
  readonly attribute FontFaceSetLoadStatus status;
};

interface mixin FontFaceSource {
  readonly attribute FontFaceSet fonts;
};

Document includes FontFaceSource;
WorkerGlobalScope includes FontFaceSource;

Issue 索引

この仕様では、動作を定義するために通常の ES オブジェクトを使用している箇所がいくつかあります。 たとえば、内部で Promise を使用するさまざまな箇所や、 内部で Set を使用する FontFaceSet などです。 ここでの意図は、これらのオブジェクト (およびそのプロトタイプチェーン)が変更されていない初期状態であり、 作者が行ったいかなる操作にも影響されないことだと考えています。 これは適切な意図でしょうか? もしそうなら、この仕様ではどのように示すべきでしょうか?
オブジェクトは文書間を移動できるため、どの文書を参照しているのかが明確になるよう、 "the document" へのすべての言及を明確化する必要があります。
相対 URL を解決できるように、 ベース URL を定義する必要があります。 文書の URL にすべきでしょうか? これは Worker に対しても正しいでしょうか。 それとも Worker 自身の URL を使用すべきでしょうか? それは常に定義されているでしょうか?
FontFace が文書間で転送されると、CSS 接続済みではなくなります。