> 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,...
Prasanta Sadhukhan has updated the pull request incrementally with one additional commit since the last revision: Use Lock, remove static and make it per-peer state ------------- Changes: - all: https://git.openjdk.org/jdk/pull/32831/files - new: https://git.openjdk.org/jdk/pull/32831/files/48b449c0..a940cd36 Webrevs: - full: https://webrevs.openjdk.org/?repo=jdk&pr=32831&range=01 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=32831&range=00-01 Stats: 86 lines in 1 file changed: 49 ins; 12 del; 25 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
