--- a/jdk/src/java.desktop/share/classes/javax/swing/text/DefaultEditorKit.java Thu Jul 27 12:36:57 2017 -0700
+++ b/jdk/src/java.desktop/share/classes/javax/swing/text/DefaultEditorKit.java Fri Jul 28 10:26:22 2017 +0530
@@ -1496,6 +1496,15 @@
target.setCaretPosition(newIndex);
}
}
+ } else {
+ // If the caret index is same as the visible offset
+ // then correct newVis.y so that it won't cause
+ // unnecessary scrolling upward/downward when
+ // page-down/page-up is received after ctrl-END/ctrl-HOME
+ if (direction == -1 && newVis.y <= initialY ||
+ direction == 1 && newVis.y >= initialY) {
+ newVis.y = initialY;
+ }
}
} catch (BadLocationException ble) { }
} else {
--- a/jdk/test/javax/swing/JTextArea/4697612/bug4697612.java Thu Jul 27 12:36:57 2017 -0700
+++ b/jdk/test/javax/swing/JTextArea/4697612/bug4697612.java Fri Jul 28 10:26:22 2017 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2017, 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
@@ -24,17 +24,23 @@
/*
* @test
* @key headful
- * @bug 4697612 6244705
- * @author Peter Zhelezniakov
- * @library ../../regtesthelpers
- * @build Util
+ * @bug 4697612 6244705 7190581
* @run main bug4697612
*/
-import java.io.*;
-import java.awt.*;
-import java.awt.event.*;
-import javax.swing.*;
-
+import java.awt.Rectangle;
+import java.awt.Dimension;
+import java.io.InputStream;
+import java.awt.Robot;
+import java.awt.event.KeyEvent;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import javax.swing.JFrame;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+import javax.swing.LookAndFeel;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.text.BadLocationException;
public class bug4697612 {
@@ -47,94 +53,120 @@
private static JFrame frame;
private static JTextArea text;
private static JScrollPane scroller;
+ private static Robot robot;
+
+ private static void setLookAndFeel(final UIManager.LookAndFeelInfo laf) {
+ try {
+ UIManager.setLookAndFeel(laf.getClassName());
+ } catch (ClassNotFoundException | InstantiationException |
+ UnsupportedLookAndFeelException | IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ }
public static void main(String[] args) throws Throwable {
- Robot robot = new Robot();
+ robot = new Robot();
robot.setAutoDelay(100);
-
- SwingUtilities.invokeAndWait(new Runnable() {
-
- @Override
- public void run() {
- createAndShowGUI();
- }
- });
-
- robot.waitForIdle();
-
- SwingUtilities.invokeAndWait(new Runnable() {
-
- @Override
- public void run() {
- text.requestFocus();
+ for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) {
+ try {
+ SwingUtilities.invokeAndWait(() -> setLookAndFeel(laf));
+ System.out.println("Test for LookAndFeel " + laf.getClassName());
+ new bug4697612();
+ System.out.println("Test passed for LookAndFeel " + laf.getClassName());
+ } catch (Exception e) {
+ throw new RuntimeException(e);
}
- });
-
- robot.waitForIdle();
-
- // 4697612: pressing PgDn + PgUp should not alter caret position
- Util.hitKeys(robot, KeyEvent.VK_HOME);
- Util.hitKeys(robot, KeyEvent.VK_PAGE_DOWN);
-
+ }
+ }
- int pos0 = getTextCaretPosition();
- int caretHeight = getTextCaretHeight();
- fontHeight = FONT_HEIGHT;
-
- // iterate two times, for different (even and odd) font height
- for (int i = 0; i < 2; i++) {
-
+ public bug4697612() throws Exception {
+ try {
SwingUtilities.invokeAndWait(new Runnable() {
-
+ @Override
public void run() {
- text.setFont(text.getFont().deriveFont(fontHeight));
+ createAndShowGUI();
+ }
+ });
+ robot.waitForIdle();
+ SwingUtilities.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ text.requestFocus();
}
});
+ robot.waitForIdle();
- frameHeight = FRAME_HEIGHT;
+ // 4697612: pressing PgDn + PgUp should not alter caret position
+ robot.keyPress(KeyEvent.VK_HOME);
+ robot.keyRelease(KeyEvent.VK_HOME);
+ robot.keyPress(KeyEvent.VK_PAGE_DOWN);
+ robot.keyRelease(KeyEvent.VK_PAGE_DOWN);
+ robot.waitForIdle();
- for (int j = 0; j < caretHeight; j++) {
- SwingUtilities.invokeAndWait(new Runnable() {
+ int pos0 = getTextCaretPosition();
+ int caretHeight = getTextCaretHeight();
+ fontHeight = FONT_HEIGHT;
+ // iterate two times, for different (even and odd) font height
+ for (int i = 0; i < 2; i++) {
+
+ SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
- frame.setSize(FRAME_WIDTH, frameHeight);
+ text.setFont(text.getFont().deriveFont(fontHeight));
}
});
-
- robot.waitForIdle();
+ frameHeight = FRAME_HEIGHT;
- Util.hitKeys(robot, KeyEvent.VK_PAGE_DOWN);
- Util.hitKeys(robot, KeyEvent.VK_PAGE_UP);
- robot.waitForIdle();
+ for (int j = 0; j < caretHeight; j++) {
- int pos = getTextCaretPosition();
- if (pos0 != pos) {
- throw new RuntimeException("Failed 4697612: PgDn & PgUp keys scroll by different amounts");
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ frame.setSize(FRAME_WIDTH, frameHeight);
+ }
+ });
+ robot.waitForIdle();
+ robot.keyPress(KeyEvent.VK_PAGE_DOWN);
+ robot.keyRelease(KeyEvent.VK_PAGE_DOWN);
+ robot.keyPress(KeyEvent.VK_PAGE_UP);
+ robot.keyRelease(KeyEvent.VK_PAGE_UP);
+ robot.waitForIdle();
+
+ int pos = getTextCaretPosition();
+ if (pos0 != pos) {
+ throw new RuntimeException("Failed 4697612: PgDn & PgUp keys scroll by different amounts");
+ }
+ frameHeight++;
}
- frameHeight++;
+ fontHeight++;
}
- fontHeight++;
- }
-
- // 6244705: pressing PgDn at the very bottom should not scroll
- LookAndFeel laf = UIManager.getLookAndFeel();
- if (laf.getID().equals("Aqua")) {
- Util.hitKeys(robot, KeyEvent.VK_END);
- } else {
- Util.hitKeys(robot, KeyEvent.VK_CONTROL, KeyEvent.VK_END);
- }
+ // 6244705: pressing PgDn at the very bottom should not scroll
+ LookAndFeel laf = UIManager.getLookAndFeel();
+ if (laf.getID().equals("Aqua")) {
+ robot.keyPress(KeyEvent.VK_END);
+ robot.keyRelease(KeyEvent.VK_END);
+ } else {
+ robot.keyPress(KeyEvent.VK_CONTROL);
+ robot.keyPress(KeyEvent.VK_END);
+ robot.keyRelease(KeyEvent.VK_END);
+ robot.keyRelease(KeyEvent.VK_CONTROL);
+ }
+ robot.waitForIdle();
+ robot.delay(1000);
- robot.waitForIdle();
+ pos0 = getScrollerViewPosition();
+ robot.keyPress(KeyEvent.VK_PAGE_DOWN);
+ robot.keyRelease(KeyEvent.VK_PAGE_DOWN);
+ robot.waitForIdle();
+
+ int pos = getScrollerViewPosition();
- pos0 = getScrollerViewPosition();
- Util.hitKeys(robot, KeyEvent.VK_PAGE_DOWN);
- robot.waitForIdle();
-
- int pos = getScrollerViewPosition();
-
- if (pos0 != pos) {
- throw new RuntimeException("Failed 6244705: PgDn at the bottom causes scrolling");
+ if (pos0 != pos) {
+ System.out.println("pos0 " + pos0 + " pos " + pos);
+ throw new RuntimeException("Failed 6244705: PgDn at the bottom causes scrolling");
+ }
+ } finally {
+ SwingUtilities.invokeAndWait(() -> frame.dispose());
}
}