8147994: [macosx] JScrollPane jitters up/down during trackpad scrolling on MacOS/Aqua

Reviewed-by: alexp, aivanov
diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicScrollPaneUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicScrollPaneUI.java
index 190b94b..f134ad1 100644
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicScrollPaneUI.java
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicScrollPaneUI.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -870,18 +870,13 @@
                 int orientation = SwingConstants.VERTICAL;
 
                 // find which scrollbar to scroll, or return if none
-                if (toScroll == null || !toScroll.isVisible()) {
+                if (toScroll == null || !toScroll.isVisible()
+                        || e.isShiftDown()) {
                     toScroll = scrollpane.getHorizontalScrollBar();
                     if (toScroll == null || !toScroll.isVisible()) {
                         return;
                     }
                     orientation = SwingConstants.HORIZONTAL;
-                } else if(e.isShiftDown()){
-                    JScrollBar hScroll = scrollpane.getHorizontalScrollBar();
-                    if (hScroll != null && hScroll.isVisible()) {
-                        toScroll = hScroll;
-                        orientation = SwingConstants.HORIZONTAL;
-                    }
                 }
 
                 e.consume();
diff --git a/jdk/test/javax/swing/JScrollPane/8033000/bug8033000.java b/jdk/test/javax/swing/JScrollPane/HorizontalMouseWheelOnShiftPressed/HorizontalMouseWheelOnShiftPressed.java
similarity index 77%
rename from jdk/test/javax/swing/JScrollPane/8033000/bug8033000.java
rename to jdk/test/javax/swing/JScrollPane/HorizontalMouseWheelOnShiftPressed/HorizontalMouseWheelOnShiftPressed.java
index 190390d..3c42ec7 100644
--- a/jdk/test/javax/swing/JScrollPane/8033000/bug8033000.java
+++ b/jdk/test/javax/swing/JScrollPane/HorizontalMouseWheelOnShiftPressed/HorizontalMouseWheelOnShiftPressed.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 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
@@ -20,6 +20,7 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
+
 import java.awt.BorderLayout;
 import java.awt.Point;
 import java.awt.Robot;
@@ -29,22 +30,23 @@
 import javax.swing.JScrollPane;
 import javax.swing.JTextArea;
 import javax.swing.SwingUtilities;
-import javax.swing.UIManager;
+
 import sun.awt.OSInfo;
 
 /**
  * @test
- * @bug 8033000
+ * @bug 8033000 8147994
  * @author Alexander Scherbatiy
  * @summary No Horizontal Mouse Wheel Support In BasicScrollPaneUI
- * @run main bug8033000
+ * @run main HorizontalMouseWheelOnShiftPressed
  */
-public class bug8033000 {
+public class HorizontalMouseWheelOnShiftPressed {
 
     private static JScrollPane scrollPane;
     private static JTextArea textArea;
     private static Point point;
     private static final int delta;
+    private static JFrame frame;
 
     static {
         delta = OSInfo.getOSType().equals(OSInfo.OSType.MACOSX) ? -30 : 30;
@@ -55,9 +57,17 @@
         Robot robot = new Robot();
         robot.setAutoDelay(50);
 
-        SwingUtilities.invokeAndWait(bug8033000::createAndShowGUI);
+        SwingUtilities.invokeAndWait(
+                HorizontalMouseWheelOnShiftPressed::createAndShowGUI);
         robot.waitForIdle();
+        try {
+            test(robot);
+        } finally {
+            frame.dispose();
+        }
+    }
 
+    private static void test(Robot robot) throws Exception {
         SwingUtilities.invokeAndWait(() -> {
             Point locationOnScreen = scrollPane.getLocationOnScreen();
             point = new Point(
@@ -73,7 +83,7 @@
         robot.waitForIdle();
         robot.mouseWheel(delta);
         robot.waitForIdle();
-        checkScrollPane(true);
+        checkScrollPane(true, false);
 
         // vertical scroll bar is enabled + shift
         initScrollPane(true, false);
@@ -82,14 +92,14 @@
         robot.mouseWheel(delta);
         robot.keyRelease(KeyEvent.VK_SHIFT);
         robot.waitForIdle();
-        checkScrollPane(true);
+        checkScrollPane(false, false);
 
         // horizontal scroll bar is enabled
         initScrollPane(false, true);
         robot.waitForIdle();
         robot.mouseWheel(delta);
         robot.waitForIdle();
-        checkScrollPane(false);
+        checkScrollPane(false, true);
 
         // horizontal scroll bar is enabled + shift
         initScrollPane(false, true);
@@ -98,14 +108,14 @@
         robot.mouseWheel(delta);
         robot.keyRelease(KeyEvent.VK_SHIFT);
         robot.waitForIdle();
-        checkScrollPane(false);
+        checkScrollPane(false, true);
 
         // both scroll bars are enabled
         initScrollPane(true, true);
         robot.waitForIdle();
         robot.mouseWheel(delta);
         robot.waitForIdle();
-        checkScrollPane(true);
+        checkScrollPane(true, false);
 
         // both scroll bars are enabled + shift
         initScrollPane(true, true);
@@ -114,7 +124,7 @@
         robot.mouseWheel(delta);
         robot.keyRelease(KeyEvent.VK_SHIFT);
         robot.waitForIdle();
-        checkScrollPane(false);
+        checkScrollPane(false, true);
     }
 
     static void initScrollPane(boolean vVisible, boolean hVisible) throws Exception {
@@ -129,17 +139,25 @@
         });
     }
 
-    static void checkScrollPane(boolean verticalScrolled) throws Exception {
+    static void checkScrollPane(boolean verticalScrolled,
+                                boolean horizontalScrolled) throws Exception {
         SwingUtilities.invokeAndWait(() -> {
 
             if (verticalScrolled) {
-                if (scrollPane.getVerticalScrollBar().getValue() == 0
-                        || scrollPane.getHorizontalScrollBar().getValue() != 0) {
+                if (scrollPane.getVerticalScrollBar().getValue() == 0) {
                     throw new RuntimeException("Wrong vertical scrolling!");
                 }
+            } else{
+                if (scrollPane.getVerticalScrollBar().getValue() != 0) {
+                    throw new RuntimeException("Wrong vertical scrolling!");
+                }
+            }
+            if (horizontalScrolled) {
+                if (scrollPane.getHorizontalScrollBar().getValue() == 0) {
+                    throw new RuntimeException("Wrong horizontal scrolling!");
+                }
             } else {
-                if (scrollPane.getVerticalScrollBar().getValue() != 0
-                        || scrollPane.getHorizontalScrollBar().getValue() == 0) {
+                if (scrollPane.getHorizontalScrollBar().getValue() != 0) {
                     throw new RuntimeException("Wrong horizontal scrolling!");
                 }
             }
@@ -147,9 +165,10 @@
     }
 
     static void createAndShowGUI() {
-        JFrame frame = new JFrame();
+        frame = new JFrame();
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         frame.setSize(300, 300);
+        frame.setLocationRelativeTo(null);
         textArea = new JTextArea("Hello World!");
         scrollPane = new JScrollPane(textArea);
         JPanel panel = new JPanel(new BorderLayout());