undefect. CWE-407 — 63 sites patched across 27 ecosystems
Authors: russell@unturf.com · brackishbert@gmail.com · foxhop.net · TimeHexOn.com Patches, unit tests, benchmarks, whitepaper, and outreach briefs. Public domain — no copyright claimed. Use freely.
This commit is contained in:
commit
0a580b313d
70422 changed files with 17213626 additions and 0 deletions
286
test/jdk/java/awt/event/InputEvent/MouseModsTest.java
Normal file
286
test/jdk/java/awt/event/InputEvent/MouseModsTest.java
Normal file
|
|
@ -0,0 +1,286 @@
|
|||
/*
|
||||
* Copyright (c) 2001, 2023, 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 4353201
|
||||
@summary Wrong modifiers on InputEvent
|
||||
@key headful
|
||||
@run main MouseModsTest
|
||||
*/
|
||||
|
||||
import java.awt.AWTEvent;
|
||||
import java.awt.AWTException;
|
||||
import java.awt.Canvas;
|
||||
import java.awt.Color;
|
||||
import java.awt.EventQueue;
|
||||
import java.awt.Frame;
|
||||
import java.awt.MouseInfo;
|
||||
import java.awt.Panel;
|
||||
import java.awt.Point;
|
||||
import java.awt.Robot;
|
||||
import java.awt.event.InputEvent;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
public class MouseModsTest {
|
||||
static volatile int testCtrl = 0;
|
||||
static volatile int testBtn = 0;
|
||||
static volatile boolean passed = true;
|
||||
|
||||
static final int BUTTONS = Math.min(3, MouseInfo.getNumberOfButtons());
|
||||
static final int KEYS = 2;
|
||||
|
||||
static Frame frame;
|
||||
static Panel panel;
|
||||
static Canvas button1;
|
||||
static Canvas button2;
|
||||
|
||||
static volatile Point pt1;
|
||||
static volatile Point pt2;
|
||||
|
||||
public static void main(String args[]) throws AWTException,
|
||||
InterruptedException, InvocationTargetException {
|
||||
|
||||
EventQueue.invokeAndWait(() -> {
|
||||
frame = new Frame("MouseModsTest");
|
||||
panel = new Panel();
|
||||
button1 = new TestCanvas();
|
||||
button2 = new TestCanvas();
|
||||
frame.setSize(300, 200);
|
||||
panel.add(button1);
|
||||
panel.add(button2);
|
||||
frame.add(panel);
|
||||
frame.setLocationRelativeTo(null);
|
||||
frame.setVisible(true);
|
||||
});
|
||||
|
||||
try {
|
||||
Robot robot;
|
||||
robot = new Robot();
|
||||
robot.setAutoWaitForIdle(true);
|
||||
robot.setAutoDelay(50);
|
||||
robot.delay(1000);
|
||||
|
||||
EventQueue.invokeAndWait(() -> {
|
||||
pt1 = button1.getLocationOnScreen();
|
||||
pt2 = button2.getLocationOnScreen();
|
||||
|
||||
pt1.x += button1.getSize().width / 2;
|
||||
pt1.y += button1.getSize().height / 2;
|
||||
|
||||
pt2.x += button2.getSize().width / 2;
|
||||
pt2.y += button2.getSize().height / 2;
|
||||
});
|
||||
|
||||
robot.mouseMove(pt2.x, pt2.y);
|
||||
|
||||
//Keyboard to Mouse Test
|
||||
for (int ctrl = 1; ctrl <= KEYS; ++ctrl) {
|
||||
testCtrl = ctrl;
|
||||
robot.keyPress(getKeycode(ctrl));
|
||||
robot.keyPress(KeyEvent.VK_A);
|
||||
robot.keyRelease(KeyEvent.VK_A);
|
||||
for (int btn = 2; btn <= BUTTONS; ++btn) {
|
||||
testBtn = btn;
|
||||
robot.mousePress(getMouseModifier(btn));
|
||||
robot.mouseMove(pt1.x, pt1.y);
|
||||
robot.mouseMove(pt2.x, pt2.y);
|
||||
robot.mouseRelease(getMouseModifier(btn));
|
||||
}
|
||||
robot.keyRelease(getKeycode(ctrl));
|
||||
}
|
||||
|
||||
//Mouse to Mouse Test
|
||||
for (int btn1 = 1; btn1 <= BUTTONS; ++btn1) {
|
||||
testBtn = btn1;
|
||||
robot.mousePress(getMouseModifier(btn1));
|
||||
for (int btn = 1; btn <= BUTTONS; ++btn) {
|
||||
if (btn == btn1) continue;
|
||||
testBtn = btn;
|
||||
robot.mousePress(getMouseModifier(btn));
|
||||
robot.mouseMove(pt1.x, pt1.y);
|
||||
robot.mouseMove(pt2.x, pt2.y);
|
||||
robot.mouseRelease(getMouseModifier(btn));
|
||||
}
|
||||
testBtn = btn1;
|
||||
robot.mouseRelease(getMouseModifier(btn1));
|
||||
}
|
||||
testBtn = 0;
|
||||
} finally {
|
||||
EventQueue.invokeAndWait(() -> {
|
||||
if (frame != null) {
|
||||
frame.dispose();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (!passed) {
|
||||
throw new RuntimeException("Test Failed");
|
||||
}
|
||||
}
|
||||
|
||||
static int getKeycode(int ctrl) {
|
||||
switch (ctrl) {
|
||||
case 1: return KeyEvent.VK_SHIFT;
|
||||
case 2: return KeyEvent.VK_CONTROL;
|
||||
case 3: return KeyEvent.VK_ALT;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int getKeyModifier(int ctrl) {
|
||||
switch (ctrl) {
|
||||
case 1: return InputEvent.SHIFT_MASK;
|
||||
case 2: return InputEvent.CTRL_MASK;
|
||||
case 3: return InputEvent.ALT_MASK;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int getMouseModifier(int btn) {
|
||||
switch (btn) {
|
||||
case 1: return InputEvent.BUTTON1_MASK;
|
||||
case 2: return InputEvent.BUTTON2_MASK;
|
||||
case 3: return InputEvent.BUTTON3_MASK;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static final int allKeyMods =
|
||||
InputEvent.SHIFT_MASK
|
||||
| InputEvent.CTRL_MASK
|
||||
| InputEvent.ALT_MASK;
|
||||
|
||||
static final int allMouseMods =
|
||||
InputEvent.BUTTON1_MASK
|
||||
| InputEvent.BUTTON2_MASK
|
||||
| InputEvent.BUTTON3_MASK;
|
||||
|
||||
static void printInputEvent(InputEvent e) {
|
||||
System.out.println(e);
|
||||
if (e.isAltDown()) {
|
||||
System.out.println("Alt is Down");
|
||||
}
|
||||
if (e.isControlDown()) {
|
||||
System.out.println("Ctrl is Down");
|
||||
}
|
||||
if (e.isShiftDown()) {
|
||||
System.out.println("Shift is Down");
|
||||
}
|
||||
if (e.isMetaDown()) {
|
||||
System.out.println("Meta is Down");
|
||||
}
|
||||
}
|
||||
|
||||
static class TestCanvas extends Canvas {
|
||||
public TestCanvas() {
|
||||
setSize(100, 100);
|
||||
setBackground(Color.blue);
|
||||
enableEvents(AWTEvent.MOUSE_EVENT_MASK
|
||||
| AWTEvent.MOUSE_MOTION_EVENT_MASK
|
||||
| AWTEvent.KEY_EVENT_MASK);
|
||||
}
|
||||
|
||||
protected void processMouseEvent(MouseEvent e) {
|
||||
try {
|
||||
if (testBtn == 0) {
|
||||
return;
|
||||
}
|
||||
if (e.getID() == MouseEvent.MOUSE_ENTERED
|
||||
|| e.getID() == MouseEvent.MOUSE_EXITED)
|
||||
{
|
||||
if ((e.getModifiers() & getMouseModifier(testBtn)) != 0) {
|
||||
System.out.println("Mouse modifiers on MOUSE_ENTERED, MOUSE_EXITED are set");
|
||||
} else {
|
||||
printInputEvent(e);
|
||||
System.out.println("Cur mods = " + (e.getModifiers() & allMouseMods) + " Wanted = " +
|
||||
getMouseModifier(testBtn));
|
||||
passed = false;
|
||||
throw new RuntimeException("Mouse modifiers on MOUSE_ENTERED, MOUSE_EXITED aren't set");
|
||||
}
|
||||
}
|
||||
if (e.getID() == MouseEvent.MOUSE_PRESSED
|
||||
|| e.getID() == MouseEvent.MOUSE_RELEASED)
|
||||
{
|
||||
if ((e.getModifiers() & getMouseModifier(testBtn)) != 0) {
|
||||
System.out.println("Right Mouse modifiers on MOUSE_PRESSED, MOUSE_RELEASED");
|
||||
} else {
|
||||
printInputEvent(e);
|
||||
System.out.println("Cur mods = " + (e.getModifiers() & allMouseMods) + " Wanted = " +
|
||||
getMouseModifier(testBtn));
|
||||
passed = false;
|
||||
throw new RuntimeException("Wrong Mouse modifiers on MOUSE_PRESSED, MOUSE_RELEASED");
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
synchronized (frame) {
|
||||
frame.notify();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void processMouseMotionEvent(MouseEvent e) {
|
||||
try {
|
||||
if (testBtn == 0) {
|
||||
return;
|
||||
}
|
||||
if (e.getID() == MouseEvent.MOUSE_DRAGGED) {
|
||||
if ((e.getModifiers() & getMouseModifier(testBtn)) != 0) {
|
||||
System.out.println("Mouse modifiers on MOUSE_DRAGGED are set");
|
||||
} else {
|
||||
printInputEvent(e);
|
||||
System.out.println("Cur mods = " + (e.getModifiers() & allMouseMods) + " Wanted = " +
|
||||
getMouseModifier(testBtn));
|
||||
passed = false;
|
||||
throw new RuntimeException("Mouse modifiers on MOUSE_DRAGGED aren't set");
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
synchronized (frame) {
|
||||
frame.notify();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void processKeyEvent(KeyEvent e) {
|
||||
try {
|
||||
if (e.getKeyCode() != KeyEvent.VK_A) {
|
||||
return;
|
||||
}
|
||||
if ((e.getModifiers() & getKeyModifier(testCtrl)) != 0) {
|
||||
System.out.println("Right Key modifiers on KeyEvent");
|
||||
} else {
|
||||
printInputEvent(e);
|
||||
passed = false;
|
||||
throw new RuntimeException("Wrong Key modifiers on KeyEvent");
|
||||
}
|
||||
} finally {
|
||||
synchronized (frame) {
|
||||
frame.notify();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue