Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 4058ab9ae8caa5fbd518f6c081c15c6173e94959
      
https://github.com/WebKit/WebKit/commit/4058ab9ae8caa5fbd518f6c081c15c6173e94959
  Author: Simon Fraser <[email protected]>
  Date:   2026-01-09 (Fri, 09 Jan 2026)

  Changed paths:
    M LayoutTests/fast/text/FontFaceSet-status-after-style-update-expected.txt
    M LayoutTests/fast/text/FontFaceSet-status-after-style-update.html
    M LayoutTests/fast/text/css-font-loading-arraybuffer-expected.txt
    M LayoutTests/fast/text/css-font-loading-arraybuffer.html
    M LayoutTests/fast/text/font-face-set-javascript.html
    M LayoutTests/fast/text/font-loading-multiple-documents.html
    M LayoutTests/fast/text/font-loading-multiple-sets.html
    A 
LayoutTests/imported/w3c/web-platform-tests/css/css-font-loading/fontface-loading-events-expected.txt
    A 
LayoutTests/imported/w3c/web-platform-tests/css/css-font-loading/fontface-loading-events-font-from-arraybuffer-expected.txt
    A 
LayoutTests/imported/w3c/web-platform-tests/css/css-font-loading/fontface-loading-events-font-from-arraybuffer.html
    A 
LayoutTests/imported/w3c/web-platform-tests/css/css-font-loading/fontface-loading-events.html
    M 
LayoutTests/imported/w3c/web-platform-tests/css/css-font-loading/fontface-loadingevent-expected.txt
    M 
LayoutTests/imported/w3c/web-platform-tests/css/css-font-loading/fontface-loadingevent.html
    A 
LayoutTests/imported/w3c/web-platform-tests/css/css-font-loading/fontfaceset-add-css-connected-expected.txt
    M 
LayoutTests/imported/w3c/web-platform-tests/css/css-font-loading/fontfacesetloadevent-constructor-expected.txt
    M 
LayoutTests/imported/w3c/web-platform-tests/css/css-font-loading/idlharness.https-expected.txt
    A 
LayoutTests/imported/w3c/web-platform-tests/css/css-font-loading/moving-fontface-between-document-throws.tentative-expected.txt
    A 
LayoutTests/imported/w3c/web-platform-tests/css/css-font-loading/moving-fontface-between-document-throws.tentative.html
    M Source/WebCore/CMakeLists.txt
    M Source/WebCore/DerivedSources-input.xcfilelist
    M Source/WebCore/DerivedSources-output.xcfilelist
    M Source/WebCore/DerivedSources.make
    M Source/WebCore/Modules/mediacontrols/MediaControlsHost.h
    M Source/WebCore/Modules/webauthn/PublicKeyCredentialCreationOptionsJSON.h
    M 
Source/WebCore/SaferCPPExpectations/UncountedLambdaCapturesCheckerExpectations
    M Source/WebCore/Sources.txt
    M Source/WebCore/WebCore.xcodeproj/project.pbxproj
    A Source/WebCore/bindings/js/JSFontFaceSetLoadEventCustom.cpp
    M Source/WebCore/css/CSSFontFace.cpp
    M Source/WebCore/css/CSSFontFace.h
    M Source/WebCore/css/CSSFontFaceSet.cpp
    M Source/WebCore/css/CSSFontFaceSet.h
    M Source/WebCore/css/FontFace.cpp
    M Source/WebCore/css/FontFace.h
    M Source/WebCore/css/FontFaceSet.cpp
    M Source/WebCore/css/FontFaceSet.h
    A Source/WebCore/css/FontFaceSetLoadEvent.cpp
    A Source/WebCore/css/FontFaceSetLoadEvent.h
    A Source/WebCore/css/FontFaceSetLoadEvent.idl
    A Source/WebCore/css/FontFaceSetLoadEventInit.h
    A Source/WebCore/css/FontFaceSetLoadEventInit.idl
    M Source/WebCore/dom/Document.cpp
    M Source/WebCore/dom/EventInterfaces.in

  Log Message:
  -----------
  REGRESSION (301471@main): replay.music.apple.com highlight reels has missing 
assets
https://bugs.webkit.org/show_bug.cgi?id=304091
rdar://166322852

Reviewed by Brent Fulgham and Ryosuke Niwa.

301471@main made FontFaceSet promises work, but broke replay.music.apple.com 
which also requires
`loadingdone` events firing.

To fix this we need to implement more of the CSS Fonts Loading spec, 
specifically firing
`loadingdone` and `loadingerror` events, which has a `fontfaces` property. For 
this we need
an `Event` subclass, and FontFaceSetLoadEventInit per spec, so add IDL and 
implementations
for those. FontFaceSetLoadEvent has `JSCustomMarkFunction` and implements 
`visitAdditionalChildren`
to keep the referenced FontFaces alive.

The spec is rather confused[2] about the timing of event firing, but match the 
other browsers
by firing events before the promise resolves. Because this can happen during 
layout as
a result of font fallback, we need to run both the event dispatch and promise 
resolution
in a queued task. This also requires that `FontFaceSet` maintains the 
LoadingStatus, because
its state changes in queued tasks, which CSSFontFaceSet knows nothing about. 
The status
also depends on the contents of the `loadingFonts` list; `FontFaceSet` now 
maintains
the three font lists per spec.

We now eagerly create FontFace wrappers for CSSFontFace objects, since we add 
them
to the `loading` and `loadingdone` events anyway.

FontFaceSetLoadEvents are treated as opaque roots for GC, so they keep the 
FontFaces alive.

Explicitly prevent FontFaces from moving between documents by throwing a 
`WrongDocumentError`,
since this didn't really work, and it's complex to move the FontFace's Sources 
to the new document
and keep everything working. This follows my proposal in [3], and a tentative 
WPT is added for it.

Implement more of the spec language, around "switch the state to 
loading/loaded",
and "stuck on the environment". fast/text/font-loading-multiple-sets.html needs 
to work
around webkit.org/b/304381 to avoid remaining stuck.

Add a test which loads a font from an ArrayBuffer, and fix `FontFace::create()` 
to correctly
queue a task for this, which ensures we fire the loading event, which we did 
not before.

Some of this is based on code written by Frédéric Wang in webkit.org/b/184138.

[1] https://www.w3.org/TR/css-font-loading/
[2] https://github.com/w3c/csswg-drafts/issues/13209
[3] https://github.com/w3c/csswg-drafts/issues/13251

Tests: 
imported/w3c/web-platform-tests/css/css-font-loading/fontface-loading-events-font-from-arraybuffer.html
       
imported/w3c/web-platform-tests/css/css-font-loading/fontface-loading-events.html
       
imported/w3c/web-platform-tests/css/css-font-loading/moving-fontface-between-document-throws.tentative.html

* LayoutTests/fast/text/FontFaceSet-status-after-style-update-expected.txt:
* LayoutTests/fast/text/FontFaceSet-status-after-style-update.html:
* LayoutTests/fast/text/css-font-loading-arraybuffer-expected.txt:
* LayoutTests/fast/text/css-font-loading-arraybuffer.html:
* LayoutTests/fast/text/font-face-set-javascript.html:
* LayoutTests/fast/text/font-loading-multiple-documents.html:
* LayoutTests/fast/text/font-loading-multiple-sets.html:
* 
LayoutTests/imported/w3c/web-platform-tests/css/css-font-loading/fontface-loading-events-expected.txt:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/css/css-font-loading/fontface-loading-events-font-from-arraybuffer-expected.txt:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/css/css-font-loading/fontface-loading-events-font-from-arraybuffer.html:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/css/css-font-loading/fontface-loading-events.html:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/css/css-font-loading/fontface-loadingevent-expected.txt:
* 
LayoutTests/imported/w3c/web-platform-tests/css/css-font-loading/fontface-loadingevent.html:
* 
LayoutTests/imported/w3c/web-platform-tests/css/css-font-loading/fontfaceset-add-css-connected-expected.txt:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/css/css-font-loading/fontfacesetloadevent-constructor-expected.txt:
* 
LayoutTests/imported/w3c/web-platform-tests/css/css-font-loading/idlharness.https-expected.txt:
* 
LayoutTests/imported/w3c/web-platform-tests/css/css-font-loading/moving-fontface-between-document-throws.tentative-expected.txt:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/css/css-font-loading/moving-fontface-between-document-throws.tentative.html:
 Added.
* Source/WebCore/CMakeLists.txt:
* Source/WebCore/DerivedSources-input.xcfilelist:
* Source/WebCore/DerivedSources-output.xcfilelist:
* Source/WebCore/DerivedSources.make:
* Source/WebCore/Modules/mediacontrols/MediaControlsHost.h:
* Source/WebCore/Modules/webauthn/PublicKeyCredentialCreationOptionsJSON.h:
* 
Source/WebCore/SaferCPPExpectations/UncountedLambdaCapturesCheckerExpectations:
* Source/WebCore/Sources.txt:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
* Source/WebCore/bindings/js/JSFontFaceSetLoadEventCustom.cpp: Added.
(WebCore::JSFontFaceSetLoadEvent::visitAdditionalChildren):
* Source/WebCore/css/CSSFontFace.cpp:
(WebCore::CSSFontFace::existingWrapper const):
(WebCore::CSSFontFace::fontLoaded):
(WebCore::CSSFontFace::load):
(WebCore::CSSFontFace::existingWrapper): Deleted.
* Source/WebCore/css/CSSFontFace.h:
* Source/WebCore/css/CSSFontFaceSet.cpp:
(WebCore::CSSFontFaceSet::incrementActiveCount):
(WebCore::CSSFontFaceSet::decrementActiveCount):
(WebCore::CSSFontFaceSet::add):
(WebCore::CSSFontFaceSet::remove):
(WebCore::CSSFontFaceSet::clear):
(WebCore::CSSFontFaceSet::fontStateChanged):
* Source/WebCore/css/CSSFontFaceSet.h:
* Source/WebCore/css/FontFace.cpp:
(WebCore::FontFace::create):
(WebCore::root):
* Source/WebCore/css/FontFace.h:
* Source/WebCore/css/FontFaceSet.cpp:
(WebCore::FontFaceSet::Iterator::Iterator):
(WebCore::FontFaceSet::Iterator::next):
(WebCore::FontFaceSet::PendingPromise::PendingPromise):
(WebCore::FontFaceSet::create):
(WebCore::FontFaceSet::FontFaceSet):
(WebCore::FontFaceSet::setInitialState):
(WebCore::FontFaceSet::documentDidFinishLoading):
(WebCore::FontFaceSet::isPendingOnEnvironment const):
(WebCore::FontFaceSet::stopPendingOnEnvironment):
(WebCore::FontFaceSet::clear):
(WebCore::FontFaceSet::load):
(WebCore::FontFaceSet::faceDidStartLoading):
(WebCore::FontFaceSet::faceDidFinishLoading):
(WebCore::FontFaceSet::didAddFace):
(WebCore::FontFaceSet::didDeletedFace):
(WebCore::FontFaceSet::startedLoading):
(WebCore::FontFaceSet::completedLoading):
(WebCore::FontFaceSet::switchStateToLoading):
(WebCore::FontFaceSet::switchStateToLoaded):
(WebCore::FontFaceSet::status const): Deleted.
(WebCore::FontFaceSet::faceFinished): Deleted.
* Source/WebCore/css/FontFaceSet.h:
* Source/WebCore/css/FontFaceSetLoadEvent.cpp: Added.
(WebCore::FontFaceSetLoadEvent::FontFaceSetLoadEvent):
* Source/WebCore/css/FontFaceSetLoadEvent.h: Added.
* Source/WebCore/css/FontFaceSetLoadEvent.idl:
* Source/WebCore/css/FontFaceSetLoadEventInit.h: Added.
* Source/WebCore/css/FontFaceSetLoadEventInit.idl:
* Source/WebCore/dom/Document.cpp:
(WebCore::Document::implicitClose):
* Source/WebCore/dom/EventInterfaces.in:

Canonical link: https://commits.webkit.org/305367@main



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications

Reply via email to