1 /* 2 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 @bug 8005932 26 @summary Java 7 on mac os x only provides text clipboard formats 27 @author mikhail.cherkasov@oracle.com 28 @library ../../regtesthelpers 29 @library ../../regtesthelpers/process 30 @build Util 31 @build ProcessResults ProcessCommunicator 32 @run applet/othervm MissedHtmlAndRtfBug.html 33 */ 34 35 import java.awt.*; 36 import java.awt.datatransfer.DataFlavor; 37 import java.awt.event.*; 38 import java.applet.Applet; 39 import java.io.File; 40 import java.util.ArrayList; 41 42 import test.java.awt.regtesthelpers.process.ProcessCommunicator; 43 import test.java.awt.regtesthelpers.process.ProcessResults; 44 import test.java.awt.regtesthelpers.Util; 45 import sun.awt.OSInfo; 46 47 import static java.lang.Thread.sleep; 48 49 public class MissedHtmlAndRtfBug extends Applet { 50 public void init() { 51 setLayout(new BorderLayout()); 52 }//End init() 53 54 public void start() { 55 if (OSInfo.getOSType() != OSInfo.OSType.MACOSX 56 && OSInfo.getOSType() != OSInfo.OSType.WINDOWS) { 57 System.out.println("This test is for Windows and Mac only. Passed."); 58 return; 59 } 60 61 final Frame sourceFrame = new Frame("Source frame"); 62 final SourcePanel sourcePanel = new SourcePanel(); 63 sourceFrame.add(sourcePanel); 64 sourceFrame.pack(); 65 sourceFrame.addWindowListener(new WindowAdapter() { 66 @Override 67 public void windowClosing(WindowEvent e) { 68 sourceFrame.dispose(); 69 } 70 }); 71 sourceFrame.setVisible(true); 72 73 Util.waitForIdle(null); 74 75 NextFramePositionCalculator positionCalculator = new NextFramePositionCalculator(sourceFrame); 76 77 ArrayList<String> args = new ArrayList<String>(5); 78 args.add(String.valueOf(positionCalculator.getNextLocationX())); 79 args.add(String.valueOf(positionCalculator.getNextLocationY())); 80 args.add(String.valueOf(AbsoluteComponentCenterCalculator.calculateXCenterCoordinate(sourcePanel))); 81 args.add(String.valueOf(AbsoluteComponentCenterCalculator.calculateYCenterCoordinate(sourcePanel))); 82 args.add(concatStrings(DataFlavorSearcher.RICH_TEXT_NAMES)); 83 84 ProcessResults processResults = 85 // ProcessCommunicator.executeChildProcess(this.getClass(), "/Users/mcherkasov/ws/clipboard/DataFlover/out/production/DataFlover" + 86 // " -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 ", 87 // args.toArray(new String[0])); 88 ProcessCommunicator.executeChildProcess(this.getClass(), 89 "." + File.separator + System.getProperty("java.class.path"), args.toArray(new String[]{})); 90 91 verifyTestResults(processResults); 92 93 args.set(args.size() - 1, concatStrings(DataFlavorSearcher.HTML_NAMES)); 94 95 ProcessCommunicator.executeChildProcess(this.getClass(), 96 "." + File.separator + System.getProperty("java.class.path"), args.toArray(new String[]{})); 97 verifyTestResults(processResults); 98 99 100 }// start() 101 102 private String concatStrings(String[] strings) { 103 StringBuffer result = new StringBuffer("\""); 104 for (int i = 0; i < strings.length; i++) { 105 result.append(strings[i]); 106 result.append(","); 107 } 108 result.append("\""); 109 return result.toString(); 110 } 111 112 113 private static void verifyTestResults(ProcessResults processResults) { 114 if (InterprocessMessages.DATA_IS_CORRUPTED == 115 processResults.getExitValue()) { 116 processResults.printProcessErrorOutput(System.err); 117 throw new RuntimeException("TEST IS FAILED: Target has received" + 118 " corrupted data."); 119 } 120 processResults.verifyStdErr(System.err); 121 processResults.verifyProcessExitValue(System.err); 122 processResults.printProcessStandartOutput(System.out); 123 } 124 125 //We cannot make an instance of the applet without the default constructor 126 public MissedHtmlAndRtfBug() { 127 super(); 128 } 129 130 //We need in this constructor to pass frame position between JVMs 131 public MissedHtmlAndRtfBug(Point targetFrameLocation, Point dragSourcePoint, DataFlavor df) 132 throws InterruptedException { 133 final Frame targetFrame = new Frame("Target frame"); 134 final TargetPanel targetPanel = new TargetPanel(targetFrame, df); 135 targetFrame.add(targetPanel); 136 targetFrame.addWindowListener(new WindowAdapter() { 137 @Override 138 public void windowClosing(WindowEvent e) { 139 targetFrame.dispose(); 140 } 141 }); 142 targetFrame.setLocation(targetFrameLocation); 143 targetFrame.pack(); 144 targetFrame.setVisible(true); 145 146 doTest(dragSourcePoint, targetPanel); 147 } 148 149 private void doTest(Point dragSourcePoint, TargetPanel targetPanel) { 150 Util.waitForIdle(null); 151 152 final Robot robot = Util.createRobot(); 153 154 robot.mouseMove((int) dragSourcePoint.getX(), (int) dragSourcePoint.getY()); 155 try { 156 sleep(100); 157 robot.mousePress(InputEvent.BUTTON1_MASK); 158 sleep(100); 159 robot.mouseRelease(InputEvent.BUTTON1_MASK); 160 sleep(100); 161 } catch (InterruptedException e) { 162 e.printStackTrace(); 163 } 164 165 Util.drag(robot, dragSourcePoint, new Point(AbsoluteComponentCenterCalculator.calculateXCenterCoordinate(targetPanel), 166 AbsoluteComponentCenterCalculator.calculateYCenterCoordinate(targetPanel)), 167 InputEvent.BUTTON1_MASK); 168 } 169 170 171 enum InterprocessArguments { 172 TARGET_FRAME_X_POSITION_ARGUMENT, 173 TARGET_FRAME_Y_POSITION_ARGUMENT, 174 DRAG_SOURCE_POINT_X_ARGUMENT, 175 DRAG_SOURCE_POINT_Y_ARGUMENT, 176 DATA_FLAVOR_NAMES; 177 178 int extractInt(String[] args) { 179 return Integer.parseInt(args[this.ordinal()]); 180 } 181 182 String[] extractStringArray(String[] args) { 183 return args[this.ordinal()].replaceAll("\"", "").split(","); 184 } 185 } 186 187 public static void main(String[] args) { 188 Point dragSourcePoint = new Point(InterprocessArguments.DRAG_SOURCE_POINT_X_ARGUMENT.extractInt(args), 189 InterprocessArguments.DRAG_SOURCE_POINT_Y_ARGUMENT.extractInt(args)); 190 Point targetFrameLocation = new Point(InterprocessArguments.TARGET_FRAME_X_POSITION_ARGUMENT.extractInt(args), 191 InterprocessArguments.TARGET_FRAME_Y_POSITION_ARGUMENT.extractInt(args)); 192 String[] names = InterprocessArguments.DATA_FLAVOR_NAMES.extractStringArray(args); 193 194 DataFlavor df = DataFlavorSearcher.getByteDataFlavorForNative(names); 195 try { 196 new MissedHtmlAndRtfBug(targetFrameLocation, dragSourcePoint, df); 197 } catch (InterruptedException e) { 198 e.printStackTrace(); 199 } 200 } 201 202 203 }