diff --git a/jdk/src/java.desktop/share/classes/javax/swing/text/DefaultEditorKit.java b/jdk/src/java.desktop/share/classes/javax/swing/text/DefaultEditorKit.java index 355b76c0d16..3e108612371 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/text/DefaultEditorKit.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/DefaultEditorKit.java @@ -1496,6 +1496,15 @@ public class DefaultEditorKit extends EditorKit { 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 { diff --git a/jdk/test/javax/swing/JTextArea/4697612/bug4697612.java b/jdk/test/javax/swing/JTextArea/4697612/bug4697612.java index 5f4f3e7bf06..ed7f3dba73f 100644 --- a/jdk/test/javax/swing/JTextArea/4697612/bug4697612.java +++ b/jdk/test/javax/swing/JTextArea/4697612/bug4697612.java @@ -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 @@ public class bug4697612 { 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(); + 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(); - - SwingUtilities.invokeAndWait(new Runnable() { - - @Override - public void run() { - text.requestFocus(); - } - }); - - 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(); + + 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++) { - for (int j = 0; j < caretHeight; j++) { SwingUtilities.invokeAndWait(new Runnable() { - public void run() { - frame.setSize(FRAME_WIDTH, frameHeight); + text.setFont(text.getFont().deriveFont(fontHeight)); } }); + frameHeight = FRAME_HEIGHT; - robot.waitForIdle(); + for (int j = 0; j < caretHeight; j++) { - Util.hitKeys(robot, KeyEvent.VK_PAGE_DOWN); - Util.hitKeys(robot, KeyEvent.VK_PAGE_UP); - robot.waitForIdle(); + 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"); + 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")) { + 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); - // 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); - } + pos0 = getScrollerViewPosition(); + robot.keyPress(KeyEvent.VK_PAGE_DOWN); + robot.keyRelease(KeyEvent.VK_PAGE_DOWN); + robot.waitForIdle(); - 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()); } }