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
|
|
@ -0,0 +1,215 @@
|
|||
/*
|
||||
* Copyright (c) 2007, 2016, 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
|
||||
@key headful
|
||||
@bug 6497109 6734341
|
||||
@summary TextArea must have selection expanding, and also be autoscrolled, if mouse is dragged from inside.
|
||||
@library ../../regtesthelpers
|
||||
@build Util
|
||||
@author Konstantin Voloshin: area=TextArea
|
||||
@run main SelectionAutoscrollTest
|
||||
*/
|
||||
|
||||
/**
|
||||
* SelectionAutoscrollTest.java
|
||||
*
|
||||
* summary: TextArea should be auto-scrolled and text should be selected to
|
||||
* the end, if mouse is dragged from inside box-for-text to outside it, and
|
||||
* is hold pressed there.
|
||||
*/
|
||||
|
||||
|
||||
import java.awt.Frame;
|
||||
import java.awt.Panel;
|
||||
import java.awt.GridLayout;
|
||||
import java.awt.TextArea;
|
||||
import java.awt.Point;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.Robot;
|
||||
import java.awt.Toolkit;
|
||||
import test.java.awt.regtesthelpers.Util;
|
||||
|
||||
|
||||
public class SelectionAutoscrollTest {
|
||||
TextArea textArea;
|
||||
Robot robot;
|
||||
final int desiredSelectionEnd = ('z'-'a'+1)*2; // 52
|
||||
final static int SCROLL_DELAY = 10; // ms
|
||||
|
||||
public static void main(String[] args) {
|
||||
SelectionAutoscrollTest selectionAutoscrollTest
|
||||
= new SelectionAutoscrollTest();
|
||||
selectionAutoscrollTest.createObjects();
|
||||
selectionAutoscrollTest.manipulateMouse();
|
||||
selectionAutoscrollTest.checkResults();
|
||||
}
|
||||
|
||||
void createObjects() {
|
||||
textArea = new TextArea( bigString() );
|
||||
robot = Util.createRobot();
|
||||
|
||||
Panel panel = new Panel();
|
||||
panel.setLayout( new GridLayout(3,3) );
|
||||
|
||||
for( int y=0; y<3; ++y ) {
|
||||
for( int x=0; x<3; ++x ) {
|
||||
if( x==1 && y==1 ) {
|
||||
panel.add( textArea );
|
||||
} else {
|
||||
panel.add( new Panel() );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Frame frame = new Frame( "TextArea cursor icon test" );
|
||||
frame.setSize( 300, 300 );
|
||||
frame.add( panel );
|
||||
frame.setVisible( true );
|
||||
}
|
||||
|
||||
static String bigString() {
|
||||
String s = "";
|
||||
for( char c='a'; c<='z'; ++c ) {
|
||||
s += c+"\n";
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
void manipulateMouse() {
|
||||
moveMouseToCenterOfTextArea();
|
||||
Util.waitForIdle( robot );
|
||||
|
||||
robot.mousePress( MouseEvent.BUTTON1_MASK );
|
||||
Util.waitForIdle( robot );
|
||||
|
||||
for( int tremble=0; tremble < 10; ++tremble ) {
|
||||
// Mouse is moved repeatedly here (with conservatively chosen
|
||||
// ammount of times), to give some time/chance for TextArea to
|
||||
// autoscroll and for text-selection to expand to the end.
|
||||
// This is because:
|
||||
// - On Windows,
|
||||
// autoscrolling and selection-expansion happens only once per
|
||||
// each mouse-dragged event received, and only for some ammount,
|
||||
// not to the end. So, we have to drag mouse repeatedly.
|
||||
// - on X,
|
||||
// only 1 mouse-dragged event is required for autoscrolling/
|
||||
// selection-expanding to commence. Once commenced, it will
|
||||
// continue to the end of text (provided that mouse-button is
|
||||
// hold pressed), but it may take hardly predictable ammount of
|
||||
// time. However, repeatedly dragging mouse seems perfectly help
|
||||
// here, instead of having to use 'Thread.sleep( ??? )'.
|
||||
// Note: It's required here to move mouse 2 times to receive the
|
||||
// 1-st drag-event. After 1-st movement, only mouse-exited event
|
||||
// will be generated. If mouse was released after first movement
|
||||
// here, we would even get mouse-clicked event (at least for now,
|
||||
// and this is probably a bug). But, starting with 2nd iteration,
|
||||
// all events received will be mouse-dragged events.
|
||||
|
||||
moveMouseBelowTextArea( tremble );
|
||||
Util.waitForIdle( robot );
|
||||
// it is needed to add some small delay on Gnome
|
||||
waitUntilScrollIsPerformed(robot);
|
||||
}
|
||||
|
||||
robot.mouseRelease( MouseEvent.BUTTON1_MASK );
|
||||
Util.waitForIdle( robot );
|
||||
}
|
||||
|
||||
void moveMouseToCenterOfTextArea() {
|
||||
Dimension d = textArea.getSize();
|
||||
Point l = textArea.getLocationOnScreen();
|
||||
Util.mouseMove(robot, l, new Point((int) (l.x + d.width * .5),
|
||||
(int) (l.y + d.height * .5)));
|
||||
}
|
||||
|
||||
void moveMouseBelowTextArea(int tremble) {
|
||||
Dimension d = textArea.getSize();
|
||||
Point l = textArea.getLocationOnScreen();
|
||||
Point p1;
|
||||
if (tremble == 0) {
|
||||
p1 = new Point((int) (l.x + d.width * .5),
|
||||
(int) (l.y + d.height * 0.5));
|
||||
} else {
|
||||
p1 = new Point((int) (l.x + d.width * .5),
|
||||
(int) (l.y + d.height * 1.5));
|
||||
}
|
||||
Point p2 = new Point((int) (l.x + d.width * .5),
|
||||
(int) (l.y + d.height * 1.5) + 15);
|
||||
if (tremble % 2 == 0) {
|
||||
Util.mouseMove(robot, p1, p2);
|
||||
} else {
|
||||
Util.mouseMove(robot, p2, p1);
|
||||
}
|
||||
}
|
||||
|
||||
void waitUntilScrollIsPerformed(Robot robot) {
|
||||
try {
|
||||
Thread.sleep( SCROLL_DELAY );
|
||||
}
|
||||
catch( Exception e ) {
|
||||
throw new RuntimeException( e );
|
||||
}
|
||||
}
|
||||
|
||||
void checkResults() {
|
||||
final int currentSelectionEnd = textArea.getSelectionEnd();
|
||||
System.out.println(
|
||||
"TEST: Selection range after test is: ( "
|
||||
+ textArea.getSelectionStart() + ", "
|
||||
+ currentSelectionEnd + " )"
|
||||
);
|
||||
|
||||
boolean resultOk = ( currentSelectionEnd == desiredSelectionEnd );
|
||||
String desiredSelectionEndString = "" + desiredSelectionEnd;
|
||||
|
||||
// On Windows, last empty line is surprisingly not selected.
|
||||
// Even if it's a bug, it's not for this test.
|
||||
// So, we have 2 acceptable results in this case.
|
||||
String toolkitName = Toolkit.getDefaultToolkit().getClass().getName();
|
||||
if( toolkitName.equals("sun.awt.windows.WToolkit") ) {
|
||||
final int desiredSelectionEnd2 = desiredSelectionEnd-1; // 51
|
||||
resultOk |= ( currentSelectionEnd == desiredSelectionEnd2 );
|
||||
desiredSelectionEndString += " or " + desiredSelectionEnd2;
|
||||
}
|
||||
|
||||
if( resultOk ) {
|
||||
System.out.println(
|
||||
"TEST: passed: Text is selected to the end"
|
||||
+ " (expected selection range end is "
|
||||
+ desiredSelectionEndString + ")."
|
||||
);
|
||||
} else {
|
||||
System.out.println(
|
||||
"TEST: FAILED: Text should be selected to the end"
|
||||
+ " (selection range end should be "
|
||||
+ desiredSelectionEndString + ")."
|
||||
);
|
||||
throw new RuntimeException(
|
||||
"TEST: FAILED: Text should be selected to the end, but it is not."
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue