Mercurial > hg > icedtea8-forest > jdk
changeset 13188:a05113a4c91c jdk8u144-b31
Merge
author | asaha |
---|---|
date | Mon, 24 Jul 2017 09:37:01 -0700 |
parents | 693d4c927278 (current diff) a95302dc4470 (diff) |
children | c4f7f2878c4b |
files | .hgtags |
diffstat | 53 files changed, 2744 insertions(+), 228 deletions(-) [+] |
line wrap: on
line diff
--- a/.hgtags Fri Jul 21 20:32:51 2017 -0700 +++ b/.hgtags Mon Jul 24 09:37:01 2017 -0700 @@ -664,6 +664,8 @@ 60767ec3909b3d0cb26dd7b3f952c62053719dda jdk8u112-b15 5dd7e4bae5c2f1ee4f80c5570e7e3e2f715f7a32 jdk8u112-b16 41fac11792c1ee6945f56721ee558a7424395a81 jdk8u112-b31 +548a51660ee94aeb77b2432594aeb87f87c21697 jdk8u112-b32 +a334b0815d34948188537a177a32cee27007ea2c jdk8u112-b33 ab5ff8f1e52c5e3ca02e988f4d978af63ceca5b8 jdk8u121-b00 5f0839ac7e0d25dd1ae705df496b12ca76c26d59 jdk8u121-b01 f91e3aa155b3c6774afb456db15fb358313d5771 jdk8u121-b02 @@ -678,6 +680,12 @@ ec72a941be0a50ab77f5375cf710bc06e4f118d3 jdk8u121-b11 9561afc12df843ef21ecd9d7b3633371e7a2bfc4 jdk8u121-b12 2974746e56192cdd14fc2dd43179bcf28e4faf4a jdk8u121-b13 +4f69f3363a2ecee8d3df2b046266a76c2a805139 jdk8u121-b31 +ec26e3331158912f86268ef473e64514c70cbd52 jdk8u121-b32 +cb2c7c89dd09edcda4cb7bd0db623c813d3e5dbc jdk8u121-b33 +90f36d39acdc5be0665722538749c59583e3b83d jdk8u121-b34 +cec5310dcc2b876dd53a057035cb63dd22f63257 jdk8u121-b35 +a5c94735ad3fb33f353abc23e25915db2ff7a36e jdk8u121-b36 032874d46bf95478cb86690b3c91d335c0764b0b jdk8u131-b00 bea5b22daf5ddd941f3bcbf7a4e5fc5244ceb788 jdk8u131-b01 a01d217a232906e82f80e5bc3db4d60c4c74716e jdk8u131-b02 @@ -690,6 +698,10 @@ 40d00399869d8a28cfecf360234f340e9e0ad3b1 jdk8u131-b09 c0091a673d766ce2e76a945bab6de325fe78dd88 jdk8u131-b10 3ab471c4760a808e39406303ff33a25a542b9c75 jdk8u131-b11 +d50ccb38def5968145fd3f6e0579416bb027e85c jdk8u131-b31 +e54624a8ebe3639d3b2360adb9ae0fa32f1bef57 jdk8u131-b32 +15006e8dc79bd0005d264bff0b1677a109cf5a02 jdk8u131-b33 +e6e35f065443533c81db69022a272927b0b20f69 jdk8u131-b34 a160009bbe1417d85f1c0eec890fdb17391b3637 jdk8u141-b00 e95a13de2d36050302a1af422967f5260fc8eabd jdk8u141-b01 936085d9aff0554a3bdab2fcbbec1d1864e656a2 jdk8u141-b02 @@ -710,5 +722,7 @@ c6bc194fedb63b20c45c793405d215d206fb4654 jdk8u141-b13 d630e23b8e36c2863225d7ae107c73a38d3e6102 jdk8u141-b14 2ea94405100763c772ab3989200115d7a23c7532 jdk8u141-b15 +55899d2b99b0725d74eebc510a116423329ad6f0 jdk8u141-b31 +a3c4020f84aeb0dba467534239951f8818bdfb84 jdk8u141-b32 b64b1dfdbe7cfe3859f1023c0f1fb0216bce4ae7 jdk8u144-b00 d2744852f3e64f7b0ba54f3a64ed5e2107e6ee68 jdk8u144-b01
--- a/make/lib/CoreLibraries.gmk Fri Jul 21 20:32:51 2017 -0700 +++ b/make/lib/CoreLibraries.gmk Mon Jul 24 09:37:01 2017 -0700 @@ -23,6 +23,9 @@ # questions. # +# Include custom extensions if available. +-include $(CUSTOM_MAKE_DIR)/lib/CoreLibraries.gmk + WIN_VERIFY_LIB := $(JDK_OUTPUTDIR)/objs/libverify/verify.lib ########################################################################################## @@ -114,7 +117,8 @@ ########################################################################################## -LIBJAVA_SRC_DIRS := $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/java/lang \ +# Allow a custom makefile to add extra src dirs +LIBJAVA_SRC_DIRS += $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/java/lang \ $(JDK_TOPDIR)/src/share/native/java/lang \ $(JDK_TOPDIR)/src/share/native/java/lang/reflect \ $(JDK_TOPDIR)/src/share/native/java/io \ @@ -140,6 +144,9 @@ $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/io endif +# Make it possible to override this variable +LIBJAVA_MAPFILE ?= $(JDK_TOPDIR)/make/mapfiles/libjava/mapfile-vers + LIBJAVA_CFLAGS := $(foreach dir, $(LIBJAVA_SRC_DIRS), -I$(dir)) \ -I$(JDK_TOPDIR)/src/share/native/java/lang/fdlibm/include \ -DARCHPROPNAME='"$(OPENJDK_TARGET_CPU_OSARCH)"' @@ -193,7 +200,7 @@ OPTIMIZATION := HIGH, \ CFLAGS := $(CFLAGS_JDKLIB) \ $(LIBJAVA_CFLAGS), \ - MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libjava/mapfile-vers, \ + MAPFILE := $(LIBJAVA_MAPFILE), \ LDFLAGS := $(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN), \ LDFLAGS_SUFFIX_posix := -ljvm -lverify, \
--- a/make/mapfiles/libawt/mapfile-mawt-vers Fri Jul 21 20:32:51 2017 -0700 +++ b/make/mapfiles/libawt/mapfile-mawt-vers Mon Jul 24 09:37:01 2017 -0700 @@ -201,6 +201,7 @@ Java_sun_print_CUPSPrinter_initIDs; Java_sun_print_CUPSPrinter_getCupsServer; Java_sun_print_CUPSPrinter_getCupsPort; + Java_sun_print_CUPSPrinter_getCupsDefaultPrinter; Java_sun_print_CUPSPrinter_canConnect; Java_sun_print_CUPSPrinter_getMedia; Java_sun_print_CUPSPrinter_getPageSizes;
--- a/make/mapfiles/libawt_headless/mapfile-vers Fri Jul 21 20:32:51 2017 -0700 +++ b/make/mapfiles/libawt_headless/mapfile-vers Mon Jul 24 09:37:01 2017 -0700 @@ -73,6 +73,7 @@ Java_sun_print_CUPSPrinter_initIDs; Java_sun_print_CUPSPrinter_getCupsServer; Java_sun_print_CUPSPrinter_getCupsPort; + Java_sun_print_CUPSPrinter_getCupsDefaultPrinter; Java_sun_print_CUPSPrinter_canConnect; Java_sun_print_CUPSPrinter_getMedia; Java_sun_print_CUPSPrinter_getPageSizes;
--- a/make/mapfiles/libawt_xawt/mapfile-vers Fri Jul 21 20:32:51 2017 -0700 +++ b/make/mapfiles/libawt_xawt/mapfile-vers Mon Jul 24 09:37:01 2017 -0700 @@ -439,6 +439,7 @@ Java_sun_print_CUPSPrinter_initIDs; Java_sun_print_CUPSPrinter_getCupsServer; Java_sun_print_CUPSPrinter_getCupsPort; + Java_sun_print_CUPSPrinter_getCupsDefaultPrinter; Java_sun_print_CUPSPrinter_canConnect; Java_sun_print_CUPSPrinter_getMedia; Java_sun_print_CUPSPrinter_getPageSizes;
--- a/src/aix/native/java/net/aix_close.c Fri Jul 21 20:32:51 2017 -0700 +++ b/src/aix/native/java/net/aix_close.c Mon Jul 24 09:37:01 2017 -0700 @@ -1,5 +1,6 @@ /* - * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, SAP SE 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 @@ -328,6 +329,10 @@ BLOCKING_IO_RETURN_INT( s, recv(s, buf, len, 0) ); } +int NET_NonBlockingRead(int s, void* buf, size_t len) { + BLOCKING_IO_RETURN_INT(s, recv(s, buf, len, MSG_NONBLOCK)); +} + int NET_ReadV(int s, const struct iovec * vector, int count) { BLOCKING_IO_RETURN_INT( s, readv(s, vector, count) ); } @@ -429,8 +434,8 @@ * Auto restarts with adjusted timeout if interrupted by * signal other than our wakeup signal. */ -int NET_Timeout(int s, long timeout) { - long prevtime = 0, newtime; +int NET_Timeout0(int s, long timeout, long currentTime) { + long prevtime = currentTime, newtime; struct timeval t; fdEntry_t *fdEntry = getFdEntry(s); @@ -442,14 +447,6 @@ return -1; } - /* - * Pick up current time as may need to adjust timeout - */ - if (timeout > 0) { - gettimeofday(&t, NULL); - prevtime = t.tv_sec * 1000 + t.tv_usec / 1000; - } - for(;;) { struct pollfd pfd; int rv;
--- a/src/macosx/classes/sun/lwawt/macosx/CAccessibility.java Fri Jul 21 20:32:51 2017 -0700 +++ b/src/macosx/classes/sun/lwawt/macosx/CAccessibility.java Mon Jul 24 09:37:01 2017 -0700 @@ -84,6 +84,15 @@ return null; } + static <T> T invokeAndWait(final Callable<T> callable, final Component c, final T defValue) { + T value = null; + try { + value = LWCToolkit.invokeAndWait(callable, c); + } catch (final Exception e) { e.printStackTrace(); } + + return value != null ? value : defValue; + } + static void invokeLater(final Runnable runnable, final Component c) { try { LWCToolkit.invokeLater(runnable, c); @@ -179,7 +188,7 @@ return new Boolean(as.isAccessibleChildSelected(index)); } - }, c); + }, c, false); } public static AccessibleStateSet getAccessibleStateSet(final AccessibleContext ac, final Component c) { @@ -201,7 +210,7 @@ if (ass == null) return null; return ass.contains(as); } - }, c); + }, c, false); } static Field getAccessibleBundleKeyFieldWithReflection() { @@ -267,7 +276,7 @@ public Integer call() throws Exception { return at.getCharCount(); } - }, c); + }, c, 0); } // Accessibility Threadsafety for JavaComponentAccessibility.m @@ -284,7 +293,7 @@ } public static int getAccessibleIndexInParent(final Accessible a, final Component c) { - if (a == null) return 0; + if (a == null) return -1; return invokeAndWait(new Callable<Integer>() { public Integer call() throws Exception { @@ -292,7 +301,7 @@ if (ac == null) return null; return ac.getAccessibleIndexInParent(); } - }, c); + }, c, -1); } public static AccessibleComponent getAccessibleComponent(final Accessible a, final Component c) { @@ -388,7 +397,7 @@ return aComp.isFocusTraversable(); } - }, c); + }, c, false); } public static Accessible accessibilityHitTest(final Container parent, final float hitPointX, final float hitPointY) { @@ -447,7 +456,7 @@ return aComp.isEnabled(); } - }, c); + }, c, false); } // KCH - can we make this a postEvent instead? @@ -467,6 +476,24 @@ }, c); } + public static void requestSelection(final Accessible a, final Component c) { + if (a == null) return; + invokeLater(new Runnable() { + public void run() { + AccessibleContext ac = a.getAccessibleContext(); + if (ac == null) return; + int i = ac.getAccessibleIndexInParent(); + if (i == -1) return; + Accessible parent = ac.getAccessibleParent(); + AccessibleContext pac = parent.getAccessibleContext(); + if (pac == null) return; + AccessibleSelection as = pac.getAccessibleSelection(); + if (as == null) return; + as.addAccessibleSelection(i); + } + }, c); + } + public static Number getMaximumAccessibleValue(final Accessible a, final Component c) { if (a == null) return null; @@ -571,9 +598,57 @@ if (a == null) return null; return invokeAndWait(new Callable<Object[]>() { public Object[] call() throws Exception { - final ArrayList<Object> childrenAndRoles = new ArrayList<Object>(); + ArrayList<Object> childrenAndRoles = new ArrayList<Object>(); _addChildren(a, whichChildren, allowIgnored, childrenAndRoles); + /* In the case of fetching a selection, need to check to see if + * the active descendant is at the beginning of the list. If it + * is not it needs to be moved to the beginning of the list so + * VoiceOver will annouce it correctly. The list returned + * from Java is always in order from top to bottom, but when shift + * selecting downward (extending the list) or multi-selecting using + * the VO keys control+option+command+return the active descendant + * is not at the top of the list in the shift select down case and + * may not be in the multi select case. + */ + if (whichChildren == JAVA_AX_SELECTED_CHILDREN) { + if (!childrenAndRoles.isEmpty()) { + AccessibleContext activeDescendantAC = + CAccessible.getActiveDescendant(a); + if (activeDescendantAC != null) { + String activeDescendantName = + activeDescendantAC.getAccessibleName(); + AccessibleRole activeDescendantRole = + activeDescendantAC.getAccessibleRole(); + // Move active descendant to front of list. + // List contains pairs of each selected item's + // Accessible and AccessibleRole. + ArrayList<Object> newArray = new ArrayList<Object>(); + int count = childrenAndRoles.size(); + Accessible currentAccessible = null; + AccessibleContext currentAC = null; + String currentName = null; + AccessibleRole currentRole = null; + for (int i = 0; i < count; i+=2) { + // Is this the active descendant? + currentAccessible = (Accessible)childrenAndRoles.get(i); + currentAC = currentAccessible.getAccessibleContext(); + currentName = currentAC.getAccessibleName(); + currentRole = (AccessibleRole)childrenAndRoles.get(i+1); + if ( currentName.equals(activeDescendantName) && + currentRole.equals(activeDescendantRole) ) { + newArray.add(0, currentAccessible); + newArray.add(1, currentRole); + } else { + newArray.add(currentAccessible); + newArray.add(currentRole); + } + } + childrenAndRoles = newArray; + } + } + } + if ((whichChildren < 0) || (whichChildren * 2 >= childrenAndRoles.size())) { return childrenAndRoles.toArray(); }
--- a/src/macosx/classes/sun/lwawt/macosx/CAccessible.java Fri Jul 21 20:32:51 2017 -0700 +++ b/src/macosx/classes/sun/lwawt/macosx/CAccessible.java Mon Jul 24 09:37:01 2017 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 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 @@ -26,19 +26,21 @@ package sun.lwawt.macosx; import java.awt.Component; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.lang.reflect.Field; import javax.accessibility.Accessible; import javax.accessibility.AccessibleContext; import javax.swing.JProgressBar; import javax.swing.JSlider; -import javax.swing.event.CaretEvent; -import javax.swing.event.CaretListener; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import javax.swing.text.JTextComponent; + +import static javax.accessibility.AccessibleContext.ACCESSIBLE_ACTIVE_DESCENDANT_PROPERTY; +import static javax.accessibility.AccessibleContext.ACCESSIBLE_CARET_PROPERTY; +import static javax.accessibility.AccessibleContext.ACCESSIBLE_SELECTION_PROPERTY; +import static javax.accessibility.AccessibleContext.ACCESSIBLE_TEXT_PROPERTY; class CAccessible extends CFRetainedResource implements Accessible { @@ -73,10 +75,13 @@ private static native void unregisterFromCocoaAXSystem(long ptr); private static native void valueChanged(long ptr); + private static native void selectedTextChanged(long ptr); private static native void selectionChanged(long ptr); private Accessible accessible; + private AccessibleContext activeDescendant; + private CAccessible(final Accessible accessible) { super(0L, true); // real pointer will be poked in by native @@ -99,13 +104,10 @@ return accessible.getAccessibleContext(); } - // currently only supports text components public void addNotificationListeners(Component c) { - if (c instanceof JTextComponent) { - JTextComponent tc = (JTextComponent) c; - AXTextChangeNotifier listener = new AXTextChangeNotifier(); - tc.getDocument().addDocumentListener(listener); - tc.addCaretListener(listener); + if (c instanceof Accessible) { + AccessibleContext ac = ((Accessible)c).getAccessibleContext(); + ac.addPropertyChangeListener(new AXChangeNotifier()); } if (c instanceof JProgressBar) { JProgressBar pb = (JProgressBar) c; @@ -117,29 +119,30 @@ } - private class AXTextChangeNotifier implements DocumentListener, CaretListener { - @Override - public void changedUpdate(DocumentEvent e) { - if (ptr != 0) valueChanged(ptr); - } + private class AXChangeNotifier implements PropertyChangeListener { @Override - public void insertUpdate(DocumentEvent e) { - if (ptr != 0) valueChanged(ptr); - } - - @Override - public void removeUpdate(DocumentEvent e) { - if (ptr != 0) valueChanged(ptr); - } - - @Override - public void caretUpdate(CaretEvent e) { - if (ptr != 0) selectionChanged(ptr); + public void propertyChange(PropertyChangeEvent e) { + String name = e.getPropertyName(); + if ( ptr != 0 ) { + if (name.compareTo(ACCESSIBLE_CARET_PROPERTY) == 0) { + selectedTextChanged(ptr); + } else if (name.compareTo(ACCESSIBLE_TEXT_PROPERTY) == 0 ) { + valueChanged(ptr); + } else if (name.compareTo(ACCESSIBLE_SELECTION_PROPERTY) == 0 ) { + selectionChanged(ptr); + } else if (name.compareTo(ACCESSIBLE_ACTIVE_DESCENDANT_PROPERTY) == 0 ) { + Object nv = e.getNewValue(); + if (nv instanceof AccessibleContext) { + activeDescendant = (AccessibleContext)nv; + } + } + } } } private class AXProgressChangeNotifier implements ChangeListener { + @Override public void stateChanged(ChangeEvent e) { if (ptr != 0) valueChanged(ptr); } @@ -148,4 +151,9 @@ static Accessible getSwingAccessible(final Accessible a) { return (a instanceof CAccessible) ? ((CAccessible)a).accessible : a; } + + static AccessibleContext getActiveDescendant(final Accessible a) { + return (a instanceof CAccessible) ? ((CAccessible)a).activeDescendant : null; + } + }
--- a/src/macosx/classes/sun/lwawt/macosx/CInputMethodDescriptor.java Fri Jul 21 20:32:51 2017 -0700 +++ b/src/macosx/classes/sun/lwawt/macosx/CInputMethodDescriptor.java Mon Jul 24 09:37:01 2017 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 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 @@ -57,15 +57,19 @@ } static Object[] getAvailableLocalesInternal() { - List workList = nativeGetAvailableLocales(); + List<Object> workList = nativeGetAvailableLocales(); + Locale currentLocale = CInputMethod.getNativeLocale(); - if (workList != null) { + if (workList == null || workList.isEmpty()) { + return new Object[] { + currentLocale != null ? currentLocale : Locale.getDefault() + }; + } else { + if (currentLocale != null && !workList.contains(currentLocale)) { + workList.add(currentLocale); + } return workList.toArray(); } - - return new Object[] { - Locale.getDefault() - }; } /** @@ -119,5 +123,5 @@ } private static native void nativeInit(); - private static native List nativeGetAvailableLocales(); + private static native List<Object> nativeGetAvailableLocales(); }
--- a/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Fri Jul 21 20:32:51 2017 -0700 +++ b/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Mon Jul 24 09:37:01 2017 -0700 @@ -213,6 +213,7 @@ private boolean isFullScreenAnimationOn; private volatile boolean isIconifyAnimationActive; + private volatile boolean isZoomed; private Window target; private LWWindowPeer peer; @@ -502,14 +503,8 @@ } private boolean isMaximized() { - if (undecorated) { - return this.normalBounds != null; - } - AtomicBoolean ref = new AtomicBoolean(); - execute(ptr -> { - ref.set(CWrapper.NSWindow.isZoomed(ptr)); - }); - return ref.get(); + return undecorated ? this.normalBounds != null + : isZoomed; } private void maximize() { @@ -975,6 +970,11 @@ protected void deliverMoveResizeEvent(int x, int y, int width, int height, boolean byUser) { + AtomicBoolean ref = new AtomicBoolean(); + execute(ptr -> { + ref.set(CWrapper.NSWindow.isZoomed(ptr)); + }); + isZoomed = ref.get(); checkZoom(); final Rectangle oldB = nativeBounds;
--- a/src/macosx/native/sun/awt/AWTWindow.m Fri Jul 21 20:32:51 2017 -0700 +++ b/src/macosx/native/sun/awt/AWTWindow.m Mon Jul 24 09:37:01 2017 -0700 @@ -330,7 +330,7 @@ + (NSArray*) getWindowLayers { static NSArray *windowLayers; static dispatch_once_t token; - + // Initialize the list of possible window layers dispatch_once(&token, ^{ // The layers are ordered from front to back, (i.e. the toppest one is the first) @@ -362,7 +362,7 @@ } + (NSInteger) getTopmostWindowUnderMouseIDImpl:(NSInteger)windowLayer { - NSInteger result = -1; + NSInteger result = -1; NSRect screenRect = [[NSScreen mainScreen] frame]; NSPoint nsMouseLocation = [NSEvent mouseLocation];
--- a/src/macosx/native/sun/awt/CPrinterJob.m Fri Jul 21 20:32:51 2017 -0700 +++ b/src/macosx/native/sun/awt/CPrinterJob.m Mon Jul 24 09:37:01 2017 -0700 @@ -361,6 +361,8 @@ static JNF_MEMBER_CACHE(jm_isCollated, sjc_CPrinterJob, "isCollated", "()Z"); static JNF_MEMBER_CACHE(jm_getFromPage, sjc_CPrinterJob, "getFromPageAttrib", "()I"); static JNF_MEMBER_CACHE(jm_getToPage, sjc_CPrinterJob, "getToPageAttrib", "()I"); + static JNF_MEMBER_CACHE(jm_getMinPage, sjc_CPrinterJob, "getMinPageAttrib", "()I"); + static JNF_MEMBER_CACHE(jm_getMaxPage, sjc_CPrinterJob, "getMaxPageAttrib", "()I"); static JNF_MEMBER_CACHE(jm_getSelectAttrib, sjc_CPrinterJob, "getSelectAttrib", "()I"); static JNF_MEMBER_CACHE(jm_getNumberOfPages, jc_Pageable, "getNumberOfPages", "()I"); static JNF_MEMBER_CACHE(jm_getPageFormat, sjc_CPrinterJob, "getPageFormatFromAttributes", "()Ljava/awt/print/PageFormat;"); @@ -372,31 +374,33 @@ jboolean collated = JNFCallBooleanMethod(env, srcPrinterJob, jm_isCollated); // AWT_THREADING Safe (known object) [printingDictionary setObject:[NSNumber numberWithBool:collated ? YES : NO] forKey:NSPrintMustCollate]; - jint jNumPages = JNFCallIntMethod(env, srcPageable, jm_getNumberOfPages); // AWT_THREADING Safe (!appKit) - if (jNumPages != java_awt_print_Pageable_UNKNOWN_NUMBER_OF_PAGES) - { - jint selectID = JNFCallIntMethod(env, srcPrinterJob, jm_getSelectAttrib); - if (selectID ==0) { - [printingDictionary setObject:[NSNumber numberWithBool:YES] forKey:NSPrintAllPages]; - } else if (selectID == 2) { - // In Mac 10.7, Print ALL is deselected if PrintSelection is YES whether - // NSPrintAllPages is YES or NO - [printingDictionary setObject:[NSNumber numberWithBool:NO] forKey:NSPrintAllPages]; - [printingDictionary setObject:[NSNumber numberWithBool:YES] forKey:NSPrintSelectionOnly]; - } else { + jint selectID = JNFCallIntMethod(env, srcPrinterJob, jm_getSelectAttrib); + jint fromPage = JNFCallIntMethod(env, srcPrinterJob, jm_getFromPage); + jint toPage = JNFCallIntMethod(env, srcPrinterJob, jm_getToPage); + if (selectID ==0) { + [printingDictionary setObject:[NSNumber numberWithBool:YES] forKey:NSPrintAllPages]; + } else if (selectID == 2) { + // In Mac 10.7, Print ALL is deselected if PrintSelection is YES whether + // NSPrintAllPages is YES or NO + [printingDictionary setObject:[NSNumber numberWithBool:NO] forKey:NSPrintAllPages]; + [printingDictionary setObject:[NSNumber numberWithBool:YES] forKey:NSPrintSelectionOnly]; + } else { + jint minPage = JNFCallIntMethod(env, srcPrinterJob, jm_getMinPage); + jint maxPage = JNFCallIntMethod(env, srcPrinterJob, jm_getMaxPage); + + // for PD_SELECTION or PD_NOSELECTION, check from/to page + // to determine which radio button to select + if (fromPage > minPage || toPage < maxPage) { [printingDictionary setObject:[NSNumber numberWithBool:NO] forKey:NSPrintAllPages]; + } else { + [printingDictionary setObject:[NSNumber numberWithBool:YES] forKey:NSPrintAllPages]; } + } - jint fromPage = JNFCallIntMethod(env, srcPrinterJob, jm_getFromPage); - jint toPage = JNFCallIntMethod(env, srcPrinterJob, jm_getToPage); - // setting fromPage and toPage will not be shown in the dialog if printing All pages - [printingDictionary setObject:[NSNumber numberWithInteger:fromPage] forKey:NSPrintFirstPage]; - [printingDictionary setObject:[NSNumber numberWithInteger:toPage] forKey:NSPrintLastPage]; - } - else - { - [printingDictionary setObject:[NSNumber numberWithBool:YES] forKey:NSPrintAllPages]; - } + // setting fromPage and toPage will not be shown in the dialog if printing All pages + [printingDictionary setObject:[NSNumber numberWithInteger:fromPage] forKey:NSPrintFirstPage]; + [printingDictionary setObject:[NSNumber numberWithInteger:toPage] forKey:NSPrintLastPage]; + jobject page = JNFCallObjectMethod(env, srcPrinterJob, jm_getPageFormat); if (page != NULL) { javaPageFormatToNSPrintInfo(env, NULL, page, dst);
--- a/src/macosx/native/sun/awt/JavaAccessibilityAction.m Fri Jul 21 20:32:51 2017 -0700 +++ b/src/macosx/native/sun/awt/JavaAccessibilityAction.m Mon Jul 24 09:37:01 2017 -0700 @@ -64,16 +64,20 @@ jobject fCompLocal = (*env)->NewLocalRef(env, fComponent); if ((*env)->IsSameObject(env, fCompLocal, NULL)) { - return @"unknown"; + return nil; } NSString *str = nil; - jobject jstr = JNFCallStaticObjectMethod(env, jm_getAccessibleActionDescription, fAccessibleAction, fIndex, fCompLocal); + jstring jstr = JNFCallStaticObjectMethod( env, + jm_getAccessibleActionDescription, + fAccessibleAction, + fIndex, + fCompLocal ); if (jstr != NULL) { - NSString *str = JNFJavaToNSString(env, jstr); // AWT_THREADING Safe (AWTRunLoopMode) + str = JNFJavaToNSString(env, jstr); // AWT_THREADING Safe (AWTRunLoopMode) (*env)->DeleteLocalRef(env, jstr); } (*env)->DeleteLocalRef(env, fCompLocal); - return str == nil ? @"unknown" : str; + return str; } - (void)perform
--- a/src/macosx/native/sun/awt/JavaAccessibilityUtilities.h Fri Jul 21 20:32:51 2017 -0700 +++ b/src/macosx/native/sun/awt/JavaAccessibilityUtilities.h Mon Jul 24 09:37:01 2017 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 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 @@ -55,6 +55,7 @@ BOOL isVertical(JNIEnv *env, jobject axContext, jobject component); BOOL isHorizontal(JNIEnv *env, jobject axContext, jobject component); BOOL isShowing(JNIEnv *env, jobject axContext, jobject component); +BOOL isSelectable(JNIEnv *env, jobject axContext, jobject component); NSPoint getAxComponentLocationOnScreen(JNIEnv *env, jobject axComponent, jobject component); jint getAxTextCharCount(JNIEnv *env, jobject axText, jobject component);
--- a/src/macosx/native/sun/awt/JavaAccessibilityUtilities.m Fri Jul 21 20:32:51 2017 -0700 +++ b/src/macosx/native/sun/awt/JavaAccessibilityUtilities.m Mon Jul 24 09:37:01 2017 -0700 @@ -151,6 +151,18 @@ return showing; } +BOOL isSelectable(JNIEnv *env, jobject axContext, jobject component) +{ + static JNF_STATIC_MEMBER_CACHE( jm_SELECTABLE, + sjc_AccessibleState, + "SELECTABLE", + "Ljavax/accessibility/AccessibleState;" ); + jobject axSelectableState = JNFGetStaticObjectField(env, jm_SELECTABLE); + BOOL selectable = containsAxState(env, axContext, axSelectableState, component); + (*env)->DeleteLocalRef(env, axSelectableState); + return selectable; +} + NSPoint getAxComponentLocationOnScreen(JNIEnv *env, jobject axComponent, jobject component) { static JNF_STATIC_MEMBER_CACHE(jm_getLocationOnScreen, sjc_CAccessibility, "getLocationOnScreen", "(Ljavax/accessibility/AccessibleComponent;Ljava/awt/Component;)Ljava/awt/Point;");
--- a/src/macosx/native/sun/awt/JavaComponentAccessibility.h Fri Jul 21 20:32:51 2017 -0700 +++ b/src/macosx/native/sun/awt/JavaComponentAccessibility.h Mon Jul 24 09:37:01 2017 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 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 @@ -50,6 +50,7 @@ - (id)initWithParent:(NSObject*)parent withEnv:(JNIEnv *)env withAccessible:(jobject)accessible withIndex:(jint)index withView:(NSView *)view withJavaRole:(NSString *)javaRole; - (void)unregisterFromCocoaAXSystem; - (void)postValueChanged; +- (void)postSelectedTextChanged; - (void)postSelectionChanged; - (BOOL)isEqual:(id)anObject; - (BOOL)isAccessibleWithEnv:(JNIEnv *)env forAccessible:(jobject)accessible; @@ -71,6 +72,7 @@ - (NSString *)javaRole; - (BOOL)isMenu; - (BOOL)isSelected:(JNIEnv *)env; +- (BOOL)isSelectable:(JNIEnv *)env; - (BOOL)isVisible:(JNIEnv *)env; // attribute names @@ -85,6 +87,8 @@ - (NSArray *)accessibilityChildrenAttribute; - (BOOL)accessibilityIsChildrenAttributeSettable; - (NSUInteger)accessibilityIndexOfChild:(id)child; +- (NSArray *)accessibilityArrayAttributeValues:(NSString *)attribute + index:(NSUInteger)index maxCount:(NSUInteger)maxCount; - (NSNumber *)accessibilityEnabledAttribute; - (BOOL)accessibilityIsEnabledAttributeSettable; - (NSNumber *)accessibilityFocusedAttribute; @@ -92,6 +96,8 @@ - (void)accessibilitySetFocusedAttribute:(id)value; - (NSString *)accessibilityHelpAttribute; - (BOOL)accessibilityIsHelpAttributeSettable; +- (NSValue *)accessibilityIndexAttribute; +- (BOOL)accessibilityIsIndexAttributeSettable; - (id)accessibilityMaxValueAttribute; - (BOOL)accessibilityIsMaxValueAttributeSettable; - (id)accessibilityMinValueAttribute; @@ -108,6 +114,9 @@ - (BOOL)accessibilityIsRoleDescriptionAttributeSettable; - (NSArray *)accessibilitySelectedChildrenAttribute; - (BOOL)accessibilityIsSelectedChildrenAttributeSettable; +- (NSNumber *)accessibilitySelectedAttribute; +- (BOOL)accessibilityIsSelectedAttributeSettable; +- (void)accessibilitySetSelectedAttribute:(id)value; - (NSValue *)accessibilitySizeAttribute; - (BOOL)accessibilityIsSizeAttributeSettable; - (NSString *)accessibilitySubroleAttribute;
--- a/src/macosx/native/sun/awt/JavaComponentAccessibility.m Fri Jul 21 20:32:51 2017 -0700 +++ b/src/macosx/native/sun/awt/JavaComponentAccessibility.m Mon Jul 24 09:37:01 2017 -0700 @@ -201,10 +201,16 @@ NSAccessibilityPostNotification(self, NSAccessibilityValueChangedNotification); } +- (void)postSelectedTextChanged +{ + AWT_ASSERT_APPKIT_THREAD; + NSAccessibilityPostNotification(self, NSAccessibilitySelectedTextChangedNotification); +} + - (void)postSelectionChanged { AWT_ASSERT_APPKIT_THREAD; - NSAccessibilityPostNotification(self, NSAccessibilitySelectedTextChangedNotification); + NSAccessibilityPostNotification(self, NSAccessibilitySelectedChildrenChangedNotification); } - (BOOL)isEqual:(id)anObject @@ -225,7 +231,7 @@ { if (sAttributeNamesForRoleCache == nil) { sAttributeNamesLOCK = [[NSObject alloc] init]; - sAttributeNamesForRoleCache = [[NSMutableDictionary alloc] initWithCapacity:10]; + sAttributeNamesForRoleCache = [[NSMutableDictionary alloc] initWithCapacity:60]; } if (sRoles == nil) { @@ -281,6 +287,7 @@ + (NSArray *)childrenOfParent:(JavaComponentAccessibility *)parent withEnv:(JNIEnv *)env withChildrenCode:(NSInteger)whichChildren allowIgnored:(BOOL)allowIgnored { + if (parent->fAccessible == NULL) return nil; jobjectArray jchildrenAndRoles = (jobjectArray)JNFCallStaticObjectMethod(env, jm_getChildrenAndRoles, parent->fAccessible, parent->fComponent, whichChildren, allowIgnored); // AWT_THREADING Safe (AWTRunLoop) if (jchildrenAndRoles == NULL) return nil; @@ -316,11 +323,15 @@ + (JavaComponentAccessibility *)createWithAccessible:(jobject)jaccessible withEnv:(JNIEnv *)env withView:(NSView *)view { + JavaComponentAccessibility *ret = nil; jobject jcomponent = [(AWTView *)view awtComponent:env]; jint index = JNFCallStaticIntMethod(env, sjm_getAccessibleIndexInParent, jaccessible, jcomponent); - NSString *javaRole = getJavaRole(env, jaccessible, jcomponent); + if (index >= 0) { + NSString *javaRole = getJavaRole(env, jaccessible, jcomponent); + ret = [self createWithAccessible:jaccessible role:javaRole index:index withEnv:env withView:view]; + } (*env)->DeleteLocalRef(env, jcomponent); - return [self createWithAccessible:jaccessible role:javaRole index:index withEnv:env withView:view]; + return ret; } + (JavaComponentAccessibility *) createWithAccessible:(jobject)jaccessible role:(NSString *)javaRole index:(jint)index withEnv:(JNIEnv *)env withView:(NSView *)view @@ -370,7 +381,7 @@ { static JNF_STATIC_MEMBER_CACHE(jm_getInitialAttributeStates, sjc_CAccessibility, "getInitialAttributeStates", "(Ljavax/accessibility/Accessible;Ljava/awt/Component;)[Z"); - NSMutableArray *attributeNames = [NSMutableArray arrayWithCapacity:10]; + NSMutableArray *attributeNames = [NSMutableArray arrayWithCapacity:20]; [attributeNames retain]; // all elements respond to parent, role, role description, window, topLevelUIElement, help @@ -449,6 +460,12 @@ // children if (attributeStatesArray[6]) { [attributeNames addObject:NSAccessibilityChildrenAttribute]; + if ([javaRole isEqualToString:@"list"]) { + [attributeNames addObject:NSAccessibilitySelectedChildrenAttribute]; + [attributeNames addObject:NSAccessibilityVisibleChildrenAttribute]; + } + // Just above, the below mentioned support has been added back in for lists. + // However, the following comments may still be useful for future fixes. // [attributeNames addObject:NSAccessibilitySelectedChildrenAttribute]; // [attributeNames addObject:NSAccessibilityVisibleChildrenAttribute]; //According to AXRoles.txt: @@ -567,6 +584,14 @@ return isChildSelected(env, ((JavaComponentAccessibility *)[self parent])->fAccessible, fIndex, fComponent); } +- (BOOL)isSelectable:(JNIEnv *)env +{ + jobject axContext = [self axContextWithEnv:env]; + BOOL selectable = isSelectable(env, axContext, fComponent); + (*env)->DeleteLocalRef(env, axContext); + return selectable; +} + - (BOOL)isVisible:(JNIEnv *)env { if (fIndex == -1) { @@ -586,18 +611,32 @@ @synchronized(sAttributeNamesLOCK) { NSString *javaRole = [self javaRole]; - NSArray *names = (NSArray *)[sAttributeNamesForRoleCache objectForKey:javaRole]; - if (names != nil) return names; - - names = [self initializeAttributeNamesWithEnv:env]; - if (names != nil) { + NSArray *names = + (NSArray *)[sAttributeNamesForRoleCache objectForKey:javaRole]; + if (names == nil) { + names = [self initializeAttributeNamesWithEnv:env]; #ifdef JAVA_AX_DEBUG NSLog(@"Initializing: %s for %@: %@", __FUNCTION__, javaRole, names); #endif [sAttributeNamesForRoleCache setObject:names forKey:javaRole]; - return names; } - } + // The above set of attributes is immutable per role, but some objects, if + // they are the child of a list, need to add the selected and index attributes. + id myParent = [self accessibilityParentAttribute]; + if ([myParent isKindOfClass:[JavaComponentAccessibility class]]) { + NSString *parentRole = [(JavaComponentAccessibility *)myParent javaRole]; + if ([parentRole isEqualToString:@"list"]) { + NSMutableArray *moreNames = + [[NSMutableArray alloc] initWithCapacity: [names count] + 2]; + [moreNames addObjectsFromArray: names]; + [moreNames addObject:NSAccessibilitySelectedAttribute]; + [moreNames addObject:NSAccessibilityIndexAttribute]; + return moreNames; + } + } + return names; + + } // end @synchronized #ifdef JAVA_AX_DEBUG NSLog(@"Warning in %s: could not find attribute names for role: %@", __FUNCTION__, [self javaRole]); @@ -656,7 +695,10 @@ - (NSArray *)accessibilityChildrenAttribute { JNIEnv* env = [ThreadUtilities getJNIEnv]; - NSArray *children = [JavaComponentAccessibility childrenOfParent:self withEnv:env withChildrenCode:JAVA_AX_VISIBLE_CHILDREN allowIgnored:NO]; + NSArray *children = [JavaComponentAccessibility childrenOfParent:self + withEnv:env + withChildrenCode:JAVA_AX_ALL_CHILDREN + allowIgnored:NO]; NSArray *value = nil; if ([children count] > 0) { @@ -680,7 +722,12 @@ return [super accessibilityIndexOfChild:child]; } - return JNFCallStaticIntMethod([ThreadUtilities getJNIEnv], sjm_getAccessibleIndexInParent, ((JavaComponentAccessibility *)child)->fAccessible, ((JavaComponentAccessibility *)child)->fComponent); + jint returnValue = + JNFCallStaticIntMethod( [ThreadUtilities getJNIEnv], + sjm_getAccessibleIndexInParent, + ((JavaComponentAccessibility *)child)->fAccessible, + ((JavaComponentAccessibility *)child)->fComponent ); + return (returnValue == -1) ? NSNotFound : returnValue; } // Without this optimization accessibilityChildrenAttribute is called in order to get the entire array of children. @@ -754,7 +801,7 @@ jobject val = JNFCallStaticObjectMethod(env, sjm_getAccessibleDescription, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop) if (val == NULL) { - return @"unknown"; + return nil; } NSString* str = JNFJavaToNSString(env, val); (*env)->DeleteLocalRef(env, val); @@ -766,6 +813,18 @@ return NO; } +- (NSValue *)accessibilityIndexAttribute +{ + NSInteger index = fIndex; + NSValue *returnValue = [NSValue value:&index withObjCType:@encode(NSInteger)]; + return returnValue; +} + +- (BOOL)accessibilityIsIndexAttributeSettable +{ + return NO; +} + // Element's maximum value (id) - (id)accessibilityMaxValueAttribute { @@ -939,6 +998,33 @@ return NO; // cmcnote: actually it should be. so need to write accessibilitySetSelectedChildrenAttribute also } +- (NSNumber *)accessibilitySelectedAttribute +{ + return [NSNumber numberWithBool:[self isSelected:[ThreadUtilities getJNIEnv]]]; +} + +- (BOOL)accessibilityIsSelectedAttributeSettable +{ + if ([self isSelectable:[ThreadUtilities getJNIEnv]]) { + return YES; + } else { + return NO; + } +} + +- (void)accessibilitySetSelectedAttribute:(id)value +{ + static JNF_STATIC_MEMBER_CACHE( jm_requestSelection, + sjc_CAccessibility, + "requestSelection", + "(Ljavax/accessibility/Accessible;Ljava/awt/Component;)V" ); + + if ([(NSNumber*)value boolValue]) { + JNIEnv* env = [ThreadUtilities getJNIEnv]; + JNFCallStaticVoidMethod(env, jm_requestSelection, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop) + } +} + // Element size (NSValue) - (NSValue *)accessibilitySizeAttribute { JNIEnv* env = [ThreadUtilities getJNIEnv]; @@ -1005,7 +1091,7 @@ jobject val = JNFCallStaticObjectMethod(env, sjm_getAccessibleName, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop) if (val == NULL) { - return @"unknown"; + return nil; } NSString* str = JNFJavaToNSString(env, val); (*env)->DeleteLocalRef(env, val); @@ -1210,14 +1296,11 @@ JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CAccessibility_focusChanged (JNIEnv *env, jobject jthis) { - JNF_COCOA_ENTER(env); [ThreadUtilities performOnMainThread:@selector(postFocusChanged:) on:[JavaComponentAccessibility class] withObject:nil waitUntilDone:NO]; JNF_COCOA_EXIT(env); } - - /* * Class: sun_lwawt_macosx_CAccessible * Method: valueChanged @@ -1233,6 +1316,22 @@ /* * Class: sun_lwawt_macosx_CAccessible + * Method: selectedTextChanged + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CAccessible_selectedTextChanged +(JNIEnv *env, jclass jklass, jlong element) +{ +JNF_COCOA_ENTER(env); + [ThreadUtilities performOnMainThread:@selector(postSelectedTextChanged) + on:(JavaComponentAccessibility *)jlong_to_ptr(element) + withObject:nil + waitUntilDone:NO]; +JNF_COCOA_EXIT(env); +} + +/* + * Class: sun_lwawt_macosx_CAccessible * Method: selectionChanged * Signature: (I)V */ @@ -1244,7 +1343,6 @@ JNF_COCOA_EXIT(env); } - /* * Class: sun_lwawt_macosx_CAccessible * Method: unregisterFromCocoaAXSystem
--- a/src/macosx/native/sun/awt/JavaTextAccessibility.h Fri Jul 21 20:32:51 2017 -0700 +++ b/src/macosx/native/sun/awt/JavaTextAccessibility.h Mon Jul 24 09:37:01 2017 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 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 @@ -60,6 +60,4 @@ - (NSValue *)accessibilityRangeForPositionAttributeForParameter:(id)parameter; - (NSValue *)accessibilityRangeForIndexAttributeForParameter:(id)parameter; -// actions -- (NSDictionary *)getActions:(JNIEnv *)env; @end
--- a/src/macosx/native/sun/awt/JavaTextAccessibility.m Fri Jul 21 20:32:51 2017 -0700 +++ b/src/macosx/native/sun/awt/JavaTextAccessibility.m Mon Jul 24 09:37:01 2017 -0700 @@ -427,13 +427,15 @@ return javaIntArrayToNSRangeValue(env, axTextRange); } -- (NSDictionary *)getActions:(JNIEnv *)env { - // cmcnote: this isn't correct; text can have actions. Not yet implemented. radr://3941691 - // Editable text has AXShowMenu. Textfields have AXConfirm. Static text has no actions. -#ifdef JAVA_AX_DEBUG - NSLog(@"Not yet implemented: %s\n", __FUNCTION__); -#endif - return nil; -} +/* + * - (NSDictionary *)getActions:(JNIEnv *)env { ... } + * + * In the future, possibly add support: Editable text has AXShowMenu. + * Textfields have AXConfirm. + * + * Note: JLabels (static text) in JLists have a press/click selection action + * which is currently handled in superclass JavaComponentAccessibility. + * If function is added here be sure to use [super getActions:env] for JLabels. + */ @end
--- a/src/share/classes/java/awt/Container.java Fri Jul 21 20:32:51 2017 -0700 +++ b/src/share/classes/java/awt/Container.java Mon Jul 24 09:37:01 2017 -0700 @@ -1089,17 +1089,18 @@ } checkAddToSelf(comp); checkNotAWindow(comp); + /* Reparent the component and tidy up the tree's state. */ + if (comp.parent != null) { + comp.parent.remove(comp); + if (index > component.size()) { + throw new IllegalArgumentException("illegal component position"); + } + } if (thisGC != null) { comp.checkGD(thisGC.getDevice().getIDstring()); } - /* Reparent the component and tidy up the tree's state. */ - if (comp.parent != null) { - comp.parent.remove(comp); - if (index > component.size()) { - throw new IllegalArgumentException("illegal component position"); - } - } + //index == -1 means add to the end. if (index == -1) {
--- a/src/share/classes/javax/swing/JList.java Fri Jul 21 20:32:51 2017 -0700 +++ b/src/share/classes/javax/swing/JList.java Mon Jul 24 09:37:01 2017 -0700 @@ -3052,7 +3052,7 @@ public Accessible getAccessibleAt(Point p) { int i = locationToIndex(p); if (i >= 0) { - return new AccessibleJListChild(JList.this, i); + return new ActionableAccessibleJListChild(JList.this, i); } else { return null; } @@ -3079,7 +3079,7 @@ if (i >= getModel().getSize()) { return null; } else { - return new AccessibleJListChild(JList.this, i); + return new ActionableAccessibleJListChild(JList.this, i); } } @@ -3184,7 +3184,7 @@ protected class AccessibleJListChild extends AccessibleContext implements Accessible, AccessibleComponent { private JList<E> parent = null; - private int indexInParent; + int indexInParent; private Component component = null; private AccessibleContext accessibleContext = null; private ListModel<E> listModel; @@ -3204,7 +3204,7 @@ return getComponentAtIndex(indexInParent); } - private AccessibleContext getCurrentAccessibleContext() { + AccessibleContext getCurrentAccessibleContext() { Component c = getComponentAtIndex(indexInParent); if (c instanceof Accessible) { return c.getAccessibleContext(); @@ -3370,10 +3370,6 @@ } } - public AccessibleAction getAccessibleAction() { - return getCurrentAccessibleContext().getAccessibleAction(); - } - /** * Get the AccessibleComponent associated with this object. In the * implementation of the Java Accessibility API for this class, @@ -3387,15 +3383,18 @@ } public AccessibleSelection getAccessibleSelection() { - return getCurrentAccessibleContext().getAccessibleSelection(); + AccessibleContext ac = getCurrentAccessibleContext(); + return ac != null ? ac.getAccessibleSelection() : null; } public AccessibleText getAccessibleText() { - return getCurrentAccessibleContext().getAccessibleText(); + AccessibleContext ac = getCurrentAccessibleContext(); + return ac != null ? ac.getAccessibleText() : null; } public AccessibleValue getAccessibleValue() { - return getCurrentAccessibleContext().getAccessibleValue(); + AccessibleContext ac = getCurrentAccessibleContext(); + return ac != null ? ac.getAccessibleValue() : null; } @@ -3588,7 +3587,13 @@ public Point getLocationOnScreen() { if (parent != null) { - Point listLocation = parent.getLocationOnScreen(); + Point listLocation; + try { + listLocation = parent.getLocationOnScreen(); + } catch (IllegalComponentStateException e) { + // This can happen if the component isn't visisble + return null; + } Point componentLocation = parent.indexToLocation(indexInParent); if (componentLocation != null) { componentLocation.translate(listLocation.x, listLocation.y); @@ -3728,6 +3733,57 @@ return null; } } + } // inner class AccessibleJListChild + + private class ActionableAccessibleJListChild + extends AccessibleJListChild + implements AccessibleAction { + + ActionableAccessibleJListChild(JList<E> parent, int indexInParent) { + super(parent, indexInParent); + } + + @Override + public AccessibleAction getAccessibleAction() { + AccessibleContext ac = getCurrentAccessibleContext(); + if (ac == null) { + return null; + } else { + AccessibleAction aa = ac.getAccessibleAction(); + if (aa != null) { + return aa; + } else { + return this; + } + } + } + + @Override + public boolean doAccessibleAction(int i) { + if (i == 0) { + JList.this.setSelectedIndex(indexInParent); + return true; + } else { + return false; + } + } + + @Override + public String getAccessibleActionDescription(int i) { + if (i == 0) { + return UIManager.getString("AbstractButton.clickText"); + } else { + return null; + } + } + + @Override + public int getAccessibleActionCount() { + return 1; + } + + } // inner class ActionableAccessibleJListChild + } // inner class AccessibleJList }
--- a/src/share/classes/javax/swing/plaf/basic/BasicLabelUI.java Fri Jul 21 20:32:51 2017 -0700 +++ b/src/share/classes/javax/swing/plaf/basic/BasicLabelUI.java Mon Jul 24 09:37:01 2017 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, 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 @@ -80,6 +80,14 @@ * This method is here so that a subclass could do Label specific * layout and to shorten the method name a little. * + * @param label an instance of {@code JLabel} + * @param fontMetrics a font metrics + * @param text a text + * @param icon an icon + * @param viewR a bounding rectangle to lay out label + * @param iconR a bounding rectangle to lay out icon + * @param textR a bounding rectangle to lay out text + * @return a possibly clipped version of the compound labels string * @see SwingUtilities#layoutCompoundLabel */ protected String layoutCL( @@ -109,6 +117,11 @@ /** * Paint clippedText at textX, textY with the labels foreground color. * + * @param l an instance of {@code JLabel} + * @param g an instance of {@code Graphics} + * @param s a text + * @param textX an X coordinate + * @param textY an Y coordinate * @see #paint * @see #paintDisabledText */ @@ -125,6 +138,11 @@ * Paint clippedText at textX, textY with background.lighter() and then * shifted down and to the right by one pixel with background.darker(). * + * @param l an instance of {@code JLabel} + * @param g an instance of {@code Graphics} + * @param s a text + * @param textX an X coordinate + * @param textY an Y coordinate * @see #paint * @see #paintEnabledText */ @@ -329,26 +347,46 @@ public void uninstallUI(JComponent c) { - uninstallDefaults((JLabel)c); - uninstallComponents((JLabel)c); - uninstallListeners((JLabel)c); - uninstallKeyboardActions((JLabel)c); + uninstallDefaults((JLabel) c); + uninstallComponents((JLabel) c); + uninstallListeners((JLabel) c); + uninstallKeyboardActions((JLabel) c); } - protected void installDefaults(JLabel c){ - LookAndFeel.installColorsAndFont(c, "Label.background", "Label.foreground", "Label.font"); - LookAndFeel.installProperty(c, "opaque", Boolean.FALSE); - } + /** + * Installs default properties. + * + * @param c an instance of {@code JLabel} + */ + protected void installDefaults(JLabel c){ + LookAndFeel.installColorsAndFont(c, "Label.background", "Label.foreground", "Label.font"); + LookAndFeel.installProperty(c, "opaque", Boolean.FALSE); + } + /** + * Registers listeners. + * + * @param c an instance of {@code JLabel} + */ protected void installListeners(JLabel c){ c.addPropertyChangeListener(this); } + /** + * Registers components. + * + * @param c an instance of {@code JLabel} + */ protected void installComponents(JLabel c){ BasicHTML.updateRenderer(c, c.getText()); c.setInheritsPopupMenu(true); } + /** + * Registers keyboard actions. + * + * @param l an instance of {@code JLabel} + */ protected void installKeyboardActions(JLabel l) { int dka = l.getDisplayedMnemonic(); Component lf = l.getLabelFor(); @@ -374,17 +412,37 @@ } } + /** + * Uninstalls default properties. + * + * @param c an instance of {@code JLabel} + */ protected void uninstallDefaults(JLabel c){ } + /** + * Unregisters listeners. + * + * @param c an instance of {@code JLabel} + */ protected void uninstallListeners(JLabel c){ c.removePropertyChangeListener(this); } + /** + * Unregisters components. + * + * @param c an instance of {@code JLabel} + */ protected void uninstallComponents(JLabel c){ BasicHTML.updateRenderer(c, ""); } + /** + * Unregisters keyboard actions. + * + * @param c an instance of {@code JLabel} + */ protected void uninstallKeyboardActions(JLabel c) { SwingUtilities.replaceUIInputMap(c, JComponent.WHEN_FOCUSED, null); SwingUtilities.replaceUIInputMap(c, JComponent.WHEN_IN_FOCUSED_WINDOW, @@ -392,6 +450,12 @@ SwingUtilities.replaceUIActionMap(c, null); } + /** + * Returns an instance of {@code BasicLabelUI}. + * + * @param c a component + * @return an instance of {@code BasicLabelUI} + */ public static ComponentUI createUI(JComponent c) { if (System.getSecurityManager() != null) { AppContext appContext = AppContext.getAppContext(); @@ -440,7 +504,7 @@ doPress(label); } else if (key == RELEASE) { - doRelease(label); + doRelease(label, e.getActionCommand() != null); } } @@ -453,33 +517,77 @@ SwingUtilities.replaceUIInputMap(label, JComponent.WHEN_FOCUSED, inputMap); } int dka = label.getDisplayedMnemonic(); - inputMap.put(KeyStroke.getKeyStroke(dka, BasicLookAndFeel.getFocusAcceleratorKeyMask(), true), RELEASE); + putOnRelease(inputMap, dka, BasicLookAndFeel + .getFocusAcceleratorKeyMask()); // Need this when the sticky keys are enabled - inputMap.put(KeyStroke.getKeyStroke(dka, 0, true), RELEASE); + putOnRelease(inputMap, dka, 0); // Need this if ALT is released before the accelerator - inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ALT, 0, true), RELEASE); + putOnRelease(inputMap, KeyEvent.VK_ALT, 0); label.requestFocus(); } } - private void doRelease(JLabel label) { + private void doRelease(JLabel label, boolean isCommand) { Component labelFor = label.getLabelFor(); if (labelFor != null && labelFor.isEnabled()) { - InputMap inputMap = SwingUtilities.getUIInputMap(label, JComponent.WHEN_FOCUSED); - if (inputMap != null) { - // inputMap should never be null. + if (label.hasFocus()) { + InputMap inputMap = SwingUtilities.getUIInputMap(label, + JComponent.WHEN_FOCUSED); + if (inputMap != null) { + // inputMap should never be null. + int dka = label.getDisplayedMnemonic(); + removeOnRelease(inputMap, dka, BasicLookAndFeel + .getFocusAcceleratorKeyMask()); + removeOnRelease(inputMap, dka, 0); + removeOnRelease(inputMap, KeyEvent.VK_ALT, 0); + } + inputMap = SwingUtilities.getUIInputMap(label, + JComponent.WHEN_IN_FOCUSED_WINDOW); + if (inputMap == null) { + inputMap = new InputMapUIResource(); + SwingUtilities.replaceUIInputMap(label, + JComponent.WHEN_IN_FOCUSED_WINDOW, inputMap); + } int dka = label.getDisplayedMnemonic(); - inputMap.remove(KeyStroke.getKeyStroke(dka, BasicLookAndFeel.getFocusAcceleratorKeyMask(), true)); - inputMap.remove(KeyStroke.getKeyStroke(dka, 0, true)); - inputMap.remove(KeyStroke.getKeyStroke(KeyEvent.VK_ALT, 0, true)); - } - if (labelFor instanceof Container && - ((Container) labelFor).isFocusCycleRoot()) { - labelFor.requestFocus(); + if (isCommand) { + putOnRelease(inputMap, KeyEvent.VK_ALT, 0); + } else { + putOnRelease(inputMap, dka, BasicLookAndFeel + .getFocusAcceleratorKeyMask()); + // Need this when the sticky keys are enabled + putOnRelease(inputMap, dka, 0); + } + if (labelFor instanceof Container && + ((Container) labelFor).isFocusCycleRoot()) { + labelFor.requestFocus(); + } else { + SwingUtilities2.compositeRequestFocus(labelFor); + } } else { - SwingUtilities2.compositeRequestFocus(labelFor); + InputMap inputMap = SwingUtilities.getUIInputMap(label, + JComponent.WHEN_IN_FOCUSED_WINDOW); + int dka = label.getDisplayedMnemonic(); + if (inputMap != null) { + if (isCommand) { + removeOnRelease(inputMap, dka, BasicLookAndFeel + .getFocusAcceleratorKeyMask()); + removeOnRelease(inputMap, dka, 0); + } else { + removeOnRelease(inputMap, KeyEvent.VK_ALT, 0); + } + } } } } + + private void putOnRelease(InputMap inputMap, int keyCode, int modifiers) { + inputMap.put(KeyStroke.getKeyStroke(keyCode, modifiers, true), + RELEASE); + } + + private void removeOnRelease(InputMap inputMap, int keyCode, int modifiers) { + inputMap.remove(KeyStroke.getKeyStroke(keyCode, modifiers, true)); + } + } }
--- a/src/share/classes/javax/swing/plaf/basic/BasicMenuItemUI.java Fri Jul 21 20:32:51 2017 -0700 +++ b/src/share/classes/javax/swing/plaf/basic/BasicMenuItemUI.java Mon Jul 24 09:37:01 2017 -0700 @@ -180,6 +180,15 @@ arrowIcon instanceof UIResource) { arrowIcon = UIManager.getIcon(prefix + ".arrowIcon"); } + updateCheckIcon(); + } + + /** + * Updates check Icon based on column layout + */ + private void updateCheckIcon() { + String prefix = getPropertyPrefix(); + if (checkIcon == null || checkIcon instanceof UIResource) { checkIcon = UIManager.getIcon(prefix + ".checkIcon"); @@ -190,8 +199,8 @@ BasicGraphicsUtils.isLeftToRight(menuItem), menuItem); if (isColumnLayout) { MenuItemCheckIconFactory iconFactory = - (MenuItemCheckIconFactory) UIManager.get(prefix - + ".checkIconFactory"); + (MenuItemCheckIconFactory) UIManager.get(prefix + + ".checkIconFactory"); if (iconFactory != null && MenuItemLayoutHelper.useCheckAndArrow(menuItem) && iconFactory.isCompatible(checkIcon, prefix)) { @@ -966,6 +975,8 @@ BasicHTML.updateRenderer(lbl, text); } else if (name == "iconTextGap") { defaultTextIconGap = ((Number)e.getNewValue()).intValue(); + } else if (name == "horizontalTextPosition") { + updateCheckIcon(); } } }
--- a/src/share/classes/sun/font/FontFamily.java Fri Jul 21 20:32:51 2017 -0700 +++ b/src/share/classes/sun/font/FontFamily.java Mon Jul 24 09:37:01 2017 -0700 @@ -27,6 +27,7 @@ import java.io.File; import java.awt.Font; +import java.io.IOException; import java.util.Collection; import java.util.HashMap; import java.util.concurrent.ConcurrentHashMap; @@ -132,6 +133,16 @@ FileFont newFont = (FileFont)font; File newDir = (new File(newFont.platName)).getParentFile(); + if (existDir != null) { + try { + existDir = existDir.getCanonicalFile(); + } catch (IOException ignored) {} + } + if (newDir != null) { + try { + newDir = newDir.getCanonicalFile(); + } catch (IOException ignored) {} + } return java.util.Objects.equals(newDir, existDir); }
--- a/src/share/classes/sun/management/MemoryPoolImpl.java Fri Jul 21 20:32:51 2017 -0700 +++ b/src/share/classes/sun/management/MemoryPoolImpl.java Mon Jul 24 09:37:01 2017 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -304,8 +304,7 @@ getCount()); } void triggerAction() { - // Should not reach here - throw new AssertionError("Should not reach here"); + // do nothing } void clearAction() { // do nothing @@ -332,8 +331,7 @@ gcSensor.getCount()); } void triggerAction() { - // Should not reach here - throw new AssertionError("Should not reach here"); + // do nothing } void clearAction() { // do nothing
--- a/src/solaris/classes/sun/print/CUPSPrinter.java Fri Jul 21 20:32:51 2017 -0700 +++ b/src/solaris/classes/sun/print/CUPSPrinter.java Mon Jul 24 09:37:01 2017 -0700 @@ -51,6 +51,7 @@ private boolean initialized; private static native String getCupsServer(); private static native int getCupsPort(); + private static native String getCupsDefaultPrinter(); private static native boolean canConnect(String server, int port); private static native boolean initIDs(); // These functions need to be synchronized as @@ -250,6 +251,15 @@ * Returns 2 values - index 0 is printer name, index 1 is the uri. */ static String[] getDefaultPrinter() { + // Try to get user/lpoptions-defined printer name from CUPS + // if not user-set, then go for server default destination + String printerInfo[] = new String[2]; + printerInfo[0] = getCupsDefaultPrinter(); + + if (printerInfo[0] != null) { + printerInfo[1] = null; + return printerInfo.clone(); + } try { URL url = new URL("http", getServer(), getPort(), ""); final HttpURLConnection urlConnection = @@ -285,7 +295,7 @@ attCl)) { HashMap defaultMap = null; - String[] printerInfo = new String[2]; + InputStream is = urlConnection.getInputStream(); HashMap[] responseMap = IPPPrintService.readIPPResponse( is);
--- a/src/solaris/native/java/net/NetworkInterface.c Fri Jul 21 20:32:51 2017 -0700 +++ b/src/solaris/native/java/net/NetworkInterface.c Mon Jul 24 09:37:01 2017 -0700 @@ -1425,7 +1425,7 @@ return -1; #elif defined(__linux__) - static struct ifreq ifr; + struct ifreq ifr; int i; memset((char *)&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name) - 1);
--- a/src/solaris/native/java/net/SocketInputStream.c Fri Jul 21 20:32:51 2017 -0700 +++ b/src/solaris/native/java/net/SocketInputStream.c Mon Jul 24 09:37:01 2017 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, 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 @@ -52,6 +52,42 @@ IO_fd_fdID = NET_GetFileDescriptorID(env); } +#if !defined(__solaris__) +static int NET_ReadWithTimeout(JNIEnv *env, int fd, char *bufP, int len, long timeout) { + int result = 0; + long prevtime = NET_GetCurrentTime(), newtime; + while (timeout > 0) { + result = NET_TimeoutWithCurrentTime(fd, timeout, prevtime); + if (result <= 0) { + if (result == 0) { + JNU_ThrowByName(env, "java/net/SocketTimeoutException", "Read timed out"); + } else if (result == -1) { + if (errno == EBADF) { + JNU_ThrowByName(env, "java/net/SocketException", "Socket closed"); + } else if (errno == ENOMEM) { + JNU_ThrowOutOfMemoryError(env, "NET_Timeout native heap allocation failed"); + } else { + JNU_ThrowByNameWithMessageAndLastError + (env, "java/net/SocketException", "select/poll failed"); + } + } + return -1; + } + result = NET_NonBlockingRead(fd, bufP, len); + if (result == -1 && ((errno == EAGAIN) || (errno == EWOULDBLOCK))) { + newtime = NET_GetCurrentTime(); + timeout -= newtime - prevtime; + if (timeout > 0) { + prevtime = newtime; + } + } else { + break; + } + } + return result; +} +#endif + /* * Class: java_net_SocketInputStream * Method: socketRead0 @@ -99,6 +135,7 @@ bufP = BUF; } +#if defined(__solaris__) if (timeout) { nread = NET_Timeout(fd, timeout); if (nread <= 0) { @@ -126,7 +163,19 @@ } nread = NET_Read(fd, bufP, len); - +#else + if (timeout) { + nread = NET_ReadWithTimeout(env, fd, bufP, len, timeout); + if ((*env)->ExceptionCheck(env)) { + if (bufP != BUF) { + free(bufP); + } + return nread; + } + } else { + nread = NET_Read(fd, bufP, len); + } +#endif if (nread <= 0) { if (nread < 0) {
--- a/src/solaris/native/java/net/bsd_close.c Fri Jul 21 20:32:51 2017 -0700 +++ b/src/solaris/native/java/net/bsd_close.c Mon Jul 24 09:37:01 2017 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -292,6 +292,10 @@ BLOCKING_IO_RETURN_INT( s, recv(s, buf, len, 0) ); } +int NET_NonBlockingRead(int s, void* buf, size_t len) { + BLOCKING_IO_RETURN_INT( s, recv(s, buf, len, MSG_DONTWAIT)); +} + int NET_ReadV(int s, const struct iovec * vector, int count) { BLOCKING_IO_RETURN_INT( s, readv(s, vector, count) ); } @@ -344,8 +348,8 @@ * Auto restarts with adjusted timeout if interrupted by * signal other than our wakeup signal. */ -int NET_Timeout(int s, long timeout) { - long prevtime = 0, newtime; +int NET_Timeout0(int s, long timeout, long currentTime) { + long prevtime = currentTime, newtime; struct timeval t, *tp = &t; fd_set fds; fd_set* fdsp = NULL; @@ -366,9 +370,6 @@ */ if (timeout > 0) { /* Timed */ - struct timeval now; - gettimeofday(&now, NULL); - prevtime = now.tv_sec * 1000 + now.tv_usec / 1000; t.tv_sec = timeout / 1000; t.tv_usec = (timeout % 1000) * 1000; } else if (timeout < 0) {
--- a/src/solaris/native/java/net/linux_close.c Fri Jul 21 20:32:51 2017 -0700 +++ b/src/solaris/native/java/net/linux_close.c Mon Jul 24 09:37:01 2017 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -273,6 +273,10 @@ BLOCKING_IO_RETURN_INT( s, recv(s, buf, len, 0) ); } +int NET_NonBlockingRead(int s, void* buf, size_t len) { + BLOCKING_IO_RETURN_INT( s, recv(s, buf, len, MSG_DONTWAIT) ); +} + int NET_ReadV(int s, const struct iovec * vector, int count) { BLOCKING_IO_RETURN_INT( s, readv(s, vector, count) ); } @@ -324,8 +328,8 @@ * Auto restarts with adjusted timeout if interrupted by * signal other than our wakeup signal. */ -int NET_Timeout(int s, long timeout) { - long prevtime = 0, newtime; +int NET_Timeout0(int s, long timeout, long currentTime) { + long prevtime = currentTime, newtime; struct timeval t; fdEntry_t *fdEntry = getFdEntry(s); @@ -337,14 +341,6 @@ return -1; } - /* - * Pick up current time as may need to adjust timeout - */ - if (timeout > 0) { - gettimeofday(&t, NULL); - prevtime = t.tv_sec * 1000 + t.tv_usec / 1000; - } - for(;;) { struct pollfd pfd; int rv;
--- a/src/solaris/native/java/net/net_util_md.c Fri Jul 21 20:32:51 2017 -0700 +++ b/src/solaris/native/java/net/net_util_md.c Mon Jul 24 09:37:01 2017 -0700 @@ -33,6 +33,7 @@ #include <netdb.h> #include <stdlib.h> #include <dlfcn.h> +#include <sys/time.h> #ifndef _ALLBSD_SOURCE #include <values.h> @@ -1661,3 +1662,20 @@ return timeout; } + +#if !defined(__solaris__) +long NET_GetCurrentTime() { + struct timeval time; + gettimeofday(&time, NULL); + return (time.tv_sec * 1000 + time.tv_usec / 1000); +} + +int NET_TimeoutWithCurrentTime(int s, long timeout, long currentTime) { + return NET_Timeout0(s, timeout, currentTime); +} + +int NET_Timeout(int s, long timeout) { + long currentTime = (timeout > 0) ? NET_GetCurrentTime() : 0; + return NET_Timeout0(s, timeout, currentTime); +} +#endif
--- a/src/solaris/native/java/net/net_util_md.h Fri Jul 21 20:32:51 2017 -0700 +++ b/src/solaris/native/java/net/net_util_md.h Mon Jul 24 09:37:01 2017 -0700 @@ -47,9 +47,13 @@ close subroutine does not return until the select call returns. ... */ -#if defined(__linux__) || defined(MACOSX) || defined (_AIX) +#if !defined(__solaris__) extern int NET_Timeout(int s, long timeout); +extern int NET_Timeout0(int s, long timeout, long currentTime); extern int NET_Read(int s, void* buf, size_t len); +extern int NET_NonBlockingRead(int s, void* buf, size_t len); +extern int NET_TimeoutWithCurrentTime(int s, long timeout, long currentTime); +extern long NET_GetCurrentTime(); extern int NET_RecvFrom(int s, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen); extern int NET_ReadV(int s, const struct iovec * vector, int count);
--- a/src/solaris/native/sun/awt/CUPSfuncs.c Fri Jul 21 20:32:51 2017 -0700 +++ b/src/solaris/native/sun/awt/CUPSfuncs.c Mon Jul 24 09:37:01 2017 -0700 @@ -43,6 +43,10 @@ typedef http_t* (*fn_httpConnect)(const char *, int); typedef void (*fn_httpClose)(http_t *); typedef char* (*fn_cupsGetPPD)(const char *); +typedef cups_dest_t* (*fn_cupsGetDest)(const char *name, + const char *instance, int num_dests, cups_dest_t *dests); +typedef int (*fn_cupsGetDests)(cups_dest_t **dests); +typedef void (*fn_cupsFreeDests)(int num_dests, cups_dest_t *dests); typedef ppd_file_t* (*fn_ppdOpenFile)(const char *); typedef void (*fn_ppdClose)(ppd_file_t *); typedef ppd_option_t* (*fn_ppdFindOption)(ppd_file_t *, const char *); @@ -53,6 +57,9 @@ fn_httpConnect j2d_httpConnect; fn_httpClose j2d_httpClose; fn_cupsGetPPD j2d_cupsGetPPD; +fn_cupsGetDest j2d_cupsGetDest; +fn_cupsGetDests j2d_cupsGetDests; +fn_cupsFreeDests j2d_cupsFreeDests; fn_ppdOpenFile j2d_ppdOpenFile; fn_ppdClose j2d_ppdClose; fn_ppdFindOption j2d_ppdFindOption; @@ -106,6 +113,24 @@ return JNI_FALSE; } + j2d_cupsGetDest = (fn_cupsGetDest)dlsym(handle, "cupsGetDest"); + if (j2d_cupsGetDest == NULL) { + dlclose(handle); + return JNI_FALSE; + } + + j2d_cupsGetDests = (fn_cupsGetDests)dlsym(handle, "cupsGetDests"); + if (j2d_cupsGetDests == NULL) { + dlclose(handle); + return JNI_FALSE; + } + + j2d_cupsFreeDests = (fn_cupsFreeDests)dlsym(handle, "cupsFreeDests"); + if (j2d_cupsFreeDests == NULL) { + dlclose(handle); + return JNI_FALSE; + } + j2d_ppdOpenFile = (fn_ppdOpenFile)dlsym(handle, "ppdOpenFile"); if (j2d_ppdOpenFile == NULL) { dlclose(handle); @@ -170,6 +195,30 @@ /* + * Gets CUPS default printer name. + * + */ +JNIEXPORT jstring JNICALL +Java_sun_print_CUPSPrinter_getCupsDefaultPrinter(JNIEnv *env, + jobject printObj) +{ + jstring cDefPrinter = NULL; + cups_dest_t *dests; + char *defaultPrinter = NULL; + int num_dests = j2d_cupsGetDests(&dests); + int i = 0; + cups_dest_t *dest = j2d_cupsGetDest(NULL, NULL, num_dests, dests); + if (dest != NULL) { + defaultPrinter = dest->name; + if (defaultPrinter != NULL) { + cDefPrinter = JNU_NewStringPlatform(env, defaultPrinter); + } + } + j2d_cupsFreeDests(num_dests, dests); + return cDefPrinter; +} + +/* * Checks if connection can be made to the server. * */
--- a/src/windows/classes/com/sun/java/accessibility/AccessBridge.java Fri Jul 21 20:32:51 2017 -0700 +++ b/src/windows/classes/com/sun/java/accessibility/AccessBridge.java Mon Jul 24 09:37:01 2017 -0700 @@ -4625,6 +4625,10 @@ private void _getVisibleChildrenCount(final AccessibleContext ac) { if (ac == null) return; + if(ac instanceof AccessibleExtendedTable) { + _getVisibleChildrenCount((AccessibleExtendedTable)ac); + return; + } int numChildren = InvocationUtils.invokeAndWait(new Callable<Integer>() { @Override public Integer call() throws Exception { @@ -4666,6 +4670,83 @@ } } + /* + * Recursively descends AccessibleContext and gets the number + * of visible children. Stops search if get to invisible part of table. + */ + private void _getVisibleChildrenCount(final AccessibleExtendedTable acTable) { + if (acTable == null) + return; + int lastVisibleRow = -1; + int lastVisibleColumn = -1; + boolean foundVisible = false; + int rowCount = InvocationUtils.invokeAndWait(new Callable<Integer>() { + @Override + public Integer call() throws Exception { + return acTable.getAccessibleRowCount(); + } + }, acTable); + int columnCount = InvocationUtils.invokeAndWait(new Callable<Integer>() { + @Override + public Integer call() throws Exception { + return acTable.getAccessibleColumnCount(); + } + }, acTable); + for (int rowIdx = 0; rowIdx < rowCount; rowIdx++) { + for (int columnIdx = 0; columnIdx < columnCount; columnIdx++) { + if (lastVisibleRow != -1 && rowIdx > lastVisibleRow) { + continue; + } + if (lastVisibleColumn != -1 && columnIdx > lastVisibleColumn) { + continue; + } + int finalRowIdx = rowIdx; + int finalColumnIdx = columnIdx; + final AccessibleContext ac2 = InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() { + @Override + public AccessibleContext call() throws Exception { + Accessible a = acTable.getAccessibleAt(finalRowIdx, finalColumnIdx); + if (a == null) + return null; + else + return a.getAccessibleContext(); + } + }, acTable); + if (ac2 == null || + (!InvocationUtils.invokeAndWait(new Callable<Boolean>() { + @Override + public Boolean call() throws Exception { + return ac2.getAccessibleStateSet().contains(AccessibleState.SHOWING); + } + }, acTable)) + ) { + if (foundVisible) { + if (columnIdx != 0 && lastVisibleColumn == -1) { + //the same row, so we found the last visible column + lastVisibleColumn = columnIdx - 1; + } else if (columnIdx == 0 && lastVisibleRow == -1) { + lastVisibleRow = rowIdx - 1; + } + } + continue; + } + + foundVisible = true; + + _visibleChildrenCount++; + + if (InvocationUtils.invokeAndWait(new Callable<Integer>() { + @Override + public Integer call() throws Exception { + return ac2.getAccessibleChildrenCount(); + } + }, acTable) > 0) { + _getVisibleChildrenCount(ac2); + } + } + } + } + /** * Gets the visible child of an AccessibleContext at the * specified index @@ -4702,7 +4783,10 @@ if (_visibleChild != null) { return; } - + if(ac instanceof AccessibleExtendedTable) { + _getVisibleChild((AccessibleExtendedTable)ac, index); + return; + } int numChildren = InvocationUtils.invokeAndWait(new Callable<Integer>() { @Override public Integer call() throws Exception { @@ -4711,7 +4795,7 @@ }, ac); for (int i = 0; i < numChildren; i++) { final int idx=i; - final AccessibleContext ac2=InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() { + final AccessibleContext ac2 = InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() { @Override public AccessibleContext call() throws Exception { Accessible a = ac.getAccessibleChild(idx); @@ -4748,6 +4832,82 @@ } } + private void _getVisibleChild(final AccessibleExtendedTable acTable, final int index) { + if (_visibleChild != null) { + return; + } + int lastVisibleRow = -1; + int lastVisibleColumn = -1; + boolean foundVisible = false; + int rowCount = InvocationUtils.invokeAndWait(new Callable<Integer>() { + @Override + public Integer call() throws Exception { + return acTable.getAccessibleRowCount(); + } + }, acTable); + int columnCount = InvocationUtils.invokeAndWait(new Callable<Integer>() { + @Override + public Integer call() throws Exception { + return acTable.getAccessibleColumnCount(); + } + }, acTable); + for (int rowIdx = 0; rowIdx < rowCount; rowIdx++) { + for (int columnIdx = 0; columnIdx < columnCount; columnIdx++) { + if (lastVisibleRow != -1 && rowIdx > lastVisibleRow) { + continue; + } + if (lastVisibleColumn != -1 && columnIdx > lastVisibleColumn) { + continue; + } + int finalRowIdx = rowIdx; + int finalColumnIdx = columnIdx; + final AccessibleContext ac2 = InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() { + @Override + public AccessibleContext call() throws Exception { + Accessible a = acTable.getAccessibleAt(finalRowIdx, finalColumnIdx); + if (a == null) + return null; + else + return a.getAccessibleContext(); + } + }, acTable); + if (ac2 == null || + (!InvocationUtils.invokeAndWait(new Callable<Boolean>() { + @Override + public Boolean call() throws Exception { + return ac2.getAccessibleStateSet().contains(AccessibleState.SHOWING); + } + }, acTable))) { + if (foundVisible) { + if (columnIdx != 0 && lastVisibleColumn == -1) { + //the same row, so we found the last visible column + lastVisibleColumn = columnIdx - 1; + } else if (columnIdx == 0 && lastVisibleRow == -1) { + lastVisibleRow = rowIdx - 1; + } + } + continue; + } + foundVisible = true; + + if (!_foundVisibleChild && _currentVisibleIndex == index) { + _visibleChild = ac2; + _foundVisibleChild = true; + return; + } + _currentVisibleIndex++; + + if (InvocationUtils.invokeAndWait(new Callable<Integer>() { + @Override + public Integer call() throws Exception { + return ac2.getAccessibleChildrenCount(); + } + }, acTable) > 0) { + _getVisibleChild(ac2, index); + } + } + } + } /* ===== Java object memory management code ===== */ @@ -7128,6 +7288,25 @@ * and waits for it to finish blocking the caller thread. * * @param callable the {@code Callable} to invoke + * @param accessibleTable the {@code AccessibleExtendedTable} which would be used to find the right context + * for the task execution + * @param <T> type parameter for the result value + * + * @return the result of the {@code Callable} execution + */ + public static <T> T invokeAndWait(final Callable<T> callable, + final AccessibleExtendedTable accessibleTable) { + if (accessibleTable instanceof AccessibleContext) { + return invokeAndWait(callable, (AccessibleContext)accessibleTable); + } + throw new RuntimeException("Unmapped AccessibleContext used to dispatch event: " + accessibleTable); + } + + /** + * Invokes a {@code Callable} in the {@code AppContext} of the given {@code Accessible} + * and waits for it to finish blocking the caller thread. + * + * @param callable the {@code Callable} to invoke * @param accessible the {@code Accessible} which would be used to find the right context * for the task execution * @param <T> type parameter for the result value
--- a/src/windows/native/sun/windows/awt_FileDialog.cpp Fri Jul 21 20:32:51 2017 -0700 +++ b/src/windows/native/sun/windows/awt_FileDialog.cpp Mon Jul 24 09:37:01 2017 -0700 @@ -349,9 +349,9 @@ // show the Win32 file dialog if (mode == java_awt_FileDialog_LOAD) { - result = AwtFileDialog::GetOpenFileName(&ofn); + result = ::GetOpenFileName(&ofn); } else { - result = AwtFileDialog::GetSaveFileName(&ofn); + result = ::GetSaveFileName(&ofn); } // Fix for 4181310: FileDialog does not show up. // If the dialog is not shown because of invalid file name @@ -361,9 +361,9 @@ if (dlgerr == FNERR_INVALIDFILENAME) { _tcscpy_s(fileBuffer, bufferLimit, TEXT("")); if (mode == java_awt_FileDialog_LOAD) { - result = AwtFileDialog::GetOpenFileName(&ofn); + result = ::GetOpenFileName(&ofn); } else { - result = AwtFileDialog::GetSaveFileName(&ofn); + result = ::GetSaveFileName(&ofn); } } } @@ -422,22 +422,6 @@ delete[] ofn.lpstrFile; } -BOOL -AwtFileDialog::GetOpenFileName(LPOPENFILENAME data) { - return static_cast<BOOL>(reinterpret_cast<INT_PTR>( - AwtToolkit::GetInstance().InvokeFunction((void*(*)(void*)) - ::GetOpenFileName, data))); - -} - -BOOL -AwtFileDialog::GetSaveFileName(LPOPENFILENAME data) { - return static_cast<BOOL>(reinterpret_cast<INT_PTR>( - AwtToolkit::GetInstance().InvokeFunction((void *(*)(void *)) - ::GetSaveFileName, data))); - -} - BOOL AwtFileDialog::InheritsNativeMouseWheelBehavior() {return true;} void AwtFileDialog::_DisposeOrHide(void *param) @@ -585,9 +569,10 @@ */ jobject peerGlobal = env->NewGlobalRef(peer); - AwtToolkit::GetInstance().InvokeFunction(AwtFileDialog::Show, peerGlobal); - - env->DeleteGlobalRef(peerGlobal); + if (!AwtToolkit::GetInstance().PostMessage(WM_AWT_INVOKE_METHOD, + (WPARAM)AwtFileDialog::Show, (LPARAM)peerGlobal)) { + env->DeleteGlobalRef(peerGlobal); + } CATCH_BAD_ALLOC; }
--- a/src/windows/native/sun/windows/awt_FileDialog.h Fri Jul 21 20:32:51 2017 -0700 +++ b/src/windows/native/sun/windows/awt_FileDialog.h Mon Jul 24 09:37:01 2017 -0700 @@ -60,9 +60,6 @@ static void Initialize(JNIEnv *env, jstring filterDescription); static void Show(void *peer); - static BOOL GetOpenFileName(LPOPENFILENAME); - static BOOL GetSaveFileName(LPOPENFILENAME); - virtual BOOL InheritsNativeMouseWheelBehavior(); // some methods called on Toolkit thread
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/awt/Container/MoveToOtherScreenTest/MoveToOtherScreenTest.java Mon Jul 24 09:37:01 2017 -0700 @@ -0,0 +1,87 @@ +/* + * Copyright (c) 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. + */ + +import javax.swing.JFrame; +import javax.swing.SwingUtilities; +import java.awt.Canvas; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.lang.reflect.InvocationTargetException; + + + +/* @test + @bug 8160696 + @summary IllegalArgumentException: adding a component to a container on a different GraphicsDevice + @author Mikhail Cherkasov + @run main MoveToOtherScreenTest +*/ +public class MoveToOtherScreenTest { + + private static volatile boolean twoDisplays = true; + private static final Canvas canvas = new Canvas(); + private static final Frame[] frms = new JFrame[2]; + + public static void main(String[] args) throws InterruptedException, InvocationTargetException { + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + GraphicsEnvironment ge = GraphicsEnvironment. + getLocalGraphicsEnvironment(); + GraphicsDevice[] gds = ge.getScreenDevices(); + if (gds.length < 2) { + System.out.println("Test requires at least 2 displays"); + twoDisplays = false; + return; + } + for (int i = 0; i < 2; i++) { + GraphicsConfiguration conf = gds[i].getConfigurations()[0]; + JFrame frm = new JFrame("Frame " + i); + frm.setLocation(conf.getBounds().x, 0); // On first screen + frm.setSize(new Dimension(400, 400)); + frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frm.setVisible(true); + frms[i] = frm; + } + canvas.setBackground(Color.red); + frms[0].add(canvas); + } + }); + if(!twoDisplays){ + return; + } + Thread.sleep(200); + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + frms[1].add(canvas); + } + }); + for (Frame frm : frms) { + frm.dispose(); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/awt/Dialog/DialogAboveFrame/DialogAboveFrameTest.java Mon Jul 24 09:37:01 2017 -0700 @@ -0,0 +1,81 @@ +/* + * Copyright (c) 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 + * @bug 8169589 + * @summary Activating a dialog puts to back another dialog owned by the same frame + * @author Dmitry Markov + * @library ../../regtesthelpers + * @build Util + * @run main DialogAboveFrameTest + */ + +import java.awt.Color; +import java.awt.Dialog; +import java.awt.Frame; +import java.awt.Point; +import java.awt.Robot; + +import test.java.awt.regtesthelpers.Util; + +public class DialogAboveFrameTest { + public static void main(String[] args) { + Robot robot = Util.createRobot(); + + Frame frame = new Frame("Frame"); + frame.setBackground(Color.BLUE); + frame.setBounds(200, 50, 300, 300); + frame.setVisible(true); + + Dialog dialog1 = new Dialog(frame, "Dialog 1", false); + dialog1.setBackground(Color.RED); + dialog1.setBounds(100, 100, 200, 200); + dialog1.setVisible(true); + + Dialog dialog2 = new Dialog(frame, "Dialog 2", false); + dialog2.setBackground(Color.GREEN); + dialog2.setBounds(400, 100, 200, 200); + dialog2.setVisible(true); + + Util.waitForIdle(robot); + + Util.clickOnComp(dialog2, robot); + Util.waitForIdle(robot); + + Point point = dialog1.getLocationOnScreen(); + int x = point.x + (int)(dialog1.getWidth() * 0.9); + int y = point.y + (int)(dialog1.getHeight() * 0.9); + + try { + if (!robot.getPixelColor(x, y).equals(dialog1.getBackground())) { + throw new RuntimeException("Test FAILED: Dialog is behind the frame"); + } + } finally { + frame.dispose(); + dialog1.dispose(); + dialog2.dispose(); + } + } +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/awt/FileDialog/DeleteInsideFileDialog/DeleteInsideFileDialogTest.java Mon Jul 24 09:37:01 2017 -0700 @@ -0,0 +1,81 @@ +/* + * Copyright (c) 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 + @bug 8075516 + @requires os.family=="windows" + @summary Deleting a file from either the open or save java.awt.FileDialog + hangs. + @run main/manual DeleteInsideFileDialogTest +*/ + +import java.awt.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +public class DeleteInsideFileDialogTest { + + private static Path dir; + private static Path file1; + private static Path file2; + private static Frame f; + private static FileDialog fd; + + public static void main(String[] args) throws Exception { + + String instructions = + "1) Delete file deleteMe.tst in the opened File Dialog window" + + " using the right click popup menu\n" + + "2) Select thenSelectMe.tst file in the File Dialog and press" + + " Open (if this is not possible the test fails)\n"; + dir = Files.createTempDirectory("Test"); + file1 = Files.createFile(Paths.get(dir.toString(), "deleteMe.tst")); + file2 = Files.createFile(Paths.get(dir.toString(), "thenSelectMe.tst")); + try { + f = new Frame("Instructions"); + f.add(new TextArea(instructions, 6, 60, TextArea.SCROLLBARS_NONE)); + f.pack(); + f.setLocation(100, 500); + f.setVisible(true); + + fd = new FileDialog((Frame)null); + fd.setDirectory(dir.toString()); + fd.setVisible(true); + if (fd.getFile() == null) { + throw new RuntimeException("Failed"); + } + } finally { + if (fd != null) { + fd.dispose(); + } + if (f != null) { + f.dispose(); + } + Files.deleteIfExists(file1); + Files.deleteIfExists(file2); + Files.deleteIfExists(dir); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/awt/Frame/NormalToIconified/NormalToIconifiedTest.java Mon Jul 24 09:37:01 2017 -0700 @@ -0,0 +1,105 @@ +/* + * Copyright (c) 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 + * @bug 8171949 + * @summary Tests that bitwise mask is set and state listener is notified during state transition. + * @author Dmitry Markov + * @library ../../regtesthelpers + * @build Util + * @run main NormalToIconifiedTest + */ + +import java.awt.Frame; +import java.awt.Robot; +import java.awt.event.WindowEvent; +import java.awt.event.WindowStateListener; +import java.util.concurrent.atomic.AtomicBoolean; + +import test.java.awt.regtesthelpers.Util; + +public class NormalToIconifiedTest { + private static final AtomicBoolean listenerNotified = new AtomicBoolean(false); + + public static void main(String[] args) { + Robot robot = Util.createRobot(); + + Frame testFrame = new Frame("Test Frame"); + testFrame.setSize(200, 200); + testFrame.addWindowStateListener(new WindowStateListener() { + @Override + public void windowStateChanged(WindowEvent e) { + listenerNotified.set(true); + synchronized (listenerNotified) { + listenerNotified.notifyAll(); + } + } + }); + testFrame.setVisible(true); + + Frame mainFrame = new Frame("Main Frame"); + mainFrame.setSize(200, 200); + mainFrame.setLocationRelativeTo(null); + mainFrame.setVisible(true); + + Util.waitForIdle(robot); + + try { + Util.clickOnComp(mainFrame, robot); + Util.waitForIdle(robot); + + // NORMAL -> ICONIFIED + listenerNotified.set(false); + testFrame.setExtendedState(Frame.ICONIFIED); + Util.waitForIdle(robot); + + Util.waitForCondition(listenerNotified, 2000); + if (!listenerNotified.get()) { + throw new RuntimeException("Test FAILED! Window state listener was not notified during NORMAL to" + + "ICONIFIED transition"); + } + if (testFrame.getExtendedState() != Frame.ICONIFIED) { + throw new RuntimeException("Test FAILED! Frame is not in ICONIFIED state"); + } + + // ICONIFIED -> NORMAL + listenerNotified.set(false); + testFrame.setExtendedState(Frame.NORMAL); + Util.waitForIdle(robot); + + Util.waitForCondition(listenerNotified, 2000); + if (!listenerNotified.get()) { + throw new RuntimeException("Test FAILED! Window state listener was not notified during ICONIFIED to" + + "NORMAL transition"); + } + if (testFrame.getExtendedState() != Frame.NORMAL) { + throw new RuntimeException("Test FAILED! Frame is not in NORMAL state"); + } + } finally { + testFrame.dispose(); + mainFrame.dispose(); + } + } +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/awt/Frame/ObscuredFrame/ObscuredFrameTest.java Mon Jul 24 09:37:01 2017 -0700 @@ -0,0 +1,71 @@ +/* + * Copyright (c) 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 + * @bug 8171952 + * @summary Tests that getMousePosition() returns null for obscured component. + * @author Dmitry Markov + * @library ../../regtesthelpers + * @build Util + * @run main ObscuredFrameTest + */ + +import java.awt.*; + +import test.java.awt.regtesthelpers.Util; + +public class ObscuredFrameTest { + public static void main(String[] args) { + Robot robot = Util.createRobot(); + + Frame frame = new Frame("Obscured Frame"); + frame.setSize(200, 200); + frame.setLocationRelativeTo(null); + Button button = new Button("Button"); + frame.add(button); + + Dialog dialog = new Dialog(frame, "Visible Dialog", false); + dialog.setSize(200, 200); + dialog.setLocationRelativeTo(null); + dialog.setVisible(true); + + frame.setVisible(true); + + Util.waitForIdle(robot); + + Util.pointOnComp(button, robot); + Util.waitForIdle(robot); + robot.delay(2000); + + try { + if (button.getMousePosition() != null) { + throw new RuntimeException("Test Failed! Mouse position is not null for obscured component."); + } + } finally { + frame.dispose(); + dialog.dispose(); + } + } +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/awt/MouseInfo/GetPointerInfoTest.java Mon Jul 24 09:37:01 2017 -0700 @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2014, 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 + @summary unit test for getPointerInfo() from MouseInfo class + @author dav@sparc.spb.su: area= + @bug 4009555 + @run main GetPointerInfoTest +*/ + +import java.awt.*; + +/** + * Simply check the result on non-null and results are correct. + */ +public class GetPointerInfoTest { + private static final String successStage = "Test stage completed.Passed."; + + public static void main(String[] args) throws Exception { + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + GraphicsDevice[] gds = ge.getScreenDevices(); + int gdslen = gds.length; + System.out.println("There are " + gdslen + " Graphics Devices"); + if (gdslen == 0) { + System.out.println("Nothing to be done."); + return; + } + Robot robot = new Robot(gds[0]); + robot.setAutoDelay(0); + robot.setAutoWaitForIdle(true); + robot.delay(10); + robot.waitForIdle(); + Point p = new Point(101, 99); + robot.mouseMove(p.x, p.y); + + PointerInfo pi = MouseInfo.getPointerInfo(); + if (pi == null) { + throw new RuntimeException("Test failed. getPointerInfo() returned null value."); + } else { + System.out.println(successStage); + } + Point piLocation = pi.getLocation(); + + if (piLocation.x != p.x || piLocation.y != p.y) { + throw new RuntimeException("Test failed.getPointerInfo() returned incorrect result."); + } else { + System.out.println(successStage); + } + + System.out.println("Test PASSED."); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/awt/MouseInfo/MultiscreenPointerInfo.java Mon Jul 24 09:37:01 2017 -0700 @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2014, 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 + @summary unit test for getPointerInfo() from MouseInfo class + @author prs@sparc.spb.su: area= + @bug 4009555 + @run main MultiscreenPointerInfo +*/ + +import java.awt.*; + +/** + * Simply check the result on non-null and results are correct. + */ +public class MultiscreenPointerInfo +{ + private static final String successStage = "Test stage completed.Passed."; + + public static void main(String[] args) throws Exception { + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + GraphicsDevice[] gds = ge.getScreenDevices(); + int gdslen = gds.length; + System.out.println("There are " + gdslen + " Graphics Devices"); + if (gdslen < 2) { + System.out.println("Nothing to be done. PASSED automatically."); + return; + } + Rectangle rx = gds[1].getDefaultConfiguration().getBounds(); + Robot robot; + + if (rx.x == 0 && rx.y == 0) { + // Assuming independent graphics devices + robot = new Robot(gds[1]); + } else { + // Means we have a virtual device + robot = new Robot(gds[0]); + } + robot.setAutoDelay(0); + robot.setAutoWaitForIdle(true); + robot.delay(10); + robot.waitForIdle(); + Point p = new Point(rx.x + 101, rx.y + 99); + robot.mouseMove(p.x, p.y); + PointerInfo pi = MouseInfo.getPointerInfo(); + if (pi == null) { + throw new RuntimeException("Test failed. getPointerInfo() returned null value."); + } else { + System.out.println(successStage); + } + + Point piLocation = pi.getLocation(); + + if (piLocation.x != p.x || piLocation.y != p.y) { + throw new RuntimeException("Test failed.getPointerInfo() returned incorrect location."); + } else { + System.out.println(successStage); + } + + GraphicsDevice dev = pi.getDevice(); + + if (dev != gds[1]) { + throw new RuntimeException("Test failed.getPointerInfo() returned incorrect device."); + } else { + System.out.println(successStage); + } + System.out.println("Test PASSED."); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/awt/Window/WindowDeadlockTest/WindowDeadlockTest.java Mon Jul 24 09:37:01 2017 -0700 @@ -0,0 +1,72 @@ +/* + * Copyright (c) 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 + * 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 8176490 + * @summary Tests that there is no hang or deadlock when the visibility + * of parent and child windows is changed. + * @library ../../regtesthelpers + * @build Util + * @run main/timeout=20 WindowDeadlockTest + */ + +import java.awt.Dialog; +import java.awt.Frame; +import java.awt.Robot; + +import test.java.awt.regtesthelpers.Util; + +public class WindowDeadlockTest { + public static void main(String[] args) throws Exception { + Robot robot = Util.createRobot(); + + Frame main = new Frame("Main"); + main.setBounds(0, 0, 200, 100); + main.setVisible(true); + + Dialog first = new Dialog(main, "First"); + first.setBounds(250, 0, 200, 100); + first.setVisible(true); + + Dialog second = new Dialog(first, "Second"); + second.setBounds(0, 150, 200, 100); + second.setVisible(true); + + Util.waitForIdle(robot); + robot.delay(2000); + + Dialog third = new Dialog(first, "Third", false); + third.setBounds(250, 150, 200, 100); + third.setVisible(true); + first.setVisible(false); // the hang takes place here + + Util.waitForIdle(robot); + robot.delay(2000); + + third.dispose(); + second.dispose(); + first.dispose(); + main.dispose(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/awt/print/PageFormat/WrongPaperPrintingTest.java Mon Jul 24 09:37:01 2017 -0700 @@ -0,0 +1,239 @@ +/* + * Copyright (c) 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 + * 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 8167102 + @summary PrintRequestAttributeSet breaks page size set using PageFormat + @ignore Exclude the test until 8167102 is resolved by a new reassessed fix + @run main/manual WrongPaperPrintingTest + */ + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.FlowLayout; +import java.awt.Graphics; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.print.PageFormat; +import java.awt.print.Paper; +import java.awt.print.Printable; +import java.awt.print.PrinterException; +import java.awt.print.PrinterJob; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import javax.print.attribute.HashPrintRequestAttributeSet; +import javax.print.attribute.PrintRequestAttributeSet; +import javax.print.attribute.Size2DSyntax; +import javax.print.attribute.standard.Chromaticity; +import javax.print.attribute.standard.MediaSize; +import javax.print.attribute.standard.MediaSizeName; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextArea; +import javax.swing.SwingUtilities; +import javax.swing.Timer; +import javax.swing.WindowConstants; + +public class WrongPaperPrintingTest implements Printable { + private static final CountDownLatch testEndedSignal = new CountDownLatch(1); + private static final int testTimeout = 300000; + private static volatile String testFailureMsg; + private static volatile boolean testPassed; + private static volatile boolean testFinished; + + public static void main(String[] args) { + SwingUtilities.invokeLater(() -> createAndShowTestDialog()); + + try { + if (!testEndedSignal.await(testTimeout, TimeUnit.MILLISECONDS)) { + throw new RuntimeException(String.format( + "Test timeout '%d ms' elapsed.", testTimeout)); + } + if (!testPassed) { + String failureMsg = testFailureMsg; + if ((failureMsg != null) && (!failureMsg.trim().isEmpty())) { + throw new RuntimeException(failureMsg); + } else { + throw new RuntimeException("Test failed."); + } + } + } catch (InterruptedException ie) { + throw new RuntimeException(ie); + } finally { + testFinished = true; + } + } + + private static void doTest() { + PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); + aset.add(Chromaticity.MONOCHROME); + + MediaSize isoA5Size = MediaSize.getMediaSizeForName(MediaSizeName.ISO_A5); + float[] size = isoA5Size.getSize(Size2DSyntax.INCH); + Paper paper = new Paper(); + paper.setSize(size[0] * 72.0, size[1] * 72.0); + paper.setImageableArea(0.0, 0.0, size[0] * 72.0, size[1] * 72.0); + PageFormat pf = new PageFormat(); + pf.setPaper(paper); + + PrinterJob job = PrinterJob.getPrinterJob(); + job.setPrintable(new WrongPaperPrintingTest(), job.validatePage(pf)); + if (job.printDialog()) { + try { + job.print(aset); + } catch (PrinterException pe) { + throw new RuntimeException(pe); + } + } + } + + private static void pass() { + testPassed = true; + testEndedSignal.countDown(); + } + + private static void fail(String failureMsg) { + testFailureMsg = failureMsg; + testPassed = false; + testEndedSignal.countDown(); + } + + private static String convertMillisToTimeStr(int millis) { + if (millis < 0) { + return "00:00:00"; + } + int hours = millis / 3600000; + int minutes = (millis - hours * 3600000) / 60000; + int seconds = (millis - hours * 3600000 - minutes * 60000) / 1000; + return String.format("%02d:%02d:%02d", hours, minutes, seconds); + } + + private static void createAndShowTestDialog() { + String description = + " To run this test it is required to have a virtual PDF\r\n" + + " printer or any other printer supporting A5 paper size.\r\n" + + "\r\n" + + " 1. Verify that NOT A5 paper size is set as default for the\r\n" + + " printer to be used.\r\n" + + " 2. Click on \"Start Test\" button.\r\n" + + " 3. In the shown print dialog select the printer and click\r\n" + + " on \"Print\" button.\r\n" + + " 4. Verify that a page with a drawn rectangle is printed on\r\n" + + " a paper of A5 size which is (5.8 x 8.3 in) or\r\n" + + " (148 x 210 mm).\r\n" + + "\r\n" + + " If the printed page size is correct, click on \"PASS\"\r\n" + + " button, otherwise click on \"FAIL\" button."; + + final JDialog dialog = new JDialog(); + dialog.setTitle("WrongPaperPrintingTest"); + dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + dialog.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + dialog.dispose(); + fail("Main dialog was closed."); + } + }); + + final JLabel testTimeoutLabel = new JLabel(String.format( + "Test timeout: %s", convertMillisToTimeStr(testTimeout))); + final long startTime = System.currentTimeMillis(); + final Timer timer = new Timer(0, null); + timer.setDelay(1000); + timer.addActionListener((e) -> { + int leftTime = testTimeout - (int)(System.currentTimeMillis() - startTime); + if ((leftTime < 0) || testFinished) { + timer.stop(); + dialog.dispose(); + } + testTimeoutLabel.setText(String.format( + "Test timeout: %s", convertMillisToTimeStr(leftTime))); + }); + timer.start(); + + JTextArea textArea = new JTextArea(description); + textArea.setEditable(false); + + final JButton testButton = new JButton("Start Test"); + final JButton passButton = new JButton("PASS"); + final JButton failButton = new JButton("FAIL"); + testButton.addActionListener((e) -> { + testButton.setEnabled(false); + new Thread(() -> { + try { + doTest(); + + SwingUtilities.invokeLater(() -> { + passButton.setEnabled(true); + failButton.setEnabled(true); + }); + } catch (Throwable t) { + t.printStackTrace(); + dialog.dispose(); + fail("Exception occurred in a thread executing the test."); + } + }).start(); + }); + passButton.setEnabled(false); + passButton.addActionListener((e) -> { + dialog.dispose(); + pass(); + }); + failButton.setEnabled(false); + failButton.addActionListener((e) -> { + dialog.dispose(); + fail("Size of a printed page is wrong."); + }); + + JPanel mainPanel = new JPanel(new BorderLayout()); + JPanel labelPanel = new JPanel(new FlowLayout()); + labelPanel.add(testTimeoutLabel); + mainPanel.add(labelPanel, BorderLayout.NORTH); + mainPanel.add(textArea, BorderLayout.CENTER); + JPanel buttonPanel = new JPanel(new FlowLayout()); + buttonPanel.add(testButton); + buttonPanel.add(passButton); + buttonPanel.add(failButton); + mainPanel.add(buttonPanel, BorderLayout.SOUTH); + dialog.add(mainPanel); + + dialog.pack(); + dialog.setVisible(true); + } + + @Override + public int print(Graphics g, PageFormat pf, int pageIndex) + throws PrinterException { + if (pageIndex == 0) { + g.setColor(Color.RED); + g.drawRect((int)pf.getImageableX(), (int)pf.getImageableY(), + (int)pf.getImageableWidth(), (int)pf.getImageableHeight()); + return Printable.PAGE_EXISTS; + } else { + return Printable.NO_SUCH_PAGE; + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/awt/print/PrinterJob/DlgAttrsBug.java Mon Jul 24 09:37:01 2017 -0700 @@ -0,0 +1,152 @@ +/* + * Copyright (c) 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 + * @bug 8061258 + * @summary PrinterJob's native Print Dialog does not reflect + * specified Copies or Page Ranges + * @run main/manual DlgAttrsBug + */ +import java.awt.BorderLayout; +import java.awt.FlowLayout; +import java.awt.Graphics; +import java.awt.print.PageFormat; +import java.awt.print.Printable; +import java.awt.print.PrinterException; +import java.awt.print.PrinterJob; +import javax.print.attribute.HashPrintRequestAttributeSet; +import javax.print.attribute.PrintRequestAttributeSet; +import javax.print.attribute.standard.Copies; +import javax.print.attribute.standard.PageRanges; +import javax.print.attribute.standard.DialogTypeSelection; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JPanel; +import javax.swing.JTextArea; +import javax.swing.SwingUtilities; + + +public class DlgAttrsBug implements Printable { + private static Thread mainThread; + private static boolean testPassed; + private static boolean testGeneratedInterrupt; + + public static void main(String[] args) throws Exception { + SwingUtilities.invokeAndWait(() -> { + doTest(DlgAttrsBug::printTest); + }); + mainThread = Thread.currentThread(); + try { + Thread.sleep(30000); + } catch (InterruptedException e) { + if (!testPassed && testGeneratedInterrupt) { + throw new RuntimeException("Print Dialog does not " + + "reflect Copies or Page Ranges"); + } + } + if (!testGeneratedInterrupt) { + throw new RuntimeException("user has not executed the test"); + } + } + + private static void printTest() { + PrinterJob job = PrinterJob.getPrinterJob(); + if (job.getPrintService() == null) { + System.out.println("No printers. Test cannot continue"); + return; + } + job.setPrintable(new DlgAttrsBug()); + PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); + aset.add(new Copies(5)); + aset.add(new PageRanges(3,4)); + aset.add(DialogTypeSelection.NATIVE); + job.printDialog(aset); + } + + public static synchronized void pass() { + testPassed = true; + testGeneratedInterrupt = true; + mainThread.interrupt(); + } + + public static synchronized void fail() { + testPassed = false; + testGeneratedInterrupt = true; + mainThread.interrupt(); + } + + private static void doTest(Runnable action) { + String description + = " Visual inspection of print dialog is required.\n" + + " A print dialog will be shown.\n " + + " Please verify Copies 5 is selected.\n" + + " Also verify, Page Range is selected with " + + " from page 3 and to Page 4.\n" + + " If ok, press PASS else press FAIL"; + + final JDialog dialog = new JDialog(); + dialog.setTitle("printSelectionTest"); + JTextArea textArea = new JTextArea(description); + textArea.setEditable(false); + final JButton testButton = new JButton("Start Test"); + final JButton passButton = new JButton("PASS"); + passButton.setEnabled(false); + passButton.addActionListener((e) -> { + dialog.dispose(); + pass(); + }); + final JButton failButton = new JButton("FAIL"); + failButton.setEnabled(false); + failButton.addActionListener((e) -> { + dialog.dispose(); + fail(); + }); + testButton.addActionListener((e) -> { + testButton.setEnabled(false); + action.run(); + passButton.setEnabled(true); + failButton.setEnabled(true); + }); + JPanel mainPanel = new JPanel(new BorderLayout()); + mainPanel.add(textArea, BorderLayout.CENTER); + JPanel buttonPanel = new JPanel(new FlowLayout()); + buttonPanel.add(testButton); + buttonPanel.add(passButton); + buttonPanel.add(failButton); + mainPanel.add(buttonPanel, BorderLayout.SOUTH); + dialog.add(mainPanel); + dialog.pack(); + dialog.setVisible(true); + } + + public int print(Graphics g, PageFormat pf, int pi) + throws PrinterException { + System.out.println("pi = " + pi); + if (pi >= 5) { + return NO_SUCH_PAGE; + } + g.drawString("Page : " + (pi+1), 200, 200); + return PAGE_EXISTS; + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/net/NetworkInterface/GetMacAddress.java Mon Jul 24 09:37:01 2017 -0700 @@ -0,0 +1,132 @@ +/* + * Copyright (c) 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 + * 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 8182672 + * @summary Java 8u121 on Linux intermittently returns null for MAC address + */ + +import java.net.NetworkInterface; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.Phaser; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class GetMacAddress implements Callable<Exception> { + static final int NUM_THREADS = 5; + static final int NUM_ITERS = 100; + static volatile boolean failed; // false + + final String threadName; + final NetworkInterface ni; + final Phaser startingGate; + + public GetMacAddress(NetworkInterface ni, String name, Phaser phaser) { + this.ni = ni; + this.threadName = name; + this.startingGate = phaser; + } + + @Override + public Exception call() { + int count = 0; + startingGate.arriveAndAwaitAdvance(); + try { + for (int i = 0; i < NUM_ITERS; i++) { + ni.getMTU(); + byte[] addr = ni.getHardwareAddress(); + if (addr == null) { + System.out.println(threadName + ". mac id is null"); + failed = true; + } + count = count + 1; + if (count % 100 == 0) { + System.out.println(threadName + ". count is " + count); + } + } + } catch (Exception ex) { + System.out.println(threadName + ". Not expecting exception:" + ex.getMessage()); + failed = true; + return ex; + } + return null; + } + + static final Predicate<NetworkInterface> hasHardwareAddress = ni -> { + try { + if (ni.getHardwareAddress() == null) { + System.out.println("Not testing null addr: " + ni.getName()); + return false; + } + } catch (Exception ex) { + System.out.println("Not testing: " + ni.getName() + + " " + ex.getMessage()); + return false; + } + return true; + }; + + public static Stream<NetworkInterface> getNetworkInterfacesAsStream() throws Exception { + // JDK 9 and later + //return NetworkInterface.networkInterfaces(); + // pre JDK 9 + return Collections.list(NetworkInterface.getNetworkInterfaces()).stream(); + } + + public static void main(String[] args) throws Exception { + List<NetworkInterface> toTest = getNetworkInterfacesAsStream() + .filter(hasHardwareAddress) + .collect(Collectors.toList()); + + ExecutorService executor = Executors.newFixedThreadPool(NUM_THREADS); + + for (NetworkInterface ni : toTest) { + Phaser startingGate = new Phaser(NUM_THREADS); + System.out.println("Testing: " + ni.getName()); + List<Callable<Exception>> list = new ArrayList<>(); + for (int i = 0; i < NUM_THREADS; i++) + list.add(new GetMacAddress(ni, ni.getName() + "-Thread-" + i, startingGate)); + List<Future<Exception>> futures = executor.invokeAll(list); + for (Future<Exception> f : futures) { + if (f.get() != null) + f.get().printStackTrace(System.out); + } + if (failed) + break; + } + executor.shutdownNow(); + if (!failed) { + System.out.println("PASSED - Finished all threads"); + } else { + throw new RuntimeException("Failed"); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/accessibility/JList/AccessibleJListChildNPETest.java Mon Jul 24 09:37:01 2017 -0700 @@ -0,0 +1,103 @@ +/* +* Copyright (c) 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 +* 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. +*/ + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import javax.accessibility.Accessible; +import javax.accessibility.AccessibleContext; +import javax.swing.AbstractListModel; +import javax.swing.JFrame; +import javax.swing.JList; +import javax.swing.SwingUtilities; +import javax.swing.WindowConstants; + +/* @test + @bug 8076249 + @summary NPE in AccessBridge while editing JList model + @author Mikhail Cherkasov + @run main AccessibleJListChildNPETest +*/ +public class AccessibleJListChildNPETest { + + private static String[] model = { "1", "2", "3", "4", "5", "6" }; + private static JList<String> list; + + public static void main(String[] args) throws InvocationTargetException, InterruptedException { + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + JFrame frame = new JFrame(); + frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + final MyModel dataModel = new MyModel(Arrays.asList(model)); + list = new JList<>(dataModel); + frame.getContentPane().add(list); + frame.pack(); + frame.setVisible(true); + + } + }); + + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + AccessibleContext ac = list.getAccessibleContext(); + MyModel model = (MyModel)list.getModel(); + Accessible accessibleChild = ac.getAccessibleChild(model.getSize()-1); + model.removeFirst(); + accessibleChild.getAccessibleContext().getAccessibleSelection(); + accessibleChild.getAccessibleContext().getAccessibleText(); + accessibleChild.getAccessibleContext().getAccessibleValue(); + } + }); + } + + protected static class MyModel extends AbstractListModel<String> { + private List<String> items = new ArrayList<>(); + + MyModel(final List<String> newItems) { + super(); + items.addAll(newItems); + fireIntervalAdded(this, 0, getSize() - 1); + } + + void removeFirst() { + if(getSize() > 0) { + items.remove(0); + fireIntervalRemoved(this, 0, 0); + } + } + + @Override + public int getSize() { + return items.size(); + } + + @Override + public String getElementAt(int index) { + return items.get(index); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/swing/JMenuItem/8152981/MenuItemIconTest.java Mon Jul 24 09:37:01 2017 -0700 @@ -0,0 +1,114 @@ +/* + * Copyright (c) 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 + * @bug 8152981 + * @summary Double icons with JMenuItem setHorizontalTextPosition on Win 10 + * @requires (os.family == "windows") + * @run main MenuItemIconTest + */ +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Point; +import java.awt.Robot; +import java.awt.image.BufferedImage; +import javax.swing.ImageIcon; +import javax.swing.JFrame; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +public class MenuItemIconTest { + + private static JFrame frame; + private static Robot robot; + private static String errorMessage = ""; + private static JMenuItem menuItem; + private static final int IMAGE_WIDTH_AND_HEIGHT = 25; + + public static void main(String[] args) throws Exception { + robot = new Robot(); + String name = UIManager.getSystemLookAndFeelClassName(); + try { + UIManager.setLookAndFeel(name); + } catch (ClassNotFoundException | InstantiationException | + IllegalAccessException | UnsupportedLookAndFeelException e) { + throw new RuntimeException("Test Failed"); + } + createUI(); + robot.waitForIdle(); + executeTest(); + if (!"".equals(errorMessage)) { + throw new RuntimeException(errorMessage); + } + } + + private static void createUI() throws Exception { + SwingUtilities.invokeAndWait(() -> { + frame = new JFrame(); + frame.setTitle("Test"); + JMenuBar menuBar = new JMenuBar(); + ImageIcon icon = createIcon(); + menuItem = new JMenuItem("Command", icon); + menuItem.setHorizontalTextPosition(SwingConstants.LEFT); + menuBar.add(menuItem); + frame.setJMenuBar(menuBar); + frame.setPreferredSize(new Dimension(500, 500)); + frame.pack(); + frame.setVisible(true); + frame.setLocationRelativeTo(null); + }); + } + + private static void checkPixeclColor(int x, int y) { + robot.delay(2000); + robot.mouseMove(x, y); + Color c = robot.getPixelColor(x, y); + if (c.getRed() == 255) { + errorMessage = "Test Failed"; + } + robot.delay(5000); + frame.dispose(); + } + + protected static ImageIcon createIcon() { + BufferedImage bi = new BufferedImage(IMAGE_WIDTH_AND_HEIGHT, + IMAGE_WIDTH_AND_HEIGHT, BufferedImage.TYPE_INT_ARGB); + Graphics g = bi.createGraphics(); + g.setColor(Color.RED); + g.fillOval(0, 0, IMAGE_WIDTH_AND_HEIGHT, IMAGE_WIDTH_AND_HEIGHT); + return new ImageIcon(bi); + } + + private static void executeTest() throws Exception { + Point point = menuItem.getLocationOnScreen(); + checkPixeclColor(point.x + IMAGE_WIDTH_AND_HEIGHT / 2, + point.y + IMAGE_WIDTH_AND_HEIGHT / 2); + } +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/swing/plaf/basic/BasicLabelUI/bug7172652.java Mon Jul 24 09:37:01 2017 -0700 @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2015, 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 7172652 + @summary With JDK 1.7 text field does not obtain focus when using mnemonic Alt/Key combin + @author Semyon Sadetsky + @library /lib/testlibrary + @build jdk.testlibrary.OSInfo + @run main bug7172652 + */ + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.*; +import java.awt.event.KeyEvent; +import jdk.testlibrary.OSInfo; + +public class bug7172652 { + + private static JMenu menu; + private static JFrame frame; + private static Boolean selected; + + public static void main(String[] args) throws Exception { + if (OSInfo.getOSType() != OSInfo.OSType.WINDOWS) { + System.out.println("ok"); + return; + } + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + setup(); + } + }); + + test(); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + frame.dispose(); + } + }); + } + + private static void test() throws Exception { + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + menu.getModel().addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + selected = menu.isSelected(); + } + }); + } + }); + + Robot robot = new Robot(); + robot.setAutoDelay(200); + + robot.keyPress(KeyEvent.VK_ALT); + robot.keyPress(KeyEvent.VK_F); + robot.keyRelease(KeyEvent.VK_F); + robot.keyRelease(KeyEvent.VK_ALT); + + robot.waitForIdle(); + if( selected != null ) { + throw new RuntimeException("Menu is notified selected= " + selected); + } + + robot.keyPress(KeyEvent.VK_ALT); + robot.keyPress(KeyEvent.VK_F); + robot.keyRelease(KeyEvent.VK_F); + robot.keyRelease(KeyEvent.VK_ALT); + if( selected != null ) { + throw new RuntimeException("Menu is notified selected= " + selected); + } + + robot.waitForIdle(); + + robot.keyPress(KeyEvent.VK_ALT); + robot.keyPress(KeyEvent.VK_F); + robot.keyRelease(KeyEvent.VK_F); + robot.keyRelease(KeyEvent.VK_ALT); + if( selected != null ) { + throw new RuntimeException("Menu is notified selected= " + selected); + } + + robot.waitForIdle(); + + robot.keyPress(KeyEvent.VK_ALT); + robot.keyPress(KeyEvent.VK_F); + robot.keyRelease(KeyEvent.VK_F); + robot.keyRelease(KeyEvent.VK_ALT); + if( selected != null ) { + throw new RuntimeException("Menu is notified selected= " + selected); + } + + robot.waitForIdle(); + + System.out.printf("ok"); + } + + private static void setup() { + JLabel firstLbl = new JLabel("First name"); + JLabel lastLbl = new JLabel("Last name"); + JMenuBar menuBar = new JMenuBar(); + + JTextField firstTxtFld = new JTextField(20); + JTextField lastTxtFld = new JTextField(20); + JDesktopPane desktopPane = new JDesktopPane(); + JInternalFrame iframe = new JInternalFrame("A frame", true, true, true, true); + + // Set an initial size + iframe.setSize(200, 220); + + // By default, internal frames are not visible; make it visible + iframe.setVisible(true); + + JPanel pane = new JPanel(); + pane.setLayout(new FlowLayout()); + + pane.add(firstLbl); + pane.add(firstTxtFld); + pane.add(lastLbl); + pane.add(lastTxtFld); + + firstLbl.setLabelFor(firstTxtFld); + firstLbl.setDisplayedMnemonic('F'); + + lastLbl.setLabelFor(lastTxtFld); + lastLbl.setDisplayedMnemonic('L'); + + iframe.getContentPane().add(pane); + iframe.setJMenuBar(menuBar); + menu = new JMenu("FirstMenu"); + //m.setMnemonic('i'); + menuBar.add(menu); + desktopPane.add(iframe); + + frame = new JFrame(); + frame.setUndecorated(true); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.getContentPane().add(desktopPane); + frame.setSize(300, 300); + frame.setVisible(true); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/xml/ws/8172297/Main.java Mon Jul 24 09:37:01 2017 -0700 @@ -0,0 +1,157 @@ +/* + * Copyright (c) 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 + * 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 8172297 + * @summary Test that carriage-return and new-line characters + * are preserved in webservice parameters + * @compile ws/HelloWorld.java ws/HelloWorldImpl.java Main.java + * @run testng/othervm Main + */ + +import java.io.IOException; +import java.net.ServerSocket; +import java.net.URL; +import java.util.concurrent.CountDownLatch; + +import javax.xml.namespace.QName; +import javax.xml.ws.Endpoint; +import javax.xml.ws.Service; + +import org.testng.Assert; +import org.testng.annotations.Test; + +import ws.HelloWorld; +import ws.HelloWorldImpl; + +public class Main { + + @Test + public void runTest() throws Exception { + // + CountDownLatch serverInitSignal = new CountDownLatch(1); + CountDownLatch testDoneSignal = new CountDownLatch(1); + + WebserviceRunner serverThread = new WebserviceRunner(serverInitSignal, testDoneSignal); + (new Thread(serverThread)).start(); + + serverInitSignal.await(); + + boolean paramModified = runClientCode(serverThread.getPort()); + + testDoneSignal.countDown(); + + Assert.assertFalse(paramModified, "WS parameter was modified during round trip."); + } + + /* + * Connects to launched web service endpoint, sends message with CR/NL symbols and + * checks if it was modified during the round trip client/server communication. + */ + private boolean runClientCode(int port) throws Exception { + System.out.println("Launching WS client connection on " + port + " port"); + URL url = new URL("http://localhost:" + port + "/ws/hello?wsdl"); + QName qname = new QName("http://ws/", "HelloWorldImplService"); + Service service = Service.create(url, qname); + + HelloWorld hello = (HelloWorld) service.getPort(HelloWorld.class); + + logStringContent("Client input parameter", WS_PARAM_VALUE); + + String response = hello.getHelloWorldAsString(WS_PARAM_VALUE); + logStringContent("Client response parameter", response); + + return !WS_PARAM_VALUE.equals(response); + } + + /* + * Outputs the parameter value with newline and carriage-return symbols + * replaced with #CR and #NL text abbreviations. + */ + private static void logStringContent(String description, String parameter) { + String readableContent = parameter.replaceAll("\r", "#CR") + .replaceAll("\n", "#NL"); + System.out.println(description + ": '" + readableContent + "'"); + } + + /* Web service parameter value with newline and carriage-return symbols */ + private final static String WS_PARAM_VALUE = "\r\r\n\r\r CarriageReturn and " + +"NewLine \r\n\n Test \r\r\r\r"; + + /* + * Web service server thread that publishes WS on vacant port and waits + * for client to finalize testing + */ + class WebserviceRunner implements Runnable { + // Latch used to signalize when WS endpoint is initialized + private final CountDownLatch initSignal; + // Latch used to signalize when client completed testing + private final CountDownLatch doneSignal; + // Port where WS endpoint is published + private volatile int port = 0; + + // Constructor + WebserviceRunner(CountDownLatch initSignal, CountDownLatch doneSignal) { + this.initSignal = initSignal; + this.doneSignal = doneSignal; + } + + // Returns port of the published endpoint + public int getPort() { + return port; + } + + /* + * Publish web service on vacant port and waits for the client to + * complete testing. + */ + public void run() { + try { + // Find vacant port number + ServerSocket ss = new ServerSocket(0); + port = ss.getLocalPort(); + ss.close(); + + // Publish WebService + System.out.println("Publishing WebService on " + port + " port"); + Endpoint ep = Endpoint.publish("http://localhost:" + port + "/ws/hello", new HelloWorldImpl()); + + // Notify main thread that WS endpoint is published + initSignal.countDown(); + + // Wait for main thread to complete testing + System.out.println("Waiting for done signal from test client."); + doneSignal.await(); + + // Terminate WS endpoint + System.out.println("Got done signal from the client. Stopping WS endpoint."); + ep.stop(); + } catch (IOException ioe) { + System.out.println("Failed to get vacant port number:" + ioe); + } catch (InterruptedException ie) { + System.out.println("Failed to wait for test completion:" + ie); + } + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/xml/ws/8172297/ws/HelloWorld.java Mon Jul 24 09:37:01 2017 -0700 @@ -0,0 +1,39 @@ +/* + * Copyright (c) 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 + * 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. + */ + +package ws; + +import javax.jws.WebMethod; +import javax.jws.WebService; +import javax.jws.soap.SOAPBinding; +import javax.jws.soap.SOAPBinding.Style; +import javax.jws.soap.SOAPBinding.Use; + +//Web service endpoint interface +@WebService +@SOAPBinding(style = Style.DOCUMENT, use = Use.LITERAL) +public interface HelloWorld { + + @WebMethod + String getHelloWorldAsString(String name); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/xml/ws/8172297/ws/HelloWorldImpl.java Mon Jul 24 09:37:01 2017 -0700 @@ -0,0 +1,39 @@ +/* + * Copyright (c) 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 + * 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. + */ + +package ws; + +import javax.jws.WebService; + +// Simple web service implementation that echoes its parameter +@WebService(endpointInterface = "ws.HelloWorld") +public class HelloWorldImpl implements HelloWorld { + + @Override + public String getHelloWorldAsString(String name) { + System.out.println("Server-side parameter value: '" + + name.replaceAll("\r", "#CR") + .replaceAll("\n", "#NL") + "'"); + return name; + } +}