Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 2b96b320a28ffc4afb62c90b2e989f1049623194
https://github.com/WebKit/WebKit/commit/2b96b320a28ffc4afb62c90b2e989f1049623194
Author: Tyler Wilcock <[email protected]>
Date: 2026-08-10 (Mon, 10 Aug 2026)
Changed paths:
A
LayoutTests/accessibility/ios-simulator/aria-notify-translated-expected.txt
A LayoutTests/accessibility/ios-simulator/aria-notify-translated.html
A LayoutTests/accessibility/mac/aria-notify-translated-expected.txt
A LayoutTests/accessibility/mac/aria-notify-translated.html
A
LayoutTests/accessibility/mac/aria-notify-translation-dropped-handler-expected.txt
A LayoutTests/accessibility/mac/aria-notify-translation-dropped-handler.html
A LayoutTests/accessibility/mac/aria-notify-translation-failure-expected.txt
A LayoutTests/accessibility/mac/aria-notify-translation-failure.html
A
LayoutTests/accessibility/mac/aria-notify-translation-late-reply-expected.txt
A LayoutTests/accessibility/mac/aria-notify-translation-late-reply.html
A
LayoutTests/accessibility/mac/aria-notify-translation-not-active-expected.txt
A LayoutTests/accessibility/mac/aria-notify-translation-not-active.html
A
LayoutTests/accessibility/mac/aria-notify-translation-ordering-expected.txt
A LayoutTests/accessibility/mac/aria-notify-translation-ordering.html
A LayoutTests/accessibility/mac/aria-notify-translation-timeout-expected.txt
A LayoutTests/accessibility/mac/aria-notify-translation-timeout.html
A
LayoutTests/accessibility/mac/live-regions/live-region-translated-expected.txt
A LayoutTests/accessibility/mac/live-regions/live-region-translated.html
M Source/WebCore/accessibility/AXLiveRegionManager.cpp
M Source/WebCore/accessibility/AXObjectCache.cpp
M Source/WebCore/accessibility/AXObjectCache.h
M Source/WebCore/editing/TextManipulationController.cpp
M Source/WebCore/page/ChromeClient.h
M Source/WebCore/page/Page.cpp
M Source/WebCore/page/Page.h
M Source/WebCore/page/PageConfiguration.h
M Source/WebCore/testing/Internals.cpp
M Source/WebCore/testing/Internals.h
M Source/WebCore/testing/Internals.idl
M Source/WebKit/Headers.cmake
M Source/WebKit/Modules/OSX_Private.modulemap
M Source/WebKit/Modules/iOS_Private.modulemap
M Source/WebKit/PlatformCocoa.cmake
M Source/WebKit/Shared/WebPageCreationParameters.h
M Source/WebKit/Shared/WebPageCreationParameters.serialization.in
M Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm
M Source/WebKit/UIProcess/API/Cocoa/WKWebViewInternal.h
M Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h
A Source/WebKit/UIProcess/API/Cocoa/_WKTranslationDelegate.h
M Source/WebKit/UIProcess/Cocoa/PageClientImplCocoa.h
M Source/WebKit/UIProcess/Cocoa/PageClientImplCocoa.mm
M Source/WebKit/UIProcess/PageClient.h
M Source/WebKit/UIProcess/WebPageProxy.cpp
M Source/WebKit/UIProcess/WebPageProxy.h
M Source/WebKit/UIProcess/WebPageProxy.messages.in
M Source/WebKit/UIProcess/WebPageProxyInternals.h
M Source/WebKit/WebKit.xcodeproj/project.pbxproj
M Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp
M Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.h
M Source/WebKit/WebProcess/WebPage/WebPage.cpp
M Source/WebKit/WebProcess/WebPage/WebPage.h
M Source/WebKit/WebProcess/WebPage/WebPage.messages.in
M Tools/TestWebKitAPI/SourcesCocoa.txt
A
Tools/TestWebKitAPI/Tests/WebKit/WKWebView/AccessibilityAnnouncementTranslation.mm
M Tools/WebKitTestRunner/TestOptions.cpp
M Tools/WebKitTestRunner/TestOptions.h
M Tools/WebKitTestRunner/cocoa/TestControllerCocoa.mm
M Tools/WebKitTestRunner/cocoa/TestRunnerWKWebView.h
M Tools/WebKitTestRunner/cocoa/TestRunnerWKWebView.mm
Log Message:
-----------
AX: Translate accessibility announcements (ARIA Notify, live regions) when
the page is presented as a machine translation
https://bugs.webkit.org/show_bug.cgi?id=321206
rdar://184264303
Reviewed by Dominic Mazzoni.
Core-AAM adds a normative requirement that when a user agent presents a
document as a machine
translation, it must translate ariaNotify() and live region announcements
before handing it to
the platform, so that assistive technology conveys it in the language that is
visually presented.
WebKit did not do this. Safari translates a page by rewriting the DOM through
the text manipulation
SPI, which cannot reach either case. ariaNotify() strings come from script and
never enter the DOM,
and a live region announcement is computed from the DOM and posted on a
zero-delay timer, before the
translation round trip replaces the text. The result was announcements spoken
in the original
language, and live regions spoken twice.
Announcements are now held in a FIFO queue in AXObjectCache while the embedder
is asked to translate
them, through a new _WKTranslationDelegate. WebKit cannot translate text
itself, instead relying on
TranslationUIServices, allowing the client to supply it. The client also tells
WebKit it's presenting
a translation by setting -_displayedTranslationLocaleIdentifier. With no locale
set, the behavior is
unchanged.
Ordering and failure handling are the substance of the change. Translation
requests are issued immediately and
in parallel, but announcements are released strictly in the order they were
produced, so a slow
translation cannot let a later announcement overtake an earlier one. Each entry
has a 250ms deadline,
after which the original text is announced in its original language, preventing
a stalled or unavailable
translation service from blocking announcements outright. A translation client
that declines, replies late, or drops
the completion handler entirely degrades the same way.
Finally, TextManipulationController now records the container it rewrites, so
the children-changed
that its own text swap produces does not announce a live region a second time.
* LayoutTests/accessibility/ios-simulator/aria-notify-translated-expected.txt:
Added.
* LayoutTests/accessibility/ios-simulator/aria-notify-translated.html: Added.
* LayoutTests/accessibility/mac/aria-notify-translated-expected.txt: Added.
* LayoutTests/accessibility/mac/aria-notify-translated.html: Added.
*
LayoutTests/accessibility/mac/aria-notify-translation-dropped-handler-expected.txt:
Added.
* LayoutTests/accessibility/mac/aria-notify-translation-dropped-handler.html:
Added.
* LayoutTests/accessibility/mac/aria-notify-translation-failure-expected.txt:
Added.
* LayoutTests/accessibility/mac/aria-notify-translation-failure.html: Added.
*
LayoutTests/accessibility/mac/aria-notify-translation-late-reply-expected.txt:
Added.
* LayoutTests/accessibility/mac/aria-notify-translation-late-reply.html: Added.
*
LayoutTests/accessibility/mac/aria-notify-translation-not-active-expected.txt:
Added.
* LayoutTests/accessibility/mac/aria-notify-translation-not-active.html: Added.
* LayoutTests/accessibility/mac/aria-notify-translation-ordering-expected.txt:
Added.
* LayoutTests/accessibility/mac/aria-notify-translation-ordering.html: Added.
* LayoutTests/accessibility/mac/aria-notify-translation-timeout-expected.txt:
Added.
* LayoutTests/accessibility/mac/aria-notify-translation-timeout.html: Added.
*
LayoutTests/accessibility/mac/live-regions/live-region-translated-expected.txt:
Added.
* LayoutTests/accessibility/mac/live-regions/live-region-translated.html: Added.
* Source/WebCore/accessibility/AXLiveRegionManager.cpp:
(WebCore::AXLiveRegionManager::postAnnouncementForChange):
* Source/WebCore/accessibility/AXObjectCache.cpp:
(WebCore::AXObjectCache::AXObjectCache):
(WebCore::AXObjectCache::~AXObjectCache):
(WebCore::AXObjectCache::handleAllDeferredChildrenChanged):
(WebCore::AXObjectCache::handleChildrenChanged):
(WebCore::announcementTranslationTimeoutOverrideForTesting):
(WebCore::AXObjectCache::setAnnouncementTranslationTimeoutForTesting):
(WebCore::AXObjectCache::announcementTranslationTimeout):
(WebCore::AXObjectCache::translateAnnouncementThenAssemble):
(WebCore::AXObjectCache::deferReRenderedContent):
(WebCore::AXObjectCache::isReRenderedContent const):
(WebCore::AXObjectCache::announcementTranslationDidComplete):
(WebCore::AXObjectCache::flushPendingAnnouncements):
(WebCore::AXObjectCache::scheduleAnnouncementTimeoutTimerIfNeeded):
(WebCore::AXObjectCache::pendingAnnouncementTimeoutTimerFired):
(WebCore::AXObjectCache::postARIANotifyNotification):
* Source/WebCore/accessibility/AXObjectCache.h:
* Source/WebCore/editing/TextManipulationController.cpp:
(WebCore::TextManipulationController::replace):
* Source/WebCore/page/ChromeClient.h:
(WebCore::ChromeClient::translateAccessibilityAnnouncementStrings):
* Source/WebCore/page/Page.cpp:
(WebCore::m_mediaSessionManagerFactory):
(WebCore::Page::setDisplayedTranslationLocaleIdentifier):
* Source/WebCore/page/Page.h:
(WebCore::Page::isPresentingMachineTranslation const):
* Source/WebCore/page/PageConfiguration.h:
* Source/WebCore/testing/Internals.cpp:
(WebCore::Internals::resetToConsistentState):
(WebCore::Internals::setAccessibilityAnnouncementTranslationTimeout):
* Source/WebCore/testing/Internals.h:
* Source/WebCore/testing/Internals.idl:
* Source/WebKit/Headers.cmake:
* Source/WebKit/PlatformCocoa.cmake:
* Source/WebKit/Shared/WebPageCreationParameters.h:
* Source/WebKit/Shared/WebPageCreationParameters.serialization.in:
* Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView
_translateAccessibilityAnnouncementStrings:sourceLocaleIdentifiers:targetLocaleIdentifier:completionHandler:]):
(-[WKWebView _translationDelegate]):
(-[WKWebView _setTranslationDelegate:]):
(-[WKWebView _displayedTranslationLocaleIdentifier]):
(-[WKWebView _setDisplayedTranslationLocaleIdentifier:]):
* Source/WebKit/UIProcess/API/Cocoa/WKWebViewInternal.h:
* Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h:
* Source/WebKit/UIProcess/API/Cocoa/_WKTranslationDelegate.h: Added.
* Source/WebKit/UIProcess/Cocoa/PageClientImplCocoa.h:
* Source/WebKit/UIProcess/Cocoa/PageClientImplCocoa.mm:
(WebKit::PageClientImplCocoa::translateAccessibilityAnnouncementStrings):
* Source/WebKit/UIProcess/PageClient.h:
(WebKit::PageClient::translateAccessibilityAnnouncementStrings):
* Source/WebKit/UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::didCommitLoadForFrame):
(WebKit::WebPageProxy::creationParameters):
(WebKit::WebPageProxy::displayedTranslationLocaleIdentifier const):
(WebKit::WebPageProxy::setDisplayedTranslationLocaleIdentifier):
(WebKit::WebPageProxy::translateAccessibilityAnnouncementStrings):
* Source/WebKit/UIProcess/WebPageProxy.h:
* Source/WebKit/UIProcess/WebPageProxy.messages.in:
* Source/WebKit/UIProcess/WebPageProxyInternals.h:
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:
* Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp:
(WebKit::WebChromeClient::translateAccessibilityAnnouncementStrings):
* Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.h:
* Source/WebKit/WebProcess/WebPage/WebPage.cpp:
(WebKit::m_allowsImmersiveEnvironments):
(WebKit::WebPage::setDisplayedTranslationLocaleIdentifier):
* Source/WebKit/WebProcess/WebPage/WebPage.h:
* Source/WebKit/WebProcess/WebPage/WebPage.messages.in:
* Tools/TestWebKitAPI/SourcesCocoa.txt:
*
Tools/TestWebKitAPI/Tests/WebKit/WKWebView/AccessibilityAnnouncementTranslation.mm:
Added.
(TestWebKitAPI::TEST(AccessibilityAnnouncementTranslation,
DisplayedTranslationLocaleRoundTripsAndResetsOnNavigation)):
* Tools/WebKitTestRunner/TestOptions.cpp:
(WTR::TestOptions::defaults):
(WTR::TestOptions::keyTypeMapping):
* Tools/WebKitTestRunner/TestOptions.h:
(WTR::TestOptions::announcementTranslationMode const):
(WTR::TestOptions::displayedTranslationLocale const):
* Tools/WebKitTestRunner/cocoa/TestControllerCocoa.mm:
(WTR::TestController::finishCreatingPlatformWebView):
* Tools/WebKitTestRunner/cocoa/TestRunnerWKWebView.h:
* Tools/WebKitTestRunner/cocoa/TestRunnerWKWebView.mm:
(-[TestRunnerWKWebView initWithFrame:configuration:]):
(-[TestRunnerWKWebView
_webView:translateAccessibilityAnnouncementStrings:sourceLocaleIdentifiers:targetLocaleIdentifier:completionHandler:]):
Canonical link: https://commits.webkit.org/318920@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications