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, causing a regression test `ComponentLeakTest` failure so for DWF tests: before fix: Dialog native activation after Frame closes → after fix: restore Java focus to Window FWD tests: before fix: Frame native activation after Dialog closes -> restore Java focus to Window CI testing is good. --------- - [x] I confirm that I make this contribution in accordance with the [OpenJDK Interim AI Policy](https://openjdk.org/legal/ai). ------------- Commit messages: - 8196432: Many ModalFocusTransfer tests fail on Linux and macOS Changes: https://git.openjdk.org/jdk/pull/32831/files Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=32831&range=00 Issue: https://bugs.openjdk.org/browse/JDK-8196432 Stats: 88 lines in 2 files changed: 66 ins; 22 del; 0 mod Patch: https://git.openjdk.org/jdk/pull/32831.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/32831/head:pull/32831 PR: https://git.openjdk.org/jdk/pull/32831
