RFR: 8233955: VM crashes if more than one file are added to ClipboardContent via drag and drop [v4]

Kevin Rushforth kcr at openjdk.org
Wed May 24 12:50:23 UTC 2023


On Tue, 23 May 2023 15:24:55 GMT, Lukasz Kostyra <lkostyra at openjdk.org> wrote:

>> Crashes started happening due to macOS DnD API change from macOS 10.14 onwards. 10.14 incrodues some [DnD constrains](https://developer.apple.com/documentation/macos-release-notes/appkit-release-notes-for-macos-10_14#Drag-and-Drop) which our DnD code happened to trigger on some occasions.
>> 
>> Our code used deprecated `dragImage` API which since 10.14 had new requirement - each NSPasteboard item had to have a corresponding drag image. Not meeting this constraint raised an exception, which crashed the app. Since there was no possibility to add more drag images to `dragImage` API (it only took one NSImage as parameter) the code had to be rewritten - as such I upgraded it to new DnD API utilizing NSDraggingSession and related protocols.
>> 
>> One side-effect of new DnD API is that it now modifies NSPasteboard for us - previous behavior was more "separated" from user code perspective (write items to pasteboard -> initiate a drag via `dragImage`). Manually updating NSPasteboard before calling `beginDraggingSessionWithItems` raised another exception related to NSPasteboard already having DnD-ed elements inside it. Some system tests, however, relied on that behavior and writing to NSPasteboard (`MacPasteboardShim.java` used in some tests creates a `Clipboard.DND` for test purposes). Since this path is in tests I assumed this behavior should stay and tried to make it as close to working as possible. Tests (including those using `MacPasteboardShim`) pass after my changes.
>> 
>> Additionally, added a new manual test based on `DndTest.java` test which creates two temporary files and allows for testing faulty behavior.
>
> Lukasz Kostyra has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Release resources to prevent leaks

Looks good with one (minor) suggested change. I'll do some final testing, then approve.

modules/javafx.graphics/src/main/native-glass/mac/GlassViewDelegate.m line 976:

> 974:         {
> 975:             // create an image with contents of URL
> 976:             NSString *fileURL = [[[NSString alloc] autorelease] initWithData:[pbItem dataForType:NSPasteboardTypeFileURL] encoding:NSUTF8StringEncoding];

Minor: The generally accepted pattern is to call `autorelease` after the `init`, so as to not split `alloc` and `init`, so:


NSString *fileURL = [[[NSString alloc] initWithData:[pbItem dataForType:NSPasteboardTypeFileURL]
    encoding:NSUTF8StringEncoding] autorelease];

modules/javafx.graphics/src/main/native-glass/mac/GlassViewDelegate.m line 990:

> 988:         {
> 989:             // create an image with contents of URL
> 990:             NSString *url = [[[NSString alloc] autorelease] initWithData:[pbItem dataForType:NSPasteboardTypeURL] encoding:NSUTF8StringEncoding];

Same here.

-------------

PR Review: https://git.openjdk.org/jfx/pull/1089#pullrequestreview-1441759447
PR Review Comment: https://git.openjdk.org/jfx/pull/1089#discussion_r1204066972
PR Review Comment: https://git.openjdk.org/jfx/pull/1089#discussion_r1204067377


More information about the openjfx-dev mailing list