Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 518a56e28159e7a05b0a2314d7bc69f4a468a93a
https://github.com/WebKit/WebKit/commit/518a56e28159e7a05b0a2314d7bc69f4a468a93a
Author: Basuke Suzuki <[email protected]>
Date: 2026-04-07 (Tue, 07 Apr 2026)
Changed paths:
M LayoutTests/http/wpt/navigation-api/transition-promises.html
A
LayoutTests/imported/w3c/web-platform-tests/navigation-api/ordering-and-transition/navigate-intercept-microtask-depth.html
A
LayoutTests/imported/w3c/web-platform-tests/navigation-api/ordering-and-transition/navigate-intercept-microtask-depth_currententrychange-expected.txt
A
LayoutTests/imported/w3c/web-platform-tests/navigation-api/ordering-and-transition/navigate-intercept-microtask-depth_no-currententrychange-expected.txt
M Source/WebCore/loader/NavigationScheduler.cpp
M Source/WebCore/page/Navigation.cpp
Log Message:
-----------
[Navigation API] Fix handler promise completion timing to use microtask
instead of task
https://bugs.webkit.org/show_bug.cgi?id=311298
rdar://173890874
Reviewed by Anne van Kesteren.
The Navigation API's innerDispatchNavigateEvent() wrapped waitForAllPromises()
in queueTask(DOMManipulation) — a task. The spec's inner navigate event
firing algorithm uses "wait for all" which attaches reactions via
PerformPromiseThen (microtasks), meaning navigatesuccess/navigateerror should
fire within the same microtask checkpoint, not deferred to a separate task.
Replace the queueTask wrapper with a PromiseSettlementObserver class that
implements "wait for all" — creates a DeferredPromise wrapper, resolves/rejects
it when handler promises settle, and chains the navigation completion logic via
whenSettledWithResult on the wrapper promise. This fires
navigatesuccess/navigateerror at the correct microtask depth, matching Chrome's
behavior.
Also fix transition-promises.html to properly handle promise rejection chains
and verify error object identity.
Test:
imported/w3c/web-platform-tests/navigation-api/ordering-and-transition/navigate-intercept-microtask-depth.html
* LayoutTests/http/wpt/navigation-api/transition-promises.html:
*
LayoutTests/imported/w3c/web-platform-tests/navigation-api/ordering-and-transition/navigate-intercept-microtask-depth.html:
Added.
*
LayoutTests/imported/w3c/web-platform-tests/navigation-api/ordering-and-transition/navigate-intercept-microtask-depth_currententrychange-expected.txt:
Added.
*
LayoutTests/imported/w3c/web-platform-tests/navigation-api/ordering-and-transition/navigate-intercept-microtask-depth_no-currententrychange-expected.txt:
Added.
* Source/WebCore/loader/NavigationScheduler.cpp:
(WebCore::NavigationScheduler::scheduleLocationChange):
* Source/WebCore/page/Navigation.cpp:
(WebCore::createDOMPromise):
(WebCore::PromiseSettlementObserver::create):
(WebCore::PromiseSettlementObserver::waitForAllPromises):
(WebCore::PromiseSettlementObserver::PromiseSettlementObserver):
(WebCore::PromiseSettlementObserver::isWaiting const):
(WebCore::PromiseSettlementObserver::isSettled const):
(WebCore::PromiseSettlementObserver::resolve):
(WebCore::PromiseSettlementObserver::reject):
(WebCore::PromiseSettlementObserver::handleResult):
(WebCore::PromiseSettlementObserver::registerPromise):
(WebCore::PromiseSettlementObserver::consumeWrapper):
(WebCore::Navigation::handleSameDocumentNavigation):
(WebCore::AwaitingPromiseData::AwaitingPromiseData): Deleted.
(WebCore::waitForAllPromises): Deleted.
Canonical link: https://commits.webkit.org/310748@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications