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