8059739: Dragged and Dropped data is corrupted for two data types

Reviewed-by: serb, pchelko
This commit is contained in:
Anton Nashatyrev 2014-11-14 17:53:46 +03:00
parent 24c525eb11
commit 5b4a9bc976
2 changed files with 93 additions and 2 deletions

View File

@ -24,6 +24,8 @@
*/
package javax.swing.plaf.basic;
import sun.datatransfer.DataFlavorUtil;
import java.io.*;
import java.awt.datatransfer.*;
import javax.swing.plaf.UIResource;
@ -145,7 +147,7 @@ class BasicTransferable implements Transferable, UIResource {
} else if (Reader.class.equals(flavor.getRepresentationClass())) {
return new StringReader(data);
} else if (InputStream.class.equals(flavor.getRepresentationClass())) {
return new StringBufferInputStream(data);
return createInputStream(flavor, data);
}
// fall through to unsupported
} else if (isPlainFlavor(flavor)) {
@ -156,7 +158,7 @@ class BasicTransferable implements Transferable, UIResource {
} else if (Reader.class.equals(flavor.getRepresentationClass())) {
return new StringReader(data);
} else if (InputStream.class.equals(flavor.getRepresentationClass())) {
return new StringBufferInputStream(data);
return createInputStream(flavor, data);
}
// fall through to unsupported
@ -168,6 +170,15 @@ class BasicTransferable implements Transferable, UIResource {
throw new UnsupportedFlavorException(flavor);
}
private InputStream createInputStream(DataFlavor flavor, String data)
throws IOException, UnsupportedFlavorException {
String cs = DataFlavorUtil.getTextCharset(flavor);
if (cs == null) {
throw new UnsupportedFlavorException(flavor);
}
return new ByteArrayInputStream(data.getBytes(cs));
}
// --- richer subclass flavors ----------------------------------------------
protected boolean isRicherFlavor(DataFlavor flavor) {

View File

@ -0,0 +1,80 @@
/*
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* @test
@bug 8059739
@summary Dragged and Dropped data is corrupted for two data types
@author Anton Nashatyrev
*/
import javax.swing.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
public class bug8059739 {
private static boolean passed = true;
public static void main(String[] args) throws Exception {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
try {
runTest();
} catch (Exception e) {
e.printStackTrace();
passed = false;
}
}
});
if (!passed) {
throw new RuntimeException("Test FAILED.");
} else {
System.out.println("Passed.");
}
}
private static void runTest() throws Exception {
String testString = "my string";
JTextField tf = new JTextField(testString);
tf.selectAll();
Clipboard clipboard = new Clipboard("clip");
tf.getTransferHandler().exportToClipboard(tf, clipboard, TransferHandler.COPY);
DataFlavor[] dfs = clipboard.getAvailableDataFlavors();
for (DataFlavor df: dfs) {
String charset = df.getParameter("charset");
if (InputStream.class.isAssignableFrom(df.getRepresentationClass()) &&
charset != null) {
BufferedReader br = new BufferedReader(new InputStreamReader(
(InputStream) clipboard.getData(df), charset));
String s = br.readLine();
System.out.println("Content: '" + s + "'");
passed &= s.contains(testString);
}
}
}
}