Skip to content

Commit dba3022

Browse files
committed
8238936: The crash in XRobotPeer when the custom GraphicsDevice is used
Backport-of: 9d0a487
1 parent 1acc508 commit dba3022

File tree

9 files changed

+251
-72
lines changed

9 files changed

+251
-72
lines changed

src/java.desktop/macosx/classes/sun/lwawt/macosx/CRobot.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727

2828
import java.awt.Point;
2929
import java.awt.Rectangle;
30-
import java.awt.Robot;
3130
import java.awt.peer.RobotPeer;
3231

3332
import sun.awt.CGraphicsDevice;
@@ -49,7 +48,7 @@ final class CRobot implements RobotPeer {
4948
* Uses the given GraphicsDevice as the coordinate system for subsequent
5049
* coordinate calls.
5150
*/
52-
public CRobot(Robot r, CGraphicsDevice d) {
51+
CRobot(CGraphicsDevice d) {
5352
fDevice = d;
5453
initRobot();
5554
}

src/java.desktop/macosx/classes/sun/lwawt/macosx/LWCToolkit.java

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2011, 2020, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,7 @@
2626
package sun.lwawt.macosx;
2727

2828
import java.awt.AWTError;
29+
import java.awt.AWTException;
2930
import java.awt.CheckboxMenuItem;
3031
import java.awt.Color;
3132
import java.awt.Component;
@@ -49,7 +50,6 @@
4950
import java.awt.Point;
5051
import java.awt.PopupMenu;
5152
import java.awt.RenderingHints;
52-
import java.awt.Robot;
5353
import java.awt.SystemTray;
5454
import java.awt.Taskbar;
5555
import java.awt.Toolkit;
@@ -499,8 +499,11 @@ public void sync() {
499499
}
500500

501501
@Override
502-
public RobotPeer createRobot(Robot target, GraphicsDevice screen) {
503-
return new CRobot(target, (CGraphicsDevice)screen);
502+
public RobotPeer createRobot(GraphicsDevice screen) throws AWTException {
503+
if (screen instanceof CGraphicsDevice) {
504+
return new CRobot((CGraphicsDevice) screen);
505+
}
506+
return super.createRobot(screen);
504507
}
505508

506509
private native boolean isCapsLockOn();

src/java.desktop/share/classes/java/awt/Robot.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ private void init(GraphicsDevice screen) throws AWTException {
136136
checkRobotAllowed();
137137
Toolkit toolkit = Toolkit.getDefaultToolkit();
138138
if (toolkit instanceof ComponentFactory) {
139-
peer = ((ComponentFactory)toolkit).createRobot(this, screen);
139+
peer = ((ComponentFactory)toolkit).createRobot(screen);
140140
}
141141
initLegalButtonMask();
142142
}

src/java.desktop/share/classes/sun/awt/ComponentFactory.java

+63-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -25,12 +25,60 @@
2525

2626
package sun.awt;
2727

28-
import java.awt.peer.TaskbarPeer;
29-
import java.awt.*;
28+
import java.awt.AWTException;
29+
import java.awt.Button;
30+
import java.awt.Canvas;
31+
import java.awt.Checkbox;
32+
import java.awt.CheckboxMenuItem;
33+
import java.awt.Choice;
34+
import java.awt.Component;
35+
import java.awt.Desktop;
36+
import java.awt.Dialog;
37+
import java.awt.FileDialog;
38+
import java.awt.Frame;
39+
import java.awt.GraphicsDevice;
40+
import java.awt.HeadlessException;
41+
import java.awt.Label;
42+
import java.awt.Menu;
43+
import java.awt.MenuBar;
44+
import java.awt.MenuItem;
45+
import java.awt.Panel;
46+
import java.awt.PopupMenu;
47+
import java.awt.ScrollPane;
48+
import java.awt.Scrollbar;
49+
import java.awt.Taskbar;
50+
import java.awt.TextArea;
51+
import java.awt.TextField;
52+
import java.awt.Window;
3053
import java.awt.dnd.DragGestureEvent;
3154
import java.awt.dnd.InvalidDnDOperationException;
3255
import java.awt.dnd.peer.DragSourceContextPeer;
33-
import java.awt.peer.*;
56+
import java.awt.peer.ButtonPeer;
57+
import java.awt.peer.CanvasPeer;
58+
import java.awt.peer.CheckboxMenuItemPeer;
59+
import java.awt.peer.CheckboxPeer;
60+
import java.awt.peer.ChoicePeer;
61+
import java.awt.peer.DesktopPeer;
62+
import java.awt.peer.DialogPeer;
63+
import java.awt.peer.FileDialogPeer;
64+
import java.awt.peer.FontPeer;
65+
import java.awt.peer.FramePeer;
66+
import java.awt.peer.LabelPeer;
67+
import java.awt.peer.LightweightPeer;
68+
import java.awt.peer.ListPeer;
69+
import java.awt.peer.MenuBarPeer;
70+
import java.awt.peer.MenuItemPeer;
71+
import java.awt.peer.MenuPeer;
72+
import java.awt.peer.MouseInfoPeer;
73+
import java.awt.peer.PanelPeer;
74+
import java.awt.peer.PopupMenuPeer;
75+
import java.awt.peer.RobotPeer;
76+
import java.awt.peer.ScrollPanePeer;
77+
import java.awt.peer.ScrollbarPeer;
78+
import java.awt.peer.TaskbarPeer;
79+
import java.awt.peer.TextAreaPeer;
80+
import java.awt.peer.TextFieldPeer;
81+
import java.awt.peer.WindowPeer;
3482

3583
import sun.awt.datatransfer.DataTransferer;
3684

@@ -437,9 +485,17 @@ default FontPeer getFontPeer(String name, int style) {
437485
return null;
438486
}
439487

440-
default RobotPeer createRobot(Robot target, GraphicsDevice screen)
441-
throws AWTException {
442-
throw new HeadlessException();
488+
/**
489+
* Creates the peer for a Robot.
490+
*
491+
* @param screen the GraphicsDevice indicating the coordinate system the
492+
* Robot will operate in
493+
* @return the peer created
494+
* @throws AWTException if the platform configuration does not allow
495+
* low-level input control
496+
*/
497+
default RobotPeer createRobot(GraphicsDevice screen) throws AWTException {
498+
throw new AWTException(String.format("Unsupported device: %s", screen));
443499
}
444500

445501
default DataTransferer getDataTransferer() {

src/java.desktop/unix/classes/sun/awt/X11/XRobotPeer.java

+6-12
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
2525

2626
package sun.awt.X11;
2727

28-
import java.awt.GraphicsConfiguration;
2928
import java.awt.Rectangle;
3029
import java.awt.Toolkit;
3130
import java.awt.peer.RobotPeer;
@@ -35,11 +34,12 @@
3534
import sun.awt.SunToolkit;
3635
import sun.awt.UNIXToolkit;
3736
import sun.awt.X11GraphicsConfig;
37+
import sun.awt.X11GraphicsDevice;
3838
import sun.security.action.GetPropertyAction;
3939

4040
final class XRobotPeer implements RobotPeer {
4141

42-
static final boolean tryGtk;
42+
private static final boolean tryGtk;
4343
static {
4444
loadNativeLibraries();
4545
tryGtk = Boolean.parseBoolean(
@@ -48,16 +48,10 @@ final class XRobotPeer implements RobotPeer {
4848
));
4949
}
5050
private static volatile boolean useGtk;
51-
private X11GraphicsConfig xgc = null;
51+
private final X11GraphicsConfig xgc;
5252

53-
/*
54-
* native implementation uses some static shared data (pipes, processes)
55-
* so use a class lock to synchronize native method calls
56-
*/
57-
static Object robotLock = new Object();
58-
59-
XRobotPeer(GraphicsConfiguration gc) {
60-
this.xgc = (X11GraphicsConfig)gc;
53+
XRobotPeer(X11GraphicsDevice gd) {
54+
xgc = (X11GraphicsConfig) gd.getDefaultConfiguration();
6155
SunToolkit tk = (SunToolkit)Toolkit.getDefaultToolkit();
6256
setup(tk.getNumberOfButtons(),
6357
AWTAccessor.getInputEventAccessor().getButtonDownMasks());

src/java.desktop/unix/classes/sun/awt/X11/XToolkit.java

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2002, 2018, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2002, 2020, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -58,7 +58,6 @@
5858
import java.awt.PopupMenu;
5959
import java.awt.PrintJob;
6060
import java.awt.Rectangle;
61-
import java.awt.Robot;
6261
import java.awt.ScrollPane;
6362
import java.awt.Scrollbar;
6463
import java.awt.SystemColor;
@@ -1069,11 +1068,13 @@ protected static void targetDisposedPeer(Object target, Object peer) {
10691068
}
10701069

10711070
@Override
1072-
public RobotPeer createRobot(Robot target, GraphicsDevice screen) {
1073-
return new XRobotPeer(screen.getDefaultConfiguration());
1071+
public RobotPeer createRobot(GraphicsDevice screen) throws AWTException {
1072+
if (screen instanceof X11GraphicsDevice) {
1073+
return new XRobotPeer((X11GraphicsDevice) screen);
1074+
}
1075+
return super.createRobot(screen);
10741076
}
10751077

1076-
10771078
/*
10781079
* On X, support for dynamic layout on resizing is governed by the
10791080
* window manager. If the window manager supports it, it happens

src/java.desktop/windows/classes/sun/awt/windows/WRobotPeer.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 1998, 2019, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 1998, 2020, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
2525

2626
package sun.awt.windows;
2727

28-
import java.awt.GraphicsDevice;
2928
import java.awt.Point;
3029
import java.awt.Rectangle;
3130
import java.awt.peer.RobotPeer;
@@ -34,9 +33,6 @@
3433

3534
final class WRobotPeer implements RobotPeer {
3635

37-
WRobotPeer(GraphicsDevice screen) {
38-
}
39-
4036
public native void mouseMoveImpl(int x, int y);
4137
@Override
4238
public void mouseMove(int x, int y) {

0 commit comments

Comments
 (0)