On Fri, 10 Nov 2023 21:26:21 GMT, Sergey Bylokhov <[email protected]> wrote:
>> It can be null if the NSApplication was created by code outside of AWT. >> Specifically, in the case of an FX or SWT toolkit, but in theory a native >> application using JAWT could do this. >> >> In practice, since we haven't even seen a crash as a result of this, I doubt >> that this code is ever called if AWT isn't running the event loop and hasn't >> installed their delegate. > > To access any native code in AWT the app should initially init the LWCToolkit > which sets that application delegate if it is not set already. Do we know how > the FX can bypass that initialization? @mrserb Shared delegate can be null if it is not installed when one of following conditions is met [ApplicationDelegate.m](https://github.com/openjdk/jdk/blob/5493f5f92d569d8e94d1f271480f11c48257e896/src/java.desktop/macosx/native/libawt_lwawt/awt/ApplicationDelegate.m#L118C4-L128C33) which is currently the case for Swing components embedded in FX window. With https://github.com/openjdk/jfx/pull/1280 JavaFX NSApp is no longer of type NSApp, it is of type NSAppFX and considering the scenario - Swing components embedded in FX window, we hit the case where sharedDelegate is null at places where null checks have been added. BOOL shouldInstall = NO; BOOL overrideDelegate = (getenv("AWT_OVERRIDE_NSDELEGATE") != NULL); if (NSApp != nil) { if ([NSApp isMemberOfClass:[NSApplication class]] && overrideDelegate) shouldInstall = YES; if ([NSApp isKindOfClass:[NSApplicationAWT class]]) shouldInstall = YES; } checked = YES; if (!shouldInstall) return nil; sApplicationDelegate = [[ApplicationDelegate alloc] init]; return sApplicationDelegate; ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/16569#discussion_r1399559545
