On Fri, 11 Sep 2026 05:28:16 GMT, Prasanta Sadhukhan <[email protected]> wrote:
> Few ModalFocusTransferTests tests were failing in macos due to focus not > coming back to expected component. > The `FocusTransferDWFDocModalTest, FocusTransferDWFModelessTest, > FocusTransferDWFNonModalTest` > tests opens in this sequence Dialog → Window → Frame (DWF) and when Frame > closes, > it expects the focus to come back to Window but it goes back to Dialog. > It does not seem to be timing failures as waiting longer in the test doesn't > fix this. > The tests expose a macOS AWT focus-model gap for java.awt.Window. > On macOS, an ordinary Window is treated as a “simple window” > https://github.com/openjdk/jdk/blob/7f068889b2d65a5ae2e10124da0f79eb20067521/src/java.desktop/macosx/classes/sun/lwawt/LWWindowPeer.java#L1304-L1306 > A simple Window is deliberately not made the native macOS key window. > Instead, AWT gives native focus to its nearest Frame or Dialog owner, then > synthesizes Java-level focus events for the Window > > When Frame closes, AppKit activates the native Dialog and > `LWWindowPeer.notifyActivation()` translated that Java focus for the Dialog. > But the logical previous focused window was the Window, so its Open button > never regained focus. > > The same issue occurs in the Frame → Window → Dialog (FWD) tests which are > `FocusTransferFWDAppModal*Test, FocusTransferFWDDocModal*Test, > FocusTransferFWDModeless*Test and FocusTransferFWDNonModal*Test` > The native Frame is reactivated after the Dialog closes, but Java focus > should return to the intermediate Window. > > As mentioned, waiting longer in the test doesn't fix this...the wrong Java > focused window is selected deterministically after the native activation > event. > > I tried with a native Cocoa program mimicking Dialog->Window->Frame opening > testing which component regains focus when Frame is closed and it turns out > to be Window unlike Java's Dialog so it is a product issue. > > A product fix is done so that it preserves the existing macOS design—an AWT > Window is still not made natively focusable. > Instead it restores the correct Java-level focus history > When a native Frame or Dialog gains focus while a simple Window has Java > focus, it records that Window as its possible restore target > When the simple Window’s nearest native owner becomes active, > AWT restores Java focus to the remembered Window, but only when it is still > visible, focusable, and unblocked. > > The static handoff reference is made WeakReference as > a strong static reference retained a disposed peer, which retained its > MainFrame and all child components,... This pull request has now been integrated. Changeset: e07fcffc Author: Prasanta Sadhukhan <[email protected]> URL: https://git.openjdk.org/jdk/commit/e07fcffc4b4e1cb0c35be8c4e5ef7965b059bd55 Stats: 128 lines in 2 files changed: 106 ins; 22 del; 0 mod 8196432: Many ModalFocusTransfer tests fail on Linux and macOS Reviewed-by: azvegint, kizune ------------- PR: https://git.openjdk.org/jdk/pull/32831
