RFR: 8314498: [macos] Transferring File objects to Finder fails

Arik Hadas duke at openjdk.org
Fri Sep 29 09:41:24 UTC 2023


Credit goes to JetBrain that fixed it in JetBrainsRuntime (commit 24819d9). This fix was also cherry-picked to muCommander and was verified on macOS 12.6.8 and macOs 13, on X86_64 and on M1.

Reproducer/step-to-verify:
1. Compile the following class:

import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;

public class Arik {

    public static void main(String[] args) throws IOException, UnsupportedFlavorException {
        System.out.println("copying a file to the clipboard2");
        var path = Files.createTempFile(null, null);
        Files.writeString(path.toAbsolutePath(), "test");
        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new MyTransferable(path), null);
        try {
            Thread.sleep(Long.MAX_VALUE);
        } catch (InterruptedException e) {
        }
    }

    public static class MyTransferable implements Transferable {
        private Path path;

        MyTransferable(Path path) {
            this.path = path;
        }

        @Override
        public DataFlavor[] getTransferDataFlavors() {
            return new DataFlavor[] { DataFlavor.javaFileListFlavor };
        }

        @Override
        public boolean isDataFlavorSupported(DataFlavor flavor) {
            return flavor.equals(DataFlavor.javaFileListFlavor);
        }

        @Override
        public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
            return Arrays.asList(path.toFile());
        }
        
    }
}

2. Run the compiled class using current JRE (`java Arik`)
3. Switch to Finder and check the content of the clipboard (`Edit -> Show Clipboard`)
4. Verify you see "Cliboard contents: unknown" as in the following screenshot:
<img width="479" alt="clipboard-before" src="https://github.com/openjdk/jdk/assets/6020068/71d29b2e-209f-4445-a1e0-ecb3fc3e388b">

5. Verify you cannot paste the content of the clipboard to Finder (`Edit -> Paste` is disabled)
6. Run the compiled class using JRE that includes this change (`java Arik`)
7. 3. Switch to Finder and check the content of the clipboard (`Edit -> Show Clipboard`)
8. Verify you see "Cliboard contents: file URL / items" as in the following screenshot:
<img width="479" alt="clipboard-after" src="https://github.com/openjdk/jdk/assets/6020068/242dbd31-b96d-4683-95c1-af87b209e2cf">

9. Paste the content of the clipboard into Finder
10. Verify the pasted item is a text file that includes the text `test`

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

Commit messages:
 - 8314498: [macos] provide writeObjects implementation for copying to Finder

Changes: https://git.openjdk.org/jdk/pull/15980/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=15980&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8314498
  Stats: 47 lines in 2 files changed: 46 ins; 0 del; 1 mod
  Patch: https://git.openjdk.org/jdk/pull/15980.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/15980/head:pull/15980

PR: https://git.openjdk.org/jdk/pull/15980


More information about the client-libs-dev mailing list