From cbcaa0c2511ee156093ae80207b74cf000595ce8 Mon Sep 17 00:00:00 2001 From: Sergey Chernyshev Date: Sun, 28 Dec 2025 23:56:13 +0100 Subject: [PATCH 001/323] Reverted: JBR-3785: don't touch the active keyboard layout on input method activation / deactivation. origin PR: github.com/JetBrains/JetBrainsRuntime/pull/78. --- .../classes/sun/awt/windows/WInputMethod.java | 15 +++++++++++++-- .../native/libawt/windows/awt_Component.cpp | 13 +++++++++++++ .../native/libawt/windows/awt_InputMethod.cpp | 12 +++++++++--- .../windows/native/libawt/windows/awt_Toolkit.cpp | 9 +++++++++ 4 files changed, 44 insertions(+), 5 deletions(-) diff --git a/src/java.desktop/windows/classes/sun/awt/windows/WInputMethod.java b/src/java.desktop/windows/classes/sun/awt/windows/WInputMethod.java index 9c14acac851e..037c90a672fb 100644 --- a/src/java.desktop/windows/classes/sun/awt/windows/WInputMethod.java +++ b/src/java.desktop/windows/classes/sun/awt/windows/WInputMethod.java @@ -168,6 +168,10 @@ public Object getControlObject() { @Override public boolean setLocale(Locale lang) { + return setLocale(lang, false); + } + + private boolean setLocale(Locale lang, boolean onActivate) { Locale[] available = WInputMethodDescriptor.getAvailableLocalesInternal(); for (int i = 0; i < available.length; i++) { Locale locale = available[i]; @@ -176,7 +180,7 @@ public boolean setLocale(Locale lang) { locale.equals(Locale.JAPAN) && lang.equals(Locale.JAPANESE) || locale.equals(Locale.KOREA) && lang.equals(Locale.KOREAN)) { if (isActive) { - setNativeLocale(locale.toLanguageTag()); + setNativeLocale(locale.toLanguageTag(), onActivate); } currentLocale = locale; return true; @@ -315,6 +319,9 @@ public void activate() { isLastFocussedActiveClient = isAc; } isActive = true; + if (currentLocale != null) { + setLocale(currentLocale, true); + } // Compare IM's composition string with Java's composition string if (hasCompositionString && !isCompositionStringAvailable(context)) { @@ -341,6 +348,10 @@ public void activate() { @Override public void deactivate(boolean isTemporary) { + // Sync currentLocale with the Windows keyboard layout which might be changed + // by hot key + getLocale(); + // Delay calling disableNativeIME until activate is called and the newly // focused component has a different peer as the last focused component. if (awtFocussedComponentPeer != null) { @@ -665,7 +676,7 @@ private WComponentPeer getNearestNativePeer(Component comp) private native void setStatusWindowVisible(WComponentPeer peer, boolean visible); private native String getNativeIMMDescription(); static native Locale getNativeLocale(); - static native boolean setNativeLocale(String localeName); + static native boolean setNativeLocale(String localeName, boolean onActivate); private native void openCandidateWindow(WComponentPeer peer, int caretLeftX, int caretTopY, int caretRightX, int caretBottomY); private native boolean isCompositionStringAvailable(int context); } diff --git a/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp b/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp index 08f49df37029..238b84e56f13 100644 --- a/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp +++ b/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp @@ -88,6 +88,15 @@ static DCList passiveDCList; extern void CheckFontSmoothingSettings(HWND); +extern "C" { + // Remember the input language has changed by some user's action + // (Alt+Shift or through the language icon on the Taskbar) to control the + // race condition between the toolkit thread and the AWT event thread. + // This flag remains TRUE until the next WInputMethod.getNativeLocale() is + // issued. + BOOL g_bUserHasChangedInputLang = FALSE; +} + BOOL AwtComponent::sm_suppressFocusAndActivation = FALSE; BOOL AwtComponent::sm_restoreFocusAndActivation = FALSE; HWND AwtComponent::sm_focusOwner = NULL; @@ -1894,6 +1903,9 @@ LRESULT AwtComponent::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) ::ToAsciiEx(VK_SPACE, ::MapVirtualKey(VK_SPACE, 0), keyboardState, &ignored, 0, GetKeyboardLayout()); + // Set this flag to block ActivateKeyboardLayout from + // WInputMethod.activate() + g_bUserHasChangedInputLang = TRUE; CallProxyDefWindowProc(message, wParam, lParam, retValue, mr); break; } @@ -1902,6 +1914,7 @@ LRESULT AwtComponent::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) "new = 0x%08X", GetHWnd(), GetClassName(), (UINT)lParam); mr = WmInputLangChange(static_cast(wParam), reinterpret_cast(lParam)); + g_bUserHasChangedInputLang = TRUE; CallProxyDefWindowProc(message, wParam, lParam, retValue, mr); // should return non-zero if we process this message retValue = 1; diff --git a/src/java.desktop/windows/native/libawt/windows/awt_InputMethod.cpp b/src/java.desktop/windows/native/libawt/windows/awt_InputMethod.cpp index a9fb919ffcb7..e36bb149e17f 100644 --- a/src/java.desktop/windows/native/libawt/windows/awt_InputMethod.cpp +++ b/src/java.desktop/windows/native/libawt/windows/awt_InputMethod.cpp @@ -44,6 +44,8 @@ extern "C" { jobject CreateLocaleObject(JNIEnv *env, const char * name); HKL getDefaultKeyboardLayout(); +extern BOOL g_bUserHasChangedInputLang; + /* * Class: sun_awt_windows_WInputMethod * Method: createNativeContext @@ -290,6 +292,10 @@ JNIEXPORT jobject JNICALL Java_sun_awt_windows_WInputMethod_getNativeLocale const char * javaLocaleName = getJavaIDFromLangID(AwtComponent::GetInputLanguage()); if (javaLocaleName != NULL) { + // Now WInputMethod.currentLocale and AwtComponent::m_idLang are get sync'ed, + // so we can reset this flag. + g_bUserHasChangedInputLang = FALSE; + jobject ret = CreateLocaleObject(env, javaLocaleName); free((void *)javaLocaleName); return ret; @@ -303,10 +309,10 @@ JNIEXPORT jobject JNICALL Java_sun_awt_windows_WInputMethod_getNativeLocale /* * Class: sun_awt_windows_WInputMethod * Method: setNativeLocale - * Signature: (Ljava/lang/String;)Z + * Signature: (Ljava/lang/String;Z)Z */ JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WInputMethod_setNativeLocale - (JNIEnv *env, jclass cls, jstring localeString) + (JNIEnv *env, jclass cls, jstring localeString, jboolean onActivate) { TRY; @@ -347,7 +353,7 @@ JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WInputMethod_setNativeLocale if (supported != NULL) { if (strcmp(supported, requested) == 0) { // use special message to call ActivateKeyboardLayout() in main thread. - if (AwtToolkit::GetInstance().SendMessage(WM_AWT_ACTIVATEKEYBOARDLAYOUT, 0, (LPARAM)hKLList[i])) { + if (AwtToolkit::GetInstance().SendMessage(WM_AWT_ACTIVATEKEYBOARDLAYOUT, (WPARAM)onActivate, (LPARAM)hKLList[i])) { //also need to change the same keyboard layout for the Java AWT-EventQueue thread AwtToolkit::activateKeyboardLayout(hKLList[i]); retValue = JNI_TRUE; diff --git a/src/java.desktop/windows/native/libawt/windows/awt_Toolkit.cpp b/src/java.desktop/windows/native/libawt/windows/awt_Toolkit.cpp index 06f050ede5c4..7e783b462461 100644 --- a/src/java.desktop/windows/native/libawt/windows/awt_Toolkit.cpp +++ b/src/java.desktop/windows/native/libawt/windows/awt_Toolkit.cpp @@ -71,6 +71,7 @@ extern void initScreens(JNIEnv *env); extern "C" void awt_dnd_initialize(); extern "C" void awt_dnd_uninitialize(); extern "C" void awt_clipboard_uninitialize(JNIEnv *env); +extern "C" BOOL g_bUserHasChangedInputLang; extern CriticalSection windowMoveLock; extern BOOL windowMoveLockHeld; @@ -1245,6 +1246,14 @@ LRESULT CALLBACK AwtToolkit::WndProc(HWND hWnd, UINT message, return cmode; } case WM_AWT_ACTIVATEKEYBOARDLAYOUT: { + if (wParam && g_bUserHasChangedInputLang) { + // Input language has been changed since the last WInputMethod.getNativeLocale() + // call. So let's honor the user's selection. + // Note: we need to check this flag inside the toolkit thread to synchronize access + // to the flag. + return FALSE; + } + if (lParam == (LPARAM)::GetKeyboardLayout(0)) { // already active return FALSE; From 6dc2f70e3fdbd305e1905a39609b8d2af55b7df2 Mon Sep 17 00:00:00 2001 From: Rui Li Date: Tue, 2 Sep 2025 17:12:44 +0000 Subject: [PATCH 002/323] 8199149: Improve the exception message thrown by VarHandle of unsupported operation Backport-of: d7b941640638b35f9ac1ef11cd6bf6ccb795c29a --- .../share/classes/java/lang/invoke/IndirectVarHandle.java | 2 +- src/java.base/share/classes/java/lang/invoke/VarForm.java | 6 ++++-- .../share/classes/java/lang/invoke/VarHandle.java | 7 ++++++- .../share/classes/java/lang/invoke/VarHandleGuards.java | 2 +- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/java.base/share/classes/java/lang/invoke/IndirectVarHandle.java b/src/java.base/share/classes/java/lang/invoke/IndirectVarHandle.java index 3e804ec4f113..1cf26522f803 100644 --- a/src/java.base/share/classes/java/lang/invoke/IndirectVarHandle.java +++ b/src/java.base/share/classes/java/lang/invoke/IndirectVarHandle.java @@ -101,7 +101,7 @@ public boolean isAccessModeSupported(AccessMode accessMode) { @Override MethodHandle getMethodHandleUncached(int mode) { MethodHandle targetHandle = target.getMethodHandle(mode); // might throw UOE of access mode is not supported, which is ok - return handleFactory.apply(AccessMode.values()[mode], targetHandle); + return handleFactory.apply(AccessMode.valueFromOrdinal(mode), targetHandle); } @Override diff --git a/src/java.base/share/classes/java/lang/invoke/VarForm.java b/src/java.base/share/classes/java/lang/invoke/VarForm.java index 1308c48cebb6..0856bf126f99 100644 --- a/src/java.base/share/classes/java/lang/invoke/VarForm.java +++ b/src/java.base/share/classes/java/lang/invoke/VarForm.java @@ -26,6 +26,7 @@ import jdk.internal.vm.annotation.DontInline; import jdk.internal.vm.annotation.ForceInline; +import jdk.internal.vm.annotation.Hidden; import jdk.internal.vm.annotation.Stable; import java.lang.invoke.VarHandle.AccessMode; @@ -108,6 +109,7 @@ final MethodType getMethodType(int type) { } @ForceInline + @Hidden final MemberName getMemberName(int mode) { // Can be simplified by calling getMemberNameOrNull, but written in this // form to improve interpreter/coldpath performance. @@ -115,7 +117,7 @@ final MemberName getMemberName(int mode) { if (mn == null) { mn = resolveMemberName(mode); if (mn == null) { - throw new UnsupportedOperationException(); + throw new UnsupportedOperationException(AccessMode.valueFromOrdinal(mode).methodName()); } } return mn; @@ -132,7 +134,7 @@ final MemberName getMemberNameOrNull(int mode) { @DontInline MemberName resolveMemberName(int mode) { - AccessMode value = AccessMode.values()[mode]; + AccessMode value = AccessMode.valueFromOrdinal(mode); String methodName = value.methodName(); MethodType type = methodType_table[value.at.ordinal()].insertParameterTypes(0, VarHandle.class); return memberName_table[mode] = MethodHandles.Lookup.IMPL_LOOKUP diff --git a/src/java.base/share/classes/java/lang/invoke/VarHandle.java b/src/java.base/share/classes/java/lang/invoke/VarHandle.java index 2ffa75cf12be..ba0f8a2f6a6f 100644 --- a/src/java.base/share/classes/java/lang/invoke/VarHandle.java +++ b/src/java.base/share/classes/java/lang/invoke/VarHandle.java @@ -1989,6 +1989,11 @@ public static AccessMode valueFromMethodName(String methodName) { default -> throw new IllegalArgumentException("No AccessMode value for method name " + methodName); }; } + + private static final @Stable AccessMode[] VALUES = values(); + static AccessMode valueFromOrdinal(int mode) { + return VALUES[mode]; + } } static final class AccessDescriptor { @@ -2187,7 +2192,7 @@ final MethodHandle getMethodHandle(int mode) { } MethodHandle getMethodHandleUncached(int mode) { - MethodType mt = accessModeType(AccessMode.values()[mode]). + MethodType mt = accessModeType(AccessMode.valueFromOrdinal(mode)). insertParameterTypes(0, VarHandle.class); MemberName mn = vform.getMemberName(mode); DirectMethodHandle dmh = DirectMethodHandle.make(mn); diff --git a/src/java.base/share/classes/java/lang/invoke/VarHandleGuards.java b/src/java.base/share/classes/java/lang/invoke/VarHandleGuards.java index be1dfac8a865..8b73587eca5b 100644 --- a/src/java.base/share/classes/java/lang/invoke/VarHandleGuards.java +++ b/src/java.base/share/classes/java/lang/invoke/VarHandleGuards.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2023, 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 From f2357202e1a3fd3451963c7011b5e7a9db4dd591 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Tue, 2 Sep 2025 17:19:39 +0000 Subject: [PATCH 003/323] 8340015: Open source several AWT focus tests - series 7 Backport-of: 147e30070d8adbe65453a3a9316b9324890ea25f --- test/jdk/ProblemList.txt | 1 + .../Focus/MinimizeNonfocusableWindowTest.java | 76 ++++++++++++++ .../awt/Focus/WindowDisposeFocusTest.java | 98 +++++++++++++++++++ test/jdk/java/awt/Focus/bug6435715.java | 91 +++++++++++++++++ 4 files changed, 266 insertions(+) create mode 100644 test/jdk/java/awt/Focus/MinimizeNonfocusableWindowTest.java create mode 100644 test/jdk/java/awt/Focus/WindowDisposeFocusTest.java create mode 100644 test/jdk/java/awt/Focus/bug6435715.java diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index 40b13f216045..e810d79d9a00 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -836,3 +836,4 @@ java/awt/Checkbox/CheckboxBoxSizeTest.java 8340870 windows-all java/awt/Checkbox/CheckboxIndicatorSizeTest.java 8340870 windows-all java/awt/Checkbox/CheckboxNullLabelTest.java 8340870 windows-all java/awt/dnd/WinMoveFileToShellTest.java 8341665 windows-all +java/awt/Focus/MinimizeNonfocusableWindowTest.java 8024487 windows-all diff --git a/test/jdk/java/awt/Focus/MinimizeNonfocusableWindowTest.java b/test/jdk/java/awt/Focus/MinimizeNonfocusableWindowTest.java new file mode 100644 index 000000000000..3114850dc7af --- /dev/null +++ b/test/jdk/java/awt/Focus/MinimizeNonfocusableWindowTest.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2011, 2024, 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 6399659 + * @summary When minimizing non-focusable window focus shouldn't jump out of the focused window. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual MinimizeNonfocusableWindowTest +*/ + +import java.awt.Frame; +import java.awt.Window; +import java.util.List; + +public class MinimizeNonfocusableWindowTest { + + private static final String INSTRUCTIONS = """ + + You should see three frames: Frame-1, Frame-2 and Unfocusable. + + 1. Click Frame-1 to make it focused window, then click Frame-2. + Minimize Unfocusable frame with the mouse. If Frame-2 is still + the focused window continue testing, otherwise press FAIL. + + 2. Restore Unfocusable frame to normal state. Try to resize by dragging + its edge with left mouse button. It should be resizable. If not press + FAIL. Try the same with right mouse button. It shouldn't resize. + If it does, press FAIL, otherwise press PASS."""; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .title("MinimizeNonfocusableWindowTest Instructions") + .instructions(INSTRUCTIONS) + .rows((int) INSTRUCTIONS.lines().count() + 1) + .columns(40) + .testUI(MinimizeNonfocusableWindowTest::createTestUI) + .build() + .awaitAndCheck(); + } + + private static List createTestUI() { + Frame frame1 = new Frame("Frame-1"); + Frame frame2 = new Frame("Frame-2"); + Frame frame3 = new Frame("Unfocusable"); + frame1.setBounds(100, 0, 200, 100); + frame2.setBounds(100, 150, 200, 100); + frame3.setBounds(100, 300, 200, 100); + + frame3.setFocusableWindowState(false); + + return List.of(frame1, frame2, frame3); + } +} + diff --git a/test/jdk/java/awt/Focus/WindowDisposeFocusTest.java b/test/jdk/java/awt/Focus/WindowDisposeFocusTest.java new file mode 100644 index 000000000000..5e2e49147e54 --- /dev/null +++ b/test/jdk/java/awt/Focus/WindowDisposeFocusTest.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 1999, 2024, 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 4257071 4228379 + * @summary Ensures that focus lost is delivered to a lightweight component + in a disposed window + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual WindowDisposeFocusTest +*/ + +import java.awt.Window; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JPanel; + +public class WindowDisposeFocusTest { + + private static final String INSTRUCTIONS = """ + Click on "Second" + Click on close box + When dialog pops up, "Second" should no longer have focus."""; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .title("WindowDisposeFocusTest Instructions") + .instructions(INSTRUCTIONS) + .rows((int) INSTRUCTIONS.lines().count() + 2) + .columns(35) + .testUI(WindowDisposeFocusTest::createTestUI) + .build() + .awaitAndCheck(); + } + + private static Window createTestUI() { + return JFCFocusBug2.test(new String[]{}); + } +} + +class JFCFocusBug2 extends JPanel { + + static public Window test(String[] args) { + final JFrame frame = new JFrame("WindowDisposeFrame"); + frame.setSize(100, 100); + frame.setVisible(true); + + final JFCFocusBug2 bug = new JFCFocusBug2(); + final JDialog dialog = new JDialog(frame, false); + dialog.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + dialog.dispose(); + JDialog dialog2 = new JDialog(frame, false); + dialog2.setContentPane(bug); + dialog2.pack(); + dialog2.setVisible(true); + } + }); + dialog.setContentPane(bug); + dialog.pack(); + dialog.setVisible(true); + return frame; + } + + public JFCFocusBug2() { + _first = new JButton("First"); + _second = new JButton("Second"); + add(_first); + add(_second); + } + + private JButton _first; + private JButton _second; +} diff --git a/test/jdk/java/awt/Focus/bug6435715.java b/test/jdk/java/awt/Focus/bug6435715.java new file mode 100644 index 000000000000..f13f731169ff --- /dev/null +++ b/test/jdk/java/awt/Focus/bug6435715.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2006, 2024, 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 6435715 + * @summary JButton stops receiving the focusGained event and eventually focus is lost altogether + * @modules java.desktop/sun.awt + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug6435715 + */ + +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JPanel; + +public class bug6435715 { + + private static final String INSTRUCTIONS = """ + 1. after test started you will see frame with three buttons. Notice that focus is on Button2. + 2. Click on Button 3. Focus goes to Button3. + 3. Click on Button1 and quickly switch to another window. Via either alt/tab or + clicking another window with the mouse. + 4. After a few seconds, come back to the frame. Notice that focus is around Button2 + 5. Click at Button3. If focus remains at Button2 test failed, if focus is on Button3 - test passed."""; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .title("bug6435715 Instructions") + .instructions(INSTRUCTIONS) + .rows((int) INSTRUCTIONS.lines().count() + 5) + .columns(35) + .testUI(bug6435715::createTestUI) + .build() + .awaitAndCheck(); + } + + private static JFrame createTestUI() { + JFrame fr = new JFrame("FocusIssue"); + sun.awt.SunToolkit.setLWRequestStatus(fr, true); + + JPanel panel = new JPanel(); + final JButton b1 = new JButton("Button 1"); + final JButton b2 = new JButton("Button 2"); + final JButton b3 = new JButton("Button 3"); + + panel.add(b1); + panel.add(b2); + panel.add(b3); + + b1.addFocusListener(new FocusAdapter() { + public void focusGained(FocusEvent event) { + synchronized (this) { + try { + wait(1000); + } catch (Exception ex) { + ex.printStackTrace(); + } + b2.requestFocus(); + } + } + }); + fr.getContentPane().add(panel); + fr.pack(); + return fr; + } + +} From d68fd5f5c4d4ae53ebf0f3a7ee3101b9d911fb7d Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Tue, 2 Sep 2025 17:20:01 +0000 Subject: [PATCH 004/323] 8354106: Clean up and open source KeyEvent related tests (Part 2) Backport-of: e163a76f2bacf06980026feb7e645e616ffe2ad4 --- .../event/KeyEvent/KeyPressedModifiers.java | 108 ++++++++++++++++++ test/jdk/java/awt/event/KeyEvent/KeyTest.java | 104 +++++++++++++++++ 2 files changed, 212 insertions(+) create mode 100644 test/jdk/java/awt/event/KeyEvent/KeyPressedModifiers.java create mode 100644 test/jdk/java/awt/event/KeyEvent/KeyTest.java diff --git a/test/jdk/java/awt/event/KeyEvent/KeyPressedModifiers.java b/test/jdk/java/awt/event/KeyEvent/KeyPressedModifiers.java new file mode 100644 index 000000000000..08958bdbac21 --- /dev/null +++ b/test/jdk/java/awt/event/KeyEvent/KeyPressedModifiers.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 1998, 2025, 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 4174399 + * @summary Check that modifier values are set on a KeyPressed event + * when a modifier key is pressed. + * @key headful + * @run main KeyPressedModifiers + */ + +import java.awt.AWTException; +import java.awt.BorderLayout; +import java.awt.EventQueue; +import java.awt.Frame; +import java.awt.Robot; +import java.awt.TextField; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.lang.reflect.InvocationTargetException; +import java.util.concurrent.atomic.AtomicBoolean; + +public class KeyPressedModifiers extends Frame implements KeyListener { + static AtomicBoolean shiftDown = new AtomicBoolean(false); + static AtomicBoolean controlDown = new AtomicBoolean(false); + static AtomicBoolean altDown = new AtomicBoolean(false); + + public static void main(String[] args) throws InterruptedException, + InvocationTargetException, AWTException { + KeyPressedModifiers test = new KeyPressedModifiers(); + try { + EventQueue.invokeAndWait(test::initUI); + Robot robot = new Robot(); + robot.setAutoDelay(100); + robot.delay(500); + robot.waitForIdle(); + robot.keyPress(KeyEvent.VK_SHIFT); + robot.keyRelease(KeyEvent.VK_SHIFT); + robot.keyPress(KeyEvent.VK_CONTROL); + robot.keyRelease(KeyEvent.VK_CONTROL); + robot.keyPress(KeyEvent.VK_ALT); + robot.keyRelease(KeyEvent.VK_ALT); + robot.delay(500); + robot.waitForIdle(); + if (!shiftDown.get() || !controlDown.get() || !altDown.get()) { + String error = "Following key modifiers were not registered:" + + (shiftDown.get() ? "" : " SHIFT") + + (controlDown.get() ? "" : " CONTROL") + + (altDown.get() ? "" : " ALT"); + throw new RuntimeException(error); + } + } finally { + EventQueue.invokeAndWait(test::dispose); + } + } + + public void initUI() { + setLayout(new BorderLayout()); + TextField tf = new TextField(30); + tf.addKeyListener(this); + add(tf, BorderLayout.CENTER); + setSize(350, 100); + setVisible(true); + tf.requestFocus(); + } + + public void keyTyped(KeyEvent ignore) { + } + + public void keyReleased(KeyEvent ignore) { + } + + public void keyPressed(KeyEvent e) { + System.out.println(e); + switch (e.getKeyCode()) { + case KeyEvent.VK_SHIFT: + shiftDown.set(e.isShiftDown()); + break; + case KeyEvent.VK_CONTROL: + controlDown.set(e.isControlDown()); + break; + case KeyEvent.VK_ALT: + altDown.set(e.isAltDown()); + break; + } + } +} diff --git a/test/jdk/java/awt/event/KeyEvent/KeyTest.java b/test/jdk/java/awt/event/KeyEvent/KeyTest.java new file mode 100644 index 000000000000..d11798b4473a --- /dev/null +++ b/test/jdk/java/awt/event/KeyEvent/KeyTest.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 1999, 2025, 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 4151419 4090870 4169733 + * @summary Ensures that KeyEvent has right results for the following + * keys -=\[];,./ + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual KeyTest + */ + +import java.awt.BorderLayout; +import java.awt.Frame; +import java.awt.TextField; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.lang.reflect.InvocationTargetException; + +public class KeyTest extends Frame implements KeyListener { + + static String INSTRUCTIONS = """ + Click on the text field in window named "Check KeyChar values" + Type the following keys/characters in the TextField: + - = \\ [ ] ; , . / + Verify that the keyChar and keyCode is correct for each key pressed. + Remember that the keyCode for the KEY_TYPED event should be zero. + Also verify that the character you typed appears in the TextField. + + Key Name keyChar Keycode + ------------------------------------- + - Minus - 45 45 + = Equals = 61 61 + \\ Slash \\ 92 92 + [ Left Brace [ 91 91 + ] Right Brace ] 93 93 + ; Semicolon ; 59 59 + , Comma , 44 44 + . Period . 46 46 + / Front Slash / 47 47 + """; + public KeyTest() { + super("Check KeyChar values"); + setLayout(new BorderLayout()); + TextField tf = new TextField(30); + tf.addKeyListener(this); + add(tf, BorderLayout.CENTER); + pack(); + + } + + public void keyPressed(KeyEvent evt) { + printKey(evt); + } + + public void keyTyped(KeyEvent evt) { + printKey(evt); + } + + public void keyReleased(KeyEvent evt) { + printKey(evt); + } + + protected void printKey(KeyEvent evt) { + if (evt.isActionKey()) { + PassFailJFrame.log("params= " + evt.paramString() + " KeyChar: " + + (int) evt.getKeyChar() + " Action Key"); + } else { + PassFailJFrame.log("params= " + evt.paramString() + " KeyChar: " + + (int) evt.getKeyChar()); + } + } + + public static void main(String[] args) throws InterruptedException, InvocationTargetException { + PassFailJFrame.builder() + .title("KeyTest Instructions") + .instructions(INSTRUCTIONS) + .logArea(20) + .testUI(KeyTest::new) + .build() + .awaitAndCheck(); + } +} From bacd39b0a3f6316583b89073475e7ff40583ab68 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Wed, 3 Sep 2025 07:56:56 +0000 Subject: [PATCH 005/323] 8366231: Bump update version for OpenJDK: jdk-21.0.10 Reviewed-by: sgehwolf --- .jcheck/conf | 2 +- make/conf/version-numbers.conf | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.jcheck/conf b/.jcheck/conf index 35de7d4d946e..d89c28169f49 100644 --- a/.jcheck/conf +++ b/.jcheck/conf @@ -1,7 +1,7 @@ [general] project=jdk-updates jbs=JDK -version=21.0.9 +version=21.0.10 [checks] error=author,committer,reviewers,merge,issues,executable,symlink,message,hg-tag,whitespace,problemlists diff --git a/make/conf/version-numbers.conf b/make/conf/version-numbers.conf index b6ef31469263..fa0b200f51ac 100644 --- a/make/conf/version-numbers.conf +++ b/make/conf/version-numbers.conf @@ -28,12 +28,12 @@ DEFAULT_VERSION_FEATURE=21 DEFAULT_VERSION_INTERIM=0 -DEFAULT_VERSION_UPDATE=9 +DEFAULT_VERSION_UPDATE=10 DEFAULT_VERSION_PATCH=0 DEFAULT_VERSION_EXTRA1=0 DEFAULT_VERSION_EXTRA2=0 DEFAULT_VERSION_EXTRA3=0 -DEFAULT_VERSION_DATE=2025-10-21 +DEFAULT_VERSION_DATE=2026-01-20 DEFAULT_VERSION_CLASSFILE_MAJOR=65 # "`$EXPR $DEFAULT_VERSION_FEATURE + 44`" DEFAULT_VERSION_CLASSFILE_MINOR=0 DEFAULT_VERSION_DOCS_API_SINCE=11 From d8cf40c67aa5877dedbd54a640fa18c9884e6831 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Wed, 3 Sep 2025 16:48:35 +0000 Subject: [PATCH 006/323] 8353589: Open source a few Swing menu-related tests Backport-of: 98dac46aac2cea9790c1275208cc4c92e8e9a98a --- .../javax/swing/JPopupMenu/bug4119993.java | 112 ++++++++++++++++++ .../javax/swing/JPopupMenu/bug4187004.java | 97 +++++++++++++++ .../javax/swing/JPopupMenu/bug4530303.java | 85 +++++++++++++ 3 files changed, 294 insertions(+) create mode 100644 test/jdk/javax/swing/JPopupMenu/bug4119993.java create mode 100644 test/jdk/javax/swing/JPopupMenu/bug4187004.java create mode 100644 test/jdk/javax/swing/JPopupMenu/bug4530303.java diff --git a/test/jdk/javax/swing/JPopupMenu/bug4119993.java b/test/jdk/javax/swing/JPopupMenu/bug4119993.java new file mode 100644 index 000000000000..1fe72ea29d6b --- /dev/null +++ b/test/jdk/javax/swing/JPopupMenu/bug4119993.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 1999, 2025, 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 4119993 + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @summary Check that mouse button 3 is reserved for popup invocation not selection. + * @run main/manual bug4119993 + */ + +import java.awt.BorderLayout; +import java.awt.Dimension; +import javax.swing.BoxLayout; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.JTextArea; +import javax.swing.border.BevelBorder; + +/* + * This is a sort of negative test. Mouse Button 3 is not supposed to cause selections. + * If it did, then it would not be useable to invoke popup menus. + * So this popup menu test .. does not popup menus. + */ + +public class bug4119993 { + + static final String INSTRUCTIONS = """ + + The test window contains a text area, a table, and a list. +

+ For each component, try to select text/cells/rows/items as appropriate + using the RIGHT mouse button (Mouse Button 3). +

+ If the selection changes, then press FAIL. +

+ If the selection does not change, press PASS + """; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(60) + .testUI(bug4119993::createUI) + .build() + .awaitAndCheck(); + } + + static JFrame createUI() { + JFrame frame = new JFrame("bug4119993"); + JPanel p = new JPanel(); + p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS)); + frame.add(p); + + String text = "This is some text that you should try to select using the right mouse button"; + JTextArea area = new JTextArea(text, 5, 40); + JScrollPane scrollpane0 = new JScrollPane(area); + scrollpane0.setBorder(new BevelBorder(BevelBorder.LOWERED)); + scrollpane0.setPreferredSize(new Dimension(430, 200)); + p.add(scrollpane0); + + String[][] data = new String[5][5]; + String[] cols = new String[5]; + for (int r = 0; r < 5; r ++) { + cols[r] = "col " + r; + for (int c = 0; c < 5; c ++) { + data[r][c] = "(" + r + "," + c + ")"; + } + } + + JTable tableView = new JTable(data, cols); + JScrollPane scrollpane = new JScrollPane(tableView); + scrollpane.setBorder(new BevelBorder(BevelBorder.LOWERED)); + scrollpane.setPreferredSize(new Dimension(430, 200)); + p.add(scrollpane); + + String[] s = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}; + JList listView = new JList(s); + JScrollPane scrollpane2 = new JScrollPane(listView); + scrollpane2.setBorder(new BevelBorder(BevelBorder.LOWERED)); + scrollpane2.setPreferredSize(new Dimension(430, 200)); + p.add(scrollpane2); + + frame.pack(); + return frame; + } +} diff --git a/test/jdk/javax/swing/JPopupMenu/bug4187004.java b/test/jdk/javax/swing/JPopupMenu/bug4187004.java new file mode 100644 index 000000000000..40a6633c1300 --- /dev/null +++ b/test/jdk/javax/swing/JPopupMenu/bug4187004.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 1999, 2025, 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 4187004 + @summary test that title/label is show on menu for Motif L&F + @key headful +*/ + +import java.awt.Dimension; +import java.awt.Robot; +import javax.swing.JFrame; +import javax.swing.JPopupMenu; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; + +public class bug4187004 { + + static volatile JPopupMenu m; + static volatile Dimension d1, d2; + + public static void main(String[] args) throws Exception { + try { + SwingUtilities.invokeAndWait(bug4187004::createUI); + + Robot robot = new Robot(); + robot.waitForIdle(); + robot.delay(1000); + d1 = m.getSize(); + SwingUtilities.invokeAndWait(bug4187004::hideMenu); + robot.waitForIdle(); + robot.delay(1000); + SwingUtilities.invokeAndWait(bug4187004::updateUI); + robot.waitForIdle(); + robot.delay(1000); + SwingUtilities.invokeAndWait(bug4187004::showMenu); + robot.waitForIdle(); + robot.delay(1000); + d2 = m.getSize(); + } finally { + SwingUtilities.invokeAndWait(bug4187004::hideMenu); + } + System.out.println(d1); + System.out.println(d2); + if (d1.width <= d2.width) { + throw new RuntimeException("Menu not updated"); + } + } + + static void createUI() { + try { + UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); + } catch (Exception e) { + throw new RuntimeException(e); + } + m = new JPopupMenu("One really long menu title"); + m.add("Item 1"); + m.add("Item 2"); + m.add("Item 3"); + m.add("Item 4"); + m.pack(); + m.setVisible(true); + } + + static void hideMenu() { + m.setVisible(false); + } + + static void showMenu() { + m.setVisible(true); + } + + static void updateUI() { + m.setLabel("short"); + m.pack(); + } +} diff --git a/test/jdk/javax/swing/JPopupMenu/bug4530303.java b/test/jdk/javax/swing/JPopupMenu/bug4530303.java new file mode 100644 index 000000000000..c99dacc7cff3 --- /dev/null +++ b/test/jdk/javax/swing/JPopupMenu/bug4530303.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2002, 2025, 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 4530303 + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @summary Tests JPopupMenu.pack() + * @run main/manual bug4530303 + */ + +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; + +public class bug4530303 { + + static final String INSTRUCTIONS = """ + The test window has a menu bar. + Open the menu "Menu" and place the mouse pointer over the first menu item, "Point here". + The second menu item, "Ghost", should be replaced with another item, "Fixed!". + If the item just disappears and no new item appears in the empty space, the test FAILS. + """; + + static volatile JMenu menu; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(60) + .testUI(bug4530303::createUI) + .build() + .awaitAndCheck(); + } + + static JFrame createUI() { + JFrame frame = new JFrame("bug4530303"); + menu = new JMenu("Menu"); + JMenuItem item = new JMenuItem("Point here"); + item.addMouseListener(new MenuBuilder()); + menu.add(item); + menu.add(new JMenuItem("Ghost")); + + JMenuBar mbar = new JMenuBar(); + mbar.add(menu); + frame.setJMenuBar(mbar); + frame.setSize(300, 300); + return frame; + } + + static class MenuBuilder extends MouseAdapter { + public void mouseEntered(MouseEvent ev) { + menu.remove(1); + menu.add(new JMenuItem("Fixed!")); + + JPopupMenu pm = menu.getPopupMenu(); + pm.pack(); + pm.paintImmediately(pm.getBounds()); + } + } +} From ac427f6a8518bf9d0dae846b4aedbe144279fddd Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Wed, 3 Sep 2025 16:48:57 +0000 Subject: [PATCH 007/323] 8354472: Clean up and open source KeyEvent related tests (Part 3) Backport-of: cd2d49f7119459f07844ce8201ca2320850cd51f --- .../awt/event/KeyEvent/CharUndefinedTest.java | 95 +++++++++++++ .../awt/event/KeyEvent/ExtendedKeysTest.java | 66 +++++++++ .../event/KeyEvent/KeyDownCaptureTest.java | 111 +++++++++++++++ .../event/KeyEvent/KeyEventToLightweight.java | 125 ++++++++++++++++ .../java/awt/event/KeyEvent/KeyModifiers.java | 134 ++++++++++++++++++ 5 files changed, 531 insertions(+) create mode 100644 test/jdk/java/awt/event/KeyEvent/CharUndefinedTest.java create mode 100644 test/jdk/java/awt/event/KeyEvent/ExtendedKeysTest.java create mode 100644 test/jdk/java/awt/event/KeyEvent/KeyDownCaptureTest.java create mode 100644 test/jdk/java/awt/event/KeyEvent/KeyEventToLightweight.java create mode 100644 test/jdk/java/awt/event/KeyEvent/KeyModifiers.java diff --git a/test/jdk/java/awt/event/KeyEvent/CharUndefinedTest.java b/test/jdk/java/awt/event/KeyEvent/CharUndefinedTest.java new file mode 100644 index 000000000000..bc58bdab14a0 --- /dev/null +++ b/test/jdk/java/awt/event/KeyEvent/CharUndefinedTest.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 1999, 2025, 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 4115484 4164672 4167893 + * @summary Ensures that KeyEvent has right keyChar for modifier and action keys. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual CharUndefinedTest + */ + +import java.awt.BorderLayout; +import java.awt.Frame; +import java.awt.TextField; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.lang.reflect.InvocationTargetException; + +public class CharUndefinedTest extends Frame implements KeyListener { + + static String INSTRUCTIONS = """ + Click on the text field inside the window named "Check KeyChar values". + Of any of the keys mentioned in this list that exist on your keyboard + press each of the listed keys once and also press them in two-key combinations such as + Control-Shift or Alt-Control. + The list of keys is: "Control, Shift, Meta, Alt, Command, Option". + After that press all function keys from F1 to F12 once, + Insert, Home, End, PageUp, PageDown and four arrow keys. + Check the log area below. If there are no messages starting with word "ERROR" + press "Pass" otherwise press "Fail". + """; + + public CharUndefinedTest() { + super("Check KeyChar values"); + setLayout(new BorderLayout()); + TextField tf = new TextField(30); + tf.addKeyListener(this); + add(tf, BorderLayout.CENTER); + pack(); + tf.requestFocus(); + } + + public void keyPressed(KeyEvent e) { + if (e.getKeyChar() != KeyEvent.CHAR_UNDEFINED) { + PassFailJFrame.log("ERROR: KeyPressed: keyChar = " + e.getKeyChar() + + " keyCode = " + e.getKeyCode() + " " + e.getKeyText(e.getKeyCode())); + } + } + + public void keyTyped(KeyEvent e) { + if (e.getKeyChar() != KeyEvent.CHAR_UNDEFINED) { + PassFailJFrame.log("ERROR: KeyTyped: keyChar = " + e.getKeyChar() + + " keyCode = " + e.getKeyCode() + " " + e.getKeyText(e.getKeyCode())); + } + } + + public void keyReleased(KeyEvent e) { + if (e.getKeyChar() != KeyEvent.CHAR_UNDEFINED) { + PassFailJFrame.log("ERROR: KeyReleased: keyChar = " + e.getKeyChar() + + " keyCode = " + e.getKeyCode() + " " + e.getKeyText(e.getKeyCode())); + } + } + + public static void main(String[] args) throws InterruptedException, + InvocationTargetException { + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(45) + .logArea(10) + .testUI(CharUndefinedTest::new) + .build() + .awaitAndCheck(); + } +} diff --git a/test/jdk/java/awt/event/KeyEvent/ExtendedKeysTest.java b/test/jdk/java/awt/event/KeyEvent/ExtendedKeysTest.java new file mode 100644 index 000000000000..1423b2a007e9 --- /dev/null +++ b/test/jdk/java/awt/event/KeyEvent/ExtendedKeysTest.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 1999, 2025, 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 4218892 4191924 4199284 + * @summary Unable to enter some chars via european keyboard layout(s) + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual ExtendedKeysTest + */ + +import java.awt.BorderLayout; +import java.awt.Frame; +import java.awt.TextArea; +import java.lang.reflect.InvocationTargetException; + +public class ExtendedKeysTest extends Frame { + static String INSTRUCTIONS = """ + This test requires Swiss German input. If the Swiss German input + can not be installed or configured press "Pass" to skip testing. + Click on the text area inside the window named "Check input". + Switch to Swiss German input and press key with "\\" on it + (usually this key is above or to the left of the main "Enter" key). + If you see a dollar sign press "Pass". + If you see any other character or question mark press "Fail". + """; + + public ExtendedKeysTest() { + super("Check input"); + setLayout(new BorderLayout()); + add(new TextArea(20, 20), "Center"); + pack(); + } + + public static void main(String[] args) throws InterruptedException, + InvocationTargetException { + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(45) + .logArea(10) + .testUI(ExtendedKeysTest::new) + .build() + .awaitAndCheck(); + } +} diff --git a/test/jdk/java/awt/event/KeyEvent/KeyDownCaptureTest.java b/test/jdk/java/awt/event/KeyEvent/KeyDownCaptureTest.java new file mode 100644 index 000000000000..bf2ab7ae9583 --- /dev/null +++ b/test/jdk/java/awt/event/KeyEvent/KeyDownCaptureTest.java @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2001, 2025, 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 4093998 + * @summary keyDown not called on subclasses of Component + * @key headful + * @run main KeyDownCaptureTest + */ + +import java.awt.AWTException; +import java.awt.BorderLayout; +import java.awt.Canvas; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.EventQueue; +import java.awt.Frame; +import java.awt.Point; +import java.awt.Robot; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.lang.reflect.InvocationTargetException; +import java.util.concurrent.atomic.AtomicBoolean; + +public class KeyDownCaptureTest extends Frame implements KeyListener { + static AtomicBoolean passed = new AtomicBoolean(false); + + public KeyDownCaptureTest() { + super("Key Down Capture Test"); + } + + public void initUI() { + setLayout (new BorderLayout()); + setSize(200, 200); + setLocationRelativeTo(null); + Canvas canvas = new Canvas(); + canvas.setBackground(Color.RED); + canvas.addKeyListener(this); + add(canvas, BorderLayout.CENTER); + setVisible(true); + } + + public void middle(Point p) { + Point loc = getLocationOnScreen(); + Dimension size = getSize(); + p.setLocation(loc.x + (size.width / 2), loc.y + (size.height / 2)); + } + + @Override + public void keyTyped(KeyEvent ignore) {} + + @Override + public void keyPressed(KeyEvent e) { + passed.set(true); + } + + @Override + public void keyReleased(KeyEvent ignore) {} + + public static void main(String[] args) throws InterruptedException, + InvocationTargetException, AWTException { + KeyDownCaptureTest test = new KeyDownCaptureTest(); + try { + EventQueue.invokeAndWait((test::initUI)); + Robot robot = new Robot(); + robot.setAutoDelay(50); + robot.delay(500); + robot.waitForIdle(); + Point target = new Point(); + EventQueue.invokeAndWait(() -> { + test.middle(target); + }); + robot.mouseMove(target.x, target.y); + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + robot.keyPress(KeyEvent.VK_SPACE); + robot.keyRelease(KeyEvent.VK_SPACE); + robot.delay(100); + robot.waitForIdle(); + if (!passed.get()) { + throw new RuntimeException("KeyPressed has not arrived to canvas"); + } + } finally { + if (test != null) { + EventQueue.invokeAndWait(test::dispose); + } + } + } +} diff --git a/test/jdk/java/awt/event/KeyEvent/KeyEventToLightweight.java b/test/jdk/java/awt/event/KeyEvent/KeyEventToLightweight.java new file mode 100644 index 000000000000..de832bf2e6d4 --- /dev/null +++ b/test/jdk/java/awt/event/KeyEvent/KeyEventToLightweight.java @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2001, 2025, 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 4397557 + * @summary Check that focused lightweight component gets key events + * even if mouse is outside of it or on top of heavyweight component + * @key headful + * @run main KeyEventToLightweight + */ + +import java.awt.AWTException; +import java.awt.Button; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.EventQueue; +import java.awt.FlowLayout; +import java.awt.Frame; +import java.awt.Point; +import java.awt.Robot; +import java.awt.event.InputEvent; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.lang.reflect.InvocationTargetException; +import java.util.concurrent.atomic.AtomicBoolean; +import javax.swing.JButton; + +public class KeyEventToLightweight extends Frame { + JButton lwbutton = new JButton("Select Me"); + Button hwbutton = new Button("Heavyweight"); + + AtomicBoolean aTyped = new AtomicBoolean(false); + AtomicBoolean bTyped = new AtomicBoolean(false); + AtomicBoolean cTyped = new AtomicBoolean(false); + + public static void main(String[] args) throws InterruptedException, + InvocationTargetException, AWTException { + KeyEventToLightweight test = new KeyEventToLightweight(); + try { + EventQueue.invokeAndWait(test::initUI); + test.performTest(); + } finally { + EventQueue.invokeAndWait(test::dispose); + } + } + + public void initUI() { + this.setLayout(new FlowLayout()); + add(lwbutton); + add(hwbutton); + setSize(200, 200); + setLocationRelativeTo(null); + lwbutton.addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_A) { + aTyped.set(true); + } else if (e.getKeyCode() == KeyEvent.VK_B) { + bTyped.set(true); + } else if (e.getKeyCode() == KeyEvent.VK_C) { + cTyped.set(true); + } + } + }); + setVisible(true); + } + + public void middleOf(Component c, Point p) { + Point loc = c.getLocationOnScreen(); + Dimension size = c.getSize(); + p.setLocation(loc.x + (size.width / 2), loc.y + (size.height / 2)); + } + + public void performTest() throws AWTException, InterruptedException, + InvocationTargetException { + Robot robot = new Robot(); + robot.setAutoDelay(50); + robot.delay(500); + robot.waitForIdle(); + Point target = new Point(); + EventQueue.invokeAndWait(() -> middleOf(lwbutton, target)); + robot.mouseMove(target.x, target.y); + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + robot.waitForIdle(); + robot.delay(500); + robot.keyPress(KeyEvent.VK_A); + robot.keyRelease(KeyEvent.VK_A); + robot.waitForIdle(); + robot.mouseMove(target.x - 200, target.y); + robot.keyPress(KeyEvent.VK_B); + robot.keyRelease(KeyEvent.VK_B); + robot.waitForIdle(); + robot.delay(500); + EventQueue.invokeAndWait(() -> middleOf(hwbutton, target)); + robot.mouseMove(target.x, target.y); + robot.keyPress(KeyEvent.VK_C); + robot.keyRelease(KeyEvent.VK_C); + if (!aTyped.get() || !bTyped.get() || !cTyped.get()) { + throw new RuntimeException("Key event was not delivered, case 1: " + + aTyped.get() + ", case 2: " + bTyped.get() + ", case 3: " + + cTyped.get()); + } + } +} diff --git a/test/jdk/java/awt/event/KeyEvent/KeyModifiers.java b/test/jdk/java/awt/event/KeyEvent/KeyModifiers.java new file mode 100644 index 000000000000..13cc35581dbe --- /dev/null +++ b/test/jdk/java/awt/event/KeyEvent/KeyModifiers.java @@ -0,0 +1,134 @@ +/* + * Copyright (c) 1999, 2025, 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 4193779 4174399 + * @summary Ensures that KeyEvents have the right modifiers set + * @library /java/awt/regtesthelpers /test/lib + * @build PassFailJFrame jdk.test.lib.Platform + * @run main/manual KeyModifiers + */ + +import java.awt.BorderLayout; +import java.awt.Frame; +import java.awt.TextField; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.lang.reflect.InvocationTargetException; + +import jdk.test.lib.Platform; + + +public class KeyModifiers extends Frame implements KeyListener { + public KeyModifiers() { + super("Check KeyChar values"); + setLayout(new BorderLayout()); + TextField tf = new TextField(30); + tf.addKeyListener(this); + add(tf, BorderLayout.CENTER); + pack(); + } + + public static void main(String[] args) throws InterruptedException, + InvocationTargetException { + + String keys; + if (Platform.isWindows()) { + keys = "\"Shift-n\", \"Alt-n\"\n"; + } else if (Platform.isOSX()) { + keys = "\"Shift-n\", \"Alt-n\", \"Command-n\"\n"; + } else { + keys = "\"Shift-n\", \"Alt-n\", \"Meta-n\"\n"; + } + + String INSTRUCTIONS1 = """ + Click on the text field in the window named "Check KeyChar values" + and type the following key combinations: + """; + String INSTRUCTIONS2 = """ + After each combination check that the KeyPressed and KeyTyped modifiers + are correctly displayed. If modifiers are correct press "Pass", + otherwise press "Fail". + """; + PassFailJFrame.builder() + .title("KeyModifiers Test Instructions") + .instructions(INSTRUCTIONS1 + keys + INSTRUCTIONS2) + .columns(45) + .logArea(10) + .testUI(KeyModifiers::new) + .build() + .awaitAndCheck(); + } + + public void keyPressed(KeyEvent evt) { + int kc = evt.getKeyCode(); + + if (kc == KeyEvent.VK_CONTROL) { + return; + } + + if ((kc == KeyEvent.VK_SHIFT) || (kc == KeyEvent.VK_META) || + (kc == KeyEvent.VK_ALT) || (kc == KeyEvent.VK_ALT_GRAPH)) { + PassFailJFrame.log("Key pressed= " + KeyEvent.getKeyText(kc) + + " modifiers = " + InputEvent.getModifiersExText(evt.getModifiersEx())); + } else { + PassFailJFrame.log("Key pressed = " + evt.getKeyChar() + + " modifiers = " + InputEvent.getModifiersExText(evt.getModifiersEx())); + } + } + + public void keyTyped(KeyEvent evt) { + int kc = evt.getKeyCode(); + + if (kc == KeyEvent.VK_CONTROL) { + return; + } + + if ((kc == KeyEvent.VK_SHIFT) || (kc == KeyEvent.VK_META) || + (kc == KeyEvent.VK_ALT) || (kc == KeyEvent.VK_ALT_GRAPH)) { + PassFailJFrame.log("Key typed = " + KeyEvent.getKeyText(kc) + + " modifiers = " + InputEvent.getModifiersExText(evt.getModifiersEx())); + } else { + PassFailJFrame.log("Key typed = " + evt.getKeyChar() + + " modifiers = " + InputEvent.getModifiersExText(evt.getModifiersEx())); + } + } + + public void keyReleased(KeyEvent evt) { + int kc = evt.getKeyCode(); + + if (kc == KeyEvent.VK_CONTROL) + return; + + if ((kc == KeyEvent.VK_SHIFT) || (kc == KeyEvent.VK_META) || + (kc == KeyEvent.VK_ALT) || (kc == KeyEvent.VK_ALT_GRAPH)) { + PassFailJFrame.log("Key = released " + KeyEvent.getKeyText(kc) + + " modifiers = " + InputEvent.getModifiersExText(evt.getModifiersEx())); + } else { + PassFailJFrame.log("Key released = " + evt.getKeyChar() + + " modifiers = " + InputEvent.getModifiersExText(evt.getModifiersEx())); + } + } +} From 493af553ed325a1bc1b4dd81f7b5080807c38692 Mon Sep 17 00:00:00 2001 From: Timofei Pushkin Date: Thu, 4 Sep 2025 16:12:28 +0000 Subject: [PATCH 008/323] 8348240: Remove SystemDictionaryShared::lookup_super_for_unregistered_class() Reviewed-by: iklam Backport-of: 7f16a0875ced8669b9d2131c67496a66e74ea36f --- src/hotspot/share/cds/classListParser.cpp | 75 +++++------- src/hotspot/share/cds/classListParser.hpp | 13 +- src/hotspot/share/cds/unregisteredClasses.cpp | 78 ++++++------ src/hotspot/share/cds/unregisteredClasses.hpp | 23 +++- .../share/classfile/systemDictionary.cpp | 10 -- .../classfile/systemDictionaryShared.cpp | 46 ++----- src/hotspot/share/classfile/vmClassMacros.hpp | 3 +- src/hotspot/share/classfile/vmSymbols.hpp | 2 - .../share/classes/jdk/internal/misc/CDS.java | 114 +++++++++++++++++- .../appcds/customLoader/ClassListFormatE.java | 19 ++- 10 files changed, 231 insertions(+), 152 deletions(-) diff --git a/src/hotspot/share/cds/classListParser.cpp b/src/hotspot/share/cds/classListParser.cpp index b3bfe79bb421..f8ba385bd621 100644 --- a/src/hotspot/share/cds/classListParser.cpp +++ b/src/hotspot/share/cds/classListParser.cpp @@ -42,6 +42,7 @@ #include "jvm.h" #include "logging/log.hpp" #include "logging/logTag.hpp" +#include "memory/oopFactory.hpp" #include "memory/resourceArea.hpp" #include "oops/constantPool.hpp" #include "runtime/atomic.hpp" @@ -97,6 +98,12 @@ ClassListParser::~ClassListParser() { _instance = nullptr; } +int ClassListParser::parse_classlist(const char* classlist_path, ParseMode parse_mode, TRAPS) { + UnregisteredClasses::initialize(CHECK_0); + ClassListParser parser(classlist_path, parse_mode); + return parser.parse(THREAD); // returns the number of classes loaded. +} + int ClassListParser::parse(TRAPS) { int class_count = 0; @@ -390,6 +397,19 @@ bool ClassListParser::parse_uint_option(const char* option_name, int* value) { return false; } +objArrayOop ClassListParser::get_specified_interfaces(TRAPS) { + const int n = _interfaces->length(); + if (n == 0) { + return nullptr; + } else { + objArrayOop array = oopFactory::new_objArray(vmClasses::Class_klass(), n, CHECK_NULL); + for (int i = 0; i < n; i++) { + array->obj_at_put(i, lookup_class_by_id(_interfaces->at(i))->java_mirror()); + } + return array; + } +} + void ClassListParser::print_specified_interfaces() { const int n = _interfaces->length(); jio_fprintf(defaultStream::error_stream(), "Currently specified interfaces[%d] = {\n", n); @@ -474,7 +494,17 @@ InstanceKlass* ClassListParser::load_class_from_source(Symbol* class_name, TRAPS ResourceMark rm; char * source_path = os::strdup_check_oom(ClassLoader::uri_to_path(_source)); - InstanceKlass* k = UnregisteredClasses::load_class(class_name, source_path, CHECK_NULL); + InstanceKlass* specified_super = lookup_class_by_id(_super); + Handle super_class(THREAD, specified_super->java_mirror()); + objArrayOop r = get_specified_interfaces(CHECK_NULL); + objArrayHandle interfaces(THREAD, r); + InstanceKlass* k = UnregisteredClasses::load_class(class_name, source_path, + super_class, interfaces, CHECK_NULL); + if (k->java_super() != specified_super) { + error("The specified super class %s (id %d) does not match actual super class %s", + specified_super->external_name(), _super, + k->java_super()->external_name()); + } if (k->local_interfaces()->length() != _interfaces->length()) { print_specified_interfaces(); print_actual_interfaces(k); @@ -682,46 +712,3 @@ InstanceKlass* ClassListParser::lookup_class_by_id(int id) { assert(*klass_ptr != nullptr, "must be"); return *klass_ptr; } - - -InstanceKlass* ClassListParser::lookup_super_for_current_class(Symbol* super_name) { - if (!is_loading_from_source()) { - return nullptr; - } - - InstanceKlass* k = lookup_class_by_id(super()); - if (super_name != k->name()) { - error("The specified super class %s (id %d) does not match actual super class %s", - k->name()->as_klass_external_name(), super(), - super_name->as_klass_external_name()); - } - return k; -} - -InstanceKlass* ClassListParser::lookup_interface_for_current_class(Symbol* interface_name) { - if (!is_loading_from_source()) { - return nullptr; - } - - const int n = _interfaces->length(); - if (n == 0) { - error("Class %s implements the interface %s, but no interface has been specified in the input line", - _class_name, interface_name->as_klass_external_name()); - ShouldNotReachHere(); - } - - int i; - for (i=0; iat(i)); - if (interface_name == k->name()) { - return k; - } - } - - // interface_name is not specified by the "interfaces:" keyword. - print_specified_interfaces(); - error("The interface %s implemented by class %s does not match any of the specified interface IDs", - interface_name->as_klass_external_name(), _class_name); - ShouldNotReachHere(); - return nullptr; -} diff --git a/src/hotspot/share/cds/classListParser.hpp b/src/hotspot/share/cds/classListParser.hpp index 74a2ff10515f..4234cd436eed 100644 --- a/src/hotspot/share/cds/classListParser.hpp +++ b/src/hotspot/share/cds/classListParser.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2025, 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 @@ -134,12 +134,10 @@ class ClassListParser : public StackObj { ClassListParser(const char* file, ParseMode _parse_mode); ~ClassListParser(); + objArrayOop get_specified_interfaces(TRAPS); public: - static int parse_classlist(const char* classlist_path, ParseMode parse_mode, TRAPS) { - ClassListParser parser(classlist_path, parse_mode); - return parser.parse(THREAD); // returns the number of classes loaded. - } + static int parse_classlist(const char* classlist_path, ParseMode parse_mode, TRAPS); static bool is_parsing_thread(); static ClassListParser* instance() { @@ -192,11 +190,6 @@ class ClassListParser : public StackObj { bool lambda_form_line() { return _lambda_form_line; } - // Look up the super or interface of the current class being loaded - // (in this->load_current_class()). - InstanceKlass* lookup_super_for_current_class(Symbol* super_name); - InstanceKlass* lookup_interface_for_current_class(Symbol* interface_name); - static void populate_cds_indy_info(const constantPoolHandle &pool, int cp_index, CDSIndyInfo* cii, TRAPS); }; #endif // SHARE_CDS_CLASSLISTPARSER_HPP diff --git a/src/hotspot/share/cds/unregisteredClasses.cpp b/src/hotspot/share/cds/unregisteredClasses.cpp index 06d006ea1bb9..641f84c3dcda 100644 --- a/src/hotspot/share/cds/unregisteredClasses.cpp +++ b/src/hotspot/share/cds/unregisteredClasses.cpp @@ -29,7 +29,7 @@ #include "classfile/classLoaderExt.hpp" #include "classfile/javaClasses.inline.hpp" #include "classfile/symbolTable.hpp" -#include "classfile/systemDictionaryShared.hpp" +#include "classfile/systemDictionary.hpp" #include "classfile/vmSymbols.hpp" #include "memory/oopFactory.hpp" #include "memory/resourceArea.hpp" @@ -39,10 +39,22 @@ #include "runtime/javaCalls.hpp" #include "services/threadService.hpp" +InstanceKlass* UnregisteredClasses::_UnregisteredClassLoader_klass = nullptr; + +void UnregisteredClasses::initialize(TRAPS) { + if (_UnregisteredClassLoader_klass == nullptr) { + // no need for synchronization as this function is called single-threaded. + Symbol* klass_name = SymbolTable::new_symbol("jdk/internal/misc/CDS$UnregisteredClassLoader"); + Klass* k = SystemDictionary::resolve_or_fail(klass_name, true, CHECK); + _UnregisteredClassLoader_klass = InstanceKlass::cast(k); + } +} + // Load the class of the given name from the location given by path. The path is specified by // the "source:" in the class list file (see classListParser.cpp), and can be a directory or // a JAR file. -InstanceKlass* UnregisteredClasses::load_class(Symbol* name, const char* path, TRAPS) { +InstanceKlass* UnregisteredClasses::load_class(Symbol* name, const char* path, + Handle super_class, objArrayHandle interfaces, TRAPS) { assert(name != nullptr, "invariant"); assert(DumpSharedSpaces, "this function is only used with -Xshare:dump"); @@ -50,19 +62,23 @@ InstanceKlass* UnregisteredClasses::load_class(Symbol* name, const char* path, T THREAD->get_thread_stat()->perf_timers_addr(), PerfClassTraceTime::CLASS_LOAD); + // Call CDS$UnregisteredClassLoader::load(String name, Class superClass, Class[] interfaces) + Symbol* methodName = SymbolTable::new_symbol("load"); + Symbol* methodSignature = SymbolTable::new_symbol("(Ljava/lang/String;Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/Class;"); Symbol* path_symbol = SymbolTable::new_symbol(path); - Handle url_classloader = get_url_classloader(path_symbol, CHECK_NULL); + Handle classloader = get_classloader(path_symbol, CHECK_NULL); Handle ext_class_name = java_lang_String::externalize_classname(name, CHECK_NULL); JavaValue result(T_OBJECT); - JavaCallArguments args(2); - args.set_receiver(url_classloader); + JavaCallArguments args(3); + args.set_receiver(classloader); args.push_oop(ext_class_name); - args.push_int(JNI_FALSE); + args.push_oop(super_class); + args.push_oop(interfaces); JavaCalls::call_virtual(&result, - vmClasses::URLClassLoader_klass(), - vmSymbols::loadClass_name(), - vmSymbols::string_boolean_class_signature(), + UnregisteredClassLoader_klass(), + methodName, + methodSignature, &args, CHECK_NULL); assert(result.get_type() == T_OBJECT, "just checking"); @@ -70,45 +86,35 @@ InstanceKlass* UnregisteredClasses::load_class(Symbol* name, const char* path, T return InstanceKlass::cast(java_lang_Class::as_Klass(obj)); } -class URLClassLoaderTable : public ResourceHashtable< +class UnregisteredClasses::ClassLoaderTable : public ResourceHashtable< Symbol*, OopHandle, 137, // prime number AnyObj::C_HEAP> {}; -static URLClassLoaderTable* _url_classloader_table = nullptr; +static UnregisteredClasses::ClassLoaderTable* _classloader_table = nullptr; -Handle UnregisteredClasses::create_url_classloader(Symbol* path, TRAPS) { +Handle UnregisteredClasses::create_classloader(Symbol* path, TRAPS) { ResourceMark rm(THREAD); JavaValue result(T_OBJECT); Handle path_string = java_lang_String::create_from_str(path->as_C_string(), CHECK_NH); - JavaCalls::call_static(&result, - vmClasses::jdk_internal_loader_ClassLoaders_klass(), - vmSymbols::toFileURL_name(), - vmSymbols::toFileURL_signature(), - path_string, CHECK_NH); - assert(result.get_type() == T_OBJECT, "just checking"); - oop url_h = result.get_oop(); - objArrayHandle urls = oopFactory::new_objArray_handle(vmClasses::URL_klass(), 1, CHECK_NH); - urls->obj_at_put(0, url_h); - - Handle url_classloader = JavaCalls::construct_new_instance( - vmClasses::URLClassLoader_klass(), - vmSymbols::url_array_classloader_void_signature(), - urls, Handle(), CHECK_NH); - return url_classloader; + Handle classloader = JavaCalls::construct_new_instance( + UnregisteredClassLoader_klass(), + vmSymbols::string_void_signature(), + path_string, CHECK_NH); + return classloader; } -Handle UnregisteredClasses::get_url_classloader(Symbol* path, TRAPS) { - if (_url_classloader_table == nullptr) { - _url_classloader_table = new (mtClass)URLClassLoaderTable(); +Handle UnregisteredClasses::get_classloader(Symbol* path, TRAPS) { + if (_classloader_table == nullptr) { + _classloader_table = new (mtClass)ClassLoaderTable(); } - OopHandle* url_classloader_ptr = _url_classloader_table->get(path); - if (url_classloader_ptr != nullptr) { - return Handle(THREAD, (*url_classloader_ptr).resolve()); + OopHandle* classloader_ptr = _classloader_table->get(path); + if (classloader_ptr != nullptr) { + return Handle(THREAD, (*classloader_ptr).resolve()); } else { - Handle url_classloader = create_url_classloader(path, CHECK_NH); - _url_classloader_table->put(path, OopHandle(Universe::vm_global(), url_classloader())); + Handle classloader = create_classloader(path, CHECK_NH); + _classloader_table->put(path, OopHandle(Universe::vm_global(), classloader())); path->increment_refcount(); - return url_classloader; + return classloader; } } diff --git a/src/hotspot/share/cds/unregisteredClasses.hpp b/src/hotspot/share/cds/unregisteredClasses.hpp index a9f7dceaead6..ea3a308c2de2 100644 --- a/src/hotspot/share/cds/unregisteredClasses.hpp +++ b/src/hotspot/share/cds/unregisteredClasses.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, 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 @@ -25,15 +25,30 @@ #ifndef SHARE_CDS_UNREGISTEREDCLASSES_HPP #define SHARE_CDS_UNREGISTEREDCLASSES_HPP +#include "memory/allStatic.hpp" #include "runtime/handles.hpp" +class InstanceKlass; +class Symbol; + class UnregisteredClasses: AllStatic { public: - static InstanceKlass* load_class(Symbol* h_name, const char* path, TRAPS); + static InstanceKlass* load_class(Symbol* h_name, const char* path, + Handle super_class, objArrayHandle interfaces, + TRAPS); + static void initialize(TRAPS); + static InstanceKlass* UnregisteredClassLoader_klass() { + return _UnregisteredClassLoader_klass; + } + + class ClassLoaderTable; private: - static Handle create_url_classloader(Symbol* path, TRAPS); - static Handle get_url_classloader(Symbol* path, TRAPS); + // Don't put this in vmClasses as it's used only with CDS dumping. + static InstanceKlass* _UnregisteredClassLoader_klass; + + static Handle create_classloader(Symbol* path, TRAPS); + static Handle get_classloader(Symbol* path, TRAPS); }; #endif // SHARE_CDS_UNREGISTEREDCLASSES_HPP diff --git a/src/hotspot/share/classfile/systemDictionary.cpp b/src/hotspot/share/classfile/systemDictionary.cpp index 6faa0469a181..10274023b56f 100644 --- a/src/hotspot/share/classfile/systemDictionary.cpp +++ b/src/hotspot/share/classfile/systemDictionary.cpp @@ -413,16 +413,6 @@ InstanceKlass* SystemDictionary::resolve_super_or_fail(Symbol* class_name, assert(super_name != nullptr, "null superclass for resolving"); assert(!Signature::is_array(super_name), "invalid superclass name"); -#if INCLUDE_CDS - if (DumpSharedSpaces) { - // Special processing for handling UNREGISTERED shared classes. - InstanceKlass* k = SystemDictionaryShared::lookup_super_for_unregistered_class(class_name, - super_name, is_superclass); - if (k) { - return k; - } - } -#endif // INCLUDE_CDS // If klass is already loaded, just return the superclass or superinterface. // Make sure there's a placeholder for the class_name before resolving. diff --git a/src/hotspot/share/classfile/systemDictionaryShared.cpp b/src/hotspot/share/classfile/systemDictionaryShared.cpp index 4744c38b87e8..22a94133a9ad 100644 --- a/src/hotspot/share/classfile/systemDictionaryShared.cpp +++ b/src/hotspot/share/classfile/systemDictionaryShared.cpp @@ -34,6 +34,7 @@ #include "cds/dumpTimeClassInfo.inline.hpp" #include "cds/metaspaceShared.hpp" #include "cds/runTimeClassInfo.hpp" +#include "cds/unregisteredClasses.hpp" #include "classfile/classFileStream.hpp" #include "classfile/classLoader.hpp" #include "classfile/classLoaderData.inline.hpp" @@ -331,6 +332,12 @@ bool SystemDictionaryShared::check_for_exclusion_impl(InstanceKlass* k) { } } + if (k == UnregisteredClasses::UnregisteredClassLoader_klass()) { + ResourceMark rm; + log_info(cds)("Skipping %s: used only when dumping CDS archive", k->name()->as_C_string()); + return true; + } + return false; // false == k should NOT be excluded } @@ -449,45 +456,6 @@ bool SystemDictionaryShared::add_unregistered_class(Thread* current, InstanceKla return (klass == *v); } -// This function is called to lookup the super/interfaces of shared classes for -// unregistered loaders. E.g., SharedClass in the below example -// where "super:" (and optionally "interface:") have been specified. -// -// java/lang/Object id: 0 -// Interface id: 2 super: 0 source: cust.jar -// SharedClass id: 4 super: 0 interfaces: 2 source: cust.jar -InstanceKlass* SystemDictionaryShared::lookup_super_for_unregistered_class( - Symbol* class_name, Symbol* super_name, bool is_superclass) { - - assert(DumpSharedSpaces, "only when static dumping"); - - if (!ClassListParser::is_parsing_thread()) { - // Unregistered classes can be created only by ClassListParser::_parsing_thread. - - return nullptr; - } - - ClassListParser* parser = ClassListParser::instance(); - if (parser == nullptr) { - // We're still loading the well-known classes, before the ClassListParser is created. - return nullptr; - } - if (class_name->equals(parser->current_class_name())) { - // When this function is called, all the numbered super and interface types - // must have already been loaded. Hence this function is never recursively called. - if (is_superclass) { - return parser->lookup_super_for_current_class(super_name); - } else { - return parser->lookup_interface_for_current_class(super_name); - } - } else { - // The VM is not trying to resolve a super type of parser->current_class_name(). - // Instead, it's resolving an error class (because parser->current_class_name() has - // failed parsing or verification). Don't do anything here. - return nullptr; - } -} - void SystemDictionaryShared::set_shared_class_misc_info(InstanceKlass* k, ClassFileStream* cfs) { Arguments::assert_is_dumping_archive(); assert(!is_builtin(k), "must be unregistered class"); diff --git a/src/hotspot/share/classfile/vmClassMacros.hpp b/src/hotspot/share/classfile/vmClassMacros.hpp index 683a3ad04e10..e09afbfa3667 100644 --- a/src/hotspot/share/classfile/vmClassMacros.hpp +++ b/src/hotspot/share/classfile/vmClassMacros.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, 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 @@ -145,7 +145,6 @@ /* support for CDS */ \ do_klass(ByteArrayInputStream_klass, java_io_ByteArrayInputStream ) \ do_klass(URL_klass, java_net_URL ) \ - do_klass(URLClassLoader_klass, java_net_URLClassLoader ) \ do_klass(Enum_klass, java_lang_Enum ) \ do_klass(Jar_Manifest_klass, java_util_jar_Manifest ) \ do_klass(jdk_internal_loader_BuiltinClassLoader_klass,jdk_internal_loader_BuiltinClassLoader ) \ diff --git a/src/hotspot/share/classfile/vmSymbols.hpp b/src/hotspot/share/classfile/vmSymbols.hpp index 1b43816f83d3..36f4f965802d 100644 --- a/src/hotspot/share/classfile/vmSymbols.hpp +++ b/src/hotspot/share/classfile/vmSymbols.hpp @@ -127,7 +127,6 @@ template(java_security_ProtectionDomain, "java/security/ProtectionDomain") \ template(java_security_SecureClassLoader, "java/security/SecureClassLoader") \ template(java_net_URL, "java/net/URL") \ - template(java_net_URLClassLoader, "java/net/URLClassLoader") \ template(java_util_jar_Manifest, "java/util/jar/Manifest") \ template(java_io_OutputStream, "java/io/OutputStream") \ template(java_io_Reader, "java/io/Reader") \ @@ -793,7 +792,6 @@ template(toFileURL_name, "toFileURL") \ template(toFileURL_signature, "(Ljava/lang/String;)Ljava/net/URL;") \ template(url_void_signature, "(Ljava/net/URL;)V") \ - template(url_array_classloader_void_signature, "([Ljava/net/URL;Ljava/lang/ClassLoader;)V") \ \ /* Thread.dump_to_file jcmd */ \ template(jdk_internal_vm_ThreadDumper, "jdk/internal/vm/ThreadDumper") \ diff --git a/src/java.base/share/classes/jdk/internal/misc/CDS.java b/src/java.base/share/classes/jdk/internal/misc/CDS.java index c41adcf9c4c2..a963a45a8134 100644 --- a/src/java.base/share/classes/jdk/internal/misc/CDS.java +++ b/src/java.base/share/classes/jdk/internal/misc/CDS.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, 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 @@ -31,6 +31,10 @@ import java.io.InputStream; import java.io.IOException; import java.io.PrintStream; +import java.net.URL; +import java.net.URLClassLoader; +import java.nio.file.InvalidPathException; +import java.nio.file.Path; import java.util.Arrays; import java.util.ArrayList; import java.util.List; @@ -333,4 +337,112 @@ private static String dumpSharedArchive(boolean isStatic, String fileName) throw System.out.println("The process was attached by jcmd and dumped a " + (isStatic ? "static" : "dynamic") + " archive " + archiveFilePath); return archiveFilePath; } + + /** + * This class is used only by native JVM code at CDS dump time for loading + * "unregistered classes", which are archived classes that are intended to + * be loaded by custom class loaders during runtime. + * See src/hotspot/share/cds/unregisteredClasses.cpp. + */ + private static class UnregisteredClassLoader extends URLClassLoader { + private String currentClassName; + private Class currentSuperClass; + private Class[] currentInterfaces; + + /** + * Used only by native code. Construct an UnregisteredClassLoader for loading + * unregistered classes from the specified file. If the file doesn't exist, + * the exception will be caughted by native code which will print a warning message and continue. + * + * @param fileName path of the the JAR file to load unregistered classes from. + */ + private UnregisteredClassLoader(String fileName) throws InvalidPathException, IOException { + super(toURLArray(fileName), /*parent*/null); + currentClassName = null; + currentSuperClass = null; + currentInterfaces = null; + } + + private static URL[] toURLArray(String fileName) throws InvalidPathException, IOException { + if (!((new File(fileName)).exists())) { + throw new IOException("No such file: " + fileName); + } + return new URL[] { + // Use an intermediate File object to construct a URI/URL without + // authority component as URLClassPath can't handle URLs with a UNC + // server name in the authority component. + Path.of(fileName).toRealPath().toFile().toURI().toURL() + }; + } + + + /** + * Load the class of the given /name from the JAR file that was given to + * the constructor of the current UnregisteredClassLoader instance. This class must be + * a direct subclass of superClass. This class must be declared to implement + * the specified interfaces. + *

+ * This method must be called in a single threaded context. It will never be recursed (thus + * the asserts) + * + * @param name the name of the class to be loaded. + * @param superClass must not be null. The named class must have a super class. + * @param interfaces could be null if the named class does not implement any interfaces. + */ + private Class load(String name, Class superClass, Class[] interfaces) + throws ClassNotFoundException + { + assert currentClassName == null; + assert currentSuperClass == null; + assert currentInterfaces == null; + + try { + currentClassName = name; + currentSuperClass = superClass; + currentInterfaces = interfaces; + + return findClass(name); + } finally { + currentClassName = null; + currentSuperClass = null; + currentInterfaces = null; + } + } + + /** + * This method must be called from inside the load() method. The /name + * can be only: + *

    + *
  • the name parameter for load() + *
  • the name of the superClass parameter for load() + *
  • the name of one of the interfaces in interfaces parameter for load() + *
      + * + * For all other cases, a ClassNotFoundException will be thrown. + */ + protected Class findClass(final String name) + throws ClassNotFoundException + { + Objects.requireNonNull(currentClassName); + Objects.requireNonNull(currentSuperClass); + + if (name.equals(currentClassName)) { + // Note: the following call will call back to this.findClass(name) to + // resolve the super types of the named class. + return super.findClass(name); + } + if (name.equals(currentSuperClass.getName())) { + return currentSuperClass; + } + if (currentInterfaces != null) { + for (Class c : currentInterfaces) { + if (name.equals(c.getName())) { + return c; + } + } + } + + throw new ClassNotFoundException(name); + } + } } diff --git a/test/hotspot/jtreg/runtime/cds/appcds/customLoader/ClassListFormatE.java b/test/hotspot/jtreg/runtime/cds/appcds/customLoader/ClassListFormatE.java index b5386c54afb8..2beb39d0b394 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/customLoader/ClassListFormatE.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/customLoader/ClassListFormatE.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2025, 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 @@ -49,14 +49,15 @@ public static void main(String[] args) throws Throwable { //---------------------------------------------------------------------- // TESTGROUP E: super class and interfaces //---------------------------------------------------------------------- - dumpShouldFail( + dumpShouldPass( "TESTCASE E1: missing interfaces: keyword", appJar, classlist( "Hello", "java/lang/Object id: 1", "CustomLoadee2 id: 1 super: 1 source: " + customJarPath ), - "Class CustomLoadee2 implements the interface CustomInterface2_ia, but no interface has been specified in the input line"); + "java.lang.NoClassDefFoundError: CustomInterface2_ia", + "Cannot find CustomLoadee2"); dumpShouldFail( "TESTCASE E2: missing one interface", @@ -67,7 +68,7 @@ appJar, classlist( "CustomInterface2_ib id: 3 super: 1 source: " + customJarPath, "CustomLoadee2 id: 4 super: 1 interfaces: 2 source: " + customJarPath ), - "The interface CustomInterface2_ib implemented by class CustomLoadee2 does not match any of the specified interface IDs"); + "The number of interfaces (1) specified in class list does not match the class file (2)"); dumpShouldFail( "TESTCASE E3: specifying an interface that's not implemented by the class", @@ -101,5 +102,15 @@ appJar, classlist( "CustomLoadee2 id: 5 super: 4 interfaces: 2 3 source: " + customJarPath ), "The specified super class CustomLoadee (id 4) does not match actual super class java.lang.Object"); + + dumpShouldPass( + "TESTCASE E6: JAR file doesn't exist", + appJar, classlist( + "Hello", + "java/lang/Object id: 1", + "NoSuchClass id: 2 super: 1 source: no_such_file.jar" + ), + "Cannot find NoSuchClass", + "java.io.IOException: No such file: no_such_file.jar"); } } From 6dc8ef197b31d3a7545bd527634e725bcbb4b506 Mon Sep 17 00:00:00 2001 From: SendaoYan Date: Fri, 5 Sep 2025 07:46:26 +0000 Subject: [PATCH 009/323] 8359207: Remove runtime/signal/TestSigusr2.java since it is always skipped Backport-of: 51877f568ba84a8ec7721656571c90c5eb952eb3 --- .../jtreg/runtime/signal/SigTestDriver.java | 10 ++---- .../jtreg/runtime/signal/TestSigusr2.java | 35 ------------------- 2 files changed, 2 insertions(+), 43 deletions(-) delete mode 100644 test/hotspot/jtreg/runtime/signal/TestSigusr2.java diff --git a/test/hotspot/jtreg/runtime/signal/SigTestDriver.java b/test/hotspot/jtreg/runtime/signal/SigTestDriver.java index f2b37af1c393..798543b41899 100644 --- a/test/hotspot/jtreg/runtime/signal/SigTestDriver.java +++ b/test/hotspot/jtreg/runtime/signal/SigTestDriver.java @@ -53,15 +53,9 @@ public static void main(String[] args) { switch (signame) { case "SIGWAITING": case "SIGKILL": - case "SIGSTOP": { - throw new SkippedException("signals SIGWAITING, SIGKILL and SIGSTOP can't be tested"); - } + case "SIGSTOP": case "SIGUSR2": { - if (Platform.isLinux()) { - throw new SkippedException("SIGUSR2 can't be tested on Linux"); - } else if (Platform.isOSX()) { - throw new SkippedException("SIGUSR2 can't be tested on OS X"); - } + throw new SkippedException("signals SIGWAITING, SIGKILL, SIGSTOP and SIGUSR2 can't be tested"); } } diff --git a/test/hotspot/jtreg/runtime/signal/TestSigusr2.java b/test/hotspot/jtreg/runtime/signal/TestSigusr2.java deleted file mode 100644 index fc5bff9d67d5..000000000000 --- a/test/hotspot/jtreg/runtime/signal/TestSigusr2.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2017, 2020, 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 - * @requires os.family != "windows" & os.family != "aix" - * - * @summary converted from VM testbase runtime/signal/sigusr201. - * VM testbase keywords: [signal, runtime, linux, macosx] - * - * @library /test/lib - * @run main/native SigTestDriver SIGUSR2 - */ - From 9d8df758c69e9d02ae1c1e3c25c67423db60e494 Mon Sep 17 00:00:00 2001 From: Rui Li Date: Fri, 5 Sep 2025 15:35:04 +0000 Subject: [PATCH 010/323] 8353013: java.net.URI.create(String) may have low performance to scan the host/domain name from URI string when the hostname starts with number Backport-of: 84458ec18ce33295636f7b26b8e3ff25ecb349f2 --- src/java.base/share/classes/java/net/URI.java | 15 ++++- test/jdk/java/net/URI/Test.java | 38 +++++++++++- .../net/URIAuthorityParsingBenchmark.java | 62 +++++++++++++++++++ 3 files changed, 112 insertions(+), 3 deletions(-) create mode 100644 test/micro/org/openjdk/bench/java/net/URIAuthorityParsingBenchmark.java diff --git a/src/java.base/share/classes/java/net/URI.java b/src/java.base/share/classes/java/net/URI.java index 2e01b0cf32b7..d3e762105f22 100644 --- a/src/java.base/share/classes/java/net/URI.java +++ b/src/java.base/share/classes/java/net/URI.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2025, 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 @@ -3426,6 +3426,19 @@ private int scanByte(int start, int n) int p = start; int q = scan(p, n, L_DIGIT, H_DIGIT); if (q <= p) return q; + + // Handle leading zeros + int i = p, j; + while ((j = scan(i, q, '0')) > i) i = j; + + // Calculate the number of significant digits (after leading zeros) + int significantDigitsNum = q - i; + + if (significantDigitsNum < 3) return q; // definitely < 255 + + // If more than 3 significant digits, it's definitely > 255 + if (significantDigitsNum > 3) return p; + if (Integer.parseInt(input, p, q, 10) > 255) return p; return q; } diff --git a/test/jdk/java/net/URI/Test.java b/test/jdk/java/net/URI/Test.java index 00d473f87bef..95dd49ea34fb 100644 --- a/test/jdk/java/net/URI/Test.java +++ b/test/jdk/java/net/URI/Test.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,7 +24,7 @@ /* @test * @summary Unit test for java.net.URI * @bug 4464135 4505046 4503239 4438319 4991359 4866303 7023363 7041800 - * 7171415 6339649 6933879 8037396 8272072 8051627 8297687 + * 7171415 6339649 6933879 8037396 8272072 8051627 8297687 8353013 * @author Mark Reinhold */ @@ -1620,6 +1620,7 @@ static void bugs() { b8051627(); b8272072(); b8297687(); + b8353013(); } private static void b8297687() { @@ -1786,6 +1787,39 @@ private static void b8272072() { } } + // 8353013 - Increase test coverage for cases where the authority component of a hierarchical + // URI has a host component that starts with a number. + private static void b8353013() { + testCreate("https://0.0.0.1").s("https").h("0.0.0.1").p("").z(); + testCreate("https://00.0.0.2").s("https").h("00.0.0.2").p("").z(); + testCreate("https://000.0.0.3").s("https").h("000.0.0.3").p("").z(); + testCreate("https://0000.0.0.4").s("https").h("0000.0.0.4").p("").z(); + + testCreate("https://00000.0.0.5").s("https").h("00000.0.0.5").p("").z(); + testCreate("https://00001.0.0.6").s("https").h("00001.0.0.6").p("").z(); + + testCreate("https://01.0.0.1").s("https").h("01.0.0.1").p("").z(); + + testCreate("https://111111.2.3.com").s("https").h("111111.2.3.com").p("").z(); + + testCreate("https://1.example.com").s("https").h("1.example.com").p("").z(); + testCreate("https://12.example.com").s("https").h("12.example.com").p("").z(); + testCreate("https://123.example.com").s("https").h("123.example.com").p("").z(); + testCreate("https://1234.example.com").s("https").h("1234.example.com").p("").z(); + testCreate("https://12345.example.com").s("https").h("12345.example.com").p("").z(); + + testCreate("https://98765432101.example.com").s("https").h("98765432101.example.com").p("").z(); + testCreate("https://98765432101.www.example.com/").s("https").h("98765432101.www.example.com").p("/").z(); + testCreate("https://98765432101.www.example.com").s("https").h("98765432101.www.example.com").p("").z(); + + testCreate("https://9223372036854775808.example.com").s("https").h("9223372036854775808.example.com").p("").z(); + testCreate("https://9223372036854775808.www.example.com").s("https").h("9223372036854775808.www.example.com").p("").z(); + testCreate("https://9223372036854775808.xyz.abc.com").s("https").h("9223372036854775808.xyz.abc.com").p("").z(); + testCreate("https://9223372036854775808.xyz.abc.pqr.com").s("https").h("9223372036854775808.xyz.abc.pqr.com").p("").z(); + + testCreate("https://256.example.com").s("https").h("256.example.com").p("").z(); + } + public static void main(String[] args) throws Exception { switch (args.length) { diff --git a/test/micro/org/openjdk/bench/java/net/URIAuthorityParsingBenchmark.java b/test/micro/org/openjdk/bench/java/net/URIAuthorityParsingBenchmark.java new file mode 100644 index 000000000000..8e75b9e35ac6 --- /dev/null +++ b/test/micro/org/openjdk/bench/java/net/URIAuthorityParsingBenchmark.java @@ -0,0 +1,62 @@ +/* + * Copyright Amazon.com Inc. 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 org.openjdk.bench.java.net; + +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Warmup; +import org.openjdk.jmh.infra.Blackhole; + +import java.net.URI; +import java.util.concurrent.TimeUnit; + +/** + * Tests Java.net.URI.create performance on various URI types. + */ +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@State(Scope.Benchmark) +@Warmup(iterations = 5, time = 1) +@Measurement(iterations = 5, time = 1) +@Fork(value = 3) +public class URIAuthorityParsingBenchmark { + + @Param({ + "https://98765432101.abc.xyz.com", + "https://ABCDEFGHIJK.abc.xyz.com" + }) + private String uri; + + @Benchmark + public void create(Blackhole blackhole) { + blackhole.consume(URI.create(uri)); + } + +} From de7da1dcb01a1524ba4dab94178699df5f073ad3 Mon Sep 17 00:00:00 2001 From: Suchismith Roy Date: Mon, 8 Sep 2025 08:42:41 +0000 Subject: [PATCH 011/323] 8216437: PPC64: Add intrinsic for GHASH algorithm Reviewed-by: mdoerr Backport-of: cdad6d788de4785c8dbf2710a86fdacb8d070565 --- src/hotspot/cpu/ppc/stubGenerator_ppc.cpp | 175 ++++++++++++++++++++++ src/hotspot/cpu/ppc/vm_version_ppc.cpp | 10 +- 2 files changed, 183 insertions(+), 2 deletions(-) diff --git a/src/hotspot/cpu/ppc/stubGenerator_ppc.cpp b/src/hotspot/cpu/ppc/stubGenerator_ppc.cpp index 62c4c0974867..58f984e74b8f 100644 --- a/src/hotspot/cpu/ppc/stubGenerator_ppc.cpp +++ b/src/hotspot/cpu/ppc/stubGenerator_ppc.cpp @@ -734,6 +734,177 @@ class StubGenerator: public StubCodeGenerator { return start; } + // Computes the Galois/Counter Mode (GCM) product and reduction. + // + // This function performs polynomial multiplication of the subkey H with + // the current GHASH state using vectorized polynomial multiplication (`vpmsumd`). + // The subkey H is divided into lower, middle, and higher halves. + // The multiplication results are reduced using `vConstC2` to stay within GF(2^128). + // The final computed value is stored back into `vState`. + static void computeGCMProduct(MacroAssembler* _masm, + VectorRegister vLowerH, VectorRegister vH, VectorRegister vHigherH, + VectorRegister vConstC2, VectorRegister vZero, VectorRegister vState, + VectorRegister vLowProduct, VectorRegister vMidProduct, VectorRegister vHighProduct, + VectorRegister vReducedLow, VectorRegister vTmp8, VectorRegister vTmp9, + VectorRegister vCombinedResult, VectorRegister vSwappedH) { + __ vxor(vH, vH, vState); + __ vpmsumd(vLowProduct, vLowerH, vH); // L : Lower Half of subkey H + __ vpmsumd(vMidProduct, vSwappedH, vH); // M : Combined halves of subkey H + __ vpmsumd(vHighProduct, vHigherH, vH); // H : Higher Half of subkey H + __ vpmsumd(vReducedLow, vLowProduct, vConstC2); // Reduction + __ vsldoi(vTmp8, vMidProduct, vZero, 8); // mL : Extract the lower 64 bits of M + __ vsldoi(vTmp9, vZero, vMidProduct, 8); // mH : Extract the higher 64 bits of M + __ vxor(vLowProduct, vLowProduct, vTmp8); // LL + mL : Partial result for lower half + __ vxor(vHighProduct, vHighProduct, vTmp9); // HH + mH : Partial result for upper half + __ vsldoi(vLowProduct, vLowProduct, vLowProduct, 8); // Swap + __ vxor(vLowProduct, vLowProduct, vReducedLow); + __ vsldoi(vCombinedResult, vLowProduct, vLowProduct, 8); // Swap + __ vpmsumd(vLowProduct, vLowProduct, vConstC2); // Reduction using constant + __ vxor(vCombinedResult, vCombinedResult, vHighProduct); // Combine reduced Low & High products + __ vxor(vState, vLowProduct, vCombinedResult); + } + + // Generate stub for ghash process blocks. + // + // Arguments for generated stub: + // state: R3_ARG1 (long[] state) + // subkeyH: R4_ARG2 (long[] subH) + // data: R5_ARG3 (byte[] data) + // blocks: R6_ARG4 (number of 16-byte blocks to process) + // + // The polynomials are processed in bit-reflected order for efficiency reasons. + // This optimization leverages the structure of the Galois field arithmetic + // to minimize the number of bit manipulations required during multiplication. + // For an explanation of how this works, refer : + // Vinodh Gopal, Erdinc Ozturk, Wajdi Feghali, Jim Guilford, Gil Wolrich, + // Martin Dixon. "Optimized Galois-Counter-Mode Implementation on Intel® + // Architecture Processor" + // http://web.archive.org/web/20130609111954/http://www.intel.com/content/dam/www/public/us/en/documents/white-papers/communications-ia-galois-counter-mode-paper.pdf + // + // + address generate_ghash_processBlocks() { + StubCodeMark mark(this, "StubRoutines", "ghash"); + address start = __ function_entry(); + + // Registers for parameters + Register state = R3_ARG1; // long[] state + Register subkeyH = R4_ARG2; // long[] subH + Register data = R5_ARG3; // byte[] data + Register blocks = R6_ARG4; + Register temp1 = R8; + // Vector Registers + VectorRegister vZero = VR0; + VectorRegister vH = VR1; + VectorRegister vLowerH = VR2; + VectorRegister vHigherH = VR3; + VectorRegister vLowProduct = VR4; + VectorRegister vMidProduct = VR5; + VectorRegister vHighProduct = VR6; + VectorRegister vReducedLow = VR7; + VectorRegister vTmp8 = VR8; + VectorRegister vTmp9 = VR9; + VectorRegister vTmp10 = VR10; + VectorRegister vSwappedH = VR11; + VectorRegister vTmp12 = VR12; + VectorRegister loadOrder = VR13; + VectorRegister vHigh = VR14; + VectorRegister vLow = VR15; + VectorRegister vState = VR16; + VectorRegister vPerm = VR17; + VectorRegister vCombinedResult = VR18; + VectorRegister vConstC2 = VR19; + + __ li(temp1, 0xc2); + __ sldi(temp1, temp1, 56); + __ vspltisb(vZero, 0); + __ mtvrd(vConstC2, temp1); + __ lxvd2x(vH->to_vsr(), subkeyH); + __ lxvd2x(vState->to_vsr(), state); + // Operations to obtain lower and higher bytes of subkey H. + __ vspltisb(vReducedLow, 1); + __ vspltisb(vTmp10, 7); + __ vsldoi(vTmp8, vZero, vReducedLow, 1); // 0x1 + __ vor(vTmp8, vConstC2, vTmp8); // 0xC2...1 + __ vsplt(vTmp9, 0, vH); // MSB of H + __ vsl(vH, vH, vReducedLow); // Carry = H<<7 + __ vsrab(vTmp9, vTmp9, vTmp10); + __ vand(vTmp9, vTmp9, vTmp8); // Carry + __ vxor(vTmp10, vH, vTmp9); + __ vsldoi(vConstC2, vZero, vConstC2, 8); + __ vsldoi(vSwappedH, vTmp10, vTmp10, 8); // swap Lower and Higher Halves of subkey H + __ vsldoi(vLowerH, vZero, vSwappedH, 8); // H.L + __ vsldoi(vHigherH, vSwappedH, vZero, 8); // H.H +#ifdef ASSERT + __ cmpwi(CCR0, blocks, 0); // Compare 'blocks' (R6_ARG4) with zero + __ asm_assert_ne("blocks should NOT be zero"); +#endif + __ clrldi(blocks, blocks, 32); + __ mtctr(blocks); + __ lvsl(loadOrder, temp1); +#ifdef VM_LITTLE_ENDIAN + __ vspltisb(vTmp12, 0xf); + __ vxor(loadOrder, loadOrder, vTmp12); +#define LE_swap_bytes(x) __ vec_perm(x, x, x, loadOrder) +#else +#define LE_swap_bytes(x) +#endif + + // This code performs Karatsuba multiplication in Galois fields to compute the GHASH operation. + // + // The Karatsuba method breaks the multiplication of two 128-bit numbers into smaller parts, + // performing three 128-bit multiplications and combining the results efficiently. + // + // (C1:C0) = A1*B1, (D1:D0) = A0*B0, (E1:E0) = (A0+A1)(B0+B1) + // (A1:A0)(B1:B0) = C1:(C0+C1+D1+E1):(D1+C0+D0+E0):D0 + // + // Inputs: + // - vH: The data vector (state), containing both B0 (lower half) and B1 (higher half). + // - vLowerH: Lower half of the subkey H (A0). + // - vHigherH: Higher half of the subkey H (A1). + // - vConstC2: Constant used for reduction (for final processing). + // + // References: + // Shay Gueron, Michael E. Kounavis. + // "Intel® Carry-Less Multiplication Instruction and its Usage for Computing the GCM Mode" + // https://web.archive.org/web/20110609115824/https://software.intel.com/file/24918 + // + Label L_aligned_loop, L_store, L_unaligned_loop, L_initialize_unaligned_loop; + __ andi(temp1, data, 15); + __ cmpwi(CCR0, temp1, 0); + __ bne(CCR0, L_initialize_unaligned_loop); + + __ bind(L_aligned_loop); + __ lvx(vH, temp1, data); + LE_swap_bytes(vH); + computeGCMProduct(_masm, vLowerH, vH, vHigherH, vConstC2, vZero, vState, + vLowProduct, vMidProduct, vHighProduct, vReducedLow, vTmp8, vTmp9, vCombinedResult, vSwappedH); + __ addi(data, data, 16); + __ bdnz(L_aligned_loop); + __ b(L_store); + + __ bind(L_initialize_unaligned_loop); + __ li(temp1, 0); + __ lvsl(vPerm, temp1, data); + __ lvx(vHigh, temp1, data); +#ifdef VM_LITTLE_ENDIAN + __ vspltisb(vTmp12, -1); + __ vxor(vPerm, vPerm, vTmp12); +#endif + __ bind(L_unaligned_loop); + __ addi(data, data, 16); + __ lvx(vLow, temp1, data); + __ vec_perm(vH, vHigh, vLow, vPerm); + computeGCMProduct(_masm, vLowerH, vH, vHigherH, vConstC2, vZero, vState, + vLowProduct, vMidProduct, vHighProduct, vReducedLow, vTmp8, vTmp9, vCombinedResult, vSwappedH); + __ vmr(vHigh, vLow); + __ bdnz(L_unaligned_loop); + + __ bind(L_store); + __ stxvd2x(vState->to_vsr(), state); + __ blr(); + + return start; + } // -XX:+OptimizeFill : convert fill/copy loops into intrinsic // // The code is implemented(ported from sparc) as we believe it benefits JVM98, however @@ -4851,6 +5022,10 @@ class StubGenerator: public StubCodeGenerator { StubRoutines::_data_cache_writeback_sync = generate_data_cache_writeback_sync(); } + if (UseGHASHIntrinsics) { + StubRoutines::_ghash_processBlocks = generate_ghash_processBlocks(); + } + if (UseAESIntrinsics) { StubRoutines::_aescrypt_encryptBlock = generate_aescrypt_encryptBlock(); StubRoutines::_aescrypt_decryptBlock = generate_aescrypt_decryptBlock(); diff --git a/src/hotspot/cpu/ppc/vm_version_ppc.cpp b/src/hotspot/cpu/ppc/vm_version_ppc.cpp index 5c066b76047f..e5037482c447 100644 --- a/src/hotspot/cpu/ppc/vm_version_ppc.cpp +++ b/src/hotspot/cpu/ppc/vm_version_ppc.cpp @@ -319,8 +319,14 @@ void VM_Version::initialize() { FLAG_SET_DEFAULT(UseAESCTRIntrinsics, false); } - if (UseGHASHIntrinsics) { - warning("GHASH intrinsics are not available on this CPU"); + if (VM_Version::has_vsx()) { + if (FLAG_IS_DEFAULT(UseGHASHIntrinsics)) { + UseGHASHIntrinsics = true; + } + } else if (UseGHASHIntrinsics) { + if (!FLAG_IS_DEFAULT(UseGHASHIntrinsics)) { + warning("GHASH intrinsics are not available on this CPU"); + } FLAG_SET_DEFAULT(UseGHASHIntrinsics, false); } From ea3adc59de39f5f25a4541613a89729800328b3a Mon Sep 17 00:00:00 2001 From: Severin Gehwolf Date: Mon, 8 Sep 2025 09:45:23 +0000 Subject: [PATCH 012/323] 8358764: (sc) SocketChannel.close when thread blocked in read causes connection to be reset (win) Reviewed-by: stuefe Backport-of: e5196fc24d2ec9e581af7803ac47036111fee029 --- .../share/classes/sun/nio/ch/Net.java | 13 ++ .../classes/sun/nio/ch/SocketChannelImpl.java | 42 ++-- src/java.base/unix/native/libnio/ch/Net.c | 5 + src/java.base/windows/native/libnio/ch/Net.c | 7 +- .../PeerReadsAfterAsyncClose.java | 195 ++++++++++++++++++ 5 files changed, 245 insertions(+), 17 deletions(-) create mode 100644 test/jdk/java/nio/channels/SocketChannel/PeerReadsAfterAsyncClose.java diff --git a/src/java.base/share/classes/sun/nio/ch/Net.java b/src/java.base/share/classes/sun/nio/ch/Net.java index d6f22bbcca7a..3bf8f38ae2a8 100644 --- a/src/java.base/share/classes/sun/nio/ch/Net.java +++ b/src/java.base/share/classes/sun/nio/ch/Net.java @@ -70,6 +70,9 @@ public String name() { // set to true if the fast tcp loopback should be enabled on Windows private static final boolean FAST_LOOPBACK; + // set to true if shut down before close should be enabled on Windows + private static final boolean SHUTDOWN_WRITE_BEFORE_CLOSE; + // -- Miscellaneous utilities -- private static final boolean IPV6_AVAILABLE; @@ -96,6 +99,13 @@ static boolean useExclusiveBind() { return EXCLUSIVE_BIND; } + /** + * Tells whether a TCP connection should be shutdown for writing before closing. + */ + static boolean shouldShutdownWriteBeforeClose() { + return SHUTDOWN_WRITE_BEFORE_CLOSE; + } + /** * Tells whether both IPV6_XXX and IP_XXX socket options should be set on * IPv6 sockets. On some kernels, both IPV6_XXX and IP_XXX socket options @@ -516,6 +526,8 @@ private static boolean isFastTcpLoopbackRequested() { */ private static native int isExclusiveBindAvailable(); + private static native boolean shouldShutdownWriteBeforeClose0(); + private static native boolean shouldSetBothIPv4AndIPv6Options0(); private static native boolean canIPv6SocketJoinIPv4Group0(); @@ -842,6 +854,7 @@ static native int blockOrUnblock6(boolean block, FileDescriptor fd, byte[] group IPV6_AVAILABLE = isIPv6Available0(); SO_REUSEPORT_AVAILABLE = isReusePortAvailable0(); + SHUTDOWN_WRITE_BEFORE_CLOSE = shouldShutdownWriteBeforeClose0(); } private static AssertionError shouldNotReachHere() { diff --git a/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java b/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java index 996d7e9b7b70..1b333d569486 100644 --- a/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java +++ b/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java @@ -769,7 +769,7 @@ public boolean isConnectionPending() { /** * Marks the beginning of a connect operation that might block. * @param blocking true if configured blocking - * @param isa the remote address + * @param sa the remote socket address * @throws ClosedChannelException if the channel is closed * @throws AlreadyConnectedException if already connected * @throws ConnectionPendingException is a connection is pending @@ -997,8 +997,8 @@ public boolean finishConnect() throws IOException { } /** - * Closes the socket if there are no I/O operations in progress and the - * channel is not registered with a Selector. + * Closes the socket if there are no I/O operations in progress (or no I/O + * operations tracked), and the channel is not registered with a Selector. */ private boolean tryClose() throws IOException { assert Thread.holdsLock(stateLock) && state == ST_CLOSING; @@ -1023,11 +1023,21 @@ private void tryFinishClose() { } /** - * Closes this channel when configured in blocking mode. + * Closes this channel when configured in blocking mode. If there are no I/O + * operations in progress (or tracked), then the channel's socket is closed. If + * there are I/O operations in progress then the behavior is platform specific. * - * If there is an I/O operation in progress then the socket is pre-closed - * and the I/O threads signalled, in which case the final close is deferred - * until all I/O operations complete. + * On Unix systems, the channel's socket is pre-closed. This unparks any virtual + * threads that are blocked in I/O operations on this channel. If there are + * platform threads blocked on the channel's socket then the socket is dup'ed + * and the platform threads signalled. The final close is deferred until all I/O + * operations complete. + * + * On Windows, the channel's socket is pre-closed. This unparks any virtual + * threads that are blocked in I/O operations on this channel. If there are no + * virtual threads blocked in I/O operations on this channel then the channel's + * socket is closed. If there are virtual threads in I/O then the final close is + * deferred until all I/O operations on virtual threads complete. * * Note that a channel configured blocking may be registered with a Selector * This arises when a key is canceled and the channel configured to blocking @@ -1039,17 +1049,17 @@ private void implCloseBlockingMode() throws IOException { boolean connected = (state == ST_CONNECTED); state = ST_CLOSING; - if (!tryClose()) { + if (connected && Net.shouldShutdownWriteBeforeClose()) { // shutdown output when linger interval not set to 0 - if (connected) { - try { - var SO_LINGER = StandardSocketOptions.SO_LINGER; - if ((int) Net.getSocketOption(fd, SO_LINGER) != 0) { - Net.shutdown(fd, Net.SHUT_WR); - } - } catch (IOException ignore) { } - } + try { + var SO_LINGER = StandardSocketOptions.SO_LINGER; + if ((int) Net.getSocketOption(fd, SO_LINGER) != 0) { + Net.shutdown(fd, Net.SHUT_WR); + } + } catch (IOException ignore) { } + } + if (!tryClose()) { long reader = readerThread; long writer = writerThread; if (NativeThread.isVirtualThread(reader) diff --git a/src/java.base/unix/native/libnio/ch/Net.c b/src/java.base/unix/native/libnio/ch/Net.c index 89c670014937..3c3f3fb6e5b1 100644 --- a/src/java.base/unix/native/libnio/ch/Net.c +++ b/src/java.base/unix/native/libnio/ch/Net.c @@ -200,6 +200,11 @@ Java_sun_nio_ch_Net_isExclusiveBindAvailable(JNIEnv *env, jclass clazz) { return -1; } +JNIEXPORT jboolean JNICALL +Java_sun_nio_ch_Net_shouldShutdownWriteBeforeClose0(JNIEnv *env, jclass clazz) { + return JNI_FALSE; +} + JNIEXPORT jboolean JNICALL Java_sun_nio_ch_Net_shouldSetBothIPv4AndIPv6Options0(JNIEnv* env, jclass cl) { diff --git a/src/java.base/windows/native/libnio/ch/Net.c b/src/java.base/windows/native/libnio/ch/Net.c index 3ccdbcc4752c..105cb9cf7439 100644 --- a/src/java.base/windows/native/libnio/ch/Net.c +++ b/src/java.base/windows/native/libnio/ch/Net.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2025, 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 @@ -117,6 +117,11 @@ Java_sun_nio_ch_Net_isExclusiveBindAvailable(JNIEnv *env, jclass clazz) { return 1; } +JNIEXPORT jboolean JNICALL +Java_sun_nio_ch_Net_shouldShutdownWriteBeforeClose0(JNIEnv *env, jclass clazz) { + return JNI_TRUE; +} + JNIEXPORT jboolean JNICALL Java_sun_nio_ch_Net_shouldSetBothIPv4AndIPv6Options0(JNIEnv* env, jclass cl) { diff --git a/test/jdk/java/nio/channels/SocketChannel/PeerReadsAfterAsyncClose.java b/test/jdk/java/nio/channels/SocketChannel/PeerReadsAfterAsyncClose.java new file mode 100644 index 000000000000..98b372a4b11a --- /dev/null +++ b/test/jdk/java/nio/channels/SocketChannel/PeerReadsAfterAsyncClose.java @@ -0,0 +1,195 @@ +/* + * Copyright (c) 2025, 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 8358764 + * @summary Test closing a socket while a thread is blocked in read. The connection + * should be closed gracefuly so that the peer reads EOF. + * @run junit PeerReadsAfterAsyncClose + */ + +import java.io.IOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.SocketException; +import java.nio.ByteBuffer; +import java.nio.channels.ClosedChannelException; +import java.nio.channels.SocketChannel; +import java.util.Arrays; +import java.util.Objects; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Stream; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import static org.junit.jupiter.api.Assertions.*; + +class PeerReadsAfterAsyncClose { + + static Stream factories() { + return Stream.of(Thread.ofPlatform().factory(), Thread.ofVirtual().factory()); + } + + /** + * Close SocketChannel while a thread is blocked reading from the channel's socket. + */ + @ParameterizedTest + @MethodSource("factories") + void testCloseDuringSocketChannelRead(ThreadFactory factory) throws Exception { + var loopback = InetAddress.getLoopbackAddress(); + try (var listener = new ServerSocket()) { + listener.bind(new InetSocketAddress(loopback, 0)); + + try (SocketChannel sc = SocketChannel.open(listener.getLocalSocketAddress()); + Socket peer = listener.accept()) { + + // start thread to read from channel + var cceThrown = new AtomicBoolean(); + Thread thread = factory.newThread(() -> { + try { + sc.read(ByteBuffer.allocate(1)); + fail(); + } catch (ClosedChannelException e) { + cceThrown.set(true); + } catch (Throwable e) { + e.printStackTrace(); + } + }); + thread.start(); + try { + // close SocketChannel when thread sampled in read() + onReach(thread, "sun.nio.ch.SocketChannelImpl.read", () -> { + try { + sc.close(); + } catch (IOException ignore) { } + }); + + // peer should read EOF + int n = peer.getInputStream().read(); + assertEquals(-1, n); + } finally { + thread.join(); + } + assertEquals(true, cceThrown.get(), "ClosedChannelException not thrown"); + } + } + } + + /** + * Close Socket while a thread is blocked reading from the socket. + */ + @ParameterizedTest + @MethodSource("factories") + void testCloseDuringSocketUntimedRead(ThreadFactory factory) throws Exception { + testCloseDuringSocketRead(factory, 0); + } + + /** + * Close Socket while a thread is blocked reading from the socket with a timeout. + */ + @ParameterizedTest + @MethodSource("factories") + void testCloseDuringSockeTimedRead(ThreadFactory factory) throws Exception { + testCloseDuringSocketRead(factory, 60_000); + } + + private void testCloseDuringSocketRead(ThreadFactory factory, int timeout) throws Exception { + var loopback = InetAddress.getLoopbackAddress(); + try (var listener = new ServerSocket()) { + listener.bind(new InetSocketAddress(loopback, 0)); + + try (Socket s = new Socket(loopback, listener.getLocalPort()); + Socket peer = listener.accept()) { + + // start thread to read from socket + var seThrown = new AtomicBoolean(); + Thread thread = factory.newThread(() -> { + try { + s.setSoTimeout(timeout); + s.getInputStream().read(); + fail(); + } catch (SocketException e) { + seThrown.set(true); + } catch (Throwable e) { + e.printStackTrace(); + } + }); + thread.start(); + try { + // close Socket when thread sampled in implRead + onReach(thread, "sun.nio.ch.NioSocketImpl.implRead", () -> { + try { + s.close(); + } catch (IOException ignore) { } + }); + + // peer should read EOF + int n = peer.getInputStream().read(); + assertEquals(-1, n); + } finally { + thread.join(); + } + assertEquals(true, seThrown.get(), "SocketException not thrown"); + } + } + } + + /** + * Runs the given action when the given target thread is sampled at the given + * location. The location takes the form "{@code c.m}" where + * {@code c} is the fully qualified class name and {@code m} is the method name. + */ + private void onReach(Thread target, String location, Runnable action) { + int index = location.lastIndexOf('.'); + String className = location.substring(0, index); + String methodName = location.substring(index + 1); + Thread.ofPlatform().daemon(true).start(() -> { + try { + boolean found = false; + while (!found) { + found = contains(target.getStackTrace(), className, methodName); + if (!found) { + Thread.sleep(20); + } + } + action.run(); + } catch (Exception e) { + e.printStackTrace(); + } + }); + } + + /** + * Returns true if the given stack trace contains an element for the given class + * and method name. + */ + private boolean contains(StackTraceElement[] stack, String className, String methodName) { + return Arrays.stream(stack) + .anyMatch(e -> className.equals(e.getClassName()) + && methodName.equals(e.getMethodName())); + } +} From b4256ec6c286e5b5d14010edcaf64246d977049e Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 8 Sep 2025 10:42:04 +0000 Subject: [PATCH 013/323] 8140527: JInternalFrame has incorrect title button width 8139392: JInternalFrame has incorrect padding Backport-of: acf591e856ce4b43303b1578bd64a8c9ab0063ea --- .../plaf/windows/WindowsIconFactory.java | 17 +-- .../WindowsInternalFrameTitlePane.java | 60 ++++++--- .../InternalFrameTitleButtonTest.java | 127 ++++++++++++++++++ 3 files changed, 171 insertions(+), 33 deletions(-) create mode 100644 test/jdk/javax/swing/JInternalFrame/InternalFrameTitleButtonTest.java diff --git a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java index 21bebdc51a9e..81bd54484ef7 100644 --- a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java +++ b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java @@ -28,7 +28,6 @@ import java.awt.BasicStroke; import java.awt.Color; import java.awt.Component; -import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; @@ -175,7 +174,7 @@ public static Icon createFrameResizeIcon() { @SuppressWarnings("serial") // Same-version serialization only private static class FrameButtonIcon implements Icon, Serializable { - private Part part; + private final Part part; private FrameButtonIcon(Part part) { this.part = part; @@ -286,18 +285,10 @@ public int getIconWidth() { int width; if (XPStyle.getXP() != null) { // Fix for XP bug where sometimes these sizes aren't updated properly - // Assume for now that height is correct and derive width using the - // ratio from the uxtheme part - width = UIManager.getInt("InternalFrame.titleButtonHeight") -2; - Dimension d = XPStyle.getPartSize(Part.WP_CLOSEBUTTON, State.NORMAL); - if (d != null && d.width != 0 && d.height != 0) { - width = (int) ((float) width * d.width / d.height); - } + // Assume for now that height is correct and derive width from height + width = UIManager.getInt("InternalFrame.titleButtonHeight") + 10; } else { - width = UIManager.getInt("InternalFrame.titleButtonWidth") -2; - } - if (XPStyle.getXP() != null) { - width -= 2; + width = UIManager.getInt("InternalFrame.titleButtonHeight") - 2; } return width; } diff --git a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsInternalFrameTitlePane.java b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsInternalFrameTitlePane.java index 83717d6bf937..cd0987a90799 100644 --- a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsInternalFrameTitlePane.java +++ b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsInternalFrameTitlePane.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2023, 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 @@ -25,20 +25,46 @@ package com.sun.java.swing.plaf.windows; -import sun.swing.SwingUtilities2; - -import javax.swing.*; -import javax.swing.border.*; -import javax.swing.UIManager; -import javax.swing.plaf.*; -import javax.swing.plaf.basic.BasicInternalFrameTitlePane; -import java.awt.*; -import java.awt.event.*; +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.GradientPaint; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Insets; +import java.awt.LayoutManager; +import java.awt.Paint; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyVetoException; -import static com.sun.java.swing.plaf.windows.TMSchema.*; +import javax.swing.BorderFactory; +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.JInternalFrame; +import javax.swing.JLabel; +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; +import javax.swing.JSeparator; +import javax.swing.LookAndFeel; +import javax.swing.UIDefaults; +import javax.swing.UIManager; +import javax.swing.border.Border; +import javax.swing.plaf.UIResource; +import javax.swing.plaf.basic.BasicInternalFrameTitlePane; + +import sun.swing.SwingUtilities2; + +import static com.sun.java.swing.plaf.windows.TMSchema.Part; +import static com.sun.java.swing.plaf.windows.TMSchema.Prop; +import static com.sun.java.swing.plaf.windows.TMSchema.State; import static com.sun.java.swing.plaf.windows.XPStyle.Skin; @SuppressWarnings("serial") // Superclass is not serializable across versions @@ -68,7 +94,6 @@ protected void installDefaults() { super.installDefaults(); titlePaneHeight = UIManager.getInt("InternalFrame.titlePaneHeight"); - buttonWidth = UIManager.getInt("InternalFrame.titleButtonWidth") - 4; buttonHeight = UIManager.getInt("InternalFrame.titleButtonHeight") - 4; Object obj = UIManager.get("InternalFrame.titleButtonToolTipsOn"); @@ -77,15 +102,10 @@ protected void installDefaults() { if (XPStyle.getXP() != null) { // Fix for XP bug where sometimes these sizes aren't updated properly - // Assume for now that height is correct and derive width using the - // ratio from the uxtheme part - buttonWidth = buttonHeight; - Dimension d = XPStyle.getPartSize(Part.WP_CLOSEBUTTON, State.NORMAL); - if (d != null && d.width != 0 && d.height != 0) { - buttonWidth = (int) ((float) buttonWidth * d.width / d.height); - } + // Assume for now that height is correct and derive width from height + buttonWidth = buttonHeight + 14; } else { - buttonWidth += 2; + buttonWidth = buttonHeight + 2; Color activeBorderColor = UIManager.getColor("InternalFrame.activeBorderColor"); setBorder(BorderFactory.createLineBorder(activeBorderColor, 1)); diff --git a/test/jdk/javax/swing/JInternalFrame/InternalFrameTitleButtonTest.java b/test/jdk/javax/swing/JInternalFrame/InternalFrameTitleButtonTest.java new file mode 100644 index 000000000000..55ea19de00fc --- /dev/null +++ b/test/jdk/javax/swing/JInternalFrame/InternalFrameTitleButtonTest.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2023, 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 8140527 + * @key headful + * @requires (os.family == "windows") + * @summary InternalFrame has incorrect title button width + * @run main InternalFrameTitleButtonTest + */ + +import java.awt.Component; +import java.awt.Robot; + +import javax.swing.Icon; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JDesktopPane; +import javax.swing.JFrame; +import javax.swing.JInternalFrame; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.plaf.basic.BasicInternalFrameUI; + +public class InternalFrameTitleButtonTest { + + private static JFrame frame; + private static JInternalFrame iframe; + + public static void main(String[] args) throws Exception { + String osName = System.getProperty("os.name"); + if (!osName.toLowerCase().contains("win")) { + System.out.println("The test is applicable only for Windows."); + return; + } + + UIManager.setLookAndFeel( + "com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel"); + try { + test(2); + } finally { + SwingUtilities.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + + UIManager.setLookAndFeel( + "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); + try { + test(14); + } finally { + SwingUtilities.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + + System.out.println("ok"); + } + + private static void test(final int widthAdd) throws Exception { + SwingUtilities.invokeAndWait(() -> { + frame = new JFrame(); + + JDesktopPane pane = new JDesktopPane(); + frame.setContentPane(pane); + frame.setSize(400, 400); + frame.setVisible(true); + + iframe = new JInternalFrame("Mail Reader", true, + true, true, true); + iframe.setSize(200, 200); + pane.add(iframe); + iframe.setVisible(true); + }); + + Robot robot = new Robot(); + robot.waitForIdle(); + robot.delay(1000); + + SwingUtilities.invokeAndWait(() -> { + JComponent title = ((BasicInternalFrameUI) iframe.getUI()).getNorthPane(); + for (int i = 0; i < title.getComponentCount(); i++) { + Component c = title.getComponent(i); + if (c instanceof JButton button + && !testButtonSize(button, widthAdd)) { + throw new RuntimeException("Wrong title icon size"); + } + } + }); + } + + private static boolean testButtonSize(final JButton button, + final int widthAdd) { + int height = UIManager.getInt("InternalFrame.titleButtonHeight") - 4; + Icon icon = button.getIcon(); + return height == button.getHeight() + && (height + widthAdd) == button.getWidth() + && height == icon.getIconHeight() + && (height + widthAdd) == icon.getIconWidth(); + } +} + From 37af4d04195962fd3fd29beabddae1d917b10ac9 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 8 Sep 2025 10:43:20 +0000 Subject: [PATCH 014/323] 8348402: PerfDataManager stalls shutdown for 1ms Reviewed-by: shade Backport-of: 305bbdae7fe40e33cf2baa100c134bd85ecaa553 --- src/hotspot/share/runtime/objectMonitor.cpp | 9 +++---- src/hotspot/share/runtime/objectMonitor.hpp | 28 +++++++++++++++++---- src/hotspot/share/runtime/perfData.cpp | 19 +++++++------- src/hotspot/share/runtime/perfData.hpp | 17 +++++++++++-- src/hotspot/share/runtime/synchronizer.cpp | 1 + 5 files changed, 52 insertions(+), 22 deletions(-) diff --git a/src/hotspot/share/runtime/objectMonitor.cpp b/src/hotspot/share/runtime/objectMonitor.cpp index 45cc67c43a88..31b466d0ace3 100644 --- a/src/hotspot/share/runtime/objectMonitor.cpp +++ b/src/hotspot/share/runtime/objectMonitor.cpp @@ -53,6 +53,7 @@ #include "runtime/sharedRuntime.hpp" #include "services/threadService.hpp" #include "utilities/dtrace.hpp" +#include "utilities/globalCounter.inline.hpp" #include "utilities/macros.hpp" #include "utilities/preserveException.hpp" #if INCLUDE_JFR @@ -828,9 +829,9 @@ void ObjectMonitor::EnterI(JavaThread* current) { // That is by design - we trade "lossy" counters which are exposed to // races during updates for a lower probe effect. - // This PerfData object can be used in parallel with a safepoint. - // See the work around in PerfDataManager::destroy(). - OM_PERFDATA_OP(FutileWakeups, inc()); + // We are in safepoint safe state, so shutdown can remove the counter + // under our feet. Make sure we make this access safely. + OM_PERFDATA_SAFE_OP(FutileWakeups, inc()); ++nWakeups; // Assuming this is not a spurious wakeup we'll normally find _succ == current. @@ -971,8 +972,6 @@ void ObjectMonitor::ReenterI(JavaThread* current, ObjectWaiter* currentNode) { // *must* retry _owner before parking. OrderAccess::fence(); - // This PerfData object can be used in parallel with a safepoint. - // See the work around in PerfDataManager::destroy(). OM_PERFDATA_OP(FutileWakeups, inc()); } diff --git a/src/hotspot/share/runtime/objectMonitor.hpp b/src/hotspot/share/runtime/objectMonitor.hpp index 98ba8ac776bf..c08782f53c25 100644 --- a/src/hotspot/share/runtime/objectMonitor.hpp +++ b/src/hotspot/share/runtime/objectMonitor.hpp @@ -197,13 +197,31 @@ class ObjectMonitor : public CHeapObj { // Only perform a PerfData operation if the PerfData object has been // allocated and if the PerfDataManager has not freed the PerfData - // objects which can happen at normal VM shutdown. - // + // objects which can happen at normal VM shutdown. This operation is + // only safe when thread is not in safepoint-safe code, i.e. PerfDataManager + // could not reach the safepoint and free the counter while we are using it. + // If this is not guaranteed, use OM_PERFDATA_SAFE_OP instead. #define OM_PERFDATA_OP(f, op_str) \ do { \ - if (ObjectMonitor::_sync_ ## f != nullptr && \ - PerfDataManager::has_PerfData()) { \ - ObjectMonitor::_sync_ ## f->op_str; \ + if (ObjectMonitor::_sync_ ## f != nullptr) { \ + if (PerfDataManager::has_PerfData()) { \ + ObjectMonitor::_sync_ ## f->op_str; \ + } \ + } \ + } while (0) + + // Only perform a PerfData operation if the PerfData object has been + // allocated and if the PerfDataManager has not freed the PerfData + // objects which can happen at normal VM shutdown. Additionally, we + // enter the critical section to resolve the race against PerfDataManager + // entering the safepoint and deleting the counter during shutdown. + #define OM_PERFDATA_SAFE_OP(f, op_str) \ + do { \ + if (ObjectMonitor::_sync_ ## f != nullptr) { \ + GlobalCounter::CriticalSection cs(Thread::current()); \ + if (PerfDataManager::has_PerfData()) { \ + ObjectMonitor::_sync_ ## f->op_str; \ + } \ } \ } while (0) diff --git a/src/hotspot/share/runtime/perfData.cpp b/src/hotspot/share/runtime/perfData.cpp index f748826a6220..6d00e348297f 100644 --- a/src/hotspot/share/runtime/perfData.cpp +++ b/src/hotspot/share/runtime/perfData.cpp @@ -35,6 +35,7 @@ #include "runtime/os.hpp" #include "runtime/perfData.inline.hpp" #include "utilities/exceptions.hpp" +#include "utilities/globalCounter.inline.hpp" #include "utilities/globalDefinitions.hpp" PerfDataList* PerfDataManager::_all = nullptr; @@ -251,15 +252,13 @@ void PerfDataManager::destroy() { // destroy already called, or initialization never happened return; - // Clear the flag before we free the PerfData counters. Thus begins - // the race between this thread and another thread that has just - // queried PerfDataManager::has_PerfData() and gotten back 'true'. - // The hope is that the other thread will finish its PerfData - // manipulation before we free the memory. The two alternatives are - // 1) leak the PerfData memory or 2) do some form of synchronized - // access or check before every PerfData operation. - _has_PerfData = false; - os::naked_short_sleep(1); // 1ms sleep to let other thread(s) run + // About to delete the counters than might still be accessed by other threads. + // The shutdown is performed in two stages: a) clear the flag to notify future + // counter users that we are at shutdown; b) sync up with current users, waiting + // for them to finish with counters. + // + Atomic::store(&_has_PerfData, false); + GlobalCounter::write_synchronize(); log_debug(perf, datacreation)("Total = %d, Sampled = %d, Constants = %d", _all->length(), _sampled == nullptr ? 0 : _sampled->length(), @@ -286,7 +285,7 @@ void PerfDataManager::add_item(PerfData* p, bool sampled) { // Default sizes determined using -Xlog:perf+datacreation=debug if (_all == nullptr) { _all = new PerfDataList(191); - _has_PerfData = true; + Atomic::release_store(&_has_PerfData, true); } assert(!_all->contains(p->name()), "duplicate name added"); diff --git a/src/hotspot/share/runtime/perfData.hpp b/src/hotspot/share/runtime/perfData.hpp index d4ac8a735ec4..462e02361f80 100644 --- a/src/hotspot/share/runtime/perfData.hpp +++ b/src/hotspot/share/runtime/perfData.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2025, 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,6 +26,7 @@ #define SHARE_RUNTIME_PERFDATA_HPP #include "memory/allocation.hpp" +#include "runtime/atomic.hpp" #include "runtime/perfDataTypes.hpp" #include "runtime/perfMemory.hpp" #include "runtime/timer.hpp" @@ -241,6 +242,18 @@ enum CounterNS { * UsePerfData, a product flag set to true by default. This flag may * be removed from the product in the future. * + * There are possible shutdown races between counter uses and counter + * destruction code. Normal shutdown happens with taking VM_Exit safepoint + * operation, so in the vast majority of uses this is not an issue. On the + * paths where a concurrent access can still happen when VM is at safepoint, + * use the following pattern to coordinate with shutdown: + * + * { + * GlobalCounter::CriticalSection cs(Thread::current()); + * if (PerfDataManager::has_PerfData()) { + * + * } + * } */ class PerfData : public CHeapObj { @@ -785,7 +798,7 @@ class PerfDataManager : AllStatic { } static void destroy(); - static bool has_PerfData() { return _has_PerfData; } + static bool has_PerfData() { return Atomic::load_acquire(&_has_PerfData); } }; // Useful macros to create the performance counters diff --git a/src/hotspot/share/runtime/synchronizer.cpp b/src/hotspot/share/runtime/synchronizer.cpp index cc73082ed3c1..3cd3c56bcec6 100644 --- a/src/hotspot/share/runtime/synchronizer.cpp +++ b/src/hotspot/share/runtime/synchronizer.cpp @@ -60,6 +60,7 @@ #include "utilities/align.hpp" #include "utilities/dtrace.hpp" #include "utilities/events.hpp" +#include "utilities/globalCounter.inline.hpp" #include "utilities/linkedlist.hpp" #include "utilities/preserveException.hpp" From 2abf9a7d1563fcb785d28d70154c9e85f0efff8f Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 8 Sep 2025 10:44:38 +0000 Subject: [PATCH 015/323] 8355773: Some nsk/jdi tests can fetch ThreadReference from static field in the debuggee Backport-of: 50145bb74ad87f5b3f80ed910f6ebb95e406b802 --- .../addCountFilter/addcountfilter001.java | 2 +- .../jdi/EventRequest/disable/disable001.java | 2 +- .../jdi/EventRequest/disable/disable002.java | 3 +-- .../jdi/EventRequest/enable/enable001.java | 2 +- .../jdi/EventRequest/enable/enable002.java | 2 +- .../getProperty/getproperty001.java | 2 +- .../EventRequest/isEnabled/isenabled001.java | 2 +- .../putProperty/putproperty001.java | 2 +- .../setEnabled/setenabled001.java | 2 +- .../setEnabled/setenabled002.java | 2 +- .../setSuspendPolicy/setsuspendpolicy001.java | 2 +- .../suspendPolicy/suspendpolicy001.java | 2 +- .../createStepRequest/crstepreq002.java | 2 +- .../createStepRequest/crstepreq003.java | 6 ++--- .../createStepRequest/crstepreq003a.java | 12 ++++++--- .../createStepRequest/crstepreq004.java | 8 +++--- .../createStepRequest/crstepreq004a.java | 9 ++++--- .../addClassFilter_rt/filter_rt002.java | 2 +- .../addClassFilter_s/filter_s002.java | 2 +- .../nsk/jdi/StepRequest/depth/depth001.java | 2 +- .../nsk/jdi/StepRequest/depth/depth002.java | 2 +- .../nsk/jdi/StepRequest/depth/depth003.java | 2 +- .../nsk/jdi/StepRequest/size/size001.java | 2 +- .../nsk/jdi/StepRequest/size/size002.java | 2 +- .../nsk/jdi/StepRequest/thread/thread001.java | 2 +- .../popFrames/popframes001.java | 4 +-- .../popFrames/popframes002.java | 4 +-- .../popFrames/popframes003.java | 4 +-- .../popFrames/popframes004.java | 2 +- .../popFrames/popframes005.java | 2 +- .../vmTestbase/nsk/share/jdi/Debugee.java | 27 +++++++++++++++++++ 31 files changed, 77 insertions(+), 44 deletions(-) diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/addCountFilter/addcountfilter001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/addCountFilter/addcountfilter001.java index 404947071ce2..4ff1efa3d9c6 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/addCountFilter/addcountfilter001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/addCountFilter/addcountfilter001.java @@ -297,7 +297,7 @@ private void testRun() switch (i) { case 0: - thread1 = debuggee.threadByNameOrThrow(threadName1); + thread1 = debuggee.threadByFieldNameOrThrow(debuggeeClass, threadName1); log2("......setting up StepRequest"); eventRequest1 = eventRManager.createStepRequest diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/disable/disable001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/disable/disable001.java index d17d5aaba2e8..a82ea5a13730 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/disable/disable001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/disable/disable001.java @@ -337,7 +337,7 @@ private void testRun() switch (i) { case 0: - thread1 = debuggee.threadByNameOrThrow(threadName1); + thread1 = debuggee.threadByFieldNameOrThrow(debuggeeClass, threadName1); log2("......setting up StepRequest"); eventRequest1 = eventRManager.createStepRequest diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/disable/disable002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/disable/disable002.java index ac62694e13f1..3ddf7bbc6850 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/disable/disable002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/disable/disable002.java @@ -289,8 +289,7 @@ private void testRun() switch (i) { case 0: - thread1 = debuggee.threadByNameOrThrow(threadName1); - + thread1 = debuggee.threadByFieldNameOrThrow(debuggeeClass, threadName1); log2("......setting up StepRequest"); eventRequest1 = eventRManager.createStepRequest (thread1, StepRequest.STEP_MIN, StepRequest.STEP_INTO); diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/enable/enable001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/enable/enable001.java index 589e15cd3052..6890eca81992 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/enable/enable001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/enable/enable001.java @@ -289,7 +289,7 @@ private void testRun() switch (i) { case 0: - thread1 = debuggee.threadByNameOrThrow(threadName1); + thread1 = debuggee.threadByFieldNameOrThrow(debuggeeClass, threadName1); log2("......setting up StepRequest"); eventRequest1 = eventRManager.createStepRequest diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/enable/enable002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/enable/enable002.java index fbab0d27c62a..f05135176799 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/enable/enable002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/enable/enable002.java @@ -291,7 +291,7 @@ private void testRun() switch (i) { case 0: - thread1 = debuggee.threadByNameOrThrow(threadName1); + thread1 = debuggee.threadByFieldNameOrThrow(debuggeeClass, threadName1); log2("......setting up StepRequest"); eventRequest1 = eventRManager.createStepRequest diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/getProperty/getproperty001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/getProperty/getproperty001.java index 291b33fea10a..57f38744a66a 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/getProperty/getproperty001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/getProperty/getproperty001.java @@ -295,7 +295,7 @@ private void testRun() switch (i) { case 0: - thread1 = debuggee.threadByNameOrThrow(threadName1); + thread1 = debuggee.threadByFieldNameOrThrow(debuggeeClass, threadName1); log2("......setting up StepRequest"); eventRequest1 = eventRManager.createStepRequest diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/isEnabled/isenabled001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/isEnabled/isenabled001.java index a634df78b3b7..ab1e8c2b0561 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/isEnabled/isenabled001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/isEnabled/isenabled001.java @@ -290,7 +290,7 @@ private void testRun() switch (i) { case 0: - thread1 = debuggee.threadByNameOrThrow(threadName1); + thread1 = debuggee.threadByFieldNameOrThrow(debuggeeClass, threadName1); log2("......setting up StepRequest"); eventRequest1 = eventRManager.createStepRequest diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/putProperty/putproperty001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/putProperty/putproperty001.java index 93d4fdae605b..4bed425b3c87 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/putProperty/putproperty001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/putProperty/putproperty001.java @@ -295,7 +295,7 @@ private void testRun() switch (i) { case 0: - thread1 = debuggee.threadByNameOrThrow(threadName1); + thread1 = debuggee.threadByFieldNameOrThrow(debuggeeClass, threadName1); log2("......setting up StepRequest"); eventRequest1 = eventRManager.createStepRequest diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/setEnabled/setenabled001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/setEnabled/setenabled001.java index 91002312cd8f..cf7abdf919b8 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/setEnabled/setenabled001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/setEnabled/setenabled001.java @@ -288,7 +288,7 @@ private void testRun() switch (i) { case 0: - thread1 = debuggee.threadByNameOrThrow(threadName1); + thread1 = debuggee.threadByFieldNameOrThrow(debuggeeClass, threadName1); log2("......setting up StepRequest"); eventRequest1 = eventRManager.createStepRequest diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/setEnabled/setenabled002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/setEnabled/setenabled002.java index 5c9ef8ac9b95..c58d1770e3cc 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/setEnabled/setenabled002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/setEnabled/setenabled002.java @@ -292,7 +292,7 @@ private void testRun() switch (i) { case 0: - thread1 = debuggee.threadByNameOrThrow(threadName1); + thread1 = debuggee.threadByFieldNameOrThrow(debuggeeClass, threadName1); log2("......setting up StepRequest"); eventRequest1 = eventRManager.createStepRequest diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/setSuspendPolicy/setsuspendpolicy001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/setSuspendPolicy/setsuspendpolicy001.java index f58aced259ba..91914d1e103a 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/setSuspendPolicy/setsuspendpolicy001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/setSuspendPolicy/setsuspendpolicy001.java @@ -297,7 +297,7 @@ private void testRun() switch (i) { case 0: - thread1 = debuggee.threadByNameOrThrow(threadName1); + thread1 = debuggee.threadByFieldNameOrThrow(debuggeeClass, threadName1); log2("......setting up StepRequest"); eventRequest1 = eventRManager.createStepRequest diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/suspendPolicy/suspendpolicy001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/suspendPolicy/suspendpolicy001.java index 88cb33232d24..8102bf6b0e25 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/suspendPolicy/suspendpolicy001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequest/suspendPolicy/suspendpolicy001.java @@ -293,7 +293,7 @@ private void testRun() switch (i) { case 0: - thread1 = debuggee.threadByNameOrThrow(threadName1); + thread1 = debuggee.threadByFieldNameOrThrow(debuggeeClass, threadName1); log2("......setting up StepRequest"); eventRequest1 = eventRManager.createStepRequest diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequestManager/createStepRequest/crstepreq002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequestManager/createStepRequest/crstepreq002.java index 55a72a6951a9..8e0a8b049661 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequestManager/createStepRequest/crstepreq002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequestManager/createStepRequest/crstepreq002.java @@ -281,7 +281,7 @@ private void testRun() //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ variable part - thread = debuggee.threadByNameOrThrow(threadName); + thread = debuggee.threadByFieldNameOrThrow(debuggeeClass, threadName); if (StepRequest.STEP_MIN > StepRequest.STEP_LINE) { maxSize = StepRequest.STEP_MIN; diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequestManager/createStepRequest/crstepreq003.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequestManager/createStepRequest/crstepreq003.java index 7ad725d5ab4e..88a55273451f 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequestManager/createStepRequest/crstepreq003.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequestManager/createStepRequest/crstepreq003.java @@ -74,8 +74,8 @@ public static void main (String argv[]) { //------------------------------------------------------ test specific fields - static final int lineForBreakInThread = 137; - static final int[] checkedLines = { 138, 138, 178 }; + static final int lineForBreakInThread = 141; + static final int[] checkedLines = { 142, 142, 182 }; //------------------------------------------------------ mutable common methods @@ -252,7 +252,7 @@ private void setAndCheckStepEvent ( BreakpointRequest bpRequest, exitCode = FAILED; } - ThreadReference thread = debuggee.threadByNameOrThrow(threadName); + ThreadReference thread = debuggee.threadByFieldNameOrThrow(debuggeeClass, threadName); StepRequest stepRequest = setStepRequest( thread, StepRequest.STEP_LINE, stepDepth, diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequestManager/createStepRequest/crstepreq003a.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequestManager/createStepRequest/crstepreq003a.java index 460dc8e92f1e..d1a5362251c8 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequestManager/createStepRequest/crstepreq003a.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequestManager/createStepRequest/crstepreq003a.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2025, 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,10 @@ public class crstepreq003a { static Object waitnotifyObj = new Object(); + static Thread thread0; + static Thread thread1; + static Thread thread2; + //------------------------------------------------------ mutable common method public static void main (String argv[]) { @@ -72,21 +76,21 @@ public static void main (String argv[]) { //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ test case section case 0: - Thread thread0 = JDIThreadFactory.newThread(new Thread0crstepreq003a("thread0")); + thread0 = JDIThreadFactory.newThread(new Thread0crstepreq003a("thread0")); threadStart(thread0); threadJoin (thread0, "0"); break; case 1: - Thread thread1 = JDIThreadFactory.newThread(new Thread0crstepreq003a("thread1")); + thread1 = JDIThreadFactory.newThread(new Thread0crstepreq003a("thread1")); threadStart(thread1); threadJoin (thread1, "1"); break; case 2: - Thread thread2 = JDIThreadFactory.newThread(new Thread0crstepreq003a("thread2")); + thread2 = JDIThreadFactory.newThread(new Thread0crstepreq003a("thread2")); threadStart(thread2); threadJoin (thread2, "2"); diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequestManager/createStepRequest/crstepreq004.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequestManager/createStepRequest/crstepreq004.java index d8e36c6e47dc..7b05f4ddc786 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequestManager/createStepRequest/crstepreq004.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequestManager/createStepRequest/crstepreq004.java @@ -74,9 +74,9 @@ public static void main (String argv[]) { //------------------------------------------------------ test specific fields - static final int lineForBreakInThread = 146; - static final int[] checkedLines = { 160, 160, 193 }; - static final int[] checkedLinesAlt = { 161, 161, 193 }; + static final int lineForBreakInThread = 149; + static final int[] checkedLines = { 163, 163, 196 }; + static final int[] checkedLinesAlt = { 164, 164, 196 }; //------------------------------------------------------ mutable common methods @@ -247,7 +247,7 @@ private void setAndCheckStepEvent ( BreakpointRequest bpRequest, exitCode = FAILED; } - ThreadReference thread = debuggee.threadByNameOrThrow(threadName); + ThreadReference thread = debuggee.threadByFieldNameOrThrow(debuggeeClass, threadName); StepRequest stepRequest = setStepRequest( thread, StepRequest.STEP_LINE, stepDepth, diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequestManager/createStepRequest/crstepreq004a.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequestManager/createStepRequest/crstepreq004a.java index 881d211aa0e9..d6e28602ed74 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequestManager/createStepRequest/crstepreq004a.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/EventRequestManager/createStepRequest/crstepreq004a.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2025, 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 @@ -58,6 +58,9 @@ public class crstepreq004a { private static volatile boolean isFirstThreadReady = false; private static volatile boolean isSecondThreadReady = false; + static Thread thread1; + static Thread thread2; + //------------------------------------------------------ mutable common method public static void main (String argv[]) { @@ -95,8 +98,8 @@ public static void main (String argv[]) { private static void runTestCase(int testCaseId) { isFirstThreadReady = false; isSecondThreadReady = false; - Thread thread1 = JDIThreadFactory.newThread(new Thread1crstepreq004a("thread1")); - Thread thread2 = JDIThreadFactory.newThread(new Thread2crstepreq004a("thread2")); + thread1 = JDIThreadFactory.newThread(new Thread1crstepreq004a("thread1")); + thread2 = JDIThreadFactory.newThread(new Thread2crstepreq004a("thread2")); synchronized (lockObj) { thread1.start(); while (!isFirstThreadReady) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/addClassFilter_rt/filter_rt002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/addClassFilter_rt/filter_rt002.java index 80af7131dd73..253754c6215e 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/addClassFilter_rt/filter_rt002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/addClassFilter_rt/filter_rt002.java @@ -296,7 +296,7 @@ private void testRun() testClassReference = (ReferenceType) vm.classesByName(testedClassName).get(0); - thread1 = debuggee.threadByNameOrThrow(threadName1); + thread1 = debuggee.threadByFieldNameOrThrow(debuggeeClass, threadName1); eventRequest1 = setting21StepRequest(thread1, testClassReference, EventRequest.SUSPEND_NONE, property1); diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/addClassFilter_s/filter_s002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/addClassFilter_s/filter_s002.java index 2d4c12c906ab..8053b2bf283d 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/addClassFilter_s/filter_s002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/addClassFilter_s/filter_s002.java @@ -288,7 +288,7 @@ private void testRun() switch (i) { case 0: - ThreadReference thread1 = debuggee.threadByNameOrThrow("thread1"); + ThreadReference thread1 = debuggee.threadByFieldNameOrThrow(debuggeeClass, "thread1"); eventRequest1 = setting23StepRequest(thread1, testedClassName1, EventRequest.SUSPEND_NONE, property1); diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/depth/depth001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/depth/depth001.java index 249b6ee05fe9..53f041810578 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/depth/depth001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/depth/depth001.java @@ -287,7 +287,7 @@ private void testRun() switch (i) { case 0: - thread1 = debuggee.threadByNameOrThrow(threadName1); + thread1 = debuggee.threadByFieldNameOrThrow(debuggeeClass, threadName1); log2("......setting up StepRequest with depth StepRequest.STEP_INTO"); eventRequest1 = setting24StepRequest(thread1, StepRequest.STEP_LINE, diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/depth/depth002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/depth/depth002.java index a3de24fb3d76..47b8c223e826 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/depth/depth002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/depth/depth002.java @@ -287,7 +287,7 @@ private void testRun() switch (i) { case 0: - thread1 = debuggee.threadByNameOrThrow(threadName1); + thread1 = debuggee.threadByFieldNameOrThrow(debuggeeClass, threadName1); log2("......setting up StepRequest with depth StepRequest.STEP_OVER"); eventRequest1 = setting24StepRequest(thread1, StepRequest.STEP_LINE, diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/depth/depth003.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/depth/depth003.java index b7281d524fb4..7b8c3d5e41cc 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/depth/depth003.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/depth/depth003.java @@ -287,7 +287,7 @@ private void testRun() switch (i) { case 0: - thread1 = debuggee.threadByNameOrThrow(threadName1); + thread1 = debuggee.threadByFieldNameOrThrow(debuggeeClass, threadName1); log2("......setting up StepRequest with depth StepRequest.STEP_OUT"); eventRequest1 = setting24StepRequest(thread1, StepRequest.STEP_LINE, diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/size/size001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/size/size001.java index 6959aa2fed4e..d9a7962ca86c 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/size/size001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/size/size001.java @@ -287,7 +287,7 @@ private void testRun() switch (i) { case 0: - thread1 = debuggee.threadByNameOrThrow(threadName1); + thread1 = debuggee.threadByFieldNameOrThrow(debuggeeClass, threadName1); log2("......setting up StepRequest with size StepRequest.STEP_MIN"); eventRequest1 = setting24StepRequest(thread1, StepRequest.STEP_MIN, diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/size/size002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/size/size002.java index e25c3d9abd4d..ae52a6019b83 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/size/size002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/size/size002.java @@ -287,7 +287,7 @@ private void testRun() switch (i) { case 0: - thread1 = debuggee.threadByNameOrThrow(threadName1); + thread1 = debuggee.threadByFieldNameOrThrow(debuggeeClass, threadName1); log2("......setting up StepRequest with size StepRequest.STEP_LINE"); eventRequest1 = setting24StepRequest(thread1, StepRequest.STEP_LINE, diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/thread/thread001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/thread/thread001.java index d0207238eb88..ae07e163b45d 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/thread/thread001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/StepRequest/thread/thread001.java @@ -289,7 +289,7 @@ private void testRun() switch (i) { case 0: - thread1 = debuggee.threadByNameOrThrow(threadName1); + thread1 = debuggee.threadByFieldNameOrThrow(debuggeeClass, threadName1); log2("......setting up StepRequest with size StepRequest.STEP_MIN"); eventRequest1 = setting24StepRequest(thread1, StepRequest.STEP_MIN, diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes001.java index 51f51da29efb..be6b58981494 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes001.java @@ -311,7 +311,7 @@ private void testRun() } String thread2Name = "thread2"; - ThreadReference thread2Ref = debuggee.threadByNameOrThrow(thread2Name); + ThreadReference thread2Ref = debuggee.threadByFieldNameOrThrow(debuggeeClass, thread2Name); String poppedMethod = "poppedMethod"; @@ -320,7 +320,7 @@ private void testRun() log2("......setting breakpoint in poppedMethod"); try { - breakpointRequest = settingBreakpoint(debuggee.threadByNameOrThrow(thread2Name), + breakpointRequest = settingBreakpoint(thread2Ref, debuggeeClass, poppedMethod, breakpointLine, "one"); } catch ( Exception e ) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes002.java index 4f75c90b312f..dea8f8d77c96 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes002.java @@ -278,10 +278,10 @@ private void testRun() breakpointForCommunication(); String thread2Name = "thread2"; - ThreadReference thread2Ref = debuggee.threadByNameOrThrow(thread2Name); + ThreadReference thread2Ref = debuggee.threadByFieldNameOrThrow(debuggeeClass, thread2Name); String thread3Name = "thread3"; - ThreadReference thread3Ref = debuggee.threadByNameOrThrow(thread3Name); + ThreadReference thread3Ref = debuggee.threadByFieldNameOrThrow(debuggeeClass, thread3Name); String poppedMethod = "poppedMethod"; String breakpointLine = "breakpointLine"; diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes003.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes003.java index f4a7fb4e3805..32f2804e48e4 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes003.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes003.java @@ -292,10 +292,10 @@ private void testRun() String thread2Name = "thread2"; - ThreadReference thread2Ref = debuggee.threadByNameOrThrow(thread2Name); + ThreadReference thread2Ref = debuggee.threadByFieldNameOrThrow(debuggeeClass, thread2Name); String thread3Name = "thread3"; - ThreadReference thread3Ref = debuggee.threadByNameOrThrow(thread3Name); + ThreadReference thread3Ref = debuggee.threadByFieldNameOrThrow(debuggeeClass, thread3Name); String poppedMethod = "poppedMethod"; String breakpointLine = "breakpointLine"; diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes004.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes004.java index 7ca95a46c651..bb0f17079ecc 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes004.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes004.java @@ -276,7 +276,7 @@ private void testRun() breakpointForCommunication(); String thread2Name = "thread2"; - ThreadReference thread2Ref = debuggee.threadByNameOrThrow(thread2Name); + ThreadReference thread2Ref = debuggee.threadByFieldNameOrThrow(debuggeeClass, thread2Name); StackFrame stackFrame = null; int var; diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes005.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes005.java index 7d221fb4db0f..45e0fcc53a8b 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes005.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes005.java @@ -280,7 +280,7 @@ private void testRun() breakpointForCommunication(); String thread2Name = "thread2"; - ThreadReference thread2Ref = debuggee.threadByNameOrThrow(thread2Name); + ThreadReference thread2Ref = debuggee.threadByFieldNameOrThrow(debuggeeClass, thread2Name); StackFrame stackFrame0 = null; StackFrame stackFrame1 = null; diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Debugee.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Debugee.java index 74541fb78e87..78d650d33997 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Debugee.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Debugee.java @@ -264,6 +264,33 @@ public ThreadReference threadByNameOrThrow(String name) throws JDITestRuntimeExc throw new JDITestRuntimeException("** Thread IS NOT found ** : " + name); } + /** + * Return a debuggee thread by fetching it from a static field in the debuggee. + */ + public ThreadReference threadByFieldNameOrThrow(ReferenceType debuggeeClass, + String threadFieldName) + throws JDITestRuntimeException { + + Field field = debuggeeClass.fieldByName(threadFieldName); + if (field == null) { + throw new JDITestRuntimeException("** Thread field not found ** : " + + threadFieldName); + } + + ThreadReference thread = (ThreadReference)debuggeeClass.getValue(field); + if (thread == null) { + throw new JDITestRuntimeException("** Thread field is null ** : " + + threadFieldName); + } + + if (!thread.name().equals(threadFieldName)) { + throw new JDITestRuntimeException("** Thread names do not match ** : " + + threadFieldName + " vs. " + thread.name()); + } + + return thread; + } + // --------------------------------------------------- // /** From 9d72ad6e92a0f9ae2062291f14f69ea612782a38 Mon Sep 17 00:00:00 2001 From: Rui Li Date: Mon, 8 Sep 2025 15:25:52 +0000 Subject: [PATCH 016/323] 8352533: Report useful IOExceptions when jspawnhelper fails Backport-of: 5c73dfc28cbd6801ac85c6685fb8c77aad3ab0b7 --- .../unix/native/libjava/ProcessImpl_md.c | 80 ++++++++++++++----- test/jdk/java/lang/ProcessBuilder/Basic.java | 37 +++++++-- .../ProcessBuilder/JspawnhelperProtocol.java | 9 ++- 3 files changed, 100 insertions(+), 26 deletions(-) diff --git a/src/java.base/unix/native/libjava/ProcessImpl_md.c b/src/java.base/unix/native/libjava/ProcessImpl_md.c index 5a3a5cd088a6..546107ab2adc 100644 --- a/src/java.base/unix/native/libjava/ProcessImpl_md.c +++ b/src/java.base/unix/native/libjava/ProcessImpl_md.c @@ -318,12 +318,23 @@ releaseBytes(JNIEnv *env, jbyteArray arr, const char* parr) (*env)->ReleaseByteArrayElements(env, arr, (jbyte*) parr, JNI_ABORT); } -#define IOE_FORMAT "error=%d, %s" +#define IOE_FORMAT "%s, error: %d (%s) %s" + +#define SPAWN_HELPER_INTERNAL_ERROR_MSG "\n" \ + "Possible reasons:\n" \ + " - Spawn helper ran into JDK version mismatch\n" \ + " - Spawn helper ran into unexpected internal error\n" \ + " - Spawn helper was terminated by another process\n" \ + "Possible solutions:\n" \ + " - Restart JVM, especially after in-place JDK updates\n" \ + " - Check system logs for JDK-related errors\n" \ + " - Re-install JDK to fix permission/versioning problems\n" \ + " - Switch to legacy launch mechanism with -Djdk.lang.Process.launchMechanism=VFORK\n" static void -throwIOException(JNIEnv *env, int errnum, const char *defaultDetail) +throwIOExceptionImpl(JNIEnv *env, int errnum, const char *externalDetail, const char *internalDetail) { - const char *detail = defaultDetail; + const char *errorDetail; char *errmsg; size_t fmtsize; char tmpbuf[1024]; @@ -331,16 +342,22 @@ throwIOException(JNIEnv *env, int errnum, const char *defaultDetail) if (errnum != 0) { int ret = getErrorString(errnum, tmpbuf, sizeof(tmpbuf)); - if (ret != EINVAL) - detail = tmpbuf; + if (ret != EINVAL) { + errorDetail = tmpbuf; + } else { + errorDetail = "unknown"; + } + } else { + errorDetail = "none"; } + /* ASCII Decimal representation uses 2.4 times as many bits as binary. */ - fmtsize = sizeof(IOE_FORMAT) + strlen(detail) + 3 * sizeof(errnum); + fmtsize = sizeof(IOE_FORMAT) + strlen(externalDetail) + 3 * sizeof(errnum) + strlen(errorDetail) + strlen(internalDetail) + 1; errmsg = NEW(char, fmtsize); if (errmsg == NULL) return; - snprintf(errmsg, fmtsize, IOE_FORMAT, errnum, detail); + snprintf(errmsg, fmtsize, IOE_FORMAT, externalDetail, errnum, errorDetail, internalDetail); s = JNU_NewStringPlatform(env, errmsg); if (s != NULL) { jobject x = JNU_NewObjectByName(env, "java/io/IOException", @@ -351,14 +368,38 @@ throwIOException(JNIEnv *env, int errnum, const char *defaultDetail) free(errmsg); } +/** + * Throws IOException that signifies an internal error, e.g. spawn helper failure. + */ +static void +throwInternalIOException(JNIEnv *env, int errnum, const char *externalDetail, int mode) +{ + switch (mode) { + case MODE_POSIX_SPAWN: + throwIOExceptionImpl(env, errnum, externalDetail, SPAWN_HELPER_INTERNAL_ERROR_MSG); + break; + default: + throwIOExceptionImpl(env, errnum, externalDetail, ""); + } +} + +/** + * Throws IOException that signifies a normal error. + */ +static void +throwIOException(JNIEnv *env, int errnum, const char *externalDetail) +{ + throwIOExceptionImpl(env, errnum, externalDetail, ""); +} + /** * Throws an IOException with a message composed from the result of waitpid status. */ -static void throwExitCause(JNIEnv *env, int pid, int status) { +static void throwExitCause(JNIEnv *env, int pid, int status, int mode) { char ebuf[128]; if (WIFEXITED(status)) { snprintf(ebuf, sizeof ebuf, - "Failed to exec spawn helper: pid: %d, exit value: %d", + "Failed to exec spawn helper: pid: %d, exit code: %d", pid, WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { snprintf(ebuf, sizeof ebuf, @@ -369,7 +410,7 @@ static void throwExitCause(JNIEnv *env, int pid, int status) { "Failed to exec spawn helper: pid: %d, status: 0x%08x", pid, status); } - throwIOException(env, 0, ebuf); + throwInternalIOException(env, 0, ebuf, mode); } #ifdef DEBUG_PROCESS @@ -692,7 +733,7 @@ Java_java_lang_ProcessImpl_forkAndExec(JNIEnv *env, (fds[2] == -1 && pipe(err) < 0) || (pipe(childenv) < 0) || (pipe(fail) < 0)) { - throwIOException(env, errno, "Bad file descriptor"); + throwInternalIOException(env, errno, "Bad file descriptor", c->mode); goto Catch; } c->fds[0] = fds[0]; @@ -726,13 +767,13 @@ Java_java_lang_ProcessImpl_forkAndExec(JNIEnv *env, if (resultPid < 0) { switch (c->mode) { case MODE_VFORK: - throwIOException(env, errno, "vfork failed"); + throwInternalIOException(env, errno, "vfork failed", c->mode); break; case MODE_FORK: - throwIOException(env, errno, "fork failed"); + throwInternalIOException(env, errno, "fork failed", c->mode); break; case MODE_POSIX_SPAWN: - throwIOException(env, errno, "posix_spawn failed"); + throwInternalIOException(env, errno, "posix_spawn failed", c->mode); break; } goto Catch; @@ -746,20 +787,21 @@ Java_java_lang_ProcessImpl_forkAndExec(JNIEnv *env, { int tmpStatus = 0; int p = waitpid(resultPid, &tmpStatus, 0); - throwExitCause(env, p, tmpStatus); + throwExitCause(env, p, tmpStatus, c->mode); goto Catch; } case sizeof(errnum): if (errnum != CHILD_IS_ALIVE) { /* This can happen if the spawn helper encounters an error * before or during the handshake with the parent. */ - throwIOException(env, 0, "Bad code from spawn helper " - "(Failed to exec spawn helper)"); + throwInternalIOException(env, 0, + "Bad code from spawn helper (Failed to exec spawn helper)", + c->mode); goto Catch; } break; default: - throwIOException(env, errno, "Read failed"); + throwInternalIOException(env, errno, "Read failed", c->mode); goto Catch; } } @@ -771,7 +813,7 @@ Java_java_lang_ProcessImpl_forkAndExec(JNIEnv *env, throwIOException(env, errnum, "Exec failed"); goto Catch; default: - throwIOException(env, errno, "Read failed"); + throwInternalIOException(env, errno, "Read failed", c->mode); goto Catch; } diff --git a/test/jdk/java/lang/ProcessBuilder/Basic.java b/test/jdk/java/lang/ProcessBuilder/Basic.java index 9db67c180b56..d4c1af737e55 100644 --- a/test/jdk/java/lang/ProcessBuilder/Basic.java +++ b/test/jdk/java/lang/ProcessBuilder/Basic.java @@ -28,6 +28,7 @@ * 6464154 6523983 6206031 4960438 6631352 6631966 6850957 6850958 * 4947220 7018606 7034570 4244896 5049299 8003488 8054494 8058464 * 8067796 8224905 8263729 8265173 8272600 8231297 8282219 8285517 + * 8352533 * @key intermittent * @summary Basic tests for Process and Environment Variable code * @modules java.base/java.lang:open @@ -89,6 +90,7 @@ public class Basic { /* Used for regex String matching for long error messages */ static final String PERMISSION_DENIED_ERROR_MSG = "(Permission denied|error=13)"; static final String NO_SUCH_FILE_ERROR_MSG = "(No such file|error=2)"; + static final String SPAWNHELPER_FAILURE_MSG = "(Possible reasons:)"; /** * Returns the number of milliseconds since time given by @@ -321,7 +323,9 @@ static void checkPermissionDenied(ProcessBuilder pb) { } catch (IOException e) { String m = e.getMessage(); if (EnglishUnix.is() && - ! matches(m, PERMISSION_DENIED_ERROR_MSG)) + !matches(m, PERMISSION_DENIED_ERROR_MSG)) + unexpected(e); + if (matches(m, SPAWNHELPER_FAILURE_MSG)) unexpected(e); } catch (Throwable t) { unexpected(t); } } @@ -431,7 +435,9 @@ public static void main(String args[]) throws Throwable { } catch (IOException e) { String m = e.getMessage(); if (EnglishUnix.is() && - ! matches(m, NO_SUCH_FILE_ERROR_MSG)) + !matches(m, NO_SUCH_FILE_ERROR_MSG)) + unexpected(e); + if (matches(m, SPAWNHELPER_FAILURE_MSG)) unexpected(e); } catch (Throwable t) { unexpected(t); } @@ -444,7 +450,9 @@ public static void main(String args[]) throws Throwable { } catch (IOException e) { String m = e.getMessage(); if (EnglishUnix.is() && - ! matches(m, NO_SUCH_FILE_ERROR_MSG)) + !matches(m, NO_SUCH_FILE_ERROR_MSG)) + unexpected(e); + if (matches(m, SPAWNHELPER_FAILURE_MSG)) unexpected(e); } catch (Throwable t) { unexpected(t); } @@ -2052,6 +2060,8 @@ public void doIt(Map environ) { if (EnglishUnix.is() && ! matches(m, NO_SUCH_FILE_ERROR_MSG)) unexpected(e); + if (matches(m, SPAWNHELPER_FAILURE_MSG)) + unexpected(e); } catch (Throwable t) { unexpected(t); } //---------------------------------------------------------------- @@ -2069,6 +2079,8 @@ public void doIt(Map environ) { || (EnglishUnix.is() && ! matches(m, NO_SUCH_FILE_ERROR_MSG))) unexpected(e); + if (matches(m, SPAWNHELPER_FAILURE_MSG)) + unexpected(e); } catch (Throwable t) { unexpected(t); } //---------------------------------------------------------------- @@ -2085,6 +2097,8 @@ public void doIt(Map environ) { || (EnglishUnix.is() && ! matches(m, NO_SUCH_FILE_ERROR_MSG))) unexpected(e); + if (matches(m, SPAWNHELPER_FAILURE_MSG)) + unexpected(e); } catch (Throwable t) { unexpected(t); } //---------------------------------------------------------------- @@ -2143,8 +2157,9 @@ public void doIt(Map environ) { op.f(); fail(); } catch (IOException expected) { - check(expected.getMessage() - .matches("[Ss]tream [Cc]losed")); + String m = expected.getMessage(); + check(m.matches("[Ss]tream [Cc]losed")); + check(!matches(m, SPAWNHELPER_FAILURE_MSG)); } } } @@ -2196,10 +2211,14 @@ public void run() { } equal(-1, r); } catch (IOException ioe) { - if (!ioe.getMessage().equals("Stream closed")) { + String m = ioe.getMessage(); + if (!m.equals("Stream closed")) { // BufferedInputStream may throw IOE("Stream closed"). unexpected(ioe); } + if (matches(m, SPAWNHELPER_FAILURE_MSG)) { + unexpected(ioe); + } } catch (Throwable t) { unexpected(t); }}}; thread.start(); @@ -2253,6 +2272,9 @@ public void run() { ! (msg.matches(".*Bad file.*") || msg.matches(".*Stream closed.*"))) unexpected(e); + if (matches(msg, SPAWNHELPER_FAILURE_MSG)) { + unexpected(e); + } } catch (Throwable t) { unexpected(t); }}}; reader.setDaemon(true); @@ -2345,6 +2367,9 @@ public void run() { if (EnglishUnix.is() && ! matches(m, PERMISSION_DENIED_ERROR_MSG)) unexpected(e); + if (matches(m, SPAWNHELPER_FAILURE_MSG)) { + unexpected(e); + } } catch (Throwable t) { unexpected(t); } new File("emptyCommand").delete(); diff --git a/test/jdk/java/lang/ProcessBuilder/JspawnhelperProtocol.java b/test/jdk/java/lang/ProcessBuilder/JspawnhelperProtocol.java index d31905ccc636..0098bc531fdd 100644 --- a/test/jdk/java/lang/ProcessBuilder/JspawnhelperProtocol.java +++ b/test/jdk/java/lang/ProcessBuilder/JspawnhelperProtocol.java @@ -49,14 +49,21 @@ public class JspawnhelperProtocol { private static final String[] CMD = { "pwd" }; private static final String ENV_KEY = "JTREG_JSPAWNHELPER_PROTOCOL_TEST"; + private static final String SPAWNHELPER_FAILURE_MSG = "Possible reasons:"; + private static void parentCode(String arg) throws IOException, InterruptedException { System.out.println("Recursively executing 'JspawnhelperProtocol " + arg + "'"); Process p = null; try { p = Runtime.getRuntime().exec(CMD); } catch (Exception e) { + // Check that exception contains rich message on failure. e.printStackTrace(System.out); - System.exit(ERROR); + if (e instanceof IOException && e.getMessage().contains(SPAWNHELPER_FAILURE_MSG)) { + System.exit(ERROR); + } else { + System.exit(ERROR + 3); + } } if (!p.waitFor(TIMEOUT, TimeUnit.SECONDS)) { System.out.println("Child process timed out"); From 4aa56a079b3b71b56c6d1c87ce9d9cf8a5b17c2a Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Mon, 8 Sep 2025 16:49:33 +0000 Subject: [PATCH 017/323] 8354653: Clean up and open source KeyEvent related tests (Part 4) Backport-of: a7128d86eac2c40dbfa79811234ab6226fb4d080 --- .../java/awt/event/KeyEvent/AltGrTest.java | 90 +++++++++++++ test/jdk/java/awt/event/KeyEvent/CRTest.java | 124 ++++++++++++++++++ .../java/awt/event/KeyEvent/NumpadTest2.java | 108 +++++++++++++++ .../event/KeyEvent/TestDoubleKeyEvent.java | 87 ++++++++++++ 4 files changed, 409 insertions(+) create mode 100644 test/jdk/java/awt/event/KeyEvent/AltGrTest.java create mode 100644 test/jdk/java/awt/event/KeyEvent/CRTest.java create mode 100644 test/jdk/java/awt/event/KeyEvent/NumpadTest2.java create mode 100644 test/jdk/java/awt/event/KeyEvent/TestDoubleKeyEvent.java diff --git a/test/jdk/java/awt/event/KeyEvent/AltGrTest.java b/test/jdk/java/awt/event/KeyEvent/AltGrTest.java new file mode 100644 index 000000000000..9f771ea7e196 --- /dev/null +++ b/test/jdk/java/awt/event/KeyEvent/AltGrTest.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 1999, 2025, 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 4122687 4209844 + * @summary Characters typed with AltGr have Alt bit set on + * KEY_TYPED events + * @requires (os.family == "windows") + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual AltGrTest + */ + +import java.awt.BorderLayout; +import java.awt.Frame; +import java.awt.TextField; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.lang.reflect.InvocationTargetException; + +public class AltGrTest extends Frame implements KeyListener { + static String INSTRUCTIONS = """ + Switch to German (Germany) keyboard layout and type + few characters using key. + Note: on windows keyboards without an AltGr key, + you should use Ctrl-Alt to synthesize AltGr. + For example, on German keyboards, `@' is AltGr-Q + `{' is AltGr-7 and '[' is AltGr-8 + If you see the corresponding symbols appear in the text field + and there are no entries in log area starting with word "FAIL:" + press "Pass", otherwise press "Fail". + """; + + public AltGrTest() { + setLayout(new BorderLayout()); + TextField entry = new TextField(); + entry.addKeyListener(this); + add(entry, BorderLayout.CENTER); + pack(); + } + + public void keyTyped(KeyEvent e) { + PassFailJFrame.log("----"); + PassFailJFrame.log("Got " + e); + + if (e.isControlDown() || e.isAltDown()) { + PassFailJFrame.log("FAIL: character typed has following modifiers bits set:"); + PassFailJFrame.log((e.isControlDown() ? " Control" : "") + + (e.isAltDown() ? " Alt" : "")); + } + + if (!(e.isAltGraphDown())) { + PassFailJFrame.log("FAIL: AltGraph modifier is missing"); + } + } + + public void keyPressed(KeyEvent ignore) {} + public void keyReleased(KeyEvent ignore) {} + + public static void main(String[] args) throws InterruptedException, + InvocationTargetException { + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .logArea(10) + .testUI(AltGrTest::new) + .build() + .awaitAndCheck(); + } +} diff --git a/test/jdk/java/awt/event/KeyEvent/CRTest.java b/test/jdk/java/awt/event/KeyEvent/CRTest.java new file mode 100644 index 000000000000..0cc17fd568eb --- /dev/null +++ b/test/jdk/java/awt/event/KeyEvent/CRTest.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 1999, 2025, 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 4257434 + * @summary Ensures that the right results are produced by the + * carriage return keys. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual CRTest + */ + +import java.awt.BorderLayout; +import java.awt.Button; +import java.awt.Frame; +import java.awt.TextField; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.lang.reflect.InvocationTargetException; +import java.util.concurrent.atomic.AtomicBoolean; + +public class CRTest extends Frame implements KeyListener, ActionListener { + StringBuilder error = new StringBuilder(); + AtomicBoolean actionCompleted = new AtomicBoolean(false); + static String INSTRUCTIONS = """ + This test requires keyboard with the numeric keypad (numpad). + If your keyboard does not have numpad press "Pass" to skip testing. + Click on the text field in window named "Check KeyChar values". + Press Enter on keypad. Then press Return key on a standard keyboard. + Then click on "Done" button. Test will pass or fail automatically. + """; + + public CRTest() { + super("Check KeyChar values"); + setLayout(new BorderLayout()); + TextField tf = new TextField(30); + + tf.addKeyListener(this); + tf.addActionListener(this); + + add(tf, BorderLayout.CENTER); + + Button done = new Button("Done"); + done.addActionListener((event) -> { + checkAndComplete(); + }); + add(done, BorderLayout.SOUTH); + pack(); + } + + public void checkAndComplete() { + if (!actionCompleted.get()) { + error.append("\nNo action received!"); + } + + if (!error.isEmpty()) { + PassFailJFrame.forceFail(error.toString()); + } else { + PassFailJFrame.forcePass(); + } + } + + public void keyPressed(KeyEvent evt) { + if ((evt.getKeyChar() != '\n') || (evt.getKeyCode() != KeyEvent.VK_ENTER)) { + error.append("\nKeyPressed: Unexpected code " + evt.getKeyCode()); + } else { + PassFailJFrame.log("KeyPressed Test PASSED"); + } + } + + public void keyTyped(KeyEvent evt) { + if ((evt.getKeyChar() != '\n') || (evt.getKeyCode() != KeyEvent.VK_UNDEFINED)) { + error.append("\nKeyTyped: Unexpected code " + evt.getKeyCode()); + } else { + PassFailJFrame.log("KeyTyped Test PASSED"); + } + } + + public void keyReleased(KeyEvent evt) { + if ((evt.getKeyChar() != '\n') || (evt.getKeyCode() != KeyEvent.VK_ENTER)) { + error.append("\nKeyReleased: Unexpected code " + evt.getKeyCode()); + } else { + PassFailJFrame.log("KeyReleased Test PASSED"); + } + } + + public void actionPerformed(ActionEvent evt) { + PassFailJFrame.log("ActionPerformed Test PASSED"); + actionCompleted.set(true); + } + + public static void main(String[] args) throws InterruptedException, + InvocationTargetException { + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .logArea(10) + .testUI(CRTest::new) + .build() + .awaitAndCheck(); + } +} diff --git a/test/jdk/java/awt/event/KeyEvent/NumpadTest2.java b/test/jdk/java/awt/event/KeyEvent/NumpadTest2.java new file mode 100644 index 000000000000..1ee473543189 --- /dev/null +++ b/test/jdk/java/awt/event/KeyEvent/NumpadTest2.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 1999, 2025, 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 4279566 + * @summary Tests that numpad keys produce the correct key codes and + * key chars when both the NumLock and CapsLock are on. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual NumpadTest2 +*/ + +import java.awt.BorderLayout; +import java.awt.Frame; +import java.awt.TextField; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.lang.reflect.InvocationTargetException; + +public class NumpadTest2 extends Frame implements KeyListener { + static String INSTRUCTIONS = """ + Make sure that the NumLock and CapsLock are both ON. + Click on the text field inside the window named "Check KeyChar values" + Then, type the NumPad 7 key (not the regular 7 key). + Verify that the keyChar and keyCode is correct for each key pressed. + Remember that the keyCode for the KEY_TYPED event should be zero. + If 7 appears in the text field and the key code printed is correct + press "Pass", otherwise press "Fail". + + Key Name keyChar Keycode + ------------------------------------------------- + Numpad-7 Numpad-7 55 103 + """; + + public NumpadTest2() { + super("Check KeyChar values"); + setLayout(new BorderLayout()); + TextField tf = new TextField(30); + tf.addKeyListener(this); + add(tf, BorderLayout.CENTER); + pack(); + } + + public void keyPressed(KeyEvent evt) { + printKey(evt); + } + + public void keyTyped(KeyEvent evt) { + printKey(evt); + } + + public void keyReleased(KeyEvent evt) { + printKey(evt); + } + + protected void printKey(KeyEvent evt) { + switch (evt.getID()) { + case KeyEvent.KEY_TYPED: + break; + case KeyEvent.KEY_PRESSED: + break; + case KeyEvent.KEY_RELEASED: + break; + default: + System.out.println("Other Event "); + return; + } + + if (evt.isActionKey()) { + PassFailJFrame.log("params= " + evt.paramString() + " KeyChar: " + + (int) evt.getKeyChar() + " Action Key"); + } else { + PassFailJFrame.log("params= " + evt.paramString() + " KeyChar: " + + (int) evt.getKeyChar()); + } + } + + public static void main(String[] args) throws InterruptedException, + InvocationTargetException { + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .logArea(10) + .testUI(NumpadTest2::new) + .build() + .awaitAndCheck(); + } +} diff --git a/test/jdk/java/awt/event/KeyEvent/TestDoubleKeyEvent.java b/test/jdk/java/awt/event/KeyEvent/TestDoubleKeyEvent.java new file mode 100644 index 000000000000..24e0bd553c89 --- /dev/null +++ b/test/jdk/java/awt/event/KeyEvent/TestDoubleKeyEvent.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 1999, 2025, 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 4495473 + * @summary Tests that when you press key on canvas-type heavyweight only one key event arrives + * @key headful + * @run main TestDoubleKeyEvent + */ + +import java.awt.AWTException; +import java.awt.BorderLayout; +import java.awt.EventQueue; +import java.awt.FlowLayout; +import java.awt.Robot; +import java.awt.event.KeyEvent; +import java.lang.reflect.InvocationTargetException; +import javax.swing.JFrame; +import javax.swing.JWindow; +import javax.swing.JTextField; + +public class TestDoubleKeyEvent extends JFrame { + JWindow w; + JTextField tf; + + public void initUI() { + setLayout(new BorderLayout()); + setTitle("Double Key Event Test"); + setLocationRelativeTo(null); + setVisible(true); + w = new JWindow(this); + w.setLayout(new FlowLayout()); + tf = new JTextField(20); + w.add(tf); + w.pack(); + w.setLocationRelativeTo(null); + w.setVisible(true); + tf.requestFocus(); + } + + public void testAndClean() { + String str = tf.getText(); + w.dispose(); + dispose(); + if (str.length() != str.chars().distinct().count()) { + throw new RuntimeException("Duplicate characters found!"); + } + } + + public static void main(String[] args) throws InterruptedException, + InvocationTargetException, AWTException { + TestDoubleKeyEvent test = new TestDoubleKeyEvent(); + EventQueue.invokeAndWait(test::initUI); + Robot robot = new Robot(); + robot.setAutoDelay(50); + robot.waitForIdle(); + robot.delay(1000); + for (int i = 0; i < 15; i++) { + robot.keyPress(KeyEvent.VK_A + i); + robot.keyRelease(KeyEvent.VK_A + i); + robot.waitForIdle(); + } + robot.delay(1000); + EventQueue.invokeAndWait(test::testAndClean); + } +} From 299c5260d000d13556b6401cf5c4bb1d14bc4e79 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Mon, 8 Sep 2025 16:50:04 +0000 Subject: [PATCH 018/323] 8354214: Open source Swing tests Batch 2 Backport-of: 2be5bc847a444f08a4ebb41b58e8a2bf4553d621 --- test/jdk/javax/swing/JList/bug4193267.java | 117 +++++++++++++++++++ test/jdk/javax/swing/JList/bug4249161.java | 96 ++++++++++++++++ test/jdk/javax/swing/JList/bug4618767.java | 127 +++++++++++++++++++++ 3 files changed, 340 insertions(+) create mode 100644 test/jdk/javax/swing/JList/bug4193267.java create mode 100644 test/jdk/javax/swing/JList/bug4249161.java create mode 100644 test/jdk/javax/swing/JList/bug4618767.java diff --git a/test/jdk/javax/swing/JList/bug4193267.java b/test/jdk/javax/swing/JList/bug4193267.java new file mode 100644 index 000000000000..cb447644d154 --- /dev/null +++ b/test/jdk/javax/swing/JList/bug4193267.java @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2001, 2025, 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 4193267 + * @summary Tests that JList first and last visible indices are + * updated properly + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4193267 + */ + +import java.awt.Color; +import java.awt.FlowLayout; +import java.awt.GridLayout; +import java.util.List; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextField; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +public class bug4193267 { + public static void main(String[] args) throws Exception { + String INSTRUCTIONS = """ + Resize the frame "JList" with a different ways and scroll the list + (if it possible). The indices of first and last visible elements + should be indicated in the corresponding fields in "Index" frame. + If the indicated indices is not right then test fails. + + Note: + - the first and last visible indices should be -1 if nothing + is visible; + - the first or last visible cells may only be partially visible. + """; + PassFailJFrame.builder() + .title("bug4193267 Instructions") + .instructions(INSTRUCTIONS) + .positionTestUI(WindowLayouts::rightOneRow) + .columns(35) + .testUI(bug4193267::initialize) + .build() + .awaitAndCheck(); + } + + private static List initialize() { + String[] data = {"000000000000000", "111111111111111", + "222222222222222", "333333333333333", + "444444444444444", "555555555555555", + "666666666666666", "777777777777777", + "888888888888888", "999999999999999"}; + + JFrame[] fr = new JFrame[2]; + fr[0] = new JFrame("JList"); + JList lst = new JList(data); + lst.setLayoutOrientation(JList.VERTICAL_WRAP); + lst.setVisibleRowCount(4); + JScrollPane jsp = new JScrollPane(lst); + fr[0].add(jsp); + fr[0].setSize(400, 200); + + JPanel pL = new JPanel(); + pL.setLayout(new GridLayout(2, 1)); + pL.add(new JLabel("First Visible Index")); + pL.add(new JLabel("Last Visible Index")); + + JPanel p = new JPanel(); + p.setLayout(new GridLayout(2, 1)); + JTextField first = new JTextField("0", 2); + first.setEditable(false); + first.setBackground(Color.white); + p.add(first); + JTextField last = new JTextField("9", 2); + last.setEditable(false); + last.setBackground(Color.white); + p.add(last); + + fr[1] = new JFrame("Index"); + fr[1].setSize(200, 200); + fr[1].setLayout(new FlowLayout()); + fr[1].add(pL); + fr[1].add(p); + + jsp.getViewport().addChangeListener(new ChangeListener() { + public void stateChanged(ChangeEvent e) { + first.setText(String.valueOf(lst.getFirstVisibleIndex())); + last.setText(String.valueOf(lst.getLastVisibleIndex())); + } + }); + List frameList = List.of(fr[0], fr[1]); + return frameList; + } +} diff --git a/test/jdk/javax/swing/JList/bug4249161.java b/test/jdk/javax/swing/JList/bug4249161.java new file mode 100644 index 000000000000..09bdd93600f0 --- /dev/null +++ b/test/jdk/javax/swing/JList/bug4249161.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2001, 2025, 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 4249161 + * @summary Tests that JList.setComponentOrientation() works correctly + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4249161 + */ + +import java.awt.BorderLayout; +import java.awt.ComponentOrientation; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JList; +import javax.swing.JScrollPane; + +public class bug4249161 { + public static void main(String[] args) throws Exception { + String INSTRUCTIONS = """ + 1. With a scroll bar, confirm that all words ("one" - "twenty") are + aligned at the left side of a list. + 2. Press "Change!" button. All words on the list should be moved + to the right side. + 3. Press the same button again. All words should be moved to the + left side. + + If all items in a list are moved as soon as "Change!" button is + pressed, test passes. + """; + PassFailJFrame.builder() + .title("bug4249161 Instructions") + .instructions(INSTRUCTIONS) + .columns(35) + .testUI(bug4249161::initialize) + .build() + .awaitAndCheck(); + } + + private static JFrame initialize() { + JFrame fr = new JFrame("bug4249161"); + + String[] data = {"one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "ten", + "eleven", "twelve", "thirteen", "fourteen", "fifteen", + "sixteen", "seventeen", "eighteen", "nineteen", "twenty" + }; + final JList list = new JList(data); + list.setSize(200, 200); + list.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); + JScrollPane pane = new JScrollPane(list); + fr.add(pane); + + JButton button = new JButton("Change!"); + button.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if (list.getComponentOrientation() != + ComponentOrientation.RIGHT_TO_LEFT) { + list.setComponentOrientation + (ComponentOrientation.RIGHT_TO_LEFT); + } else { + list.setComponentOrientation + (ComponentOrientation.LEFT_TO_RIGHT); + } + } + }); + fr.add(button, BorderLayout.SOUTH); + fr.setSize(200, 300); + fr.setAlwaysOnTop(true); + return fr; + } +} diff --git a/test/jdk/javax/swing/JList/bug4618767.java b/test/jdk/javax/swing/JList/bug4618767.java new file mode 100644 index 000000000000..f01e20f365c9 --- /dev/null +++ b/test/jdk/javax/swing/JList/bug4618767.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 1999, 2025, 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 4618767 + * @summary First letter navigation in JList interferes with mnemonics + * @key headful + * @run main bug4618767 + */ + +import java.awt.Robot; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; +import java.awt.event.KeyEvent; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import javax.swing.JFrame; +import javax.swing.JList; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.SwingUtilities; +import javax.swing.event.MenuEvent; +import javax.swing.event.MenuListener; + +public class bug4618767 { + private static JFrame f; + private static final JList list = new + JList(new String[] {"one", "two", "three", "four"}); + private static boolean menuSelected; + private static volatile boolean failed; + private static CountDownLatch listGainedFocusLatch = new CountDownLatch(1); + + public static void main(String[] args) throws Exception { + try { + createUI(); + runTest(); + } finally { + SwingUtilities.invokeAndWait(() -> { + if (f != null) { + f.dispose(); + } + }); + } + } + + private static void createUI() throws Exception { + SwingUtilities.invokeAndWait(() -> { + f = new JFrame("bug4618767"); + JMenu menu = new JMenu("File"); + menu.setMnemonic('F'); + JMenuItem menuItem = new JMenuItem("item"); + menu.add(menuItem); + JMenuBar menuBar = new JMenuBar(); + menuBar.add(menu); + f.setJMenuBar(menuBar); + + menu.addMenuListener(new MenuListener() { + public void menuCanceled(MenuEvent e) {} + public void menuDeselected(MenuEvent e) {} + public void menuSelected(MenuEvent e) { + menuSelected = true; + } + }); + + list.addFocusListener(new FocusAdapter() { + @Override + public void focusGained(FocusEvent e) { + listGainedFocusLatch.countDown(); + } + }); + f.add(list); + f.pack(); + f.setLocationRelativeTo(null); + f.setAlwaysOnTop(true); + f.setVisible(true); + }); + } + + private static void runTest() throws Exception { + if (!listGainedFocusLatch.await(3, TimeUnit.SECONDS)) { + throw new RuntimeException("Waited too long, but can't gain" + + " focus for list"); + } + Robot robot = new Robot(); + robot.setAutoDelay(200); + robot.waitForIdle(); + robot.keyPress(KeyEvent.VK_O); + robot.keyRelease(KeyEvent.VK_O); + robot.waitForIdle(); + robot.keyPress(KeyEvent.VK_ALT); + robot.keyPress(KeyEvent.VK_F); + robot.keyRelease(KeyEvent.VK_F); + robot.keyRelease(KeyEvent.VK_ALT); + + SwingUtilities.invokeAndWait(() -> { + if (menuSelected && list.getSelectedIndex()!= 0) { + failed = true; + } + }); + if (failed) { + throw new RuntimeException("Mnemonics interferes with Jlist" + + " item selection using KeyEvent"); + } + } +} From 321a3d56c97d0271f55c8499975bdd282a465074 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Tue, 9 Sep 2025 16:26:22 +0000 Subject: [PATCH 019/323] 8354418: Open source Swing tests Batch 4 Backport-of: dda4b5a4ade2e5d7225117e58fce4038bb0e0f1b --- .../WindowsLAFMenuAcceleratorDelimiter.java | 95 ++++++++++++++++++ .../4227768/bug4227768.java | 99 +++++++++++++++++++ .../4305725/bug4305725.java | 97 ++++++++++++++++++ 3 files changed, 291 insertions(+) create mode 100644 test/jdk/com/sun/java/swing/plaf/windows/MenuItem/AcceleratorDelimiter/WindowsLAFMenuAcceleratorDelimiter.java create mode 100644 test/jdk/com/sun/java/swing/plaf/windows/WindowsDesktopManager/4227768/bug4227768.java create mode 100644 test/jdk/com/sun/java/swing/plaf/windows/WindowsDesktopManager/4305725/bug4305725.java diff --git a/test/jdk/com/sun/java/swing/plaf/windows/MenuItem/AcceleratorDelimiter/WindowsLAFMenuAcceleratorDelimiter.java b/test/jdk/com/sun/java/swing/plaf/windows/MenuItem/AcceleratorDelimiter/WindowsLAFMenuAcceleratorDelimiter.java new file mode 100644 index 000000000000..adb1d93c9fe9 --- /dev/null +++ b/test/jdk/com/sun/java/swing/plaf/windows/MenuItem/AcceleratorDelimiter/WindowsLAFMenuAcceleratorDelimiter.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 1999, 2025, 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 4210461 + * @requires (os.family == "windows") + * @summary Tests that Windows Look & Feel's MenuItem Accelerator Delimiter is + * shown properly + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual WindowsLAFMenuAcceleratorDelimiter + */ + +import java.awt.BorderLayout; +import java.awt.event.ActionEvent; +import java.awt.event.KeyEvent; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JPanel; +import javax.swing.KeyStroke; +import javax.swing.UIManager; + +public class WindowsLAFMenuAcceleratorDelimiter { + public static void main(String[] args) throws Exception { + try { + UIManager.setLookAndFeel( + "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); + } catch (Exception e) { + throw new RuntimeException("The Windows LAF failed to instantiate"); + } + + String INSTRUCTIONS = """ + The visual design specification for the Windows LAF asks for + a "+" to delimit the other two entities in a menuitem's + accelerator. + + As a point of reference, the visual design specifications for the + L&Fs are as follows: JLF/Metal = "-", Mac = "-", Motif = "+", + Windows = "+". + + Click on "Menu" of "WindowsLAFMenuAcceleratorDelimiter" window, + make sure it shows MenuItem with label "Hi There! Ctrl+H". + + If it shows same label test passed otherwise failed. + """; + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(50) + .testUI(WindowsLAFMenuAcceleratorDelimiter::initialize) + .build() + .awaitAndCheck(); + } + + private static JFrame initialize() { + JFrame fr = new JFrame("WindowsLAFMenuAcceleratorDelimiter"); + JPanel menuPanel = new JPanel(); + JMenuBar menuBar = new JMenuBar(); + menuBar.setOpaque(true); + JMenu exampleMenu = new JMenu("Menu"); + JMenuItem hiMenuItem = new JMenuItem("Hi There!"); + hiMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, + ActionEvent.CTRL_MASK)); + exampleMenu.add(hiMenuItem); + menuBar.add(exampleMenu); + menuPanel.add(menuBar); + + fr.setLayout(new BorderLayout()); + fr.add(menuPanel, BorderLayout.CENTER); + fr.setSize(250, 100); + return fr; + } +} diff --git a/test/jdk/com/sun/java/swing/plaf/windows/WindowsDesktopManager/4227768/bug4227768.java b/test/jdk/com/sun/java/swing/plaf/windows/WindowsDesktopManager/4227768/bug4227768.java new file mode 100644 index 000000000000..ef9cc90bea06 --- /dev/null +++ b/test/jdk/com/sun/java/swing/plaf/windows/WindowsDesktopManager/4227768/bug4227768.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2000, 2025, 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 4227768 + * @requires (os.family == "windows") + * @summary Tests Z-ordering of Windows Look-and-Feel JInternalFrames + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4227768 + */ + +import java.awt.Dimension; +import java.awt.Toolkit; +import java.beans.PropertyVetoException; +import javax.swing.JDesktopPane; +import javax.swing.JFrame; +import javax.swing.JInternalFrame; +import javax.swing.UIManager; + +public class bug4227768 { + private static JDesktopPane desktop ; + private static JFrame frame; + private static int openFrameCount = 0; + private static final int xOffset = 30; + private static final int yOffset = 30; + + public static void main(String[] args) throws Exception { + try { + UIManager.setLookAndFeel + ("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); + } catch (Exception e) { + throw new RuntimeException("Failed to set Windows LAF"); + } + + String INSTRUCTIONS = """ + Close the internal frame titled "Document #4". The internal frame + titled "Document #3" should get active. Now close the internal + frame titled "Document #2". The internal frame titled "Document #3" + should remain active. If something is not like this, then test + failed. Otherwise test succeeded. + """; + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(50) + .testUI(bug4227768::initialize) + .build() + .awaitAndCheck(); + } + + private static JFrame initialize() { + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + frame = new JFrame("bug4227768"); + frame.setSize(screenSize.width / 3, screenSize.height / 3); + frame.add(desktop = new JDesktopPane()); + createFrame(); + createFrame(); + createFrame(); + createFrame(); + desktop.putClientProperty("JDesktopPane.dragMode", "outline"); + return frame; + } + + protected static void createFrame() { + JInternalFrame internalFrame = new JInternalFrame + ("Document #" + (++openFrameCount), true, true, true, true); + internalFrame.setSize(frame.getWidth() / 2, frame.getHeight() / 2); + internalFrame.setLocation(xOffset * openFrameCount, + yOffset * openFrameCount); + desktop.add(internalFrame); + internalFrame.setVisible(true); + try { + internalFrame.setSelected(true); + } catch (PropertyVetoException e) { + throw new RuntimeException(e); + } + } +} diff --git a/test/jdk/com/sun/java/swing/plaf/windows/WindowsDesktopManager/4305725/bug4305725.java b/test/jdk/com/sun/java/swing/plaf/windows/WindowsDesktopManager/4305725/bug4305725.java new file mode 100644 index 000000000000..4b9a462c4726 --- /dev/null +++ b/test/jdk/com/sun/java/swing/plaf/windows/WindowsDesktopManager/4305725/bug4305725.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2000, 2025, 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 4305725 + * @requires (os.family == "windows") + * @summary Tests if in Win LAF the JOptionPane.showInternalMessageDialog() is + * not maximized to match background maximized internal frame. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4305725 + */ + +import java.awt.Dimension; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import javax.swing.JDesktopPane; +import javax.swing.JFrame; +import javax.swing.JInternalFrame; +import javax.swing.JLayeredPane; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.UIManager; + +public class bug4305725 implements ActionListener { + private static JDesktopPane desktop ; + + public static void main(String[] args) throws Exception { + try { + UIManager.setLookAndFeel + ("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); + } catch (Exception e) { + throw new RuntimeException("Failed to set Windows LAF"); + } + + String INSTRUCTIONS = """ + Maximize the internal frame, then call Exit from File menu. + You will see a message box. If message box is also the size of + internal frame, then test failed. If it is of usual size, + then test is passed. + """; + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(50) + .testUI(bug4305725::initialize) + .build() + .awaitAndCheck(); + } + + private static JFrame initialize() { + JFrame frame = new JFrame("bug4305725"); + frame.add(desktop = new JDesktopPane()); + JMenuBar mb = new JMenuBar() ; + JMenu menu = new JMenu("File"); + mb.add(menu) ; + JMenuItem menuItem = menu.add(new JMenuItem("Exit")); + menuItem.addActionListener(new bug4305725()) ; + frame.setJMenuBar(mb) ; + Dimension sDim = Toolkit.getDefaultToolkit().getScreenSize(); + frame.setSize(sDim.width / 2, sDim.height / 2) ; + JInternalFrame internalFrame = new JInternalFrame + ("Internal", true, true, true, true); + internalFrame.setSize(frame.getWidth(), frame.getHeight() / 2); + internalFrame.setVisible(true); + desktop.add(internalFrame, JLayeredPane.FRAME_CONTENT_LAYER); + return frame; + } + + @Override + public void actionPerformed(ActionEvent aEvent) { + JOptionPane.showInternalMessageDialog(desktop, "Exiting test app"); + } +} From 482b91df4b7fd3d461a326be8f4aa75c7399b9cb Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Tue, 9 Sep 2025 16:26:45 +0000 Subject: [PATCH 020/323] 8353319: Open source Swing tests - Set 3 Backport-of: bf63f9ffa5e107ecb01e67dbef785a7bf4c89f16 --- test/jdk/javax/swing/JFrame/bug4419914.java | 128 +++++++++++++++--- .../jdk/javax/swing/JRootPane/bug4614623.java | 84 ++++++++++++ .../javax/swing/JTabbedPane/bug4613811.java | 82 +++++++++++ test/jdk/javax/swing/JWindow/bug4251781.java | 76 +++++++++++ 4 files changed, 349 insertions(+), 21 deletions(-) create mode 100644 test/jdk/javax/swing/JRootPane/bug4614623.java create mode 100644 test/jdk/javax/swing/JTabbedPane/bug4613811.java create mode 100644 test/jdk/javax/swing/JWindow/bug4251781.java diff --git a/test/jdk/javax/swing/JFrame/bug4419914.java b/test/jdk/javax/swing/JFrame/bug4419914.java index 4574b1ac3d6f..f87dcc8c4688 100644 --- a/test/jdk/javax/swing/JFrame/bug4419914.java +++ b/test/jdk/javax/swing/JFrame/bug4419914.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2025, 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 @@ -28,55 +28,141 @@ * @library /java/awt/regtesthelpers * @build PassFailJFrame * @run main/manual bug4419914 -*/ + */ import java.awt.BorderLayout; import java.awt.ComponentOrientation; +import java.awt.Frame; +import java.awt.Window; +import java.util.List; +import java.util.Locale; import javax.swing.JButton; +import javax.swing.JDialog; import javax.swing.JFrame; -import java.util.Locale; +import javax.swing.JLabel; +import javax.swing.JWindow; public class bug4419914 { + private static JFrame frame; private static final String INSTRUCTIONS = """ - 1. You will see a frame with five buttons. - 2. Confirm that each button is placed as follows: - NORTH - END CENTER START - SOUTH - 3. Press the "NORTH" button and confirm the button is focused. - 4. Press TAB repeatedly and confirm that the TAB focus moves from right to left. - (NORTH - START - CENTER - END - SOUTH - NORTH - START - CENTER - ...) + This test verifies tab movement on RTL component orientation + in JWindow, JFrame and JDialog. + + When test starts 3 test windows are displayed - JFrame, JWindow and JDialog. + Follow the instructions below and if any condition does not hold + press FAIL. + + 1. Confirm that each button in the child window is placed as follows: + + For JFrame: + NORTH + END CENTER START + SOUTH + + For JWindow: + END CENTER START + QUIT + + For JDialog: + END CENTER START + + 3. Press on the "START" button in case of JWindow & JDialog and "NORTH" + in case of JFrame, confirm that the respective button is focused. + + 4. Press TAB repeatedly and confirm that the TAB focus moves + from right to left. + + For JFrame: + (NORTH - START - CENTER - END - SOUTH - NORTH - START - CENTER - ...) - If there's anything different from the above items, click Fail else click Pass."""; + For JWindow: + (START - CENTER - END - QUIT - START - CENTER - END - QUIT - ...) + + For JDialog: + (START - CENTER - END - START - CENTER - END - ...) + + If all of the above conditions are true press PASS else FAIL. + """; public static void main(String[] args) throws Exception { PassFailJFrame.builder() - .title("Tab movement Instructions") .instructions(INSTRUCTIONS) - .rows((int) INSTRUCTIONS.lines().count() + 2) - .columns(48) - .testUI(bug4419914::createTestUI) + .columns(45) + .testTimeOut(10) + .testUI(bug4419914::createAndShowUI) + .positionTestUI(WindowLayouts::rightOneColumn) .build() .awaitAndCheck(); } - private static JFrame createTestUI() { - JFrame frame = new JFrame("bug4419914"); + private static List createAndShowUI() { + return List.of(createJFrame(), createJWindow(), createJDialog()); + } + + private static JFrame createJFrame() { + frame = new JFrame("bug4419914 JFrame"); frame.setFocusCycleRoot(true); + // Tab movement set to RTL frame.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); frame.setLocale(Locale.ENGLISH); frame.enableInputMethods(false); + // Component placement within content pane set to RTL frame.getContentPane().setComponentOrientation( - ComponentOrientation.RIGHT_TO_LEFT); + ComponentOrientation.RIGHT_TO_LEFT); frame.getContentPane().setLocale(Locale.ENGLISH); - frame.getContentPane().setLayout(new BorderLayout()); + frame.setLayout(new BorderLayout()); frame.add(new JButton("SOUTH"), BorderLayout.SOUTH); frame.add(new JButton("CENTER"), BorderLayout.CENTER); frame.add(new JButton("END"), BorderLayout.LINE_END); frame.add(new JButton("START"), BorderLayout.LINE_START); frame.add(new JButton("NORTH"), BorderLayout.NORTH); - frame.setSize(300, 150); + frame.setSize(300, 160); return frame; } + + private static JWindow createJWindow() { + JWindow window = new JWindow(frame); + window.setFocusableWindowState(true); + // Tab movement set to RTL + window.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); + window.setLocale(new Locale("en")); + window.enableInputMethods(false); + + // Component placement within content pane set to RTL + window.getContentPane().setComponentOrientation( + ComponentOrientation.RIGHT_TO_LEFT); + window.getContentPane().setLocale(new Locale("en")); + window.setLayout(new BorderLayout()); + window.add(new JLabel("bug4419914 JWindow"), BorderLayout.NORTH); + window.add(new JButton("START"), BorderLayout.LINE_START); + window.add(new JButton("CENTER"), BorderLayout.CENTER); + window.add(new JButton("END"), BorderLayout.LINE_END); + + JButton quitButton = new JButton("QUIT"); + quitButton.addActionListener(e1 -> window.dispose()); + window.add(quitButton, BorderLayout.SOUTH); + window.setSize(300, 153); + window.requestFocus(); + return window; + } + + private static JDialog createJDialog() { + JDialog dialog = new JDialog((Frame) null, "bug4419914 JDialog"); + // Tab movement set to RTL + dialog.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); + dialog.setLocale(new Locale("en")); + dialog.enableInputMethods(false); + + // Component placement within content pane set to RTL + dialog.getContentPane().setComponentOrientation( + ComponentOrientation.RIGHT_TO_LEFT); + dialog.getContentPane().setLocale(new Locale("en")); + dialog.setLayout(new BorderLayout()); + dialog.add(new JButton("CENTER"), BorderLayout.CENTER); + dialog.add(new JButton("END"), BorderLayout.LINE_END); + dialog.add(new JButton("START"), BorderLayout.LINE_START); + dialog.setSize(300, 160); + return dialog; + } } diff --git a/test/jdk/javax/swing/JRootPane/bug4614623.java b/test/jdk/javax/swing/JRootPane/bug4614623.java new file mode 100644 index 000000000000..9a714d3cdfde --- /dev/null +++ b/test/jdk/javax/swing/JRootPane/bug4614623.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2002, 2025, 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 4614623 + * @requires (os.family == "windows") + * @summary Tests that w2k mnemonic underlining works when there's no + focus owner + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4614623 + */ + +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.UIManager; + +public class bug4614623 { + private static final String INSTRUCTIONS = """ + This test verifies if the short-cut character + (menu mnemonic) is underlined when the ALT key is held down. + + Check if the following is true. + 1) Press Alt key. The letter 'F' (menu mnemonic) of + the "File" menu should now be underlined. + 2) Release the Alt key, the selection background (light grey) + should appear around the "File" menu. Compare "About" menu + with "File" menu to see the light grey selection background. + + If the above is true, press PASS else FAIL. + """; + + public static void main(String[] args) throws Exception { + UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); + + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(62) + .rows(12) + .testUI(bug4614623::createAndShowUI) + .build() + .awaitAndCheck(); + } + + public static JFrame createAndShowUI() { + JFrame frame = new JFrame("bug4614623 - File menu test"); + JMenuBar menuBar = new JMenuBar(); + + JMenu fileMenu = new JMenu("File"); + fileMenu.setMnemonic('F'); + menuBar.add(fileMenu); + + JMenu about = new JMenu("About"); + menuBar.add(about); + menuBar.setSize(300, 100); + + frame.setJMenuBar(menuBar); + menuBar.requestFocus(); + frame.setSize(300, 200); + return frame; + } +} diff --git a/test/jdk/javax/swing/JTabbedPane/bug4613811.java b/test/jdk/javax/swing/JTabbedPane/bug4613811.java new file mode 100644 index 000000000000..ecad64e95f8d --- /dev/null +++ b/test/jdk/javax/swing/JTabbedPane/bug4613811.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2003, 2025, 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 4613811 + * @summary Scrollable Buttons of JTabbedPane don't + * get enabled or disabled on selecting tab + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4613811 + */ + +import java.awt.BorderLayout; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JTabbedPane; + +public class bug4613811 { + private static final String INSTRUCTIONS = """ + Select different tabs and check that the scrollable + buttons are correctly enabled and disabled. + + When the very first tab (Tab 1) is fully visible + On macOS: + the left arrow button should NOT be visible. + + On other platforms: + the left arrow button should be disabled. + + If the last tab (Tab 5) is fully visible + On macOS: + the right arrow button should NOT be visible. + + On other platforms: + the right arrow button should be disabled. + + If the above is true press PASS else FAIL. + """; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(30) + .testUI(bug4613811::createAndShowUI) + .build() + .awaitAndCheck(); + } + + private static JFrame createAndShowUI() { + JFrame frame = new JFrame("bug4613811 - JTabbedPane Test"); + final JTabbedPane tabPane = new JTabbedPane(JTabbedPane.TOP, + JTabbedPane.SCROLL_TAB_LAYOUT); + for (int i = 1; i <= 5; i++) { + tabPane.addTab("TabbedPane: Tab " + i, null, new JLabel("Tab " + i)); + } + frame.add(tabPane, BorderLayout.CENTER); + frame.setResizable(false); + frame.setSize(400, 200); + return frame; + } +} diff --git a/test/jdk/javax/swing/JWindow/bug4251781.java b/test/jdk/javax/swing/JWindow/bug4251781.java new file mode 100644 index 000000000000..0152db71f249 --- /dev/null +++ b/test/jdk/javax/swing/JWindow/bug4251781.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2000, 2025, 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 4251781 + * @summary Tests that JWindow repaint is optimized (background is not + cleared). + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4251781 + */ + +import java.awt.Color; +import java.awt.Container; +import javax.swing.JButton; +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; +import javax.swing.JWindow; + +public class bug4251781 { + private static final String INSTRUCTIONS = """ + Press the button at the bottom-right corner of the gray + window with the mouse. + If the window DOES NOT flicker when you press and/or release + the mouse button press PASS else FAIL. + """; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(40) + .testUI(bug4251781::createAndShowUI) + .build() + .awaitAndCheck(); + } + + private static JWindow createAndShowUI() { + JWindow w = new JWindow(); + final Container pane = w.getContentPane(); + pane.setLayout(null); + pane.setBackground(Color.GRAY.darker()); + + final JPopupMenu popup = new JPopupMenu(); + popup.add(new JMenuItem("item 1")); + popup.add(new JMenuItem("exit")); + + JButton b = new JButton("menu"); + b.setBounds(350, 250, 50, 50); + b.addActionListener(ev -> popup.show(pane, 0, 0)); + pane.add(b); + + w.setSize(400, 300); + return w; + } +} From abff2b9b11ef63c1cac6d445680af2557d13d1fc Mon Sep 17 00:00:00 2001 From: Rui Li Date: Wed, 10 Sep 2025 16:13:30 +0000 Subject: [PATCH 021/323] 8320836: jtreg gtest runs should limit heap size Backport-of: ac9e51023fc34a82b795950a109af2397826adaa --- test/hotspot/jtreg/gtest/GTestWrapper.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/hotspot/jtreg/gtest/GTestWrapper.java b/test/hotspot/jtreg/gtest/GTestWrapper.java index 50998c2748a9..1bd9734e48c0 100644 --- a/test/hotspot/jtreg/gtest/GTestWrapper.java +++ b/test/hotspot/jtreg/gtest/GTestWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2025, 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 @@ -82,6 +82,7 @@ public static void main(String[] args) throws Throwable { command.add(execPath.toAbsolutePath().toString()); command.add("-jdk"); command.add(Utils.TEST_JDK); + command.add("-Xmx200m"); command.add("--gtest_output=xml:" + resultFile); command.add("--gtest_catch_exceptions=0"); for (String a : args) { From fe60baef2ac9f903ca23c77379639939f47eb14c Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Wed, 10 Sep 2025 16:44:53 +0000 Subject: [PATCH 022/323] 8353486: Open source Swing Tests - Set 4 Backport-of: 486a66469bc0c814d07e03ce0e7231b408a4d579 --- .../javax/swing/JFileChooser/bug4464774.java | 62 +++++++++ .../javax/swing/JFileChooser/bug4522756.java | 64 +++++++++ .../javax/swing/JFileChooser/bug4759934.java | 124 ++++++++++++++++++ .../javax/swing/JFileChooser/bug4943900.java | 118 +++++++++++++++++ .../javax/swing/JOptionPane/bug4194862.java | 94 +++++++++++++ 5 files changed, 462 insertions(+) create mode 100644 test/jdk/javax/swing/JFileChooser/bug4464774.java create mode 100644 test/jdk/javax/swing/JFileChooser/bug4522756.java create mode 100644 test/jdk/javax/swing/JFileChooser/bug4759934.java create mode 100644 test/jdk/javax/swing/JFileChooser/bug4943900.java create mode 100644 test/jdk/javax/swing/JOptionPane/bug4194862.java diff --git a/test/jdk/javax/swing/JFileChooser/bug4464774.java b/test/jdk/javax/swing/JFileChooser/bug4464774.java new file mode 100644 index 000000000000..368063e46cd8 --- /dev/null +++ b/test/jdk/javax/swing/JFileChooser/bug4464774.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2003, 2025, 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 4464774 + * @requires (os.family == "windows") + * @summary JFileChooser: selection of left-side folder buttons shown incorrectly + in Windows L&F + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4464774 + */ + +import javax.swing.JFileChooser; +import javax.swing.UIManager; + +public class bug4464774 { + private static final String INSTRUCTIONS = """ + Click any button from the buttons to the left + ("Documents", "Desktop", "My Computer" etc.) in FileChooser dialog. + When the button is toggled, it should be lowered and + should NOT have focus painted inside it (black dotted frame). + + If the above is true, press PASS else FAIL. + """; + + public static void main(String[] argv) throws Exception { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(65) + .rows(10) + .testUI(() -> { + JFileChooser jfc = new JFileChooser(); + jfc.setControlButtonsAreShown(false); + return jfc; + }) + .build() + .awaitAndCheck(); + } +} diff --git a/test/jdk/javax/swing/JFileChooser/bug4522756.java b/test/jdk/javax/swing/JFileChooser/bug4522756.java new file mode 100644 index 000000000000..87c430cfb1d6 --- /dev/null +++ b/test/jdk/javax/swing/JFileChooser/bug4522756.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2002, 2025, 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 4522756 + * @requires (os.family == "windows") + * @summary Verifies that the Desktop icon is not missing when + JFileChooser is opened for the first time. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4522756 + */ + +import javax.swing.JFileChooser; +import javax.swing.UIManager; + +public class bug4522756 { + private static final String INSTRUCTIONS = """ + Verify the following: + + 1. If Desktop icon image is present on the Desktop button + on the left panel of JFileChooser. + 2. Press Desktop button. Check that you actually + go up to the desktop. + + If the above is true, press PASS else FAIL. + """; + + public static void main(String[] args) throws Exception { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(50) + .rows(12) + .testUI(() -> { + JFileChooser jfc = new JFileChooser(); + jfc.setControlButtonsAreShown(false); + return jfc; + }) + .build() + .awaitAndCheck(); + } +} diff --git a/test/jdk/javax/swing/JFileChooser/bug4759934.java b/test/jdk/javax/swing/JFileChooser/bug4759934.java new file mode 100644 index 000000000000..08ccdebfb2be --- /dev/null +++ b/test/jdk/javax/swing/JFileChooser/bug4759934.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @key headful + * @bug 4759934 + * @summary windows activation problem + * @library /javax/swing/regtesthelpers + * @build Util + * @run main bug4759934 + */ + +import java.awt.Dialog; +import java.awt.Point; +import java.awt.Robot; +import java.awt.event.KeyEvent; +import java.awt.event.MouseEvent; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.SwingUtilities; + +public class bug4759934 { + private static JFrame fr; + private static Dialog dlg; + private static JFileChooser jfc; + + private static JButton frameBtn; + private static JButton dialogBtn; + + public static void main(String[] args) throws Exception { + try { + Robot robot = new Robot(); + robot.setAutoWaitForIdle(true); + robot.setAutoDelay(50); + + SwingUtilities.invokeAndWait(bug4759934::createTestUI); + robot.waitForIdle(); + robot.delay(1000); + + Point frameBtnLoc = Util.getCenterPoint(frameBtn); + robot.mouseMove(frameBtnLoc.x, frameBtnLoc.y); + robot.mousePress(MouseEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(MouseEvent.BUTTON1_DOWN_MASK); + robot.delay(500); + + Point dlgBtnLoc = Util.getCenterPoint(dialogBtn); + robot.mouseMove(dlgBtnLoc.x , dlgBtnLoc.y); + robot.mousePress(MouseEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(MouseEvent.BUTTON1_DOWN_MASK); + robot.delay(500); + + robot.keyPress(KeyEvent.VK_ESCAPE); + robot.keyRelease(KeyEvent.VK_ESCAPE); + robot.delay(500); + + SwingUtilities.invokeAndWait(() -> { + if (frameBtn.hasFocus() && !dialogBtn.hasFocus()) { + throw new RuntimeException("Test failed! Focus was passed back" + + " to Frame instead of Dialog"); + } + }); + } finally { + SwingUtilities.invokeAndWait(() -> { + if (dlg != null) { + dlg.dispose(); + } + if (fr != null) { + fr.dispose(); + } + }); + } + } + + private static void createTestUI() { + fr = new JFrame("bug4759934 - JFrame"); + + frameBtn = new JButton("Show Dialog"); + frameBtn.addActionListener(e -> createDialog()); + fr.add(frameBtn); + + fr.setSize(300, 200); + fr.setLocationRelativeTo(null); + fr.setVisible(true); + } + + private static void createDialog() { + dlg = new JDialog(fr, "bug4759934 - JDialog"); + + dialogBtn = new JButton("Show FileChooser"); + dlg.add(dialogBtn); + + dialogBtn.addActionListener(e -> { + jfc = new JFileChooser(); + jfc.showOpenDialog(dlg); + }); + + dlg.setSize(300, 200); + dlg.setLocation(fr.getX() + fr.getWidth() + 10, fr.getY()); + dlg.setVisible(true); + } +} diff --git a/test/jdk/javax/swing/JFileChooser/bug4943900.java b/test/jdk/javax/swing/JFileChooser/bug4943900.java new file mode 100644 index 000000000000..0cea17e764cc --- /dev/null +++ b/test/jdk/javax/swing/JFileChooser/bug4943900.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2004, 2025, 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 4943900 + * @summary Tests that FileFilter combo box is shown in FileChooser + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4943900 + */ + +import java.io.File; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.UIManager; +import javax.swing.filechooser.FileFilter; + +public class bug4943900 { + private static final String INSTRUCTIONS = """ + +
        +
      1. When the test runs, a JFileChooser will be displayed. +
      2. Ensure that there is a filter combo box with these two items: +
          +
        • Text Files (*.txt) + — [must be selected when the dialog opens] +
        • All Files +
        +
      3. Leave the Text files item selected and check that the + filter works: only *.txt files can appear in the file list. + You can navigate directories in the file chooser and find one + that contains some *.txt files to ensure they are shown in + the file list. On macOS when the text filter is applied verify + that the non-text files are greyed out. +
      4. Try switching the filters and ensure that the file list + is updated properly. +
      5. If the FileFilter works correctly, + press Pass else press Fail. +
      + + """; + + public static void main(String[] args) throws Exception { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + + PassFailJFrame.builder() + .title("bug4943900 Test Instructions") + .instructions(INSTRUCTIONS) + .rows(14) + .columns(50) + .testUI(bug4943900::createAndShowUI) + .build() + .awaitAndCheck(); + } + + public static JFrame createAndShowUI() { + JFileChooser fc = new JFileChooser(); + fc.setControlButtonsAreShown(false); + TextFileFilter filter = new TextFileFilter(); + fc.setFileFilter(filter); + + JFrame frame = new JFrame("bug4943900 - JFileChooser"); + frame.add(fc); + frame.pack(); + return frame; + } + + private static final class TextFileFilter extends FileFilter { + @Override + public boolean accept(File f) { + if (f != null) { + if (f.isDirectory()) { + return true; + } + String extension = getExtension(f); + return extension != null && extension.equals("txt"); + } + return false; + } + + @Override + public String getDescription() { + return "Text Files (*.txt)"; + } + + private static String getExtension(File f) { + if (f != null) { + String filename = f.getName(); + int i = filename.lastIndexOf('.'); + if (i > 0 && i < filename.length() - 1) { + return filename.substring(i + 1).toLowerCase(); + } + } + return null; + } + } +} diff --git a/test/jdk/javax/swing/JOptionPane/bug4194862.java b/test/jdk/javax/swing/JOptionPane/bug4194862.java new file mode 100644 index 000000000000..2a2822ebf1d3 --- /dev/null +++ b/test/jdk/javax/swing/JOptionPane/bug4194862.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2000, 2025, 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 4194862 + * @summary Tests that internal frame-based dialogs are centered relative + to their parents + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4194862 + */ + +import javax.swing.JButton; +import javax.swing.JDesktopPane; +import javax.swing.JFrame; +import javax.swing.JInternalFrame; +import javax.swing.JOptionPane; + +public class bug4194862 { + private static final String INSTRUCTIONS = """ + In the internal frame titled "Main", + click the "Show JOptionPane Dialog" button. + A dialog will appear. It should be centered with + respect to the JInternalFrame - "Main". + + If the above is true then click on JOptionPane's "YES" button + to PASS else click JOptionPane's "NO" button to FAIL the test. + """; + + public static void main(String[] args) throws Exception{ + PassFailJFrame.builder() + .title("Instructions") + .instructions(INSTRUCTIONS) + .columns(40) + .testUI(bug4194862::createAndShowUI) + .screenCapture() + .build() + .awaitAndCheck(); + } + + private static JFrame createAndShowUI() { + JFrame frame = new JFrame("bug4194862 - JInternalFrame JOptionPane"); + JDesktopPane desktop = new JDesktopPane(); + frame.add(desktop); + JInternalFrame jInternalFrame = new JInternalFrame("Main", true); + desktop.add(jInternalFrame); + jInternalFrame.setBounds(5, 30, 390, 240); + jInternalFrame.setVisible(true); + + JButton b = new JButton("Show JOptionPane Dialog"); + b.addActionListener(e -> { + int retVal = JOptionPane.showInternalConfirmDialog( + jInternalFrame, "Am I centered?", + "bug4194862 JOptionPane", JOptionPane.YES_NO_OPTION); + switch (retVal) { + case JOptionPane.YES_OPTION -> PassFailJFrame.forcePass(); + case JOptionPane.NO_OPTION -> + PassFailJFrame.forceFail("JOptionPane isn't centered" + + " within JInternalFrame \"Main\""); + } + }); + jInternalFrame.add(b); + + for (int i = 0; i < 4; i++) { + JInternalFrame f = new JInternalFrame("JIF: "+ i); + f.setBounds(i * 50, i * 33, 120, 120); + f.setVisible(true); + desktop.add(f); + } + frame.setSize(450, 400); + return frame; + } +} From 025f8ae9eed16084b7686ec43152d47a86df14fc Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Wed, 10 Sep 2025 16:45:16 +0000 Subject: [PATCH 023/323] 8354340: Open source Swing Tests - Set 6 Backport-of: 76dec47f00230214e9ba58714be5a3ad26f8308d --- .../JViewport/ScrollRectToVisibleTest3.java | 165 ++++++++++++++++++ .../javax/swing/JViewport/SetViewRepaint.java | 114 ++++++++++++ 2 files changed, 279 insertions(+) create mode 100644 test/jdk/javax/swing/JViewport/ScrollRectToVisibleTest3.java create mode 100644 test/jdk/javax/swing/JViewport/SetViewRepaint.java diff --git a/test/jdk/javax/swing/JViewport/ScrollRectToVisibleTest3.java b/test/jdk/javax/swing/JViewport/ScrollRectToVisibleTest3.java new file mode 100644 index 000000000000..bf96ab2fc46c --- /dev/null +++ b/test/jdk/javax/swing/JViewport/ScrollRectToVisibleTest3.java @@ -0,0 +1,165 @@ +/* + * Copyright (c) 1999, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @key headful + * @bug 4217252 + * @summary Verify that scrolling beyond the visible region and scrolling + * a component smaller than the viewport is not allowed. + * @library /javax/swing/regtesthelpers + * @build Util + * @run main/othervm -Dsun.java2d.uiScale=1 ScrollRectToVisibleTest3 + */ + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.SwingUtilities; +import javax.swing.table.AbstractTableModel; + +public class ScrollRectToVisibleTest3 { + private static JFrame frame; + private static JTable table; + private static JButton scrollButton; + private static volatile int clickCount = 0; + private static final String[] EXPECTED_TEXT = {"99 x 0", "98 x 0", + "97 x 0", "96 x 0"}; + public static void main(String[] args) throws Exception { + Robot robot = new Robot(); + robot.setAutoWaitForIdle(true); + + SwingUtilities.invokeAndWait(ScrollRectToVisibleTest3::createTestUI); + robot.waitForIdle(); + robot.delay(1000); + + Rectangle frameBounds = Util.invokeOnEDT(() -> getComponentBounds(frame)); + robot.delay(100); + Point scrollBtnLoc = Util.getCenterPoint(scrollButton); + + robot.mouseMove(scrollBtnLoc.x, scrollBtnLoc.y); + robot.mousePress(MouseEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(MouseEvent.BUTTON1_DOWN_MASK); + robot.mousePress(MouseEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(MouseEvent.BUTTON1_DOWN_MASK); + robot.delay(50); + + int rowHeight = Util.invokeOnEDT(() -> table.getRowHeight()); + for (int i = 1; i <= 4; i++) { + robot.mouseMove(frameBounds.x + 50, + frameBounds.y + frameBounds.height - (rowHeight * i + 2)); + robot.delay(300); + robot.mousePress(MouseEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(MouseEvent.BUTTON1_DOWN_MASK); + // 500 ms delay added so that current mouseClicked event + // is processed successfully before proceeding to the next + robot.delay(500); + } + if (clickCount != 4) { + throw new RuntimeException("Test Failed! Expected 4 mouse clicks" + + " but got " + clickCount); + } + } + + private static void createTestUI() { + frame = new JFrame("ScrollRectToVisibleTest3"); + table = new JTable(new TestModel()); + table.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + JTable testTable = (JTable) e.getComponent(); + int row = testTable.getSelectedRow(); + int column = testTable.getSelectedColumn(); + String cellContent = testTable.getValueAt(row, column).toString(); + if (!EXPECTED_TEXT[clickCount].equals(cellContent)) { + throw new RuntimeException(("Test failed! Table Cell Content" + + " at (row %d , col %d)\n Expected: %s vs Actual: %s") + .formatted(row, column, + EXPECTED_TEXT[clickCount], cellContent)); + } + clickCount++; + } + }); + + scrollButton = new JButton("Scroll"); + scrollButton.addActionListener(ae -> { + Rectangle bounds = table.getBounds(); + bounds.y = bounds.height + table.getRowHeight(); + bounds.height = table.getRowHeight(); + System.out.println("scrolling: " + bounds); + table.scrollRectToVisible(bounds); + System.out.println("bounds: " + table.getVisibleRect()); + }); + + frame.add(scrollButton, BorderLayout.NORTH); + frame.add(new JScrollPane(table), BorderLayout.CENTER); + frame.setSize(400, 300); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } + + + private static class TestModel extends AbstractTableModel { + @Override + public String getColumnName(int column) { + return Integer.toString(column); + } + + @Override + public int getRowCount() { + return 100; + } + + @Override + public int getColumnCount() { + return 5; + } + + @Override + public Object getValueAt(int row, int col) { + return row + " x " + col; + } + + @Override + public boolean isCellEditable(int row, int column) { return false; } + + @Override + public void setValueAt(Object value, int row, int col) { + } + } + + private static Rectangle getComponentBounds(Component c) { + Point locationOnScreen = c.getLocationOnScreen(); + Dimension size = c.getSize(); + return new Rectangle(locationOnScreen, size); + } +} diff --git a/test/jdk/javax/swing/JViewport/SetViewRepaint.java b/test/jdk/javax/swing/JViewport/SetViewRepaint.java new file mode 100644 index 000000000000..379a3e4e33b6 --- /dev/null +++ b/test/jdk/javax/swing/JViewport/SetViewRepaint.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 1999, 2025, 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 4128110 + * @summary Verify that JViewport.setViewportView() and JScrollPane.setViewport() + * force a re-layout and a repaint. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual SetViewRepaint + */ + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.GridLayout; +import java.awt.event.ActionListener; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JViewport; + +public class SetViewRepaint { + private static final String INSTRUCTIONS = """ + Verify the following two cases: + + 1) Press "JViewport.setViewportView()" button and verify that + the blue label is replaced by a scrolling list. + + 2) Press "JScrollPane.setViewport()" button and verify that + the red label is replaced by a scrolling list as well. + + In either case the display should update automatically after + pressing the button. + + If the above is true, press PASS else press FAIL. + """; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(30) + .testUI(SetViewRepaint::createTestUI) + .build() + .awaitAndCheck(); + } + + private static JFrame createTestUI() { + JFrame frame = new JFrame("SetViewRepaint"); + JPanel p1 = new JPanel(new BorderLayout()); + JPanel p2 = new JPanel(new BorderLayout()); + + JLabel label1 = new ColorLabel(Color.BLUE, "Blue Label"); + final JList list1 = new JList(new String[]{"one", "two", "three", "four"}); + final JScrollPane sp1 = new JScrollPane(label1); + ActionListener doSetViewportView = e -> sp1.setViewportView(list1); + JButton b1 = new JButton("JViewport.setViewportView()"); + b1.addActionListener(doSetViewportView); + p1.add(sp1, BorderLayout.CENTER); + p1.add(b1, BorderLayout.SOUTH); + + JLabel label2 = new ColorLabel(Color.RED, "Red Label"); + final JList list2 = new JList(new String[]{"five", "six", "seven", "eight"}); + final JScrollPane sp2 = new JScrollPane(label2); + ActionListener doSetViewport = e -> { + JViewport vp = new JViewport(); + vp.setView(list2); + sp2.setViewport(vp); + }; + JButton b2 = new JButton("JScrollPane.setViewport()"); + b2.addActionListener(doSetViewport); + p2.add(sp2, BorderLayout.CENTER); + p2.add(b2, BorderLayout.SOUTH); + frame.setLayout(new GridLayout(1, 2)); + frame.add(p1); + frame.add(p2); + frame.setResizable(false); + frame.setSize(500, 120); + return frame; + } + + private static class ColorLabel extends JLabel { + ColorLabel(Color color, String text) { + super(text); + setForeground(Color.WHITE); + setBackground(color); + setOpaque(true); + setHorizontalAlignment(CENTER); + } + } +} From 7054f65cff2887c8a3d5bd1989d63fa5c7c9e492 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Thu, 11 Sep 2025 16:36:27 +0000 Subject: [PATCH 024/323] 8354532: Open source JFileChooser Tests - Set 7 Backport-of: bd73127d7495244f93f941530db32b4559d45689 --- .../javax/swing/JFileChooser/bug4357012.java | 99 +++++++++++++++ .../javax/swing/JFileChooser/bug4926884.java | 114 ++++++++++++++++++ .../javax/swing/JFileChooser/bug5045464.java | 68 +++++++++++ .../javax/swing/JFileChooser/bug6515169.java | 106 ++++++++++++++++ 4 files changed, 387 insertions(+) create mode 100644 test/jdk/javax/swing/JFileChooser/bug4357012.java create mode 100644 test/jdk/javax/swing/JFileChooser/bug4926884.java create mode 100644 test/jdk/javax/swing/JFileChooser/bug5045464.java create mode 100644 test/jdk/javax/swing/JFileChooser/bug6515169.java diff --git a/test/jdk/javax/swing/JFileChooser/bug4357012.java b/test/jdk/javax/swing/JFileChooser/bug4357012.java new file mode 100644 index 000000000000..2dfdcd336d5f --- /dev/null +++ b/test/jdk/javax/swing/JFileChooser/bug4357012.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2002, 2025, 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 4357012 + * @requires (os.family == "windows") + * @summary JFileChooser.showSaveDialog inconsistent with Windows Save Dialog + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4357012 + */ + +import java.io.File; +import java.io.IOException; +import javax.swing.JComponent; +import javax.swing.JFileChooser; +import javax.swing.UIManager; + +public class bug4357012 { + private static File workDir = null; + private static File dir = null; + private static File file = null; + private static final String INSTRUCTIONS = """ + + Test is for Windows LAF only +

      In JFileChooser's files list : +

        +
      1. Select directory. Verify that the directory name doesn't + appear in "file name" field.
      2. +
      3. Select file. Verify that the file name appears in + "file name" field.
      4. +
      5. Select directory again. Verify that the previous file name + remains in file name field.
      6. +
      +

      + + """; + + public static void main(String[] argv) throws Exception { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + createTestDir(); + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .rows(10) + .columns(40) + .testUI(bug4357012::createTestUI) + .build() + .awaitAndCheck(); + } finally { + if (workDir != null) { + System.out.println("Deleting '" + file + "': " + file.delete()); + System.out.println("Deleting '" + dir + "': " + dir.delete()); + System.out.println("Deleting '" + workDir + "': " + workDir.delete()); + } + } + } + + private static void createTestDir() throws IOException { + String tempDir = "."; + String fs = System.getProperty("file.separator"); + + workDir = new File(tempDir + fs + "bug4357012"); + System.out.println("Creating '" + workDir + "': " + workDir.mkdir()); + + dir = new File(workDir + fs + "Directory"); + System.out.println("Creating '" + dir + "': " + dir.mkdir()); + + file = new File(workDir + fs + "File.txt"); + System.out.println("Creating '" + file + "': " + file.createNewFile()); + } + + private static JComponent createTestUI() { + JFileChooser fc = new JFileChooser(workDir); + fc.setDialogType(JFileChooser.SAVE_DIALOG); + return fc; + } +} diff --git a/test/jdk/javax/swing/JFileChooser/bug4926884.java b/test/jdk/javax/swing/JFileChooser/bug4926884.java new file mode 100644 index 000000000000..29d6c4e91345 --- /dev/null +++ b/test/jdk/javax/swing/JFileChooser/bug4926884.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2011, 2025, 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 4926884 + * @requires (os.family == "windows") + * @summary Win L&F: JFileChooser problems with "My Documents" folder + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4926884 + */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import javax.swing.JFileChooser; +import javax.swing.UIManager; + +public class bug4926884 { + private static final String INSTRUCTIONS = """ + Validate next statements step by step: + + 1. In the file list there are several dirs and files (like "ski", + "Snowboard" etc.) + 2. Select "Details" view mode. + 3. Make file list in focus (e.g. by pressing mouse button) + 4. Press key "w" several times with delay LESS than 1 second. + Selection should be changed across files started with letter "w" + (without case sensitive). + 5. Press key "w" several times with delay MORE than 1 second. + Selection should be changed across files started with letter "w" + (without case sensitive). + 6. Type "winnt" (with delay less than 1 second between letters) - + directory "winnt" should be selected. + 7. Change conditions: + - Move column "Name" to the second position + - Change sort mode by clicking column "Size" + 8. Repeat items 4-6 + + If above is true press PASS else FAIL + """; + + private static final String[] DIRS = {"www", "winnt", "ski"}; + private static final String[] FILES = {"Window", "weel", "mice", + "Wall", "Snowboard", "wood"}; + private static final File testDir = new File("."); + + public static void main(String[] argv) throws Exception { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + try { + createTestDir(); + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(40) + .testUI(() -> new JFileChooser(testDir)) + .build() + .awaitAndCheck(); + } finally { + deleteTempDir(); + } + } + + private static void createTestDir() throws IOException { + testDir.mkdir(); + + for (String dir : DIRS) { + new File(testDir, dir).mkdir(); + } + + for (int i = 0; i < FILES.length; i++) { + + try (OutputStream outputStream = new FileOutputStream( + new File(testDir, FILES[i]))) { + for (int j = 0; j < i * 1024; j++) { + outputStream.write('#'); + } + } + } + } + + private static void deleteTempDir() { + File[] files = testDir.listFiles(); + + for (File file : files) { + if (file != null) { + file.delete(); + } + } + + testDir.delete(); + } +} diff --git a/test/jdk/javax/swing/JFileChooser/bug5045464.java b/test/jdk/javax/swing/JFileChooser/bug5045464.java new file mode 100644 index 000000000000..0fbeedcec6bd --- /dev/null +++ b/test/jdk/javax/swing/JFileChooser/bug5045464.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2004, 2025, 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 5045464 + * @requires (os.family == "linux") + * @summary Regression: GTK L&F, JFileChooser shows "null/" in folder list + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug5045464 + */ + +import javax.swing.JComponent; +import javax.swing.JFileChooser; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; + +public class bug5045464 { + private static final String INSTRUCTIONS = """ + When the filechooser appears check the directory list (the left list). + If it starts with two items: "./" (current directory) + and "../" (parent directory) press PASS. + If something else is here (e.g. "null/" instead of "./") + press FAIL. + """; + + public static void main(String[] argv) throws Exception { + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(40) + .testUI(bug5045464::createTestUI) + .build() + .awaitAndCheck(); + } + + private static JComponent createTestUI() { + JFileChooser fc = new JFileChooser(); + fc.setControlButtonsAreShown(false); + try { + UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel"); + } catch (Exception ex) { + throw new RuntimeException("Test Failed!", ex); + } + SwingUtilities.updateComponentTreeUI(fc); + return fc; + } +} diff --git a/test/jdk/javax/swing/JFileChooser/bug6515169.java b/test/jdk/javax/swing/JFileChooser/bug6515169.java new file mode 100644 index 000000000000..98cd813eefb2 --- /dev/null +++ b/test/jdk/javax/swing/JFileChooser/bug6515169.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2011, 2025, 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 6515169 + * @requires (os.family == "windows") + * @summary wrong grid header in JFileChooser + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug6515169 + */ + +import javax.swing.ButtonGroup; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; + +public class bug6515169 { + private static JFrame frame; + private static final String INSTRUCTIONS = """ + This test is to verify JFileChooser on Windows and Metal LAF. + Use the "Change LaF" menu to switch between the 2 LaF + and verify the following. + + a. Change view mode to "Details" + b. Check that 4 columns appear: Name, Size, Type and Date Modified + c. Change current directory by pressing any available subdirectory + or by pressing button "Up One Level". + d. Check that still four columns exist. + + Change LaF and repeat the steps a-d. + If all conditions are true press PASS, else FAIL. + """; + + public static void main(String[] argv) throws Exception { + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(40) + .testUI(bug6515169::createTestUI) + .build() + .awaitAndCheck(); + } + + private static JFrame createTestUI() { + frame = new JFrame("bug6515169"); + JMenuBar bar = new JMenuBar(); + JMenu lafMenu = new JMenu("Change LaF"); + ButtonGroup lafGroup = new ButtonGroup(); + JCheckBoxMenuItem lafItem1 = new JCheckBoxMenuItem("Window LaF"); + lafItem1.addActionListener(e -> + setLaF(UIManager.getSystemLookAndFeelClassName())); + lafGroup.add(lafItem1); + lafMenu.add(lafItem1); + + JCheckBoxMenuItem lafItem2 = new JCheckBoxMenuItem("Metal LaF"); + lafItem2.addActionListener(e -> + setLaF(UIManager.getCrossPlatformLookAndFeelClassName())); + lafGroup.add(lafItem2); + lafMenu.add(lafItem2); + + bar.add(lafMenu); + frame.setJMenuBar(bar); + + String dir = "."; + JFileChooser fc = new JFileChooser(dir); + fc.setControlButtonsAreShown(false); + frame.add(fc); + frame.pack(); + + return frame; + } + + private static void setLaF(String laf) { + try { + UIManager.setLookAndFeel(laf); + SwingUtilities.updateComponentTreeUI(frame); + } catch (Exception e) { + throw new RuntimeException("Test Failed!", e); + } + } +} From 25ea228896e0aa248ec78711a450278f6318c2d4 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Thu, 11 Sep 2025 17:06:52 +0000 Subject: [PATCH 025/323] 8201183: sjavac build failures: "Connection attempt failed: Connection refused" Backport-of: ecc603ca9b441cbb7ad27fbc2529fcb0b1da1992 --- .../tools/javacserver/shared/PortFile.java | 44 ++++++++++--------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/make/langtools/tools/javacserver/shared/PortFile.java b/make/langtools/tools/javacserver/shared/PortFile.java index 2e4283a22b3b..b31e97cfeea3 100644 --- a/make/langtools/tools/javacserver/shared/PortFile.java +++ b/make/langtools/tools/javacserver/shared/PortFile.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, 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,17 +50,16 @@ public class PortFile { // Followed by a 4 byte int, with the port nr. // Followed by a 8 byte long, with cookie nr. - private String filename; - private File file; - private File stopFile; + private final String filename; + private final File file; + private final File stopFile; private RandomAccessFile rwfile; - private FileChannel channel; // FileLock used to solve inter JVM synchronization, lockSem used to avoid // JVM internal OverlappingFileLockExceptions. // Class invariant: lock.isValid() <-> lockSem.availablePermits() == 0 private FileLock lock; - private Semaphore lockSem = new Semaphore(1); + private final Semaphore lockSem = new Semaphore(1); private boolean containsPortInfo; private int serverPort; @@ -89,17 +88,18 @@ private void initializeChannel() throws PortFileInaccessibleException { } // The rwfile should only be readable by the owner of the process // and no other! How do we do that on a RandomAccessFile? - channel = rwfile.getChannel(); } /** * Lock the port file. */ public void lock() throws IOException, InterruptedException { - if (channel == null) { - initializeChannel(); - } lockSem.acquire(); + if (rwfile != null) { + throw new IllegalStateException("rwfile not null"); + } + initializeChannel(); + FileChannel channel = rwfile.getChannel(); lock = channel.lock(); } @@ -110,8 +110,7 @@ public void lock() throws IOException, InterruptedException { public void getValues() { containsPortInfo = false; if (lock == null) { - // Not locked, remain ignorant about port file contents. - return; + throw new IllegalStateException("Must lock before calling getValues"); } try { if (rwfile.length()>0) { @@ -156,6 +155,9 @@ public long getCookie() { * Store the values into the locked port file. */ public void setValues(int port, long cookie) throws IOException { + if (lock == null) { + throw new IllegalStateException("Must lock before calling setValues"); + } rwfile.seek(0); // Write the magic nr that identifies a port file. rwfile.writeInt(magicNr); @@ -169,19 +171,19 @@ public void setValues(int port, long cookie) throws IOException { * Delete the port file. */ public void delete() throws IOException, InterruptedException { - // Access to file must be closed before deleting. - rwfile.close(); - - file.delete(); - - // Wait until file has been deleted (deletes are asynchronous on Windows!) otherwise we + if (!file.exists()) { // file deleted already + return; + } + // Keep trying until file has been deleted, otherwise we // might shutdown the server and prevent another one from starting. - for (int i = 0; i < 10 && file.exists(); i++) { + for (int i = 0; i < 10 && file.exists() && !file.delete(); i++) { Thread.sleep(1000); } if (file.exists()) { throw new IOException("Failed to delete file."); } + // allow some time for late clients to connect + Thread.sleep(1000); } /** @@ -210,10 +212,12 @@ public boolean markedForStop() throws IOException { */ public void unlock() throws IOException { if (lock == null) { - return; + throw new IllegalStateException("Not locked"); } lock.release(); lock = null; + rwfile.close(); + rwfile = null; lockSem.release(); } From b0687267084347ca845d959d4e9ae9d717ef65ec Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Thu, 11 Sep 2025 17:11:14 +0000 Subject: [PATCH 026/323] 8334217: [AIX] Misleading error messages after JDK-8320005 Backport-of: 871362870ea8dc5f4ac186876e91023116891a5b --- src/hotspot/os/aix/os_aix.cpp | 11 ++++++----- src/hotspot/os/aix/porting_aix.cpp | 5 ++++- src/hotspot/os/aix/porting_aix.hpp | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/hotspot/os/aix/os_aix.cpp b/src/hotspot/os/aix/os_aix.cpp index ddc4aea555fd..15e5770b7200 100644 --- a/src/hotspot/os/aix/os_aix.cpp +++ b/src/hotspot/os/aix/os_aix.cpp @@ -1108,7 +1108,7 @@ bool os::dll_address_to_library_name(address addr, char* buf, return true; } -static void* dll_load_library(const char *filename, char *ebuf, int ebuflen) { +static void* dll_load_library(const char *filename, int *eno, char *ebuf, int ebuflen) { log_info(os)("attempting shared library load of %s", filename); if (ebuf && ebuflen > 0) { @@ -1135,7 +1135,7 @@ static void* dll_load_library(const char *filename, char *ebuf, int ebuflen) { void* result; const char* error_report = nullptr; - result = Aix_dlopen(filename, dflags, &error_report); + result = Aix_dlopen(filename, dflags, eno, &error_report); if (result != nullptr) { Events::log_dll_message(nullptr, "Loaded shared library %s", filename); // Reload dll cache. Don't do this in signal handling. @@ -1166,12 +1166,13 @@ void *os::dll_load(const char *filename, char *ebuf, int ebuflen) { const char new_extension[] = ".a"; STATIC_ASSERT(sizeof(old_extension) >= sizeof(new_extension)); // First try to load the existing file. - result = dll_load_library(filename, ebuf, ebuflen); + int eno=0; + result = dll_load_library(filename, &eno, ebuf, ebuflen); // If the load fails,we try to reload by changing the extension to .a for .so files only. // Shared object in .so format dont have braces, hence they get removed for archives with members. - if (result == nullptr && pointer_to_dot != nullptr && strcmp(pointer_to_dot, old_extension) == 0) { + if (result == nullptr && eno == ENOENT && pointer_to_dot != nullptr && strcmp(pointer_to_dot, old_extension) == 0) { snprintf(pointer_to_dot, sizeof(old_extension), "%s", new_extension); - result = dll_load_library(file_path, ebuf, ebuflen); + result = dll_load_library(file_path, &eno, ebuf, ebuflen); } FREE_C_HEAP_ARRAY(char, file_path); return result; diff --git a/src/hotspot/os/aix/porting_aix.cpp b/src/hotspot/os/aix/porting_aix.cpp index 630bdf22c447..12aa6fb4a5ec 100644 --- a/src/hotspot/os/aix/porting_aix.cpp +++ b/src/hotspot/os/aix/porting_aix.cpp @@ -1035,7 +1035,7 @@ static bool search_file_in_LIBPATH(const char* path, struct stat64x* stat) { // specific AIX versions for ::dlopen() and ::dlclose(), which handles the struct g_handletable // This way we mimic dl handle equality for a library // opened a second time, as it is implemented on other platforms. -void* Aix_dlopen(const char* filename, int Flags, const char** error_report) { +void* Aix_dlopen(const char* filename, int Flags, int *eno, const char** error_report) { assert(error_report != nullptr, "error_report is nullptr"); void* result; struct stat64x libstat; @@ -1047,6 +1047,7 @@ void* Aix_dlopen(const char* filename, int Flags, const char** error_report) { assert(result == nullptr, "dll_load: Could not stat() file %s, but dlopen() worked; Have to improve stat()", filename); #endif *error_report = "Could not load module .\nSystem error: No such file or directory"; + *eno = ENOENT; return nullptr; } else { @@ -1090,6 +1091,7 @@ void* Aix_dlopen(const char* filename, int Flags, const char** error_report) { p_handletable = new_tab; } // Library not yet loaded; load it, then store its handle in handle table + errno = 0; result = ::dlopen(filename, Flags); if (result != nullptr) { g_handletable_used++; @@ -1101,6 +1103,7 @@ void* Aix_dlopen(const char* filename, int Flags, const char** error_report) { } else { // error analysis when dlopen fails + *eno = errno; *error_report = ::dlerror(); if (*error_report == nullptr) { *error_report = "dlerror returned no error description"; diff --git a/src/hotspot/os/aix/porting_aix.hpp b/src/hotspot/os/aix/porting_aix.hpp index 109eceee3fca..15f1e0afc549 100644 --- a/src/hotspot/os/aix/porting_aix.hpp +++ b/src/hotspot/os/aix/porting_aix.hpp @@ -115,6 +115,6 @@ class AixMisc { }; -void* Aix_dlopen(const char* filename, int Flags, const char** error_report); +void* Aix_dlopen(const char* filename, int Flags, int *eno, const char** error_report); #endif // OS_AIX_PORTING_AIX_HPP From c516927df2611989bdb6a9833adfc44b31f3ae1f Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Thu, 11 Sep 2025 17:14:05 +0000 Subject: [PATCH 027/323] 8245545: Disable TLS_RSA cipher suites Backport-of: 882d6358074135b2c4fe21b32bd73f40022980bc --- .../share/conf/security/java.security | 2 +- test/jdk/javax/net/ssl/DTLS/CipherSuite.java | 8 +++---- test/jdk/javax/net/ssl/SSLEngine/Basics.java | 5 +++-- .../net/ssl/SSLEngine/EngineCloseOnAlert.java | 8 +++++-- .../net/ssl/TLSv11/GenericBlockCipher.java | 6 ++--- .../javax/net/ssl/TLSv12/ProtocolFilter.java | 7 +++++- .../ssl/ciphersuites/DisabledAlgorithms.java | 12 +++++++--- .../ciphersuites/CheckCipherSuites.java | 22 ++----------------- .../SystemPropCipherSuitesOrder.java | 19 +++++++++++++--- .../ciphersuites/TLSCipherSuitesOrder.java | 4 +++- .../pkcs11/tls/tls12/FipsModeTLS12.java | 5 +++++ .../ssl/ClientHandshaker/LengthCheckTest.java | 6 ++--- .../EngineArgs/DebugReportsOneExtraByte.java | 6 ++--- 13 files changed, 64 insertions(+), 46 deletions(-) diff --git a/src/java.base/share/conf/security/java.security b/src/java.base/share/conf/security/java.security index b7f0c913bf59..182da95d1d1c 100644 --- a/src/java.base/share/conf/security/java.security +++ b/src/java.base/share/conf/security/java.security @@ -784,7 +784,7 @@ http.auth.digest.disabledAlgorithms = MD5, SHA-1 # rsa_pkcs1_sha1, secp224r1, TLS_RSA_* jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, DTLSv1.0, RC4, DES, \ MD5withRSA, DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \ - ECDH + ECDH, TLS_RSA_* # # Legacy algorithms for Secure Socket Layer/Transport Layer Security (SSL/TLS) diff --git a/test/jdk/javax/net/ssl/DTLS/CipherSuite.java b/test/jdk/javax/net/ssl/DTLS/CipherSuite.java index 7ad8206a37e7..b96032fd7819 100644 --- a/test/jdk/javax/net/ssl/DTLS/CipherSuite.java +++ b/test/jdk/javax/net/ssl/DTLS/CipherSuite.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, 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 @@ -33,16 +33,16 @@ * jdk.crypto.ec * @library /test/lib * @build DTLSOverDatagram - * @run main/othervm CipherSuite TLS_RSA_WITH_AES_128_CBC_SHA + * @run main/othervm CipherSuite TLS_RSA_WITH_AES_128_CBC_SHA re-enable * @run main/othervm CipherSuite TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 - * @run main/othervm CipherSuite TLS_RSA_WITH_AES_128_CBC_SHA256 + * @run main/othervm CipherSuite TLS_RSA_WITH_AES_128_CBC_SHA256 re-enable * @run main/othervm CipherSuite TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 * @run main/othervm CipherSuite TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA * @run main/othervm CipherSuite TLS_DHE_RSA_WITH_AES_128_CBC_SHA * @run main/othervm CipherSuite TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA re-enable * @run main/othervm CipherSuite TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 * @run main/othervm CipherSuite TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - * @run main/othervm CipherSuite TLS_RSA_WITH_AES_128_GCM_SHA256 + * @run main/othervm CipherSuite TLS_RSA_WITH_AES_128_GCM_SHA256 re-enable * @run main/othervm CipherSuite TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 re-enable * @run main/othervm CipherSuite TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 * @run main/othervm CipherSuite TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 diff --git a/test/jdk/javax/net/ssl/SSLEngine/Basics.java b/test/jdk/javax/net/ssl/SSLEngine/Basics.java index 3239bfd4ce99..0ee7bfd7738d 100644 --- a/test/jdk/javax/net/ssl/SSLEngine/Basics.java +++ b/test/jdk/javax/net/ssl/SSLEngine/Basics.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, 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,7 +57,8 @@ public class Basics { "/" + TRUSTSTORE_FILE; public static void main(String[] args) throws Exception { - SecurityUtils.removeFromDisabledTlsAlgs("TLSv1.1"); + // Re-enable TLSv1.1 and TLS_RSA_* since test depends on it. + SecurityUtils.removeFromDisabledTlsAlgs("TLSv1.1", "TLS_RSA_*"); runTest("TLSv1.3", "TLS_AES_256_GCM_SHA384"); runTest("TLSv1.2", "TLS_RSA_WITH_AES_256_GCM_SHA384"); diff --git a/test/jdk/javax/net/ssl/SSLEngine/EngineCloseOnAlert.java b/test/jdk/javax/net/ssl/SSLEngine/EngineCloseOnAlert.java index 7a4f71d8171d..57eda1c2a42e 100644 --- a/test/jdk/javax/net/ssl/SSLEngine/EngineCloseOnAlert.java +++ b/test/jdk/javax/net/ssl/SSLEngine/EngineCloseOnAlert.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2024, 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,7 +26,8 @@ * @bug 8133632 * @summary javax.net.ssl.SSLEngine does not properly handle received * SSL fatal alerts - * @run main EngineCloseOnAlert + * @library /test/lib + * @run main/othervm EngineCloseOnAlert */ import java.io.FileInputStream; @@ -36,6 +37,7 @@ import java.util.*; import java.security.*; import static javax.net.ssl.SSLEngineResult.HandshakeStatus.*; +import jdk.test.lib.security.SecurityUtils; public class EngineCloseOnAlert { @@ -61,6 +63,8 @@ public interface TestCase { } public static void main(String[] args) throws Exception { + // Re-enable TLS_RSA_* since test depends on it. + SecurityUtils.removeFromDisabledTlsAlgs("TLS_RSA_*"); int failed = 0; List testMatrix = new LinkedList() {{ add(clientReceivesAlert); diff --git a/test/jdk/javax/net/ssl/TLSv11/GenericBlockCipher.java b/test/jdk/javax/net/ssl/TLSv11/GenericBlockCipher.java index cb67903287e8..a634424b3d7e 100644 --- a/test/jdk/javax/net/ssl/TLSv11/GenericBlockCipher.java +++ b/test/jdk/javax/net/ssl/TLSv11/GenericBlockCipher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2024, 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 @@ -172,8 +172,8 @@ void doClientSide() throws Exception { volatile Exception clientException = null; public static void main(String[] args) throws Exception { - // Re-enable TLSv1.1 since test depends on it. - SecurityUtils.removeFromDisabledTlsAlgs("TLSv1.1"); + // Re-enable TLSv1.1 and TLS_RSA_* since test depends on it. + SecurityUtils.removeFromDisabledTlsAlgs("TLSv1.1", "TLS_RSA_*"); String keyFilename = System.getProperty("test.src", ".") + "/" + pathToStores + diff --git a/test/jdk/javax/net/ssl/TLSv12/ProtocolFilter.java b/test/jdk/javax/net/ssl/TLSv12/ProtocolFilter.java index ec58bc74d0cf..3291096af485 100644 --- a/test/jdk/javax/net/ssl/TLSv12/ProtocolFilter.java +++ b/test/jdk/javax/net/ssl/TLSv12/ProtocolFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2024, 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 @@ -28,6 +28,7 @@ * @test * @bug 8052406 * @summary SSLv2Hello protocol may be filter out unexpectedly + * @library /test/lib * @run main/othervm ProtocolFilter */ @@ -35,6 +36,8 @@ import java.net.*; import javax.net.ssl.*; +import jdk.test.lib.security.SecurityUtils; + public class ProtocolFilter { /* @@ -156,6 +159,8 @@ void doClientSide() throws Exception { volatile Exception clientException = null; public static void main(String[] args) throws Exception { + // Re-enable TLS_RSA_* since test depends on it. + SecurityUtils.removeFromDisabledTlsAlgs("TLS_RSA_*"); String keyFilename = System.getProperty("test.src", ".") + "/" + pathToStores + "/" + keyStoreFile; diff --git a/test/jdk/javax/net/ssl/ciphersuites/DisabledAlgorithms.java b/test/jdk/javax/net/ssl/ciphersuites/DisabledAlgorithms.java index 994169a71829..8db1dfdeac82 100644 --- a/test/jdk/javax/net/ssl/ciphersuites/DisabledAlgorithms.java +++ b/test/jdk/javax/net/ssl/ciphersuites/DisabledAlgorithms.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 8076221 8211883 8163327 8279164 + * @bug 8076221 8211883 8163327 8279164 8245545 * @summary Check if weak cipher suites are disabled * @library /javax/net/ssl/templates * @modules jdk.crypto.ec @@ -124,7 +124,13 @@ public class DisabledAlgorithms { "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA", "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA", "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA", - "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA" + "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA", + "TLS_RSA_WITH_AES_256_GCM_SHA384", + "TLS_RSA_WITH_AES_128_GCM_SHA256", + "TLS_RSA_WITH_AES_256_CBC_SHA256", + "TLS_RSA_WITH_AES_128_CBC_SHA256", + "TLS_RSA_WITH_AES_256_CBC_SHA", + "TLS_RSA_WITH_AES_128_CBC_SHA" }; public static void main(String[] args) throws Exception { diff --git a/test/jdk/javax/net/ssl/sanity/ciphersuites/CheckCipherSuites.java b/test/jdk/javax/net/ssl/sanity/ciphersuites/CheckCipherSuites.java index caa96cdb224e..847c69112a0c 100644 --- a/test/jdk/javax/net/ssl/sanity/ciphersuites/CheckCipherSuites.java +++ b/test/jdk/javax/net/ssl/sanity/ciphersuites/CheckCipherSuites.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2024, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 4750141 4895631 8217579 8163326 8279164 + * @bug 4750141 4895631 8217579 8163326 8279164 8245545 * @summary Check enabled and supported ciphersuites are correct * @run main/othervm CheckCipherSuites default * @run main/othervm CheckCipherSuites limited @@ -99,12 +99,6 @@ public class CheckCipherSuites { "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", // deprecated - "TLS_RSA_WITH_AES_256_GCM_SHA384", - "TLS_RSA_WITH_AES_128_GCM_SHA256", - "TLS_RSA_WITH_AES_256_CBC_SHA256", - "TLS_RSA_WITH_AES_128_CBC_SHA256", - "TLS_RSA_WITH_AES_256_CBC_SHA", - "TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_EMPTY_RENEGOTIATION_INFO_SCSV" }; @@ -124,9 +118,6 @@ public class CheckCipherSuites { "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", "TLS_DHE_RSA_WITH_AES_128_CBC_SHA", "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", - "TLS_RSA_WITH_AES_128_GCM_SHA256", - "TLS_RSA_WITH_AES_128_CBC_SHA256", - "TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_EMPTY_RENEGOTIATION_INFO_SCSV" }; @@ -194,12 +185,6 @@ public class CheckCipherSuites { "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", // deprecated - "TLS_RSA_WITH_AES_256_GCM_SHA384", - "TLS_RSA_WITH_AES_128_GCM_SHA256", - "TLS_RSA_WITH_AES_256_CBC_SHA256", - "TLS_RSA_WITH_AES_128_CBC_SHA256", - "TLS_RSA_WITH_AES_256_CBC_SHA", - "TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_EMPTY_RENEGOTIATION_INFO_SCSV" }; @@ -219,9 +204,6 @@ public class CheckCipherSuites { "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", "TLS_DHE_RSA_WITH_AES_128_CBC_SHA", "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", - "TLS_RSA_WITH_AES_128_GCM_SHA256", - "TLS_RSA_WITH_AES_128_CBC_SHA256", - "TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_EMPTY_RENEGOTIATION_INFO_SCSV" }; diff --git a/test/jdk/javax/net/ssl/sanity/ciphersuites/SystemPropCipherSuitesOrder.java b/test/jdk/javax/net/ssl/sanity/ciphersuites/SystemPropCipherSuitesOrder.java index 2817e3400ab3..6492e6508de2 100644 --- a/test/jdk/javax/net/ssl/sanity/ciphersuites/SystemPropCipherSuitesOrder.java +++ b/test/jdk/javax/net/ssl/sanity/ciphersuites/SystemPropCipherSuitesOrder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, 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 @@ -21,6 +21,7 @@ * questions. */ import java.util.Arrays; +import java.util.stream.Stream; import javax.net.ssl.SSLServerSocket; import javax.net.ssl.SSLSocket; @@ -86,8 +87,20 @@ public static void main(String[] args) { clientcipherSuites = toArray(System.getProperty("jdk.tls.client.cipherSuites")); System.out.printf("SYSTEM PROPERTIES: ServerProp:%s - ClientProp:%s%n", - Arrays.deepToString(servercipherSuites), - Arrays.deepToString(clientcipherSuites)); + Arrays.deepToString(servercipherSuites), + Arrays.deepToString(clientcipherSuites)); + + // Re-enable TLS_RSA_* cipher suites if needed since test depends on it. + if (Stream.concat( + Arrays.stream( + servercipherSuites == null + ? new String[0] : servercipherSuites), + Arrays.stream( + clientcipherSuites == null + ? new String[0] : clientcipherSuites)) + .anyMatch(s -> s.startsWith("TLS_RSA_"))) { + SecurityUtils.removeFromDisabledTlsAlgs("TLS_RSA_*"); + } try { new SystemPropCipherSuitesOrder(args[0]).run(); diff --git a/test/jdk/javax/net/ssl/sanity/ciphersuites/TLSCipherSuitesOrder.java b/test/jdk/javax/net/ssl/sanity/ciphersuites/TLSCipherSuitesOrder.java index c2171d808891..2ce46eb84713 100644 --- a/test/jdk/javax/net/ssl/sanity/ciphersuites/TLSCipherSuitesOrder.java +++ b/test/jdk/javax/net/ssl/sanity/ciphersuites/TLSCipherSuitesOrder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, 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 @@ -58,6 +58,8 @@ public class TLSCipherSuitesOrder extends SSLSocketTemplate { private final String[] clientcipherSuites; public static void main(String[] args) { + // Re-enable TLS_RSA_* since test depends on it. + SecurityUtils.removeFromDisabledTlsAlgs("TLS_RSA_*"); PROTOCOL protocol = PROTOCOL.valueOf(args[0]); try { new TLSCipherSuitesOrder(protocol.getProtocol(), diff --git a/test/jdk/sun/security/pkcs11/tls/tls12/FipsModeTLS12.java b/test/jdk/sun/security/pkcs11/tls/tls12/FipsModeTLS12.java index 1f6886f2d692..a91bbac46519 100644 --- a/test/jdk/sun/security/pkcs11/tls/tls12/FipsModeTLS12.java +++ b/test/jdk/sun/security/pkcs11/tls/tls12/FipsModeTLS12.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2019, Red Hat, Inc. + * Copyright (c) 2024, 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 @@ -63,6 +64,7 @@ import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManagerFactory; +import jdk.test.lib.security.SecurityUtils; import sun.security.internal.spec.TlsMasterSecretParameterSpec; import sun.security.internal.spec.TlsPrfParameterSpec; import sun.security.internal.spec.TlsRsaPremasterSecretParameterSpec; @@ -80,6 +82,9 @@ public final class FipsModeTLS12 extends SecmodTest { private static PublicKey publicKey; public static void main(String[] args) throws Exception { + // Re-enable TLS_RSA_* since test depends on it. + SecurityUtils.removeFromDisabledTlsAlgs("TLS_RSA_*"); + try { initialize(); } catch (Exception e) { diff --git a/test/jdk/sun/security/ssl/ClientHandshaker/LengthCheckTest.java b/test/jdk/sun/security/ssl/ClientHandshaker/LengthCheckTest.java index 6c9dd847ee91..3aecb84bd940 100644 --- a/test/jdk/sun/security/ssl/ClientHandshaker/LengthCheckTest.java +++ b/test/jdk/sun/security/ssl/ClientHandshaker/LengthCheckTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, 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 @@ -270,8 +270,8 @@ public void execTest() throws Exception { * Main entry point for this test. */ public static void main(String args[]) throws Exception { - // Re-enable TLSv1 since test depends on it. - SecurityUtils.removeFromDisabledTlsAlgs("TLSv1"); + // Re-enable TLSv1 and TLS_RSA_* since test depends on it. + SecurityUtils.removeFromDisabledTlsAlgs("TLSv1", "TLS_RSA_*"); List ccsTests = new ArrayList<>(); diff --git a/test/jdk/sun/security/ssl/EngineArgs/DebugReportsOneExtraByte.java b/test/jdk/sun/security/ssl/EngineArgs/DebugReportsOneExtraByte.java index 7632fcf462f9..1446ad786e4d 100644 --- a/test/jdk/sun/security/ssl/EngineArgs/DebugReportsOneExtraByte.java +++ b/test/jdk/sun/security/ssl/EngineArgs/DebugReportsOneExtraByte.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, 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 @@ -100,8 +100,8 @@ public static void main(String args[]) throws Exception { System.out.println("Test Passed."); } else { - // Re-enable TLSv1 since test depends on it - SecurityUtils.removeFromDisabledTlsAlgs("TLSv1"); + // Re-enable TLSv1 and TLS_RSA_* since test depends on it + SecurityUtils.removeFromDisabledTlsAlgs("TLSv1", "TLS_RSA_*"); DebugReportsOneExtraByte test = new DebugReportsOneExtraByte(); test.runTest(); From 0714317831171af87d22899c99255e4e46900fbb Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Thu, 11 Sep 2025 17:24:34 +0000 Subject: [PATCH 028/323] 8290043: serviceability/attach/ConcAttachTest.java failed "guarantee(!CheckJNICalls) failed: Attached JNI thread exited without being detached" Backport-of: 9b1bed0aa416c615a81d429e2f1f33bc4f679109 --- src/hotspot/share/prims/jni.cpp | 6 +++++- src/hotspot/share/runtime/javaThread.cpp | 1 - src/hotspot/share/runtime/thread.cpp | 3 +++ test/hotspot/jtreg/ProblemList.txt | 4 +--- .../jni/terminatedThread/TestTerminatedThread.java | 8 +++++--- 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/hotspot/share/prims/jni.cpp b/src/hotspot/share/prims/jni.cpp index de68ca6b74a3..33f2ac4adc9a 100644 --- a/src/hotspot/share/prims/jni.cpp +++ b/src/hotspot/share/prims/jni.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2025, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012 Red Hat, Inc. * Copyright (c) 2021, Azul Systems, Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -3838,6 +3838,7 @@ static jint attach_current_thread(JavaVM *vm, void **penv, void *_args, bool dae MACOS_AARCH64_ONLY(thread->init_wx()); if (!os::create_attached_thread(thread)) { + thread->unregister_thread_stack_with_NMT(); thread->smr_delete(); return JNI_ERR; } @@ -3882,6 +3883,8 @@ static jint attach_current_thread(JavaVM *vm, void **penv, void *_args, bool dae if (attach_failed) { // Added missing cleanup thread->cleanup_failed_attach_current_thread(daemon); + thread->unregister_thread_stack_with_NMT(); + thread->smr_delete(); return JNI_ERR; } @@ -3977,6 +3980,7 @@ jint JNICALL jni_DetachCurrentThread(JavaVM *vm) { // (platform-dependent) methods where we do alternate stack // maintenance work?) thread->exit(false, JavaThread::jni_detach); + thread->unregister_thread_stack_with_NMT(); thread->smr_delete(); // Go to the execute mode, the initial state of the thread on creation. diff --git a/src/hotspot/share/runtime/javaThread.cpp b/src/hotspot/share/runtime/javaThread.cpp index 515a8d9d92fb..21bdafb8b5c9 100644 --- a/src/hotspot/share/runtime/javaThread.cpp +++ b/src/hotspot/share/runtime/javaThread.cpp @@ -978,7 +978,6 @@ void JavaThread::cleanup_failed_attach_current_thread(bool is_daemon) { } Threads::remove(this, is_daemon); - this->smr_delete(); } JavaThread* JavaThread::active() { diff --git a/src/hotspot/share/runtime/thread.cpp b/src/hotspot/share/runtime/thread.cpp index a576c488697b..ce4c3b9cc14d 100644 --- a/src/hotspot/share/runtime/thread.cpp +++ b/src/hotspot/share/runtime/thread.cpp @@ -236,6 +236,9 @@ void Thread::call_run() { // asynchronously with respect to its termination - that is what _run_state can // be used to check. + // Logically we should do this->unregister_thread_stack_with_NMT() here, but we + // had to move that into post_run() because of the `this` deletion issue. + assert(Thread::current_or_null() == nullptr, "current thread still present"); } diff --git a/test/hotspot/jtreg/ProblemList.txt b/test/hotspot/jtreg/ProblemList.txt index 7b4f33438ce8..9866a885956d 100644 --- a/test/hotspot/jtreg/ProblemList.txt +++ b/test/hotspot/jtreg/ProblemList.txt @@ -1,5 +1,5 @@ # -# Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2016, 2025, 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 @@ -151,8 +151,6 @@ serviceability/sa/ClhsdbPstack.java#core 8267433 macosx-x64 serviceability/sa/TestJmapCore.java 8267433 macosx-x64 serviceability/sa/TestJmapCoreMetaspace.java 8267433 macosx-x64 -serviceability/attach/ConcAttachTest.java 8290043 linux-all - serviceability/jvmti/stress/StackTrace/NotSuspended/GetStackTraceNotSuspendedStressTest.java 8315980 linux-all,windows-x64 ############################################################################# diff --git a/test/hotspot/jtreg/runtime/jni/terminatedThread/TestTerminatedThread.java b/test/hotspot/jtreg/runtime/jni/terminatedThread/TestTerminatedThread.java index abc0b176d88b..7f56b0cae42c 100644 --- a/test/hotspot/jtreg/runtime/jni/terminatedThread/TestTerminatedThread.java +++ b/test/hotspot/jtreg/runtime/jni/terminatedThread/TestTerminatedThread.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, 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 @@ -32,8 +32,10 @@ * @library /testlibrary * @summary Basic test of Thread and ThreadMXBean queries on a natively * attached thread that has failed to detach before terminating. - * @comment The native code only supports POSIX so no windows testing - * @run main/othervm/native TestTerminatedThread + * @comment The native code only supports POSIX so no windows testing. + * @comment Disable -Xcheck:jni else NMT can report a fatal error because + * we did not detach before exiting. + * @run main/othervm/native -XX:-CheckJNICalls TestTerminatedThread */ import jvmti.JVMTIUtils; From 352d61e9e55113976f08cd4d5ab973899b33392e Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Thu, 11 Sep 2025 17:27:08 +0000 Subject: [PATCH 029/323] 8338428: Add logging of final VM flags while setting properties Backport-of: bbd880775f73ac11dc2c86ec5b598bdb4305e699 --- test/hotspot/jtreg/TEST.ROOT | 7 +++++-- test/jdk/TEST.ROOT | 11 +++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/test/hotspot/jtreg/TEST.ROOT b/test/hotspot/jtreg/TEST.ROOT index 99f6bd249c3f..50ed525eb0a2 100644 --- a/test/hotspot/jtreg/TEST.ROOT +++ b/test/hotspot/jtreg/TEST.ROOT @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2025, 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 @@ -48,7 +48,10 @@ requires.extraPropDefns.libs = \ ../../lib/jdk/test/lib/Container.java requires.extraPropDefns.javacOpts = --add-exports java.base/jdk.internal.foreign=ALL-UNNAMED requires.extraPropDefns.vmOpts = \ - -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI \ + -XX:+UnlockDiagnosticVMOptions \ + -XX:+LogVMOutput -XX:-DisplayVMOutput -XX:LogFile=vmprops.flags.final.vm.log \ + -XX:+PrintFlagsFinal \ + -XX:+WhiteBoxAPI \ --add-exports java.base/jdk.internal.foreign=ALL-UNNAMED requires.properties= \ sun.arch.data.model \ diff --git a/test/jdk/TEST.ROOT b/test/jdk/TEST.ROOT index 7dda8bccaf03..7f3a08023d60 100644 --- a/test/jdk/TEST.ROOT +++ b/test/jdk/TEST.ROOT @@ -1,6 +1,10 @@ +# +# Copyright (c) 2005, 2025, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# # This file identifies the root of the test-suite hierarchy. # It also contains test-suite configuration information. - +# # The list of keywords supported in the entire test suite. The # "intermittent" keyword marks tests known to fail intermittently. # The "randomness" keyword marks tests using randomness with test @@ -72,7 +76,10 @@ requires.extraPropDefns.libs = \ ../lib/jdk/test/lib/Container.java requires.extraPropDefns.javacOpts = --add-exports java.base/jdk.internal.foreign=ALL-UNNAMED requires.extraPropDefns.vmOpts = \ - -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI \ + -XX:+UnlockDiagnosticVMOptions \ + -XX:+LogVMOutput -XX:-DisplayVMOutput -XX:LogFile=vmprops.flags.final.vm.log \ + -XX:+PrintFlagsFinal \ + -XX:+WhiteBoxAPI \ --add-exports java.base/jdk.internal.foreign=ALL-UNNAMED requires.properties= \ sun.arch.data.model \ From 85f15aa3679ec459fefc8ffcc075e29f8b8a3c8a Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Thu, 11 Sep 2025 17:29:54 +0000 Subject: [PATCH 030/323] 8350813: Rendering of bulky sound bank from MIDI sequence can cause OutOfMemoryError Backport-of: fcc2a24291d499f7149debad1250903ddc369d91 --- .../media/sound/AudioFileSoundbankReader.java | 9 +++- .../midi/BulkSoundBank/BulkSoundBank.java | 53 +++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 test/jdk/javax/sound/midi/BulkSoundBank/BulkSoundBank.java diff --git a/src/java.desktop/share/classes/com/sun/media/sound/AudioFileSoundbankReader.java b/src/java.desktop/share/classes/com/sun/media/sound/AudioFileSoundbankReader.java index 6431c06a9068..dbc58966973d 100644 --- a/src/java.desktop/share/classes/com/sun/media/sound/AudioFileSoundbankReader.java +++ b/src/java.desktop/share/classes/com/sun/media/sound/AudioFileSoundbankReader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2025, 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 @@ -90,6 +90,13 @@ public Soundbank getSoundbank(AudioInputStream ais) "Can not allocate enough memory to read audio data."); } + long maximumHeapSize = (long) ((Runtime.getRuntime().maxMemory() - + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())) * 0.9); + if (totalSize > maximumHeapSize) { + throw new InvalidMidiDataException( + "Insufficient heap size to render audio data."); + } + if (ais.getFrameLength() == -1 || totalSize > MEGABYTE) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buff = new byte[DEFAULT_BUFFER_SIZE - (DEFAULT_BUFFER_SIZE % frameSize)]; diff --git a/test/jdk/javax/sound/midi/BulkSoundBank/BulkSoundBank.java b/test/jdk/javax/sound/midi/BulkSoundBank/BulkSoundBank.java new file mode 100644 index 000000000000..259b5b5283c4 --- /dev/null +++ b/test/jdk/javax/sound/midi/BulkSoundBank/BulkSoundBank.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2025, 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.sound.midi.InvalidMidiDataException; +import javax.sound.midi.MidiSystem; +import java.io.ByteArrayInputStream; +import java.io.IOException; + +/** + * @test + * @bug 8350813 + * @summary Rendering of bulky sound bank from MIDI sequence can cause OutOfMemoryError. + * @run main/othervm -Xmx1g BulkSoundBank + */ + +public class BulkSoundBank { + static final byte[] midi = {77, 84, 104, 100, 0, 0, 0, 6, 0, 0, 0, 1, 1, + -32, 77, 84, 114, 107, 0, 0, 0, 50, 0, -1, 88, 4, 4, 2, 24, 8, 0, -1, + 81, 3, 7, -95, 32, 0, -112, 60, 64, -125, 96, -128, 60, 64, -125, -44, + -51, 32, -112, 48, 64, 1, -128, 48, 64, -127, -64, -45, 127, -112, 60, + 64, 1, -128, 60, 64, 0, -1, 47, 0}; + + public static void main(String[] args) throws IOException { + try (ByteArrayInputStream bis = new ByteArrayInputStream(midi)) { + MidiSystem.getSoundbank(bis); + throw new RuntimeException("Test should throw InvalidMidiDataException" + + " but it did not."); + } catch (InvalidMidiDataException imda) { + System.out.println("Caught InvalidMidiDataException as expected"); + } + } +} + From a784f6ee2f4b8be58d09776a9d2a6c87a6a0747f Mon Sep 17 00:00:00 2001 From: John Jiang Date: Fri, 12 Sep 2025 01:49:50 +0000 Subject: [PATCH 031/323] 8364597: Replace THL A29 Limited with Tencent Reviewed-by: andrew Backport-of: 4c9eaddaef83c6ba30e27ae3e0d16caeeec206cb --- src/hotspot/cpu/x86/macroAssembler_x86_32_exp.cpp | 2 +- src/hotspot/cpu/x86/macroAssembler_x86_32_log.cpp | 2 +- src/hotspot/cpu/x86/macroAssembler_x86_32_pow.cpp | 2 +- src/hotspot/cpu/x86/stubGenerator_x86_64_exp.cpp | 2 +- src/hotspot/cpu/x86/stubGenerator_x86_64_log.cpp | 2 +- src/hotspot/cpu/x86/stubGenerator_x86_64_pow.cpp | 2 +- src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp | 2 +- src/hotspot/share/gc/shenandoah/shenandoahControlThread.cpp | 2 +- .../arraycopy/TestIllegalArrayCopyBeforeInfiniteLoop.java | 2 +- .../jtreg/compiler/arraycopy/TestNegArrayLengthAsIndex1.java | 2 +- .../jtreg/compiler/arraycopy/TestNegArrayLengthAsIndex2.java | 2 +- .../compiler/arraycopy/TestNegativeArrayCopyAfterLoop.java | 2 +- test/hotspot/jtreg/compiler/c1/TestRangeCheckEliminated.java | 2 +- .../jtreg/compiler/c2/TestDuplicateSimpleLoopBackedge.java | 2 +- test/hotspot/jtreg/compiler/c2/cr6865031/Test.java | 2 +- .../compiler/c2/irTests/TestAutoVectorization2DArray.java | 2 +- .../compiler/compilercontrol/TestConflictInlineCommands.java | 2 +- test/hotspot/jtreg/compiler/debug/TraceIterativeGVN.java | 2 +- .../jtreg/compiler/intrinsics/math/TestPow0Dot5Opt.java | 2 +- test/hotspot/jtreg/compiler/intrinsics/math/TestPow2Opt.java | 2 +- .../sha/cli/TestUseSHA3IntrinsicsOptionOnSupportedCPU.java | 2 +- .../sha/cli/TestUseSHA3IntrinsicsOptionOnUnsupportedCPU.java | 2 +- .../compiler/jvmci/errors/TestInvalidTieredStopAtLevel.java | 2 +- .../jtreg/compiler/loopopts/TestLoopEndNodeEliminate.java | 2 +- test/hotspot/jtreg/compiler/loopopts/TestLoopPredicateDep.java | 2 +- .../jtreg/compiler/loopopts/TestSkeletonPredicateNegation.java | 2 +- .../jtreg/compiler/oracle/TestInvalidCompileCommand.java | 2 +- test/hotspot/jtreg/compiler/print/TestTraceOptoParse.java | 2 +- .../jtreg/compiler/regalloc/TestGCMRecalcPressureNodes.java | 3 +-- .../jtreg/compiler/unsafe/TestMisalignedUnsafeAccess.java | 2 +- .../hotspot/jtreg/compiler/vectorapi/TestIntrinsicBailOut.java | 2 +- .../hotspot/jtreg/compiler/vectorapi/TestVectorErgonomics.java | 2 +- .../jtreg/compiler/vectorapi/VectorReinterpretTest.java | 2 +- .../jtreg/containers/docker/TestMemoryWithCgroupV1.java | 2 +- test/hotspot/jtreg/gtest/MetaspaceUtilsGtests.java | 2 +- .../hotspot/jtreg/runtime/cds/appcds/FillerObjectLoadTest.java | 2 +- test/jdk/java/lang/Thread/virtual/ParkWithFixedThreadPool.java | 2 +- test/jdk/javax/net/ssl/DTLS/DTLSNamedGroups.java | 3 +-- test/jdk/javax/net/ssl/DTLS/DTLSSignatureSchemes.java | 3 +-- .../javax/net/ssl/SSLException/CheckSSLHandshakeException.java | 2 +- test/jdk/javax/net/ssl/SSLException/CheckSSLKeyException.java | 2 +- .../net/ssl/SSLException/CheckSSLPeerUnverifiedException.java | 2 +- .../javax/net/ssl/SSLException/CheckSSLProtocolException.java | 2 +- test/jdk/javax/net/ssl/SSLParameters/NamedGroups.java | 2 +- test/jdk/javax/net/ssl/SSLParameters/NamedGroupsSpec.java | 2 +- test/jdk/javax/net/ssl/SSLParameters/SignatureSchemes.java | 2 +- test/jdk/javax/net/ssl/ServerName/EndingDotHostname.java | 3 +-- test/jdk/javax/net/ssl/templates/SSLExampleCert.java | 2 +- .../auth/callback/PasswordCallback/CheckCleanerBound.java | 3 +-- .../auth/callback/PasswordCallback/PasswordCleanup.java | 3 +-- .../jdk/jdk/internal/platform/docker/GetFreeSwapSpaceSize.java | 2 +- .../jdk/internal/platform/docker/TestGetFreeSwapSpaceSize.java | 2 +- test/jdk/sun/security/jgss/GssContextCleanup.java | 3 +-- test/jdk/sun/security/jgss/GssNameCleanup.java | 3 +-- .../security/ssl/SignatureScheme/SigAlgosExtTestWithTLS12.java | 2 +- .../security/ssl/SignatureScheme/SigAlgosExtTestWithTLS13.java | 2 +- test/micro/org/openjdk/bench/java/security/Signatures.java | 3 +-- .../openjdk/bench/vm/compiler/AutoVectorization2DArray.java | 2 +- test/micro/org/openjdk/bench/vm/compiler/LoopUnroll.java | 2 +- 59 files changed, 59 insertions(+), 68 deletions(-) diff --git a/src/hotspot/cpu/x86/macroAssembler_x86_32_exp.cpp b/src/hotspot/cpu/x86/macroAssembler_x86_32_exp.cpp index a490510b959d..0fd6005c1712 100644 --- a/src/hotspot/cpu/x86/macroAssembler_x86_32_exp.cpp +++ b/src/hotspot/cpu/x86/macroAssembler_x86_32_exp.cpp @@ -1,6 +1,6 @@ /* * Copyright (c) 2016, 2021, Intel Corporation. All rights reserved. -* Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. +* Copyright (C) 2021, Tencent. All rights reserved. * Intel Math Library (LIBM) Source Code * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. diff --git a/src/hotspot/cpu/x86/macroAssembler_x86_32_log.cpp b/src/hotspot/cpu/x86/macroAssembler_x86_32_log.cpp index 515717e2179c..bd0533897089 100644 --- a/src/hotspot/cpu/x86/macroAssembler_x86_32_log.cpp +++ b/src/hotspot/cpu/x86/macroAssembler_x86_32_log.cpp @@ -1,6 +1,6 @@ /* * Copyright (c) 2016, 2021, Intel Corporation. All rights reserved. -* Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. +* Copyright (C) 2021, Tencent. All rights reserved. * Intel Math Library (LIBM) Source Code * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. diff --git a/src/hotspot/cpu/x86/macroAssembler_x86_32_pow.cpp b/src/hotspot/cpu/x86/macroAssembler_x86_32_pow.cpp index 7afad2fcc73b..559e1d8661dc 100644 --- a/src/hotspot/cpu/x86/macroAssembler_x86_32_pow.cpp +++ b/src/hotspot/cpu/x86/macroAssembler_x86_32_pow.cpp @@ -1,6 +1,6 @@ /* * Copyright (c) 2016, 2021, Intel Corporation. All rights reserved. -* Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. +* Copyright (C) 2021, Tencent. All rights reserved. * Intel Math Library (LIBM) Source Code * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. diff --git a/src/hotspot/cpu/x86/stubGenerator_x86_64_exp.cpp b/src/hotspot/cpu/x86/stubGenerator_x86_64_exp.cpp index f716e2a7282d..45e238af8b08 100644 --- a/src/hotspot/cpu/x86/stubGenerator_x86_64_exp.cpp +++ b/src/hotspot/cpu/x86/stubGenerator_x86_64_exp.cpp @@ -1,6 +1,6 @@ /* * Copyright (c) 2016, 2021, Intel Corporation. All rights reserved. -* Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. +* Copyright (C) 2021, Tencent. All rights reserved. * Intel Math Library (LIBM) Source Code * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. diff --git a/src/hotspot/cpu/x86/stubGenerator_x86_64_log.cpp b/src/hotspot/cpu/x86/stubGenerator_x86_64_log.cpp index c9d339680c44..5f99eb0898e0 100644 --- a/src/hotspot/cpu/x86/stubGenerator_x86_64_log.cpp +++ b/src/hotspot/cpu/x86/stubGenerator_x86_64_log.cpp @@ -1,6 +1,6 @@ /* * Copyright (c) 2016, 2021, Intel Corporation. All rights reserved. -* Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. +* Copyright (C) 2021, Tencent. All rights reserved. * Intel Math Library (LIBM) Source Code * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. diff --git a/src/hotspot/cpu/x86/stubGenerator_x86_64_pow.cpp b/src/hotspot/cpu/x86/stubGenerator_x86_64_pow.cpp index 2e9ea125abcb..d498aa853f4d 100644 --- a/src/hotspot/cpu/x86/stubGenerator_x86_64_pow.cpp +++ b/src/hotspot/cpu/x86/stubGenerator_x86_64_pow.cpp @@ -1,6 +1,6 @@ /* * Copyright (c) 2016, 2021, Intel Corporation. All rights reserved. -* Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. +* Copyright (C) 2021, Tencent. All rights reserved. * Intel Math Library (LIBM) Source Code * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. diff --git a/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp b/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp index 73d708d6ea10..345f7324827d 100644 --- a/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp +++ b/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp @@ -1,6 +1,6 @@ /* * Copyright (c) 2015, 2021, Red Hat, Inc. All rights reserved. - * Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2022, Tencent. 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 diff --git a/src/hotspot/share/gc/shenandoah/shenandoahControlThread.cpp b/src/hotspot/share/gc/shenandoah/shenandoahControlThread.cpp index 3b755e4366a6..e14fbfb47618 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahControlThread.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahControlThread.cpp @@ -1,6 +1,6 @@ /* * Copyright (c) 2013, 2021, Red Hat, Inc. All rights reserved. - * Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2022, Tencent. 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 diff --git a/test/hotspot/jtreg/compiler/arraycopy/TestIllegalArrayCopyBeforeInfiniteLoop.java b/test/hotspot/jtreg/compiler/arraycopy/TestIllegalArrayCopyBeforeInfiniteLoop.java index 0b3572d6afa9..af1665719093 100644 --- a/test/hotspot/jtreg/compiler/arraycopy/TestIllegalArrayCopyBeforeInfiniteLoop.java +++ b/test/hotspot/jtreg/compiler/arraycopy/TestIllegalArrayCopyBeforeInfiniteLoop.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2021, Tencent. 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 diff --git a/test/hotspot/jtreg/compiler/arraycopy/TestNegArrayLengthAsIndex1.java b/test/hotspot/jtreg/compiler/arraycopy/TestNegArrayLengthAsIndex1.java index 2f35a11e9487..b7da2119bd39 100644 --- a/test/hotspot/jtreg/compiler/arraycopy/TestNegArrayLengthAsIndex1.java +++ b/test/hotspot/jtreg/compiler/arraycopy/TestNegArrayLengthAsIndex1.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2021, Tencent. 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 diff --git a/test/hotspot/jtreg/compiler/arraycopy/TestNegArrayLengthAsIndex2.java b/test/hotspot/jtreg/compiler/arraycopy/TestNegArrayLengthAsIndex2.java index da8f0936caee..b101254d189f 100644 --- a/test/hotspot/jtreg/compiler/arraycopy/TestNegArrayLengthAsIndex2.java +++ b/test/hotspot/jtreg/compiler/arraycopy/TestNegArrayLengthAsIndex2.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2021, Tencent. 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 diff --git a/test/hotspot/jtreg/compiler/arraycopy/TestNegativeArrayCopyAfterLoop.java b/test/hotspot/jtreg/compiler/arraycopy/TestNegativeArrayCopyAfterLoop.java index e28cfb871f70..901ff78347da 100644 --- a/test/hotspot/jtreg/compiler/arraycopy/TestNegativeArrayCopyAfterLoop.java +++ b/test/hotspot/jtreg/compiler/arraycopy/TestNegativeArrayCopyAfterLoop.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2021, Tencent. 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 diff --git a/test/hotspot/jtreg/compiler/c1/TestRangeCheckEliminated.java b/test/hotspot/jtreg/compiler/c1/TestRangeCheckEliminated.java index 9da8a5390da1..0f5b8860195c 100644 --- a/test/hotspot/jtreg/compiler/c1/TestRangeCheckEliminated.java +++ b/test/hotspot/jtreg/compiler/c1/TestRangeCheckEliminated.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2021, Tencent. All rights reserved. * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * diff --git a/test/hotspot/jtreg/compiler/c2/TestDuplicateSimpleLoopBackedge.java b/test/hotspot/jtreg/compiler/c2/TestDuplicateSimpleLoopBackedge.java index 0b102b4c9fd9..414a351e53fa 100644 --- a/test/hotspot/jtreg/compiler/c2/TestDuplicateSimpleLoopBackedge.java +++ b/test/hotspot/jtreg/compiler/c2/TestDuplicateSimpleLoopBackedge.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (c) 2022, Tencent. 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 diff --git a/test/hotspot/jtreg/compiler/c2/cr6865031/Test.java b/test/hotspot/jtreg/compiler/c2/cr6865031/Test.java index af23628577b0..beb41943183f 100644 --- a/test/hotspot/jtreg/compiler/c2/cr6865031/Test.java +++ b/test/hotspot/jtreg/compiler/c2/cr6865031/Test.java @@ -1,6 +1,6 @@ /* * Copyright 2009 Goldman Sachs International. All Rights Reserved. - * Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2022, Tencent. 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 diff --git a/test/hotspot/jtreg/compiler/c2/irTests/TestAutoVectorization2DArray.java b/test/hotspot/jtreg/compiler/c2/irTests/TestAutoVectorization2DArray.java index c9b2904d91c7..e4148ce1bf2d 100644 --- a/test/hotspot/jtreg/compiler/c2/irTests/TestAutoVectorization2DArray.java +++ b/test/hotspot/jtreg/compiler/c2/irTests/TestAutoVectorization2DArray.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2022, Tencent. 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 diff --git a/test/hotspot/jtreg/compiler/compilercontrol/TestConflictInlineCommands.java b/test/hotspot/jtreg/compiler/compilercontrol/TestConflictInlineCommands.java index 9c12ea6b8a79..c7e20157e7e9 100644 --- a/test/hotspot/jtreg/compiler/compilercontrol/TestConflictInlineCommands.java +++ b/test/hotspot/jtreg/compiler/compilercontrol/TestConflictInlineCommands.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2021, Tencent. 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 diff --git a/test/hotspot/jtreg/compiler/debug/TraceIterativeGVN.java b/test/hotspot/jtreg/compiler/debug/TraceIterativeGVN.java index 59d3de0d58ec..8e6169f07dc6 100644 --- a/test/hotspot/jtreg/compiler/debug/TraceIterativeGVN.java +++ b/test/hotspot/jtreg/compiler/debug/TraceIterativeGVN.java @@ -1,6 +1,6 @@ /* * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. - * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2021, Tencent. 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 diff --git a/test/hotspot/jtreg/compiler/intrinsics/math/TestPow0Dot5Opt.java b/test/hotspot/jtreg/compiler/intrinsics/math/TestPow0Dot5Opt.java index a0560870d2a0..9854eb8c3866 100644 --- a/test/hotspot/jtreg/compiler/intrinsics/math/TestPow0Dot5Opt.java +++ b/test/hotspot/jtreg/compiler/intrinsics/math/TestPow0Dot5Opt.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2021, Tencent. 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 diff --git a/test/hotspot/jtreg/compiler/intrinsics/math/TestPow2Opt.java b/test/hotspot/jtreg/compiler/intrinsics/math/TestPow2Opt.java index 2bf48407a361..db05baf96835 100644 --- a/test/hotspot/jtreg/compiler/intrinsics/math/TestPow2Opt.java +++ b/test/hotspot/jtreg/compiler/intrinsics/math/TestPow2Opt.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2021, Tencent. 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 diff --git a/test/hotspot/jtreg/compiler/intrinsics/sha/cli/TestUseSHA3IntrinsicsOptionOnSupportedCPU.java b/test/hotspot/jtreg/compiler/intrinsics/sha/cli/TestUseSHA3IntrinsicsOptionOnSupportedCPU.java index 3706f3abfd8a..d3c0a4a8da7f 100644 --- a/test/hotspot/jtreg/compiler/intrinsics/sha/cli/TestUseSHA3IntrinsicsOptionOnSupportedCPU.java +++ b/test/hotspot/jtreg/compiler/intrinsics/sha/cli/TestUseSHA3IntrinsicsOptionOnSupportedCPU.java @@ -1,6 +1,6 @@ /* * Copyright (c) 2020, Huawei Technologies Co., Ltd. All rights reserved. - * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2021, Tencent. 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 diff --git a/test/hotspot/jtreg/compiler/intrinsics/sha/cli/TestUseSHA3IntrinsicsOptionOnUnsupportedCPU.java b/test/hotspot/jtreg/compiler/intrinsics/sha/cli/TestUseSHA3IntrinsicsOptionOnUnsupportedCPU.java index 633ceb1d9ab7..c0045ae29222 100644 --- a/test/hotspot/jtreg/compiler/intrinsics/sha/cli/TestUseSHA3IntrinsicsOptionOnUnsupportedCPU.java +++ b/test/hotspot/jtreg/compiler/intrinsics/sha/cli/TestUseSHA3IntrinsicsOptionOnUnsupportedCPU.java @@ -1,6 +1,6 @@ /* * Copyright (c) 2020, Huawei Technologies Co., Ltd. All rights reserved. - * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2021, Tencent. 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 diff --git a/test/hotspot/jtreg/compiler/jvmci/errors/TestInvalidTieredStopAtLevel.java b/test/hotspot/jtreg/compiler/jvmci/errors/TestInvalidTieredStopAtLevel.java index 3527dd891d66..0a00987f3d83 100644 --- a/test/hotspot/jtreg/compiler/jvmci/errors/TestInvalidTieredStopAtLevel.java +++ b/test/hotspot/jtreg/compiler/jvmci/errors/TestInvalidTieredStopAtLevel.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2020, Tencent. 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 diff --git a/test/hotspot/jtreg/compiler/loopopts/TestLoopEndNodeEliminate.java b/test/hotspot/jtreg/compiler/loopopts/TestLoopEndNodeEliminate.java index a4683db4f701..e3b5bdff12f9 100644 --- a/test/hotspot/jtreg/compiler/loopopts/TestLoopEndNodeEliminate.java +++ b/test/hotspot/jtreg/compiler/loopopts/TestLoopEndNodeEliminate.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2021, Tencent. 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 diff --git a/test/hotspot/jtreg/compiler/loopopts/TestLoopPredicateDep.java b/test/hotspot/jtreg/compiler/loopopts/TestLoopPredicateDep.java index ca651a207502..bb945342c0d0 100644 --- a/test/hotspot/jtreg/compiler/loopopts/TestLoopPredicateDep.java +++ b/test/hotspot/jtreg/compiler/loopopts/TestLoopPredicateDep.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2021, Tencent. 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 diff --git a/test/hotspot/jtreg/compiler/loopopts/TestSkeletonPredicateNegation.java b/test/hotspot/jtreg/compiler/loopopts/TestSkeletonPredicateNegation.java index 38a82139553d..eae00ca35223 100644 --- a/test/hotspot/jtreg/compiler/loopopts/TestSkeletonPredicateNegation.java +++ b/test/hotspot/jtreg/compiler/loopopts/TestSkeletonPredicateNegation.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2021, Tencent. All rights reserved. * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * diff --git a/test/hotspot/jtreg/compiler/oracle/TestInvalidCompileCommand.java b/test/hotspot/jtreg/compiler/oracle/TestInvalidCompileCommand.java index 9d3069087661..fc2cd759367f 100644 --- a/test/hotspot/jtreg/compiler/oracle/TestInvalidCompileCommand.java +++ b/test/hotspot/jtreg/compiler/oracle/TestInvalidCompileCommand.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2021, Tencent. 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 diff --git a/test/hotspot/jtreg/compiler/print/TestTraceOptoParse.java b/test/hotspot/jtreg/compiler/print/TestTraceOptoParse.java index 65aa6bcb2d0c..52a7aba1a7eb 100644 --- a/test/hotspot/jtreg/compiler/print/TestTraceOptoParse.java +++ b/test/hotspot/jtreg/compiler/print/TestTraceOptoParse.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (c) 2022, Tencent. 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 diff --git a/test/hotspot/jtreg/compiler/regalloc/TestGCMRecalcPressureNodes.java b/test/hotspot/jtreg/compiler/regalloc/TestGCMRecalcPressureNodes.java index fe2fd7e44443..c99bdca2cb13 100644 --- a/test/hotspot/jtreg/compiler/regalloc/TestGCMRecalcPressureNodes.java +++ b/test/hotspot/jtreg/compiler/regalloc/TestGCMRecalcPressureNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2021, Tencent. 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,4 +50,3 @@ public static void main(String[] args) { } } } - diff --git a/test/hotspot/jtreg/compiler/unsafe/TestMisalignedUnsafeAccess.java b/test/hotspot/jtreg/compiler/unsafe/TestMisalignedUnsafeAccess.java index 84752a0ccf00..f4b1e3f0a537 100644 --- a/test/hotspot/jtreg/compiler/unsafe/TestMisalignedUnsafeAccess.java +++ b/test/hotspot/jtreg/compiler/unsafe/TestMisalignedUnsafeAccess.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2020, Tencent. 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 diff --git a/test/hotspot/jtreg/compiler/vectorapi/TestIntrinsicBailOut.java b/test/hotspot/jtreg/compiler/vectorapi/TestIntrinsicBailOut.java index b6bcd2d56315..cc2f1adbae92 100644 --- a/test/hotspot/jtreg/compiler/vectorapi/TestIntrinsicBailOut.java +++ b/test/hotspot/jtreg/compiler/vectorapi/TestIntrinsicBailOut.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021, 2022, THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2021, 2022, Tencent. All rights reserved. * Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * diff --git a/test/hotspot/jtreg/compiler/vectorapi/TestVectorErgonomics.java b/test/hotspot/jtreg/compiler/vectorapi/TestVectorErgonomics.java index ed8981eb0864..913fb535b908 100644 --- a/test/hotspot/jtreg/compiler/vectorapi/TestVectorErgonomics.java +++ b/test/hotspot/jtreg/compiler/vectorapi/TestVectorErgonomics.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2021, Tencent. 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 diff --git a/test/hotspot/jtreg/compiler/vectorapi/VectorReinterpretTest.java b/test/hotspot/jtreg/compiler/vectorapi/VectorReinterpretTest.java index b453311f8573..2f9b97b56d77 100644 --- a/test/hotspot/jtreg/compiler/vectorapi/VectorReinterpretTest.java +++ b/test/hotspot/jtreg/compiler/vectorapi/VectorReinterpretTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2021, Tencent. 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 diff --git a/test/hotspot/jtreg/containers/docker/TestMemoryWithCgroupV1.java b/test/hotspot/jtreg/containers/docker/TestMemoryWithCgroupV1.java index f80a83842c90..3340f9de03c3 100644 --- a/test/hotspot/jtreg/containers/docker/TestMemoryWithCgroupV1.java +++ b/test/hotspot/jtreg/containers/docker/TestMemoryWithCgroupV1.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2022, Tencent. 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 diff --git a/test/hotspot/jtreg/gtest/MetaspaceUtilsGtests.java b/test/hotspot/jtreg/gtest/MetaspaceUtilsGtests.java index 7a9b1c8dfb3a..8a2dbbb204b0 100644 --- a/test/hotspot/jtreg/gtest/MetaspaceUtilsGtests.java +++ b/test/hotspot/jtreg/gtest/MetaspaceUtilsGtests.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2021, Tencent. 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 diff --git a/test/hotspot/jtreg/runtime/cds/appcds/FillerObjectLoadTest.java b/test/hotspot/jtreg/runtime/cds/appcds/FillerObjectLoadTest.java index 79d377ca876c..8538155375c2 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/FillerObjectLoadTest.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/FillerObjectLoadTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2022, Tencent. 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 diff --git a/test/jdk/java/lang/Thread/virtual/ParkWithFixedThreadPool.java b/test/jdk/java/lang/Thread/virtual/ParkWithFixedThreadPool.java index 950f036458d6..a65bf84c8e5b 100644 --- a/test/jdk/java/lang/Thread/virtual/ParkWithFixedThreadPool.java +++ b/test/jdk/java/lang/Thread/virtual/ParkWithFixedThreadPool.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2021, Tencent. 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 diff --git a/test/jdk/javax/net/ssl/DTLS/DTLSNamedGroups.java b/test/jdk/javax/net/ssl/DTLS/DTLSNamedGroups.java index e9165fa391cd..1fc4f9626751 100644 --- a/test/jdk/javax/net/ssl/DTLS/DTLSNamedGroups.java +++ b/test/jdk/javax/net/ssl/DTLS/DTLSNamedGroups.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2022, Tencent. 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 @@ -140,4 +140,3 @@ private static void runTest(String[] serverNamedGroups, } } } - diff --git a/test/jdk/javax/net/ssl/DTLS/DTLSSignatureSchemes.java b/test/jdk/javax/net/ssl/DTLS/DTLSSignatureSchemes.java index 5dd897b1bd7d..9c1c64f7fa07 100644 --- a/test/jdk/javax/net/ssl/DTLS/DTLSSignatureSchemes.java +++ b/test/jdk/javax/net/ssl/DTLS/DTLSSignatureSchemes.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2022, Tencent. 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 @@ -134,4 +134,3 @@ private static void runTest(String[] serverSignatureSchemes, } } } - diff --git a/test/jdk/javax/net/ssl/SSLException/CheckSSLHandshakeException.java b/test/jdk/javax/net/ssl/SSLException/CheckSSLHandshakeException.java index 4c8aba3de44d..4ba3e906597b 100644 --- a/test/jdk/javax/net/ssl/SSLException/CheckSSLHandshakeException.java +++ b/test/jdk/javax/net/ssl/SSLException/CheckSSLHandshakeException.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2022, Tencent. 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 diff --git a/test/jdk/javax/net/ssl/SSLException/CheckSSLKeyException.java b/test/jdk/javax/net/ssl/SSLException/CheckSSLKeyException.java index dcd62fcf8e7d..2d271236de1a 100644 --- a/test/jdk/javax/net/ssl/SSLException/CheckSSLKeyException.java +++ b/test/jdk/javax/net/ssl/SSLException/CheckSSLKeyException.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2022, Tencent. 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 diff --git a/test/jdk/javax/net/ssl/SSLException/CheckSSLPeerUnverifiedException.java b/test/jdk/javax/net/ssl/SSLException/CheckSSLPeerUnverifiedException.java index 04184e99306b..1d37271ed531 100644 --- a/test/jdk/javax/net/ssl/SSLException/CheckSSLPeerUnverifiedException.java +++ b/test/jdk/javax/net/ssl/SSLException/CheckSSLPeerUnverifiedException.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2022, Tencent. 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 diff --git a/test/jdk/javax/net/ssl/SSLException/CheckSSLProtocolException.java b/test/jdk/javax/net/ssl/SSLException/CheckSSLProtocolException.java index 3f62fac8f771..c1bd53e21e99 100644 --- a/test/jdk/javax/net/ssl/SSLException/CheckSSLProtocolException.java +++ b/test/jdk/javax/net/ssl/SSLException/CheckSSLProtocolException.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2022, Tencent. 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 diff --git a/test/jdk/javax/net/ssl/SSLParameters/NamedGroups.java b/test/jdk/javax/net/ssl/SSLParameters/NamedGroups.java index fc5001e89b81..25f73606b967 100644 --- a/test/jdk/javax/net/ssl/SSLParameters/NamedGroups.java +++ b/test/jdk/javax/net/ssl/SSLParameters/NamedGroups.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2022, Tencent. 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 diff --git a/test/jdk/javax/net/ssl/SSLParameters/NamedGroupsSpec.java b/test/jdk/javax/net/ssl/SSLParameters/NamedGroupsSpec.java index 9146e7b5f7b3..0d910ccfb67f 100644 --- a/test/jdk/javax/net/ssl/SSLParameters/NamedGroupsSpec.java +++ b/test/jdk/javax/net/ssl/SSLParameters/NamedGroupsSpec.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2022, Tencent. 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 diff --git a/test/jdk/javax/net/ssl/SSLParameters/SignatureSchemes.java b/test/jdk/javax/net/ssl/SSLParameters/SignatureSchemes.java index 7dadeff57031..7f41cb1af790 100644 --- a/test/jdk/javax/net/ssl/SSLParameters/SignatureSchemes.java +++ b/test/jdk/javax/net/ssl/SSLParameters/SignatureSchemes.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2022, Tencent. 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 diff --git a/test/jdk/javax/net/ssl/ServerName/EndingDotHostname.java b/test/jdk/javax/net/ssl/ServerName/EndingDotHostname.java index bac110aa0338..5438f4294558 100644 --- a/test/jdk/javax/net/ssl/ServerName/EndingDotHostname.java +++ b/test/jdk/javax/net/ssl/ServerName/EndingDotHostname.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2022, Tencent. 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 @@ -248,4 +248,3 @@ protected void runClientApplication(SSLSocket socket) throws Exception { sslIS.read(); } } - diff --git a/test/jdk/javax/net/ssl/templates/SSLExampleCert.java b/test/jdk/javax/net/ssl/templates/SSLExampleCert.java index 0b82aed3b7bd..46f69a62e41a 100644 --- a/test/jdk/javax/net/ssl/templates/SSLExampleCert.java +++ b/test/jdk/javax/net/ssl/templates/SSLExampleCert.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2022, Tencent. 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 diff --git a/test/jdk/javax/security/auth/callback/PasswordCallback/CheckCleanerBound.java b/test/jdk/javax/security/auth/callback/PasswordCallback/CheckCleanerBound.java index 8f68773398c5..6d500fea6561 100644 --- a/test/jdk/javax/security/auth/callback/PasswordCallback/CheckCleanerBound.java +++ b/test/jdk/javax/security/auth/callback/PasswordCallback/CheckCleanerBound.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2022, Tencent. 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,4 +55,3 @@ public static void main(String[] args) throws Exception { } } } - diff --git a/test/jdk/javax/security/auth/callback/PasswordCallback/PasswordCleanup.java b/test/jdk/javax/security/auth/callback/PasswordCallback/PasswordCleanup.java index ea8b1d1c1459..64db7de2b184 100644 --- a/test/jdk/javax/security/auth/callback/PasswordCallback/PasswordCleanup.java +++ b/test/jdk/javax/security/auth/callback/PasswordCallback/PasswordCleanup.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2022, Tencent. 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 @@ -49,4 +49,3 @@ public static void main(String[] args) throws Exception { } } } - diff --git a/test/jdk/jdk/internal/platform/docker/GetFreeSwapSpaceSize.java b/test/jdk/jdk/internal/platform/docker/GetFreeSwapSpaceSize.java index 92b8cf282b78..b7721899ea3b 100644 --- a/test/jdk/jdk/internal/platform/docker/GetFreeSwapSpaceSize.java +++ b/test/jdk/jdk/internal/platform/docker/GetFreeSwapSpaceSize.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020, 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2020, 2022, Tencent. 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 diff --git a/test/jdk/jdk/internal/platform/docker/TestGetFreeSwapSpaceSize.java b/test/jdk/jdk/internal/platform/docker/TestGetFreeSwapSpaceSize.java index 5a82a2df4ad3..9c3a05b00e75 100644 --- a/test/jdk/jdk/internal/platform/docker/TestGetFreeSwapSpaceSize.java +++ b/test/jdk/jdk/internal/platform/docker/TestGetFreeSwapSpaceSize.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020, 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2020, 2022, Tencent. 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 diff --git a/test/jdk/sun/security/jgss/GssContextCleanup.java b/test/jdk/sun/security/jgss/GssContextCleanup.java index 00d84e8a70eb..1e992df97d56 100644 --- a/test/jdk/sun/security/jgss/GssContextCleanup.java +++ b/test/jdk/sun/security/jgss/GssContextCleanup.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2022, Tencent. 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 @@ -59,4 +59,3 @@ public static void main(String[] args) throws Exception { } } } - diff --git a/test/jdk/sun/security/jgss/GssNameCleanup.java b/test/jdk/sun/security/jgss/GssNameCleanup.java index be68c46087d6..ef19479b6a03 100644 --- a/test/jdk/sun/security/jgss/GssNameCleanup.java +++ b/test/jdk/sun/security/jgss/GssNameCleanup.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2022, Tencent. 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 @@ -66,4 +66,3 @@ public static void main(String[] args) throws Exception { } } } - diff --git a/test/jdk/sun/security/ssl/SignatureScheme/SigAlgosExtTestWithTLS12.java b/test/jdk/sun/security/ssl/SignatureScheme/SigAlgosExtTestWithTLS12.java index 598c0fe62af2..43bc40fabf21 100644 --- a/test/jdk/sun/security/ssl/SignatureScheme/SigAlgosExtTestWithTLS12.java +++ b/test/jdk/sun/security/ssl/SignatureScheme/SigAlgosExtTestWithTLS12.java @@ -1,6 +1,6 @@ /* * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. - * Copyright (C) 2021, 2024 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2021, 2024, Tencent. 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 diff --git a/test/jdk/sun/security/ssl/SignatureScheme/SigAlgosExtTestWithTLS13.java b/test/jdk/sun/security/ssl/SignatureScheme/SigAlgosExtTestWithTLS13.java index 2ad48f59e83a..034af3ac7c5d 100644 --- a/test/jdk/sun/security/ssl/SignatureScheme/SigAlgosExtTestWithTLS13.java +++ b/test/jdk/sun/security/ssl/SignatureScheme/SigAlgosExtTestWithTLS13.java @@ -1,6 +1,6 @@ /* * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. - * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2021, Tencent. 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 diff --git a/test/micro/org/openjdk/bench/java/security/Signatures.java b/test/micro/org/openjdk/bench/java/security/Signatures.java index 1bd723343437..1216e2536638 100644 --- a/test/micro/org/openjdk/bench/java/security/Signatures.java +++ b/test/micro/org/openjdk/bench/java/security/Signatures.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2022, Tencent. 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 @@ -194,4 +194,3 @@ public void setup() throws Exception { } } } - diff --git a/test/micro/org/openjdk/bench/vm/compiler/AutoVectorization2DArray.java b/test/micro/org/openjdk/bench/vm/compiler/AutoVectorization2DArray.java index a2a4654b40a0..e41b1e7a4d0f 100644 --- a/test/micro/org/openjdk/bench/vm/compiler/AutoVectorization2DArray.java +++ b/test/micro/org/openjdk/bench/vm/compiler/AutoVectorization2DArray.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2022, Tencent. 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 diff --git a/test/micro/org/openjdk/bench/vm/compiler/LoopUnroll.java b/test/micro/org/openjdk/bench/vm/compiler/LoopUnroll.java index cbb216bbaa63..2e7e1da4ba97 100644 --- a/test/micro/org/openjdk/bench/vm/compiler/LoopUnroll.java +++ b/test/micro/org/openjdk/bench/vm/compiler/LoopUnroll.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. + * Copyright (C) 2021, Tencent. 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 From 04546cc4fe484a3665ac6436d44d81e35b9cec59 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 12 Sep 2025 08:58:00 +0000 Subject: [PATCH 032/323] 8341138: Rename jtreg property docker.support as container.support Backport-of: 41ee582df8c65f2f26b21e46784cf0bc4ece0585 --- test/hotspot/jtreg/TEST.ROOT | 2 +- .../containers/docker/DockerBasicTest.java | 4 ++-- .../jtreg/containers/docker/ShareTmpDir.java | 4 ++-- .../containers/docker/TestCPUAwareness.java | 4 ++-- .../jtreg/containers/docker/TestCPUSets.java | 4 ++-- .../containers/docker/TestContainerInfo.java | 2 +- .../jtreg/containers/docker/TestJFREvents.java | 2 +- .../docker/TestJFRNetworkEvents.java | 4 ++-- .../containers/docker/TestJFRWithJMX.java | 4 ++-- .../jtreg/containers/docker/TestJcmd.java | 4 ++-- .../containers/docker/TestJcmdWithSideCar.java | 4 ++-- .../containers/docker/TestLimitsUpdating.java | 3 ++- .../containers/docker/TestMemoryAwareness.java | 4 ++-- .../jtreg/containers/docker/TestMisc.java | 4 ++-- .../jtreg/containers/docker/TestPids.java | 2 +- test/jdk/TEST.ROOT | 2 +- .../platform/docker/TestDockerBasic.java | 3 ++- .../platform/docker/TestDockerCpuMetrics.java | 4 ++-- .../docker/TestDockerMemoryMetrics.java | 2 +- .../docker/TestGetFreeSwapSpaceSize.java | 3 ++- .../platform/docker/TestLimitsUpdating.java | 3 ++- .../platform/docker/TestPidsLimit.java | 4 ++-- .../platform/docker/TestSystemMetrics.java | 4 ++-- .../docker/TestUseContainerSupport.java | 3 ++- test/jtreg-ext/requires/VMProps.java | 18 +++++++++--------- test/lib/jdk/test/lib/Container.java | 5 +++-- 26 files changed, 54 insertions(+), 48 deletions(-) diff --git a/test/hotspot/jtreg/TEST.ROOT b/test/hotspot/jtreg/TEST.ROOT index 50ed525eb0a2..168c24034ba1 100644 --- a/test/hotspot/jtreg/TEST.ROOT +++ b/test/hotspot/jtreg/TEST.ROOT @@ -89,7 +89,7 @@ requires.properties= \ vm.asan \ vm.ubsan \ vm.flagless \ - docker.support \ + container.support \ systemd.support \ jdk.containerized diff --git a/test/hotspot/jtreg/containers/docker/DockerBasicTest.java b/test/hotspot/jtreg/containers/docker/DockerBasicTest.java index 0b34462b6c2b..8e2c0b6a85a9 100644 --- a/test/hotspot/jtreg/containers/docker/DockerBasicTest.java +++ b/test/hotspot/jtreg/containers/docker/DockerBasicTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, 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 @@ -25,7 +25,7 @@ /* * @test * @summary Basic (sanity) test for JDK-under-test inside a docker image. - * @requires docker.support + * @requires container.support * @requires !vm.asan * @library /test/lib * @modules java.base/jdk.internal.misc diff --git a/test/hotspot/jtreg/containers/docker/ShareTmpDir.java b/test/hotspot/jtreg/containers/docker/ShareTmpDir.java index 3ec7f470a773..9a4748563bd7 100644 --- a/test/hotspot/jtreg/containers/docker/ShareTmpDir.java +++ b/test/hotspot/jtreg/containers/docker/ShareTmpDir.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, 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 @@ -27,7 +27,7 @@ * @bug 8286030 * @key cgroups * @summary Test for hsperfdata file name conflict when two containers share the same /tmp directory - * @requires docker.support + * @requires container.support * @requires !vm.asan * @library /test/lib * @build WaitForFlagFile diff --git a/test/hotspot/jtreg/containers/docker/TestCPUAwareness.java b/test/hotspot/jtreg/containers/docker/TestCPUAwareness.java index f44c1f95f617..99220201f666 100644 --- a/test/hotspot/jtreg/containers/docker/TestCPUAwareness.java +++ b/test/hotspot/jtreg/containers/docker/TestCPUAwareness.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, 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,7 +26,7 @@ * @test * @key cgroups * @summary Test JVM's CPU resource awareness when running inside docker container - * @requires docker.support + * @requires container.support * @requires !vm.asan * @library /test/lib * @modules java.base/jdk.internal.misc diff --git a/test/hotspot/jtreg/containers/docker/TestCPUSets.java b/test/hotspot/jtreg/containers/docker/TestCPUSets.java index 4de2269d1fc0..7894172e4015 100644 --- a/test/hotspot/jtreg/containers/docker/TestCPUSets.java +++ b/test/hotspot/jtreg/containers/docker/TestCPUSets.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, 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,7 +26,7 @@ * @test * @key cgroups * @summary Test JVM's awareness of cpu sets (cpus and mems) - * @requires docker.support + * @requires container.support * @requires !vm.asan * @requires (os.arch != "s390x") * @library /test/lib diff --git a/test/hotspot/jtreg/containers/docker/TestContainerInfo.java b/test/hotspot/jtreg/containers/docker/TestContainerInfo.java index 3e82dc83ce69..a6327ca91879 100644 --- a/test/hotspot/jtreg/containers/docker/TestContainerInfo.java +++ b/test/hotspot/jtreg/containers/docker/TestContainerInfo.java @@ -26,7 +26,7 @@ /* * @test * @summary Test container info for cgroup v2 - * @requires docker.support + * @requires container.support * @requires !vm.asan * @library /test/lib * @modules java.base/jdk.internal.misc diff --git a/test/hotspot/jtreg/containers/docker/TestJFREvents.java b/test/hotspot/jtreg/containers/docker/TestJFREvents.java index 08ec93a3694a..c9f8734b714f 100644 --- a/test/hotspot/jtreg/containers/docker/TestJFREvents.java +++ b/test/hotspot/jtreg/containers/docker/TestJFREvents.java @@ -29,7 +29,7 @@ * when run inside Docker container, such as available CPU and memory. * Also make sure that PIDs are based on value provided by container, * not by the host system. - * @requires (docker.support & os.maxMemory >= 2g) + * @requires (container.support & os.maxMemory >= 2g) * @requires !vm.asan * @library /test/lib * @modules java.base/jdk.internal.misc diff --git a/test/hotspot/jtreg/containers/docker/TestJFRNetworkEvents.java b/test/hotspot/jtreg/containers/docker/TestJFRNetworkEvents.java index 1188874ffef7..c0dde368d1e0 100644 --- a/test/hotspot/jtreg/containers/docker/TestJFRNetworkEvents.java +++ b/test/hotspot/jtreg/containers/docker/TestJFRNetworkEvents.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, 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 @@ -27,7 +27,7 @@ * @summary Test JFR network related events inside a container; make sure * the reported host ip and host name are correctly reported within * the container. - * @requires docker.support + * @requires container.support * @requires !vm.asan * @library /test/lib * @modules java.base/jdk.internal.misc diff --git a/test/hotspot/jtreg/containers/docker/TestJFRWithJMX.java b/test/hotspot/jtreg/containers/docker/TestJFRWithJMX.java index 4716f3abf708..a9de46e00b0a 100644 --- a/test/hotspot/jtreg/containers/docker/TestJFRWithJMX.java +++ b/test/hotspot/jtreg/containers/docker/TestJFRWithJMX.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, 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 @@ -25,7 +25,7 @@ /* * @test * @summary Test JFR recording controlled via JMX across container boundary. - * @requires docker.support + * @requires container.support * @requires !vm.asan * @library /test/lib * @modules java.base/jdk.internal.misc diff --git a/test/hotspot/jtreg/containers/docker/TestJcmd.java b/test/hotspot/jtreg/containers/docker/TestJcmd.java index 60d4f4a9e5b4..ca8f1659fe9e 100644 --- a/test/hotspot/jtreg/containers/docker/TestJcmd.java +++ b/test/hotspot/jtreg/containers/docker/TestJcmd.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, 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,7 +26,7 @@ * @test * @summary Test JCMD across container boundary. The JCMD runs on a host system, * while sending commands to a JVM that runs inside a container. - * @requires docker.support + * @requires container.support * @requires vm.flagless * @modules java.base/jdk.internal.misc * java.management diff --git a/test/hotspot/jtreg/containers/docker/TestJcmdWithSideCar.java b/test/hotspot/jtreg/containers/docker/TestJcmdWithSideCar.java index a796d1f91c44..643ad390dff7 100644 --- a/test/hotspot/jtreg/containers/docker/TestJcmdWithSideCar.java +++ b/test/hotspot/jtreg/containers/docker/TestJcmdWithSideCar.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, 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 @@ -29,7 +29,7 @@ * and other uses. In side car pattern the main application/service container * is paired with a sidecar container by sharing certain aspects of container * namespace such as PID namespace, specific sub-directories, IPC and more. - * @requires docker.support + * @requires container.support * @requires vm.flagless * @requires !vm.asan * @modules java.base/jdk.internal.misc diff --git a/test/hotspot/jtreg/containers/docker/TestLimitsUpdating.java b/test/hotspot/jtreg/containers/docker/TestLimitsUpdating.java index 54f19ae02041..7b05669085c9 100644 --- a/test/hotspot/jtreg/containers/docker/TestLimitsUpdating.java +++ b/test/hotspot/jtreg/containers/docker/TestLimitsUpdating.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2023, Red Hat, Inc. + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -28,7 +29,7 @@ * @bug 8308090 * @key cgroups * @summary Test container limits updating as they get updated at runtime without restart - * @requires docker.support + * @requires container.support * @requires !vm.asan * @library /test/lib * @build jdk.test.whitebox.WhiteBox LimitUpdateChecker diff --git a/test/hotspot/jtreg/containers/docker/TestMemoryAwareness.java b/test/hotspot/jtreg/containers/docker/TestMemoryAwareness.java index 20354cf934d9..06a874e008ae 100644 --- a/test/hotspot/jtreg/containers/docker/TestMemoryAwareness.java +++ b/test/hotspot/jtreg/containers/docker/TestMemoryAwareness.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, 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 @@ -27,7 +27,7 @@ * @bug 8146115 8292083 * @key cgroups * @summary Test JVM's memory resource awareness when running inside docker container - * @requires docker.support + * @requires container.support * @library /test/lib * @modules java.base/jdk.internal.misc * java.base/jdk.internal.platform diff --git a/test/hotspot/jtreg/containers/docker/TestMisc.java b/test/hotspot/jtreg/containers/docker/TestMisc.java index e9fb4ad0aac0..4da130673994 100644 --- a/test/hotspot/jtreg/containers/docker/TestMisc.java +++ b/test/hotspot/jtreg/containers/docker/TestMisc.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, 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 @@ -25,7 +25,7 @@ /* * @test * @summary Test miscellanous functionality related to JVM running in docker container - * @requires docker.support + * @requires container.support * @requires !vm.asan * @library /test/lib * @modules java.base/jdk.internal.misc diff --git a/test/hotspot/jtreg/containers/docker/TestPids.java b/test/hotspot/jtreg/containers/docker/TestPids.java index 54a31195df74..88f288828b6d 100644 --- a/test/hotspot/jtreg/containers/docker/TestPids.java +++ b/test/hotspot/jtreg/containers/docker/TestPids.java @@ -27,7 +27,7 @@ * @test * @key cgroups * @summary Test JVM's awareness of pids controller - * @requires docker.support + * @requires container.support * @requires !vm.asan * @library /test/lib * @modules java.base/jdk.internal.misc diff --git a/test/jdk/TEST.ROOT b/test/jdk/TEST.ROOT index 7f3a08023d60..6c21f80234f1 100644 --- a/test/jdk/TEST.ROOT +++ b/test/jdk/TEST.ROOT @@ -108,7 +108,7 @@ requires.properties= \ vm.jvmci \ vm.jvmci.enabled \ vm.jvmti \ - docker.support \ + container.support \ systemd.support \ release.implementor \ jdk.containerized \ diff --git a/test/jdk/jdk/internal/platform/docker/TestDockerBasic.java b/test/jdk/jdk/internal/platform/docker/TestDockerBasic.java index 72f8a1ceac75..9a531d692ed4 100644 --- a/test/jdk/jdk/internal/platform/docker/TestDockerBasic.java +++ b/test/jdk/jdk/internal/platform/docker/TestDockerBasic.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2022, Red Hat, Inc. + * Copyright (c) 2024, 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,7 +27,7 @@ * @bug 8293540 * @summary Verify that -XshowSettings:system works * @key cgroups - * @requires docker.support + * @requires container.support * @requires !vm.asan * @library /test/lib * @run main/timeout=360 TestDockerBasic diff --git a/test/jdk/jdk/internal/platform/docker/TestDockerCpuMetrics.java b/test/jdk/jdk/internal/platform/docker/TestDockerCpuMetrics.java index 952457b8f1f8..ff039913b8fc 100644 --- a/test/jdk/jdk/internal/platform/docker/TestDockerCpuMetrics.java +++ b/test/jdk/jdk/internal/platform/docker/TestDockerCpuMetrics.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, 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 @@ -34,7 +34,7 @@ * @test * @key cgroups * @summary Test JDK Metrics class when running inside docker container - * @requires docker.support + * @requires container.support * @requires !vm.asan * @library /test/lib * @modules java.base/jdk.internal.platform diff --git a/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetrics.java b/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetrics.java index 4d0ef13da87d..009e0ba0c09e 100644 --- a/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetrics.java +++ b/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetrics.java @@ -32,7 +32,7 @@ * @test * @key cgroups * @summary Test JDK Metrics class when running inside docker container - * @requires docker.support + * @requires container.support * @requires !vm.asan * @library /test/lib * @modules java.base/jdk.internal.platform diff --git a/test/jdk/jdk/internal/platform/docker/TestGetFreeSwapSpaceSize.java b/test/jdk/jdk/internal/platform/docker/TestGetFreeSwapSpaceSize.java index 9c3a05b00e75..b9d031f03090 100644 --- a/test/jdk/jdk/internal/platform/docker/TestGetFreeSwapSpaceSize.java +++ b/test/jdk/jdk/internal/platform/docker/TestGetFreeSwapSpaceSize.java @@ -1,5 +1,6 @@ /* * Copyright (C) 2020, 2022, Tencent. All rights reserved. + * Copyright (c) 2024, 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 @@ -25,7 +26,7 @@ * @test * @key cgroups * @bug 8242480 - * @requires docker.support + * @requires container.support * @requires !vm.asan * @library /test/lib * @build GetFreeSwapSpaceSize diff --git a/test/jdk/jdk/internal/platform/docker/TestLimitsUpdating.java b/test/jdk/jdk/internal/platform/docker/TestLimitsUpdating.java index b78681640a8d..31e90e8802a9 100644 --- a/test/jdk/jdk/internal/platform/docker/TestLimitsUpdating.java +++ b/test/jdk/jdk/internal/platform/docker/TestLimitsUpdating.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2023, Red Hat, Inc. + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -28,7 +29,7 @@ * @bug 8308090 * @key cgroups * @summary Test container limits updating as they get updated at runtime without restart - * @requires docker.support + * @requires container.support * @requires !vm.asan * @library /test/lib * @modules java.base/jdk.internal.platform diff --git a/test/jdk/jdk/internal/platform/docker/TestPidsLimit.java b/test/jdk/jdk/internal/platform/docker/TestPidsLimit.java index 99404ab427d4..6b19bb475f13 100644 --- a/test/jdk/jdk/internal/platform/docker/TestPidsLimit.java +++ b/test/jdk/jdk/internal/platform/docker/TestPidsLimit.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2021 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -27,7 +27,7 @@ * @key cgroups * @summary Test JDK Metrics class when running inside a docker container with limited pids * @bug 8266490 - * @requires docker.support + * @requires container.support * @requires !vm.asan * @library /test/lib * @build TestPidsLimit diff --git a/test/jdk/jdk/internal/platform/docker/TestSystemMetrics.java b/test/jdk/jdk/internal/platform/docker/TestSystemMetrics.java index b652a55bc0dc..49ec56634787 100644 --- a/test/jdk/jdk/internal/platform/docker/TestSystemMetrics.java +++ b/test/jdk/jdk/internal/platform/docker/TestSystemMetrics.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, 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 @@ -25,7 +25,7 @@ * @test * @key cgroups * @summary Test JDK Metrics class when running inside docker container - * @requires docker.support + * @requires container.support * @requires !vm.asan * @library /test/lib * @modules java.base/jdk.internal.platform diff --git a/test/jdk/jdk/internal/platform/docker/TestUseContainerSupport.java b/test/jdk/jdk/internal/platform/docker/TestUseContainerSupport.java index c78cf4c779a8..d8d300401a0c 100644 --- a/test/jdk/jdk/internal/platform/docker/TestUseContainerSupport.java +++ b/test/jdk/jdk/internal/platform/docker/TestUseContainerSupport.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2020, Red Hat, Inc. + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,7 +25,7 @@ /* * @test * @summary UseContainerSupport flag should reflect Metrics being available - * @requires docker.support + * @requires container.support * @requires !vm.asan * @library /test/lib * @modules java.base/jdk.internal.platform diff --git a/test/jtreg-ext/requires/VMProps.java b/test/jtreg-ext/requires/VMProps.java index b242417ea8a3..28b192d5e7b1 100644 --- a/test/jtreg-ext/requires/VMProps.java +++ b/test/jtreg-ext/requires/VMProps.java @@ -128,7 +128,7 @@ public Map call() { map.put("vm.graal.enabled", this::isGraalEnabled); map.put("vm.compiler1.enabled", this::isCompiler1Enabled); map.put("vm.compiler2.enabled", this::isCompiler2Enabled); - map.put("docker.support", this::dockerSupport); + map.put("container.support", this::containerSupport); map.put("systemd.support", this::systemdSupport); map.put("vm.musl", this::isMusl); map.put("vm.asan", this::isAsanEnabled); @@ -536,16 +536,16 @@ protected String isCompiler2Enabled() { } /** - * A simple check for docker support + * A simple check for container support * - * @return true if docker is supported in a given environment + * @return true if container is supported in a given environment */ - protected String dockerSupport() { - log("Entering dockerSupport()"); + protected String containerSupport() { + log("Entering containerSupport()"); boolean isSupported = false; if (Platform.isLinux()) { - // currently docker testing is only supported for Linux, + // currently container testing is only supported for Linux, // on certain platforms String arch = System.getProperty("os.arch"); @@ -561,17 +561,17 @@ protected String dockerSupport() { } } - log("dockerSupport(): platform check: isSupported = " + isSupported); + log("containerSupport(): platform check: isSupported = " + isSupported); if (isSupported) { try { - isSupported = checkProgramSupport("checkDockerSupport()", Container.ENGINE_COMMAND); + isSupported = checkProgramSupport("checkContainerSupport()", Container.ENGINE_COMMAND); } catch (Exception e) { isSupported = false; } } - log("dockerSupport(): returning isSupported = " + isSupported); + log("containerSupport(): returning isSupported = " + isSupported); return "" + isSupported; } diff --git a/test/lib/jdk/test/lib/Container.java b/test/lib/jdk/test/lib/Container.java index e0ca4851e144..83fd265980f2 100644 --- a/test/lib/jdk/test/lib/Container.java +++ b/test/lib/jdk/test/lib/Container.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2019, Red Hat Inc. + * Copyright (c) 2024, 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 @@ -23,9 +24,9 @@ package jdk.test.lib; public class Container { - // Use this property to specify docker location on your system. + // Use this property to specify container runtime location (e.g. docker) on your system. // E.g.: "/usr/local/bin/docker". We define this constant here so - // that it can be used in VMProps as well which checks docker support + // that it can be used in VMProps as well which checks container support // via this command public static final String ENGINE_COMMAND = System.getProperty("jdk.test.container.command", "docker"); From 0ee604e8ff32eb665129745f0430a664f6a80f5f Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 12 Sep 2025 09:02:12 +0000 Subject: [PATCH 033/323] 8337723: Remove redundant tests from com/sun/security/sasl/gsskerb Backport-of: f979f727b6137be9a3f85baed4fbfdd785970044 --- test/jdk/ProblemList.txt | 3 - test/jdk/TEST.groups | 3 - .../sun/security/sasl/gsskerb/AuthOnly.java | 165 --------------- .../sasl/gsskerb/ConfSecurityLayer.java | 196 ----------------- .../sasl/gsskerb/NoSecurityLayer.java | 199 ------------------ .../PropertiesFileCallbackHandler.java | 145 ------------- .../sun/security/sasl/gsskerb/gsseg_jaas.conf | 21 -- .../sun/security/sasl/gsskerb/log.properties | 3 - .../security/sasl/gsskerb/run-conf-wjaas.csh | 29 --- .../security/sasl/gsskerb/run-nosec-wjaas.csh | 24 --- .../sun/security/sasl/gsskerb/runwjaas.csh | 24 --- .../jdk/sun/security/krb5/auto/SaslBasic.java | 97 +++++++-- 12 files changed, 75 insertions(+), 834 deletions(-) delete mode 100644 test/jdk/com/sun/security/sasl/gsskerb/AuthOnly.java delete mode 100644 test/jdk/com/sun/security/sasl/gsskerb/ConfSecurityLayer.java delete mode 100644 test/jdk/com/sun/security/sasl/gsskerb/NoSecurityLayer.java delete mode 100644 test/jdk/com/sun/security/sasl/gsskerb/PropertiesFileCallbackHandler.java delete mode 100644 test/jdk/com/sun/security/sasl/gsskerb/gsseg_jaas.conf delete mode 100644 test/jdk/com/sun/security/sasl/gsskerb/log.properties delete mode 100644 test/jdk/com/sun/security/sasl/gsskerb/run-conf-wjaas.csh delete mode 100644 test/jdk/com/sun/security/sasl/gsskerb/run-nosec-wjaas.csh delete mode 100644 test/jdk/com/sun/security/sasl/gsskerb/runwjaas.csh diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index e810d79d9a00..a2443b401efb 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -634,9 +634,6 @@ sun/security/smartcardio/TestExclusive.java 8039280 generic- sun/security/smartcardio/TestMultiplePresent.java 8039280 generic-all sun/security/smartcardio/TestPresent.java 8039280 generic-all sun/security/smartcardio/TestTransmit.java 8039280 generic-all -com/sun/security/sasl/gsskerb/AuthOnly.java 8039280 generic-all -com/sun/security/sasl/gsskerb/ConfSecurityLayer.java 8039280 generic-all -com/sun/security/sasl/gsskerb/NoSecurityLayer.java 8039280 generic-all sun/security/provider/PolicyFile/GrantAllPermToExtWhenNoPolicy.java 8039280 generic-all sun/security/provider/PolicyParser/PrincipalExpansionError.java 8039280 generic-all diff --git a/test/jdk/TEST.groups b/test/jdk/TEST.groups index 5100fbf27015..5faee8744a61 100644 --- a/test/jdk/TEST.groups +++ b/test/jdk/TEST.groups @@ -773,9 +773,6 @@ jdk_security_manual_no_input = \ :jdk_security_infra \ com/sun/crypto/provider/Cipher/AEAD/GCMIncrementByte4.java \ com/sun/crypto/provider/Cipher/AEAD/GCMIncrementDirect4.java \ - com/sun/security/sasl/gsskerb/AuthOnly.java \ - com/sun/security/sasl/gsskerb/ConfSecurityLayer.java \ - com/sun/security/sasl/gsskerb/NoSecurityLayer.java \ sun/security/provider/PolicyFile/GrantAllPermToExtWhenNoPolicy.java \ sun/security/provider/PolicyParser/PrincipalExpansionError.java \ sun/security/smartcardio/TestChannel.java \ diff --git a/test/jdk/com/sun/security/sasl/gsskerb/AuthOnly.java b/test/jdk/com/sun/security/sasl/gsskerb/AuthOnly.java deleted file mode 100644 index c8e906d0ac11..000000000000 --- a/test/jdk/com/sun/security/sasl/gsskerb/AuthOnly.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright (c) 2003, 2021, 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 4634892 - * @summary Ensure authentication via GSS-API/Kerberos v5 works. - * @run main/manual AuthOnly - */ - -/* - * Set logging to FINEST to view exchange. - * See runwjaas.csh for instructions for how to run this test. - */ - -import javax.security.sasl.*; -import javax.security.auth.callback.*; -import javax.security.auth.Subject; -import javax.security.auth.login.*; -import com.sun.security.auth.callback.*; -import java.util.HashMap; -import java.util.concurrent.Callable; - -public class AuthOnly { - private static final String MECH = "GSSAPI"; - private static final String SERVER_FQDN = "machineX.imc.org"; - private static final String PROTOCOL = "sample"; - - private static String namesfile, proxyfile; - private static final byte[] EMPTY = new byte[0]; - private static boolean auto; - private static boolean verbose = false; - - public static void main(String[] args) throws Exception { - if (args.length == 0) { - namesfile = null; - auto = true; - } else { - int i = 0; - if (args[i].equals("-m")) { - i++; - auto = false; - } - if (args.length > i) { - namesfile = args[i++]; - if (args.length > i) { - proxyfile = args[i]; - } - } else { - namesfile = null; - } - } - - CallbackHandler clntCbh = null; - final CallbackHandler srvCbh = new PropertiesFileCallbackHandler( - null, namesfile, proxyfile); - - Subject clntSubj = doLogin("client"); - Subject srvSubj = doLogin("server"); - final HashMap clntprops = new HashMap(); - final HashMap srvprops = new HashMap(); - - clntprops.put(Sasl.QOP, "auth"); - srvprops.put(Sasl.QOP, "auth,auth-int,auth-conf"); - - final SaslClient clnt = (SaslClient) - Subject.callAs(clntSubj, new Callable<>() { - public Object call() throws Exception { - return Sasl.createSaslClient( - new String[]{MECH}, null, PROTOCOL, SERVER_FQDN, - clntprops, null); - } - }); - - if (verbose) { - System.out.println(clntSubj); - System.out.println(srvSubj); - } - final SaslServer srv = (SaslServer) - Subject.callAs(srvSubj, new Callable() { - public Object call() throws Exception { - return Sasl.createSaslServer(MECH, PROTOCOL, SERVER_FQDN, - srvprops, srvCbh); - } - }); - - - if (clnt == null) { - throw new IllegalStateException( - "Unable to find client impl for " + MECH); - } - if (srv == null) { - throw new IllegalStateException( - "Unable to find server impl for " + MECH); - } - - byte[] response; - byte[] challenge; - - response = (byte[]) Subject.callAs(clntSubj, - () -> (clnt.hasInitialResponse()? clnt.evaluateChallenge(EMPTY) : EMPTY)); - - while (!clnt.isComplete() || !srv.isComplete()) { - final byte[] responseCopy = response; - challenge = (byte[]) Subject.callAs(srvSubj, - () -> srv.evaluateResponse(responseCopy)); - - if (challenge != null) { - final byte[] challengeCopy = challenge; - response = (byte[]) Subject.callAs(clntSubj, - () -> clnt.evaluateChallenge(challengeCopy)); - } - } - - if (clnt.isComplete() && srv.isComplete()) { - if (verbose) { - System.out.println("SUCCESS"); - System.out.println("authzid is " + srv.getAuthorizationID()); - } - } else { - throw new IllegalStateException("FAILURE: mismatched state:" + - " client complete? " + clnt.isComplete() + - " server complete? " + srv.isComplete()); - } - } - - private static Subject doLogin(String msg) throws LoginException { - LoginContext lc = null; - if (verbose) { - System.out.println(msg); - } - try { - lc = new LoginContext(msg, new TextCallbackHandler()); - - // Attempt authentication - // You might want to do this in a "for" loop to give - // user more than one chance to enter correct username/password - lc.login(); - - } catch (LoginException le) { - throw le; - } - return lc.getSubject(); - } -} diff --git a/test/jdk/com/sun/security/sasl/gsskerb/ConfSecurityLayer.java b/test/jdk/com/sun/security/sasl/gsskerb/ConfSecurityLayer.java deleted file mode 100644 index 8a699a5920d0..000000000000 --- a/test/jdk/com/sun/security/sasl/gsskerb/ConfSecurityLayer.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright (c) 2004, 2021, 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 5014493 - * @summary SaslServer.wrap throws NullPointerException when security - * layer negotiated. - * @run main/manual ConfSecurityLayer - */ - -/* - * Set logging to FINEST to view exchange. - * See run-conf-wjaas.csh for instructions for how to run this test. - */ - -import javax.security.sasl.*; -import javax.security.auth.callback.*; -import javax.security.auth.Subject; -import javax.security.auth.login.*; -import com.sun.security.auth.callback.*; -import java.util.HashMap; - -public class ConfSecurityLayer { - private static final String MECH = "GSSAPI"; - private static final String SERVER_FQDN = "machineX.imc.org"; - private static final String PROTOCOL = "sample"; - - private static String namesfile, proxyfile; - private static final byte[] EMPTY = new byte[0]; - private static boolean auto; - private static boolean verbose = false; - - public static void main(String[] args) throws Exception { - if (args.length == 0) { - namesfile = null; - auto = true; - } else { - int i = 0; - if (args[i].equals("-m")) { - i++; - auto = false; - } - if (args.length > i) { - namesfile = args[i++]; - if (args.length > i) { - proxyfile = args[i]; - } - } else { - namesfile = null; - } - } - - CallbackHandler clntCbh = null; - final CallbackHandler srvCbh = new PropertiesFileCallbackHandler( - null, namesfile, proxyfile); - - Subject clntSubj = doLogin("client"); - Subject srvSubj = doLogin("server"); - final HashMap clntprops = new HashMap(); - final HashMap srvprops = new HashMap(); - - clntprops.put(Sasl.QOP, "auth-conf"); - srvprops.put(Sasl.QOP, "auth,auth-int,auth-conf"); - - final SaslClient clnt = (SaslClient) - Subject.callAs(clntSubj, () ->Sasl.createSaslClient( - new String[]{MECH}, null, PROTOCOL, SERVER_FQDN, - clntprops, null)); - - if (verbose) { - System.out.println(clntSubj); - System.out.println(srvSubj); - } - final SaslServer srv = (SaslServer) - Subject.callAs(srvSubj, () -> - Sasl.createSaslServer(MECH, PROTOCOL, SERVER_FQDN, - srvprops, srvCbh)); - - - if (clnt == null) { - throw new IllegalStateException( - "Unable to find client impl for " + MECH); - } - if (srv == null) { - throw new IllegalStateException( - "Unable to find server impl for " + MECH); - } - - byte[] response; - byte[] challenge; - - response = Subject.callAs(clntSubj, - () -> (clnt.hasInitialResponse()? clnt.evaluateChallenge(EMPTY) : EMPTY)); - - while (!clnt.isComplete() || !srv.isComplete()) { - final byte[] responseCopy = response; - challenge = Subject.callAs(srvSubj, - () -> srv.evaluateResponse(responseCopy)); - - if (challenge != null) { - final byte[] challengeCopy = challenge; - response = Subject.callAs(clntSubj, - () -> clnt.evaluateChallenge(challengeCopy)); - } - } - - if (clnt.isComplete() && srv.isComplete()) { - if (verbose) { - System.out.println("SUCCESS"); - System.out.println("authzid is " + srv.getAuthorizationID()); - } - } else { - throw new IllegalStateException("FAILURE: mismatched state:" + - " client complete? " + clnt.isComplete() + - " server complete? " + srv.isComplete()); - } - - if (verbose) { - System.out.println(clnt.getNegotiatedProperty(Sasl.QOP)); - } - - // Now try to use security layer - - byte[] clntBuf = new byte[]{0, 1, 2, 3}; - byte[] wrappedClnt = clnt.wrap(clntBuf, 0, clntBuf.length); - System.out.println("plaintext2: " + bytesToString(clntBuf)); - System.out.println("wrapped2: " + bytesToString(wrappedClnt)); - - byte[] srvBuf = new byte[]{10, 11, 12, 13}; - byte[] wrappedSrv = srv.wrap(srvBuf, 0, srvBuf.length); - System.out.println("plaintext1: " + bytesToString(srvBuf)); - System.out.println("wrapped1: " + bytesToString(wrappedSrv)); - - byte[] unwrapped1 = clnt.unwrap(wrappedSrv, 0, wrappedSrv.length); - System.out.println("unwrapped1: " + bytesToString(unwrapped1)); - - byte[] unwrapped2 = srv.unwrap(wrappedClnt, 0, wrappedClnt.length); - System.out.println("unwrapped2: " + bytesToString(unwrapped2)); - } - - private static Subject doLogin(String msg) throws LoginException { - LoginContext lc = null; - if (verbose) { - System.out.println(msg); - } - try { - lc = new LoginContext(msg, new TextCallbackHandler()); - - // Attempt authentication - // You might want to do this in a "for" loop to give - // user more than one chance to enter correct username/password - lc.login(); - - } catch (LoginException le) { - throw le; - } - return lc.getSubject(); - } - - private static String bytesToString(byte[] digest) { - // Get character representation of digest - StringBuffer digestString = new StringBuffer(); - - for (int i = 0; i < digest.length; i++) { - if ((digest[i] & 0x000000ff) < 0x10) { - digestString.append("0" + - Integer.toHexString(digest[i] & 0x000000ff)); - } else { - digestString.append( - Integer.toHexString(digest[i] & 0x000000ff)); - } - } - return digestString.toString(); - } -} diff --git a/test/jdk/com/sun/security/sasl/gsskerb/NoSecurityLayer.java b/test/jdk/com/sun/security/sasl/gsskerb/NoSecurityLayer.java deleted file mode 100644 index 45d7d1fc1fb5..000000000000 --- a/test/jdk/com/sun/security/sasl/gsskerb/NoSecurityLayer.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright (c) 2003, 2021, 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 4873552 - * @summary GSS-API/krb5 SASL mechanism should throw IllegalStateException - * for auth-only - * @run main/manual NoSecurityLayer - */ - -/* - * Set logging to FINEST to view exchange. - * See run-nosec-wjaas.csh for instructions for how to run this test. - */ - -import javax.security.sasl.*; -import javax.security.auth.callback.*; -import javax.security.auth.Subject; -import javax.security.auth.login.*; -import com.sun.security.auth.callback.*; -import java.util.HashMap; - -public class NoSecurityLayer { - private static final String MECH = "GSSAPI"; - private static final String SERVER_FQDN = "anti.imc.org"; - private static final String PROTOCOL = "sample"; - - private static String namesfile, proxyfile; - private static final byte[] EMPTY = new byte[0]; - private static boolean auto; - private static boolean verbose = false; - - public static void main(String[] args) throws Exception { - if (args.length == 0) { - namesfile = null; - auto = true; - } else { - int i = 0; - if (args[i].equals("-m")) { - i++; - auto = false; - } - if (args.length > i) { - namesfile = args[i++]; - if (args.length > i) { - proxyfile = args[i]; - } - } else { - namesfile = null; - } - } - - CallbackHandler clntCbh = null; - final CallbackHandler srvCbh = new PropertiesFileCallbackHandler( - null, namesfile, proxyfile); - - Subject clntSubj = doLogin("client"); - Subject srvSubj = doLogin("server"); - final HashMap clntprops = new HashMap(); - final HashMap srvprops = new HashMap(); - - clntprops.put(Sasl.QOP, "auth"); - srvprops.put(Sasl.QOP, "auth,auth-int,auth-conf"); - - final SaslClient clnt = - Subject.callAs(clntSubj, () -> - Sasl.createSaslClient( - new String[]{MECH}, null, PROTOCOL, SERVER_FQDN, - clntprops, null)); - - if (verbose) { - System.out.println(clntSubj); - System.out.println(srvSubj); - } - final SaslServer srv = - Subject.callAs(srvSubj, () -> - Sasl.createSaslServer(MECH, PROTOCOL, SERVER_FQDN, - srvprops, srvCbh)); - - - if (clnt == null) { - throw new IllegalStateException( - "Unable to find client impl for " + MECH); - } - if (srv == null) { - throw new IllegalStateException( - "Unable to find server impl for " + MECH); - } - - byte[] response; - byte[] challenge; - - response = Subject.callAs(clntSubj, - () -> (clnt.hasInitialResponse()? clnt.evaluateChallenge(EMPTY) : EMPTY)); - - while (!clnt.isComplete() || !srv.isComplete()) { - final byte[] responseCopy = response; - challenge = Subject.callAs(srvSubj, - () -> srv.evaluateResponse(responseCopy)); - - if (challenge != null) { - final byte[] challengeCopy = challenge; - response = Subject.callAs(clntSubj, - () -> clnt.evaluateChallenge(challengeCopy)); - } - } - - if (clnt.isComplete() && srv.isComplete()) { - if (verbose) { - System.out.println("SUCCESS"); - System.out.println("authzid is " + srv.getAuthorizationID()); - } - } else { - throw new IllegalStateException("FAILURE: mismatched state:" + - " client complete? " + clnt.isComplete() + - " server complete? " + srv.isComplete()); - } - - if (verbose) { - System.out.println(clnt.getNegotiatedProperty(Sasl.QOP)); - } - - // Now try to use security layer - - byte[] clntBuf = new byte[]{0, 1, 2, 3}; - try { - byte[] wrapped = clnt.wrap(clntBuf, 0, clntBuf.length); - throw new Exception( - "clnt wrap should not be allowed w/no security layer"); - } catch (IllegalStateException e) { - // expected - } - - byte[] srvBuf = new byte[]{10, 11, 12, 13}; - try { - byte[] wrapped = srv.wrap(srvBuf, 0, srvBuf.length); - throw new Exception( - "srv wrap should not be allowed w/no security layer"); - } catch (IllegalStateException e) { - // expected - } - - try { - byte[] unwrapped = clnt.unwrap(clntBuf, 0, clntBuf.length); - throw new Exception( - "clnt wrap should not be allowed w/no security layer"); - } catch (IllegalStateException e) { - // expected - } - - try { - byte[] unwrapped = srv.unwrap(srvBuf, 0, srvBuf.length); - throw new Exception( - "srv wrap should not be allowed w/no security layer"); - } catch (IllegalStateException e) { - // expected - } - } - - private static Subject doLogin(String msg) throws LoginException { - LoginContext lc = null; - if (verbose) { - System.out.println(msg); - } - try { - lc = new LoginContext(msg, new TextCallbackHandler()); - - // Attempt authentication - // You might want to do this in a "for" loop to give - // user more than one chance to enter correct username/password - lc.login(); - - } catch (LoginException le) { - throw le; - } - return lc.getSubject(); - } -} diff --git a/test/jdk/com/sun/security/sasl/gsskerb/PropertiesFileCallbackHandler.java b/test/jdk/com/sun/security/sasl/gsskerb/PropertiesFileCallbackHandler.java deleted file mode 100644 index 79f19c74f58d..000000000000 --- a/test/jdk/com/sun/security/sasl/gsskerb/PropertiesFileCallbackHandler.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright (c) 2003, 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.security.auth.callback.*; -import java.util.Map; -import java.util.Properties; -import java.io.*; -import javax.security.sasl.AuthorizeCallback; -import javax.security.sasl.RealmCallback; - -public final class PropertiesFileCallbackHandler implements CallbackHandler { - private Properties pwDb, namesDb, proxyDb; - - /** - * Contents of files are in the Properties file format. - * - * @param pwFile name of file containing name/password pairs - * @param namesFile name of file containing name to canonicalized name - * @param proxyFile name of file containing authname to list of authzids - */ - public PropertiesFileCallbackHandler(String pwFile, String namesFile, - String proxyFile) throws IOException { - String dir = System.getProperty("test.src"); - if (dir == null) { - dir = "."; - } - dir = dir + "/"; - - if (pwFile != null) { - pwDb = new Properties(); - pwDb.load(new FileInputStream(dir+pwFile)); - } - - if (namesFile != null) { - namesDb = new Properties(); - namesDb.load(new FileInputStream(dir+namesFile)); - } - - if (proxyFile != null) { - proxyDb = new Properties(); - proxyDb.load(new FileInputStream(dir+proxyFile)); - } - } - - public void handle(Callback[] callbacks) - throws UnsupportedCallbackException { - NameCallback ncb = null; - PasswordCallback pcb = null; - AuthorizeCallback acb = null; - RealmCallback rcb = null; - - for (int i = 0; i < callbacks.length; i++) { - if (callbacks[i] instanceof NameCallback) { - ncb = (NameCallback) callbacks[i]; - } else if (callbacks[i] instanceof PasswordCallback) { - pcb = (PasswordCallback) callbacks[i]; - } else if (callbacks[i] instanceof AuthorizeCallback) { - acb = (AuthorizeCallback) callbacks[i]; - } else if (callbacks[i] instanceof RealmCallback) { - rcb = (RealmCallback) callbacks[i]; - } else { - throw new UnsupportedCallbackException(callbacks[i]); - } - } - - // Process retrieval of password; can get password iff - // username is available in NameCallback - // - // Ignore realm for now; could potentially use different dbs for - // different realms - - if (pcb != null && ncb != null) { - String username = ncb.getDefaultName(); - String pw = pwDb.getProperty(username); - if (pw != null) { - char[] pwchars = pw.toCharArray(); - pcb.setPassword(pwchars); - // Clear pw - for (int i = 0; i = 0) { - // XXX need to search for subtrings or use StringTokenizer - // to avoid incorrectly matching subnames - acb.setAuthorized(true); - } - } - - if (acb.isAuthorized()) { - // Set canonicalized name - String canonAuthzid = (namesDb != null ? - namesDb.getProperty(authzid) : null); - if (canonAuthzid != null) { - acb.setAuthorizedID(canonAuthzid); - } - } - } - } -} diff --git a/test/jdk/com/sun/security/sasl/gsskerb/gsseg_jaas.conf b/test/jdk/com/sun/security/sasl/gsskerb/gsseg_jaas.conf deleted file mode 100644 index 18deaa715d9b..000000000000 --- a/test/jdk/com/sun/security/sasl/gsskerb/gsseg_jaas.conf +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Login Configuration for JAAS. - * - * Specify that Kerberos v5 is a required login module for the - * example classes: GssExample and Mutual. - */ -other { - com.sun.security.auth.module.Krb5LoginModule required; -}; - -client { - com.sun.security.auth.module.Krb5LoginModule required - principal="john@IMC.ORG"; -}; -server { - com.sun.security.auth.module.Krb5LoginModule required storeKey=true - principal="sample/machineX.imc.org@IMC.ORG" - useKeyTab=true - keyTab=machineX.keytab; -}; - diff --git a/test/jdk/com/sun/security/sasl/gsskerb/log.properties b/test/jdk/com/sun/security/sasl/gsskerb/log.properties deleted file mode 100644 index c301c787474a..000000000000 --- a/test/jdk/com/sun/security/sasl/gsskerb/log.properties +++ /dev/null @@ -1,3 +0,0 @@ -javax.security.sasl.level=FINE -#handlers=java.util.logging.ConsoleHandler -#java.util.logging.ConsoleHandler.level=FINE diff --git a/test/jdk/com/sun/security/sasl/gsskerb/run-conf-wjaas.csh b/test/jdk/com/sun/security/sasl/gsskerb/run-conf-wjaas.csh deleted file mode 100644 index f284d3e43e68..000000000000 --- a/test/jdk/com/sun/security/sasl/gsskerb/run-conf-wjaas.csh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/csh -f -# -# @bug 5014493 -# @summary SaslServer.wrap throws NullPointerException when security -# layer negotiated -# -# BEFORE running this test, you need to set up the environment as follows. -# 1. Create a 'sample' service principal in the KDC. -# 2. Create a keytab for the server principal 'sample/fqdn@REALM' -# where 'fqdn' is the fully qualified domain name of the server and -# REALM is the KDC's realm. The principal must be a host-based service. -# For example, a principal name might be -# 'sample/machineX.imc.org@IMC.ORG'. -# On Windows, for example, you use the ktpass utility to create a host keytab -# file. -# c:> ktpass -princ sample/machineX.imc.org@IMC.ORG -mapuser sample \ -# -ptype KRB5_NT_SRV_HST \ -# -pass servertest123 -out machineX.keytab -# 3. Create a user principal in the KDC. -# 4. Set up a JAAS login module configuration file like gsseg_jaas.conf, updating -# the client and server entries according to the principal and machine names -# used. -# 5. Update AuthOnly.SERVER_FQDN with fqdn of server machine. -# 6. To examine exchange, turn on logging by adding -# -Djava.util.logging.config.file=log.properties -# 7. Update the realm and kdc settings in this script. -# -# -$JAVA_HOME/bin/java -Djava.security.krb5.realm=IMC.ORG -Djava.security.krb5.kdc=machineX.imc.org -Djava.security.auth.login.config=gsseg_jaas.conf ConfSecurityLayer diff --git a/test/jdk/com/sun/security/sasl/gsskerb/run-nosec-wjaas.csh b/test/jdk/com/sun/security/sasl/gsskerb/run-nosec-wjaas.csh deleted file mode 100644 index afac8e0eeaef..000000000000 --- a/test/jdk/com/sun/security/sasl/gsskerb/run-nosec-wjaas.csh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/csh -f -# -# BEFORE running this test, you need to set up the environment as follows. -# 1. Create a 'sample' service principal in the KDC. -# 2. Create a keytab for the server principal 'sample/fqdn@REALM' -# where 'fqdn' is the fully qualified domain name of the server and -# REALM is the KDC's realm. The principal must be a host-based service. -# For example, a principal name might be -# 'sample/machineX.imc.org@IMC.ORG'. -# On Windows, for example, you use the ktpass utility to create a host keytab -# file. -# c:> ktpass -princ sample/machineX.imc.org@IMC.ORG -mapuser sample \ -# -ptype KRB5_NT_SRV_HST \ -# -pass servertest123 -out machineX.keytab -# 3. Create a user principal in the KDC. -# 4. Set up a JAAS login module configuration file like gsseg_jaas.conf, updating -# the client and server entries according to the principal and machine names -# used. -# 5. Update AuthOnly.SERVER_FQDN with fqdn of server machine. -# 6. To examine exchange, turn on logging by adding -# -Djava.util.logging.config.file=log.properties -# 7. Update the realm and kdc settings in this script. -# -java -Djava.security.krb5.realm=IMC.ORG -Djava.security.krb5.kdc=machineX.imc.org -Djava.security.auth.login.config=gsseg_jaas.conf NoSecurityLayer diff --git a/test/jdk/com/sun/security/sasl/gsskerb/runwjaas.csh b/test/jdk/com/sun/security/sasl/gsskerb/runwjaas.csh deleted file mode 100644 index 9757b818de4e..000000000000 --- a/test/jdk/com/sun/security/sasl/gsskerb/runwjaas.csh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/csh -f -# -# BEFORE running this test, you need to set up the environment as follows. -# 1. Create a 'sample' service principal in the KDC. -# 2. Create a keytab for the server principal 'sample/fqdn@REALM' -# where 'fqdn' is the fully qualified domain name of the server and -# REALM is the KDC's realm. The principal must be a host-based service. -# For example, a principal name might be -# 'sample/machineX.imc.org@IMC.ORG'. -# On Windows, for example, you use the ktpass utility to create a host keytab -# file. -# c:> ktpass -princ sample/machineX.imc.org@IMC.ORG -mapuser sample \ -# -ptype KRB5_NT_SRV_HST \ -# -pass servertest123 -out machineX.keytab -# 3. Create a user principal in the KDC. -# 4. Set up a JAAS login module configuration file like gsseg_jaas.conf, updating -# the client and server entries according to the principal and machine names -# used. -# 5. Update AuthOnly.SERVER_FQDN with fqdn of server machine. -# 6. To examine exchange, turn on logging by adding -# -Djava.util.logging.config.file=log.properties -# 7. Update the realm and kdc settings in this script. -# -java -Djava.security.krb5.realm=IMC.ORG -Djava.security.krb5.kdc=machineX.imc.org -Djava.security.auth.login.config=gsseg_jaas.conf AuthOnly diff --git a/test/jdk/sun/security/krb5/auto/SaslBasic.java b/test/jdk/sun/security/krb5/auto/SaslBasic.java index 0aebdefbe04a..89eb22383f27 100644 --- a/test/jdk/sun/security/krb5/auto/SaslBasic.java +++ b/test/jdk/sun/security/krb5/auto/SaslBasic.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2025, 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 @@ -32,12 +32,11 @@ * @run main/othervm -Djdk.net.hosts.file=TestHosts SaslBasic unbound auth-conf * @run main/othervm -Djdk.net.hosts.file=TestHosts SaslBasic bound auth */ -import java.io.IOException; +import static jdk.test.lib.Asserts.assertEquals; + import java.util.Arrays; import java.util.HashMap; import javax.security.auth.callback.Callback; -import javax.security.auth.callback.CallbackHandler; -import javax.security.auth.callback.UnsupportedCallbackException; import javax.security.sasl.*; // The basic krb5 test skeleton you can copy from @@ -61,15 +60,12 @@ public static void main(String[] args) throws Exception { srvprops.put(Sasl.QOP, "auth,auth-int,auth-conf"); SaslServer ss = Sasl.createSaslServer("GSSAPI", "server", bound? name: null, srvprops, - new CallbackHandler() { - public void handle(Callback[] callbacks) - throws IOException, UnsupportedCallbackException { - for (Callback cb : callbacks) { - if (cb instanceof RealmCallback) { - ((RealmCallback) cb).setText(OneKDC.REALM); - } else if (cb instanceof AuthorizeCallback) { - ((AuthorizeCallback) cb).setAuthorized(true); - } + callbacks -> { + for (Callback cb : callbacks) { + if (cb instanceof RealmCallback) { + ((RealmCallback) cb).setText(OneKDC.REALM); + } else if (cb instanceof AuthorizeCallback) { + ((AuthorizeCallback) cb).setAuthorized(true); } } }); @@ -89,28 +85,85 @@ public void handle(Callback[] callbacks) String boundName = (String)ss.getNegotiatedProperty( Sasl.BOUND_SERVER_NAME); if (!boundName.equals(name)) { - throw new Exception("Wrong bound server name"); + throw new RuntimeException("Wrong bound server name"); } } Object key = ss.getNegotiatedProperty( "com.sun.security.jgss.inquiretype.krb5_get_session_key"); if (key == null) { - throw new Exception("Extended negotiated property not read"); + throw new RuntimeException("Extended negotiated property not read"); } if (args[1].equals("auth")) { // 8170732. These are the maximum size bytes after jgss/krb5 wrap. if (lastClientToken[17] != 0 || lastClientToken[18] != 0 || lastClientToken[19] != 0) { - throw new Exception("maximum size for auth must be 0"); + throw new RuntimeException("maximum size for auth must be 0"); } + testWrapUnwrapNoSecLayer(sc, ss); } else { - byte[] hello = "hello".getBytes(); - token = sc.wrap(hello, 0, hello.length); - token = ss.unwrap(token, 0, token.length); - if (!Arrays.equals(hello, token)) { - throw new Exception("Message altered"); - } + testWrapUnwrapWithSecLayer(sc, ss); + } + } + + private static void testWrapUnwrapWithSecLayer(SaslClient sc, SaslServer ss) + throws SaslException { + byte[] token; + byte[] hello = "hello".getBytes(); + + // test client wrap and server unwrap + token = sc.wrap(hello, 0, hello.length); + token = ss.unwrap(token, 0, token.length); + + if (!Arrays.equals(hello, token)) { + throw new RuntimeException("Client message altered"); + } + + // test server wrap and client unwrap + token = ss.wrap(hello, 0, hello.length); + token = sc.unwrap(token, 0, token.length); + + if (!Arrays.equals(hello, token)) { + throw new RuntimeException("Server message altered"); + } + } + + private static void testWrapUnwrapNoSecLayer(SaslClient sc, SaslServer ss) + throws SaslException { + byte[] clntBuf = new byte[]{0, 1, 2, 3}; + byte[] srvBuf = new byte[]{10, 11, 12, 13}; + String expectedError = "No security layer negotiated"; + + try { + sc.wrap(clntBuf, 0, clntBuf.length); + throw new RuntimeException( + "client wrap should not be allowed w/no security layer"); + } catch (IllegalStateException e) { + assertEquals(expectedError, e.getMessage()); + } + + try { + ss.wrap(srvBuf, 0, srvBuf.length); + throw new RuntimeException( + "server wrap should not be allowed w/no security layer"); + } catch (IllegalStateException e) { + assertEquals(expectedError, e.getMessage()); + } + + try { + sc.unwrap(clntBuf, 0, clntBuf.length); + throw new RuntimeException( + "client unwrap should not be allowed w/no security layer"); + } catch (IllegalStateException e) { + assertEquals(expectedError, e.getMessage()); + } + + try { + ss.unwrap(srvBuf, 0, srvBuf.length); + throw new RuntimeException( + "server unwrap should not be allowed w/no security layer"); + } catch (IllegalStateException e) { + assertEquals(expectedError, e.getMessage()); } } } From 0707a44e23e9269bcdd69ebd0ffaba13f15df8ec Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 12 Sep 2025 09:04:40 +0000 Subject: [PATCH 034/323] 8204868: java/util/zip/ZipFile/TestCleaner.java still fails with "cleaner failed to clean zipfile." Backport-of: 3626ac35b34650dc64938af63ea21f9f4e011fe4 --- .../java/util/zip/ZipFile/TestCleaner.java | 56 +++++++++++-------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/test/jdk/java/util/zip/ZipFile/TestCleaner.java b/test/jdk/java/util/zip/ZipFile/TestCleaner.java index d24aa5045fd0..103191c96dd7 100644 --- a/test/jdk/java/util/zip/ZipFile/TestCleaner.java +++ b/test/jdk/java/util/zip/ZipFile/TestCleaner.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, 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 @@ -23,16 +23,24 @@ /* @test * @bug 8185582 8197989 - * @modules java.base/java.util.zip:open java.base/jdk.internal.vm.annotation * @summary Check the resources of Inflater, Deflater and ZipFile are always * cleaned/released when the instance is not unreachable + * @modules java.base/java.util.zip:open java.base/jdk.internal.vm.annotation + * @library /test/lib + * @comment The test relies on the Cleaner to invoke the cleaning actions. So + * we use "othervm" to prevent any Cleaner delays that could be contributed by any + * other tests or code that might have executed on the agentvm prior to this test + * execution + * @run main/othervm TestCleaner */ import java.io.*; import java.lang.reflect.*; import java.util.*; +import java.util.concurrent.atomic.AtomicLong; import java.util.zip.*; import jdk.internal.vm.annotation.DontInline; +import jdk.test.lib.util.ForceGC; import static java.nio.charset.StandardCharsets.US_ASCII; public class TestCleaner { @@ -59,11 +67,11 @@ private static void testDeInflater() throws Throwable { Field zsRefDef = Deflater.class.getDeclaredField("zsRef"); Field zsRefInf = Inflater.class.getDeclaredField("zsRef"); if (!zsRefDef.trySetAccessible() || !zsRefInf.trySetAccessible()) { - throw new RuntimeException("'zsRef' is not accesible"); + throw new RuntimeException("'zsRef' is not accessible"); } if (addrOf(zsRefDef.get(new Deflater())) == -1 || addrOf(zsRefInf.get(new Inflater())) == -1) { - throw new RuntimeException("'addr' is not accesible"); + throw new RuntimeException("'addr' is not accessible"); } List list = new ArrayList<>(); byte[] buf1 = new byte[1024]; @@ -84,16 +92,17 @@ private static void testDeInflater() throws Throwable { } } - int n = 10; - long cnt = list.size(); - while (n-- > 0 && cnt != 0) { - Thread.sleep(100); - System.gc(); - cnt = list.stream().filter(o -> addrOf(o) != 0).count(); + final AtomicLong numNotYetCleaned = new AtomicLong(); + // trigger GC + final boolean resourcesCleaned = ForceGC.wait(() -> { + final long remaining = list.stream().filter(o -> addrOf(o) != 0).count(); + numNotYetCleaned.set(remaining); + return remaining == 0; + }); + if (!resourcesCleaned) { + throw new RuntimeException(numNotYetCleaned.get() + + " resources haven't yet been cleaned"); } - if (cnt != 0) - throw new RuntimeException("cleaner failed to clean : " + cnt); - } @DontInline @@ -139,17 +148,18 @@ private static void testZipFile() throws Throwable { if (zsrc != null) { Field zfileField = zsrc.getClass().getDeclaredField("zfile"); if (!zfileField.trySetAccessible()) { - throw new RuntimeException("'ZipFile.Source.zfile' is not accesible"); - } - //System.out.println("zffile: " + zfileField.get(zsrc)); - int n = 10; - while (n-- > 0 && zfileField.get(zsrc) != null) { - System.out.println("waiting gc ... " + n); - System.gc(); - Thread.sleep(100); + throw new RuntimeException("'ZipFile.Source.zfile' is not accessible"); } - if (zfileField.get(zsrc) != null) { - throw new RuntimeException("cleaner failed to clean zipfile."); + final boolean resourceCleaned = ForceGC.wait(() -> { + try { + return zfileField.get(zsrc) == null; + } catch (IllegalAccessException e) { + // shouldn't happen + throw new RuntimeException(e); + } + }); + if (!resourceCleaned) { + throw new RuntimeException("cleaner failed to clean zipfile " + zip); } } } From dff779868d515be501f459c15e9bb3f71da0868f Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 12 Sep 2025 09:06:47 +0000 Subject: [PATCH 035/323] 8219408: Tests should handle ${} in the view of jtreg "smart action" Backport-of: 353e1738f6eb9965571e1de881d209b698492e6e --- test/jdk/com/sun/security/auth/login/ConfigFile/TEST.properties | 2 -- .../jdk/java/security/Security/SecurityPropFile/TEST.properties | 2 -- test/jdk/javax/security/auth/login/TEST.properties | 2 -- test/jdk/sun/security/util/Resources/TEST.properties | 2 -- 4 files changed, 8 deletions(-) delete mode 100644 test/jdk/com/sun/security/auth/login/ConfigFile/TEST.properties delete mode 100644 test/jdk/java/security/Security/SecurityPropFile/TEST.properties delete mode 100644 test/jdk/javax/security/auth/login/TEST.properties delete mode 100644 test/jdk/sun/security/util/Resources/TEST.properties diff --git a/test/jdk/com/sun/security/auth/login/ConfigFile/TEST.properties b/test/jdk/com/sun/security/auth/login/ConfigFile/TEST.properties deleted file mode 100644 index 908b451f8ea6..000000000000 --- a/test/jdk/com/sun/security/auth/login/ConfigFile/TEST.properties +++ /dev/null @@ -1,2 +0,0 @@ -# disabled till JDK-8219408 is fixed -allowSmartActionArgs=false diff --git a/test/jdk/java/security/Security/SecurityPropFile/TEST.properties b/test/jdk/java/security/Security/SecurityPropFile/TEST.properties deleted file mode 100644 index 908b451f8ea6..000000000000 --- a/test/jdk/java/security/Security/SecurityPropFile/TEST.properties +++ /dev/null @@ -1,2 +0,0 @@ -# disabled till JDK-8219408 is fixed -allowSmartActionArgs=false diff --git a/test/jdk/javax/security/auth/login/TEST.properties b/test/jdk/javax/security/auth/login/TEST.properties deleted file mode 100644 index 908b451f8ea6..000000000000 --- a/test/jdk/javax/security/auth/login/TEST.properties +++ /dev/null @@ -1,2 +0,0 @@ -# disabled till JDK-8219408 is fixed -allowSmartActionArgs=false diff --git a/test/jdk/sun/security/util/Resources/TEST.properties b/test/jdk/sun/security/util/Resources/TEST.properties deleted file mode 100644 index 908b451f8ea6..000000000000 --- a/test/jdk/sun/security/util/Resources/TEST.properties +++ /dev/null @@ -1,2 +0,0 @@ -# disabled till JDK-8219408 is fixed -allowSmartActionArgs=false From 30739f2939fd34eb4f7daa6f48a4dffb9ad835bb Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 12 Sep 2025 09:07:14 +0000 Subject: [PATCH 036/323] 8351567: Jar Manifest test ValueUtf8Coding produces misleading diagnostic output Backport-of: ffa63409884e9a2d41f5223ab5962980edbb008c --- test/jdk/java/util/jar/Manifest/ValueUtf8Coding.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/test/jdk/java/util/jar/Manifest/ValueUtf8Coding.java b/test/jdk/java/util/jar/Manifest/ValueUtf8Coding.java index 533007dcf7a4..28921bba8681 100644 --- a/test/jdk/java/util/jar/Manifest/ValueUtf8Coding.java +++ b/test/jdk/java/util/jar/Manifest/ValueUtf8Coding.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, 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 @@ -37,7 +37,7 @@ /** * @test - * @bug 8066619 + * @bug 8066619 8351567 * @run testng ValueUtf8Coding * @summary Tests encoding and decoding manifest header values to and from * UTF-8 with the complete Unicode character set. @@ -201,10 +201,6 @@ static Manifest writeAndRead(Manifest mf) throws IOException { mf.write(out); byte[] mfBytes = out.toByteArray(); - System.out.println("-".repeat(72)); - System.out.print(new String(mfBytes, UTF_8)); - System.out.println("-".repeat(72)); - ByteArrayInputStream in = new ByteArrayInputStream(mfBytes); return new Manifest(in); } From f0bceb80a7936bca3f36dc09878ca54f4e56640f Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 12 Sep 2025 09:09:27 +0000 Subject: [PATCH 037/323] 8353585: Provide ChoiceFormat#parse(String, ParsePosition) tests Backport-of: fd2734e97d3ef505473938109746ae59d5fefca6 --- .../text/Format/ChoiceFormat/ParseTest.java | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 test/jdk/java/text/Format/ChoiceFormat/ParseTest.java diff --git a/test/jdk/java/text/Format/ChoiceFormat/ParseTest.java b/test/jdk/java/text/Format/ChoiceFormat/ParseTest.java new file mode 100644 index 000000000000..17ead8f450c9 --- /dev/null +++ b/test/jdk/java/text/Format/ChoiceFormat/ParseTest.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2025, 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 8353585 + * @summary Basic parse tests. Enforce regular behavior, no match, and multi match. + * @run junit ParseTest + */ + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.text.ChoiceFormat; +import java.text.ParsePosition; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class ParseTest { + + // Ensure that the parsed text produces the expected number + // i.e. return limit corresponding to format matched + @ParameterizedTest + @MethodSource + void parseTest(String pattern, String text, Double expected, int index) { + var pp = new ParsePosition(index); + var fmt = new ChoiceFormat(pattern); + assertEquals(expected, fmt.parse(text, pp), "Incorrect limit returned"); + if (expected.equals(Double.NaN)) { // AKA failed parse + assertEquals(index, pp.getErrorIndex(), + "Failed parse produced incorrect error index"); + } else { + assertEquals(-1, pp.getErrorIndex(), + "Error index should remain -1 on match"); + } + } + + private static Stream parseTest() { + return Stream.of( + Arguments.of("1#foo", "foo", Double.NaN, -1), + Arguments.of("1#baz", "foo bar baz", Double.NaN, 20), + Arguments.of("1#baz", "foo bar baz", 1d, 8), + Arguments.of("1#baz", "foo baz quux", Double.NaN, 8), + Arguments.of("1#a", "", Double.NaN, 0), + Arguments.of("1#a", "a", 1d, 0), + Arguments.of("1# ", " ", 1d, 0), + Arguments.of("1#a|2#a", "a", 1d, 0), + Arguments.of("1#a|2#aa", "aa", 2d, 0), + Arguments.of("1#a|2#aa", "aabb", 2d, 0), + Arguments.of("1#a|2#aa", "bbaa", Double.NaN, 0), + Arguments.of("1#aa|2#aaa", "a", Double.NaN, 0) + ); + } +} From 73715e3342a4dc5fc1d1aaccdd2f62b646d91630 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 12 Sep 2025 09:15:02 +0000 Subject: [PATCH 038/323] 8355558: SJIS.java test is always ignored Backport-of: c0dc31422d6e7435ad7abdb547dedcc50b7fc0c3 --- test/jdk/java/io/pathNames/win32/SJIS.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/test/jdk/java/io/pathNames/win32/SJIS.java b/test/jdk/java/io/pathNames/win32/SJIS.java index d1cad9dec9fe..580f06330a6e 100644 --- a/test/jdk/java/io/pathNames/win32/SJIS.java +++ b/test/jdk/java/io/pathNames/win32/SJIS.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2025, 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,9 +26,15 @@ @summary Check that pathnames containing double-byte characters are not corrupted by win32 path processing @author Mark Reinhold + @library /test/lib */ -import java.io.*; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import jtreg.SkippedException; public class SJIS { @@ -47,8 +53,11 @@ public static void main(String[] args) throws Exception { /* This test is only valid on win32 systems that use the SJIS encoding */ if (File.separatorChar != '\\') return; - String enc = System.getProperty("file.encoding"); - if ((enc == null) || !enc.equals("SJIS")) return; + String enc = System.getProperty("native.encoding"); + if ((enc == null) || !enc.equals("MS932")) { + throw new SkippedException( + "native.encoding(%s) is not MS932".formatted(enc)); + } File f = new File("\u30BD"); if (f.exists()) rm(f); From a2e02dcad46f95721280aee0b9ceb0c4a2e29659 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 12 Sep 2025 09:17:55 +0000 Subject: [PATCH 039/323] 8318730: MonitorVmStartTerminate.java still times out after JDK-8209595 Backport-of: 841989b2701b4ee0ec9be03d8007e6788edf56b4 --- .../MonitoredVm/MonitorVmStartTerminate.java | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/test/jdk/sun/jvmstat/monitor/MonitoredVm/MonitorVmStartTerminate.java b/test/jdk/sun/jvmstat/monitor/MonitoredVm/MonitorVmStartTerminate.java index 1a59b0df1187..b4291645007d 100644 --- a/test/jdk/sun/jvmstat/monitor/MonitoredVm/MonitorVmStartTerminate.java +++ b/test/jdk/sun/jvmstat/monitor/MonitoredVm/MonitorVmStartTerminate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2025, 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 @@ -74,6 +74,7 @@ public final class MonitorVmStartTerminate { private static final int PROCESS_COUNT = 10; + private static final int ARGS_ATTEMPTS = 10; public static void main(String... args) throws Exception { @@ -175,8 +176,6 @@ private void releaseTerminated(Integer id) { } } - private static final int ARGS_ATTEMPTS = 3; - private boolean hasMainArgs(Integer id, String args) { VmIdentifier vmid = null; try { @@ -204,7 +203,10 @@ private boolean hasMainArgs(Integer id, String args) { } catch (MonitorException e) { // Process probably not running or not ours, e.g. // sun.jvmstat.monitor.MonitorException: Could not attach to PID - System.out.println("hasMainArgs(" + id + "): " + e); + // Only log if something else, to avoid filling log: + if (!e.getMessage().contains("Could not attach")) { + System.out.println("hasMainArgs(" + id + "): " + e); + } } } return false; @@ -249,23 +251,15 @@ private static void createFile(Path path) throws IOException { } private static void waitForRemoval(Path path) { - String timeoutFactorText = System.getProperty("test.timeout.factor", "1.0"); - double timeoutFactor = Double.parseDouble(timeoutFactorText); - long timeoutNanos = 1000_000_000L*(long)(1000*timeoutFactor); long start = System.nanoTime(); + System.out.println("Waiting for " + path + " to be removed"); while (true) { long now = System.nanoTime(); long waited = now - start; - System.out.println("Waiting for " + path + " to be removed, " + waited + " ns"); if (!Files.exists(path)) { + System.out.println("waitForRemoval: " + path + " has been removed in " + waited + " ns"); return; } - if (waited > timeoutNanos) { - System.out.println("Start: " + start); - System.out.println("Now: " + now); - System.out.println("Process timed out after " + waited + " ns. Abort."); - System.exit(1); - } takeNap(); } } From f9498ae7e6c8061b205e0b3cdf78115bdde0c75b Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 12 Sep 2025 09:20:42 +0000 Subject: [PATCH 040/323] 8355444: [java.io] Use @requires tag instead of exiting based on "os.name" property value Backport-of: 5faa55902211e5ad8edc51282022ed9db3684b25 --- test/jdk/java/io/File/MacPathTest.java | 11 ++++++----- test/jdk/java/io/File/MaxPath.java | 11 ++++++++--- test/jdk/java/io/File/WinDeviceName.java | 7 ++----- test/jdk/java/io/File/WinMaxPath.java | 7 ++----- test/jdk/java/io/File/WinSpecialFiles.java | 7 ++----- test/jdk/java/io/FileOutputStream/ManyFiles.java | 11 +---------- 6 files changed, 21 insertions(+), 33 deletions(-) diff --git a/test/jdk/java/io/File/MacPathTest.java b/test/jdk/java/io/File/MacPathTest.java index c5b50f7e2cf3..7082c4c13e97 100644 --- a/test/jdk/java/io/File/MacPathTest.java +++ b/test/jdk/java/io/File/MacPathTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2025, 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 @@ -21,6 +21,11 @@ * questions. */ +/* + * This test is launched via a ProcessBuilder in the main test MacPath which + * includes a @requires (os.family == "mac") tag so no operating system + * conditional is applied here. + */ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -29,10 +34,6 @@ public class MacPathTest { public static void main(String args[]) throws Throwable { - String osname = System.getProperty("os.name"); - if (!osname.contains("OS X") && !osname.contains("Darwin")) - return; - // English test("TestDir_apple", // test dir "dir_macosx", // dir diff --git a/test/jdk/java/io/File/MaxPath.java b/test/jdk/java/io/File/MaxPath.java index 658d6a7904b4..269b291709cc 100644 --- a/test/jdk/java/io/File/MaxPath.java +++ b/test/jdk/java/io/File/MaxPath.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,16 +24,21 @@ /* @test @bug 6481955 @summary Path length less than MAX_PATH (260) works on Windows + @library /test/lib */ -import java.io.*; +import java.io.File; +import java.io.IOException; + +import jtreg.SkippedException; public class MaxPath { public static void main(String[] args) throws Exception { String osName = System.getProperty("os.name"); if (!osName.startsWith("Windows")) { - return; + throw new SkippedException("This test is run only on Windows"); } + int MAX_PATH = 260; String dir = new File(".").getAbsolutePath() + "\\"; String padding = "1234567890123456789012345678901234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890"; diff --git a/test/jdk/java/io/File/WinDeviceName.java b/test/jdk/java/io/File/WinDeviceName.java index a0afe2cade96..0c357fa231f2 100644 --- a/test/jdk/java/io/File/WinDeviceName.java +++ b/test/jdk/java/io/File/WinDeviceName.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,7 @@ /* @test @bug 6176051 4858457 @summary Check whether reserved names are handled correctly on Windows + @requires (os.family == "windows") */ import java.io.File; @@ -38,10 +39,6 @@ public class WinDeviceName { }; public static void main(String[] args) { String osName = System.getProperty("os.name"); - if (!osName.startsWith("Windows")) { - return; - } - for (int i = 0; i < devnames.length; i++) { String names[] = { devnames[i], devnames[i] + ".TXT", devnames[i].toLowerCase(), diff --git a/test/jdk/java/io/File/WinMaxPath.java b/test/jdk/java/io/File/WinMaxPath.java index 21dba4cc12c1..704b633395ae 100644 --- a/test/jdk/java/io/File/WinMaxPath.java +++ b/test/jdk/java/io/File/WinMaxPath.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2025, 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 @@ -25,15 +25,12 @@ @bug 6384833 @summary Check if appropriate exception FileNotFoundException gets thrown when the pathlengh exceeds the limit. + @requires (os.family == "windows") */ import java.io.*; public class WinMaxPath { public static void main(String[] args) throws Exception { - String osName = System.getProperty("os.name"); - if (!osName.startsWith("Windows")) { - return; - } try { char[] as = new char[65000]; java.util.Arrays.fill(as, 'a'); diff --git a/test/jdk/java/io/File/WinSpecialFiles.java b/test/jdk/java/io/File/WinSpecialFiles.java index a5bff3014959..027aba769d90 100644 --- a/test/jdk/java/io/File/WinSpecialFiles.java +++ b/test/jdk/java/io/File/WinSpecialFiles.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2025, 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 @@ -25,15 +25,12 @@ @bug 6192331 6348207 8202076 @summary Check if File.exists()/length() works correctly on Windows special files hiberfil.sys and pagefile.sys + @requires (os.family == "windows") */ import java.io.File; public class WinSpecialFiles { public static void main(String[] args) throws Exception { - String osName = System.getProperty("os.name"); - if (!osName.startsWith("Windows")) { - return; - } File root = new File("C:\\"); File[] dir = root.listFiles(); for (int i = 0; i < dir.length; i++) { diff --git a/test/jdk/java/io/FileOutputStream/ManyFiles.java b/test/jdk/java/io/FileOutputStream/ManyFiles.java index 5584a8f42ca8..3aad65de4326 100644 --- a/test/jdk/java/io/FileOutputStream/ManyFiles.java +++ b/test/jdk/java/io/FileOutputStream/ManyFiles.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2025, 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 @@ -37,15 +37,6 @@ public class ManyFiles { static int NUM_FILES = 2050; public static void main(String args[]) throws Exception { - // Linux does not yet allow opening this many files; Solaris - // 8 requires an explicit allocation of more file descriptors - // to succeed. Since this test is written to check for a - // Windows capability it is much simpler to only run it - // on that platform. - String osName = System.getProperty("os.name"); - if (osName.startsWith("Linux")) - return; - for (int n = 0; n < NUM_FILES; n++) { File f = new File("file" + count++); files.add(f); From b5347a909e72c2eec1ff8d0b0a9ac6a13d06f6f8 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 12 Sep 2025 09:23:25 +0000 Subject: [PATCH 041/323] 8360478: libjsig related tier3 jtreg tests fail when asan is configured Backport-of: a23de2ec090628b52532ee5d9bd4364a97499f5b --- make/data/asan/asan_default_options.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/make/data/asan/asan_default_options.c b/make/data/asan/asan_default_options.c index 9e0887c5f67f..708210451762 100644 --- a/make/data/asan/asan_default_options.c +++ b/make/data/asan/asan_default_options.c @@ -67,6 +67,8 @@ ATTRIBUTE_DEFAULT_VISIBILITY ATTRIBUTE_USED const char* CDECL __asan_default_opt #endif "print_suppressions=0," "handle_segv=0," + // A lot of libjsig related tests fail because of the link order check; so better avoid it + "verify_asan_link_order=0," // See https://github.com/google/sanitizers/issues/1322. Hopefully this is resolved // at some point and we can remove this option. "intercept_tls_get_addr=0"; From cb5622b00433fe5e728ac1246de29680a7ae22be Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 12 Sep 2025 09:26:01 +0000 Subject: [PATCH 042/323] 8361748: Enforce limits on the size of an XBM image Backport-of: c71be802b530034169d17325478dba6e2f1c3238 --- .../sun/awt/image/XbmImageDecoder.java | 205 ++++++++++-------- .../awt/image/XBMDecoder/XBMDecoderTest.java | 77 +++++++ .../jdk/java/awt/image/XBMDecoder/invalid.xbm | 2 + .../java/awt/image/XBMDecoder/invalid_hex.xbm | 3 + .../java/awt/image/XBMDecoder/invalid_ht.xbm | 3 + test/jdk/java/awt/image/XBMDecoder/valid.xbm | 6 + .../java/awt/image/XBMDecoder/valid_hex.xbm | 4 + 7 files changed, 212 insertions(+), 88 deletions(-) create mode 100644 test/jdk/java/awt/image/XBMDecoder/XBMDecoderTest.java create mode 100644 test/jdk/java/awt/image/XBMDecoder/invalid.xbm create mode 100644 test/jdk/java/awt/image/XBMDecoder/invalid_hex.xbm create mode 100644 test/jdk/java/awt/image/XBMDecoder/invalid_ht.xbm create mode 100644 test/jdk/java/awt/image/XBMDecoder/valid.xbm create mode 100644 test/jdk/java/awt/image/XBMDecoder/valid_hex.xbm diff --git a/src/java.desktop/share/classes/sun/awt/image/XbmImageDecoder.java b/src/java.desktop/share/classes/sun/awt/image/XbmImageDecoder.java index 03b36b3b819a..cac9f8baab20 100644 --- a/src/java.desktop/share/classes/sun/awt/image/XbmImageDecoder.java +++ b/src/java.desktop/share/classes/sun/awt/image/XbmImageDecoder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2025, 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 @@ -23,13 +23,22 @@ * questions. */ -/*- +/* * Reads xbitmap format images into a DIBitmap structure. */ package sun.awt.image; -import java.io.*; -import java.awt.image.*; +import java.awt.image.ImageConsumer; +import java.awt.image.IndexColorModel; +import java.io.BufferedInputStream; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static java.lang.Math.multiplyExact; /** * Parse files of the form: @@ -50,6 +59,8 @@ public class XbmImageDecoder extends ImageDecoder { ImageConsumer.COMPLETESCANLINES | ImageConsumer.SINGLEPASS | ImageConsumer.SINGLEFRAME); + private static final int MAX_XBM_SIZE = 16384; + private static final int HEADER_SCAN_LIMIT = 100; public XbmImageDecoder(InputStreamImageSource src, InputStream is) { super(src, is); @@ -72,107 +83,125 @@ private static void error(String s1) throws ImageFormatException { * produce an image from the stream. */ public void produceImage() throws IOException, ImageFormatException { - char[] nm = new char[80]; - int c; - int i = 0; - int state = 0; int H = 0; int W = 0; int x = 0; int y = 0; - boolean start = true; + int n = 0; + int state = 0; byte[] raster = null; IndexColorModel model = null; - while (!aborted && (c = input.read()) != -1) { - if ('a' <= c && c <= 'z' || - 'A' <= c && c <= 'Z' || - '0' <= c && c <= '9' || c == '#' || c == '_') { - if (i < 78) - nm[i++] = (char) c; - } else if (i > 0) { - int nc = i; - i = 0; - if (start) { - if (nc != 7 || - nm[0] != '#' || - nm[1] != 'd' || - nm[2] != 'e' || - nm[3] != 'f' || - nm[4] != 'i' || - nm[5] != 'n' || - nm[6] != 'e') - { - error("Not an XBM file"); + + String matchRegex = "(0[xX])?[0-9a-fA-F]+[\\s+]?[,|};]"; + String replaceRegex = "(0[xX])|,|[\\s+]|[};]"; + + String line; + int lineNum = 0; + + try (BufferedReader br = new BufferedReader(new InputStreamReader(input))) { + // loop to process XBM header - width, height and create raster + while (!aborted && (line = br.readLine()) != null + && lineNum <= HEADER_SCAN_LIMIT) { + lineNum++; + // process #define stmts + if (line.trim().startsWith("#define")) { + String[] token = line.split("\\s+"); + if (token.length != 3) { + error("Error while parsing define statement"); + } + try { + if (!token[2].isBlank() && state == 0) { + W = Integer.parseInt(token[2]); + state = 1; // after width is set + } else if (!token[2].isBlank() && state == 1) { + H = Integer.parseInt(token[2]); + state = 2; // after height is set + } + } catch (NumberFormatException nfe) { + // parseInt() can throw NFE + error("Error while parsing width or height."); } - start = false; } - if (nm[nc - 1] == 'h') - state = 1; /* expecting width */ - else if (nm[nc - 1] == 't' && nc > 1 && nm[nc - 2] == 'h') - state = 2; /* expecting height */ - else if (nc > 2 && state < 0 && nm[0] == '0' && nm[1] == 'x') { - int n = 0; - for (int p = 2; p < nc; p++) { - c = nm[p]; - if ('0' <= c && c <= '9') - c = c - '0'; - else if ('A' <= c && c <= 'Z') - c = c - 'A' + 10; - else if ('a' <= c && c <= 'z') - c = c - 'a' + 10; - else - c = 0; - n = n * 16 + c; + + if (state == 2) { + if (W <= 0 || H <= 0) { + error("Invalid values for width or height."); } - for (int mask = 1; mask <= 0x80; mask <<= 1) { - if (x < W) { - if ((n & mask) != 0) - raster[x] = 1; - else - raster[x] = 0; - } - x++; + if (multiplyExact(W, H) > MAX_XBM_SIZE) { + error("Large XBM file size." + + " Maximum allowed size: " + MAX_XBM_SIZE); } - if (x >= W) { - if (setPixels(0, y, W, 1, model, raster, 0, W) <= 0) { - return; + model = new IndexColorModel(8, 2, XbmColormap, + 0, false, 0); + setDimensions(W, H); + setColorModel(model); + setHints(XbmHints); + headerComplete(); + raster = new byte[W]; + state = 3; + break; + } + } + + if (state != 3) { + error("Width or Height of XBM file not defined"); + } + + // loop to process image data + while (!aborted && (line = br.readLine()) != null) { + lineNum++; + + if (line.contains("[]")) { + Matcher matcher = Pattern.compile(matchRegex).matcher(line); + while (matcher.find()) { + if (y >= H) { + error("Scan size of XBM file exceeds" + + " the defined width x height"); + } + + int startIndex = matcher.start(); + int endIndex = matcher.end(); + String hexByte = line.substring(startIndex, endIndex); + + if (!(hexByte.startsWith("0x") + || hexByte.startsWith("0X"))) { + error("Invalid hexadecimal number at Ln#:" + lineNum + + " Col#:" + (startIndex + 1)); } - x = 0; - if (y++ >= H) { - break; + hexByte = hexByte.replaceAll(replaceRegex, ""); + if (hexByte.length() != 2) { + error("Invalid hexadecimal number at Ln#:" + lineNum + + " Col#:" + (startIndex + 1)); } - } - } else { - int n = 0; - for (int p = 0; p < nc; p++) - if ('0' <= (c = nm[p]) && c <= '9') - n = n * 10 + c - '0'; - else { - n = -1; - break; + + try { + n = Integer.parseInt(hexByte, 16); + } catch (NumberFormatException nfe) { + error("Error parsing hexadecimal at Ln#:" + lineNum + + " Col#:" + (startIndex + 1)); + } + for (int mask = 1; mask <= 0x80; mask <<= 1) { + if (x < W) { + if ((n & mask) != 0) + raster[x] = 1; + else + raster[x] = 0; + } + x++; } - if (n > 0 && state > 0) { - if (state == 1) - W = n; - else - H = n; - if (W == 0 || H == 0) - state = 0; - else { - model = new IndexColorModel(8, 2, XbmColormap, - 0, false, 0); - setDimensions(W, H); - setColorModel(model); - setHints(XbmHints); - headerComplete(); - raster = new byte[W]; - state = -1; + + if (x >= W) { + int result = setPixels(0, y, W, 1, model, raster, 0, W); + if (result <= 0) { + error("Unexpected error occurred during setPixel()"); + } + x = 0; + y++; } } } } + imageComplete(ImageConsumer.STATICIMAGEDONE, true); } - input.close(); - imageComplete(ImageConsumer.STATICIMAGEDONE, true); } } diff --git a/test/jdk/java/awt/image/XBMDecoder/XBMDecoderTest.java b/test/jdk/java/awt/image/XBMDecoder/XBMDecoderTest.java new file mode 100644 index 000000000000..19bc6d95c392 --- /dev/null +++ b/test/jdk/java/awt/image/XBMDecoder/XBMDecoderTest.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2025, 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 8361748 + * @summary Tests XBM image size limits and if XBMImageDecoder.produceImage() + * throws appropriate error when parsing invalid XBM image data. + * @run main XBMDecoderTest + */ + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.PrintStream; +import javax.swing.ImageIcon; + +public class XBMDecoderTest { + + public static void main(String[] args) throws Exception { + String dir = System.getProperty("test.src"); + PrintStream originalErr = System.err; + boolean validCase; + + File currentDir = new File(dir); + File[] files = currentDir.listFiles((File d, String s) + -> s.endsWith(".xbm")); + + for (File file : files) { + String fileName = file.getName(); + validCase = fileName.startsWith("valid"); + + System.out.println("--- Testing " + fileName + " ---"); + try (FileInputStream fis = new FileInputStream(file); + ByteArrayOutputStream errContent = new ByteArrayOutputStream()) { + System.setErr(new PrintStream(errContent)); + + ImageIcon icon = new ImageIcon(fis.readAllBytes()); + boolean isErrEmpty = errContent.toString().isEmpty(); + if (!isErrEmpty) { + System.out.println("Expected ImageFormatException occurred."); + System.out.print(errContent); + } + + if (validCase && !isErrEmpty) { + throw new RuntimeException("Test failed: Error stream not empty"); + } else if (!validCase && isErrEmpty) { + throw new RuntimeException("Test failed: ImageFormatException" + + " expected but not thrown"); + } + System.out.println("PASSED\n"); + } finally { + System.setErr(originalErr); + } + } + } +} diff --git a/test/jdk/java/awt/image/XBMDecoder/invalid.xbm b/test/jdk/java/awt/image/XBMDecoder/invalid.xbm new file mode 100644 index 000000000000..8a8cfc276322 --- /dev/null +++ b/test/jdk/java/awt/image/XBMDecoder/invalid.xbm @@ -0,0 +1,2 @@ +#define k_ht 3 +h` k[] = { 01x0, 42222222222236319330:: diff --git a/test/jdk/java/awt/image/XBMDecoder/invalid_hex.xbm b/test/jdk/java/awt/image/XBMDecoder/invalid_hex.xbm new file mode 100644 index 000000000000..c6f819582d0e --- /dev/null +++ b/test/jdk/java/awt/image/XBMDecoder/invalid_hex.xbm @@ -0,0 +1,3 @@ +#define k_wt 16 +#define k_ht 1 +k[] = { 0x10, 1234567890}; diff --git a/test/jdk/java/awt/image/XBMDecoder/invalid_ht.xbm b/test/jdk/java/awt/image/XBMDecoder/invalid_ht.xbm new file mode 100644 index 000000000000..5244651a4cb4 --- /dev/null +++ b/test/jdk/java/awt/image/XBMDecoder/invalid_ht.xbm @@ -0,0 +1,3 @@ +#define k_wt 16 +#define k_ht 0 +k[] = { 0x10, 0x12}; diff --git a/test/jdk/java/awt/image/XBMDecoder/valid.xbm b/test/jdk/java/awt/image/XBMDecoder/valid.xbm new file mode 100644 index 000000000000..23b57b2c8116 --- /dev/null +++ b/test/jdk/java/awt/image/XBMDecoder/valid.xbm @@ -0,0 +1,6 @@ +#define test_width 16 +#define test_height 3 +#define ht_x 1 +#define ht_y 2 +static unsigned char test_bits[] = { +0x13, 0x11, 0x15, 0x00, 0xAB, 0xcd }; diff --git a/test/jdk/java/awt/image/XBMDecoder/valid_hex.xbm b/test/jdk/java/awt/image/XBMDecoder/valid_hex.xbm new file mode 100644 index 000000000000..e365d8024472 --- /dev/null +++ b/test/jdk/java/awt/image/XBMDecoder/valid_hex.xbm @@ -0,0 +1,4 @@ +#define test_width 16 +#define test_height 2 +static unsigned char test_bits[] = { 0x13, 0x11, + 0xAB, 0xff }; From 05ff7d93430448644e0b2dece07a64a210d5044c Mon Sep 17 00:00:00 2001 From: Rui Li Date: Fri, 12 Sep 2025 15:48:38 +0000 Subject: [PATCH 043/323] 8346142: [perf] scalability issue for the specjvm2008::xml.validation workload Backport-of: 10d08dbc81aa14499410f0a7a64d0b3243b660f1 --- .../impl/xpath/regex/RegularExpression.java | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xpath/regex/RegularExpression.java b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xpath/regex/RegularExpression.java index 7ca00f4ff7fc..d8154f46ac6a 100644 --- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xpath/regex/RegularExpression.java +++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xpath/regex/RegularExpression.java @@ -704,11 +704,13 @@ public boolean matches(char[] target, Match match) { */ public boolean matches(char[] target, int start, int end, Match match) { - synchronized (this) { - if (this.operations == null) - this.prepare(); - if (this.context == null) - this.context = new Context(); + if (this.operations == null || this.context == null) { + synchronized (this) { + if (this.operations == null) + this.prepare(); + if (this.context == null) + this.context = new Context(); + } } Context con = null; synchronized (this.context) { @@ -889,11 +891,13 @@ public boolean matches(String target, Match match) { */ public boolean matches(String target, int start, int end, Match match) { - synchronized (this) { - if (this.operations == null) - this.prepare(); - if (this.context == null) - this.context = new Context(); + if (this.operations == null || this.context == null) { + synchronized (this) { + if (this.operations == null) + this.prepare(); + if (this.context == null) + this.context = new Context(); + } } Context con = null; synchronized (this.context) { @@ -1569,11 +1573,13 @@ public boolean matches(CharacterIterator target, Match match) { - synchronized (this) { - if (this.operations == null) - this.prepare(); - if (this.context == null) - this.context = new Context(); + if (this.operations == null || this.context == null) { + synchronized (this) { + if (this.operations == null) + this.prepare(); + if (this.context == null) + this.context = new Context(); + } } Context con = null; synchronized (this.context) { @@ -1738,9 +1744,9 @@ else if (this.firstChar != null) { boolean hasBackReferences = false; transient int minlength; - transient Op operations = null; + transient volatile Op operations = null; transient int numberOfClosures; - transient Context context = null; + transient volatile Context context = null; transient RangeToken firstChar = null; transient String fixedString = null; From b3ba61dc40cb8900caeb85763b435d70ccf378e6 Mon Sep 17 00:00:00 2001 From: Rui Li Date: Fri, 12 Sep 2025 15:49:00 +0000 Subject: [PATCH 044/323] 8311076: RedefineClasses doesn't check for ConstantPool overflow Backport-of: e33d8a219811930492e684e19a73dadb09590052 --- src/hotspot/share/prims/jvmtiRedefineClasses.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/hotspot/share/prims/jvmtiRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiRedefineClasses.cpp index f9a0905d0b09..e2fc7a48867b 100644 --- a/src/hotspot/share/prims/jvmtiRedefineClasses.cpp +++ b/src/hotspot/share/prims/jvmtiRedefineClasses.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, 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 @@ -1863,6 +1863,12 @@ jvmtiError VM_RedefineClasses::merge_cp_and_rewrite( return JVMTI_ERROR_INTERNAL; } + // ensure merged constant pool size does not overflow u2 + if (merge_cp_length > 0xFFFF) { + log_warning(redefine, class, constantpool)("Merged constant pool overflow: %d entries", merge_cp_length); + return JVMTI_ERROR_INTERNAL; + } + // Set dynamic constants attribute from the original CP. if (old_cp->has_dynamic_constant()) { scratch_cp->set_has_dynamic_constant(); From b581da07076cbac0205499cef332ed6bb22423db Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Fri, 12 Sep 2025 16:28:03 +0000 Subject: [PATCH 045/323] 8354552: Open source a few Swing tests Backport-of: 31e293b0821b754f0fd0dd3a9d9143a0fd43a256 --- .../ScrollToReferenceTest.java | 91 ++++++++++++++++++ .../ScrollToReferenceTest/test.html | 93 +++++++++++++++++++ test/jdk/javax/swing/JLabel/bug4106007.java | 66 +++++++++++++ test/jdk/javax/swing/JLabel/bug4945795.java | 73 +++++++++++++++ 4 files changed, 323 insertions(+) create mode 100644 test/jdk/javax/swing/JEditorPane/ScrollToReferenceTest/ScrollToReferenceTest.java create mode 100644 test/jdk/javax/swing/JEditorPane/ScrollToReferenceTest/test.html create mode 100644 test/jdk/javax/swing/JLabel/bug4106007.java create mode 100644 test/jdk/javax/swing/JLabel/bug4945795.java diff --git a/test/jdk/javax/swing/JEditorPane/ScrollToReferenceTest/ScrollToReferenceTest.java b/test/jdk/javax/swing/JEditorPane/ScrollToReferenceTest/ScrollToReferenceTest.java new file mode 100644 index 000000000000..5d96dd70dd17 --- /dev/null +++ b/test/jdk/javax/swing/JEditorPane/ScrollToReferenceTest/ScrollToReferenceTest.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 1999, 2025, 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 4194428 + * @summary Checks that scrolling an href to visible scrolls it to the top of the page. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual ScrollToReferenceTest + */ + +import java.awt.Container; +import java.awt.Dimension; +import java.io.IOException; +import java.net.URL; +import javax.swing.JEditorPane; +import javax.swing.JFrame; +import javax.swing.JScrollPane; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; + +public class ScrollToReferenceTest { + + static final String INSTRUCTIONS = """ + Wait for the html document to finish loading, click on the anchor + with text 'CLICK ME'. If 'should be at top of editor pane' is + scrolled to the top of the visible region of the text, click PASS, + otherwise click FAIL. + """; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(40) + .testUI(ScrollToReferenceTest::createUI) + .build() + .awaitAndCheck(); + } + + static JFrame createUI() { + JFrame frame = new JFrame("ScrollToReferenceTest"); + JEditorPane pane = new JEditorPane(); + + try { + pane.setPage(ScrollToReferenceTest.class.getResource("test.html")); + } catch (IOException ioe) { + PassFailJFrame.forceFail("Couldn't find html file"); + } + + + pane.addHyperlinkListener(new HyperlinkListener() { + public void hyperlinkUpdate(HyperlinkEvent e) { + if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED && + e.getURL() != null) { + try { + pane.setPage(e.getURL()); + } catch (IOException ioe) { + pane.setText("error finding url, click fail!"); + } + } + } + }); + pane.setEditable(false); + JScrollPane sp = new JScrollPane(pane); + sp.setPreferredSize(new Dimension(400, 400)); + frame.add(sp); + frame.setSize(400, 400); + return frame; + } +} diff --git a/test/jdk/javax/swing/JEditorPane/ScrollToReferenceTest/test.html b/test/jdk/javax/swing/JEditorPane/ScrollToReferenceTest/test.html new file mode 100644 index 000000000000..d7e82e516db0 --- /dev/null +++ b/test/jdk/javax/swing/JEditorPane/ScrollToReferenceTest/test.html @@ -0,0 +1,93 @@ + + +

      Click ME! +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      should be at top of editor pane +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      a +

      TEST! +

      a + + diff --git a/test/jdk/javax/swing/JLabel/bug4106007.java b/test/jdk/javax/swing/JLabel/bug4106007.java new file mode 100644 index 000000000000..b78813809c13 --- /dev/null +++ b/test/jdk/javax/swing/JLabel/bug4106007.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 1999, 2025, 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 4106007 + * @summary Multi-line JLabel is now supported for HTML labels. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4106007 + * */ + +import java.awt.BorderLayout; +import javax.swing.JFrame; +import javax.swing.JLabel; + +public class bug4106007 { + + static final String INSTRUCTIONS = """ + The test window should have a label spanning multiple lines. + If it is press PASS, else press FAIL. + """; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(40) + .testUI(bug4106007::createUI) + .build() + .awaitAndCheck(); + } + + static JFrame createUI() { + JFrame frame = new JFrame("Bug4106007"); + frame.setLayout(new BorderLayout()); + String str = ""; + String longLine = + "I hope multi-line JLabel is now supported and you can see several lines instead of one long line. "; + str += longLine; + str += longLine; + str += ""; + JLabel lab = new JLabel(str); + frame.add(lab, BorderLayout.NORTH); + frame.setSize(400, 400); + return frame; + } +} diff --git a/test/jdk/javax/swing/JLabel/bug4945795.java b/test/jdk/javax/swing/JLabel/bug4945795.java new file mode 100644 index 000000000000..56f6e0eb60f5 --- /dev/null +++ b/test/jdk/javax/swing/JLabel/bug4945795.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2004, 2025, 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 4945795 + * @summary With mnemonic hiding turned on, Java does not display all mnemonics with ALT key + * @requires (os.family == "windows") + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4945795 + * */ + +import java.awt.BorderLayout; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.UIManager; + +public class bug4945795 { + + static final String INSTRUCTIONS = """ + This test is for the Swing Windows Look And Feel. + A test window will be displayed with the label 'Mnemonic Test' + Click the mouse in the test window to make sure it has keyboard focus. + Now press and hold the 'Alt' key. + An underline should be displayed below the initial 'M' character. + If it is press PASS, else press FAIL. + """; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(40) + .testUI(bug4945795::createUI) + .build() + .awaitAndCheck(); + } + + static JFrame createUI() { + JFrame mainFrame = new JFrame("Bug4945795"); + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (Exception ex) { + throw new RuntimeException("Can not set system look and feel"); + } + mainFrame.setLayout(new BorderLayout()); + mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + JLabel label = new JLabel("Mnemonic test"); + label.setDisplayedMnemonic('M'); + mainFrame.add(label, BorderLayout.NORTH); + mainFrame.setSize(400, 300); + return mainFrame; + } +} From 5ad51e820cbc509a6aa88812d39113e4e781c2d8 Mon Sep 17 00:00:00 2001 From: Xiaolong Peng Date: Fri, 12 Sep 2025 16:54:55 +0000 Subject: [PATCH 046/323] 8349705: java.net.URI.scanIPv4Address throws unnecessary URISyntaxException Backport-of: a90f323d05f1c90767823b8729b124de0bead265 --- src/java.base/share/classes/java/net/URI.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/java.base/share/classes/java/net/URI.java b/src/java.base/share/classes/java/net/URI.java index d3e762105f22..3aac37c63dd8 100644 --- a/src/java.base/share/classes/java/net/URI.java +++ b/src/java.base/share/classes/java/net/URI.java @@ -3479,7 +3479,7 @@ private int scanIPv4Address(int start, int n, boolean strict) if (q < m) break; return q; } - fail("Malformed IPv4 address", q); + if (strict) fail("Malformed IPv4 address", q); return -1; } @@ -3508,12 +3508,16 @@ private int parseIPv4Address(int start, int n) { return -1; } + if (p == -1) { + return p; + } + if (p > start && p < n) { // IPv4 address is followed by something - check that // it's a ":" as this is the only valid character to // follow an address. if (input.charAt(p) != ':') { - p = -1; + return -1; } } From 0fceb3fb63c1d1c967b02b071b7ad6a1773099fc Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Sat, 13 Sep 2025 06:09:07 +0000 Subject: [PATCH 047/323] 8328124: Convert java/awt/Frame/ShownOnPack/ShownOnPack.html applet test to main Backport-of: 7cc1965a252347f37dca69859d5ecaf2b55020c6 --- .../awt/Frame/ShownOnPack/ShownOnPack.html | 43 --- .../awt/Frame/ShownOnPack/ShownOnPack.java | 244 +++--------------- 2 files changed, 42 insertions(+), 245 deletions(-) delete mode 100644 test/jdk/java/awt/Frame/ShownOnPack/ShownOnPack.html diff --git a/test/jdk/java/awt/Frame/ShownOnPack/ShownOnPack.html b/test/jdk/java/awt/Frame/ShownOnPack/ShownOnPack.html deleted file mode 100644 index 6dd732fcf6cd..000000000000 --- a/test/jdk/java/awt/Frame/ShownOnPack/ShownOnPack.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - ShownOnPack - - - -

      ShownOnPack
      Bug ID: 6525850

      - -

      See the dialog box (usually in upper left corner) for instructions

      - - - - diff --git a/test/jdk/java/awt/Frame/ShownOnPack/ShownOnPack.java b/test/jdk/java/awt/Frame/ShownOnPack/ShownOnPack.java index a5763d0bed26..5e591bfe0a6b 100644 --- a/test/jdk/java/awt/Frame/ShownOnPack/ShownOnPack.java +++ b/test/jdk/java/awt/Frame/ShownOnPack/ShownOnPack.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2024, 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 @@ -21,208 +21,48 @@ * questions. */ +import java.awt.EventQueue; +import java.awt.Frame; + /* - test - @bug 6525850 - @summary Iconified frame gets shown after pack() - @author anthony.petrov@...: area=awt.toplevel - @run applet/manual=yesno ShownOnPack.html + * @test + * @bug 6525850 + * @summary Iconified frame gets shown after pack() + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual ShownOnPack */ - -/** - * ShownOnPack.java - * - * summary: - */ - -import java.applet.Applet; -import java.awt.*; - -public class ShownOnPack extends Applet -{ - //Declare things used in the test, like buttons and labels here - Frame f; - - public void init() - { - //Create instructions for the user here, as well as set up - // the environment -- set the layout manager, add buttons, - // etc. - this.setLayout (new BorderLayout ()); - - String[] instructions = - { - "This test creates an invisible and iconified frame that should not become visible.", - "If you observe the window titled 'Should NOT BE SHOWN' in the taskbar, press FAIL,", - "else press PASS" - }; - Sysout.createDialogWithInstructions( instructions ); - - }//End init() - - public void start () - { - //Get things going. Request focus, set size, et cetera - setSize (200,200); - setVisible(true); - validate(); - - //What would normally go into main() will probably go here. - //Use System.out.println for diagnostic messages that you want - // to read after the test is done. - //Use Sysout.println for messages you want the tester to read. - f = new Frame("Should NOT BE SHOWN"); - f.setExtendedState(Frame.ICONIFIED); - f.pack(); - }// start() - - //The rest of this class is the actions which perform the test... - - //Use Sysout.println to communicate with the user NOT System.out!! - //Sysout.println ("Something Happened!"); - -}// class ShownOnPack - -/* Place other classes related to the test after this line */ - - - - - -/**************************************************** - Standard Test Machinery - DO NOT modify anything below -- it's a standard - chunk of code whose purpose is to make user - interaction uniform, and thereby make it simpler - to read and understand someone else's test. - ****************************************************/ - -/** - This is part of the standard test machinery. - It creates a dialog (with the instructions), and is the interface - for sending text messages to the user. - To print the instructions, send an array of strings to Sysout.createDialog - WithInstructions method. Put one line of instructions per array entry. - To display a message for the tester to see, simply call Sysout.println - with the string to be displayed. - This mimics System.out.println but works within the test harness as well - as standalone. - */ - -class Sysout -{ - private static TestDialog dialog; - - public static void createDialogWithInstructions( String[] instructions ) - { - dialog = new TestDialog( new Frame(), "Instructions" ); - dialog.printInstructions( instructions ); - dialog.setVisible(true); - println( "Any messages for the tester will display here." ); - } - - public static void createDialog( ) - { - dialog = new TestDialog( new Frame(), "Instructions" ); - String[] defInstr = { "Instructions will appear here. ", "" } ; - dialog.printInstructions( defInstr ); - dialog.setVisible(true); - println( "Any messages for the tester will display here." ); +public class ShownOnPack { + + private static final String INSTRUCTIONS = """ + This test creates an invisible and iconified frame that should not become visible. + + If you observe the window titled 'Should NOT BE SHOWN' in the taskbar, + press FAIL, otherwise press PASS + """; + + static Frame frame; + + public static void main(String[] args) throws Exception { + PassFailJFrame shownOnPackInstructions = PassFailJFrame + .builder() + .title("ShownOnPack Instructions") + .instructions(INSTRUCTIONS) + .rows(5) + .columns(50) + .build(); + + EventQueue.invokeAndWait(() -> { + frame = new Frame("Should NOT BE SHOWN"); + frame.setExtendedState(Frame.ICONIFIED); + frame.pack(); + }); + + try { + shownOnPackInstructions.awaitAndCheck(); + } finally { + EventQueue.invokeAndWait(() -> frame.dispose()); + } } - - - public static void printInstructions( String[] instructions ) - { - dialog.printInstructions( instructions ); - } - - - public static void println( String messageIn ) - { - dialog.displayMessage( messageIn ); - } - -}// Sysout class - -/** - This is part of the standard test machinery. It provides a place for the - test instructions to be displayed, and a place for interactive messages - to the user to be displayed. - To have the test instructions displayed, see Sysout. - To have a message to the user be displayed, see Sysout. - Do not call anything in this dialog directly. - */ -class TestDialog extends Dialog -{ - - TextArea instructionsText; - TextArea messageText; - int maxStringLength = 80; - - //DO NOT call this directly, go through Sysout - public TestDialog( Frame frame, String name ) - { - super( frame, name ); - int scrollBoth = TextArea.SCROLLBARS_BOTH; - instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth ); - add( "North", instructionsText ); - - messageText = new TextArea( "", 5, maxStringLength, scrollBoth ); - add("Center", messageText); - - pack(); - - setVisible(true); - }// TestDialog() - - //DO NOT call this directly, go through Sysout - public void printInstructions( String[] instructions ) - { - //Clear out any current instructions - instructionsText.setText( "" ); - - //Go down array of instruction strings - - String printStr, remainingStr; - for( int i=0; i < instructions.length; i++ ) - { - //chop up each into pieces maxSringLength long - remainingStr = instructions[ i ]; - while( remainingStr.length() > 0 ) - { - //if longer than max then chop off first max chars to print - if( remainingStr.length() >= maxStringLength ) - { - //Try to chop on a word boundary - int posOfSpace = remainingStr. - lastIndexOf( ' ', maxStringLength - 1 ); - - if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1; - - printStr = remainingStr.substring( 0, posOfSpace + 1 ); - remainingStr = remainingStr.substring( posOfSpace + 1 ); - } - //else just print - else - { - printStr = remainingStr; - remainingStr = ""; - } - - instructionsText.append( printStr + "\n" ); - - }// while - - }// for - - }//printInstructions() - - //DO NOT call this directly, go through Sysout - public void displayMessage( String messageIn ) - { - messageText.append( messageIn + "\n" ); - System.out.println(messageIn); - } - -}// TestDialog class +} From a7e70e515af0b8a0935cd6f129ddf1754fc6e257 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Sat, 13 Sep 2025 06:13:05 +0000 Subject: [PATCH 048/323] 8328562: Convert java/awt/InputMethods/DiacriticsTest/DiacriticsTest.java applet test to main Backport-of: fb8f2a0a929ebe7f65c69741712b89bbb403ade9 --- .../DiacriticsTest/DiacriticsTest.html | 53 ---------- .../DiacriticsTest/DiacriticsTest.java | 100 ++++++++++++++---- 2 files changed, 80 insertions(+), 73 deletions(-) delete mode 100644 test/jdk/java/awt/InputMethods/DiacriticsTest/DiacriticsTest.html diff --git a/test/jdk/java/awt/InputMethods/DiacriticsTest/DiacriticsTest.html b/test/jdk/java/awt/InputMethods/DiacriticsTest/DiacriticsTest.html deleted file mode 100644 index 5cf5c91ea71b..000000000000 --- a/test/jdk/java/awt/InputMethods/DiacriticsTest/DiacriticsTest.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - DiacriticsTest - - - - -Test run requires the following keyboard layouts to be installed: -Linux OS: English (US, alternative international) -Windows OS: Hungarian -A keyboard layout having compose function or compose-like key. Programmer -Dvorak (http://www.kaufmann.no/roland/dvorak/) is suggested to use. - -To test JDK-8000423 fix (Linux only!): -please switch to US alternative international layout and try to type diacritics -(using the following combinations: `+e; `+u; etc.) - -To test JDK-7197619 fix (Windows only!): -please switch to Hungarian keyboard layout and try to type diacritics -(Ctrl+Alt+2 e; Ctrl+Alt+2 E) - -To test JDK-8139189 fix: -please switch to Programmer Dvorak keyboard layout try to type diacritics -using compose combinations (Compose+z+d, Compose+z+Shift+d). The Compose key -in Programmer Dvorak layout is OEM102 the key which is located between -Left Shift and Z keys on the standard 102-key keyboard. - -If you can do that then the test is passed; otherwise failed. - - diff --git a/test/jdk/java/awt/InputMethods/DiacriticsTest/DiacriticsTest.java b/test/jdk/java/awt/InputMethods/DiacriticsTest/DiacriticsTest.java index 7c610e4791f3..1481f7ec4773 100644 --- a/test/jdk/java/awt/InputMethods/DiacriticsTest/DiacriticsTest.java +++ b/test/jdk/java/awt/InputMethods/DiacriticsTest/DiacriticsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2024, 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 @@ -21,30 +21,94 @@ * questions. */ +import jdk.test.lib.Platform; +import java.awt.GridLayout; +import java.awt.TextArea; +import java.awt.TextField; +import javax.swing.JPanel; /* - @test - @bug 8000423 7197619 8025649 - @summary Check if diacritical signs could be typed for TextArea and TextField - @run applet/manual=yesno DiacriticsTest.html -*/ + * @test + * @bug 8000423 7197619 8025649 + * @summary Check if diacritical signs could be typed for TextArea and TextField + * @requires (os.family == "windows" | os.family == "linux") + * @library /java/awt/regtesthelpers /test/lib + * @build PassFailJFrame jdk.test.lib.Platform + * @run main/manual DiacriticsTest + */ +public class DiacriticsTest { -import java.applet.Applet; -import java.awt.*; -import javax.swing.JPanel; + private static final String INSTRUCTIONS_WIN = """ + Test run requires the following keyboard layouts to be installed: + - Hungarian + - A keyboard layout having compose function or compose-like key. Programmer + Dvorak (http://www.kaufmann.no/roland/dvorak/) is suggested to use. + To the right are a text area and a text field, you should check the behavior + for both of them. -public class DiacriticsTest extends Applet { + To test the JDK-7197619 fix: + Please switch to Hungarian keyboard layout and try to type diacritics + (Ctrl+Alt+2 e; Ctrl+Alt+2 E) - public void init() { - this.setLayout(new BorderLayout()); - } + To test the JDK-8139189 fix: + Please switch to Programmer Dvorak keyboard layout try to type diacritics + using compose combinations (Compose+z+d, Compose+z+Shift+d). + + The Compose key in the Programmer Dvorak layout is OEM102, the key located + between the and Z keys on a standard 102-key keyboard. + If you do not have this key on your keyboard, you can skip this part of the test. + + If you can do that then the test is passed; otherwise failed. + """; + + private static final String INSTRUCTIONS_LIN = """ + Test run requires the following keyboard layouts to be installed: + - English (US, alternative international), aka English (US, alt. intl.) + - A keyboard layout having compose function or compose-like key. Programmer + Dvorak (http://www.kaufmann.no/roland/dvorak/) is suggested to use. + + To the right are a text area and a text field, you should check the behavior + for both of them. - public void start() { + To test the JDK-8000423 fix: + Please switch to US alternative international layout and try to type diacritics + (using the following combinations: `+e; `+u; etc.) - setSize(350, 200); + To test the JDK-8139189 fix: + Please switch to Programmer Dvorak keyboard layout try to type diacritics + using compose combinations (Compose+z+d, Compose+z+Shift+d).. + The Compose key in the Programmer Dvorak layout is OEM102, the key located + between the and Z keys on a standard 102-key keyboard. + + If the above key does not work in the Gnome shell, + it can be overridden in the system preferences: + System > Keyboard > Special character entry > Compose key + and set it to another key(e.g. menu key or scroll lock.) + + If you can do that then the test is passed; otherwise failed. + """; + + public static void main(String[] args) throws Exception { + String instructions = Platform.isWindows() + ? INSTRUCTIONS_WIN + : INSTRUCTIONS_LIN; + + PassFailJFrame + .builder() + .title("DiacriticsTest Instructions") + .instructions(instructions) + .splitUIRight(DiacriticsTest::createPanel) + .testTimeOut(10) + .rows((int) instructions.lines().count() + 2) + .columns(50) + .build() + .awaitAndCheck(); + } + + public static JPanel createPanel() { JPanel panel = new JPanel(); panel.setLayout(new GridLayout(2, 1)); @@ -54,10 +118,6 @@ public void start() { TextField txtField = new TextField(); panel.add(txtField); - add(panel, BorderLayout.CENTER); - - validate(); - setVisible(true); + return panel; } } - From fcc4801c99296116991ecd6074087179f8a7a61f Mon Sep 17 00:00:00 2001 From: SendaoYan Date: Sun, 14 Sep 2025 08:19:04 +0000 Subject: [PATCH 049/323] 8366558: Gtests leave /tmp/cgroups-test* files Backport-of: 49fd6a0cb4ddabaa865155bbfd4290077b7d13ea --- test/hotspot/gtest/runtime/test_cgroupSubsystem_linux.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/hotspot/gtest/runtime/test_cgroupSubsystem_linux.cpp b/test/hotspot/gtest/runtime/test_cgroupSubsystem_linux.cpp index f2af6372aa49..70b460cb548f 100644 --- a/test/hotspot/gtest/runtime/test_cgroupSubsystem_linux.cpp +++ b/test/hotspot/gtest/runtime/test_cgroupSubsystem_linux.cpp @@ -342,7 +342,6 @@ TEST(cgroupTest, read_string_tests) { ok = controller->read_string(base_with_slash, result, 1024); EXPECT_FALSE(ok) << "Empty file should have failed"; EXPECT_STREQ("", result) << "Expected untouched result"; - delete_file(test_file); // File contents larger than 1K // We only read in the first 1K - 1 bytes @@ -359,6 +358,8 @@ TEST(cgroupTest, read_string_tests) { EXPECT_TRUE(1023 == strlen(result)) << "Expected only the first 1023 chars to be read in"; EXPECT_EQ(0, strncmp(too_large, result, 1023)); EXPECT_EQ(result[1023], '\0') << "The last character must be the null character"; + + delete_file(test_file); } TEST(cgroupTest, read_number_tuple_test) { @@ -394,6 +395,8 @@ TEST(cgroupTest, read_number_tuple_test) { ok = controller->read_numerical_tuple_value(base_with_slash, true /* use_first */, &result); EXPECT_FALSE(ok) << "Empty file should be an error"; EXPECT_EQ((jlong)-10, result) << "result value should be unchanged"; + + delete_file(test_file); } TEST(cgroupTest, read_numerical_key_beyond_max_path) { From dd360b53f6d0b09249f00a91f4c244e4f3658096 Mon Sep 17 00:00:00 2001 From: SendaoYan Date: Sun, 14 Sep 2025 08:19:20 +0000 Subject: [PATCH 050/323] 8364786: Test java/net/vthread/HttpALot.java intermittently fails - 24999 handled, expected 25000 Backport-of: f83454cd61538b653656ccf81759b3cc7286ed67 --- test/jdk/java/net/vthread/HttpALot.java | 45 +++++++++++++++++-------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/test/jdk/java/net/vthread/HttpALot.java b/test/jdk/java/net/vthread/HttpALot.java index c016824a92a1..6418e103a35e 100644 --- a/test/jdk/java/net/vthread/HttpALot.java +++ b/test/jdk/java/net/vthread/HttpALot.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, 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 @@ -21,7 +21,7 @@ * questions. */ -/** +/* * @test * @bug 8284161 * @summary Stress test the HTTP protocol handler and HTTP server @@ -44,6 +44,7 @@ import java.net.InetSocketAddress; import java.net.Proxy; import java.net.URL; +import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicInteger; @@ -52,6 +53,8 @@ public class HttpALot { + private static final String HELLO = "Hello"; + public static void main(String[] args) throws Exception { int requests = 25_000; if (args.length > 0) { @@ -65,12 +68,20 @@ public static void main(String[] args) throws Exception { InetAddress lb = InetAddress.getLoopbackAddress(); HttpServer server = HttpServer.create(new InetSocketAddress(lb, 0), 1024); ThreadFactory factory = Thread.ofVirtual().factory(); - server.setExecutor(Executors.newThreadPerTaskExecutor(factory)); + final ExecutorService serverExecutor = Executors.newThreadPerTaskExecutor(factory); + server.setExecutor(serverExecutor); server.createContext("/hello", e -> { - byte[] response = "Hello".getBytes("UTF-8"); - e.sendResponseHeaders(200, response.length); - try (OutputStream out = e.getResponseBody()) { - out.write(response); + try { + byte[] response = HELLO.getBytes("UTF-8"); + e.sendResponseHeaders(200, response.length); + try (OutputStream out = e.getResponseBody()) { + out.write(response); + } + } catch (Throwable t) { + System.err.println("failed to handle request " + e.getRequestURI() + + " due to: " + t); + t.printStackTrace(); + throw t; // let it propagate } requestsHandled.incrementAndGet(); }); @@ -85,15 +96,21 @@ public static void main(String[] args) throws Exception { // go server.start(); - try { - factory = Thread.ofVirtual().name("fetcher-", 0).factory(); - try (var executor = Executors.newThreadPerTaskExecutor(factory)) { - for (int i = 1; i <= requests; i++) { - executor.submit(() -> fetch(url)).get(); + try (serverExecutor) { + try { + factory = Thread.ofVirtual().name("fetcher-", 0).factory(); + try (var executor = Executors.newThreadPerTaskExecutor(factory)) { + for (int i = 1; i <= requests; i++) { + final String actual = executor.submit(() -> fetch(url)).get(); + if (!HELLO.equals(actual)) { + throw new RuntimeException("unexpected response: \"" + actual + + "\" for request " + i); + } + } } + } finally { + server.stop(1); } - } finally { - server.stop(1); } if (requestsHandled.get() < requests) { From 8c80244c1505ba3acfdeec20221b7af2dcff3d4a Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 15 Sep 2025 12:17:25 +0000 Subject: [PATCH 051/323] 8331231: containers/docker/TestContainerInfo.java fails Backport-of: 0bf728212fb4bce067076780aaa5b9341d7cdb6b --- test/hotspot/jtreg/containers/docker/TestContainerInfo.java | 1 + 1 file changed, 1 insertion(+) diff --git a/test/hotspot/jtreg/containers/docker/TestContainerInfo.java b/test/hotspot/jtreg/containers/docker/TestContainerInfo.java index a6327ca91879..b9b6fb65b756 100644 --- a/test/hotspot/jtreg/containers/docker/TestContainerInfo.java +++ b/test/hotspot/jtreg/containers/docker/TestContainerInfo.java @@ -26,6 +26,7 @@ /* * @test * @summary Test container info for cgroup v2 + * @key cgroups * @requires container.support * @requires !vm.asan * @library /test/lib From fbbd408f94301c733356e5ea6cd3028369d65c46 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 15 Sep 2025 12:20:59 +0000 Subject: [PATCH 052/323] 8324491: Keyboard layout didn't keep its state if it was changed when dialog was active Backport-of: 2be07b5f9d2f3f0b885feb08ff10a57824ea5748 --- .../windows/classes/sun/awt/windows/WInputMethod.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/java.desktop/windows/classes/sun/awt/windows/WInputMethod.java b/src/java.desktop/windows/classes/sun/awt/windows/WInputMethod.java index 037c90a672fb..99906dda5ace 100644 --- a/src/java.desktop/windows/classes/sun/awt/windows/WInputMethod.java +++ b/src/java.desktop/windows/classes/sun/awt/windows/WInputMethod.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, 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 @@ -319,6 +319,10 @@ public void activate() { isLastFocussedActiveClient = isAc; } isActive = true; + + // Sync currentLocale with the Windows keyboard layout which could be changed + // while the component was inactive. + getLocale(); if (currentLocale != null) { setLocale(currentLocale, true); } From aae2d0bf9324a7882e0bea9de0b63761efbdf15b Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 15 Sep 2025 12:23:37 +0000 Subject: [PATCH 053/323] 8340321: Disable SHA-1 in TLS/DTLS 1.2 handshake signatures Backport-of: dfa79c373097d17a347b7c17103c57e12f59dc67 --- .../sun/security/ssl/SignatureScheme.java | 5 +- .../share/conf/security/java.security | 3 +- ...DisableSHA1inHandshakeSignatureDTLS12.java | 54 ++++++++ .../DisableSHA1inHandshakeSignatureTLS12.java | 120 ++++++++++++++++++ .../DisableSHA1inHandshakeSignatureTLS13.java | 70 ++++++++++ 5 files changed, 249 insertions(+), 3 deletions(-) create mode 100644 test/jdk/sun/security/ssl/SignatureScheme/DisableSHA1inHandshakeSignatureDTLS12.java create mode 100644 test/jdk/sun/security/ssl/SignatureScheme/DisableSHA1inHandshakeSignatureTLS12.java create mode 100644 test/jdk/sun/security/ssl/SignatureScheme/DisableSHA1inHandshakeSignatureTLS13.java diff --git a/src/java.base/share/classes/sun/security/ssl/SignatureScheme.java b/src/java.base/share/classes/sun/security/ssl/SignatureScheme.java index 9e44b656c5cc..b3ed5810c56b 100644 --- a/src/java.base/share/classes/sun/security/ssl/SignatureScheme.java +++ b/src/java.base/share/classes/sun/security/ssl/SignatureScheme.java @@ -132,8 +132,9 @@ enum SignatureScheme { "DSA", ProtocolVersion.PROTOCOLS_TO_12), ECDSA_SHA1 (0x0203, "ecdsa_sha1", "SHA1withECDSA", - "EC", - ProtocolVersion.PROTOCOLS_TO_13), + "EC", null, null, -1, + ProtocolVersion.PROTOCOLS_TO_13, + ProtocolVersion.PROTOCOLS_TO_12), RSA_PKCS1_SHA1 (0x0201, "rsa_pkcs1_sha1", "SHA1withRSA", "RSA", null, null, 511, ProtocolVersion.PROTOCOLS_TO_13, diff --git a/src/java.base/share/conf/security/java.security b/src/java.base/share/conf/security/java.security index 182da95d1d1c..6b0fd201b9b9 100644 --- a/src/java.base/share/conf/security/java.security +++ b/src/java.base/share/conf/security/java.security @@ -784,7 +784,8 @@ http.auth.digest.disabledAlgorithms = MD5, SHA-1 # rsa_pkcs1_sha1, secp224r1, TLS_RSA_* jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, DTLSv1.0, RC4, DES, \ MD5withRSA, DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \ - ECDH, TLS_RSA_* + ECDH, TLS_RSA_*, rsa_pkcs1_sha1 usage HandshakeSignature, \ + ecdsa_sha1 usage HandshakeSignature, dsa_sha1 usage HandshakeSignature # # Legacy algorithms for Secure Socket Layer/Transport Layer Security (SSL/TLS) diff --git a/test/jdk/sun/security/ssl/SignatureScheme/DisableSHA1inHandshakeSignatureDTLS12.java b/test/jdk/sun/security/ssl/SignatureScheme/DisableSHA1inHandshakeSignatureDTLS12.java new file mode 100644 index 000000000000..6c597cd25763 --- /dev/null +++ b/test/jdk/sun/security/ssl/SignatureScheme/DisableSHA1inHandshakeSignatureDTLS12.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2025, 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 8340321 + * @summary Disable SHA-1 in TLS/DTLS 1.2 signatures. + * This test only covers DTLS 1.2. + * @library /javax/net/ssl/templates + * /test/lib + * @run main/othervm DisableSHA1inHandshakeSignatureDTLS12 + */ + +public class DisableSHA1inHandshakeSignatureDTLS12 extends + DisableSHA1inHandshakeSignatureTLS12 { + + protected DisableSHA1inHandshakeSignatureDTLS12() throws Exception { + super(); + } + + public static void main(String[] args) throws Exception { + new DisableSHA1inHandshakeSignatureDTLS12().run(); + } + + @Override + protected String getProtocol() { + return "DTLSv1.2"; + } + + // No CertificateRequest in DTLS server flight. + @Override + protected void checkCertificateRequest() { + } +} diff --git a/test/jdk/sun/security/ssl/SignatureScheme/DisableSHA1inHandshakeSignatureTLS12.java b/test/jdk/sun/security/ssl/SignatureScheme/DisableSHA1inHandshakeSignatureTLS12.java new file mode 100644 index 000000000000..0389740b7fe3 --- /dev/null +++ b/test/jdk/sun/security/ssl/SignatureScheme/DisableSHA1inHandshakeSignatureTLS12.java @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2025, 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 8340321 + * @summary Disable SHA-1 in TLS/DTLS 1.2 signatures. + * This test only covers TLS 1.2. + * @library /javax/net/ssl/templates + * /test/lib + * @run main/othervm DisableSHA1inHandshakeSignatureTLS12 + */ + +import static jdk.test.lib.Asserts.assertFalse; +import static jdk.test.lib.Asserts.assertTrue; + +import java.util.List; + +public class DisableSHA1inHandshakeSignatureTLS12 extends + AbstractCheckSignatureSchemes { + + protected DisableSHA1inHandshakeSignatureTLS12() throws Exception { + super(); + } + + public static void main(String[] args) throws Exception { + new DisableSHA1inHandshakeSignatureTLS12().run(); + } + + @Override + protected String getProtocol() { + return "TLSv1.2"; + } + + // Run things in TLS handshake order. + protected void run() throws Exception { + + // Produce client_hello + clientEngine.wrap(clientOut, cTOs); + cTOs.flip(); + + checkClientHello(); + + // Consume client_hello. + serverEngine.unwrap(cTOs, serverIn); + runDelegatedTasks(serverEngine); + + // Produce server_hello. + serverEngine.wrap(serverOut, sTOc); + sTOc.flip(); + + checkCertificateRequest(); + } + + // Returns SHA-1 signature schemes supported for TLSv1.2 handshake + protected List getDisabledSignatureSchemes() { + return List.of( + "ecdsa_sha1", + "rsa_pkcs1_sha1", + "dsa_sha1" + ); + } + + protected void checkClientHello() throws Exception { + // Get signature_algorithms extension signature schemes. + List sigAlgsSS = getSigSchemesCliHello( + extractHandshakeMsg(cTOs, TLS_HS_CLI_HELLO), + SIG_ALGS_EXT); + + // Should not be present in signature_algorithms extension. + getDisabledSignatureSchemes().forEach(ss -> + assertFalse(sigAlgsSS.contains(ss), + "Signature Scheme " + ss + + " present in ClientHello's signature_algorithms extension")); + + // Get signature_algorithms_cert extension signature schemes. + List sigAlgsCertSS = getSigSchemesCliHello( + extractHandshakeMsg(cTOs, TLS_HS_CLI_HELLO), + SIG_ALGS_CERT_EXT); + + // Should be present in signature_algorithms_cert extension. + getDisabledSignatureSchemes().forEach(ss -> + assertTrue(sigAlgsCertSS.contains(ss), + "Signature Scheme " + ss + + " isn't present in ClientHello's" + + " signature_algorithms extension")); + } + + protected void checkCertificateRequest() throws Exception { + // Get CertificateRequest message signature schemes. + List sigAlgsCertSS = getSigSchemesCertReq( + extractHandshakeMsg(sTOc, TLS_HS_CERT_REQ)); + + // Should not be present in CertificateRequest message. + getDisabledSignatureSchemes().forEach(ss -> + assertFalse(sigAlgsCertSS.contains(ss), + "Signature Scheme " + ss + + " present in CertificateRequest")); + } +} diff --git a/test/jdk/sun/security/ssl/SignatureScheme/DisableSHA1inHandshakeSignatureTLS13.java b/test/jdk/sun/security/ssl/SignatureScheme/DisableSHA1inHandshakeSignatureTLS13.java new file mode 100644 index 000000000000..55f619460d4b --- /dev/null +++ b/test/jdk/sun/security/ssl/SignatureScheme/DisableSHA1inHandshakeSignatureTLS13.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2025, 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 8340321 + * @summary Disable SHA-1 in TLS/DTLS 1.2 signatures. + * This test only covers TLS 1.3. + * @library /javax/net/ssl/templates + * /test/lib + * @run main/othervm DisableSHA1inHandshakeSignatureTLS13 + */ + +import java.security.Security; +import java.util.List; + +public class DisableSHA1inHandshakeSignatureTLS13 extends + DisableSHA1inHandshakeSignatureTLS12 { + + protected DisableSHA1inHandshakeSignatureTLS13() throws Exception { + super(); + } + + public static void main(String[] args) throws Exception { + // SHA-1 algorithm MUST NOT be used in any TLSv1.3 handshake signatures. + // This is regardless of jdk.tls.disabledAlgorithms configuration. + Security.setProperty("jdk.tls.disabledAlgorithms", ""); + new DisableSHA1inHandshakeSignatureTLS13().run(); + } + + @Override + protected String getProtocol() { + return "TLSv1.3"; + } + + // Returns SHA-1 signature schemes NOT supported for TLSv1.3 handshake + // signatures, but supported for TLSv1.3 certificate signatures. + @Override + protected List getDisabledSignatureSchemes() { + return List.of("ecdsa_sha1", "rsa_pkcs1_sha1"); + } + + // TLSv1.3 sends CertificateRequest signature schemes in + // signature_algorithms and signature_algorithms_cert extensions. Same as + // ClientHello, but they are encrypted. So we skip CertificateRequest + // signature schemes verification for TLSv1.3. + @Override + protected void checkCertificateRequest() { + } +} From 3c2c3202fee34ada4cad43938bcc39b9f7457349 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 15 Sep 2025 12:26:17 +0000 Subject: [PATCH 054/323] 8356040: java/util/PluggableLocale/LocaleNameProviderTest.java timed out Reviewed-by: mdoerr Backport-of: 32f67a3e38be807164435ea0841c01d2b7c73652 --- .../LocaleNameProviderTest.java | 153 ++++++++++-------- 1 file changed, 84 insertions(+), 69 deletions(-) diff --git a/test/jdk/java/util/PluggableLocale/LocaleNameProviderTest.java b/test/jdk/java/util/PluggableLocale/LocaleNameProviderTest.java index 6e9badede8a0..1de2839fe04a 100644 --- a/test/jdk/java/util/PluggableLocale/LocaleNameProviderTest.java +++ b/test/jdk/java/util/PluggableLocale/LocaleNameProviderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2025, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 4052440 8000273 8062588 8210406 + * @bug 4052440 8000273 8062588 8210406 8356040 * @summary LocaleNameProvider tests * @library providersrc/foobarutils * providersrc/barprovider @@ -31,97 +31,112 @@ * java.base/sun.util.resources * @build com.foobar.Utils * com.bar.* - * @run main/othervm -Djava.locale.providers=JRE,SPI LocaleNameProviderTest + * @run junit/othervm -Djava.locale.providers=JRE,SPI LocaleNameProviderTest */ +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.MissingResourceException; +import java.util.ResourceBundle; import com.bar.LocaleNameProviderImpl; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import sun.util.locale.provider.LocaleProviderAdapter; import sun.util.locale.provider.ResourceBundleBasedAdapter; import sun.util.resources.OpenListResourceBundle; public class LocaleNameProviderTest extends ProviderTest { - public static void main(String[] s) { - new LocaleNameProviderTest(); - } + private static final LocaleNameProviderImpl LNP = new LocaleNameProviderImpl(); + + /* + * This is not an exhaustive test. Such a test would require iterating (1000x1000)+ + * inputs. Instead, we check against Japanese lang locales which guarantees + * we will run into cases where the CLDR is not the preferred provider as the + * SPI has defined variants of the Japanese locale (E.g. osaka). + * See LocaleNameProviderImpl and LocaleNames ResourceBundle. + */ + @ParameterizedTest + @MethodSource + void checkAvailLocValidityTest(Locale target, Locale test, ResourceBundle rb, + boolean jreSupports, boolean spiSupports) { + // codes + String lang = test.getLanguage(); + String ctry = test.getCountry(); + String vrnt = test.getVariant(); + + // the localized name + String langresult = test.getDisplayLanguage(target); + String ctryresult = test.getDisplayCountry(target); + String vrntresult = test.getDisplayVariant(target); + + // provider's name (if any) + String providerslang = null; + String providersctry = null; + String providersvrnt = null; + if (spiSupports) { + providerslang = LNP.getDisplayLanguage(lang, target); + providersctry = LNP.getDisplayCountry(ctry, target); + providersvrnt = LNP.getDisplayVariant(vrnt, target); + } - LocaleNameProviderTest() { - checkAvailLocValidityTest(); - variantFallbackTest(); - } + // JRE's name + String jreslang = null; + String jresctry = null; + String jresvrnt = null; + if (!lang.isEmpty()) { + try { + jreslang = rb.getString(lang); + } catch (MissingResourceException mre) {} + } + if (!ctry.isEmpty()) { + try { + jresctry = rb.getString(ctry); + } catch (MissingResourceException mre) {} + } + if (!vrnt.isEmpty()) { + try { + jresvrnt = rb.getString("%%"+vrnt); + } catch (MissingResourceException mre) {} + } - void checkAvailLocValidityTest() { - LocaleNameProviderImpl lnp = new LocaleNameProviderImpl(); - Locale[] availloc = Locale.getAvailableLocales(); - Locale[] testloc = availloc.clone(); - List jreimplloc = Arrays.asList(LocaleProviderAdapter.forJRE().getLocaleNameProvider().getAvailableLocales()); - List providerloc = Arrays.asList(lnp.getAvailableLocales()); + checkValidity(target, jreslang, providerslang, langresult, + jreSupports && jreslang != null); + checkValidity(target, jresctry, providersctry, ctryresult, + jreSupports && jresctry != null); + checkValidity(target, jresvrnt, providersvrnt, vrntresult, + jreSupports && jresvrnt != null); + } - for (Locale target: availloc) { + public static List checkAvailLocValidityTest() { + var args = new ArrayList(); + Locale[] availloc = Locale.availableLocales() + .filter(l -> l.getLanguage().equals("ja")) + .toArray(Locale[]::new); + List jreimplloc = Arrays.stream(LocaleProviderAdapter.forJRE().getLocaleNameProvider().getAvailableLocales()) + .filter(l -> l.getLanguage().equals("ja")) + .toList(); + List providerloc = Arrays.asList(LNP.getAvailableLocales()); + + for (Locale target : availloc) { // pure JRE implementation - OpenListResourceBundle rb = ((ResourceBundleBasedAdapter)LocaleProviderAdapter.forJRE()).getLocaleData().getLocaleNames(target); + OpenListResourceBundle rb = ((ResourceBundleBasedAdapter) LocaleProviderAdapter.forJRE()).getLocaleData().getLocaleNames(target); boolean jreSupportsTarget = jreimplloc.contains(target); - - for (Locale test: testloc) { - // codes - String lang = test.getLanguage(); - String ctry = test.getCountry(); - String vrnt = test.getVariant(); - - // the localized name - String langresult = test.getDisplayLanguage(target); - String ctryresult = test.getDisplayCountry(target); - String vrntresult = test.getDisplayVariant(target); - - // provider's name (if any) - String providerslang = null; - String providersctry = null; - String providersvrnt = null; - if (providerloc.contains(target)) { - providerslang = lnp.getDisplayLanguage(lang, target); - providersctry = lnp.getDisplayCountry(ctry, target); - providersvrnt = lnp.getDisplayVariant(vrnt, target); - } - - // JRE's name - String jreslang = null; - String jresctry = null; - String jresvrnt = null; - if (!lang.equals("")) { - try { - jreslang = rb.getString(lang); - } catch (MissingResourceException mre) {} - } - if (!ctry.equals("")) { - try { - jresctry = rb.getString(ctry); - } catch (MissingResourceException mre) {} - } - if (!vrnt.equals("")) { - try { - jresvrnt = rb.getString("%%"+vrnt); - } catch (MissingResourceException mre) {} - } - - System.out.print("For key: "+lang+" "); - checkValidity(target, jreslang, providerslang, langresult, - jreSupportsTarget && jreslang != null); - System.out.print("For key: "+ctry+" "); - checkValidity(target, jresctry, providersctry, ctryresult, - jreSupportsTarget && jresctry != null); - System.out.print("For key: "+vrnt+" "); - checkValidity(target, jresvrnt, providersvrnt, vrntresult, - jreSupportsTarget && jresvrnt != null); + boolean providerSupportsTarget = providerloc.contains(target); + for (Locale test : availloc) { + args.add(Arguments.of(target, test, rb, jreSupportsTarget, providerSupportsTarget)); } } + return args; } + @Test void variantFallbackTest() { Locale YY = Locale.of("yy", "YY", "YYYY"); Locale YY_suffix = Locale.of("yy", "YY", "YYYY_suffix"); From 98e28d546f627a9177da88d6e5212e4ca649d72d Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 15 Sep 2025 12:29:23 +0000 Subject: [PATCH 055/323] 8361447: [REDO] Checked version of JNI ReleaseArrayElements needs to filter out known wrapped arrays Reviewed-by: mdoerr Backport-of: f67e4354316dcec185eac66adec2395e20b62579 --- src/hotspot/share/memory/guardedMemory.cpp | 9 +- src/hotspot/share/memory/guardedMemory.hpp | 42 +++++- src/hotspot/share/prims/jniCheck.cpp | 48 +++++-- .../gtest/memory/test_guardedMemory.cpp | 17 ++- .../jni/checked/TestCharArrayReleasing.java | 128 ++++++++++++++++++ .../jni/checked/libCharArrayReleasing.c | 125 +++++++++++++++++ 6 files changed, 343 insertions(+), 26 deletions(-) create mode 100644 test/hotspot/jtreg/runtime/jni/checked/TestCharArrayReleasing.java create mode 100644 test/hotspot/jtreg/runtime/jni/checked/libCharArrayReleasing.c diff --git a/src/hotspot/share/memory/guardedMemory.cpp b/src/hotspot/share/memory/guardedMemory.cpp index fbc72638a791..21d3fa0eb878 100644 --- a/src/hotspot/share/memory/guardedMemory.cpp +++ b/src/hotspot/share/memory/guardedMemory.cpp @@ -27,11 +27,12 @@ #include "memory/guardedMemory.hpp" #include "runtime/os.hpp" -void* GuardedMemory::wrap_copy(const void* ptr, const size_t len, const void* tag) { +void* GuardedMemory::wrap_copy(const void* ptr, const size_t len, + const void* tag, const void* tag2) { size_t total_sz = GuardedMemory::get_total_size(len); void* outerp = os::malloc(total_sz, mtInternal); if (outerp != nullptr) { - GuardedMemory guarded(outerp, len, tag); + GuardedMemory guarded(outerp, len, tag, tag2); void* innerp = guarded.get_user_ptr(); if (ptr != nullptr) { memcpy(innerp, ptr, len); @@ -60,8 +61,8 @@ void GuardedMemory::print_on(outputStream* st) const { return; } st->print_cr("GuardedMemory(" PTR_FORMAT ") base_addr=" PTR_FORMAT - " tag=" PTR_FORMAT " user_size=" SIZE_FORMAT " user_data=" PTR_FORMAT, - p2i(this), p2i(_base_addr), p2i(get_tag()), get_user_size(), p2i(get_user_ptr())); + " tag=" PTR_FORMAT "tag2=" PTR_FORMAT " user_size=" SIZE_FORMAT " user_data=" PTR_FORMAT, + p2i(this), p2i(_base_addr), p2i(get_tag()), p2i(get_tag2()), get_user_size(), p2i(get_user_ptr())); Guard* guard = get_head_guard(); st->print_cr(" Header guard @" PTR_FORMAT " is %s", p2i(guard), (guard->verify() ? "OK" : "BROKEN")); diff --git a/src/hotspot/share/memory/guardedMemory.hpp b/src/hotspot/share/memory/guardedMemory.hpp index f96cdd0801ec..a3bbf48b0cd3 100644 --- a/src/hotspot/share/memory/guardedMemory.hpp +++ b/src/hotspot/share/memory/guardedMemory.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2025, 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,6 +26,7 @@ #define SHARE_MEMORY_GUARDEDMEMORY_HPP #include "memory/allocation.hpp" +#include "runtime/os.hpp" #include "utilities/globalDefinitions.hpp" /** @@ -43,13 +44,14 @@ * |base_addr | 0xABABABABABABABAB | Head guard | * |+16 | | User data size | * |+sizeof(uintptr_t) | | Tag word | + * |+sizeof(uintptr_t) | | Tag word | * |+sizeof(void*) | 0xF1 ( | User data | * |+user_size | 0xABABABABABABABAB | Tail guard | * ------------------------------------------------------------- * * Where: * - guard padding uses "badResourceValue" (0xAB) - * - tag word is general purpose + * - tag word and tag2 word are general purpose * - user data * -- initially padded with "uninitBlockPad" (0xF1), * -- to "freeBlockPad" (0xBA), when freed @@ -111,6 +113,10 @@ class GuardedMemory : StackObj { // Wrapper on stack } bool verify() const { + // We may not be able to dereference directly. + if (!os::is_readable_range((const void*) _guard, (const void*) (_guard + GUARD_SIZE))) { + return false; + } u_char* c = (u_char*) _guard; u_char* end = c + GUARD_SIZE; while (c < end) { @@ -137,6 +143,7 @@ class GuardedMemory : StackObj { // Wrapper on stack size_t _user_size; }; void* _tag; + void* _tag2; public: void set_user_size(const size_t usz) { _user_size = usz; } size_t get_user_size() const { return _user_size; } @@ -144,6 +151,8 @@ class GuardedMemory : StackObj { // Wrapper on stack void set_tag(const void* tag) { _tag = (void*) tag; } void* get_tag() const { return _tag; } + void set_tag2(const void* tag2) { _tag2 = (void*) tag2; } + void* get_tag2() const { return _tag2; } }; // GuardedMemory::GuardHeader // Guarded Memory... @@ -162,9 +171,11 @@ class GuardedMemory : StackObj { // Wrapper on stack * @param base_ptr allocation wishing to be wrapped, must be at least "GuardedMemory::get_total_size()" bytes. * @param user_size the size of the user data to be wrapped. * @param tag optional general purpose tag. + * @param tag2 optional second general purpose tag. */ - GuardedMemory(void* base_ptr, const size_t user_size, const void* tag = nullptr) { - wrap_with_guards(base_ptr, user_size, tag); + GuardedMemory(void* base_ptr, const size_t user_size, + const void* tag = nullptr, const void* tag2 = nullptr) { + wrap_with_guards(base_ptr, user_size, tag, tag2); } /** @@ -189,16 +200,19 @@ class GuardedMemory : StackObj { // Wrapper on stack * @param base_ptr allocation wishing to be wrapped, must be at least "GuardedMemory::get_total_size()" bytes. * @param user_size the size of the user data to be wrapped. * @param tag optional general purpose tag. + * @param tag2 optional second general purpose tag. * * @return user data pointer (inner pointer to supplied "base_ptr"). */ - void* wrap_with_guards(void* base_ptr, size_t user_size, const void* tag = nullptr) { + void* wrap_with_guards(void* base_ptr, size_t user_size, + const void* tag = nullptr, const void* tag2 = nullptr) { assert(base_ptr != nullptr, "Attempt to wrap null with memory guard"); _base_addr = (u_char*)base_ptr; get_head_guard()->build(); get_head_guard()->set_user_size(user_size); get_tail_guard()->build(); set_tag(tag); + set_tag2(tag2); set_user_bytes(uninitBlockPad); assert(verify_guards(), "Expected valid memory guards"); return get_user_ptr(); @@ -230,6 +244,20 @@ class GuardedMemory : StackObj { // Wrapper on stack */ void* get_tag() const { return get_head_guard()->get_tag(); } + /** + * Set the second general purpose tag. + * + * @param tag general purpose tag. + */ + void set_tag2(const void* tag) { get_head_guard()->set_tag2(tag); } + + /** + * Return the second general purpose tag. + * + * @return the second general purpose tag, defaults to null. + */ + void* get_tag2() const { return get_head_guard()->get_tag2(); } + /** * Return the size of the user data. * @@ -302,10 +330,12 @@ class GuardedMemory : StackObj { // Wrapper on stack * @param ptr the memory to be copied * @param len the length of the copy * @param tag optional general purpose tag (see GuardedMemory::get_tag()) + * @param tag2 optional general purpose tag (see GuardedMemory::get_tag2()) * * @return guarded wrapped memory pointer to the user area, or null if OOM. */ - static void* wrap_copy(const void* p, const size_t len, const void* tag = nullptr); + static void* wrap_copy(const void* p, const size_t len, + const void* tag = nullptr, const void* tag2 = nullptr); /** * Free wrapped copy. diff --git a/src/hotspot/share/prims/jniCheck.cpp b/src/hotspot/share/prims/jniCheck.cpp index d12026a35299..dcaaaaf0678c 100644 --- a/src/hotspot/share/prims/jniCheck.cpp +++ b/src/hotspot/share/prims/jniCheck.cpp @@ -351,24 +351,33 @@ check_is_obj_array(JavaThread* thr, jarray jArray) { } } +// Arbitrary (but well-known) tag for GetStringChars +const void* STRING_TAG = (void*)0x47114711; + +// Arbitrary (but well-known) tag for GetStringUTFChars +const void* STRING_UTF_TAG = (void*) 0x48124812; + +// Arbitrary (but well-known) tag for GetPrimitiveArrayCritical +const void* CRITICAL_TAG = (void*)0x49134913; + /* * Copy and wrap array elements for bounds checking. * Remember the original elements (GuardedMemory::get_tag()) */ static void* check_jni_wrap_copy_array(JavaThread* thr, jarray array, - void* orig_elements) { + void* orig_elements, jboolean is_critical = JNI_FALSE) { void* result; IN_VM( oop a = JNIHandles::resolve_non_null(array); size_t len = arrayOop(a)->length() << TypeArrayKlass::cast(a->klass())->log2_element_size(); - result = GuardedMemory::wrap_copy(orig_elements, len, orig_elements); + result = GuardedMemory::wrap_copy(orig_elements, len, orig_elements, is_critical ? CRITICAL_TAG : nullptr); ) return result; } static void* check_wrapped_array(JavaThread* thr, const char* fn_name, - void* obj, void* carray, size_t* rsz) { + void* obj, void* carray, size_t* rsz, jboolean is_critical) { if (carray == nullptr) { tty->print_cr("%s: elements vector null" PTR_FORMAT, fn_name, p2i(obj)); NativeReportJNIFatalError(thr, "Elements vector null"); @@ -387,6 +396,29 @@ static void* check_wrapped_array(JavaThread* thr, const char* fn_name, DEBUG_ONLY(guarded.print_on(tty);) // This may crash. NativeReportJNIFatalError(thr, err_msg("%s: unrecognized elements", fn_name)); } + if (orig_result == STRING_TAG || orig_result == STRING_UTF_TAG) { + bool was_utf = orig_result == STRING_UTF_TAG; + tty->print_cr("%s: called on something allocated by %s", + fn_name, was_utf ? "GetStringUTFChars" : "GetStringChars"); + DEBUG_ONLY(guarded.print_on(tty);) // This may crash. + NativeReportJNIFatalError(thr, err_msg("%s called on something allocated by %s", + fn_name, was_utf ? "GetStringUTFChars" : "GetStringChars")); + } + + if (is_critical && (guarded.get_tag2() != CRITICAL_TAG)) { + tty->print_cr("%s: called on something not allocated by GetPrimitiveArrayCritical", fn_name); + DEBUG_ONLY(guarded.print_on(tty);) // This may crash. + NativeReportJNIFatalError(thr, err_msg("%s called on something not allocated by GetPrimitiveArrayCritical", + fn_name)); + } + + if (!is_critical && (guarded.get_tag2() == CRITICAL_TAG)) { + tty->print_cr("%s: called on something allocated by GetPrimitiveArrayCritical", fn_name); + DEBUG_ONLY(guarded.print_on(tty);) // This may crash. + NativeReportJNIFatalError(thr, err_msg("%s called on something allocated by GetPrimitiveArrayCritical", + fn_name)); + } + if (rsz != nullptr) { *rsz = guarded.get_user_size(); } @@ -396,7 +428,7 @@ static void* check_wrapped_array(JavaThread* thr, const char* fn_name, static void* check_wrapped_array_release(JavaThread* thr, const char* fn_name, void* obj, void* carray, jint mode, jboolean is_critical) { size_t sz; - void* orig_result = check_wrapped_array(thr, fn_name, obj, carray, &sz); + void* orig_result = check_wrapped_array(thr, fn_name, obj, carray, &sz, is_critical); switch (mode) { case 0: memcpy(orig_result, carray, sz); @@ -1437,9 +1469,6 @@ JNI_ENTRY_CHECKED(jsize, return result; JNI_END -// Arbitrary (but well-known) tag -const void* STRING_TAG = (void*)0x47114711; - JNI_ENTRY_CHECKED(const jchar *, checked_jni_GetStringChars(JNIEnv *env, jstring str, @@ -1521,9 +1550,6 @@ JNI_ENTRY_CHECKED(jsize, return result; JNI_END -// Arbitrary (but well-known) tag - different than GetStringChars -const void* STRING_UTF_TAG = (void*) 0x48124812; - JNI_ENTRY_CHECKED(const char *, checked_jni_GetStringUTFChars(JNIEnv *env, jstring str, @@ -1845,7 +1871,7 @@ JNI_ENTRY_CHECKED(void *, ) void *result = UNCHECKED()->GetPrimitiveArrayCritical(env, array, isCopy); if (result != nullptr) { - result = check_jni_wrap_copy_array(thr, array, result); + result = check_jni_wrap_copy_array(thr, array, result, JNI_TRUE); } functionExit(thr); return result; diff --git a/test/hotspot/gtest/memory/test_guardedMemory.cpp b/test/hotspot/gtest/memory/test_guardedMemory.cpp index a86982db15fc..e3e52f09f06d 100644 --- a/test/hotspot/gtest/memory/test_guardedMemory.cpp +++ b/test/hotspot/gtest/memory/test_guardedMemory.cpp @@ -58,7 +58,7 @@ TEST(GuardedMemory, size) { } // Test the basic characteristics -TEST(GuardedMemory, basic) { +TEST_VM(GuardedMemory, basic) { u_char* basep = (u_char*) os::malloc(GuardedMemory::get_total_size(1), mtInternal); GuardedMemory guarded(basep, 1, GEN_PURPOSE_TAG); @@ -79,7 +79,7 @@ TEST(GuardedMemory, basic) { } // Test a number of odd sizes -TEST(GuardedMemory, odd_sizes) { +TEST_VM(GuardedMemory, odd_sizes) { u_char* basep = (u_char*) os::malloc(GuardedMemory::get_total_size(1), mtInternal); GuardedMemory guarded(basep, 1, GEN_PURPOSE_TAG); @@ -100,7 +100,7 @@ TEST(GuardedMemory, odd_sizes) { } // Test buffer overrun into head... -TEST(GuardedMemory, buffer_overrun_head) { +TEST_VM(GuardedMemory, buffer_overrun_head) { u_char* basep = (u_char*) os::malloc(GuardedMemory::get_total_size(1), mtInternal); GuardedMemory guarded(basep, 1, GEN_PURPOSE_TAG); @@ -112,7 +112,7 @@ TEST(GuardedMemory, buffer_overrun_head) { } // Test buffer overrun into tail with a number of odd sizes -TEST(GuardedMemory, buffer_overrun_tail) { +TEST_VM(GuardedMemory, buffer_overrun_tail) { u_char* basep = (u_char*) os::malloc(GuardedMemory::get_total_size(1), mtInternal); GuardedMemory guarded(basep, 1, GEN_PURPOSE_TAG); @@ -129,7 +129,7 @@ TEST(GuardedMemory, buffer_overrun_tail) { } // Test wrap_copy/wrap_free -TEST(GuardedMemory, wrap) { +TEST_VM(GuardedMemory, wrap) { EXPECT_TRUE(GuardedMemory::free_copy(nullptr)) << "Expected free nullptr to be OK"; const char* str = "Check my bounds out"; @@ -147,3 +147,10 @@ TEST(GuardedMemory, wrap) { EXPECT_TRUE(GuardedMemory::free_copy(no_data_copy)) << "Expected valid guards even for no data copy"; } + +// Test passing back a bogus GuardedMemory region +TEST_VM(GuardedMemory, unmapped) { + char* unmapped_base = (char*) (GuardedMemoryTest::get_guard_header_size() + 0x1000 + 1); // Avoids assert in constructor + GuardedMemory guarded(unmapped_base); + EXPECT_FALSE(guarded.verify_guards()) << "Guard was not broken as expected"; +} diff --git a/test/hotspot/jtreg/runtime/jni/checked/TestCharArrayReleasing.java b/test/hotspot/jtreg/runtime/jni/checked/TestCharArrayReleasing.java new file mode 100644 index 000000000000..35fe7a9ed37f --- /dev/null +++ b/test/hotspot/jtreg/runtime/jni/checked/TestCharArrayReleasing.java @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2025, 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 8357601 + * @requires vm.flagless + * @library /test/lib + * @run main/othervm/native TestCharArrayReleasing 0 0 + * @run main/othervm/native TestCharArrayReleasing 1 0 + * @run main/othervm/native TestCharArrayReleasing 2 0 + * @run main/othervm/native TestCharArrayReleasing 3 0 + * @run main/othervm/native TestCharArrayReleasing 4 0 + * @run main/othervm/native TestCharArrayReleasing 0 1 + * @run main/othervm/native TestCharArrayReleasing 1 1 + * @run main/othervm/native TestCharArrayReleasing 2 1 + * @run main/othervm/native TestCharArrayReleasing 3 1 + * @run main/othervm/native TestCharArrayReleasing 4 1 + * @run main/othervm/native TestCharArrayReleasing 0 2 + * @run main/othervm/native TestCharArrayReleasing 1 2 + * @run main/othervm/native TestCharArrayReleasing 2 2 + * @run main/othervm/native TestCharArrayReleasing 3 2 + * @run main/othervm/native TestCharArrayReleasing 4 2 + * @run main/othervm/native TestCharArrayReleasing 0 3 + * @run main/othervm/native TestCharArrayReleasing 1 3 + * @run main/othervm/native TestCharArrayReleasing 2 3 + * @run main/othervm/native TestCharArrayReleasing 3 3 + * @run main/othervm/native TestCharArrayReleasing 4 3 + */ + +import jdk.test.lib.Platform; +import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.process.OutputAnalyzer; + +// Test the behaviour of the JNI "char" releasing functions, under Xcheck:jni, +// when they are passed "char" arrays obtained from different sources: +// - source_mode indicates which array to use +// - 0: use a raw malloc'd array +// - 1: use an array from GetCharArrayElements +// - 2: use an array from GetStringChars +// - 3: use an array from GetStringUTFChars +// - 4: use an array from GetPrimitiveArrayCritical +// - release_mode indicates which releasing function to use +// - 0: ReleaseCharArrayElements +// - 1: ReleaseStringChars +// - 2: ReleaseStringUTFChars +// - 3: ReleasePrimitiveArrayCritical + +public class TestCharArrayReleasing { + + static native void testIt(int srcMode, int releaseMode); + + static class Driver { + + static { + System.loadLibrary("CharArrayReleasing"); + } + + public static void main(String[] args) { + int srcMode = Integer.parseInt(args[0]); + int relMode = Integer.parseInt(args[1]); + testIt(srcMode, relMode); + } + } + + public static void main(String[] args) throws Throwable { + int ABRT = Platform.isWindows() ? 1 : 134; + int[][] errorCodes = new int[][] { + { ABRT, 0, ABRT, ABRT, ABRT }, + { ABRT, ABRT, 0, ABRT, ABRT }, + { ABRT, ABRT, ABRT, 0, ABRT }, + { ABRT, ABRT, ABRT, ABRT, 0 }, + }; + + String rcae = "ReleaseCharArrayElements called on something allocated by GetStringChars"; + String rcaeUTF = "ReleaseCharArrayElements called on something allocated by GetStringUTFChars"; + String rcaeCrit = "ReleaseCharArrayElements called on something allocated by GetPrimitiveArrayCritical"; + String rcaeBounds = "ReleaseCharArrayElements: release array failed bounds check"; + String rsc = "ReleaseStringChars called on something not allocated by GetStringChars"; + String rscBounds = "ReleaseStringChars: release chars failed bounds check"; + String rsuc = "ReleaseStringUTFChars called on something not allocated by GetStringUTFChars"; + String rsucBounds = "ReleaseStringUTFChars: release chars failed bounds check"; + String rpac = "ReleasePrimitiveArrayCritical called on something not allocated by GetPrimitiveArrayCritical"; + String rpacBounds = "ReleasePrimitiveArrayCritical: release array failed bounds check"; + String rpacStr = "ReleasePrimitiveArrayCritical called on something allocated by GetStringChars"; + String rpacStrUTF = "ReleasePrimitiveArrayCritical called on something allocated by GetStringUTFChars"; + + String[][] errorMsgs = new String[][] { + { rcaeBounds, "", rcae, rcaeUTF, rcaeCrit }, + { rscBounds, rsc, "", rsc, rsc }, + { rsucBounds, rsuc, rsuc, "", rsuc }, + { rpacBounds, rpac, rpacStr, rpacStrUTF, "" }, + }; + + int srcMode = Integer.parseInt(args[0]); + int relMode = Integer.parseInt(args[1]); + + ProcessBuilder pb = ProcessTools.createLimitedTestJavaProcessBuilder( + "-Djava.library.path=" + System.getProperty("test.nativepath"), + "--enable-native-access=ALL-UNNAMED", + "-Xcheck:jni", + "TestCharArrayReleasing$Driver", + args[0], args[1]); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(errorCodes[relMode][srcMode]); + output.shouldContain(errorMsgs[relMode][srcMode]); + } +} diff --git a/test/hotspot/jtreg/runtime/jni/checked/libCharArrayReleasing.c b/test/hotspot/jtreg/runtime/jni/checked/libCharArrayReleasing.c new file mode 100644 index 000000000000..459202e3054e --- /dev/null +++ b/test/hotspot/jtreg/runtime/jni/checked/libCharArrayReleasing.c @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2025, 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. + */ +#include +#include +#include + +#include "jni.h" +#include "jni_util.h" + +// Test the behaviour of the JNI "char" releasing functions, under Xcheck:jni, +// when they are passed "char" arrays obtained from different sources: +// - source_mode indicates which array to use +// - 0: use a raw malloc'd array +// - 1: use an array from GetCharArrayElements +// - 2: use an array from GetStringChars +// - 3: use an array from GetStringUTFChars +// - 4: use an array from GetPrimitiveArrayCritical +// - release_mode indicates which releasing function to use +// - 0: ReleaseCharArrayElements +// - 1: ReleaseStringChars +// - 2: ReleaseStringUTFChars +// - 3: ReleasePrimitiveArrayCritical +// + +static char* source[] = { + "malloc", + "GetCharArrayElements", + "GetStringChars", + "GetStringUTFChars", + "GetPrimitiveArrayCritical" +}; + +static char* release_func[] = { + "ReleaseCharArrayElements", + "ReleaseStringChars", + "ReleaseStringUTFChars", + "ReleasePrimitiveArrayCritical" +}; + +JNIEXPORT void JNICALL +Java_TestCharArrayReleasing_testIt(JNIEnv *env, jclass cls, jint source_mode, + jint release_mode) { + + // First create some Java objects to be used as the sources for jchar[] + // extraction. + const int len = 10; + jcharArray ca = (*env)->NewCharArray(env, len); + jstring str = (*env)->NewStringUTF(env, "A_String"); + + jthrowable exc = (*env)->ExceptionOccurred(env); + if (exc != NULL) { + fprintf(stderr, "ERROR: Unexpected exception during test set up:\n"); + (*env)->ExceptionDescribe(env); + exit(2); + } + + fprintf(stdout, "Testing release function %s with array from %s\n", + release_func[release_mode], source[source_mode]); + fflush(stdout); + + jboolean is_copy = JNI_FALSE; + jchar* to_release; + switch(source_mode) { + case 0: { + to_release = malloc(10 * sizeof(jchar)); + break; + } + case 1: { + to_release = (*env)->GetCharArrayElements(env, ca, &is_copy); + break; + } + case 2: { + to_release = (jchar*) (*env)->GetStringChars(env, str, &is_copy); + break; + } + case 3: { + to_release = (jchar*) (*env)->GetStringUTFChars(env, str, &is_copy); + break; + } + case 4: { + to_release = (jchar*) (*env)->GetPrimitiveArrayCritical(env, ca, &is_copy); + break; + } + default: fprintf(stderr, "Unexpected source_mode %d\n", source_mode); + exit(1); + } + + switch (release_mode) { + case 0: + (*env)->ReleaseCharArrayElements(env, ca, to_release, 0); + break; + case 1: + (*env)->ReleaseStringChars(env, str, to_release); + break; + case 2: + (*env)->ReleaseStringUTFChars(env, str, (const char*)to_release); + break; + case 3: + (*env)->ReleasePrimitiveArrayCritical(env, ca, to_release, 0); + break; + default: fprintf(stderr, "Unexpected release_mode %d\n", source_mode); + exit(1); + } + +} From 061455464072c7cedc4906ea8d629d06cd5436ff Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 15 Sep 2025 12:29:47 +0000 Subject: [PATCH 056/323] 8325647: [IR framework] Only prints stdout if exitCode is 134 Backport-of: 3b271981662df2a7fdf04ffd75d017964425607c --- .../jtreg/compiler/lib/ir_framework/driver/TestVMProcess.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/hotspot/jtreg/compiler/lib/ir_framework/driver/TestVMProcess.java b/test/hotspot/jtreg/compiler/lib/ir_framework/driver/TestVMProcess.java index feb8fe9e530b..b58afcfa6592 100644 --- a/test/hotspot/jtreg/compiler/lib/ir_framework/driver/TestVMProcess.java +++ b/test/hotspot/jtreg/compiler/lib/ir_framework/driver/TestVMProcess.java @@ -253,7 +253,9 @@ private String getExceptionInfo() { int exitCode = oa.getExitValue(); String stdErr = oa.getStderr(); String stdOut = ""; - if (exitCode == 134) { + boolean osIsWindows = Platform.isWindows(); + boolean JVMHadError = (!osIsWindows && exitCode == 134) || (osIsWindows && exitCode == -1); + if (JVMHadError) { // Also dump the stdout if we experience a JVM error (e.g. to show hit assertions etc.). stdOut = System.lineSeparator() + System.lineSeparator() + "Standard Output" + System.lineSeparator() + "---------------" + System.lineSeparator() + oa.getOutput(); From 75252bf539f16da64e961fa2c5bdf9be24cc6a14 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 15 Sep 2025 12:35:15 +0000 Subject: [PATCH 057/323] 8364235: Fix for JDK-8361447 breaks the alignment requirements for GuardedMemory Backport-of: 078d0d4968e26bb7a15417f1c4e891869c69dc6c --- src/hotspot/share/memory/guardedMemory.hpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/hotspot/share/memory/guardedMemory.hpp b/src/hotspot/share/memory/guardedMemory.hpp index a3bbf48b0cd3..2b6d34e8e0a6 100644 --- a/src/hotspot/share/memory/guardedMemory.hpp +++ b/src/hotspot/share/memory/guardedMemory.hpp @@ -42,9 +42,10 @@ * |Offset | Content | Description | * |------------------------------------------------------------ * |base_addr | 0xABABABABABABABAB | Head guard | - * |+16 | | User data size | - * |+sizeof(uintptr_t) | | Tag word | - * |+sizeof(uintptr_t) | | Tag word | + * |+GUARD_SIZE | | User data size | + * |+sizeof(size_t) | | Tag word | + * |+sizeof(void*) | | Tag word | + * |+sizeof(void*) | | Padding | * |+sizeof(void*) | 0xF1 ( | User data | * |+user_size | 0xABABABABABABABAB | Tail guard | * ------------------------------------------------------------- @@ -52,6 +53,8 @@ * Where: * - guard padding uses "badResourceValue" (0xAB) * - tag word and tag2 word are general purpose + * - padding is inserted as-needed by the compiler to ensure + * the user data is aligned on a 16-byte boundary * - user data * -- initially padded with "uninitBlockPad" (0xF1), * -- to "freeBlockPad" (0xBA), when freed @@ -132,12 +135,15 @@ class GuardedMemory : StackObj { // Wrapper on stack /** * Header guard and size + * + * NB: the size and placement of the GuardHeader must be such that the + * user-ptr is maximally aligned i.e. 16-byte alignment for x86 ABI for + * stack alignment and use of vector (xmm) instructions. We use alignas + * to achieve this. */ - class GuardHeader : Guard { + class alignas(16) GuardHeader : Guard { friend class GuardedMemory; protected: - // Take care in modifying fields here, will effect alignment - // e.g. x86 ABI 16 byte stack alignment union { uintptr_t __unused_full_word1; size_t _user_size; From 24bab4ada18720bbfd1d8ae641748c24f16fcee3 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Mon, 15 Sep 2025 16:31:06 +0000 Subject: [PATCH 058/323] 8367372: Test `test/hotspot/jtreg/gc/TestObjectAlignmentCardSize.java` fails on 32 bit systems Backport-of: 0f535aeb0ae2f7015300889a0ee9efbf10a15896 --- test/hotspot/jtreg/gc/TestObjectAlignmentCardSize.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/hotspot/jtreg/gc/TestObjectAlignmentCardSize.java b/test/hotspot/jtreg/gc/TestObjectAlignmentCardSize.java index 5fb46a87b510..7abded3673e6 100644 --- a/test/hotspot/jtreg/gc/TestObjectAlignmentCardSize.java +++ b/test/hotspot/jtreg/gc/TestObjectAlignmentCardSize.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, 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,6 +26,7 @@ /* @test TestObjectAlignmentCardSize.java * @summary Test to check correct handling of ObjectAlignmentInBytes and GCCardSizeInBytes combinations * @requires vm.gc != "Z" + * @requires vm.bits == "64" * @library /test/lib * @modules java.base/jdk.internal.misc * @run driver gc.TestObjectAlignmentCardSize From a405bd17fd7ca9d1e07495c90c52e26757ff086f Mon Sep 17 00:00:00 2001 From: Sergey Bylokhov Date: Mon, 15 Sep 2025 18:43:42 +0000 Subject: [PATCH 059/323] 8318850: Duplicate code in the LCMSImageLayout Backport-of: d2260146c9930002e430a874f2585d699dedc155 --- .../sun/java2d/cmm/lcms/LCMSImageLayout.java | 26 +++------ .../image/BufferedImage/VerifyNumBands.java | 56 +++++++++++++++++++ 2 files changed, 64 insertions(+), 18 deletions(-) create mode 100644 test/jdk/java/awt/image/BufferedImage/VerifyNumBands.java diff --git a/src/java.desktop/share/classes/sun/java2d/cmm/lcms/LCMSImageLayout.java b/src/java.desktop/share/classes/sun/java2d/cmm/lcms/LCMSImageLayout.java index 816031d73bcd..cfe488fee722 100644 --- a/src/java.desktop/share/classes/sun/java2d/cmm/lcms/LCMSImageLayout.java +++ b/src/java.desktop/share/classes/sun/java2d/cmm/lcms/LCMSImageLayout.java @@ -42,7 +42,7 @@ final class LCMSImageLayout { - static int BYTES_SH(int x) { + private static int BYTES_SH(int x) { return x; } @@ -50,13 +50,11 @@ private static int EXTRA_SH(int x) { return x << 7; } - static int CHANNELS_SH(int x) { + private static int CHANNELS_SH(int x) { return x << 3; } - static int PREMUL_SH(int x) { - return x << 23; - } + private static final int PREMUL = 1 << 23; private static final int SWAPFIRST = 1 << 14; private static final int DOSWAP = 1 << 10; private static final int PT_GRAY_8 = CHANNELS_SH(1) | BYTES_SH(1); @@ -64,10 +62,10 @@ static int PREMUL_SH(int x) { private static final int PT_RGB_8 = CHANNELS_SH(3) | BYTES_SH(1); private static final int PT_RGBA_8 = PT_RGB_8 | EXTRA_SH(1); private static final int PT_ARGB_8 = PT_RGBA_8 | SWAPFIRST; - private static final int PT_ARGB_8_PREMUL = PT_ARGB_8 | PREMUL_SH(1); + private static final int PT_ARGB_8_PREMUL = PT_ARGB_8 | PREMUL; private static final int PT_BGR_8 = PT_RGB_8 | DOSWAP; private static final int PT_ABGR_8 = PT_BGR_8 | EXTRA_SH(1); - private static final int PT_ABGR_8_PREMUL = PT_ABGR_8 | PREMUL_SH(1); + private static final int PT_ABGR_8_PREMUL = PT_ABGR_8 | PREMUL; // private static final int PT_BGRA_8 = PT_ABGR_8 | SWAPFIRST; private static final int SWAP_ENDIAN = ByteOrder.nativeOrder() == LITTLE_ENDIAN ? DOSWAP : 0; @@ -186,7 +184,8 @@ static LCMSImageLayout createImageLayout(BufferedImage image) { l.dataArrayLength = 4 * intRaster.getDataStorage().length; l.dataType = DT_INT; } - case BufferedImage.TYPE_3BYTE_BGR, BufferedImage.TYPE_4BYTE_ABGR, + case BufferedImage.TYPE_BYTE_GRAY, BufferedImage.TYPE_3BYTE_BGR, + BufferedImage.TYPE_4BYTE_ABGR, BufferedImage.TYPE_4BYTE_ABGR_PRE -> { var byteRaster = (ByteComponentRaster) image.getRaster(); @@ -198,15 +197,6 @@ static LCMSImageLayout createImageLayout(BufferedImage image) { l.dataArrayLength = byteRaster.getDataStorage().length; l.dataType = DT_BYTE; } - case BufferedImage.TYPE_BYTE_GRAY -> { - var byteRaster = (ByteComponentRaster) image.getRaster(); - l.nextRowOffset = byteRaster.getScanlineStride(); - l.nextPixelOffset = byteRaster.getPixelStride(); - l.offset = byteRaster.getDataOffset(0); - l.dataArray = byteRaster.getDataStorage(); - l.dataArrayLength = byteRaster.getDataStorage().length; - l.dataType = DT_BYTE; - } case BufferedImage.TYPE_USHORT_GRAY -> { var shortRaster = (ShortComponentRaster) image.getRaster(); l.nextRowOffset = safeMult(2, shortRaster.getScanlineStride()); @@ -297,7 +287,7 @@ static LCMSImageLayout createImageLayout(Raster r, ColorModel cm) { l.pixelType = (hasAlpha ? CHANNELS_SH(numBands - 1) | EXTRA_SH(1) : CHANNELS_SH(numBands)) | BYTES_SH(1); if (hasAlpha && cm.isAlphaPremultiplied()) { - l.pixelType |= PREMUL_SH(1); + l.pixelType |= PREMUL; } int[] bandOffsets = csm.getBandOffsets(); diff --git a/test/jdk/java/awt/image/BufferedImage/VerifyNumBands.java b/test/jdk/java/awt/image/BufferedImage/VerifyNumBands.java new file mode 100644 index 000000000000..94f33ac1ef16 --- /dev/null +++ b/test/jdk/java/awt/image/BufferedImage/VerifyNumBands.java @@ -0,0 +1,56 @@ +/* + * Copyright Amazon.com Inc. 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.awt.image.BufferedImage; + +/** + * @test + * @bug 8318850 + * @summary Checks the total number of bands of image data + */ +public final class VerifyNumBands { + + public static void main(String[] args) { + test(BufferedImage.TYPE_INT_RGB, 3); + test(BufferedImage.TYPE_INT_ARGB, 4); + test(BufferedImage.TYPE_INT_ARGB_PRE, 4); + test(BufferedImage.TYPE_INT_BGR, 3); + test(BufferedImage.TYPE_3BYTE_BGR, 3); + test(BufferedImage.TYPE_4BYTE_ABGR, 4); + test(BufferedImage.TYPE_4BYTE_ABGR_PRE, 4); + test(BufferedImage.TYPE_USHORT_565_RGB, 3); + test(BufferedImage.TYPE_USHORT_555_RGB, 3); + test(BufferedImage.TYPE_BYTE_GRAY, 1); + test(BufferedImage.TYPE_USHORT_GRAY, 1); + } + + private static void test(int type, int expected) { + BufferedImage bi = new BufferedImage(1, 1, type); + int numBands = bi.getRaster().getSampleModel().getNumBands(); + if (numBands != expected) { + System.err.println("Expected: " + expected); + System.err.println("Actual: " + numBands); + throw new RuntimeException("wrong number of bands"); + } + } +} From 8506d5bc9be1e63ece9a4ffc77f610d6297178ce Mon Sep 17 00:00:00 2001 From: Rui Li Date: Mon, 15 Sep 2025 23:10:03 +0000 Subject: [PATCH 060/323] 8347434: Richer VM operations events logging Backport-of: 85fdd2cc12660bef0d4334ef96afe1865ddd0c38 --- src/hotspot/share/runtime/vmThread.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/hotspot/share/runtime/vmThread.cpp b/src/hotspot/share/runtime/vmThread.cpp index 29d8610e6ee9..55ae017f1e34 100644 --- a/src/hotspot/share/runtime/vmThread.cpp +++ b/src/hotspot/share/runtime/vmThread.cpp @@ -409,17 +409,17 @@ void VMThread::inner_execute(VM_Operation* op) { HandleMark hm(VMThread::vm_thread()); const char* const cause = op->cause(); - EventMarkVMOperation em("Executing %sVM operation: %s%s%s%s", - prev_vm_operation != nullptr ? "nested " : "", - op->name(), - cause != nullptr ? " (" : "", - cause != nullptr ? cause : "", - cause != nullptr ? ")" : ""); - - log_debug(vmthread)("Evaluating %s %s VM operation: %s", - prev_vm_operation != nullptr ? "nested" : "", - _cur_vm_operation->evaluate_at_safepoint() ? "safepoint" : "non-safepoint", - _cur_vm_operation->name()); + stringStream ss; + ss.print("Executing%s%s VM operation: %s", + prev_vm_operation != nullptr ? " nested" : "", + op->evaluate_at_safepoint() ? " safepoint" : " non-safepoint", + op->name()); + if (cause != nullptr) { + ss.print(" (%s)", cause); + } + + EventMarkVMOperation em("%s", ss.freeze()); + log_debug(vmthread)("%s", ss.freeze()); bool end_safepoint = false; bool has_timeout_task = (_timeout_task != nullptr); From 9b72fec8cfa637cd257a330bdfa5f91b95dae837 Mon Sep 17 00:00:00 2001 From: Rui Li Date: Mon, 15 Sep 2025 23:10:24 +0000 Subject: [PATCH 061/323] 8364198: NMT should have a better corruption message Reviewed-by: phh Backport-of: 2202156acc78d7d9ec128f8df5c09fcdff83697c --- src/hotspot/share/services/mallocHeader.inline.hpp | 2 +- test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hotspot/share/services/mallocHeader.inline.hpp b/src/hotspot/share/services/mallocHeader.inline.hpp index 669438c85fa4..094c72020241 100644 --- a/src/hotspot/share/services/mallocHeader.inline.hpp +++ b/src/hotspot/share/services/mallocHeader.inline.hpp @@ -104,7 +104,7 @@ inline OutTypeParam MallocHeader::resolve_checked_impl(InTypeParam memblock) { OutTypeParam header_pointer = (OutTypeParam)memblock - 1; if (!header_pointer->check_block_integrity(msg, sizeof(msg), &corruption)) { header_pointer->print_block_on_error(tty, corruption != nullptr ? corruption : (address)header_pointer); - fatal("NMT corruption: Block at " PTR_FORMAT ": %s", p2i(memblock), msg); + fatal("NMT has detected a memory corruption bug. Block at " PTR_FORMAT ": %s", p2i(memblock), msg); } return header_pointer; } diff --git a/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp b/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp index 9a26e61869c0..a41c17bc154a 100644 --- a/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp +++ b/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp @@ -36,7 +36,7 @@ // This prefix shows up on any c heap corruption NMT detects. If unsure which assert will // come, just use this one. -#define COMMON_NMT_HEAP_CORRUPTION_MESSAGE_PREFIX "NMT corruption" +#define COMMON_NMT_HEAP_CORRUPTION_MESSAGE_PREFIX "NMT has detected a memory corruption bug." #define DEFINE_TEST(test_function, expected_assertion_message) \ TEST_VM_FATAL_ERROR_MSG(NMT, test_function, ".*" expected_assertion_message ".*") { \ From 2610e0538dd4a86826564bb39221d5b5fb8fdab6 Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Tue, 16 Sep 2025 09:11:46 +0000 Subject: [PATCH 062/323] 8347377: Add validation checks for ICC_Profile header fields Co-authored-by: Anton Voznia Backport-of: ed8945a68a67dd51a7cfa332905941afccc12b36 --- .../java/awt/color/ICC_ColorSpace.java | 5 +- .../classes/java/awt/color/ICC_Profile.java | 65 ++++- .../ValidateICCHeaderData.java | 261 ++++++++++++++++++ .../ValidateICCHeaderData/invalidSRGB.icc | Bin 0 -> 6876 bytes 4 files changed, 328 insertions(+), 3 deletions(-) create mode 100644 test/jdk/java/awt/color/ICC_Profile/ValidateICCHeaderData/ValidateICCHeaderData.java create mode 100644 test/jdk/java/awt/color/ICC_Profile/ValidateICCHeaderData/invalidSRGB.icc diff --git a/src/java.desktop/share/classes/java/awt/color/ICC_ColorSpace.java b/src/java.desktop/share/classes/java/awt/color/ICC_ColorSpace.java index acb31fbca9c0..071506ca4601 100644 --- a/src/java.desktop/share/classes/java/awt/color/ICC_ColorSpace.java +++ b/src/java.desktop/share/classes/java/awt/color/ICC_ColorSpace.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2025, 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 @@ -140,10 +140,11 @@ public ICC_ColorSpace(ICC_Profile profile) { if (profileClass != ICC_Profile.CLASS_INPUT && profileClass != ICC_Profile.CLASS_DISPLAY && profileClass != ICC_Profile.CLASS_OUTPUT + && profileClass != ICC_Profile.CLASS_DEVICELINK && profileClass != ICC_Profile.CLASS_COLORSPACECONVERSION && profileClass != ICC_Profile.CLASS_NAMEDCOLOR && profileClass != ICC_Profile.CLASS_ABSTRACT) { - throw new IllegalArgumentException("Invalid profile type"); + throw new IllegalArgumentException("Invalid profile class"); } thisProfile = profile; diff --git a/src/java.desktop/share/classes/java/awt/color/ICC_Profile.java b/src/java.desktop/share/classes/java/awt/color/ICC_Profile.java index 0d31d25b1197..4fb8b179e926 100644 --- a/src/java.desktop/share/classes/java/awt/color/ICC_Profile.java +++ b/src/java.desktop/share/classes/java/awt/color/ICC_Profile.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2025, 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 @@ -759,6 +759,7 @@ private interface BuiltInProfile { */ public static final int icXYZNumberX = 8; + private static final int HEADER_SIZE = 128; /** * Constructs an {@code ICC_Profile} object with a given ID. @@ -789,10 +790,15 @@ public static ICC_Profile getInstance(byte[] data) { ProfileDataVerifier.verify(data); Profile p; try { + byte[] theHeader = new byte[HEADER_SIZE]; + System.arraycopy(data, 0, theHeader, 0, HEADER_SIZE); + verifyHeader(theHeader); + p = CMSManager.getModule().loadProfile(data); } catch (CMMException c) { throw new IllegalArgumentException("Invalid ICC Profile Data"); } + try { if (getColorSpaceType(p) == ColorSpace.TYPE_GRAY && getData(p, icSigMediaWhitePointTag) != null @@ -978,6 +984,10 @@ public int getProfileClass() { return info.profileClass; } byte[] theHeader = getData(icSigHead); + return getProfileClass(theHeader); + } + + private static int getProfileClass(byte[] theHeader) { int theClassSig = intFromBigEndian(theHeader, icHdrDeviceClass); return switch (theClassSig) { case icSigInputClass -> CLASS_INPUT; @@ -1019,6 +1029,11 @@ private static int getColorSpaceType(Profile p) { return iccCStoJCS(theColorSpaceSig); } + private static int getColorSpaceType(byte[] theHeader) { + int theColorSpaceSig = intFromBigEndian(theHeader, icHdrColorSpace); + return iccCStoJCS(theColorSpaceSig); + } + /** * Returns the color space type of the Profile Connection Space (PCS). * Returns one of the color space type constants defined by the ColorSpace @@ -1038,6 +1053,21 @@ public int getPCSType() { return iccCStoJCS(thePCSSig); } + private static int getPCSType(byte[] theHeader) { + int thePCSSig = intFromBigEndian(theHeader, icHdrPcs); + int theDeviceClass = intFromBigEndian(theHeader, icHdrDeviceClass); + + if (theDeviceClass == icSigLinkClass) { + return iccCStoJCS(thePCSSig); + } else { + return switch (thePCSSig) { + case icSigXYZData -> ColorSpace.TYPE_XYZ; + case icSigLabData -> ColorSpace.TYPE_Lab; + default -> throw new IllegalArgumentException("Unexpected PCS type"); + }; + } + } + /** * Write this {@code ICC_Profile} to a file. * @@ -1118,9 +1148,42 @@ private static byte[] getData(Profile p, int tagSignature) { * @see #getData */ public void setData(int tagSignature, byte[] tagData) { + if (tagSignature == ICC_Profile.icSigHead) { + verifyHeader(tagData); + } CMSManager.getModule().setTagData(cmmProfile(), tagSignature, tagData); } + private static void verifyHeader(byte[] data) { + if (data == null || data.length < HEADER_SIZE) { + throw new IllegalArgumentException("Invalid header data"); + } + getProfileClass(data); + getColorSpaceType(data); + getPCSType(data); + checkRenderingIntent(data); + } + + private static boolean checkRenderingIntent(byte[] header) { + int index = ICC_Profile.icHdrRenderingIntent; + + /* According to ICC spec, only the least-significant 16 bits shall be + * used to encode the rendering intent. The most significant 16 bits + * shall be set to zero. Thus, we are ignoring two most significant + * bytes here. Please refer ICC Spec Document for more details. + */ + int renderingIntent = ((header[index+2] & 0xff) << 8) | + (header[index+3] & 0xff); + + switch (renderingIntent) { + case icPerceptual, icMediaRelativeColorimetric, + icSaturation, icAbsoluteColorimetric -> { + return true; + } + default -> throw new IllegalArgumentException("Unknown Rendering Intent"); + } + } + /** * Returns the number of color components in the "input" color space of this * profile. For example if the color space type of this profile is diff --git a/test/jdk/java/awt/color/ICC_Profile/ValidateICCHeaderData/ValidateICCHeaderData.java b/test/jdk/java/awt/color/ICC_Profile/ValidateICCHeaderData/ValidateICCHeaderData.java new file mode 100644 index 000000000000..28831a422b0e --- /dev/null +++ b/test/jdk/java/awt/color/ICC_Profile/ValidateICCHeaderData/ValidateICCHeaderData.java @@ -0,0 +1,261 @@ +/* + * Copyright (c) 2025, 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 8337703 + * @summary To verify if ICC_Profile's setData() and getInstance() methods + * validate header data and throw IAE for invalid values. + * @run main ValidateICCHeaderData + */ + +import java.awt.color.ColorSpace; +import java.awt.color.ICC_Profile; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.math.BigInteger; +import java.nio.ByteBuffer; + +public class ValidateICCHeaderData { + private static ICC_Profile profile; + + private static final boolean DEBUG = false; + private static final int VALID_HEADER_SIZE = 128; + private static final int HEADER_TAG = ICC_Profile.icSigHead; + private static final int PROFILE_CLASS_START_INDEX = ICC_Profile.icHdrDeviceClass; + private static final int COLOR_SPACE_START_INDEX = ICC_Profile.icHdrColorSpace; + private static final int RENDER_INTENT_START_INDEX = ICC_Profile.icHdrRenderingIntent; + private static final int PCS_START_INDEX = ICC_Profile.icHdrPcs; + + private static final int[] VALID_PROFILE_CLASS = new int[] { + ICC_Profile.icSigInputClass, ICC_Profile.icSigDisplayClass, + ICC_Profile.icSigOutputClass, ICC_Profile.icSigLinkClass, + ICC_Profile.icSigAbstractClass, ICC_Profile.icSigColorSpaceClass, + ICC_Profile.icSigNamedColorClass + }; + + private static final int[] VALID_COLOR_SPACE = new int[] { + ICC_Profile.icSigXYZData, ICC_Profile.icSigLabData, + ICC_Profile.icSigLuvData, ICC_Profile.icSigYCbCrData, + ICC_Profile.icSigYxyData, ICC_Profile.icSigRgbData, + ICC_Profile.icSigGrayData, ICC_Profile.icSigHsvData, + ICC_Profile.icSigHlsData, ICC_Profile.icSigCmykData, + ICC_Profile.icSigSpace2CLR, ICC_Profile.icSigSpace3CLR, + ICC_Profile.icSigSpace4CLR, ICC_Profile.icSigSpace5CLR, + ICC_Profile.icSigSpace6CLR, ICC_Profile.icSigSpace7CLR, + ICC_Profile.icSigSpace8CLR, ICC_Profile.icSigSpace9CLR, + ICC_Profile.icSigSpaceACLR, ICC_Profile.icSigSpaceBCLR, + ICC_Profile.icSigSpaceCCLR, ICC_Profile.icSigSpaceDCLR, + ICC_Profile.icSigSpaceECLR, ICC_Profile.icSigSpaceFCLR, + ICC_Profile.icSigCmyData + }; + + private static final int[] VALID_RENDER_INTENT = new int[] { + ICC_Profile.icPerceptual, ICC_Profile.icMediaRelativeColorimetric, + ICC_Profile.icSaturation, ICC_Profile.icAbsoluteColorimetric + }; + + private static void createCopyOfBuiltInProfile() { + ICC_Profile builtInProfile = ICC_Profile.getInstance(ColorSpace.CS_sRGB); + //copy of SRGB BuiltIn Profile that can be modified + //using ICC_Profile.setData() + profile = ICC_Profile.getInstance(builtInProfile.getData()); + } + + public static void main(String[] args) throws Exception { + createCopyOfBuiltInProfile(); + + System.out.println("CASE 1: Testing VALID Profile Classes ..."); + testValidHeaderData(VALID_PROFILE_CLASS, PROFILE_CLASS_START_INDEX, 4); + System.out.println("CASE 1: Passed \n"); + + // PCS field validation for Profile class != DEVICE_LINK + System.out.println("CASE 2: Testing VALID PCS Type" + + " for Profile class != DEVICE_LINK ..."); + testValidHeaderData(new int[] {ICC_Profile.icSigXYZData, ICC_Profile.icSigLabData}, + PCS_START_INDEX, 4); + System.out.println("CASE 2: Passed \n"); + + System.out.println("CASE 3: Testing INVALID PCS Type" + + " for Profile class != DEVICE_LINK ..."); + testInvalidHeaderData(ICC_Profile.icSigCmykData, PCS_START_INDEX, 4); + System.out.println("CASE 3: Passed \n"); + + System.out.println("CASE 4: Testing DEVICE LINK PROFILE CLASS ..."); + testValidHeaderData(new int[] {ICC_Profile.icSigLinkClass}, + PROFILE_CLASS_START_INDEX, 4); + //to check if instantiating BufferedImage with + //ICC_Profile device class = CLASS_DEVICELINK does not throw IAE. + BufferedImage img = new BufferedImage(100, 100, + BufferedImage.TYPE_3BYTE_BGR); + System.out.println("CASE 4: Passed \n"); + + // PCS field validation for Profile class == DEVICE_LINK + System.out.println("CASE 5: Testing VALID PCS Type" + + " for Profile class == DEVICE_LINK ..."); + testValidHeaderData(VALID_COLOR_SPACE, PCS_START_INDEX, 4); + System.out.println("CASE 5: Passed \n"); + + System.out.println("CASE 6: Testing INVALID PCS Type" + + " for Profile class == DEVICE_LINK ..."); + //original icSigLabData = 0x4C616220 + int invalidSigLabData = 0x4C616221; + testInvalidHeaderData(invalidSigLabData, PCS_START_INDEX, 4); + System.out.println("CASE 6: Passed \n"); + + System.out.println("CASE 7: Testing VALID Color Spaces ..."); + testValidHeaderData(VALID_COLOR_SPACE, COLOR_SPACE_START_INDEX, 4); + System.out.println("CASE 7: Passed \n"); + + System.out.println("CASE 8: Testing VALID Rendering Intent ..."); + testValidHeaderData(VALID_RENDER_INTENT, RENDER_INTENT_START_INDEX, 4); + System.out.println("CASE 8: Passed \n"); + + System.out.println("CASE 9: Testing INVALID Profile Class ..."); + //original icSigInputClass = 0x73636E72 + int invalidSigInputClass = 0x73636E70; + testInvalidHeaderData(invalidSigInputClass, PROFILE_CLASS_START_INDEX, 4); + System.out.println("CASE 9: Passed \n"); + + System.out.println("CASE 10: Testing INVALID Color Space ..."); + //original icSigXYZData = 0x58595A20 + int invalidSigXYZData = 0x58595A21; + testInvalidHeaderData(invalidSigXYZData, COLOR_SPACE_START_INDEX, 4); + System.out.println("CASE 10: Passed \n"); + + System.out.println("CASE 11: Testing INVALID Rendering Intent ..."); + //valid rendering intent values are 0-3 + int invalidRenderIntent = 5; + testInvalidHeaderData(invalidRenderIntent, RENDER_INTENT_START_INDEX, 4); + System.out.println("CASE 11: Passed \n"); + + System.out.println("CASE 12: Testing INVALID Header Size ..."); + testInvalidHeaderSize(); + System.out.println("CASE 12: Passed \n"); + + System.out.println("CASE 13: Testing ICC_Profile.getInstance(..)" + + " with VALID profile data ..."); + testProfileCreation(true); + System.out.println("CASE 13: Passed \n"); + + System.out.println("CASE 14: Testing ICC_Profile.getInstance(..)" + + " with INVALID profile data ..."); + testProfileCreation(false); + System.out.println("CASE 14: Passed \n"); + + System.out.println("CASE 15: Testing Deserialization of ICC_Profile ..."); + testDeserialization(); + System.out.println("CASE 15: Passed \n"); + + System.out.println("Successfully completed testing all 15 cases. Test Passed !!"); + } + + private static void testValidHeaderData(int[] validData, int startIndex, + int fieldLength) { + for (int value : validData) { + setTag(value, startIndex, fieldLength); + } + } + + private static void testInvalidHeaderData(int invalidData, int startIndex, + int fieldLength) { + try { + setTag(invalidData, startIndex, fieldLength); + throw new RuntimeException("Test Failed ! Expected IAE NOT thrown"); + } catch (IllegalArgumentException iae) { + System.out.println("Expected IAE thrown: " + iae.getMessage()); + } + } + + private static void setTag(int value, int startIndex, int fieldLength) { + byte[] byteArray; + if (startIndex == RENDER_INTENT_START_INDEX) { + byteArray = ByteBuffer.allocate(4).putInt(value).array(); + } else { + BigInteger big = BigInteger.valueOf(value); + byteArray = (big.toByteArray()); + } + + if (DEBUG) { + System.out.print("Byte Array : "); + for (int i = 0; i < byteArray.length; i++) { + System.out.print(byteArray[i] + " "); + } + System.out.println("\n"); + } + + byte[] iccProfileHeaderData = profile.getData(HEADER_TAG); + System.arraycopy(byteArray, 0, iccProfileHeaderData, startIndex, fieldLength); + profile.setData(HEADER_TAG, iccProfileHeaderData); + } + + private static void testProfileCreation(boolean validCase) { + ICC_Profile builtInProfile = ICC_Profile.getInstance(ColorSpace.CS_GRAY); + byte[] profileData = builtInProfile.getData(); + + int validDeviceClass = ICC_Profile.icSigInputClass; + BigInteger big = BigInteger.valueOf(validDeviceClass); + //valid case set device class to 0x73636E72 (icSigInputClass) + //invalid case set device class to 0x00000000 + byte[] field = validCase ? big.toByteArray() + : ByteBuffer.allocate(4).putInt(0).array(); + System.arraycopy(field, 0, profileData, PROFILE_CLASS_START_INDEX, 4); + + try { + ICC_Profile.getInstance(profileData); + if (!validCase) { + throw new RuntimeException("Test Failed ! Expected IAE NOT thrown"); + } + } catch (IllegalArgumentException iae) { + if (!validCase) { + System.out.println("Expected IAE thrown: " + iae.getMessage()); + } else { + throw new RuntimeException("Unexpected IAE thrown"); + } + } + } + + private static void testInvalidHeaderSize() { + byte[] iccProfileHeaderData = profile.getData(HEADER_TAG); + byte[] invalidHeaderSize = new byte[VALID_HEADER_SIZE - 1]; + System.arraycopy(iccProfileHeaderData, 0, + invalidHeaderSize, 0, invalidHeaderSize.length); + try { + profile.setData(HEADER_TAG, invalidHeaderSize); + throw new RuntimeException("Test Failed ! Expected IAE NOT thrown"); + } catch (IllegalArgumentException iae) { + System.out.println("Expected IAE thrown: " + iae.getMessage()); + } + } + + private static void testDeserialization() throws IOException { + //invalidSRGB.icc is serialized on older version of JDK + //Upon deserialization, the invalid profile is expected to throw IAE + try { + ICC_Profile.getInstance("./invalidSRGB.icc"); + throw new RuntimeException("Test Failed ! Expected IAE NOT thrown"); + } catch (IllegalArgumentException iae) { + System.out.println("Expected IAE thrown: " + iae.getMessage()); + } + } +} diff --git a/test/jdk/java/awt/color/ICC_Profile/ValidateICCHeaderData/invalidSRGB.icc b/test/jdk/java/awt/color/ICC_Profile/ValidateICCHeaderData/invalidSRGB.icc new file mode 100644 index 0000000000000000000000000000000000000000..1520dac1f1a0ce3511a636b9f0fb75c7b3026f8c GIT binary patch literal 6876 zcmeI1S5y?q8po@IU+(ln^{>DBPJPwgbx!@yzW|UKPhcme z!unw4@^Q9P3E`_$iAuB-!yUh#KqGyfm3-T;7<{2fz0 z41nlv06Kd9jzt^?ptA%3spstUl#K7=p#(QHAOKN71JXbqr~nP10}O#FumCo|5x4;_ z;0J=iM!*I!AQ7a1OppV1fqYO1O29!-1!_S9XacR^Ea(Im!Bubr+yVE&2zUy3U<$kj z^WXzmf*=SBks&H14JklskTzrpu^=nR5%Pe1pkOEriiWsQI+O$Lh6C6>vR#3hscf z!gt^impj=S?C^jk?wH;N2szRMab)foC4^R`RdDJ&F8O=azqs`H-=pb}7Iuo6bE=M<_ z+tJt2Bj_pg2Mh*7$1pLb7#B=1CJvL0DZ(7av|+AbhA@+u1uPaTjn&3lV!g28*feZD zwi0^^dl@^7ox*;^5pfDQL!1*X1johY;>vN&xE|avZW_0Q7sIRJ&GBA%4t^`X7~g>J z#^1wF;g<;F1SY|f;75of>>^YUS_#()PjpTUFQzVLFBUGgU94K{g4meYf;d&&K-^0_QM^dJS^Spx z3S*#PSRE~QgW|ktK_icqLi$ZjZ~ymfmEB+h}36k zMQKOrcIF-ZGgoM`W(c%*oPZEo9lU1+r&lpD$yLf-lbe&L%iGAu$(PCZ$j>TJ6|59u70MJYE4)&aP_$J{P^?hwQ=C^~D7h%5 zE7d6tDlI89mHm}-mD`k`sSs3HDp4wBD!nT6stT%}syV7Hs!!DLYAm%FwL@zCYK!Vj z^+5GK>YeH{Oev--GmF{69M>RgSZgF})N4G{#AvcK<24U!-q(V)jJ0C4s9^+o)uO_A@ zDJHEZv!<%1VWu^vV=NkL9jl0S(+q89XST!aqS+^N6Z16lv*v$T=vc&CG+WH9VXlc> z)39dJQrR-xvd)rcrDzpqb<~Pytz;c;U2pxuM#Y9>(`Ykot7#i&d&>5WoxWX)UAx_) zy}A81`zsEJgR?_{!=NL@(ciJk@wt<-Q?yfy)4a2>bGGvp7qpAJ%YK(JS20{uNSZ{D(bC`mghKZ%!Yo_sKQKE*wy zF%?SPklK|-<8RCZ=^E)jq)%j6WmIQ;%nZmpw?%vlcgw(5t*v{vPG>n~9nVH(v$K11 zlyY|EOl-5=R<|A69ofxEl&9*aG-Kcaq&{c&*b>b;eFzZGx_ZWrnomKT00Vi(>1$>67opO*JU?HepM zDLztyDdCok?zi55vQ)e@t90^!=Yftg#j=93_Xjr}yj5;gUVDgeDE$zx!lR1Bly8pAo&t0uLt#xhmw!+ik zbo%L6XTr{mo^?OldyaLk^}O2ons#b?K?l^awPU_Brjyqd+%=&O0V|ItGjf+V2|QZ67ol?6_xouj{_q{qCVPLp{UR!&e_TJh<`D z_2He7wIf5L{-ck^LdSTIIFDu?Cp>=pB;(1_)1Bk!@q%Y!&&r=Op4b1X`D+``gm-De zVPfEg?~A9C?8(=^rT+G1D(@xvW%;zibkmIC%*9!!+54~7znXfT^m=J7|9A1v9|QA2^HXnA-Y)-H^iKNSiT6hDdl%L%JpYjRVQI18qx8puEUdsG} z{ZjE&^K17v_iy9NiOb7EEg;kaLM#eFCg> Date: Tue, 16 Sep 2025 10:01:20 +0000 Subject: [PATCH 063/323] 8210807: Printing a JTable with a JScrollPane prints table without rows populated Backport-of: 95bd92a5601afdf02b9d62cab7dbae93f297df47 --- .../share/classes/javax/swing/JViewport.java | 14 +- .../classes/sun/swing/SwingUtilities2.java | 2 +- .../swing/JTable/JTableScrollPrintTest.java | 185 ++++++++++++++++++ 3 files changed, 195 insertions(+), 6 deletions(-) create mode 100644 test/jdk/javax/swing/JTable/JTableScrollPrintTest.java diff --git a/src/java.desktop/share/classes/javax/swing/JViewport.java b/src/java.desktop/share/classes/javax/swing/JViewport.java index 7912f81ee54e..7ceab7f83dde 100644 --- a/src/java.desktop/share/classes/javax/swing/JViewport.java +++ b/src/java.desktop/share/classes/javax/swing/JViewport.java @@ -603,11 +603,15 @@ public final Insets getInsets(Insets insets) { private Graphics getBackingStoreGraphics(Graphics g) { - Graphics bsg = backingStoreImage.getGraphics(); - bsg.setColor(g.getColor()); - bsg.setFont(g.getFont()); - bsg.setClip(g.getClipBounds()); - return bsg; + if (!SwingUtilities2.isPrinting(g)) { + Graphics bsg = backingStoreImage.getGraphics(); + bsg.setColor(g.getColor()); + bsg.setFont(g.getFont()); + bsg.setClip(g.getClipBounds()); + return bsg; + } else { + return g; + } } diff --git a/src/java.desktop/share/classes/sun/swing/SwingUtilities2.java b/src/java.desktop/share/classes/sun/swing/SwingUtilities2.java index 28cbadf40e22..87eff4ba093a 100644 --- a/src/java.desktop/share/classes/sun/swing/SwingUtilities2.java +++ b/src/java.desktop/share/classes/sun/swing/SwingUtilities2.java @@ -1290,7 +1290,7 @@ public int hashCode() { * returns true if the Graphics is print Graphics * false otherwise */ - static boolean isPrinting(Graphics g) { + public static boolean isPrinting(Graphics g) { return (g instanceof PrinterGraphics || g instanceof PrintGraphics); } diff --git a/test/jdk/javax/swing/JTable/JTableScrollPrintTest.java b/test/jdk/javax/swing/JTable/JTableScrollPrintTest.java new file mode 100644 index 000000000000..6a12a361345e --- /dev/null +++ b/test/jdk/javax/swing/JTable/JTableScrollPrintTest.java @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2023, 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.awt.Component; +import java.awt.Graphics; +import java.awt.Graphics2D; +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 javax.swing.BoxLayout; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.JViewport; +import javax.swing.SwingUtilities; +import javax.swing.table.DefaultTableModel; + +/* + * @test + * @key headful + * @bug 8210807 + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @summary Test to check if JTable can be printed when JScrollPane added to it. + * @run main/manual JTableScrollPrintTest + */ + +public class JTableScrollPrintTest { + public static JFrame frame; + public static PassFailJFrame passFailJFrame; + + public static void main(String[] args) throws Exception { + SwingUtilities.invokeAndWait(() -> { + try { + initialize(); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + passFailJFrame.awaitAndCheck(); + } + + public static void initialize() throws Exception { + final String INSTRUCTIONS = """ + Instructions to Test: + 1. Print table onto Paper/PDF, using the Print Dialog. + 2. If entire table is printed, then the Test is PASS. + 3. If table is partially printed without table cells, + then the Test is FAIL. + """; + TestTable testTable = new TestTable(true); + frame = new JFrame("JTable Print Test"); + passFailJFrame = new PassFailJFrame("Test Instructions", INSTRUCTIONS, 5L, 6, 35); + + PassFailJFrame.addTestWindow(frame); + PassFailJFrame.positionTestWindow(frame, PassFailJFrame.Position.VERTICAL); + frame.add(testTable); + frame.pack(); + frame.setVisible(true); + PrintUtilities printerJob = new PrintUtilities(testTable); + printerJob.print("Test BackingStore Image Print"); + } + + public static class TestTable extends JPanel { + public TestTable(Boolean useScrollPane) { + + setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + + DefaultTableModel model = new DefaultTableModel(); + model.addColumn("Column 1"); + model.addColumn("Column 2"); + model.addColumn("Column 3"); + model.addColumn("Column 4"); + + for (int row = 1; row <= 5; row++) { + model.addRow(new Object[]{ + "R" + row + " C1", "R" + row + " C2", "R" + row + " C3", "R" + row + " C4"}); + } + + JTable table = new JTable(model); + + if (useScrollPane == true) { + JScrollPane sp = new JScrollPane(table, + JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, + JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + sp.getViewport().setScrollMode(JViewport.BACKINGSTORE_SCROLL_MODE); + add(sp); + } else { + add(table.getTableHeader()); + add(table); + } + } + } + + static class PrintUtilities implements Printable { + private Component componentToBePrinted; + + public void printComponent(Component c, String jobname) { + new PrintUtilities(c).print(jobname); + } + + public PrintUtilities(Component componentToBePrinted) { + this.componentToBePrinted = componentToBePrinted; + } + + public void print(String jobname) { + PrinterJob printJob = PrinterJob.getPrinterJob(); + PageFormat pf = printJob.defaultPage(); + pf.setOrientation(PageFormat.PORTRAIT); + + // set margins to 1/2" + Paper p = new Paper(); + p.setImageableArea(36, 36, p.getWidth() - 72, p.getHeight() - 72); + pf.setPaper(p); + + printJob.setPrintable(this, pf); + printJob.setJobName(jobname); + + if (printJob.printDialog()) { + try { + printJob.print(); + } catch (PrinterException pe) { + System.out.println("Error printing: " + pe); + } + } + } + + public int print(Graphics g, PageFormat pageFormat, int pageIndex) { + if (pageIndex > 0) { + return NO_SUCH_PAGE; + } else { + Graphics2D g2d = (Graphics2D)g; + g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); + Component c = componentToBePrinted; + c.setSize(c.getPreferredSize()); + + double panelX = c.getWidth(); + double panelY = c.getHeight(); + float imageableX = (float) pageFormat.getImageableWidth() - 1; + float imageableY = (float) pageFormat.getImageableHeight() - 1; + + double xscale = imageableX/panelX; + double yscale = imageableY/panelY; + double optimalScale; + if (xscale < yscale) { + optimalScale = xscale; + } else { + optimalScale = yscale; + } + + if (optimalScale > 1) { + optimalScale = 1; + } + + g2d.scale(optimalScale, optimalScale); + c.paint(g2d); + return PAGE_EXISTS; + } + } + } +} From f85fbe3fe4c57c00ac2a456db294b06a130cfdc6 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Tue, 16 Sep 2025 12:00:27 +0000 Subject: [PATCH 064/323] 8322140: javax/swing/JTable/JTableScrollPrintTest.java does not print the rows and columns of the table in Nimbus and Aqua LookAndFeel Backport-of: 717a07b932e3dcabbad130d299b15cb963d50a67 --- .../share/classes/javax/swing/JViewport.java | 16 +++----- .../share/classes/sun/print/PathGraphics.java | 18 +++++++- .../classes/sun/swing/SwingUtilities2.java | 4 +- .../swing/JTable/JTableScrollPrintTest.java | 41 ++++++++----------- 4 files changed, 43 insertions(+), 36 deletions(-) diff --git a/src/java.desktop/share/classes/javax/swing/JViewport.java b/src/java.desktop/share/classes/javax/swing/JViewport.java index 7ceab7f83dde..f7c27314750c 100644 --- a/src/java.desktop/share/classes/javax/swing/JViewport.java +++ b/src/java.desktop/share/classes/javax/swing/JViewport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, 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 @@ -603,15 +603,11 @@ public final Insets getInsets(Insets insets) { private Graphics getBackingStoreGraphics(Graphics g) { - if (!SwingUtilities2.isPrinting(g)) { - Graphics bsg = backingStoreImage.getGraphics(); - bsg.setColor(g.getColor()); - bsg.setFont(g.getFont()); - bsg.setClip(g.getClipBounds()); - return bsg; - } else { - return g; - } + Graphics bsg = backingStoreImage.getGraphics(); + bsg.setColor(g.getColor()); + bsg.setFont(g.getFont()); + bsg.setClip(g.getClipBounds()); + return bsg; } diff --git a/src/java.desktop/share/classes/sun/print/PathGraphics.java b/src/java.desktop/share/classes/sun/print/PathGraphics.java index a8d9ac5f286d..a832e1f4c960 100644 --- a/src/java.desktop/share/classes/sun/print/PathGraphics.java +++ b/src/java.desktop/share/classes/sun/print/PathGraphics.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2024, 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 @@ -64,6 +64,7 @@ import java.awt.image.DataBufferInt; import java.awt.image.ImageObserver; import java.awt.image.IndexColorModel; +import java.awt.image.MultiResolutionImage; import java.awt.image.Raster; import java.awt.image.RenderedImage; import java.awt.image.SampleModel; @@ -1132,6 +1133,9 @@ protected BufferedImage getBufferedImage(Image img) { // VI needs to make a new BI: this is unavoidable but // I don't expect VI's to be "huge" in any case. return ((VolatileImage)img).getSnapshot(); + } else if (img instanceof MultiResolutionImage) { + return convertToBufferedImage((MultiResolutionImage) img, + img.getWidth(null), img.getHeight(null)); } else { // may be null or may be some non-standard Image which // shouldn't happen as Image is implemented by the platform @@ -1142,6 +1146,18 @@ protected BufferedImage getBufferedImage(Image img) { } } + protected BufferedImage convertToBufferedImage(MultiResolutionImage multiResolutionImage, + double width, double height ) { + Image resolutionImage = multiResolutionImage.getResolutionVariant(width, height); + BufferedImage bufferedImage = new BufferedImage(resolutionImage.getWidth(null), + resolutionImage.getHeight(null), + BufferedImage.TYPE_INT_ARGB); + Graphics2D g2d = bufferedImage.createGraphics(); + g2d.drawImage(resolutionImage, 0, 0, (int) width, (int) height, null); + g2d.dispose(); + return bufferedImage; + } + /** * Return true if the BufferedImage argument has non-opaque * bits in it and therefore can not be directly rendered by diff --git a/src/java.desktop/share/classes/sun/swing/SwingUtilities2.java b/src/java.desktop/share/classes/sun/swing/SwingUtilities2.java index 87eff4ba093a..ebb45ccabacb 100644 --- a/src/java.desktop/share/classes/sun/swing/SwingUtilities2.java +++ b/src/java.desktop/share/classes/sun/swing/SwingUtilities2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2024, 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 @@ -1290,7 +1290,7 @@ public int hashCode() { * returns true if the Graphics is print Graphics * false otherwise */ - public static boolean isPrinting(Graphics g) { + static boolean isPrinting(Graphics g) { return (g instanceof PrinterGraphics || g instanceof PrintGraphics); } diff --git a/test/jdk/javax/swing/JTable/JTableScrollPrintTest.java b/test/jdk/javax/swing/JTable/JTableScrollPrintTest.java index 6a12a361345e..5621b3593460 100644 --- a/test/jdk/javax/swing/JTable/JTableScrollPrintTest.java +++ b/test/jdk/javax/swing/JTable/JTableScrollPrintTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, 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 @@ -36,13 +36,12 @@ import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JViewport; -import javax.swing.SwingUtilities; import javax.swing.table.DefaultTableModel; /* * @test * @key headful - * @bug 8210807 + * @bug 8210807 8322140 * @library /java/awt/regtesthelpers * @build PassFailJFrame * @summary Test to check if JTable can be printed when JScrollPane added to it. @@ -50,32 +49,27 @@ */ public class JTableScrollPrintTest { - public static JFrame frame; - public static PassFailJFrame passFailJFrame; - public static void main(String[] args) throws Exception { - SwingUtilities.invokeAndWait(() -> { - try { - initialize(); - } catch (Exception e) { - throw new RuntimeException(e); - } - }); - passFailJFrame.awaitAndCheck(); - } - - public static void initialize() throws Exception { - final String INSTRUCTIONS = """ + String INSTRUCTIONS = """ Instructions to Test: 1. Print table onto Paper/PDF, using the Print Dialog. 2. If entire table is printed, then the Test is PASS. 3. If table is partially printed without table cells, then the Test is FAIL. """; - TestTable testTable = new TestTable(true); - frame = new JFrame("JTable Print Test"); - passFailJFrame = new PassFailJFrame("Test Instructions", INSTRUCTIONS, 5L, 6, 35); + PassFailJFrame.builder() + .title("Test Instructions") + .instructions(INSTRUCTIONS) + .rows(6) + .columns(35) + .testUI(JTableScrollPrintTest::initialize) + .build() + .awaitAndCheck(); + } + public static JFrame initialize() { + TestTable testTable = new TestTable(true); + JFrame frame = new JFrame("JTable Print Test"); PassFailJFrame.addTestWindow(frame); PassFailJFrame.positionTestWindow(frame, PassFailJFrame.Position.VERTICAL); frame.add(testTable); @@ -83,6 +77,7 @@ public static void initialize() throws Exception { frame.setVisible(true); PrintUtilities printerJob = new PrintUtilities(testTable); printerJob.print("Test BackingStore Image Print"); + return frame; } public static class TestTable extends JPanel { @@ -103,7 +98,7 @@ public TestTable(Boolean useScrollPane) { JTable table = new JTable(model); - if (useScrollPane == true) { + if (useScrollPane) { JScrollPane sp = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); @@ -117,7 +112,7 @@ public TestTable(Boolean useScrollPane) { } static class PrintUtilities implements Printable { - private Component componentToBePrinted; + private final Component componentToBePrinted; public void printComponent(Component c, String jobname) { new PrintUtilities(c).print(jobname); From add7d36cd7d7c16920f0f69f3f46df72b93ba258 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Tue, 16 Sep 2025 16:25:31 +0000 Subject: [PATCH 065/323] 8354495: Open source several AWT DataTransfer tests Backport-of: 9c86ac27236a67ff7d84447821d89772b993f7e1 --- test/jdk/ProblemList.txt | 3 + .../ClipboardPerformanceTest.java | 133 +++++++++++++ .../HTMLTransferConsoleOutputTest.java | 182 ++++++++++++++++++ .../datatransfer/ImageTransferCrashTest.java | 147 ++++++++++++++ 4 files changed, 465 insertions(+) create mode 100644 test/jdk/java/awt/datatransfer/ClipboardPerformanceTest.java create mode 100644 test/jdk/java/awt/datatransfer/HTMLTransferConsoleOutputTest.java create mode 100644 test/jdk/java/awt/datatransfer/ImageTransferCrashTest.java diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index a2443b401efb..713ae0e0fe56 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -187,6 +187,9 @@ java/awt/Mixing/NonOpaqueInternalFrame.java 7124549 macosx-all java/awt/Focus/ActualFocusedWindowTest/ActualFocusedWindowRetaining.java 6829264 generic-all java/awt/datatransfer/DragImage/MultiResolutionDragImageTest.java 8080982 generic-all java/awt/datatransfer/SystemFlavorMap/AddFlavorTest.java 8079268 linux-all +java/awt/datatransfer/ClipboardPerformanceTest.java 8029022 windows-all +java/awt/datatransfer/HTMLTransferConsoleOutputTest.java 8237254 macosx-all +java/awt/datatransfer/ImageTransferCrashTest.java 8237253 macosx-all java/awt/Toolkit/RealSync/Test.java 6849383 linux-all java/awt/LightweightComponent/LightweightEventTest/LightweightEventTest.java 8159252,8324782 windows-all,macosx-all java/awt/EventDispatchThread/HandleExceptionOnEDT/HandleExceptionOnEDT.java 8072110 macosx-all diff --git a/test/jdk/java/awt/datatransfer/ClipboardPerformanceTest.java b/test/jdk/java/awt/datatransfer/ClipboardPerformanceTest.java new file mode 100644 index 000000000000..3bad044b9498 --- /dev/null +++ b/test/jdk/java/awt/datatransfer/ClipboardPerformanceTest.java @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2001, 2025, 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 4463560 + * @requires (os.family == "windows") + * @summary Tests that datatransfer doesn't take too much time to complete + * @key headful + * @library /test/lib + * @run main/timeout=300 ClipboardPerformanceTest + */ + +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.StringSelection; +import java.awt.datatransfer.Transferable; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; + +public class ClipboardPerformanceTest { + public static final int CODE_FAILURE = 1; + public static final int CODE_OTHER_FAILURE = 2; + static String eoln; + static char[] text; + public static final int ARRAY_SIZE = 100000; + public static final int RATIO_THRESHOLD = 10; + + public static void main(String[] args) throws Exception { + if (args.length == 0) { + ClipboardPerformanceTest clipboardPerformanceTest = new ClipboardPerformanceTest(); + clipboardPerformanceTest.initialize(); + return; + } + + long before, after, oldTime, newTime; + float ratio; + + try { + Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null); + before = System.currentTimeMillis(); + String ss = (String) t.getTransferData(new DataFlavor("text/plain; class=java.lang.String")); + after = System.currentTimeMillis(); + + System.err.println("Size: " + ss.length()); + newTime = after - before; + System.err.println("Time consumed: " + newTime); + + initArray(); + + StringBuffer buf = new StringBuffer(new String(text)); + int eoln_len = eoln.length(); + before = System.currentTimeMillis(); + + for (int i = 0; i + eoln_len <= buf.length(); i++) { + if (eoln.equals(buf.substring(i, i + eoln_len))) { + buf.replace(i, i + eoln_len, "\n"); + } + } + + after = System.currentTimeMillis(); + oldTime = after - before; + System.err.println("Old algorithm: " + oldTime); + ratio = oldTime / newTime; + System.err.println("Ratio: " + ratio); + + if (ratio < RATIO_THRESHOLD) { + System.out.println("Time ratio failure!!"); + System.exit(CODE_FAILURE); + } + } catch (Throwable e) { + e.printStackTrace(); + System.exit(CODE_OTHER_FAILURE); + } + System.out.println("Test Pass!"); + } + + public static void initArray() { + text = new char[ARRAY_SIZE + 2]; + + for (int i = 0; i < ARRAY_SIZE; i += 3) { + text[i] = '\r'; + text[i + 1] = '\n'; + text[i + 2] = 'a'; + } + eoln = "\r\n"; + } + + public void initialize() throws Exception { + initArray(); + Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); + cb.setContents(new StringSelection(new String(text)), null); + + ProcessBuilder pb = ProcessTools.createTestJavaProcessBuilder( + ClipboardPerformanceTest.class.getName(), + "child" + ); + + Process process = ProcessTools.startProcess("Child", pb); + OutputAnalyzer outputAnalyzer = new OutputAnalyzer(process); + + if (!process.waitFor(15, TimeUnit.SECONDS)) { + process.destroyForcibly(); + throw new TimeoutException("Timed out waiting for Child"); + } + + outputAnalyzer.shouldHaveExitValue(0); + } +} diff --git a/test/jdk/java/awt/datatransfer/HTMLTransferConsoleOutputTest.java b/test/jdk/java/awt/datatransfer/HTMLTransferConsoleOutputTest.java new file mode 100644 index 000000000000..6a18a11270fc --- /dev/null +++ b/test/jdk/java/awt/datatransfer/HTMLTransferConsoleOutputTest.java @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2002, 2025, 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 4638351 + * @summary tests that HTML transfer doesn't cause console output + * @key headful + * @library /test/lib + * @run main HTMLTransferConsoleOutputTest + */ + +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.ClipboardOwner; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.awt.datatransfer.UnsupportedFlavorException; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintStream; +import java.io.UnsupportedEncodingException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; + +public class HTMLTransferConsoleOutputTest implements ClipboardOwner { + static final Clipboard clipboard = + Toolkit.getDefaultToolkit().getSystemClipboard(); + static final DataFlavor dataFlavor = + new DataFlavor("text/html; class=java.lang.String", null); + static final String magic = "TESTMAGICSTRING"; + static final Transferable transferable = new Transferable() { + final DataFlavor[] flavors = new DataFlavor[]{dataFlavor}; + final String data = "" + magic + ""; + + public DataFlavor[] getTransferDataFlavors() { + return flavors; + } + + public boolean isDataFlavorSupported(DataFlavor df) { + return dataFlavor.equals(df); + } + + public Object getTransferData(DataFlavor df) + throws UnsupportedFlavorException { + if (!isDataFlavorSupported(df)) { + throw new UnsupportedFlavorException(df); + } + return data; + } + }; + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + public static final int CLIPBOARD_DELAY = 1000; + + public static void main(String[] args) throws Exception { + if (args.length == 0) { + HTMLTransferConsoleOutputTest htmlTransferConsoleOutputTest = new HTMLTransferConsoleOutputTest(); + htmlTransferConsoleOutputTest.initialize(); + return; + } + final ClipboardOwner clipboardOwner = new ClipboardOwner() { + public void lostOwnership(Clipboard clip, + Transferable contents) { + System.exit(0); + } + }; + clipboard.setContents(transferable, clipboardOwner); + final Object o = new Object(); + synchronized (o) { + try { + o.wait(); + } catch (InterruptedException ie) { + ie.printStackTrace(); + } + } + System.out.println("Test Pass!"); + } + + public void initialize() throws Exception { + clipboard.setContents(transferable, this); + ProcessBuilder pb = ProcessTools.createTestJavaProcessBuilder( + HTMLTransferConsoleOutputTest.class.getName(), + "child" + ); + + Process process = ProcessTools.startProcess("Child", pb); + OutputAnalyzer outputAnalyzer = new OutputAnalyzer(process); + + if (!process.waitFor(15, TimeUnit.SECONDS)) { + process.destroyForcibly(); + throw new TimeoutException("Timed out waiting for Child"); + } + + byte[] bytes = baos.toByteArray(); + String string = null; + try { + string = new String(bytes, "ASCII"); + } catch (UnsupportedEncodingException uee) { + uee.printStackTrace(); + } + if (string.lastIndexOf(magic) != -1) { + throw new RuntimeException("Test failed. Output contains:" + + string); + } + + outputAnalyzer.shouldHaveExitValue(0); + } + + + static class ForkOutputStream extends OutputStream { + final OutputStream outputStream1; + final OutputStream outputStream2; + + public ForkOutputStream(OutputStream os1, OutputStream os2) { + outputStream1 = os1; + outputStream2 = os2; + } + + public void write(int b) throws IOException { + outputStream1.write(b); + outputStream2.write(b); + } + + public void flush() throws IOException { + outputStream1.flush(); + outputStream2.flush(); + } + + public void close() throws IOException { + outputStream1.close(); + outputStream2.close(); + } + } + + public void lostOwnership(Clipboard clip, Transferable contents) { + final Runnable r = () -> { + try { + Thread.sleep(CLIPBOARD_DELAY); + } catch (InterruptedException e) { + e.printStackTrace(); + } + final PrintStream oldOut = System.out; + final PrintStream newOut = + new PrintStream(new ForkOutputStream(oldOut, baos)); + Transferable t = clipboard.getContents(null); + try { + System.setOut(newOut); + t.getTransferData(dataFlavor); + System.setOut(oldOut); + } catch (IOException | UnsupportedFlavorException ioe) { + ioe.printStackTrace(); + } + clipboard.setContents(transferable, null); + }; + final Thread t = new Thread(r); + t.start(); + } +} diff --git a/test/jdk/java/awt/datatransfer/ImageTransferCrashTest.java b/test/jdk/java/awt/datatransfer/ImageTransferCrashTest.java new file mode 100644 index 000000000000..76e484b3ce2b --- /dev/null +++ b/test/jdk/java/awt/datatransfer/ImageTransferCrashTest.java @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2002, 2025, 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 4513976 + * @summary tests that inter-JVM image transfer doesn't cause crash + * @key headful + * @library /test/lib + * @run main ImageTransferCrashTest + */ + +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.ClipboardOwner; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.StringSelection; +import java.awt.datatransfer.Transferable; +import java.awt.datatransfer.UnsupportedFlavorException; +import java.awt.image.BufferedImage; +import java.awt.image.WritableRaster; +import java.io.IOException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; + +public class ImageTransferCrashTest implements ClipboardOwner { + static final Clipboard clipboard = + Toolkit.getDefaultToolkit().getSystemClipboard(); + final Transferable textTransferable = new StringSelection("TEXT"); + public static final int CLIPBOARD_DELAY = 10; + + public static void main(String[] args) throws Exception { + if (args.length == 0) { + ImageTransferCrashTest imageTransferCrashTest = new ImageTransferCrashTest(); + imageTransferCrashTest.initialize(); + return; + } + final ClipboardOwner clipboardOwner = (clip, contents) -> System.exit(0); + final int width = 100; + final int height = 100; + final BufferedImage bufferedImage = + new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + final WritableRaster writableRaster = + bufferedImage.getWritableTile(0, 0); + final int[] color = new int[]{0x80, 0x80, 0x80}; + for (int i = 0; i < width; i++) { + for (int j = 0; j < height; j++) { + writableRaster.setPixel(i, j, color); + } + } + bufferedImage.releaseWritableTile(0, 0); + + final Transferable imageTransferable = new Transferable() { + final DataFlavor[] flavors = new DataFlavor[]{ + DataFlavor.imageFlavor}; + + public DataFlavor[] getTransferDataFlavors() { + return flavors; + } + + public boolean isDataFlavorSupported(DataFlavor df) { + return DataFlavor.imageFlavor.equals(df); + } + + public Object getTransferData(DataFlavor df) + throws UnsupportedFlavorException { + if (!isDataFlavorSupported(df)) { + throw new UnsupportedFlavorException(df); + } + return bufferedImage; + } + }; + clipboard.setContents(imageTransferable, clipboardOwner); + final Object o = new Object(); + synchronized (o) { + try { + o.wait(); + } catch (InterruptedException ie) { + ie.printStackTrace(); + } + } + System.out.println("Test Pass!"); + } + + public void initialize() throws Exception { + clipboard.setContents(textTransferable, this); + ProcessBuilder pb = ProcessTools.createTestJavaProcessBuilder( + ImageTransferCrashTest.class.getName(), + "child" + ); + + Process process = ProcessTools.startProcess("Child", pb); + OutputAnalyzer outputAnalyzer = new OutputAnalyzer(process); + + if (!process.waitFor(15, TimeUnit.SECONDS)) { + process.destroyForcibly(); + throw new TimeoutException("Timed out waiting for Child"); + } + + outputAnalyzer.shouldHaveExitValue(0); + } + + public void lostOwnership(Clipboard clip, Transferable contents) { + final Runnable r = () -> { + while (true) { + try { + Thread.sleep(CLIPBOARD_DELAY); + Transferable t = clipboard.getContents(null); + t.getTransferData(DataFlavor.imageFlavor); + } catch (IllegalStateException e) { + e.printStackTrace(); + System.err.println("clipboard is not prepared yet"); + continue; + } catch (Exception e) { + e.printStackTrace(); + } + break; + } + clipboard.setContents(textTransferable, null); + }; + final Thread t = new Thread(r); + t.start(); + } +} From ef6a28d560d6bd418be5c14d4226eb22298f7b92 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Tue, 16 Sep 2025 16:25:55 +0000 Subject: [PATCH 066/323] 8353309: Open source several Swing text tests 8359418: Test "javax/swing/text/GlyphView/bug4188841.java" failed because the phrase of text pane does not match the instructions Reviewed-by: serb Backport-of: 31a6de2e743923c92e976d5f5536120736d56029 --- .../swing/text/BoxView/BaselineTest.java | 182 ++++++++++++++++++ .../swing/text/GlyphView/bug4188841.java | 93 +++++++++ .../html/FormView/4473401/bug4473401.java | 90 +++++++++ .../text/html/FormView/4473401/frame1.html | 9 + .../text/html/FormView/4473401/frame2.html | 4 + .../html/FormView/4473401/frameresult.html | 5 + .../text/html/FormView/4473401/frameset.html | 11 ++ .../swing/text/html/FormView/bug4529702.java | 62 ++++++ .../html/FrameSetView/4890934/bug4890934.java | 91 +++++++++ .../html/FrameSetView/4890934/frame1.html | 8 + .../html/FrameSetView/4890934/frame2.html | 4 + .../FrameSetView/4890934/frameresult.html | 7 + .../html/FrameSetView/4890934/frameset.html | 11 ++ 13 files changed, 577 insertions(+) create mode 100644 test/jdk/javax/swing/text/BoxView/BaselineTest.java create mode 100644 test/jdk/javax/swing/text/GlyphView/bug4188841.java create mode 100644 test/jdk/javax/swing/text/html/FormView/4473401/bug4473401.java create mode 100644 test/jdk/javax/swing/text/html/FormView/4473401/frame1.html create mode 100644 test/jdk/javax/swing/text/html/FormView/4473401/frame2.html create mode 100644 test/jdk/javax/swing/text/html/FormView/4473401/frameresult.html create mode 100644 test/jdk/javax/swing/text/html/FormView/4473401/frameset.html create mode 100644 test/jdk/javax/swing/text/html/FormView/bug4529702.java create mode 100644 test/jdk/javax/swing/text/html/FrameSetView/4890934/bug4890934.java create mode 100644 test/jdk/javax/swing/text/html/FrameSetView/4890934/frame1.html create mode 100644 test/jdk/javax/swing/text/html/FrameSetView/4890934/frame2.html create mode 100644 test/jdk/javax/swing/text/html/FrameSetView/4890934/frameresult.html create mode 100644 test/jdk/javax/swing/text/html/FrameSetView/4890934/frameset.html diff --git a/test/jdk/javax/swing/text/BoxView/BaselineTest.java b/test/jdk/javax/swing/text/BoxView/BaselineTest.java new file mode 100644 index 000000000000..1af8d6cb2862 --- /dev/null +++ b/test/jdk/javax/swing/text/BoxView/BaselineTest.java @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2002, 2025, 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 4519537 4522866 + * @summary Tests that text and components in paragraph views line up at their baselines. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual BaselineTest + */ + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.GridLayout; + +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JScrollPane; +import javax.swing.JTextPane; + +import javax.swing.text.ComponentView; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import javax.swing.text.Element; +import javax.swing.text.SimpleAttributeSet; +import javax.swing.text.StyleConstants; +import javax.swing.text.StyledEditorKit; +import javax.swing.text.View; +import javax.swing.text.ViewFactory; + +public class BaselineTest { + + static final String INSTRUCTIONS = """ + Test that components displayed in a JTextPane properly respect their vertical alignment. + There are two text panes, stacked vertically with similar content except the bottom components are taller. + The content consists of a leading and trailing text string, with pink coloured components between. + The text string content means the strings 'Default Size Text' and 'Large Size Text'. + Text content baseline is at the bottom of CAPITAL letters in the text. + Each pink component has a string displaying its alignment setting in the range 0.0 to 1.0 + NB: The position of the strings "align = 0.0" etc is not important, it is the component position that matters. + 0.0 means it should be aligned with its top at the text content baseline, + 1.0 means it should be aligned with its bottom at the text content baseline. + A value in between will be a proportional alignment, eg 0.5 is centered on the text content baseline + If the content displays as described, the test PASSES. + """; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .title("BaselineTest Test Instructions") + .instructions(INSTRUCTIONS) + .columns(60) + .rows(12) + .testUI(BaselineTest::createUI) + .positionTestUIBottomRowCentered() + .build() + .awaitAndCheck(); + } + + public static JFrame createUI() { + JFrame frame = new JFrame("BaselineTest"); + frame.setLayout(new GridLayout(2, 1)); + + JTextPane prefPane = new JTextPane(); + initJTextPane(prefPane); + frame.add(new JScrollPane(prefPane)); + + JTextPane variablePane = new JTextPane(); + variablePane.setEditorKit(new CustomEditorKit()); + initJTextPane(variablePane); + frame.add(new JScrollPane(variablePane)); + frame.setSize(800, 400); + return frame; + } + + static void initJTextPane(JTextPane tp) { + + try { + Document doc = tp.getDocument(); + + doc.insertString(0, " Default Size Text ", null); + tp.setCaretPosition(doc.getLength()); + tp.insertComponent(new PaintLabel(0.0f)); + tp.insertComponent(new PaintLabel(0.2f)); + tp.insertComponent(new PaintLabel(0.5f)); + tp.insertComponent(new PaintLabel(0.7f)); + tp.insertComponent(new PaintLabel(1.0f)); + SimpleAttributeSet set = new SimpleAttributeSet(); + StyleConstants.setFontSize(set, 20); + tp.setCaretPosition(doc.getLength()); + doc.insertString(doc.getLength(), " Large Size Text ", set); + } catch (BadLocationException ble) { + throw new RuntimeException(ble); + } + } + + static class PaintLabel extends JLabel { + + private int pref = 40; + private int min = pref - 30; + private int max = pref + 30; + + public PaintLabel(float align) { + + setAlignmentY(align); + String alignStr = String.valueOf(align); + + setText("align = " + alignStr); + setOpaque(true); + setBackground(Color.PINK); + } + + public Dimension getMinimumSize() { + return new Dimension(super.getMinimumSize().width, min); + } + + public Dimension getPreferredSize() { + return new Dimension(super.getPreferredSize().width, pref); + } + + public Dimension getMaximumSize() { + return new Dimension(super.getMaximumSize().width, max); + } + + public void paintComponent(Graphics g) { + g.setColor(Color.PINK); + g.fillRect(0, 0, getWidth(), getHeight()); + int y = (int)(getAlignmentY() * getHeight()); + g.setColor(Color.BLACK); + g.drawLine(0, y, getWidth(), y); + g.drawString(getText(), 0, 10); + } + } + + static class CustomComponentView extends ComponentView { + + public CustomComponentView(Element elem) { + super(elem); + } + + public int getResizeWeight(int axis) { + return 1; + } +} + + static class CustomEditorKit extends StyledEditorKit implements ViewFactory { + + public View create(Element elem) { + if (StyleConstants.ComponentElementName.equals(elem.getName())) { + return new CustomComponentView(elem); + } else { + return super.getViewFactory().create(elem); + } + } + + public ViewFactory getViewFactory() { + return this; + } +} + +} diff --git a/test/jdk/javax/swing/text/GlyphView/bug4188841.java b/test/jdk/javax/swing/text/GlyphView/bug4188841.java new file mode 100644 index 000000000000..9935712bd49c --- /dev/null +++ b/test/jdk/javax/swing/text/GlyphView/bug4188841.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2003, 2025, 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 4188841 + * @summary Tests a JTextPane wrapping issue + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4188841 +*/ + +import java.awt.Dimension; +import javax.swing.JFrame; +import javax.swing.JScrollPane; +import javax.swing.JTextPane; + +public class bug4188841 { + + static final String INSTRUCTIONS = """ + The text pane contains the phrase "the quick brown fox jumps over the lazy dog", + all the words are separated by tabs. When the test starts, the whole phrase should + appear on one line. If it is wrapped along two or more lines, the test FAILS. + + Otherwise, place the text caret in the very end of the line (e.g. by clicking + in the line and hitting End). Press Enter twice. The text should appear as one + line at all times. If the text wraps when you press Enter, the test FAILS. + """; + + static class NoWrapTextPane extends JTextPane { + + public boolean getScrollableTracksViewportWidth() { + //should not allow text to be wrapped + return false; + } + + public void setSize(Dimension d) { + // don't let the Textpane get sized smaller than its parent + if (d.width < getParent().getSize().width) { + super.setSize(getParent().getSize()); + } + else { + super.setSize(d); + } + } + } + + static JFrame createUI() { + + JFrame frame = new JFrame("bug4188841"); + + NoWrapTextPane nwp = new NoWrapTextPane(); + nwp.setText("the\tquick\tbrown\tfox\tjumps\tover\tthe\tlazy\tdog!"); + nwp.setCaretPosition(nwp.getText().length()); + + JScrollPane scrollPane = new JScrollPane(nwp, + JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, + JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); + + frame.add(scrollPane); + frame.setSize(400, 300); + return frame; + } + + public static void main(String args[]) throws Exception { + PassFailJFrame.builder() + .title("Test Instructions") + .instructions(INSTRUCTIONS) + .columns(60) + .testUI(bug4188841::createUI) + .build() + .awaitAndCheck(); + } +} diff --git a/test/jdk/javax/swing/text/html/FormView/4473401/bug4473401.java b/test/jdk/javax/swing/text/html/FormView/4473401/bug4473401.java new file mode 100644 index 000000000000..29dbba7ca045 --- /dev/null +++ b/test/jdk/javax/swing/text/html/FormView/4473401/bug4473401.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2003, 2025, 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 4473401 + * @summary Tests if FormSubmitEvent is submitted correctly. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4473401 +*/ + +import java.io.File; +import javax.swing.JEditorPane; +import javax.swing.JFrame; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; +import javax.swing.text.html.FormSubmitEvent; +import javax.swing.text.html.HTMLEditorKit; + +public class bug4473401 implements HyperlinkListener { + + static final String INSTRUCTIONS = """ + The test window displays an HTML frameset with a frame + on the left and another to the right. + Push the 'Submit Query' button in the left frame to perform testing. + The window should be updated to have only one frame with the + message 'If you see this page the test PASSED'. + If it appears, PASS the test, otherwise FAIL the test. + """; + + static JEditorPane jep; + static JFrame createUI() { + + JFrame frame = new JFrame("bug4473401"); + jep = new JEditorPane(); + jep.addHyperlinkListener(new bug4473401()); + HTMLEditorKit kit = new HTMLEditorKit(); + kit.setAutoFormSubmission(false); + jep.setEditorKit(kit); + jep.setEditable(false); + + try { + File file = new File(System.getProperty("test.src", "."), "frameset.html"); + System.out.println(file.toURI().toURL()); + jep.setPage(file.toURL()); + } catch (Exception e) { + throw new RuntimeException(e); + } + + frame.add(jep); + frame.setSize(500, 500); + return frame; + } + + public void hyperlinkUpdate(HyperlinkEvent e) { + if (e instanceof FormSubmitEvent) { + jep.setText("If you see this page the test PASSED"); + } + } + + public static void main(String args[]) throws Exception { + PassFailJFrame.builder() + .title("Test Instructions") + .instructions(INSTRUCTIONS) + .columns(40) + .testUI(bug4473401::createUI) + .build() + .awaitAndCheck(); + } +} diff --git a/test/jdk/javax/swing/text/html/FormView/4473401/frame1.html b/test/jdk/javax/swing/text/html/FormView/4473401/frame1.html new file mode 100644 index 000000000000..833bc1f63529 --- /dev/null +++ b/test/jdk/javax/swing/text/html/FormView/4473401/frame1.html @@ -0,0 +1,9 @@ + + +Push the Submit query button +
      +
      + +
      + + diff --git a/test/jdk/javax/swing/text/html/FormView/4473401/frame2.html b/test/jdk/javax/swing/text/html/FormView/4473401/frame2.html new file mode 100644 index 000000000000..5bc6dba57fc4 --- /dev/null +++ b/test/jdk/javax/swing/text/html/FormView/4473401/frame2.html @@ -0,0 +1,4 @@ + + + + diff --git a/test/jdk/javax/swing/text/html/FormView/4473401/frameresult.html b/test/jdk/javax/swing/text/html/FormView/4473401/frameresult.html new file mode 100644 index 000000000000..6ef5c8198cc3 --- /dev/null +++ b/test/jdk/javax/swing/text/html/FormView/4473401/frameresult.html @@ -0,0 +1,5 @@ + + +If you see this page the test FAILED. + + diff --git a/test/jdk/javax/swing/text/html/FormView/4473401/frameset.html b/test/jdk/javax/swing/text/html/FormView/4473401/frameset.html new file mode 100644 index 000000000000..1e7f8298d628 --- /dev/null +++ b/test/jdk/javax/swing/text/html/FormView/4473401/frameset.html @@ -0,0 +1,11 @@ + + + + Manual test for bug 4463014 + + + + + + + \ No newline at end of file diff --git a/test/jdk/javax/swing/text/html/FormView/bug4529702.java b/test/jdk/javax/swing/text/html/FormView/bug4529702.java new file mode 100644 index 000000000000..4962a0a66630 --- /dev/null +++ b/test/jdk/javax/swing/text/html/FormView/bug4529702.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2002, 2025, 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 4529702 + * @summary Test that radio buttons with different names should be selectable at the same time + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4529702 +*/ + +import javax.swing.JFrame; +import javax.swing.JTextPane; + +public class bug4529702 { + + static final String INSTRUCTIONS = """ + There are two rows of radio buttons, each row having two buttons. + If you can select radio buttons from the first and the second rows + at the same time the test PASSES otherwise the test FAILS. + """; + + static JFrame createUI() { + JFrame frame = new JFrame("bug4529702"); + JTextPane jtp = new JTextPane(); + jtp.setContentType("text/html"); + jtp.setText("

      " + + "
      "); + frame.add(jtp); + frame.setSize(200, 200); + return frame; + } + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(40) + .testUI(bug4529702::createUI) + .build() + .awaitAndCheck(); + } +} diff --git a/test/jdk/javax/swing/text/html/FrameSetView/4890934/bug4890934.java b/test/jdk/javax/swing/text/html/FrameSetView/4890934/bug4890934.java new file mode 100644 index 000000000000..988db296f7b6 --- /dev/null +++ b/test/jdk/javax/swing/text/html/FrameSetView/4890934/bug4890934.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2003, 2025, 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 4890934 + * @summary Tests if JEditor Pane updates the correct frame when using + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4890934 +*/ + +import java.io.File; +import javax.swing.JEditorPane; +import javax.swing.JFrame; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; +import javax.swing.text.html.HTMLDocument; +import javax.swing.text.html.HTMLEditorKit; +import javax.swing.text.html.HTMLFrameHyperlinkEvent; + +public class bug4890934 implements HyperlinkListener { + + static final String INSTRUCTIONS = """ + The test window displays an HTML frameset with a frame + on the left and another to the right. + Click the link in the left frame which should change the view. + The resulting page will tell you if the test PASSED or FAILED. + """; + + static JFrame createUI() { + + JFrame frame = new JFrame("bug4890934"); + JEditorPane jep = new JEditorPane(); + jep.setEditorKit(new HTMLEditorKit()); + jep.setEditable(false); + jep.addHyperlinkListener(new bug4890934()); + + try { + File file = new File(System.getProperty("test.src", "."), "frameset.html"); + System.out.println(file.toURI().toURL()); + jep.setPage(file.toURL()); + } catch (Exception e) { + throw new RuntimeException(e); + } + + frame.add(jep); + frame.setSize(600, 300); + return frame; + } + + public void hyperlinkUpdate(HyperlinkEvent e) { + if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { + JEditorPane pane = (JEditorPane) e.getSource(); + if (e instanceof HTMLFrameHyperlinkEvent) { + HTMLFrameHyperlinkEvent evt = (HTMLFrameHyperlinkEvent)e; + HTMLDocument doc = (HTMLDocument)pane.getDocument(); + doc.processHTMLFrameHyperlinkEvent(evt); + } + } + } + + public static void main(String args[]) throws Exception { + PassFailJFrame.builder() + .title("Test Instructions") + .instructions(INSTRUCTIONS) + .columns(40) + .testUI(bug4890934::createUI) + .build() + .awaitAndCheck(); + } +} diff --git a/test/jdk/javax/swing/text/html/FrameSetView/4890934/frame1.html b/test/jdk/javax/swing/text/html/FrameSetView/4890934/frame1.html new file mode 100644 index 000000000000..31f95568aaee --- /dev/null +++ b/test/jdk/javax/swing/text/html/FrameSetView/4890934/frame1.html @@ -0,0 +1,8 @@ + + + + + + a link + + diff --git a/test/jdk/javax/swing/text/html/FrameSetView/4890934/frame2.html b/test/jdk/javax/swing/text/html/FrameSetView/4890934/frame2.html new file mode 100644 index 000000000000..5bc6dba57fc4 --- /dev/null +++ b/test/jdk/javax/swing/text/html/FrameSetView/4890934/frame2.html @@ -0,0 +1,4 @@ + + + + diff --git a/test/jdk/javax/swing/text/html/FrameSetView/4890934/frameresult.html b/test/jdk/javax/swing/text/html/FrameSetView/4890934/frameresult.html new file mode 100644 index 000000000000..a31045833b5c --- /dev/null +++ b/test/jdk/javax/swing/text/html/FrameSetView/4890934/frameresult.html @@ -0,0 +1,7 @@ + + +If you see this text in the RIGHT frame the test PASSED. +

      If you see this text in the LEFT frame the test FAILED. + + + diff --git a/test/jdk/javax/swing/text/html/FrameSetView/4890934/frameset.html b/test/jdk/javax/swing/text/html/FrameSetView/4890934/frameset.html new file mode 100644 index 000000000000..9462e1894a59 --- /dev/null +++ b/test/jdk/javax/swing/text/html/FrameSetView/4890934/frameset.html @@ -0,0 +1,11 @@ + + + + Manual test for bug 4463014 + + + + + + + From 1a7e71a92b9612ae075605a045cfeb59203908f2 Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Wed, 17 Sep 2025 08:00:56 +0000 Subject: [PATCH 067/323] 8325731: Installation instructions for Debian/Ubuntu don't mention autoconf Backport-of: c3c1cdd1b017654469f214c62457cde248474f2f --- doc/building.html | 2 +- doc/building.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/building.html b/doc/building.html index 5295c0e64515..8ca1f0c4f84d 100644 --- a/doc/building.html +++ b/doc/building.html @@ -476,7 +476,7 @@

      Linux

      The basic tooling is provided as part of the core operating system, but you will most likely need to install developer packages.

      For apt-based distributions (Debian, Ubuntu, etc), try this:

      -
      sudo apt-get install build-essential
      +
      sudo apt-get install build-essential autoconf

      For rpm-based distributions (Fedora, Red Hat, etc), try this:

      sudo yum groupinstall "Development Tools"

      For Alpine Linux, aside from basic tooling, install the GNU versions diff --git a/doc/building.md b/doc/building.md index 36bf32945a85..29ad343866d2 100644 --- a/doc/building.md +++ b/doc/building.md @@ -289,7 +289,7 @@ will most likely need to install developer packages. For apt-based distributions (Debian, Ubuntu, etc), try this: ``` -sudo apt-get install build-essential +sudo apt-get install build-essential autoconf ``` For rpm-based distributions (Fedora, Red Hat, etc), try this: From 8a788905a8c7a6ab342c0b3d8ae01c4202852204 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Wed, 17 Sep 2025 12:45:35 +0000 Subject: [PATCH 068/323] 8322135: Printing JTable in Windows L&F throws InternalError: HTHEME is null Backport-of: 21480a7ae8dce67cf3a844d8caafb0b96c37ac0e --- .../classes/sun/awt/windows/ThemeReader.java | 19 ++++++++++++++----- .../swing/JTable/JTableScrollPrintTest.java | 2 +- .../javax/swing/JTable/PrintAllPagesTest.java | 4 ++-- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/java.desktop/windows/classes/sun/awt/windows/ThemeReader.java b/src/java.desktop/windows/classes/sun/awt/windows/ThemeReader.java index 61972bf4ed57..7c0d8c1ea4d1 100644 --- a/src/java.desktop/windows/classes/sun/awt/windows/ThemeReader.java +++ b/src/java.desktop/windows/classes/sun/awt/windows/ThemeReader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2024, 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 @@ -100,21 +100,30 @@ public static boolean isXPStyleEnabled() { return xpStyleEnabled; } - private static Long openThemeImpl(String widget, int dpi) { - Long theme; + private static long openThemeImpl(String widget, int dpi) { + long theme; int i = widget.indexOf("::"); if (i > 0) { // We're using the syntax "subAppName::controlName" here, as used by msstyles. // See documentation for SetWindowTheme on MSDN. setWindowTheme(widget.substring(0, i)); - theme = openTheme(widget.substring(i + 2), dpi); + theme = getOpenThemeValue(widget.substring(i + 2), dpi); setWindowTheme(null); } else { - theme = openTheme(widget, dpi); + theme = getOpenThemeValue(widget, dpi); } return theme; } + private static long getOpenThemeValue(String widget, int dpi) { + long theme; + theme = openTheme(widget, dpi); + if (theme == 0) { + theme = openTheme(widget, defaultDPI); + } + return theme; + } + // this should be called only with writeLock held private static Long getThemeImpl(String widget, int dpi) { return dpiAwareWidgetToTheme.computeIfAbsent(dpi, key -> new HashMap<>()) diff --git a/test/jdk/javax/swing/JTable/JTableScrollPrintTest.java b/test/jdk/javax/swing/JTable/JTableScrollPrintTest.java index 5621b3593460..a2bd03081a9b 100644 --- a/test/jdk/javax/swing/JTable/JTableScrollPrintTest.java +++ b/test/jdk/javax/swing/JTable/JTableScrollPrintTest.java @@ -41,7 +41,7 @@ /* * @test * @key headful - * @bug 8210807 8322140 + * @bug 8210807 8322140 8322135 * @library /java/awt/regtesthelpers * @build PassFailJFrame * @summary Test to check if JTable can be printed when JScrollPane added to it. diff --git a/test/jdk/javax/swing/JTable/PrintAllPagesTest.java b/test/jdk/javax/swing/JTable/PrintAllPagesTest.java index 263415f641b4..284fbe57097b 100644 --- a/test/jdk/javax/swing/JTable/PrintAllPagesTest.java +++ b/test/jdk/javax/swing/JTable/PrintAllPagesTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, 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 @@ -22,7 +22,7 @@ */ /* * @test - * @bug 8257810 + * @bug 8257810 8322135 * @library /java/awt/regtesthelpers * @build PassFailJFrame * @summary Verifies if all pages are printed if scrollRectToVisible is set. From a7d68376372ae532aa13a737d1f0f45ae1693338 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Wed, 17 Sep 2025 12:48:59 +0000 Subject: [PATCH 069/323] 8338740: java/net/httpclient/HttpsTunnelAuthTest.java fails with java.io.IOException: HTTP/1.1 header parser received no bytes Backport-of: 4ca2c208ea2b308093b4a25b04a274f9b1ec6a1d --- test/jdk/java/net/httpclient/ProxyServer.java | 35 +++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/test/jdk/java/net/httpclient/ProxyServer.java b/test/jdk/java/net/httpclient/ProxyServer.java index e07badd2bb7a..7de14a79225a 100644 --- a/test/jdk/java/net/httpclient/ProxyServer.java +++ b/test/jdk/java/net/httpclient/ProxyServer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, 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 @@ -195,6 +195,9 @@ class Connection { volatile InputStream clientIn, serverIn; volatile OutputStream clientOut, serverOut; + boolean proxyInClosed; // only accessed from synchronized block + boolean proxyOutClosed; // only accessed from synchronized block + final static int CR = 13; final static int LF = 10; @@ -594,9 +597,7 @@ synchronized void proxyCommon(boolean log) throws IOException { if (log) System.out.printf("Proxy Forwarding [request body]: total %d%n", body); } - closing = true; - serverSocket.close(); - clientSocket.close(); + closeClientIn(); } catch (IOException e) { if (!closing && debug) { System.out.println("Proxy: " + e); @@ -615,9 +616,7 @@ synchronized void proxyCommon(boolean log) throws IOException { if (log) System.out.printf("Proxy Forwarding [response]: %s%n", new String(bb, 0, n, UTF_8)); if (log) System.out.printf("Proxy Forwarding [response]: total %d%n", resp); } - closing = true; - serverSocket.close(); - clientSocket.close(); + closeClientOut(); } catch (IOException e) { if (!closing && debug) { System.out.println("Proxy: " + e); @@ -641,6 +640,28 @@ void doTunnel(String dest) throws IOException { proxyCommon(false); } + synchronized void closeClientIn() throws IOException { + closing = true; + proxyInClosed = true; + clientSocket.shutdownInput(); + serverSocket.shutdownOutput(); + if (proxyOutClosed) { + serverSocket.close(); + clientSocket.close(); + } + } + + synchronized void closeClientOut() throws IOException { + closing = true; + proxyOutClosed = true; + serverSocket.shutdownInput(); + clientSocket.shutdownOutput(); + if (proxyInClosed) { + serverSocket.close(); + clientSocket.close(); + } + } + @Override public String toString() { return "Proxy connection " + id + ", client sock:" + clientSocket; From 5b0190602dd4b1212dcba4f7050914d62460b5e9 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Wed, 17 Sep 2025 12:51:36 +0000 Subject: [PATCH 070/323] 8347143: [aix] Fix strdup use in os::dll_load Reviewed-by: jkern, mdoerr Backport-of: d5320197995bbd4423e660c61a4677428e70819c --- src/hotspot/os/aix/os_aix.cpp | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/hotspot/os/aix/os_aix.cpp b/src/hotspot/os/aix/os_aix.cpp index 15e5770b7200..67592d37bb5d 100644 --- a/src/hotspot/os/aix/os_aix.cpp +++ b/src/hotspot/os/aix/os_aix.cpp @@ -1,6 +1,6 @@ /* * Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2012, 2023 SAP SE. All rights reserved. + * Copyright (c) 2012, 2025 SAP SE. 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 @@ -1160,21 +1160,24 @@ static void* dll_load_library(const char *filename, int *eno, char *ebuf, int eb // If filename matches .so, and loading fails, repeat with .a. void *os::dll_load(const char *filename, char *ebuf, int ebuflen) { void* result = nullptr; - char* const file_path = strdup(filename); - char* const pointer_to_dot = strrchr(file_path, '.'); const char old_extension[] = ".so"; const char new_extension[] = ".a"; - STATIC_ASSERT(sizeof(old_extension) >= sizeof(new_extension)); // First try to load the existing file. - int eno=0; + int eno = 0; result = dll_load_library(filename, &eno, ebuf, ebuflen); - // If the load fails,we try to reload by changing the extension to .a for .so files only. + // If the load fails, we try to reload by changing the extension to .a for .so files only. // Shared object in .so format dont have braces, hence they get removed for archives with members. - if (result == nullptr && eno == ENOENT && pointer_to_dot != nullptr && strcmp(pointer_to_dot, old_extension) == 0) { - snprintf(pointer_to_dot, sizeof(old_extension), "%s", new_extension); - result = dll_load_library(file_path, &eno, ebuf, ebuflen); + if (result == nullptr && eno == ENOENT) { + const char* pointer_to_dot = strrchr(filename, '.'); + if (pointer_to_dot != nullptr && strcmp(pointer_to_dot, old_extension) == 0) { + STATIC_ASSERT(sizeof(old_extension) >= sizeof(new_extension)); + char* tmp_path = os::strdup(filename); + size_t prefix_size = pointer_delta(pointer_to_dot, filename, 1); + os::snprintf(tmp_path + prefix_size, sizeof(old_extension), "%s", new_extension); + result = dll_load_library(tmp_path, &eno, ebuf, ebuflen); + os::free(tmp_path); + } } - FREE_C_HEAP_ARRAY(char, file_path); return result; } From b465169d8339c2a427c310503833cc79f903da59 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Wed, 17 Sep 2025 12:54:09 +0000 Subject: [PATCH 071/323] 8277424: javax/net/ssl/TLSCommon/TLSTest.java fails with connection refused Backport-of: 6b553acbaace0a61203305f36f70bb74d14a234f --- test/jdk/javax/net/ssl/TLSCommon/TLSTest.java | 116 +++++++++--------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/test/jdk/javax/net/ssl/TLSCommon/TLSTest.java b/test/jdk/javax/net/ssl/TLSCommon/TLSTest.java index 12de3c0e096a..1b3aef8b0fe1 100644 --- a/test/jdk/javax/net/ssl/TLSCommon/TLSTest.java +++ b/test/jdk/javax/net/ssl/TLSCommon/TLSTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, 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,91 +50,91 @@ * @test * @bug 8205111 * @summary Test TLS with different types of supported keys. - * @run main/othervm TLSTest TLSv1.3 rsa_pkcs1_sha1 TLS_AES_128_GCM_SHA256 - * @run main/othervm TLSTest TLSv1.3 rsa_pkcs1_sha256 TLS_AES_128_GCM_SHA256 - * @run main/othervm TLSTest TLSv1.3 rsa_pkcs1_sha384 TLS_AES_128_GCM_SHA256 - * @run main/othervm TLSTest TLSv1.3 rsa_pkcs1_sha512 TLS_AES_128_GCM_SHA256 - * @run main/othervm TLSTest TLSv1.3 ec_rsa_pkcs1_sha256 TLS_AES_128_GCM_SHA256 - * @run main/othervm TLSTest TLSv1.3 ecdsa_sha1 TLS_AES_128_GCM_SHA256 - * @run main/othervm TLSTest TLSv1.3 ecdsa_secp384r1_sha384 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 rsa_pkcs1_sha1 TLS_AES_128_GCM_SHA256 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 rsa_pkcs1_sha256 TLS_AES_128_GCM_SHA256 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 rsa_pkcs1_sha384 TLS_AES_128_GCM_SHA256 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 rsa_pkcs1_sha512 TLS_AES_128_GCM_SHA256 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 ec_rsa_pkcs1_sha256 TLS_AES_128_GCM_SHA256 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 ecdsa_sha1 TLS_AES_128_GCM_SHA256 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 ecdsa_secp384r1_sha384 * TLS_AES_128_GCM_SHA256 - * @run main/othervm TLSTest TLSv1.3 ecdsa_secp521r1_sha512 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 ecdsa_secp521r1_sha512 * TLS_AES_128_GCM_SHA256 - * @run main/othervm TLSTest TLSv1.3 rsa_pss_rsae_sha256 TLS_AES_128_GCM_SHA256 - * @run main/othervm TLSTest TLSv1.3 rsa_pss_rsae_sha384 TLS_AES_128_GCM_SHA256 - * @run main/othervm TLSTest TLSv1.3 rsa_pss_rsae_sha512 TLS_AES_128_GCM_SHA256 - * @run main/othervm TLSTest TLSv1.3 rsa_pss_pss_sha256 TLS_AES_128_GCM_SHA256 - * @run main/othervm TLSTest TLSv1.3 rsa_pss_pss_sha384 TLS_AES_128_GCM_SHA256 - * @run main/othervm TLSTest TLSv1.3 rsa_pss_pss_sha512 TLS_AES_128_GCM_SHA256 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 rsa_pss_rsae_sha256 TLS_AES_128_GCM_SHA256 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 rsa_pss_rsae_sha384 TLS_AES_128_GCM_SHA256 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 rsa_pss_rsae_sha512 TLS_AES_128_GCM_SHA256 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 rsa_pss_pss_sha256 TLS_AES_128_GCM_SHA256 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 rsa_pss_pss_sha384 TLS_AES_128_GCM_SHA256 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 rsa_pss_pss_sha512 TLS_AES_128_GCM_SHA256 * - * @run main/othervm TLSTest TLSv1.3 rsa_pkcs1_sha1 TLS_AES_256_GCM_SHA384 - * @run main/othervm TLSTest TLSv1.3 rsa_pkcs1_sha256 TLS_AES_256_GCM_SHA384 - * @run main/othervm TLSTest TLSv1.3 rsa_pkcs1_sha384 TLS_AES_256_GCM_SHA384 - * @run main/othervm TLSTest TLSv1.3 rsa_pkcs1_sha512 TLS_AES_256_GCM_SHA384 - * @run main/othervm TLSTest TLSv1.3 ec_rsa_pkcs1_sha256 TLS_AES_256_GCM_SHA384 - * @run main/othervm TLSTest TLSv1.3 ecdsa_sha1 TLS_AES_256_GCM_SHA384 - * @run main/othervm TLSTest TLSv1.3 ecdsa_secp384r1_sha384 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 rsa_pkcs1_sha1 TLS_AES_256_GCM_SHA384 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 rsa_pkcs1_sha256 TLS_AES_256_GCM_SHA384 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 rsa_pkcs1_sha384 TLS_AES_256_GCM_SHA384 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 rsa_pkcs1_sha512 TLS_AES_256_GCM_SHA384 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 ec_rsa_pkcs1_sha256 TLS_AES_256_GCM_SHA384 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 ecdsa_sha1 TLS_AES_256_GCM_SHA384 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 ecdsa_secp384r1_sha384 * TLS_AES_256_GCM_SHA384 - * @run main/othervm TLSTest TLSv1.3 ecdsa_secp521r1_sha512 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 ecdsa_secp521r1_sha512 * TLS_AES_256_GCM_SHA384 - * @run main/othervm TLSTest TLSv1.3 rsa_pss_rsae_sha256 TLS_AES_256_GCM_SHA384 - * @run main/othervm TLSTest TLSv1.3 rsa_pss_rsae_sha384 TLS_AES_256_GCM_SHA384 - * @run main/othervm TLSTest TLSv1.3 rsa_pss_rsae_sha512 TLS_AES_256_GCM_SHA384 - * @run main/othervm TLSTest TLSv1.3 rsa_pss_pss_sha256 TLS_AES_256_GCM_SHA384 - * @run main/othervm TLSTest TLSv1.3 rsa_pss_pss_sha384 TLS_AES_256_GCM_SHA384 - * @run main/othervm TLSTest TLSv1.3 rsa_pss_pss_sha512 TLS_AES_256_GCM_SHA384 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 rsa_pss_rsae_sha256 TLS_AES_256_GCM_SHA384 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 rsa_pss_rsae_sha384 TLS_AES_256_GCM_SHA384 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 rsa_pss_rsae_sha512 TLS_AES_256_GCM_SHA384 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 rsa_pss_pss_sha256 TLS_AES_256_GCM_SHA384 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 rsa_pss_pss_sha384 TLS_AES_256_GCM_SHA384 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 rsa_pss_pss_sha512 TLS_AES_256_GCM_SHA384 * - * @run main/othervm TLSTest TLSv1.2 rsa_pkcs1_sha1 TLS_RSA_WITH_AES_128_CBC_SHA - * @run main/othervm TLSTest TLSv1.2 rsa_pkcs1_sha256 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.2 rsa_pkcs1_sha1 TLS_RSA_WITH_AES_128_CBC_SHA + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.2 rsa_pkcs1_sha256 * TLS_RSA_WITH_AES_128_CBC_SHA - * @run main/othervm TLSTest TLSv1.2 rsa_pkcs1_sha384 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.2 rsa_pkcs1_sha384 * TLS_RSA_WITH_AES_256_GCM_SHA384 - * @run main/othervm TLSTest TLSv1.2 rsa_pkcs1_sha512 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.2 rsa_pkcs1_sha512 * TLS_RSA_WITH_AES_128_GCM_SHA256 - * @run main/othervm TLSTest TLSv1.2 ec_rsa_pkcs1_sha256 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.2 ec_rsa_pkcs1_sha256 * TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 - * @run main/othervm TLSTest TLSv1.2 ecdsa_sha1 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.2 ecdsa_sha1 * TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - * @run main/othervm TLSTest TLSv1.2 ecdsa_secp384r1_sha384 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.2 ecdsa_secp384r1_sha384 * TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 - * @run main/othervm TLSTest TLSv1.2 ecdsa_secp521r1_sha512 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.2 ecdsa_secp521r1_sha512 * TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA - * @run main/othervm TLSTest TLSv1.2 rsa_pss_rsae_sha256 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.2 rsa_pss_rsae_sha256 * TLS_RSA_WITH_AES_256_CBC_SHA256 - * @run main/othervm TLSTest TLSv1.2 rsa_pss_rsae_sha384 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.2 rsa_pss_rsae_sha384 * TLS_RSA_WITH_AES_256_CBC_SHA - * @run main/othervm TLSTest TLSv1.2 rsa_pss_rsae_sha512 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.2 rsa_pss_rsae_sha512 * TLS_RSA_WITH_AES_128_CBC_SHA256 - * @run main/othervm TLSTest TLSv1.2 rsa_pss_pss_sha256 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.2 rsa_pss_pss_sha256 * TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 - * @run main/othervm TLSTest TLSv1.2 rsa_pss_pss_sha384 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.2 rsa_pss_pss_sha384 * TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 - * @run main/othervm TLSTest TLSv1.2 rsa_pss_pss_sha512 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.2 rsa_pss_pss_sha512 * TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 * - * @run main/othervm TLSTest TLSv1.1 rsa_pkcs1_sha1 TLS_RSA_WITH_AES_128_CBC_SHA - * @run main/othervm TLSTest TLSv1.1 rsa_pkcs1_sha256 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.1 rsa_pkcs1_sha1 TLS_RSA_WITH_AES_128_CBC_SHA + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.1 rsa_pkcs1_sha256 * TLS_RSA_WITH_AES_256_CBC_SHA - * @run main/othervm TLSTest TLSv1.1 rsa_pkcs1_sha384 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.1 rsa_pkcs1_sha384 * TLS_RSA_WITH_AES_128_CBC_SHA - * @run main/othervm TLSTest TLSv1.1 rsa_pkcs1_sha512 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.1 rsa_pkcs1_sha512 * TLS_RSA_WITH_AES_256_CBC_SHA - * @run main/othervm TLSTest TLSv1.1 rsa_pss_rsae_sha256 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.1 rsa_pss_rsae_sha256 * TLS_RSA_WITH_AES_128_CBC_SHA - * @run main/othervm TLSTest TLSv1.1 rsa_pss_rsae_sha384 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.1 rsa_pss_rsae_sha384 * TLS_RSA_WITH_AES_256_CBC_SHA - * @run main/othervm TLSTest TLSv1.1 rsa_pss_rsae_sha512 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.1 rsa_pss_rsae_sha512 * TLS_RSA_WITH_AES_128_CBC_SHA * - * @run main/othervm TLSTest TLSv1 rsa_pkcs1_sha1 TLS_RSA_WITH_AES_128_CBC_SHA - * @run main/othervm TLSTest TLSv1 rsa_pkcs1_sha256 TLS_RSA_WITH_AES_256_CBC_SHA - * @run main/othervm TLSTest TLSv1 rsa_pkcs1_sha384 TLS_RSA_WITH_AES_128_CBC_SHA - * @run main/othervm TLSTest TLSv1 rsa_pkcs1_sha512 TLS_RSA_WITH_AES_256_CBC_SHA - * @run main/othervm TLSTest TLSv1 rsa_pss_rsae_sha256 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1 rsa_pkcs1_sha1 TLS_RSA_WITH_AES_128_CBC_SHA + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1 rsa_pkcs1_sha256 TLS_RSA_WITH_AES_256_CBC_SHA + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1 rsa_pkcs1_sha384 TLS_RSA_WITH_AES_128_CBC_SHA + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1 rsa_pkcs1_sha512 TLS_RSA_WITH_AES_256_CBC_SHA + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1 rsa_pss_rsae_sha256 * TLS_RSA_WITH_AES_128_CBC_SHA - * @run main/othervm TLSTest TLSv1 rsa_pss_rsae_sha384 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1 rsa_pss_rsae_sha384 * TLS_RSA_WITH_AES_256_CBC_SHA - * @run main/othervm TLSTest TLSv1 rsa_pss_rsae_sha512 + * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1 rsa_pss_rsae_sha512 * TLS_RSA_WITH_AES_128_CBC_SHA */ public class TLSTest { @@ -279,7 +279,7 @@ void doClientSide() throws Exception { keyType.getTrustedCert(), null, null, keyType.getKeyType()); SSLSocketFactory sslsf = ctx.getSocketFactory(); try (SSLSocket sslSocket - = (SSLSocket) sslsf.createSocket("localhost", serverPort)) { + = (SSLSocket) sslsf.createSocket(InetAddress.getLoopbackAddress(), serverPort)) { // Specify the client cipher suites sslSocket.setEnabledCipherSuites(new String[]{this.cipher}); sslSocket.setEnabledProtocols(new String[]{this.tlsProtocol}); From ec8b9d291557c7537d0c99aa11b1e303c087999c Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Wed, 17 Sep 2025 12:56:57 +0000 Subject: [PATCH 072/323] 8356187: TestJcmd.java may incorrectly parse podman version Backport-of: 328715d84c0eafb4fe58d28b301138374ddac168 --- .../jtreg/containers/docker/TestJcmd.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/test/hotspot/jtreg/containers/docker/TestJcmd.java b/test/hotspot/jtreg/containers/docker/TestJcmd.java index ca8f1659fe9e..4b604096b00b 100644 --- a/test/hotspot/jtreg/containers/docker/TestJcmd.java +++ b/test/hotspot/jtreg/containers/docker/TestJcmd.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, 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 @@ -37,6 +37,8 @@ */ import java.util.List; import java.util.concurrent.TimeUnit; +import java.util.regex.Pattern; +import java.util.regex.Matcher; import java.util.stream.Collectors; import jdk.test.lib.Container; import jdk.test.lib.JDKToolFinder; @@ -264,14 +266,16 @@ public int compareTo(PodmanVersion other) { } private static PodmanVersion fromVersionString(String version) { - try { - // Example 'podman version 3.2.1' - String versNums = version.split("\\s+", 3)[2]; - String[] numbers = versNums.split("\\.", 3); - return new PodmanVersion(Integer.parseInt(numbers[0]), - Integer.parseInt(numbers[1]), - Integer.parseInt(numbers[2])); - } catch (Exception e) { + // Examples: 'podman version 3.2.1', 'podman version 4.9.4-rhel' + final Pattern pattern = Pattern.compile("podman version (\\d+)\\.(\\d+)\\.(\\d+).*"); + final Matcher matcher = pattern.matcher(version); + + if (matcher.matches()) { + return new PodmanVersion( + Integer.parseInt(matcher.group(1)), + Integer.parseInt(matcher.group(2)), + Integer.parseInt(matcher.group(3))); + } else { System.out.println("Failed to parse podman version: " + version); return DEFAULT; } From de50fcfaece3027f88db186a4c6fc9594f5e661e Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Wed, 17 Sep 2025 13:00:18 +0000 Subject: [PATCH 073/323] 8230016: re-visit test sun/security/pkcs11/Serialize/SerializeProvider.java Backport-of: 470ffeedda45b6f75ce0c794a965428b7859be6f --- .../sun/security/pkcs11/Serialize/SerializeProvider.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/jdk/sun/security/pkcs11/Serialize/SerializeProvider.java b/test/jdk/sun/security/pkcs11/Serialize/SerializeProvider.java index 495da8e6f38d..2b268fe8feaa 100644 --- a/test/jdk/sun/security/pkcs11/Serialize/SerializeProvider.java +++ b/test/jdk/sun/security/pkcs11/Serialize/SerializeProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2025, 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 @@ -41,9 +41,9 @@ public class SerializeProvider extends PKCS11Test { public void main(Provider p) throws Exception { + if (Security.getProvider(p.getName()) != p) { - System.out.println("Provider not installed in Security, skipping"); - return; + Security.addProvider(p); } ByteArrayOutputStream out = new ByteArrayOutputStream(); @@ -57,7 +57,7 @@ public void main(Provider p) throws Exception { InputStream in = new ByteArrayInputStream(data); ObjectInputStream oin = new ObjectInputStream(in); - Provider p2 = (Provider)oin.readObject(); + Provider p2 = (Provider) oin.readObject(); System.out.println("Reconstituted: " + p2); From cf9d98ffd2c567b552c77185e448dee0aeddcb3a Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Wed, 17 Sep 2025 13:00:37 +0000 Subject: [PATCH 074/323] 8359182: Use @requires instead of SkippedException for MaxPath.java Backport-of: 5886ef728fc1efe43e90e056c03725c3ee982ad6 --- test/jdk/java/io/File/MaxPath.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/test/jdk/java/io/File/MaxPath.java b/test/jdk/java/io/File/MaxPath.java index 269b291709cc..30951ac0d851 100644 --- a/test/jdk/java/io/File/MaxPath.java +++ b/test/jdk/java/io/File/MaxPath.java @@ -24,21 +24,14 @@ /* @test @bug 6481955 @summary Path length less than MAX_PATH (260) works on Windows - @library /test/lib + @requires (os.family == "windows") */ import java.io.File; import java.io.IOException; -import jtreg.SkippedException; - public class MaxPath { public static void main(String[] args) throws Exception { - String osName = System.getProperty("os.name"); - if (!osName.startsWith("Windows")) { - throw new SkippedException("This test is run only on Windows"); - } - int MAX_PATH = 260; String dir = new File(".").getAbsolutePath() + "\\"; String padding = "1234567890123456789012345678901234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890"; From 3ac8e78d20f3130443a7a54bf08b2a0a0d60af6a Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Wed, 17 Sep 2025 13:03:35 +0000 Subject: [PATCH 075/323] 8359449: [TEST] open/test/jdk/java/io/File/SymLinks.java Refactor extract method for Windows specific test Backport-of: 49a82d880636a632f4a3471b14b1b1b29ce1d5e6 --- test/jdk/java/io/File/SymLinks.java | 39 ++++++++++++++++------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/test/jdk/java/io/File/SymLinks.java b/test/jdk/java/io/File/SymLinks.java index 967250c84305..40205a415577 100644 --- a/test/jdk/java/io/File/SymLinks.java +++ b/test/jdk/java/io/File/SymLinks.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2025, 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 @@ -281,22 +281,7 @@ static void go() throws IOException { assertTrue(link2dir.isDirectory()); assertTrue(link2link2dir.isDirectory()); - // on Windows we test with the DOS hidden attribute set - if (System.getProperty("os.name").startsWith("Windows")) { - DosFileAttributeView view = Files - .getFileAttributeView(file.toPath(), DosFileAttributeView.class); - view.setHidden(true); - try { - assertTrue(file.isHidden()); - assertTrue(link2file.isHidden()); - assertTrue(link2link2file.isHidden()); - } finally { - view.setHidden(false); - } - assertFalse(file.isHidden()); - assertFalse(link2file.isHidden()); - assertFalse(link2link2file.isHidden()); - } + testDOSHiddenAttributes(); header("length"); @@ -362,6 +347,26 @@ static void go() throws IOException { } } + static void testDOSHiddenAttributes() throws IOException { + // on Windows we test with the DOS hidden attribute set + if (System.getProperty("os.name").startsWith("Windows")) { + header("testDOSHiddenAttributes"); + DosFileAttributeView view = Files + .getFileAttributeView(file.toPath(), DosFileAttributeView.class); + view.setHidden(true); + try { + assertTrue(file.isHidden()); + assertTrue(link2file.isHidden()); + assertTrue(link2link2file.isHidden()); + } finally { + view.setHidden(false); + } + assertFalse(file.isHidden()); + assertFalse(link2file.isHidden()); + assertFalse(link2link2file.isHidden()); + } + } + public static void main(String[] args) throws IOException { if (supportsSymLinks(top)) { try { From 26dcc2bf54053d519c5128bfa1a24fe53a250f32 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Wed, 17 Sep 2025 13:06:01 +0000 Subject: [PATCH 076/323] 8359428: Test 'javax/swing/JTabbedPane/bug4499556.java' failed because after selecting one of L&F items, the test case automatically failed when clicking on L&F Menu button again Backport-of: 2b94b70ef50675f7853c0cb6a61e60e6eb7d92ed --- test/jdk/javax/swing/JTabbedPane/bug4499556.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/jdk/javax/swing/JTabbedPane/bug4499556.java b/test/jdk/javax/swing/JTabbedPane/bug4499556.java index fe9d7dbbfde1..f9150b339e2f 100644 --- a/test/jdk/javax/swing/JTabbedPane/bug4499556.java +++ b/test/jdk/javax/swing/JTabbedPane/bug4499556.java @@ -89,9 +89,10 @@ public static void main(String[] args) throws Exception { } static volatile JTabbedPane pane; + static volatile JFrame frame; static JFrame createUI() { - JFrame frame = new JFrame("bug4499556"); + frame = new JFrame("bug4499556"); pane = getTabbedPane(); frame.add(pane); frame.add(getRightPanel(), BorderLayout.EAST); @@ -262,7 +263,7 @@ static boolean setLAF(String laf) { e.printStackTrace(); return false; } - SwingUtilities.updateComponentTreeUI(pane); + SwingUtilities.updateComponentTreeUI(frame); return true; } From f0e266df287e0dd9b86a544b3598651c971fbde2 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Wed, 17 Sep 2025 13:08:40 +0000 Subject: [PATCH 077/323] 8359687: Use PassFailJFrame for java/awt/print/Dialog/DialogType.java Backport-of: de34bb8e66253cef90ba79831dadec0252595b35 --- .../jdk/java/awt/print/Dialog/DialogType.java | 88 +++++++++++-------- 1 file changed, 51 insertions(+), 37 deletions(-) diff --git a/test/jdk/java/awt/print/Dialog/DialogType.java b/test/jdk/java/awt/print/Dialog/DialogType.java index 472b89e44f21..b8801583dd0f 100644 --- a/test/jdk/java/awt/print/Dialog/DialogType.java +++ b/test/jdk/java/awt/print/Dialog/DialogType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2025, 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,49 +26,63 @@ * @bug 6568874 * @key printer * @summary Verify the native dialog works with attribute sets. - * @run main/manual=yesno DialogType + * @library /java/awt/regtesthelpers /test/lib + * @build PassFailJFrame + * @run main/manual DialogType */ -import java.awt.print.*; -import javax.print.attribute.*; -import javax.print.attribute.standard.*; +import java.awt.print.PrinterJob; + +import javax.print.attribute.Attribute; +import javax.print.attribute.HashPrintRequestAttributeSet; +import javax.print.attribute.PrintRequestAttributeSet; +import javax.print.attribute.standard.DialogTypeSelection; + +import jtreg.SkippedException; public class DialogType { + private static PrinterJob job; + + private static final String INSTRUCTIONS = """ + Two print dialogs are shown in succession. + Click Cancel in the dialogs to close them. + + On macOS & on Windows, the first dialog is a native + dialog provided by the OS, the second dialog is + implemented in Swing, the dialogs differ in appearance. - static String[] instructions = { - "This test assumes and requires that you have a printer installed", - "It verifies that the dialogs behave properly when using new API", - "to optionally select a native dialog where one is present.", - "Two dialogs are shown in succession.", - "The test passes as long as no exceptions are thrown, *AND*", - "if running on Windows only, the first dialog is a native windows", - "control which differs in appearance from the second dialog", - "" - }; + The test passes as long as no exceptions are thrown. + (If there's an exception, the test will fail automatically.) - public static void main(String[] args) { + The test verifies that the dialogs behave properly when using new API + to optionally select a native dialog where one is present. + """; - for (int i=0;i Date: Wed, 17 Sep 2025 13:11:22 +0000 Subject: [PATCH 078/323] 8361754: New test runtime/jni/checked/TestCharArrayReleasing.java can cause disk full errors Backport-of: 2a53f5a5c2544d4f7a77186d99addae110b06bab --- .../jtreg/runtime/jni/checked/TestCharArrayReleasing.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/hotspot/jtreg/runtime/jni/checked/TestCharArrayReleasing.java b/test/hotspot/jtreg/runtime/jni/checked/TestCharArrayReleasing.java index 35fe7a9ed37f..7cb427cebbbf 100644 --- a/test/hotspot/jtreg/runtime/jni/checked/TestCharArrayReleasing.java +++ b/test/hotspot/jtreg/runtime/jni/checked/TestCharArrayReleasing.java @@ -84,7 +84,7 @@ public static void main(String[] args) { } public static void main(String[] args) throws Throwable { - int ABRT = Platform.isWindows() ? 1 : 134; + int ABRT = 1; int[][] errorCodes = new int[][] { { ABRT, 0, ABRT, ABRT, ABRT }, { ABRT, ABRT, 0, ABRT, ABRT }, @@ -118,6 +118,7 @@ public static void main(String[] args) throws Throwable { ProcessBuilder pb = ProcessTools.createLimitedTestJavaProcessBuilder( "-Djava.library.path=" + System.getProperty("test.nativepath"), "--enable-native-access=ALL-UNNAMED", + "-XX:-CreateCoredumpOnCrash", "-Xcheck:jni", "TestCharArrayReleasing$Driver", args[0], args[1]); From 53d6b9f428154e38409373711277a2a73f73ed52 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Wed, 17 Sep 2025 16:28:21 +0000 Subject: [PATCH 079/323] 8353201: Open source Swing Tooltip tests - Set 2 Backport-of: e17c3994b8392357b0aacea0bae6b354a2cc90a5 --- .../swing/ToolTipManager/bug4250178.java | 66 ++++++++ .../swing/ToolTipManager/bug4294808.java | 64 ++++++++ .../swing/ToolTipManager/bug6178004.java | 152 ++++++++++++++++++ 3 files changed, 282 insertions(+) create mode 100644 test/jdk/javax/swing/ToolTipManager/bug4250178.java create mode 100644 test/jdk/javax/swing/ToolTipManager/bug4294808.java create mode 100644 test/jdk/javax/swing/ToolTipManager/bug6178004.java diff --git a/test/jdk/javax/swing/ToolTipManager/bug4250178.java b/test/jdk/javax/swing/ToolTipManager/bug4250178.java new file mode 100644 index 000000000000..18a9c4d93e2c --- /dev/null +++ b/test/jdk/javax/swing/ToolTipManager/bug4250178.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2003, 2025, 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 4250178 + * @summary Tooltip in incorrect location on ToolBar + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4250178 + */ + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.ToolTipManager; + +public class bug4250178 { + private static final String INSTRUCTIONS = """ + Click somewhere in the test UI frame to make it focused. + Move mouse to the bottom right corner of the button in this frame + and wait until tooltip appears. + + If the tooltip fits into the frame OR partially covered by the mouse + cursor then test fails. Otherwise test passes. + """; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .title("Test Instructions") + .instructions(INSTRUCTIONS) + .columns(35) + .testUI(bug4250178::createAndShowUI) + .build() + .awaitAndCheck(); + } + + private static JFrame createAndShowUI() { + JFrame fr = new JFrame("bug4250178"); + JButton button = new JButton("Button"); + button.setToolTipText("ToolTip"); + ToolTipManager.sharedInstance().setLightWeightPopupEnabled(true); + fr.add(button); + fr.setSize(250, 100); + return fr; + } +} diff --git a/test/jdk/javax/swing/ToolTipManager/bug4294808.java b/test/jdk/javax/swing/ToolTipManager/bug4294808.java new file mode 100644 index 000000000000..d4ec109020a2 --- /dev/null +++ b/test/jdk/javax/swing/ToolTipManager/bug4294808.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2000, 2025, 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 4294808 + * @summary Tooltip blinking. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4294808 + */ + +import java.awt.Dimension; +import javax.swing.JButton; +import javax.swing.JComponent; + +public class bug4294808 { + private static final String INSTRUCTIONS = """ + Move mouse cursor to the button named "Tooltip Button" + at the bottom of the instruction window and wait until + tooltip has appeared. + + If tooltip appears and eventually disappears without + rapid blinking then press PASS else FAIL. + """; + + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .title("bug4294808 Test Instructions") + .instructions(INSTRUCTIONS) + .columns(35) + .splitUIBottom(bug4294808::createAndShowUI) + .build() + .awaitAndCheck(); + } + + private static JComponent createAndShowUI() { + JButton bt = new JButton("Tooltip Button"); + bt.setToolTipText("Long tooltip text here"); + bt.setPreferredSize(new Dimension(200, 60)); + return bt; + } +} diff --git a/test/jdk/javax/swing/ToolTipManager/bug6178004.java b/test/jdk/javax/swing/ToolTipManager/bug6178004.java new file mode 100644 index 000000000000..e33a6391e895 --- /dev/null +++ b/test/jdk/javax/swing/ToolTipManager/bug6178004.java @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2006, 2025, 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 4148057 6178004 + * @summary REGRESSION: setToolTipText does not work if the + * component is not focused + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug6178004 + */ + +import java.awt.Point; +import java.awt.Window; +import java.awt.event.MouseEvent; +import java.util.List; +import javax.swing.ButtonGroup; +import javax.swing.JButton; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.LookAndFeel; +import javax.swing.SwingUtilities; +import javax.swing.ToolTipManager; +import javax.swing.UIManager; + +public class bug6178004 { + private static JFrame frame1; + private static JFrame frame2; + private static final int SIZE = 300; + + private static final String INSTRUCTIONS = """ + You can change Look And Feel using the menu "Change LaF". + + Make sure that Frame2 or instruction window is active. + Move mouse over the button inside "Frame 1". + If tooltip is NOT shown or Frame 1 jumped on top of + the Frame2, press FAIL. + + For Metal/Windows LaF: + Tooltips are shown only if one of the frames (or the instruction + window) is active. To test it click on any other application to + make frames and instruction window inactive and then verify that + tooltips are not shown any more. + + For Motif/GTK/Nimbus/Aqua LaF: + Tooltips should be shown for all frames irrespective of whether + the application is active or inactive. + + Note: Tooltip for Frame1 is always shown at the top-left corner. + Tooltips could be shown partly covered by another frame. + + If above is true press PASS else FAIL. + """; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .title("bug6178004 Test Instructions") + .instructions(INSTRUCTIONS) + .testTimeOut(10) + .columns(40) + .testUI(createAndShowUI()) + .positionTestUI(bug6178004::positionTestWindows) + .build() + .awaitAndCheck(); + } + + private static List createAndShowUI() { + ToolTipManager.sharedInstance().setInitialDelay(0); + + frame1 = new JFrame("bug6178004 Frame1"); + frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + JButton button = new JButton("Test") { + public Point getToolTipLocation(MouseEvent event) { + return new Point(10, 10); + } + }; + button.setToolTipText("Tooltip-1"); + frame1.add(button); + frame1.setSize(SIZE, SIZE); + + frame2 = new JFrame("bug6178004 Frame2"); + frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + JButton button2 = new JButton("Click me") ; + button2.setToolTipText("Tooltip-2"); + frame2.add(button2); + frame2.setSize(SIZE, SIZE); + + JMenuBar bar = new JMenuBar(); + JMenu lafMenu = new JMenu("Change LaF"); + ButtonGroup lafGroup = new ButtonGroup(); + + LookAndFeel currentLaf = UIManager.getLookAndFeel(); + UIManager.LookAndFeelInfo[] lafs = UIManager.getInstalledLookAndFeels(); + for (final UIManager.LookAndFeelInfo lafInfo : lafs) { + JCheckBoxMenuItem lafItem = new JCheckBoxMenuItem(lafInfo.getName()); + lafItem.addActionListener(e -> setLaF(lafInfo.getClassName())); + if (lafInfo.getClassName().equals(currentLaf.getClass().getName())) { + lafItem.setSelected(true); + } + + lafGroup.add(lafItem); + lafMenu.add(lafItem); + } + + bar.add(lafMenu); + frame2.setJMenuBar(bar); + return List.of(frame1, frame2); + } + + private static void setLaF(String laf) { + try { + UIManager.setLookAndFeel(laf); + SwingUtilities.updateComponentTreeUI(frame1); + SwingUtilities.updateComponentTreeUI(frame2); + } catch (Exception e) { + e.printStackTrace(); + } + } + + // custom window layout required for this test + private static void positionTestWindows(List testWindows, + PassFailJFrame.InstructionUI instructionUI) { + int gap = 5; + int x = instructionUI.getLocation().x + instructionUI.getSize().width + gap; + // the two test frames need to overlap for this test + testWindows.get(0).setLocation(x, instructionUI.getLocation().y); + testWindows.get(1).setLocation((x + SIZE / 2), instructionUI.getLocation().y); + } +} From 4cb3e36284bb29b60818597d043a0c5625e93f5d Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Wed, 17 Sep 2025 16:28:43 +0000 Subject: [PATCH 080/323] 8353011: Open source Swing JButton tests - Set 1 Backport-of: f7155183d7f7c6fcea2090f906de69e02973a6d9 --- test/jdk/javax/swing/JButton/bug4151763.java | 94 +++++++++++++++ test/jdk/javax/swing/JButton/bug4415505.java | 77 +++++++++++++ test/jdk/javax/swing/JButton/bug4978274.java | 108 ++++++++++++++++++ .../javax/swing/JRadioButton/bug4673850.java | 104 +++++++++++++++++ test/jdk/javax/swing/JTable/bug4188504.java | 71 ++++++++++++ 5 files changed, 454 insertions(+) create mode 100644 test/jdk/javax/swing/JButton/bug4151763.java create mode 100644 test/jdk/javax/swing/JButton/bug4415505.java create mode 100644 test/jdk/javax/swing/JButton/bug4978274.java create mode 100644 test/jdk/javax/swing/JRadioButton/bug4673850.java create mode 100644 test/jdk/javax/swing/JTable/bug4188504.java diff --git a/test/jdk/javax/swing/JButton/bug4151763.java b/test/jdk/javax/swing/JButton/bug4151763.java new file mode 100644 index 000000000000..d04b623ec4eb --- /dev/null +++ b/test/jdk/javax/swing/JButton/bug4151763.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2000, 2025, 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 4151763 + * @summary Tests that button icon is not drawn upon button border + * @library /java/awt/regtesthelpers /test/lib + * @build PassFailJFrame jtreg.SkippedException + * @run main/manual bug4151763 + */ + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.UIManager; +import javax.swing.border.CompoundBorder; +import javax.swing.border.EmptyBorder; +import javax.swing.border.LineBorder; +import jtreg.SkippedException; + +public class bug4151763 { + private static final int IMAGE_SIZE = 150; + private static final String INSTRUCTIONS = """ + Verify that image icon is NOT painted outside + the black rectangle. + + If above is true press PASS else FAIL. + """; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(40) + .testUI(bug4151763::createAndShowUI) + .build() + .awaitAndCheck(); + } + + private static JFrame createAndShowUI() { + try { + UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); + } catch (Exception e) { + throw new SkippedException("Unsupported LaF", e); + } + + JFrame frame = new JFrame("bug4151763"); + final JButton b = new JButton(createImageIcon()); + b.setBorder(new CompoundBorder( + new EmptyBorder(20, 20, 20, 20), + new LineBorder(Color.BLACK))); + b.setPreferredSize(new Dimension(100, 100)); + + frame.setLayout(new FlowLayout()); + frame.add(b); + frame.setSize(400, 300); + return frame; + } + + private static ImageIcon createImageIcon() { + BufferedImage redImg = new BufferedImage(IMAGE_SIZE, IMAGE_SIZE, + BufferedImage.TYPE_INT_RGB); + Graphics2D g = redImg.createGraphics(); + g.setColor(Color.RED); + g.fillRect(0, 0, IMAGE_SIZE, IMAGE_SIZE); + g.dispose(); + return new ImageIcon(redImg); + } +} diff --git a/test/jdk/javax/swing/JButton/bug4415505.java b/test/jdk/javax/swing/JButton/bug4415505.java new file mode 100644 index 000000000000..58ba56e1b74e --- /dev/null +++ b/test/jdk/javax/swing/JButton/bug4415505.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2001, 2025, 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 4415505 + * @requires (os.family == "windows") + * @summary Tests JButton appearance under Windows LAF + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4415505 + */ + +import java.awt.FlowLayout; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JToggleButton; +import javax.swing.UIManager; + +public class bug4415505 { + private static final String INSTRUCTIONS = """ + +

      This test is for Windows LaF. + Press the button named "Button" using mouse and check that it has + "pressed" look. It should look like the selected toggle button + near it.

      + +

      If above is true press PASS else FAIL.

      + + """; + + public static void main(String[] args) throws Exception { + UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); + + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .rows(5) + .columns(40) + .testUI(bug4415505::createAndShowUI) + .build() + .awaitAndCheck(); + } + + private static JFrame createAndShowUI() { + JButton button = new JButton("Button"); + button.setFocusPainted(false); + JToggleButton tbutton = new JToggleButton("ToggleButton"); + tbutton.setSelected(true); + + JFrame jFrame = new JFrame("bug4415505"); + jFrame.setLayout(new FlowLayout(FlowLayout.CENTER)); + jFrame.add(button); + jFrame.add(tbutton); + jFrame.setSize(300, 100); + return jFrame; + } +} diff --git a/test/jdk/javax/swing/JButton/bug4978274.java b/test/jdk/javax/swing/JButton/bug4978274.java new file mode 100644 index 000000000000..6b152259caae --- /dev/null +++ b/test/jdk/javax/swing/JButton/bug4978274.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2004, 2025, 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 4978274 + * @summary Tests that JButton is painted with same visible height + * as toggle buttons + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4978274 + */ + +import java.awt.BorderLayout; +import java.awt.FlowLayout; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JToggleButton; +import javax.swing.UIManager; +import javax.swing.border.EmptyBorder; +import javax.swing.plaf.metal.MetalLookAndFeel; +import javax.swing.plaf.metal.OceanTheme; + +public class bug4978274 { + private static final String INSTRUCTIONS = """ + The toggle buttons must be painted to the same visible + height as button. In addition to that verify the following: + + a) All three buttons - "Button", "Toggle Btn" and + "Selected Toggle Btn" have the same border. + + b) Verify that when "Button" is pressed and moused over + it has the EXACT same border as "Toggle Btn" and + "Selected Toggle Btn" on press & mouse over. + + c) Click to the test window (panel) to disable/enable all + three buttons. In disabled state verify that all three + buttons have the exact same border. + + If all of the above conditions are true press PASS, else FAIL. + """; + + public static void main(String[] args) throws Exception { + MetalLookAndFeel.setCurrentTheme(new OceanTheme()); + UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); + + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(40) + .testUI(createAndShowUI()) + .build() + .awaitAndCheck(); + } + + private static JFrame createAndShowUI() { + JFrame frame = new JFrame("bug4978274"); + frame.setLayout(new BorderLayout()); + + JPanel panel = new JPanel(); + panel.setLayout(new FlowLayout()); + panel.setBorder(new EmptyBorder(12, 12, 12, 12)); + JButton jButton = new JButton("Button"); + JToggleButton jToggleButton = new JToggleButton("Selected Toggle Btn"); + jToggleButton.setSelected(true); + + panel.add(jButton); + panel.add(new JToggleButton("Toggle Btn")); + panel.add(jToggleButton); + + panel.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent event) { + jButton.setEnabled(!jButton.isEnabled()); + jToggleButton.setEnabled(jButton.isEnabled()); + for(int i = 0; i < panel.getComponentCount(); i++) { + panel.getComponent(i).setEnabled(jButton.isEnabled()); + } + } + }); + + frame.add(panel); + frame.pack(); + return frame; + } +} diff --git a/test/jdk/javax/swing/JRadioButton/bug4673850.java b/test/jdk/javax/swing/JRadioButton/bug4673850.java new file mode 100644 index 000000000000..4f9058e978ee --- /dev/null +++ b/test/jdk/javax/swing/JRadioButton/bug4673850.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2004, 2025, 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 4673850 + * @summary Tests that JRadioButton and JCheckBox checkmarks are painted entirely + * inside circular/rectangle checkboxes for Motif LaF. + * @library /java/awt/regtesthelpers /test/lib + * @build PassFailJFrame jtreg.SkippedException + * @run main/manual bug4673850 + */ + +import java.awt.FlowLayout; +import javax.swing.JCheckBox; +import javax.swing.JFrame; +import javax.swing.JRadioButton; +import javax.swing.SwingConstants; +import javax.swing.UIManager; +import jtreg.SkippedException; + +public class bug4673850 { + private static final String INSTRUCTIONS = """ + + + + + +

      This test is for Motif LaF.

      + +

      + When the test starts, you'll see 2 radio buttons and 2 check boxes + with the checkmarks painted.

      + +

      + Ensure that all the button's checkmarks are painted entirely + within the circular/rectangle checkbox, NOT over them or outside them. +

      + + """; + + public static void main(String[] args) throws Exception { + try { + UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); + } catch (Exception e) { + throw new SkippedException("Unsupported LaF", e); + } + + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .rows(10) + .columns(45) + .testUI(createAndShowUI()) + .build() + .awaitAndCheck(); + } + + private static JFrame createAndShowUI() { + JFrame frame = new JFrame("bug4673850"); + frame.setLayout(new FlowLayout()); + + JRadioButton rb = new JRadioButton("RadioButt"); + rb.setSelected(true); + frame.add(rb); + JRadioButton rb2 = new JRadioButton("RadioButt"); + rb2.setHorizontalTextPosition(SwingConstants.LEFT); + rb2.setSelected(true); + frame.add(rb2); + + JCheckBox cb = new JCheckBox("CheckBox"); + cb.setSelected(true); + frame.add(cb); + JCheckBox cb2 = new JCheckBox("CheckBox"); + cb2.setHorizontalTextPosition(SwingConstants.LEFT); + cb2.setSelected(true); + frame.add(cb2); + frame.setSize(200, 150); + return frame; + } +} \ No newline at end of file diff --git a/test/jdk/javax/swing/JTable/bug4188504.java b/test/jdk/javax/swing/JTable/bug4188504.java new file mode 100644 index 000000000000..b58ee7def038 --- /dev/null +++ b/test/jdk/javax/swing/JTable/bug4188504.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 1999, 2025, 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 4188504 + * @summary setResizable for specified column. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4188504 + */ + +import javax.swing.JFrame; +import javax.swing.JScrollPane; +import javax.swing.JTable; + +public class bug4188504 { + private static final String INSTRUCTIONS = """ + 1. A table is displayed with 3 columns - A, B, C. + + 2. Try to resize second column of table (Move mouse to the position + between "B" and "C" headers, press left mouse button and move to + right/left). + PLEASE NOTE: You may be able to swap the columns but make sure the + width of column B stays the same. + + 3. If the second column does not change its width then press PASS + otherwise press FAIL. + """; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .title("Test Instructions") + .instructions(INSTRUCTIONS) + .columns(40) + .testUI(createAndShowUI()) + .build() + .awaitAndCheck(); + } + + private static JFrame createAndShowUI() { + JFrame jFrame = new JFrame("bug4188504"); + JTable tableView = new JTable(4, 3); + tableView.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); + tableView.getColumnModel().getColumn(1).setResizable(false); + + jFrame.add(new JScrollPane(tableView)); + jFrame.setSize(300, 150); + return jFrame; + } +} From 7288fa21123ccf429e8468ad75d8f5e8880156a6 Mon Sep 17 00:00:00 2001 From: Sergey Bylokhov Date: Thu, 18 Sep 2025 07:09:06 +0000 Subject: [PATCH 081/323] 8355561: [macos] Build failure with Xcode 16.3 Backport-of: 762423d64d10dcdb37800767d2b2f1b7757c804a --- .../libjsound/PLATFORM_API_MacOSX_Ports.cpp | 83 ++++++++++++++----- 1 file changed, 60 insertions(+), 23 deletions(-) diff --git a/src/java.desktop/macosx/native/libjsound/PLATFORM_API_MacOSX_Ports.cpp b/src/java.desktop/macosx/native/libjsound/PLATFORM_API_MacOSX_Ports.cpp index bf4f2e143a04..ae0ffa5f2caf 100644 --- a/src/java.desktop/macosx/native/libjsound/PLATFORM_API_MacOSX_Ports.cpp +++ b/src/java.desktop/macosx/native/libjsound/PLATFORM_API_MacOSX_Ports.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2025, 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 @@ -124,9 +124,12 @@ OSStatus ChangeListenerProc(AudioObjectID inObjectID, UInt32 inNumberAddresses, kAudioHardwarePropertyDevices, &size); if (err == noErr) { int count = size/sizeof(AudioDeviceID); - AudioDeviceID devices[count]; + AudioDeviceID *devices = (AudioDeviceID *) malloc(size); + if (!devices) { + break; + } err = GetAudioObjectProperty(kAudioObjectSystemObject, kAudioObjectPropertyScopeGlobal, - kAudioHardwarePropertyDevices, count*sizeof(AudioDeviceID), devices, 1); + kAudioHardwarePropertyDevices, size, devices, 1); if (err == noErr) { bool found = false; for (int j = 0; j < count; j++) { @@ -139,6 +142,7 @@ OSStatus ChangeListenerProc(AudioObjectID inObjectID, UInt32 inNumberAddresses, invalid = true; } } + free(devices); } break; case kAudioObjectPropertyOwnedObjects: @@ -148,9 +152,12 @@ OSStatus ChangeListenerProc(AudioObjectID inObjectID, UInt32 inNumberAddresses, kAudioObjectPropertyOwnedObjects, &size); if (err == noErr) { int count = size / sizeof(AudioObjectID); - AudioObjectID controlIDs[count]; + AudioObjectID *controlIDs = (AudioObjectID *) malloc(size); + if (!controlIDs) { + break; + } err = GetAudioObjectProperty(mixer->deviceID, kAudioObjectPropertyScopeGlobal, - kAudioObjectPropertyOwnedObjects, count * sizeof(AudioObjectID), &controlIDs, 1); + kAudioObjectPropertyOwnedObjects, size, controlIDs, 1); if (err == noErr) { for (PortControl *ctrl = mixer->portControls; ctrl != NULL; ctrl = ctrl->next) { for (int i = 0; i < ctrl->controlCount; i++) { @@ -168,6 +175,7 @@ OSStatus ChangeListenerProc(AudioObjectID inObjectID, UInt32 inNumberAddresses, } } } + free(controlIDs); } } } @@ -229,6 +237,9 @@ INT32 PORT_GetPortMixerDescription(INT32 mixerIndex, PortMixerDescription* mixer void* PORT_Open(INT32 mixerIndex) { TRACE1("\n>>PORT_Open (mixerIndex=%d)\n", (int)mixerIndex); PortMixer *mixer = (PortMixer *)calloc(1, sizeof(PortMixer)); + if (!mixer) { + return nullptr; + } mixer->deviceID = deviceCache.GetDeviceID(mixerIndex); if (mixer->deviceID != 0) { @@ -480,16 +491,20 @@ void PORT_GetControls(void* id, INT32 portIndex, PortControlCreator* creator) { mixer->deviceControlCount = size / sizeof(AudioObjectID); TRACE1(" PORT_GetControls: detected %d owned objects\n", mixer->deviceControlCount); - AudioObjectID controlIDs[mixer->deviceControlCount]; + AudioObjectID *controlIDs = (AudioObjectID *) malloc(size); + if (!controlIDs) { + return; + } err = GetAudioObjectProperty(mixer->deviceID, kAudioObjectPropertyScopeGlobal, - kAudioObjectPropertyOwnedObjects, sizeof(controlIDs), controlIDs, 1); + kAudioObjectPropertyOwnedObjects, size, controlIDs, 1); if (err) { OS_ERROR1(err, "PORT_GetControls (portIndex = %d) get OwnedObject values", portIndex); } else { mixer->deviceControls = (AudioControl *)calloc(mixer->deviceControlCount, sizeof(AudioControl)); if (mixer->deviceControls == NULL) { + free(controlIDs); return; } @@ -513,6 +528,7 @@ void PORT_GetControls(void* id, INT32 portIndex, PortControlCreator* creator) { control->controlID, FourCC2Str(control->classID), FourCC2Str(control->scope), control->channel); } } + free(controlIDs); } } @@ -524,10 +540,14 @@ void PORT_GetControls(void* id, INT32 portIndex, PortControlCreator* creator) { int totalChannels = GetChannelCount(mixer->deviceID, port->scope == kAudioDevicePropertyScopeOutput ? 1 : 0); // collect volume and mute controls - AudioControl* volumeControls[totalChannels+1]; // 0 - for master channel - memset(&volumeControls, 0, sizeof(AudioControl *) * (totalChannels+1)); - AudioControl* muteControls[totalChannels+1]; // 0 - for master channel - memset(&muteControls, 0, sizeof(AudioControl *) * (totalChannels+1)); + size_t totalAndMaster = totalChannels + 1; // 0 - for master channel + AudioControl **volumeControls = (AudioControl **) calloc(totalAndMaster, sizeof(AudioControl *)); + AudioControl **muteControls = (AudioControl **) calloc(totalAndMaster, sizeof(AudioControl *)); + if (!volumeControls || !muteControls) { + free(muteControls); + free(volumeControls); + return; + } for (int i=0; ideviceControlCount; i++) { AudioControl *control = &mixer->deviceControls[i]; @@ -626,6 +646,8 @@ void PORT_GetControls(void* id, INT32 portIndex, PortControlCreator* creator) { CFIndex length = CFStringGetLength(cfname) + 1; channelName = (char *)malloc(length); if (channelName == NULL) { + free(muteControls); + free(volumeControls); return; } CFStringGetCString(cfname, channelName, length, kCFStringEncodingUTF8); @@ -633,6 +655,8 @@ void PORT_GetControls(void* id, INT32 portIndex, PortControlCreator* creator) { } else { channelName = (char *)malloc(16); if (channelName == NULL) { + free(muteControls); + free(volumeControls); return; } snprintf(channelName, 16, "Ch %d", ch); @@ -657,7 +681,8 @@ void PORT_GetControls(void* id, INT32 portIndex, PortControlCreator* creator) { } AddChangeListeners(mixer); - + free(muteControls); + free(volumeControls); TRACE1("<controlCount]; + Float32 *subVolumes = (Float32 *) malloc(control->controlCount * sizeof(Float32)); + if (!subVolumes) { + return DEFAULT_VOLUME_VALUE; + } Float32 maxVolume; switch (control->type) { case PortControl::Volume: if (!TestPortControlValidity(control)) { - return DEFAULT_VOLUME_VALUE; + result = DEFAULT_VOLUME_VALUE; + break; } if (!GetPortControlVolumes(control, subVolumes, &maxVolume)) { - return DEFAULT_VOLUME_VALUE; + result = DEFAULT_VOLUME_VALUE; + break; } result = maxVolume; break; case PortControl::Balance: if (!TestPortControlValidity(control)) { - return DEFAULT_BALANCE_VALUE; + result = DEFAULT_BALANCE_VALUE; + break; } // balance control always has 2 volume controls if (!GetPortControlVolumes(control, subVolumes, &maxVolume)) { - return DEFAULT_VOLUME_VALUE; + result = DEFAULT_VOLUME_VALUE; + break; } // calculate balance value if (subVolumes[0] > subVolumes[1]) { @@ -806,9 +838,10 @@ float PORT_GetFloatValue(void* controlIDV) { break; default: ERROR1("GetFloatValue requested for non-Float control (control-type == %d)\n", control->type); - return 0; + result = 0; + break; } - + free(subVolumes); TRACE1("<controlCount]; + Float32 *subVolumes = (Float32 *) malloc(sizeof(Float32) * control->controlCount); + if (!subVolumes) { + return; + } Float32 maxVolume; switch (control->type) { case PortControl::Volume: if (!GetPortControlVolumes(control, subVolumes, &maxVolume)) { - return; + break; } // update the values if (maxVolume > 0.001) { @@ -845,7 +881,7 @@ void PORT_SetFloatValue(void* controlIDV, float value) { case PortControl::Balance: // balance control always has 2 volume controls if (!GetPortControlVolumes(control, subVolumes, &maxVolume)) { - return; + break; } // calculate new values if (value < 0.0f) { @@ -861,8 +897,9 @@ void PORT_SetFloatValue(void* controlIDV, float value) { break; default: ERROR1("PORT_SetFloatValue requested for non-Float control (control-type == %d)\n", control->type); - return; + break; } + free(subVolumes); } #endif // USE_PORTS From 5a7168737a02832bcb351408b754bdc2c5c8c063 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Thu, 18 Sep 2025 10:18:52 +0000 Subject: [PATCH 082/323] 8365913: Support latest MSC_VER in abstract_vm_version.cpp Backport-of: af532cc1b227c56cd03caca7d7558d58687d8584 --- src/hotspot/share/runtime/abstract_vm_version.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/hotspot/share/runtime/abstract_vm_version.cpp b/src/hotspot/share/runtime/abstract_vm_version.cpp index 42eceda3b06d..8939b84bebee 100644 --- a/src/hotspot/share/runtime/abstract_vm_version.cpp +++ b/src/hotspot/share/runtime/abstract_vm_version.cpp @@ -250,6 +250,18 @@ const char* Abstract_VM_Version::internal_vm_info_string() { #define HOTSPOT_BUILD_COMPILER "MS VC++ 17.7 (VS2022)" #elif _MSC_VER == 1938 #define HOTSPOT_BUILD_COMPILER "MS VC++ 17.8 (VS2022)" + #elif _MSC_VER == 1939 + #define HOTSPOT_BUILD_COMPILER "MS VC++ 17.9 (VS2022)" + #elif _MSC_VER == 1940 + #define HOTSPOT_BUILD_COMPILER "MS VC++ 17.10 (VS2022)" + #elif _MSC_VER == 1941 + #define HOTSPOT_BUILD_COMPILER "MS VC++ 17.11 (VS2022)" + #elif _MSC_VER == 1942 + #define HOTSPOT_BUILD_COMPILER "MS VC++ 17.12 (VS2022)" + #elif _MSC_VER == 1943 + #define HOTSPOT_BUILD_COMPILER "MS VC++ 17.13 (VS2022)" + #elif _MSC_VER == 1944 + #define HOTSPOT_BUILD_COMPILER "MS VC++ 17.14 (VS2022)" #else #define HOTSPOT_BUILD_COMPILER "unknown MS VC++:" XSTR(_MSC_VER) #endif From 914f2835fe879ab961782ac9c3584fa21236e396 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Thu, 18 Sep 2025 16:28:31 +0000 Subject: [PATCH 083/323] 8352865: Open source several AWT TextComponent tests - Batch 2 Backport-of: 3d0feba00a1c1ef7627880859a093bb00eb8fc4c --- test/jdk/ProblemList.txt | 2 + .../AltPlusNumberKeyCombinationsTest.java | 74 ++++++++ .../CorrectTextComponentSelectionTest.java | 139 +++++++++++++++ .../TextComponent/SelectionAndCaretColor.java | 162 ++++++++++++++++++ .../java/awt/TextComponent/SelectionTest.java | 73 ++++++++ 5 files changed, 450 insertions(+) create mode 100644 test/jdk/java/awt/TextComponent/AltPlusNumberKeyCombinationsTest.java create mode 100644 test/jdk/java/awt/TextComponent/CorrectTextComponentSelectionTest.java create mode 100644 test/jdk/java/awt/TextComponent/SelectionAndCaretColor.java create mode 100644 test/jdk/java/awt/TextComponent/SelectionTest.java diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index 713ae0e0fe56..976b398ab69a 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -825,6 +825,8 @@ java/awt/TrayIcon/DragEventSource/DragEventSource.java 8252242 macosx-all java/awt/FileDialog/DefaultFocusOwner/DefaultFocusOwner.java 7187728 macosx-all,linux-all java/awt/print/PageFormat/Orient.java 8016055 macosx-all java/awt/TextArea/TextAreaCursorTest/HoveringAndDraggingTest.java 8024986 macosx-all,linux-all +java/awt/TextComponent/CorrectTextComponentSelectionTest.java 8237220 macosx-all +java/awt/TextComponent/SelectionAndCaretColor.java 7017622 linux-all java/awt/event/MouseEvent/SpuriousExitEnter/SpuriousExitEnter.java 8254841 macosx-all java/awt/Focus/AppletInitialFocusTest/AppletInitialFocusTest1.java 8256289 windows-x64 java/awt/FullScreen/TranslucentWindow/TranslucentWindow.java 8258103 linux-all diff --git a/test/jdk/java/awt/TextComponent/AltPlusNumberKeyCombinationsTest.java b/test/jdk/java/awt/TextComponent/AltPlusNumberKeyCombinationsTest.java new file mode 100644 index 000000000000..27599b0a91c9 --- /dev/null +++ b/test/jdk/java/awt/TextComponent/AltPlusNumberKeyCombinationsTest.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2002, 2025, 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 4737679 4623376 4501485 4740906 4708221 + * @requires (os.family == "windows") + * @summary Alt+Left/right/up/down generate characters in JTextArea + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual AltPlusNumberKeyCombinationsTest + */ + +import java.awt.FlowLayout; +import java.awt.Frame; +import java.awt.TextArea; +import java.awt.TextField; + +public class AltPlusNumberKeyCombinationsTest { + public static void main(String[] args) throws Exception { + String INSTRUCTIONS = """ + [WINDOWS PLATFORM ONLY] + Please do the following steps for both TextField and TextArea: + 1. Hold down ALT and press a NON-NUMPAD right arrow, then release + ALT key. If any symbol is typed the test failed. + 2. Hold down ALT and press one after another the following + NUMPAD keys: 0, 1, 2, 8. Release ALT key. If the Euro symbol + is not typed the test failed + 3. Hold down ALT and press one after another the following + NUMPAD keys: 0, 2, 2, 7. Release ALT key. If nothing or + the blank symbol is typed the test failed + If all the steps are done successfully the test PASSed, + else test FAILS. + """; + PassFailJFrame.builder() + .title("Test Instructions") + .instructions(INSTRUCTIONS) + .columns(35) + .testUI(initialize()) + .build() + .awaitAndCheck(); + } + + public static Frame initialize() { + Frame f = new Frame("key combination test"); + f.setLayout(new FlowLayout()); + TextField tf = new TextField("TextField"); + f.add(tf); + TextArea ta = new TextArea("TextArea"); + f.add(ta); + f.setSize(200, 200); + return f; + } +} diff --git a/test/jdk/java/awt/TextComponent/CorrectTextComponentSelectionTest.java b/test/jdk/java/awt/TextComponent/CorrectTextComponentSelectionTest.java new file mode 100644 index 000000000000..9d3e6d856373 --- /dev/null +++ b/test/jdk/java/awt/TextComponent/CorrectTextComponentSelectionTest.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2005, 2025, 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 5100806 + * @summary TextArea.select(0,0) does not de-select the selected text properly + * @key headful + * @run main CorrectTextComponentSelectionTest + */ + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.EventQueue; +import java.awt.Frame; +import java.awt.Point; +import java.awt.Robot; +import java.awt.TextArea; +import java.awt.TextComponent; +import java.awt.TextField; +import java.lang.reflect.InvocationTargetException; + +public class CorrectTextComponentSelectionTest { + static TextField tf = new TextField("TextField"); + static TextArea ta = new TextArea("TextArea"); + static Robot r; + static Frame frame; + static volatile Color color_center; + static volatile Point loc; + + public static void main(String[] args) throws Exception { + try { + r = new Robot(); + EventQueue.invokeAndWait(() -> { + initialize(); + }); + r.waitForIdle(); + r.delay(1000); + + test(tf); + test(ta); + System.out.println("Test Passed!"); + } finally { + EventQueue.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + } + + public static void initialize() { + frame = new Frame("TextComponent Selection Test"); + frame.setLayout(new BorderLayout()); + + // We should place to the text components the long strings in order to + // cover the components by the selection completely + String sf = ""; + for (int i = 0; i < 50; i++) { + sf = sf + " "; + } + tf.setText(sf); + // We check the color of the text component in order to find out the + // bug reproducible situation + tf.setForeground(Color.WHITE); + tf.setBackground(Color.WHITE); + + String sa = ""; + for (int i = 0; i < 50; i++) { + for (int j = 0; j < 50; j++) { + sa = sa + " "; + } + sa = sa + "\n"; + } + ta.setText(sa); + ta.setForeground(Color.WHITE); + ta.setBackground(Color.WHITE); + + frame.add(tf, "North"); + frame.add(ta, "South"); + frame.setSize(200, 200); + frame.setVisible(true); + } + + private static void test(TextComponent tc) throws Exception { + if (tc instanceof TextField) { + System.out.println("TextField testing ..."); + } else if (tc instanceof TextArea) { + System.out.println("TextArea testing ..."); + } + + r.waitForIdle(); + r.delay(100); + EventQueue.invokeAndWait(() -> { + tc.requestFocus(); + tc.selectAll(); + tc.select(0, 0); + }); + + r.waitForIdle(); + r.delay(100); + EventQueue.invokeAndWait(() -> { + loc = tc.getLocationOnScreen(); + }); + r.waitForIdle(); + r.delay(100); + + EventQueue.invokeAndWait(() -> { + color_center = r.getPixelColor(loc.x + tc.getWidth() / 2, loc.y + tc.getHeight() / 2); + }); + + System.out.println("Color of the text component (CENTER) =" + color_center); + System.out.println("White color=" + Color.WHITE); + + if (color_center.getRGB() != Color.WHITE.getRGB()) { + throw new RuntimeException("Test Failed"); + } + } +} diff --git a/test/jdk/java/awt/TextComponent/SelectionAndCaretColor.java b/test/jdk/java/awt/TextComponent/SelectionAndCaretColor.java new file mode 100644 index 000000000000..60b932e4be8d --- /dev/null +++ b/test/jdk/java/awt/TextComponent/SelectionAndCaretColor.java @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2006, 2025, 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 6287895 + * @requires (os.family == "linux") + * @summary Test cursor and selected text incorrectly colored in TextField + * @key headful + * @run main SelectionAndCaretColor + */ + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.EventQueue; +import java.awt.Font; +import java.awt.Frame; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.TextArea; +import java.awt.TextComponent; +import java.awt.TextField; +import java.awt.image.BufferedImage; + +public class SelectionAndCaretColor { + static TextField tf = new TextField(20); + static TextArea ta = new TextArea("", 1, 20, TextArea.SCROLLBARS_NONE); + static Robot r; + static Frame frame; + static volatile int flips; + + public static void main(String[] args) throws Exception { + try { + frame = new Frame("Selection and Caret color test"); + r = new Robot(); + + EventQueue.invokeAndWait(() -> { + frame.setLayout(new BorderLayout()); + tf.setFont(new Font("Monospaced", Font.PLAIN, 15)); + ta.setFont(new Font("Monospaced", Font.PLAIN, 15)); + + frame.add(tf, BorderLayout.NORTH); + frame.add(ta, BorderLayout.SOUTH); + frame.setSize(200, 200); + frame.setVisible(true); + }); + r.waitForIdle(); + r.delay(1000); + test(tf); + test(ta); + } finally { + EventQueue.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + } + + private static int countFlips(TextComponent tc) { + int y = tc.getLocationOnScreen().y + tc.getHeight() / 2; + int x1 = tc.getLocationOnScreen().x + 5; + int x2 = tc.getLocationOnScreen().x + tc.getWidth() - 5; + + int[] fb = {tc.getBackground().getRGB(), tc.getForeground().getRGB()}; + int i = 0; + int flips = 0; + + BufferedImage img = r.createScreenCapture(new Rectangle(x1, y, x2 - x1, 1)); + for (int x = 0; x < x2 - x1; x++) { + int c = img.getRGB(x, 0); + if (c == fb[i]) { + ; + } else if (c == fb[1 - i]) { + flips++; + i = 1 - i; + } else { + throw new RuntimeException("Invalid color detected: " + + Integer.toString(c, 16) + " instead of " + + Integer.toString(fb[i], 16)); + } + } + return flips; + } + + private static void test(TextComponent tc) throws Exception { + if (tc instanceof TextField) { + System.out.println("TextField testing ..."); + } else if (tc instanceof TextArea) { + System.out.println("TextArea testing ..."); + } + + // now passing along the component's vertical center, + // skipping 5px from both sides, + // we should see bg - textcolor - bg - selcolor - + // seltextcolor - selcolor - bg + // that is bg-fg-bg-fg-bg-fg-bg, 6 flips + + EventQueue.invokeAndWait(() -> { + tc.setForeground(Color.green); + tc.setBackground(Color.magenta); + + tc.setText(" I I "); + tc.select(5, 10); + tc.requestFocus(); + }); + r.waitForIdle(); + r.delay(200); + EventQueue.invokeAndWait(() -> { + flips = countFlips(tc); + }); + if (flips != 6) { + throw new RuntimeException("Invalid number of flips: " + + flips + " instead of 6"); + } + EventQueue.invokeAndWait(() -> { + // same for caret: spaces in the tc, caret in the middle + // bg-fg-bg - 2 flips + + tc.select(0, 0); + tc.setText(" "); + tc.setCaretPosition(5); + }); + r.waitForIdle(); + r.delay(200); + + for (int i = 0; i < 10; i++) { + EventQueue.invokeAndWait(() -> { + flips = countFlips(tc); + }); + + if (flips == 2) { + break; + } + if (flips == 0) { + continue; + } + throw new RuntimeException("Invalid number of flips: " + + flips + " instead of 2"); + } + } +} diff --git a/test/jdk/java/awt/TextComponent/SelectionTest.java b/test/jdk/java/awt/TextComponent/SelectionTest.java new file mode 100644 index 000000000000..d29818d76217 --- /dev/null +++ b/test/jdk/java/awt/TextComponent/SelectionTest.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 1998, 2025, 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 4056231 + * @summary Checks that TextComponents don't grab the global CDE selection + * upon construction if their own selection is null. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual SelectionTest + */ + +import java.awt.BorderLayout; +import java.awt.Button; +import java.awt.Frame; +import java.awt.TextArea; +import java.awt.TextField; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class SelectionTest { + public static void main(String[] args) throws Exception { + String INSTRUCTIONS = """ + 1. "Select some text in another window, then click the button.", + 2. "If the text in the other window is de-selected, the test FAILS.", + "If the text remains selected, the test PASSES." + """; + PassFailJFrame.builder() + .title("Test Instructions") + .instructions(INSTRUCTIONS) + .columns(35) + .testUI(initialize()) + .build() + .awaitAndCheck(); + } + + public static Frame initialize() { + Frame frame = new Frame("Selection Test"); + frame.setLayout(new BorderLayout()); + Button b = new Button("Select some text in another window, then" + + " click me"); + b.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + frame.add(new TextField("text field test")); + frame.add(new TextArea("text area test")); + } + }); + frame.add(b); + frame.setSize(400, 400); + return frame; + } +} From 65e09857105d9e9899865822dd4c7031fa23e640 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Thu, 18 Sep 2025 16:28:55 +0000 Subject: [PATCH 084/323] 8354451: Open source some more Swing popup menu tests Backport-of: 3e3dff6767f467b53c739c34b4350dd6840534a3 --- .../javax/swing/JPopupMenu/bug4188832.java | 82 ++++++ .../javax/swing/JPopupMenu/bug4212464.java | 142 ++++++++++ .../javax/swing/JPopupMenu/bug4234793.java | 242 ++++++++++++++++++ 3 files changed, 466 insertions(+) create mode 100644 test/jdk/javax/swing/JPopupMenu/bug4188832.java create mode 100644 test/jdk/javax/swing/JPopupMenu/bug4212464.java create mode 100644 test/jdk/javax/swing/JPopupMenu/bug4234793.java diff --git a/test/jdk/javax/swing/JPopupMenu/bug4188832.java b/test/jdk/javax/swing/JPopupMenu/bug4188832.java new file mode 100644 index 000000000000..9c958ebc1efb --- /dev/null +++ b/test/jdk/javax/swing/JPopupMenu/bug4188832.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 1999, 2025, 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 Test that medium weight submenus are not hidden by a heavyweight canvas. + * @bug 4188832 + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4188832 + */ + +import java.awt.Color; +import java.awt.Panel; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; + +public class bug4188832 { + + static final String INSTRUCTIONS = """ + Select the File menu, then select the "Save As..." submenu. + If you can see the submenu items displayed, press PASS, else press FAIL + """; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(40) + .testUI(bug4188832::createUI) + .build() + .awaitAndCheck(); + } + + static JFrame createUI() { + // for Medium Weight menus + JPopupMenu.setDefaultLightWeightPopupEnabled(false); + JFrame frame = new JFrame("bug4188832"); + + // Create the menus + JMenuBar menuBar = new JMenuBar(); + JMenu fileMenu = new JMenu("File"); + menuBar.add(fileMenu); + fileMenu.add(new JMenuItem("New")); + fileMenu.add(new JMenuItem("Open")); + fileMenu.add(new JMenuItem("Save")); + JMenu sm = new JMenu("Save As..."); + // these guys don't show up + sm.add(new JMenuItem("This")); + sm.add(new JMenuItem("That")); + fileMenu.add(sm); + fileMenu.add(new JMenuItem("Exit")); + frame.setJMenuBar(menuBar); + + Panel field = new Panel(); // a heavyweight container + field.setBackground(Color.blue); + frame.add(field); + frame.setSize(400, 400); + return frame; + } +} diff --git a/test/jdk/javax/swing/JPopupMenu/bug4212464.java b/test/jdk/javax/swing/JPopupMenu/bug4212464.java new file mode 100644 index 000000000000..c1c434f6b16f --- /dev/null +++ b/test/jdk/javax/swing/JPopupMenu/bug4212464.java @@ -0,0 +1,142 @@ +/* + * Copyright (c) 1999, 2025, 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 4212464 + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @summary Verify popup menu borders are drawn correctly when switching L&Fs + * @run main/manual bug4212464 + */ + +import java.awt.BorderLayout; +import java.awt.FlowLayout; +import java.awt.Font; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import javax.swing.JApplet; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; + +public class bug4212464 extends JFrame implements ActionListener { + + static String strMotif = "Motif"; + static String motifClassName = "com.sun.java.swing.plaf.motif.MotifLookAndFeel"; + + static String strMetal = "Metal"; + static String metalClassName = "javax.swing.plaf.metal.MetalLookAndFeel"; + + static bug4212464 frame; + static JPopupMenu popup; + + static final String INSTRUCTIONS = """ + This test is to see whether popup menu borders behave properly when switching + back and forth between Motif and Metal L&F. The initial L&F is Metal. + + Pressing the mouse button on the label in the center of the test window brings + up a popup menu. + + In order to test, use the labeled buttons to switch the look and feel. + Clicking a button will cause the menu to be hidden. This is OK. Just click the label again. + Switch back and forth and verify that the popup menu border changes consistently + and there is a title for the menu when using Motif L&F (Metal won't have a title). + + Make sure you switch back and forth several times. + If the change is consistent, press PASS otherwise press FAIL. + """; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(50) + .testUI(bug4212464::createUI) + .build() + .awaitAndCheck(); + } + + static JFrame createUI() { + try { + UIManager.setLookAndFeel(metalClassName); // initialize to Metal. + } catch (Exception e) { + throw new RuntimeException(e); + } + frame = new bug4212464("bug4212464"); + popup = new JPopupMenu("Test"); + popup.add("Item 1"); + popup.add("Item 2"); + popup.add("Item 3"); + popup.add("Item 4"); + + JPanel p = new JPanel(); + p.setLayout(new FlowLayout()); + JButton motif = (JButton)p.add(new JButton(strMotif)); + JButton metal = (JButton)p.add(new JButton(strMetal)); + motif.setActionCommand(motifClassName); + metal.setActionCommand(metalClassName); + motif.addActionListener(frame); + metal.addActionListener(frame); + frame.add(BorderLayout.NORTH, p); + + JLabel l = new JLabel("Click any mouse button on this big label"); + l.setFont(new Font(Font.DIALOG, Font.PLAIN, 20)); + l.addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent e) { + popup.show(e.getComponent(), e.getX(), e.getY()); + } + }); + frame.add(BorderLayout.CENTER, l); + frame.setSize(500, 400); + return frame; + } + + public bug4212464(String title) { + super(title); + } + + public void actionPerformed(ActionEvent e) { + String str = e.getActionCommand(); + if (str.equals(metalClassName) || str.equals(motifClassName)) { + changeLNF(str); + } else { + System.out.println("ActionEvent: " + str); + } + } + + public void changeLNF(String str) { + System.out.println("Changing LNF to " + str); + try { + UIManager.setLookAndFeel(str); + SwingUtilities.updateComponentTreeUI(frame); + SwingUtilities.updateComponentTreeUI(popup); + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} diff --git a/test/jdk/javax/swing/JPopupMenu/bug4234793.java b/test/jdk/javax/swing/JPopupMenu/bug4234793.java new file mode 100644 index 000000000000..9ad91e5165f5 --- /dev/null +++ b/test/jdk/javax/swing/JPopupMenu/bug4234793.java @@ -0,0 +1,242 @@ +/* + * Copyright (c) 2002, 2025, 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 4234793 + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @summary PopupMenuListener popupMenuCanceled is never called + * @run main/manual bug4234793 + */ + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +import javax.swing.AbstractAction; +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JSeparator; +import javax.swing.KeyStroke; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; + +/** + * For all 3 components (JPopupMenu, JComboBox, JPopup) when the popup is visible, + * the popupMenuCanceled should be invoked in these two circumstances: + * + * 1. The ESCAPE key is pressed while the popup is open. + * + * 2. The mouse is clicked on another component. + * + */ + +public class bug4234793 extends JFrame implements PopupMenuListener { + + static final String INSTRUCTIONS = """ + The test window will contain several kinds of menus. + + * A menu bar with two menus labeled "1 - First Menu" and "2 - Second Menu" + * A drop down combo box - ie a button which pops up a menu when clicked + * Clicking any where on the background of the window will display a popup menu + + That is 4 menus in total. + + For each case, verify that the menu can be cancelled (hidden) in two ways + 1) Click to display the menu, then to hide it, press the ESCAPE key. + 2) Click to display the menu, then to hide it, LEFT click on the window background. + Note : the popup menu must be displayed using RIGHT click, the others use LEFT click. + + Notice each time you perform a hide/cancel action an appropriate message should + appear in the log area + If this is true for all 8 combinations of menus + hide actions the test PASSES + """; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(60) + .testUI(bug4234793::createUI) + .logArea() + .build() + .awaitAndCheck(); + } + + private static String[] numData = { + "One", "Two", "Three", "Four", "Five", "Six", "Seven" + }; + + private static String[] dayData = { + "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" + }; + + private static char[] mnDayData = { + 'M', 'T', 'W', 'R', 'F', 'S', 'U' + }; + + bug4234793(String title) { + super(title); + } + + static volatile JPopupMenu popupMenu; + static volatile bug4234793 frame; + + static JFrame createUI() { + frame = new bug4234793("bug4234793"); + frame.setJMenuBar(createMenuBar()); + JPanel panel = createContentPane(); + frame.add(panel); + + // CTRL-down will show the popup. + panel.getInputMap().put(KeyStroke.getKeyStroke( + KeyEvent.VK_DOWN, InputEvent.CTRL_MASK), "OPEN_POPUP"); + panel.getActionMap().put("OPEN_POPUP", new PopupHandler()); + panel.addMouseListener(new PopupListener(popupMenu)); + panel.setPreferredSize(new Dimension(400, 300)); + frame.setSize(400, 300); + return frame; + } + + static class PopupListener extends MouseAdapter { + private JPopupMenu popup; + + public PopupListener(JPopupMenu popup) { + this.popup = popup; + } + + public void mousePressed(MouseEvent e) { + maybeShowPopup(e); + } + + public void mouseReleased(MouseEvent e) { + maybeShowPopup(e); + } + + public void mouseClicked(MouseEvent ex) { + } + + private void maybeShowPopup(MouseEvent e) { + if (e.isPopupTrigger()) { + popup.show(e.getComponent(), e.getX(), e.getY()); + } + } + } + + static class PopupHandler extends AbstractAction { + public void actionPerformed(ActionEvent e) { + if (!popupMenu.isVisible()) + popupMenu.show((Component)e.getSource(), 40, 40); + } + } + + static JPanel createContentPane() { + popupMenu = new JPopupMenu(); + JMenuItem item; + for (int i = 0; i < dayData.length; i++) { + item = popupMenu.add(new JMenuItem(dayData[i], mnDayData[i])); + } + popupMenu.addPopupMenuListener(frame); + + JComboBox combo = new JComboBox(numData); + combo.addPopupMenuListener(frame); + JPanel comboPanel = new JPanel(); + comboPanel.add(combo); + + JPanel panel = new JPanel(new BorderLayout()); + + panel.add(new JLabel("Right click on the panel to show the PopupMenu"), BorderLayout.NORTH); + panel.add(comboPanel, BorderLayout.CENTER); + + return panel; + } + + static JMenuBar createMenuBar() { + JMenuBar menubar = new JMenuBar(); + JMenuItem menuitem; + + JMenu menu = new JMenu("1 - First Menu"); + menu.setMnemonic('1'); + menu.getPopupMenu().addPopupMenuListener(frame); + + menubar.add(menu); + for (int i = 0; i < 10; i ++) { + menuitem = new JMenuItem("1 JMenuItem" + i); + menuitem.setMnemonic('0' + i); + menu.add(menuitem); + } + + // second menu + menu = new JMenu("2 - Second Menu"); + menu.getPopupMenu().addPopupMenuListener(frame); + menu.setMnemonic('2'); + + menubar.add(menu); + for (int i = 0; i < 5; i++) { + menuitem = new JMenuItem("2 JMenuItem" + i); + menuitem.setMnemonic('0' + i); + menu.add(menuitem); + } + + JMenu submenu = new JMenu("Sub Menu"); + submenu.setMnemonic('S'); + submenu.getPopupMenu().addPopupMenuListener(frame); + for (int i = 0; i < 5; i++) { + menuitem = new JMenuItem("S JMenuItem" + i); + menuitem.setMnemonic('0' + i); + submenu.add(menuitem); + } + menu.add(new JSeparator()); + menu.add(submenu); + + return menubar; + } + + // PopupMenuListener methods. + + public void popupMenuWillBecomeVisible(PopupMenuEvent e) { + Object source = e.getSource(); + PassFailJFrame.log("popupmenu visible: " + source.getClass().getName()); + } + + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { + Object source = e.getSource(); + PassFailJFrame.log("popupMenuWillBecomeInvisible: " + source.getClass().getName()); + } + + public void popupMenuCanceled(PopupMenuEvent e) { + Object source = e.getSource(); + PassFailJFrame.log("POPUPMENU CANCELED: " + source.getClass().getName()); + } +} From 03f78db96172a2f94ce7d2e5edc75711ac7ff393 Mon Sep 17 00:00:00 2001 From: Aleksey Shipilev Date: Fri, 19 Sep 2025 07:34:07 +0000 Subject: [PATCH 085/323] 8363966: GHA: Switch cross-compiling sysroots to Debian trixie Backport-of: 2a5f149bb8e26277778465fff670591c929842de --- .github/workflows/build-cross-compile.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-cross-compile.yml b/.github/workflows/build-cross-compile.yml index 0b2888ca6e0e..f8e7306a8c06 100644 --- a/.github/workflows/build-cross-compile.yml +++ b/.github/workflows/build-cross-compile.yml @@ -60,33 +60,33 @@ jobs: gnu-arch: aarch64 debian-arch: arm64 debian-repository: https://httpredir.debian.org/debian/ - debian-version: bookworm + debian-version: trixie tolerate-sysroot-errors: false - target-cpu: arm gnu-arch: arm debian-arch: armhf debian-repository: https://httpredir.debian.org/debian/ - debian-version: bookworm + debian-version: trixie tolerate-sysroot-errors: false gnu-abi: eabihf - target-cpu: s390x gnu-arch: s390x debian-arch: s390x debian-repository: https://httpredir.debian.org/debian/ - debian-version: bookworm + debian-version: trixie tolerate-sysroot-errors: false - target-cpu: ppc64le gnu-arch: powerpc64le debian-arch: ppc64el debian-repository: https://httpredir.debian.org/debian/ - debian-version: bookworm + debian-version: trixie tolerate-sysroot-errors: false - target-cpu: riscv64 gnu-arch: riscv64 debian-arch: riscv64 debian-repository: https://httpredir.debian.org/debian/ - debian-version: sid - tolerate-sysroot-errors: true + debian-version: trixie + tolerate-sysroot-errors: false steps: - name: 'Checkout the JDK source' From b7dc507f2e97a33c2cacba8a6435057e5e00ab7b Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Fri, 19 Sep 2025 16:26:58 +0000 Subject: [PATCH 086/323] 8353957: Open source several AWT ScrollPane tests - Batch 1 Backport-of: d1d7d2569c1745aef778c9b5a62c1bd50735e8a7 --- test/jdk/ProblemList.txt | 1 + .../awt/ScrollPane/ScrollPaneFlicker.java | 215 ++++++++++++++++++ .../java/awt/ScrollPane/ScrollPanePaint.java | 132 +++++++++++ .../awt/ScrollPane/ScrollPositionTest.java | 100 ++++++++ .../ScrollPane/ScrollbarsAsNeededTest.java | 72 ++++++ 5 files changed, 520 insertions(+) create mode 100644 test/jdk/java/awt/ScrollPane/ScrollPaneFlicker.java create mode 100644 test/jdk/java/awt/ScrollPane/ScrollPanePaint.java create mode 100644 test/jdk/java/awt/ScrollPane/ScrollPositionTest.java create mode 100644 test/jdk/java/awt/ScrollPane/ScrollbarsAsNeededTest.java diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index 976b398ab69a..0bddfbd17cf7 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -445,6 +445,7 @@ java/awt/Focus/TranserFocusToWindow/TranserFocusToWindow.java 6848810 macosx-all java/awt/FileDialog/ModalFocus/FileDialogModalFocusTest.java 8194751 linux-all java/awt/image/VolatileImage/BitmaskVolatileImage.java 8133102 linux-all java/awt/SplashScreen/MultiResolutionSplash/unix/UnixMultiResolutionSplashTest.java 8203004 linux-all +java/awt/ScrollPane/ScrollPositionTest.java 8040070 linux-all java/awt/Robot/AcceptExtraMouseButtons/AcceptExtraMouseButtons.java 7107528 linux-all,macosx-all java/awt/Mouse/MouseDragEvent/MouseDraggedTest.java 8080676 linux-all java/awt/Mouse/MouseModifiersUnitTest/MouseModifiersInKeyEvent.java 8157147 linux-all,windows-all,macosx-all diff --git a/test/jdk/java/awt/ScrollPane/ScrollPaneFlicker.java b/test/jdk/java/awt/ScrollPane/ScrollPaneFlicker.java new file mode 100644 index 000000000000..3594ff50f54c --- /dev/null +++ b/test/jdk/java/awt/ScrollPane/ScrollPaneFlicker.java @@ -0,0 +1,215 @@ +/* + * Copyright (c) 1999, 2025, 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 4073822 + * @summary ScrollPane repaints entire window when scrolling fast + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual ScrollPaneFlicker + */ + +import java.awt.Button; +import java.awt.Canvas; +import java.awt.Checkbox; +import java.awt.Choice; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Label; +import java.awt.Menu; +import java.awt.MenuBar; +import java.awt.MenuItem; +import java.awt.Panel; +import java.awt.Rectangle; +import java.awt.ScrollPane; +import java.awt.Scrollbar; +import java.awt.TextArea; +import java.awt.TextField; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JScrollBar; +import javax.swing.JTextArea; +import javax.swing.JTextField; + +public class ScrollPaneFlicker { + public static void main(String[] args) throws Exception { + String INSTRUCTIONS = """ + When scrolling a ScrollPane fast(i.e. holding the down/up arrow + down for a while), the ScrollPane would inexplicably refresh + the entire window. + + 1. Select a type of ScrollPane content from the content menu. + 2. Scroll the content using the up/down/left/right arrows on + the scroll bar. Try scrolling the entire content area using + the scroll arrows-- from top to bottom and left to right. + 3. Verify that the entire pane does not refresh when scrolling + - only the newly exposed areas should be repainting. + 4. Repeat for all content types. + """; + PassFailJFrame.builder() + .title("Test Instructions") + .instructions(INSTRUCTIONS) + .columns(35) + .testUI(ScrollPaneFlicker::initialize) + .build() + .awaitAndCheck(); + } + + static Frame initialize() { + return new FlickerFrame(); + } +} + +class FlickerFrame extends Frame { + ScrollPane pane; + + public FlickerFrame() { + super("ScrollPane Flicker Test"); + TextPanel textPanel = new TextPanel(); + GradientPanel gradientPanel = new GradientPanel(); + ComponentPanel componentPanel = new ComponentPanel(); + SwingPanel swingPanel = new SwingPanel(); + MenuBar menubar = new MenuBar(); + Menu testMenu = new Menu("Test Options"); + + pane = new ScrollPane(); + pane.getHAdjustable().setUnitIncrement(8); + pane.getVAdjustable().setUnitIncrement(16); + pane.add(textPanel); + add(pane); + + testMenu.add(makeContentItem("Text Lines", textPanel)); + testMenu.add(makeContentItem("Gradient Fill", gradientPanel)); + testMenu.add(makeContentItem("AWT Components", componentPanel)); + testMenu.add(makeContentItem("Swing Components", swingPanel)); + menubar.add(testMenu); + + setMenuBar(menubar); + setSize(400, 300); + } + + public MenuItem makeContentItem(String title, final Component content) { + MenuItem menuItem = new MenuItem(title); + menuItem.addActionListener( + ev -> { + pane.add(content); + pane.validate(); + } + ); + return menuItem; + } +} + +class GradientPanel extends Canvas { + public void paint(Graphics g) { + // just paint something that'll take a while + int x, y; + int width = getSize().width; + int height = getSize().height; + int step = 8; + + for (x = 0; x < width; x += step) { + for (y = 0; y < height; y += step) { + int red = (255 * y) / height; + int green = (255 * x * y) / (width * height); + int blue = (255 * x) / width; + Rectangle bounds = g.getClipBounds(); + Rectangle fbounds = new Rectangle(x, y, x + step, y + step); + if (bounds.intersects(fbounds)) { + Color color = new Color(red, green, blue); + g.setColor(color); + g.fillRect(x, y, x + step, y + step); + } + } + } + } + + public Dimension getPreferredSize() { + return new Dimension(200, 1000); + } +} + +class TextPanel extends Canvas { + public void paint(Graphics g) { + Font font = new Font("SanSerif", Font.ITALIC, 12); + + g.setFont(font); + // just paint something that'll take a while + int x, y; + int width = getWidth(); + int height = getHeight(); + int step = 16; + + for (x = y = 0; y < height; y += step) { + Rectangle bounds = g.getClipBounds(); + Rectangle tbounds = new Rectangle(x, y - 16, x + width, y); + if (bounds.intersects(tbounds)) { + g.drawString(y + " : The quick brown fox jumps over the lazy dog. " + + "The rain in Spain falls mainly on the plain.", x, y); + } + } + } + + public Dimension getPreferredSize() { + return new Dimension(640, 1000); + } +} + +class ComponentPanel extends Panel { + ComponentPanel() { + add(new Label("Label")); + add(new Button("Button")); + add(new Checkbox("Checkbox")); + Choice c = new Choice(); + c.add("choice"); + java.awt.List l = new java.awt.List(); + l.add("list"); + add(new Scrollbar()); + add(new TextField("TextField")); + add(new TextArea("TextArea")); + add(new Panel()); + add(new Canvas()); + } +} + +class SwingPanel extends JPanel { + SwingPanel() { + add(new JLabel("JLabel")); + add(new JButton("JButton")); + add(new JCheckBox("JCheckBox")); + JComboBox c = new JComboBox(); + JList l = new JList(); + add(new JScrollBar()); + add(new JTextField("This is a JTextField with some text in it to make it longer.")); + add(new JTextArea("This is a JTextArea with some text in it to make it longer.")); + } +} diff --git a/test/jdk/java/awt/ScrollPane/ScrollPanePaint.java b/test/jdk/java/awt/ScrollPane/ScrollPanePaint.java new file mode 100644 index 000000000000..0d7b7779018e --- /dev/null +++ b/test/jdk/java/awt/ScrollPane/ScrollPanePaint.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 1999, 2025, 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. + */ + +/* + * Licensed Materials - Property of IBM + * + * (C) Copyright IBM Corporation 1998 All Rights Reserved. + * + * US Government Users Restricted Rights - Use, duplication or disclosure + * restricted by GSA ADP Schedule Contract with IBM Corp. + */ + +/* + * @test + * @bug 4160721 + * @summary AWT ScrollPane painting problem + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual ScrollPanePaint + */ + +import java.awt.BorderLayout; +import java.awt.Button; +import java.awt.Color; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.GridLayout; +import java.awt.Panel; +import java.awt.ScrollPane; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.List; + +public class ScrollPanePaint { + public static void main(String[] args) throws Exception { + String INSTRUCTIONS = """ + 1. Press the button marked "Toggle" a few times. + 2. The contents of the frame should alternate between + a red panel and a scroll pane containing a green panel. + If this does not happen (specifically, if the scroll + pane does not consistently contain a green panel), + then the test has FAILED. + """; + ScrollPaintTest scrollPaintTest = new ScrollPaintTest(); + PassFailJFrame.builder() + .title("Test Instructions") + .instructions(INSTRUCTIONS) + .columns(35) + .testUI(scrollPaintTest::initialize) + .positionTestUI(WindowLayouts::rightOneColumn) + .build() + .awaitAndCheck(); + } + + private static class ScrollPaintTest implements ActionListener { + static Frame f; + static boolean showScroll; + + public List initialize() { + Frame frame = new Frame("Scrollpane paint test"); + frame.setLayout(new BorderLayout()); + f = new Frame("Scrollpane paint test"); + f.setLayout(new GridLayout(0, 1)); + + Button b = new Button("Toggle"); + b.addActionListener(this); + + frame.add(b, BorderLayout.CENTER); + frame.pack(); + + showScroll = false; + actionPerformed(null); + return List.of(frame, f); + } + + public void actionPerformed(ActionEvent e) { + Container c; + if (!showScroll) { + c = (Container) new TestPanel(new Dimension(100, 100)); + c.setBackground(Color.red); + } else { + c = new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS); + Panel p = new TestPanel(new Dimension(20, 20)); + p.setBackground(Color.green); + c.add(p); + } + + f.removeAll(); + f.add("Center", c); + f.pack(); + showScroll = !showScroll; + } + } + + private static class TestPanel extends Panel { + Dimension dim; + + TestPanel(Dimension d) { + dim = d; + } + + public Dimension getMinimumSize() { + return getPreferredSize(); + } + + public Dimension getPreferredSize() { + return dim; + } + } + +} diff --git a/test/jdk/java/awt/ScrollPane/ScrollPositionTest.java b/test/jdk/java/awt/ScrollPane/ScrollPositionTest.java new file mode 100644 index 000000000000..9c082a8dfc91 --- /dev/null +++ b/test/jdk/java/awt/ScrollPane/ScrollPositionTest.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2003, 2025, 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 4008152 + * @summary ScrollPane position does not return correct values + * @key headful + * @run main ScrollPositionTest + */ + +import java.awt.Adjustable; +import java.awt.BorderLayout; +import java.awt.Canvas; +import java.awt.EventQueue; +import java.awt.Frame; +import java.awt.Point; +import java.awt.Robot; +import java.awt.ScrollPane; +import java.awt.event.AdjustmentEvent; +import java.awt.event.AdjustmentListener; + +public class ScrollPositionTest { + static Frame frame; + static int i = 0; + static Point p; + static ScrollPane sp; + + public static void main(String[] args) throws Exception { + Robot robot = new Robot(); + try { + EventQueue.invokeAndWait(() -> { + frame = new Frame("Scroll Position Test"); + frame.setLayout(new BorderLayout()); + frame.setSize(200, 200); + sp = new ScrollPane(ScrollPane.SCROLLBARS_AS_NEEDED); + Canvas canvas = new Canvas(); + canvas.setSize(300, 300); + sp.add(canvas); + frame.add("Center", sp); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + }); + robot.waitForIdle(); + robot.delay(1000); + EventQueue.invokeAndWait(() -> { + Adjustable saH = sp.getHAdjustable(); + saH.addAdjustmentListener(new TestAdjustmentListener()); + }); + for (i = 0; i < 1000; i++) { + EventQueue.invokeAndWait(() -> { + p = new Point(i % 100, i % 100); + sp.setScrollPosition(p); + }); + + robot.waitForIdle(); + robot.delay(10); + EventQueue.invokeAndWait(() -> { + if (!sp.getScrollPosition().equals(p)) { + throw new RuntimeException("Test failed. " + i + " : " + + "Expected " + p + ", but Returned: " + sp.getScrollPosition()); + } + }); + } + System.out.println("Test Passed."); + } finally { + EventQueue.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + } + + private static class TestAdjustmentListener implements AdjustmentListener { + public void adjustmentValueChanged(AdjustmentEvent e) { + System.out.println("AdjEvent caught:" + e); + } + } +} diff --git a/test/jdk/java/awt/ScrollPane/ScrollbarsAsNeededTest.java b/test/jdk/java/awt/ScrollPane/ScrollbarsAsNeededTest.java new file mode 100644 index 000000000000..c5f48f800070 --- /dev/null +++ b/test/jdk/java/awt/ScrollPane/ScrollbarsAsNeededTest.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 1998, 2025, 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 4094248 + * @summary Test initial appearance of SCROLLBARS_AS_NEEDED policy + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual ScrollbarsAsNeededTest + */ + +import java.awt.Color; +import java.awt.FlowLayout; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.ScrollPane; + +public class ScrollbarsAsNeededTest { + public static void main(String[] args) throws Exception { + String INSTRUCTIONS = """ + 1. A Frame window with a ScrollPane that is + initially created with the SCROLLBARS_AS_NEEDED policy. + 2. If there are no scrollbars around the ScrollPane then + the test PASS. Otherwise the test FAILS. + """; + PassFailJFrame.builder() + .title("Test Instructions") + .instructions(INSTRUCTIONS) + .columns(35) + .testUI(ScrollbarsAsNeededTest::initialize) + .build() + .awaitAndCheck(); + } + + static Frame initialize() { + Frame frame = new Frame("Scrollbar as needed test"); + ScrollPane scrollPane = new ScrollPane() { + @Override + public void paint(Graphics g) { + super.paint(g); + g.drawString("ScrollPane", 10, 50); + } + }; + scrollPane.setBackground(Color.WHITE); + frame.setBackground(Color.GRAY); + frame.setSize(200, 200); + frame.setLayout(new FlowLayout()); + frame.add(scrollPane); + return frame; + } +} From 93cc3f5e076686226a952c13a93f9e9512017b6b Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Fri, 19 Sep 2025 16:29:36 +0000 Subject: [PATCH 087/323] 8352793: Open source several AWT TextComponent tests - Batch 1 Backport-of: f880fa91dce7b8844cfa4e95caa3a982e280165a --- .../awt/TextComponent/BackgroundTest.java | 127 ++++++++++++++++++ .../java/awt/TextComponent/DisableTest.java | 98 ++++++++++++++ .../java/awt/TextComponent/ModifiersTest.java | 85 ++++++++++++ .../awt/TextComponent/TextFieldMargin.java | 67 +++++++++ 4 files changed, 377 insertions(+) create mode 100644 test/jdk/java/awt/TextComponent/BackgroundTest.java create mode 100644 test/jdk/java/awt/TextComponent/DisableTest.java create mode 100644 test/jdk/java/awt/TextComponent/ModifiersTest.java create mode 100644 test/jdk/java/awt/TextComponent/TextFieldMargin.java diff --git a/test/jdk/java/awt/TextComponent/BackgroundTest.java b/test/jdk/java/awt/TextComponent/BackgroundTest.java new file mode 100644 index 000000000000..543f2cfd8931 --- /dev/null +++ b/test/jdk/java/awt/TextComponent/BackgroundTest.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 1999, 2025, 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 4258667 4405602 + * @summary Make sure TextComponents are grayed out when non-editable + * if the background color has not been set by client code. + * Make sure TextComponents are not grayed out when non-editable + * if the background color has been set by client code. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual BackgroundTest + */ + +import java.awt.Button; +import java.awt.Color; +import java.awt.FlowLayout; +import java.awt.Frame; +import java.awt.TextArea; +import java.awt.TextField; + +public class BackgroundTest { + private static final String enableString = "EnableText"; + private static final String disableString = "DisableText"; + + public static void main(String[] args) throws Exception { + String INSTRUCTIONS = """ + 1. When the frame appears, it should have a blue background. + 2. The first TextField and TextArea will be the default color. + The second TextField and TextArea will be green. + 3. Press the "DisableText" button. + The first TextField and TextArea should change colors to the + default disabled color. On Windows, this is usually gray. + On linux and macos it will match the environment settings. + If the TextField or the TextArea do not change colors as described, + the test FAILS. + 4. The second TextField and TextArea should still be green. + If either of them are not green, the test FAILS. + Press the "EnableText" button (same button as before). + The first TextField and TextArea should return to their + original colors as described in the first paragraph. If they + do not, the test FAILS. + 5. The second TextField and TextArea should still be green. + If either of them are not green, the test FAILS. + Otherwise, the test PASSES. + """; + + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(35) + .testUI(BackgroundTest::initialize) + .build() + .awaitAndCheck(); + } + + public static Frame initialize() { + Frame frame = new Frame("Background Test"); + frame.setLayout(new FlowLayout()); + TextField tf = new TextField(30); + TextArea ta = new TextArea(4, 30); + TextField setTf = new TextField(30); + TextArea setTa = new TextArea(4, 30); + Button enableButton = new Button(disableString); + + enableButton.setBackground(Color.red); + frame.setSize(500, 250); + + frame.setBackground(Color.blue); + + tf.setText("Background not set - should be default"); + tf.setEditable(true); + frame.add(tf); + ta.setText("Background not set - should be default"); + ta.setEditable(true); + frame.add(ta); + + setTf.setText("Background is set - should be Green"); + setTf.setBackground(Color.green); + setTf.setEditable(true); + frame.add(setTf); + setTa.setText("Background is set - should be Green"); + setTa.setBackground(Color.green); + setTa.setEditable(true); + frame.add(setTa); + + enableButton.addActionListener(e -> { + boolean currentlyEditable = tf.isEditable(); + + if (currentlyEditable) { + tf.setEditable(false); + ta.setEditable(false); + setTf.setEditable(false); + setTa.setEditable(false); + enableButton.setLabel(enableString); + } else { + tf.setEditable(true); + ta.setEditable(true); + setTf.setEditable(true); + setTa.setEditable(true); + enableButton.setLabel(disableString); + } + }); + frame.add(enableButton); + return frame; + } +} \ No newline at end of file diff --git a/test/jdk/java/awt/TextComponent/DisableTest.java b/test/jdk/java/awt/TextComponent/DisableTest.java new file mode 100644 index 000000000000..820b9c8bd303 --- /dev/null +++ b/test/jdk/java/awt/TextComponent/DisableTest.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2005, 2025, 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 5042122 + * @summary Verifies the TextComponent is grayed out when disabled + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual DisableTest + */ + +import javax.swing.BoxLayout; +import java.awt.BorderLayout; +import java.awt.Button; +import java.awt.Component; +import java.awt.Frame; +import java.awt.Panel; +import java.awt.TextArea; +import java.awt.TextField; +import java.awt.event.ActionListener; +import java.util.Vector; +import java.util.Iterator; + +public class DisableTest { + public static void main(String[] args) throws Exception { + String INSTRUCTIONS = """ + 1. Click "Enable" and "Disable" buttons and verify the text + components are disabled and enabled correctly. + 2. Verify that the disabled text components are grayed + out and are uneditable. + 3. Click PASS or FAIL accordingly. + """; + + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(35) + .testUI(DisableTest::initialize) + .build() + .awaitAndCheck(); + } + + public static Frame initialize() { + Frame frame = new Frame("TextComponent Disabled test"); + frame.setLayout(new BorderLayout()); + frame.setSize(200, 200); + final Vector comps = new Vector(); + comps.add(new TextField("TextField")); + TextArea ta = new TextArea("TextArea", 2, 100, TextArea.SCROLLBARS_NONE); + comps.add(ta); + Panel pc = new Panel(); + pc.setLayout(new BoxLayout(pc, BoxLayout.Y_AXIS)); + Iterator iter = comps.iterator(); + while (iter.hasNext()) { + Component c = (Component) iter.next(); + c.setEnabled(false); + pc.add(c); + } + frame.add(pc, BorderLayout.CENTER); + Panel p = new Panel(); + final Button be = new Button("Enable"); + final Button bd = new Button("Disable"); + p.add(be); + p.add(bd); + ActionListener al = ev -> { + boolean enable = (ev.getSource() == be); + Iterator iterator = comps.iterator(); + while (iterator.hasNext()) { + Component c = (Component) iterator.next(); + c.setEnabled(enable); + } + }; + be.addActionListener(al); + bd.addActionListener(al); + frame.add(p, BorderLayout.SOUTH); + return frame; + } +} diff --git a/test/jdk/java/awt/TextComponent/ModifiersTest.java b/test/jdk/java/awt/TextComponent/ModifiersTest.java new file mode 100644 index 000000000000..e9e76a9b694b --- /dev/null +++ b/test/jdk/java/awt/TextComponent/ModifiersTest.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 1999, 2025, 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 4035364 + * @summary Checks that Caps Lock key works + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual ModifiersTest + */ + +import java.awt.Frame; +import java.awt.GridLayout; +import java.awt.Label; +import java.awt.TextArea; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; + +public class ModifiersTest { + public static void main(String[] args) throws Exception { + String INSTRUCTIONS = """ + 1. Type some text in the TextArea in upper and lowercase, + using the Caps Lock ON/OFF. + 2. If Caps Lock toggles correctly and you are able to type in + both cases, the test PASS. Else Test FAILS. + """; + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(35) + .testUI(ModifiersTest::initialize) + .build() + .awaitAndCheck(); + } + + public static Frame initialize() { + Frame frame = new Frame("Modifiers Test"); + frame.setLayout(new GridLayout(1, 1)); + frame.addKeyListener(new KeyChecker()); + frame.setLayout(new GridLayout(2, 1)); + Label label = new Label("See if you can type in upper and lowercase using Caps Lock:"); + frame.add(label); + TextArea ta = new TextArea(); + frame.add(ta); + ta.addKeyListener(new KeyChecker()); + ta.requestFocus(); + frame.setSize(400, 300); + return frame; + } +} + +// a KeyListener for debugging purposes +class KeyChecker extends KeyAdapter { + public void keyPressed(KeyEvent ev) { + System.out.println(ev); + } + + public void keyReleased(KeyEvent ev) { + System.out.println(ev); + } + + public void keyTyped(KeyEvent ev) { + System.out.println(ev); + } +} diff --git a/test/jdk/java/awt/TextComponent/TextFieldMargin.java b/test/jdk/java/awt/TextComponent/TextFieldMargin.java new file mode 100644 index 000000000000..6baf144254c1 --- /dev/null +++ b/test/jdk/java/awt/TextComponent/TextFieldMargin.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 1999, 2025, 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 4129511 + * @summary Tests that TextField margins are not exceedingly wide + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual TextFieldMargin + */ + +import java.awt.Frame; +import java.awt.GridLayout; +import java.awt.Label; +import java.awt.TextArea; +import java.awt.TextField; + +public class TextFieldMargin { + public static void main(String[] args) throws Exception { + String INSTRUCTIONS = """ + 1. Examine the TextField, Label, and TextArea to see + that the text is vertically aligned along the left + 2. If all are aligned along the left, then test PASS, + else test FAILS. + """; + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(35) + .testUI(TextFieldMargin::initialize) + .build() + .awaitAndCheck(); + } + + public static Frame initialize() { + Frame frame = new Frame("Frame with a text field & a label"); + frame.setLayout(new GridLayout(5, 1)); + TextField text_field = new TextField("Left Textfield"); + frame.add(text_field); + Label label = new Label("Left Label"); + frame.add(label); + TextArea text_area = new TextArea("Left Textfield"); + frame.add(text_area); + frame.setBounds(50, 50, 300, 300); + return frame; + } +} From 043462b4f4abfc06dc3144b0a58beca47618fe6a Mon Sep 17 00:00:00 2001 From: SendaoYan Date: Mon, 22 Sep 2025 03:22:33 +0000 Subject: [PATCH 088/323] 8365834: Mark java/net/httpclient/ManyRequests.java as intermittent Backport-of: 09aad0aea8b9f9fda14c5b18ae67b30ffce817d9 --- test/jdk/java/net/httpclient/ManyRequests.java | 1 + 1 file changed, 1 insertion(+) diff --git a/test/jdk/java/net/httpclient/ManyRequests.java b/test/jdk/java/net/httpclient/ManyRequests.java index 89f26d3a7613..61b6a5a4d3de 100644 --- a/test/jdk/java/net/httpclient/ManyRequests.java +++ b/test/jdk/java/net/httpclient/ManyRequests.java @@ -24,6 +24,7 @@ /* * @test * @bug 8087112 8180044 8256459 + * @key intermittent * @modules java.net.http * java.logging * jdk.httpserver From d4e51da593f0300ec64d24a8d0f049fdb1a9f4d1 Mon Sep 17 00:00:00 2001 From: Roman Marchenko Date: Mon, 22 Sep 2025 07:27:04 +0000 Subject: [PATCH 089/323] 8365098: make/RunTests.gmk generates a wrong path to test artifacts on Alpine Backport-of: 41520998aa8808452ee384b213b2a77c7bad668d --- make/RunTests.gmk | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/make/RunTests.gmk b/make/RunTests.gmk index 8c6e0f1924fc..b490f9f77489 100644 --- a/make/RunTests.gmk +++ b/make/RunTests.gmk @@ -1077,7 +1077,7 @@ UseSpecialTestHandler = \ # Now process each test to run and setup a proper make rule $(foreach test, $(TESTS_TO_RUN), \ $(eval TEST_ID := $(shell $(ECHO) $(strip $(test)) | \ - $(TR) -cs '[a-z][A-Z][0-9]\n' '[_*1000]')) \ + $(TR) -cs '[a-z][A-Z][0-9]\n' '_')) \ $(eval ALL_TEST_IDS += $(TEST_ID)) \ $(if $(call UseCustomTestHandler, $(test)), \ $(eval $(call SetupRunCustomTest, $(TEST_ID), \ @@ -1157,9 +1157,9 @@ run-test-report: post-run-test TEST TOTAL PASS FAIL ERROR " " $(foreach test, $(TESTS_TO_RUN), \ $(eval TEST_ID := $(shell $(ECHO) $(strip $(test)) | \ - $(TR) -cs '[a-z][A-Z][0-9]\n' '[_*1000]')) \ + $(TR) -cs '[a-z][A-Z][0-9]\n' '_')) \ $(ECHO) >> $(TEST_LAST_IDS) $(TEST_ID) $(NEWLINE) \ - $(eval NAME_PATTERN := $(shell $(ECHO) $(test) | $(TR) -c '\n' '[_*1000]')) \ + $(eval NAME_PATTERN := $(shell $(ECHO) $(test) | $(TR) -c '\n' '_')) \ $(if $(filter __________________________________________________%, $(NAME_PATTERN)), \ $(eval TEST_NAME := ) \ $(PRINTF) >> $(TEST_SUMMARY) "%2s %-49s\n" " " "$(test)" $(NEWLINE) \ From 7171d3f67921bca03089c33b476e7c21a9bc4924 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 22 Sep 2025 10:16:43 +0000 Subject: [PATCH 090/323] 8356897: Update NSS library to 3.111 Backport-of: cabd7c1f7a8c471d5461e3557fb589fdfe4d88be --- test/jdk/sun/security/pkcs11/PKCS11Test.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/jdk/sun/security/pkcs11/PKCS11Test.java b/test/jdk/sun/security/pkcs11/PKCS11Test.java index d19d4a2dbec9..c231791e9728 100644 --- a/test/jdk/sun/security/pkcs11/PKCS11Test.java +++ b/test/jdk/sun/security/pkcs11/PKCS11Test.java @@ -82,7 +82,7 @@ public abstract class PKCS11Test { // Version of the NSS artifact. This coincides with the version of // the NSS version - private static final String NSS_BUNDLE_VERSION = "3.107"; + private static final String NSS_BUNDLE_VERSION = "3.111"; private static final String NSSLIB = "jpg.tests.jdk.nsslib"; static double nss_version = -1; From 1dc7d9318223c1e498b28623eb172924f972e864 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 22 Sep 2025 10:32:06 +0000 Subject: [PATCH 091/323] 8335986: Test javax/swing/JCheckBox/4449413/bug4449413.java fails on Windows 11 x64 because RBMenuItem's and CBMenuItem's checkmark on the left side are not visible Backport-of: c51bed739d97167ae768e204dd8666d078d2e607 --- .../swing/JCheckBox/4449413/bug4449413.java | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/test/jdk/javax/swing/JCheckBox/4449413/bug4449413.java b/test/jdk/javax/swing/JCheckBox/4449413/bug4449413.java index 1efcfe58a31b..d854961ea069 100644 --- a/test/jdk/javax/swing/JCheckBox/4449413/bug4449413.java +++ b/test/jdk/javax/swing/JCheckBox/4449413/bug4449413.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,7 +24,6 @@ /* @test * @bug 4449413 * @summary Tests that checkbox and radiobuttons' check marks are visible when background is black - * @author Ilya Boyandin * @run main/manual bug4449413 */ @@ -56,8 +55,16 @@ public class bug4449413 extends JFrame { + private static boolean isWindowsLF; + + private static String INSTRUCTIONS_WINDOWSLF = + "There are eight controls, JCheckBox/JRadioButton with black background\n" + + "and JRadioButtonMenuItem/JCheckboxMenuItem with gray background\n"; + private static final String INSTRUCTIONS = - "There are eight controls with black backgrounds.\n" + + "There are eight controls with black backgrounds.\n"; + + private static final String INSTRUCTIONS_COMMON = "Four enabled (on the left side) and four disabled (on the right side)\n" + "checkboxes and radiobuttons.\n\n" + "1. If at least one of the controls' check marks is not visible:\n" + @@ -82,6 +89,8 @@ boolean isMetalLookAndFeel() { } public static void main(String[] args) throws Exception { + isWindowsLF = "Windows".equals(UIManager.getLookAndFeel().getID()); + SwingUtilities.invokeLater(() -> { instance = new bug4449413(); instance.createAndShowGUI(); @@ -150,8 +159,10 @@ public void addComponentsToPane() { JTextArea instructionArea = new JTextArea( isMetalLookAndFeel() - ? INSTRUCTIONS + INSTRUCTIONS_ADDITIONS_METAL - : INSTRUCTIONS + ? INSTRUCTIONS + INSTRUCTIONS_COMMON + INSTRUCTIONS_ADDITIONS_METAL + : isWindowsLF + ? (INSTRUCTIONS_WINDOWSLF + INSTRUCTIONS_COMMON) + : (INSTRUCTIONS + INSTRUCTIONS_COMMON) ); instructionArea.setEditable(false); @@ -189,7 +200,13 @@ static AbstractButton createButton(int enabled, int type) { }; b.setOpaque(true); - b.setBackground(Color.black); + if (isWindowsLF + && ((b instanceof JRadioButtonMenuItem) + || (b instanceof JCheckBoxMenuItem))) { + b.setBackground(Color.lightGray); + } else { + b.setBackground(Color.black); + } b.setForeground(Color.white); b.setEnabled(enabled == 1); b.setSelected(true); From 6c1d765f5b08b56282bcafb3fae4cb4d20e6385c Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 22 Sep 2025 10:34:14 +0000 Subject: [PATCH 092/323] 8355478: DoubleActionESC.java fails intermittently Backport-of: d1052c70cbddb025e7f5b71bd61176e63277bba0 --- test/jdk/ProblemList.txt | 1 + .../java/awt/FileDialog/DoubleActionESC.java | 48 ++++++++++--------- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index 0bddfbd17cf7..3cbeafbb062a 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -824,6 +824,7 @@ java/awt/print/PrinterJob/PrintTextTest.java 8148334 generic-all java/awt/font/TextLayout/TestJustification.java 8250791 macosx-all java/awt/TrayIcon/DragEventSource/DragEventSource.java 8252242 macosx-all java/awt/FileDialog/DefaultFocusOwner/DefaultFocusOwner.java 7187728 macosx-all,linux-all +java/awt/FileDialog/DoubleActionESC.java 8356981 linux-all java/awt/print/PageFormat/Orient.java 8016055 macosx-all java/awt/TextArea/TextAreaCursorTest/HoveringAndDraggingTest.java 8024986 macosx-all,linux-all java/awt/TextComponent/CorrectTextComponentSelectionTest.java 8237220 macosx-all diff --git a/test/jdk/java/awt/FileDialog/DoubleActionESC.java b/test/jdk/java/awt/FileDialog/DoubleActionESC.java index 748c3aeb5e44..e8bb4963aa00 100644 --- a/test/jdk/java/awt/FileDialog/DoubleActionESC.java +++ b/test/jdk/java/awt/FileDialog/DoubleActionESC.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2025, 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 @@ -34,12 +34,15 @@ import java.awt.event.KeyEvent; import java.util.concurrent.CountDownLatch; +import static java.util.concurrent.TimeUnit.SECONDS; + /* * @test * @bug 5097243 * @summary Tests that FileDialog can be closed by ESC any time * @key headful * @run main DoubleActionESC + * @run main/othervm -Dsun.awt.disableGtkFileDialogs=true DoubleActionESC */ public class DoubleActionESC { @@ -49,47 +52,48 @@ public class DoubleActionESC { private static Robot robot; private static volatile Point p; private static volatile Dimension d; - private static volatile CountDownLatch latch; private static final int REPEAT_COUNT = 2; + private static final long LATCH_TIMEOUT = 10; - public static void main(String[] args) throws Exception { - latch = new CountDownLatch(1); + private static final CountDownLatch latch = new CountDownLatch(REPEAT_COUNT); + public static void main(String[] args) throws Exception { robot = new Robot(); - robot.setAutoDelay(100); + robot.setAutoDelay(50); try { EventQueue.invokeAndWait(() -> { createAndShowUI(); }); + robot.waitForIdle(); robot.delay(1000); + EventQueue.invokeAndWait(() -> { p = showBtn.getLocationOnScreen(); d = showBtn.getSize(); }); for (int i = 0; i < REPEAT_COUNT; ++i) { - Thread thread = new Thread(() -> { - robot.mouseMove(p.x + d.width / 2, p.y + d.height / 2); - robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); - robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); - }); - thread.start(); - robot.delay(3000); + robot.mouseMove(p.x + d.width / 2, p.y + d.height / 2); + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + robot.waitForIdle(); + robot.delay(1000); - Thread thread1 = new Thread(() -> { - robot.keyPress(KeyEvent.VK_ESCAPE); - robot.keyRelease(KeyEvent.VK_ESCAPE); - robot.waitForIdle(); - }); - thread1.start(); - robot.delay(3000); + robot.keyPress(KeyEvent.VK_ESCAPE); + robot.keyRelease(KeyEvent.VK_ESCAPE); + robot.waitForIdle(); + robot.delay(1000); } - latch.await(); - if (fd.isVisible()) { - throw new RuntimeException("File Dialog is not closed"); + if (!latch.await(LATCH_TIMEOUT, SECONDS)) { + throw new RuntimeException("Test failed: Latch timeout reached"); } + EventQueue.invokeAndWait(() -> { + if (fd.isVisible()) { + throw new RuntimeException("File Dialog is not closed"); + } + }); } finally { EventQueue.invokeAndWait(() -> { if (f != null) { From 65f85c30a17fa6627fc13c541207d8d49e5a9dd2 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 22 Sep 2025 10:36:15 +0000 Subject: [PATCH 093/323] 8360022: ClassRefDupInConstantPoolTest.java fails when running in repeat Backport-of: 566279af49a7cf47e6030222e989417855caf1a9 --- .../tools/javac/jvm/ClassRefDupInConstantPoolTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/langtools/tools/javac/jvm/ClassRefDupInConstantPoolTest.java b/test/langtools/tools/javac/jvm/ClassRefDupInConstantPoolTest.java index a84c87245aff..34fbefa98832 100644 --- a/test/langtools/tools/javac/jvm/ClassRefDupInConstantPoolTest.java +++ b/test/langtools/tools/javac/jvm/ClassRefDupInConstantPoolTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2025, 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,7 +26,7 @@ * @bug 8015927 * @summary Class reference duplicates in constant pool * @modules jdk.jdeps/com.sun.tools.classfile - * @clean ClassRefDupInConstantPoolTest$Duplicates + * @clean ClassRefDupInConstantPoolTest ClassRefDupInConstantPoolTest$Duplicates * @run main ClassRefDupInConstantPoolTest */ From fa60ca566040f7ecb2b3201ca3ce2e1ee9ddabcc Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 22 Sep 2025 10:38:32 +0000 Subject: [PATCH 094/323] 8305567: serviceability/tmtools/jstat/GcTest01.java failed utils.JstatGcResults.assertConsistency Backport-of: 310ef85667bdba3f984cb6327aee71cfaf91458b --- .../tmtools/jstat/GarbageProducerTest.java | 15 ++--- .../tmtools/jstat/GcNewTest.java | 11 ++-- .../tmtools/jstat/GcTest01.java | 15 ++--- .../tmtools/jstat/GcTest02.java | 4 +- .../jstat/utils/JstatGcCapacityTool.java | 5 +- .../tmtools/jstat/utils/JstatGcCauseTool.java | 5 +- .../tmtools/jstat/utils/JstatGcNewTool.java | 5 +- .../tmtools/jstat/utils/JstatGcTool.java | 5 +- .../tmtools/jstat/utils/JstatResults.java | 6 +- .../tmtools/jstat/utils/JstatTool.java | 59 +++++++++++++++++++ 10 files changed, 89 insertions(+), 41 deletions(-) create mode 100644 test/hotspot/jtreg/serviceability/tmtools/jstat/utils/JstatTool.java diff --git a/test/hotspot/jtreg/serviceability/tmtools/jstat/GarbageProducerTest.java b/test/hotspot/jtreg/serviceability/tmtools/jstat/GarbageProducerTest.java index dfe1a8f12dc1..933f2b86ff57 100644 --- a/test/hotspot/jtreg/serviceability/tmtools/jstat/GarbageProducerTest.java +++ b/test/hotspot/jtreg/serviceability/tmtools/jstat/GarbageProducerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, 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 @@ -25,6 +25,7 @@ import utils.GarbageProducer; import common.TmTool; import utils.JstatResults; +import utils.JstatGcCauseTool; /** * Base class for jstat testing which uses GarbageProducer to allocate garbage. @@ -36,19 +37,19 @@ public class GarbageProducerTest { private final static float TARGET_MEMORY_USAGE = 0.7f; private final static float MEASUREMENT_TOLERANCE = 0.05f; private final GarbageProducer garbageProducer; - private final TmTool jstatTool; + private final JstatGcCauseTool jstatTool; - public GarbageProducerTest(TmTool tool) { + public GarbageProducerTest(JstatGcCauseTool tool) { garbageProducer = new GarbageProducer(TARGET_MEMORY_USAGE); // We will be running jstat tool jstatTool = tool; } public void run() throws Exception { - // Run once and get the results asserting that they are reasonable - JstatResults measurement1 = jstatTool.measure(); - measurement1.assertConsistency(); - // Eat metaspace and heap then run the tool again and get the results asserting that they are reasonable + // Run once and get the results asserting that they are reasonable + JstatResults measurement1 = jstatTool.measureAndAssertConsistency(); + + // Eat metaspace and heap then run the tool again and get the results, asserting that they are reasonable System.gc(); garbageProducer.allocateMetaspaceAndHeap(); // Collect garbage. Also update VM statistics diff --git a/test/hotspot/jtreg/serviceability/tmtools/jstat/GcNewTest.java b/test/hotspot/jtreg/serviceability/tmtools/jstat/GcNewTest.java index abe80074770a..52bc41c3fe33 100644 --- a/test/hotspot/jtreg/serviceability/tmtools/jstat/GcNewTest.java +++ b/test/hotspot/jtreg/serviceability/tmtools/jstat/GcNewTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2025, 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 @@ -44,15 +44,13 @@ public static void main(String[] args) throws Exception { JstatGcNewTool jstatGcTool = new JstatGcNewTool(ProcessHandle.current().pid()); // Run once and get the results asserting that they are reasonable - JstatGcNewResults measurement1 = jstatGcTool.measure(); - measurement1.assertConsistency(); + JstatGcNewResults measurement1 = jstatGcTool.measureAndAssertConsistency(); GcProvoker gcProvoker = new GcProvoker(); // Provoke GC and run the tool again gcProvoker.provokeGc(); - JstatGcNewResults measurement2 = jstatGcTool.measure(); - measurement2.assertConsistency(); + JstatGcNewResults measurement2 = jstatGcTool.measureAndAssertConsistency(); // Assert the increase in GC events and time between the measurements assertThat(measurement2.getFloatValue("YGC") > measurement1.getFloatValue("YGC"), "YGC didn't increase between measurements 1 and 2"); @@ -60,8 +58,7 @@ public static void main(String[] args) throws Exception { // Provoke GC and run the tool again gcProvoker.provokeGc(); - JstatGcNewResults measurement3 = jstatGcTool.measure(); - measurement3.assertConsistency(); + JstatGcNewResults measurement3 = jstatGcTool.measureAndAssertConsistency(); // Assert the increase in GC events and time between the measurements assertThat(measurement3.getFloatValue("YGC") > measurement2.getFloatValue("YGC"), "YGC didn't increase between measurements 1 and 2"); diff --git a/test/hotspot/jtreg/serviceability/tmtools/jstat/GcTest01.java b/test/hotspot/jtreg/serviceability/tmtools/jstat/GcTest01.java index 74ac71321094..6d062d4fee5f 100644 --- a/test/hotspot/jtreg/serviceability/tmtools/jstat/GcTest01.java +++ b/test/hotspot/jtreg/serviceability/tmtools/jstat/GcTest01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2025, 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 @@ -47,17 +47,15 @@ public static void main(String[] args) throws Exception { // We will be running "jstat -gc" tool JstatGcTool jstatGcTool = new JstatGcTool(ProcessHandle.current().pid()); - // Run once and get the results asserting that they are reasonable - JstatGcResults measurement1 = jstatGcTool.measure(); - measurement1.assertConsistency(); + // Run once and get the results asserting that they are reasonable + JstatGcResults measurement1 = jstatGcTool.measureAndAssertConsistency(); GcProvoker gcProvoker = new GcProvoker(); // Provoke GC then run the tool again and get the results // asserting that they are reasonable gcProvoker.provokeGc(); - JstatGcResults measurement2 = jstatGcTool.measure(); - measurement2.assertConsistency(); + JstatGcResults measurement2 = jstatGcTool.measureAndAssertConsistency(); // Assert the increase in GC events and time between the measurements JstatResults.assertGCEventsIncreased(measurement1, measurement2); @@ -66,13 +64,10 @@ public static void main(String[] args) throws Exception { // Provoke GC again and get the results // asserting that they are reasonable gcProvoker.provokeGc(); - JstatGcResults measurement3 = jstatGcTool.measure(); - measurement3.assertConsistency(); + JstatGcResults measurement3 = jstatGcTool.measureAndAssertConsistency(); // Assert the increase in GC events and time between the measurements JstatResults.assertGCEventsIncreased(measurement2, measurement3); JstatResults.assertGCTimeIncreased(measurement2, measurement3); - } - } diff --git a/test/hotspot/jtreg/serviceability/tmtools/jstat/GcTest02.java b/test/hotspot/jtreg/serviceability/tmtools/jstat/GcTest02.java index 0a3102625d65..c223a09ba452 100644 --- a/test/hotspot/jtreg/serviceability/tmtools/jstat/GcTest02.java +++ b/test/hotspot/jtreg/serviceability/tmtools/jstat/GcTest02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2025, 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 @@ -42,6 +42,6 @@ public class GcTest02 { public static void main(String[] args) throws Exception { - new GarbageProducerTest(new JstatGcTool(ProcessHandle.current().pid())).run(); + new GarbageProducerTest(new JstatGcCauseTool(ProcessHandle.current().pid())).run(); } } diff --git a/test/hotspot/jtreg/serviceability/tmtools/jstat/utils/JstatGcCapacityTool.java b/test/hotspot/jtreg/serviceability/tmtools/jstat/utils/JstatGcCapacityTool.java index 74cffa150ceb..0fb24bbd109d 100644 --- a/test/hotspot/jtreg/serviceability/tmtools/jstat/utils/JstatGcCapacityTool.java +++ b/test/hotspot/jtreg/serviceability/tmtools/jstat/utils/JstatGcCapacityTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2025, 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 @@ -28,10 +28,9 @@ * This tool executes "jstat -gccapacity " and returns the results as * JstatGcCapacityoolResults */ -public class JstatGcCapacityTool extends TmTool { +public class JstatGcCapacityTool extends JstatTool { public JstatGcCapacityTool(long pid) { super(JstatGcCapacityResults.class, "jstat", "-gccapacity " + pid); } - } diff --git a/test/hotspot/jtreg/serviceability/tmtools/jstat/utils/JstatGcCauseTool.java b/test/hotspot/jtreg/serviceability/tmtools/jstat/utils/JstatGcCauseTool.java index c0dd36d8abb2..65bea8d36bd7 100644 --- a/test/hotspot/jtreg/serviceability/tmtools/jstat/utils/JstatGcCauseTool.java +++ b/test/hotspot/jtreg/serviceability/tmtools/jstat/utils/JstatGcCauseTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2025, 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 @@ -28,10 +28,9 @@ * This tool executes "jstat -gc " and returns the results as * JstatGcToolResults */ -public class JstatGcCauseTool extends TmTool { +public class JstatGcCauseTool extends JstatTool { public JstatGcCauseTool(long pid) { super(JstatGcCauseResults.class, "jstat", "-gc " + pid); } - } diff --git a/test/hotspot/jtreg/serviceability/tmtools/jstat/utils/JstatGcNewTool.java b/test/hotspot/jtreg/serviceability/tmtools/jstat/utils/JstatGcNewTool.java index ed3f20a6c206..7bea437cb284 100644 --- a/test/hotspot/jtreg/serviceability/tmtools/jstat/utils/JstatGcNewTool.java +++ b/test/hotspot/jtreg/serviceability/tmtools/jstat/utils/JstatGcNewTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2025, 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 @@ -28,10 +28,9 @@ * This tool executes "jstat -gcnew " and returns the results as * JstatGcNewResults */ -public class JstatGcNewTool extends TmTool { +public class JstatGcNewTool extends JstatTool { public JstatGcNewTool(long pid) { super(JstatGcNewResults.class, "jstat", "-gcnew " + pid); } - } diff --git a/test/hotspot/jtreg/serviceability/tmtools/jstat/utils/JstatGcTool.java b/test/hotspot/jtreg/serviceability/tmtools/jstat/utils/JstatGcTool.java index e046768a46fe..f4f860389064 100644 --- a/test/hotspot/jtreg/serviceability/tmtools/jstat/utils/JstatGcTool.java +++ b/test/hotspot/jtreg/serviceability/tmtools/jstat/utils/JstatGcTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2025, 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 @@ -28,10 +28,9 @@ * This tool executes "jstat -gc " and returns the results as * JstatGcToolResults */ -public class JstatGcTool extends TmTool { +public class JstatGcTool extends JstatTool { public JstatGcTool(long pid) { super(JstatGcResults.class, "jstat", "-gc " + pid); } - } diff --git a/test/hotspot/jtreg/serviceability/tmtools/jstat/utils/JstatResults.java b/test/hotspot/jtreg/serviceability/tmtools/jstat/utils/JstatResults.java index 97368d89b3a2..01425d4c5b68 100644 --- a/test/hotspot/jtreg/serviceability/tmtools/jstat/utils/JstatResults.java +++ b/test/hotspot/jtreg/serviceability/tmtools/jstat/utils/JstatResults.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2025, 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 @@ -31,7 +31,7 @@ * Results of running the jstat tool Concrete subclasses will detail the jstat * tool options */ -abstract public class JstatResults extends ToolResults { +public abstract class JstatResults extends ToolResults { private static final float FLOAT_COMPARISON_TOLERANCE = 0.0011f; @@ -181,5 +181,5 @@ public static boolean checkFloatIsSum(float sum, float... floats) { return Math.abs(sum) <= FLOAT_COMPARISON_TOLERANCE; } - abstract public void assertConsistency(); + public abstract void assertConsistency(); } diff --git a/test/hotspot/jtreg/serviceability/tmtools/jstat/utils/JstatTool.java b/test/hotspot/jtreg/serviceability/tmtools/jstat/utils/JstatTool.java new file mode 100644 index 000000000000..404581b1ae7d --- /dev/null +++ b/test/hotspot/jtreg/serviceability/tmtools/jstat/utils/JstatTool.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2025, 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 utils; + +import common.TmTool; + +/** + * Common base class for Jstat tools. + */ +public class JstatTool extends TmTool { + + private static final int TRIES = 3; + + public JstatTool(Class resultsClz, String toolName, String otherArgs) { + super(resultsClz, toolName, otherArgs); + } + + /** + * Measure, and call assertConsistency() on the results, + * tolerating a set number of failures to account for inconsistencies in PerfData. + */ + public T measureAndAssertConsistency() throws Exception { + T results = null; + for (int i = 1; i <= TRIES; i++) { + try { + results = measure(); + results.assertConsistency(); + } catch (RuntimeException e) { + System.out.println("Attempt " + i + ": " + e); + if (i == TRIES) { + System.out.println("Too many failures."); + throw(e); + } + // Will retry. + } + } + return results; + } +} From bcf51f394761a0fdf51015a6437eacbc9da58032 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 22 Sep 2025 11:05:02 +0000 Subject: [PATCH 095/323] 8362532: Test gc/g1/plab/* duplicate command-line options Backport-of: 13bab09bffc411dde324599c2e15852ef4b53d55 --- .../gc/g1/plab/TestPLABEvacuationFailure.java | 1 - test/hotspot/jtreg/gc/g1/plab/lib/PLABUtils.java | 14 ++++++-------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/test/hotspot/jtreg/gc/g1/plab/TestPLABEvacuationFailure.java b/test/hotspot/jtreg/gc/g1/plab/TestPLABEvacuationFailure.java index bfa87d5c07b0..cec9c5ff7795 100644 --- a/test/hotspot/jtreg/gc/g1/plab/TestPLABEvacuationFailure.java +++ b/test/hotspot/jtreg/gc/g1/plab/TestPLABEvacuationFailure.java @@ -99,7 +99,6 @@ private static void runTest(int wastePct, int plabSize, int parGCThreads, int he // Set up test GC and PLAB options List testOptions = new ArrayList<>(); Collections.addAll(testOptions, COMMON_OPTIONS); - Collections.addAll(testOptions, Utils.getTestJavaOpts()); Collections.addAll(testOptions, "-XX:ParallelGCThreads=" + parGCThreads, "-XX:ParallelGCBufferWastePct=" + wastePct, diff --git a/test/hotspot/jtreg/gc/g1/plab/lib/PLABUtils.java b/test/hotspot/jtreg/gc/g1/plab/lib/PLABUtils.java index 0ae28ab9d559..387fc3407db7 100644 --- a/test/hotspot/jtreg/gc/g1/plab/lib/PLABUtils.java +++ b/test/hotspot/jtreg/gc/g1/plab/lib/PLABUtils.java @@ -73,14 +73,12 @@ public static List prepareOptions(List options) { if (options == null) { throw new IllegalArgumentException("Options cannot be null"); } - List executionOtions = new ArrayList<>( - Arrays.asList(Utils.getTestJavaOpts()) - ); - Collections.addAll(executionOtions, WB_DIAGNOSTIC_OPTIONS); - Collections.addAll(executionOtions, G1_PLAB_LOGGING_OPTIONS); - Collections.addAll(executionOtions, GC_TUNE_OPTIONS); - executionOtions.addAll(options); - return executionOtions; + List executionOptions = new ArrayList<>(); + Collections.addAll(executionOptions, WB_DIAGNOSTIC_OPTIONS); + Collections.addAll(executionOptions, G1_PLAB_LOGGING_OPTIONS); + Collections.addAll(executionOptions, GC_TUNE_OPTIONS); + executionOptions.addAll(options); + return executionOptions; } /** From d1f63af77a8a9950ab06330ac3746669658dfe76 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 22 Sep 2025 11:07:14 +0000 Subject: [PATCH 096/323] 8362602: Add test.timeout.factor to CompileFactory to avoid test timeouts Backport-of: f8c8bcf4fd31509fdb40d32e8e16ba4fba1f987d --- .../jtreg/compiler/lib/compile_framework/Compile.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/hotspot/jtreg/compiler/lib/compile_framework/Compile.java b/test/hotspot/jtreg/compiler/lib/compile_framework/Compile.java index 0f45d982af6d..b69258e4a18f 100644 --- a/test/hotspot/jtreg/compiler/lib/compile_framework/Compile.java +++ b/test/hotspot/jtreg/compiler/lib/compile_framework/Compile.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, 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 @@ -39,6 +39,7 @@ */ class Compile { private static final int COMPILE_TIMEOUT = 60; + private static final float timeoutFactor = Float.parseFloat(System.getProperty("test.timeout.factor", "1.0")); private static final String JAVA_PATH = JDKToolFinder.getJDKTool("java"); private static final String JAVAC_PATH = JDKToolFinder.getJDKTool("javac"); @@ -178,7 +179,8 @@ private static void executeCompileCommand(List command) { int exitCode; try { Process process = builder.start(); - boolean exited = process.waitFor(COMPILE_TIMEOUT, TimeUnit.SECONDS); + long timeout = COMPILE_TIMEOUT * (long)timeoutFactor; + boolean exited = process.waitFor(timeout, TimeUnit.SECONDS); if (!exited) { process.destroyForcibly(); System.out.println("Timeout: compile command: " + String.join(" ", command)); From c2ca7f6b28a37f25f307969d999ad90d3b043fa2 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 22 Sep 2025 11:09:34 +0000 Subject: [PATCH 097/323] 8358048: java/net/httpclient/HttpsTunnelAuthTest.java incorrectly calls Thread::stop Backport-of: d288ca28be7bfba3abe9f54cefbe53e73c25707e --- test/jdk/java/net/httpclient/HttpsTunnelAuthTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/jdk/java/net/httpclient/HttpsTunnelAuthTest.java b/test/jdk/java/net/httpclient/HttpsTunnelAuthTest.java index 83961453f05f..c6b2c323693e 100644 --- a/test/jdk/java/net/httpclient/HttpsTunnelAuthTest.java +++ b/test/jdk/java/net/httpclient/HttpsTunnelAuthTest.java @@ -37,12 +37,11 @@ import java.util.stream.Stream; import javax.net.ssl.SSLContext; import jdk.httpclient.test.lib.common.HttpServerAdapters; -import jdk.httpclient.test.lib.http2.Http2TestServer; import jdk.test.lib.net.SimpleSSLContext; import static java.lang.System.out; -/** +/* * @test * @bug 8262027 * @summary Verify that it's possible to handle proxy authentication manually @@ -62,7 +61,7 @@ //-Djdk.internal.httpclient.debug=true -Dtest.debug=true public class HttpsTunnelAuthTest implements HttpServerAdapters, AutoCloseable { - static final String data[] = { + static final String[] data = { "Lorem ipsum", "dolor sit amet", "consectetur adipiscing elit, sed do eiusmod tempor", @@ -150,7 +149,7 @@ void setUp() throws IOException { @Override public void close() throws Exception { - if (proxy != null) close(proxy::stop); + if (proxy != null) close(proxy); if (http1Server != null) close(http1Server::stop); if (https1Server != null) close(https1Server::stop); if (https2Server != null) close(https2Server::stop); @@ -160,7 +159,8 @@ private void close(AutoCloseable closeable) { try { closeable.close(); } catch (Exception x) { - // OK. + // OK to ignore and just log + System.err.println("ignoring failure during close() of " + closeable + " due to: " + x); } } From c59eb8d375fc1f57ae7701fd0806f8d57c90cf0c Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 22 Sep 2025 11:12:50 +0000 Subject: [PATCH 098/323] 8360408: [TEST] Use @requires tag instead of exiting based on "os.name" property value for sun/net/www/protocol/file/FileURLTest.java Backport-of: d4705947d89509b235cf48328014331c9c6cee80 --- test/jdk/sun/net/www/protocol/file/FileURLTest.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/test/jdk/sun/net/www/protocol/file/FileURLTest.java b/test/jdk/sun/net/www/protocol/file/FileURLTest.java index 135274a9504d..e111a538aca0 100644 --- a/test/jdk/sun/net/www/protocol/file/FileURLTest.java +++ b/test/jdk/sun/net/www/protocol/file/FileURLTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2025, 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 @@ -25,6 +25,7 @@ * @test * @bug 4474391 * @summary url: file:///D|/Projects/tmp/test.html: urlConnection.getInputStream() broken. + * @requires os.family == "windows" */ import java.io.*; import java.net.*; @@ -33,10 +34,7 @@ public class FileURLTest { public static void main(String [] args) { - String name = System.getProperty("os.name"); - if (name.startsWith("Windows")) { String urlStr = "file:///C|/nonexisted.txt"; - try { URL url = new URL(urlStr); URLConnection urlConnection = url.openConnection(); @@ -49,6 +47,5 @@ public static void main(String [] args) throw new RuntimeException("Can't handle '|' in place of ':' in file urls"); } } - } } } From 39945162b4f52c34d5d737831caf09aaa05c61eb Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 22 Sep 2025 11:15:38 +0000 Subject: [PATCH 099/323] 8361298: SwingUtilities/bug4967768.java fails where character P is not underline Backport-of: 57553ca1dbc63e329116bc11764816a4c5ccb297 --- test/jdk/javax/swing/SwingUtilities/bug4967768.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/test/jdk/javax/swing/SwingUtilities/bug4967768.java b/test/jdk/javax/swing/SwingUtilities/bug4967768.java index 43f9f7cabfbe..6ce1f5c787bd 100644 --- a/test/jdk/javax/swing/SwingUtilities/bug4967768.java +++ b/test/jdk/javax/swing/SwingUtilities/bug4967768.java @@ -37,13 +37,19 @@ public class bug4967768 { private static final String INSTRUCTIONS = """ - When the test starts you'll see a button "Oops" - with the "p" letter underlined at the bottom - of the instruction frame. + When the test starts you'll see a button "Oops". + + For Windows and GTK Look and Feel, you will need to + press the ALT key to make the mnemonic visible. + Once the ALT key is pressed, the letter "p" will be + underlined at the bottom of the instruction frame. Ensure the underline cuts through the descender of letter "p", i.e. the underline is painted not below the letter but below the baseline. + + Press Pass if you see the expected behaviour else + press Fail. """; public static void main(String[] args) throws Exception { From 5cf7e9928b671d7089f2d34495f32bea3b9de6f4 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 22 Sep 2025 11:18:13 +0000 Subject: [PATCH 100/323] 8365168: Use 64-bit aligned addresses for CK_ULONG access in PKCS11 native key code Backport-of: 640b71da48c41e1f216f6bee1e7871961322cf53 --- .../share/native/libj2pkcs11/p11_convert.c | 3 +- .../share/native/libj2pkcs11/p11_keymgmt.c | 103 ++++++++++-------- 2 files changed, 57 insertions(+), 49 deletions(-) diff --git a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_convert.c b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_convert.c index 986ef9799c45..bd94282e34d4 100644 --- a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_convert.c +++ b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_convert.c @@ -1317,8 +1317,7 @@ jobject ckAttributeValueToJObject(JNIEnv *env, const CK_ATTRIBUTE_PTR ckpAttribu case CKA_OWNER: case CKA_AC_ISSUER: case CKA_ATTR_TYPES: - case CKA_ECDSA_PARAMS: - /* CKA_EC_PARAMS is the same, these two are equivalent */ + case CKA_EC_PARAMS: case CKA_EC_POINT: case CKA_PRIVATE_EXPONENT: case CKA_PRIME_1: diff --git a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_keymgmt.c b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_keymgmt.c index 08257d05b1b2..d52fd4a6e0fa 100644 --- a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_keymgmt.c +++ b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_keymgmt.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved. */ /* Copyright (c) 2002 Graz University of Technology. All rights reserved. @@ -56,69 +56,78 @@ #ifdef P11_ENABLE_GETNATIVEKEYINFO -#define CK_ATTRIBUTES_TEMPLATE_LENGTH (CK_ULONG)61U +#define CK_ATTRIBUTES_TEMPLATE_LENGTH (CK_ULONG)60U +// Group attributes based on their value types; put attributes whose values +// requiring address alignments, e.g. CK_ULONG, first static CK_ATTRIBUTE ckpAttributesTemplate[CK_ATTRIBUTES_TEMPLATE_LENGTH] = { - {CKA_CLASS, 0, 0}, - {CKA_TOKEN, 0, 0}, - {CKA_PRIVATE, 0, 0}, - {CKA_LABEL, 0, 0}, - {CKA_APPLICATION, 0, 0}, - {CKA_VALUE, 0, 0}, - {CKA_OBJECT_ID, 0, 0}, + // CK_ULONG {CKA_CERTIFICATE_TYPE, 0, 0}, - {CKA_ISSUER, 0, 0}, - {CKA_SERIAL_NUMBER, 0, 0}, - {CKA_AC_ISSUER, 0, 0}, - {CKA_OWNER, 0, 0}, - {CKA_ATTR_TYPES, 0, 0}, - {CKA_TRUSTED, 0, 0}, + {CKA_CLASS, 0, 0}, + {CKA_HW_FEATURE_TYPE, 0, 0}, + {CKA_KEY_GEN_MECHANISM, 0, 0}, {CKA_KEY_TYPE, 0, 0}, - {CKA_SUBJECT, 0, 0}, - {CKA_ID, 0, 0}, - {CKA_SENSITIVE, 0, 0}, - {CKA_ENCRYPT, 0, 0}, - {CKA_DECRYPT, 0, 0}, - {CKA_WRAP, 0, 0}, - {CKA_UNWRAP, 0, 0}, - {CKA_SIGN, 0, 0}, - {CKA_SIGN_RECOVER, 0, 0}, - {CKA_VERIFY, 0, 0}, - {CKA_VERIFY_RECOVER, 0, 0}, - {CKA_DERIVE, 0, 0}, - {CKA_START_DATE, 0, 0}, - {CKA_END_DATE, 0, 0}, - {CKA_MODULUS, 0, 0}, {CKA_MODULUS_BITS, 0, 0}, - {CKA_PUBLIC_EXPONENT, 0, 0}, - {CKA_PRIVATE_EXPONENT, 0, 0}, - {CKA_PRIME_1, 0, 0}, - {CKA_PRIME_2, 0, 0}, - {CKA_EXPONENT_1, 0, 0}, - {CKA_EXPONENT_2, 0, 0}, - {CKA_COEFFICIENT, 0, 0}, - {CKA_PRIME, 0, 0}, - {CKA_SUBPRIME, 0, 0}, - {CKA_BASE, 0, 0}, {CKA_PRIME_BITS, 0, 0}, {CKA_SUB_PRIME_BITS, 0, 0}, {CKA_VALUE_BITS, 0, 0}, {CKA_VALUE_LEN, 0, 0}, + // CK_BBOOL + {CKA_ALWAYS_SENSITIVE, 0, 0}, + {CKA_DECRYPT, 0, 0}, + {CKA_DERIVE, 0, 0}, + {CKA_ENCRYPT, 0, 0}, {CKA_EXTRACTABLE, 0, 0}, + {CKA_HAS_RESET, 0, 0}, {CKA_LOCAL, 0, 0}, - {CKA_NEVER_EXTRACTABLE, 0, 0}, - {CKA_ALWAYS_SENSITIVE, 0, 0}, - {CKA_KEY_GEN_MECHANISM, 0, 0}, {CKA_MODIFIABLE, 0, 0}, - {CKA_ECDSA_PARAMS, 0, 0}, + {CKA_NEVER_EXTRACTABLE, 0, 0}, + {CKA_PRIVATE, 0, 0}, + {CKA_RESET_ON_INIT, 0, 0}, + {CKA_SENSITIVE, 0, 0}, + {CKA_SIGN, 0, 0}, + {CKA_SIGN_RECOVER, 0, 0}, + {CKA_TOKEN, 0, 0}, + {CKA_TRUSTED, 0, 0}, + {CKA_UNWRAP, 0, 0}, + {CKA_VERIFY, 0, 0}, + {CKA_VERIFY_RECOVER, 0, 0}, + {CKA_WRAP, 0, 0}, + // PTR: byte[] + {CKA_AC_ISSUER, 0, 0}, + {CKA_ATTR_TYPES, 0, 0}, + {CKA_BASE, 0, 0}, + {CKA_COEFFICIENT, 0, 0}, {CKA_EC_PARAMS, 0, 0}, {CKA_EC_POINT, 0, 0}, + {CKA_EXPONENT_1, 0, 0}, + {CKA_EXPONENT_2, 0, 0}, + {CKA_ID, 0, 0}, + {CKA_ISSUER, 0, 0}, + {CKA_MODULUS, 0, 0}, + {CKA_OBJECT_ID, 0, 0}, + {CKA_OWNER, 0, 0}, + {CKA_PRIME, 0, 0}, + {CKA_PRIME_1, 0, 0}, + {CKA_PRIME_2, 0, 0}, + {CKA_PRIVATE_EXPONENT, 0, 0}, + {CKA_PUBLIC_EXPONENT, 0, 0}, + {CKA_SERIAL_NUMBER, 0, 0}, + {CKA_SUBJECT, 0, 0}, + {CKA_SUBPRIME, 0, 0}, + {CKA_VALUE, 0, 0}, + // PTR: CK_UTF8CHAR[] + {CKA_APPLICATION, 0, 0}, + {CKA_LABEL, 0, 0}, + // PTR: CK_DATE + {CKA_START_DATE, 0, 0}, + {CKA_END_DATE, 0, 0}, + // deprecated {CKA_SECONDARY_AUTH, 0, 0}, {CKA_AUTH_PIN_FLAGS, 0, 0}, - {CKA_HW_FEATURE_TYPE, 0, 0}, - {CKA_RESET_ON_INIT, 0, 0}, - {CKA_HAS_RESET, 0, 0}, + // misc {CKA_VENDOR_DEFINED, 0, 0}, + // keep this at the end to match the impl in getNativeKeyInfo(...) {CKA_NETSCAPE_DB, 0, 0}, }; From 50a09ccfc463acfe8cb97501c136a85e90a87bcb Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Mon, 22 Sep 2025 16:30:59 +0000 Subject: [PATCH 101/323] 8353445: Open source several AWT Menu tests - Batch 1 Backport-of: 367bcc5df83722231106b635068a17f92404477b --- test/jdk/ProblemList.txt | 1 + .../java/awt/Menu/MenuActionEventTest.java | 98 +++++++++++ .../jdk/java/awt/Menu/MenuVisibilityTest.java | 71 ++++++++ test/jdk/java/awt/Menu/RmInHideTest.java | 152 ++++++++++++++++++ test/jdk/java/awt/Menu/SetShortCutTest.java | 132 +++++++++++++++ 5 files changed, 454 insertions(+) create mode 100644 test/jdk/java/awt/Menu/MenuActionEventTest.java create mode 100644 test/jdk/java/awt/Menu/MenuVisibilityTest.java create mode 100644 test/jdk/java/awt/Menu/RmInHideTest.java create mode 100644 test/jdk/java/awt/Menu/SetShortCutTest.java diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index 3cbeafbb062a..2f7c2c7190f3 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -841,3 +841,4 @@ java/awt/Checkbox/CheckboxIndicatorSizeTest.java 8340870 windows-all java/awt/Checkbox/CheckboxNullLabelTest.java 8340870 windows-all java/awt/dnd/WinMoveFileToShellTest.java 8341665 windows-all java/awt/Focus/MinimizeNonfocusableWindowTest.java 8024487 windows-all +java/awt/Menu/MenuVisibilityTest.java 8161110 macosx-all diff --git a/test/jdk/java/awt/Menu/MenuActionEventTest.java b/test/jdk/java/awt/Menu/MenuActionEventTest.java new file mode 100644 index 000000000000..70fcc81ac864 --- /dev/null +++ b/test/jdk/java/awt/Menu/MenuActionEventTest.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2000, 2025, 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 4094620 + * @summary MenuItem.enableEvents does not work + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual MenuActionEventTest + */ + +import java.awt.AWTEvent; +import java.awt.BorderLayout; +import java.awt.Frame; +import java.awt.Menu; +import java.awt.MenuBar; +import java.awt.MenuItem; +import java.awt.event.ActionEvent; + +public class MenuActionEventTest { + public static void main(String[] args) throws Exception { + String INSTRUCTIONS = """ + 1. Click on the Menu and then on Menuitem on the frame. + 2. If you find the following message being printed in + the test log area:, + _MenuItem: action event", + click PASS, else click FAIL" + """; + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(35) + .testUI(MenuActionEventTest::initialize) + .logArea() + .build() + .awaitAndCheck(); + } + + static Frame initialize() { + Frame f = new Frame("Menu Action Event Test"); + f.setLayout(new BorderLayout()); + f.setMenuBar(new MenuBar()); + Menu m = new _Menu("Menu"); + MenuBar mb = f.getMenuBar(); + mb.add(m); + MenuItem mi = new _MenuItem("Menuitem"); + m.add(mi); + f.setBounds(204, 152, 396, 300); + return f; + } + + static class _Menu extends Menu { + public _Menu(String text) { + super(text); + enableEvents(AWTEvent.ACTION_EVENT_MASK); + } + + @Override + protected void processActionEvent(ActionEvent e) { + PassFailJFrame.log("_Menu: action event"); + super.processActionEvent(e); + } + } + + static class _MenuItem extends MenuItem { + public _MenuItem(String text) { + super(text); + enableEvents(AWTEvent.ACTION_EVENT_MASK); + } + + @Override + protected void processActionEvent(ActionEvent e) { + PassFailJFrame.log("_MenuItem: action event"); + super.processActionEvent(e); + } + } + +} diff --git a/test/jdk/java/awt/Menu/MenuVisibilityTest.java b/test/jdk/java/awt/Menu/MenuVisibilityTest.java new file mode 100644 index 000000000000..cb74cd56e1a1 --- /dev/null +++ b/test/jdk/java/awt/Menu/MenuVisibilityTest.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2004, 2025, 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 5046491 6423258 + * @summary CheckboxMenuItem: menu text is missing from test frame + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual MenuVisibilityTest +*/ + +import java.awt.Frame; +import java.awt.Menu; +import java.awt.MenuBar; +import java.awt.MenuItem; + +public class MenuVisibilityTest { + public static void main(String[] args) throws Exception { + String INSTRUCTIONS = """ + 1. Press on a MenuBar with a long name. + 2. Select "First item" in an opened menu. + If you see that "First menu item was pressed" in + the test log area, press PASS + Otherwise press FAIL" + """; + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(35) + .testUI(MenuVisibilityTest::initialize) + .logArea() + .build() + .awaitAndCheck(); + } + + public static Frame initialize() { + Frame frame = new Frame("Menu visibility test"); + String menuTitle = "I_have_never_seen_so_long_Menu_Title_" + + "!_ehe-eha-ehu-ehi_ugu-gu!!!_;)_BANG_BANG..."; + MenuBar menubar = new MenuBar(); + Menu menu = new Menu(menuTitle); + MenuItem menuItem = new MenuItem("First item"); + menuItem.addActionListener(e -> + PassFailJFrame.log("First menu item was pressed.")); + menu.add(menuItem); + menubar.add(menu); + frame.setMenuBar(menubar); + frame.setSize(100, 200); + return frame; + } +} diff --git a/test/jdk/java/awt/Menu/RmInHideTest.java b/test/jdk/java/awt/Menu/RmInHideTest.java new file mode 100644 index 000000000000..b2d684006474 --- /dev/null +++ b/test/jdk/java/awt/Menu/RmInHideTest.java @@ -0,0 +1,152 @@ +/* + * Copyright (c) 1998, 2025, 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 4039387 + * @summary Checks that calling Frame.remove() within hide() doesn't + * cause SEGV + * @key headful + * @run main RmInHideTest + */ + +import java.awt.Button; +import java.awt.Dimension; +import java.awt.EventQueue; +import java.awt.Frame; +import java.awt.Menu; +import java.awt.MenuBar; +import java.awt.MenuItem; +import java.awt.Point; +import java.awt.Robot; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; + +public class RmInHideTest { + static volatile Point point; + static RmInHideTestFrame frame; + static volatile Dimension dimension; + + public static void main(String[] args) throws Exception { + Robot robot = new Robot(); + try { + EventQueue.invokeAndWait(() -> { + frame = new RmInHideTestFrame(); + frame.setSize(200, 200); + frame.setVisible(true); + }); + robot.waitForIdle(); + robot.delay(1000); + EventQueue.invokeAndWait(() -> { + point = frame.getButtonLocation(); + dimension = frame.getButtonDimension(); + }); + robot.mouseMove(point.x + dimension.width / 2, point.y + dimension.height / 2); + robot.mousePress(MouseEvent.BUTTON2_DOWN_MASK); + robot.mouseRelease(MouseEvent.BUTTON2_DOWN_MASK); + robot.waitForIdle(); + robot.delay(100); + System.out.println("Test pass"); + } finally { + EventQueue.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + } + + static class RmInHideTestFrame extends Frame implements ActionListener { + MenuBar menubar = null; + Button b; + + public RmInHideTestFrame() { + super("RmInHideTest"); + b = new Button("Hide"); + b.setActionCommand("hide"); + b.addActionListener(this); + add("Center", b); + + MenuBar bar = new MenuBar(); + + Menu menu = new Menu("Test1", true); + menu.add(new MenuItem("Test1A")); + menu.add(new MenuItem("Test1B")); + menu.add(new MenuItem("Test1C")); + bar.add(menu); + + menu = new Menu("Test2", true); + menu.add(new MenuItem("Test2A")); + menu.add(new MenuItem("Test2B")); + menu.add(new MenuItem("Test2C")); + bar.add(menu); + setMenuBar(bar); + } + + @Override + public Dimension minimumSize() { + return new Dimension(200, 200); + } + + @Override + public void actionPerformed(ActionEvent e) { + String cmd = e.getActionCommand(); + if (cmd.equals("hide")) { + hide(); + try { + Thread.currentThread().sleep(2000); + } catch (InterruptedException ex) { + // do nothing + } + show(); + } + } + + @Override + public void hide() { + menubar = getMenuBar(); + if (menubar != null) { + remove(menubar); + } + super.hide(); + } + + + @Override + public void show() { + if (menubar != null) { + setMenuBar(menubar); + } + super.show(); + } + + public Point getButtonLocation() { + return b.getLocationOnScreen(); + } + + public Dimension getButtonDimension() { + return b.getSize(); + } + } +} diff --git a/test/jdk/java/awt/Menu/SetShortCutTest.java b/test/jdk/java/awt/Menu/SetShortCutTest.java new file mode 100644 index 000000000000..b60b83dff9a9 --- /dev/null +++ b/test/jdk/java/awt/Menu/SetShortCutTest.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 1999, 2025, 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 4203208 + * @summary setShortcut method does not display proper text on Menu component + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual SetShortCutTest + */ + +import java.awt.Frame; +import java.awt.Menu; +import java.awt.MenuBar; +import java.awt.MenuItem; +import java.awt.MenuShortcut; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; + +import static java.awt.event.KeyEvent.VK_META; +import static java.awt.event.KeyEvent.VK_SHIFT; + +public class SetShortCutTest { + public static void main(String[] args) throws Exception { + boolean isMac = System.getProperty("os.name").startsWith("Mac"); + String shortcut = "Ctrl+Shift+"; + if (isMac) { + shortcut = KeyEvent.getKeyText(VK_SHIFT) + "+" + KeyEvent.getKeyText(VK_META); + } + + String INSTRUCTIONS = """ + 1. Select menuitem 'Stuff -> Second' once to remove 'File -> First'. + 2. Select menuitem 'Stuff -> Second' again to add 'File -> First'. + 3. If menuitem 'File -> First' reads First """ + shortcut + """ + 'C', press PASS. Otherwise press FAIL. + """; + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(35) + .testUI(SetShortCutTest::initialize) + .build() + .awaitAndCheck(); + } + + static Frame initialize() { + return new TestMenuShortCut(); + } + + static class TestMenuShortCut extends Frame implements ActionListener { + Menu menu1; + MenuItem item1; + MenuItem item2; + boolean beenHere; + + public TestMenuShortCut() { + setTitle("Set ShortCut test"); + beenHere = false; + MenuBar mTopMenu = buildMenu(); + setSize(300, 300); + this.setMenuBar(mTopMenu); + } + + public MenuBar buildMenu() { + MenuBar bar; + bar = new MenuBar(); + menu1 = new Menu("File"); + item1 = new MenuItem("First"); + menu1.add(item1); + item1.setShortcut(new MenuShortcut(KeyEvent.VK_C, true)); + bar.add(menu1); + + // Stuff menu + item2 = new MenuItem("Second"); + Menu menu2 = new Menu("Stuff"); + menu2.add(item2); + item2.setShortcut(new MenuShortcut(KeyEvent.VK_C, false)); + bar.add(menu2); + + item1.addActionListener(this); + item2.addActionListener(this); + return bar; + } + + @Override + public void actionPerformed(ActionEvent event) { + if (event.getSource() == item1) { + Frame temp = new Frame("Accelerator key is working for 'First'"); + temp.setSize(300, 50); + temp.setVisible(true); + } + + // Click on the "Stuff" menu to remove the "first" menu item + else if (event.getSource() == item2) { + // If the item has not been removed from the menu, + // then remove "First" from the "File" menu + if (beenHere == false) { + item1.removeActionListener(this); + menu1.remove(item1); + beenHere = true; + } else { + item1 = new MenuItem("First"); + menu1.add(item1); + item1.addActionListener(this); + item1.setShortcut(new MenuShortcut(KeyEvent.VK_C, true)); + beenHere = false; + } + } + } + } +} From c18ccbcf35832e8da41ff20a0b14b797242246dd Mon Sep 17 00:00:00 2001 From: Sergey Bylokhov Date: Mon, 22 Sep 2025 19:42:33 +0000 Subject: [PATCH 102/323] 8367131: Test com/sun/jdi/ThreadMemoryLeakTest.java fails on 32 bits Backport-of: fdc11a1569248c9b671b66d547b4616aeb953ecf --- test/jdk/com/sun/jdi/ThreadMemoryLeakTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/jdk/com/sun/jdi/ThreadMemoryLeakTest.java b/test/jdk/com/sun/jdi/ThreadMemoryLeakTest.java index ef44829f1f71..8ab3589ef7db 100644 --- a/test/jdk/com/sun/jdi/ThreadMemoryLeakTest.java +++ b/test/jdk/com/sun/jdi/ThreadMemoryLeakTest.java @@ -28,7 +28,7 @@ * * @comment Don't allow -Xcomp or -Xint as they impact memory useage and number of iterations. * Require compressed oops because not doing so increases memory usage. - * @requires (vm.compMode == "Xmixed") & vm.opt.final.UseCompressedOops + * @requires (vm.compMode == "Xmixed") & (vm.bits == 32 | vm.opt.final.UseCompressedOops) * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g ThreadMemoryLeakTest.java * @comment run with -Xmx7m so any leak will quickly produce OOME From 3807cfd754a139cb87eeb4d726a57c26eb5617aa Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Tue, 23 Sep 2025 01:38:06 +0000 Subject: [PATCH 103/323] 8334756: javac crashed on call to non-existent generic method with explicit annotated type arg Backport-of: abcd23f4d65698f47fd79a95aed197a12edf2784 --- .../sun/tools/javac/code/TypeAnnotations.java | 6 ++++- .../CrashOnNonExistingMethodTest.java | 22 +++++++++++++++++++ .../CrashOnNonExistingMethodTest.out | 2 ++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 test/langtools/tools/javac/annotations/typeAnnotations/CrashOnNonExistingMethodTest.java create mode 100644 test/langtools/tools/javac/annotations/typeAnnotations/CrashOnNonExistingMethodTest.out diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/TypeAnnotations.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/TypeAnnotations.java index 0e5738442323..e7e7dc084a7a 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/TypeAnnotations.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/TypeAnnotations.java @@ -1018,7 +1018,11 @@ private Attribute.TypeCompound toTypeCompound(Attribute.Compound a, TypeAnnotati if (!invocation.typeargs.contains(tree)) { return TypeAnnotationPosition.unknown; } - MethodSymbol exsym = (MethodSymbol) TreeInfo.symbol(invocation.getMethodSelect()); + Symbol exsym = TreeInfo.symbol(invocation.getMethodSelect()); + if (exsym.type.isErroneous()) { + // bail out, don't deal with erroneous types which would be reported anyways + return TypeAnnotationPosition.unknown; + } final int type_index = invocation.typeargs.indexOf(tree); if (exsym == null) { throw new AssertionError("could not determine symbol for {" + invocation + "}"); diff --git a/test/langtools/tools/javac/annotations/typeAnnotations/CrashOnNonExistingMethodTest.java b/test/langtools/tools/javac/annotations/typeAnnotations/CrashOnNonExistingMethodTest.java new file mode 100644 index 000000000000..da2174640d98 --- /dev/null +++ b/test/langtools/tools/javac/annotations/typeAnnotations/CrashOnNonExistingMethodTest.java @@ -0,0 +1,22 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8334756 + * @summary javac crashes on call to non-existent generic method with explicit annotated type arg + * @compile/fail/ref=CrashOnNonExistingMethodTest.out -XDrawDiagnostics -XDdev CrashOnNonExistingMethodTest.java + */ + +import static java.lang.annotation.ElementType.TYPE_USE; +import java.lang.annotation.Target; + +class CrashOnNonExistingMethodTest { + @Target(TYPE_USE) + @interface Nullable {} + + static T identity(T t) { + return t; + } + + static void test() { + CrashOnNonExistingMethodTest.<@Nullable Object>nonNullIdentity(null); + } +} diff --git a/test/langtools/tools/javac/annotations/typeAnnotations/CrashOnNonExistingMethodTest.out b/test/langtools/tools/javac/annotations/typeAnnotations/CrashOnNonExistingMethodTest.out new file mode 100644 index 000000000000..376c06c93b03 --- /dev/null +++ b/test/langtools/tools/javac/annotations/typeAnnotations/CrashOnNonExistingMethodTest.out @@ -0,0 +1,2 @@ +CrashOnNonExistingMethodTest.java:20:37: compiler.err.cant.resolve.location.args.params: kindname.method, nonNullIdentity, java.lang.Object, compiler.misc.type.null, (compiler.misc.location: kindname.class, CrashOnNonExistingMethodTest, null) +1 error From c66bc850f8f8ea8276a9ba5c21ac4cac94599064 Mon Sep 17 00:00:00 2001 From: Matthias Baesken Date: Tue, 23 Sep 2025 07:29:48 +0000 Subject: [PATCH 104/323] 8364199: Enhance list of environment variables printed in hserr/hsinfo file Backport-of: 812bd8e94d22f9751651e28a2ef8affdf6a33220 --- src/hotspot/share/utilities/vmError.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/hotspot/share/utilities/vmError.cpp b/src/hotspot/share/utilities/vmError.cpp index 0a91f43b16fb..9246de65a179 100644 --- a/src/hotspot/share/utilities/vmError.cpp +++ b/src/hotspot/share/utilities/vmError.cpp @@ -122,12 +122,13 @@ const intptr_t VMError::segfault_address = pd_segfault_address; static const char* env_list[] = { // All platforms "JAVA_HOME", "JAVA_TOOL_OPTIONS", "_JAVA_OPTIONS", "CLASSPATH", - "PATH", "USERNAME", + "JDK_AOT_VM_OPTIONS", + "JAVA_OPTS", "PATH", "USERNAME", "XDG_CACHE_HOME", "XDG_CONFIG_HOME", "FC_LANG", "FONTCONFIG_USE_MMAP", // Env variables that are defined on Linux/BSD - "LD_LIBRARY_PATH", "LD_PRELOAD", "SHELL", "DISPLAY", + "LD_LIBRARY_PATH", "LD_PRELOAD", "SHELL", "DISPLAY", "WAYLAND_DISPLAY", "HOSTTYPE", "OSTYPE", "ARCH", "MACHTYPE", "LANG", "LC_ALL", "LC_CTYPE", "LC_NUMERIC", "LC_TIME", "TERM", "TMPDIR", "TZ", From 1fa48036b7b7e0abef7f805af2c8fd2cf4bb5e69 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Tue, 23 Sep 2025 07:44:18 +0000 Subject: [PATCH 105/323] 8139228: JFileChooser renders file names as HTML document Backport-of: 917c1546f353c2814de8465d1dfad66b01561f12 --- .../com/apple/laf/AquaFileChooserUI.java | 6 + .../swing/plaf/motif/MotifFileChooserUI.java | 6 + .../classes/javax/swing/JFileChooser.java | 1 + .../swing/plaf/metal/MetalFileChooserUI.java | 2 + .../share/classes/sun/swing/FilePane.java | 4 + .../plaf/synth/SynthFileChooserUIImpl.java | 2 + .../plaf/windows/WindowsFileChooserUI.java | 2 + .../swing/JFileChooser/HTMLFileName.java | 166 ++++++++++++++++++ 8 files changed, 189 insertions(+) create mode 100644 test/jdk/javax/swing/JFileChooser/HTMLFileName.java diff --git a/src/java.desktop/macosx/classes/com/apple/laf/AquaFileChooserUI.java b/src/java.desktop/macosx/classes/com/apple/laf/AquaFileChooserUI.java index 91fb2bb83331..1809511d7928 100644 --- a/src/java.desktop/macosx/classes/com/apple/laf/AquaFileChooserUI.java +++ b/src/java.desktop/macosx/classes/com/apple/laf/AquaFileChooserUI.java @@ -1188,6 +1188,9 @@ public Component getTableCellRendererComponent(final JTable list, setText(fc.getName(file)); setIcon(fc.getIcon(file)); setEnabled(isSelectableInList(file)); + + putClientProperty("html.disable", getFileChooser().getClientProperty("html.disable")); + return this; } } @@ -1253,6 +1256,9 @@ public Component getListCellRendererComponent(final JList list, final JFileChooser chooser = getFileChooser(); setText(chooser.getName(directory)); setIcon(chooser.getIcon(directory)); + + putClientProperty("html.disable", getFileChooser().getClientProperty("html.disable")); + return this; } }; diff --git a/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifFileChooserUI.java b/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifFileChooserUI.java index 847fbf4117d4..42a0cf7d3619 100644 --- a/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifFileChooserUI.java +++ b/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifFileChooserUI.java @@ -664,6 +664,9 @@ public Component getListCellRendererComponent(JList list, Object value, int i super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); setText(getFileChooser().getName((File) value)); setInheritsPopupMenu(true); + + putClientProperty("html.disable", getFileChooser().getClientProperty("html.disable")); + return this; } } @@ -676,6 +679,9 @@ public Component getListCellRendererComponent(JList list, Object value, int i super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); setText(getFileChooser().getName((File) value)); setInheritsPopupMenu(true); + + putClientProperty("html.disable", getFileChooser().getClientProperty("html.disable")); + return this; } } diff --git a/src/java.desktop/share/classes/javax/swing/JFileChooser.java b/src/java.desktop/share/classes/javax/swing/JFileChooser.java index 069bbb5d5365..c60deadc4138 100644 --- a/src/java.desktop/share/classes/javax/swing/JFileChooser.java +++ b/src/java.desktop/share/classes/javax/swing/JFileChooser.java @@ -399,6 +399,7 @@ protected void setup(FileSystemView view) { setFileFilter(getAcceptAllFileFilter()); } enableEvents(AWTEvent.MOUSE_EVENT_MASK); + putClientProperty("html.disable", true); } private void installHierarchyListener() { diff --git a/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java b/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java index 3edd9708a509..b4abcf3c1993 100644 --- a/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java +++ b/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java @@ -951,6 +951,8 @@ public Component getListCellRendererComponent(JList list, Object value, ii.depth = directoryComboBoxModel.getDepth(index); setIcon(ii); + putClientProperty("html.disable", getFileChooser().getClientProperty("html.disable")); + return this; } } diff --git a/src/java.desktop/share/classes/sun/swing/FilePane.java b/src/java.desktop/share/classes/sun/swing/FilePane.java index 978d8ddb11a6..02d0bbea6ac9 100644 --- a/src/java.desktop/share/classes/sun/swing/FilePane.java +++ b/src/java.desktop/share/classes/sun/swing/FilePane.java @@ -1236,6 +1236,8 @@ public Component getTableCellRendererComponent(JTable table, Object value, setText(text); + putClientProperty("html.disable", getFileChooser().getClientProperty("html.disable")); + return this; } @@ -1634,6 +1636,8 @@ public Component getListCellRendererComponent(JList list, Object value, } } + putClientProperty("html.disable", getFileChooser().getClientProperty("html.disable")); + return this; } } diff --git a/src/java.desktop/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java b/src/java.desktop/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java index 30b8ea05b2d0..8e1e845718a2 100644 --- a/src/java.desktop/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java +++ b/src/java.desktop/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java @@ -690,6 +690,8 @@ public Component getListCellRendererComponent(JList list, File v ii.depth = directoryComboBoxModel.getDepth(index); label.setIcon(ii); + label.putClientProperty("html.disable", getFileChooser().getClientProperty("html.disable")); + return label; } } diff --git a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java index 92980c52a009..242d2843a20f 100644 --- a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java +++ b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java @@ -1049,6 +1049,8 @@ public Component getListCellRendererComponent(JList list, Object value, ii.depth = directoryComboBoxModel.getDepth(index); setIcon(ii); + putClientProperty("html.disable", getFileChooser().getClientProperty("html.disable")); + return this; } } diff --git a/test/jdk/javax/swing/JFileChooser/HTMLFileName.java b/test/jdk/javax/swing/JFileChooser/HTMLFileName.java new file mode 100644 index 000000000000..8783c3889852 --- /dev/null +++ b/test/jdk/javax/swing/JFileChooser/HTMLFileName.java @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2025, 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.io.File; +import java.util.List; +import javax.swing.Icon; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.filechooser.FileSystemView; + +/* + * @test id=metal + * @bug 8139228 + * @summary JFileChooser should not render Directory names in HTML format + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual HTMLFileName metal + */ + +/* + * @test id=system + * @bug 8139228 + * @summary JFileChooser should not render Directory names in HTML format + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual HTMLFileName system + */ + +public class HTMLFileName { + private static final String INSTRUCTIONS = """ + +
        +
      1. FileChooser shows up a virtual directory and file with name +

        Swing Rocks!. +
      2. On "HTML disabled" frame : +
          +
        1. Verify that the folder and file name must be plain text. +
        2. If the name in file pane window and also in directory + ComboBox remains in plain text, then press Pass. + If it appears to be in HTML format with Pink color as + shown, then press Fail. +
        + +
      3. On "HTML enabled" frame : +
          +
        1. Verify that the folder and file name remains in HTML + format with name "Swing Rocks!" pink in color as shown. +
        2. If the name in file pane window and also in directory + ComboBox remains in HTML format string, then press Pass. + If it appears to be in plain text, then press Fail. +
        +
      + + """; + + public static void main(String[] args) throws Exception { + if (args.length < 1) { + throw new IllegalArgumentException("Look-and-Feel keyword is required"); + } + + final String lafClassName; + switch (args[0]) { + case "metal" -> lafClassName = UIManager.getCrossPlatformLookAndFeelClassName(); + case "system" -> lafClassName = UIManager.getSystemLookAndFeelClassName(); + default -> throw new IllegalArgumentException("Unsupported Look-and-Feel keyword: " + args[0]); + } + + SwingUtilities.invokeAndWait(() -> { + try { + UIManager.setLookAndFeel(lafClassName); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + + System.out.println("Test for LookAndFeel " + lafClassName); + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(45) + .testUI(HTMLFileName::initialize) + .positionTestUIBottomRowCentered() + .build() + .awaitAndCheck(); + System.out.println("Test passed for LookAndFeel " + lafClassName); + } + + private static List initialize() { + return List.of(createFileChooser(true), createFileChooser(false)); + } + + private static JFrame createFileChooser(boolean htmlEnabled) { + JFileChooser jfc = new JFileChooser(new VirtualFileSystemView()); + jfc.putClientProperty("html.disable", htmlEnabled); + jfc.setControlButtonsAreShown(false); + + JFrame frame = new JFrame((htmlEnabled) ? "HTML enabled" : "HTML disabled"); + frame.add(jfc); + frame.pack(); + return frame; + } + + private static class VirtualFileSystemView extends FileSystemView { + @Override + public File createNewFolder(File containingDir) { + return null; + } + + @Override + public File[] getRoots() { + return new File[]{ + new File("/", "

      Swing Rocks!"), + new File("/", "virtualFile2.txt"), + new File("/", "virtualFolder") + }; + } + + @Override + public File getHomeDirectory() { + return new File("/"); + } + + @Override + public File getDefaultDirectory() { + return new File("/"); + } + + @Override + public File[] getFiles(File dir, boolean useFileHiding) { + // Simulate a virtual folder structure + return new File[]{ + new File("/", "

      Swing Rocks!"), + new File(dir, "virtualFile2.txt"), + new File(dir, "virtualFolder") + }; + } + + @Override + public Icon getSystemIcon(File f) { + return null; + } + } +} From 90d1741fcd33d044a5f5f7ecee3fcd23638d2ce7 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Tue, 23 Sep 2025 07:46:16 +0000 Subject: [PATCH 106/323] 8354646: java.awt.TextField allows to identify the spaces in a password when double clicked at the starting and end of the text Backport-of: 8d33ea7395e5dd504b899d8972617f6696546d84 --- .../plaf/basic/BasicPasswordFieldUI.java | 21 +---- .../javax/swing/plaf/basic/BasicTextUI.java | 18 +++- .../plaf/synth/SynthPasswordFieldUI.java | 17 +--- .../awt/TextField/SetEchoCharWordOpsTest.java | 4 +- .../PasswordSelectionWordTest.java | 94 +++++++++++++++++++ 5 files changed, 115 insertions(+), 39 deletions(-) create mode 100644 test/jdk/javax/swing/plaf/basic/BasicTextUI/PasswordSelectionWordTest.java diff --git a/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicPasswordFieldUI.java b/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicPasswordFieldUI.java index 6a78e2d6871e..ce3b699b8867 100644 --- a/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicPasswordFieldUI.java +++ b/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicPasswordFieldUI.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2025, 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 @@ -91,23 +91,4 @@ protected void installDefaults() { public View create(Element elem) { return new PasswordView(elem); } - - /** - * Create the action map for Password Field. This map provides - * same actions for double mouse click and - * and for triple mouse click (see bug 4231444). - */ - - ActionMap createActionMap() { - ActionMap map = super.createActionMap(); - if (map.get(DefaultEditorKit.selectWordAction) != null) { - Action a = map.get(DefaultEditorKit.selectLineAction); - if (a != null) { - map.remove(DefaultEditorKit.selectWordAction); - map.put(DefaultEditorKit.selectWordAction, a); - } - } - return map; - } - } diff --git a/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTextUI.java b/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTextUI.java index e61707c53b23..4808f29334f4 100644 --- a/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTextUI.java +++ b/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTextUI.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2025, 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 @@ -647,6 +647,22 @@ ActionMap createActionMap() { TransferHandler.getCopyAction()); map.put(TransferHandler.getPasteAction().getValue(Action.NAME), TransferHandler.getPasteAction()); + + if (getComponent() instanceof JPasswordField) { + // Edit the action map for Password Field. This map provides + // same actions for double mouse click and + // and for triple mouse click (see bugs 4231444, 8354646). + + if (map.get(DefaultEditorKit.selectWordAction) != null) { + map.remove(DefaultEditorKit.selectWordAction); + + Action a = map.get(DefaultEditorKit.selectLineAction); + if (a != null) { + map.put(DefaultEditorKit.selectWordAction, a); + } + } + } + return map; } diff --git a/src/java.desktop/share/classes/javax/swing/plaf/synth/SynthPasswordFieldUI.java b/src/java.desktop/share/classes/javax/swing/plaf/synth/SynthPasswordFieldUI.java index 083a118c2098..dbdeac3da1f0 100644 --- a/src/java.desktop/share/classes/javax/swing/plaf/synth/SynthPasswordFieldUI.java +++ b/src/java.desktop/share/classes/javax/swing/plaf/synth/SynthPasswordFieldUI.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2025, 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 @@ -108,19 +108,4 @@ public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintPasswordFieldBorder(context, g, x, y, w, h); } - - /** - * {@inheritDoc} - */ - @Override - protected void installKeyboardActions() { - super.installKeyboardActions(); - ActionMap map = SwingUtilities.getUIActionMap(getComponent()); - if (map != null && map.get(DefaultEditorKit.selectWordAction) != null) { - Action a = map.get(DefaultEditorKit.selectLineAction); - if (a != null) { - map.put(DefaultEditorKit.selectWordAction, a); - } - } - } } diff --git a/test/jdk/java/awt/TextField/SetEchoCharWordOpsTest.java b/test/jdk/java/awt/TextField/SetEchoCharWordOpsTest.java index 825c21fdc963..9116a4dff3bd 100644 --- a/test/jdk/java/awt/TextField/SetEchoCharWordOpsTest.java +++ b/test/jdk/java/awt/TextField/SetEchoCharWordOpsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2025, 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 @@ -30,7 +30,7 @@ /* * @test - * @bug 6191897 + * @bug 6191897 8354646 * @summary Verifies that ctrl+left/right does not move word-by-word in a TextField * with echo character set * @library /java/awt/regtesthelpers /test/lib diff --git a/test/jdk/javax/swing/plaf/basic/BasicTextUI/PasswordSelectionWordTest.java b/test/jdk/javax/swing/plaf/basic/BasicTextUI/PasswordSelectionWordTest.java new file mode 100644 index 000000000000..695d8a83c70d --- /dev/null +++ b/test/jdk/javax/swing/plaf/basic/BasicTextUI/PasswordSelectionWordTest.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @key headful + * @bug 4231444 8354646 + * @summary Password fields' ActionMap needs to replace + * DefaultEditorKit.selectWordAction with + * DefaultEditorKit.selectLineAction. + * + * @run main PasswordSelectionWordTest + */ + +import javax.swing.Action; +import javax.swing.JPasswordField; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.plaf.basic.BasicTextUI; +import javax.swing.text.DefaultEditorKit; +import java.awt.event.ActionEvent; + +public class PasswordSelectionWordTest { + public static void main(String[] args) throws Exception { + for (UIManager.LookAndFeelInfo laf : + UIManager.getInstalledLookAndFeels()) { + System.out.println("Testing LAF: " + laf.getClassName()); + SwingUtilities.invokeAndWait(() -> { + if (setLookAndFeel(laf)) { + runTest(); + } + }); + } + } + + private static boolean setLookAndFeel(UIManager.LookAndFeelInfo laf) { + try { + UIManager.setLookAndFeel(laf.getClassName()); + return true; + } catch (UnsupportedLookAndFeelException e) { + System.err.println("Skipping unsupported look and feel:"); + e.printStackTrace(); + return false; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void runTest() { + String str = "one two three"; + JPasswordField field = new JPasswordField(str); + if (!(field.getUI() instanceof BasicTextUI)) { + throw new RuntimeException("Unexpected condition: JPasswordField UI was " + field.getUI()); + } + System.out.println("Testing " + field.getUI()); + + // do something (anything) to initialize the Views: + field.setSize(100, 100); + field.addNotify(); + + Action action = field.getActionMap().get( + DefaultEditorKit.selectWordAction); + action.actionPerformed(new ActionEvent(field, 0, "")); + int selectionStart = field.getSelectionStart(); + int selectionEnd = field.getSelectionEnd(); + System.out.println("selectionStart = " + selectionStart); + System.out.println("selectionEnd = " + selectionEnd); + if (selectionStart != 0 || selectionEnd != str.length()) { + throw new RuntimeException("selectionStart = " + selectionStart + + " and selectionEnd = " + selectionEnd); + } + } +} From d81b4f39e3659495c0bc9d8dc3024f10f8152af1 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Tue, 23 Sep 2025 07:50:22 +0000 Subject: [PATCH 107/323] 8361314: Test serviceability/jvmti/VMEvent/MyPackage/VMEventRecursionTest.java FATAL ERROR in native method: Failed during the GetClassSignature call Backport-of: 8c00c374ec3e5ae2db3c35a970f6c7a691ae274e --- .../jvmti/VMEvent/libVMEventTest.c | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/test/hotspot/jtreg/serviceability/jvmti/VMEvent/libVMEventTest.c b/test/hotspot/jtreg/serviceability/jvmti/VMEvent/libVMEventTest.c index 56f285aee417..2f532384fa67 100644 --- a/test/hotspot/jtreg/serviceability/jvmti/VMEvent/libVMEventTest.c +++ b/test/hotspot/jtreg/serviceability/jvmti/VMEvent/libVMEventTest.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2018, Google and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -47,12 +47,36 @@ extern "C" { #endif +// JVMTI_ERROR_WRONG_PHASE guard +static jrawMonitorID event_mon = NULL; +static int is_vm_dead = 0; + +void lock(jvmtiEnv *jvmti, JNIEnv *jni) { + jvmtiError err = (*jvmti)->RawMonitorEnter(jvmti, event_mon); + if (err != JVMTI_ERROR_NONE) { + JNI_ENV_PTR(jni)->FatalError(JNI_ENV_ARGS2(jni, "RawMonitorEnter failed")); + } +} + +void unlock(jvmtiEnv *jvmti, JNIEnv *jni) { + jvmtiError err = (*jvmti)->RawMonitorExit(jvmti, event_mon); + if (err != JVMTI_ERROR_NONE) { + JNI_ENV_PTR(jni)->FatalError(JNI_ENV_ARGS2(jni, "RawMonitorExit failed")); + } +} + extern JNIEXPORT void JNICALL VMObjectAlloc(jvmtiEnv *jvmti, JNIEnv* jni, jthread thread, jobject object, jclass klass, jlong size) { + lock(jvmti, jni); + if (is_vm_dead) { + unlock(jvmti, jni); + return; + } + char *signature = NULL; jvmtiError error = (*jvmti)->GetClassSignature(jvmti, klass, &signature, NULL); @@ -78,25 +102,40 @@ extern JNIEXPORT void JNICALL VMObjectAlloc(jvmtiEnv *jvmti, JNI_ENV_ARGS2(jni, "Failed during the CallObjectMethod call")); } } + unlock(jvmti, jni); } extern JNIEXPORT void JNICALL OnVMInit(jvmtiEnv *jvmti, JNIEnv *jni, jthread thread) { (*jvmti)->SetEventNotificationMode(jvmti, JVMTI_ENABLE, JVMTI_EVENT_VM_OBJECT_ALLOC, NULL); } +extern JNIEXPORT void JNICALL OnVMDeath(jvmtiEnv *jvmti, JNIEnv *jni) { + lock(jvmti, jni); + is_vm_dead = 1; + unlock(jvmti, jni); +} + extern JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) { jvmtiEnv *jvmti; jvmtiEventCallbacks callbacks; jvmtiCapabilities caps; + jvmtiError err; if ((*jvm)->GetEnv(jvm, (void **) (&jvmti), JVMTI_VERSION) != JNI_OK) { return JNI_ERR; } + err = (*jvmti)->CreateRawMonitor(jvmti, "Event Monitor", &event_mon); + if (err != JVMTI_ERROR_NONE) { + printf("CreateRawMonitor failed: %d\n", err); + return JNI_ERR; + } + memset(&callbacks, 0, sizeof(callbacks)); callbacks.VMObjectAlloc = &VMObjectAlloc; callbacks.VMInit = &OnVMInit; + callbacks.VMDeath = &OnVMDeath; memset(&caps, 0, sizeof(caps)); caps.can_generate_vm_object_alloc_events = 1; @@ -104,6 +143,7 @@ extern JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *jvm, char *options, (*jvmti)->SetEventCallbacks(jvmti, &callbacks, sizeof(jvmtiEventCallbacks)); (*jvmti)->SetEventNotificationMode(jvmti, JVMTI_ENABLE, JVMTI_EVENT_VM_INIT, NULL); + (*jvmti)->SetEventNotificationMode(jvmti, JVMTI_ENABLE, JVMTI_EVENT_VM_DEATH, NULL); return 0; } From 488bce8a42748c5d4ce7487458b7052e5370674f Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Tue, 23 Sep 2025 07:55:18 +0000 Subject: [PATCH 108/323] 8358532: JFileChooser in GTK L&F still displays HTML filename Backport-of: 6fe9143bbbe269af62d2084834fc0c9afc51b5f3 --- .../com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java | 6 ++++++ test/jdk/javax/swing/JFileChooser/HTMLFileName.java | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java b/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java index 6a2564b49bcc..e145a1e1da76 100644 --- a/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java +++ b/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java @@ -1118,6 +1118,9 @@ public Component getListCellRendererComponent(JList list, Object value, int i if (showFileIcons) { setIcon(getFileChooser().getIcon((File)value)); } + + putClientProperty("html.disable", getFileChooser().getClientProperty("html.disable")); + return this; } } @@ -1135,6 +1138,9 @@ public Component getListCellRendererComponent(JList list, Object value, int i } else { setText(getFileChooser().getName((File)value) + "/"); } + + putClientProperty("html.disable", getFileChooser().getClientProperty("html.disable")); + return this; } } diff --git a/test/jdk/javax/swing/JFileChooser/HTMLFileName.java b/test/jdk/javax/swing/JFileChooser/HTMLFileName.java index 8783c3889852..45d9cb4c449d 100644 --- a/test/jdk/javax/swing/JFileChooser/HTMLFileName.java +++ b/test/jdk/javax/swing/JFileChooser/HTMLFileName.java @@ -41,7 +41,7 @@ /* * @test id=system - * @bug 8139228 + * @bug 8139228 8358532 * @summary JFileChooser should not render Directory names in HTML format * @library /java/awt/regtesthelpers * @build PassFailJFrame From 1c670fbf79e09f2b0944e8603ac95e999e1fded3 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Tue, 23 Sep 2025 07:57:39 +0000 Subject: [PATCH 109/323] 8361751: Test sun/tools/jcmd/TestJcmdSanity.java timed out on Windows Backport-of: a3843e8e6e189447e554759c3ba672530f8c7329 --- test/jdk/sun/tools/jcmd/JcmdBase.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/jdk/sun/tools/jcmd/JcmdBase.java b/test/jdk/sun/tools/jcmd/JcmdBase.java index b0315673133a..9a0f97f5bf49 100644 --- a/test/jdk/sun/tools/jcmd/JcmdBase.java +++ b/test/jdk/sun/tools/jcmd/JcmdBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2025, 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 @@ -102,6 +102,8 @@ private static final OutputAnalyzer jcmd(boolean requestToCurrentProcess, launcher.addVMArg(vmArg); } } + // Some command output may be lengthy, disable streaming output to avoid deadlocks + launcher.addVMArg("-Djdk.attach.allowStreamingOutput=false"); if (requestToCurrentProcess) { launcher.addToolArg(Long.toString(ProcessTools.getProcessId())); } From c7ae8b100fa02cc86ddf8daba11165a1179ab347 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Tue, 23 Sep 2025 08:00:10 +0000 Subject: [PATCH 110/323] 8360411: [TEST] open/test/jdk/java/io/File/MaxPathLength.java Refactor extract method to encapsulate Windows specific test logic Backport-of: 016694bf74f6920f850330e353df9fd03458cca1 --- test/jdk/java/io/File/MaxPathLength.java | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/test/jdk/java/io/File/MaxPathLength.java b/test/jdk/java/io/File/MaxPathLength.java index 0e0b099afd9e..1110b469759a 100644 --- a/test/jdk/java/io/File/MaxPathLength.java +++ b/test/jdk/java/io/File/MaxPathLength.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2025, 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,14 +60,7 @@ public static void main(String[] args) throws Exception { // test long paths on windows // And these long pathes cannot be handled on Solaris and Mac platforms - if (isWindows) { - String name = fileName; - while (name.length() < MAX_LENGTH) { - testLongPath (20, name, false); - testLongPath (20, name, true); - name = getNextName(name); - } - } + testLongPathOnWindows(); } private static String getNextName(String fName) { @@ -199,4 +192,15 @@ static void testLongPath(int max, String fn, } } } + + private static void testLongPathOnWindows () throws Exception { + if (isWindows) { + String name = fileName; + while (name.length() < MAX_LENGTH) { + testLongPath (20, name, false); + testLongPath (20, name, true); + name = getNextName(name); + } + } + } } From e5d94787a647602cda49eb121fc66df98b035ea5 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Tue, 23 Sep 2025 08:02:40 +0000 Subject: [PATCH 111/323] 8364484: misc tests fail with Received fatal alert: handshake_failure Backport-of: 724e8c076e1aed05de893ef9366af0e62cc2ac2b --- test/jdk/javax/management/security/SecurityTest.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/test/jdk/javax/management/security/SecurityTest.java b/test/jdk/javax/management/security/SecurityTest.java index 835c340dd992..7212aea883fd 100644 --- a/test/jdk/javax/management/security/SecurityTest.java +++ b/test/jdk/javax/management/security/SecurityTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2025, 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 @@ -142,6 +142,9 @@ static void setTrustStoreProperties(Map map) { * map (argName, value) format, then calls original test's run method. */ public static void main(String args[]) throws Exception { + // Disable default KeyManager's certificate checking so we can use + // a certificate signed with MD5withRSA algorithm. + System.setProperty("jdk.tls.SunX509KeyManager.certChecking", "false"); System.out.println("================================================="); @@ -529,6 +532,10 @@ private static class ClientSide { private MBeanServerConnection mbsc = null; public static void main(String args[]) throws Exception { + // Disable default KeyManager's certificate checking so we can use + // a certificate signed with MD5withRSA algorithm. + System.setProperty("jdk.tls.SunX509KeyManager.certChecking", + "false"); // Parses parameters Utils.parseDebugProperties(); From d19a39178a430b98c811e6af8ad38c3f2de269fc Mon Sep 17 00:00:00 2001 From: Matthias Baesken Date: Tue, 23 Sep 2025 09:17:32 +0000 Subject: [PATCH 112/323] 8364996: java/awt/font/FontNames/LocaleFamilyNames.java times out on Windows Backport-of: 15e8609a2c3d246e89cfb349cbd21777bc471bae --- .../java/awt/font/FontNames/LocaleFamilyNames.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/test/jdk/java/awt/font/FontNames/LocaleFamilyNames.java b/test/jdk/java/awt/font/FontNames/LocaleFamilyNames.java index 5356464334e2..0fc27ea3de03 100644 --- a/test/jdk/java/awt/font/FontNames/LocaleFamilyNames.java +++ b/test/jdk/java/awt/font/FontNames/LocaleFamilyNames.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2025, 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,29 +26,32 @@ * @bug 4935798 6521210 6901159 * @summary Tests that all family names that are reported in all locales * correspond to some font returned from getAllFonts(). - * @run main LocaleFamilyNames + * @run main/othervm/timeout=360 LocaleFamilyNames */ import java.awt.*; import java.util.*; public class LocaleFamilyNames { public static void main(String[] args) throws Exception { + System.out.println("Start time: " + java.time.LocalDateTime.now()); GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); - Font[] all_fonts = ge.getAllFonts(); - Locale[] all_locales = Locale.getAvailableLocales(); + System.out.println("Number of fonts: " + all_fonts.length); + System.out.println("Number of locales: " + all_locales.length); + HashSet all_families = new HashSet(); for (int i=0; i Date: Tue, 23 Sep 2025 14:23:29 +0000 Subject: [PATCH 113/323] 8339280: jarsigner -verify performs cross-checking between CEN and LOC 8353299: VerifyJarEntryName.java test fails 8367782: VerifyJarEntryName.java: Fix modifyJarEntryName to operate on bytes and re-introduce verifySignatureEntryName Reviewed-by: sgehwolf, abakhtin Backport-of: bbd5b174c50346152a624317b6bd76ec48f7e551 --- .../sun/security/tools/jarsigner/Main.java | 148 ++++++++++++++++++ .../security/tools/jarsigner/Resources.java | 28 ++++ src/jdk.jartool/share/man/jarsigner.1 | 5 + .../tools/jarsigner/VerifyJarEntryName.java | 142 +++++++++++++++++ 4 files changed, 323 insertions(+) create mode 100644 test/jdk/sun/security/tools/jarsigner/VerifyJarEntryName.java diff --git a/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Main.java b/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Main.java index 44ccf01e992d..94741cfb9b4c 100644 --- a/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Main.java +++ b/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Main.java @@ -28,6 +28,8 @@ import java.io.*; import java.net.UnknownHostException; import java.net.URLClassLoader; +import java.nio.file.Files; +import java.nio.file.Path; import java.security.cert.CertPathValidatorException; import java.security.cert.PKIXBuilderParameters; import java.security.interfaces.ECKey; @@ -228,6 +230,8 @@ public static void main(String args[]) throws Exception { private Throwable chainNotValidatedReason = null; private Throwable tsaChainNotValidatedReason = null; + private List crossChkWarnings = new ArrayList<>(); + PKIXBuilderParameters pkixParameters; Set trustedCerts = new HashSet<>(); @@ -1099,6 +1103,7 @@ void verifyJar(String jarName) } } System.out.println(); + crossCheckEntries(jarName); if (!anySigned) { if (disabledAlgFound) { @@ -1133,6 +1138,143 @@ void verifyJar(String jarName) System.exit(1); } + private void crossCheckEntries(String jarName) throws Exception { + Set locEntries = new HashSet<>(); + + try (JarFile jarFile = new JarFile(jarName); + JarInputStream jis = new JarInputStream( + Files.newInputStream(Path.of(jarName)))) { + + Manifest cenManifest = jarFile.getManifest(); + Manifest locManifest = jis.getManifest(); + compareManifest(cenManifest, locManifest); + + JarEntry locEntry; + while ((locEntry = jis.getNextJarEntry()) != null) { + String entryName = locEntry.getName(); + locEntries.add(entryName); + + JarEntry cenEntry = jarFile.getJarEntry(entryName); + if (cenEntry == null) { + crossChkWarnings.add(String.format(rb.getString( + "entry.1.present.when.reading.jarinputstream.but.missing.via.jarfile"), + entryName)); + continue; + } + + try { + readEntry(jis); + } catch (SecurityException e) { + crossChkWarnings.add(String.format(rb.getString( + "signature.verification.failed.on.entry.1.when.reading.via.jarinputstream"), + entryName)); + continue; + } + + try (InputStream cenInputStream = jarFile.getInputStream(cenEntry)) { + if (cenInputStream == null) { + crossChkWarnings.add(String.format(rb.getString( + "entry.1.present.in.jarfile.but.unreadable"), + entryName)); + continue; + } else { + try { + readEntry(cenInputStream); + } catch (SecurityException e) { + crossChkWarnings.add(String.format(rb.getString( + "signature.verification.failed.on.entry.1.when.reading.via.jarfile"), + entryName)); + continue; + } + } + } + + compareSigners(cenEntry, locEntry); + } + + jarFile.stream() + .map(JarEntry::getName) + .filter(n -> !locEntries.contains(n) && !n.equals(JarFile.MANIFEST_NAME)) + .forEach(n -> crossChkWarnings.add(String.format(rb.getString( + "entry.1.present.when.reading.jarfile.but.missing.via.jarinputstream"), n))); + } + } + + private void readEntry(InputStream is) throws IOException { + is.transferTo(OutputStream.nullOutputStream()); + } + + private void compareManifest(Manifest cenManifest, Manifest locManifest) { + if (cenManifest == null) { + crossChkWarnings.add(rb.getString( + "manifest.missing.when.reading.jarfile")); + return; + } + if (locManifest == null) { + crossChkWarnings.add(rb.getString( + "manifest.missing.when.reading.jarinputstream")); + return; + } + + Attributes cenMainAttrs = cenManifest.getMainAttributes(); + Attributes locMainAttrs = locManifest.getMainAttributes(); + + for (Object key : cenMainAttrs.keySet()) { + Object cenValue = cenMainAttrs.get(key); + Object locValue = locMainAttrs.get(key); + + if (locValue == null) { + crossChkWarnings.add(String.format(rb.getString( + "manifest.attribute.1.present.when.reading.jarfile.but.missing.via.jarinputstream"), + key)); + } else if (!cenValue.equals(locValue)) { + crossChkWarnings.add(String.format(rb.getString( + "manifest.attribute.1.differs.jarfile.value.2.jarinputstream.value.3"), + key, cenValue, locValue)); + } + } + + for (Object key : locMainAttrs.keySet()) { + if (!cenMainAttrs.containsKey(key)) { + crossChkWarnings.add(String.format(rb.getString( + "manifest.attribute.1.present.when.reading.jarinputstream.but.missing.via.jarfile"), + key)); + } + } + } + + private void compareSigners(JarEntry cenEntry, JarEntry locEntry) { + CodeSigner[] cenSigners = cenEntry.getCodeSigners(); + CodeSigner[] locSigners = locEntry.getCodeSigners(); + + boolean cenHasSigners = cenSigners != null; + boolean locHasSigners = locSigners != null; + + if (cenHasSigners && locHasSigners) { + if (!Arrays.equals(cenSigners, locSigners)) { + crossChkWarnings.add(String.format(rb.getString( + "codesigners.different.for.entry.1.when.reading.jarfile.and.jarinputstream"), + cenEntry.getName())); + } + } else if (cenHasSigners) { + crossChkWarnings.add(String.format(rb.getString( + "entry.1.is.signed.in.jarfile.but.is.not.signed.in.jarinputstream"), + cenEntry.getName())); + } else if (locHasSigners) { + crossChkWarnings.add(String.format(rb.getString( + "entry.1.is.signed.in.jarinputstream.but.is.not.signed.in.jarfile"), + locEntry.getName())); + } + } + + private void displayCrossChkWarnings() { + System.out.println(); + // First is a summary warning + System.out.println(rb.getString("jar.contains.internal.inconsistencies.result.in.different.contents.via.jarfile.and.jarinputstream")); + // each warning message with prefix "- " + crossChkWarnings.forEach(warning -> System.out.println("- " + warning)); + } + private void displayMessagesAndResult(boolean isSigning) { String result; List errors = new ArrayList<>(); @@ -1359,6 +1501,9 @@ private void displayMessagesAndResult(boolean isSigning) { System.out.println(rb.getString("Warning.")); warnings.forEach(System.out::println); } + if (!crossChkWarnings.isEmpty()) { + displayCrossChkWarnings(); + } } else { if (!errors.isEmpty() || !warnings.isEmpty()) { System.out.println(); @@ -1366,6 +1511,9 @@ private void displayMessagesAndResult(boolean isSigning) { errors.forEach(System.out::println); warnings.forEach(System.out::println); } + if (!crossChkWarnings.isEmpty()) { + displayCrossChkWarnings(); + } } if (!isSigning && (!errors.isEmpty() || !warnings.isEmpty())) { diff --git a/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources.java b/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources.java index 10c6338f19f6..42c0c88e388a 100644 --- a/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources.java +++ b/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources.java @@ -325,6 +325,34 @@ public class Resources extends java.util.ListResourceBundle { {"Cannot.find.file.", "Cannot find file: "}, {"event.ocsp.check", "Contacting OCSP server at %s ..."}, {"event.crl.check", "Downloading CRL from %s ..."}, + {"manifest.missing.when.reading.jarfile", + "Manifest is missing when reading via JarFile"}, + {"manifest.missing.when.reading.jarinputstream", + "Manifest is missing when reading via JarInputStream"}, + {"manifest.attribute.1.present.when.reading.jarfile.but.missing.via.jarinputstream", + "Manifest main attribute %s is present when reading via JarFile but missing when reading via JarInputStream"}, + {"manifest.attribute.1.present.when.reading.jarinputstream.but.missing.via.jarfile", + "Manifest main attribute %s is present when reading via JarInputStream but missing when reading via JarFile"}, + {"manifest.attribute.1.differs.jarfile.value.2.jarinputstream.value.3", + "Manifest main attribute %1$s differs: JarFile value = %2$s, JarInputStream value = %3$s"}, + {"entry.1.present.when.reading.jarinputstream.but.missing.via.jarfile", + "Entry %s is present when reading via JarInputStream but missing when reading via JarFile"}, + {"entry.1.present.when.reading.jarfile.but.missing.via.jarinputstream", + "Entry %s is present when reading via JarFile but missing when reading via JarInputStream"}, + {"entry.1.present.in.jarfile.but.unreadable", + "Entry %s is present in JarFile but unreadable"}, + {"codesigners.different.for.entry.1.when.reading.jarfile.and.jarinputstream", + "Code signers are different for entry %s when reading from JarFile and JarInputStream"}, + {"entry.1.is.signed.in.jarfile.but.is.not.signed.in.jarinputstream", + "Entry %s is signed in JarFile but is not signed in JarInputStream"}, + {"entry.1.is.signed.in.jarinputstream.but.is.not.signed.in.jarfile", + "Entry %s is signed in JarInputStream but is not signed in JarFile"}, + {"jar.contains.internal.inconsistencies.result.in.different.contents.via.jarfile.and.jarinputstream", + "This JAR file contains internal inconsistencies that may result in different contents when reading via JarFile and JarInputStream:"}, + {"signature.verification.failed.on.entry.1.when.reading.via.jarinputstream", + "Signature verification failed on entry %s when reading via JarInputStream"}, + {"signature.verification.failed.on.entry.1.when.reading.via.jarfile", + "Signature verification failed on entry %s when reading via JarFile"}, }; /** diff --git a/src/jdk.jartool/share/man/jarsigner.1 b/src/jdk.jartool/share/man/jarsigner.1 index 21ebdf4fad80..2e70778f8550 100644 --- a/src/jdk.jartool/share/man/jarsigner.1 +++ b/src/jdk.jartool/share/man/jarsigner.1 @@ -1208,6 +1208,11 @@ months. hasExpiringTsaCert The timestamp will expire within one year on \f[V]YYYY-MM-DD\f[R]. .TP +internalInconsistenciesDetected +This JAR contains internal inconsistencies detected during verification +that may result in different contents when reading via JarFile +and JarInputStream. +.TP legacyAlg An algorithm used is considered a security risk but not disabled. .TP diff --git a/test/jdk/sun/security/tools/jarsigner/VerifyJarEntryName.java b/test/jdk/sun/security/tools/jarsigner/VerifyJarEntryName.java new file mode 100644 index 000000000000..e2554ee0f916 --- /dev/null +++ b/test/jdk/sun/security/tools/jarsigner/VerifyJarEntryName.java @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2025, 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 8339280 + * @summary Test that jarsigner -verify emits a warning when the filename of + * an entry in the LOC is changed + * @library /test/lib + * @run junit VerifyJarEntryName + */ + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.FileOutputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.jar.JarFile; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import jdk.test.lib.SecurityTools; +import static org.junit.jupiter.api.Assertions.fail; + +public class VerifyJarEntryName { + + private static final Path ORIGINAL_JAR = Path.of("test.jar"); + private static final Path MODIFIED_JAR = Path.of("modified_test.jar"); + + @BeforeAll + static void setup() throws Exception { + try (FileOutputStream fos = new FileOutputStream(ORIGINAL_JAR.toFile()); + ZipOutputStream zos = new ZipOutputStream(fos)) { + zos.putNextEntry(new ZipEntry(JarFile.MANIFEST_NAME)); + zos.write("Manifest-Version: 1.0\nCreated-By: Test\n". + getBytes(StandardCharsets.UTF_8)); + zos.closeEntry(); + + // Add hello.txt file + ZipEntry textEntry = new ZipEntry("hello.txt"); + zos.putNextEntry(textEntry); + zos.write("hello".getBytes(StandardCharsets.UTF_8)); + zos.closeEntry(); + } + + SecurityTools.keytool("-genkeypair -keystore ks -storepass changeit " + + "-alias mykey -keyalg rsa -dname CN=me "); + + SecurityTools.jarsigner("-keystore ks -storepass changeit " + + ORIGINAL_JAR + " mykey") + .shouldHaveExitValue(0); + } + + @BeforeEach + void cleanup() throws Exception { + Files.deleteIfExists(MODIFIED_JAR); + } + + /* + * Modify a single byte in "MANIFEST.MF" filename in LOC, and + * validate that jarsigner -verify emits a warning message. + */ + @Test + void verifyManifestEntryName() throws Exception { + modifyJarEntryName(ORIGINAL_JAR, MODIFIED_JAR, "META-INF/MANIFEST.MF"); + SecurityTools.jarsigner("-verify -verbose " + MODIFIED_JAR) + .shouldContain("This JAR file contains internal " + + "inconsistencies that may result in different " + + "contents when reading via JarFile and JarInputStream:") + .shouldContain("- Manifest is missing when " + + "reading via JarInputStream") + .shouldHaveExitValue(0); + } + + /* + * Modify a single byte in signature filename in LOC, and + * validate that jarsigner -verify emits a warning message. + */ + @Test + void verifySignatureEntryName() throws Exception { + modifyJarEntryName(ORIGINAL_JAR, MODIFIED_JAR, "META-INF/MYKEY.SF"); + SecurityTools.jarsigner("-verify -verbose " + MODIFIED_JAR) + .shouldContain("This JAR file contains internal " + + "inconsistencies that may result in different " + + "contents when reading via JarFile and JarInputStream:") + .shouldContain("- Entry XETA-INF/MYKEY.SF is present when reading " + + "via JarInputStream but missing when reading via JarFile") + .shouldHaveExitValue(0); + } + + /* + * Validate that jarsigner -verify on a valid JAR works without + * emitting warnings about internal inconsistencies. + */ + @Test + void verifyOriginalJar() throws Exception { + SecurityTools.jarsigner("-verify -verbose " + ORIGINAL_JAR) + .shouldNotContain("This JAR file contains internal " + + "inconsistencies that may result in different contents when " + + "reading via JarFile and JarInputStream:") + .shouldHaveExitValue(0); + } + + private void modifyJarEntryName(Path origJar, Path modifiedJar, + String entryName) throws Exception { + byte[] jarBytes = Files.readAllBytes(origJar); + byte[] entryNameBytes = entryName.getBytes(StandardCharsets.UTF_8); + int pos = 0; + try { + while (!Arrays.equals(jarBytes, pos, pos + entryNameBytes.length, + entryNameBytes, 0, entryNameBytes.length)) pos++; + } catch (ArrayIndexOutOfBoundsException ignore) { + fail(entryName + " is not present in the JAR"); + } + jarBytes[pos] = 'X'; + Files.write(modifiedJar, jarBytes); + } +} From 6e21171dd8b46db803424fb445804c8692da1ab0 Mon Sep 17 00:00:00 2001 From: Sergey Bylokhov Date: Tue, 23 Sep 2025 17:21:06 +0000 Subject: [PATCH 114/323] 8366208: Unexpected exception in sun.java2d.cmm.lcms.LCMSImageLayout Backport-of: 12e6a0b6d0086caf156cf5513a604320c619b856 --- .../sun/java2d/cmm/lcms/LCMSImageLayout.java | 22 ++- .../FilterSemiCustomImages.java | 162 ++++++++++++++++++ 2 files changed, 177 insertions(+), 7 deletions(-) create mode 100644 test/jdk/sun/java2d/cmm/ColorConvertOp/FilterSemiCustomImages.java diff --git a/src/java.desktop/share/classes/sun/java2d/cmm/lcms/LCMSImageLayout.java b/src/java.desktop/share/classes/sun/java2d/cmm/lcms/LCMSImageLayout.java index cfe488fee722..663e11ff1722 100644 --- a/src/java.desktop/share/classes/sun/java2d/cmm/lcms/LCMSImageLayout.java +++ b/src/java.desktop/share/classes/sun/java2d/cmm/lcms/LCMSImageLayout.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2025, 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 @@ -125,7 +125,9 @@ private LCMSImageLayout() { static LCMSImageLayout createImageLayout(BufferedImage image) { LCMSImageLayout l = new LCMSImageLayout(); - switch (image.getType()) { + Raster raster = image.getRaster(); + int type = image.getType(); + switch (type) { case BufferedImage.TYPE_INT_RGB, BufferedImage.TYPE_INT_ARGB: l.pixelType = PT_ARGB_8 ^ SWAP_ENDIAN; break; @@ -164,7 +166,7 @@ static LCMSImageLayout createImageLayout(BufferedImage image) { return null; } } - return createImageLayout(image.getRaster(), cm); + return createImageLayout(raster, cm); } return null; } @@ -172,11 +174,13 @@ static LCMSImageLayout createImageLayout(BufferedImage image) { l.width = image.getWidth(); l.height = image.getHeight(); - switch (image.getType()) { + switch (type) { case BufferedImage.TYPE_INT_RGB, BufferedImage.TYPE_INT_ARGB, BufferedImage.TYPE_INT_ARGB_PRE, BufferedImage.TYPE_INT_BGR -> { - var intRaster = (IntegerComponentRaster) image.getRaster(); + if (!(raster instanceof IntegerComponentRaster intRaster)) { + return null; + } l.nextRowOffset = safeMult(4, intRaster.getScanlineStride()); l.nextPixelOffset = safeMult(4, intRaster.getPixelStride()); l.offset = safeMult(4, intRaster.getDataOffset(0)); @@ -188,7 +192,9 @@ static LCMSImageLayout createImageLayout(BufferedImage image) { BufferedImage.TYPE_4BYTE_ABGR, BufferedImage.TYPE_4BYTE_ABGR_PRE -> { - var byteRaster = (ByteComponentRaster) image.getRaster(); + if (!(raster instanceof ByteComponentRaster byteRaster)) { + return null; + } l.nextRowOffset = byteRaster.getScanlineStride(); l.nextPixelOffset = byteRaster.getPixelStride(); int firstBand = byteRaster.getSampleModel().getNumBands() - 1; @@ -198,7 +204,9 @@ static LCMSImageLayout createImageLayout(BufferedImage image) { l.dataType = DT_BYTE; } case BufferedImage.TYPE_USHORT_GRAY -> { - var shortRaster = (ShortComponentRaster) image.getRaster(); + if (!(raster instanceof ShortComponentRaster shortRaster)) { + return null; + } l.nextRowOffset = safeMult(2, shortRaster.getScanlineStride()); l.nextPixelOffset = safeMult(2, shortRaster.getPixelStride()); l.offset = safeMult(2, shortRaster.getDataOffset(0)); diff --git a/test/jdk/sun/java2d/cmm/ColorConvertOp/FilterSemiCustomImages.java b/test/jdk/sun/java2d/cmm/ColorConvertOp/FilterSemiCustomImages.java new file mode 100644 index 000000000000..ff3fcde74821 --- /dev/null +++ b/test/jdk/sun/java2d/cmm/ColorConvertOp/FilterSemiCustomImages.java @@ -0,0 +1,162 @@ +/* + * Copyright Amazon.com Inc. 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.awt.Color; +import java.awt.Point; +import java.awt.color.ColorSpace; +import java.awt.image.BufferedImage; +import java.awt.image.ColorConvertOp; +import java.awt.image.ColorModel; +import java.awt.image.SampleModel; +import java.awt.image.WritableRaster; +import java.io.File; + +import javax.imageio.ImageIO; + +import static java.awt.image.BufferedImage.TYPE_3BYTE_BGR; +import static java.awt.image.BufferedImage.TYPE_4BYTE_ABGR; +import static java.awt.image.BufferedImage.TYPE_4BYTE_ABGR_PRE; +import static java.awt.image.BufferedImage.TYPE_INT_ARGB; +import static java.awt.image.BufferedImage.TYPE_INT_ARGB_PRE; +import static java.awt.image.BufferedImage.TYPE_INT_BGR; +import static java.awt.image.BufferedImage.TYPE_INT_RGB; +import static java.awt.image.BufferedImage.TYPE_USHORT_GRAY; + +/** + * @test + * @bug 8366208 + * @summary Verifies ColorConvertOp works correctly with BufferedImage and + * semi-custom raster + */ +public final class FilterSemiCustomImages { + + private static final int W = 144; + private static final int H = 123; + + private static final int[] TYPES = { + TYPE_INT_RGB, TYPE_INT_ARGB, TYPE_INT_ARGB_PRE, TYPE_INT_BGR, + TYPE_3BYTE_BGR, TYPE_4BYTE_ABGR, TYPE_4BYTE_ABGR_PRE, + TYPE_USHORT_GRAY + }; + + private static final int[] CSS = { + ColorSpace.CS_CIEXYZ, ColorSpace.CS_GRAY, ColorSpace.CS_LINEAR_RGB, + ColorSpace.CS_PYCC, ColorSpace.CS_sRGB + }; + + private static final class CustomRaster extends WritableRaster { + CustomRaster(SampleModel sampleModel, Point origin) { + super(sampleModel, origin); + } + } + + public static void main(String[] args) throws Exception { + for (int fromIndex : CSS) { + for (int toIndex : CSS) { + if (fromIndex != toIndex) { + for (int type : TYPES) { + test(fromIndex, toIndex, type); + } + } + } + } + } + + private static void test(int fromIndex, int toIndex, int type) + throws Exception + { + ColorSpace fromCS = ColorSpace.getInstance(fromIndex); + ColorSpace toCS = ColorSpace.getInstance(toIndex); + ColorConvertOp op = new ColorConvertOp(fromCS, toCS, null); + + // standard source -> standard dst + BufferedImage srcGold = new BufferedImage(W, H, type); + fill(srcGold); + BufferedImage dstGold = new BufferedImage(W, H, type); + op.filter(srcGold, dstGold); + + // custom source -> standard dst + BufferedImage srcCustom = makeCustomBI(srcGold); + fill(srcCustom); + BufferedImage dst = new BufferedImage(W, H, type); + op.filter(srcCustom, dst); + verify(dstGold, dst); + + // standard source -> custom dst + BufferedImage src = new BufferedImage(W, H, type); + fill(src); + BufferedImage dstCustom = makeCustomBI(dstGold); + op.filter(src, dstCustom); + verify(dstGold, dstCustom); + + // custom source -> custom dst + srcCustom = makeCustomBI(srcGold); + fill(srcCustom); + dstCustom = makeCustomBI(dstGold); + op.filter(srcCustom, dstCustom); + verify(dstGold, dstCustom); + } + + private static BufferedImage makeCustomBI(BufferedImage bi) { + ColorModel cm = bi.getColorModel(); + SampleModel sm = bi.getSampleModel(); + CustomRaster cr = new CustomRaster(sm, new Point()); + return new BufferedImage(cm, cr, bi.isAlphaPremultiplied(), null) { + @Override + public int getType() { + return bi.getType(); + } + }; + } + + private static void fill(BufferedImage image) { + int width = image.getWidth(); + int height = image.getHeight(); + for (int x = 0; x < width; ++x) { + for (int y = 0; y < height; ++y) { + // alpha channel may be calculated slightly differently on + // different code paths, so only check fully transparent and + // fully opaque pixels + Color c = new Color(y * 255 / (height - 1), + x * 255 / (width - 1), + x % 255, + (x % 2 == 0) ? 0 : 255); + image.setRGB(x, y, c.getRGB()); + } + } + } + + private static void verify(BufferedImage dstGold, BufferedImage dst) + throws Exception + { + for (int x = 0; x < W; ++x) { + for (int y = 0; y < H; ++y) { + if (dst.getRGB(x, y) != dstGold.getRGB(x, y)) { + ImageIO.write(dst, "png", new File("custom.png")); + ImageIO.write(dstGold, "png", new File("gold.png")); + throw new RuntimeException("Test failed."); + } + } + } + } +} From 4dc9b3c9b3c7df1be619d313ff75f1e4d1368cb9 Mon Sep 17 00:00:00 2001 From: Daniel Hu <92710734+cost0much@users.noreply.github.com> Date: Thu, 25 Sep 2025 11:50:46 +0000 Subject: [PATCH 115/323] 8320577: Improve MessageHeader's toString() function to make HttpURLConnection's debug log readable Backport-of: aac43184319d852eb792c83dfb52d74a3126108d --- src/java.base/share/classes/sun/net/www/MessageHeader.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/java.base/share/classes/sun/net/www/MessageHeader.java b/src/java.base/share/classes/sun/net/www/MessageHeader.java index 9cad6ee3c2f4..502cf832cd01 100644 --- a/src/java.base/share/classes/sun/net/www/MessageHeader.java +++ b/src/java.base/share/classes/sun/net/www/MessageHeader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2023, 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 @@ -609,7 +609,7 @@ public void mergeHeader(InputStream is) throws java.io.IOException { } public synchronized String toString() { - String result = super.toString() + nkeys + " pairs: "; + String result = super.toString() + " " + nkeys + " pairs: "; for (int i = 0; i < keys.length && i < nkeys; i++) { result += "{"+keys[i]+": "+values[i]+"}"; } From e3c9383aeef3fa642521c2732b395dfffe3f9384 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 26 Sep 2025 08:02:12 +0000 Subject: [PATCH 116/323] 8319570: Change to GCC 13.2.0 for building on Linux at Oracle Reviewed-by: mdoerr, phh Backport-of: 1802cb566e956febebc181da26a666bea4942e87 --- doc/building.html | 4 ++-- doc/building.md | 4 ++-- make/conf/jib-profiles.js | 4 ++-- make/devkit/Tools.gmk | 23 ++++++++++++++++++----- 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/doc/building.html b/doc/building.html index 8ca1f0c4f84d..26720dd5b39c 100644 --- a/doc/building.html +++ b/doc/building.html @@ -539,7 +539,7 @@

      Native Compiler Linux -gcc 11.2.0 +gcc 13.2.0 macOS @@ -560,7 +560,7 @@

      gcc

      generate a warning by configure and are unlikely to work.

      The JDK is currently known to be able to compile with at least -version 11.2 of gcc.

      +version 13.2 of gcc.

      In general, any version between these two should be usable.

      clang

      The minimum accepted version of clang is 3.5. Older versions will not diff --git a/doc/building.md b/doc/building.md index 29ad343866d2..addc74aae516 100644 --- a/doc/building.md +++ b/doc/building.md @@ -336,7 +336,7 @@ issues. | Operating system | Toolchain version | | ------------------ | ------------------------------------------ | -| Linux | gcc 11.2.0 | +| Linux | gcc 13.2.0 | | macOS | Apple Xcode 10.1 (using clang 10.0.0) | | Windows | Microsoft Visual Studio 2022 update 17.1.0 | @@ -350,7 +350,7 @@ features that it does support. The minimum accepted version of gcc is 5.0. Older versions will generate a warning by `configure` and are unlikely to work. -The JDK is currently known to be able to compile with at least version 11.2 of +The JDK is currently known to be able to compile with at least version 13.2 of gcc. In general, any version between these two should be usable. diff --git a/make/conf/jib-profiles.js b/make/conf/jib-profiles.js index 91ed780e5558..886b6ce0418a 100644 --- a/make/conf/jib-profiles.js +++ b/make/conf/jib-profiles.js @@ -1080,10 +1080,10 @@ var getJibProfilesProfiles = function (input, common, data) { var getJibProfilesDependencies = function (input, common) { var devkit_platform_revisions = { - linux_x64: "gcc11.2.0-OL6.4+1.0", + linux_x64: "gcc13.2.0-OL6.4+1.0", macosx: "Xcode12.4+1.1", windows_x64: "VS2022-17.1.0+1.1", - linux_aarch64: input.build_cpu == "x64" ? "gcc11.2.0-OL7.6+1.1" : "gcc11.2.0-OL7.6+1.0", + linux_aarch64: "gcc13.2.0-OL7.6+1.0", linux_arm: "gcc8.2.0-Fedora27+1.0", linux_ppc64le: "gcc8.2.0-Fedora27+1.0", linux_s390x: "gcc8.2.0-Fedora27+1.0", diff --git a/make/devkit/Tools.gmk b/make/devkit/Tools.gmk index 187320ca26ed..5c29ee4db758 100644 --- a/make/devkit/Tools.gmk +++ b/make/devkit/Tools.gmk @@ -55,11 +55,11 @@ KERNEL_HEADERS_RPM := kernel-headers ifeq ($(BASE_OS), OL) ifeq ($(ARCH), aarch64) - BASE_URL := http://yum.oracle.com/repo/OracleLinux/OL7/6/base/$(ARCH)/ + BASE_URL := https://yum.oracle.com/repo/OracleLinux/OL7/6/base/$(ARCH)/ LINUX_VERSION := OL7.6 KERNEL_HEADERS_RPM := kernel-uek-headers else - BASE_URL := http://yum.oracle.com/repo/OracleLinux/OL6/4/base/$(ARCH)/ + BASE_URL := https://yum.oracle.com/repo/OracleLinux/OL6/4/base/$(ARCH)/ LINUX_VERSION := OL6.4 endif else ifeq ($(BASE_OS), Fedora) @@ -96,8 +96,17 @@ endif # Define external dependencies # Latest that could be made to work. -GCC_VER := 11.3.0 -ifeq ($(GCC_VER), 11.3.0) +GCC_VER := 13.2.0 +ifeq ($(GCC_VER), 13.2.0) + gcc_ver := gcc-13.2.0 + binutils_ver := binutils-2.41 + ccache_ver := ccache-3.7.12 + mpfr_ver := mpfr-4.2.0 + gmp_ver := gmp-6.3.0 + mpc_ver := mpc-1.3.1 + gdb_ver := gdb-13.2 + REQUIRED_MIN_MAKE_MAJOR_VERSION := 4 +else ifeq ($(GCC_VER), 11.3.0) gcc_ver := gcc-11.3.0 binutils_ver := binutils-2.39 ccache_ver := ccache-3.7.12 @@ -671,7 +680,11 @@ $(PREFIX)/Tools.gmk: ./Tools.gmk rm -rf $@ cp $< $@ -THESE_MAKEFILES := $(PREFIX)/Makefile $(PREFIX)/Tools.gmk +$(PREFIX)/Tars.gmk: ./Tars.gmk + rm -rf $@ + cp $< $@ + +THESE_MAKEFILES := $(PREFIX)/Makefile $(PREFIX)/Tools.gmk $(PREFIX)/Tars.gmk ########################################################################################## From 92cbc41000679022b7b204ccc6457334ba5c8f76 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 26 Sep 2025 08:04:20 +0000 Subject: [PATCH 117/323] 8357561: BootstrapLoggerTest does not work on Ubuntu 24 with LANG de_DE.UTF-8 Reviewed-by: rrich Backport-of: 670ef8cc52e6eb068ca6968142629abc1c424571 --- .../internal/BootstrapLogger/BootstrapLoggerTest.java | 6 +++++- test/jdk/java/util/logging/LocalizedLevelName.java | 3 ++- test/jdk/java/util/logging/SimpleFormatterFormat.java | 8 ++++++-- test/jdk/sun/util/logging/SourceClassName.java | 6 +++++- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/test/jdk/java/lang/System/LoggerFinder/internal/BootstrapLogger/BootstrapLoggerTest.java b/test/jdk/java/lang/System/LoggerFinder/internal/BootstrapLogger/BootstrapLoggerTest.java index 9f17478f35f7..3d69f4199cef 100644 --- a/test/jdk/java/lang/System/LoggerFinder/internal/BootstrapLogger/BootstrapLoggerTest.java +++ b/test/jdk/java/lang/System/LoggerFinder/internal/BootstrapLogger/BootstrapLoggerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2025, 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 @@ -39,6 +39,7 @@ import java.security.ProtectionDomain; import java.util.concurrent.atomic.AtomicBoolean; import java.util.List; +import java.util.Locale; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -88,6 +89,8 @@ static enum TestCase { } public static void main(String[] args) throws Exception { + Locale savedLocale = Locale.getDefault(); + Locale.setDefault(Locale.US); if (args == null || args.length == 0) { args = new String[] { TestCase.SECURE_AND_WAIT.name() }; } @@ -373,6 +376,7 @@ public static void main(String[] args) throws Exception { LogStream.err.println("Not checking executor termination for " + test); } } finally { + Locale.setDefault(savedLocale); SimplePolicy.allowAll.set(Boolean.FALSE); } LogStream.err.println(test.name() + ": PASSED"); diff --git a/test/jdk/java/util/logging/LocalizedLevelName.java b/test/jdk/java/util/logging/LocalizedLevelName.java index aaaf6f22a54e..157e965f1a91 100644 --- a/test/jdk/java/util/logging/LocalizedLevelName.java +++ b/test/jdk/java/util/logging/LocalizedLevelName.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2025, 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,7 @@ public class LocalizedLevelName { public static void main(String args[]) throws Exception { Locale defaultLocale = Locale.getDefault(); for (int i=0; i Date: Fri, 26 Sep 2025 08:08:56 +0000 Subject: [PATCH 118/323] 8362207: Add more test cases for possible double-rounding in fma Reviewed-by: rrich Backport-of: 6e368e0c696bc9b2118014937aa2e091ea662985 --- test/jdk/java/lang/Math/FusedMultiplyAddTests.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/jdk/java/lang/Math/FusedMultiplyAddTests.java b/test/jdk/java/lang/Math/FusedMultiplyAddTests.java index 61a3bfb0de17..014a4dedc0fc 100644 --- a/test/jdk/java/lang/Math/FusedMultiplyAddTests.java +++ b/test/jdk/java/lang/Math/FusedMultiplyAddTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2025, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 4851642 8253409 + * @bug 4851642 8253409 8362207 * @summary Tests for Math.fusedMac and StrictMath.fusedMac. * @build Tests * @build FusedMultiplyAddTests @@ -352,8 +352,9 @@ private static int testSimpleF() { {1.0f+Math.ulp(1.0f), 1.0f+Math.ulp(1.0f), -1.0f-2.0f*Math.ulp(1.0f), Math.ulp(1.0f)*Math.ulp(1.0f)}, - // Double-rounding if done in double precision - {0x1.fffffep23f, 0x1.000004p28f, 0x1.fep5f, 0x1.000002p52f} + // Double-rounding if done in double precision and/or double fma + {0x1.fffffep23f, 0x1.000004p28f, 0x1.fep5f, 0x1.000002p52f}, + {0x1.001p0f, 0x1.001p0f, 0x1p-100f, 0x1.002002p0f}, }; for (float[] testCase: testCases) From 55f714f1014afc3a4ab96c9abe6cfa6173db42f2 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Fri, 26 Sep 2025 16:41:16 +0000 Subject: [PATCH 119/323] 8354248: Open source several AWT GridBagLayout and List tests Backport-of: 6a310613392b9d619ae1bbe3e663cb4a022165d9 --- test/jdk/ProblemList.txt | 2 + .../awt/GridBagLayout/ComponentShortage.java | 99 +++++++++ .../awt/List/ListScrollbarCursorTest.java | 70 +++++++ test/jdk/java/awt/List/ListScrollbarTest.java | 197 ++++++++++++++++++ 4 files changed, 368 insertions(+) create mode 100644 test/jdk/java/awt/GridBagLayout/ComponentShortage.java create mode 100644 test/jdk/java/awt/List/ListScrollbarCursorTest.java create mode 100644 test/jdk/java/awt/List/ListScrollbarTest.java diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index 2f7c2c7190f3..a63d471757a6 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -466,6 +466,7 @@ java/awt/TrayIcon/RightClickWhenBalloonDisplayed/RightClickWhenBalloonDisplayed. java/awt/PopupMenu/PopupMenuLocation.java 8238720 windows-all java/awt/GridLayout/ComponentPreferredSize/ComponentPreferredSize.java 8238720,8324782 windows-all,macosx-all java/awt/GridLayout/ChangeGridSize/ChangeGridSize.java 8238720,8324782 windows-all,macosx-all +java/awt/GridBagLayout/ComponentShortage.java 8355280 windows-all,linux-all java/awt/event/MouseEvent/FrameMouseEventAbsoluteCoordsTest/FrameMouseEventAbsoluteCoordsTest.java 8238720 windows-all java/awt/List/HandlingKeyEventIfMousePressedTest.java 6848358 macosx-all,windows-all @@ -836,6 +837,7 @@ java/awt/Focus/FrameMinimizeTest/FrameMinimizeTest.java 8016266 linux-x64 java/awt/Frame/SizeMinimizedTest.java 8305915 linux-x64 java/awt/PopupMenu/PopupHangTest.java 8340022 windows-all java/awt/Focus/InactiveFocusRace.java 8023263 linux-all +java/awt/List/ListScrollbarCursorTest.java 8066410 generic-all java/awt/Checkbox/CheckboxBoxSizeTest.java 8340870 windows-all java/awt/Checkbox/CheckboxIndicatorSizeTest.java 8340870 windows-all java/awt/Checkbox/CheckboxNullLabelTest.java 8340870 windows-all diff --git a/test/jdk/java/awt/GridBagLayout/ComponentShortage.java b/test/jdk/java/awt/GridBagLayout/ComponentShortage.java new file mode 100644 index 000000000000..dd641bbf066c --- /dev/null +++ b/test/jdk/java/awt/GridBagLayout/ComponentShortage.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2008, 2025, 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 4238932 + * @summary JTextField in gridBagLayout does not properly set MinimumSize + * @key headful + * @run main ComponentShortage + */ + +import java.awt.Dimension; +import java.awt.EventQueue; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Robot; +import javax.swing.JFrame; +import javax.swing.JTextField; + +public class ComponentShortage { + static final int WIDTH_REDUCTION = 50; + static JFrame frame; + static JTextField jtf; + static volatile Dimension size; + static volatile Dimension fSize; + + public static void main(String[] args) throws Exception { + Robot robot = new Robot(); + try { + EventQueue.invokeAndWait(() -> { + frame = new JFrame(); + frame.setLayout(new GridBagLayout()); + GridBagConstraints gBC = new GridBagConstraints(); + + gBC.gridx = 1; + gBC.gridy = 0; + gBC.gridwidth = 1; + gBC.gridheight = 1; + gBC.weightx = 1.0; + gBC.weighty = 0.0; + gBC.fill = GridBagConstraints.NONE; + gBC.anchor = GridBagConstraints.NORTHWEST; + jtf = new JTextField(16); + frame.add(jtf, gBC); + frame.pack(); + frame.setVisible(true); + }); + robot.waitForIdle(); + robot.delay(1000); + + EventQueue.invokeAndWait(() -> { + size = jtf.getSize(); + }); + System.out.println("TextField size before Frame's width reduction : " + size); + + EventQueue.invokeAndWait(() -> { + frame.setSize(frame.getSize().width - WIDTH_REDUCTION, frame.getSize().height); + }); + frame.repaint(); + + EventQueue.invokeAndWait(() -> { + size = jtf.getSize(); + fSize = frame.getSize(); + }); + System.out.println("TextField size after Frame's width reduction : " + size); + + if (size.width < fSize.width - WIDTH_REDUCTION) { + throw new RuntimeException("Width of JTextField is too small to be visible."); + } + System.out.println("Test passed."); + } finally { + EventQueue.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + } +} diff --git a/test/jdk/java/awt/List/ListScrollbarCursorTest.java b/test/jdk/java/awt/List/ListScrollbarCursorTest.java new file mode 100644 index 000000000000..fc832029b134 --- /dev/null +++ b/test/jdk/java/awt/List/ListScrollbarCursorTest.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2000, 2025, 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 4290684 + * @summary Tests that cursor on the scrollbar of the list is set to default. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual ListScrollbarCursorTest + */ + +import java.awt.Cursor; +import java.awt.Frame; +import java.awt.List; +import java.awt.Panel; + +public class ListScrollbarCursorTest { + public static void main(String[] args) throws Exception { + String INSTRUCTIONS = """ + 1. You see the list in the middle of the panel. + This list has two scrollbars. + 2. The cursor should have a shape of hand over the main area + and a shape of arrow over scrollbars. + 3. Move the mouse cursor to either horizontal or vertical scrollbar. + 4. Press PASS if you see the default arrow cursor else press FAIL. + """; + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(35) + .testUI(ListScrollbarCursorTest::initialize) + .build() + .awaitAndCheck(); + } + + static Frame initialize() { + Frame frame = new Frame("List Scrollbar Cursor Test"); + Panel panel = new Panel(); + List list = new List(3); + list.add("List item with a very long name" + + "(just to make the horizontal scrollbar visible)"); + list.add("Item 2"); + list.add("Item 3"); + list.setCursor(new Cursor(Cursor.HAND_CURSOR)); + panel.add(list); + frame.add(panel); + frame.setSize(200, 200); + return frame; + } +} diff --git a/test/jdk/java/awt/List/ListScrollbarTest.java b/test/jdk/java/awt/List/ListScrollbarTest.java new file mode 100644 index 000000000000..b676303b927a --- /dev/null +++ b/test/jdk/java/awt/List/ListScrollbarTest.java @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2001, 2025, 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 4096445 + * @summary Test to verify List Scollbar appears/disappears automatically + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual ListScrollbarTest + */ + +import java.awt.Button; +import java.awt.Component; +import java.awt.Event; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.List; + +public class ListScrollbarTest extends Frame { + static final int ITEMS = 10; + List ltList; + List rtList; + + public static void main(String[] args) throws Exception { + String INSTRUCTIONS = """ + 1. There are two lists added to the Frame separated by + a column of buttons + 2. Double click on any item(s) on the left list, you would see + a '*' added at the end of the item + 3. Keep double clicking on the same item till the length of the + item exceeds the width of the list + 4. Now, if you don't get the horizontal scrollbar on + the left list click FAIL. + 5. If you get horizontal scrollbar, select the item + (that you double clicked) and press the '>' button + to move the item to the right list. + 6. If horizontal scroll bar appears on the right list + as well as disappears from the left list [only if both + happen] proceed with step 8 else click FAIL + 7. Now move the same item to the left list, by pressing + '<' button + 8. If the horizontal scrollbar appears on the left list + and disappears from the right list[only if both happen] + click PASS else click FAIL. + """; + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(35) + .testUI(ListScrollbarTest::new) + .build() + .awaitAndCheck(); + } + + public ListScrollbarTest() { + super("List scroll bar test"); + GridBagLayout gbl = new GridBagLayout(); + ltList = new List(ITEMS, true); + rtList = new List(0, true); + setLayout(gbl); + add(ltList, 0, 0, 1, 5, 1.0, 1.0); + add(rtList, 2, 0, 1, 5, 1.0, 1.0); + add(new Button(">"), 1, 0, 1, 1, 0, 1.0); + add(new Button(">>"), 1, 1, 1, 1, 0, 1.0); + add(new Button("<"), 1, 2, 1, 1, 0, 1.0); + add(new Button("<<"), 1, 3, 1, 1, 0, 1.0); + add(new Button("!"), 1, 4, 1, 1, 0, 1.0); + + for (int i = 0; i < ITEMS; i++) { + ltList.addItem("item " + i); + } + setSize(220, 250); + } + + void add(Component comp, int x, int y, int w, int h, double weightx, double weighty) { + GridBagLayout gbl = (GridBagLayout) getLayout(); + GridBagConstraints c = new GridBagConstraints(); + c.fill = GridBagConstraints.BOTH; + c.gridx = x; + c.gridy = y; + c.gridwidth = w; + c.gridheight = h; + c.weightx = weightx; + c.weighty = weighty; + add(comp); + gbl.setConstraints(comp, c); + } + + void reverseSelections(List l) { + for (int i = 0; i < l.countItems(); i++) { + if (l.isSelected(i)) { + l.deselect(i); + } else { + l.select(i); + } + } + } + + void deselectAll(List l) { + for (int i = 0; i < l.countItems(); i++) { + l.deselect(i); + } + } + + void replaceItem(List l, String item) { + for (int i = 0; i < l.countItems(); i++) { + if (l.getItem(i).equals(item)) { + l.replaceItem(item + "*", i); + } + } + } + + void move(List l1, List l2, boolean all) { + + // if all the items are to be moved + if (all) { + for (int i = 0; i < l1.countItems(); i++) { + l2.addItem(l1.getItem(i)); + } + l1.delItems(0, l1.countItems() - 1); + } else { // else move the selected items + String[] items = l1.getSelectedItems(); + int[] itemIndexes = l1.getSelectedIndexes(); + + deselectAll(l2); + for (int i = 0; i < items.length; i++) { + l2.addItem(items[i]); + l2.select(l2.countItems() - 1); + if (i == 0) { + l2.makeVisible(l2.countItems() - 1); + } + } + for (int i = itemIndexes.length - 1; i >= 0; i--) { + l1.delItem(itemIndexes[i]); + } + } + } + + @Override + public boolean action(Event evt, Object arg) { + if (">".equals(arg)) { + move(ltList, rtList, false); + } else if (">>".equals(arg)) { + move(ltList, rtList, true); + } else if ("<".equals(arg)) { + move(rtList, ltList, false); + } else if ("<<".equals(arg)) { + move(rtList, ltList, true); + } else if ("!".equals(arg)) { + if (ltList.getSelectedItems().length > 0) { + reverseSelections(ltList); + } else if (rtList.getSelectedItems().length > 0) { + reverseSelections(rtList); + } + } else if (evt.target == rtList || evt.target == ltList) { + replaceItem((List) evt.target, (String) arg); + } else { + return false; + } + return true; + } + + @Override + public boolean handleEvent(Event evt) { + if (evt.id == Event.LIST_SELECT + || evt.id == Event.LIST_DESELECT) { + if (evt.target == ltList) { + deselectAll(rtList); + } else if (evt.target == rtList) { + deselectAll(ltList); + } + return true; + } + return super.handleEvent(evt); + } +} From f8f5ee2a1b29162581f186eff709808e8ef02990 Mon Sep 17 00:00:00 2001 From: Rui Li Date: Mon, 29 Sep 2025 17:25:06 +0000 Subject: [PATCH 120/323] 8320049: PKCS10 would not discard the cause when throw SignatureException on invalid key Backport-of: 2c4c6c9ba3f4682e3696ecdd9aea1905443785fa --- src/java.base/share/classes/sun/security/pkcs10/PKCS10.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/java.base/share/classes/sun/security/pkcs10/PKCS10.java b/src/java.base/share/classes/sun/security/pkcs10/PKCS10.java index af1cc7b7752e..147bb4495e98 100644 --- a/src/java.base/share/classes/sun/security/pkcs10/PKCS10.java +++ b/src/java.base/share/classes/sun/security/pkcs10/PKCS10.java @@ -23,7 +23,6 @@ * questions. */ - package sun.security.pkcs10; import java.io.PrintStream; @@ -173,7 +172,7 @@ public PKCS10(byte[] data) throw new SignatureException("Invalid PKCS #10 signature"); } } catch (InvalidKeyException e) { - throw new SignatureException("Invalid key"); + throw new SignatureException("Invalid key", e); } catch (InvalidAlgorithmParameterException e) { throw new SignatureException("Invalid signature parameters", e); } catch (ProviderException e) { From 9f9d985fae6514ec4d04cfe76688804a9939a376 Mon Sep 17 00:00:00 2001 From: Rui Li Date: Mon, 29 Sep 2025 17:25:27 +0000 Subject: [PATCH 121/323] 8347277: java/awt/Focus/ComponentLostFocusTest.java fails intermittently Backport-of: e2a503e26ee2a3c428c5db0cd4cbe71cdc7d837f --- .../awt/Focus/ComponentLostFocusTest.java | 38 +++++++++++++------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/test/jdk/java/awt/Focus/ComponentLostFocusTest.java b/test/jdk/java/awt/Focus/ComponentLostFocusTest.java index 6af8322b2cd8..8045ace43d5b 100644 --- a/test/jdk/java/awt/Focus/ComponentLostFocusTest.java +++ b/test/jdk/java/awt/Focus/ComponentLostFocusTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2025, 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 @@ -35,13 +35,20 @@ import java.awt.Frame; import java.awt.KeyboardFocusManager; import java.awt.Point; +import java.awt.Rectangle; import java.awt.Robot; import java.awt.TextField; +import java.awt.Toolkit; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.InputEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; +import java.io.File; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import javax.imageio.ImageIO; public class ComponentLostFocusTest { @@ -49,10 +56,10 @@ public class ComponentLostFocusTest { static TextField tf; static Robot r; static Dialog dialog = null; - static volatile boolean passed; static volatile Point loc; static volatile int width; static volatile int top; + static final CountDownLatch focusGainedLatch = new CountDownLatch(1); private static void createTestUI() { @@ -75,11 +82,7 @@ public void windowGainedFocus(WindowEvent e) { public static void doTest() { System.out.println("dialog.setVisible.... "); - new Thread(new Runnable() { - public void run() { - dialog.setVisible(true); - } - }).start(); + new Thread(() -> dialog.setVisible(true)).start(); // The bug is that this construction leads to the redundant xRequestFocus // By the way, the requestFocusInWindow() works fine before the fix @@ -98,7 +101,7 @@ public void run() { tf.addFocusListener(new FocusAdapter() { public void focusGained(FocusEvent e) { System.out.println("TextField gained focus: " + e); - passed = true; + focusGainedLatch.countDown(); } }); @@ -116,6 +119,17 @@ private static void doRequestFocusToTextField() { tf.requestFocus(); } + private static void captureScreen() { + try { + final Rectangle screenBounds = new Rectangle( + Toolkit.getDefaultToolkit().getScreenSize()); + ImageIO.write(r.createScreenCapture(screenBounds), + "png", new File("ComponentLostFocusTest.png")); + } catch (Exception e) { + e.printStackTrace(); + } + } + public static final void main(String args[]) throws Exception { r = new Robot(); r.setAutoDelay(100); @@ -138,9 +152,10 @@ public static final void main(String args[]) throws Exception { System.out.println("Focus owner: " + KeyboardFocusManager.getCurrentKeyboardFocusManager(). getFocusOwner()); - - if (!passed) { - throw new RuntimeException("TextField got no focus! Test failed."); + if (!focusGainedLatch.await(5, TimeUnit.SECONDS)) { + captureScreen(); + throw new RuntimeException("Waited too long, " + + "TextField got no focus! Test failed."); } } finally { EventQueue.invokeAndWait(() -> { @@ -151,4 +166,3 @@ public static final void main(String args[]) throws Exception { } } } - From 950e430913df2d5f81acbbd8e7d9d883a7c03c5d Mon Sep 17 00:00:00 2001 From: Matthias Baesken Date: Wed, 1 Oct 2025 14:05:24 +0000 Subject: [PATCH 122/323] 8361871: [GCC static analyzer] complains about use of uninitialized value ckpObject in p11_util.c Backport-of: 518d5f4bbb78ae35db793d7fd15b3cd35c881664 --- src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_util.c b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_util.c index 4edf9c94ce29..6830c4b9d73c 100644 --- a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_util.c +++ b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_util.c @@ -1191,7 +1191,7 @@ CK_VOID_PTR jObjectToPrimitiveCKObjectPtr(JNIEnv *env, jobject jObject, CK_ULONG jclass jBooleanArrayClass, jIntArrayClass, jLongArrayClass; jclass jStringClass; jclass jObjectClass, jClassClass; - CK_VOID_PTR ckpObject; + CK_VOID_PTR ckpObject = NULL; jmethodID jMethod; jobject jClassObject; jstring jClassNameString; From f2aec722dfc6dcb42941cad74797f5fac284381b Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Wed, 1 Oct 2025 16:31:27 +0000 Subject: [PATCH 123/323] 8353958: Open source several AWT ScrollPane tests - Batch 2 Backport-of: e00355a036936c5290cf8d85fd3c4f743b0ad23a --- test/jdk/ProblemList.txt | 1 + .../ScrollPane/ScrollPaneAsNeededTest.java | 67 ++++++++ .../ScrollPane/ScrollPaneComponentTest.java | 125 +++++++++++++++ .../awt/ScrollPane/ScrollPaneEventType.java | 81 ++++++++++ .../java/awt/ScrollPane/ScrollPaneSize.java | 97 ++++++++++++ .../ScrollPanechildViewportTest.java | 146 ++++++++++++++++++ 6 files changed, 517 insertions(+) create mode 100644 test/jdk/java/awt/ScrollPane/ScrollPaneAsNeededTest.java create mode 100644 test/jdk/java/awt/ScrollPane/ScrollPaneComponentTest.java create mode 100644 test/jdk/java/awt/ScrollPane/ScrollPaneEventType.java create mode 100644 test/jdk/java/awt/ScrollPane/ScrollPaneSize.java create mode 100644 test/jdk/java/awt/ScrollPane/ScrollPanechildViewportTest.java diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index a63d471757a6..b8ea17dece1f 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -446,6 +446,7 @@ java/awt/FileDialog/ModalFocus/FileDialogModalFocusTest.java 8194751 linux-all java/awt/image/VolatileImage/BitmaskVolatileImage.java 8133102 linux-all java/awt/SplashScreen/MultiResolutionSplash/unix/UnixMultiResolutionSplashTest.java 8203004 linux-all java/awt/ScrollPane/ScrollPositionTest.java 8040070 linux-all +java/awt/ScrollPane/ScrollPaneScrollType/ScrollPaneEventType.java 8296516 macosx-all java/awt/Robot/AcceptExtraMouseButtons/AcceptExtraMouseButtons.java 7107528 linux-all,macosx-all java/awt/Mouse/MouseDragEvent/MouseDraggedTest.java 8080676 linux-all java/awt/Mouse/MouseModifiersUnitTest/MouseModifiersInKeyEvent.java 8157147 linux-all,windows-all,macosx-all diff --git a/test/jdk/java/awt/ScrollPane/ScrollPaneAsNeededTest.java b/test/jdk/java/awt/ScrollPane/ScrollPaneAsNeededTest.java new file mode 100644 index 000000000000..e4be90fae311 --- /dev/null +++ b/test/jdk/java/awt/ScrollPane/ScrollPaneAsNeededTest.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2003, 2025, 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 4152524 + * @summary ScrollPane AS_NEEDED always places scrollbars first time component + * is laid out + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual ScrollPaneAsNeededTest + */ + +import java.awt.BorderLayout; +import java.awt.Button; +import java.awt.Frame; +import java.awt.ScrollPane; + +public class ScrollPaneAsNeededTest { + public static void main(String[] args) throws Exception { + String INSTRUCTIONS = """ + 1. You will see a frame titled 'ScrollPane as needed' + of minimum possible size in the middle of the screen. + 2. If for the first resize of frame(using mouse) to + a very big size(may be, to half the area of the screen) + the scrollbars(any - horizontal, vertical or both) + appear, click FAIL else, click PASS. + """; + PassFailJFrame.builder() + .title("Test Instructions") + .instructions(INSTRUCTIONS) + .columns(35) + .testUI(ScrollPaneAsNeededTest::initialize) + .build() + .awaitAndCheck(); + } + + static Frame initialize() { + Frame f = new Frame("ScrollPane as needed"); + f.setLayout(new BorderLayout()); + ScrollPane sp = new ScrollPane(ScrollPane.SCROLLBARS_AS_NEEDED); + sp.add(new Button("TEST")); + f.add("Center", sp); + f.setSize(200, 200); + return f; + } +} diff --git a/test/jdk/java/awt/ScrollPane/ScrollPaneComponentTest.java b/test/jdk/java/awt/ScrollPane/ScrollPaneComponentTest.java new file mode 100644 index 000000000000..b2fc4c77b632 --- /dev/null +++ b/test/jdk/java/awt/ScrollPane/ScrollPaneComponentTest.java @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2003, 2025, 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 4100671 + * @summary removing and adding back ScrollPane component does not work + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual ScrollPaneComponentTest + */ + +import java.awt.Adjustable; +import java.awt.BorderLayout; +import java.awt.Button; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Panel; +import java.awt.ScrollPane; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class ScrollPaneComponentTest { + public static void main(String[] args) throws Exception { + String INSTRUCTIONS = """ + 1. Notice the scrollbars (horizontal and vertical) + in the Frame titled 'ScrollPane Component Test' + 2. Click the button labeled 'Remove and add back + ScrollPane Contents' + 3. If the Scrollbars (horizontal or vertical or both) + disappears in the Frame, then press FAIL, else press PASS. + """; + PassFailJFrame.builder() + .title("Test Instructions") + .instructions(INSTRUCTIONS) + .columns(35) + .testUI(ScrollPaneComponentTest::initialize) + .build() + .awaitAndCheck(); + } + + static Frame initialize() { + Frame fr = new Frame("ScrollPane Component Test"); + fr.setLayout(new BorderLayout()); + ScrollTester test = new ScrollTester(); + + fr.add(test); + fr.pack(); + fr.setSize(200, 200); + + Adjustable vadj = test.pane.getVAdjustable(); + Adjustable hadj = test.pane.getHAdjustable(); + vadj.setUnitIncrement(5); + hadj.setUnitIncrement(5); + return fr; + } +} + +class Box extends Component { + public Dimension getPreferredSize() { + System.out.println("asked for size"); + return new Dimension(300, 300); + } + + public void paint(Graphics gr) { + super.paint(gr); + gr.setColor(Color.red); + gr.drawLine(5, 5, 295, 5); + gr.drawLine(295, 5, 295, 295); + gr.drawLine(295, 295, 5, 295); + gr.drawLine(5, 295, 5, 5); + System.out.println("Painted!!"); + } +} + +class ScrollTester extends Panel { + public ScrollPane pane; + private final Box child; + + class Handler implements ActionListener { + public void actionPerformed(ActionEvent e) { + System.out.println("Removing scrollable component"); + pane.remove(child); + System.out.println("Adding back scrollable component"); + pane.add(child); + System.out.println("Done Adding back scrollable component"); + } + } + + public ScrollTester() { + pane = new ScrollPane(); + pane.setSize(200, 200); + child = new Box(); + pane.add(child); + setLayout(new BorderLayout()); + Button changeScrollContents = new Button("Remove and add back ScrollPane Contents"); + changeScrollContents.setBackground(Color.red); + changeScrollContents.addActionListener(new Handler()); + add("North", changeScrollContents); + add("Center", pane); + } +} diff --git a/test/jdk/java/awt/ScrollPane/ScrollPaneEventType.java b/test/jdk/java/awt/ScrollPane/ScrollPaneEventType.java new file mode 100644 index 000000000000..47b4ae416c12 --- /dev/null +++ b/test/jdk/java/awt/ScrollPane/ScrollPaneEventType.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2003, 2025, 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 4075484 + * @summary Tests that events of different types are generated for the + * corresponding scroll actions. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual ScrollPaneEventType + */ + +import java.awt.BorderLayout; +import java.awt.Button; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.ScrollPane; +import java.awt.event.AdjustmentListener; + +public class ScrollPaneEventType { + public static void main(String[] args) throws Exception { + String INSTRUCTIONS = """ + 1. This test verifies that when user performs some scrolling operation on + ScrollPane the correct AdjustmentEvent is being generated. + 2. To test this, press on: + - scrollbar's arrows and verify that UNIT event is generated, + - scrollbar's grey area(non-thumb) and verify that BLOCK event is + generated, + - drag scrollbar's thumb and verify that TRACK event is generated + If you see correct events for both scroll bars then test is PASSED. + Otherwise it is FAILED. + """; + PassFailJFrame.builder() + .title("Test Instructions") + .instructions(INSTRUCTIONS) + .columns(35) + .testUI(ScrollPaneEventType::initialize) + .logArea() + .build() + .awaitAndCheck(); + } + + static Frame initialize() { + Frame frame = new Frame("ScrollPane event type test"); + frame.setLayout(new BorderLayout()); + ScrollPane pane = new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS); + pane.add(new Button("press") { + public Dimension getPreferredSize() { + return new Dimension(1000, 1000); + } + }); + + AdjustmentListener listener = e -> PassFailJFrame.log(e.toString()); + pane.getHAdjustable().addAdjustmentListener(listener); + pane.getVAdjustable().addAdjustmentListener(listener); + frame.add(pane); + frame.setSize(200, 200); + return frame; + } +} diff --git a/test/jdk/java/awt/ScrollPane/ScrollPaneSize.java b/test/jdk/java/awt/ScrollPane/ScrollPaneSize.java new file mode 100644 index 000000000000..3130563d4a97 --- /dev/null +++ b/test/jdk/java/awt/ScrollPane/ScrollPaneSize.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 1999, 2025, 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 4117404 + * @summary Tests that child component is always at least large as scrollpane + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual ScrollPaneSize + */ + +import java.awt.Button; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Frame; +import java.awt.GridLayout; +import java.awt.Insets; +import java.awt.Panel; +import java.awt.ScrollPane; +import java.util.List; + +public class ScrollPaneSize { + public static void main(String[] args) throws Exception { + String INSTRUCTIONS = """ + 1. Three frames representing the three different ScrollPane scrollbar + policies will appear. + 2. Verify that when you resize the windows, the child component in the + scrollpane always expands to fill the scrollpane. The scrollpane + background is colored red to show any improper bleed through. + """; + PassFailJFrame.builder() + .title("Test Instructions") + .instructions(INSTRUCTIONS) + .columns(40) + .testUI(ScrollPaneSize::initialize) + .positionTestUIRightColumn() + .build() + .awaitAndCheck(); + } + + static List initialize() { + return List.of(new ScrollFrame("SCROLLBARS_AS_NEEDED", ScrollPane.SCROLLBARS_AS_NEEDED), + new ScrollFrame("SCROLLBARS_ALWAYS", ScrollPane.SCROLLBARS_ALWAYS), + new ScrollFrame("SCROLLBARS_NEVER", ScrollPane.SCROLLBARS_NEVER)); + } +} + +class ScrollFrame extends Frame { + ScrollFrame(String title, int policy) { + super(title); + setLayout(new GridLayout(1, 1)); + ScrollPane c = new ScrollPane(policy); + c.setBackground(Color.red); + Panel panel = new TestPanel(); + c.add(panel); + add(c); + pack(); + Dimension size = panel.getPreferredSize(); + Insets insets = getInsets(); + setSize(size.width + 45 + insets.right + insets.left, + size.height + 20 + insets.top + insets.bottom); + } +} + +class TestPanel extends Panel { + TestPanel() { + setLayout(new FlowLayout()); + setBackground(Color.white); + + Button b1, b2, b3; + add(b1 = new Button("Button1")); + add(b2 = new Button("Button2")); + add(b3 = new Button("Button3")); + } +} diff --git a/test/jdk/java/awt/ScrollPane/ScrollPanechildViewportTest.java b/test/jdk/java/awt/ScrollPane/ScrollPanechildViewportTest.java new file mode 100644 index 000000000000..0dc0772aebaf --- /dev/null +++ b/test/jdk/java/awt/ScrollPane/ScrollPanechildViewportTest.java @@ -0,0 +1,146 @@ +/* + * Copyright (c) 1998, 2025, 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 4094581 + * @summary ScrollPane does not refresh properly when child is just smaller than viewport + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual ScrollPanechildViewportTest + */ + +import java.awt.Button; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.Panel; +import java.awt.ScrollPane; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class ScrollPanechildViewportTest { + public static void main(String[] args) throws Exception { + String INSTRUCTIONS = """ + 1. Click "Slightly Large" and ensure scrollbars are VISIBLE + 2. Click "Slightly Small" and ensure there are NO scrollbars + 3. Click "Smaller" and ensure there are NO scrollbars + 4. If everything is ok, click PASS, else click FAIL. + """; + PassFailJFrame.builder() + .title("Test Instructions") + .instructions(INSTRUCTIONS) + .columns(35) + .testUI(ScrollPanechildViewportTest::initialize) + .build() + .awaitAndCheck(); + } + + static Frame initialize() { + return new Test(); + } +} + +class Test extends Frame implements ActionListener { + Button b1, b2, b3; + MyPanel p; + int state; // 0 = slightly large, 1 = slightly smaller, 2 = smaller + + public Test() { + ScrollPane sp = new ScrollPane(); + p = new MyPanel(); + p.setBackground(Color.yellow); + state = 1; + sp.add(p); + add(sp, "Center"); + + Panel p1 = new Panel(); + b1 = new Button("Slightly Large"); + b1.addActionListener(this); + p1.add(b1); + b2 = new Button("Slightly Small"); + b2.addActionListener(this); + p1.add(b2); + b3 = new Button("Smaller"); + b3.addActionListener(this); + p1.add(b3); + + add(p1, "South"); + + setSize(400, 200); + //added to test to move test frame away from instructions + setLocation(0, 350); + } + + public void actionPerformed(ActionEvent e) { + Object source = e.getSource(); + + // set size to small and re-validate the panel to get correct size of + // scrollpane viewport without scrollbars + + state = 2; + p.invalidate(); + validate(); + + Dimension pd = ((ScrollPane) p.getParent()).getViewportSize(); + + if (source.equals(b1)) { + p.setBackground(Color.green); + state = 0; + } else if (source.equals(b2)) { + p.setBackground(Color.yellow); + state = 1; + } else if (source.equals(b3)) { + p.setBackground(Color.red); + state = 2; + } + + p.invalidate(); + validate(); + System.out.println("Panel Size = " + p.getSize()); + System.out.println("ScrollPane Viewport Size = " + pd); + System.out.println(" "); + } + + class MyPanel extends Panel { + public Dimension getPreferredSize() { + Dimension d = null; + Dimension pd = ((ScrollPane) getParent()).getViewportSize(); + switch (state) { + case 0 -> { + d = new Dimension(pd.width + 2, pd.height + 2); + System.out.println("Preferred size: " + d); + } + case 1 -> { + d = new Dimension(pd.width - 2, pd.height - 2); + System.out.println("Preferred size: " + d); + } + case 2 -> { + d = new Dimension(50, 50); + System.out.println("Preferred size: " + d); + } + } + return d; + } + } +} From f92e3c791bf0d6cd6777ba3565b4aec21c51ab56 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Wed, 1 Oct 2025 16:31:45 +0000 Subject: [PATCH 124/323] 8328247: Remove redundant dir for tests converted from applet to main Backport-of: ece4124f25f676da9bf2d1b7fd8e4394dd7d31af --- .../{FileFilterDescription => }/FileFilterDescription.java | 0 test/jdk/javax/swing/JFileChooser/{6798062 => }/bug6798062.java | 0 test/jdk/javax/swing/JInternalFrame/{6726866 => }/bug6726866.java | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename test/jdk/javax/swing/JFileChooser/{FileFilterDescription => }/FileFilterDescription.java (100%) rename test/jdk/javax/swing/JFileChooser/{6798062 => }/bug6798062.java (100%) rename test/jdk/javax/swing/JInternalFrame/{6726866 => }/bug6726866.java (100%) diff --git a/test/jdk/javax/swing/JFileChooser/FileFilterDescription/FileFilterDescription.java b/test/jdk/javax/swing/JFileChooser/FileFilterDescription.java similarity index 100% rename from test/jdk/javax/swing/JFileChooser/FileFilterDescription/FileFilterDescription.java rename to test/jdk/javax/swing/JFileChooser/FileFilterDescription.java diff --git a/test/jdk/javax/swing/JFileChooser/6798062/bug6798062.java b/test/jdk/javax/swing/JFileChooser/bug6798062.java similarity index 100% rename from test/jdk/javax/swing/JFileChooser/6798062/bug6798062.java rename to test/jdk/javax/swing/JFileChooser/bug6798062.java diff --git a/test/jdk/javax/swing/JInternalFrame/6726866/bug6726866.java b/test/jdk/javax/swing/JInternalFrame/bug6726866.java similarity index 100% rename from test/jdk/javax/swing/JInternalFrame/6726866/bug6726866.java rename to test/jdk/javax/swing/JInternalFrame/bug6726866.java From 43ca36d5480a1b6d7efcc1680a334733075d98f4 Mon Sep 17 00:00:00 2001 From: Christoph Langer Date: Thu, 2 Oct 2025 12:57:26 +0000 Subject: [PATCH 125/323] 8346875: Test jdk/jdk/jfr/event/os/TestCPULoad.java fails on macOS Backport-of: a3eef6c2416eb0e02fbd154d84c98b12bcb66e97 --- test/jdk/jdk/jfr/event/os/TestCPULoad.java | 26 ++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/test/jdk/jdk/jfr/event/os/TestCPULoad.java b/test/jdk/jdk/jfr/event/os/TestCPULoad.java index efc9b39adf50..1edb16396995 100644 --- a/test/jdk/jdk/jfr/event/os/TestCPULoad.java +++ b/test/jdk/jdk/jfr/event/os/TestCPULoad.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2025, 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 @@ -30,7 +30,6 @@ import jdk.test.lib.jfr.EventNames; import jdk.test.lib.jfr.Events; - /** * @test * @key jfr @@ -41,13 +40,32 @@ public class TestCPULoad { private final static String EVENT_NAME = EventNames.CPULoad; + public static boolean isPrime(int num) { + if (num <= 1) return false; + for (int i = 2; i <= Math.sqrt(num); i++) { + if (num % i == 0) return false; + } + return true; + } + + public static int burnCpuCycles(int limit) { + int primeCount = 0; + for (int i = 2; i < limit; i++) { + if (isPrime(i)) { + primeCount++; + } + } + return primeCount; + } + public static void main(String[] args) throws Throwable { Recording recording = new Recording(); recording.enable(EVENT_NAME); recording.start(); - // Need to sleep so a time delta can be calculated - Thread.sleep(100); + // burn some cycles to check increase of CPU related counters + int pn = burnCpuCycles(2500000); recording.stop(); + System.out.println("Found " + pn + " primes while burning cycles"); List events = Events.fromRecording(recording); if (events.isEmpty()) { From f2cb87f9a4356c1ea5dc0bc280af491bf96e3d0e Mon Sep 17 00:00:00 2001 From: Rui Li Date: Thu, 2 Oct 2025 16:55:51 +0000 Subject: [PATCH 126/323] 8360178: TestArguments.atojulong gtest has incorrect format string Backport-of: 878497fb85b9f7d066829b745324028f9f8cdc60 --- test/hotspot/gtest/runtime/test_arguments.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/hotspot/gtest/runtime/test_arguments.cpp b/test/hotspot/gtest/runtime/test_arguments.cpp index a85183f3a5ef..d4e1db1fa38c 100644 --- a/test/hotspot/gtest/runtime/test_arguments.cpp +++ b/test/hotspot/gtest/runtime/test_arguments.cpp @@ -23,7 +23,6 @@ #include "precompiled.hpp" #include "jvm.h" -#include "unittest.hpp" #include "runtime/arguments.hpp" #include "runtime/flags/jvmFlag.hpp" #include "utilities/align.hpp" @@ -31,6 +30,8 @@ #include +#include "unittest.hpp" + class ArgumentsTest : public ::testing::Test { public: static intx parse_xss_inner_annotated(const char* str, jint expected_err, const char* file, int line_number); @@ -58,7 +59,7 @@ class ArgumentsTest : public ::testing::Test { TEST_F(ArgumentsTest, atojulong) { char ullong_max[32]; - int ret = jio_snprintf(ullong_max, sizeof(ullong_max), JULONG_FORMAT, ULLONG_MAX); + int ret = jio_snprintf(ullong_max, sizeof(ullong_max), "%llu", ULLONG_MAX); ASSERT_NE(-1, ret); julong value; From 87d1579f75e230d497373212f4da1202b5686f61 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Thu, 2 Oct 2025 18:05:07 +0000 Subject: [PATCH 127/323] 8354701: Open source few JToolTip tests Backport-of: f98af0ad617a445362859e58af48258bfd5bed03 --- .../jdk/javax/swing/JToolTip/TooltipTest.java | 90 +++++++++++++++++++ test/jdk/javax/swing/JToolTip/bug4225314.java | 72 +++++++++++++++ test/jdk/javax/swing/JToolTip/bug4255441.java | 64 +++++++++++++ 3 files changed, 226 insertions(+) create mode 100644 test/jdk/javax/swing/JToolTip/TooltipTest.java create mode 100644 test/jdk/javax/swing/JToolTip/bug4225314.java create mode 100644 test/jdk/javax/swing/JToolTip/bug4255441.java diff --git a/test/jdk/javax/swing/JToolTip/TooltipTest.java b/test/jdk/javax/swing/JToolTip/TooltipTest.java new file mode 100644 index 000000000000..c081730a8d7b --- /dev/null +++ b/test/jdk/javax/swing/JToolTip/TooltipTest.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 1999, 2025, 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 4207474 4218495 4375928 + * @summary Tests various tooltip issues: HTML tooltips, long tooltip text + * and mnemonic keys displayed in tooltips + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual TooltipTest + */ + +import java.awt.FlowLayout; +import java.awt.event.KeyEvent; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.UIManager; + +public class TooltipTest { + private static final String INSTRUCTIONS = """ + 1. Move the mouse over the button labeled "Red tip" and let it stay + still in order to test HTML in JToolTip. If the tooltip has some + text which is red then test passes, otherwise it fails (bug 4207474). + + 2. Move the mouse over the button labeled "Long tip". + If the last letter of the tooltip appears clipped, + then the test fails. If you can see the entire last character, + then the test passes (bug 4218495). + + 3. Verify that "M" is underlined on the button labeled "Mnemonic" + Move the mouse pointer over the button labeled "Mnemonic" and look + at tooltip when it appears. It should read "hint". + If the above is true test passes else test fails (bug 4375928). + """; + + public static void main(String[] args) throws Exception { + UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); + + PassFailJFrame.builder() + .title("TooltipTest Instructions") + .instructions(INSTRUCTIONS) + .columns(40) + .testUI(TooltipTest::createTestUI) + .build() + .awaitAndCheck(); + } + + private static JComponent createTestUI() { + JPanel panel = new JPanel(); + panel.setLayout(new FlowLayout()); + + JButton b = new JButton("Red tip"); + b.setToolTipText("

      Here is some " + + "red text.
      "); + panel.add(b); + + b = new JButton("Long tip"); + b.setToolTipText("Is the last letter clipped?"); + panel.add(b); + + b = new JButton("Mnemonic"); + b.setMnemonic(KeyEvent.VK_M); + b.setToolTipText("hint"); + panel.add(b); + + return panel; + } +} diff --git a/test/jdk/javax/swing/JToolTip/bug4225314.java b/test/jdk/javax/swing/JToolTip/bug4225314.java new file mode 100644 index 000000000000..d36bd461272a --- /dev/null +++ b/test/jdk/javax/swing/JToolTip/bug4225314.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 1999, 2025, 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 4225314 + * @summary Tests that tooltip is painted properly when it has thick border + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4225314 + */ + +import java.awt.Color; +import java.awt.FlowLayout; +import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.JToolTip; +import javax.swing.border.LineBorder; + +public class bug4225314 { + private static final String INSTRUCTIONS = """ + The word "Tooltip" in both tooltips should not be clipped by the + black border and be fully visible for this test to pass. + """; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .title("bug4225314 Instructions") + .instructions(INSTRUCTIONS) + .columns(40) + .testUI(bug4225314::createTestUI) + .build() + .awaitAndCheck(); + } + + private static JComponent createTestUI() { + JToolTip tt1 = new JToolTip(); + tt1.setTipText("Tooltip"); + tt1.setBorder(new LineBorder(Color.BLACK, 10)); + + JToolTip tt2 = new JToolTip(); + tt2.setTipText("Tooltip"); + tt2.setBorder(new LineBorder(Color.BLACK, 10)); + + JPanel panel = new JPanel(); + panel.setLayout(new FlowLayout()); + panel.add(tt1); + panel.add(tt2); + + return panel; + } +} diff --git a/test/jdk/javax/swing/JToolTip/bug4255441.java b/test/jdk/javax/swing/JToolTip/bug4255441.java new file mode 100644 index 000000000000..4a90c9755025 --- /dev/null +++ b/test/jdk/javax/swing/JToolTip/bug4255441.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2000, 2025, 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 4255441 + * @summary Tests that tooltip appears inside AWT Frame + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4255441 + */ + +import java.awt.FlowLayout; +import java.awt.Frame; +import javax.swing.JButton; + +public class bug4255441 { + private static final String INSTRUCTIONS = """ + Move mouse pointer inside the button. + If a tooltip with "Tooltip text" appears, the test passes. + """; + + private static Frame createTestUI() { + Frame fr = new Frame("bug4255441"); + fr.setLayout(new FlowLayout()); + + JButton bt = new JButton("Button"); + bt.setToolTipText("Tooltip text"); + fr.add(bt); + + fr.setSize(200, 200); + return fr; + } + + public static void main(String[] argv) throws Exception { + PassFailJFrame.builder() + .title("bug4255441 Instructions") + .instructions(INSTRUCTIONS) + .columns(40) + .testUI(bug4255441::createTestUI) + .build() + .awaitAndCheck(); + } +} From cc688439ed44cbd3e2f507c3dd7be86eb72eacdc Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Thu, 2 Oct 2025 18:05:25 +0000 Subject: [PATCH 128/323] 8355333: Some Problem list entries point to non-existent / wrong files Backport-of: 32a597b36f994d6e720e0576ad110dac4a5304fe --- test/jdk/ProblemList.txt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index b8ea17dece1f..b944661ccee4 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -446,7 +446,7 @@ java/awt/FileDialog/ModalFocus/FileDialogModalFocusTest.java 8194751 linux-all java/awt/image/VolatileImage/BitmaskVolatileImage.java 8133102 linux-all java/awt/SplashScreen/MultiResolutionSplash/unix/UnixMultiResolutionSplashTest.java 8203004 linux-all java/awt/ScrollPane/ScrollPositionTest.java 8040070 linux-all -java/awt/ScrollPane/ScrollPaneScrollType/ScrollPaneEventType.java 8296516 macosx-all +java/awt/ScrollPane/ScrollPaneEventType.java 8296516 macosx-all java/awt/Robot/AcceptExtraMouseButtons/AcceptExtraMouseButtons.java 7107528 linux-all,macosx-all java/awt/Mouse/MouseDragEvent/MouseDraggedTest.java 8080676 linux-all java/awt/Mouse/MouseModifiersUnitTest/MouseModifiersInKeyEvent.java 8157147 linux-all,windows-all,macosx-all @@ -487,8 +487,6 @@ java/awt/KeyboardFocusmanager/ConsumeNextMnemonicKeyTypedTest/ConsumeNextMnemoni java/awt/Window/GetScreenLocation/GetScreenLocationTest.java 8225787 linux-x64 java/awt/Dialog/MakeWindowAlwaysOnTop/MakeWindowAlwaysOnTop.java 8266243 macosx-aarch64 -java/awt/Dialog/PrintToFileTest/PrintToFileRevoked.java 8029249 macosx-all -java/awt/Dialog/PrintToFileTest/PrintToFileGranted.java 8029249 macosx-all java/awt/Dialog/ChoiceModalDialogTest.java 8161475 macosx-all java/awt/Dialog/FileDialogUserFilterTest.java 8001142 generic-all @@ -688,7 +686,7 @@ javax/swing/JFileChooser/8194044/FileSystemRootTest.java 8327236 windows-all javax/swing/JPopupMenu/6800513/bug6800513.java 7184956 macosx-all javax/swing/JTabbedPane/4624207/bug4624207.java 8064922 macosx-all javax/swing/SwingUtilities/TestBadBreak/TestBadBreak.java 8160720 generic-all -javax/swing/JFileChooser/6798062/bug6798062.java 8146446 windows-all +javax/swing/JFileChooser/bug6798062.java 8146446 windows-all javax/swing/JPopupMenu/4870644/bug4870644.java 8194130 macosx-all,linux-all javax/swing/dnd/8139050/NativeErrorsInTableDnD.java 8202765 macosx-all,linux-all javax/swing/JEditorPane/6917744/bug6917744.java 8213124 macosx-all @@ -808,7 +806,7 @@ jdk/jfr/api/consumer/recordingstream/TestOnEvent.java 8255404 linux-x6 javax/swing/JFileChooser/6698013/bug6698013.java 8024419 macosx-all javax/swing/JColorChooser/8065098/bug8065098.java 8065647 macosx-all javax/swing/JTabbedPane/bug4499556.java 8267500 macosx-all -javax/swing/JTabbedPane/4666224/bug4666224.java 8144124 macosx-all +javax/swing/JTabbedPane/bug4666224.java 8144124 macosx-all javax/swing/SwingUtilities/TestTextPosInPrint.java 8227025 windows-all java/awt/event/MouseEvent/SpuriousExitEnter/SpuriousExitEnter_1.java 7131438,8022539 generic-all From 09c5a799dca1e9ef2e3ab8ec2f8d8161d88e45a1 Mon Sep 17 00:00:00 2001 From: Rui Li Date: Thu, 2 Oct 2025 21:09:51 +0000 Subject: [PATCH 129/323] 8365919: Replace currentTimeMillis with nanoTime in Stresser.java Backport-of: 0ca38bdc4d503158fda57bbc8bc9adc420628079 --- .../vmTestbase/nsk/share/test/Stresser.java | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/test/Stresser.java b/test/hotspot/jtreg/vmTestbase/nsk/share/test/Stresser.java index 83e8baa28369..c28512679116 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/share/test/Stresser.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/share/test/Stresser.java @@ -58,9 +58,12 @@ public class Stresser implements ExecutionController { private String name; private long maxIterations; private long iterations; + + // In nanoseconds private long startTime; - private long finishTime; private long currentTime; + private long stressTime; + private PrintStream defaultOutput = System.out; /* @@ -179,15 +182,15 @@ public void printStressInfo(PrintStream out) { */ public void printExecutionInfo(PrintStream out) { println(out, "Completed iterations: " + iterations); - println(out, "Execution time: " + (currentTime - startTime) + " seconds"); + println(out, "Execution time: " + (currentTime - startTime) / 1_000_000_000.0 + " seconds"); if (!finished) { println(out, "Execution is not finished yet"); } else if (forceFinish) { println(out, "Execution was forced to finish"); } else if (maxIterations != 0 && iterations >= maxIterations) { println(out, "Execution finished because number of iterations was exceeded: " + iterations + " >= " + maxIterations); - } else if (finishTime != 0 && currentTime >= finishTime) { - println(out, "Execution finished because time was exceeded: " + (currentTime - startTime) + " >= " + (finishTime - startTime)); + } else if (stressTime != 0 && (currentTime - startTime) >= stressTime) { + println(out, "Execution finished because time has exceeded stress time: " + stressTime / 1_000_000_000 + " seconds"); } } @@ -208,13 +211,8 @@ private void println(PrintStream out, String s) { public void start(long stdIterations) { maxIterations = stdIterations * options.getIterationsFactor(); iterations = 0; - long stressTime = options.getTime(); - startTime = System.currentTimeMillis(); - if (stressTime == 0) { - finishTime = 0; - } else { - finishTime = startTime + stressTime * 1000; - } + stressTime = options.getTime() * 1_000_000_000; + startTime = System.nanoTime(); finished = false; forceFinish = false; if (options.isDebugEnabled()) { @@ -232,7 +230,7 @@ public void start(long stdIterations) { * finally {} block. */ public void finish() { - currentTime = System.currentTimeMillis(); + currentTime = System.nanoTime(); finished = true; if (options.isDebugEnabled()) { printExecutionInfo(defaultOutput); @@ -255,10 +253,12 @@ public void forceFinish() { */ public boolean iteration() { ++iterations; + boolean result = continueExecution(); + // Call print at the end to show the most up-to-date info. if (options.isDebugDetailed()) { printExecutionInfo(defaultOutput); } - return continueExecution(); + return result; } /** @@ -267,14 +267,14 @@ public boolean iteration() { * @return true if execution needs to continue */ public boolean continueExecution() { - currentTime = System.currentTimeMillis(); + currentTime = System.nanoTime(); if (startTime == 0) { throw new TestBug("Stresser is not started."); } return !forceFinish && !finished && (maxIterations == 0 || iterations < maxIterations) - && (finishTime == 0 || currentTime < finishTime); + && (stressTime == 0 || (currentTime - startTime) < stressTime); } /** @@ -309,7 +309,7 @@ public long getIterationsLeft() { * @return time */ public long getExecutionTime() { - return System.currentTimeMillis() - startTime; + return (System.nanoTime() - startTime) / 1_000_000; } /** @@ -318,11 +318,11 @@ public long getExecutionTime() { * @return time */ public long getTimeLeft() { - long current = System.currentTimeMillis(); - if (current >= finishTime) { + long elapsedTime = System.nanoTime() - startTime; + if (elapsedTime >= stressTime) { return 0; } else { - return finishTime - current; + return (stressTime - elapsedTime) / 1_000_000; } } From ac826601ddf95c76b8762ac152f4571860e04064 Mon Sep 17 00:00:00 2001 From: Rui Li Date: Thu, 2 Oct 2025 21:10:13 +0000 Subject: [PATCH 130/323] 8363720: Follow up to JDK-8360411 with post review comments Backport-of: a5e0c9d0c52e028321bb38e471ce98e389e67fe1 --- test/jdk/java/io/File/MaxPathLength.java | 41 ++++++++++++------------ 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/test/jdk/java/io/File/MaxPathLength.java b/test/jdk/java/io/File/MaxPathLength.java index 1110b469759a..02b60f124d1d 100644 --- a/test/jdk/java/io/File/MaxPathLength.java +++ b/test/jdk/java/io/File/MaxPathLength.java @@ -24,30 +24,31 @@ /* @test @bug 4759207 4403166 4165006 4403166 6182812 6274272 7160013 @summary Test to see if win32 path length can be greater than 260 + @library .. /test/lib */ import java.io.*; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.DirectoryNotEmptyException; +import jdk.test.lib.Platform; public class MaxPathLength { private static String sep = File.separator; private static String pathComponent = sep + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; private static String fileName = - "areallylongfilenamethatsforsur"; - private static boolean isWindows = false; + "areallylongfilenamethatsforsur"; private static final int MAX_LENGTH = 256; + private static final int FILE_EXISTS_SLEEP = 100; + + private static final int MAX_PATH_COMPONENTS_WINDOWS = 20; + private static int counter = 0; public static void main(String[] args) throws Exception { - String osName = System.getProperty("os.name"); - if (osName.startsWith("Windows")) { - isWindows = true; - } for (int i = 4; i < 7; i++) { String name = fileName; @@ -59,8 +60,10 @@ public static void main(String[] args) throws Exception { } // test long paths on windows - // And these long pathes cannot be handled on Solaris and Mac platforms - testLongPathOnWindows(); + // And these long paths cannot be handled on Linux and Mac platforms + if (Platform.isWindows()) { + testLongPath(); + } } private static String getNextName(String fName) { @@ -139,7 +142,7 @@ static void testLongPath(int max, String fn, if (flist == null || !fn.equals(flist[0].getName())) throw new RuntimeException ("File.listFiles() failed"); - if (isWindows && + if (Platform.isWindows() && !fu.getCanonicalPath().equals(f.getCanonicalPath())) throw new RuntimeException ("getCanonicalPath() failed"); @@ -155,7 +158,7 @@ static void testLongPath(int max, String fn, String abPath = f.getAbsolutePath(); if (!abPath.startsWith("\\\\") || abPath.length() < 1093) { - throw new RuntimeException ("File.renameTo() failed for lenth=" + throw new RuntimeException ("File.renameTo() failed for length=" + abPath.length()); } } else { @@ -182,7 +185,7 @@ static void testLongPath(int max, String fn, Files.deleteIfExists(p); // Test if the file is really deleted and wait for 1 second at most for (int j = 0; j < 10 && Files.exists(p); j++) { - Thread.sleep(100); + Thread.sleep(FILE_EXISTS_SLEEP); } } catch (DirectoryNotEmptyException ex) { // Give up the clean-up, let jtreg handle it. @@ -193,14 +196,12 @@ static void testLongPath(int max, String fn, } } - private static void testLongPathOnWindows () throws Exception { - if (isWindows) { - String name = fileName; - while (name.length() < MAX_LENGTH) { - testLongPath (20, name, false); - testLongPath (20, name, true); - name = getNextName(name); - } + private static void testLongPath () throws Exception { + String name = fileName; + while (name.length() < MAX_LENGTH) { + testLongPath(MAX_PATH_COMPONENTS_WINDOWS, name, false); + testLongPath(MAX_PATH_COMPONENTS_WINDOWS, name, true); + name = getNextName(name); } } -} +} \ No newline at end of file From 5b86c1dda44373ec81fb1f0622fe87f85c409f8b Mon Sep 17 00:00:00 2001 From: SendaoYan Date: Sat, 4 Oct 2025 13:31:03 +0000 Subject: [PATCH 131/323] 8333200: Test containers/docker/TestPids.java fails Limit value -1 is not accepted as unlimited Backport-of: 7ab74c5f268dac82bbd36355acf8e4f3d357134c --- test/hotspot/jtreg/containers/docker/TestPids.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/hotspot/jtreg/containers/docker/TestPids.java b/test/hotspot/jtreg/containers/docker/TestPids.java index 88f288828b6d..2e9c97110b2a 100644 --- a/test/hotspot/jtreg/containers/docker/TestPids.java +++ b/test/hotspot/jtreg/containers/docker/TestPids.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2021 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -114,12 +114,13 @@ private static void checkResult(List lines, String lineMarker, String ex Asserts.assertEquals(parts.length, 2); String actual = parts[1].replaceAll("\\s",""); - // Unlimited pids leads on some setups not to "max" in the output, but to a high number if (expectedValue.equals("max")) { - if (actual.equals("max")) { - System.out.println("Found expected max for unlimited pids value."); + // Unlimited pids accept max or -1 + if (actual.equals("max") || actual.equals("-1")) { + System.out.println("Found expected " + actual + " for unlimited pids value."); } else { try { + // Unlimited pids leads on some setups not to "max" in the output, but to a high number int ai = Integer.parseInt(actual); if (ai > 20000) { System.out.println("Limit value " + ai + " got accepted as unlimited, log line was " + line); From 1a04a97fa1ca370c5f162ce22b5328d9d80238d2 Mon Sep 17 00:00:00 2001 From: Sergey Bylokhov Date: Sat, 4 Oct 2025 20:56:40 +0000 Subject: [PATCH 132/323] 8362204: test/jdk/sun/awt/font/TestDevTransform.java fails on Ubuntu 24.04 Backport-of: 89af6e13f2354d6e32872791d157144cd478a88f --- test/jdk/sun/awt/font/TestDevTransform.java | 48 +++++++++++++++++++-- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/test/jdk/sun/awt/font/TestDevTransform.java b/test/jdk/sun/awt/font/TestDevTransform.java index 2783401c0f2d..39d4255f1545 100644 --- a/test/jdk/sun/awt/font/TestDevTransform.java +++ b/test/jdk/sun/awt/font/TestDevTransform.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2025, 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 @@ -22,9 +22,31 @@ */ /* - * @test + * @test id=dialog_double * @bug 4269775 8341535 * @summary Check that different text rendering APIs agree + * @run main/othervm TestDevTransform DIALOG DOUBLE + */ + +/* + * @test id=dialog_float + * @bug 4269775 8341535 + * @summary Check that different text rendering APIs agree + * @run main/othervm TestDevTransform DIALOG FLOAT + */ + +/* + * @test id=monospaced_double + * @bug 4269775 8341535 + * @summary Check that different text rendering APIs agree + * @run main/othervm TestDevTransform MONOSPACED DOUBLE + */ + +/* + * @test id=monospaced_float + * @bug 4269775 8341535 + * @summary Check that different text rendering APIs agree + * @run main/othervm TestDevTransform MONOSPACED FLOAT */ /** @@ -66,6 +88,8 @@ public class TestDevTransform { static String test = "This is only a test"; static double angle = Math.PI / 6.0; // Rotate 30 degrees static final int W = 400, H = 400; + static boolean useDialog; + static boolean useDouble; static void draw(Graphics2D g2d, TextLayout layout, float x, float y, float scalex) { @@ -101,9 +125,19 @@ static void init(Graphics2D g2d) { g2d.setColor(Color.white); g2d.fillRect(0, 0, W, H); g2d.setColor(Color.black); - g2d.scale(1.481f, 1.481); // Convert to 108 dpi + if (useDouble) { + g2d.scale(1.481, 1.481); // Convert to 108 dpi + } else { + g2d.scale(1.481f, 1.481f); // Convert to 108 dpi + } g2d.addRenderingHints(hints); - Font font = new Font(Font.DIALOG, Font.PLAIN, 12); + String name; + if (useDialog) { + name = Font.DIALOG; + } else { + name = Font.MONOSPACED; + } + Font font = new Font(name, Font.PLAIN, 12); g2d.setFont(font); } @@ -135,6 +169,12 @@ static void compare(BufferedImage bi1, String name1, BufferedImage bi2, String n } public static void main(String args[]) throws Exception { + if (args[0].equals("DIALOG")) { + useDialog = true; + } + if (args[1].equals("DOUBLE")) { + useDouble = true; + } BufferedImage tl_Image = new BufferedImage(W, H, BufferedImage.TYPE_INT_RGB); { From 7ce243ecbeb6c40770413796791645899329d7ec Mon Sep 17 00:00:00 2001 From: Sergey Bylokhov Date: Sun, 5 Oct 2025 21:05:53 +0000 Subject: [PATCH 133/323] 8367017: Remove legacy checks from WrappedToolkitTest and convert from bash Backport-of: e1071797a4f0ab1a6af29824a777a7800d729b0e --- test/jdk/TEST.groups | 1 - .../WrappedToolkitTest/TestWrapped.java | 71 +++--- .../WrappedToolkitTest/WrappedToolkitTest.sh | 221 ------------------ 3 files changed, 34 insertions(+), 259 deletions(-) delete mode 100644 test/jdk/java/awt/Toolkit/Headless/WrappedToolkitTest/WrappedToolkitTest.sh diff --git a/test/jdk/TEST.groups b/test/jdk/TEST.groups index 5faee8744a61..ce5580b7e7ea 100644 --- a/test/jdk/TEST.groups +++ b/test/jdk/TEST.groups @@ -1110,7 +1110,6 @@ jdk_awt_wayland = \ -java/awt/Toolkit/DesktopProperties/rfe4758438.java \ -java/awt/Toolkit/DynamicLayout/bug7172833.java \ -java/awt/Toolkit/Headless/GetPrintJob/GetPrintJob.java \ - -java/awt/Toolkit/Headless/WrappedToolkitTest/WrappedToolkitTest.sh \ -java/awt/Toolkit/LockingKeyStateTest/LockingKeyStateTest.java \ -java/awt/Toolkit/RealSync/Test.java \ -java/awt/Toolkit/ScreenInsetsTest/ScreenInsetsTest.java \ diff --git a/test/jdk/java/awt/Toolkit/Headless/WrappedToolkitTest/TestWrapped.java b/test/jdk/java/awt/Toolkit/Headless/WrappedToolkitTest/TestWrapped.java index e2ded58e7f29..4b4041dbcfdf 100644 --- a/test/jdk/java/awt/Toolkit/Headless/WrappedToolkitTest/TestWrapped.java +++ b/test/jdk/java/awt/Toolkit/Headless/WrappedToolkitTest/TestWrapped.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2025, 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 @@ -22,55 +22,52 @@ */ /* - * test + * @test * @bug 6282388 - * @summary Tests that AWT use correct toolkit to be wrapped into HeadlessToolkit - * @author artem.ananiev@sun.com: area=awt.headless - * @run shell WrappedToolkitTest.sh + * @summary Tests that AWT uses correct toolkit wrapped into HeadlessToolkit + * @modules java.desktop/sun.awt:open + * @library /test/lib + * @run main/othervm -Djava.awt.headless=true TestWrapped */ -import java.awt.*; +import java.awt.Toolkit; +import java.lang.Class; +import java.lang.reflect.Field; -import java.lang.reflect.*; +import jdk.test.lib.Platform; -import sun.awt.*; +public final class TestWrapped { -public class TestWrapped -{ - public static void main(String[] args) - { - try - { - if (args.length != 1) { - System.err.println("No correct toolkit class name is specified, test is not run"); - System.exit(0); + private static final String HEADLESS_TOOLKIT = "sun.awt.HeadlessToolkit"; + private static final String MACOSX_TOOLKIT = "sun.lwawt.macosx.LWCToolkit"; + private static final String UNIX_TOOLKIT = "sun.awt.X11.XToolkit"; + private static final String WINDOWS_TOOLKIT = "sun.awt.windows.WToolkit"; + + public static void main(String[] args) throws Exception { + String expectedToolkitClassName; + if (Platform.isWindows()) { + expectedToolkitClassName = WINDOWS_TOOLKIT; + } else if (Platform.isOSX()) { + expectedToolkitClassName = MACOSX_TOOLKIT; + } else { + expectedToolkitClassName = UNIX_TOOLKIT; } - String correctToolkitClassName = args[0]; Toolkit tk = Toolkit.getDefaultToolkit(); - Class tkClass = tk.getClass(); - if (!tkClass.getName().equals("sun.awt.HeadlessToolkit")) - { - System.err.println(tkClass.getName()); - System.err.println("Error: default toolkit is not an instance of HeadlessToolkit"); - System.exit(-1); + Class tkClass = tk.getClass(); + if (!tkClass.getName().equals(HEADLESS_TOOLKIT)) { + System.err.println("Expected: " + HEADLESS_TOOLKIT); + System.err.println("Actual: " + tkClass.getName()); + throw new RuntimeException("Wrong default toolkit"); } Field f = tkClass.getDeclaredField("tk"); f.setAccessible(true); - Class wrappedClass = f.get(tk).getClass(); - if (!wrappedClass.getName().equals(correctToolkitClassName)) { - System.err.println(wrappedClass.getName()); - System.err.println("Error: wrapped toolkit is not an instance of " + correctToolkitClassName); - System.exit(-1); - } + Class wrappedClass = f.get(tk).getClass(); + if (!wrappedClass.getName().equals(expectedToolkitClassName)) { + System.err.println("Expected: " + expectedToolkitClassName); + System.err.println("Actual: " + wrappedClass.getName()); + throw new RuntimeException("Wrong wrapped toolkit"); } - catch (Exception z) - { - z.printStackTrace(System.err); - System.exit(-1); - } - - System.exit(0); } } diff --git a/test/jdk/java/awt/Toolkit/Headless/WrappedToolkitTest/WrappedToolkitTest.sh b/test/jdk/java/awt/Toolkit/Headless/WrappedToolkitTest/WrappedToolkitTest.sh deleted file mode 100644 index ac0cf58942c7..000000000000 --- a/test/jdk/java/awt/Toolkit/Headless/WrappedToolkitTest/WrappedToolkitTest.sh +++ /dev/null @@ -1,221 +0,0 @@ -#!/bin/ksh -p - -# -# Copyright (c) 2012, 2020, 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 6282388 8030640 -# @summary Tests that AWT use correct toolkit to be wrapped into HeadlessToolkit -# @author artem.ananiev@sun.com: area=awt.headless -# compile TestWrapped.java -# @run shell WrappedToolkitTest.sh - -# Beginning of subroutines: -status=1 - -#Call this from anywhere to fail the test with an error message -# usage: fail "reason why the test failed" -fail() - { echo "The test failed :-(" - echo "$*" 1>&2 - echo "exit status was $status" - exit $status - } #end of fail() - -#Call this from anywhere to pass the test with a message -# usage: pass "reason why the test passed if applicable" -pass() - { echo "The test passed!!!" - echo "$*" 1>&2 - exit 0 - } #end of pass() - -# end of subroutines - - -# The beginning of the script proper - -# Checking for proper OS -OS=`uname -s` -case "$OS" in - AIX | CYGWIN* | Darwin | Linux ) - FILESEP="/" - ;; - - Windows* ) - FILESEP="\\" - ;; - - # catch all other OSs - * ) - echo "Unrecognized system! $OS" - fail "Unrecognized system! $OS" - ;; -esac - -# check that some executable or other file you need is available, abort if not -# note that the name of the executable is in the fail string as well. -# this is how to check for presence of the compiler, etc. -#RESOURCE=`whence SomeProgramOrFileNeeded` -#if [ "${RESOURCE}" = "" ] ; -# then fail "Need SomeProgramOrFileNeeded to perform the test" ; -#fi - -# Want this test to run standalone as well as in the harness, so do the -# following to copy the test's directory into the harness's scratch directory -# and set all appropriate variables: - -if [ -z "${TESTJAVA}" ] ; then - # TESTJAVA is not set, so the test is running stand-alone. - # TESTJAVA holds the path to the root directory of the build of the JDK - # to be tested. That is, any java files run explicitly in this shell - # should use TESTJAVA in the path to the java interpreter. - # So, we'll set this to the JDK spec'd on the command line. If none - # is given on the command line, tell the user that and use a cheesy - # default. - # THIS IS THE JDK BEING TESTED. - if [ -n "$1" ] ; - then TESTJAVA=$1 - else fail "no JDK specified on command line!" - fi - TESTSRC=. - TESTCLASSES=. - STANDALONE=1; -fi -echo "JDK under test is: $TESTJAVA" - -#if in test harness, then copy the entire directory that the test is in over -# to the scratch directory. This catches any support files needed by the test. -if [ -z "${STANDALONE}" ] ; - then cp ${TESTSRC}/* . -fi -case "$OS" in - Windows* | CYGWIN* ) - ${COMPILEJAVA}/bin/javac ${TESTJAVACOPTS} \ - --add-exports java.desktop/sun.awt=ALL-UNNAMED \ - --add-exports java.desktop/sun.awt.windows=ALL-UNNAMED ${CP} \ - *.java - status=$? - if [ ! $status -eq "0" ]; then - fail "Compilation failed"; - fi - ;; - - AIX | Linux ) - ${COMPILEJAVA}/bin/javac ${TESTJAVACOPTS} \ - --add-exports java.desktop/sun.awt=ALL-UNNAMED \ - --add-exports java.desktop/sun.awt.X11=ALL-UNNAMED ${CP} \ - *.java - status=$? - if [ ! $status -eq "0" ]; then - fail "Compilation failed"; - fi - ;; - - Darwin) - ${COMPILEJAVA}/bin/javac ${TESTJAVACOPTS} \ - --add-exports java.desktop/sun.awt=ALL-UNNAMED \ - --add-exports java.desktop/sun.lwawt.macosx=ALL-UNNAMED ${CP} \ - *.java - status=$? - if [ ! $status -eq "0" ]; then - fail "Compilation failed"; - fi - ;; - -esac - -#Just before executing anything, make sure it has executable permission! -chmod 777 ./* - -############### YOUR TEST CODE HERE!!!!!!! ############# - -case "$OS" in - Windows* | CYGWIN* ) - ${TESTJAVA}/bin/java ${TESTVMOPTS} -Djava.awt.headless=true \ - --add-opens java.desktop/sun.awt=ALL-UNNAMED \ - --add-opens java.desktop/sun.awt.windows=ALL-UNNAMED ${CP} \ - TestWrapped sun.awt.windows.WToolkit - status=$? - if [ ! $status -eq "0" ]; then - fail "Test FAILED: toolkit wrapped into HeadlessToolkit is not an instance of sun.awt.windows.WToolkit"; - fi - ${TESTJAVA}/bin/java ${TESTVMOPTS} -Djava.awt.headless=true \ - --add-opens java.desktop/sun.awt=ALL-UNNAMED \ - --add-opens java.desktop/sun.awt.windows=ALL-UNNAMED ${CP} \ - -Dawt.toolkit=sun.awt.windows.WToolkit \ - TestWrapped sun.awt.windows.WToolkit - status=$? - if [ ! $status -eq "0" ]; then - fail "Test FAILED: toolkit wrapped into HeadlessToolkit is not an instance of sun.awt.windows.WToolkit"; - fi - ;; - - AIX | Linux ) - ${TESTJAVA}/bin/java ${TESTVMOPTS} -Djava.awt.headless=true \ - --add-opens java.desktop/sun.awt=ALL-UNNAMED \ - --add-opens java.desktop/sun.awt.X11=ALL-UNNAMED ${CP} \ - -Dawt.toolkit=sun.awt.X11.XToolkit \ - TestWrapped sun.awt.X11.XToolkit - status=$? - if [ ! $status -eq "0" ]; then - fail "Test FAILED: toolkit wrapped into HeadlessToolkit is not an instance of sun.awt.xawt.XToolkit"; - fi - AWT_TOOLKIT=XToolkit ${TESTJAVA}/bin/java ${TESTVMOPTS} \ - --add-opens java.desktop/sun.awt=ALL-UNNAMED \ - --add-opens java.desktop/sun.awt.X11=ALL-UNNAMED ${CP} \ - -Djava.awt.headless=true \ - TestWrapped sun.awt.X11.XToolkit - status=$? - if [ ! $status -eq "0" ]; then - fail "Test FAILED: toolkit wrapped into HeadlessToolkit is not an instance of sun.awt.xawt.XToolkit"; - fi - ;; - - Darwin) - ${TESTJAVA}/bin/java ${TESTVMOPTS} -Djava.awt.headless=true \ - --add-opens java.desktop/sun.awt=ALL-UNNAMED \ - --add-opens java.desktop/sun.lwawt.macosx=ALL-UNNAMED ${CP} \ - TestWrapped sun.lwawt.macosx.LWCToolkit - status=$? - if [ ! $status -eq "0" ]; then - fail "Test FAILED: toolkit wrapped into HeadlessToolkit is not an instance of sun.lwawt.macosx.LWCToolkit"; - fi - ${TESTJAVA}/bin/java ${TESTVMOPTS} -Djava.awt.headless=true \ - --add-opens java.desktop/sun.awt=ALL-UNNAMED \ - --add-opens java.desktop/sun.lwawt.macosx=ALL-UNNAMED ${CP} \ - -Dawt.toolkit=sun.lwawt.macosx.LWCToolkit \ - TestWrapped sun.lwawt.macosx.LWCToolkit - status=$? - if [ ! $status -eq "0" ]; then - fail "Test FAILED: toolkit wrapped into HeadlessToolkit is not an instance of sun.lwawt.macosx.LWCToolkit"; - fi - ;; - -esac - -pass "All the tests are PASSED"; - -#For additional examples of how to write platform independent KSH scripts, -# see the jtreg file itself. It is a KSH script for both Solaris and Win32 From 1cb184ef528a26a70f637f3e33585374aa605675 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Mon, 6 Oct 2025 16:10:37 +0000 Subject: [PATCH 134/323] 8353586: Open source several toolkit tests Backport-of: 2ba80d2403f749a7d8d4e64139b796737bbb62bf --- .../DesktopPropertyTest.java | 272 ++++++++++++++++++ .../Toolkit/TimeUnsignedConversionTest.java | 128 +++++++++ 2 files changed, 400 insertions(+) create mode 100644 test/jdk/java/awt/Toolkit/DesktopProperties/DesktopPropertyTest.java create mode 100644 test/jdk/java/awt/Toolkit/TimeUnsignedConversionTest.java diff --git a/test/jdk/java/awt/Toolkit/DesktopProperties/DesktopPropertyTest.java b/test/jdk/java/awt/Toolkit/DesktopProperties/DesktopPropertyTest.java new file mode 100644 index 000000000000..c2e3f5652f02 --- /dev/null +++ b/test/jdk/java/awt/Toolkit/DesktopProperties/DesktopPropertyTest.java @@ -0,0 +1,272 @@ +/* + * Copyright (c) 1999, 2025, 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 4287882 + * @summary Tests internal use Windows properties + * @requires os.family == "windows" + * @key headful + * @run main DesktopPropertyTest + */ + +import java.awt.Color; +import java.awt.Component; +import java.awt.Font; +import java.awt.Rectangle; +import java.awt.RenderingHints; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.table.AbstractTableModel; +import javax.swing.table.TableCellRenderer; +import javax.swing.table.TableModel; +import java.awt.Robot; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.Arrays; +import java.util.Vector; + +/* + * This is a test of new Windows-specific desktop + * properties added in Kestrel. + * + * The new properties are meant for the use of the + * Windows PLAF only and are not public at this time. + */ +public class DesktopPropertyTest { + private static JFrame frame; + + public static void main(String[] args) throws Exception { + Robot robot = new Robot(); + try { + SwingUtilities.invokeAndWait(DesktopPropertyTest::runTest); + robot.waitForIdle(); + robot.delay(1000); + } finally { + SwingUtilities.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + } + + public static void runTest() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (Exception e) { + throw new RuntimeException(e); + } + frame = new DesktopPropertyFrame(); + frame.setVisible(true); + } + + static class DesktopPropertyFrame extends JFrame { + JTable table; + + DesktopPropertyFrame() { + super("Toolkit.getDesktopProperty API Test"); + setBackground(Color.white); + add(new JScrollPane(createTable())); + setLocationRelativeTo(null); + setSize(500, 400); + } + + public JTable createTable() { + TableModel dataModel = new AbstractTableModel() { + final PropertyVector pv = new PropertyVector(); + + public int getColumnCount() { + return 3; + } + + public int getRowCount() { + return pv.size(); + } + + public String getColumnName(int column) { + String[] colnames = {"Property", "Type", "Value"}; + return colnames[column]; + } + + public Object getValueAt(int row, int col) { + Object[] prow = pv.get(row); + return prow[col]; + } + }; + + table = new JTable(dataModel); + table.setDefaultRenderer(Object.class, new DesktopPropertyRenderer()); + table.addMouseListener(new ClickListener()); + return table; + } + + class ClickListener extends MouseAdapter { + ClickListener() { + } + + public void mouseClicked(MouseEvent e) { + for (int row = 0; row <= table.getModel().getRowCount(); row++) { + Rectangle r = table.getCellRect(row, 2, false); + if (r.contains(e.getX(), e.getY())) { + Object value = table.getModel().getValueAt(row, 2); + if (value instanceof Runnable) { + ((Runnable) value).run(); + } + } + } + } + } + + class PropertyVector { + private static final int NAME = 0; + private static final int TYPE = 1; + private static final int VALUE = 2; + + private final Vector vector = new Vector<>(); + + PropertyVector() { + Object[] props = (Object[]) getToolkit() + .getDesktopProperty("win.propNames"); + if (props == null) { + throw new RuntimeException( + "'win.propNames' property not available. " + + "This test is valid only on Windows."); + } + for (Object prop : props) { + String propertyName = prop.toString(); + vector.addElement(createEntry(propertyName)); + } + } + + Object[] createEntry(String name) { + Object[] row = new Object[3]; + Object value = getToolkit().getDesktopProperty(name); + row[NAME] = name; + row[TYPE] = value.getClass().getName(); + row[VALUE] = value; + + System.out.println(Arrays.toString(row)); + // update this vector when property changes + getToolkit().addPropertyChangeListener(name, new DesktopPropertyChangeListener(row)); + return row; + } + + Object[] get(int row) { + return (Object[]) vector.elementAt(row); + } + + int size() { + return vector.size(); + } + + static class DesktopPropertyChangeListener implements PropertyChangeListener { + Object[] row; + + DesktopPropertyChangeListener(Object[] row) { + this.row = row; + } + + public void propertyChange(PropertyChangeEvent evt) { + this.row[VALUE] = evt.getNewValue(); + } + } + } + + static class DesktopPropertyRenderer implements TableCellRenderer { + ValueProp vprop = new ValueProp(); + FontProp fprop = new FontProp(); + ColorProp cprop = new ColorProp(); + RunnableProp rprop = new RunnableProp(); + RenderingHintsProp rhprop = new RenderingHintsProp(); + + public Component getTableCellRendererComponent(JTable table, Object value, + boolean isSelected, boolean hasFocus, + int row, int column) { + + ValueProp propComponent; + if (value instanceof Boolean + || value instanceof Integer + || value instanceof String) { + propComponent = vprop; + } else if (value instanceof Font) { + propComponent = fprop; + } else if (value instanceof Color) { + propComponent = cprop; + } else if (value instanceof Runnable) { + propComponent = rprop; + } else if (value instanceof RenderingHints) { + propComponent = rhprop; + } else { + throw new RuntimeException("ASSERT unexpected value %s / %s\n" + .formatted(value != null ? value.getClass() : "", value)); + } + + propComponent.setValue(value); + + return propComponent; + } + } + + static class ValueProp extends JLabel { + public void setValue(Object value) { + setText(value.toString()); + } + } + + static class FontProp extends ValueProp { + public void setValue(Object value) { + Font font = (Font) value; + String style; + if (font.getStyle() == Font.BOLD) { + style = "Bold"; + } else if (font.getStyle() > Font.BOLD) { + style = "BoldItalic"; + } else { + style = "Plain"; + } + setText(font.getName() + ", " + style + ", " + font.getSize()); + setFont(font); + } + } + + static class ColorProp extends ValueProp { + public void setValue(Object value) { + Color color = (Color) value; + setText("%d, %d, %d" + .formatted(color.getRed(), color.getGreen(), color.getBlue())); + setBackground(color); + setOpaque(true); + } + } + + static class RunnableProp extends ValueProp {} + static class RenderingHintsProp extends ValueProp {} + } +} \ No newline at end of file diff --git a/test/jdk/java/awt/Toolkit/TimeUnsignedConversionTest.java b/test/jdk/java/awt/Toolkit/TimeUnsignedConversionTest.java new file mode 100644 index 000000000000..64d05ef24989 --- /dev/null +++ b/test/jdk/java/awt/Toolkit/TimeUnsignedConversionTest.java @@ -0,0 +1,128 @@ +/* + * Copyright (c) 1999, 2025, 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 5097241 + * @summary Tests the problem of time type conversion on XToolkit. The conversion should be unsigned. + * @requires os.family == "linux" + * @key headful + * @library /java/awt/regtesthelpers /test/lib + * @build Util jtreg.SkippedException + * @run main/othervm -Dsun.awt.disableGtkFileDialogs=true TimeUnsignedConversionTest + */ + +import java.awt.Button; +import java.awt.EventQueue; +import java.awt.FileDialog; +import java.awt.FlowLayout; +import java.awt.Frame; +import java.awt.Robot; +import java.awt.Toolkit; +import java.awt.event.KeyEvent; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import jtreg.SkippedException; +import test.java.awt.regtesthelpers.Util; + +public class TimeUnsignedConversionTest { + static Robot robot; + static Frame frame; + static volatile Button button; + static volatile FileDialog dialog; + static volatile boolean dialogShown = false; + + static final CountDownLatch passedLatch = new CountDownLatch(1); + + public static void main(String[] args) throws Exception { + if (!Toolkit.getDefaultToolkit().getClass().getName().equals("sun.awt.X11.XToolkit")) { + throw new SkippedException("XAWT test only! Skipped."); + } + + try { + EventQueue.invokeAndWait(TimeUnsignedConversionTest::createAndShowGUI); + test(); + } finally { + EventQueue.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + } + + private static void createAndShowGUI() { + frame = new Frame("TimeUnsignedConversionTest frame"); + button = new Button("Show Dialog"); + dialog = new FileDialog(frame, "TimeUnsignedConversionTest Dialog", FileDialog.LOAD); + + Toolkit.getDefaultToolkit().addAWTEventListener(e -> { + System.out.println(e); + if (dialogShown && ((KeyEvent)e).getKeyCode() == KeyEvent.VK_K) { + passedLatch.countDown(); + } + }, KeyEvent.KEY_EVENT_MASK); + + frame.setLayout(new FlowLayout()); + frame.add(button); + + button.addActionListener(ae -> { + if (ae.getActionCommand().equals("Show Dialog")) { + dialog.setSize(200, 200); + dialog.setLocationRelativeTo(frame); + dialog.setVisible(true); + } + }); + + frame.setSize(100, 100); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } + + private static void test() throws Exception { + robot = new Robot(); + robot.waitForIdle(); + + Util.waitTillShown(button); + + robot.waitForIdle(); + robot.keyPress(KeyEvent.VK_SPACE); + robot.delay(50); + robot.keyRelease(KeyEvent.VK_SPACE); + + Util.waitTillShown(dialog); + dialogShown = true; + + robot.waitForIdle(); + robot.keyPress(KeyEvent.VK_K); + robot.delay(50); + robot.keyRelease(KeyEvent.VK_K); + + if (!passedLatch.await(2, TimeUnit.SECONDS)) { + throw new RuntimeException("Test failed!"); + } + + System.out.println("Test passed."); + } +} From 54020bb120cefc2c913d900c358b070d4ce94138 Mon Sep 17 00:00:00 2001 From: Matthias Baesken Date: Tue, 7 Oct 2025 12:06:03 +0000 Subject: [PATCH 135/323] 8361868: [GCC static analyzer] complains about missing calloc - NULL checks in p11_util.c Backport-of: 1cde536b98f2ebde0c18c65dcbf26254ed402776 --- .../share/native/libj2pkcs11/p11_util.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_util.c b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_util.c index 6830c4b9d73c..d61537653cb4 100644 --- a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_util.c +++ b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_util.c @@ -471,6 +471,10 @@ CK_MECHANISM_PTR updateGCMParams(JNIEnv *env, CK_MECHANISM_PTR mechPtr) { // CK_GCM_PARAMS => CK_GCM_PARAMS_NO_IVBITS pParams = (CK_GCM_PARAMS*) mechPtr->pParameter; pParamsNoIvBits = calloc(1, sizeof(CK_GCM_PARAMS_NO_IVBITS)); + if (pParamsNoIvBits == NULL) { + p11ThrowOutOfMemoryError(env, 0); + return NULL; + } pParamsNoIvBits->pIv = pParams->pIv; pParamsNoIvBits->ulIvLen = pParams->ulIvLen; pParamsNoIvBits->pAAD = pParams->pAAD; @@ -485,6 +489,10 @@ CK_MECHANISM_PTR updateGCMParams(JNIEnv *env, CK_MECHANISM_PTR mechPtr) { // CK_GCM_PARAMS_NO_IVBITS => CK_GCM_PARAMS pParamsNoIvBits = (CK_GCM_PARAMS_NO_IVBITS*) mechPtr->pParameter; pParams = calloc(1, sizeof(CK_GCM_PARAMS)); + if (pParams == NULL) { + p11ThrowOutOfMemoryError(env, 0); + return NULL; + } pParams->pIv = pParamsNoIvBits->pIv; pParams->ulIvLen = pParamsNoIvBits->ulIvLen; pParams->ulIvBits = pParamsNoIvBits->ulIvLen << 3; From 171a3b7047487b4cad3f3ab225929448ef58f7c0 Mon Sep 17 00:00:00 2001 From: Matthias Baesken Date: Tue, 7 Oct 2025 12:10:56 +0000 Subject: [PATCH 136/323] 8363676: [GCC static analyzer] missing return value check of malloc in OGLContext_SetTransform Backport-of: d25ad881ebfec40ca6b0a73f78d1f9d2cb722e01 --- src/java.desktop/share/native/common/java2d/opengl/OGLContext.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/java.desktop/share/native/common/java2d/opengl/OGLContext.c b/src/java.desktop/share/native/common/java2d/opengl/OGLContext.c index 21606923023e..2fafa96ab611 100644 --- a/src/java.desktop/share/native/common/java2d/opengl/OGLContext.c +++ b/src/java.desktop/share/native/common/java2d/opengl/OGLContext.c @@ -484,6 +484,7 @@ OGLContext_SetTransform(OGLContext *oglc, if (oglc->xformMatrix == NULL) { size_t arrsize = 16 * sizeof(GLdouble); oglc->xformMatrix = (GLdouble *)malloc(arrsize); + RETURN_IF_NULL(oglc->xformMatrix); memset(oglc->xformMatrix, 0, arrsize); oglc->xformMatrix[10] = 1.0; oglc->xformMatrix[15] = 1.0; From 3d9a70f142bbfac73cf1ccd771a2adc276938f15 Mon Sep 17 00:00:00 2001 From: Matthias Baesken Date: Tue, 7 Oct 2025 12:17:36 +0000 Subject: [PATCH 137/323] 8365240: [asan] exclude some tests when using asan enabled binaries Backport-of: d78fa5a9f6254e2e93e75c693efba75e09736749 --- .../vmTestbase/nsk/jvmti/Allocate/alloc001/alloc001.java | 4 +++- test/jdk/tools/launcher/TooSmallStackSize.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/Allocate/alloc001/alloc001.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/Allocate/alloc001/alloc001.java index f81acedbaeca..938c396af1bf 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/Allocate/alloc001/alloc001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/Allocate/alloc001/alloc001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2025, 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 @@ -43,6 +43,8 @@ * * @comment Not run on AIX as it does not support ulimit -v * @requires os.family != "aix" + * @comment Do not run with asan enabled because asan has issues with ulimit + * @requires !vm.asan * @run main/native nsk.jvmti.Allocate.alloc001.alloc001 */ diff --git a/test/jdk/tools/launcher/TooSmallStackSize.java b/test/jdk/tools/launcher/TooSmallStackSize.java index 8485f115d6e4..8133dbf45504 100644 --- a/test/jdk/tools/launcher/TooSmallStackSize.java +++ b/test/jdk/tools/launcher/TooSmallStackSize.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2025, 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,6 +26,8 @@ * @bug 6762191 8222334 * @summary Setting stack size to 16K causes segmentation fault * @compile TooSmallStackSize.java + * @comment VM fails to launch with minimum allowed stack size of 136k when asan is enabled + * @requires !vm.asan * @run main TooSmallStackSize */ From 7472eab79156c9d81791001c02cb8ba4ab6fee93 Mon Sep 17 00:00:00 2001 From: Matthias Baesken Date: Tue, 7 Oct 2025 12:44:09 +0000 Subject: [PATCH 138/323] 8366092: [GCC static analyzer] UnixOperatingSystem.c warning: use of uninitialized value 'systemTicks' Backport-of: a6e2a329a07c71582ac696809fb5349c6a0b681c --- .../linux/native/libmanagement_ext/UnixOperatingSystem.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/jdk.management/linux/native/libmanagement_ext/UnixOperatingSystem.c b/src/jdk.management/linux/native/libmanagement_ext/UnixOperatingSystem.c index af7d52424b76..326dd916f7e6 100644 --- a/src/jdk.management/linux/native/libmanagement_ext/UnixOperatingSystem.c +++ b/src/jdk.management/linux/native/libmanagement_ext/UnixOperatingSystem.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2025, 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 @@ -195,7 +195,7 @@ static int get_jvmticks(ticks *pticks) { uint64_t userTicks; uint64_t systemTicks; - if (read_ticks("/proc/self/stat", &userTicks, &systemTicks) < 0) { + if (read_ticks("/proc/self/stat", &userTicks, &systemTicks) != 2) { return -1; } From 293d4b42fc2c7e2abfb29afaffed4c4c6054b6af Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Wed, 8 Oct 2025 01:49:06 +0000 Subject: [PATCH 139/323] 8353483: Open source some JProgressBar tests Backport-of: 46a6fc84ef17f38eedd49f59a3c05f7c95fe23bc --- .../JProgressBar/RightLeftOrientation.java | 147 ++++++++++++++++++ .../javax/swing/JProgressBar/bug4230391.java | 139 +++++++++++++++++ .../javax/swing/JProgressBar/bug4393042.java | 90 +++++++++++ .../javax/swing/JProgressBar/bug5003022.java | 82 ++++++++++ 4 files changed, 458 insertions(+) create mode 100644 test/jdk/javax/swing/JProgressBar/RightLeftOrientation.java create mode 100644 test/jdk/javax/swing/JProgressBar/bug4230391.java create mode 100644 test/jdk/javax/swing/JProgressBar/bug4393042.java create mode 100644 test/jdk/javax/swing/JProgressBar/bug5003022.java diff --git a/test/jdk/javax/swing/JProgressBar/RightLeftOrientation.java b/test/jdk/javax/swing/JProgressBar/RightLeftOrientation.java new file mode 100644 index 000000000000..5cc183b1e8e4 --- /dev/null +++ b/test/jdk/javax/swing/JProgressBar/RightLeftOrientation.java @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2007, 2025, 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 4230355 + * @summary + * This test checks if progress bars lay out correctly when their + * ComponentOrientation property is set to RIGHT_TO_LEFT. This test is + * manual. The tester is asked to compare left-to-right and + * right-to-left progress bars and judge whether they are mirror images + * of each other. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual RightLeftOrientation + */ + +import java.awt.ComponentOrientation; +import java.awt.Container; +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.LookAndFeel; +import javax.swing.JPanel; +import javax.swing.JProgressBar; +import javax.swing.UIManager; + +public class RightLeftOrientation { + + static final String INSTRUCTIONS = """ + This test checks progress bars for correct Right-To-Left Component Orientation. + The progress bars in the left column should fill up from the left while the bars in + the right column should fill up from the right. + If this is so, the test PASSES, otherwise it FAILS. + """; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .title("Progress Bar Orientation Test Instructions") + .instructions(INSTRUCTIONS) + .columns(60) + .testUI(RightLeftOrientation::createUI) + .build() + .awaitAndCheck(); + } + + static JFrame createUI() { + JFrame frame = new JFrame("Progress Bar Orientation Test"); + Container contentPane = frame.getContentPane(); + contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.X_AXIS)); + contentPane.add(createBarSet(ComponentOrientation.LEFT_TO_RIGHT)); + contentPane.add(createBarSet(ComponentOrientation.RIGHT_TO_LEFT)); + frame.pack(); + return frame; + } + + static JPanel createBarSet(ComponentOrientation o) { + JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); + panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); + JLabel header; + if (o.isLeftToRight()) + header = new JLabel("Left To Right"); + else + header = new JLabel("Right To Left"); + panel.add(header); + + UIManager.LookAndFeelInfo[] lafs = UIManager.getInstalledLookAndFeels(); + for (int i = 0; i < lafs.length; i++) { + if (i > 0) + panel.add(Box.createVerticalStrut(10)); + panel.add(createProgressBars(lafs[i].getName(), + lafs[i].getClassName(), o)); + } + + return panel; + } + + static JPanel createProgressBars(String name, String plaf, + ComponentOrientation o) { + JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); + JLabel label = new JLabel(name); + panel.add(label); + try { + LookAndFeel save = UIManager.getLookAndFeel(); + UIManager.setLookAndFeel(plaf); + + panel.add(createProgressBar(true, 0, o)); + panel.add(Box.createVerticalStrut(5)); + + panel.add(createProgressBar(true, 5, o)); + panel.add(Box.createVerticalStrut(5)); + + panel.add(createProgressBar(true, 10, o)); + panel.add(Box.createVerticalStrut(5)); + + panel.add(createProgressBar(true, 20, o)); + panel.add(Box.createVerticalStrut(5)); + + UIManager.put("ProgressBar.cellSpacing", Integer.valueOf(2)); + UIManager.put("ProgressBar.cellLength", Integer.valueOf(7)); + + panel.add(createProgressBar(false, 5, o)); + panel.add(Box.createVerticalStrut(5)); + + panel.add(createProgressBar(false, 20, o)); + + UIManager.setLookAndFeel(save); + } catch (Exception e) { + System.err.println(e); + } + return panel; + } + + static JProgressBar createProgressBar(boolean paintStr, int value, + ComponentOrientation o) { + JProgressBar p = new JProgressBar(JProgressBar.HORIZONTAL, 0, 20); + p.setStringPainted(paintStr); + p.setValue(value); + p.setComponentOrientation(o); + return p; + } + +} diff --git a/test/jdk/javax/swing/JProgressBar/bug4230391.java b/test/jdk/javax/swing/JProgressBar/bug4230391.java new file mode 100644 index 000000000000..473862d83a33 --- /dev/null +++ b/test/jdk/javax/swing/JProgressBar/bug4230391.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 1999, 2025, 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 4230391 + * @summary Tests that JProgressBar draws correctly when Insets are not zero + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4230391 +*/ + +import java.awt.ComponentOrientation; +import java.awt.Container; +import java.awt.Insets; +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.LookAndFeel; +import javax.swing.JPanel; +import javax.swing.JProgressBar; +import javax.swing.UIManager; + +public class bug4230391 { + + static final String INSTRUCTIONS = """ + Tests that progress bars honor insets in different L&Fs. + Different L&Fs render the progress bar differently, and may or may + not have a different colored background around the progress bar, + and may or may not draw a border around the bar+background. + The progress bars should be of equal width and the progress + rendering line/bar should not extend past/overlap any border. + If it is as described, the test PASSES. + """; + + static class InsetProgressBar extends JProgressBar { + private Insets insets = new Insets(12, 12, 12, 12); + + public InsetProgressBar(boolean horiz, int low, int hi) { + super((horiz)?JProgressBar.HORIZONTAL:JProgressBar.VERTICAL, low, hi); + } + + public Insets getInsets() { + return insets; + } + } + + static JPanel createBarSet() { + JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); + panel.setBorder(BorderFactory.createEmptyBorder(20,20,20,20)); + UIManager.LookAndFeelInfo[] lafs = UIManager.getInstalledLookAndFeels(); + for (int i = 0; i < lafs.length; i++) { + if (i > 0) { + panel.add(Box.createVerticalStrut(10)); + } + panel.add(createProgressBars(lafs[i].getName(), lafs[i].getClassName())); + } + return panel; + } + + static JPanel createProgressBars(String name, String plaf) { + JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); + try { + LookAndFeel save = UIManager.getLookAndFeel(); + UIManager.setLookAndFeel(plaf); + + ComponentOrientation ltr = ComponentOrientation.LEFT_TO_RIGHT; + + Box b = Box.createVerticalBox(); + panel.add(b); + panel.add(Box.createHorizontalStrut(5)); + panel.add(createProgressBar(false, true, ltr)); + UIManager.setLookAndFeel(save); + } catch (Exception e) { + System.err.println(e); + } + return panel; + } + + static JProgressBar createProgressBar(boolean solid, boolean horiz, + ComponentOrientation o) { + if (solid) { + UIManager.put("ProgressBar.cellSpacing", Integer.valueOf(0)); + UIManager.put("ProgressBar.cellLength", Integer.valueOf(1)); + } else { + UIManager.put("ProgressBar.cellSpacing", Integer.valueOf(2)); + UIManager.put("ProgressBar.cellLength", Integer.valueOf(7)); + } + + JProgressBar p = new InsetProgressBar(horiz, 0, 20); + p.setStringPainted(solid); + p.setValue(20); + p.setComponentOrientation(o); + + return p; + } + + static JFrame createUI() { + JFrame frame = new JFrame("Progress Bar Insets Test"); + Container contentPane = frame.getContentPane(); + contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.X_AXIS)); + contentPane.add(createBarSet()); + frame.setSize(400, 300); + return frame; + } + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .title("Progress Bar Insets Test Instructions") + .instructions(INSTRUCTIONS) + .columns(60) + .testUI(bug4230391::createUI) + .build() + .awaitAndCheck(); + } +} diff --git a/test/jdk/javax/swing/JProgressBar/bug4393042.java b/test/jdk/javax/swing/JProgressBar/bug4393042.java new file mode 100644 index 000000000000..f17d70a1309d --- /dev/null +++ b/test/jdk/javax/swing/JProgressBar/bug4393042.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2001, 2025, 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 4393042 + * @summary JProgressBar should update painting when maximum value is very large + * @key headful + */ + +import java.awt.Graphics; +import javax.swing.JFrame; +import javax.swing.JProgressBar; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; + +public class bug4393042 extends JProgressBar { + + static final int MAXIMUM = Integer.MAX_VALUE - 100; + static volatile int value = 0; + static volatile bug4393042 progressBar; + static JFrame frame; + static volatile int paintCount = 0; + + public void paintComponent(Graphics g) { + super.paintComponent(g); + System.out.println("paint count=" + (++paintCount)); + } + + public bug4393042(int min, int max) { + super(min, max); + } + + public static void main(String[] args) throws Exception { + + UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); + + try { + SwingUtilities.invokeAndWait(bug4393042::createUI); + + value = 0; + for (int i = 0; i <= 10; i++) { + Thread.sleep(1000); + SwingUtilities.invokeAndWait(() -> { + progressBar.setValue(value); + }); + value += MAXIMUM / 10; + } + + } finally { + SwingUtilities.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + if (paintCount < 10 || paintCount > 100) { + throw new RuntimeException("Unexpected paint count : " + paintCount); + } + } + + static void createUI() { + frame = new JFrame("bug4393042"); + progressBar = new bug4393042(0, MAXIMUM); + progressBar.setStringPainted(true); + progressBar.setValue(0); + frame.add(progressBar); + frame.setSize(400, 200); + frame.setVisible(true); + } +} diff --git a/test/jdk/javax/swing/JProgressBar/bug5003022.java b/test/jdk/javax/swing/JProgressBar/bug5003022.java new file mode 100644 index 000000000000..57f5fdfc45da --- /dev/null +++ b/test/jdk/javax/swing/JProgressBar/bug5003022.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2004, 2025, 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 5003022 + * @summary Test that setting zero value on JProgressBar works in GTK L&F + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug5003022 +*/ + +import java.awt.FlowLayout; +import javax.swing.JFrame; +import javax.swing.JProgressBar; +import javax.swing.UIManager; + +public class bug5003022 { + + static final String INSTRUCTIONS = """ + There are two progress bars, they should display progress strings. + The first progress bar should display 0% and the bar should show no progress color fill. + The second progress bar should display 30% and the bar should show 30% progress color fill. + If it is as described, the test PASSES, otherwise it FAILS. + """; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .title("bug5003022 Test Instructions") + .instructions(INSTRUCTIONS) + .columns(60) + .testUI(bug5003022::createUI) + .build() + .awaitAndCheck(); + } + + static JFrame createUI() { + try { + /* This will only succeed on Linux, but the test is valid for other platforms and L&Fs */ + UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel"); + } catch (Exception e) { + e.printStackTrace(); + } + + JFrame frame = new JFrame("bug5003022"); + JProgressBar pb1 = new JProgressBar(); + pb1.setValue(0); + pb1.setStringPainted(true); + + JProgressBar pb2 = new JProgressBar(); + pb2.setValue(30); + pb2.setStringPainted(true); + + frame.setLayout(new FlowLayout()); + frame.add(pb1); + frame.add(pb2); + + frame.setSize(300, 300); + return frame; + } + +} From 8f6216353f6548fece9bf3bb9b0cee9ae4757120 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Wed, 8 Oct 2025 01:49:31 +0000 Subject: [PATCH 140/323] 8353592: Open source several scrollbar tests Backport-of: 5280b7b031bb3dc44fb923c3be7ae04ec22fd364 --- .../java/awt/Scrollbar/ListScrollbarTest.java | 139 ++++++++++++++++++ .../awt/Scrollbar/ScrollbarCtrlClickTest.java | 114 ++++++++++++++ .../java/awt/Scrollbar/UnitIncrementTest.java | 129 ++++++++++++++++ 3 files changed, 382 insertions(+) create mode 100644 test/jdk/java/awt/Scrollbar/ListScrollbarTest.java create mode 100644 test/jdk/java/awt/Scrollbar/ScrollbarCtrlClickTest.java create mode 100644 test/jdk/java/awt/Scrollbar/UnitIncrementTest.java diff --git a/test/jdk/java/awt/Scrollbar/ListScrollbarTest.java b/test/jdk/java/awt/Scrollbar/ListScrollbarTest.java new file mode 100644 index 000000000000..fb441fe44ba1 --- /dev/null +++ b/test/jdk/java/awt/Scrollbar/ListScrollbarTest.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 1998, 2025, 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 4029465 + * @summary Win95 Multiselect List doesn't display scrollbar + * @key headful + * @run main ListScrollbarTest + */ + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.EventQueue; +import java.awt.Frame; +import java.awt.List; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Robot; + +public class ListScrollbarTest { + + private static final Color BG_COLOR = Color.RED; + private static Robot robot; + private static Frame frame; + private static List list; + private static int counter = 0; + private static volatile Rectangle listBounds; + + public static void main(String[] args) throws Exception { + try { + EventQueue.invokeAndWait(ListScrollbarTest::createAndShowUI); + test(); + } finally { + EventQueue.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + } + + private static void test() throws Exception { + robot = new Robot(); + robot.waitForIdle(); + robot.delay(500); + + EventQueue.invokeAndWait(() -> { + Point locationOnScreen = list.getLocationOnScreen(); + Dimension size = list.getSize(); + listBounds = new Rectangle(locationOnScreen, size); + }); + + Point point = new Point(listBounds.x + listBounds.width - 5, + listBounds.y + listBounds.height / 2); + + + for (int i = 0; i < 4; i++) { + scrollbarCheck(point, false); + addListItem(); + } + scrollbarCheck(point, true); + } + + public static boolean areColorsSimilar(Color c1, Color c2, int tolerance) { + return Math.abs(c1.getRed() - c2.getRed()) <= tolerance + && Math.abs(c1.getGreen() - c2.getGreen()) <= tolerance + && Math.abs(c1.getBlue() - c2.getBlue()) <= tolerance; + } + + private static void scrollbarCheck(Point point, boolean isScrollbarExpected) { + Color pixelColor = robot.getPixelColor(point.x, point.y); + boolean areColorsSimilar = areColorsSimilar(BG_COLOR, pixelColor, 5); + + if (isScrollbarExpected && areColorsSimilar) { + throw new RuntimeException((""" + Scrollbar is expected, but pixel color \ + is similar to the background color + %s pixel color + %s bg color""") + .formatted(pixelColor, BG_COLOR)); + } + + if (!isScrollbarExpected && !areColorsSimilar) { + throw new RuntimeException((""" + Scrollbar is not expected, but pixel color \ + is not similar to the background color + %s pixel color + %s bg color""") + .formatted(pixelColor, BG_COLOR)); + } + } + + private static void addListItem() throws Exception { + EventQueue.invokeAndWait(() -> { + counter++; + System.out.println("Adding list item " + counter); + list.add("List Item " + counter); + frame.validate(); + }); + robot.waitForIdle(); + robot.delay(150); + } + + private static void createAndShowUI() { + frame = new Frame("ListScrollbarTest"); + list = new List(3, true); + list.setBackground(BG_COLOR); + + // do not draw border around items, it can affect screen capture + list.setFocusable(false); + + frame.add(list); + + frame.pack(); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } +} diff --git a/test/jdk/java/awt/Scrollbar/ScrollbarCtrlClickTest.java b/test/jdk/java/awt/Scrollbar/ScrollbarCtrlClickTest.java new file mode 100644 index 000000000000..3b5a24008fd8 --- /dev/null +++ b/test/jdk/java/awt/Scrollbar/ScrollbarCtrlClickTest.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2002, 2025, 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 4075950 + * @summary Test for functionality of Control Click on Scrollbar + * @key headful + * @run main ScrollbarCtrlClickTest + */ + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.EventQueue; +import java.awt.Frame; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.Scrollbar; +import java.awt.TextArea; +import java.awt.event.KeyEvent; +import java.awt.event.MouseEvent; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +public class ScrollbarCtrlClickTest { + private static Frame frame; + private static TextArea ta; + private static Scrollbar scrollbar; + private static final CountDownLatch latch = new CountDownLatch(1); + private static volatile Rectangle sbBounds; + + public static void main(String[] args) throws Exception { + try { + EventQueue.invokeAndWait(ScrollbarCtrlClickTest::initAndShowGUI); + test(); + } finally { + EventQueue.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + } + + private static void initAndShowGUI() { + frame = new Frame("ScrollbarDimensionTest"); + ta = new TextArea("", 30, 100); + + + scrollbar = new Scrollbar(Scrollbar.VERTICAL, + 0, 10, 0, 20); + + // Just setting layout so scrollbar thumb will be big enough to use + frame.setLayout(new BorderLayout()); + frame.add("East", scrollbar); + frame.add("West", ta); + + scrollbar.addAdjustmentListener(e -> { + System.out.println(e.paramString()); + ta.append(e.paramString() + "\n"); + latch.countDown(); + }); + + frame.pack(); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } + + private static void test() throws Exception { + Robot robot = new Robot(); + robot.waitForIdle(); + robot.setAutoDelay(25); + robot.delay(500); + + EventQueue.invokeAndWait(() -> { + Point locationOnScreen = scrollbar.getLocationOnScreen(); + Dimension size = scrollbar.getSize(); + sbBounds = new Rectangle(locationOnScreen, size); + }); + + robot.mouseMove(sbBounds.x + sbBounds.width / 2, + sbBounds.y + sbBounds.height - 50); + + robot.keyPress(KeyEvent.VK_CONTROL); + robot.mousePress(MouseEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(MouseEvent.BUTTON1_DOWN_MASK); + robot.keyRelease(KeyEvent.VK_CONTROL); + + if (!latch.await(1, TimeUnit.SECONDS)) { + throw new RuntimeException("Timed out waiting for latch"); + } + } +} diff --git a/test/jdk/java/awt/Scrollbar/UnitIncrementTest.java b/test/jdk/java/awt/Scrollbar/UnitIncrementTest.java new file mode 100644 index 000000000000..03dba0f3a994 --- /dev/null +++ b/test/jdk/java/awt/Scrollbar/UnitIncrementTest.java @@ -0,0 +1,129 @@ +/* + * Copyright (c) 1999, 2025, 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 4169461 + * @summary Test for Motif Scrollbar unit increment + * @key headful + * @run main UnitIncrementTest + */ + +import javax.swing.UIManager; +import java.awt.Dimension; +import java.awt.EventQueue; +import java.awt.Frame; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.Scrollbar; +import java.awt.event.AdjustmentEvent; +import java.awt.event.MouseEvent; +import java.util.ArrayList; + +public class UnitIncrementTest { + private static Frame frame; + private static Scrollbar scrollbar; + private static final java.util.List eventsList = new ArrayList<>(); + private static final int UNIT_INCREMENT_VALUE = 5; + private static final int INCREMENTS_COUNT = 10; + private static volatile Rectangle scrollbarBounds; + + public static void main(String[] args) throws Exception { + UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); + + try { + EventQueue.invokeAndWait(UnitIncrementTest::createAndShowUI); + test(); + } finally { + EventQueue.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + } + + private static void createAndShowUI() { + frame = new Frame("UnitIncrementTest"); + + scrollbar = new Scrollbar(Scrollbar.HORIZONTAL); + + scrollbar.setUnitIncrement(UNIT_INCREMENT_VALUE); + scrollbar.setBlockIncrement(20); + + scrollbar.addAdjustmentListener(e -> { + eventsList.add(e); + System.out.println(e); + }); + + frame.add(scrollbar); + + frame.setSize(300, 100); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } + + private static void test() throws Exception { + Robot robot = new Robot(); + robot.waitForIdle(); + robot.setAutoDelay(25); + robot.delay(500); + + EventQueue.invokeAndWait(() -> { + Point locationOnScreen = scrollbar.getLocationOnScreen(); + Dimension size = scrollbar.getSize(); + scrollbarBounds = new Rectangle(locationOnScreen, size); + }); + + robot.mouseMove(scrollbarBounds.x + scrollbarBounds.width - 10, + scrollbarBounds.y + scrollbarBounds.height / 2); + + for (int i = 0; i < INCREMENTS_COUNT; i++) { + robot.mousePress(MouseEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(MouseEvent.BUTTON1_DOWN_MASK); + robot.delay(150); + } + + robot.waitForIdle(); + robot.delay(250); + + if (eventsList.size() != INCREMENTS_COUNT) { + throw new RuntimeException("Wrong number of events: " + eventsList.size()); + } + + int oldValue = 0; + for (AdjustmentEvent event : eventsList) { + System.out.println("\nChecking event " + event); + + int diff = event.getValue() - oldValue; + System.out.printf("diff: %d - %d = %d\n", event.getValue(), oldValue, diff); + + if (diff != UNIT_INCREMENT_VALUE) { + throw new RuntimeException("Unexpected adjustment value: %d".formatted(diff)); + } + + oldValue = event.getValue(); + } + } +} From 7e7ffd1a098c59c317abffb58b9d3627ad461e2e Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Wed, 8 Oct 2025 06:46:30 +0000 Subject: [PATCH 141/323] 8310049: Refactor Charset tests to use JUnit Backport-of: 09174e0c994dfb19fd09f551720c13c6479812d4 --- .../Charset/AvailableCharsetNames.java | 29 +- .../Charset/CharsetContainmentTest.java | 181 +- .../java/nio/charset/Charset/Contains.java | 306 +- .../nio/charset/Charset/EmptyCharsetName.java | 84 - test/jdk/java/nio/charset/Charset/EncDec.java | 39 +- .../charset/Charset/IllegalCharsetName.java | 106 +- .../nio/charset/Charset/NullCharsetName.java | 30 +- .../charset/Charset/RegisteredCharsets.java | 2568 +++++++++-------- 8 files changed, 1696 insertions(+), 1647 deletions(-) delete mode 100644 test/jdk/java/nio/charset/Charset/EmptyCharsetName.java diff --git a/test/jdk/java/nio/charset/Charset/AvailableCharsetNames.java b/test/jdk/java/nio/charset/Charset/AvailableCharsetNames.java index 078700f2faea..0f20e9576052 100644 --- a/test/jdk/java/nio/charset/Charset/AvailableCharsetNames.java +++ b/test/jdk/java/nio/charset/Charset/AvailableCharsetNames.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2023, 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 @@ -25,27 +25,26 @@ * @bug 4422044 * @summary Ensure that keys in available-charset map * are identical to canonical names + * @run junit AvailableCharsetNames */ -import java.io.*; -import java.nio.*; -import java.nio.charset.*; -import java.util.*; +import java.nio.charset.Charset; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; public class AvailableCharsetNames { - public static void main(String[] args) throws Exception { - Iterator charsetIterator = Charset.availableCharsets().keySet().iterator(); - while (charsetIterator.hasNext()) { - String charsetName = (String) charsetIterator.next(); + /** + * Test that the keys in Charset.availableCharsets() + * are equal to the associated Charset.name() value. + */ + @Test + public void canonicalNamesTest() { + for (String charsetName : Charset.availableCharsets().keySet()) { Charset charset = Charset.forName(charsetName); - if (!charset.name().equals(charsetName)) { - throw new Exception("Error: Charset name mismatch - expected " - + charsetName + ", got " + charset.name()); - } + assertEquals(charset.name(), charsetName, "Charset name mismatch"); } - } - } diff --git a/test/jdk/java/nio/charset/Charset/CharsetContainmentTest.java b/test/jdk/java/nio/charset/Charset/CharsetContainmentTest.java index 7e763f7750c2..4bc053882198 100644 --- a/test/jdk/java/nio/charset/Charset/CharsetContainmentTest.java +++ b/test/jdk/java/nio/charset/Charset/CharsetContainmentTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2023, 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 @@ -25,93 +25,116 @@ * @bug 4626545 4696726 * @summary Checks the inter containment relationships between NIO charsets * @modules jdk.charsets + * @run junit CharsetContainmentTest */ -import java.nio.charset.*; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; -public class CharsetContainmentTest { - static String[] encodings = - { "US-ASCII", "UTF-16", "UTF-16BE", "UTF-16LE", "UTF-8", - "windows-1252", "ISO-8859-1", "ISO-8859-2", "ISO-8859-3", - "ISO-8859-4", "ISO-8859-5", "ISO-8859-6", "ISO-8859-7", - "ISO-8859-8", "ISO-8859-9", "ISO-8859-13", "ISO-8859-15", "ISO-8859-16", - "ISO-2022-JP", "ISO-2022-KR", +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; - // Temporarily remove ISO-2022-CN-* charsets until full encoder/decoder - // support is added (4673614) - // "x-ISO-2022-CN-CNS", "x-ISO-2022-CN-GB", +import static org.junit.jupiter.api.Assertions.assertTrue; - "x-ISCII91", "GBK", "GB18030", "Big5", - "x-EUC-TW", "GB2312", "EUC-KR", "x-Johab", "Big5-HKSCS", - "x-MS950-HKSCS", "windows-1251", "windows-1253", "windows-1254", - "windows-1255", "windows-1256", "windows-1257", "windows-1258", - "x-mswin-936", "x-windows-949", "x-windows-950", "windows-31j", - "Shift_JIS", "EUC-JP", "KOI8-R", "TIS-620" - }; +public class CharsetContainmentTest { - static String[][] contains = { - { "US-ASCII"}, - encodings, - encodings, - encodings, - encodings, - {"US-ASCII", "windows-1252"}, - {"US-ASCII", "ISO-8859-1"}, - {"US-ASCII", "ISO-8859-2"}, - {"US-ASCII", "ISO-8859-3"}, - {"US-ASCII", "ISO-8859-4"}, - {"US-ASCII", "ISO-8859-5"}, - {"US-ASCII", "ISO-8859-6"}, - {"US-ASCII", "ISO-8859-7"}, - {"US-ASCII", "ISO-8859-8"}, - {"US-ASCII", "ISO-8859-9"}, - {"US-ASCII", "ISO-8859-13"}, - {"US-ASCII", "ISO-8859-15"}, - {"US-ASCII", "ISO-8859-16"}, - {"ISO-2022-JP"}, - {"ISO-2022-KR"}, - // Temporarily remove ISO-2022-CN-* charsets until full encoder/decoder - // support is added (4673614) - //{"x-ISO-2022-CN-CNS"}, - //{"x-ISO-2022-CN-GB"}, - {"US-ASCII", "x-ISCII91"}, - {"US-ASCII", "GBK"}, - encodings, - {"US-ASCII", "Big5"}, - {"US-ASCII", "x-EUC-TW"}, - {"US-ASCII", "GB2312"}, - {"US-ASCII", "EUC-KR"}, - {"US-ASCII", "x-Johab"}, - {"US-ASCII", "Big5-HKSCS", "Big5"}, - {"US-ASCII", "x-MS950-HKSCS", "x-windows-950"}, - {"US-ASCII", "windows-1251"}, - {"US-ASCII", "windows-1253"}, - {"US-ASCII", "windows-1254"}, - {"US-ASCII", "windows-1255"}, - {"US-ASCII", "windows-1256"}, - {"US-ASCII", "windows-1257"}, - {"US-ASCII", "windows-1258"}, - {"US-ASCII", "x-mswin-936"}, - {"US-ASCII", "x-windows-949"}, - {"US-ASCII", "x-windows-950"}, - {"US-ASCII", "windows-31j" }, - {"US-ASCII", "Shift_JIS"}, - {"US-ASCII", "EUC-JP"}, - {"US-ASCII", "KOI8-R"}, - {"US-ASCII", "TIS-620"}}; + /** + * Test that the charsets in 'encodings' contain the charsets + * inside 'contains'. Each value in 'encodings' is mapped to a String + * array in 'contains'. For example, the value, "TIS-620" in 'encodings' + * should contain "US-ASCII", "TIS-620". + */ + @ParameterizedTest + @MethodSource("charsets") + public void interContainmentTest(String containerName, String containedName) { + Charset container = Charset.forName(containerName); + Charset contained = Charset.forName(containedName); + assertTrue(container.contains(contained), + String.format("Charset: %s does not contain: %s", containerName, containedName)); + } + private static Stream charsets() { + String[] encodings = { + "US-ASCII", "UTF-16", "UTF-16BE", "UTF-16LE", "UTF-8", + "windows-1252", "ISO-8859-1", "ISO-8859-2", "ISO-8859-3", + "ISO-8859-4", "ISO-8859-5", "ISO-8859-6", "ISO-8859-7", + "ISO-8859-8", "ISO-8859-9", "ISO-8859-13", "ISO-8859-15", "ISO-8859-16", + "ISO-2022-JP", "ISO-2022-KR", + // Temporarily remove ISO-2022-CN-* charsets until full encoder/decoder + // support is added (4673614) + // "x-ISO-2022-CN-CNS", "x-ISO-2022-CN-GB", + "x-ISCII91", "GBK", "GB18030", "Big5", + "x-EUC-TW", "GB2312", "EUC-KR", "x-Johab", "Big5-HKSCS", + "x-MS950-HKSCS", "windows-1251", "windows-1253", "windows-1254", + "windows-1255", "windows-1256", "windows-1257", "windows-1258", + "x-mswin-936", "x-windows-949", "x-windows-950", "windows-31j", + "Shift_JIS", "EUC-JP", "KOI8-R", "TIS-620" + }; - public static void main(String[] args) throws Exception { + String[][] contains = { + {"US-ASCII"}, + encodings, + encodings, + encodings, + encodings, + {"US-ASCII", "windows-1252"}, + {"US-ASCII", "ISO-8859-1"}, + {"US-ASCII", "ISO-8859-2"}, + {"US-ASCII", "ISO-8859-3"}, + {"US-ASCII", "ISO-8859-4"}, + {"US-ASCII", "ISO-8859-5"}, + {"US-ASCII", "ISO-8859-6"}, + {"US-ASCII", "ISO-8859-7"}, + {"US-ASCII", "ISO-8859-8"}, + {"US-ASCII", "ISO-8859-9"}, + {"US-ASCII", "ISO-8859-13"}, + {"US-ASCII", "ISO-8859-15"}, + {"US-ASCII", "ISO-8859-16"}, + {"ISO-2022-JP"}, + {"ISO-2022-KR"}, + // Temporarily remove ISO-2022-CN-* charsets until full encoder/decoder + // support is added (4673614) + //{"x-ISO-2022-CN-CNS"}, + //{"x-ISO-2022-CN-GB"}, + {"US-ASCII", "x-ISCII91"}, + {"US-ASCII", "GBK"}, + encodings, + {"US-ASCII", "Big5"}, + {"US-ASCII", "x-EUC-TW"}, + {"US-ASCII", "GB2312"}, + {"US-ASCII", "EUC-KR"}, + {"US-ASCII", "x-Johab"}, + {"US-ASCII", "Big5-HKSCS", "Big5"}, + {"US-ASCII", "x-MS950-HKSCS", "x-windows-950"}, + {"US-ASCII", "windows-1251"}, + {"US-ASCII", "windows-1253"}, + {"US-ASCII", "windows-1254"}, + {"US-ASCII", "windows-1255"}, + {"US-ASCII", "windows-1256"}, + {"US-ASCII", "windows-1257"}, + {"US-ASCII", "windows-1258"}, + {"US-ASCII", "x-mswin-936"}, + {"US-ASCII", "x-windows-949"}, + {"US-ASCII", "x-windows-950"}, + {"US-ASCII", "windows-31j"}, + {"US-ASCII", "Shift_JIS"}, + {"US-ASCII", "EUC-JP"}, + {"US-ASCII", "KOI8-R"}, + {"US-ASCII", "TIS-620"}}; + + // Length of encodings and contains should always be equal + if (encodings.length != contains.length) { + throw new RuntimeException("Testing data is not set up correctly"); + } + List charsetList = new ArrayList(); for (int i = 0; i < encodings.length; i++) { - Charset c = Charset.forName(encodings[i]); - for (int j = 0 ; j < contains[i].length; j++) { - if (c.contains(Charset.forName(contains[i][j]))) - continue; - else { - throw new Exception ("Error: charset " + encodings[i] + - "doesn't contain " + contains[i][j]); - } - } + for (int j = 0 ; j < contains[i].length; j++) { + charsetList.add(Arguments.of(encodings[i], contains[i][j])); + } } + return charsetList.stream(); } } diff --git a/test/jdk/java/nio/charset/Charset/Contains.java b/test/jdk/java/nio/charset/Charset/Contains.java index 0e5cf6372319..502c22873c3a 100644 --- a/test/jdk/java/nio/charset/Charset/Contains.java +++ b/test/jdk/java/nio/charset/Charset/Contains.java @@ -25,166 +25,186 @@ * @summary Unit test for charset containment * @bug 6798572 8167252 * @modules jdk.charsets + * @run junit Contains */ -import java.nio.charset.*; +import java.nio.charset.Charset; +import java.util.Arrays; +import java.util.stream.Stream; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; -public class Contains { - - static void ck(Charset cs1, Charset cs2, boolean cont) throws Exception { - if ((cs1.contains(cs2)) != cont) - throw new Exception("Wrong answer: " - + cs1.name() + " contains " + cs2.name()); - System.err.println(cs1.name() - + (cont ? " contains " : " does not contain ") - + cs2.name()); - } - - public static void main(String[] args) throws Exception { +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; - Charset us_ascii = Charset.forName("US-ASCII"); - Charset iso_8859_1 = Charset.forName("ISO-8859-1"); - Charset iso_8859_15 = Charset.forName("ISO-8859-15"); - Charset utf_8 = Charset.forName("UTF-8"); - Charset utf_16be = Charset.forName("UTF-16BE"); - Charset cp1252 = Charset.forName("CP1252"); +public class Contains { - ck(us_ascii, us_ascii, true); - ck(us_ascii, iso_8859_1, false); - ck(us_ascii, iso_8859_15, false); - ck(us_ascii, utf_8, false); - ck(us_ascii, utf_16be, false); - ck(us_ascii, cp1252, false); - - ck(iso_8859_1, us_ascii, true); - ck(iso_8859_1, iso_8859_1, true); - ck(iso_8859_1, iso_8859_15, false); - ck(iso_8859_1, utf_8, false); - ck(iso_8859_1, utf_16be, false); - ck(iso_8859_1, cp1252, false); - - ck(iso_8859_15, us_ascii, true); - ck(iso_8859_15, iso_8859_1, false); - ck(iso_8859_15, iso_8859_15, true); - ck(iso_8859_15, utf_8, false); - ck(iso_8859_15, utf_16be, false); - ck(iso_8859_15, cp1252, false); - - ck(utf_8, us_ascii, true); - ck(utf_8, iso_8859_1, true); - ck(utf_8, iso_8859_15, true); - ck(utf_8, utf_8, true); - ck(utf_8, utf_16be, true); - ck(utf_8, cp1252, true); - - ck(utf_16be, us_ascii, true); - ck(utf_16be, iso_8859_1, true); - ck(utf_16be, iso_8859_15, true); - ck(utf_16be, utf_8, true); - ck(utf_16be, utf_16be, true); - ck(utf_16be, cp1252, true); - - ck(cp1252, us_ascii, true); - ck(cp1252, iso_8859_1, false); - ck(cp1252, iso_8859_15, false); - ck(cp1252, utf_8, false); - ck(cp1252, utf_16be, false); - ck(cp1252, cp1252, true); - - checkUTF(); - - containsSelfTest(); + /** + * Tests the containment of some charsets against themselves. + * This test takes both true and false for 'cont'. + */ + @ParameterizedTest + @MethodSource("charsets") + public void charsetsTest(Charset containerCs, Charset cs, boolean cont){ + shouldContain(containerCs, cs, cont); } - static void checkUTF() throws Exception { - for (String utfName : utfNames) - for (String csName : charsetNames) - ck(Charset.forName(utfName), - Charset.forName(csName), - true); + /** + * Tests UTF charsets with other charsets. In this case, each UTF charset + * should contain every single charset they are tested against. 'cont' is + * always true. + */ + @ParameterizedTest + @MethodSource("utfCharsets") + public void UTFCharsetsTest(Charset containerCs, Charset cs, boolean cont){ + shouldContain(containerCs, cs, cont); } /** * Tests the assertion in the contains() method: "Every charset contains itself." */ - static void containsSelfTest() { - boolean failed = false; - + @Test + public void containsSelfTest() { for (var entry : Charset.availableCharsets().entrySet()) { Charset charset = entry.getValue(); boolean contains = charset.contains(charset); - - System.out.println("Charset(" + charset.name() + ").contains(Charset(" + charset.name() - + ")) returns " + contains); - if (!contains) { - failed = true; - } - } - if (failed) { - throw new RuntimeException("Charset.contains(itself) returns false for some charsets"); + assertTrue(contains, String.format("Charset(%s).contains(Charset(%s)) returns %s", + charset.name(), charset.name(), contains)); } } - static String[] utfNames = {"utf-16", - "utf-8", - "utf-16le", - "utf-16be", - "x-utf-16le-bom"}; - - static String[] charsetNames = { - "US-ASCII", - "UTF-8", - "UTF-16", - "UTF-16BE", - "UTF-16LE", - "x-UTF-16LE-BOM", - "GBK", - "GB18030", - "ISO-8859-1", - "ISO-8859-15", - "ISO-8859-2", - "ISO-8859-3", - "ISO-8859-4", - "ISO-8859-5", - "ISO-8859-6", - "ISO-8859-7", - "ISO-8859-8", - "ISO-8859-9", - "ISO-8859-13", - "JIS_X0201", - "x-JIS0208", - "JIS_X0212-1990", - "GB2312", - "EUC-KR", - "x-EUC-TW", - "EUC-JP", - "x-euc-jp-linux", - "KOI8-R", - "TIS-620", - "x-ISCII91", - "windows-1251", - "windows-1252", - "windows-1253", - "windows-1254", - "windows-1255", - "windows-1256", - "windows-1257", - "windows-1258", - "windows-932", - "x-mswin-936", - "x-windows-949", - "x-windows-950", - "windows-31j", - "Big5", - "Big5-HKSCS", - "x-MS950-HKSCS", - "ISO-2022-JP", - "ISO-2022-KR", - "x-ISO-2022-CN-CNS", - "x-ISO-2022-CN-GB", - "Big5-HKSCS", - "x-Johab", - "Shift_JIS" - }; + /** + * Helper method that checks if a charset should contain another charset. + */ + static void shouldContain(Charset containerCs, Charset cs, boolean cont){ + assertEquals((containerCs.contains(cs)), cont, String.format("%s %s %s", + containerCs.name(), (cont ? " contains " : " does not contain "), cs.name())); + } + + private static Stream utfCharsets() { + String[] utfNames = { + "utf-16", + "utf-8", + "utf-16le", + "utf-16be", + "x-utf-16le-bom" + }; + + String[] charsetNames = { + "US-ASCII", + "UTF-8", + "UTF-16", + "UTF-16BE", + "UTF-16LE", + "x-UTF-16LE-BOM", + "GBK", + "GB18030", + "ISO-8859-1", + "ISO-8859-15", + "ISO-8859-2", + "ISO-8859-3", + "ISO-8859-4", + "ISO-8859-5", + "ISO-8859-6", + "ISO-8859-7", + "ISO-8859-8", + "ISO-8859-9", + "ISO-8859-13", + "JIS_X0201", + "x-JIS0208", + "JIS_X0212-1990", + "GB2312", + "EUC-KR", + "x-EUC-TW", + "EUC-JP", + "x-euc-jp-linux", + "KOI8-R", + "TIS-620", + "x-ISCII91", + "windows-1251", + "windows-1252", + "windows-1253", + "windows-1254", + "windows-1255", + "windows-1256", + "windows-1257", + "windows-1258", + "windows-932", + "x-mswin-936", + "x-windows-949", + "x-windows-950", + "windows-31j", + "Big5", + "Big5-HKSCS", + "x-MS950-HKSCS", + "ISO-2022-JP", + "ISO-2022-KR", + "x-ISO-2022-CN-CNS", + "x-ISO-2022-CN-GB", + "Big5-HKSCS", + "x-Johab", + "Shift_JIS" + }; + + // All charsets in utfNames should contain + // all charsets in charsetNames + return Arrays.stream(utfNames).flatMap(cs1 -> Arrays.stream(charsetNames) + .map(cs2 -> Arguments.of(Charset.forName(cs1), Charset.forName(cs2), true))); + } + + private static Stream charsets() { + Charset us_ascii = Charset.forName("US-ASCII"); + Charset iso_8859_1 = Charset.forName("ISO-8859-1"); + Charset iso_8859_15 = Charset.forName("ISO-8859-15"); + Charset utf_8 = Charset.forName("UTF-8"); + Charset utf_16be = Charset.forName("UTF-16BE"); + Charset cp1252 = Charset.forName("CP1252"); + + return Stream.of( + Arguments.of(us_ascii, us_ascii, true), + Arguments.of(us_ascii, iso_8859_1, false), + Arguments.of(us_ascii, iso_8859_15, false), + Arguments.of(us_ascii, utf_8, false), + Arguments.of(us_ascii, utf_16be, false), + Arguments.of(us_ascii, cp1252, false), + + Arguments.of(iso_8859_1, us_ascii, true), + Arguments.of(iso_8859_1, iso_8859_1, true), + Arguments.of(iso_8859_1, iso_8859_15, false), + Arguments.of(iso_8859_1, utf_8, false), + Arguments.of(iso_8859_1, utf_16be, false), + Arguments.of(iso_8859_1, cp1252, false), + + Arguments.of(iso_8859_15, us_ascii, true), + Arguments.of(iso_8859_15, iso_8859_1, false), + Arguments.of(iso_8859_15, iso_8859_15, true), + Arguments.of(iso_8859_15, utf_8, false), + Arguments.of(iso_8859_15, utf_16be, false), + Arguments.of(iso_8859_15, cp1252, false), + + Arguments.of(utf_8, us_ascii, true), + Arguments.of(utf_8, iso_8859_1, true), + Arguments.of(utf_8, iso_8859_15, true), + Arguments.of(utf_8, utf_8, true), + Arguments.of(utf_8, utf_16be, true), + Arguments.of(utf_8, cp1252, true), + + Arguments.of(utf_16be, us_ascii, true), + Arguments.of(utf_16be, iso_8859_1, true), + Arguments.of(utf_16be, iso_8859_15, true), + Arguments.of(utf_16be, utf_8, true), + Arguments.of(utf_16be, utf_16be, true), + Arguments.of(utf_16be, cp1252, true), + + Arguments.of(cp1252, us_ascii, true), + Arguments.of(cp1252, iso_8859_1, false), + Arguments.of(cp1252, iso_8859_15, false), + Arguments.of(cp1252, utf_8, false), + Arguments.of(cp1252, utf_16be, false), + Arguments.of(cp1252, cp1252, true) + ); + } } diff --git a/test/jdk/java/nio/charset/Charset/EmptyCharsetName.java b/test/jdk/java/nio/charset/Charset/EmptyCharsetName.java deleted file mode 100644 index 93797622553c..000000000000 --- a/test/jdk/java/nio/charset/Charset/EmptyCharsetName.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (c) 2010, 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 4786884 - * @summary Ensure that passing the empty string to Charset methods and - * constructors causes an IllegalArgumentException to be thrown - */ - -import java.io.*; -import java.nio.*; -import java.nio.charset.*; - - -public class EmptyCharsetName { - - static abstract class Test { - - public abstract void go() throws Exception; - - Test() throws Exception { - try { - go(); - } catch (Exception x) { - if (x instanceof IllegalCharsetNameException) { - System.err.println("Thrown as expected: " + x); - return; - } - throw new Exception("Incorrect exception: " - + x.getClass().getName(), - x); - } - throw new Exception("No exception thrown"); - } - - } - - public static void main(String[] args) throws Exception { - - new Test() { - public void go() throws Exception { - Charset.forName(""); - }}; - new Test() { - public void go() throws Exception { - Charset.isSupported(""); - }}; - new Test() { - public void go() throws Exception { - new Charset("", new String[] { }) { - public CharsetDecoder newDecoder() { - return null; - } - public CharsetEncoder newEncoder() { - return null; - } - public boolean contains(Charset cs) { - return false; - } - }; - }}; - } - -} diff --git a/test/jdk/java/nio/charset/Charset/EncDec.java b/test/jdk/java/nio/charset/Charset/EncDec.java index b0d2ccd92ec1..324418ad0740 100644 --- a/test/jdk/java/nio/charset/Charset/EncDec.java +++ b/test/jdk/java/nio/charset/Charset/EncDec.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2023, 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 @@ -23,23 +23,42 @@ /* @test * @summary Unit test for encode/decode convenience methods + * @run junit EncDec */ +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.util.stream.Stream; -import java.nio.*; -import java.nio.charset.*; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import static org.junit.jupiter.api.Assertions.assertEquals; public class EncDec { - public static void main(String[] args) throws Exception { - String s = "Hello, world!"; + /** + * Test that the input String is the same after round tripping + * the Charset.encode() and Charset.decode() methods. + */ + @ParameterizedTest + @MethodSource("stringProvider") + public void roundTripTest(String pre) { ByteBuffer bb = ByteBuffer.allocate(100); - bb.put(Charset.forName("ISO-8859-15").encode(s)).flip(); - String t = Charset.forName("UTF-8").decode(bb).toString(); - System.err.println(t); - if (!t.equals(s)) - throw new Exception("Mismatch: " + s + " != " + t); + Charset preCs = Charset.forName("ISO-8859-15"); + if (!preCs.canEncode()) { + throw new RuntimeException("Error: Trying to test encode and " + + "decode methods on a charset that does not support encoding"); + } + bb.put(preCs.encode(pre)).flip(); + String post = Charset.forName("UTF-8").decode(bb).toString(); + assertEquals(pre, post, "Mismatch after encoding + decoding, :"); } + static Stream stringProvider() { + return Stream.of( + "Hello, world!", + "apple, banana, orange", + "car, truck, horse"); + } } diff --git a/test/jdk/java/nio/charset/Charset/IllegalCharsetName.java b/test/jdk/java/nio/charset/Charset/IllegalCharsetName.java index dd7c68c97822..266801cf52b7 100644 --- a/test/jdk/java/nio/charset/Charset/IllegalCharsetName.java +++ b/test/jdk/java/nio/charset/Charset/IllegalCharsetName.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2023, 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 @@ -22,46 +22,71 @@ */ /* @test - * @bug 6330020 8184665 + * @bug 4786884 6330020 8184665 * @summary Ensure Charset.forName/isSupport throws the correct exception * if the charset names passed in are illegal. + * @run junit IllegalCharsetName */ -import java.nio.charset.*; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CharsetEncoder; +import java.nio.charset.IllegalCharsetNameException; +import java.util.stream.Stream; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import static org.junit.jupiter.api.Assertions.assertThrows; public class IllegalCharsetName { - public static void main(String[] args) throws Exception { - String[] illegalNames = { - ".", - "_", - ":", - "-", - ".name", - "_name", - ":name", - "-name", - "name*name", - "name?name" - }; - for (int i = 0; i < illegalNames.length; i++) { - try { - Charset.forName(illegalNames[i]); - throw new Exception("Charset.forName(): No exception thrown"); - } catch (IllegalCharsetNameException x) { //expected - } - try { - Charset.isSupported(illegalNames[i]); - throw new Exception("Charset.isSupported(): No exception thrown"); - } catch (IllegalCharsetNameException x) { //expected - } - } + // Charset.forName and Charset.isSupported should throw an + // IllegalCharsetNameException when passed an illegal name + @ParameterizedTest + @MethodSource("illegalNames") + public void illegalCharsetsTest(String name) { + assertThrows(IllegalCharsetNameException.class, + () -> Charset.forName(name)); + assertThrows(IllegalCharsetNameException.class, + () -> Charset.forName(name)); + } + + // Charset.forName, Charset.isSupported, and the Charset constructor should + // throw an IllegalCharsetNameException when passed an empty name + @Test + public void emptyCharsetsTest() { + assertThrows(IllegalCharsetNameException.class, + () -> Charset.forName("")); + assertThrows(IllegalCharsetNameException.class, + () -> Charset.forName("")); + assertThrows(IllegalCharsetNameException.class, + () -> new Charset("", new String[]{}) { + @Override + public boolean contains(Charset cs) { + return false; + } + + @Override + public CharsetDecoder newDecoder() { + return null; + } - // Standard charsets may bypass alias checking during startup, test that - // they're all well-behaved as a sanity test - checkAliases(StandardCharsets.ISO_8859_1); - checkAliases(StandardCharsets.US_ASCII); - checkAliases(StandardCharsets.UTF_8); + @Override + public CharsetEncoder newEncoder() { + return null; + } + }); + } + + // Standard charsets may bypass alias checking during startup, test that + // they're all well-behaved as a sanity test + @Test + public void aliasTest() { + for (Charset cs : Charset.availableCharsets().values()) { + checkAliases(cs); + } } private static void checkAliases(Charset cs) { @@ -70,4 +95,19 @@ private static void checkAliases(Charset cs) { Charset.isSupported(alias); } } + + static Stream illegalNames() { + return Stream.of( + ".", + "_", + ":", + "-", + ".name", + "_name", + ":name", + "-name", + "name*name", + "name?name" + ); + } } diff --git a/test/jdk/java/nio/charset/Charset/NullCharsetName.java b/test/jdk/java/nio/charset/Charset/NullCharsetName.java index 591fbf14cdfe..a6b3a952215c 100644 --- a/test/jdk/java/nio/charset/Charset/NullCharsetName.java +++ b/test/jdk/java/nio/charset/Charset/NullCharsetName.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,29 +24,21 @@ /* @test * @bug 4448594 * @summary Ensure passing null to Charset.forName throws the correct exception + * @run junit NullCharsetName */ -import java.io.*; -import java.nio.*; -import java.nio.charset.*; -import java.util.*; +import java.nio.charset.Charset; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertThrows; public class NullCharsetName { - public static void main(String[] args) throws Exception { - try { - Charset.forName(null); - } catch (Exception x) { - if (x instanceof IllegalArgumentException) { - System.err.println("Thrown as expected: " + x); - return; - } - throw new Exception("Incorrect exception: " - + x.getClass().getName(), - x); - } - throw new Exception("No exception thrown"); + // Charset.forName should throw an exception when passed null + @Test + public void nullCharsetTest() { + assertThrows(IllegalArgumentException.class, + () -> Charset.forName(null)); } - } diff --git a/test/jdk/java/nio/charset/Charset/RegisteredCharsets.java b/test/jdk/java/nio/charset/Charset/RegisteredCharsets.java index 495d2a32bcd3..c4a9853547b6 100644 --- a/test/jdk/java/nio/charset/Charset/RegisteredCharsets.java +++ b/test/jdk/java/nio/charset/Charset/RegisteredCharsets.java @@ -26,1288 +26,1328 @@ 6911753 8071447 8186751 8242541 8260265 8301119 * @summary Check that registered charsets are actually registered * @modules jdk.charsets - * @run main RegisteredCharsets - * @run main/othervm -Djdk.charset.GB18030=2000 RegisteredCharsets + * @run junit RegisteredCharsets + * @run junit/othervm -Djdk.charset.GB18030=2000 RegisteredCharsets */ -import java.nio.charset.*; +import java.nio.charset.Charset; +import java.nio.charset.UnsupportedCharsetException; +import java.util.stream.Stream; -public class RegisteredCharsets { +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; - static String [] ianaRegistered = { - "US-ASCII", "UTF8", "Big5", "EUC-JP", - "GBK", "GB18030", "ISO-2022-KR", "ISO-2022-JP", - "GB2312", // IANA preferred name for "EUC-CN" - "ISO-8859-1", "ISO-8859-2", "ISO-8859-3", - "ISO-8859-4", "ISO-8859-5", "ISO-8859-6", - "ISO-8859-7", "ISO-8859-8", "ISO-8859-9", - "ISO-8859-13", "ISO-8859-15", "ISO-8859-16", - "windows-1251", - "windows-1252", "windows-1253", "windows-1254", - "windows-1255", "windows-1256", "windows-31j", - "Shift_JIS", "JIS_X0201", "JIS_X0212-1990", - "TIS-620", "Big5-HKSCS", - "ISO-2022-CN", - "IBM850", - "IBM852", - "IBM855", - "IBM857", - "IBM860", - "IBM861", - "IBM862", - "IBM863", - "IBM864", - "IBM865", - "IBM866", - "IBM868", - "IBM869", - "IBM437", - "IBM775", - "IBM037", - "IBM1026", - "IBM273", - "IBM277", - "IBM278", - "IBM280", - "IBM284", - "IBM285", - "IBM297", - "IBM420", - "IBM424", - "IBM500", - "IBM-Thai", - "IBM870", - "IBM871", - "IBM918", - "IBM1047", - "IBM01140", - "IBM01141", - "IBM01142", - "IBM01143", - "IBM01144", - "IBM01145", - "IBM01146", - "IBM01147", - "IBM01148", - "IBM01149", - "IBM00858" }; - - static String [] ianaUnRegistered = { - "x-EUC-TW", "x-ISCII91", - "x-windows-949", "x-windows-950", - "x-mswin-936", "x-JIS0208", - "x-ISO-8859-11", - "x-windows-874", - "x-PCK", "x-JISAutoDetect", "x-Johab", - "x-MS950-HKSCS", - "x-Big5-Solaris", - "x-ISO-2022-CN-CNS", - "x-ISO-2022-CN-GB", - "x-MacArabic", - "x-MacCentralEurope", - "x-MacCroatian", - "x-MacCyrillic", - "x-MacDingbat", - "x-MacGreek", - "x-MacHebrew", - "x-MacIceland", - "x-MacRoman", - "x-MacRomania", - "x-MacSymbol", - "x-MacThai", - "x-MacTurkish", - "x-MacUkraine", - "x-IBM942", - "x-IBM942C", - "x-IBM943", - "x-IBM943C", - "x-IBM948", - "x-IBM950", - "x-IBM930", - "x-IBM935", - "x-IBM937", - "x-IBM856", - "x-IBM874", - "x-IBM737", - "x-IBM1006", - "x-IBM1046", - "x-IBM1098", - "x-IBM1025", - "x-IBM1112", - "x-IBM1122", - "x-IBM1123", - "x-IBM1124", - "x-IBM1129", - "x-IBM1166", - "x-IBM875", - "x-IBM921", - "x-IBM922", - "x-IBM1097", - "x-IBM949", - "x-IBM949C", - "x-IBM939", - "x-IBM933", - "x-IBM1381", - "x-IBM1383", - "x-IBM970", - "x-IBM964", - "x-IBM33722", - "x-IBM1006", - "x-IBM1046", - "x-IBM1097", - "x-IBM1098", - "x-IBM1112", - "x-IBM1122", - "x-IBM1123", - "x-IBM1124", - "x-IBM33722", - "x-IBM737", - "x-IBM856", - "x-IBM874", - "x-IBM875", - "x-IBM922", - "x-IBM933", - "x-IBM964" }; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; - static void check(String csn, boolean testRegistered) throws Exception { - if (!Charset.forName(csn).isRegistered() && testRegistered) - throw new Exception("Not registered: " + csn); - else if (Charset.forName(csn).isRegistered() && !testRegistered) - throw new Exception("Registered: " + csn + "should be unregistered"); +public class RegisteredCharsets { + + // Charset.forName should throw an exception when passed "default" + @Test + public void defaultCharsetTest() { + assertThrows(UnsupportedCharsetException.class, + () -> Charset.forName("default")); } - static void aliasCheck(String canonicalName, String[] aliasNames) throws Exception - { - for (int k = 0; k < aliasNames.length; k++ ) { - Charset cs = Charset.forName(aliasNames[k]); - if (!cs.name().equals(canonicalName)) { - throw new Exception("Unexpected Canonical name " + canonicalName); - } + /** + * Tests that the aliases of the input String convert + * to the same Charset. This is validated by ensuring the input String + * and Charset.name() values are equal. + */ + @ParameterizedTest + @MethodSource("aliases") + public void testAliases(String canonicalName, String[] aliasNames) { + for (String aliasName : aliasNames) { + Charset cs = Charset.forName(aliasName); + assertEquals(cs.name(), canonicalName); } } - public static void main(String[] args) throws Exception { + /** + * Tests charsets to ensure that they are registered in the + * IANA Charset Registry. + */ + @ParameterizedTest + @MethodSource("ianaRegistered") + public void registeredTest(String cs) throws Exception { + check(cs, true); + } - for (int i = 0; i < ianaRegistered.length ; i++) - check(ianaRegistered[i], true); + /** + * Tests charsets to ensure that they are NOT registered in the + * IANA Charset Registry. + */ + @ParameterizedTest + @MethodSource("ianaUnregistered") + public void unregisteredTest(String cs) throws Exception { + check(cs, false); + } - for (int i = 0; i < ianaUnRegistered.length ; i++) - check(ianaUnRegistered[i], false); + /** + * Helper method which checks if a charset is registered and whether + * it should be. + */ + static void check(String csn, boolean testRegistered) throws Exception { + if (!Charset.forName(csn).isRegistered() && testRegistered) { + throw new Exception("Not registered: " + csn); + } + else if (Charset.forName(csn).isRegistered() && !testRegistered) { + throw new Exception("Registered: " + csn + "should be unregistered"); + } + } + + // See https://www.iana.org/assignments/character-sets/character-sets.xhtml + private static Stream ianaRegistered() { + return Stream.of( + "US-ASCII", "UTF8", "Big5", "EUC-JP", + "GBK", "GB18030", "ISO-2022-KR", "ISO-2022-JP", + "GB2312", // IANA preferred name for "EUC-CN" + "ISO-8859-1", "ISO-8859-2", "ISO-8859-3", + "ISO-8859-4", "ISO-8859-5", "ISO-8859-6", + "ISO-8859-7", "ISO-8859-8", "ISO-8859-9", + "ISO-8859-13", "ISO-8859-15", "ISO-8859-16", + "windows-1251", + "windows-1252", "windows-1253", "windows-1254", + "windows-1255", "windows-1256", "windows-31j", + "Shift_JIS", "JIS_X0201", "JIS_X0212-1990", + "TIS-620", "Big5-HKSCS", + "ISO-2022-CN", + "IBM850", + "IBM852", + "IBM855", + "IBM857", + "IBM860", + "IBM861", + "IBM862", + "IBM863", + "IBM864", + "IBM865", + "IBM866", + "IBM868", + "IBM869", + "IBM437", + "IBM775", + "IBM037", + "IBM1026", + "IBM273", + "IBM277", + "IBM278", + "IBM280", + "IBM284", + "IBM285", + "IBM297", + "IBM420", + "IBM424", + "IBM500", + "IBM-Thai", + "IBM870", + "IBM871", + "IBM918", + "IBM1047", + "IBM01140", + "IBM01141", + "IBM01142", + "IBM01143", + "IBM01144", + "IBM01145", + "IBM01146", + "IBM01147", + "IBM01148", + "IBM01149", + "IBM00858" + ); + } + private static Stream ianaUnregistered() { + return Stream.of( + "x-EUC-TW", "x-ISCII91", + "x-windows-949", "x-windows-950", + "x-mswin-936", "x-JIS0208", + "x-ISO-8859-11", + "x-windows-874", + "x-PCK", "x-JISAutoDetect", "x-Johab", + "x-MS950-HKSCS", + "x-Big5-Solaris", + "x-ISO-2022-CN-CNS", + "x-ISO-2022-CN-GB", + "x-MacArabic", + "x-MacCentralEurope", + "x-MacCroatian", + "x-MacCyrillic", + "x-MacDingbat", + "x-MacGreek", + "x-MacHebrew", + "x-MacIceland", + "x-MacRoman", + "x-MacRomania", + "x-MacSymbol", + "x-MacThai", + "x-MacTurkish", + "x-MacUkraine", + "x-IBM942", + "x-IBM942C", + "x-IBM943", + "x-IBM943C", + "x-IBM948", + "x-IBM950", + "x-IBM930", + "x-IBM935", + "x-IBM937", + "x-IBM856", + "x-IBM874", + "x-IBM737", + "x-IBM1006", + "x-IBM1046", + "x-IBM1098", + "x-IBM1025", + "x-IBM1112", + "x-IBM1122", + "x-IBM1123", + "x-IBM1124", + "x-IBM1129", + "x-IBM1166", + "x-IBM875", + "x-IBM921", + "x-IBM922", + "x-IBM1097", + "x-IBM949", + "x-IBM949C", + "x-IBM939", + "x-IBM933", + "x-IBM1381", + "x-IBM1383", + "x-IBM970", + "x-IBM964", + "x-IBM33722", + "x-IBM1006", + "x-IBM1046", + "x-IBM1097", + "x-IBM1098", + "x-IBM1112", + "x-IBM1122", + "x-IBM1123", + "x-IBM1124", + "x-IBM33722", + "x-IBM737", + "x-IBM856", + "x-IBM874", + "x-IBM875", + "x-IBM922", + "x-IBM933", + "x-IBM964" + ); + } + + private static Stream aliases() { // Check aliases registered with IANA for all NIO supported // Charset implementations. // // The aliases below are in sync with the IANA registered charset // document at: http://www.iana.org/assignments/character-sets // Last updated 7/25/2002 - - aliasCheck("US-ASCII", - new String[] {"ascii","ANSI_X3.4-1968", - "iso-ir-6","ANSI_X3.4-1986", "ISO_646.irv:1991", - "ASCII", "ISO646-US","us","IBM367","cp367", - "csASCII"}); - - aliasCheck("UTF-8", - new String[] { - "UTF8", - "unicode-1-1-utf-8" - }); - - aliasCheck("UTF-16", - new String[] { - "UTF_16", - "utf16" - }); - - aliasCheck("UTF-16BE", - new String[] { - "UTF_16BE", - "ISO-10646-UCS-2", - "X-UTF-16BE", - "UnicodeBigUnmarked" - }); - - aliasCheck("UTF-16LE", - new String[] { - "UTF_16LE", - "X-UTF-16LE", - "UnicodeLittleUnmarked" - }); - - aliasCheck("Big5", - new String[] { - "csBig5" - }); - - aliasCheck("Big5-HKSCS", - new String[] { - "Big5_HKSCS", - "big5hk", - "big5-hkscs", - "big5hkscs" - }); - - aliasCheck("x-MS950-HKSCS", - new String[] { - "MS950_HKSCS" - }); - - aliasCheck("GB18030", - "2000".equals(System.getProperty("jdk.charset.GB18030")) ? - new String[] { - "gb18030-2000" - } : - new String[] { - "gb18030-2022" - }); - - aliasCheck("ISO-2022-KR", new String[] {"csISO2022KR"}); - aliasCheck("ISO-2022-JP", new String[] {"csISO2022JP"}); - aliasCheck("EUC-KR", new String[] { "csEUCKR"}); - aliasCheck("ISO-8859-1", - new String[] { - - // IANA aliases - "iso-ir-100", - "ISO_8859-1", - "latin1", - "l1", - "IBM819", - "cp819", - "csISOLatin1", - - // JDK historical aliases - "819", - "IBM-819", - "ISO8859_1", - "ISO_8859-1:1987", - "ISO_8859_1", - "8859_1", - "ISO8859-1", - - }); - - aliasCheck("ISO-8859-2", - new String[] { - "ISO_8859-2", - "ISO_8859-2:1987", - "iso-ir-101", - "latin2", - "l2", - "8859_2", - "iso_8859-2:1987", - "iso8859-2", - "ibm912", - "ibm-912", - "cp912", - "912", - "csISOLatin2"}); - - aliasCheck("ISO-8859-3", - new String[] {"latin3", - "ISO_8859-3:1988", - "iso-ir-109", - "l3", - "8859_3", - "iso_8859-3:1988", - "iso8859-3", - "ibm913", - "ibm-913", - "cp913", - "913", - "csISOLatin3"}); - - aliasCheck("ISO-8859-4", - new String[] {"csISOLatin4", - "ISO_8859-4:1988", - "iso-ir-110", - "latin4", - "8859_4", - "iso_8859-4:1988", - "iso8859-4", - "ibm914", - "ibm-914", - "cp914", - "914", - "l4"}); - - aliasCheck("ISO-8859-5", - new String[] { - "iso8859_5", // JDK historical - "8859_5", - "iso-ir-144", - "ISO_8859-5", - "ISO_8859-5:1988", - "ISO8859-5", - "cyrillic", - "ibm915", - "ibm-915", - "915", - "cp915", - "csISOLatinCyrillic" - }); - - aliasCheck("ISO-8859-6", - new String[] {"ISO_8859-6:1987", - "iso-ir-127", - "ISO_8859-6", - "ECMA-114", - "ASMO-708", - "arabic", - "8859_6", - "iso_8859-6:1987", - "iso8859-6", - "ibm1089", - "ibm-1089", - "cp1089", - "1089", - "csISOLatinArabic"}); - - aliasCheck("ISO-8859-7", - new String[] {"ISO_8859-7:1987", - "iso-ir-126", - "ISO_8859-7", - "ELOT_928", - "ECMA-118", - "greek", - "greek8", - "8859_7", - "iso_8859-7:1987", - "iso8859-7", - "ibm813", - "ibm-813", - "cp813", - "813", - "csISOLatinGreek"}); - - aliasCheck("ISO-8859-8", - new String[] { - "ISO_8859-8:1988", - "iso-ir-138", - "ISO_8859-8", - "hebrew", - "8859_8", - "iso_8859-8:1988", - "iso8859-8", - "ibm916", - "ibm-916", - "cp916", - "916", - "csISOLatinHebrew"}); - - aliasCheck("ISO-8859-9", - new String[] {"ISO_8859-9:1989", - "iso-ir-148", - "ISO_8859-9", - "latin5", - "l5", - "8859_9", - "iso8859-9", - "ibm920", - "ibm-920", - "cp920", - "920", - "csISOLatin5"}); - - aliasCheck("ISO-8859-13", - new String[] { - "iso8859_13", // JDK historical - "iso_8859-13", - "8859_13", - "ISO8859-13" - }); - - aliasCheck("ISO-8859-15", - new String[] { - // IANA alias - "ISO_8859-15", - "Latin-9", - "csISO885915", - // JDK historical aliases - "8859_15", - "ISO-8859-15", - "ISO_8859-15", - "ISO8859-15", - "ISO8859_15", - "IBM923", - "IBM-923", - "cp923", - "923", - "LATIN0", - "LATIN9", - "L9", - "csISOlatin0", - "csISOlatin9", - "ISO8859_15_FDIS" - }); - - aliasCheck("ISO-8859-16", - new String[] { - "iso-ir-226", - "ISO_8859-16:2001", - "ISO_8859-16", - "ISO8859_16", - "latin10", - "l10", - "csISO885916" - }); - - aliasCheck("JIS_X0212-1990", - new String[] { - "iso-ir-159", - "csISO159JISX02121990"}); - - aliasCheck("JIS_X0201", - new String[]{ - "X0201", - "csHalfWidthKatakana"}); - - aliasCheck("KOI8-R", - new String[] { - "KOI8_R", - "csKOI8R"}); - - aliasCheck("GBK", - new String[] { - "windows-936"}); - - aliasCheck("Shift_JIS", - new String[] { - "MS_Kanji", - "csShiftJIS"}); - - aliasCheck("EUC-JP", - new String[] { - "Extended_UNIX_Code_Packed_Format_for_Japanese", - "csEUCPkdFmtJapanese"}); - - aliasCheck("Big5", new String[] {"csBig5"}); - - aliasCheck("windows-31j", new String[] {"csWindows31J"}); - - aliasCheck("x-iso-8859-11", - new String[] { "iso-8859-11", "iso8859_11" }); - - aliasCheck("windows-1250", - new String[] { - "cp1250", - "cp5346" - }); - - aliasCheck("windows-1251", - new String[] { - "cp1251", - "cp5347", - "ansi-1251" - }); - - aliasCheck("windows-1252", - new String[] { - "cp1252", - "cp5348" - }); - - aliasCheck("windows-1253", - new String[] { - "cp1253", - "cp5349" - }); - - aliasCheck("windows-1254", - new String[] { - "cp1254", - "cp5350" - }); - - aliasCheck("windows-1255", - new String[] { - "cp1255" - }); - - aliasCheck("windows-1256", - new String[] { - "cp1256" - }); - - aliasCheck("windows-1257", - new String[] { - "cp1257", - "cp5353" - }); - - aliasCheck("windows-1258", - new String[] { - "cp1258" - }); - - aliasCheck("x-windows-874", - new String[] { - "ms874", "ms-874", "windows-874" }); - - aliasCheck("GB2312", - new String[] { - "x-EUC-CN", - "gb2312-80", - "gb2312-1980", - "euc-cn", - "euccn" }); - - aliasCheck("x-IBM942" , - new String[] { - "cp942", // JDK historical - "ibm942", - "ibm-942", - "942" - }); - - aliasCheck("x-IBM942C" , - new String[] { - "cp942C", // JDK historical - "ibm942C", - "ibm-942C", - "942C" - } ); - - aliasCheck("x-IBM943" , - new String[] { - "cp943", // JDK historical - "ibm943", - "ibm-943", - "943" - } ); - - aliasCheck("x-IBM943C" , - new String[] { - "cp943c", // JDK historical - "ibm943C", - "ibm-943C", - "943C" - } ); - - aliasCheck("x-IBM948" , - new String[] { - "cp948", // JDK historical - "ibm948", - "ibm-948", - "948" - } ); - - aliasCheck("x-IBM950" , - new String[] { - "cp950", // JDK historical - "ibm950", - "ibm-950", - "950" - } ); - - aliasCheck("x-IBM930" , - new String[] { - "cp930", // JDK historical - "ibm930", - "ibm-930", - "930" - } ); - - aliasCheck("x-IBM935" , - new String[] { - "cp935", // JDK historical - "ibm935", - "ibm-935", - "935" - } ); - - aliasCheck("x-IBM937" , - new String[] { - "cp937", // JDK historical - "ibm937", - "ibm-937", - "937" - } ); - - aliasCheck("IBM850" , - new String[] { - "cp850", // JDK historical - "ibm-850", - "ibm850", - "850", - "cspc850multilingual" - } ); - - aliasCheck("IBM852" , - new String[] { - "cp852", // JDK historical - "ibm852", - "ibm-852", - "852", - "csPCp852" - } ); - - aliasCheck("IBM855" , - new String[] { - "cp855", // JDK historical - "ibm-855", - "ibm855", - "855", - "cspcp855" - } ); - - aliasCheck("x-IBM856" , - new String[] { - "cp856", // JDK historical - "ibm-856", - "ibm856", - "856" - } ); - - aliasCheck("IBM857" , - new String[] { - "cp857", // JDK historical - "ibm857", - "ibm-857", - "857", - "csIBM857" - } ); - - aliasCheck("IBM860" , - new String[] { - "cp860", // JDK historical - "ibm860", - "ibm-860", - "860", - "csIBM860" - } ); - aliasCheck("IBM861" , - new String[] { - "cp861", // JDK historical - "ibm861", - "ibm-861", - "861", - "csIBM861" - } ); - - aliasCheck("IBM862" , - new String[] { - "cp862", // JDK historical - "ibm862", - "ibm-862", - "862", - "csIBM862" - } ); - - aliasCheck("IBM863" , - new String[] { - "cp863", // JDK historical - "ibm863", - "ibm-863", - "863", - "csIBM863" - } ); - - aliasCheck("IBM864" , - new String[] { - "cp864", // JDK historical - "ibm864", - "ibm-864", - "864", - "csIBM864" - } ); - - aliasCheck("IBM865" , - new String[] { - "cp865", // JDK historical - "ibm865", - "ibm-865", - "865", - "csIBM865" - } ); - - aliasCheck("IBM866" , new String[] { - "cp866", // JDK historical - "ibm866", - "ibm-866", - "866", - "csIBM866" - } ); - aliasCheck("IBM868" , - new String[] { - "cp868", // JDK historical - "ibm868", - "ibm-868", - "868", - "cp-ar", - "csIBM868" - } ); - - aliasCheck("IBM869" , - new String[] { - "cp869", // JDK historical - "ibm869", - "ibm-869", - "869", - "cp-gr", - "csIBM869" - } ); - - aliasCheck("IBM437" , - new String[] { - "cp437", // JDK historical - "ibm437", - "ibm-437", - "437", - "cspc8codepage437", - "windows-437" - } ); - - aliasCheck("x-IBM874" , - new String[] { - "cp874", // JDK historical - "ibm874", - "ibm-874", - "874" - } ); - aliasCheck("x-IBM737" , - new String[] { - "cp737", // JDK historical - "ibm737", - "ibm-737", - "737" - } ); - - aliasCheck("IBM775" , - new String[] { - "cp775", // JDK historical - "ibm775", - "ibm-775", - "775" - } ); - - aliasCheck("x-IBM921" , - new String[] { - "cp921", // JDK historical - "ibm921", - "ibm-921", - "921" - } ); - - aliasCheck("x-IBM1006" , - new String[] { - "cp1006", // JDK historical - "ibm1006", - "ibm-1006", - "1006" - } ); - - aliasCheck("x-IBM1046" , - new String[] { - "cp1046", // JDK historical - "ibm1046", - "ibm-1046", - "1046" - } ); - - aliasCheck("IBM1047" , - new String[] { - "cp1047", // JDK historical - "ibm-1047", - "1047" - } ); - - aliasCheck("x-IBM1098" , - new String[] { - "cp1098", // JDK historical - "ibm1098", - "ibm-1098", - "1098", - } ); - - aliasCheck("IBM037" , - new String[] { - "cp037", // JDK historical - "ibm037", - "csIBM037", - "cs-ebcdic-cp-us", - "cs-ebcdic-cp-ca", - "cs-ebcdic-cp-wt", - "cs-ebcdic-cp-nl", - "ibm-037", - "ibm-37", - "cpibm37", - "037" - } ); - - aliasCheck("x-IBM1025" , - new String[] { - "cp1025", // JDK historical - "ibm1025", - "ibm-1025", - "1025" - } ); - - aliasCheck("IBM1026" , - new String[] { - "cp1026", // JDK historical - "ibm1026", - "ibm-1026", - "1026" - } ); - - aliasCheck("x-IBM1112" , - new String[] { - "cp1112", // JDK historical - "ibm1112", - "ibm-1112", - "1112" - } ); - - aliasCheck("x-IBM1122" , - new String[] { - "cp1122", // JDK historical - "ibm1122", - "ibm-1122", - "1122" - } ); - - aliasCheck("x-IBM1123" , - new String[] { - "cp1123", // JDK historical - "ibm1123", - "ibm-1123", - "1123" - } ); - - aliasCheck("x-IBM1124" , - new String[] { - "cp1124", // JDK historical - "ibm1124", - "ibm-1124", - "1124" - } ); - - aliasCheck("x-IBM1129" , - new String[] { - "cp1129", // JDK historical - "ibm1129", - "ibm-1129", - "1129" - } ); - - aliasCheck("x-IBM1166" , - new String[] { - "cp1166", // JDK historical - "ibm1166", - "ibm-1166", - "1166" - } ); - - aliasCheck("IBM273" , - new String[] { - "cp273", // JDK historical - "ibm273", - "ibm-273", - "273" - } ); - - aliasCheck("IBM277" , - new String[] { - "cp277", // JDK historical - "ibm277", - "ibm-277", - "277" - } ); - - aliasCheck("IBM278" , - new String[] { - "cp278", // JDK historical - "ibm278", - "ibm-278", - "278", - "ebcdic-sv", - "ebcdic-cp-se", - "csIBM278" - } ); - - aliasCheck("IBM280" , - new String[] { - "cp280", // JDK historical - "ibm280", - "ibm-280", - "280" - } ); - - aliasCheck("IBM284" , - new String[] { - "cp284", // JDK historical - "ibm284", - "ibm-284", - "284", - "csIBM284", - "cpibm284" - } ); - - aliasCheck("IBM285" , - new String[] { - "cp285", // JDK historical - "ibm285", - "ibm-285", - "285", - "ebcdic-cp-gb", - "ebcdic-gb", - "csIBM285", - "cpibm285" - } ); - - aliasCheck("IBM297" , - new String[] { - "cp297", // JDK historical - "ibm297", - "ibm-297", - "297", - "ebcdic-cp-fr", - "cpibm297", - "csIBM297", - } ); - - aliasCheck("IBM420" , - new String[] { - "cp420", // JDK historical - "ibm420", - "ibm-420", - "ebcdic-cp-ar1", - "420", - "csIBM420" - } ); - - aliasCheck("IBM424" , - new String[] { - "cp424", // JDK historical - "ibm424", - "ibm-424", - "424", - "ebcdic-cp-he", - "csIBM424" - } ); - - aliasCheck("IBM500" , - new String[] { - "cp500", // JDK historical - "ibm500", - "ibm-500", - "500", - "ebcdic-cp-ch", - "ebcdic-cp-bh", - "csIBM500" - } ); - - aliasCheck("IBM-Thai" , - new String[] { - "cp838", // JDK historical - "ibm838", - "ibm-838", - "ibm838", - "838" - } ); - - aliasCheck("IBM870" , - new String[] { - "cp870", // JDK historical - "ibm870", - "ibm-870", - "870", - "ebcdic-cp-roece", - "ebcdic-cp-yu", - "csIBM870" - } ); - - aliasCheck("IBM871" , - new String[] { - "cp871", // JDK historical - "ibm871", - "ibm-871", - "871", - "ebcdic-cp-is", - "csIBM871" - } ); - - aliasCheck("x-IBM875" , - new String[] { - "cp875", // JDK historical - "ibm875", - "ibm-875", - "875" - } ); - - aliasCheck("IBM918" , - new String[] { - "cp918", // JDK historical - "ibm-918", - "918", - "ebcdic-cp-ar2" - } ); - - aliasCheck("x-IBM922" , - new String[] { - "cp922", // JDK historical - "ibm922", - "ibm-922", - "922" - } ); - - aliasCheck("x-IBM1097" , - new String[] { - "cp1097", // JDK historical - "ibm1097", - "ibm-1097", - "1097" - } ); - - aliasCheck("x-IBM949" , - new String[] { - "cp949", // JDK historical - "ibm949", - "ibm-949", - "949" - } ); - - aliasCheck("x-IBM949C" , - new String[] { - "cp949C", // JDK historical - "ibm949C", - "ibm-949C", - "949C" - } ); - - aliasCheck("x-IBM939" , - new String[] { - "cp939", // JDK historical - "ibm939", - "ibm-939", - "939" - } ); - - aliasCheck("x-IBM933" , - new String[] { - "cp933", // JDK historical - "ibm933", - "ibm-933", - "933" - } ); - - aliasCheck("x-IBM1381" , - new String[] { - "cp1381", // JDK historical - "ibm1381", - "ibm-1381", - "1381" - } ); - - aliasCheck("x-IBM1383" , - new String[] { - "cp1383", // JDK historical - "ibm1383", - "ibm-1383", - "1383" - } ); - - aliasCheck("x-IBM970" , - new String[] { - "cp970", // JDK historical - "ibm970", - "ibm-970", - "ibm-eucKR", - "970" - } ); - - aliasCheck("x-IBM964" , - new String[] { - "cp964", // JDK historical - "ibm964", - "ibm-964", - "964" - } ); - - aliasCheck("x-IBM33722" , - new String[] { - "cp33722", // JDK historical - "ibm33722", - "ibm-33722", - "ibm-5050", // from IBM alias list - "ibm-33722_vascii_vpua", // from IBM alias list - "33722" - } ); - - aliasCheck("IBM01140" , - new String[] { - "cp1140", // JDK historical - "ccsid01140", - "cp01140", - // "ebcdic-us-037+euro" - } ); - - aliasCheck("IBM01141" , - new String[] { - "cp1141", // JDK historical - "ccsid01141", - "cp01141", - // "ebcdic-de-273+euro" - } ); - - aliasCheck("IBM01142" , - new String[] { - "cp1142", // JDK historical - "ccsid01142", - "cp01142", - // "ebcdic-no-277+euro", - // "ebcdic-dk-277+euro" - } ); - - aliasCheck("IBM01143" , - new String[] { - "cp1143", // JDK historical - "ccsid01143", - "cp01143", - // "ebcdic-fi-278+euro", - // "ebcdic-se-278+euro" - } ); - - aliasCheck("IBM01144" , - new String[] { - "cp1144", // JDK historical - "ccsid01144", - "cp01144", - // "ebcdic-it-280+euro" - } ); - - aliasCheck("IBM01145" , - new String[] { - "cp1145", // JDK historical - "ccsid01145", - "cp01145", - // "ebcdic-es-284+euro" - } ); - - aliasCheck("IBM01146" , - new String[] { - "cp1146", // JDK historical - "ccsid01146", - "cp01146", - // "ebcdic-gb-285+euro" - } ); - - aliasCheck("IBM01147" , - new String[] { - "cp1147", // JDK historical - "ccsid01147", - "cp01147", - // "ebcdic-fr-277+euro" - } ); - - aliasCheck("IBM01148" , - new String[] { - "cp1148", // JDK historical - "ccsid01148", - "cp01148", - // "ebcdic-international-500+euro" - } ); - - aliasCheck("IBM01149" , - new String[] { - "cp1149", // JDK historical - "ccsid01149", - "cp01149", - // "ebcdic-s-871+euro" - } ); - - aliasCheck("IBM00858" , - new String[] { - "cp858", // JDK historical - "ccsid00858", - "cp00858", - // "PC-Multilingual-850+euro" - } ); - - aliasCheck("x-MacRoman", - new String[] { - "MacRoman" // JDK historical - }); - - aliasCheck("x-MacCentralEurope", - new String[] { - "MacCentralEurope" // JDK historical - }); - - aliasCheck("x-MacCroatian", - new String[] { - "MacCroatian" // JDK historical - }); - - - aliasCheck("x-MacCroatian", - new String[] { - "MacCroatian" // JDK historical - }); - - - aliasCheck("x-MacGreek", - new String[] { - "MacGreek" // JDK historical - }); - - aliasCheck("x-MacCyrillic", - new String[] { - "MacCyrillic" // JDK historical - }); - - aliasCheck("x-MacUkraine", - new String[] { - "MacUkraine" // JDK historical - }); - - aliasCheck("x-MacTurkish", - new String[] { - "MacTurkish" // JDK historical - }); - - aliasCheck("x-MacArabic", - new String[] { - "MacArabic" // JDK historical - }); - - aliasCheck("x-MacHebrew", - new String[] { - "MacHebrew" // JDK historical - }); - - aliasCheck("x-MacIceland", - new String[] { - "MacIceland" // JDK historical - }); - - aliasCheck("x-MacRomania", - new String[] { - "MacRomania" // JDK historical - }); - - aliasCheck("x-MacThai", - new String[] { - "MacThai" // JDK historical - }); - - aliasCheck("x-MacSymbol", - new String[] { - "MacSymbol" // JDK historical - }); - - aliasCheck("x-MacDingbat", - new String[] { - "MacDingbat" // JDK historical - }); - - // Check UnsupportedCharsetException is thrown for the name "default" - try { - Charset.forName("default"); - throw new RuntimeException("UnsupportedCharsetException was not thrown for Charset.forName(\"default\")"); - } catch (UnsupportedCharsetException uce) { - // success - } + return Stream.of( + Arguments.of("US-ASCII", + new String[] {"ascii","ANSI_X3.4-1968", + "iso-ir-6","ANSI_X3.4-1986", "ISO_646.irv:1991", + "ASCII", "ISO646-US","us","IBM367","cp367", + "csASCII"}), + + Arguments.of("UTF-8", + new String[] { + "UTF8", + "unicode-1-1-utf-8" + }), + + Arguments.of("UTF-16", + new String[] { + "UTF_16", + "utf16" + }), + + Arguments.of("UTF-16BE", + new String[] { + "UTF_16BE", + "ISO-10646-UCS-2", + "X-UTF-16BE", + "UnicodeBigUnmarked" + }), + + Arguments.of("UTF-16LE", + new String[] { + "UTF_16LE", + "X-UTF-16LE", + "UnicodeLittleUnmarked" + }), + + Arguments.of("Big5", + new String[] { + "csBig5" + }), + + Arguments.of("Big5-HKSCS", + new String[] { + "Big5_HKSCS", + "big5hk", + "big5-hkscs", + "big5hkscs" + }), + + Arguments.of("x-MS950-HKSCS", + new String[] { + "MS950_HKSCS" + }), + + Arguments.of("GB18030", + "2000".equals(System.getProperty("jdk.charset.GB18030")) ? + new String[] { + "gb18030-2000" + } : + new String[] { + "gb18030-2022" + }), + + Arguments.of("ISO-2022-KR", new String[] {"csISO2022KR"}), + Arguments.of("ISO-2022-JP", new String[] {"csISO2022JP"}), + Arguments.of("EUC-KR", new String[] { "csEUCKR"}), + Arguments.of("ISO-8859-1", + new String[] { + + // IANA aliases + "iso-ir-100", + "ISO_8859-1", + "latin1", + "l1", + "IBM819", + "cp819", + "csISOLatin1", + + // JDK historical aliases + "819", + "IBM-819", + "ISO8859_1", + "ISO_8859-1:1987", + "ISO_8859_1", + "8859_1", + "ISO8859-1", + + }), + + Arguments.of("ISO-8859-2", + new String[] { + "ISO_8859-2", + "ISO_8859-2:1987", + "iso-ir-101", + "latin2", + "l2", + "8859_2", + "iso_8859-2:1987", + "iso8859-2", + "ibm912", + "ibm-912", + "cp912", + "912", + "csISOLatin2"}), + + Arguments.of("ISO-8859-3", + new String[] {"latin3", + "ISO_8859-3:1988", + "iso-ir-109", + "l3", + "8859_3", + "iso_8859-3:1988", + "iso8859-3", + "ibm913", + "ibm-913", + "cp913", + "913", + "csISOLatin3"}), + + Arguments.of("ISO-8859-4", + new String[] {"csISOLatin4", + "ISO_8859-4:1988", + "iso-ir-110", + "latin4", + "8859_4", + "iso_8859-4:1988", + "iso8859-4", + "ibm914", + "ibm-914", + "cp914", + "914", + "l4"}), + + Arguments.of("ISO-8859-5", + new String[] { + "iso8859_5", // JDK historical + "8859_5", + "iso-ir-144", + "ISO_8859-5", + "ISO_8859-5:1988", + "ISO8859-5", + "cyrillic", + "ibm915", + "ibm-915", + "915", + "cp915", + "csISOLatinCyrillic" + }), + + Arguments.of("ISO-8859-6", + new String[] {"ISO_8859-6:1987", + "iso-ir-127", + "ISO_8859-6", + "ECMA-114", + "ASMO-708", + "arabic", + "8859_6", + "iso_8859-6:1987", + "iso8859-6", + "ibm1089", + "ibm-1089", + "cp1089", + "1089", + "csISOLatinArabic"}), + + Arguments.of("ISO-8859-7", + new String[] {"ISO_8859-7:1987", + "iso-ir-126", + "ISO_8859-7", + "ELOT_928", + "ECMA-118", + "greek", + "greek8", + "8859_7", + "iso_8859-7:1987", + "iso8859-7", + "ibm813", + "ibm-813", + "cp813", + "813", + "csISOLatinGreek"}), + + Arguments.of("ISO-8859-8", + new String[] { + "ISO_8859-8:1988", + "iso-ir-138", + "ISO_8859-8", + "hebrew", + "8859_8", + "iso_8859-8:1988", + "iso8859-8", + "ibm916", + "ibm-916", + "cp916", + "916", + "csISOLatinHebrew"}), + + Arguments.of("ISO-8859-9", + new String[] {"ISO_8859-9:1989", + "iso-ir-148", + "ISO_8859-9", + "latin5", + "l5", + "8859_9", + "iso8859-9", + "ibm920", + "ibm-920", + "cp920", + "920", + "csISOLatin5"}), + + Arguments.of("ISO-8859-13", + new String[] { + "iso8859_13", // JDK historical + "iso_8859-13", + "8859_13", + "ISO8859-13" + }), + + Arguments.of("ISO-8859-15", + new String[] { + // IANA alias + "ISO_8859-15", + "Latin-9", + "csISO885915", + // JDK historical aliases + "8859_15", + "ISO-8859-15", + "ISO_8859-15", + "ISO8859-15", + "ISO8859_15", + "IBM923", + "IBM-923", + "cp923", + "923", + "LATIN0", + "LATIN9", + "L9", + "csISOlatin0", + "csISOlatin9", + "ISO8859_15_FDIS" + }), + + Arguments.of("ISO-8859-16", + new String[] { + "iso-ir-226", + "ISO_8859-16:2001", + "ISO_8859-16", + "ISO8859_16", + "latin10", + "l10", + "csISO885916" + }), + + Arguments.of("JIS_X0212-1990", + new String[] { + "iso-ir-159", + "csISO159JISX02121990"}), + + Arguments.of("JIS_X0201", + new String[]{ + "X0201", + "csHalfWidthKatakana"}), + + Arguments.of("KOI8-R", + new String[] { + "KOI8_R", + "csKOI8R"}), + + Arguments.of("GBK", + new String[] { + "windows-936"}), + + Arguments.of("Shift_JIS", + new String[] { + "MS_Kanji", + "csShiftJIS"}), + + Arguments.of("EUC-JP", + new String[] { + "Extended_UNIX_Code_Packed_Format_for_Japanese", + "csEUCPkdFmtJapanese"}), + + Arguments.of("Big5", new String[] {"csBig5"}), + + Arguments.of("windows-31j", new String[] {"csWindows31J"}), + + Arguments.of("x-iso-8859-11", + new String[] { "iso-8859-11", "iso8859_11" }), + + Arguments.of("windows-1250", + new String[] { + "cp1250", + "cp5346" + }), + + Arguments.of("windows-1251", + new String[] { + "cp1251", + "cp5347", + "ansi-1251" + }), + + Arguments.of("windows-1252", + new String[] { + "cp1252", + "cp5348" + }), + + Arguments.of("windows-1253", + new String[] { + "cp1253", + "cp5349" + }), + + Arguments.of("windows-1254", + new String[] { + "cp1254", + "cp5350" + }), + + Arguments.of("windows-1255", + new String[] { + "cp1255" + }), + + Arguments.of("windows-1256", + new String[] { + "cp1256" + }), + + Arguments.of("windows-1257", + new String[] { + "cp1257", + "cp5353" + }), + + Arguments.of("windows-1258", + new String[] { + "cp1258" + }), + + Arguments.of("x-windows-874", + new String[] { + "ms874", "ms-874", "windows-874" }), + + Arguments.of("GB2312", + new String[] { + "x-EUC-CN", + "gb2312-80", + "gb2312-1980", + "euc-cn", + "euccn" }), + + Arguments.of("x-IBM942" , + new String[] { + "cp942", // JDK historical + "ibm942", + "ibm-942", + "942" + }), + + Arguments.of("x-IBM942C" , + new String[] { + "cp942C", // JDK historical + "ibm942C", + "ibm-942C", + "942C" + } ), + + Arguments.of("x-IBM943" , + new String[] { + "cp943", // JDK historical + "ibm943", + "ibm-943", + "943" + } ), + + Arguments.of("x-IBM943C" , + new String[] { + "cp943c", // JDK historical + "ibm943C", + "ibm-943C", + "943C" + } ), + + Arguments.of("x-IBM948" , + new String[] { + "cp948", // JDK historical + "ibm948", + "ibm-948", + "948" + } ), + + Arguments.of("x-IBM950" , + new String[] { + "cp950", // JDK historical + "ibm950", + "ibm-950", + "950" + } ), + + Arguments.of("x-IBM930" , + new String[] { + "cp930", // JDK historical + "ibm930", + "ibm-930", + "930" + } ), + + Arguments.of("x-IBM935" , + new String[] { + "cp935", // JDK historical + "ibm935", + "ibm-935", + "935" + } ), + + Arguments.of("x-IBM937" , + new String[] { + "cp937", // JDK historical + "ibm937", + "ibm-937", + "937" + } ), + + Arguments.of("IBM850" , + new String[] { + "cp850", // JDK historical + "ibm-850", + "ibm850", + "850", + "cspc850multilingual" + } ), + + Arguments.of("IBM852" , + new String[] { + "cp852", // JDK historical + "ibm852", + "ibm-852", + "852", + "csPCp852" + } ), + + Arguments.of("IBM855" , + new String[] { + "cp855", // JDK historical + "ibm-855", + "ibm855", + "855", + "cspcp855" + } ), + + Arguments.of("x-IBM856" , + new String[] { + "cp856", // JDK historical + "ibm-856", + "ibm856", + "856" + } ), + + Arguments.of("IBM857" , + new String[] { + "cp857", // JDK historical + "ibm857", + "ibm-857", + "857", + "csIBM857" + } ), + + Arguments.of("IBM860" , + new String[] { + "cp860", // JDK historical + "ibm860", + "ibm-860", + "860", + "csIBM860" + } ), + Arguments.of("IBM861" , + new String[] { + "cp861", // JDK historical + "ibm861", + "ibm-861", + "861", + "csIBM861" + } ), + + Arguments.of("IBM862" , + new String[] { + "cp862", // JDK historical + "ibm862", + "ibm-862", + "862", + "csIBM862" + } ), + + Arguments.of("IBM863" , + new String[] { + "cp863", // JDK historical + "ibm863", + "ibm-863", + "863", + "csIBM863" + } ), + + Arguments.of("IBM864" , + new String[] { + "cp864", // JDK historical + "ibm864", + "ibm-864", + "864", + "csIBM864" + } ), + + Arguments.of("IBM865" , + new String[] { + "cp865", // JDK historical + "ibm865", + "ibm-865", + "865", + "csIBM865" + } ), + + Arguments.of("IBM866" , new String[] { + "cp866", // JDK historical + "ibm866", + "ibm-866", + "866", + "csIBM866" + } ), + Arguments.of("IBM868" , + new String[] { + "cp868", // JDK historical + "ibm868", + "ibm-868", + "868", + "cp-ar", + "csIBM868" + } ), + + Arguments.of("IBM869" , + new String[] { + "cp869", // JDK historical + "ibm869", + "ibm-869", + "869", + "cp-gr", + "csIBM869" + } ), + + Arguments.of("IBM437" , + new String[] { + "cp437", // JDK historical + "ibm437", + "ibm-437", + "437", + "cspc8codepage437", + "windows-437" + } ), + + Arguments.of("x-IBM874" , + new String[] { + "cp874", // JDK historical + "ibm874", + "ibm-874", + "874" + } ), + Arguments.of("x-IBM737" , + new String[] { + "cp737", // JDK historical + "ibm737", + "ibm-737", + "737" + } ), + + Arguments.of("IBM775" , + new String[] { + "cp775", // JDK historical + "ibm775", + "ibm-775", + "775" + } ), + + Arguments.of("x-IBM921" , + new String[] { + "cp921", // JDK historical + "ibm921", + "ibm-921", + "921" + } ), + + Arguments.of("x-IBM1006" , + new String[] { + "cp1006", // JDK historical + "ibm1006", + "ibm-1006", + "1006" + } ), + + Arguments.of("x-IBM1046" , + new String[] { + "cp1046", // JDK historical + "ibm1046", + "ibm-1046", + "1046" + } ), + + Arguments.of("IBM1047" , + new String[] { + "cp1047", // JDK historical + "ibm-1047", + "1047" + } ), + + Arguments.of("x-IBM1098" , + new String[] { + "cp1098", // JDK historical + "ibm1098", + "ibm-1098", + "1098", + } ), + + Arguments.of("IBM037" , + new String[] { + "cp037", // JDK historical + "ibm037", + "csIBM037", + "cs-ebcdic-cp-us", + "cs-ebcdic-cp-ca", + "cs-ebcdic-cp-wt", + "cs-ebcdic-cp-nl", + "ibm-037", + "ibm-37", + "cpibm37", + "037" + } ), + + Arguments.of("x-IBM1025" , + new String[] { + "cp1025", // JDK historical + "ibm1025", + "ibm-1025", + "1025" + } ), + + Arguments.of("IBM1026" , + new String[] { + "cp1026", // JDK historical + "ibm1026", + "ibm-1026", + "1026" + } ), + + Arguments.of("x-IBM1112" , + new String[] { + "cp1112", // JDK historical + "ibm1112", + "ibm-1112", + "1112" + } ), + + Arguments.of("x-IBM1122" , + new String[] { + "cp1122", // JDK historical + "ibm1122", + "ibm-1122", + "1122" + } ), + + Arguments.of("x-IBM1123" , + new String[] { + "cp1123", // JDK historical + "ibm1123", + "ibm-1123", + "1123" + } ), + + Arguments.of("x-IBM1124" , + new String[] { + "cp1124", // JDK historical + "ibm1124", + "ibm-1124", + "1124" + } ), + + Arguments.of("x-IBM1129" , + new String[] { + "cp1129", // JDK historical + "ibm1129", + "ibm-1129", + "1129" + } ), + + Arguments.of("x-IBM1166" , + new String[] { + "cp1166", // JDK historical + "ibm1166", + "ibm-1166", + "1166" + } ), + + Arguments.of("IBM273" , + new String[] { + "cp273", // JDK historical + "ibm273", + "ibm-273", + "273" + } ), + + Arguments.of("IBM277" , + new String[] { + "cp277", // JDK historical + "ibm277", + "ibm-277", + "277" + } ), + + Arguments.of("IBM278" , + new String[] { + "cp278", // JDK historical + "ibm278", + "ibm-278", + "278", + "ebcdic-sv", + "ebcdic-cp-se", + "csIBM278" + } ), + + Arguments.of("IBM280" , + new String[] { + "cp280", // JDK historical + "ibm280", + "ibm-280", + "280" + } ), + + Arguments.of("IBM284" , + new String[] { + "cp284", // JDK historical + "ibm284", + "ibm-284", + "284", + "csIBM284", + "cpibm284" + } ), + + Arguments.of("IBM285" , + new String[] { + "cp285", // JDK historical + "ibm285", + "ibm-285", + "285", + "ebcdic-cp-gb", + "ebcdic-gb", + "csIBM285", + "cpibm285" + } ), + + Arguments.of("IBM297" , + new String[] { + "cp297", // JDK historical + "ibm297", + "ibm-297", + "297", + "ebcdic-cp-fr", + "cpibm297", + "csIBM297", + } ), + + Arguments.of("IBM420" , + new String[] { + "cp420", // JDK historical + "ibm420", + "ibm-420", + "ebcdic-cp-ar1", + "420", + "csIBM420" + } ), + + Arguments.of("IBM424" , + new String[] { + "cp424", // JDK historical + "ibm424", + "ibm-424", + "424", + "ebcdic-cp-he", + "csIBM424" + } ), + + Arguments.of("IBM500" , + new String[] { + "cp500", // JDK historical + "ibm500", + "ibm-500", + "500", + "ebcdic-cp-ch", + "ebcdic-cp-bh", + "csIBM500" + } ), + + Arguments.of("IBM-Thai" , + new String[] { + "cp838", // JDK historical + "ibm838", + "ibm-838", + "ibm838", + "838" + } ), + + Arguments.of("IBM870" , + new String[] { + "cp870", // JDK historical + "ibm870", + "ibm-870", + "870", + "ebcdic-cp-roece", + "ebcdic-cp-yu", + "csIBM870" + } ), + + Arguments.of("IBM871" , + new String[] { + "cp871", // JDK historical + "ibm871", + "ibm-871", + "871", + "ebcdic-cp-is", + "csIBM871" + } ), + + Arguments.of("x-IBM875" , + new String[] { + "cp875", // JDK historical + "ibm875", + "ibm-875", + "875" + } ), + + Arguments.of("IBM918" , + new String[] { + "cp918", // JDK historical + "ibm-918", + "918", + "ebcdic-cp-ar2" + } ), + + Arguments.of("x-IBM922" , + new String[] { + "cp922", // JDK historical + "ibm922", + "ibm-922", + "922" + } ), + + Arguments.of("x-IBM1097" , + new String[] { + "cp1097", // JDK historical + "ibm1097", + "ibm-1097", + "1097" + } ), + + Arguments.of("x-IBM949" , + new String[] { + "cp949", // JDK historical + "ibm949", + "ibm-949", + "949" + } ), + + Arguments.of("x-IBM949C" , + new String[] { + "cp949C", // JDK historical + "ibm949C", + "ibm-949C", + "949C" + } ), + + Arguments.of("x-IBM939" , + new String[] { + "cp939", // JDK historical + "ibm939", + "ibm-939", + "939" + } ), + + Arguments.of("x-IBM933" , + new String[] { + "cp933", // JDK historical + "ibm933", + "ibm-933", + "933" + } ), + + Arguments.of("x-IBM1381" , + new String[] { + "cp1381", // JDK historical + "ibm1381", + "ibm-1381", + "1381" + } ), + + Arguments.of("x-IBM1383" , + new String[] { + "cp1383", // JDK historical + "ibm1383", + "ibm-1383", + "1383" + } ), + + Arguments.of("x-IBM970" , + new String[] { + "cp970", // JDK historical + "ibm970", + "ibm-970", + "ibm-eucKR", + "970" + } ), + + Arguments.of("x-IBM964" , + new String[] { + "cp964", // JDK historical + "ibm964", + "ibm-964", + "964" + } ), + + Arguments.of("x-IBM33722" , + new String[] { + "cp33722", // JDK historical + "ibm33722", + "ibm-33722", + "ibm-5050", // from IBM alias list + "ibm-33722_vascii_vpua", // from IBM alias list + "33722" + } ), + + Arguments.of("IBM01140" , + new String[] { + "cp1140", // JDK historical + "ccsid01140", + "cp01140", + // "ebcdic-us-037+euro" + } ), + + Arguments.of("IBM01141" , + new String[] { + "cp1141", // JDK historical + "ccsid01141", + "cp01141", + // "ebcdic-de-273+euro" + } ), + + Arguments.of("IBM01142" , + new String[] { + "cp1142", // JDK historical + "ccsid01142", + "cp01142", + // "ebcdic-no-277+euro", + // "ebcdic-dk-277+euro" + } ), + + Arguments.of("IBM01143" , + new String[] { + "cp1143", // JDK historical + "ccsid01143", + "cp01143", + // "ebcdic-fi-278+euro", + // "ebcdic-se-278+euro" + } ), + + Arguments.of("IBM01144" , + new String[] { + "cp1144", // JDK historical + "ccsid01144", + "cp01144", + // "ebcdic-it-280+euro" + } ), + + Arguments.of("IBM01145" , + new String[] { + "cp1145", // JDK historical + "ccsid01145", + "cp01145", + // "ebcdic-es-284+euro" + } ), + + Arguments.of("IBM01146" , + new String[] { + "cp1146", // JDK historical + "ccsid01146", + "cp01146", + // "ebcdic-gb-285+euro" + } ), + + Arguments.of("IBM01147" , + new String[] { + "cp1147", // JDK historical + "ccsid01147", + "cp01147", + // "ebcdic-fr-277+euro" + } ), + + Arguments.of("IBM01148" , + new String[] { + "cp1148", // JDK historical + "ccsid01148", + "cp01148", + // "ebcdic-international-500+euro" + } ), + + Arguments.of("IBM01149" , + new String[] { + "cp1149", // JDK historical + "ccsid01149", + "cp01149", + // "ebcdic-s-871+euro" + } ), + + Arguments.of("IBM00858" , + new String[] { + "cp858", // JDK historical + "ccsid00858", + "cp00858", + // "PC-Multilingual-850+euro" + } ), + + Arguments.of("x-MacRoman", + new String[] { + "MacRoman" // JDK historical + }), + + Arguments.of("x-MacCentralEurope", + new String[] { + "MacCentralEurope" // JDK historical + }), + + Arguments.of("x-MacCroatian", + new String[] { + "MacCroatian" // JDK historical + }), + + + Arguments.of("x-MacCroatian", + new String[] { + "MacCroatian" // JDK historical + }), + + + Arguments.of("x-MacGreek", + new String[] { + "MacGreek" // JDK historical + }), + + Arguments.of("x-MacCyrillic", + new String[] { + "MacCyrillic" // JDK historical + }), + + Arguments.of("x-MacUkraine", + new String[] { + "MacUkraine" // JDK historical + }), + + Arguments.of("x-MacTurkish", + new String[] { + "MacTurkish" // JDK historical + }), + + Arguments.of("x-MacArabic", + new String[] { + "MacArabic" // JDK historical + }), + + Arguments.of("x-MacHebrew", + new String[] { + "MacHebrew" // JDK historical + }), + + Arguments.of("x-MacIceland", + new String[] { + "MacIceland" // JDK historical + }), + + Arguments.of("x-MacRomania", + new String[] { + "MacRomania" // JDK historical + }), + + Arguments.of("x-MacThai", + new String[] { + "MacThai" // JDK historical + }), + + Arguments.of("x-MacSymbol", + new String[] { + "MacSymbol" // JDK historical + }), + + Arguments.of("x-MacDingbat", + new String[] { + "MacDingbat" // JDK historical + }) + ); } } From ff01b555f063f11b67c8fbd59a19868ff08d7ded Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Wed, 8 Oct 2025 06:50:50 +0000 Subject: [PATCH 142/323] 8349188: LineBorder does not scale correctly Backport-of: 24117c6e9aa862bad839e93eff70810a75605ac5 --- .../javax/swing/border/LineBorder.java | 6 +- .../LineBorder/ScaledLineBorderTest.java | 114 ++++++++++-------- .../LineBorder/ScaledTextFieldBorderTest.java | 9 +- 3 files changed, 76 insertions(+), 53 deletions(-) diff --git a/src/java.desktop/share/classes/javax/swing/border/LineBorder.java b/src/java.desktop/share/classes/javax/swing/border/LineBorder.java index 9116731eaf0e..7fcb644a261a 100644 --- a/src/java.desktop/share/classes/javax/swing/border/LineBorder.java +++ b/src/java.desktop/share/classes/javax/swing/border/LineBorder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2025, 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 @@ -37,6 +37,8 @@ import com.sun.java.swing.SwingUtilities3; +import static sun.java2d.pipe.Region.clipRound; + /** * A class which implements a line border of arbitrary thickness * and of a single color. @@ -161,7 +163,7 @@ private void paintUnscaledBorder(Component c, Graphics g, Shape outer; Shape inner; - int offs = this.thickness * (int) scaleFactor; + int offs = clipRound(this.thickness * scaleFactor); int size = offs + offs; if (this.roundedCorners) { float arc = .2f * offs; diff --git a/test/jdk/javax/swing/border/LineBorder/ScaledLineBorderTest.java b/test/jdk/javax/swing/border/LineBorder/ScaledLineBorderTest.java index fc83b49597d2..80faeed460eb 100644 --- a/test/jdk/javax/swing/border/LineBorder/ScaledLineBorderTest.java +++ b/test/jdk/javax/swing/border/LineBorder/ScaledLineBorderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, 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 @@ -42,15 +42,18 @@ import javax.swing.JPanel; import javax.swing.SwingUtilities; +import static sun.java2d.pipe.Region.clipRound; + /* * @test - * @bug 8282958 + * @bug 8282958 8349188 * @summary Verify LineBorder edges have the same width * @requires (os.family == "windows") + * @modules java.desktop/sun.java2d.pipe * @run main ScaledLineBorderTest */ public class ScaledLineBorderTest { - private static final Dimension SIZE = new Dimension(120, 25); + private static final Dimension SIZE = new Dimension(250, 50); private static final Color OUTER_COLOR = Color.BLACK; private static final Color BORDER_COLOR = Color.RED; @@ -59,12 +62,19 @@ public class ScaledLineBorderTest { private static final double[] scales = {1.00, 1.25, 1.50, 1.75, 2.00, 2.50, 3.00}; + private static final int[] thickness = {1, 4, 10, 15}; + + private record TestImage(BufferedImage image, + List panelLocations, + double scale, + int thickness) { + } - private static final List images = - new ArrayList<>(scales.length); + private record TestUI(JComponent content, + List panelLocations, + int thickness) { + } - private static final List panelLocations = - new ArrayList<>(4); public static void main(String[] args) throws Exception { Collection params = Arrays.asList(args); @@ -74,29 +84,38 @@ public static void main(String[] args) throws Exception { } private static void testScaling(boolean showFrame, boolean saveImages) { - JComponent content = createUI(); - if (showFrame) { - showFrame(content); + for (int thickness : thickness) { + TestUI testUI = createUI(thickness); + if (showFrame) { + showFrame(testUI.content); + } + + List images = paintToImages(testUI, saveImages); + verifyBorderRendering(images, saveImages); + } + + if (errorCount > 0) { + throw new Error("Test failed: " + + errorCount + " error(s) detected - " + + errorMessage); } - paintToImages(content, saveImages); - verifyBorderRendering(saveImages); } - private static void verifyBorderRendering(final boolean saveImages) { - String errorMessage = null; - int errorCount = 0; - for (int i = 0; i < images.size(); i++) { - BufferedImage img = images.get(i); - double scaling = scales[i]; - try { - int thickness = (int) Math.floor(scaling); + private static String errorMessage = null; + private static int errorCount = 0; - checkVerticalBorders(SIZE.width / 2, thickness, img); + private static void verifyBorderRendering(final List images, + final boolean saveImages) { + for (TestImage test : images) { + final BufferedImage img = test.image; + final int effectiveThickness = clipRound(test.thickness * test.scale); + try { + checkVerticalBorders((int) (SIZE.width * test.scale / 2), effectiveThickness, img); - for (Point p : panelLocations) { - int y = (int) (p.y * scaling) + SIZE.height / 2; - checkHorizontalBorder(y, thickness, img); + for (Point p : test.panelLocations) { + int y = (int) ((p.y + (SIZE.height / 2)) * test.scale); + checkHorizontalBorder(y, effectiveThickness, img); } } catch (Error e) { if (errorMessage == null) { @@ -104,21 +123,13 @@ private static void verifyBorderRendering(final boolean saveImages) { } errorCount++; - System.err.printf("Scaling: %.2f\n", scaling); + System.err.printf("Scale: %.2f; thickness: %d, effective: %d\n", + test.scale, test.thickness, effectiveThickness); e.printStackTrace(); - // Save the image if it wasn't already saved - if (!saveImages) { - saveImage(img, getImageFileName(scaling)); - } + saveImage(img, getImageFileName(test.scale, test.thickness)); } } - - if (errorCount > 0) { - throw new Error("Test failed: " - + errorCount + " error(s) detected - " - + errorMessage); - } } private static void checkVerticalBorders(final int x, @@ -220,17 +231,19 @@ private static void throwUnexpectedColor(int x, int y, int color) { x, y, color)); } - private static JComponent createUI() { + private static TestUI createUI(int thickness) { Box contentPanel = Box.createVerticalBox(); contentPanel.setBackground(OUTER_COLOR); + List panelLocations = new ArrayList<>(4); + Dimension childSize = null; for (int i = 0; i < 4; i++) { JComponent filler = new JPanel(null); filler.setBackground(INSIDE_COLOR); filler.setPreferredSize(SIZE); filler.setBounds(i, 0, SIZE.width, SIZE.height); - filler.setBorder(BorderFactory.createLineBorder(BORDER_COLOR)); + filler.setBorder(BorderFactory.createLineBorder(BORDER_COLOR, thickness)); JPanel childPanel = new JPanel(new BorderLayout()); childPanel.setBorder(BorderFactory.createEmptyBorder(0, i, 4, 4)); @@ -248,7 +261,7 @@ private static JComponent createUI() { contentPanel.setSize(childSize.width, childSize.height * 4); - return contentPanel; + return new TestUI(contentPanel, panelLocations, thickness); } private static void showFrame(JComponent content) { @@ -260,28 +273,33 @@ private static void showFrame(JComponent content) { frame.setVisible(true); } - private static void paintToImages(final JComponent content, - final boolean saveImages) { - for (double scaling : scales) { + private static List paintToImages(final TestUI testUI, + final boolean saveImages) { + final List images = new ArrayList<>(scales.length); + final JComponent content = testUI.content; + for (double scale : scales) { BufferedImage image = - new BufferedImage((int) Math.ceil(content.getWidth() * scaling), - (int) Math.ceil(content.getHeight() * scaling), + new BufferedImage((int) Math.ceil(content.getWidth() * scale), + (int) Math.ceil(content.getHeight() * scale), BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = image.createGraphics(); - g2d.scale(scaling, scaling); + g2d.scale(scale, scale); content.paint(g2d); g2d.dispose(); if (saveImages) { - saveImage(image, getImageFileName(scaling)); + saveImage(image, getImageFileName(scale, testUI.thickness)); } - images.add(image); + images.add(new TestImage(image, testUI.panelLocations, + scale, testUI.thickness)); } + return images; } - private static String getImageFileName(final double scaling) { - return String.format("test%.2f.png", scaling); + private static String getImageFileName(final double scaling, + final int thickness) { + return String.format("test%02d@%.2f.png", thickness, scaling); } private static void saveImage(BufferedImage image, String filename) { diff --git a/test/jdk/javax/swing/border/LineBorder/ScaledTextFieldBorderTest.java b/test/jdk/javax/swing/border/LineBorder/ScaledTextFieldBorderTest.java index 4b0769773133..2a732812e38d 100644 --- a/test/jdk/javax/swing/border/LineBorder/ScaledTextFieldBorderTest.java +++ b/test/jdk/javax/swing/border/LineBorder/ScaledTextFieldBorderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, 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 @@ -44,12 +44,15 @@ import javax.swing.SwingUtilities; import javax.swing.border.LineBorder; +import static sun.java2d.pipe.Region.clipRound; + /* * @test - * @bug 8282958 + * @bug 8282958 8349188 * @summary Verify all the borders are rendered consistently for a JTextField * in Windows LaF which uses LineBorder * @requires (os.family == "windows") + * @modules java.desktop/sun.java2d.pipe * @run main ScaledTextFieldBorderTest */ public class ScaledTextFieldBorderTest { @@ -92,7 +95,7 @@ private static void verifyBorderRendering(final boolean saveImages) { BufferedImage img = images.get(i); double scaling = scales[i]; try { - int thickness = (int) Math.floor(scaling); + int thickness = clipRound(scaling); checkVerticalBorders(textFieldSize.width / 2, thickness, img); From 3f79e73f2e435dd7af121808c4c01aeb0aa797c4 Mon Sep 17 00:00:00 2001 From: Matthias Baesken Date: Wed, 8 Oct 2025 08:15:59 +0000 Subject: [PATCH 143/323] 8364514: [asan] runtime/jni/checked/TestCharArrayReleasing.java heap-buffer-overflow Backport-of: 67ba8b45dd632c40d5e6872d2a6ce24f86c22152 --- .../jtreg/runtime/jni/checked/TestCharArrayReleasing.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/hotspot/jtreg/runtime/jni/checked/TestCharArrayReleasing.java b/test/hotspot/jtreg/runtime/jni/checked/TestCharArrayReleasing.java index 7cb427cebbbf..c26fb2bea4c5 100644 --- a/test/hotspot/jtreg/runtime/jni/checked/TestCharArrayReleasing.java +++ b/test/hotspot/jtreg/runtime/jni/checked/TestCharArrayReleasing.java @@ -25,6 +25,8 @@ * @test * @bug 8357601 * @requires vm.flagless + * @comment The check of the array allocated with raw malloc triggers ASAN as we peek into the malloc header space. + * @requires !vm.asan * @library /test/lib * @run main/othervm/native TestCharArrayReleasing 0 0 * @run main/othervm/native TestCharArrayReleasing 1 0 From 3d7747044f1f0ebb9d0f4ba12051420a437c85b1 Mon Sep 17 00:00:00 2001 From: Matthias Baesken Date: Wed, 8 Oct 2025 08:22:16 +0000 Subject: [PATCH 144/323] 8365487: [asan] some oops (mode) related tests fail Backport-of: 98f54d90ea56f63c2fc5137af98b57dbc90fe150 --- .../jtreg/runtime/CompressedOops/UseCompressedOops.java | 4 +++- .../TestGCHeapConfigurationEventWith32BitOops.java | 2 ++ .../TestGCHeapConfigurationEventWithZeroBasedOops.java | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/test/hotspot/jtreg/runtime/CompressedOops/UseCompressedOops.java b/test/hotspot/jtreg/runtime/CompressedOops/UseCompressedOops.java index 3d118bf73b14..e5e2a23c5655 100644 --- a/test/hotspot/jtreg/runtime/CompressedOops/UseCompressedOops.java +++ b/test/hotspot/jtreg/runtime/CompressedOops/UseCompressedOops.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2025, 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 @@ -30,6 +30,8 @@ * @modules java.base/jdk.internal.misc * java.management * @build jdk.test.whitebox.WhiteBox + * @comment Asan changes memory layout and we get a different coops mode + * @requires !vm.asan * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox * @run main/othervm/timeout=480 -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:. UseCompressedOops */ diff --git a/test/jdk/jdk/jfr/event/gc/configuration/TestGCHeapConfigurationEventWith32BitOops.java b/test/jdk/jdk/jfr/event/gc/configuration/TestGCHeapConfigurationEventWith32BitOops.java index 0a61a288cc21..9cbc31e55f81 100644 --- a/test/jdk/jdk/jfr/event/gc/configuration/TestGCHeapConfigurationEventWith32BitOops.java +++ b/test/jdk/jdk/jfr/event/gc/configuration/TestGCHeapConfigurationEventWith32BitOops.java @@ -35,6 +35,8 @@ * @requires vm.gc == "Parallel" | vm.gc == null * @requires os.family == "linux" | os.family == "windows" * @requires sun.arch.data.model == "64" + * @comment Asan changes memory layout and we get a different coops mode + * @requires !vm.asan * @library /test/lib /test/jdk * @build jdk.test.whitebox.WhiteBox * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox diff --git a/test/jdk/jdk/jfr/event/gc/configuration/TestGCHeapConfigurationEventWithZeroBasedOops.java b/test/jdk/jdk/jfr/event/gc/configuration/TestGCHeapConfigurationEventWithZeroBasedOops.java index d63ca856bc34..918f1391b2c0 100644 --- a/test/jdk/jdk/jfr/event/gc/configuration/TestGCHeapConfigurationEventWithZeroBasedOops.java +++ b/test/jdk/jdk/jfr/event/gc/configuration/TestGCHeapConfigurationEventWithZeroBasedOops.java @@ -33,6 +33,8 @@ * @requires vm.gc == "Parallel" | vm.gc == null * @requires os.family == "linux" | os.family == "windows" * @requires sun.arch.data.model == "64" + * @comment Asan changes memory layout and we get a different coops mode + * @requires !vm.asan * @library /test/lib /test/jdk * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:-UseFastUnorderedTimeStamps -XX:+UseParallelGC -XX:+UseCompressedOops -Xmx4g jdk.jfr.event.gc.configuration.TestGCHeapConfigurationEventWithZeroBasedOops */ From e5bc1199118c645c0fe4e2ea9e5b3692dcae4a0b Mon Sep 17 00:00:00 2001 From: William Kemper Date: Wed, 8 Oct 2025 09:20:27 +0000 Subject: [PATCH 145/323] 8360288: Shenandoah crash at size_given_klass in op_degenerated Reviewed-by: phh Backport-of: 3b44d7bfa4d78e3ec715fce1863e052852f33180 --- .../share/gc/shenandoah/shenandoahHeap.cpp | 27 +++++++++---------- .../share/gc/shenandoah/shenandoahHeap.hpp | 2 +- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp index 8a395b6f74f6..04280d98423c 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp @@ -1036,26 +1036,23 @@ void ShenandoahHeap::print_heap_regions_on(outputStream* st) const { } } -void ShenandoahHeap::trash_humongous_region_at(ShenandoahHeapRegion* start) { +size_t ShenandoahHeap::trash_humongous_region_at(ShenandoahHeapRegion* start) const { assert(start->is_humongous_start(), "reclaim regions starting with the first one"); - - oop humongous_obj = cast_to_oop(start->bottom()); - size_t size = humongous_obj->size(); - size_t required_regions = ShenandoahHeapRegion::required_regions(size * HeapWordSize); - size_t index = start->index() + required_regions - 1; - assert(!start->has_live(), "liveness must be zero"); - for(size_t i = 0; i < required_regions; i++) { - // Reclaim from tail. Otherwise, assertion fails when printing region to trace log, - // as it expects that every region belongs to a humongous region starting with a humongous start region. - ShenandoahHeapRegion* region = get_region(index --); - - assert(region->is_humongous(), "expect correct humongous start or continuation"); + // Do not try to get the size of this humongous object. STW collections will + // have already unloaded classes, so an unmarked object may have a bad klass pointer. + ShenandoahHeapRegion* region = start; + size_t index = region->index(); + do { + assert(region->is_humongous(), "Expect correct humongous start or continuation"); assert(!region->is_cset(), "Humongous region should not be in collection set"); - region->make_trash_immediate(); - } + region = get_region(++index); + } while (region != nullptr && region->is_humongous_continuation()); + + // Return number of regions trashed + return index - start->index(); } class ShenandoahCheckCleanGCLABClosure : public ThreadClosure { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp b/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp index 3aa33e8ecee1..55f7e5b10bb3 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp @@ -650,7 +650,7 @@ class ShenandoahHeap : public CollectedHeap { static inline void atomic_clear_oop(narrowOop* addr, oop compare); static inline void atomic_clear_oop(narrowOop* addr, narrowOop compare); - void trash_humongous_region_at(ShenandoahHeapRegion *r); + size_t trash_humongous_region_at(ShenandoahHeapRegion *r) const; private: void trash_cset_regions(); From 5b5dc0bb5554e994ff03b16d236de11225d81101 Mon Sep 17 00:00:00 2001 From: Sergey Chernyshev Date: Wed, 8 Oct 2025 09:22:25 +0000 Subject: [PATCH 146/323] 8343191: Cgroup v1 subsystem fails to set subsystem path Backport-of: de29ef3bf3a029f99f340de9f093cd20544217fd --- src/hotspot/os/linux/cgroupUtil_linux.cpp | 30 ++++- .../os/linux/cgroupV1Subsystem_linux.cpp | 77 +++++++++-- .../os/linux/cgroupV2Subsystem_linux.cpp | 6 +- .../cgroupv1/CgroupV1SubsystemController.java | 42 +++--- .../runtime/test_cgroupSubsystem_linux.cpp | 78 ++++++++++- .../docker/TestMemoryWithSubgroups.java | 126 ++++++++++++++++++ .../CgroupV1SubsystemControllerTest.java | 17 ++- .../cgroup/TestCgroupSubsystemFactory.java | 34 ++++- .../TestDockerMemoryMetricsSubgroup.java | 120 +++++++++++++++++ 9 files changed, 488 insertions(+), 42 deletions(-) create mode 100644 test/hotspot/jtreg/containers/docker/TestMemoryWithSubgroups.java create mode 100644 test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetricsSubgroup.java diff --git a/src/hotspot/os/linux/cgroupUtil_linux.cpp b/src/hotspot/os/linux/cgroupUtil_linux.cpp index bc0e018d6be0..b52ef87dcaee 100644 --- a/src/hotspot/os/linux/cgroupUtil_linux.cpp +++ b/src/hotspot/os/linux/cgroupUtil_linux.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Red Hat, Inc. + * Copyright (c) 2024, 2025, Red Hat, Inc. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -49,12 +49,18 @@ int CgroupUtil::processor_count(CgroupCpuController* cpu_ctrl, int host_cpus) { } void CgroupUtil::adjust_controller(CgroupMemoryController* mem) { + assert(mem->cgroup_path() != nullptr, "invariant"); + if (strstr(mem->cgroup_path(), "../") != nullptr) { + log_warning(os, container)("Cgroup memory controller path at '%s' seems to have moved to '%s', detected limits won't be accurate", + mem->mount_point(), mem->cgroup_path()); + mem->set_subsystem_path("/"); + return; + } if (!mem->needs_hierarchy_adjustment()) { // nothing to do return; } log_trace(os, container)("Adjusting controller path for memory: %s", mem->subsystem_path()); - assert(mem->cgroup_path() != nullptr, "invariant"); char* orig = os::strdup(mem->cgroup_path()); char* cg_path = os::strdup(orig); char* last_slash; @@ -62,7 +68,8 @@ void CgroupUtil::adjust_controller(CgroupMemoryController* mem) { julong phys_mem = os::Linux::physical_memory(); char* limit_cg_path = nullptr; jlong limit = mem->read_memory_limit_in_bytes(phys_mem); - jlong lowest_limit = phys_mem; + jlong lowest_limit = limit < 0 ? phys_mem : limit; + julong orig_limit = ((julong)lowest_limit) != phys_mem ? lowest_limit : phys_mem; while ((last_slash = strrchr(cg_path, '/')) != cg_path) { *last_slash = '\0'; // strip path // update to shortened path and try again @@ -83,7 +90,7 @@ void CgroupUtil::adjust_controller(CgroupMemoryController* mem) { limit_cg_path = os::strdup("/"); } assert(lowest_limit >= 0, "limit must be positive"); - if ((julong)lowest_limit != phys_mem) { + if ((julong)lowest_limit != orig_limit) { // we've found a lower limit anywhere in the hierarchy, // set the path to the limit path assert(limit_cg_path != nullptr, "limit path must be set"); @@ -93,6 +100,7 @@ void CgroupUtil::adjust_controller(CgroupMemoryController* mem) { mem->subsystem_path(), lowest_limit); } else { + log_trace(os, container)("Lowest limit was: " JLONG_FORMAT, lowest_limit); log_trace(os, container)("No lower limit found for memory in hierarchy %s, " "adjusting to original path %s", mem->mount_point(), orig); @@ -104,19 +112,26 @@ void CgroupUtil::adjust_controller(CgroupMemoryController* mem) { } void CgroupUtil::adjust_controller(CgroupCpuController* cpu) { + assert(cpu->cgroup_path() != nullptr, "invariant"); + if (strstr(cpu->cgroup_path(), "../") != nullptr) { + log_warning(os, container)("Cgroup cpu controller path at '%s' seems to have moved to '%s', detected limits won't be accurate", + cpu->mount_point(), cpu->cgroup_path()); + cpu->set_subsystem_path("/"); + return; + } if (!cpu->needs_hierarchy_adjustment()) { // nothing to do return; } log_trace(os, container)("Adjusting controller path for cpu: %s", cpu->subsystem_path()); - assert(cpu->cgroup_path() != nullptr, "invariant"); char* orig = os::strdup(cpu->cgroup_path()); char* cg_path = os::strdup(orig); char* last_slash; assert(cg_path[0] == '/', "cgroup path must start with '/'"); int host_cpus = os::Linux::active_processor_count(); int cpus = CgroupUtil::processor_count(cpu, host_cpus); - int lowest_limit = host_cpus; + int lowest_limit = cpus < host_cpus ? cpus: host_cpus; + int orig_limit = lowest_limit != host_cpus ? lowest_limit : host_cpus; char* limit_cg_path = nullptr; while ((last_slash = strrchr(cg_path, '/')) != cg_path) { *last_slash = '\0'; // strip path @@ -138,7 +153,7 @@ void CgroupUtil::adjust_controller(CgroupCpuController* cpu) { limit_cg_path = os::strdup(cg_path); } assert(lowest_limit >= 0, "limit must be positive"); - if (lowest_limit != host_cpus) { + if (lowest_limit != orig_limit) { // we've found a lower limit anywhere in the hierarchy, // set the path to the limit path assert(limit_cg_path != nullptr, "limit path must be set"); @@ -148,6 +163,7 @@ void CgroupUtil::adjust_controller(CgroupCpuController* cpu) { cpu->subsystem_path(), lowest_limit); } else { + log_trace(os, container)("Lowest limit was: %d", lowest_limit); log_trace(os, container)("No lower limit found for cpu in hierarchy %s, " "adjusting to original path %s", cpu->mount_point(), orig); diff --git a/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp b/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp index f4284406620a..027461befc60 100644 --- a/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp +++ b/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, 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 @@ -37,6 +37,47 @@ /* * Set directory to subsystem specific files based * on the contents of the mountinfo and cgroup files. + * + * The method determines whether it runs in + * - host mode + * - container mode + * + * In the host mode, _root is equal to "/" and + * the subsystem path is equal to the _mount_point path + * joined with cgroup_path. + * + * In the container mode, it can be two possibilities: + * - private namespace (cgroupns=private) + * - host namespace (cgroupns=host, default mode in cgroup V1 hosts) + * + * Private namespace is equivalent to the host mode, i.e. + * the subsystem path is set by concatenating + * _mount_point and cgroup_path. + * + * In the host namespace, _root is equal to host's cgroup path + * of the control group to which the containerized process + * belongs to at the moment of creation. The mountinfo and + * cgroup files are mirrored from the host, while the subsystem + * specific files are mapped directly at _mount_point, i.e. + * at /sys/fs/cgroup//, the subsystem path is + * then set equal to _mount_point. + * + * A special case of the subsystem path is when a cgroup path + * includes a subgroup, when a containerized process was associated + * with an existing cgroup, that is different from cgroup + * in which the process has been created. + * Here, the _root is equal to the host's initial cgroup path, + * cgroup_path will be equal to host's new cgroup path. + * As host cgroup hierarchies are not accessible in the container, + * it needs to be determined which part of cgroup path + * is accessible inside container, i.e. mapped under + * /sys/fs/cgroup//. + * In Docker default setup, host's cgroup path can be + * of the form: /docker//, + * from which only is mapped. + * The method trims cgroup path from left, until the subgroup + * component is found. The subsystem path will be set to + * the _mount_point joined with the subgroup path. */ void CgroupV1Controller::set_subsystem_path(const char* cgroup_path) { if (_cgroup_path != nullptr) { @@ -49,28 +90,36 @@ void CgroupV1Controller::set_subsystem_path(const char* cgroup_path) { _cgroup_path = os::strdup(cgroup_path); stringStream ss; if (_root != nullptr && cgroup_path != nullptr) { + ss.print_raw(_mount_point); if (strcmp(_root, "/") == 0) { - ss.print_raw(_mount_point); + // host processes and containers with cgroupns=private if (strcmp(cgroup_path,"/") != 0) { ss.print_raw(cgroup_path); } - _path = os::strdup(ss.base()); } else { - if (strcmp(_root, cgroup_path) == 0) { - ss.print_raw(_mount_point); - _path = os::strdup(ss.base()); - } else { - char *p = strstr((char*)cgroup_path, _root); - if (p != nullptr && p == _root) { - if (strlen(cgroup_path) > strlen(_root)) { - ss.print_raw(_mount_point); - const char* cg_path_sub = cgroup_path + strlen(_root); - ss.print_raw(cg_path_sub); - _path = os::strdup(ss.base()); + // containers with cgroupns=host, default setting is _root==cgroup_path + if (strcmp(_root, cgroup_path) != 0) { + if (*cgroup_path != '\0' && strcmp(cgroup_path, "/") != 0) { + // When moved to a subgroup, between subgroups, the path suffix will change. + const char *suffix = cgroup_path; + while (suffix != nullptr) { + stringStream pp; + pp.print_raw(_mount_point); + pp.print_raw(suffix); + if (os::file_exists(pp.base())) { + ss.print_raw(suffix); + if (suffix != cgroup_path) { + log_trace(os, container)("set_subsystem_path: cgroup v1 path reduced to: %s.", suffix); + } + break; + } + log_trace(os, container)("set_subsystem_path: skipped non-existent directory: %s.", suffix); + suffix = strchr(suffix + 1, '/'); } } } } + _path = os::strdup(ss.base()); } } diff --git a/src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp b/src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp index f6a6dcc6293d..4367eba4c43a 100644 --- a/src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp +++ b/src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2022, Red Hat Inc. + * Copyright (c) 2020, 2025, Red Hat Inc. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -283,6 +283,10 @@ jlong memory_swap_limit_value(CgroupV2Controller* ctrl) { } void CgroupV2Controller::set_subsystem_path(const char* cgroup_path) { + if (_cgroup_path != nullptr) { + os::free(_cgroup_path); + } + _cgroup_path = os::strdup(cgroup_path); if (_path != nullptr) { os::free(_path); } diff --git a/src/java.base/linux/classes/jdk/internal/platform/cgroupv1/CgroupV1SubsystemController.java b/src/java.base/linux/classes/jdk/internal/platform/cgroupv1/CgroupV1SubsystemController.java index 051b4da5f78d..fd325a8f8b4e 100644 --- a/src/java.base/linux/classes/jdk/internal/platform/cgroupv1/CgroupV1SubsystemController.java +++ b/src/java.base/linux/classes/jdk/internal/platform/cgroupv1/CgroupV1SubsystemController.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, 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 @@ -25,6 +25,9 @@ package jdk.internal.platform.cgroupv1; +import java.lang.System.Logger.Level; +import java.nio.file.Path; +import java.nio.file.Files; import jdk.internal.platform.CgroupSubsystem; import jdk.internal.platform.CgroupSubsystemController; @@ -44,27 +47,36 @@ public CgroupV1SubsystemController(String root, String mountPoint) { public void setPath(String cgroupPath) { if (root != null && cgroupPath != null) { + String path = mountPoint; if (root.equals("/")) { + // host processes and containers with cgroupns=private if (!cgroupPath.equals("/")) { - path = mountPoint + cgroupPath; + path += cgroupPath; } - else { - path = mountPoint; - } - } - else { - if (root.equals(cgroupPath)) { - path = mountPoint; - } - else { - if (cgroupPath.startsWith(root)) { - if (cgroupPath.length() > root.length()) { - String cgroupSubstr = cgroupPath.substring(root.length()); - path = mountPoint + cgroupSubstr; + } else { + // containers with cgroupns=host, default setting is _root==cgroup_path + if (!cgroupPath.equals(root)) { + if (!cgroupPath.equals("") && !cgroupPath.equals("/")) { + // When moved to a subgroup, between subgroups, the path suffix will change. + Path cgp = Path.of(cgroupPath); + int nameCount = cgp.getNameCount(); + for (int i=0; i < nameCount; i++) { + Path dir = Path.of(mountPoint, cgp.toString()); + if (Files.isDirectory(dir)) { + path = dir.toString(); + if (i > 0) { + System.getLogger("jdk.internal.platform").log(Level.DEBUG, String.format( + "Cgroup v1 path reduced to: %s.", cgp)); + } + break; + } + int currentNameCount = cgp.getNameCount(); + cgp = (currentNameCount > 1) ? cgp.subpath(1, currentNameCount) : Path.of(""); } } } } + this.path = path; } } diff --git a/test/hotspot/gtest/runtime/test_cgroupSubsystem_linux.cpp b/test/hotspot/gtest/runtime/test_cgroupSubsystem_linux.cpp index 70b460cb548f..b218ccc12f2a 100644 --- a/test/hotspot/gtest/runtime/test_cgroupSubsystem_linux.cpp +++ b/test/hotspot/gtest/runtime/test_cgroupSubsystem_linux.cpp @@ -27,6 +27,7 @@ #include "runtime/os.hpp" #include "cgroupSubsystem_linux.hpp" +#include "cgroupUtil_linux.hpp" #include "cgroupV1Subsystem_linux.hpp" #include "cgroupV2Subsystem_linux.hpp" #include "unittest.hpp" @@ -437,9 +438,16 @@ TEST(cgroupTest, set_cgroupv1_subsystem_path) { "/user.slice/user-1000.slice/user@1000.service", // cgroup_path "/sys/fs/cgroup/mem" // expected_path }; - int length = 2; + TestCase container_moving_cgroup = { + "/sys/fs/cgroup/cpu,cpuacct", // mount_path + "/system.slice/garden.service/garden/good/2f57368b-0eda-4e52-64d8-af5c", // root_path + "/system.slice/garden.service/garden/bad/2f57368b-0eda-4e52-64d8-af5c", // cgroup_path + "/sys/fs/cgroup/cpu,cpuacct" // expected_path + }; + int length = 3; TestCase* testCases[] = { &host, - &container_engine }; + &container_engine, + &container_moving_cgroup }; for (int i = 0; i < length; i++) { CgroupV1Controller* ctrl = new CgroupV1Controller( (char*)testCases[i]->root_path, (char*)testCases[i]->mount_path, @@ -449,6 +457,72 @@ TEST(cgroupTest, set_cgroupv1_subsystem_path) { } } +TEST(cgroupTest, set_cgroupv1_subsystem_path_adjusted) { + TestCase memory = { + "/sys/fs/cgroup/memory", // mount_path + "/", // root_path + "../test1", // cgroup_path + "/sys/fs/cgroup/memory" // expected_path + }; + TestCase cpu = { + "/sys/fs/cgroup/cpu", // mount_path + "/", // root_path + "../../test2", // cgroup_path + "/sys/fs/cgroup/cpu" // expected_path + }; + CgroupCpuController* ccc = new CgroupV1CpuController(CgroupV1Controller((char*)cpu.root_path, + (char*)cpu.mount_path, + true /* read-only mount */)); + ccc->set_subsystem_path((char*)cpu.cgroup_path); + EXPECT_TRUE(ccc->needs_hierarchy_adjustment()); + + CgroupUtil::adjust_controller(ccc); + ASSERT_STREQ(cpu.expected_path, ccc->subsystem_path()); + EXPECT_FALSE(ccc->needs_hierarchy_adjustment()); + + CgroupMemoryController* cmc = new CgroupV1MemoryController(CgroupV1Controller((char*)memory.root_path, + (char*)memory.mount_path, + true /* read-only mount */)); + cmc->set_subsystem_path((char*)memory.cgroup_path); + EXPECT_TRUE(cmc->needs_hierarchy_adjustment()); + + CgroupUtil::adjust_controller(cmc); + ASSERT_STREQ(memory.expected_path, cmc->subsystem_path()); + EXPECT_FALSE(cmc->needs_hierarchy_adjustment()); +} + +TEST(cgroupTest, set_cgroupv2_subsystem_path_adjusted) { + TestCase memory = { + "/sys/fs/cgroup", // mount_path + "/", // root_path + "../test1", // cgroup_path + "/sys/fs/cgroup" // expected_path + }; + TestCase cpu = { + "/sys/fs/cgroup", // mount_path + "/", // root_path + "../../test2", // cgroup_path + "/sys/fs/cgroup" // expected_path + }; + CgroupCpuController* ccc = new CgroupV2CpuController(CgroupV2Controller((char*)cpu.mount_path, + (char*)cpu.cgroup_path, + true /* read-only mount */)); + EXPECT_TRUE(ccc->needs_hierarchy_adjustment()); + + CgroupUtil::adjust_controller(ccc); + ASSERT_STREQ(cpu.expected_path, ccc->subsystem_path()); + EXPECT_FALSE(ccc->needs_hierarchy_adjustment()); + + CgroupMemoryController* cmc = new CgroupV2MemoryController(CgroupV2Controller((char*)memory.mount_path, + (char*)memory.cgroup_path, + true /* read-only mount */)); + EXPECT_TRUE(cmc->needs_hierarchy_adjustment()); + + CgroupUtil::adjust_controller(cmc); + ASSERT_STREQ(memory.expected_path, cmc->subsystem_path()); + EXPECT_FALSE(cmc->needs_hierarchy_adjustment()); +} + TEST(cgroupTest, set_cgroupv2_subsystem_path) { TestCase at_mount_root = { "/sys/fs/cgroup", // mount_path diff --git a/test/hotspot/jtreg/containers/docker/TestMemoryWithSubgroups.java b/test/hotspot/jtreg/containers/docker/TestMemoryWithSubgroups.java new file mode 100644 index 000000000000..e7989874d7a8 --- /dev/null +++ b/test/hotspot/jtreg/containers/docker/TestMemoryWithSubgroups.java @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2025, BELLSOFT. 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 jdk.test.lib.containers.docker.Common; +import jdk.test.lib.containers.docker.DockerTestUtils; +import jdk.test.lib.containers.docker.DockerRunOptions; +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; +import jdk.internal.platform.Metrics; + +import java.util.ArrayList; + +import jtreg.SkippedException; + +/* + * @test + * @bug 8343191 + * @requires os.family == "linux" + * @modules java.base/jdk.internal.platform + * @library /test/lib + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller -jar whitebox.jar jdk.test.whitebox.WhiteBox + * @run main TestMemoryWithSubgroups + */ +public class TestMemoryWithSubgroups { + + private static final String imageName = Common.imageName("subgroup"); + + public static void main(String[] args) throws Exception { + Metrics metrics = Metrics.systemMetrics(); + if (metrics == null) { + System.out.println("Cgroup not configured."); + return; + } + if (!DockerTestUtils.canTestDocker()) { + System.out.println("Unable to run docker tests."); + return; + } + Common.prepareWhiteBox(); + DockerTestUtils.buildJdkContainerImage(imageName); + + if ("cgroupv1".equals(metrics.getProvider())) { + try { + testMemoryLimitSubgroupV1("200m", "100m", "104857600", false); + testMemoryLimitSubgroupV1("1g", "500m", "524288000", false); + testMemoryLimitSubgroupV1("200m", "100m", "104857600", true); + testMemoryLimitSubgroupV1("1g", "500m", "524288000", true); + } finally { + DockerTestUtils.removeDockerImage(imageName); + } + } else if ("cgroupv2".equals(metrics.getProvider())) { + try { + testMemoryLimitSubgroupV2("200m", "100m", "104857600", false); + testMemoryLimitSubgroupV2("1g", "500m", "524288000", false); + testMemoryLimitSubgroupV2("200m", "100m", "104857600", true); + testMemoryLimitSubgroupV2("1g", "500m", "524288000", true); + } finally { + DockerTestUtils.removeDockerImage(imageName); + } + } else { + throw new SkippedException("Metrics are from neither cgroup v1 nor v2, skipped for now."); + } + } + + private static void testMemoryLimitSubgroupV1(String containerMemorySize, String valueToSet, String expectedValue, boolean privateNamespace) + throws Exception { + + Common.logNewTestCase("Cgroup V1 subgroup memory limit: " + valueToSet); + + DockerRunOptions opts = new DockerRunOptions(imageName, "sh", "-c"); + opts.javaOpts = new ArrayList<>(); + opts.appendTestJavaOptions = false; + opts.addDockerOpts("--privileged") + .addDockerOpts("--cgroupns=" + (privateNamespace ? "private" : "host")) + .addDockerOpts("--memory", containerMemorySize); + opts.addClassOptions("mkdir -p /sys/fs/cgroup/memory/test ; " + + "echo " + valueToSet + " > /sys/fs/cgroup/memory/test/memory.limit_in_bytes ; " + + "echo $$ > /sys/fs/cgroup/memory/test/cgroup.procs ; " + + "/jdk/bin/java -Xlog:os+container=trace -version"); + + Common.run(opts) + .shouldMatch("Lowest limit was:.*" + expectedValue); + } + + private static void testMemoryLimitSubgroupV2(String containerMemorySize, String valueToSet, String expectedValue, boolean privateNamespace) + throws Exception { + + Common.logNewTestCase("Cgroup V2 subgroup memory limit: " + valueToSet); + + DockerRunOptions opts = new DockerRunOptions(imageName, "sh", "-c"); + opts.javaOpts = new ArrayList<>(); + opts.appendTestJavaOptions = false; + opts.addDockerOpts("--privileged") + .addDockerOpts("--cgroupns=" + (privateNamespace ? "private" : "host")) + .addDockerOpts("--memory", containerMemorySize); + opts.addClassOptions("mkdir -p /sys/fs/cgroup/memory/test ; " + + "echo $$ > /sys/fs/cgroup/memory/test/cgroup.procs ; " + + "echo '+memory' > /sys/fs/cgroup/cgroup.subtree_control ; " + + "echo '+memory' > /sys/fs/cgroup/memory/cgroup.subtree_control ; " + + "echo " + valueToSet + " > /sys/fs/cgroup/memory/test/memory.max ; " + + "/jdk/bin/java -Xlog:os+container=trace -version"); + + Common.run(opts) + .shouldMatch("Lowest limit was:.*" + expectedValue); + } +} diff --git a/test/jdk/jdk/internal/platform/cgroup/CgroupV1SubsystemControllerTest.java b/test/jdk/jdk/internal/platform/cgroup/CgroupV1SubsystemControllerTest.java index a97edd581feb..3ab8b35ae0aa 100644 --- a/test/jdk/jdk/internal/platform/cgroup/CgroupV1SubsystemControllerTest.java +++ b/test/jdk/jdk/internal/platform/cgroup/CgroupV1SubsystemControllerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Red Hat, Inc. + * Copyright (c) 2022, 2025, Red Hat, Inc. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -64,6 +64,9 @@ public void testCgPathNonEmptyRoot() { assertEquals(expectedPath, ctrl.path()); } + /* + * Less common cases: Containers + */ @Test public void testCgPathSubstring() { String root = "/foo/bar/baz"; @@ -71,8 +74,18 @@ public void testCgPathSubstring() { CgroupV1SubsystemController ctrl = new CgroupV1SubsystemController(root, mountPoint); String cgroupPath = "/foo/bar/baz/some"; ctrl.setPath(cgroupPath); - String expectedPath = mountPoint + "/some"; + String expectedPath = mountPoint; assertEquals(expectedPath, ctrl.path()); } + @Test + public void testCgPathToMovedPath() { + String root = "/system.slice/garden.service/garden/good/2f57368b-0eda-4e52-64d8-af5c"; + String mountPoint = "/sys/fs/cgroup/cpu,cpuacct"; + CgroupV1SubsystemController ctrl = new CgroupV1SubsystemController(root, mountPoint); + String cgroupPath = "/system.slice/garden.service/garden/bad/2f57368b-0eda-4e52-64d8-af5c"; + ctrl.setPath(cgroupPath); + String expectedPath = mountPoint; + assertEquals(expectedPath, ctrl.path()); + } } diff --git a/test/jdk/jdk/internal/platform/cgroup/TestCgroupSubsystemFactory.java b/test/jdk/jdk/internal/platform/cgroup/TestCgroupSubsystemFactory.java index ede74b5011e4..8cf53c66e8aa 100644 --- a/test/jdk/jdk/internal/platform/cgroup/TestCgroupSubsystemFactory.java +++ b/test/jdk/jdk/internal/platform/cgroup/TestCgroupSubsystemFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2022, Red Hat Inc. + * Copyright (c) 2020, 2025, Red Hat Inc. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -44,6 +44,7 @@ import jdk.internal.platform.CgroupSubsystemFactory.CgroupTypeResult; import jdk.internal.platform.CgroupV1MetricsImpl; import jdk.internal.platform.cgroupv1.CgroupV1Subsystem; +import jdk.internal.platform.cgroupv1.CgroupV1SubsystemController; import jdk.internal.platform.Metrics; import jdk.test.lib.Utils; import jdk.test.lib.util.FileUtils; @@ -75,8 +76,10 @@ public class TestCgroupSubsystemFactory { private Path cgroupv1MntInfoDoubleControllers; private Path cgroupv1MntInfoDoubleControllers2; private Path cgroupv1MntInfoColonsHierarchy; + private Path cgroupv1MntInfoNonTrivialRoot; private Path cgroupv1SelfCgroup; private Path cgroupv1SelfColons; + private Path cgroupv1SelfNonTrivialRoot; private Path cgroupv2SelfCgroup; private Path cgroupv1SelfCgroupJoinCtrl; private Path cgroupv1CgroupsOnlyCPUCtrl; @@ -175,6 +178,7 @@ public class TestCgroupSubsystemFactory { "42 30 0:38 / /sys/fs/cgroup/cpuset rw,nosuid,nodev,noexec,relatime shared:14 - cgroup none rw,seclabel,cpuset\n" + "43 30 0:39 / /sys/fs/cgroup/blkio rw,nosuid,nodev,noexec,relatime shared:15 - cgroup none rw,seclabel,blkio\n" + "44 30 0:40 / /sys/fs/cgroup/freezer rw,nosuid,nodev,noexec,relatime shared:16 - cgroup none rw,seclabel,freezer\n"; + private String mntInfoNonTrivialRoot = "2207 2196 0:43 /system.slice/garden.service/garden/good/2f57368b-0eda-4e52-64d8-af5c /sys/fs/cgroup/cpu,cpuacct ro,nosuid,nodev,noexec,relatime master:25 - cgroup cgroup rw,cpu,cpuacct\n"; private String cgroupsNonZeroHierarchy = "#subsys_name hierarchy num_cgroups enabled\n" + "cpuset 9 1 1\n" + @@ -230,6 +234,7 @@ public class TestCgroupSubsystemFactory { "2:cpu,cpuacct:/\n" + "1:name=systemd:/user.slice/user-1000.slice/user@1000.service/apps.slice/apps-org.gnome.Terminal.slice/vte-spawn-3c00b338-5b65-439f-8e97-135e183d135d.scope\n" + "0::/user.slice/user-1000.slice/user@1000.service/apps.slice/apps-org.gnome.Terminal.slice/vte-spawn-3c00b338-5b65-439f-8e97-135e183d135d.scope\n"; + private String cgroupv1SelfNTRoot = "11:cpu,cpuacct:/system.slice/garden.service/garden/bad/2f57368b-0eda-4e52-64d8-af5c\n"; private String cgroupv2SelfCgroupContent = "0::/user.slice/user-1000.slice/session-2.scope"; // We have a mix of V1 and V2 controllers, but none of the V1 controllers @@ -294,12 +299,18 @@ public void setup() { cgroupv1MntInfoColonsHierarchy = Paths.get(existingDirectory.toString(), "mountinfo_colons"); Files.writeString(cgroupv1MntInfoColonsHierarchy, mntInfoColons); + cgroupv1MntInfoNonTrivialRoot = Paths.get(existingDirectory.toString(), "mountinfo_nt_root"); + Files.writeString(cgroupv1MntInfoNonTrivialRoot, mntInfoNonTrivialRoot); + cgroupv1SelfCgroup = Paths.get(existingDirectory.toString(), "self_cgroup_cgv1"); Files.writeString(cgroupv1SelfCgroup, cgroupv1SelfCgroupContent); cgroupv1SelfColons = Paths.get(existingDirectory.toString(), "self_colons_cgv1"); Files.writeString(cgroupv1SelfColons, cgroupv1SelfColonsContent); + cgroupv1SelfNonTrivialRoot = Paths.get(existingDirectory.toString(), "self_nt_root_cgv1"); + Files.writeString(cgroupv1SelfNonTrivialRoot, cgroupv1SelfNTRoot); + cgroupv2SelfCgroup = Paths.get(existingDirectory.toString(), "self_cgroup_cgv2"); Files.writeString(cgroupv2SelfCgroup, cgroupv2SelfCgroupContent); @@ -449,6 +460,27 @@ public void testColonsCgroupsV1() throws IOException { assertEquals(memoryInfo.getMountRoot(), memoryInfo.getCgroupPath()); } + @Test + public void testMountPrefixCgroupsV1() throws IOException { + String cgroups = cgroupv1CgInfoNonZeroHierarchy.toString(); + String mountInfo = cgroupv1MntInfoNonTrivialRoot.toString(); + String selfCgroup = cgroupv1SelfNonTrivialRoot.toString(); + Optional result = CgroupSubsystemFactory.determineType(mountInfo, cgroups, selfCgroup); + + assertTrue("Expected non-empty cgroup result", result.isPresent()); + CgroupTypeResult res = result.get(); + CgroupInfo cpuInfo = res.getInfos().get("cpu"); + assertEquals(cpuInfo.getCgroupPath(), "/system.slice/garden.service/garden/bad/2f57368b-0eda-4e52-64d8-af5c"); + String expectedMountPoint = "/sys/fs/cgroup/cpu,cpuacct"; + assertEquals(expectedMountPoint, cpuInfo.getMountPoint()); + CgroupV1SubsystemController cgroupv1MemoryController = new CgroupV1SubsystemController(cpuInfo.getMountRoot(), cpuInfo.getMountPoint()); + cgroupv1MemoryController.setPath(cpuInfo.getCgroupPath()); + String actualPath = cgroupv1MemoryController.path(); + assertNotNull(actualPath); + String expectedPath = expectedMountPoint; + assertEquals("Should be equal to the mount point path", expectedPath, actualPath); + } + @Test public void testZeroHierarchyCgroupsV1() throws IOException { String cgroups = cgroupv1CgInfoZeroHierarchy.toString(); diff --git a/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetricsSubgroup.java b/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetricsSubgroup.java new file mode 100644 index 000000000000..2ac79c173eff --- /dev/null +++ b/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetricsSubgroup.java @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2025, BELLSOFT. 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 jdk.internal.platform.Metrics; +import jdk.test.lib.Utils; +import jdk.test.lib.containers.docker.Common; +import jdk.test.lib.containers.docker.DockerfileConfig; +import jdk.test.lib.containers.docker.DockerRunOptions; +import jdk.test.lib.containers.docker.DockerTestUtils; + +import java.util.ArrayList; + +import jtreg.SkippedException; + +/* + * @test + * @bug 8343191 + * @key cgroups + * @summary Cgroup v1 subsystem fails to set subsystem path + * @requires container.support + * @library /test/lib + * @modules java.base/jdk.internal.platform + * @build MetricsMemoryTester + * @run main TestDockerMemoryMetricsSubgroup + */ + +public class TestDockerMemoryMetricsSubgroup { + private static final String imageName = + DockerfileConfig.getBaseImageName() + ":" + + DockerfileConfig.getBaseImageVersion(); + + public static void main(String[] args) throws Exception { + Metrics metrics = Metrics.systemMetrics(); + if (metrics == null) { + System.out.println("Cgroup not configured."); + return; + } + if (!DockerTestUtils.canTestDocker()) { + System.out.println("Unable to run docker tests."); + return; + } + if ("cgroupv1".equals(metrics.getProvider())) { + testMemoryLimitSubgroupV1("200m", "400m", false); + testMemoryLimitSubgroupV1("500m", "1G", false); + testMemoryLimitSubgroupV1("200m", "400m", true); + testMemoryLimitSubgroupV1("500m", "1G", true); + } else if ("cgroupv2".equals(metrics.getProvider())) { + testMemoryLimitSubgroupV2("200m", "400m", false); + testMemoryLimitSubgroupV2("500m", "1G", false); + testMemoryLimitSubgroupV2("200m", "400m", true); + testMemoryLimitSubgroupV2("500m", "1G", true); + } else { + throw new SkippedException("Metrics are from neither cgroup v1 nor v2, skipped for now."); + } + } + + private static void testMemoryLimitSubgroupV1(String innerSize, String outerGroupMemorySize, boolean privateNamespace) throws Exception { + Common.logNewTestCase("testMemoryLimitSubgroup, innerSize = " + innerSize); + DockerRunOptions opts = + new DockerRunOptions(imageName, "sh", "-c"); + opts.javaOpts = new ArrayList<>(); + opts.appendTestJavaOptions = false; + opts.addDockerOpts("--volume", Utils.TEST_CLASSES + ":/test-classes/") + .addDockerOpts("--volume", Utils.TEST_JDK + ":/jdk") + .addDockerOpts("--privileged") + .addDockerOpts("--cgroupns=" + (privateNamespace ? "private" : "host")) + .addDockerOpts("--memory", outerGroupMemorySize); + opts.addClassOptions("mkdir -p /sys/fs/cgroup/memory/test ; " + + "echo " + innerSize + " > /sys/fs/cgroup/memory/test/memory.limit_in_bytes ; " + + "echo $$ > /sys/fs/cgroup/memory/test/cgroup.procs ; " + + "/jdk/bin/java -cp /test-classes/ " + + "--add-exports java.base/jdk.internal.platform=ALL-UNNAMED " + + "MetricsMemoryTester memory " + innerSize); + + DockerTestUtils.dockerRunJava(opts).shouldHaveExitValue(0).shouldContain("TEST PASSED!!!"); + } + + private static void testMemoryLimitSubgroupV2(String innerSize, String outerGroupMemorySize, boolean privateNamespace) throws Exception { + Common.logNewTestCase("testMemoryLimitSubgroup, innerSize = " + innerSize); + DockerRunOptions opts = + new DockerRunOptions(imageName, "sh", "-c"); + opts.javaOpts = new ArrayList<>(); + opts.appendTestJavaOptions = false; + opts.addDockerOpts("--volume", Utils.TEST_CLASSES + ":/test-classes/") + .addDockerOpts("--volume", Utils.TEST_JDK + ":/jdk") + .addDockerOpts("--privileged") + .addDockerOpts("--cgroupns=" + (privateNamespace ? "private" : "host")) + .addDockerOpts("--memory", outerGroupMemorySize); + opts.addClassOptions("mkdir -p /sys/fs/cgroup/memory/test ; " + + "echo $$ > /sys/fs/cgroup/memory/test/cgroup.procs ; " + + "echo '+memory' > /sys/fs/cgroup/cgroup.subtree_control ; " + + "echo '+memory' > /sys/fs/cgroup/memory/cgroup.subtree_control ; " + + "echo " + innerSize + " > /sys/fs/cgroup/memory/test/memory.max ; " + + "/jdk/bin/java -cp /test-classes/ " + + "--add-exports java.base/jdk.internal.platform=ALL-UNNAMED " + + "MetricsMemoryTester memory " + innerSize); + + DockerTestUtils.dockerRunJava(opts).shouldHaveExitValue(0).shouldContain("TEST PASSED!!!"); + } +} From bd952d501dd2643fabf9ac19fa8d9aad831f283a Mon Sep 17 00:00:00 2001 From: Timofei Pushkin Date: Wed, 8 Oct 2025 15:41:25 +0000 Subject: [PATCH 147/323] 8315130: java.lang.IllegalAccessError when processing classlist to create CDS archive Reviewed-by: iklam Backport-of: 46a12e781edcbe9da7bd39eb9e101fc680053cef --- src/hotspot/share/cds/classListParser.cpp | 59 ++++-- src/hotspot/share/cds/classListParser.hpp | 3 +- src/hotspot/share/cds/unregisteredClasses.cpp | 98 ++++------ src/hotspot/share/cds/unregisteredClasses.hpp | 18 +- .../classfile/systemDictionaryShared.cpp | 21 +- .../classfile/systemDictionaryShared.hpp | 1 + .../share/classes/jdk/internal/misc/CDS.java | 182 +++++++++--------- .../customLoader/DifferentSourcesTest.java | 79 ++++++++ .../customLoader/RegUnregSuperTest.java | 88 +++++++++ .../test-classes/CustomLoadee5.java | 28 +++ .../test-classes/CustomLoadee5Child.java | 28 +++ .../test-classes/DifferentSourcesApp.java | 41 ++++ .../test-classes/RegUnregSuperApp.java | 108 +++++++++++ 13 files changed, 573 insertions(+), 181 deletions(-) create mode 100644 test/hotspot/jtreg/runtime/cds/appcds/customLoader/DifferentSourcesTest.java create mode 100644 test/hotspot/jtreg/runtime/cds/appcds/customLoader/RegUnregSuperTest.java create mode 100644 test/hotspot/jtreg/runtime/cds/appcds/customLoader/test-classes/CustomLoadee5.java create mode 100644 test/hotspot/jtreg/runtime/cds/appcds/customLoader/test-classes/CustomLoadee5Child.java create mode 100644 test/hotspot/jtreg/runtime/cds/appcds/customLoader/test-classes/DifferentSourcesApp.java create mode 100644 test/hotspot/jtreg/runtime/cds/appcds/customLoader/test-classes/RegUnregSuperApp.java diff --git a/src/hotspot/share/cds/classListParser.cpp b/src/hotspot/share/cds/classListParser.cpp index f8ba385bd621..719da14bdd8b 100644 --- a/src/hotspot/share/cds/classListParser.cpp +++ b/src/hotspot/share/cds/classListParser.cpp @@ -397,17 +397,13 @@ bool ClassListParser::parse_uint_option(const char* option_name, int* value) { return false; } -objArrayOop ClassListParser::get_specified_interfaces(TRAPS) { +GrowableArray ClassListParser::get_specified_interfaces() { const int n = _interfaces->length(); - if (n == 0) { - return nullptr; - } else { - objArrayOop array = oopFactory::new_objArray(vmClasses::Class_klass(), n, CHECK_NULL); - for (int i = 0; i < n; i++) { - array->obj_at_put(i, lookup_class_by_id(_interfaces->at(i))->java_mirror()); - } - return array; + GrowableArray specified_interfaces(n); + for (int i = 0; i < n; i++) { + specified_interfaces.append(lookup_class_by_id(_interfaces->at(i))); } + return specified_interfaces; } void ClassListParser::print_specified_interfaces() { @@ -469,6 +465,25 @@ void ClassListParser::error(const char* msg, ...) { va_end(ap); } +// If an unregistered class U is specified to have a registered supertype S1 +// named SN but an unregistered class S2 also named SN has already been loaded +// S2 will be incorrectly used as the supertype of U instead of S1 due to +// limitations in the loading mechanism of unregistered classes. +void ClassListParser::check_supertype_obstruction(int specified_supertype_id, const InstanceKlass* specified_supertype, TRAPS) { + if (specified_supertype->is_shared_unregistered_class()) { + return; // Only registered supertypes can be obstructed + } + const InstanceKlass* obstructor = SystemDictionaryShared::get_unregistered_class(specified_supertype->name()); + if (obstructor == nullptr) { + return; // No unregistered types with the same name have been loaded, i.e. no obstruction + } + // 'specified_supertype' is S1, 'obstructor' is S2 from the explanation above + ResourceMark rm; + THROW_MSG(vmSymbols::java_lang_UnsupportedOperationException(), + err_msg("%s (id %d) has super-type %s (id %d) obstructed by another class with the same name", + _class_name, _id, specified_supertype->external_name(), specified_supertype_id)); +} + // This function is used for loading classes for customized class loaders // during archive dumping. InstanceKlass* ClassListParser::load_class_from_source(Symbol* class_name, TRAPS) { @@ -493,13 +508,18 @@ InstanceKlass* ClassListParser::load_class_from_source(Symbol* class_name, TRAPS } ResourceMark rm; - char * source_path = os::strdup_check_oom(ClassLoader::uri_to_path(_source)); InstanceKlass* specified_super = lookup_class_by_id(_super); - Handle super_class(THREAD, specified_super->java_mirror()); - objArrayOop r = get_specified_interfaces(CHECK_NULL); - objArrayHandle interfaces(THREAD, r); - InstanceKlass* k = UnregisteredClasses::load_class(class_name, source_path, - super_class, interfaces, CHECK_NULL); + GrowableArray specified_interfaces = get_specified_interfaces(); + // Obstruction must be checked before the class loading attempt because it may + // cause class loading errors (JVMS 5.3.5.3-5.3.5.4) + check_supertype_obstruction(_super, specified_super, CHECK_NULL); + for (int i = 0; i < _interfaces->length(); i++) { + check_supertype_obstruction(_interfaces->at(i), specified_interfaces.at(i), CHECK_NULL); + } + + const char* source_path = ClassLoader::uri_to_path(_source); + InstanceKlass* k = UnregisteredClasses::load_class(class_name, source_path, CHECK_NULL); + if (k->java_super() != specified_super) { error("The specified super class %s (id %d) does not match actual super class %s", specified_super->external_name(), _super, @@ -511,6 +531,15 @@ InstanceKlass* ClassListParser::load_class_from_source(Symbol* class_name, TRAPS error("The number of interfaces (%d) specified in class list does not match the class file (%d)", _interfaces->length(), k->local_interfaces()->length()); } + for (int i = 0; i < _interfaces->length(); i++) { + InstanceKlass* specified_interface = specified_interfaces.at(i); + if (!k->local_interfaces()->contains(specified_interface)) { + print_specified_interfaces(); + print_actual_interfaces(k); + error("Specified interface %s (id %d) is not directly implemented", + specified_interface->external_name(), _interfaces->at(i)); + } + } assert(k->is_shared_unregistered_class(), "must be"); diff --git a/src/hotspot/share/cds/classListParser.hpp b/src/hotspot/share/cds/classListParser.hpp index 4234cd436eed..51dbb7fd39df 100644 --- a/src/hotspot/share/cds/classListParser.hpp +++ b/src/hotspot/share/cds/classListParser.hpp @@ -134,7 +134,8 @@ class ClassListParser : public StackObj { ClassListParser(const char* file, ParseMode _parse_mode); ~ClassListParser(); - objArrayOop get_specified_interfaces(TRAPS); + GrowableArray get_specified_interfaces(); + void check_supertype_obstruction(int specified_supertype_id, const InstanceKlass* specified_supertype, TRAPS); public: static int parse_classlist(const char* classlist_path, ParseMode parse_mode, TRAPS); diff --git a/src/hotspot/share/cds/unregisteredClasses.cpp b/src/hotspot/share/cds/unregisteredClasses.cpp index 641f84c3dcda..7af9d5b45b3e 100644 --- a/src/hotspot/share/cds/unregisteredClasses.cpp +++ b/src/hotspot/share/cds/unregisteredClasses.cpp @@ -24,37 +24,49 @@ #include "precompiled.hpp" #include "cds/unregisteredClasses.hpp" -#include "classfile/classFileStream.hpp" -#include "classfile/classLoader.inline.hpp" -#include "classfile/classLoaderExt.hpp" -#include "classfile/javaClasses.inline.hpp" #include "classfile/symbolTable.hpp" #include "classfile/systemDictionary.hpp" #include "classfile/vmSymbols.hpp" -#include "memory/oopFactory.hpp" -#include "memory/resourceArea.hpp" #include "oops/instanceKlass.hpp" +#include "oops/oopHandle.hpp" #include "oops/oopHandle.inline.hpp" +#include "runtime/handles.hpp" #include "runtime/handles.inline.hpp" #include "runtime/javaCalls.hpp" #include "services/threadService.hpp" -InstanceKlass* UnregisteredClasses::_UnregisteredClassLoader_klass = nullptr; +static InstanceKlass* _UnregisteredClassLoader_klass; +static InstanceKlass* _UnregisteredClassLoader_Source_klass; +static OopHandle _unregistered_class_loader; void UnregisteredClasses::initialize(TRAPS) { - if (_UnregisteredClassLoader_klass == nullptr) { - // no need for synchronization as this function is called single-threaded. - Symbol* klass_name = SymbolTable::new_symbol("jdk/internal/misc/CDS$UnregisteredClassLoader"); - Klass* k = SystemDictionary::resolve_or_fail(klass_name, true, CHECK); - _UnregisteredClassLoader_klass = InstanceKlass::cast(k); + if (_UnregisteredClassLoader_klass != nullptr) { + return; } + + Symbol* klass_name; + Klass* k; + + // no need for synchronization as this function is called single-threaded. + klass_name = SymbolTable::new_symbol("jdk/internal/misc/CDS$UnregisteredClassLoader"); + k = SystemDictionary::resolve_or_fail(klass_name, true, CHECK); + _UnregisteredClassLoader_klass = InstanceKlass::cast(k); + + klass_name = SymbolTable::new_symbol("jdk/internal/misc/CDS$UnregisteredClassLoader$Source"); + k = SystemDictionary::resolve_or_fail(klass_name, true, CHECK); + _UnregisteredClassLoader_Source_klass = InstanceKlass::cast(k); + + precond(_unregistered_class_loader.is_empty()); + HandleMark hm(THREAD); + const Handle cl = JavaCalls::construct_new_instance(_UnregisteredClassLoader_klass, + vmSymbols::void_method_signature(), CHECK); + _unregistered_class_loader = OopHandle(Universe::vm_global(), cl()); } // Load the class of the given name from the location given by path. The path is specified by // the "source:" in the class list file (see classListParser.cpp), and can be a directory or // a JAR file. -InstanceKlass* UnregisteredClasses::load_class(Symbol* name, const char* path, - Handle super_class, objArrayHandle interfaces, TRAPS) { +InstanceKlass* UnregisteredClasses::load_class(Symbol* name, const char* path, TRAPS) { assert(name != nullptr, "invariant"); assert(DumpSharedSpaces, "this function is only used with -Xshare:dump"); @@ -62,59 +74,33 @@ InstanceKlass* UnregisteredClasses::load_class(Symbol* name, const char* path, THREAD->get_thread_stat()->perf_timers_addr(), PerfClassTraceTime::CLASS_LOAD); - // Call CDS$UnregisteredClassLoader::load(String name, Class superClass, Class[] interfaces) + assert(!_unregistered_class_loader.is_empty(), "not initialized"); + Handle classloader(THREAD, _unregistered_class_loader.resolve()); + + // Call CDS$UnregisteredClassLoader::load(String name, String source) Symbol* methodName = SymbolTable::new_symbol("load"); - Symbol* methodSignature = SymbolTable::new_symbol("(Ljava/lang/String;Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/Class;"); - Symbol* path_symbol = SymbolTable::new_symbol(path); - Handle classloader = get_classloader(path_symbol, CHECK_NULL); + Symbol* methodSignature = SymbolTable::new_symbol("(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Class;"); Handle ext_class_name = java_lang_String::externalize_classname(name, CHECK_NULL); + Handle path_string = java_lang_String::create_from_str(path, CHECK_NULL); JavaValue result(T_OBJECT); - JavaCallArguments args(3); - args.set_receiver(classloader); - args.push_oop(ext_class_name); - args.push_oop(super_class); - args.push_oop(interfaces); JavaCalls::call_virtual(&result, - UnregisteredClassLoader_klass(), + classloader, + _UnregisteredClassLoader_klass, methodName, methodSignature, - &args, + ext_class_name, + path_string, CHECK_NULL); assert(result.get_type() == T_OBJECT, "just checking"); - oop obj = result.get_oop(); - return InstanceKlass::cast(java_lang_Class::as_Klass(obj)); -} - -class UnregisteredClasses::ClassLoaderTable : public ResourceHashtable< - Symbol*, OopHandle, - 137, // prime number - AnyObj::C_HEAP> {}; - -static UnregisteredClasses::ClassLoaderTable* _classloader_table = nullptr; -Handle UnregisteredClasses::create_classloader(Symbol* path, TRAPS) { - ResourceMark rm(THREAD); - JavaValue result(T_OBJECT); - Handle path_string = java_lang_String::create_from_str(path->as_C_string(), CHECK_NH); - Handle classloader = JavaCalls::construct_new_instance( - UnregisteredClassLoader_klass(), - vmSymbols::string_void_signature(), - path_string, CHECK_NH); - return classloader; + return InstanceKlass::cast(java_lang_Class::as_Klass(result.get_oop())); } -Handle UnregisteredClasses::get_classloader(Symbol* path, TRAPS) { - if (_classloader_table == nullptr) { - _classloader_table = new (mtClass)ClassLoaderTable(); - } - OopHandle* classloader_ptr = _classloader_table->get(path); - if (classloader_ptr != nullptr) { - return Handle(THREAD, (*classloader_ptr).resolve()); - } else { - Handle classloader = create_classloader(path, CHECK_NH); - _classloader_table->put(path, OopHandle(Universe::vm_global(), classloader())); - path->increment_refcount(); - return classloader; +bool UnregisteredClasses::check_for_exclusion(const InstanceKlass* k) { + if (_UnregisteredClassLoader_klass == nullptr) { + return false; // Uninitialized } + return k == _UnregisteredClassLoader_klass || + k->implements_interface(_UnregisteredClassLoader_Source_klass); } diff --git a/src/hotspot/share/cds/unregisteredClasses.hpp b/src/hotspot/share/cds/unregisteredClasses.hpp index ea3a308c2de2..d61c34625045 100644 --- a/src/hotspot/share/cds/unregisteredClasses.hpp +++ b/src/hotspot/share/cds/unregisteredClasses.hpp @@ -33,22 +33,10 @@ class Symbol; class UnregisteredClasses: AllStatic { public: - static InstanceKlass* load_class(Symbol* h_name, const char* path, - Handle super_class, objArrayHandle interfaces, - TRAPS); + static InstanceKlass* load_class(Symbol* name, const char* path, TRAPS); static void initialize(TRAPS); - static InstanceKlass* UnregisteredClassLoader_klass() { - return _UnregisteredClassLoader_klass; - } - - class ClassLoaderTable; - -private: - // Don't put this in vmClasses as it's used only with CDS dumping. - static InstanceKlass* _UnregisteredClassLoader_klass; - - static Handle create_classloader(Symbol* path, TRAPS); - static Handle get_classloader(Symbol* path, TRAPS); + // Returns true if the class is loaded internally for dumping unregistered classes. + static bool check_for_exclusion(const InstanceKlass* k); }; #endif // SHARE_CDS_UNREGISTEREDCLASSES_HPP diff --git a/src/hotspot/share/classfile/systemDictionaryShared.cpp b/src/hotspot/share/classfile/systemDictionaryShared.cpp index 22a94133a9ad..b7b09dc69d88 100644 --- a/src/hotspot/share/classfile/systemDictionaryShared.cpp +++ b/src/hotspot/share/classfile/systemDictionaryShared.cpp @@ -314,6 +314,12 @@ bool SystemDictionaryShared::check_for_exclusion_impl(InstanceKlass* k) { return true; } + if (UnregisteredClasses::check_for_exclusion(k)) { + ResourceMark rm; + log_info(cds)("Skipping %s: used only when dumping CDS archive", k->name()->as_C_string()); + return true; + } + InstanceKlass* super = k->java_super(); if (super != nullptr && check_for_exclusion(super, nullptr)) { ResourceMark rm; @@ -332,12 +338,6 @@ bool SystemDictionaryShared::check_for_exclusion_impl(InstanceKlass* k) { } } - if (k == UnregisteredClasses::UnregisteredClassLoader_klass()) { - ResourceMark rm; - log_info(cds)("Skipping %s: used only when dumping CDS archive", k->name()->as_C_string()); - return true; - } - return false; // false == k should NOT be excluded } @@ -456,6 +456,15 @@ bool SystemDictionaryShared::add_unregistered_class(Thread* current, InstanceKla return (klass == *v); } +InstanceKlass* SystemDictionaryShared::get_unregistered_class(Symbol* name) { + assert(Arguments::is_dumping_archive() || ClassListWriter::is_enabled(), "sanity"); + if (_unregistered_classes_table == nullptr) { + return nullptr; + } + InstanceKlass** k = _unregistered_classes_table->get(name); + return k != nullptr ? *k : nullptr; +} + void SystemDictionaryShared::set_shared_class_misc_info(InstanceKlass* k, ClassFileStream* cfs) { Arguments::assert_is_dumping_archive(); assert(!is_builtin(k), "must be unregistered class"); diff --git a/src/hotspot/share/classfile/systemDictionaryShared.hpp b/src/hotspot/share/classfile/systemDictionaryShared.hpp index f43ab838ae68..27a0c74ed445 100644 --- a/src/hotspot/share/classfile/systemDictionaryShared.hpp +++ b/src/hotspot/share/classfile/systemDictionaryShared.hpp @@ -287,6 +287,7 @@ class SystemDictionaryShared: public SystemDictionary { return (k->shared_classpath_index() != UNREGISTERED_INDEX); } static bool add_unregistered_class(Thread* current, InstanceKlass* k); + static InstanceKlass* get_unregistered_class(Symbol* name); static void check_excluded_classes(); static bool check_for_exclusion(InstanceKlass* k, DumpTimeClassInfo* info); diff --git a/src/java.base/share/classes/jdk/internal/misc/CDS.java b/src/java.base/share/classes/jdk/internal/misc/CDS.java index a963a45a8134..4b0eb06c4a36 100644 --- a/src/java.base/share/classes/jdk/internal/misc/CDS.java +++ b/src/java.base/share/classes/jdk/internal/misc/CDS.java @@ -31,15 +31,15 @@ import java.io.InputStream; import java.io.IOException; import java.io.PrintStream; -import java.net.URL; -import java.net.URLClassLoader; -import java.nio.file.InvalidPathException; +import java.nio.file.Files; import java.nio.file.Path; import java.util.Arrays; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.jar.JarFile; import java.util.stream.Stream; import jdk.internal.access.SharedSecrets; @@ -344,105 +344,111 @@ private static String dumpSharedArchive(boolean isStatic, String fileName) throw * be loaded by custom class loaders during runtime. * See src/hotspot/share/cds/unregisteredClasses.cpp. */ - private static class UnregisteredClassLoader extends URLClassLoader { - private String currentClassName; - private Class currentSuperClass; - private Class[] currentInterfaces; + private static class UnregisteredClassLoader extends ClassLoader { + static { + registerAsParallelCapable(); + } - /** - * Used only by native code. Construct an UnregisteredClassLoader for loading - * unregistered classes from the specified file. If the file doesn't exist, - * the exception will be caughted by native code which will print a warning message and continue. - * - * @param fileName path of the the JAR file to load unregistered classes from. - */ - private UnregisteredClassLoader(String fileName) throws InvalidPathException, IOException { - super(toURLArray(fileName), /*parent*/null); - currentClassName = null; - currentSuperClass = null; - currentInterfaces = null; + static interface Source { + public byte[] readClassFile(String className) throws IOException; } - private static URL[] toURLArray(String fileName) throws InvalidPathException, IOException { - if (!((new File(fileName)).exists())) { - throw new IOException("No such file: " + fileName); + static class JarSource implements Source { + private final JarFile jar; + + JarSource(File file) throws IOException { + jar = new JarFile(file); + } + + @Override + public byte[] readClassFile(String className) throws IOException { + final var entryName = className.replace('.', '/').concat(".class"); + final var entry = jar.getEntry(entryName); + if (entry == null) { + throw new IOException("No such entry: " + entryName + " in " + jar.getName()); + } + try (final var in = jar.getInputStream(entry)) { + return in.readAllBytes(); + } } - return new URL[] { - // Use an intermediate File object to construct a URI/URL without - // authority component as URLClassPath can't handle URLs with a UNC - // server name in the authority component. - Path.of(fileName).toRealPath().toFile().toURI().toURL() - }; } + static class DirSource implements Source { + private final String basePath; - /** - * Load the class of the given /name from the JAR file that was given to - * the constructor of the current UnregisteredClassLoader instance. This class must be - * a direct subclass of superClass. This class must be declared to implement - * the specified interfaces. - *

      - * This method must be called in a single threaded context. It will never be recursed (thus - * the asserts) - * - * @param name the name of the class to be loaded. - * @param superClass must not be null. The named class must have a super class. - * @param interfaces could be null if the named class does not implement any interfaces. - */ - private Class load(String name, Class superClass, Class[] interfaces) - throws ClassNotFoundException - { - assert currentClassName == null; - assert currentSuperClass == null; - assert currentInterfaces == null; - - try { - currentClassName = name; - currentSuperClass = superClass; - currentInterfaces = interfaces; - - return findClass(name); - } finally { - currentClassName = null; - currentSuperClass = null; - currentInterfaces = null; + DirSource(File dir) { + assert dir.isDirectory(); + basePath = dir.toString(); + } + + @Override + public byte[] readClassFile(String className) throws IOException { + final var subPath = className.replace('.', File.separatorChar).concat(".class"); + final var fullPath = Path.of(basePath, subPath); + return Files.readAllBytes(fullPath); } } - /** - * This method must be called from inside the load() method. The /name - * can be only: - *

        - *
      • the name parameter for load() - *
      • the name of the superClass parameter for load() - *
      • the name of one of the interfaces in interfaces parameter for load() - *
          - * - * For all other cases, a ClassNotFoundException will be thrown. - */ - protected Class findClass(final String name) - throws ClassNotFoundException - { - Objects.requireNonNull(currentClassName); - Objects.requireNonNull(currentSuperClass); - - if (name.equals(currentClassName)) { - // Note: the following call will call back to this.findClass(name) to - // resolve the super types of the named class. - return super.findClass(name); + private final HashMap sources = new HashMap<>(); + + private Source resolveSource(String path) throws IOException { + Source source = sources.get(path); + if (source != null) { + return source; } - if (name.equals(currentSuperClass.getName())) { - return currentSuperClass; + + final var file = new File(path); + if (!file.exists()) { + throw new IOException("No such file: " + path); } - if (currentInterfaces != null) { - for (Class c : currentInterfaces) { - if (name.equals(c.getName())) { - return c; - } - } + if (file.isFile()) { + source = new JarSource(file); + } else if (file.isDirectory()) { + source = new DirSource(file); + } else { + throw new IOException("Not a normal file: " + path); } + sources.put(path, source); - throw new ClassNotFoundException(name); + return source; + } + + /** + * Load the class of the given name from the given source. + *

          + * All super classes and interfaces of the named class must have already been loaded: + * either defined by this class loader (unregistered ones) or loaded, possibly indirectly, + * by the system class loader (registered ones). + *

          + * If the named class has a registered super class or interface named N there should be no + * unregistered class or interface named N loaded yet. + * + * @param name the name of the class to be loaded. + * @param source path to a directory or a JAR file from which the named class should be + * loaded. + */ + private Class load(String name, String source) throws IOException { + final Source resolvedSource = resolveSource(source); + final byte[] bytes = resolvedSource.readClassFile(name); + // 'defineClass()' may cause loading of supertypes of this unregistered class by VM + // calling 'this.loadClass()'. + // + // For any supertype S named SN specified in the classlist the following is ensured by + // the CDS implementation: + // - if S is an unregistered class it must have already been defined by this class + // loader and thus will be found by 'this.findLoadedClass(SN)', + // - if S is not an unregistered class there should be no unregistered class named SN + // loaded yet so either S has previously been (indirectly) loaded by this class loader + // and thus it will be found when calling 'this.findLoadedClass(SN)' or it will be + // found when delegating to the system class loader, which must have already loaded S, + // by calling 'this.getParent().loadClass(SN, false)'. + // See the implementation of 'ClassLoader.loadClass()' for details. + // + // Therefore, we should resolve all supertypes to the expected ones as specified by the + // "super:" and "interfaces:" attributes in the classlist. This invariant is validated + // by the C++ function 'ClassListParser::load_class_from_source()'. + assert getParent() == getSystemClassLoader(); + return defineClass(name, bytes, 0, bytes.length); } } } diff --git a/test/hotspot/jtreg/runtime/cds/appcds/customLoader/DifferentSourcesTest.java b/test/hotspot/jtreg/runtime/cds/appcds/customLoader/DifferentSourcesTest.java new file mode 100644 index 000000000000..b372c3b72897 --- /dev/null +++ b/test/hotspot/jtreg/runtime/cds/appcds/customLoader/DifferentSourcesTest.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2025, 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.nio.file.Files; +import java.nio.file.Path; + +import jdk.test.lib.process.OutputAnalyzer; + +/** + * @test + * @bug 8315130 + * @summary Tests archiving a hierarchy of package-private classes loaded from + * different sources. + * + * @requires vm.cds + * @requires vm.cds.custom.loaders + * @library /test/lib /test/hotspot/jtreg/runtime/cds/appcds + * @compile test-classes/DifferentSourcesApp.java test-classes/CustomLoadee5.java test-classes/CustomLoadee5Child.java + * @run main DifferentSourcesTest + */ +public class DifferentSourcesTest { + public static void main(String[] args) throws Exception { + // Setup: + // - CustomLoadee5 is package-private + // - CustomLoadee5Child extends CustomLoadee5 + // + // This setup requires CustomLoadee5 and CustomLoadee5Child to be in the + // same run-time package. Since their package name is the same (empty) + // this boils down to "be loaded by the same class loader". + // + // DifferentSourcesApp adheres to this requirement. + // + // This test checks that CDS adheres to this requirement too when + // creating a static app archive, even if CustomLoadee5 and + // CustomLoadee5Child are in different sources. + + OutputAnalyzer output; + + // The main check: the archive is created without IllegalAccessError + JarBuilder.build("base", "CustomLoadee5"); + JarBuilder.build("sub", "CustomLoadee5Child"); + final String classlist[] = new String[] { + "java/lang/Object id: 0", + "CustomLoadee5 id: 1 super: 0 source: base.jar", + "CustomLoadee5Child id: 2 super: 1 source: sub.jar", + }; + output = TestCommon.testDump(null, classlist); + output.shouldNotContain("java.lang.IllegalAccessError: class CustomLoadee5Child cannot access its superclass CustomLoadee5"); + output.shouldNotContain("Cannot find CustomLoadee5Child"); + + // Sanity check: the archive is used as expected + output = TestCommon.execCommon("-Xlog:class+load", "DifferentSourcesApp"); + TestCommon.checkExec( + output, + "CustomLoadee5 source: shared objects file", + "CustomLoadee5Child source: shared objects file" + ); + } +} diff --git a/test/hotspot/jtreg/runtime/cds/appcds/customLoader/RegUnregSuperTest.java b/test/hotspot/jtreg/runtime/cds/appcds/customLoader/RegUnregSuperTest.java new file mode 100644 index 000000000000..07fbaec02097 --- /dev/null +++ b/test/hotspot/jtreg/runtime/cds/appcds/customLoader/RegUnregSuperTest.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2025, 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 jdk.test.lib.process.OutputAnalyzer; + +/** + * @test id=unreg + * @summary Tests that if a super class is listed as unregistered it is archived + * as such even if a class with the same name has also been loaded from the + * classpath. + * + * @requires vm.cds + * @requires vm.cds.custom.loaders + * @library /test/lib /test/hotspot/jtreg/runtime/cds/appcds + * @compile test-classes/RegUnregSuperApp.java test-classes/CustomLoadee3.java test-classes/CustomLoadee3Child.java + * @run main RegUnregSuperTest unreg + */ + +/** + * @test id=reg + * @summary If an unregistered class U is specified to have a registered + * supertype S1 named SN but an unregistered class S2 also named SN has already + * been loaded S2 will be incorrectly used as the supertype of U instead of S1 + * due to limitations in the loading mechanism of unregistered classes. For this + * reason U should not be loaded at all and an appropriate warning should be + * printed. + * + * @requires vm.cds + * @requires vm.cds.custom.loaders + * @library /test/lib /test/hotspot/jtreg/runtime/cds/appcds + * @compile test-classes/RegUnregSuperApp.java test-classes/CustomLoadee3.java test-classes/CustomLoadee3Child.java + * @run main RegUnregSuperTest reg + */ + +public class RegUnregSuperTest { + public static void main(String[] args) throws Exception { + final String variant = args[0]; + + final String appJar = JarBuilder.build( + "app", "RegUnregSuperApp", "DirectClassLoader", "CustomLoadee3", "CustomLoadee3Child" + ); + OutputAnalyzer out; + + final String classlist[] = new String[] { + "java/lang/Object id: 0", + "CustomLoadee3 id: 1", + "CustomLoadee3 id: 2 super: 0 source: " + appJar, + "CustomLoadee3Child id: 3 super: " + ("reg".equals(variant) ? "1" : "2") + " source: " + appJar + }; + out = TestCommon.testDump(appJar, classlist, "-Xlog:cds+class=debug"); + out.shouldContain("app CustomLoadee3"); // Not using \n as below because it'll be "app CustomLoadee3 aot-linked" with AOTClassLinking + out.shouldNotContain("app CustomLoadee3Child"); + out.shouldContain("unreg CustomLoadee3\n"); // Accepts "unreg CustomLoadee3" but not "unreg CustomLoadee3Child" + if ("reg".equals(variant)) { + out.shouldNotContain("unreg CustomLoadee3Child"); + out.shouldContain("CustomLoadee3Child (id 3) has super-type CustomLoadee3 (id 1) obstructed by another class with the same name"); + } else { + out.shouldContain("unreg CustomLoadee3Child"); + out.shouldNotContain("obstructed by another class with the same name"); + } + + out = TestCommon.exec(appJar, "-Xlog:class+load", "RegUnregSuperApp", variant); + TestCommon.checkExec( + out, + "CustomLoadee3Child source: " + ("reg".equals(variant) ? "file:" : "shared objects file") + ); + } +} diff --git a/test/hotspot/jtreg/runtime/cds/appcds/customLoader/test-classes/CustomLoadee5.java b/test/hotspot/jtreg/runtime/cds/appcds/customLoader/test-classes/CustomLoadee5.java new file mode 100644 index 000000000000..f3cda51c9fa0 --- /dev/null +++ b/test/hotspot/jtreg/runtime/cds/appcds/customLoader/test-classes/CustomLoadee5.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2025, 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. + */ + +class CustomLoadee5 { + public String toString() { + return "this is CustomLoadee5"; + } +} diff --git a/test/hotspot/jtreg/runtime/cds/appcds/customLoader/test-classes/CustomLoadee5Child.java b/test/hotspot/jtreg/runtime/cds/appcds/customLoader/test-classes/CustomLoadee5Child.java new file mode 100644 index 000000000000..82684ce327d1 --- /dev/null +++ b/test/hotspot/jtreg/runtime/cds/appcds/customLoader/test-classes/CustomLoadee5Child.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2025, 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. + */ + +class CustomLoadee5Child extends CustomLoadee5 { + public String toString() { + return "this is CustomLoadee5Child"; + } +} diff --git a/test/hotspot/jtreg/runtime/cds/appcds/customLoader/test-classes/DifferentSourcesApp.java b/test/hotspot/jtreg/runtime/cds/appcds/customLoader/test-classes/DifferentSourcesApp.java new file mode 100644 index 000000000000..21efd565ce43 --- /dev/null +++ b/test/hotspot/jtreg/runtime/cds/appcds/customLoader/test-classes/DifferentSourcesApp.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2025, 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.nio.file.Path; +import java.nio.file.FileSystems; +import java.net.URL; +import java.net.URLClassLoader; + +/** + * See ../DifferentSourcesTest.java for details. + */ +public class DifferentSourcesApp { + public static void main(String args[]) throws Exception { + Path base = FileSystems.getDefault().getPath("base.jar"); + Path sub = FileSystems.getDefault().getPath("sub.jar"); + URL[] urls = new URL[] { base.toUri().toURL(), sub.toUri().toURL() }; + URLClassLoader cl = new URLClassLoader(urls, /* parent = */ null); + Class cls = cl.loadClass("CustomLoadee5Child"); + System.out.println(cls.getName()); + } +} diff --git a/test/hotspot/jtreg/runtime/cds/appcds/customLoader/test-classes/RegUnregSuperApp.java b/test/hotspot/jtreg/runtime/cds/appcds/customLoader/test-classes/RegUnregSuperApp.java new file mode 100644 index 000000000000..01581d52db2b --- /dev/null +++ b/test/hotspot/jtreg/runtime/cds/appcds/customLoader/test-classes/RegUnregSuperApp.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2025, 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.nio.file.FileSystems; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.Set; + +class DirectClassLoader extends URLClassLoader { + private final Set directlyLoadedNames; + + public DirectClassLoader(URL url, String... directlyLoadedNames) { + super(new URL[] { url }); + this.directlyLoadedNames = Set.of(directlyLoadedNames); + } + + @Override + public Class loadClass(String name) throws ClassNotFoundException { + synchronized (getClassLoadingLock(name)) { + Class c = findLoadedClass(name); + if (c == null) { + if (directlyLoadedNames.contains(name)) { + c = findClass(name); + } else { + c = super.loadClass(name); + } + } + return c; + } + } +} + +/** + * See ../RegUnregSuperTest.java for details. + */ +public class RegUnregSuperApp { + private static final URL APP_JAR; + static { + final URL appJar; + try { + appJar = FileSystems.getDefault().getPath("app.jar").toUri().toURL(); + } catch (Exception e) { + throw new RuntimeException(e); + } + APP_JAR = appJar; + } + + public static void main(String args[]) throws Exception { + switch (args[0]) { + case "reg" -> loadWithRegisteredSuper(); + case "unreg" -> loadWithUnregisteredSuper(); + default -> throw new IllegalArgumentException("Unknown variant: " + args[0]); + } + } + + private static void loadWithRegisteredSuper() throws Exception { + // Load unregistered super + final var unregisteredBaseCl = new DirectClassLoader(APP_JAR, "CustomLoadee3"); + Class unregisteredBase = unregisteredBaseCl.loadClass("CustomLoadee3"); + checkClassLoader(unregisteredBase, unregisteredBaseCl); + + // Load unregistered child with REGISTERED super + final var registeredBaseCl = new DirectClassLoader(APP_JAR, "CustomLoadee3Child"); + Class unregisteredChild = registeredBaseCl.loadClass("CustomLoadee3Child"); + checkClassLoader(unregisteredChild, registeredBaseCl); + checkClassLoader(unregisteredChild.getSuperclass(), ClassLoader.getSystemClassLoader()); + } + + private static void loadWithUnregisteredSuper() throws Exception { + // Load registered super + final var systemCl = ClassLoader.getSystemClassLoader(); + Class registeredBase = systemCl.loadClass("CustomLoadee3"); + checkClassLoader(registeredBase, systemCl); + + // Load unregistered child with UNREGISTERED super + final var unregisteredBaseCl = new DirectClassLoader(APP_JAR, "CustomLoadee3", "CustomLoadee3Child"); + Class unregisteredChild = unregisteredBaseCl.loadClass("CustomLoadee3Child"); + checkClassLoader(unregisteredChild, unregisteredBaseCl); + checkClassLoader(unregisteredChild.getSuperclass(), unregisteredBaseCl); + } + + private static void checkClassLoader(Class c, ClassLoader cl) { + ClassLoader realCl = c.getClassLoader(); + if (realCl != cl) { + throw new RuntimeException(c + " has wrong loader: expected " + cl + ", got " + realCl); + } + } +} From 32b0f8aaf0804a22fc172a2e284f4ddab92e5dd0 Mon Sep 17 00:00:00 2001 From: Sergey Chernyshev Date: Thu, 9 Oct 2025 08:16:16 +0000 Subject: [PATCH 148/323] 8351382: New test containers/docker/TestMemoryWithSubgroups.java is failing Backport-of: 46b3d1d8cfd03e01d993be19d725cdbcafef7865 --- .../docker/TestMemoryWithSubgroups.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/hotspot/jtreg/containers/docker/TestMemoryWithSubgroups.java b/test/hotspot/jtreg/containers/docker/TestMemoryWithSubgroups.java index e7989874d7a8..2245090ac558 100644 --- a/test/hotspot/jtreg/containers/docker/TestMemoryWithSubgroups.java +++ b/test/hotspot/jtreg/containers/docker/TestMemoryWithSubgroups.java @@ -21,6 +21,7 @@ * questions. */ +import jdk.test.lib.Container; import jdk.test.lib.containers.docker.Common; import jdk.test.lib.containers.docker.DockerTestUtils; import jdk.test.lib.containers.docker.DockerRunOptions; @@ -46,6 +47,19 @@ public class TestMemoryWithSubgroups { private static final String imageName = Common.imageName("subgroup"); + static String getEngineInfo(String format) throws Exception { + return DockerTestUtils.execute(Container.ENGINE_COMMAND, "info", "-f", format) + .getStdout(); + } + + static boolean isRootless() throws Exception { + // Docker and Podman have different INFO structures. + // The node path for Podman is .Host.Security.Rootless, that also holds for + // Podman emulating Docker CLI. The node path for Docker is .SecurityOptions. + return (getEngineInfo("{{.Host.Security.Rootless}}").contains("true") || + getEngineInfo("{{.SecurityOptions}}").contains("name=rootless")); + } + public static void main(String[] args) throws Exception { Metrics metrics = Metrics.systemMetrics(); if (metrics == null) { @@ -56,6 +70,9 @@ public static void main(String[] args) throws Exception { System.out.println("Unable to run docker tests."); return; } + if (isRootless()) { + throw new SkippedException("Test skipped in rootless mode"); + } Common.prepareWhiteBox(); DockerTestUtils.buildJdkContainerImage(imageName); From 665eca69f32eaf6c7226a58c110e0d8e15fb2757 Mon Sep 17 00:00:00 2001 From: Sergey Chernyshev Date: Fri, 10 Oct 2025 08:17:24 +0000 Subject: [PATCH 149/323] 8352926: New test TestDockerMemoryMetricsSubgroup.java fails 8360533: ContainerRuntimeVersionTestUtils fromVersionString fails with some docker versions Reviewed-by: shade Backport-of: 9ca1004e76a614328cd2eb7546143839c4d2f810 --- .../docker/TestMemoryWithSubgroups.java | 7 +- .../TestDockerMemoryMetricsSubgroup.java | 4 + .../ContainerRuntimeVersionTestUtils.java | 116 ++++++++++++++++++ 3 files changed, 124 insertions(+), 3 deletions(-) create mode 100644 test/lib/jdk/test/lib/containers/docker/ContainerRuntimeVersionTestUtils.java diff --git a/test/hotspot/jtreg/containers/docker/TestMemoryWithSubgroups.java b/test/hotspot/jtreg/containers/docker/TestMemoryWithSubgroups.java index 2245090ac558..a75f314b53de 100644 --- a/test/hotspot/jtreg/containers/docker/TestMemoryWithSubgroups.java +++ b/test/hotspot/jtreg/containers/docker/TestMemoryWithSubgroups.java @@ -24,9 +24,8 @@ import jdk.test.lib.Container; import jdk.test.lib.containers.docker.Common; import jdk.test.lib.containers.docker.DockerTestUtils; +import jdk.test.lib.containers.docker.ContainerRuntimeVersionTestUtils; import jdk.test.lib.containers.docker.DockerRunOptions; -import jdk.test.lib.process.OutputAnalyzer; -import jdk.test.lib.process.ProcessTools; import jdk.internal.platform.Metrics; import java.util.ArrayList; @@ -44,7 +43,6 @@ * @run main TestMemoryWithSubgroups */ public class TestMemoryWithSubgroups { - private static final String imageName = Common.imageName("subgroup"); static String getEngineInfo(String format) throws Exception { @@ -70,6 +68,9 @@ public static void main(String[] args) throws Exception { System.out.println("Unable to run docker tests."); return; } + + ContainerRuntimeVersionTestUtils.checkContainerVersionSupported(); + if (isRootless()) { throw new SkippedException("Test skipped in rootless mode"); } diff --git a/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetricsSubgroup.java b/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetricsSubgroup.java index 2ac79c173eff..57df7b1adbbd 100644 --- a/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetricsSubgroup.java +++ b/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetricsSubgroup.java @@ -27,6 +27,7 @@ import jdk.test.lib.containers.docker.DockerfileConfig; import jdk.test.lib.containers.docker.DockerRunOptions; import jdk.test.lib.containers.docker.DockerTestUtils; +import jdk.test.lib.containers.docker.ContainerRuntimeVersionTestUtils; import java.util.ArrayList; @@ -59,6 +60,9 @@ public static void main(String[] args) throws Exception { System.out.println("Unable to run docker tests."); return; } + + ContainerRuntimeVersionTestUtils.checkContainerVersionSupported(); + if ("cgroupv1".equals(metrics.getProvider())) { testMemoryLimitSubgroupV1("200m", "400m", false); testMemoryLimitSubgroupV1("500m", "1G", false); diff --git a/test/lib/jdk/test/lib/containers/docker/ContainerRuntimeVersionTestUtils.java b/test/lib/jdk/test/lib/containers/docker/ContainerRuntimeVersionTestUtils.java new file mode 100644 index 000000000000..0d1c3a358ab5 --- /dev/null +++ b/test/lib/jdk/test/lib/containers/docker/ContainerRuntimeVersionTestUtils.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2025, 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. + */ + +/* + * Methods and definitions related to container runtime version to test container in this directory + */ + +package jdk.test.lib.containers.docker; + +import jdk.test.lib.Container; +import jdk.test.lib.process.OutputAnalyzer; +import jtreg.SkippedException; + +public class ContainerRuntimeVersionTestUtils implements Comparable { + private final int major; + private final int minor; + private final int micro; + private static final boolean IS_DOCKER = Container.ENGINE_COMMAND.contains("docker"); + private static final boolean IS_PODMAN = Container.ENGINE_COMMAND.contains("podman"); + public static final ContainerRuntimeVersionTestUtils DOCKER_MINIMAL_SUPPORTED_VERSION_CGROUPNS = new ContainerRuntimeVersionTestUtils(20, 10, 0); + public static final ContainerRuntimeVersionTestUtils PODMAN_MINIMAL_SUPPORTED_VERSION_CGROUPNS = new ContainerRuntimeVersionTestUtils(1, 5, 0); + + private ContainerRuntimeVersionTestUtils(int major, int minor, int micro) { + this.major = major; + this.minor = minor; + this.micro = micro; + } + + public static void checkContainerVersionSupported() { + if (IS_DOCKER && ContainerRuntimeVersionTestUtils.DOCKER_MINIMAL_SUPPORTED_VERSION_CGROUPNS.compareTo(ContainerRuntimeVersionTestUtils.getContainerRuntimeVersion()) > 0) { + throw new SkippedException("Docker version too old for this test. Expected >= 20.10.0"); + } + if (IS_PODMAN && ContainerRuntimeVersionTestUtils.PODMAN_MINIMAL_SUPPORTED_VERSION_CGROUPNS.compareTo(ContainerRuntimeVersionTestUtils.getContainerRuntimeVersion()) > 0) { + throw new SkippedException("Podman version too old for this test. Expected >= 1.5.0"); + } + } + + @Override + public int compareTo(ContainerRuntimeVersionTestUtils other) { + if (this.major > other.major) { + return 1; + } else if (this.major < other.major) { + return -1; + } else if (this.minor > other.minor) { + return 1; + } else if (this.minor < other.minor) { + return -1; + } else if (this.micro > other.micro) { + return 1; + } else if (this.micro < other.micro) { + return -1; + } else { + // equal majors, minors, micro + return 0; + } + } + + public static ContainerRuntimeVersionTestUtils fromVersionString(String version) { + try { + // Example 'docker version 20.10.0 or podman version 4.9.4-rhel' + String versNums = version.split("\\s+", 3)[2]; + // On some docker implementations e.g. RHEL8 ppc64le we have the following version output: + // Docker version v25.0.3, build 4debf41 + // Trim potentially leading 'v' and trailing ',' + if (versNums.startsWith("v")) { + versNums = versNums.substring(1); + } + int cidx = versNums.indexOf(','); + versNums = (cidx != -1) ? versNums.substring(0, cidx) : versNums; + + String[] numbers = versNums.split("-")[0].split("\\.", 3); + return new ContainerRuntimeVersionTestUtils(Integer.parseInt(numbers[0]), + Integer.parseInt(numbers[1]), + Integer.parseInt(numbers[2])); + } catch (Exception e) { + throw new RuntimeException("Failed to parse container runtime version: " + version, e); + } + } + + public static String getContainerRuntimeVersionStr() { + try { + ProcessBuilder pb = new ProcessBuilder(Container.ENGINE_COMMAND, "--version"); + OutputAnalyzer out = new OutputAnalyzer(pb.start()) + .shouldHaveExitValue(0); + String result = out.asLines().get(0); + System.out.println(Container.ENGINE_COMMAND + " --version returning: " + result); + return result; + } catch (Exception e) { + throw new RuntimeException(Container.ENGINE_COMMAND + " --version command failed."); + } + } + + public static ContainerRuntimeVersionTestUtils getContainerRuntimeVersion() { + return ContainerRuntimeVersionTestUtils.fromVersionString(getContainerRuntimeVersionStr()); + } +} From 9b35ba1356d6def044a25896961a777897a5014d Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 10 Oct 2025 09:13:23 +0000 Subject: [PATCH 150/323] 8346234: javax/swing/text/DefaultEditorKit/4278839/bug4278839.java still fails in CI Backport-of: 466c00ac88569d145a47845b2c9a2522a1649889 --- .../DefaultEditorKit/4278839/bug4278839.java | 73 +++++++++++++++---- 1 file changed, 59 insertions(+), 14 deletions(-) diff --git a/test/jdk/javax/swing/text/DefaultEditorKit/4278839/bug4278839.java b/test/jdk/javax/swing/text/DefaultEditorKit/4278839/bug4278839.java index 980a9c9f5281..819ba52d270a 100644 --- a/test/jdk/javax/swing/text/DefaultEditorKit/4278839/bug4278839.java +++ b/test/jdk/javax/swing/text/DefaultEditorKit/4278839/bug4278839.java @@ -49,6 +49,7 @@ public class bug4278839 { private static JFrame frame; public static void main(String[] args) throws Exception { + int caret; try { robo = new Robot(); @@ -61,24 +62,67 @@ public static void main(String[] args) throws Exception { clickMouse(); robo.waitForIdle(); + robo.delay(250); area.setCaretPosition(0); robo.waitForIdle(); + robo.delay(250); - passed &= moveCaret(true) == 1; - passed &= moveCaret(true) == 5; - passed &= moveCaret(true) == 8; - passed &= moveCaret(true) == 9; - passed &= moveCaret(true) == 13; - passed &= moveCaret(true) == 16; - passed &= moveCaret(true) == 17; - passed &= moveCaret(false) == 16; - passed &= moveCaret(false) == 13; - passed &= moveCaret(false) == 9; - passed &= moveCaret(false) == 8; - passed &= moveCaret(false) == 5; - passed &= moveCaret(false) == 1; - passed &= moveCaret(false) == 0; + passed &= (caret = moveCaret(true)) == 1; + System.out.println(" passed " + passed + + " Expected position 1 actual position " + caret); + + passed &= (caret = moveCaret(true)) == 5; + System.out.println(" passed " + passed + + " Expected position 5 actual position " + caret); + + passed &= (caret = moveCaret(true)) == 8; + System.out.println(" passed " + passed + + " Expected position 8 actual position " + caret); + + passed &= (caret = moveCaret(true)) == 9; + System.out.println(" passed " + passed + + " Expected position 9 actual position " + caret); + + passed &= (caret = moveCaret(true)) == 13; + System.out.println(" passed " + passed + + " Expected position 13 actual position " + caret); + + passed &= (caret = moveCaret(true)) == 16; + System.out.println(" passed " + passed + + " Expected position 16 actual position " + caret); + + passed &= (caret = moveCaret(true)) == 17; + System.out.println(" passed " + passed + + " Expected position 17 actual position " + caret); + + passed &= (caret = moveCaret(false)) == 16; + System.out.println(" passed " + passed + + " Expected position 16 actual position " + caret); + + passed &= (caret = moveCaret(false)) == 13; + System.out.println(" passed " + passed + + " Expected position 13 actual position " + caret); + + passed &= (caret = moveCaret(false)) == 9; + System.out.println(" passed " + passed + + " Expected position 9 actual position " + caret); + + passed &= (caret = moveCaret(false)) == 8; + System.out.println(" passed " + passed + + " Expected position 8 actual position " + caret); + + passed &= (caret = moveCaret(false)) == 5; + System.out.println(" passed " + passed + + " Expected position 5 actual position " + caret); + + passed &= (caret = moveCaret(false)) == 1; + System.out.println(" passed " + passed + + " Expected position 1 actual position " + caret); + + passed &= (caret = moveCaret(false)) == 0; + System.out.println(" passed " + passed + + " Expected position 0 actual position " + caret); } catch (Exception e) { throw new RuntimeException("Test failed because of an exception:", @@ -98,6 +142,7 @@ private static int moveCaret(boolean right) throws Exception { Util.hitKeys(robo, getCtrlKey(), right ? KeyEvent.VK_RIGHT : KeyEvent.VK_LEFT); robo.waitForIdle(); + robo.delay(250); final int[] result = new int[1]; From 223a6ad8d7d3dba26f990bd7b470bca98c9b5868 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 10 Oct 2025 09:16:01 +0000 Subject: [PATCH 151/323] 8350102: Decouple jpackage test-lib Executor.Result and Executor classes Backport-of: 3487f8cbd55b06d332d897a010ae8eb371dd4956 --- .../helpers/jdk/jpackage/test/Executor.java | 64 +++++++++++-------- .../jdk/jpackage/test/JPackageCommand.java | 4 +- .../jdk/jpackage/test/WindowsHelper.java | 6 +- 3 files changed, 41 insertions(+), 33 deletions(-) diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/Executor.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/Executor.java index 4afd96cdf88a..e94cbc79aac4 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/Executor.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/Executor.java @@ -36,6 +36,7 @@ import java.util.HashSet; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.function.Supplier; import java.util.regex.Pattern; @@ -77,6 +78,10 @@ public Executor setToolProvider(JavaTool v) { return setToolProvider(v.asToolProvider()); } + public Optional getExecutable() { + return Optional.ofNullable(executable); + } + public Executor setDirectory(Path v) { directory = v; return this; @@ -174,10 +179,10 @@ public Executor dumpOutput(boolean v) { return this; } - public class Result { + public record Result(int exitCode, List output, Supplier cmdline) { - Result(int exitCode) { - this.exitCode = exitCode; + public Result { + Objects.requireNonNull(cmdline); } public String getFirstLineOfOutput() { @@ -188,14 +193,10 @@ public List getOutput() { return output; } - public String getPrintableCommandLine() { - return Executor.this.getPrintableCommandLine(); - } - public Result assertExitCodeIs(int expectedExitCode) { TKit.assertEquals(expectedExitCode, exitCode, String.format( "Check command %s exited with %d code", - getPrintableCommandLine(), expectedExitCode)); + cmdline.get(), expectedExitCode)); return this; } @@ -206,9 +207,6 @@ public Result assertExitCodeIsZero() { public int getExitCode() { return exitCode; } - - final int exitCode; - private List output; } public Result executeWithoutExitCodeCheck() { @@ -406,28 +404,34 @@ private Result runExecutable() throws IOException, InterruptedException { } } - Result reply = new Result(process.waitFor()); - trace("Done. Exit code: " + reply.exitCode); + final int exitCode = process.waitFor(); + trace("Done. Exit code: " + exitCode); + final List output; if (outputLines != null) { - reply.output = Collections.unmodifiableList(outputLines); + output = Collections.unmodifiableList(outputLines); + } else { + output = null; } - return reply; + return createResult(exitCode, output); } - private Result runToolProvider(PrintStream out, PrintStream err) { + private int runToolProvider(PrintStream out, PrintStream err) { trace("Execute " + getPrintableCommandLine() + "..."); - Result reply = new Result(toolProvider.run(out, err, args.toArray( - String[]::new))); - trace("Done. Exit code: " + reply.exitCode); - return reply; + final int exitCode = toolProvider.run(out, err, args.toArray( + String[]::new)); + trace("Done. Exit code: " + exitCode); + return exitCode; } + private Result createResult(int exitCode, List output) { + return new Result(exitCode, output, this::getPrintableCommandLine); + } private Result runToolProvider() throws IOException { if (!withSavedOutput()) { if (saveOutputType.contains(SaveOutputType.DUMP)) { - return runToolProvider(System.out, System.err); + return createResult(runToolProvider(System.out, System.err), null); } PrintStream nullPrintStream = new PrintStream(new OutputStream() { @@ -436,36 +440,40 @@ public void write(int b) { // Nop } }); - return runToolProvider(nullPrintStream, nullPrintStream); + return createResult(runToolProvider(nullPrintStream, nullPrintStream), null); } try (ByteArrayOutputStream buf = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(buf)) { - Result reply = runToolProvider(ps, ps); + final var exitCode = runToolProvider(ps, ps); ps.flush(); + final List output; try (BufferedReader bufReader = new BufferedReader(new StringReader( buf.toString()))) { if (saveOutputType.contains(SaveOutputType.FIRST_LINE)) { String firstLine = bufReader.lines().findFirst().orElse(null); if (firstLine != null) { - reply.output = List.of(firstLine); + output = List.of(firstLine); + } else { + output = null; } } else if (saveOutputType.contains(SaveOutputType.FULL)) { - reply.output = bufReader.lines().collect( - Collectors.toUnmodifiableList()); + output = bufReader.lines().collect(Collectors.toUnmodifiableList()); + } else { + output = null; } if (saveOutputType.contains(SaveOutputType.DUMP)) { Stream lines; if (saveOutputType.contains(SaveOutputType.FULL)) { - lines = reply.output.stream(); + lines = output.stream(); } else { lines = bufReader.lines(); } lines.forEach(System.out::println); } } - return reply; + return createResult(exitCode, output); } } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java index fd62d6c7d882..28bdc483afd5 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java @@ -59,7 +59,7 @@ * anything. The simplest is to compile test application and pack in a jar for * use on jpackage command line. */ -public final class JPackageCommand extends CommandArguments { +public class JPackageCommand extends CommandArguments { public JPackageCommand() { prerequisiteActions = new Actions(); @@ -791,7 +791,7 @@ public Executor.Result execute(int expectedExitCode) { .createExecutor() .execute(expectedExitCode); - if (result.exitCode == 0) { + if (result.exitCode() == 0) { executeVerifyActions(); } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/WindowsHelper.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/WindowsHelper.java index 86a68484c0b3..ebf4494aa791 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/WindowsHelper.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/WindowsHelper.java @@ -66,7 +66,7 @@ private static void runMsiexecWithRetries(Executor misexec) { for (int attempt = 0; attempt < 8; ++attempt) { result = misexec.executeWithoutExitCodeCheck(); - if (result.exitCode == 1605) { + if (result.exitCode() == 1605) { // ERROR_UNKNOWN_PRODUCT, attempt to uninstall not installed // package return; @@ -75,7 +75,7 @@ private static void runMsiexecWithRetries(Executor misexec) { // The given Executor may either be of an msiexec command or an // unpack.bat script containing the msiexec command. In the later // case, when misexec returns 1618, the unpack.bat may return 1603 - if ((result.exitCode == 1618) || (result.exitCode == 1603)) { + if ((result.exitCode() == 1618) || (result.exitCode() == 1603)) { // Another installation is already in progress. // Wait a little and try again. Long timeout = 1000L * (attempt + 3); // from 3 to 10 seconds @@ -360,7 +360,7 @@ static String queryRegistryValue(String keyPath, String valueName) { var status = Executor.of("reg", "query", keyPath, "/v", valueName) .saveOutput() .executeWithoutExitCodeCheck(); - if (status.exitCode == 1) { + if (status.exitCode() == 1) { // Should be the case of no such registry value or key String lookupString = "ERROR: The system was unable to find the specified registry key or value."; TKit.assertTextStream(lookupString) From c00f0bdea6de01986aefd4b6bd263f0057942a02 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 10 Oct 2025 09:18:32 +0000 Subject: [PATCH 152/323] 8297531: sun/security/krb5/MicroTime.java fails with "Exception: What? only 100 musec precision?" Backport-of: 0753376b0c3d0d98e3db14d26020b23822176557 --- test/jdk/sun/security/krb5/MicroTime.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/jdk/sun/security/krb5/MicroTime.java b/test/jdk/sun/security/krb5/MicroTime.java index 8b6b92324156..84a88cedf83d 100644 --- a/test/jdk/sun/security/krb5/MicroTime.java +++ b/test/jdk/sun/security/krb5/MicroTime.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2025, 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 @@ -44,9 +44,10 @@ public static void main(String[] args) throws Exception { count++; } } - // We believe a nice KerberosTime can at least tell the - // difference of 100 musec. - if (count < 10000) { + // Before JDK-6882687, KerberosTime was measured in milliseconds. + // Now it's in microseconds. We should be able to record more than + // 1000 distinct KerberosTime values within one second. + if (count < 1001) { throw new Exception("What? only " + (1000000/count) + " musec precision?"); } From 89d283f25dac3997b1e37024f4068d600b0040e3 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 10 Oct 2025 09:21:14 +0000 Subject: [PATCH 153/323] 8349534: Refactor jdk/sun/security/krb5/runNameEquals.sh to java test Backport-of: 0e223f1456c14efdb423595bee3444d5e26db7c6 --- .../jdk/sun/security/krb5/Krb5NameEquals.java | 64 +++++---- test/jdk/sun/security/krb5/runNameEquals.sh | 127 ------------------ 2 files changed, 36 insertions(+), 155 deletions(-) delete mode 100644 test/jdk/sun/security/krb5/runNameEquals.sh diff --git a/test/jdk/sun/security/krb5/Krb5NameEquals.java b/test/jdk/sun/security/krb5/Krb5NameEquals.java index 0851423a7fde..421c290453cf 100644 --- a/test/jdk/sun/security/krb5/Krb5NameEquals.java +++ b/test/jdk/sun/security/krb5/Krb5NameEquals.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2025, 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 @@ -22,57 +22,65 @@ */ /* + * @test * @bug 4634392 - * @summary JDK code doesn't respect contract for equals and hashCode + * @summary Ensure the GSSName has the correct impl which respects + * the contract for equals and hashCode across different configurations. + * @library /test/lib * @author Andrew Fan + * + * @run main/othervm -Djava.security.krb5.realm=R -Djava.security.krb5.kdc=127.0.0.1 Krb5NameEquals + * @run main/othervm -Dsun.security.jgss.native=true Krb5NameEquals */ -import org.ietf.jgss.*; +import jtreg.SkippedException; +import org.ietf.jgss.GSSManager; +import org.ietf.jgss.GSSName; +import org.ietf.jgss.Oid; public class Krb5NameEquals { - private static String NAME_STR1 = "service@localhost"; - private static String NAME_STR2 = "service2@localhost"; + private static final String NAME_STR1 = "service@localhost"; + private static final String NAME_STR2 = "service2@localhost"; private static final Oid MECH; static { - Oid temp = null; try { - temp = new Oid("1.2.840.113554.1.2.2"); // KRB5 + MECH = new Oid("1.2.840.113554.1.2.2"); // KRB5 } catch (Exception e) { // should never happen + throw new RuntimeException("Exception initialising Oid", e); } - MECH = temp; } public static void main(String[] argv) throws Exception { - GSSManager mgr = GSSManager.getInstance(); + final GSSManager mgr = GSSManager.getInstance(); + + // Checking if native GSS is installed, throwing skip exception if it's not. + if (Boolean.getBoolean("sun.security.jgss.native")) { + final var mechs = mgr.getMechs(); + if (mechs == null || mechs.length == 0) { + throw new SkippedException("NativeGSS not supported"); + } + } - boolean result = true; // Create GSSName and check their equals(), hashCode() impl - GSSName name1 = mgr.createName(NAME_STR1, - GSSName.NT_HOSTBASED_SERVICE, MECH); - GSSName name2 = mgr.createName(NAME_STR2, - GSSName.NT_HOSTBASED_SERVICE, MECH); - GSSName name3 = mgr.createName(NAME_STR1, - GSSName.NT_HOSTBASED_SERVICE, MECH); + final GSSName name1 = mgr.createName(NAME_STR1, + GSSName.NT_HOSTBASED_SERVICE, MECH); + final GSSName name2 = mgr.createName(NAME_STR2, + GSSName.NT_HOSTBASED_SERVICE, MECH); + final GSSName name3 = mgr.createName(NAME_STR1, + GSSName.NT_HOSTBASED_SERVICE, MECH); - if (!name1.equals(name1) || !name1.equals(name3) || - !name1.equals((Object) name1) || - !name1.equals((Object) name3)) { - System.out.println("Error: should be the same name"); - result = false; + if (!name1.equals(name3) || !name1.equals((Object) name3)) { + throw new RuntimeException("Error: should be the same name"); } else if (name1.hashCode() != name3.hashCode()) { - System.out.println("Error: should have same hash"); - result = false; + throw new RuntimeException("Error: should have same hash"); } if (name1.equals(name2) || name1.equals((Object) name2)) { - System.out.println("Error: should be different names"); - result = false; + throw new RuntimeException("Error: should be different names"); } - if (result) { - System.out.println("Done"); - } else System.exit(1); + System.out.println("Done"); } } diff --git a/test/jdk/sun/security/krb5/runNameEquals.sh b/test/jdk/sun/security/krb5/runNameEquals.sh deleted file mode 100644 index ecfd65a2fe4a..000000000000 --- a/test/jdk/sun/security/krb5/runNameEquals.sh +++ /dev/null @@ -1,127 +0,0 @@ -# -# Copyright (c) 2009, 2024, 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 6317711 6944847 8024046 -# @summary Ensure the GSSName has the correct impl which respects -# the contract for equals and hashCode across different configurations. - -# set a few environment variables so that the shell-script can run stand-alone -# in the source directory - -if [ "${TESTSRC}" = "" ] ; then - TESTSRC="." -fi - -if [ "${TESTCLASSES}" = "" ] ; then - TESTCLASSES="." -fi - -if [ "${TESTJAVA}" = "" ] ; then - echo "TESTJAVA not set. Test cannot execute." - echo "FAILED!!!" - exit 1 -fi - -if [ "${COMPILEJAVA}" = "" ]; then - COMPILEJAVA="${TESTJAVA}" -fi - -NATIVE=false - -# set platform-dependent variables -OS=`uname -s` -case "$OS" in - Linux | Darwin ) - PATHSEP=":" - FILESEP="/" - NATIVE=true - # Not all *nix has native GSS libs installed - krb5-config --libs 2> /dev/null - if [ $? != 0 ]; then - # Fedora has a different path - /usr/kerberos/bin/krb5-config --libs 2> /dev/null - if [ $? != 0 ]; then - NATIVE=false - fi - fi - ;; - AIX ) - PATHSEP=":" - FILESEP="/" - ;; - CYGWIN* ) - PATHSEP=";" - FILESEP="/" - ;; - Windows* ) - PATHSEP=";" - FILESEP="\\" - ;; - * ) - echo "Unrecognized system!" - exit 1; - ;; -esac - -TEST=Krb5NameEquals - -${COMPILEJAVA}${FILESEP}bin${FILESEP}javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} \ - -d ${TESTCLASSES}${FILESEP} \ - ${TESTSRC}${FILESEP}${TEST}.java - -EXIT_STATUS=0 - -if [ "${NATIVE}" = "true" ] ; then - echo "Testing native provider" - ${TESTJAVA}${FILESEP}bin${FILESEP}java ${TESTVMOPTS} ${TESTJAVAOPTS} \ - -classpath ${TESTCLASSES} \ - -Dsun.security.jgss.native=true \ - ${TEST} - if [ $? != 0 ] ; then - echo "Native provider fails" - EXIT_STATUS=1 - if [ "$OS" = "Linux" -a `arch` = "x86_64" ]; then - ${TESTJAVA}${FILESEP}bin${FILESEP}java -XshowSettings:properties -version 2> allprop - cat allprop | grep sun.arch.data.model | grep 32 - if [ "$?" = "0" ]; then - echo "Running 32-bit JDK on 64-bit Linux. Maybe only 64-bit library is installed." - echo "Please manually check if this is the case. Treated as PASSED now." - EXIT_STATUS=0 - fi - fi - fi -fi - -echo "Testing java provider" -${TESTJAVA}${FILESEP}bin${FILESEP}java ${TESTVMOPTS} ${TESTJAVAOPTS} \ - -classpath ${TESTCLASSES} \ - -Djava.security.krb5.realm=R \ - -Djava.security.krb5.kdc=127.0.0.1 \ - ${TEST} -if [ $? != 0 ] ; then - echo "Java provider fails" - EXIT_STATUS=1 -fi - -exit ${EXIT_STATUS} From 6210818df022d3cf79a4a80fe8193bd9b1d0e621 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 10 Oct 2025 09:23:41 +0000 Subject: [PATCH 154/323] 8354235: Test javax/net/ssl/SSLSocket/Tls13PacketSize.java failed with java.net.SocketException: An established connection was aborted by the software in your host machine Backport-of: 7b317623756d3e21d029bcded8a5e15de070a0c9 --- .../net/ssl/templates/SSLSocketTemplate.java | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/test/jdk/javax/net/ssl/templates/SSLSocketTemplate.java b/test/jdk/javax/net/ssl/templates/SSLSocketTemplate.java index ce1a99a7f1ef..0891523ac11f 100644 --- a/test/jdk/javax/net/ssl/templates/SSLSocketTemplate.java +++ b/test/jdk/javax/net/ssl/templates/SSLSocketTemplate.java @@ -168,7 +168,7 @@ protected void configureServerSocket(SSLServerSocket socket) { /* * What's the server address? null means binding to the wildcard. */ - protected volatile InetAddress serverAddress = null; + protected volatile InetAddress serverAddress = InetAddress.getLoopbackAddress(); /* * Define the server side of the test. @@ -177,13 +177,8 @@ protected void doServerSide() throws Exception { // kick start the server side service SSLContext context = createServerSSLContext(); SSLServerSocketFactory sslssf = context.getServerSocketFactory(); - InetAddress serverAddress = this.serverAddress; - SSLServerSocket sslServerSocket = serverAddress == null ? - (SSLServerSocket)sslssf.createServerSocket(serverPort) - : (SSLServerSocket)sslssf.createServerSocket(); - if (serverAddress != null) { - sslServerSocket.bind(new InetSocketAddress(serverAddress, serverPort)); - } + SSLServerSocket sslServerSocket = (SSLServerSocket)sslssf.createServerSocket( + serverPort, 0, serverAddress); configureServerSocket(sslServerSocket); serverPort = sslServerSocket.getLocalPort(); @@ -271,10 +266,8 @@ protected void doClientSide() throws Exception { try (SSLSocket sslSocket = (SSLSocket)sslsf.createSocket()) { try { configureClientSocket(sslSocket); - InetAddress serverAddress = this.serverAddress; - InetSocketAddress connectAddress = serverAddress == null - ? new InetSocketAddress(InetAddress.getLoopbackAddress(), serverPort) - : new InetSocketAddress(serverAddress, serverPort); + InetSocketAddress connectAddress = new InetSocketAddress(serverAddress, + serverPort); sslSocket.connect(connectAddress, 15000); } catch (IOException ioe) { // The server side may be impacted by naughty test cases or From 80e62b2ac3bf7b7867d50616970343890e3802d0 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 10 Oct 2025 09:25:52 +0000 Subject: [PATCH 155/323] 8356752: Log mouse enter and exit events for debugging Backport-of: ab8c808ed8ebec4f70141ee31fbaf312fccf7fa4 --- test/jdk/java/awt/List/ListEnterExitTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/jdk/java/awt/List/ListEnterExitTest.java b/test/jdk/java/awt/List/ListEnterExitTest.java index 998b152a634d..cb9c035d9779 100644 --- a/test/jdk/java/awt/List/ListEnterExitTest.java +++ b/test/jdk/java/awt/List/ListEnterExitTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2025, 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 @@ -93,6 +93,7 @@ public void start() throws Exception { } }); } + System.out.println("mouseEnterExitListener.isPassed() : " + mouseEnterExitListener.isPassed()); if (!mouseEnterExitListener.isPassed()) { throw new RuntimeException("Haven't receive mouse enter/exit events"); } @@ -108,10 +109,12 @@ class MouseEnterExitListener extends MouseAdapter { public void mouseEntered(MouseEvent e) { passed_1 = true; + System.out.println("passed_1 is: " + passed_1); } public void mouseExited(MouseEvent e) { passed_2 = true; + System.out.println("passed_2 is: " + passed_2); } public void mousePressed(MouseEvent e) { From 422a4a8562578d05f255f45436a94589197ede18 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 10 Oct 2025 09:28:33 +0000 Subject: [PATCH 156/323] 8357799: Improve instructions for JFileChooser/HTMLFileName.java Backport-of: 53a83d15a1b5686ed0f2aeb3d30cd46b73f80733 --- .../swing/JFileChooser/HTMLFileName.java | 67 +++++++++++-------- 1 file changed, 38 insertions(+), 29 deletions(-) diff --git a/test/jdk/javax/swing/JFileChooser/HTMLFileName.java b/test/jdk/javax/swing/JFileChooser/HTMLFileName.java index 45d9cb4c449d..a8bc9525cca7 100644 --- a/test/jdk/javax/swing/JFileChooser/HTMLFileName.java +++ b/test/jdk/javax/swing/JFileChooser/HTMLFileName.java @@ -52,24 +52,35 @@ public class HTMLFileName { private static final String INSTRUCTIONS = """

            -
          1. FileChooser shows up a virtual directory and file with name -

            Swing Rocks!. -
          2. On "HTML disabled" frame : +
          3. JFileChooser shows a virtual directory. + The first file in the list has the following name: + <html><h1 color=#ff00ff><font + face="Serif">Swing Rocks! +
            +
            +
          4. In HTML disabled frame:
              -
            1. Verify that the folder and file name must be plain text. -
            2. If the name in file pane window and also in directory - ComboBox remains in plain text, then press Pass. - If it appears to be in HTML format with Pink color as - shown, then press Fail. +
            3. Verify that the first file name displays + as plain text, + that is you see the HTML tags in the file name. +
            4. If the file name in the file pane and + in the navigation combo box above is displayed + as HTML, that is in large font and magenta color, + then press Fail.
            -
          5. On "HTML enabled" frame : +
          6. In HTML enabled frame:
              -
            1. Verify that the folder and file name remains in HTML - format with name "Swing Rocks!" pink in color as shown. -
            2. If the name in file pane window and also in directory - ComboBox remains in HTML format string, then press Pass. - If it appears to be in plain text, then press Fail. +
            3. Verify that the first file name displays as HTML, + that is Swing Rocks! in large font + and magenta color.
              + Note: On macOS in Aqua L&F, the file name with + HTML displays as an empty file name. It is not an error. +
            4. If the file name in the file pane and + in the navigation combo box above is displayed + as HTML, then press Pass.
              + If it is in plain text, then press Fail.
          @@ -99,6 +110,7 @@ public static void main(String[] args) throws Exception { PassFailJFrame.builder() .instructions(INSTRUCTIONS) .columns(45) + .rows(20) .testUI(HTMLFileName::initialize) .positionTestUIBottomRowCentered() .build() @@ -110,18 +122,25 @@ private static List initialize() { return List.of(createFileChooser(true), createFileChooser(false)); } - private static JFrame createFileChooser(boolean htmlEnabled) { + private static JFrame createFileChooser(boolean htmlDisabled) { JFileChooser jfc = new JFileChooser(new VirtualFileSystemView()); - jfc.putClientProperty("html.disable", htmlEnabled); + jfc.putClientProperty("html.disable", htmlDisabled); jfc.setControlButtonsAreShown(false); - JFrame frame = new JFrame((htmlEnabled) ? "HTML enabled" : "HTML disabled"); + JFrame frame = new JFrame(htmlDisabled ? "HTML disabled" : "HTML enabled"); frame.add(jfc); frame.pack(); return frame; } private static class VirtualFileSystemView extends FileSystemView { + private final File[] files = { + new File("/", "

          Swing Rocks!"), + new File("/", "virtualFile1.txt"), + new File("/", "virtualFile2.log") + }; + @Override public File createNewFolder(File containingDir) { return null; @@ -129,12 +148,7 @@ public File createNewFolder(File containingDir) { @Override public File[] getRoots() { - return new File[]{ - new File("/", "

          Swing Rocks!"), - new File("/", "virtualFile2.txt"), - new File("/", "virtualFolder") - }; + return files; } @Override @@ -150,12 +164,7 @@ public File getDefaultDirectory() { @Override public File[] getFiles(File dir, boolean useFileHiding) { // Simulate a virtual folder structure - return new File[]{ - new File("/", "

          Swing Rocks!"), - new File(dir, "virtualFile2.txt"), - new File(dir, "virtualFolder") - }; + return files; } @Override From 29a51bc480ebc00c1763a0b445b593f49b77b2bd Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 10 Oct 2025 09:43:18 +0000 Subject: [PATCH 157/323] 8361253: CommandLineOptionTest library should report observed values on failure Backport-of: f153e415d740f4ede272929171e9bb3e73ddbe1c --- test/lib/jdk/test/lib/cli/CommandLineOptionTest.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/test/lib/jdk/test/lib/cli/CommandLineOptionTest.java b/test/lib/jdk/test/lib/cli/CommandLineOptionTest.java index 15b77b028696..c64cf8026881 100644 --- a/test/lib/jdk/test/lib/cli/CommandLineOptionTest.java +++ b/test/lib/jdk/test/lib/cli/CommandLineOptionTest.java @@ -123,8 +123,8 @@ public static void verifyJVMStartup(String expectedMessages[], outputAnalyzer.shouldHaveExitValue(exitCode.value); } catch (RuntimeException e) { String errorMessage = String.format( - "JVM process should have exit value '%d'.%n%s", - exitCode.value, exitErrorMessage); + "JVM process should have exit value '%d', but has '%d'.%n%s", + exitCode.value, outputAnalyzer.getExitValue(), exitErrorMessage); throw new AssertionError(errorMessage, e); } @@ -301,9 +301,12 @@ public static void verifyOptionValue(String optionName, CommandLineOptionTest.PRINT_FLAGS_FINAL_FORMAT, optionName, expectedValue)); } catch (RuntimeException e) { + String observedValue = outputAnalyzer.firstMatch(String.format( + CommandLineOptionTest.PRINT_FLAGS_FINAL_FORMAT, + optionName, "\\S")); String errorMessage = String.format( - "Option '%s' is expected to have '%s' value%n%s", - optionName, expectedValue, + "Option '%s' is expected to have '%s' value, but is '%s'.%n%s", + optionName, expectedValue, observedValue, optionErrorString); throw new AssertionError(errorMessage, e); } From 8a6cc86084422e6c1e7698da01b3250c53bc4507 Mon Sep 17 00:00:00 2001 From: Liam Miller-Cushon Date: Fri, 10 Oct 2025 10:21:59 +0000 Subject: [PATCH 158/323] 8342934: TYPE_USE annotations printed with error causing "," in toString output Backport-of: ff165f9f0cf519144d7361b766bcce53d04c518e --- .../share/classes/com/sun/tools/javac/code/Type.java | 2 +- .../type/AnnotatedTypeToString/AnnotatedTypeToString.java | 2 +- .../processing/model/type/AnnotatedTypeToString/Test.java | 8 ++++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Type.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Type.java index e295096bb6d1..203e9f9cc47c 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Type.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Type.java @@ -497,7 +497,7 @@ protected void appendAnnotationsString(StringBuilder sb, if (prefix) { sb.append(" "); } - sb.append(getAnnotationMirrors()); + sb.append(getAnnotationMirrors().toString(" ")); sb.append(" "); } } diff --git a/test/langtools/tools/javac/processing/model/type/AnnotatedTypeToString/AnnotatedTypeToString.java b/test/langtools/tools/javac/processing/model/type/AnnotatedTypeToString/AnnotatedTypeToString.java index 54538e443462..6967f271dcdb 100644 --- a/test/langtools/tools/javac/processing/model/type/AnnotatedTypeToString/AnnotatedTypeToString.java +++ b/test/langtools/tools/javac/processing/model/type/AnnotatedTypeToString/AnnotatedTypeToString.java @@ -23,7 +23,7 @@ /* * @test - * @bug 8284220 + * @bug 8284220 8342934 * @summary Tests DeclaredType.toString with type annotations present, for example that '@A * Map.Entry' is printed as 'java.util.@A Map.Entry' (and not '@A java.util.Map.Entry' or * 'java.util.@A Entry'). diff --git a/test/langtools/tools/javac/processing/model/type/AnnotatedTypeToString/Test.java b/test/langtools/tools/javac/processing/model/type/AnnotatedTypeToString/Test.java index 570407a363a7..8311344ea9dd 100644 --- a/test/langtools/tools/javac/processing/model/type/AnnotatedTypeToString/Test.java +++ b/test/langtools/tools/javac/processing/model/type/AnnotatedTypeToString/Test.java @@ -32,6 +32,10 @@ @Target(ElementType.TYPE_USE) @interface A {} +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE_USE) +@interface B {} + public class Test { static class StaticNested { static class InnerMostStaticNested {} @@ -41,8 +45,8 @@ class Inner { class InnerMost {} } - @ExpectedToString("p.Test.@p.A StaticNested") - @A StaticNested i; + @ExpectedToString("p.Test.@p.A @p.B StaticNested") + @A @B StaticNested i; @ExpectedToString("p.Test.StaticNested.@p.A InnerMostStaticNested") StaticNested.@A InnerMostStaticNested j; From e967bd3422e4951eb889ea7e7c7e0919d747063c Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Fri, 10 Oct 2025 16:38:50 +0000 Subject: [PATCH 159/323] 8354561: Open source several swing tests batch0 Backport-of: a4c5ed8144376f7ba0d2cb992da63b3e53d51f8b --- .../jdk/javax/swing/JComboBox/bug4139900.java | 119 +++++++++++++++++ .../jdk/javax/swing/JComboBox/bug4174876.java | 78 +++++++++++ .../jdk/javax/swing/JComboBox/bug4474400.java | 78 +++++++++++ .../swing/border/TransparentTitleTest.java | 122 ++++++++++++++++++ 4 files changed, 397 insertions(+) create mode 100644 test/jdk/javax/swing/JComboBox/bug4139900.java create mode 100644 test/jdk/javax/swing/JComboBox/bug4174876.java create mode 100644 test/jdk/javax/swing/JComboBox/bug4474400.java create mode 100644 test/jdk/javax/swing/border/TransparentTitleTest.java diff --git a/test/jdk/javax/swing/JComboBox/bug4139900.java b/test/jdk/javax/swing/JComboBox/bug4139900.java new file mode 100644 index 000000000000..a9ed685d5ab2 --- /dev/null +++ b/test/jdk/javax/swing/JComboBox/bug4139900.java @@ -0,0 +1,119 @@ +/* + * Copyright (c) 1999, 2025, 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 4139900 + * @summary height of combobox may differ + * @key headful + * @run main bug4139900 +*/ + +import java.awt.Dimension; +import java.awt.Robot; +import java.awt.event.ActionListener; +import javax.swing.DefaultComboBoxModel; +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; + +public class bug4139900 { + static JButton button; + static JFrame frame; + static JComboBox comboBox; + static int initialHeight; + + public static void main(String[] args) throws Exception { + try { + SwingUtilities.invokeAndWait(bug4139900::init); + test(); + } finally { + SwingUtilities.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + } + + private static void test() throws Exception { + Robot robot = new Robot(); + robot.waitForIdle(); + robot.delay(500); + + SwingUtilities.invokeAndWait(() -> initialHeight = comboBox.getHeight()); + + for (int i = 0; i < 10; i++) { + SwingUtilities.invokeAndWait(() -> button.doClick()); + robot.waitForIdle(); + robot.delay(200); + SwingUtilities.invokeAndWait(() -> { + if (comboBox.getHeight() != initialHeight) { + throw new RuntimeException( + "Test failed: height differs from initial %d != %d" + .formatted(comboBox.getHeight(), initialHeight) + ); + } + }); + } + } + + public static void init() { + frame = new JFrame("bug4139900"); + + DefaultComboBoxModel model = + new DefaultComboBoxModel<>(new String[]{ + "Coma Berenices", + "Triangulum", + "Camelopardis", + "Cassiopea" + }); + + comboBox = new JComboBox<>(); + comboBox.setEditable(true); + + button = new JButton("Add/Remove Items"); + + ActionListener actionListener = e -> { + if (comboBox.getModel() == model) { + comboBox.setModel(new DefaultComboBoxModel<>()); + } else { + comboBox.setModel(model); + } + }; + + button.addActionListener(actionListener); + + JPanel panel = new JPanel(); + panel.setPreferredSize(new Dimension(300, 100)); + panel.add(comboBox); + panel.add(button); + + frame.add(panel); + frame.pack(); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } +} diff --git a/test/jdk/javax/swing/JComboBox/bug4174876.java b/test/jdk/javax/swing/JComboBox/bug4174876.java new file mode 100644 index 000000000000..349dfa4b159b --- /dev/null +++ b/test/jdk/javax/swing/JComboBox/bug4174876.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 1999, 2025, 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 4174876 + * @summary JComboBox tooltips do not work properly + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4174876 + */ + +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JPanel; + +public class bug4174876 { + private static final String INSTRUCTIONS = """ + Hold the mouse over both combo boxes. + A tool tip should appear over every area of both of them. + Notably, if you hold the mouse over the button on the right one, + a tool tip should appear. + """; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .title("TransparentTitleTest Instructions") + .instructions(INSTRUCTIONS) + .columns(40) + .splitUIBottom(bug4174876::createTestUI) + .build() + .awaitAndCheck(); + } + + private static JComponent createTestUI() { + JComboBox comboBox1 = new JComboBox<>(new String[]{ + "Coma Berenices", + "Triangulum", + "Camelopardis", + "Cassiopea" + }); + JComboBox comboBox2 = new JComboBox<>(new String[]{ + "Coma Berenices", + "Triangulum", + "Camelopardis", + "Cassiopea" + }); + + comboBox1.setToolTipText("Combo Box #1"); + comboBox2.setToolTipText("Combo Box #2"); + comboBox2.setEditable(true); + + JPanel panel = new JPanel(); + panel.add(comboBox1); + panel.add(comboBox2); + return panel; + } +} diff --git a/test/jdk/javax/swing/JComboBox/bug4474400.java b/test/jdk/javax/swing/JComboBox/bug4474400.java new file mode 100644 index 000000000000..ea52d0c71b54 --- /dev/null +++ b/test/jdk/javax/swing/JComboBox/bug4474400.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2001, 2025, 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 4474400 + * @summary Tests JTextArea wrapping with font change + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4474400 + */ + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Font; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.JTextArea; + +public class bug4474400 { + private static final String INSTRUCTIONS = """ + Press the "Change Font" button. The two lines of text should be + properly drawn using the larger font, there should be empty line + between them. If display is garbled, test fails. + """; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .title("bug4474400 Instructions") + .instructions(INSTRUCTIONS) + .columns(40) + .splitUIRight(bug4474400::createTestUI) + .build() + .awaitAndCheck(); + } + + private static JComponent createTestUI() { + Font smallFont = new Font("SansSerif", Font.PLAIN, 12); + Font largeFont = new Font("SansSerif", Font.PLAIN, 36); + + JTextArea textArea = new JTextArea("This is the first line\n\nThis is the third line"); + textArea.setFont(smallFont); + textArea.setEditable(false); + textArea.setLineWrap(true); + textArea.setWrapStyleWord(true); + + JButton b = new JButton("Change Font"); + b.addActionListener((e) -> textArea.setFont(largeFont)); + + JPanel panel = new JPanel(new BorderLayout()); + panel.setPreferredSize(new Dimension(200, 300)); + panel.add(textArea, BorderLayout.CENTER); + panel.add(b, BorderLayout.SOUTH); + + return panel; + } +} diff --git a/test/jdk/javax/swing/border/TransparentTitleTest.java b/test/jdk/javax/swing/border/TransparentTitleTest.java new file mode 100644 index 000000000000..49a32a5890c2 --- /dev/null +++ b/test/jdk/javax/swing/border/TransparentTitleTest.java @@ -0,0 +1,122 @@ +/* + * Copyright (c) 1999, 2025, 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 4154572 + * @summary Tests that the area behind a TitledBorder's title string is transparent, + * allowing the component's background to show through + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual TransparentTitleTest + */ + +import java.awt.GridLayout; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Color; +import java.awt.image.BufferedImage; +import javax.swing.ImageIcon; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.border.TitledBorder; +import javax.swing.border.LineBorder; + +public class TransparentTitleTest { + private static final String INSTRUCTIONS = """ + If all panels are correctly painted such that the title of the + border allows the underlying panel image (green rectangle) + to show through the background of the text, + then this test passes; else it fails. + """; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .title("TransparentTitleTest Instructions") + .instructions(INSTRUCTIONS) + .columns(40) + .testUI(TransparentTitleTest::createTestUI) + .build() + .awaitAndCheck(); + } + + private static JFrame createTestUI() { + JFrame frame = new JFrame("TransparentTitleTest"); + + frame.setLayout(new GridLayout(3, 6, 5, 5)); + + frame.add(new ImagePanel(TitledBorder.TOP, TitledBorder.LEFT)); + frame.add(new ImagePanel(TitledBorder.TOP, TitledBorder.CENTER)); + frame.add(new ImagePanel(TitledBorder.TOP, TitledBorder.RIGHT)); + frame.add(new ImagePanel(TitledBorder.ABOVE_TOP, TitledBorder.LEFT)); + frame.add(new ImagePanel(TitledBorder.ABOVE_TOP, TitledBorder.CENTER)); + frame.add(new ImagePanel(TitledBorder.ABOVE_TOP, TitledBorder.RIGHT)); + frame.add(new ImagePanel(TitledBorder.BELOW_TOP, TitledBorder.LEFT)); + frame.add(new ImagePanel(TitledBorder.BELOW_TOP, TitledBorder.CENTER)); + frame.add(new ImagePanel(TitledBorder.BELOW_TOP, TitledBorder.RIGHT)); + frame.add(new ImagePanel(TitledBorder.BOTTOM, TitledBorder.LEFT)); + frame.add(new ImagePanel(TitledBorder.BOTTOM, TitledBorder.CENTER)); + frame.add(new ImagePanel(TitledBorder.BOTTOM, TitledBorder.RIGHT)); + frame.add(new ImagePanel(TitledBorder.ABOVE_BOTTOM, TitledBorder.LEFT)); + frame.add(new ImagePanel(TitledBorder.ABOVE_BOTTOM, TitledBorder.CENTER)); + frame.add(new ImagePanel(TitledBorder.ABOVE_BOTTOM, TitledBorder.RIGHT)); + frame.add(new ImagePanel(TitledBorder.BELOW_BOTTOM, TitledBorder.LEFT)); + frame.add(new ImagePanel(TitledBorder.BELOW_BOTTOM, TitledBorder.CENTER)); + frame.add(new ImagePanel(TitledBorder.BELOW_BOTTOM, TitledBorder.RIGHT)); + + frame.pack(); + return frame; + } +} + +class ImagePanel extends JPanel { + + private final ImageIcon imageIcon; + + private static final BufferedImage bufferedImage = + new BufferedImage(128, 128, BufferedImage.TYPE_INT_ARGB); + + static { + Graphics g = bufferedImage.getGraphics(); + g.setColor(Color.GREEN); + g.fillRect(0, 0, 128, 128); + } + + public ImagePanel(int titlePos, int titleJust) { + imageIcon = new ImageIcon(bufferedImage); + + TitledBorder b = new TitledBorder(new LineBorder(Color.black,3), "title text"); + b.setTitlePosition(titlePos); + b.setTitleJustification(titleJust); + b.setTitleColor(Color.black); + setBorder(b); + } + + public Dimension getPreferredSize() { + return new Dimension(imageIcon.getIconWidth(), imageIcon.getIconHeight()); + } + + public void paintComponent(Graphics g) { + imageIcon.paintIcon(this, g, 0, 0); + } +} From 15cf16bb004727c13cb475145e0cf71e027944ac Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Fri, 10 Oct 2025 16:39:12 +0000 Subject: [PATCH 160/323] 8354928: Clean up and open source some miscellaneous AWT tests Backport-of: 1b8f760d1b60e63c1391dcad42753a7ebb3f80ec --- .../event/InputEvent/InputEventTimeTest.java | 115 +++++++++++++ .../event/MouseWheelEvent/HWWheelScroll.java | 160 ++++++++++++++++++ .../MouseWheelEvent/WheelEventCoord.java | 95 +++++++++++ .../MouseWheelEvent/WheelScrollEnabled.java | 129 ++++++++++++++ 4 files changed, 499 insertions(+) create mode 100644 test/jdk/java/awt/event/InputEvent/InputEventTimeTest.java create mode 100644 test/jdk/java/awt/event/MouseWheelEvent/HWWheelScroll.java create mode 100644 test/jdk/java/awt/event/MouseWheelEvent/WheelEventCoord.java create mode 100644 test/jdk/java/awt/event/MouseWheelEvent/WheelScrollEnabled.java diff --git a/test/jdk/java/awt/event/InputEvent/InputEventTimeTest.java b/test/jdk/java/awt/event/InputEvent/InputEventTimeTest.java new file mode 100644 index 000000000000..38339f8e8770 --- /dev/null +++ b/test/jdk/java/awt/event/InputEvent/InputEventTimeTest.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 1999, 2025, 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 4176525 + * @summary InputEvent.getWhen() returns the wrong event time. + * @key headful + * @run main InputEventTimeTest + */ + +import java.awt.AWTEvent; +import java.awt.AWTException; +import java.awt.Dimension; +import java.awt.EventQueue; +import java.awt.Frame; +import java.awt.Point; +import java.awt.Robot; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; +import java.lang.reflect.InvocationTargetException; +import java.util.Date; + +public class InputEventTimeTest extends Frame { + public void initUI() { + setTitle("Input Event Time Test"); + enableEvents(AWTEvent.MOUSE_EVENT_MASK); + enableEvents(AWTEvent.KEY_EVENT_MASK); + setSize(200, 200); + setLocationRelativeTo(null); + setVisible(true); + } + + public void center(Point point) { + Point loc = getLocationOnScreen(); + Dimension size = getSize(); + point.setLocation(loc.x + (size.width / 2), loc.y + (size.height / 2)); + } + + public void processEvent(AWTEvent e) { + long currentTime; + long eventTime; + long difference; + + if (!(e instanceof InputEvent)) { + return; + } + + currentTime = (new Date()).getTime(); + eventTime = ((InputEvent) e).getWhen(); + difference = currentTime - eventTime; + + if ((difference > 5000) || (difference < -5000)) { + throw new RuntimeException("The difference between current time" + + " and event creation time is " + difference + "ms"); + } + } + + public static void main(String[] args) throws InterruptedException, + InvocationTargetException, AWTException { + InputEventTimeTest test = new InputEventTimeTest(); + try { + EventQueue.invokeAndWait(test::initUI); + Robot robot = new Robot(); + robot.setAutoDelay(50); + robot.waitForIdle(); + robot.delay(1000); + Point center = new Point(); + EventQueue.invokeAndWait(() -> test.center(center)); + robot.mouseMove(center.x, center.y); + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + robot.waitForIdle(); + robot.mousePress(InputEvent.BUTTON2_DOWN_MASK); + robot.mouseRelease(InputEvent.BUTTON2_DOWN_MASK); + robot.waitForIdle(); + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + robot.waitForIdle(); + for (int i = 0; i < 6; i++) { + robot.keyPress(KeyEvent.VK_A + i); + robot.keyRelease(KeyEvent.VK_A + i); + robot.waitForIdle(); + } + for (int i = 0; i < 150; i += 5) { + robot.mouseMove(center.x - i, center.y - i); + } + for (int i = 150; i > 0; i -= 5) { + robot.mouseMove(center.x - i, center.y - i); + } + } finally { + EventQueue.invokeAndWait(test::dispose); + } + } +} diff --git a/test/jdk/java/awt/event/MouseWheelEvent/HWWheelScroll.java b/test/jdk/java/awt/event/MouseWheelEvent/HWWheelScroll.java new file mode 100644 index 000000000000..2851ff668fe6 --- /dev/null +++ b/test/jdk/java/awt/event/MouseWheelEvent/HWWheelScroll.java @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2001, 2025, 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 4425654 + * @summary Test wheel scrolling of heavyweight components + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual HWWheelScroll + */ + +import java.awt.Choice; +import java.awt.FileDialog; +import java.awt.Frame; +import java.awt.List; +import java.awt.TextArea; +import java.awt.Window; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; + +public class HWWheelScroll { + public static final int TEXT_TALL = 0; + public static final int TEXT_WIDE = 1; + public static final int TEXT_SMALL = 2; + public static final int TEXT_BIG = 3; + static String INSTRUCTIONS = """ + Test for mouse wheel scrolling of heavyweight components with built-in + scrollbars or similar functionality that is controlled by guestures + such as Apple Magic Mouse or trackpad scrolling guesture. + Several windows containing either a TextArea, List, Choice, or a + FileDialog will appear. For each window, use the mouse wheel to + scroll its content, and then minimize it or move away + and continue with the next window. + Do not close any of the opened windows except the FileDialog. + For the FileDialog, first change to a directory with enough items that a + scrollbar appears. + Some of the other windows don't have enough text to warrant scrollbars, + but should be tested anyway to make sure no crash or hang occurs. + If all scrollbars scroll correctly, press "Pass", otherwise press "Fail". + """; + + public static ArrayList initUI() { + ArrayList retValue = new ArrayList<>(); + retValue.add(makeTextFrame(TextArea.SCROLLBARS_BOTH, TEXT_BIG)); + retValue.add(makeTextFrame(TextArea.SCROLLBARS_BOTH, TEXT_TALL)); + retValue.add(makeTextFrame(TextArea.SCROLLBARS_BOTH, TEXT_SMALL)); + retValue.add(makeTextFrame(TextArea.SCROLLBARS_BOTH, TEXT_WIDE)); + retValue.add(makeTextFrame(TextArea.SCROLLBARS_VERTICAL_ONLY, TEXT_TALL)); + retValue.add(makeTextFrame(TextArea.SCROLLBARS_VERTICAL_ONLY, TEXT_SMALL)); + retValue.add(makeTextFrame(TextArea.SCROLLBARS_HORIZONTAL_ONLY, TEXT_SMALL)); + retValue.add(makeTextFrame(TextArea.SCROLLBARS_HORIZONTAL_ONLY, TEXT_WIDE)); + retValue.add(makeListFrame(TEXT_TALL)); + retValue.add(makeListFrame(TEXT_WIDE)); + retValue.add(makeListFrame(TEXT_SMALL)); + Frame f = new Frame("File Dialog Owner"); + f.setSize(150, 150); + f.setLocationRelativeTo(null); + FileDialog fd = new FileDialog(f, "FileDialog"); + fd.setDirectory("."); + retValue.add(fd); + retValue.add(f); + Frame choiceFrame = new Frame("Choice"); + Choice c = new Choice(); + for (int i = 0; i < 50; i++) { + c.add(i + " choice item"); + } + choiceFrame.add(c); + choiceFrame.setSize(150, 150); + choiceFrame.setLocationRelativeTo(null); + retValue.add(choiceFrame); + return retValue; + } + + public static Frame makeTextFrame(int policy, int textShape) { + Frame f = new Frame("TextArea"); + f.add(makeTextArea(policy, textShape)); + f.setSize(150, 150); + f.setLocationRelativeTo(null); + return f; + } + + public static Frame makeListFrame(int textShape) { + Frame f = new Frame("List"); + f.add(makeList(textShape)); + f.setSize(150, 150); + f.setLocationRelativeTo(null); + return f; + } + + public static TextArea makeTextArea(int policy, int textShape) { + TextArea ta = new TextArea("", 0, 0, policy); + if (textShape == TEXT_TALL) { + for (int i = 0; i < 50 ; i++) { + ta.append(i + "\n"); + } + } else if (textShape == TEXT_WIDE) { + for (int i = 0; i < 2; i++) { + ta.append(i + "very, very, very, very, very, very, very, long line of text number\n"); + } + } else if (textShape == TEXT_SMALL) { + ta.append("text"); + } else if (textShape == TEXT_BIG) { + for (int i = 0; i < 50 ; i++) { + ta.append(i + "very, very, very, very, very, very, very, long line of text number\n"); + } + } + return ta; + } + + public static List makeList(int textShape) { + java.awt.List l = new java.awt.List(); + if (textShape == TEXT_TALL) { + for (int i = 0; i < 50 ; i++) { + l.add(" " + i + " "); + } + } else if (textShape == TEXT_WIDE) { + for (int i = 0; i < 2 ; i++) { + l.add(i + "very, very, very, very, very, very, very, long line of text number"); + } + } else if (textShape == TEXT_SMALL) { + l.add("text"); + } else if (textShape == TEXT_BIG) { + for (int i = 0; i < 50 ; i++) { + l.add(i + "very, very, very, very, very, very, very, long line of text number"); + } + } + return l; + } + + public static void main(String[] args) throws InterruptedException, + InvocationTargetException { + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .logArea(10) + .testUI(HWWheelScroll::initUI) + .build() + .awaitAndCheck(); + } +} diff --git a/test/jdk/java/awt/event/MouseWheelEvent/WheelEventCoord.java b/test/jdk/java/awt/event/MouseWheelEvent/WheelEventCoord.java new file mode 100644 index 000000000000..418151d3798f --- /dev/null +++ b/test/jdk/java/awt/event/MouseWheelEvent/WheelEventCoord.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2001, 2025, 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 4492456 + * @summary MouseWheelEvent coordinates are wrong + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual WheelEventCoord + */ + +import java.awt.Button; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.GridLayout; +import java.lang.reflect.InvocationTargetException; + +public class WheelEventCoord extends Frame { + static String INSTRUCTIONS = """ + This test requires mouse with scrolling wheel or device, + that has capability to simulate scrolling wheel with gestures + such as Apple mouse or a trackpad with gesture control. + If you do not have such device press "Pass". + Move mouse to the top of the button named "Button 1". + While constantly turning mouse wheel up and down slowly move + mouse cursor until it reaches bottom of the button named "Button 3". + While doing so look at the log area. + If despite the wheel direction y coordinate is steadily increases + as you move the mouse down press "Pass". + If y coordinate decreases when cursor is moving down or suddenly jumps + by more than 50 points when crossing to another button press "Fail". + """; + + public WheelEventCoord() { + super("Wheel Event Coordinates"); + setLayout(new GridLayout(3, 1)); + + add(new BigButton("Button 1")); + add(new BigButton("Button 2")); + add(new BigButton("Button 3")); + + addMouseWheelListener(e -> PassFailJFrame.log("Mouse y coordinate = " + e.getY())); + pack(); + } + + public static void main(String[] args) throws InterruptedException, + InvocationTargetException { + PassFailJFrame.builder() + .title("Wheel Event Coordinates Instructions") + .instructions(INSTRUCTIONS) + .logArea(10) + .testUI(WheelEventCoord::new) + .build() + .awaitAndCheck(); + } +} + +class BigButton extends Button { + public BigButton(String label) { + super(label); + } + + public Dimension getPreferredSize() { + return new Dimension(300, 100); + } + + public Dimension getMinimumSize() { + return getPreferredSize(); + } + + public Dimension getMaximumSize() { + return getPreferredSize(); + } +} diff --git a/test/jdk/java/awt/event/MouseWheelEvent/WheelScrollEnabled.java b/test/jdk/java/awt/event/MouseWheelEvent/WheelScrollEnabled.java new file mode 100644 index 000000000000..cbdd7676e94a --- /dev/null +++ b/test/jdk/java/awt/event/MouseWheelEvent/WheelScrollEnabled.java @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2000, 2025, 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 4372477 + * @summary Test disabling of wheel scrolling + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual WheelScrollEnabled + */ + +import java.awt.BorderLayout; +import java.awt.Checkbox; +import java.awt.Frame; +import java.awt.GridLayout; +import java.awt.Label; +import java.awt.Panel; +import java.awt.ScrollPane; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.awt.event.MouseWheelEvent; +import java.awt.event.MouseWheelListener; +import java.lang.reflect.InvocationTargetException; + +public class WheelScrollEnabled extends Frame { + static String INSTRUCTIONS = """ + This test requires mouse with a scrolling wheel or + device that is able to simulate scrolling using gestures. + If you do not have such device press "Pass" to skip testing. + You should see a ScrollPane with some labels in it and two checkboxes. + For each of the four combinations of the two checkboxes, + move the cursor over the ScrollPane and rotate the mouse wheel. + When (and ONLY when) the 'WheelListener added' checkbox is checked, + scrolling the mouse wheel should produce a text message in the log area. + When (and ONLY when) the 'Wheel scrolling enabled' checkbox is checked, + the ScrollPane should scroll when mouse wheel is scrolled on top of it. + If all four checkbox combinations work properly press "Pass", + otherwise press "Fail". + """; + MouseWheelListener mwl; + Checkbox cb; + Checkbox cb2; + ScrollPane sp; + + public WheelScrollEnabled() { + setLayout(new BorderLayout()); + Panel pnl = new Panel(); + pnl.setLayout(new GridLayout(10, 10)); + for (int i = 0; i < 100; i++) { + pnl.add(new Label("Label " + i)); + } + sp = new ScrollPane(); + sp.add(pnl); + sp.setWheelScrollingEnabled(false); + mwl = new MouseWheelListener() { + int i; + @Override + public void mouseWheelMoved(MouseWheelEvent e) { + PassFailJFrame.log("mouseWheelMoved " + i++); + } + }; + sp.addMouseWheelListener(mwl); + add(sp, BorderLayout.CENTER); + + Panel pl2 = new Panel(); + ItemListener il = new ControlListener(); + + cb = new Checkbox("WheelListener added", true); + cb.addItemListener(il); + pl2.add(cb); + + cb2 = new Checkbox("Wheel scrolling enabled", false); + cb2.addItemListener(il); + pl2.add(cb2); + + add(pl2, BorderLayout.SOUTH); + setSize(400, 200); + } + + class ControlListener implements ItemListener { + public void itemStateChanged(ItemEvent e) { + if (e.getSource() == cb) { + boolean state = cb.getState(); + if (state) { + sp.addMouseWheelListener(mwl); + } + else { + sp.removeMouseWheelListener(mwl); + } + } + if (e.getSource() == cb2) { + sp.setWheelScrollingEnabled(cb2.getState()); + } + } + } + + public static void main(String[] args) throws InterruptedException, + InvocationTargetException { + PassFailJFrame.builder() + .title("Wheel Scroll Enabled Instructions") + .instructions(INSTRUCTIONS) + .logArea(10) + .testUI(WheelScrollEnabled::new) + .build() + .awaitAndCheck(); + } +} + From 8eed49bb95b96f517387a92790eefa6ab565af5d Mon Sep 17 00:00:00 2001 From: SendaoYan Date: Mon, 13 Oct 2025 09:34:52 +0000 Subject: [PATCH 161/323] 8366359: Test should throw SkippedException when there is no lpstat Backport-of: f23c150709fbd6d9b84261a7c99b67d7d08334b9 --- .../CountPrintServices.java | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/test/jdk/javax/print/PrintServiceLookup/CountPrintServices.java b/test/jdk/javax/print/PrintServiceLookup/CountPrintServices.java index 5be9f0297d28..4da1ed59a27e 100644 --- a/test/jdk/javax/print/PrintServiceLookup/CountPrintServices.java +++ b/test/jdk/javax/print/PrintServiceLookup/CountPrintServices.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2025, 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 @@ -25,25 +25,21 @@ import java.io.InputStreamReader; import javax.print.PrintService; import javax.print.PrintServiceLookup; -import javax.print.attribute.AttributeSet; -import javax.print.attribute.HashAttributeSet; -import javax.print.attribute.standard.PrinterName; +import java.io.IOException; + +import jtreg.SkippedException; /* * @test * @bug 8032693 * @key printer + * @library /test/lib/ + * @requires (os.family == "linux") * @summary Test that lpstat and JDK agree whether there are printers. */ public class CountPrintServices { public static void main(String[] args) throws Exception { - String os = System.getProperty("os.name").toLowerCase(); - System.out.println("OS is " + os); - if (!os.equals("linux")) { - System.out.println("Linux specific test. No need to continue"); - return; - } PrintService services[] = PrintServiceLookup.lookupPrintServices(null, null); if (services.length > 0) { @@ -51,7 +47,16 @@ public static void main(String[] args) throws Exception { return; } String[] lpcmd = { "lpstat", "-a" }; - Process proc = Runtime.getRuntime().exec(lpcmd); + Process proc; + try { + proc = Runtime.getRuntime().exec(lpcmd); + } catch (IOException e) { + if (e.getMessage().contains("No such file or directory")) { + throw new SkippedException("Cannot find lpstat"); + } else { + throw e; + } + } proc.waitFor(); InputStreamReader ir = new InputStreamReader(proc.getInputStream()); BufferedReader br = new BufferedReader(ir); @@ -66,4 +71,3 @@ public static void main(String[] args) throws Exception { } } } - From 5caeb94c7ec619a30dd7d24010f3c933a8fb5e2a Mon Sep 17 00:00:00 2001 From: Christoph Langer Date: Mon, 13 Oct 2025 12:02:30 +0000 Subject: [PATCH 162/323] 8344577: Virtual thread tests are timing out on some macOS systems 8344143: Test jdk/java/lang/Thread/virtual/stress/GetStackTraceALotWhenPinned.java timed out on macosx-x64 Reviewed-by: mbaesken Backport-of: a032de2904baf83143415858ed7191549c659035 --- .../stress/GetStackTraceALotWhenPinned.java | 30 +++++++++++---- .../lang/Thread/virtual/stress/ParkALot.java | 37 ++++++++++++++----- .../lang/Thread/virtual/stress/SleepALot.java | 2 +- 3 files changed, 51 insertions(+), 18 deletions(-) diff --git a/test/jdk/java/lang/Thread/virtual/stress/GetStackTraceALotWhenPinned.java b/test/jdk/java/lang/Thread/virtual/stress/GetStackTraceALotWhenPinned.java index 35986718a38c..b081d261529c 100644 --- a/test/jdk/java/lang/Thread/virtual/stress/GetStackTraceALotWhenPinned.java +++ b/test/jdk/java/lang/Thread/virtual/stress/GetStackTraceALotWhenPinned.java @@ -36,12 +36,13 @@ * @requires vm.debug == true * @modules java.base/java.lang:+open * @library /test/lib - * @run main/othervm/timeout=300 GetStackTraceALotWhenPinned 200000 + * @run main/othervm/timeout=300 GetStackTraceALotWhenPinned 50000 */ import java.time.Instant; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.LockSupport; +import jdk.test.lib.Platform; import jdk.test.lib.thread.VThreadRunner; import jdk.test.lib.thread.VThreadPinner; @@ -53,7 +54,15 @@ public static void main(String[] args) throws Exception { VThreadRunner.ensureParallelism(2); } - int iterations = Integer.parseInt(args[0]); + int iterations; + int value = Integer.parseInt(args[0]); + if (Platform.isOSX() && Platform.isX64()) { + // reduced iterations on macosx-x64 + iterations = Math.max(value / 4, 1); + } else { + iterations = value; + } + var barrier = new Barrier(2); // Start a virtual thread that loops doing Thread.yield and parking while pinned. @@ -78,18 +87,23 @@ public static void main(String[] args) throws Exception { } }); - long lastTimestamp = System.currentTimeMillis(); - for (int i = 0; i < iterations; i++) { + long lastTime = System.nanoTime(); + for (int i = 1; i <= iterations; i++) { // wait for virtual thread to arrive barrier.await(); thread.getStackTrace(); LockSupport.unpark(thread); - long currentTime = System.currentTimeMillis(); - if ((currentTime - lastTimestamp) > 500) { - System.out.format("%s %d remaining ...%n", Instant.now(), (iterations - i)); - lastTimestamp = currentTime; + long currentTime = System.nanoTime(); + if (i == iterations || ((currentTime - lastTime) > 1_000_000_000L)) { + System.out.format("%s => %d of %d%n", Instant.now(), i, iterations); + lastTime = currentTime; + } + + if (Thread.currentThread().isInterrupted()) { + // fail quickly if interrupted by jtreg + throw new RuntimeException("interrupted"); } } } diff --git a/test/jdk/java/lang/Thread/virtual/stress/ParkALot.java b/test/jdk/java/lang/Thread/virtual/stress/ParkALot.java index ccba3fe1b4d3..882e0b881bc2 100644 --- a/test/jdk/java/lang/Thread/virtual/stress/ParkALot.java +++ b/test/jdk/java/lang/Thread/virtual/stress/ParkALot.java @@ -25,29 +25,35 @@ * @test * @summary Stress test parking and unparking * @requires vm.debug != true - * @run main/othervm ParkALot 500000 + * @library /test/lib + * @run main/othervm/timeout=300 ParkALot 300000 */ /* * @test * @requires vm.debug == true - * @run main/othervm ParkALot 100000 + * @library /test/lib + * @run main/othervm/timeout=300 ParkALot 100000 */ import java.time.Instant; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.LockSupport; +import jdk.test.lib.Platform; public class ParkALot { - private static final int ITERATIONS = 1_000_000; - public static void main(String[] args) { + public static void main(String[] args) throws Exception { int iterations; - if (args.length > 0) { - iterations = Integer.parseInt(args[0]); + int value = Integer.parseInt(args[0]); + if (Platform.isOSX() && Platform.isX64()) { + // reduced iterations on macosx-x64 + iterations = Math.max(value / 4, 1); } else { - iterations = ITERATIONS; + iterations = value; } int maxThreads = Math.clamp(Runtime.getRuntime().availableProcessors() / 2, 1, 4); @@ -55,8 +61,18 @@ public static void main(String[] args) { System.out.format("%s %d thread(s) ...%n", Instant.now(), nthreads); ThreadFactory factory = Thread.ofPlatform().factory(); try (var executor = Executors.newThreadPerTaskExecutor(factory)) { + var totalIterations = new AtomicInteger(); for (int i = 0; i < nthreads; i++) { - executor.submit(() -> parkALot(iterations)); + executor.submit(() -> parkALot(iterations, totalIterations::incrementAndGet)); + } + + // shutdown, await for all threads to finish with progress output + executor.shutdown(); + boolean terminated = false; + while (!terminated) { + terminated = executor.awaitTermination(1, TimeUnit.SECONDS); + System.out.format("%s => %d of %d%n", + Instant.now(), totalIterations.get(), iterations * nthreads); } } System.out.format("%s %d thread(s) done%n", Instant.now(), nthreads); @@ -66,8 +82,10 @@ public static void main(String[] args) { /** * Creates a virtual thread that alternates between untimed and timed parking. * A platform thread spins unparking the virtual thread. + * @param iterations number of iterations + * @param afterIteration the task to run after each iteration */ - private static void parkALot(int iterations) { + private static void parkALot(int iterations, Runnable afterIteration) { Thread vthread = Thread.ofVirtual().start(() -> { int i = 0; boolean timed = false; @@ -80,6 +98,7 @@ private static void parkALot(int iterations) { timed = true; } i++; + afterIteration.run(); } }); diff --git a/test/jdk/java/lang/Thread/virtual/stress/SleepALot.java b/test/jdk/java/lang/Thread/virtual/stress/SleepALot.java index 12771ab499a7..a2b8d0937346 100644 --- a/test/jdk/java/lang/Thread/virtual/stress/SleepALot.java +++ b/test/jdk/java/lang/Thread/virtual/stress/SleepALot.java @@ -25,7 +25,7 @@ * @test * @summary Stress test Thread.sleep * @requires vm.debug != true & vm.continuations - * @run main/othervm SleepALot 500000 + * @run main SleepALot 500000 */ /* From db7291f610fe39cf859d3b2e1b4e29a49092638b Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 13 Oct 2025 15:12:20 +0000 Subject: [PATCH 163/323] 8369078: Fix faulty test conversion in IllegalCharsetName.java Reviewed-by: jlu Backport-of: 0f406c420e35f7a4358dc99711fd23d162f21777 --- test/jdk/java/nio/charset/Charset/IllegalCharsetName.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/jdk/java/nio/charset/Charset/IllegalCharsetName.java b/test/jdk/java/nio/charset/Charset/IllegalCharsetName.java index 266801cf52b7..9f2879a3ff09 100644 --- a/test/jdk/java/nio/charset/Charset/IllegalCharsetName.java +++ b/test/jdk/java/nio/charset/Charset/IllegalCharsetName.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2025, 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,7 +50,7 @@ public void illegalCharsetsTest(String name) { assertThrows(IllegalCharsetNameException.class, () -> Charset.forName(name)); assertThrows(IllegalCharsetNameException.class, - () -> Charset.forName(name)); + () -> Charset.isSupported(name)); } // Charset.forName, Charset.isSupported, and the Charset constructor should @@ -60,7 +60,7 @@ public void emptyCharsetsTest() { assertThrows(IllegalCharsetNameException.class, () -> Charset.forName("")); assertThrows(IllegalCharsetNameException.class, - () -> Charset.forName("")); + () -> Charset.isSupported("")); assertThrows(IllegalCharsetNameException.class, () -> new Charset("", new String[]{}) { @Override From fad4e509010633cd916f6243cac81b7193a66344 Mon Sep 17 00:00:00 2001 From: Rui Li Date: Mon, 13 Oct 2025 16:12:11 +0000 Subject: [PATCH 164/323] 8362533: Tests sun/management/jmxremote/bootstrap/* duplicate VM flags Backport-of: 458f033d4dd3c646028b2f9bab88f9a308cad4af --- .../bootstrap/AbstractFilePermissionTest.java | 7 +------ .../jmxremote/bootstrap/LocalManagementTest.java | 12 ++---------- .../jmxremote/bootstrap/RmiRegistrySslTest.java | 6 +----- 3 files changed, 4 insertions(+), 21 deletions(-) diff --git a/test/jdk/sun/management/jmxremote/bootstrap/AbstractFilePermissionTest.java b/test/jdk/sun/management/jmxremote/bootstrap/AbstractFilePermissionTest.java index ddbca2c444de..7d1756be0625 100644 --- a/test/jdk/sun/management/jmxremote/bootstrap/AbstractFilePermissionTest.java +++ b/test/jdk/sun/management/jmxremote/bootstrap/AbstractFilePermissionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2025, 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 @@ -35,7 +35,6 @@ import java.nio.file.attribute.PosixFilePermission; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -47,7 +46,6 @@ * @author Taras Ledkov */ public abstract class AbstractFilePermissionTest { - private final String TEST_CLASS_PATH = System.getProperty("test.class.path"); protected final String TEST_CLASSES = System.getProperty("test.classes"); protected final FileSystem FS = FileSystems.getDefault(); private int MAX_GET_FREE_PORT_TRIES = 10; @@ -169,11 +167,8 @@ private int doTest() throws Exception { final String pp = "-Dcom.sun.management.jmxremote.port=" + jdk.test.lib.Utils.getFreePort(); List command = new ArrayList<>(); - Collections.addAll(command, jdk.test.lib.Utils.getTestJavaOpts()); command.add(mp); command.add(pp); - command.add("-cp"); - command.add(TEST_CLASSES); command.add(className); ProcessBuilder processBuilder = ProcessTools.createTestJavaProcessBuilder(command); diff --git a/test/jdk/sun/management/jmxremote/bootstrap/LocalManagementTest.java b/test/jdk/sun/management/jmxremote/bootstrap/LocalManagementTest.java index 0a7c735e2e0b..b6e478528d97 100644 --- a/test/jdk/sun/management/jmxremote/bootstrap/LocalManagementTest.java +++ b/test/jdk/sun/management/jmxremote/bootstrap/LocalManagementTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,12 +24,10 @@ import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicReference; import jdk.test.lib.process.ProcessTools; -import jdk.test.lib.Utils; /** * @test @@ -48,7 +46,6 @@ * @run main/othervm/timeout=300 LocalManagementTest */ public class LocalManagementTest { - private static final String TEST_CLASSPATH = System.getProperty("test.class.path"); public static void main(String[] args) throws Exception { int failures = 0; @@ -99,16 +96,13 @@ private static boolean test5() throws Exception { private static boolean doTest(String testId, String arg) throws Exception { List args = new ArrayList<>(); args.add("-XX:+UsePerfData"); - Collections.addAll(args, Utils.getTestJavaOpts()); - args.add("-cp"); - args.add(TEST_CLASSPATH); if (arg != null) { args.add(arg); } args.add("TestApplication"); ProcessBuilder server = ProcessTools.createTestJavaProcessBuilder( - args.toArray(new String[args.size()]) + args.toArray(new String[0]) ); Process serverPrc = null, clientPrc = null; @@ -134,8 +128,6 @@ private static boolean doTest(String testId, String arg) throws Exception { System.out.println(" shutdown port : " + port.get()); ProcessBuilder client = ProcessTools.createTestJavaProcessBuilder( - "-cp", - TEST_CLASSPATH, "--add-exports", "jdk.management.agent/jdk.internal.agent=ALL-UNNAMED", "TestManager", String.valueOf(serverPrc.pid()), diff --git a/test/jdk/sun/management/jmxremote/bootstrap/RmiRegistrySslTest.java b/test/jdk/sun/management/jmxremote/bootstrap/RmiRegistrySslTest.java index 6cc5708b385b..1aa20937962d 100644 --- a/test/jdk/sun/management/jmxremote/bootstrap/RmiRegistrySslTest.java +++ b/test/jdk/sun/management/jmxremote/bootstrap/RmiRegistrySslTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2025, 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 @@ -28,7 +28,6 @@ import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; -import java.net.BindException; import java.nio.charset.Charset; import java.nio.file.FileSystem; import java.nio.file.FileSystems; @@ -180,12 +179,9 @@ private int doTest(String... args) throws Exception { initTestEnvironment(); List command = new ArrayList<>(); - Collections.addAll(command, Utils.getTestJavaOpts()); command.add("-Dtest.src=" + TEST_SRC); command.add("-Dtest.rmi.port=" + port); command.addAll(Arrays.asList(args)); - command.add("-cp"); - command.add(TEST_CLASS_PATH); command.add(className); ProcessBuilder processBuilder = ProcessTools.createTestJavaProcessBuilder(command); From fc30d8a121e1d1228e8ec0b41d467503e46e0138 Mon Sep 17 00:00:00 2001 From: Matthias Baesken Date: Mon, 13 Oct 2025 17:33:21 +0000 Subject: [PATCH 165/323] 8365442: [asan] runtime/ErrorHandling/CreateCoredumpOnCrash.java fails Backport-of: e5ec464120bec50ab111ee32dfb930f26150b109 --- .../jtreg/runtime/ErrorHandling/CreateCoredumpOnCrash.java | 1 + 1 file changed, 1 insertion(+) diff --git a/test/hotspot/jtreg/runtime/ErrorHandling/CreateCoredumpOnCrash.java b/test/hotspot/jtreg/runtime/ErrorHandling/CreateCoredumpOnCrash.java index 73efc0e5e460..e9bc29f1d1b2 100644 --- a/test/hotspot/jtreg/runtime/ErrorHandling/CreateCoredumpOnCrash.java +++ b/test/hotspot/jtreg/runtime/ErrorHandling/CreateCoredumpOnCrash.java @@ -29,6 +29,7 @@ * java.management * jdk.internal.jvmstat/sun.jvmstat.monitor * @run driver CreateCoredumpOnCrash + * @requires !vm.asan */ import jdk.test.lib.process.ProcessTools; From 474ac4bc2b767a71d50285e2549ba7088e5a1f03 Mon Sep 17 00:00:00 2001 From: Sergey Chernyshev Date: Mon, 13 Oct 2025 17:38:38 +0000 Subject: [PATCH 166/323] 8354475: TestDockerMemoryMetricsSubgroup.java fails with exitValue = 1 Backport-of: e579cca619147aa51563dc00f374e02db49e1238 --- .../TestDockerMemoryMetricsSubgroup.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetricsSubgroup.java b/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetricsSubgroup.java index 57df7b1adbbd..c6b943708071 100644 --- a/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetricsSubgroup.java +++ b/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetricsSubgroup.java @@ -22,6 +22,7 @@ */ import jdk.internal.platform.Metrics; +import jdk.test.lib.Container; import jdk.test.lib.Utils; import jdk.test.lib.containers.docker.Common; import jdk.test.lib.containers.docker.DockerfileConfig; @@ -50,6 +51,19 @@ public class TestDockerMemoryMetricsSubgroup { DockerfileConfig.getBaseImageName() + ":" + DockerfileConfig.getBaseImageVersion(); + static String getEngineInfo(String format) throws Exception { + return DockerTestUtils.execute(Container.ENGINE_COMMAND, "info", "-f", format) + .getStdout(); + } + + static boolean isRootless() throws Exception { + // Docker and Podman have different INFO structures. + // The node path for Podman is .Host.Security.Rootless, that also holds for + // Podman emulating Docker CLI. The node path for Docker is .SecurityOptions. + return (getEngineInfo("{{.Host.Security.Rootless}}").contains("true") || + getEngineInfo("{{.SecurityOptions}}").contains("name=rootless")); + } + public static void main(String[] args) throws Exception { Metrics metrics = Metrics.systemMetrics(); if (metrics == null) { @@ -63,6 +77,10 @@ public static void main(String[] args) throws Exception { ContainerRuntimeVersionTestUtils.checkContainerVersionSupported(); + if (isRootless()) { + throw new SkippedException("Test skipped in rootless mode"); + } + if ("cgroupv1".equals(metrics.getProvider())) { testMemoryLimitSubgroupV1("200m", "400m", false); testMemoryLimitSubgroupV1("500m", "1G", false); From 748f0c256cd4a4a97eebbe8122556b700fdb06ca Mon Sep 17 00:00:00 2001 From: Sergey Bylokhov Date: Mon, 13 Oct 2025 19:05:01 +0000 Subject: [PATCH 167/323] 8367384: The ICC_Profile class may throw exceptions during serialization Backport-of: 0e98ec36623d5d83172209058574a97bab1d6038 --- .../classes/java/awt/color/ICC_Profile.java | 41 +++----- .../SerializationSpecTest.java | 99 ++++++++++++++++++ .../SerializationSpecTest/empty.ser | Bin 0 -> 130 bytes .../SerializationSpecTest/invalid.ser | Bin 0 -> 141 bytes .../SerializationSpecTest/invalid_invalid.ser | Bin 0 -> 142 bytes .../SerializationSpecTest/invalid_null.ser | Bin 0 -> 142 bytes .../SerializationSpecTest/invalid_valid.ser | Bin 0 -> 7040 bytes .../invalid_wrongType.ser | Bin 0 -> 218 bytes .../SerializationSpecTest/null.ser | Bin 0 -> 131 bytes .../SerializationSpecTest/null_invalid.ser | Bin 0 -> 7030 bytes .../SerializationSpecTest/null_null.ser | Bin 0 -> 132 bytes .../SerializationSpecTest/null_valid.ser | Bin 0 -> 7030 bytes .../SerializationSpecTest/null_wrongType.ser | Bin 0 -> 208 bytes .../SerializationSpecTest/valid.ser | Bin 0 -> 140 bytes .../SerializationSpecTest/valid_invalid.ser | Bin 0 -> 141 bytes .../SerializationSpecTest/valid_null.ser | Bin 0 -> 141 bytes .../SerializationSpecTest/valid_valid.ser | Bin 0 -> 7039 bytes .../SerializationSpecTest/valid_wrongType.ser | Bin 0 -> 217 bytes .../SerializationSpecTest/wrongType.ser | Bin 0 -> 207 bytes .../wrongType_invalid.ser | Bin 0 -> 7106 bytes .../SerializationSpecTest/wrongType_null.ser | Bin 0 -> 208 bytes .../SerializationSpecTest/wrongType_valid.ser | Bin 0 -> 208 bytes .../wrongType_wrongType.ser | Bin 0 -> 217 bytes .../StandardProfilesRoundTrip.java | 73 +++++++++++++ .../ValidateICCHeaderData.java | 10 +- 25 files changed, 191 insertions(+), 32 deletions(-) create mode 100644 test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/SerializationSpecTest.java create mode 100644 test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/empty.ser create mode 100644 test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/invalid.ser create mode 100644 test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/invalid_invalid.ser create mode 100644 test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/invalid_null.ser create mode 100644 test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/invalid_valid.ser create mode 100644 test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/invalid_wrongType.ser create mode 100644 test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/null.ser create mode 100644 test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/null_invalid.ser create mode 100644 test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/null_null.ser create mode 100644 test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/null_valid.ser create mode 100644 test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/null_wrongType.ser create mode 100644 test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/valid.ser create mode 100644 test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/valid_invalid.ser create mode 100644 test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/valid_null.ser create mode 100644 test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/valid_valid.ser create mode 100644 test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/valid_wrongType.ser create mode 100644 test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/wrongType.ser create mode 100644 test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/wrongType_invalid.ser create mode 100644 test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/wrongType_null.ser create mode 100644 test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/wrongType_valid.ser create mode 100644 test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/wrongType_wrongType.ser create mode 100644 test/jdk/java/awt/color/ICC_Profile/Serialization/StandardProfilesRoundTrip.java diff --git a/src/java.desktop/share/classes/java/awt/color/ICC_Profile.java b/src/java.desktop/share/classes/java/awt/color/ICC_Profile.java index 4fb8b179e926..cad022557db0 100644 --- a/src/java.desktop/share/classes/java/awt/color/ICC_Profile.java +++ b/src/java.desktop/share/classes/java/awt/color/ICC_Profile.java @@ -42,6 +42,7 @@ import java.io.FilePermission; import java.io.IOException; import java.io.InputStream; +import java.io.InvalidObjectException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.ObjectStreamException; @@ -1556,33 +1557,19 @@ private void writeObject(ObjectOutputStream s) throws IOException { private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { s.defaultReadObject(); - - String csName = (String) s.readObject(); - byte[] data = (byte[]) s.readObject(); - - int cspace = 0; // ColorSpace.CS_* constant if known - boolean isKnownPredefinedCS = false; - if (csName != null) { - isKnownPredefinedCS = true; - if (csName.equals("CS_sRGB")) { - cspace = ColorSpace.CS_sRGB; - } else if (csName.equals("CS_CIEXYZ")) { - cspace = ColorSpace.CS_CIEXYZ; - } else if (csName.equals("CS_PYCC")) { - cspace = ColorSpace.CS_PYCC; - } else if (csName.equals("CS_GRAY")) { - cspace = ColorSpace.CS_GRAY; - } else if (csName.equals("CS_LINEAR_RGB")) { - cspace = ColorSpace.CS_LINEAR_RGB; - } else { - isKnownPredefinedCS = false; - } - } - - if (isKnownPredefinedCS) { - resolvedDeserializedProfile = getInstance(cspace); - } else { - resolvedDeserializedProfile = getInstance(data); + try { + String csName = (String) s.readObject(); + byte[] data = (byte[]) s.readObject(); + resolvedDeserializedProfile = switch (csName) { + case "CS_sRGB" -> getInstance(ColorSpace.CS_sRGB); + case "CS_CIEXYZ" -> getInstance(ColorSpace.CS_CIEXYZ); + case "CS_PYCC" -> getInstance(ColorSpace.CS_PYCC); + case "CS_GRAY" -> getInstance(ColorSpace.CS_GRAY); + case "CS_LINEAR_RGB" -> getInstance(ColorSpace.CS_LINEAR_RGB); + case null, default -> getInstance(data); + }; + } catch (ClassCastException | IllegalArgumentException e) { + throw new InvalidObjectException("Invalid ICC Profile Data", e); } } diff --git a/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/SerializationSpecTest.java b/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/SerializationSpecTest.java new file mode 100644 index 000000000000..aa50d814264b --- /dev/null +++ b/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/SerializationSpecTest.java @@ -0,0 +1,99 @@ +/* + * Copyright Amazon.com Inc. 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.io.File; +import java.io.FileInputStream; +import java.io.InvalidObjectException; +import java.io.ObjectInputStream; +import java.io.OptionalDataException; + +/** + * @test + * @bug 8367384 + * @summary Verify ICC_Profile serialization per spec, all name/data cases + */ +public final class SerializationSpecTest { + + public static void main(String[] args) throws Exception { + // Serialization form for ICC_Profile includes version, profile name, + // and profile data. If the name is invalid or does not match a standard + // profile, the data is used. An exception is thrown only if both the + // name and the data are invalid, or if one of them is missing or is of + // the wrong type. + + // Naming conventions used in test file names: + // null : null reference + // valid : valid standard profile name or valid profile data (byte[]) + // invalid : unrecognized name or data with incorrect ICC header + // wrongType: incorrect type, e.g., int[] instead of String or byte[] + + // No name or data + test("empty", OptionalDataException.class); + + // Cases where only the profile name is present (no profile data) + test("null", OptionalDataException.class); + test("valid", OptionalDataException.class); + test("invalid", OptionalDataException.class); + test("wrongType", InvalidObjectException.class); + + // The test files are named as _.ser + test("null_null", InvalidObjectException.class); + test("null_valid", null); // valid data is enough if name is null + test("null_invalid", InvalidObjectException.class); + test("null_wrongType", InvalidObjectException.class); + + test("invalid_null", InvalidObjectException.class); + test("invalid_valid", null); // valid data is enough if name is invalid + test("invalid_invalid", InvalidObjectException.class); + test("invalid_wrongType", InvalidObjectException.class); + + test("wrongType_null", InvalidObjectException.class); + test("wrongType_valid", InvalidObjectException.class); + test("wrongType_invalid", InvalidObjectException.class); + test("wrongType_wrongType", InvalidObjectException.class); + + test("valid_null", null); // the valid name is enough + test("valid_valid", null); // the valid name is enough + test("valid_invalid", null); // the valid name is enough + test("valid_wrongType", InvalidObjectException.class); + } + + private static void test(String test, Class expected) { + String fileName = test + ".ser"; + File file = new File(System.getProperty("test.src", "."), fileName); + Class actual = null; + try (var fis = new FileInputStream(file); + var ois = new ObjectInputStream(fis)) + { + ois.readObject(); + } catch (Exception e) { + actual = e.getClass(); + } + if (actual != expected) { + System.err.println("Test: " + test); + System.err.println("Expected: " + expected); + System.err.println("Actual: " + actual); + throw new RuntimeException("Test failed"); + } + } +} diff --git a/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/empty.ser b/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/empty.ser new file mode 100644 index 0000000000000000000000000000000000000000..3fd70024d656af1d2f6370bdc63c5c863c32c8e6 GIT binary patch literal 130 zcmZ4UmVvdnh(R_hu`E$9vAjetIX@@ANYB&RIX<8$KP@vSHOSqmj6-netmDhsm>3u; ziWsDDt34S$WyATC@12+#7(E%}Gn12{W(21eWhUliR;8x6B$gzGr4|)u=I2!uFfcGM GRsaCnJ}zni literal 0 HcmV?d00001 diff --git a/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/invalid.ser b/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/invalid.ser new file mode 100644 index 0000000000000000000000000000000000000000..dfe071e69dc6bfc8f50eea4dc91759c21baf0133 GIT binary patch literal 141 zcmZ4UmVvdnh(R_hu`E$9vAjetIX@@ANYB&RIX<8$KP@vSHOSqmj6-netmDhsm>3u; ziWsDDt34S$WyATC@12+#7(E%}Gn12{W(21eWhUliR;8x6B$gzGr4|)u=I2!uFfcGM RmN0NQ2gip8`TMz7008G^F=zk) literal 0 HcmV?d00001 diff --git a/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/invalid_invalid.ser b/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/invalid_invalid.ser new file mode 100644 index 0000000000000000000000000000000000000000..60fb02f77836caff458594904ffba51da4445be9 GIT binary patch literal 142 zcmZ4UmVvdnh(R_hu`E$9vAjetIX@@ANYB&RIX<8$KP@vSHOSqmj6-netmDhsm>3u; ziWsDDt34S$WyATC@12+#7(E%}Gn12{W(21eWhUliR;8x6B$gzGr4|)u=I2!uFfcGM SmN0NQ2gip8`TMySQ~&@OMKRa_ literal 0 HcmV?d00001 diff --git a/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/invalid_null.ser b/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/invalid_null.ser new file mode 100644 index 0000000000000000000000000000000000000000..60fb02f77836caff458594904ffba51da4445be9 GIT binary patch literal 142 zcmZ4UmVvdnh(R_hu`E$9vAjetIX@@ANYB&RIX<8$KP@vSHOSqmj6-netmDhsm>3u; ziWsDDt34S$WyATC@12+#7(E%}Gn12{W(21eWhUliR;8x6B$gzGr4|)u=I2!uFfcGM SmN0NQ2gip8`TMySQ~&@OMKRa_ literal 0 HcmV?d00001 diff --git a/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/invalid_valid.ser b/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/invalid_valid.ser new file mode 100644 index 0000000000000000000000000000000000000000..e01b5766f62f3b75de13f54d014c55168a7d2dd6 GIT binary patch literal 7040 zcmeHMXHXQ`8ok{;IS^)G$T@>V2?I#ZNpcj0VTLe-0fs1MWpM>p5D`g=AcBMiSC_bo ziYTIpf&vC~2U%3qRb0h{%A3JgwQpa&_iyX{dDB(h_w?znzVEx;x2jK_+x9y^XK;Z+ zA|sn&z{troV5TOgat%D3oTB`=sd4P&*Z?=jY@B#+)ld@#1|XLUWdD2YaA?`d8^f<0 z5de7rB{q}!&m4iVTs9+_ofpe;W@Iu#V!0XYR8DRh007DaIH$m<&;Z}HZdqIauXAjB zBlQ7;3*rfi@groX1!podB?C4BAcd335I-Xj z#0tj09`7arBw%jo|L5m_jsCYgA}fW%;x~)q^NFn34CYGX03@(dSOT8kBS^@}Ov?lS zcIIOVF26xO4in&*Z#Y?i20g2mmo{!6cN~oXl7*hmowaLjIkXf2k#sA$Z|2S?uIYeKzOsEW*$Azp5ixFW*{! zW3#djAX>$rTq^$?&|d<8l>Eu59|k~l7XV%Te{wO$0q8CPK>8swi<|u|A4)Kw0Re~t z2_OR$ff~>T`oIKO0Bc|mT!1I=1wkMjYyeD<08#)K|5FN6GTp({K01Ahq zp?HV`WkH*vT~HBJ3ROXMP&4!s)C*mJhM_U&E;IwpLw`V@U<4+?60icS2^+$6*a7x} zgW&aWJe&^a!TIn$xB{+++u$zv0(=dgfO+t9co6{z5uqU}h(1C`oDg3m0*OPo$X28f zDM#v&cBBs(LT({EK1ASwSfAH zCZpxidT1-O2RaNLkIq3Cpv%#X=uY${^aOei{SJe{&@fsU3yeD^9FvIIgxQNZjOoCf z$BbcSF^gC%RtBqwwZZyg8Q4s00k#s`hCPQJ$If9t;D|USoC(eq7lGs8cH+u$Ex3N% zIPM8<2``4%z+2&c@htpCd@;TO--o|}pTjQ^#0gpi8$u8vk+6eML1-sjB1{wB5Q#)p zq9xIv$R=(lRuE4TuMlU5A4wFFF3E`$Ny;MaBQ=rElkSqwuw}Wbcu|MycETYYKS_BZV=5AEf+m4dPDSu7+y?M%t?$PwpFZJ ztXFJGY*CylZY=IAo+7?iyhVIi{3!)X(WJOgSd@IqG0H{CEES=uQJttv>Mm*n^%8YX z0wbX%;USSIQ6%xB#HhrABt_CxGDI?0vRd-2B#(yBG-)2RWLh!p6m63BNlHP=K`K^i zk5s$VxYT=TIca<8Sm{FP4(SQ$Pcq6fE;30n`(?Ui9>}6(b!Gi!b7YUmUXpzwCn0Ao z$CN9SJ0*8d9+uaY50Kv^e@uQveo;YD!A&7ep;F6x;mvV(H6a)t7s@`8%Iin~gdN}bB6%95&bnxUGzHM=#RYDsH(Xys|OYE5gCwe7Uiwd=KS z>tJ-~I!QW*b#Cgyx@Niwy4AWj^k6-6J+|Iqy|Gp3RhFwbtLj%x>67#w^t1I_^=Axd z2Hplc4Z00p8mb#c816S5GW=>}W|VByV07P@V(e+W)40$04-;Jzrb)HQ?bYPfuB*4L z?pgiXRL?Zl^oZ#lGpd=7*>1A|voGcr=3Mi3^LYz(i)f1)iz&JU-H*PPe#H`P>1esl z@{Hw2D|4$%t5a65to5yvtXr&~uF+Z(yQX2ytc|J-!=}!LXRB-*ZF|&~XQyJvu&cLw zWUpq=vTwA1;-KS@=+Nfy($UC~>)7e|-pR^oi_>{$#M#Zc(0SB_;u7pq;pAYQg>2ttm zdacG<&f0EY;OpUg!1sZlmS4KxFa8*RKmTg~#{tFxn*)Xdsew^}ErIWX9D|C3?gwiJ zX9W+0h=xRlG>5zobq*~J<%JoBZ3(*;E*s7c?}@-hghVt(EUt4|cW~WYq*-J^C-f%WbG>Q>*IvO1v8r>58nc>T*XDr5e#MHzrFrAo(n9o`EtTNVotW9ib z?2|Z~xYD?%@iy@X;^!0W63P=^u$|ad?AM9ziM5IElYEn!l9rQ0lRHvyDbXpt9116i zGnlHFnwvV7rk7Tb#!I(KKbXG2_2M>WKpE>ZdNL*WKjx7v?X2&zX0mOwtFu4kgyfvg z70>15j%?K3xM$;&JlDMAn^2pWn+7(kY~HbXW{bm?x~1ZwE1f;ybD*nCxva44 z?ZK#n!{w&swTB3YvJUYoyeoPt)hkOXKUXDGO;kHpchtz&?5TNwn00vki2afFT7}x8 z+D}K>NAJ|R)pgZt)|Vf{9LqlTxFMur=s5j&bE9lyQR9~;P807$z=^?Ti{|DQ`Ih2V zxHYSFzAdut=8w)l_O$D_*LBc3icW%)Stp{{qf=;rl=_l)&=_73z}_jUea@JrJfl{3|6CC?W36Z-S}m(S&$TRfk3{>6p(3$p`J z1NSe6UA#T$KR9~H>(Z6Wu9q(kISiefr+9Z*cb?u&zWe%K_PwS1 z+o#dfg%89Yls}YzSpTceuN^#d-q{)FnUP02r{^qlF&*q+|JzsiJ@Vof$H7~Va{`|`R)yP8F!rW`_>*YW8zL9y;^w#w4z@p#c z!*?m~mfjbBkoj=pBmLvhr_fJNmU2F0KUaLw`O^2*>+AG#%JQ;M3kbD3u; ziWsDDt34S$WyATC@12+#7(E%}Gn12{W(21eWhUliR;8x6B$gzGr4|)u=I2!uFfcGM zmN0NQ2gip8`TMy8-604zJ0~$OUC%SGBsD#?Na)dmCEpv{Eto(?vX&+0l%@jRAb?Qk bSDKrYTGX~?sx0@E2i+hi7I;o$x>NxG?Kn+0 literal 0 HcmV?d00001 diff --git a/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/null.ser b/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/null.ser new file mode 100644 index 0000000000000000000000000000000000000000..1fc2022f8683b572573642900988316676339a5c GIT binary patch literal 131 zcmZ4UmVvdnh(R_hu`E$9vAjetIX@@ANYB&RIX<8$KP@vSHOSqmj6-netmDhsm>3u; ziWsDDt34S$WyATC@12+#7(E%}Gn12{W(21eWhUliR;8x6B$gzGr4|)u=I2!uFfcGM H7E}NL2_G)n literal 0 HcmV?d00001 diff --git a/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/null_invalid.ser b/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/null_invalid.ser new file mode 100644 index 0000000000000000000000000000000000000000..b2847de4f46feabb8c141b730916d33e04d3dac5 GIT binary patch literal 7030 zcmeHMXHXQ`8ok{;IS^)G$T@>V2?L1aEP`YZg<*y;gaL*qU_usGa1{{|0Yy+j!h)+y zTqB~0A_@u^&>dtEP*!mjQBim^`l@_YulC>8`}3x&y6>rTzxuxKcHgQ#b#C*Y0G-MO z3UQ1Kh5;ip&48Jdki<1`cXSN*;U-116QX=w9Wrp@T@`)x7#M&oE|C5E*#4l>Gk5x5 zJ0JjZ2TE)v^WQoAqPT2E0y{g3<-|y11V(XF*-4zNWB>q^oX!RCMu+CNQXeolf1aQO zpO+mM+zHIYRM-fBL{1u)--dEq z^6y*{{~OR>0e}>L=hTk^Ai4{H_KV-S$Ws7x6aygrl$p-W_?8bP7|?(KM1cg50g6Bk zXajv<0xWCWr-zfD1A~F4zeQKoKYghd>3W1}8xSXaQ$I2RIL| zfa~BExC=(WW55Gb;3b#`@4*rTL0E_kQ6U*f3DSV{AQOlVt%aPSb&xL<0!2VE5C=+! za-m&N5mW+IKs8VU^b6DlU4ihjH z0%ybd@IJU4u7#W7cK8Z>3m$=a@Jo0B0SFPHAu5PILPs1CZzL3nM!3i}q!1}XYLOPC z8|g#tAv|Ob`G~@xs3>KWKFS*9h6+G2Q7NcxsJ*BP)M->Zsuy(+HG!H(Eu+b3d9)td z3hj;#M#rEt(FN!-bRD`4eGNT=obO--6$dKZ)Kxwutc_tREo5V42!%H#fxf)+KX-$%@!>aJtulcbWRK}rYYtq#t_>kRw>pcHYT

          (VCi1a5JWf^Cgc$ot-9Wqa3QL?(S8)P$OkI7z>os*N0vzBAZ70R8J zdn6Cb>&pAe=g6OsACO;AP*iYLNLDzaa8+SWk)~*;7^hgOcu{dyiK?_#iLF$sbV=!j zvZS)Ta)NTXaJv4B8eJ_~tyHZ?ZC+hT-Ag@J zy-EF%23~`%5vy@nqfcW|Q%f^QbGK%P=8TrKmb+HAR+HAaHd)(NJ4L%z`@RlFhprQ^ zb5!T9F05;&8>?HXdq)q}GuLD59n~9Jg-(EjMze#_>fM&4HAkUz~ z;FY1eVW{B&!#=}hBQv7}qmxFDjVZ<+#(Bow#($aUnlMc&P42HIuXb6zeRb#RH>P@~ zQKrXCADB_iyv%l+^_YDzw=n0Lx0ugbs9Qu>R9TGCCFnl%z4RNFXiEpn?Uv^)KU$ev zrCFV|dTp(59dF%eJ+nq@P1Kr`YbI?}Z5TE+HoUdUYa`YkU(2&qv1QoS+CH;Wvt!xS z*-hK)*vHv7+rM%!a^O0&IV?I_Ic{~l?1VVEIu$w%I#ZkjoGYB4x~RIuxHP%UyPCP? zxL$TcyLq}Da2s=1aA&$VxX*i7cx?6P^(1-vc~*EnTc^8@yRO>{_VVyL=rz7xV?Aem zhd1zc_de+T#7D~~#pkyTm<>J~DmOg$HTKQ*?enAhh5I%7z4v$U-|zo8Ksz8kpeIl? zFf6bka52a!s3eFNY#6*X_*RH)2s@-R6dM{CS{J&o(Rt&cjZcbuM)`&14phndrptCG7jcVesk)|ze5w#aQg+ts$`Z=c%Xy5sat!p``exATnh zO7hf~zXCHr1 z<66^Rt65ui0&^nc#PgGZC;Lv(Pc_uZ))m!#spr)5PWztjZLnx)Xq0c<-vl?MH_bMO zHQ)W&>F3TC{g#?mT5Hi6a3=lCi(evs89nQHw&xuET+6Q-zgD$T+X~yE_ATx69kCs} z&XCTbE|0FBZtL#0-wb}MKd*AW@`B`r{TB%r^DnMk%D%L4Ir;M3m6$7&J>fl%uLfVe z-@BoA@S5kf8`oW~U+uH+yL7|m#`%7${;r$!n;o~zZ?zAY4Yb`hyWKWuKG=T8;!fvX z%e&n}Ylbck+YVp3=XCG-efRsfM%IrEjRuT97z-QYJzzbUd6@9<&7+J*OOJPqqsI%M zh&?HLD*v?hcb(r`dFH$e6HXHY&-|V}o@7qG{3G>`&r|u&$3u; ziWsDDt34S$WyATC@12+#7(E%}Gn12{W(21eWhUliR;8x6B$gzGr4|)u=I2!uFfcGM I78Fzf061YUN&o-= literal 0 HcmV?d00001 diff --git a/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/null_valid.ser b/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/null_valid.ser new file mode 100644 index 0000000000000000000000000000000000000000..b32c838c80ad94b311dcd5af73d74c1ad0ec9dd6 GIT binary patch literal 7030 zcmeHMXHXQ`8ok{;IS^)G2$FLU1SAX~IVZ_cRE8PC5C$BgU_=&IUxKzEQuMOnpFL`CJz=&RbduipE&_5Qr+s_uLG^jF{a-R@h}r_OEt9iUUV zKt7I<&d_IMr0O%15|X(3ZVnEceYi={?1U&k7yERacu(bEBL)T_lM7`3d+bnf>8YDT zuj~;3xdBBslljja{!v^uBY~Y2#d2h%GJ>MGDeNRpW-1Yfc!PcG8>#mgTmVl{ zg3rrN3C;v&VhU^kKq4oV%Wp#|Bs5G3I{`>Q4p0CV&=|~=WG{c`0Dc}Ih!u=~J>E?K zNWk3I`_Iq+8vSo~L{=h)#cvVE=i^vWDNH_2<>OdZB1^#Ydjzo=smXi}cI0CTF26xO z4iVtUZ#Y4KW4_^CUtM*xUv z2_~V$=A=e(IgAADujJo(`IlNEDS{UsnZ`~?)njx1&LaF=|EoHJ_42LtH&$QQ0YoeR zlS|@%1Nut;`$D02G5mpc2%8de8*gz-iD0&Vq~J z3b+n#fpPEv@W3p10T#eJuna*E79vAbNCr}b)FEBS2%9P$DlLNdFV291G)o!89k1kMZd#fFf@!N#th?%3B|-=vN462Bbau~1SgMz1V%zr!c8Jh zqCnzDi4lnfNs6SgWRPU0WR>JONgfTMY0%tg3A7^GY1#zsqm;aqom7<6KB+dTF{vf# zRnoT7QPTO+?b74YA7zweoMhr<4#;%LJd{Pr>d5-aX2>3uy(~MwN@A7eD(0&ERi{_o zmxJYWlAl+gDcCB+DU>SoDaC@m<aul@=#H*NuQp%JSzWh!Qjer(ryfl^BqT=C{BS+l}?YGRh(m-TbvhMOkA>E zF1VsyJzNjCPP)mvG2NQn7TnF;x4RE`kUac7Dm@;1>UeTJd%a*Ucdvt9Q|r~&bJllx z18+C)gWeB)G<~-C{Nju8_3^Fped1^6x6N@9ZDPw}=h+VIO7`nG*SMOvrFif7#`u+l;Dq)>Tw+9G4~N2u=L{q%BxNRz zChI2WCG)meY&o=Lf$PC-NP$u|rgW!D@PEw1Xr&p!F&j`vmlPR9b$sFFQ zvvuFrr&-QfC$dr5%y>^ixduseSDjU0oV zlAO1Dg7@_1%IEINo%zn?yOunWJZ|3PUdz2T-=n@~e?PKs?Y@eAU-DV`*9r^@$_hRe zG7GQ$VE9A%4=ekl_m32r79B0d6myCv4%i$xSt4GNRWftX>tJW8QfYqa+e4cV4V4*} z)f^@qPCLvi_bl(OP^&1e_*5BNIbLO7)m|-Ey{~%d2~7O*t8J&X7n}m8(oQ}9DdMMz(;lb$&(P1b{jC0TbqBR0zZ2@*+PTmb+r{e+ z?H=uM@9FQg?CtnP|Ch$I%4e(2NuDd}BlP9=t(?y~zjz_}!u-XUi!=S3`yX5ixpZg1 zcVOhQ$K|V6oUdFOv>QBs)#~cmA&a4&YxHYf*G;c?4x0>j+%UP(F=9H>dDHA>_bu~V zy`$?!`^Id>F5Y&$edUhZo$KT4$44guC+<#$Px9`v?moMhaPRf~^!v*Xc1@wD@*j#l zEPEvPsP0$oU)y=6ymQlz)5DMbA3vC3&b;_7<+o3>xlhPX%AP7dZF*+(?ChNL+^y#u zp3lBWez82C_q+J-)i1SP{`|`J)$l^d!t87A>yslKG5F)t<&00*PvxJrKlgs|_%gMUxUwSD0zxey)B-{+Ak+dvEg;kaLM3u; ziWsDDt34S$WyATC@12+#7(E%}Gn12{W(21eWhUliR;8x6B$gzGr4|)u=I2!uFfcGM z765G*1e=(Xn3t~SnOBmUo?0aIXu*>2jqMgpAcI)T5_3vZfi?>u)cKX>CZ!g&t(hvz RJ>@|+$YBMZ)0i$*002rXN~r(< literal 0 HcmV?d00001 diff --git a/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/valid.ser b/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/valid.ser new file mode 100644 index 0000000000000000000000000000000000000000..a6512d244cf246a938ee37fe376ee7c92bd57160 GIT binary patch literal 140 zcmZ4UmVvdnh(R_hu`E$9vAjetIX@@ANYB&RIX<8$KP@vSHOSqmj6-netmDhsm>3u; ziWsDDt34S$WyATC@12+#7(E%}Gn12{W(21eWhUliR;8x6B$gzGr4|)u=I2!uFfcGM PmN2k82ger!ZK(hNwt_Jz literal 0 HcmV?d00001 diff --git a/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/valid_invalid.ser b/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/valid_invalid.ser new file mode 100644 index 0000000000000000000000000000000000000000..dbe11f2c6d651974009b5c4d96db2f45923a47dc GIT binary patch literal 141 zcmZ4UmVvdnh(R_hu`E$9vAjetIX@@ANYB&RIX<8$KP@vSHOSqmj6-netmDhsm>3u; ziWsDDt34S$WyATC@12+#7(E%}Gn12{W(21eWhUliR;8x6B$gzGr4|)u=I2!uFfcGM QmN2k82ger!Z7HY#0O%4im;e9( literal 0 HcmV?d00001 diff --git a/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/valid_null.ser b/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/valid_null.ser new file mode 100644 index 0000000000000000000000000000000000000000..dbe11f2c6d651974009b5c4d96db2f45923a47dc GIT binary patch literal 141 zcmZ4UmVvdnh(R_hu`E$9vAjetIX@@ANYB&RIX<8$KP@vSHOSqmj6-netmDhsm>3u; ziWsDDt34S$WyATC@12+#7(E%}Gn12{W(21eWhUliR;8x6B$gzGr4|)u=I2!uFfcGM QmN2k82ger!Z7HY#0O%4im;e9( literal 0 HcmV?d00001 diff --git a/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/valid_valid.ser b/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/valid_valid.ser new file mode 100644 index 0000000000000000000000000000000000000000..fbe90d0eb6ea8059d4cde7ff1b8e31d7531919b7 GIT binary patch literal 7039 zcmeHMXHXQ`8ok{;IS^)G$T@>V2?I#ZNpcj0VTLe-0fs1;WpM>p5D`g=AcBMiSC_bo ziUBd8pnw70K^75p6<0B#@@DW=?b}!H{o8tf-gH&>J^l5m@B41uTh*t|ZT}shGq^w@ zk&(?XVB};PFjJFLxdt9iPEmf`)Hrr>Y=E0%Hcq^+dZ-x#1CYxFvj3es99n+j=I|>= z1VA1@iOppGGe=-7m(56K=f$#|8JUcbSZ)S8m6MwW0Dv+9)+sP5gI^_!3*dE*?Qf($ zU~oY^K`lN(c1mz3GgC5PBLGr3nOr_oIV?Ov89M<;Kps#47SI^Xj5MD>*C2jEAm9qd zzh3Vq03?Xq*8k7n|H}TiHzF&A!{YafY*0sC#VlP4-G@3&^>4xnuq>?KEVh~f+b)DSQ9pc>97Or1qZ?F z;dnS5&Vvi!y>KPm0Jp>4@Ok(eJPz~V=kOu|5F$cDR1kfHjyNH{NCXmxaFH!Y5mJFP zARS0QGKAblc*qOnBMO6}qLfkkC~K5EDj3B?rK7f>_Moa!$5Gv=i>TYEY19JhE1Ha! zN9&=j&>rY8bUZo-U5KtgH=(=Gm(b(rS@b&$21CPWVJtB2m~c!YCLgm0a|qLkIfog= z%wQI=SgZ_I4{L+<#WJv&*g|X-wjFyGJBFRbe!vlNN;ngoD=q@Z!R^3R;97A5xG~%u zZV4}j*T7rheeo>(Mtljr5#Nu$iJ!$U5yS~v1RFvSA(611P)X<@Tp~;n-VljIRiY)) zpU5U|BUTbm5U&uYi62Q6k}k=K6iLb=?Iksn&XMks-jK;;O|m^Xf}Ba-OKu@wAU`61 z5TS|~hA+|-VMyyY4 zQfyJ2DsC+9E1n|0N4!;hSo|pkOVOmbP*{`#%2CP%$_y2us!^S&OzKW*BlQw>RstiT zCE+2FC{Zl&qr`~Bf+R)KR5C;|SF%R(j3keS&@^ctv}9Td?Idl2_DM=X%0VhtYPVE} z)R@$JX*p?o=~(F^=}zf!=}$7sGA=SnGW%qDWFE?*WOZfzWpiW?%U+UwAtxbcEyt8A zk~=APUmlj%l@E~5mp>|hU4BtPQNc|iO`%HRg2D?$nxeg8qGGw?fa1IoRmoO~tyHdb zR_U3tq_Tr@vT~*JMdbw*c@=k+ER}kd5tSuXE!AMv9jcwG57h{2bhS9Oa}tz6Lf2IZ|cE%=6Y{E>K4%!wHA|f3A!JB5B-WI+S1W-tL16S zk5=YZnN}yQURmo~Ct0^zKV74>CU#BZni(5a8-`824bN8DHrn=xEzeHHj$zke_t;*| zo@L);Kj)z1km%6v@Y2!9k?Yvy_}-OGKS`=p102h*d)W5LtHbF=3~FOpZFSGCt;Z(VP$cfSwpf*gZNf*u5G2WJHj zhKPnlhO~sd4|NVL3+06whHVbJ7A_mk4)2Y?MubE(MJ%p!S$AOFY@}IaVdTVmt@XL< zhd0P>NZxQJN;HZQbt)Pi9U9#l{h8s*XkaYHc*NAkEHIsz2bs@V_N;Q&e5_4uS?pY# zO;FW64(YWC|y_r$uy_es7<%}LA2p~;;oxRmIWJ`RPG#JQNN zn3|h9nx>aln8r)DNX4hnY$O*|gl`Edh z$-TZ&cjNAjb9t_L$MRA6%>2PkDx0=%n%?ZNxqb_@C1%UuR<*4KTW7bqZ9Bf5usvz} zjU7fi%67cn8M?E-K%rn;!OVAV-?bHr6mknEcUkYM`yTZ@`}>jIt9MuJ{#wK;x>{^h zTv7aa4|C7eAB=yf{9$=-+}@EA^OD1*m{LyZ#6G)y$IHaa^2%oR`|R&7S1vCqe|sS6 zz;K0WMcqNd!K{P4O7F_vD)p+;s?XI4)#EjeHJ!EcwYzKIA7ULEJ8XZrqfVi&xbD*t z_K~~wZuQ*_nhh04F-NnHK4}bT96Cln*3u-~RNVBXnbXWW9&r3(i$zOIt9)xo8{C%F zHs2oEe(Oi)AA39WJL)@Woy8}>iL4XPev1BS;-uHf!Bg~89Y1UQT-!zMD(Z&1H+C=d zB=qol!+S^jJo^Uwt^2!vG5DqVw94t4Gm>XY1_%QM1IuUg&MuxyJNM#z{P~%|sKEyp z!Y0ztkzN_@BJ=e^ybze8T-gU$5M%Re>NcT;P zo4vOzZ}pF^866n28#{m7`S#^I9(S&duN@zq2%fk*89B+j%ewpYUh=)y_p|RWJ=ivd zo+^4M_ORlS{G*0nb$;#Sne)y}J5OJK9QgRb40GoBZyCRRo-KGneo`@~G}rRfeW_61hXZun{d5h#MAlK=$e1K@oFfU0T$G~@W^ I3z51108jusz5oCK literal 0 HcmV?d00001 diff --git a/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/valid_wrongType.ser b/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/valid_wrongType.ser new file mode 100644 index 0000000000000000000000000000000000000000..3538676276fd1b9cb42cfdd37378f05967885d59 GIT binary patch literal 217 zcmZ4UmVvdnh(R_hu`E$9vAjetIX@@ANYB&RIX<8$KP@vSHOSqmj6-netmDhsm>3u; ziWsDDt34S$WyATC@12+#7(E%}Gn12{W(21eWhUliR;8x6B$gzGr4|)u=I2!uFfcGM zmN2k82ger!Z2>w%5Nvc#VqUtQXI@EadTNo-qXkR8H?~_aflOpAOUx-v1v)_hq0X-~ ZHz~EKZOv3!?kNwtK`t!toW^vi0syHLO!oi) literal 0 HcmV?d00001 diff --git a/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/wrongType.ser b/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/wrongType.ser new file mode 100644 index 0000000000000000000000000000000000000000..3469f871ef6042f9d8d244c3ec9388cc3063423a GIT binary patch literal 207 zcmZ4UmVvdnh(R_hu`E$9vAjetIX@@ANYB&RIX<8$KP@vSHOSqmj6-netmDhsm>3u; ziWsDDt34S$WyATC@12+#7(E%}Gn12{W(21eWhUliR;8x6B$gzGr4|)u=I2!uFfcGM z0xcH=8<>-rm#*iTSCX2ZS|s#n!IJNd?G{WRb6Cp~b4pWz77HNM`IY7-r53fVnJUXY QM2_;L?iH?cY!43iv&;V3`1#}iWGb1S6H$u`Akj6^K z@7I?v0K6Lnkd(P=@!#{`BmV{wIcWlpWVtxWd>3w@0`J20OU6T(0cwmmv9(>w(S6@JYkE3+28V^qyridfILtH zsz3|q0~25YY=I+i0q(#D1b|==0b;;Pzy`@64G2LF$Oi?W7?gtTU>B$X`$0Wu0L|be zXai@#C2$qo0C&Iucm%{?47>o-;2oHQAP5VQAsVC#X+wsPIb;hlpv906v;+!+VxV{^ z2@*geC?DDcl|toE4RjD{fPR6_K$oB%s1JGojX;yoU(iPwfl06;tO*;zRxkthfCJ$O zcmH zB6UbJ(t&g%cM&l%g?vC^P&AYd$^zwr@<%O0u~Dm0>rrK>8q_gVE2;~17d3*KMtwn( z(HdxTv@@ECjz%Y;bI`@;O7s!*Y4jEJ0D27l4uiqaF~%52j6Ws@lY&``DZ}i=v|uh` z`Y@xI87vm7iZ#c&VuP_PY!5NM5L{xqoj+Z2c$P-GTDgiPL3sKk++f?$d}1a z$nWK7a+Y#TIgZ>0xmvkaxqi8q@_2bec@O!O@_F)=@~7l)%TFob6^s1gE zC=4mgP-qkzN-!mjQbsvW>7h(eu~Z|f50yhLq8_4NrjF7Onm)~o#-?qe)zhxf#uPD% z#)?eE6va}-pA~x*r-xk|N4=aj^BglTw#(RkQ|Y~p6J+N93po+-wZ zVVY{X*Yu7VY-VqkY*uS_+Z;A`Fz1=?HSb%1Uf{Gqu%K?ikOj%Y!y?sLYoeoziiEH*|xQ|_ZE^D`YznCuzlfc zJ99g(-9Eef_B8t-`_1;9_MaUb9fS_e4wH@sj`5Cr9ETW+j1Wc{hU%k`kEc(Kmn_{9eni`{hHSZ;N0Pu=z1 zIqpZ?$309vQaqYGUV2)43O!GI&U!g}t@FC*jd=Tcmw5O3P<@v9)c8E{)$>jAZS(*ceF>jJt0NrB;kHGxl;m@N@5=?H>@0)lo14KFoZ zDp=YU41$@#JA)sG7>BG5`7IO^8WLI?`Yg;QEI+I}oEE++{CN1g2+xRZ5s#LcEE6s3 zjFgXzi)@ITjq;8vj}k{)MX!s#5u+Bvi)oL=#zw{-iJe*QvwYX`u{is<;<&*T#w&7H z^sH1{$zOSHmHaB!s#Edk_^9~f@t;`1tUA_A0yAMx!Zh29y_@}lzT4exb|f6D%p+0@|Fqp4r{QT&!PTv~kE839$0D(Fhr zO3zL2%P`L<&JeG5UcGDev@lS3BooS9k=dT5DETqp6q$&A5RGIn&aTaVpA(sLDwmQg z$i2D7Y|WN6<9WV$hu5Okve$Oz>*g2akF4`pcW^zlK4E?52K^018^$*JZ9G;$C`c{1 zRcKvUUifxX)TWLi&7zG(qd)ll&{!;2EG!<{?6P_PkEkDcKlW}}xTSi_ml96N^-}B7 z%F<6|?6T`W+5A-X)7PzuTYI-TY}>aTvt6)#aEIHDW95|cyz~ zfOp{jLBE5obw+iShcJh-4?U}otnWU|INWeV?MUg7&qoDE#mB;qbu~CPG#uABzO4~% z6g5sZ#Wmge+56}AW{c*7E%cVs6X1mC#PeU`e;GU(c(U^p<5csnhQIDPO*>uE3bn3j zoo-8R6Sv2-_niqi)7jzDar!sQ-;SQuJzIND>D;#Sg!4t`zh20@Fmo~E;?$+2OQW5u zIv-t*zI?AMw5#_@;FW7veXm~b_UOKF&Gp*Z9_OAj*BRH_ZaCa%y=i~*^ey{ar+XcG zTW>qwZolJnr=xFC-}!#G{!4eg?_Ryfymw<@=|JD$vcda9aYN$!ocj|G_zzw`%zilc zXyY(?xa6_I?F)c*BJ4 z#Mw#T$ve-NKOcLM@nUYO_)p58dtREn{PmUltDDo&(_^oNufP6P_D1#1(YJPQJ7+>> zp1ezYH#b}IUiJO44~!4pAEQ2w&*gl=eyaLx`nlsv;FsaAXd;ys+AoB%ezJSaZkof{KU*P}P7nnc0k*EPgst67Z0T8hkfF-v8sICFP LC{c305SRNe4T)CE literal 0 HcmV?d00001 diff --git a/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/wrongType_null.ser b/test/jdk/java/awt/color/ICC_Profile/Serialization/SerializationSpecTest/wrongType_null.ser new file mode 100644 index 0000000000000000000000000000000000000000..2c1536cc09423dfa9117647e3d5206ba5763c15b GIT binary patch literal 208 zcmZ4UmVvdnh(R_hu`E$9vAjetIX@@ANYB&RIX<8$KP@vSHOSqmj6-netmDhsm>3u; ziWsDDt34S$WyATC@12+#7(E%}Gn12{W(21eWhUliR;8x6B$gzGr4|)u=I2!uFfcGM z0xcH=8<>-rm#*iTSCX2ZS|s#n!IJNd?G{WRb6Cp~b4pWz77HNM`IY7-r53fVnJUXY R3u; ziWsDDt34S$WyATC@12+#7(E%}Gn12{W(21eWhUliR;8x6B$gzGr4|)u=I2!uFfcGM z0xcH=8<>-rm#*iTSCX2ZS|s#n!IJNd?G{WRb6Cp~b4pWz77HNM`IY7-r53fVnJUXY R3u; ziWsDDt34S$WyATC@12+#7(E%}Gn12{W(21eWhUliR;8x6B$gzGr4|)u=I2!uFfcGM z0xcH=8<>-rm#*iTSCX2ZS|s#n!IJNd?G{WRb6Cp~b4pWz77HNM`IY7-r53fVnJUXY X Date: Tue, 14 Oct 2025 14:13:00 +0000 Subject: [PATCH 168/323] 8327434: Test java/util/PluggableLocale/TimeZoneNameProviderTest.java timed out Reviewed-by: mbaesken Backport-of: 1bd4abf98e26d04076f330c0b2e44f666f8c27a1 --- .../util/PluggableLocale/TimeZoneNameProviderTest.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/jdk/java/util/PluggableLocale/TimeZoneNameProviderTest.java b/test/jdk/java/util/PluggableLocale/TimeZoneNameProviderTest.java index 48de90b4a16a..dffddda193d7 100644 --- a/test/jdk/java/util/PluggableLocale/TimeZoneNameProviderTest.java +++ b/test/jdk/java/util/PluggableLocale/TimeZoneNameProviderTest.java @@ -23,7 +23,7 @@ /* * @test - * @bug 4052440 8003267 8062588 8210406 + * @bug 4052440 8003267 8062588 8210406 8327434 * @summary TimeZoneNameProvider tests * @library providersrc/foobarutils * providersrc/barprovider @@ -45,6 +45,7 @@ import java.util.Locale; import java.util.MissingResourceException; import java.util.TimeZone; +import java.util.stream.Stream; import com.bar.TimeZoneNameProviderImpl; @@ -69,12 +70,12 @@ public static void main(String[] s) { } void test1() { - Locale[] available = Locale.getAvailableLocales(); List jreimplloc = Arrays.asList(LocaleProviderAdapter.forJRE().getTimeZoneNameProvider().getAvailableLocales()); List providerLocales = Arrays.asList(tznp.getAvailableLocales()); String[] ids = TimeZone.getAvailableIDs(); - for (Locale target: available) { + // Sampling relevant locales + Stream.concat(Stream.of(Locale.ROOT, Locale.US, Locale.JAPAN), providerLocales.stream()).forEach(target -> { // pure JRE implementation OpenListResourceBundle rb = ((ResourceBundleBasedAdapter)LocaleProviderAdapter.forJRE()).getLocaleData().getTimeZoneNames(target); boolean jreSupportsTarget = jreimplloc.contains(target); @@ -111,7 +112,7 @@ void test1() { jreSupportsTarget && jresname != null); } } - } + }); } final String pattern = "z"; From f3da2784789f6044108f3f242c62913d99d5aee1 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Tue, 14 Oct 2025 14:15:13 +0000 Subject: [PATCH 169/323] 8343875: Minor improvements of jpackage test library Reviewed-by: mbaesken Backport-of: 95a00f8a188048952871a10dc428566b18b91cb8 --- .../jdk/jpackage/test/JavaAppDescTest.java | 98 +++++++ .../jdk/jpackage/test/TKitTest.java | 244 ++++++++++++++++++ .../jdk/jpackage/test/TestSuite.java | 63 +++++ .../helpers/jdk/jpackage/test/Functional.java | 14 +- .../helpers/jdk/jpackage/test/HelloApp.java | 16 +- .../jdk/jpackage/test/JavaAppDesc.java | 62 ++++- .../jdk/jpackage/test/PackageTest.java | 8 +- .../helpers/jdk/jpackage/test/TKit.java | 64 +++-- .../jpackage/share/AddLShortcutTest.java | 4 +- .../tools/jpackage/share/AddLauncherTest.java | 7 +- 10 files changed, 525 insertions(+), 55 deletions(-) create mode 100644 test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/JavaAppDescTest.java create mode 100644 test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/TKitTest.java create mode 100644 test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/TestSuite.java diff --git a/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/JavaAppDescTest.java b/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/JavaAppDescTest.java new file mode 100644 index 000000000000..a2cde44f0095 --- /dev/null +++ b/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/JavaAppDescTest.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2024, 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 jdk.jpackage.test; + +import java.nio.file.Path; +import java.util.List; +import java.util.function.UnaryOperator; +import jdk.jpackage.test.Annotations.Parameter; +import jdk.jpackage.test.Annotations.Test; +import jdk.jpackage.test.Annotations.Parameters; + +public class JavaAppDescTest { + + public JavaAppDescTest(JavaAppDesc expectedAppDesc, JavaAppDesc actualAppDesc) { + this.expectedAppDesc = expectedAppDesc; + this.actualAppDesc = actualAppDesc; + } + + @Test + public void test() { + TKit.assertEquals(expectedAppDesc.toString(), actualAppDesc.toString(), null); + TKit.assertTrue(expectedAppDesc.equals(actualAppDesc), null); + } + + @Test + @Parameter({"Foo", "Foo.class"}) + @Parameter({"com.bar.A", "com/bar/A.class"}) + @Parameter({"module/com.bar.A", "com/bar/A.class"}) + public static void testClassFilePath(String... args) { + var appDesc = args[0]; + var expectedClassFilePath = Path.of(args[1]); + TKit.assertEquals(expectedClassFilePath.toString(), JavaAppDesc.parse( + appDesc).classFilePath().toString(), null); + } + + @Parameters + public static List input() { + return List.of(new Object[][] { + createTestCase("", "hello.jar:Hello"), + createTestCase("foo.jar*", "foo.jar*hello.jar:Hello"), + createTestCase("Bye", "hello.jar:Bye"), + createTestCase("bye.jar:", "bye.jar:Hello"), + createTestCase("duke.jar:com.other/com.other.foo.bar.Buz!@3.7", appDesc -> { + return appDesc + .setBundleFileName("duke.jar") + .setModuleName("com.other") + .setClassName("com.other.foo.bar.Buz") + .setWithMainClass(true) + .setModuleVersion("3.7"); + }), + }); + } + + private static JavaAppDesc[] createTestCase(String inputAppDesc, String expectedAppDescStr) { + return createTestCase(inputAppDesc, appDesc -> { + return stripDefaultSrcJavaPath(JavaAppDesc.parse(expectedAppDescStr)); + }); + } + + private static JavaAppDesc stripDefaultSrcJavaPath(JavaAppDesc appDesc) { + var defaultAppDesc = HelloApp.createDefaltAppDesc(); + if (appDesc.srcJavaPath().equals(defaultAppDesc.srcJavaPath())) { + appDesc.setSrcJavaPath(null); + } + return appDesc; + } + + private static JavaAppDesc[] createTestCase(String appDesc, UnaryOperator config) { + var actualAppDesc = stripDefaultSrcJavaPath(JavaAppDesc.parse(appDesc)); + + var expectedAppDesc = config.apply(stripDefaultSrcJavaPath(HelloApp.createDefaltAppDesc())); + + return new JavaAppDesc[] {expectedAppDesc, actualAppDesc}; + } + + private final JavaAppDesc expectedAppDesc; + private final JavaAppDesc actualAppDesc; +} diff --git a/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/TKitTest.java b/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/TKitTest.java new file mode 100644 index 000000000000..3f55c3c50aea --- /dev/null +++ b/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/TKitTest.java @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2024, 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 jdk.jpackage.test; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStreamReader; +import java.io.PrintStream; +import java.lang.reflect.Method; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Objects; +import java.util.stream.Stream; +import jdk.jpackage.test.Annotations.Parameters; +import jdk.jpackage.test.Annotations.Test; +import jdk.jpackage.test.Functional.ThrowingRunnable; +import static jdk.jpackage.test.Functional.ThrowingRunnable.toRunnable; +import static jdk.jpackage.test.Functional.ThrowingSupplier.toSupplier; + +public class TKitTest { + + @Parameters + public static Collection assertTestsData() { + List data = new ArrayList<>(); + + var assertFunc = MethodCallConfig.build("assertTrue", boolean.class, String.class); + data.addAll(List.of(assertFunc.args(true).pass().expectLog("assertTrue()").createForMessage("Catbird"))); + data.addAll(List.of(assertFunc.args(false).fail().expectLog("Failed").createForMessage("Catbird"))); + + assertFunc = MethodCallConfig.build("assertFalse", boolean.class, String.class); + data.addAll(List.of(assertFunc.args(false).pass().expectLog("assertFalse()").createForMessage("Stork"))); + data.addAll(List.of(assertFunc.args(true).fail().expectLog("Failed").createForMessage("Stork"))); + + assertFunc = MethodCallConfig.build("assertEquals", String.class, String.class, String.class); + data.addAll(List.of(assertFunc.args("a", "a").pass().expectLog("assertEquals(a)").createForMessage("Crow"))); + data.addAll(List.of(assertFunc.args("a", "b").fail().expectLog("Expected [a]. Actual [b]").createForMessage("Crow"))); + + assertFunc = MethodCallConfig.build("assertEquals", long.class, long.class, String.class); + data.addAll(List.of(assertFunc.args(7, 7).pass().expectLog("assertEquals(7)").createForMessage("Owl"))); + data.addAll(List.of(assertFunc.args(7, 10).fail().expectLog("Expected [7]. Actual [10]").createForMessage("Owl"))); + + assertFunc = MethodCallConfig.build("assertNotEquals", String.class, String.class, String.class); + data.addAll(List.of(assertFunc.args("a", "b").pass().expectLog("assertNotEquals(a, b)").createForMessage("Tit"))); + data.addAll(List.of(assertFunc.args("a", "a").fail().expectLog("Unexpected [a] value").createForMessage("Tit"))); + + assertFunc = MethodCallConfig.build("assertNotEquals", long.class, long.class, String.class); + data.addAll(List.of(assertFunc.args(7, 10).pass().expectLog("assertNotEquals(7, 10)").createForMessage("Duck"))); + data.addAll(List.of(assertFunc.args(7, 7).fail().expectLog("Unexpected [7] value").createForMessage("Duck"))); + + assertFunc = MethodCallConfig.build("assertNull", Object.class, String.class); + data.addAll(List.of(assertFunc.args((Object) null).pass().expectLog("assertNull()").createForMessage("Ibis"))); + data.addAll(List.of(assertFunc.args("v").fail().expectLog("Unexpected not null value [v]").createForMessage("Ibis"))); + + assertFunc = MethodCallConfig.build("assertNotNull", Object.class, String.class); + data.addAll(List.of(assertFunc.args("v").pass().expectLog("assertNotNull(v)").createForMessage("Pigeon"))); + data.addAll(List.of(assertFunc.args((Object) null).fail().expectLog("Unexpected null value").createForMessage("Pigeon"))); + + assertFunc = MethodCallConfig.build("assertStringListEquals", List.class, List.class, String.class); + data.addAll(List.of(assertFunc.args(List.of(), List.of()).pass().expectLog( + "assertStringListEquals()").createForMessage("Gull"))); + + data.addAll(List.of(assertFunc.args(List.of("a", "b"), List.of("a", "b")).pass().expectLog( + "assertStringListEquals()", + "assertStringListEquals(1, a)", + "assertStringListEquals(2, b)").createForMessage("Pelican"))); + + assertFunc.fail().withAutoExpectLogPrefix(false); + for (var msg : new String[] { "Raven", null }) { + data.addAll(List.of(assertFunc.args(List.of("a"), List.of("a", "b"), msg).expectLog( + concatMessages("TRACE: assertStringListEquals()", msg), + "TRACE: assertStringListEquals(1, a)", + concatMessages("ERROR: Actual list is longer than expected by 1 elements", msg) + ).create())); + + data.addAll(List.of(assertFunc.args(List.of("n", "m"), List.of("n"), msg).expectLog( + concatMessages("TRACE: assertStringListEquals()", msg), + "TRACE: assertStringListEquals(1, n)", + concatMessages("ERROR: Actual list is shorter than expected by 1 elements", msg) + ).create())); + + data.addAll(List.of(assertFunc.args(List.of("a", "b"), List.of("n", "m"), msg).expectLog( + concatMessages("TRACE: assertStringListEquals()", msg), + concatMessages("ERROR: (1) Expected [a]. Actual [n]", msg) + ).create())); + } + + return data.stream().map(v -> { + return new Object[]{v}; + }).toList(); + } + + public record MethodCallConfig(Method method, Object[] args, boolean expectFail, String[] expectLog) { + @Override + public String toString() { + return String.format("%s%s%s", method.getName(), Arrays.toString(args), expectFail ? "!" : ""); + } + + static Builder build(String name, Class ... parameterTypes) { + return new Builder(name, parameterTypes); + } + + private static class Builder { + Builder(Method method) { + Objects.requireNonNull(method); + this.method = method; + } + + Builder(String name, Class ... parameterTypes) { + method = toSupplier(() -> TKit.class.getMethod(name, parameterTypes)).get(); + } + + MethodCallConfig create() { + String[] effectiveExpectLog; + if (!withAutoExpectLogPrefix) { + effectiveExpectLog = expectLog; + } else { + var prefix = expectFail ? "ERROR: " : "TRACE: "; + effectiveExpectLog = Stream.of(expectLog).map(line -> { + return prefix + line; + }).toArray(String[]::new); + } + return new MethodCallConfig(method, args, expectFail, effectiveExpectLog); + } + + MethodCallConfig[] createForMessage(String msg) { + return Arrays.asList(msg, null).stream().map(curMsg -> { + var builder = new Builder(method); + builder.expectFail = expectFail; + builder.withAutoExpectLogPrefix = withAutoExpectLogPrefix; + builder.args = Stream.concat(Stream.of(args), Stream.of(curMsg)).toArray(); + builder.expectLog = Arrays.copyOf(expectLog, expectLog.length); + builder.expectLog[0] = concatMessages(builder.expectLog[0], curMsg); + return builder.create(); + }).toArray(MethodCallConfig[]::new); + } + + Builder fail() { + expectFail = true; + return this; + } + + Builder pass() { + expectFail = false; + return this; + } + + Builder args(Object ... v) { + args = v; + return this; + } + + Builder expectLog(String expectLogFirstStr, String ... extra) { + expectLog = Stream.concat(Stream.of(expectLogFirstStr), Stream.of(extra)).toArray(String[]::new); + return this; + } + + Builder withAutoExpectLogPrefix(boolean v) { + withAutoExpectLogPrefix = v; + return this; + } + + private final Method method; + private Object[] args = new Object[0]; + private boolean expectFail; + private String[] expectLog; + private boolean withAutoExpectLogPrefix = true; + } + } + + public TKitTest(MethodCallConfig methodCall) { + this.methodCall = methodCall; + } + + @Test + public void test() { + runAssertWithExpectedLogOutput(() -> { + methodCall.method.invoke(null, methodCall.args); + }, methodCall.expectFail, methodCall.expectLog); + } + + private static void runAssertWithExpectedLogOutput(ThrowingRunnable action, + boolean expectFail, String... expectLogStrings) { + runWithExpectedLogOutput(() -> { + TKit.assertAssert(!expectFail, toRunnable(action)); + }, expectLogStrings); + } + + private static void runWithExpectedLogOutput(ThrowingRunnable action, + String... expectLogStrings) { + final var buf = new ByteArrayOutputStream(); + try (PrintStream ps = new PrintStream(buf, true, StandardCharsets.UTF_8)) { + TKit.withExtraLogStream(action, ps); + } finally { + toRunnable(() -> { + var output = new BufferedReader(new InputStreamReader( + new ByteArrayInputStream(buf.toByteArray()), + StandardCharsets.UTF_8)).lines().map(line -> { + // Skip timestamp + return line.substring(LOG_MSG_TIMESTAMP_LENGTH); + }).toList(); + if (output.size() == 1 && expectLogStrings.length == 1) { + TKit.assertEquals(expectLogStrings[0], output.get(0), null); + } else { + TKit.assertStringListEquals(List.of(expectLogStrings), output, null); + } + }).run(); + } + } + + private static String concatMessages(String msg, String msg2) { + if (msg2 != null && !msg2.isBlank()) { + return msg + ": " + msg2; + } + return msg; + } + + private final MethodCallConfig methodCall; + + private static final int LOG_MSG_TIMESTAMP_LENGTH = "[HH:mm:ss.SSS] ".length(); +} diff --git a/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/TestSuite.java b/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/TestSuite.java new file mode 100644 index 000000000000..f9dda8514146 --- /dev/null +++ b/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/TestSuite.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2024, 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 jdk.jpackage.test; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +/* + * @test + * @summary Unit tests for jpackage test library + * @library /test/jdk/tools/jpackage/helpers + * @library /test/jdk/tools/jpackage/helpers-test + * @build jdk.jpackage.test.* + * @run main/othervm/timeout=360 -Xmx512m jdk.jpackage.test.TestSuite + */ + +public final class TestSuite { + public static void main(String args[]) throws Throwable { + final var pkgName = TestSuite.class.getPackageName(); + final var javaSuffix = ".java"; + final var testSrcNameSuffix = "Test" + javaSuffix; + + final var unitTestDir = TKit.TEST_SRC_ROOT.resolve(Path.of("helpers-test", pkgName.split("\\."))); + + final List runTestArgs = new ArrayList<>(); + runTestArgs.addAll(List.of(args)); + + try (var javaSources = Files.list(unitTestDir)) { + runTestArgs.addAll(javaSources.filter(path -> { + return path.getFileName().toString().endsWith(testSrcNameSuffix); + }).map(path -> { + var filename = path.getFileName().toString(); + return String.join(".", pkgName, filename.substring(0, filename.length() - javaSuffix.length())); + }).map(testClassName -> { + return "--jpt-run=" + testClassName; + }).toList()); + } + + Main.main(runTestArgs.toArray(String[]::new)); + } +} diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/Functional.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/Functional.java index 87718c1394c2..a57caa92cb20 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/Functional.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/Functional.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, 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 @@ -151,12 +151,16 @@ public ExceptionBox(Throwable throwable) { @SuppressWarnings("unchecked") public static RuntimeException rethrowUnchecked(Throwable throwable) throws ExceptionBox { - if (throwable instanceof RuntimeException) { - throw (RuntimeException)throwable; + if (throwable instanceof RuntimeException err) { + throw err; } - if (throwable instanceof InvocationTargetException) { - throw new ExceptionBox(throwable.getCause()); + if (throwable instanceof Error err) { + throw err; + } + + if (throwable instanceof InvocationTargetException err) { + throw rethrowUnchecked(err.getCause()); } throw new ExceptionBox(throwable); diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/HelloApp.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/HelloApp.java index 3bd3b42d5951..bc722e7acd92 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/HelloApp.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/HelloApp.java @@ -22,7 +22,6 @@ */ package jdk.jpackage.test; -import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -57,15 +56,10 @@ public final class HelloApp { private JarBuilder prepareSources(Path srcDir) throws IOException { final String srcClassName = appDesc.srcClassName(); - - final String qualifiedClassName = appDesc.className(); - - final String className = qualifiedClassName.substring( - qualifiedClassName.lastIndexOf('.') + 1); + final String className = appDesc.shortClassName(); final String packageName = appDesc.packageName(); - final Path srcFile = srcDir.resolve(Path.of(String.join( - File.separator, qualifiedClassName.split("\\.")) + ".java")); + final Path srcFile = srcDir.resolve(appDesc.classNameAsPath(".java")); Files.createDirectories(srcFile.getParent()); JarBuilder jarBuilder = createJarBuilder().addSourceFile(srcFile); @@ -351,7 +345,7 @@ public static AppOutputVerifier assertMainLauncher(JPackageCommand cmd, } - public final static class AppOutputVerifier { + public static final class AppOutputVerifier { AppOutputVerifier(Path helloAppLauncher) { this.launcherPath = helloAppLauncher; this.outputFilePath = TKit.workDir().resolve(OUTPUT_FILENAME); @@ -493,13 +487,13 @@ public static AppOutputVerifier assertApp(Path helloAppLauncher) { return new AppOutputVerifier(helloAppLauncher); } - final static String OUTPUT_FILENAME = "appOutput.txt"; + static final String OUTPUT_FILENAME = "appOutput.txt"; private final JavaAppDesc appDesc; private static final Path HELLO_JAVA = TKit.TEST_SRC_ROOT.resolve( "apps/Hello.java"); - private final static String CLASS_NAME = HELLO_JAVA.getFileName().toString().split( + private static final String CLASS_NAME = HELLO_JAVA.getFileName().toString().split( "\\.", 2)[0]; } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JavaAppDesc.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JavaAppDesc.java index 6a798012ca78..c0807deef3b0 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JavaAppDesc.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JavaAppDesc.java @@ -22,8 +22,9 @@ */ package jdk.jpackage.test; -import java.io.File; import java.nio.file.Path; +import java.util.Objects; +import java.util.stream.Stream; public final class JavaAppDesc { @@ -73,9 +74,18 @@ public String className() { return qualifiedClassName; } + public String shortClassName() { + return qualifiedClassName.substring(qualifiedClassName.lastIndexOf('.') + 1); + } + + Path classNameAsPath(String extension) { + final String[] pathComponents = qualifiedClassName.split("\\."); + pathComponents[pathComponents.length - 1] = shortClassName() + extension; + return Stream.of(pathComponents).map(Path::of).reduce(Path::resolve).get(); + } + public Path classFilePath() { - return Path.of(qualifiedClassName.replace(".", File.separator) - + ".class"); + return classNameAsPath(".class"); } public String moduleName() { @@ -124,6 +134,48 @@ public boolean isWithMainClass() { return withMainClass; } + @Override + public int hashCode() { + int hash = 5; + hash = 79 * hash + Objects.hashCode(this.srcJavaPath); + hash = 79 * hash + Objects.hashCode(this.qualifiedClassName); + hash = 79 * hash + Objects.hashCode(this.moduleName); + hash = 79 * hash + Objects.hashCode(this.bundleFileName); + hash = 79 * hash + Objects.hashCode(this.moduleVersion); + hash = 79 * hash + (this.withMainClass ? 1 : 0); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final JavaAppDesc other = (JavaAppDesc) obj; + if (this.withMainClass != other.withMainClass) { + return false; + } + if (!Objects.equals(this.qualifiedClassName, other.qualifiedClassName)) { + return false; + } + if (!Objects.equals(this.moduleName, other.moduleName)) { + return false; + } + if (!Objects.equals(this.bundleFileName, other.bundleFileName)) { + return false; + } + if (!Objects.equals(this.moduleVersion, other.moduleVersion)) { + return false; + } + return Objects.equals(this.srcJavaPath, other.srcJavaPath); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); @@ -216,7 +268,9 @@ public static JavaAppDesc parse(final String javaAppDesc) { components[0].length() - 1); desc.setWithMainClass(true); } - desc.setClassName(components[0]); + if (!components[0].isEmpty()) { + desc.setClassName(components[0]); + } if (components.length == 2) { desc.setModuleVersion(components[1]); } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PackageTest.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PackageTest.java index d597c62d83f1..d89307458471 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PackageTest.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PackageTest.java @@ -22,9 +22,7 @@ */ package jdk.jpackage.test; -import java.awt.Desktop; import java.awt.GraphicsEnvironment; -import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -778,7 +776,7 @@ private static Map createDefaultPackageHandlers() private Set namedInitializers; private Map packageHandlers; - private final static File BUNDLE_OUTPUT_DIR; + private static final Path BUNDLE_OUTPUT_DIR; static { final String propertyName = "output"; @@ -786,9 +784,9 @@ private static Map createDefaultPackageHandlers() if (val == null) { BUNDLE_OUTPUT_DIR = null; } else { - BUNDLE_OUTPUT_DIR = new File(val).getAbsoluteFile(); + BUNDLE_OUTPUT_DIR = Path.of(val).toAbsolutePath(); - if (!BUNDLE_OUTPUT_DIR.isDirectory()) { + if (!Files.isDirectory(BUNDLE_OUTPUT_DIR)) { throw new IllegalArgumentException(String.format("Invalid value of %s sytem property: [%s]. Should be existing directory", TKit.getConfigPropertyName(propertyName), BUNDLE_OUTPUT_DIR)); diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java index 04d2bff94b17..d9b97165ccec 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java @@ -23,7 +23,6 @@ package jdk.jpackage.test; import java.io.Closeable; -import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; @@ -107,14 +106,21 @@ static void withExtraLogStream(ThrowingRunnable action) { ThrowingRunnable.toRunnable(action).run(); } else { try (PrintStream logStream = openLogStream()) { - extraLogStream = logStream; - ThrowingRunnable.toRunnable(action).run(); - } finally { - extraLogStream = null; + withExtraLogStream(action, logStream); } } } + static void withExtraLogStream(ThrowingRunnable action, PrintStream logStream) { + var oldExtraLogStream = extraLogStream; + try { + extraLogStream = logStream; + ThrowingRunnable.toRunnable(action).run(); + } finally { + extraLogStream = oldExtraLogStream; + } + } + static void runTests(List tests) { if (currentTest != null) { throw new IllegalStateException( @@ -187,11 +193,7 @@ public static boolean isLinux() { } public static boolean isLinuxAPT() { - if (!isLinux()) { - return false; - } - File aptFile = new File("/usr/bin/apt-get"); - return aptFile.exists(); + return isLinux() && Files.exists(Path.of("/usr/bin/apt-get")); } private static String addTimestamp(String msg) { @@ -275,6 +277,22 @@ public static void error(String v) { throw new AssertionError(v); } + static void assertAssert(boolean expectedSuccess, Runnable runnable) { + try { + runnable.run(); + } catch (AssertionError err) { + if (expectedSuccess) { + assertUnexpected("Assertion failed"); + } else { + return; + } + } + + if (!expectedSuccess) { + assertUnexpected("Assertion passed"); + } + } + private final static String TEMP_FILE_PREFIX = null; private static Path createUniqueFileName(String defaultName) { @@ -580,7 +598,7 @@ public static void assertEquals(long expected, long actual, String msg) { msg)); } - traceAssert(String.format("assertEquals(%d): %s", expected, msg)); + traceAssert(concatMessages(String.format("assertEquals(%d)", expected), msg)); } public static void assertNotEquals(long expected, long actual, String msg) { @@ -590,8 +608,8 @@ public static void assertNotEquals(long expected, long actual, String msg) { msg)); } - traceAssert(String.format("assertNotEquals(%d, %d): %s", expected, - actual, msg)); + traceAssert(concatMessages(String.format("assertNotEquals(%d, %d)", expected, + actual), msg)); } public static void assertEquals(String expected, String actual, String msg) { @@ -603,7 +621,7 @@ public static void assertEquals(String expected, String actual, String msg) { msg)); } - traceAssert(String.format("assertEquals(%s): %s", expected, msg)); + traceAssert(concatMessages(String.format("assertEquals(%s)", expected), msg)); } public static void assertNotEquals(String expected, String actual, String msg) { @@ -611,8 +629,8 @@ public static void assertNotEquals(String expected, String actual, String msg) { if ((actual != null && !actual.equals(expected)) || (expected != null && !expected.equals(actual))) { - traceAssert(String.format("assertNotEquals(%s, %s): %s", expected, - actual, msg)); + traceAssert(concatMessages(String.format("assertNotEquals(%s, %s)", expected, + actual), msg)); return; } @@ -626,7 +644,7 @@ public static void assertNull(Object value, String msg) { value), msg)); } - traceAssert(String.format("assertNull(): %s", msg)); + traceAssert(concatMessages("assertNull()", msg)); } public static void assertNotNull(Object value, String msg) { @@ -635,7 +653,7 @@ public static void assertNotNull(Object value, String msg) { error(concatMessages("Unexpected null value", msg)); } - traceAssert(String.format("assertNotNull(%s): %s", value, msg)); + traceAssert(concatMessages(String.format("assertNotNull(%s)", value), msg)); } public static void assertTrue(boolean actual, String msg) { @@ -655,7 +673,7 @@ public static void assertTrue(boolean actual, String msg, Runnable onFail) { error(concatMessages("Failed", msg)); } - traceAssert(String.format("assertTrue(): %s", msg)); + traceAssert(concatMessages("assertTrue()", msg)); } public static void assertFalse(boolean actual, String msg, Runnable onFail) { @@ -667,7 +685,7 @@ public static void assertFalse(boolean actual, String msg, Runnable onFail) { error(concatMessages("Failed", msg)); } - traceAssert(String.format("assertFalse(): %s", msg)); + traceAssert(concatMessages("assertFalse()", msg)); } public static void assertPathExists(Path path, boolean exists) { @@ -826,7 +844,7 @@ public static void assertStringListEquals(List expected, List actual, String msg) { currentTest.notifyAssert(); - traceAssert(String.format("assertStringListEquals(): %s", msg)); + traceAssert(concatMessages("assertStringListEquals()", msg)); String idxFieldFormat = Functional.identity(() -> { int listSize = expected.size(); @@ -856,7 +874,7 @@ public static void assertStringListEquals(List expected, expectedStr)); }); - if (expected.size() < actual.size()) { + if (actual.size() > expected.size()) { // Actual string list is longer than expected error(concatMessages(String.format( "Actual list is longer than expected by %d elements", @@ -866,7 +884,7 @@ public static void assertStringListEquals(List expected, if (actual.size() < expected.size()) { // Actual string list is shorter than expected error(concatMessages(String.format( - "Actual list is longer than expected by %d elements", + "Actual list is shorter than expected by %d elements", expected.size() - actual.size()), msg)); } } diff --git a/test/jdk/tools/jpackage/share/AddLShortcutTest.java b/test/jdk/tools/jpackage/share/AddLShortcutTest.java index 92784abd5cc1..5b55d906cf16 100644 --- a/test/jdk/tools/jpackage/share/AddLShortcutTest.java +++ b/test/jdk/tools/jpackage/share/AddLShortcutTest.java @@ -22,8 +22,6 @@ */ import java.nio.file.Path; -import java.io.File; -import java.util.Map; import java.lang.invoke.MethodHandles; import jdk.jpackage.test.PackageTest; import jdk.jpackage.test.FileAssociations; @@ -109,6 +107,6 @@ public void test() { packageTest.run(); } - private final static Path GOLDEN_ICON = TKit.TEST_SRC_ROOT.resolve(Path.of( + private static final Path GOLDEN_ICON = TKit.TEST_SRC_ROOT.resolve(Path.of( "resources", "icon" + TKit.ICON_SUFFIX)); } diff --git a/test/jdk/tools/jpackage/share/AddLauncherTest.java b/test/jdk/tools/jpackage/share/AddLauncherTest.java index ae774b86f3ad..af0efc4fb86e 100644 --- a/test/jdk/tools/jpackage/share/AddLauncherTest.java +++ b/test/jdk/tools/jpackage/share/AddLauncherTest.java @@ -22,7 +22,6 @@ */ import java.nio.file.Path; -import java.io.File; import java.util.Map; import java.lang.invoke.MethodHandles; import jdk.jpackage.test.PackageTest; @@ -229,11 +228,11 @@ public void testMainLauncherIsModular(boolean mainLauncherIsModular) { TKit.assertEquals(ExpectedCN, mainClass, String.format("Check value of app.mainclass=[%s]" + "in NonModularAppLauncher cfg file is as expected", ExpectedCN)); - TKit.assertTrue(classpath.startsWith("$APPDIR" + File.separator - + nonModularAppDesc.jarFileName()), + TKit.assertTrue(classpath.startsWith(Path.of("$APPDIR", + nonModularAppDesc.jarFileName()).toString()), "Check app.classpath value in ModularAppLauncher cfg file"); } - private final static Path GOLDEN_ICON = TKit.TEST_SRC_ROOT.resolve(Path.of( + private static final Path GOLDEN_ICON = TKit.TEST_SRC_ROOT.resolve(Path.of( "resources", "icon" + TKit.ICON_SUFFIX)); } From 7e6148aaa5cbaa2439e91681921b905603b3396d Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Tue, 14 Oct 2025 17:29:10 +0000 Subject: [PATCH 170/323] 8354553: Open source several clipboard tests batch0 Backport-of: b10a304b2bdec5fdd3d689ae8fcd341e68e80b72 --- test/jdk/ProblemList.txt | 4 + .../java/awt/Clipboard/ClipboardSecurity.java | 156 ++++++ .../SystemClipboardTest.java | 227 ++++++++ .../java/awt/Clipboard/ImageTransferTest.java | 519 ++++++++++++++++++ .../NoDataConversionFailureTest.java | 173 ++++++ 5 files changed, 1079 insertions(+) create mode 100644 test/jdk/java/awt/Clipboard/ClipboardSecurity.java create mode 100644 test/jdk/java/awt/Clipboard/GetAltContentsTest/SystemClipboardTest.java create mode 100644 test/jdk/java/awt/Clipboard/ImageTransferTest.java create mode 100644 test/jdk/java/awt/Clipboard/NoDataConversionFailureTest.java diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index b944661ccee4..42022b87e86a 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -261,6 +261,10 @@ java/awt/Clipboard/PasteNullToTextComponentsTest.java 8234140 macosx-all,windows java/awt/Clipboard/NoOwnerNoTargetsTest.java 8234140 macosx-all java/awt/Clipboard/LostOwnershipChainTest/SystemClipboard2ProcTest.java 8234140 macosx-all java/awt/Clipboard/HTMLTransferTest/HTMLTransferTest.java 8017454 macosx-all +java/awt/Clipboard/ClipboardSecurity.java 8054809 macosx-all +java/awt/Clipboard/GetAltContentsTest/SystemClipboardTest.java 8234140 macosx-all +java/awt/Clipboard/ImageTransferTest.java 8030710 generic-all +java/awt/Clipboard/NoDataConversionFailureTest.java 8234140 macosx-all java/awt/Frame/MiscUndecorated/RepaintTest.java 8266244 macosx-aarch64 java/awt/Modal/FileDialog/FileDialogAppModal1Test.java 7186009 macosx-all java/awt/Modal/FileDialog/FileDialogAppModal2Test.java 7186009 macosx-all diff --git a/test/jdk/java/awt/Clipboard/ClipboardSecurity.java b/test/jdk/java/awt/Clipboard/ClipboardSecurity.java new file mode 100644 index 000000000000..d33cc4fca42d --- /dev/null +++ b/test/jdk/java/awt/Clipboard/ClipboardSecurity.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2000, 2025, 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 4274061 + * @summary Tests that Transferable.getTransferData() and + * SelectionOwner.lostOwnership is not called on Toolkit thread. + * @key headful + * @library /test/lib + * @run main ClipboardSecurity + */ + +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.ClipboardOwner; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.StringSelection; +import java.awt.datatransfer.Transferable; +import java.awt.datatransfer.UnsupportedFlavorException; +import java.io.IOException; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; + +public class ClipboardSecurity { + static Clipboard clip = null; + public static final CountDownLatch latch = new CountDownLatch(1); + public static volatile boolean hasError = false; + + public static void main(String[] args) throws Exception { + if (args.length == 0) { + ClipboardSecurity clipboardSecurity = new ClipboardSecurity(); + clipboardSecurity.start(); + return; + } + + try { + clip = Toolkit.getDefaultToolkit().getSystemClipboard(); + if ( clip == null ) { + throw (new RuntimeException("Clipboard is null")); + } + Transferable data = clip.getContents(null); + if ( data == null ) { + throw (new RuntimeException("Data is null")); + } + System.out.println("Clipboard contents: " + data); + // First check - getTransferData + try { + String contData = + (String) data.getTransferData(DataFlavor.stringFlavor); + } catch (UnsupportedFlavorException | IOException exc) { + throw(new RuntimeException("Couldn't get transfer data - " + + exc.getMessage())); + } + // Second check - lostOwnership + MyClass clipData = new MyClass("clipbard test data"); + clip.setContents(clipData, clipData); + System.out.println("exit 0"); + System.exit(0); + } catch (RuntimeException exc) { + System.err.println(exc.getMessage()); + System.out.println("exit 2"); + System.exit(2); + } + } + + public void start() throws Exception { + clip = Toolkit.getDefaultToolkit().getSystemClipboard(); + if (clip == null) { + throw (new RuntimeException("Clipboard is null")); + } + MyClass clipData = new MyClass("clipboard test data"); + clip.setContents(clipData, clipData); + + ProcessBuilder pb = ProcessTools.createTestJavaProcessBuilder( + ClipboardSecurity.class.getName(), + "child" + ); + + Process process = ProcessTools.startProcess("Child", pb); + OutputAnalyzer outputAnalyzer = new OutputAnalyzer(process); + + if (!process.waitFor(15, TimeUnit.SECONDS)) { + process.destroyForcibly(); + throw new TimeoutException("Timed out waiting for Child"); + } + System.out.println("WAIT COMPLETE"); + + outputAnalyzer.shouldHaveExitValue(0); + + if (!latch.await(10, TimeUnit.SECONDS)) { + throw new RuntimeException("timed out"); + } + + if (hasError) { + throw new RuntimeException("Detected call on Toolkit thread"); + } + + System.out.println("Passed."); + } +} + +class MyClass extends StringSelection implements ClipboardOwner { + MyClass(String title) { + super(title); + } + + private void checkIsCorrectThread(String reason) { + System.out.println("Checking " + reason + " for thread " + + Thread.currentThread().getName()); + String name = Thread.currentThread().getName(); + if (name.equals("AWT-Windows") || name.equals("AWT-Motif")) { + ClipboardSecurity.hasError = true; + System.err.println(reason + " is called on Toolkit thread!"); + } + } + + public void lostOwnership(Clipboard clip, Transferable cont) { + checkIsCorrectThread("lostOwnership"); + ClipboardSecurity.latch.countDown(); + System.out.println("lost ownership on " + + Thread.currentThread().getName() + " thread"); + } + + public Object getTransferData(DataFlavor flav) + throws UnsupportedFlavorException, IOException { + System.out.println("getTransferData on " + + Thread.currentThread().getName() + " thread"); + checkIsCorrectThread("getTransferData"); + return super.getTransferData(flav); + } +} diff --git a/test/jdk/java/awt/Clipboard/GetAltContentsTest/SystemClipboardTest.java b/test/jdk/java/awt/Clipboard/GetAltContentsTest/SystemClipboardTest.java new file mode 100644 index 000000000000..6aaa431fb3bb --- /dev/null +++ b/test/jdk/java/awt/Clipboard/GetAltContentsTest/SystemClipboardTest.java @@ -0,0 +1,227 @@ +/* + * Copyright (c) 2003, 2025, 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 4287795 4790833 + * @summary tests new Clipboard methods: getAvailableDataFlavors, + * isDataFlavorAvailable, getData + * @key headful + * @library /test/lib + * @run main SystemClipboardTest + */ + +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.ClipboardOwner; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.StringSelection; +import java.awt.datatransfer.Transferable; +import java.awt.datatransfer.UnsupportedFlavorException; +import java.io.IOException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; + + +public class SystemClipboardTest { + + private static final Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + + private static final String contentsText = "contents text"; + + public void start() throws Exception { + Util.setClipboardContents(clipboard, new StringSelection(contentsText), new ClipboardOwner() { + public void lostOwnership(Clipboard clpbrd, Transferable cntnts) { + check(); // clipboard data retrieved from the system clipboard + Util.setClipboardContents(clipboard, new StringSelection(contentsText), null); + } + }); + + check(); // JVM-local clipboard data + + ProcessBuilder pb = ProcessTools.createTestJavaProcessBuilder( + SystemClipboardTest.class.getName(), + "child" + ); + + Process process = ProcessTools.startProcess("Child", pb); + OutputAnalyzer outputAnalyzer = new OutputAnalyzer(process); + + if (!process.waitFor(15, TimeUnit.SECONDS)) { + process.destroyForcibly(); + throw new TimeoutException("Timed out waiting for Child"); + } + + outputAnalyzer.shouldHaveExitValue(0); + } + + private void check() { + boolean failed = false; + + Transferable contents = Util.getClipboardContents(clipboard, null); + Set flavorsT = new HashSet<>(Arrays.asList(contents.getTransferDataFlavors())); + Set flavorsA = new HashSet<>(Arrays.asList(Util.getClipboardAvailableDataFlavors(clipboard))); + System.err.println("getAvailableDataFlavors(): " + flavorsA); + if (!flavorsA.equals(flavorsT)) { + failed = true; + System.err.println("FAILURE: getAvailableDataFlavors() returns incorrect " + + "DataFlavors: " + flavorsA + "\nwhile getContents()." + + "getTransferDataFlavors() return: " + flavorsT); + } + + if (!Util.isClipboardDataFlavorAvailable(clipboard, DataFlavor.stringFlavor)) { + failed = true; + System.err.println("FAILURE: isDataFlavorAvailable(DataFlavor.stringFlavor) " + + "returns false"); + } + + Object data = null; + try { + data = Util.getClipboardData(clipboard, DataFlavor.stringFlavor); + } catch (UnsupportedFlavorException exc) { + failed = true; + exc.printStackTrace(); + } catch (IOException exc) { + failed = true; + exc.printStackTrace(); + } + System.err.println("getData(): " + data); + if (!contentsText.equals(data)) { + failed = true; + System.err.println("FAILURE: getData() returns: " + data + + ", that is not equal to: \"" + contentsText + "\""); + + } + + if (failed) { + throw new RuntimeException("test failed, for details see output above"); + } + } + + public static void main(String[] args) throws Exception { + if (args.length == 0) { + SystemClipboardTest systemClipboardTest = new SystemClipboardTest(); + systemClipboardTest.start(); + return; + } + + System.err.println("child VM: setting clipboard contents"); + + CountDownLatch latch = new CountDownLatch(1); + Util.setClipboardContents(clipboard, new StringSelection(contentsText), + (clpbrd, cntnts) -> { + System.err.println("child VM: success"); + latch.countDown(); + }); + + if (!latch.await(15, TimeUnit.SECONDS)) { + throw new RuntimeException("child VM failed"); + } + } +} + +class Util { + public static void setClipboardContents(Clipboard cb, + Transferable contents, + ClipboardOwner owner) { + while (true) { + try { + cb.setContents(contents, owner); + return; + } catch (IllegalStateException ise) { + ise.printStackTrace(); + try { + Thread.sleep(100); + } catch (InterruptedException ie) { + ie.printStackTrace(); + } + } + } + } + + public static Transferable getClipboardContents(Clipboard cb, + Object requestor) { + while (true) { + try { + return cb.getContents(requestor); + } catch (IllegalStateException ise) { + try { + Thread.sleep(100); + } catch (InterruptedException ie) { + ie.printStackTrace(); + } + } + } + } + + public static Object getClipboardData(Clipboard cb, DataFlavor flavor) + throws IOException, UnsupportedFlavorException { + while (true) { + try { + return cb.getData(flavor); + } catch (IllegalStateException ise) { + try { + Thread.sleep(100); + } catch (InterruptedException ie) { + ie.printStackTrace(); + } + } + } + } + + public static DataFlavor[] getClipboardAvailableDataFlavors(Clipboard cb) { + while (true) { + try { + return cb.getAvailableDataFlavors(); + } catch (IllegalStateException ise) { + try { + Thread.sleep(100); + } catch (InterruptedException ie) { + ie.printStackTrace(); + } + } + } + } + + public static boolean isClipboardDataFlavorAvailable(Clipboard cb, + DataFlavor flavor) { + while (true) { + try { + return cb.isDataFlavorAvailable(flavor); + } catch (IllegalStateException ise) { + try { + Thread.sleep(100); + } catch (InterruptedException ie) { + ie.printStackTrace(); + } + } + } + } +} diff --git a/test/jdk/java/awt/Clipboard/ImageTransferTest.java b/test/jdk/java/awt/Clipboard/ImageTransferTest.java new file mode 100644 index 000000000000..0c407152009e --- /dev/null +++ b/test/jdk/java/awt/Clipboard/ImageTransferTest.java @@ -0,0 +1,519 @@ +/* + * Copyright (c) 2002, 2025, 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 4397404 4720930 + * @summary tests that images of all supported native image formats + * are transferred properly + * @key headful + * @library /test/lib + * @run main ImageTransferTest + */ + +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.ClipboardOwner; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.StringSelection; +import java.awt.datatransfer.SystemFlavorMap; +import java.awt.datatransfer.Transferable; +import java.awt.datatransfer.UnsupportedFlavorException; +import java.awt.image.BufferedImage; +import java.awt.image.MemoryImageSource; +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; + +public class ImageTransferTest { + public static final int CODE_NOT_RETURNED = 100; + public static final int CODE_CONSUMER_TEST_FAILED = 101; + public static final int CODE_FAILURE = 102; + + private TImageProducer imPr; + private int returnCode = CODE_NOT_RETURNED; + + public static void main(String[] args) throws Exception { + ImageTransferTest imageTransferTest = new ImageTransferTest(); + imageTransferTest.init(); + imageTransferTest.start(); + } + + public void init() { + imPr = new TImageProducer(); + imPr.begin(); + } + + public void start() throws Exception { + String formats = ""; + + String iniMsg = "Testing all native image formats from \n" + + "SystemFlavorMap.getNativesForFlavor(DataFlavor.imageFlavor) \n"; + + for (int i = 0; i < imPr.formats.length; i++) { + formats += (imPr.formats[i] + " "); + } + System.out.println(iniMsg + formats); + + ProcessBuilder pb = ProcessTools.createTestJavaProcessBuilder( + TImageConsumer.class.getName(), formats + ); + + Process process = ProcessTools.startProcess("Child", pb); + OutputAnalyzer outputAnalyzer = new OutputAnalyzer(process); + + if (!process.waitFor(15, TimeUnit.SECONDS)) { + process.destroyForcibly(); + returnCode = CODE_NOT_RETURNED; + } else { + returnCode = outputAnalyzer.getExitValue(); + } + + switch (returnCode) { + case CODE_NOT_RETURNED: + throw new RuntimeException("Child VM: failed to start"); + case CODE_FAILURE: + throw new RuntimeException("Child VM: abnormal termination"); + case CODE_CONSUMER_TEST_FAILED: + throw new RuntimeException("test failed: images in some " + + "native formats are not transferred properly: " + + "see output of child VM"); + default: + boolean failed = false; + String passedFormats = ""; + String failedFormats = ""; + + for (int i = 0; i < imPr.passedArray.length; i++) { + if (imPr.passedArray[i]) passedFormats += imPr.formats[i] + " "; + else { + failed = true; + failedFormats += imPr.formats[i] + " "; + } + } + if (failed) { + throw new RuntimeException("test failed: images in following " + + "native formats are not transferred properly: " + + failedFormats); + } else { + System.err.println("images in following native formats are " + + "transferred properly: " + passedFormats); + } + } + } +} + +abstract class ImageTransferer implements ClipboardOwner { + + static final String S_PASSED = "Y"; + static final String S_FAILED = "N"; + static final String S_BEGIN = "B"; + static final String S_BEGIN_ANSWER = "BA"; + static final String S_END = "E"; + + Image image; + + Clipboard clipboard; + + String[] formats; + int fi; // next format index + + + ImageTransferer() { + clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + image = createImage(); + } + + abstract void notifyTransferSuccess(boolean status); + + private static Image createImage() { + int w = 100; + int h = 100; + int[] pix = new int[w * h]; + + int index = 0; + for (int y = 0; y < h; y++) { + for (int x = 0; x < w; x++) { + int red = 127; + int green = 127; + int blue = y > h / 2 ? 127 : 0; + int alpha = 255; + if (x < w / 4 && y < h / 4) { + alpha = 0; + red = 0; + } + pix[index++] = (alpha << 24) | (red << 16) | (green << 8) | blue; + } + } + + return Toolkit.getDefaultToolkit(). + createImage(new MemoryImageSource(w, h, pix, 0, w)); + } + + static String[] retrieveFormatsToTest() { + SystemFlavorMap sfm = (SystemFlavorMap)SystemFlavorMap.getDefaultFlavorMap(); + java.util.List ln = sfm.getNativesForFlavor(DataFlavor.imageFlavor); + + String osName = System.getProperty("os.name").toLowerCase(); + String sMETAFILEPICT = "METAFILEPICT"; + if (osName.indexOf("win") >= 0 && !ln.contains(sMETAFILEPICT)) { + // for test failing on JDK without this fix + ln.add(sMETAFILEPICT); + } + return (String[])ln.toArray(new String[ln.size()]); + } + + static void leaveFormat(String format) { + SystemFlavorMap sfm = (SystemFlavorMap)SystemFlavorMap.getDefaultFlavorMap(); + sfm.setFlavorsForNative(format, + new DataFlavor[] { DataFlavor.imageFlavor }); + sfm.setNativesForFlavor(DataFlavor.imageFlavor, + new String[] { format }); + } + + boolean areImagesIdentical(Image im1, Image im2) { + if (formats[fi].equals("JFIF") || formats[fi].equals("image/jpeg") || + formats[fi].equals("GIF") || formats[fi].equals("image/gif")) { + // JFIF and GIF are lossy formats + return true; + } + int[] ib1 = getImageData(im1); + int[] ib2 = getImageData(im2); + + if (ib1.length != ib2.length) { + return false; + } + + if (formats[fi].equals("PNG") || + formats[fi].equals("image/png") || + formats[fi].equals("image/x-png")) { + // check alpha as well + for (int i = 0; i < ib1.length; i++) { + if (ib1[i] != ib2[i]) { + System.err.println("different pixels: " + + Integer.toHexString(ib1[i]) + " " + + Integer.toHexString(ib2[i])); + return false; + } + } + } else { + for (int i = 0; i < ib1.length; i++) { + if ((ib1[i] & 0x00FFFFFF) != (ib2[i] & 0x00FFFFFF)) { + System.err.println("different pixels: " + + Integer.toHexString(ib1[i]) + " " + + Integer.toHexString(ib2[i])); + return false; + } + } + } + return true; + } + + private static int[] getImageData(Image image) { + int width = image.getWidth(null); + int height = image.getHeight(null); + BufferedImage bimage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + Graphics2D g2d = bimage.createGraphics(); + try { + g2d.drawImage(image, 0, 0, width, height, null); + } finally { + g2d.dispose(); + } + return bimage.getRGB(0, 0, width, height, null, 0, width); + } + + static void setClipboardContents(Clipboard cb, + Transferable contents, + ClipboardOwner owner) { + synchronized (cb) { + boolean set = false; + while (!set) { + try { + cb.setContents(contents, owner); + set = true; + } catch (IllegalStateException ise) { + try { Thread.sleep(100); } + catch (InterruptedException e) { e.printStackTrace(); } + } + } + } + } + + static Transferable getClipboardContents(Clipboard cb, + Object requestor) { + synchronized (cb) { + while (true) { + try { + Transferable t = cb.getContents(requestor); + return t; + } catch (IllegalStateException ise) { + try { Thread.sleep(100); } + catch (InterruptedException e) { e.printStackTrace(); } + } + } + } + } +} + +class TImageProducer extends ImageTransferer { + + boolean[] passedArray; + + private boolean isFirstCallOfLostOwnership = true; + + TImageProducer() { + formats = retrieveFormatsToTest(); + passedArray = new boolean[formats.length]; + } + + void begin() { + setClipboardContents(clipboard, new StringSelection(S_BEGIN), this); + } + + public void lostOwnership(Clipboard cb, Transferable contents) { + System.err.println("PRODUCER: lost clipboard ownership"); + + Transferable t = getClipboardContents(cb, null); + + if (t.isDataFlavorSupported(DataFlavor.stringFlavor)) { + String msg = null; + // for test going on if t.getTransferData() will throw an exception + if (isFirstCallOfLostOwnership) { + isFirstCallOfLostOwnership = false; + msg = S_BEGIN_ANSWER; + } else { + msg = S_PASSED; + } + + try { + msg = (String)t.getTransferData(DataFlavor.stringFlavor); + System.err.println("received message: " + msg); + } catch (Exception e) { + System.err.println("Can't getTransferData-message: " + e); + } + + if (msg.equals(S_PASSED)) { + notifyTransferSuccess(true); + } else if (msg.equals(S_FAILED)) { + notifyTransferSuccess(false); + } else if (!msg.equals(S_BEGIN_ANSWER)) { + throw new RuntimeException("wrong message in " + + "TImageProducer.lostOwnership(): " + msg + + " (possibly due to bug 4683804)"); + } + } else { + throw new RuntimeException("DataFlavor.stringFlavor is not " + + "supported by transferable in " + + "TImageProducer.lostOwnership()"); + } + + if (fi < formats.length) { + System.err.println("testing native image format " + formats[fi] + + "..."); + leaveFormat(formats[fi]); + setClipboardContents(cb, new ImageSelection(image), this); + } else { + setClipboardContents(cb, new StringSelection(S_END), null); + } + } + + void notifyTransferSuccess(boolean status) { + passedArray[fi] = status; + fi++; + } +} + +class TImageConsumer extends ImageTransferer { + + private static final Object LOCK = new Object(); + + private static boolean failed; + + public void lostOwnership(Clipboard cb, Transferable contents) { + System.err.println("CONSUMER: lost clipboard ownership"); + + Transferable t = getClipboardContents(cb, null); + + if (t.isDataFlavorSupported(DataFlavor.imageFlavor)) { + Image im = null; //? image; + try { + im = (Image) t.getTransferData(DataFlavor.imageFlavor); + } catch (Exception e) { + System.err.println("Can't getTransferData-image: " + e); + notifyTransferSuccess(false); + } + + if (im == null) { + System.err.println("getTransferData returned null"); + notifyTransferSuccess(false); + } else if (areImagesIdentical(image, im)) { + notifyTransferSuccess(true); + } else { + System.err.println("transferred image is different from " + + "initial image"); + notifyTransferSuccess(false); + } + } else if (t.isDataFlavorSupported(DataFlavor.stringFlavor)) { + // all image formats have been processed + try { + String msg = (String) t.getTransferData(DataFlavor.stringFlavor); + System.err.println("received message: " + msg); + } catch (Exception e) { + System.err.println("Can't getTransferData-message: " + e); + } + synchronized (LOCK) { + LOCK.notifyAll(); + } + } else { + System.err.println("imageFlavor is not supported by transferable"); + notifyTransferSuccess(false); + } + } + + void notifyTransferSuccess(boolean status) { + if (status) { + System.err.println("format passed: " + formats[fi]); + setClipboardContents(clipboard, new StringSelection(S_PASSED), this); + } else { + failed = true; + System.err.println("format failed: " + formats[fi]); + setClipboardContents(clipboard, new StringSelection(S_FAILED), this); + } + + if (fi < formats.length - 1) { + leaveFormat(formats[++fi]); + } + } + + public static void main(String[] args) { + try { + TImageConsumer ic = new TImageConsumer(); + + ic.formats = args; + + leaveFormat(ic.formats[0]); + synchronized (LOCK) { + ic.setClipboardContents(ic.clipboard, + new StringSelection(S_BEGIN_ANSWER), ic); + LOCK.wait(); + } + if (failed) System.exit(ImageTransferTest.CODE_CONSUMER_TEST_FAILED); + } catch (Throwable e) { + e.printStackTrace(); + System.exit(ImageTransferTest.CODE_FAILURE); + } + } +} + +/** + * A Transferable which implements the capability required + * to transfer an Image. + * + * This Transferable properly supports + * DataFlavor.imageFlavor. + * and all equivalent flavors. + * No other DataFlavors are supported. + * + * @see java.awt.datatransfer.DataFlavor.imageFlavor + */ +class ImageSelection implements Transferable { + + private static final int IMAGE = 0; + + private static final DataFlavor[] flavors = { DataFlavor.imageFlavor }; + + private Image data; + + /** + * Creates a Transferable capable of transferring + * the specified String. + */ + public ImageSelection(Image data) { + this.data = data; + } + + /** + * Returns an array of flavors in which this Transferable + * can provide the data. DataFlavor.stringFlavor + * is properly supported. + * Support for DataFlavor.plainTextFlavor is + * deprecated. + * + * @return an array of length one, whose element is DataFlavor. + * imageFlavor + */ + public DataFlavor[] getTransferDataFlavors() { + // returning flavors itself would allow client code to modify + // our internal behavior + return (DataFlavor[])flavors.clone(); + } + + /** + * Returns whether the requested flavor is supported by this + * Transferable. + * + * @param flavor the requested flavor for the data + * @return true if flavor is equal to + * DataFlavor.imageFlavor; + * false if flavor + * is not one of the above flavors + * @throws NullPointerException if flavor is null + */ + public boolean isDataFlavorSupported(DataFlavor flavor) { + for (int i = 0; i < flavors.length; i++) { + if (flavor.equals(flavors[i])) { + return true; + } + } + return false; + } + + /** + * Returns the Transferable's data in the requested + * DataFlavor if possible. If the desired flavor is + * DataFlavor.imageFlavor, or an equivalent flavor, + * the Image representing the selection is + * returned. + * + * @param flavor the requested flavor for the data + * @return the data in the requested flavor, as outlined above + * @throws UnsupportedFlavorException if the requested data flavor is + * not equivalent to DataFlavor.imageFlavor + * @throws IOException if an IOException occurs while retrieving the data. + * By default, ImageSelection never throws + * this exception, but a subclass may. + * @throws NullPointerException if flavor is null + */ + public Object getTransferData(DataFlavor flavor) + throws UnsupportedFlavorException, java.io.IOException + { + if (flavor.equals(flavors[IMAGE])) { + return (Object)data; + } else { + throw new UnsupportedFlavorException(flavor); + } + } +} diff --git a/test/jdk/java/awt/Clipboard/NoDataConversionFailureTest.java b/test/jdk/java/awt/Clipboard/NoDataConversionFailureTest.java new file mode 100644 index 000000000000..9ad108a5da2c --- /dev/null +++ b/test/jdk/java/awt/Clipboard/NoDataConversionFailureTest.java @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2002, 2025, 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 4558797 + * @summary Tests that there is no data conversion failure when two applications + * exchange data via system clipboard + * @key headful + * @library /test/lib + * @run main NoDataConversionFailureTest + */ + +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.ClipboardOwner; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.StringSelection; +import java.awt.datatransfer.Transferable; +import java.io.IOException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; + +public class NoDataConversionFailureTest { + + public static void main(String[] args) throws Exception { + SystemClipboardOwner.run(); + + if (SystemClipboardOwner.failed) { + throw new RuntimeException("test failed: can not get transfer data"); + } else { + System.err.println("test passed"); + } + } +} + +class SystemClipboardOwner implements ClipboardOwner { + static volatile boolean failed; + + private static final Object LOCK = new Object(); + + private static final int CHAIN_LENGTH = 15; + private final static Clipboard clipboard = + Toolkit.getDefaultToolkit().getSystemClipboard(); + + private int m; + private final int id; + + public SystemClipboardOwner(int m) { this.m = m; id = m; } + + public void lostOwnership(Clipboard cb, Transferable contents) { + System.err.println(id + " lost clipboard ownership"); + + Transferable t = getClipboardContents(cb, null); + // for test passing if t.getTransferData() will throw an exception + String msg = String.valueOf(m + 1); + try { + msg = (String) t.getTransferData(DataFlavor.stringFlavor); + } catch (IOException e) { + failed = true; + System.err.println(id + " can't getTransferData: " + e); + } catch (Exception e) { + System.err.println(id + " can't getTransferData: " + e); + } + + System.err.println(id + " Clipboard.getContents(): " + msg); + if (!msg.equals(String.valueOf(m + 1))) { + System.err.println("Clipboard.getContents() returned incorrect contents!"); + } + + m += 2; + if (m <= CHAIN_LENGTH) { + System.err.println(id + " Clipboard.setContents(): " + m); + setClipboardContents(cb, new StringSelection(m + ""), this); + } + if (m >= CHAIN_LENGTH) { + synchronized (LOCK) { + LOCK.notifyAll(); + } + } + } + + public static void run() throws Exception { + SystemClipboardOwner cbo1 = new SystemClipboardOwner(0); + System.err.println(cbo1.m + " Clipboard.setContents(): " + cbo1.m); + setClipboardContents(clipboard, new StringSelection(cbo1.m + ""), + cbo1); + + ProcessBuilder pb = ProcessTools + .createTestJavaProcessBuilder(SystemClipboardOwner.class.getName()); + + Process process = ProcessTools.startProcess("Child", pb); + OutputAnalyzer outputAnalyzer = new OutputAnalyzer(process); + + if (!process.waitFor(15, TimeUnit.SECONDS)) { + process.destroyForcibly(); + throw new TimeoutException("Timed out waiting for Child"); + } + + if (cbo1.m < CHAIN_LENGTH) { + System.err.println("chain of calls of lostOwnership() broken!"); + } + + outputAnalyzer.shouldHaveExitValue(0); + } + + public static void main(String[] args) throws InterruptedException { + SystemClipboardOwner cbo2 = new SystemClipboardOwner(1); + System.err.println(cbo2.m + " Clipboard.setContents(): " + cbo2.m); + + synchronized (LOCK) { + setClipboardContents(clipboard, new StringSelection(cbo2.m + ""), + cbo2); + LOCK.wait(); + } + } + + + private static void setClipboardContents(Clipboard cb, + Transferable contents, + ClipboardOwner owner) { + synchronized (cb) { + boolean set = false; + while (!set) { + try { + cb.setContents(contents, owner); + set = true; + } catch (IllegalStateException ise) { + try { Thread.sleep(100); } + catch (InterruptedException e) { e.printStackTrace(); } + } + } + } + } + + private static Transferable getClipboardContents(Clipboard cb, + Object requestor) { + synchronized (cb) { + while (true) { + try { + Transferable t = cb.getContents(requestor); + return t; + } catch (IllegalStateException ise) { + try { Thread.sleep(100); } + catch (InterruptedException e) { e.printStackTrace(); } + } + } + } + } +} From 4973f861ea7dd3ac87a7aa9b99c11e08873e6637 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Tue, 14 Oct 2025 17:29:33 +0000 Subject: [PATCH 171/323] 8352997: Open source several Swing JTabbedPane tests Backport-of: 9fcb06f9340f4f8f5bf2b74d0c4007f237625a72 --- .../swing/JTabbedPane/4287208/bug4287208.java | 90 ++++++++++++++ .../javax/swing/JTabbedPane/4287208/duke.gif | Bin 0 -> 1617 bytes .../javax/swing/JTabbedPane/bug4273320.java | 90 ++++++++++++++ .../javax/swing/JTabbedPane/bug4287268.java | 102 ++++++++++++++++ .../javax/swing/JTabbedPane/bug4362226.java | 76 ++++++++++++ .../javax/swing/JTabbedPane/bug4668865.java | 112 ++++++++++++++++++ 6 files changed, 470 insertions(+) create mode 100644 test/jdk/javax/swing/JTabbedPane/4287208/bug4287208.java create mode 100644 test/jdk/javax/swing/JTabbedPane/4287208/duke.gif create mode 100644 test/jdk/javax/swing/JTabbedPane/bug4273320.java create mode 100644 test/jdk/javax/swing/JTabbedPane/bug4287268.java create mode 100644 test/jdk/javax/swing/JTabbedPane/bug4362226.java create mode 100644 test/jdk/javax/swing/JTabbedPane/bug4668865.java diff --git a/test/jdk/javax/swing/JTabbedPane/4287208/bug4287208.java b/test/jdk/javax/swing/JTabbedPane/4287208/bug4287208.java new file mode 100644 index 000000000000..d7dfe01cff0e --- /dev/null +++ b/test/jdk/javax/swing/JTabbedPane/4287208/bug4287208.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2001, 2025, 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 4287208 + * @summary Tests if JTabbedPane's setEnabledAt properly renders bounds of Tabs + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4287208 +*/ + +import java.awt.BorderLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JTabbedPane; + +public class bug4287208 implements ActionListener { + + static final String INSTRUCTIONS = """ + There are two tabs in the test window. Press the "Test" button 5 times. + If this causes tabs to overlap at any time, the test FAILS, otherwise + the test PASSES. + """; + + static boolean state = true; + static JTabbedPane jtp; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .title("bug4287208 Test Instructions") + .instructions(INSTRUCTIONS) + .columns(40) + .testUI(bug4287208::createUI) + .build() + .awaitAndCheck(); + } + + static JFrame createUI() { + JFrame frame = new JFrame("bug4287208"); + + JButton start = new JButton("Test"); + start.addActionListener(new bug4287208()); + JPanel buttonPanel = new JPanel(); + buttonPanel.add(start); + frame.add(buttonPanel,BorderLayout.SOUTH); + + jtp = new JTabbedPane(); + jtp.addTab("Panel One", new JPanel()); + String s = System.getProperty("test.src",".") + + System.getProperty("file.separator") + "duke.gif"; + ImageIcon ii = new ImageIcon(s); + jtp.addTab("Panel Two", ii, new JPanel()); + + frame.add(jtp, BorderLayout.CENTER); + frame.setSize(500, 300); + return frame; + } + + public void actionPerformed(ActionEvent evt) { + jtp.setEnabledAt(0, state); + jtp.setEnabledAt(1, !state); + state = !state; + } + +} diff --git a/test/jdk/javax/swing/JTabbedPane/4287208/duke.gif b/test/jdk/javax/swing/JTabbedPane/4287208/duke.gif new file mode 100644 index 0000000000000000000000000000000000000000..a02a42fd606741170756cd1a33b48f609692b7f3 GIT binary patch literal 1617 zcmdUu>r)d~7>7?Fz!CwMYgeQ;%S983OoA0jYb}I;F*qYe>gWm@T%>g3RCKjoq7KRm zM%Eift#q|OSSYr!$gu6$c56UMLG9L#8nqu%I@$)QHZs#T)mG92^`GeZupi#DGw<(t zesdNrF3Qzb+|{iet#ekaB`fLq7VR30B``502l!<0YCsi0$>4v z0w56Zi=rFH;ZBrua!%eUxCJ|FXE~O#QWnZWT1XRNB1l4K)M<5EjaGvzaSX>$3`I}` zAOOWN+Ro@qM#4hASR4$xVVKD%ydZFs`Ceq@IGSN#dVeqoF|0HVd3d)QvT-~Q@gOIp zrR{cz2gxBnv|xgBf`CS}Mk7=M1wl;!LF^n%E3%vu!l#;`FHMPG z?#i1zZ+BI~>B`jRW@-KNkGfoGODjrd=HwGMrw&b5g{qHXomJO?tmeuF^H}k>3*)YB zFTWO-F`!s8pf4MG&uKrn=#F>C%FjDe^|e`^^5JejSeX8Ic$Hz>W63GWvxRFE9iOTt z^Uam%@+*I&0R4Ker|vmV3|zYkp1Z0*}z_~j|*(Jg4sVWnaCWb?($o}?o8 zA>|K)?>J&gdgZT(vVT(sXO1(Auo~WBZa7 zXU$FP4jPC5bmYI8pnfYtzRP@neXF|1cDOjX@8-0nNw3z&fsz_SGKqym&N{NI$(B-_ zb+59fLY96#Rw@2uNN?QIW}BIOWm;!=u4;vEV-j+1qz$O>QX=)WtLEmMCl%fO?g`?6Yl_mH8eUMfY% z{RPHHdHJl#+*dKx^x5-|H3iGI$W95w%?xmnj@s(^?w0mt51Fa literal 0 HcmV?d00001 diff --git a/test/jdk/javax/swing/JTabbedPane/bug4273320.java b/test/jdk/javax/swing/JTabbedPane/bug4273320.java new file mode 100644 index 000000000000..d1bcca743b5e --- /dev/null +++ b/test/jdk/javax/swing/JTabbedPane/bug4273320.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2000, 2025, 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 4273320 + * @summary JTabbedPane.setTitleAt() should refresh when using HTML text + * @key headful +*/ + +import java.awt.BorderLayout; +import java.awt.Rectangle; +import java.awt.Robot; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JTabbedPane; +import javax.swing.SwingUtilities; +import javax.swing.plaf.TabbedPaneUI; + +public class bug4273320 { + + static JFrame frame; + static volatile JTabbedPane tabs; + + static final String PLAIN = "Plain"; + static final String HTML = "A fairly long HTML text label"; + + public static void main(String[] args) throws Exception { + try { + SwingUtilities.invokeAndWait(bug4273320::createUI); + + Robot robot = new Robot(); + robot.waitForIdle(); + robot.delay(1000); + + TabbedPaneUI ui = tabs.getUI(); + Rectangle origSize = ui.getTabBounds(tabs, 0); + + SwingUtilities.invokeAndWait(() -> { + tabs.setTitleAt(0, HTML); + }); + robot.waitForIdle(); + robot.delay(1000); + + Rectangle newSize = ui.getTabBounds(tabs, 0); + // The tab should be resized larger if the longer HTML text is added + System.out.println("orig = " + origSize.width + " x " + origSize.height); + System.out.println("new = " + newSize.width + " x " + newSize.height); + if (origSize.width >= newSize.width) { + throw new RuntimeException("Tab text is not updated."); + } + } finally { + SwingUtilities.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + } + + static void createUI() { + frame = new JFrame("bug4273320"); + tabs = new JTabbedPane(); + JPanel panel = new JPanel(); + tabs.addTab(PLAIN, panel); + frame.getContentPane().add(tabs, BorderLayout.CENTER); + frame.setSize(500, 300); + frame.setVisible(true); + } +} diff --git a/test/jdk/javax/swing/JTabbedPane/bug4287268.java b/test/jdk/javax/swing/JTabbedPane/bug4287268.java new file mode 100644 index 000000000000..8f7156b93e05 --- /dev/null +++ b/test/jdk/javax/swing/JTabbedPane/bug4287268.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2000, 2025, 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 4287268 + * @summary Tests if setIconAt(index,Icon) does not set Tab's disabled icon + * @key headful +*/ + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.image.BufferedImage; +import javax.swing.ImageIcon; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JTabbedPane; +import javax.swing.SwingUtilities; + +public class bug4287268 { + + static JFrame frame; + static volatile JTabbedPane jtp; + + public static void main(String[] args) throws Exception { + try { + SwingUtilities.invokeAndWait(bug4287268::createUI); + + Robot robot = new Robot(); + robot.waitForIdle(); + robot.delay(1000); + + Point point = jtp.getLocationOnScreen(); + int width = jtp.getWidth(); + int height = jtp.getHeight(); + Rectangle r = new Rectangle(point.x, point.y, width, height); + BufferedImage cap = robot.createScreenCapture(r); + + int red = Color.red.getRGB(); + for (int x = 0; x < cap.getWidth(); x++) { + for (int y = 0; y < cap.getHeight(); y++) { + int rgb = cap.getRGB(x, y); + if (rgb == red) { + try { + javax.imageio.ImageIO.write(cap, "png", new java.io.File("cap.png")); + } catch (Exception ee) { + } + throw new RuntimeException("Test failed : found red"); + } + } + } + } finally { + SwingUtilities.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + } + + static void createUI() { + frame = new JFrame("bug4287268"); + jtp = new JTabbedPane(); + JPanel panel = new JPanel(); + jtp.add("Panel One", panel); + int size = 64; + BufferedImage img = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB); + Graphics g = img.createGraphics(); + g.setColor(Color.red); + g.fillRect(0, 0, size, size); + ImageIcon ii = new ImageIcon(img); + jtp.setIconAt(0, ii); + jtp.setEnabledAt(0, false); + frame.getContentPane().add(jtp, BorderLayout.CENTER); + frame.pack(); + frame.setVisible(true); + } +} diff --git a/test/jdk/javax/swing/JTabbedPane/bug4362226.java b/test/jdk/javax/swing/JTabbedPane/bug4362226.java new file mode 100644 index 000000000000..5339de29119a --- /dev/null +++ b/test/jdk/javax/swing/JTabbedPane/bug4362226.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2000, 2025, 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 4362226 + * @summary JTabbedPane's HTML title should have proper offsets + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4362226 +*/ + +import java.awt.BorderLayout; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JTabbedPane; +import javax.swing.UIManager; +import javax.swing.plaf.metal.MetalLookAndFeel; + +public class bug4362226 { + + static final String PLAIN = "Label"; + static final String HTML = "Label"; + + static final String INSTRUCTIONS = """ + The test window contains a JTabbedPane with two tabs. + The titles for both tabs should look similar and drawn with the same fonts. + The text of the tabs should start in a position that is offset from the left + boundary of the tab, so there is clear space between them. + If there is no space, then the test FAILS. + """; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .title("bug4362226 Test Instructions") + .instructions(INSTRUCTIONS) + .columns(60) + .testUI(bug4362226::createUI) + .build() + .awaitAndCheck(); + } + + static JFrame createUI() { + try { + UIManager.setLookAndFeel(new MetalLookAndFeel()); + } catch (Exception e) { + } + JFrame frame = new JFrame("bug4362226"); + JTabbedPane tabs = new JTabbedPane(); + tabs.addTab(PLAIN, new JPanel()); + tabs.addTab(HTML, new JPanel()); + frame.add(tabs, BorderLayout.CENTER); + frame.setSize(500, 300); + return frame; + } +} diff --git a/test/jdk/javax/swing/JTabbedPane/bug4668865.java b/test/jdk/javax/swing/JTabbedPane/bug4668865.java new file mode 100644 index 000000000000..711ef12f6827 --- /dev/null +++ b/test/jdk/javax/swing/JTabbedPane/bug4668865.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2003, 2025, 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 4668865 + * @summary Tests if JTabbedPane's setEnabledAt properly renders bounds of Tabs + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4668865 +*/ + +import java.awt.BorderLayout; +import java.awt.event.ActionEvent; +import javax.swing.AbstractAction; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JTabbedPane; +import javax.swing.JTextField; + +public class bug4668865 { + + static final String INSTRUCTIONS = """ + This tests that tooltips are shown for all tabs in all orientations, + when it is necessary to scroll to see all the tabs. + Use the buttons to select each orientation (top/bottom/left/right) in turn. + Scroll through the 8 tabs - using the navigation arrows as needed. + Move the mouse over each tab in turn and verify that the matching tooltip is shown + after sufficient hover time. + The test PASSES if the tooltips are shown for all cases, and FAILS otherwise. + """; + + static JTabbedPane tabPane; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .title("bug4668865 Test Instructions") + .instructions(INSTRUCTIONS) + .columns(50) + .testUI(bug4668865::createUI) + .build() + .awaitAndCheck(); + } + + static JFrame createUI() { + JFrame frame = new JFrame("bug4668865"); + + tabPane = new JTabbedPane(JTabbedPane.TOP, JTabbedPane.SCROLL_TAB_LAYOUT); + for(int i = 1; i < 9; i++) { + tabPane.addTab("Tab" + i, null, new JTextField("Tab" + i), "Tab" + i); + } + frame.add(tabPane, BorderLayout.CENTER); + + JButton top = new JButton(new AbstractAction() { + public void actionPerformed(ActionEvent e) { + tabPane.setTabPlacement(JTabbedPane.TOP); + } + }); + top.setText("Top"); + frame.add(top, BorderLayout.NORTH); + + JButton bottom = new JButton(new AbstractAction() { + public void actionPerformed(ActionEvent e) { + tabPane.setTabPlacement(JTabbedPane.BOTTOM); + } + }); + bottom.setText("Bottom"); + frame.add(bottom, BorderLayout.SOUTH); + + JButton left = new JButton(new AbstractAction() { + public void actionPerformed(ActionEvent e) { + tabPane.setTabPlacement(JTabbedPane.LEFT); + } + }); + + left.setText("Left"); + frame.add(left, BorderLayout.WEST); + + JButton right = new JButton(new AbstractAction() { + public void actionPerformed(ActionEvent e) { + tabPane.setTabPlacement(JTabbedPane.RIGHT); + } + }); + + right.setText("Right"); + frame.add(right, BorderLayout.EAST); + + frame.setSize(400, 400); + return frame; + } + +} From 3d0fbedcb0d9a3da7d466159e9c3c42be826f79b Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Wed, 15 Oct 2025 08:42:00 +0000 Subject: [PATCH 172/323] 8343876: Enhancements to jpackage test lib Reviewed-by: mbaesken Backport-of: 41a627b7890ab7fefef49e3bac3aad8403d0e82e --- .../jdk/jpackage/test/AnnotationsTest.java | 408 ++++++++++++++ .../jdk/jpackage/test/Annotations.java | 50 +- .../jdk/jpackage/test/LinuxHelper.java | 43 +- .../helpers/jdk/jpackage/test/Main.java | 42 +- .../helpers/jdk/jpackage/test/MethodCall.java | 236 +++++--- .../jdk/jpackage/test/TestBuilder.java | 215 ++------ .../jdk/jpackage/test/TestBuilderConfig.java | 62 +++ .../jdk/jpackage/test/TestInstance.java | 41 +- .../jdk/jpackage/test/TestMethodSupplier.java | 510 ++++++++++++++++++ .../tools/jpackage/share/InstallDirTest.java | 29 +- 10 files changed, 1360 insertions(+), 276 deletions(-) create mode 100644 test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/AnnotationsTest.java create mode 100644 test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TestBuilderConfig.java create mode 100644 test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TestMethodSupplier.java diff --git a/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/AnnotationsTest.java b/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/AnnotationsTest.java new file mode 100644 index 000000000000..2d23f49cdd75 --- /dev/null +++ b/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/AnnotationsTest.java @@ -0,0 +1,408 @@ +/* + * Copyright (c) 2024, 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 jdk.jpackage.test; + +import static java.lang.StackWalker.Option.RETAIN_CLASS_REFERENCE; +import java.lang.reflect.Method; +import java.nio.file.Path; +import java.time.LocalDate; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import static java.util.stream.Collectors.toMap; +import java.util.stream.Stream; +import jdk.internal.util.OperatingSystem; +import static jdk.internal.util.OperatingSystem.LINUX; +import jdk.jpackage.test.Annotations.Parameter; +import jdk.jpackage.test.Annotations.ParameterSupplier; +import jdk.jpackage.test.Annotations.Parameters; +import jdk.jpackage.test.Annotations.Test; +import static jdk.jpackage.test.Functional.ThrowingSupplier.toSupplier; + +/* + * @test + * @summary Test jpackage test library's annotation processor + * @library /test/jdk/tools/jpackage/helpers + * @build jdk.jpackage.test.* + * @run main/othervm/timeout=360 -Xmx512m jdk.jpackage.test.AnnotationsTest + */ +public class AnnotationsTest { + + public static void main(String... args) { + runTests(BasicTest.class, ParameterizedInstanceTest.class); + for (var os : OperatingSystem.values()) { + try { + TestBuilderConfig.setOperatingSystem(os); + TKit.log("Current operating system: " + os); + runTests(IfOSTest.class); + } finally { + TestBuilderConfig.setDefaults(); + } + } + } + + public static class BasicTest extends TestExecutionRecorder { + @Test + public void testNoArg() { + recordTestCase(); + } + + @Test + @Parameter("TRUE") + public int testNoArg(boolean v) { + recordTestCase(v); + return 0; + } + + @Test + @Parameter({}) + @Parameter("a") + @Parameter({"b", "c"}) + public void testVarArg(Path ... paths) { + recordTestCase((Object[]) paths); + } + + @Test + @Parameter({"12", "foo"}) + @Parameter({"-89", "bar", "more"}) + @Parameter({"-89", "bar", "more", "moore"}) + public void testVarArg2(int a, String b, String ... other) { + recordTestCase(a, b, other); + } + + @Test + @ParameterSupplier("dateSupplier") + @ParameterSupplier("jdk.jpackage.test.AnnotationsTest.dateSupplier") + public void testDates(LocalDate v) { + recordTestCase(v); + } + + public static Set getExpectedTestDescs() { + return Set.of( + "().testNoArg()", + "().testNoArg(true)", + "().testVarArg()", + "().testVarArg(a)", + "().testVarArg(b, c)", + "().testVarArg2(-89, bar, [more, moore](length=2))", + "().testVarArg2(-89, bar, [more](length=1))", + "().testVarArg2(12, foo, [](length=0))", + "().testDates(2018-05-05)", + "().testDates(2018-07-11)", + "().testDates(2034-05-05)", + "().testDates(2056-07-11)" + ); + } + + public static Collection dateSupplier() { + return List.of(new Object[][] { + { LocalDate.parse("2018-05-05") }, + { LocalDate.parse("2018-07-11") }, + }); + } + } + + public static class ParameterizedInstanceTest extends TestExecutionRecorder { + public ParameterizedInstanceTest(String... args) { + super((Object[]) args); + } + + public ParameterizedInstanceTest(int o) { + super(o); + } + + public ParameterizedInstanceTest(int a, Boolean[] b, String c, String ... other) { + super(a, b, c, other); + } + + @Test + public void testNoArgs() { + recordTestCase(); + } + + @Test + @ParameterSupplier("jdk.jpackage.test.AnnotationsTest.dateSupplier") + public void testDates(LocalDate v) { + recordTestCase(v); + } + + @Test + @Parameter("a") + public static void staticTest(String arg) { + staticRecorder.recordTestCase(arg); + } + + @Parameters + public static Collection input() { + return List.of(new Object[][] { + {}, + {55, new Boolean[]{false, true, false}, "foo", "bar"}, + {78}, + }); + } + + @Parameters + public static Collection input2() { + return List.of(new Object[][] { + {51, new boolean[]{true, true, true}, "foo"}, + {33}, + {55, null, null }, + {55, null, null, "1" }, + }); + } + + public static Set getExpectedTestDescs() { + return Set.of( + "().testNoArgs()", + "(33).testNoArgs()", + "(78).testNoArgs()", + "(55, [false, true, false](length=3), foo, [bar](length=1)).testNoArgs()", + "(51, [true, true, true](length=3), foo, [](length=0)).testNoArgs()", + "().testDates(2034-05-05)", + "().testDates(2056-07-11)", + "(33).testDates(2034-05-05)", + "(33).testDates(2056-07-11)", + "(51, [true, true, true](length=3), foo, [](length=0)).testDates(2034-05-05)", + "(51, [true, true, true](length=3), foo, [](length=0)).testDates(2056-07-11)", + "(55, [false, true, false](length=3), foo, [bar](length=1)).testDates(2034-05-05)", + "(55, [false, true, false](length=3), foo, [bar](length=1)).testDates(2056-07-11)", + "(78).testDates(2034-05-05)", + "(78).testDates(2056-07-11)", + "(55, null, null, [1](length=1)).testDates(2034-05-05)", + "(55, null, null, [1](length=1)).testDates(2056-07-11)", + "(55, null, null, [1](length=1)).testNoArgs()", + "(55, null, null, [](length=0)).testDates(2034-05-05)", + "(55, null, null, [](length=0)).testDates(2056-07-11)", + "(55, null, null, [](length=0)).testNoArgs()", + "().staticTest(a)" + ); + } + + private final static TestExecutionRecorder staticRecorder = new TestExecutionRecorder(ParameterizedInstanceTest.class); + } + + public static class IfOSTest extends TestExecutionRecorder { + public IfOSTest(int a, String b) { + super(a, b); + } + + @Test(ifOS = OperatingSystem.LINUX) + public void testNoArgs() { + recordTestCase(); + } + + @Test(ifNotOS = OperatingSystem.LINUX) + public void testNoArgs2() { + recordTestCase(); + } + + @Test + @Parameter(value = "foo", ifOS = OperatingSystem.LINUX) + @Parameter(value = {"foo", "bar"}, ifOS = { OperatingSystem.LINUX, OperatingSystem.MACOS }) + @Parameter(value = {}, ifNotOS = { OperatingSystem.WINDOWS }) + public void testVarArgs(String ... args) { + recordTestCase((Object[]) args); + } + + @Test + @ParameterSupplier(value = "jdk.jpackage.test.AnnotationsTest.dateSupplier", ifOS = OperatingSystem.WINDOWS) + public void testDates(LocalDate v) { + recordTestCase(v); + } + + @Parameters(ifOS = OperatingSystem.LINUX) + public static Collection input() { + return Set.of(new Object[][] { + {7, null}, + }); + } + + @Parameters(ifNotOS = {OperatingSystem.LINUX, OperatingSystem.MACOS}) + public static Collection input2() { + return Set.of(new Object[][] { + {10, "hello"}, + }); + } + + @Parameters(ifNotOS = OperatingSystem.LINUX) + public static Collection input3() { + return Set.of(new Object[][] { + {15, "bye"}, + }); + } + + public static Set getExpectedTestDescs() { + switch (TestBuilderConfig.getDefault().getOperatingSystem()) { + case LINUX -> { + return Set.of( + "(7, null).testNoArgs()", + "(7, null).testVarArgs()", + "(7, null).testVarArgs(foo)", + "(7, null).testVarArgs(foo, bar)" + ); + } + + case MACOS -> { + return Set.of( + "(15, bye).testNoArgs2()", + "(15, bye).testVarArgs()", + "(15, bye).testVarArgs(foo, bar)" + ); + } + + case WINDOWS -> { + return Set.of( + "(15, bye).testDates(2034-05-05)", + "(15, bye).testDates(2056-07-11)", + "(15, bye).testNoArgs2()", + "(10, hello).testDates(2034-05-05)", + "(10, hello).testDates(2056-07-11)", + "(10, hello).testNoArgs2()" + ); + } + + case AIX -> { + return Set.of( + ); + } + } + + throw new UnsupportedOperationException(); + } + } + + public static Collection dateSupplier() { + return List.of(new Object[][] { + { LocalDate.parse("2034-05-05") }, + { LocalDate.parse("2056-07-11") }, + }); + } + + private static void runTests(Class... tests) { + ACTUAL_TEST_DESCS.get().clear(); + + var expectedTestDescs = Stream.of(tests) + .map(AnnotationsTest::getExpectedTestDescs) + .flatMap(x -> x) + // Collect in the map to check for collisions for free + .collect(toMap(x -> x, x -> "")) + .keySet(); + + var args = Stream.of(tests).map(test -> { + return String.format("--jpt-run=%s", test.getName()); + }).toArray(String[]::new); + + try { + Main.main(args); + assertRecordedTestDescs(expectedTestDescs); + } catch (Throwable t) { + t.printStackTrace(System.err); + System.exit(1); + } + } + + private static Stream getExpectedTestDescs(Class type) { + return toSupplier(() -> { + var method = type.getMethod("getExpectedTestDescs"); + var testDescPefix = type.getName(); + return ((Set)method.invoke(null)).stream().map(desc -> { + return testDescPefix + desc; + }); + }).get(); + } + + private static void assertRecordedTestDescs(Set expectedTestDescs) { + var comm = Comm.compare(expectedTestDescs, ACTUAL_TEST_DESCS.get()); + if (!comm.unique1().isEmpty()) { + System.err.println("Missing test case signatures:"); + comm.unique1().stream().sorted().sequential().forEachOrdered(System.err::println); + System.err.println("<>"); + } + + if (!comm.unique2().isEmpty()) { + System.err.println("Unexpected test case signatures:"); + comm.unique2().stream().sorted().sequential().forEachOrdered(System.err::println); + System.err.println("<>"); + } + + if (!comm.unique2().isEmpty() || !comm.unique1().isEmpty()) { + // Don't use TKit asserts as this call is outside the test execution + throw new AssertionError("Test case signatures mismatched"); + } + } + + private static class TestExecutionRecorder { + protected TestExecutionRecorder(Object ... args) { + this.testClass = getClass(); + this.testDescBuilder = TestInstance.TestDesc.createBuilder().ctorArgs(args); + } + + TestExecutionRecorder(Class testClass) { + this.testClass = testClass; + this.testDescBuilder = TestInstance.TestDesc.createBuilder().ctorArgs(); + } + + protected void recordTestCase(Object ... args) { + testDescBuilder.methodArgs(args).method(getCurrentTestCase()); + var testCaseDescs = ACTUAL_TEST_DESCS.get(); + var testCaseDesc = testDescBuilder.get().testFullName(); + TKit.assertTrue(!testCaseDescs.contains(testCaseDesc), String.format( + "Check this test case is executed for the first time", + testCaseDesc)); + TKit.assertTrue(!executed, "Check this test case instance is not reused"); + executed = true; + testCaseDescs.add(testCaseDesc); + } + + private Method getCurrentTestCase() { + return StackWalker.getInstance(RETAIN_CLASS_REFERENCE).walk(frames -> { + return frames.map(frame -> { + var methodType = frame.getMethodType(); + var methodName = frame.getMethodName(); + var methodReturn = methodType.returnType(); + var methodParameters = methodType.parameterArray(); + return Stream.of(testClass.getDeclaredMethods()).filter(method -> { + return method.getName().equals(methodName) + && method.getReturnType().equals(methodReturn) + && Arrays.equals(method.getParameterTypes(), methodParameters) + && method.isAnnotationPresent(Test.class); + }).findFirst(); + }).dropWhile(Optional::isEmpty).map(Optional::get).findFirst(); + }).get(); + } + + private boolean executed; + private final TestInstance.TestDesc.Builder testDescBuilder; + private final Class testClass; + } + + private static final ThreadLocal> ACTUAL_TEST_DESCS = new ThreadLocal<>() { + @Override + protected Set initialValue() { + return new HashSet<>(); + } + }; +} diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/Annotations.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/Annotations.java index d29133ee3e14..ad1e77b41715 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/Annotations.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/Annotations.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, 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 @@ -27,6 +27,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import jdk.internal.util.OperatingSystem; public class Annotations { @@ -43,6 +44,14 @@ public class Annotations { @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Test { + + OperatingSystem[] ifOS() default { + OperatingSystem.LINUX, + OperatingSystem.WINDOWS, + OperatingSystem.MACOS + }; + + OperatingSystem[] ifNotOS() default {}; } @Retention(RetentionPolicy.RUNTIME) @@ -51,6 +60,14 @@ public class Annotations { public @interface Parameter { String[] value(); + + OperatingSystem[] ifOS() default { + OperatingSystem.LINUX, + OperatingSystem.WINDOWS, + OperatingSystem.MACOS + }; + + OperatingSystem[] ifNotOS() default {}; } @Retention(RetentionPolicy.RUNTIME) @@ -60,8 +77,39 @@ public class Annotations { Parameter[] value(); } + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.METHOD) + @Repeatable(ParameterSupplierGroup.class) + public @interface ParameterSupplier { + + String value(); + + OperatingSystem[] ifOS() default { + OperatingSystem.LINUX, + OperatingSystem.WINDOWS, + OperatingSystem.MACOS + }; + + OperatingSystem[] ifNotOS() default {}; + } + + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.METHOD) + public @interface ParameterSupplierGroup { + + ParameterSupplier[] value(); + } + @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Parameters { + + OperatingSystem[] ifOS() default { + OperatingSystem.LINUX, + OperatingSystem.WINDOWS, + OperatingSystem.MACOS + }; + + OperatingSystem[] ifNotOS() default {}; } } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java index 44212587f7dd..e779cef8bfca 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, 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 @@ -40,6 +40,7 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; +import jdk.jpackage.internal.ApplicationLayout; import jdk.jpackage.internal.IOUtils; import jdk.jpackage.test.Functional.ThrowingConsumer; import jdk.jpackage.test.PackageTest.PackageHandlers; @@ -399,6 +400,15 @@ static void addBundleDesktopIntegrationVerifier(PackageTest test, private static void verifyDesktopFile(JPackageCommand cmd, Path desktopFile) throws IOException { TKit.trace(String.format("Check [%s] file BEGIN", desktopFile)); + + var launcherName = Stream.of(List.of(cmd.name()), cmd.addLauncherNames()).flatMap(List::stream).filter(name -> { + return getDesktopFile(cmd, name).equals(desktopFile); + }).findAny(); + if (!cmd.hasArgument("--app-image")) { + TKit.assertTrue(launcherName.isPresent(), + "Check the desktop file corresponds to one of app launchers"); + } + List lines = Files.readAllLines(desktopFile); TKit.assertEquals("[Desktop Entry]", lines.get(0), "Check file header"); @@ -428,7 +438,7 @@ private static void verifyDesktopFile(JPackageCommand cmd, Path desktopFile) "Check value of [%s] key", key)); } - // Verify value of `Exec` property in .desktop files are escaped if required + // Verify the value of `Exec` key is escaped if required String launcherPath = data.get("Exec"); if (Pattern.compile("\\s").matcher(launcherPath).find()) { TKit.assertTrue(launcherPath.startsWith("\"") @@ -437,10 +447,25 @@ private static void verifyDesktopFile(JPackageCommand cmd, Path desktopFile) launcherPath = launcherPath.substring(1, launcherPath.length() - 1); } - Stream.of(launcherPath, data.get("Icon")) - .map(Path::of) - .map(cmd::pathToUnpackedPackageFile) - .forEach(TKit::assertFileExists); + if (launcherName.isPresent()) { + TKit.assertEquals(launcherPath, cmd.pathToPackageFile( + cmd.appLauncherPath(launcherName.get())).toString(), + String.format( + "Check the value of [Exec] key references [%s] app launcher", + launcherName.get())); + } + + for (var e : List.>, Function>>of( + Map.entry(Map.entry("Exec", Optional.of(launcherPath)), ApplicationLayout::launchersDirectory), + Map.entry(Map.entry("Icon", Optional.empty()), ApplicationLayout::destktopIntegrationDirectory))) { + var path = e.getKey().getValue().or(() -> Optional.of(data.get( + e.getKey().getKey()))).map(Path::of).get(); + TKit.assertFileExists(cmd.pathToUnpackedPackageFile(path)); + Path expectedDir = cmd.pathToPackageFile(e.getValue().apply(cmd.appLayout())); + TKit.assertTrue(path.getParent().equals(expectedDir), String.format( + "Check the value of [%s] key references a file in [%s] folder", + e.getKey().getKey(), expectedDir)); + } TKit.trace(String.format("Check [%s] file END", desktopFile)); } @@ -720,10 +745,10 @@ private static Method initGetServiceUnitFileName() { private static Map archs; - private final static Pattern XDG_CMD_ICON_SIZE_PATTERN = Pattern.compile("\\s--size\\s+(\\d+)\\b"); + private static final Pattern XDG_CMD_ICON_SIZE_PATTERN = Pattern.compile("\\s--size\\s+(\\d+)\\b"); // Values grabbed from https://linux.die.net/man/1/xdg-icon-resource - private final static Set XDG_CMD_VALID_ICON_SIZES = Set.of(16, 22, 32, 48, 64, 128); + private static final Set XDG_CMD_VALID_ICON_SIZES = Set.of(16, 22, 32, 48, 64, 128); - private final static Method getServiceUnitFileName = initGetServiceUnitFileName(); + private static final Method getServiceUnitFileName = initGetServiceUnitFileName(); } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/Main.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/Main.java index 37aca48ac170..5919d8361c43 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/Main.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/Main.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, 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 @@ -23,11 +23,17 @@ package jdk.jpackage.test; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayDeque; import java.util.ArrayList; +import java.util.Comparator; +import java.util.Deque; import java.util.List; import java.util.function.Function; import java.util.function.Predicate; -import java.util.stream.Collectors; +import static java.util.stream.Collectors.toCollection; +import java.util.stream.Stream; import static jdk.jpackage.test.TestBuilder.CMDLINE_ARG_PREFIX; @@ -36,7 +42,9 @@ public static void main(String args[]) throws Throwable { boolean listTests = false; List tests = new ArrayList<>(); try (TestBuilder testBuilder = new TestBuilder(tests::add)) { - for (var arg : args) { + Deque argsAsList = new ArrayDeque<>(List.of(args)); + while (!argsAsList.isEmpty()) { + var arg = argsAsList.pop(); TestBuilder.trace(String.format("Parsing [%s]...", arg)); if ((CMDLINE_ARG_PREFIX + "list").equals(arg)) { @@ -44,6 +52,29 @@ public static void main(String args[]) throws Throwable { continue; } + if (arg.startsWith("@")) { + // Command file + // @=args will read arguments from the "args" file, one argument per line + // @args will read arguments from the "args" file, splitting lines into arguments at whitespaces + arg = arg.substring(1); + var oneArgPerLine = arg.startsWith("="); + if (oneArgPerLine) { + arg = arg.substring(1); + } + + var newArgsStream = Files.readAllLines(Path.of(arg)).stream(); + if (!oneArgPerLine) { + newArgsStream.map(line -> { + return Stream.of(line.split("\\s+")); + }).flatMap(x -> x); + } + + var newArgs = newArgsStream.collect(toCollection(ArrayDeque::new)); + newArgs.addAll(argsAsList); + argsAsList = newArgs; + continue; + } + boolean success = false; try { testBuilder.processCmdLineArg(arg); @@ -62,12 +93,11 @@ public static void main(String args[]) throws Throwable { // Order tests by their full names to have stable test sequence. List orderedTests = tests.stream() - .sorted((a, b) -> a.fullName().compareTo(b.fullName())) - .collect(Collectors.toList()); + .sorted(Comparator.comparing(TestInstance::fullName)).toList(); if (listTests) { // Just list the tests - orderedTests.stream().forEach(test -> System.out.println(String.format( + orderedTests.forEach(test -> System.out.println(String.format( "%s; workDir=[%s]", test.fullName(), test.workDir()))); return; } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MethodCall.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MethodCall.java index 2aaba054a9bc..d5b8bd702c8d 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MethodCall.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MethodCall.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, 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 @@ -22,34 +22,33 @@ */ package jdk.jpackage.test; +import java.lang.reflect.Array; import java.lang.reflect.Constructor; +import java.lang.reflect.Executable; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.Arrays; -import java.util.List; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.function.Supplier; -import java.util.stream.Collectors; +import java.util.function.Predicate; +import java.util.stream.IntStream; import java.util.stream.Stream; import jdk.jpackage.test.Functional.ThrowingConsumer; import jdk.jpackage.test.TestInstance.TestDesc; class MethodCall implements ThrowingConsumer { - MethodCall(Object[] instanceCtorArgs, Method method) { - this.ctorArgs = Optional.ofNullable(instanceCtorArgs).orElse( - DEFAULT_CTOR_ARGS); - this.method = method; - this.methodArgs = new Object[0]; - } + MethodCall(Object[] instanceCtorArgs, Method method, Object ... args) { + Objects.requireNonNull(instanceCtorArgs); + Objects.requireNonNull(method); - MethodCall(Object[] instanceCtorArgs, Method method, Object arg) { - this.ctorArgs = Optional.ofNullable(instanceCtorArgs).orElse( - DEFAULT_CTOR_ARGS); + this.ctorArgs = instanceCtorArgs; this.method = method; - this.methodArgs = new Object[]{arg}; + this.methodArgs = args; } TestDesc createDescription() { @@ -76,78 +75,195 @@ Object newInstance() throws NoSuchMethodException, InstantiationException, return null; } - Constructor ctor = findRequiredConstructor(method.getDeclaringClass(), - ctorArgs); - if (ctor.isVarArgs()) { - // Assume constructor doesn't have fixed, only variable parameters. - return ctor.newInstance(new Object[]{ctorArgs}); - } + var ctor = findMatchingConstructor(method.getDeclaringClass(), ctorArgs); - return ctor.newInstance(ctorArgs); + return ctor.newInstance(mapArgs(ctor, ctorArgs)); + } + + static Object[] mapArgs(Executable executable, final Object ... args) { + return mapPrimitiveTypeArgs(executable, mapVarArgs(executable, args)); } void checkRequiredConstructor() throws NoSuchMethodException { if ((method.getModifiers() & Modifier.STATIC) == 0) { - findRequiredConstructor(method.getDeclaringClass(), ctorArgs); + findMatchingConstructor(method.getDeclaringClass(), ctorArgs); } } - private static Constructor findVarArgConstructor(Class type) { - return Stream.of(type.getConstructors()).filter( - Constructor::isVarArgs).findFirst().orElse(null); - } - - private Constructor findRequiredConstructor(Class type, Object... ctorArgs) + private static Constructor findMatchingConstructor(Class type, Object... ctorArgs) throws NoSuchMethodException { - Supplier notFoundException = () -> { - return new NoSuchMethodException(String.format( + var ctors = filterMatchingExecutablesForParameterValues(Stream.of( + type.getConstructors()), ctorArgs).toList(); + + if (ctors.size() != 1) { + // No public constructors that can handle the given arguments. + throw new NoSuchMethodException(String.format( "No public contructor in %s for %s arguments", type, Arrays.deepToString(ctorArgs))); - }; - - if (Stream.of(ctorArgs).allMatch(Objects::nonNull)) { - // No `null` in constructor args, take easy path - try { - return type.getConstructor(Stream.of(ctorArgs).map( - Object::getClass).collect(Collectors.toList()).toArray( - Class[]::new)); - } catch (NoSuchMethodException ex) { - // Failed to find ctor that can take the given arguments. - Constructor varArgCtor = findVarArgConstructor(type); - if (varArgCtor != null) { - // There is one with variable number of arguments. Use it. - return varArgCtor; - } - throw notFoundException.get(); + } + + return ctors.get(0); + } + + @Override + public void accept(Object thiz) throws Throwable { + method.invoke(thiz, methodArgs); + } + + private static Object[] mapVarArgs(Executable executable, final Object ... args) { + if (executable.isVarArgs()) { + var paramTypes = executable.getParameterTypes(); + Class varArgParamType = paramTypes[paramTypes.length - 1]; + + Object[] newArgs; + if (paramTypes.length - args.length == 1) { + // Empty var args + + // "args" can be of type String[] if the "executable" is "foo(String ... str)" + newArgs = Arrays.copyOf(args, args.length + 1, Object[].class); + newArgs[newArgs.length - 1] = Array.newInstance(varArgParamType.componentType(), 0); + } else { + var varArgs = Arrays.copyOfRange(args, paramTypes.length - 1, + args.length, varArgParamType); + + // "args" can be of type String[] if the "executable" is "foo(String ... str)" + newArgs = Arrays.copyOfRange(args, 0, paramTypes.length, Object[].class); + newArgs[newArgs.length - 1] = varArgs; } + return newArgs; } - List ctors = Stream.of(type.getConstructors()) - .filter(ctor -> ctor.getParameterCount() == ctorArgs.length) - .collect(Collectors.toList()); + return args; + } - if (ctors.isEmpty()) { - // No public constructors that can handle the given arguments. - throw notFoundException.get(); + private static Object[] mapPrimitiveTypeArgs(Executable executable, final Object ... args) { + var paramTypes = executable.getParameterTypes(); + if (paramTypes.length != args.length) { + throw new IllegalArgumentException( + "The number of arguments must be equal to the number of parameters of the executable"); } - if (ctors.size() == 1) { - return ctors.iterator().next(); + if (IntStream.range(0, args.length).allMatch(idx -> { + return Optional.ofNullable(args[idx]).map(Object::getClass).map(paramTypes[idx]::isAssignableFrom).orElse(true); + })) { + return args; + } else { + final var newArgs = Arrays.copyOf(args, args.length, Object[].class); + for (var idx = 0; idx != args.length; ++idx) { + final var paramType = paramTypes[idx]; + final var argValue = args[idx]; + newArgs[idx] = Optional.ofNullable(argValue).map(Object::getClass).map(argType -> { + if(argType.isArray() && !paramType.isAssignableFrom(argType)) { + var length = Array.getLength(argValue); + var newArray = Array.newInstance(paramType.getComponentType(), length); + for (var arrayIdx = 0; arrayIdx != length; ++arrayIdx) { + Array.set(newArray, arrayIdx, Array.get(argValue, arrayIdx)); + } + return newArray; + } else { + return argValue; + } + }).orElse(argValue); + } + + return newArgs; } + } - // Revisit this tricky case when it will start bothering. - throw notFoundException.get(); + private static Stream filterMatchingExecutablesForParameterValues( + Stream executables, Object... args) { + return filterMatchingExecutablesForParameterTypes( + executables, + Stream.of(args) + .map(arg -> arg != null ? arg.getClass() : null) + .toArray(Class[]::new)); } - @Override - public void accept(Object thiz) throws Throwable { - method.invoke(thiz, methodArgs); + private static Stream filterMatchingExecutablesForParameterTypes( + Stream executables, Class... argTypes) { + return executables.filter(executable -> { + var parameterTypes = executable.getParameterTypes(); + + final int checkArgTypeCount; + if (parameterTypes.length <= argTypes.length) { + checkArgTypeCount = parameterTypes.length; + } else if (parameterTypes.length - argTypes.length == 1 && executable.isVarArgs()) { + // Empty optional arguments. + checkArgTypeCount = argTypes.length; + } else { + // Not enough mandatory arguments. + return false; + } + + var unmatched = IntStream.range(0, checkArgTypeCount).dropWhile(idx -> { + return new ParameterTypeMatcher(parameterTypes[idx]).test(argTypes[idx]); + }).toArray(); + + if (argTypes.length == parameterTypes.length && unmatched.length == 0) { + // Number of argument types equals to the number of parameters + // of the executable and all types match. + return true; + } + + if (executable.isVarArgs()) { + var varArgType = parameterTypes[parameterTypes.length - 1].componentType(); + return IntStream.of(unmatched).allMatch(idx -> { + return new ParameterTypeMatcher(varArgType).test(argTypes[idx]); + }); + } + + return false; + }); + } + + private static final class ParameterTypeMatcher implements Predicate> { + ParameterTypeMatcher(Class parameterType) { + Objects.requireNonNull(parameterType); + this.parameterType = NORM_TYPES.getOrDefault(parameterType, parameterType); + } + + @Override + public boolean test(Class paramaterValueType) { + if (paramaterValueType == null) { + return true; + } + + paramaterValueType = NORM_TYPES.getOrDefault(paramaterValueType, paramaterValueType); + return parameterType.isAssignableFrom(paramaterValueType); + } + + private final Class parameterType; } private final Object[] methodArgs; private final Method method; private final Object[] ctorArgs; - final static Object[] DEFAULT_CTOR_ARGS = new Object[0]; + private static final Map, Class> NORM_TYPES; + + static { + Map, Class> primitives = Map.of( + boolean.class, Boolean.class, + byte.class, Byte.class, + short.class, Short.class, + int.class, Integer.class, + long.class, Long.class, + float.class, Float.class, + double.class, Double.class); + + Map, Class> primitiveArrays = Map.of( + boolean[].class, Boolean[].class, + byte[].class, Byte[].class, + short[].class, Short[].class, + int[].class, Integer[].class, + long[].class, Long[].class, + float[].class, Float[].class, + double[].class, Double[].class); + + Map, Class> combined = new HashMap<>(primitives); + combined.putAll(primitiveArrays); + + NORM_TYPES = Collections.unmodifiableMap(combined); + } } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TestBuilder.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TestBuilder.java index bb699ba3b9c9..c2fc1789a253 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TestBuilder.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TestBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, 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 @@ -23,32 +23,28 @@ package jdk.jpackage.test; -import java.lang.reflect.Array; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.lang.reflect.Modifier; import java.util.ArrayList; -import java.util.Collection; +import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; -import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; -import java.util.function.Function; import java.util.function.UnaryOperator; import java.util.stream.Collectors; import java.util.stream.Stream; import jdk.jpackage.test.Annotations.AfterEach; import jdk.jpackage.test.Annotations.BeforeEach; -import jdk.jpackage.test.Annotations.Parameter; -import jdk.jpackage.test.Annotations.ParameterGroup; -import jdk.jpackage.test.Annotations.Parameters; import jdk.jpackage.test.Annotations.Test; import jdk.jpackage.test.Functional.ThrowingConsumer; +import static jdk.jpackage.test.Functional.ThrowingConsumer.toConsumer; import jdk.jpackage.test.Functional.ThrowingFunction; +import jdk.jpackage.test.TestMethodSupplier.InvalidAnnotationException; +import static jdk.jpackage.test.TestMethodSupplier.MethodQuery.fromQualifiedMethodName; final class TestBuilder implements AutoCloseable { @@ -58,6 +54,7 @@ public void close() throws Exception { } TestBuilder(Consumer testConsumer) { + this.testMethodSupplier = TestBuilderConfig.getDefault().createTestMethodSupplier(); argProcessors = Map.of( CMDLINE_ARG_PREFIX + "after-run", arg -> getJavaMethodsFromArg(arg).map( @@ -70,7 +67,7 @@ public void close() throws Exception { CMDLINE_ARG_PREFIX + "run", arg -> addTestGroup(getJavaMethodsFromArg(arg).map( ThrowingFunction.toFunction( - TestBuilder::toMethodCalls)).flatMap(s -> s).collect( + this::toMethodCalls)).flatMap(s -> s).collect( Collectors.toList())), CMDLINE_ARG_PREFIX + "exclude", @@ -219,23 +216,29 @@ private static Stream selectFrameMethods(Class type, Class annotationTyp .filter(m -> m.getParameterCount() == 0) .filter(m -> !m.isAnnotationPresent(Test.class)) .filter(m -> m.isAnnotationPresent(annotationType)) - .sorted((a, b) -> a.getName().compareTo(b.getName())); + .sorted(Comparator.comparing(Method::getName)); } - private static Stream cmdLineArgValueToMethodNames(String v) { + private Stream cmdLineArgValueToMethodNames(String v) { List result = new ArrayList<>(); String defaultClassName = null; for (String token : v.split(",")) { Class testSet = probeClass(token); if (testSet != null) { + if (testMethodSupplier.isTestClass(testSet)) { + toConsumer(testMethodSupplier::verifyTestClass).accept(testSet); + } + // Test set class specified. Pull in all public methods // from the class with @Test annotation removing name duplicates. // Overloads will be handled at the next phase of processing. defaultClassName = token; - Stream.of(testSet.getMethods()).filter( - m -> m.isAnnotationPresent(Test.class)).map( - Method::getName).distinct().forEach( - name -> result.add(String.join(".", token, name))); + result.addAll(Stream.of(testSet.getMethods()) + .filter(m -> m.isAnnotationPresent(Test.class)) + .filter(testMethodSupplier::isEnabled) + .map(Method::getName).distinct() + .map(name -> String.join(".", token, name)) + .toList()); continue; } @@ -246,7 +249,7 @@ private static Stream cmdLineArgValueToMethodNames(String v) { qualifiedMethodName = token; defaultClassName = token.substring(0, lastDotIdx); } else if (defaultClassName == null) { - throw new ParseException("Default class name not found in"); + throw new ParseException("Missing default class name in"); } else { qualifiedMethodName = String.join(".", defaultClassName, token); } @@ -255,155 +258,43 @@ private static Stream cmdLineArgValueToMethodNames(String v) { return result.stream(); } - private static boolean filterMethod(String expectedMethodName, Method method) { - if (!method.getName().equals(expectedMethodName)) { - return false; - } - switch (method.getParameterCount()) { - case 0: - return !isParametrized(method); - case 1: - return isParametrized(method); - } - return false; - } - - private static boolean isParametrized(Method method) { - return method.isAnnotationPresent(ParameterGroup.class) || method.isAnnotationPresent( - Parameter.class); - } - - private static List getJavaMethodFromString( - String qualifiedMethodName) { + private List getJavaMethodFromString(String qualifiedMethodName) { int lastDotIdx = qualifiedMethodName.lastIndexOf('.'); if (lastDotIdx == -1) { - throw new ParseException("Class name not found in"); - } - String className = qualifiedMethodName.substring(0, lastDotIdx); - String methodName = qualifiedMethodName.substring(lastDotIdx + 1); - Class methodClass; - try { - methodClass = Class.forName(className); - } catch (ClassNotFoundException ex) { - throw new ParseException(String.format("Class [%s] not found;", - className)); - } - // Get the list of all public methods as need to deal with overloads. - List methods = Stream.of(methodClass.getMethods()).filter( - (m) -> filterMethod(methodName, m)).collect(Collectors.toList()); - if (methods.isEmpty()) { - throw new ParseException(String.format( - "Method [%s] not found in [%s] class;", - methodName, className)); + throw new ParseException("Missing class name in"); } - trace(String.format("%s -> %s", qualifiedMethodName, methods)); - return methods; - } - - private static Stream getJavaMethodsFromArg(String argValue) { - return cmdLineArgValueToMethodNames(argValue).map( - ThrowingFunction.toFunction( - TestBuilder::getJavaMethodFromString)).flatMap( - List::stream).sequential(); - } - - private static Parameter[] getMethodParameters(Method method) { - if (method.isAnnotationPresent(ParameterGroup.class)) { - return ((ParameterGroup) method.getAnnotation(ParameterGroup.class)).value(); - } - - if (method.isAnnotationPresent(Parameter.class)) { - return new Parameter[]{(Parameter) method.getAnnotation( - Parameter.class)}; - } - - // Unexpected - return null; - } - - private static Stream toCtorArgs(Method method) throws - IllegalAccessException, InvocationTargetException { - Class type = method.getDeclaringClass(); - List paremetersProviders = Stream.of(type.getMethods()) - .filter(m -> m.getParameterCount() == 0) - .filter(m -> (m.getModifiers() & Modifier.STATIC) != 0) - .filter(m -> m.isAnnotationPresent(Parameters.class)) - .sorted() - .collect(Collectors.toList()); - if (paremetersProviders.isEmpty()) { - // Single instance using the default constructor. - return Stream.ofNullable(MethodCall.DEFAULT_CTOR_ARGS); - } - - // Pick the first method from the list. - Method paremetersProvider = paremetersProviders.iterator().next(); - if (paremetersProviders.size() > 1) { - trace(String.format( - "Found %d public static methods without arguments with %s annotation. Will use %s", - paremetersProviders.size(), Parameters.class, - paremetersProvider)); - paremetersProviders.stream().map(Method::toString).forEach( - TestBuilder::trace); + try { + return testMethodSupplier.findNullaryLikeMethods( + fromQualifiedMethodName(qualifiedMethodName)); + } catch (NoSuchMethodException ex) { + throw new ParseException(ex.getMessage() + ";", ex); } - - // Construct collection of arguments for test class instances. - return ((Collection) paremetersProvider.invoke(null)).stream(); } - private static Stream toMethodCalls(Method method) throws - IllegalAccessException, InvocationTargetException { - return toCtorArgs(method).map(v -> toMethodCalls(v, method)).flatMap( - s -> s).peek(methodCall -> { - // Make sure required constructor is accessible if the one is needed. - // Need to probe all methods as some of them might be static - // and some class members. - // Only class members require ctors. - try { - methodCall.checkRequiredConstructor(); - } catch (NoSuchMethodException ex) { - throw new ParseException(ex.getMessage() + "."); - } - }); + private Stream getJavaMethodsFromArg(String argValue) { + var methods = cmdLineArgValueToMethodNames(argValue) + .map(this::getJavaMethodFromString) + .flatMap(List::stream).toList(); + trace(String.format("%s -> %s", argValue, methods)); + return methods.stream(); } - private static Stream toMethodCalls(Object[] ctorArgs, Method method) { - if (!isParametrized(method)) { - return Stream.of(new MethodCall(ctorArgs, method)); - } - Parameter[] annotations = getMethodParameters(method); - if (annotations.length == 0) { - return Stream.of(new MethodCall(ctorArgs, method)); - } - return Stream.of(annotations).map((a) -> { - Class paramType = method.getParameterTypes()[0]; - final Object annotationValue; - if (!paramType.isArray()) { - annotationValue = fromString(a.value()[0], paramType); - } else { - Class paramComponentType = paramType.getComponentType(); - annotationValue = Array.newInstance(paramComponentType, a.value().length); - var idx = new AtomicInteger(-1); - Stream.of(a.value()).map(v -> fromString(v, paramComponentType)).sequential().forEach( - v -> Array.set(annotationValue, idx.incrementAndGet(), v)); + private Stream toMethodCalls(Method method) throws + IllegalAccessException, InvocationTargetException, InvalidAnnotationException { + return testMethodSupplier.mapToMethodCalls(method).peek(methodCall -> { + // Make sure required constructor is accessible if the one is needed. + // Need to probe all methods as some of them might be static + // and some class members. + // Only class members require ctors. + try { + methodCall.checkRequiredConstructor(); + } catch (NoSuchMethodException ex) { + throw new ParseException(ex.getMessage() + ".", ex); } - return new MethodCall(ctorArgs, method, annotationValue); }); } - private static Object fromString(String value, Class toType) { - if (toType.isEnum()) { - return Enum.valueOf(toType, value); - } - Function converter = conv.get(toType); - if (converter == null) { - throw new RuntimeException(String.format( - "Failed to find a conversion of [%s] string to %s type", - value, toType)); - } - return converter.apply(value); - } - // Wraps Method.invike() into ThrowingRunnable.run() private ThrowingConsumer wrap(Method method) { return (test) -> { @@ -427,6 +318,10 @@ private static class ParseException extends IllegalArgumentException { super(msg); } + ParseException(String msg, Exception ex) { + super(msg, ex); + } + void setContext(String badCmdLineArg) { this.badCmdLineArg = badCmdLineArg; } @@ -448,8 +343,9 @@ static void trace(String msg) { } } + private final TestMethodSupplier testMethodSupplier; private final Map> argProcessors; - private Consumer testConsumer; + private final Consumer testConsumer; private List testGroup; private List beforeActions; private List afterActions; @@ -458,14 +354,5 @@ static void trace(String msg) { private String spaceSubstitute; private boolean dryRun; - private final static Map> conv = Map.of( - boolean.class, Boolean::valueOf, - Boolean.class, Boolean::valueOf, - int.class, Integer::valueOf, - Integer.class, Integer::valueOf, - long.class, Long::valueOf, - Long.class, Long::valueOf, - String.class, String::valueOf); - - final static String CMDLINE_ARG_PREFIX = "--jpt-"; + static final String CMDLINE_ARG_PREFIX = "--jpt-"; } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TestBuilderConfig.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TestBuilderConfig.java new file mode 100644 index 000000000000..baeaec325469 --- /dev/null +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TestBuilderConfig.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2024, 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 jdk.jpackage.test; + +import java.util.Objects; +import jdk.internal.util.OperatingSystem; + +final class TestBuilderConfig { + TestBuilderConfig() { + } + + TestMethodSupplier createTestMethodSupplier() { + return new TestMethodSupplier(os); + } + + OperatingSystem getOperatingSystem() { + return os; + } + + static TestBuilderConfig getDefault() { + return DEFAULT.get(); + } + + static void setOperatingSystem(OperatingSystem os) { + Objects.requireNonNull(os); + DEFAULT.get().os = os; + } + + static void setDefaults() { + DEFAULT.set(new TestBuilderConfig()); + } + + private OperatingSystem os = OperatingSystem.current(); + + private static final ThreadLocal DEFAULT = new ThreadLocal<>() { + @Override + protected TestBuilderConfig initialValue() { + return new TestBuilderConfig(); + } + }; +} diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TestInstance.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TestInstance.java index 105c8f707cd4..f619c9e222e2 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TestInstance.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TestInstance.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, 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 @@ -32,8 +32,10 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.function.Function; import java.util.function.Predicate; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -50,7 +52,7 @@ private TestDesc() { String testFullName() { StringBuilder sb = new StringBuilder(); - sb.append(clazz.getSimpleName()); + sb.append(clazz.getName()); if (instanceArgs != null) { sb.append('(').append(instanceArgs).append(')'); } @@ -78,12 +80,12 @@ Builder method(Method v) { } Builder ctorArgs(Object... v) { - ctorArgs = ofNullable(v); + ctorArgs = Arrays.asList(v); return this; } Builder methodArgs(Object... v) { - methodArgs = ofNullable(v); + methodArgs = Arrays.asList(v); return this; } @@ -107,22 +109,18 @@ private static String formatArgs(List values) { } return values.stream().map(v -> { if (v != null && v.getClass().isArray()) { - return String.format("%s(length=%d)", - Arrays.deepToString((Object[]) v), - Array.getLength(v)); + String asString; + if (v.getClass().getComponentType().isPrimitive()) { + asString = PRIMITIVE_ARRAY_FORMATTERS.get(v.getClass()).apply(v); + } else { + asString = Arrays.deepToString((Object[]) v); + } + return String.format("%s(length=%d)", asString, Array.getLength(v)); } return String.format("%s", v); }).collect(Collectors.joining(", ")); } - private static List ofNullable(Object... values) { - List result = new ArrayList(); - for (var v: values) { - result.add(v); - } - return result; - } - private List ctorArgs; private List methodArgs; private Method method; @@ -331,7 +329,7 @@ public String toString() { private final boolean dryRun; private final Path workDir; - private final static Set KEEP_WORK_DIR = Functional.identity( + private static final Set KEEP_WORK_DIR = Functional.identity( () -> { final String propertyName = "keep-work-dir"; Set keepWorkDir = TKit.tokenizeConfigProperty( @@ -355,4 +353,15 @@ public String toString() { return Collections.unmodifiableSet(result); }).get(); + private static final Map, Function> PRIMITIVE_ARRAY_FORMATTERS = Map.of( + boolean[].class, v -> Arrays.toString((boolean[])v), + byte[].class, v -> Arrays.toString((byte[])v), + char[].class, v -> Arrays.toString((char[])v), + short[].class, v -> Arrays.toString((short[])v), + int[].class, v -> Arrays.toString((int[])v), + long[].class, v -> Arrays.toString((long[])v), + float[].class, v -> Arrays.toString((float[])v), + double[].class, v -> Arrays.toString((double[])v) + ); + } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TestMethodSupplier.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TestMethodSupplier.java new file mode 100644 index 000000000000..83b1c19bd955 --- /dev/null +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TestMethodSupplier.java @@ -0,0 +1,510 @@ +/* + * Copyright (c) 2024, 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 jdk.jpackage.test; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Executable; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.IntStream; +import java.util.stream.Stream; +import jdk.internal.util.OperatingSystem; +import jdk.jpackage.test.Annotations.Parameter; +import jdk.jpackage.test.Annotations.ParameterGroup; +import jdk.jpackage.test.Annotations.ParameterSupplier; +import jdk.jpackage.test.Annotations.ParameterSupplierGroup; +import jdk.jpackage.test.Annotations.Parameters; +import jdk.jpackage.test.Annotations.Test; +import static jdk.jpackage.test.Functional.ThrowingFunction.toFunction; +import static jdk.jpackage.test.Functional.ThrowingSupplier.toSupplier; +import static jdk.jpackage.test.MethodCall.mapArgs; + +final class TestMethodSupplier { + + TestMethodSupplier(OperatingSystem os) { + Objects.requireNonNull(os); + this.os = os; + } + + record MethodQuery(String className, String methodName) { + + List lookup() throws ClassNotFoundException { + final Class methodClass = Class.forName(className); + + // Get the list of all public methods as need to deal with overloads. + return Stream.of(methodClass.getMethods()).filter(method -> { + return method.getName().equals(methodName); + }).toList(); + } + + static MethodQuery fromQualifiedMethodName(String qualifiedMethodName) { + int lastDotIdx = qualifiedMethodName.lastIndexOf('.'); + if (lastDotIdx == -1) { + throw new IllegalArgumentException("Class name not specified"); + } + + var className = qualifiedMethodName.substring(0, lastDotIdx); + var methodName = qualifiedMethodName.substring(lastDotIdx + 1); + + return new MethodQuery(className, methodName); + } + } + + List findNullaryLikeMethods(MethodQuery query) throws NoSuchMethodException { + List methods; + + try { + methods = query.lookup(); + } catch (ClassNotFoundException ex) { + throw new NoSuchMethodException( + String.format("Class [%s] not found", query.className())); + } + + if (methods.isEmpty()) { + throw new NoSuchMethodException(String.format( + "Public method [%s] not found in [%s] class", + query.methodName(), query.className())); + } + + methods = methods.stream().filter(method -> { + if (isParameterized(method) && isTest(method)) { + // Always accept test method with annotations producing arguments for its invocation. + return true; + } else { + return method.getParameterCount() == 0; + } + }).filter(this::isEnabled).toList(); + + if (methods.isEmpty()) { + throw new NoSuchMethodException(String.format( + "Suitable public method [%s] not found in [%s] class", + query.methodName(), query.className())); + } + + return methods; + } + + boolean isTestClass(Class type) { + var typeStatus = processedTypes.get(type); + if (typeStatus == null) { + typeStatus = Verifier.isTestClass(type) ? TypeStatus.TEST_CLASS : TypeStatus.NOT_TEST_CLASS; + processedTypes.put(type, typeStatus); + } + + return !TypeStatus.NOT_TEST_CLASS.equals(typeStatus); + } + + void verifyTestClass(Class type) throws InvalidAnnotationException { + var typeStatus = processedTypes.get(type); + if (typeStatus == null) { + // The "type" has not been verified yet. + try { + Verifier.verifyTestClass(type); + processedTypes.put(type, TypeStatus.VALID_TEST_CLASS); + return; + } catch (InvalidAnnotationException ex) { + processedTypes.put(type, TypeStatus.TEST_CLASS); + throw ex; + } + } + + switch (typeStatus) { + case NOT_TEST_CLASS -> Verifier.throwNotTestClassException(type); + case TEST_CLASS -> Verifier.verifyTestClass(type); + case VALID_TEST_CLASS -> {} + } + } + + boolean isEnabled(Method method) { + return Stream.of(Test.class, Parameters.class) + .filter(method::isAnnotationPresent) + .findFirst() + .map(method::getAnnotation) + .map(this::canRunOnTheOperatingSystem) + .orElse(true); + } + + Stream mapToMethodCalls(Method method) throws + IllegalAccessException, InvocationTargetException { + return toCtorArgs(method).map(v -> toMethodCalls(v, method)).flatMap(x -> x); + } + + private Stream toCtorArgs(Method method) throws + IllegalAccessException, InvocationTargetException { + + if ((method.getModifiers() & Modifier.STATIC) != 0) { + // Static method, no instance + return Stream.ofNullable(DEFAULT_CTOR_ARGS); + } + + final var type = method.getDeclaringClass(); + + final var paremeterSuppliers = filterParameterSuppliers(type) + .filter(m -> m.isAnnotationPresent(Parameters.class)) + .filter(this::isEnabled) + .sorted(Comparator.comparing(Method::getName)).toList(); + if (paremeterSuppliers.isEmpty()) { + // Single instance using the default constructor. + return Stream.ofNullable(DEFAULT_CTOR_ARGS); + } + + // Construct collection of arguments for test class instances. + return createArgs(paremeterSuppliers.toArray(Method[]::new)); + } + + private Stream toMethodCalls(Object[] ctorArgs, Method method) { + if (!isParameterized(method)) { + return Stream.of(new MethodCall(ctorArgs, method)); + } + + var fromParameter = Stream.of(getMethodParameters(method)).map(a -> { + return createArgsForAnnotation(method, a); + }).flatMap(List::stream); + + var fromParameterSupplier = Stream.of(getMethodParameterSuppliers(method)).map(a -> { + return toSupplier(() -> createArgsForAnnotation(method, a)).get(); + }).flatMap(List::stream); + + return Stream.concat(fromParameter, fromParameterSupplier).map(args -> { + return new MethodCall(ctorArgs, method, args); + }); + } + + private List createArgsForAnnotation(Executable exec, Parameter a) { + if (!canRunOnTheOperatingSystem(a)) { + return List.of(); + } + + final var annotationArgs = a.value(); + final var execParameterTypes = exec.getParameterTypes(); + + if (execParameterTypes.length > annotationArgs.length) { + if (execParameterTypes.length - annotationArgs.length == 1 && exec.isVarArgs()) { + } else { + throw new RuntimeException(String.format( + "Not enough annotation values %s for [%s]", + List.of(annotationArgs), exec)); + } + } + + final Class[] argTypes; + if (exec.isVarArgs()) { + List> argTypesBuilder = new ArrayList<>(); + var lastExecParameterTypeIdx = execParameterTypes.length - 1; + argTypesBuilder.addAll(List.of(execParameterTypes).subList(0, + lastExecParameterTypeIdx)); + argTypesBuilder.addAll(Collections.nCopies( + Integer.max(0, annotationArgs.length - lastExecParameterTypeIdx), + execParameterTypes[lastExecParameterTypeIdx].componentType())); + argTypes = argTypesBuilder.toArray(Class[]::new); + } else { + argTypes = execParameterTypes; + } + + if (argTypes.length < annotationArgs.length) { + throw new RuntimeException(String.format( + "Too many annotation values %s for [%s]", + List.of(annotationArgs), exec)); + } + + var args = mapArgs(exec, IntStream.range(0, argTypes.length).mapToObj(idx -> { + return fromString(annotationArgs[idx], argTypes[idx]); + }).toArray(Object[]::new)); + + return List.of(args); + } + + private List createArgsForAnnotation(Executable exec, + ParameterSupplier a) throws IllegalAccessException, + InvocationTargetException { + if (!canRunOnTheOperatingSystem(a)) { + return List.of(); + } + + final Class execClass = exec.getDeclaringClass(); + final var supplierFuncName = a.value(); + + final MethodQuery methodQuery; + if (!a.value().contains(".")) { + // No class name specified + methodQuery = new MethodQuery(execClass.getName(), a.value()); + } else { + methodQuery = MethodQuery.fromQualifiedMethodName(supplierFuncName); + } + + final Method supplierMethod; + try { + final var parameterSupplierCandidates = findNullaryLikeMethods(methodQuery); + final Function classForName = toFunction(Class::forName); + final var supplierMethodClass = classForName.apply(methodQuery.className()); + if (parameterSupplierCandidates.isEmpty()) { + throw new RuntimeException(String.format( + "No parameter suppliers in [%s] class", + supplierMethodClass.getName())); + } + + var allParameterSuppliers = filterParameterSuppliers(supplierMethodClass).toList(); + + supplierMethod = findNullaryLikeMethods(methodQuery) + .stream() + .filter(allParameterSuppliers::contains) + .findFirst().orElseThrow(() -> { + var msg = String.format( + "No suitable parameter supplier found for %s(%s) annotation", + a, supplierFuncName); + trace(String.format( + "%s. Parameter suppliers of %s class:", msg, + execClass.getName())); + IntStream.range(0, allParameterSuppliers.size()).mapToObj(idx -> { + return String.format(" [%d/%d] %s()", idx + 1, + allParameterSuppliers.size(), + allParameterSuppliers.get(idx).getName()); + }).forEachOrdered(TestMethodSupplier::trace); + + return new RuntimeException(msg); + }); + } catch (NoSuchMethodException ex) { + throw new RuntimeException(String.format( + "Method not found for %s(%s) annotation", a, supplierFuncName)); + } + + return createArgs(supplierMethod).map(args -> { + return mapArgs(exec, args); + }).toList(); + } + + private boolean canRunOnTheOperatingSystem(Annotation a) { + switch (a) { + case Test t -> { + return canRunOnTheOperatingSystem(os, t.ifOS(), t.ifNotOS()); + } + case Parameters t -> { + return canRunOnTheOperatingSystem(os, t.ifOS(), t.ifNotOS()); + } + case Parameter t -> { + return canRunOnTheOperatingSystem(os, t.ifOS(), t.ifNotOS()); + } + case ParameterSupplier t -> { + return canRunOnTheOperatingSystem(os, t.ifOS(), t.ifNotOS()); + } + default -> { + return true; + } + } + } + + private static boolean isParameterized(Method method) { + return Stream.of( + Parameter.class, ParameterGroup.class, + ParameterSupplier.class, ParameterSupplierGroup.class + ).anyMatch(method::isAnnotationPresent); + } + + private static boolean isTest(Method method) { + return method.isAnnotationPresent(Test.class); + } + + private static boolean canRunOnTheOperatingSystem(OperatingSystem value, + OperatingSystem[] include, OperatingSystem[] exclude) { + Set suppordOperatingSystems = new HashSet<>(); + suppordOperatingSystems.addAll(List.of(include)); + suppordOperatingSystems.removeAll(List.of(exclude)); + return suppordOperatingSystems.contains(value); + } + + private static Parameter[] getMethodParameters(Method method) { + if (method.isAnnotationPresent(ParameterGroup.class)) { + return ((ParameterGroup) method.getAnnotation(ParameterGroup.class)).value(); + } + + if (method.isAnnotationPresent(Parameter.class)) { + return new Parameter[]{(Parameter) method.getAnnotation(Parameter.class)}; + } + + return new Parameter[0]; + } + + private static ParameterSupplier[] getMethodParameterSuppliers(Method method) { + if (method.isAnnotationPresent(ParameterSupplierGroup.class)) { + return ((ParameterSupplierGroup) method.getAnnotation(ParameterSupplierGroup.class)).value(); + } + + if (method.isAnnotationPresent(ParameterSupplier.class)) { + return new ParameterSupplier[]{(ParameterSupplier) method.getAnnotation( + ParameterSupplier.class)}; + } + + return new ParameterSupplier[0]; + } + + private static Stream filterParameterSuppliers(Class type) { + return Stream.of(type.getMethods()) + .filter(m -> m.getParameterCount() == 0) + .filter(m -> (m.getModifiers() & Modifier.STATIC) != 0) + .sorted(Comparator.comparing(Method::getName)); + } + + private static Stream createArgs(Method ... parameterSuppliers) throws + IllegalAccessException, InvocationTargetException { + List args = new ArrayList<>(); + for (var parameterSupplier : parameterSuppliers) { + args.addAll((Collection) parameterSupplier.invoke(null)); + } + return args.stream(); + } + + private static Object fromString(String value, Class toType) { + if (toType.isEnum()) { + return Enum.valueOf(toType, value); + } + Function converter = FROM_STRING.get(toType); + if (converter == null) { + throw new RuntimeException(String.format( + "Failed to find a conversion of [%s] string to %s type", + value, toType.getName())); + } + return converter.apply(value); + } + + private static void trace(String msg) { + if (TKit.VERBOSE_TEST_SETUP) { + TKit.log(msg); + } + } + + static class InvalidAnnotationException extends Exception { + InvalidAnnotationException(String msg) { + super(msg); + } + } + + private static class Verifier { + static boolean isTestClass(Class type) { + for (var method : type.getDeclaredMethods()) { + if (isParameterized(method) || isTest(method)) { + return true; + } + } + return false; + } + + static void verifyTestClass(Class type) throws InvalidAnnotationException { + boolean withTestAnnotations = false; + for (var method : type.getDeclaredMethods()) { + if (!withTestAnnotations && (isParameterized(method) || isTest(method))) { + withTestAnnotations = true; + } + verifyAnnotationsCorrect(method); + } + + if (!withTestAnnotations) { + throwNotTestClassException(type); + } + } + + static void throwNotTestClassException(Class type) throws InvalidAnnotationException { + throw new InvalidAnnotationException(String.format( + "Type [%s] is not a test class", type.getName())); + } + + private static void verifyAnnotationsCorrect(Method method) throws + InvalidAnnotationException { + var parameterized = isParameterized(method); + if (parameterized && !isTest(method)) { + throw new InvalidAnnotationException(String.format( + "Missing %s annotation on [%s] method", Test.class.getName(), method)); + } + + var isPublic = Modifier.isPublic(method.getModifiers()); + + if (isTest(method) && !isPublic) { + throw new InvalidAnnotationException(String.format( + "Non-public method [%s] with %s annotation", + method, Test.class.getName())); + } + + if (method.isAnnotationPresent(Parameters.class) && !isPublic) { + throw new InvalidAnnotationException(String.format( + "Non-public method [%s] with %s annotation", + method, Test.class.getName())); + } + } + } + + private enum TypeStatus { + NOT_TEST_CLASS, + TEST_CLASS, + VALID_TEST_CLASS, + } + + private final OperatingSystem os; + private final Map, TypeStatus> processedTypes = new HashMap<>(); + + private static final Object[] DEFAULT_CTOR_ARGS = new Object[0]; + + private static final Map> FROM_STRING; + + static { + Map> primitives = Map.of( + boolean.class, Boolean::valueOf, + byte.class, Byte::valueOf, + short.class, Short::valueOf, + int.class, Integer::valueOf, + long.class, Long::valueOf, + float.class, Float::valueOf, + double.class, Double::valueOf); + + Map> boxed = Map.of( + Boolean.class, Boolean::valueOf, + Byte.class, Byte::valueOf, + Short.class, Short::valueOf, + Integer.class, Integer::valueOf, + Long.class, Long::valueOf, + Float.class, Float::valueOf, + Double.class, Double::valueOf); + + Map> other = Map.of( + String.class, String::valueOf, + Path.class, Path::of); + + Map> combined = new HashMap<>(primitives); + combined.putAll(other); + combined.putAll(boxed); + + FROM_STRING = Collections.unmodifiableMap(combined); + } +} diff --git a/test/jdk/tools/jpackage/share/InstallDirTest.java b/test/jdk/tools/jpackage/share/InstallDirTest.java index 7047f35e87bf..23539589bcc0 100644 --- a/test/jdk/tools/jpackage/share/InstallDirTest.java +++ b/test/jdk/tools/jpackage/share/InstallDirTest.java @@ -22,13 +22,12 @@ */ import java.nio.file.Path; -import java.util.HashMap; -import java.util.Map; +import jdk.internal.util.OperatingSystem; import jdk.jpackage.test.TKit; import jdk.jpackage.test.PackageTest; import jdk.jpackage.test.PackageType; -import jdk.jpackage.test.Functional; import jdk.jpackage.test.Annotations.Parameter; +import jdk.jpackage.test.Annotations.Test; /** * Test --install-dir parameter. Output of the test should be @@ -76,28 +75,18 @@ */ public class InstallDirTest { - public static void testCommon() { - final Map INSTALL_DIRS = Functional.identity(() -> { - Map reply = new HashMap<>(); - reply.put(PackageType.WIN_MSI, Path.of("TestVendor\\InstallDirTest1234")); - reply.put(PackageType.WIN_EXE, reply.get(PackageType.WIN_MSI)); - - reply.put(PackageType.LINUX_DEB, Path.of("/opt/jpackage")); - reply.put(PackageType.LINUX_RPM, reply.get(PackageType.LINUX_DEB)); - - reply.put(PackageType.MAC_PKG, Path.of("/Applications/jpackage")); - reply.put(PackageType.MAC_DMG, reply.get(PackageType.MAC_PKG)); - - return reply; - }).get(); - + @Test + @Parameter(value = "TestVendor\\InstallDirTest1234", ifOS = OperatingSystem.WINDOWS) + @Parameter(value = "/opt/jpackage", ifOS = OperatingSystem.LINUX) + @Parameter(value = "/Applications/jpackage", ifOS = OperatingSystem.MACOS) + public static void testCommon(Path installDir) { new PackageTest().configureHelloApp() .addInitializer(cmd -> { - cmd.addArguments("--install-dir", INSTALL_DIRS.get( - cmd.packageType())); + cmd.addArguments("--install-dir", installDir); }).run(); } + @Test(ifOS = OperatingSystem.LINUX) @Parameter("/") @Parameter(".") @Parameter("foo") From 98ae9821b22f2c2061f2e248531bb71728fd539c Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Wed, 15 Oct 2025 08:44:20 +0000 Subject: [PATCH 173/323] 8345213: JVM Prefers /etc/timezone Over /etc/localtime on Debian 12 Backport-of: c8a521fddac9d42fe93ea9b3ab89e804bc48bf4e --- .../unix/native/libjava/TimeZone_md.c | 32 ++----------------- 1 file changed, 2 insertions(+), 30 deletions(-) diff --git a/src/java.base/unix/native/libjava/TimeZone_md.c b/src/java.base/unix/native/libjava/TimeZone_md.c index eaf00fa1027f..ac44133b791a 100644 --- a/src/java.base/unix/native/libjava/TimeZone_md.c +++ b/src/java.base/unix/native/libjava/TimeZone_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2025, 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 @@ -61,7 +61,6 @@ static char *isFileIdentical(char* buf, size_t size, char *pathname); #endif #if defined(__linux__) || defined(_ALLBSD_SOURCE) -static const char *ETC_TIMEZONE_FILE = "/etc/timezone"; static const char *ZONEINFO_DIR = "/usr/share/zoneinfo"; static const char *DEFAULT_ZONEINFO_FILE = "/etc/localtime"; #else @@ -266,40 +265,13 @@ getPlatformTimeZoneID() { struct stat64 statbuf; char *tz = NULL; - FILE *fp; int fd; char *buf; size_t size; int res; -#if defined(__linux__) - /* - * Try reading the /etc/timezone file for Debian distros. There's - * no spec of the file format available. This parsing assumes that - * there's one line of an Olson tzid followed by a '\n', no - * leading or trailing spaces, no comments. - */ - if ((fp = fopen(ETC_TIMEZONE_FILE, "r")) != NULL) { - char line[256]; - - if (fgets(line, sizeof(line), fp) != NULL) { - char *p = strchr(line, '\n'); - if (p != NULL) { - *p = '\0'; - } - if (strlen(line) > 0) { - tz = strdup(line); - } - } - (void) fclose(fp); - if (tz != NULL) { - return tz; - } - } -#endif /* defined(__linux__) */ - /* - * Next, try /etc/localtime to find the zone ID. + * Try /etc/localtime to find the zone ID. */ RESTARTABLE(lstat64(DEFAULT_ZONEINFO_FILE, &statbuf), res); if (res == -1) { From 80a2dd03dbad5b295cde95d0814ab8857dd18a82 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Wed, 15 Oct 2025 08:46:33 +0000 Subject: [PATCH 174/323] 8359061: Update and ProblemList manual test java/awt/Cursor/CursorDragTest/ListDragCursor.java Backport-of: 7576064a10c0f7a1fbfe88fc39254f32005d88f8 --- test/jdk/ProblemList.txt | 1 + .../Cursor/CursorDragTest/ListDragCursor.java | 100 ++++++++++++++---- 2 files changed, 82 insertions(+), 19 deletions(-) diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index 42022b87e86a..de4fe4f2af38 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -847,3 +847,4 @@ java/awt/Checkbox/CheckboxNullLabelTest.java 8340870 windows-all java/awt/dnd/WinMoveFileToShellTest.java 8341665 windows-all java/awt/Focus/MinimizeNonfocusableWindowTest.java 8024487 windows-all java/awt/Menu/MenuVisibilityTest.java 8161110 macosx-all +java/awt/Cursor/CursorDragTest/ListDragCursor.java 7177297 macosx-all diff --git a/test/jdk/java/awt/Cursor/CursorDragTest/ListDragCursor.java b/test/jdk/java/awt/Cursor/CursorDragTest/ListDragCursor.java index 32923f1d78b0..da0394a13928 100644 --- a/test/jdk/java/awt/Cursor/CursorDragTest/ListDragCursor.java +++ b/test/jdk/java/awt/Cursor/CursorDragTest/ListDragCursor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2025, 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 @@ -25,42 +25,60 @@ * @test * @bug 4313052 * @summary Test cursor changes after mouse dragging ends - * @library /java/awt/regtesthelpers - * @build PassFailJFrame * @run main/manual ListDragCursor */ +import java.awt.BorderLayout; +import java.awt.Button; import java.awt.Cursor; +import java.awt.EventQueue; import java.awt.Frame; import java.awt.List; import java.awt.Panel; import java.awt.TextArea; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; public class ListDragCursor { - public static void main(String[] args) throws Exception { - String INSTRUCTIONS = """ + private static final String INSTRUCTIONS = """ 1. Move mouse to the TextArea. 2. Press the left mouse button. 3. Drag mouse to the list. 4. Release the left mouse button. - If the mouse cursor starts as a Text Line Cursor and changes - to a regular Pointer Cursor, then Hand Cursor when hovering - the list, pass the test. This test fails if the cursor does - not update at all when pointing over the different components. + The mouse cursor should appear as an I-beam cursor + and should stay the same while dragging across the + components. Once you reach the list, release the + left mouse button. As soon as you release the left + mouse button, the cursor should change to a Hand + cursor. If true, this test passes. + + The test fails if the cursor updates while dragging + over the components before releasing the left + mouse button. """; - PassFailJFrame.builder() - .title("Test Instructions") - .instructions(INSTRUCTIONS) - .rows((int) INSTRUCTIONS.lines().count() + 2) - .columns(35) - .testUI(ListDragCursor::createUI) - .build() - .awaitAndCheck(); + private static Frame testFrame; + private static Frame instructionsFrame; + + private static final CountDownLatch countDownLatch = new CountDownLatch(1); + + public static void main(String[] args) throws Exception { + try { + EventQueue.invokeAndWait(() -> { + instructionsFrame = createInstructionsFrame(); + testFrame = createTestFrame(); + }); + if (!countDownLatch.await(5, TimeUnit.MINUTES)) { + throw new RuntimeException("Test timeout : No action was" + + " taken on the test."); + } + } finally { + EventQueue.invokeAndWait(ListDragCursor::disposeFrames); + } } - public static Frame createUI() { + static Frame createTestFrame() { Frame frame = new Frame("Cursor change after drag"); Panel panel = new Panel(); @@ -78,7 +96,51 @@ public static Frame createUI() { panel.add(list); frame.add(panel); - frame.setBounds(300, 100, 300, 150); + frame.setSize(300, 150); + frame.setLocation(instructionsFrame.getX() + + instructionsFrame.getWidth(), + instructionsFrame.getY()); + frame.setVisible(true); + return frame; + } + + static Frame createInstructionsFrame() { + Frame frame = new Frame("Test Instructions"); + Panel mainPanel = new Panel(new BorderLayout()); + TextArea textArea = new TextArea(INSTRUCTIONS, + 15, 35, TextArea.SCROLLBARS_NONE); + + Panel btnPanel = new Panel(); + Button passBtn = new Button("Pass"); + Button failBtn = new Button("Fail"); + btnPanel.add(passBtn); + btnPanel.add(failBtn); + + passBtn.addActionListener(e -> { + countDownLatch.countDown(); + System.out.println("Test passed."); + }); + failBtn.addActionListener(e -> { + countDownLatch.countDown(); + throw new RuntimeException("Test Failed."); + }); + + mainPanel.add(textArea, BorderLayout.CENTER); + mainPanel.add(btnPanel, BorderLayout.SOUTH); + + frame.add(mainPanel); + frame.pack(); + frame.setLocationRelativeTo(null); + frame.setVisible(true); return frame; } + + static void disposeFrames() { + if (testFrame != null) { + testFrame.dispose(); + } + if (instructionsFrame != null) { + instructionsFrame.dispose(); + } + } } From 9767b2c60f214aee5530d1070b5e9cff2e19c541 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Wed, 15 Oct 2025 08:48:52 +0000 Subject: [PATCH 175/323] 8361423: Add IPSupport::printPlatformSupport to java/net/NetworkInterface/IPv4Only.java Backport-of: 2f1aed2a165259a873636792cff7c9de4e1f334e --- test/jdk/java/net/NetworkInterface/IPv4Only.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/test/jdk/java/net/NetworkInterface/IPv4Only.java b/test/jdk/java/net/NetworkInterface/IPv4Only.java index efa59aa76912..3d12b3282bd2 100644 --- a/test/jdk/java/net/NetworkInterface/IPv4Only.java +++ b/test/jdk/java/net/NetworkInterface/IPv4Only.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2025, 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 @@ -29,12 +29,18 @@ */ -import java.net.*; -import java.util.*; + import jdk.test.lib.net.IPSupport; +import java.net.Inet6Address; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.util.Enumeration; + public class IPv4Only { public static void main(String[] args) throws Exception { + IPSupport.printPlatformSupport(System.out); if (IPSupport.hasIPv4()) { System.out.println("Testing IPv4"); Enumeration nifs = NetworkInterface.getNetworkInterfaces(); @@ -43,7 +49,7 @@ public static void main(String[] args) throws Exception { Enumeration addrs = nif.getInetAddresses(); while (addrs.hasMoreElements()) { InetAddress hostAddr = addrs.nextElement(); - if ( hostAddr instanceof Inet6Address ){ + if (hostAddr instanceof Inet6Address){ throw new RuntimeException( "NetworkInterfaceV6List failed - found v6 address " + hostAddr.getHostAddress() ); } } From 8c2413871db21f229a0b248121b819f000fb28c3 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Wed, 15 Oct 2025 17:07:47 +0000 Subject: [PATCH 176/323] 8353470: Clean up and open source couple AWT Graphics related tests (Part 2) Backport-of: 8270cd0ad2e0df72f063f36853328a935595f71f --- test/jdk/ProblemList.txt | 1 + .../Graphics/GDIResourceExhaustionTest.java | 121 ++++++++++ .../awt/Graphics/RepeatedRepaintTest.java | 137 +++++++++++ .../java/awt/Graphics/SmallPrimitives.java | 224 ++++++++++++++++++ test/jdk/java/awt/Graphics/TextAfterXor.java | 123 ++++++++++ 5 files changed, 606 insertions(+) create mode 100644 test/jdk/java/awt/Graphics/GDIResourceExhaustionTest.java create mode 100644 test/jdk/java/awt/Graphics/RepeatedRepaintTest.java create mode 100644 test/jdk/java/awt/Graphics/SmallPrimitives.java create mode 100644 test/jdk/java/awt/Graphics/TextAfterXor.java diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index de4fe4f2af38..b1111cf287ef 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -142,6 +142,7 @@ java/awt/Focus/TestDisabledAutoTransfer.java 8159871 macosx-all,windows-all java/awt/Focus/TestDisabledAutoTransferSwing.java 6962362 windows-all java/awt/Focus/ActivateOnProperAppContextTest.java 8136516 macosx-all java/awt/Focus/FocusPolicyTest.java 7160904 linux-all +java/awt/Graphics/SmallPrimitives.java 8047070 macosx-all,linux-all java/awt/EventQueue/6980209/bug6980209.java 8198615 macosx-all java/awt/EventQueue/PushPopDeadlock/PushPopDeadlock.java 8024034 generic-all java/awt/grab/EmbeddedFrameTest1/EmbeddedFrameTest1.java 7080150 macosx-all diff --git a/test/jdk/java/awt/Graphics/GDIResourceExhaustionTest.java b/test/jdk/java/awt/Graphics/GDIResourceExhaustionTest.java new file mode 100644 index 000000000000..b8ba155da60e --- /dev/null +++ b/test/jdk/java/awt/Graphics/GDIResourceExhaustionTest.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 1999, 2025, 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.imageio.ImageIO; +import java.awt.AWTException; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.EventQueue; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Insets; +import java.awt.Label; +import java.awt.Panel; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; + +/* + * @test + * @bug 4191297 + * @summary Tests that unreferenced GDI resources are correctly + * destroyed when no longer needed. + * @key headful + * @run main GDIResourceExhaustionTest + */ + +public class GDIResourceExhaustionTest extends Frame { + public void initUI() { + setSize(200, 200); + setUndecorated(true); + setLocationRelativeTo(null); + Panel labelPanel = new Panel(); + Label label = new Label("Red label"); + label.setBackground(Color.red); + labelPanel.add(label); + labelPanel.setLocation(20, 50); + add(labelPanel); + setVisible(true); + } + + public void paint(Graphics graphics) { + super.paint(graphics); + for (int rgb = 0; rgb <= 0xfff; rgb++) { + graphics.setColor(new Color(rgb)); + graphics.fillRect(0, 0, 5, 5); + } + } + + public void requestCoordinates(Rectangle r) { + Insets insets = getInsets(); + Point location = getLocationOnScreen(); + Dimension size = getSize(); + r.x = location.x + insets.left; + r.y = location.y + insets.top; + r.width = size.width - (insets.left + insets.right); + r.height = size.height - (insets.top + insets.bottom); + } + + public static void main(String[] args) throws InterruptedException, + InvocationTargetException, AWTException, IOException { + GDIResourceExhaustionTest test = new GDIResourceExhaustionTest(); + try { + EventQueue.invokeAndWait(test::initUI); + Robot robot = new Robot(); + robot.delay(2000); + Rectangle coords = new Rectangle(); + EventQueue.invokeAndWait(() -> { + test.requestCoordinates(coords); + }); + robot.mouseMove(coords.x - 50, coords.y - 50); + robot.waitForIdle(); + robot.delay(5000); + BufferedImage capture = robot.createScreenCapture(coords); + robot.delay(500); + boolean redFound = false; + int redRGB = Color.red.getRGB(); + for (int y = 0; y < capture.getHeight(); y++) { + for (int x = 0; x < capture.getWidth(); x++) { + if (capture.getRGB(x, y) == redRGB) { + redFound = true; + break; + } + if (redFound) { + break; + } + } + } + if (!redFound) { + File errorImage = new File("screenshot.png"); + ImageIO.write(capture, "png", errorImage); + throw new RuntimeException("Red label is not detected, possibly GDI resources exhausted"); + } + } finally { + EventQueue.invokeAndWait(test::dispose); + } + } +} diff --git a/test/jdk/java/awt/Graphics/RepeatedRepaintTest.java b/test/jdk/java/awt/Graphics/RepeatedRepaintTest.java new file mode 100644 index 000000000000..140cb48630db --- /dev/null +++ b/test/jdk/java/awt/Graphics/RepeatedRepaintTest.java @@ -0,0 +1,137 @@ +/* + * Copyright (c) 1998, 2025, 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.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Image; +import java.awt.image.BufferedImage; +import java.lang.reflect.InvocationTargetException; + +/* + * @test + * @bug 4081126 4129709 + * @summary Test for proper repainting on multiprocessor systems. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual RepeatedRepaintTest + */ +public class RepeatedRepaintTest extends Frame { + private Font font = null; + private Image background; + + static String INSTRUCTIONS = """ + The frame next to this window called "AWT Draw Test" has + some elements drawn on it. Move this window partially outside of the + screen bounds and then drag it back. Repeat it couple of times. + Drag the instructions window over the frame partially obscuring it. + If after number of attempts the frame content stops repainting + press "Fail", otherwise press "Pass". + """; + + public RepeatedRepaintTest() { + setTitle("AWT Draw Test"); + setSize(300, 300); + background = new BufferedImage(300, 300, BufferedImage.TYPE_INT_ARGB); + Graphics g = background.getGraphics(); + g.setColor(Color.black); + g.fillRect(0, 0, 300, 300); + g.dispose(); + } + + public void paint(Graphics g) { + Dimension dim = this.getSize(); + super.paint(g); + g.drawImage(background, 0, 0, dim.width, dim.height, null); + g.setColor(Color.white); + if (font == null) { + font = new Font("SansSerif", Font.PLAIN, 24); + } + g.setFont(font); + FontMetrics metrics = g.getFontMetrics(); + String message = "Draw Test"; + g.drawString(message, (dim.width / 2) - (metrics.stringWidth(message) / 2), + (dim.height / 2) + (metrics.getHeight() / 2)); + + int counter = 50; + for (int i = 0; i < 50; i++) { + counter += 4; + g.drawOval(counter, 50, i, i); + } + + counter = 20; + for (int i = 0; i < 100; i++) { + counter += 4; + g.drawOval(counter, 150, i, i); + } + g.setColor(Color.black); + g.drawLine(0, dim.height - 25, dim.width, dim.height - 25); + g.setColor(Color.gray); + g.drawLine(0, dim.height - 24, dim.width, dim.height - 24); + g.setColor(Color.lightGray); + g.drawLine(0, dim.height - 23, dim.width, dim.height - 23); + g.fillRect(0, dim.height - 22, dim.width, dim.height); + + + g.setXORMode(Color.blue); + g.fillRect(0, 0, 25, dim.height - 26); + g.setColor(Color.red); + g.fillRect(0, 0, 25, dim.height - 26); + g.setColor(Color.green); + g.fillRect(0, 0, 25, dim.height - 26); + g.setPaintMode(); + + Image img = createImage(50, 50); + Graphics imgGraphics = img.getGraphics(); + imgGraphics.setColor(Color.magenta); + imgGraphics.fillRect(0, 0, 50, 50); + imgGraphics.setColor(Color.yellow); + imgGraphics.drawString("offscreen", 0, 20); + imgGraphics.drawString("image", 0, 30); + + g.drawImage(img, dim.width - 100, dim.height - 100, Color.blue, null); + + g.setXORMode(Color.white); + drawAt(g, 100, 100, 50, 50); + drawAt(g, 105, 105, 50, 50); + drawAt(g, 110, 110, 50, 50); + } + + public void drawAt(Graphics g, int x, int y, int width, int height) { + g.setColor(Color.magenta); + g.fillRect(x, y, width, height); + } + + public static void main(String[] args) throws InterruptedException, + InvocationTargetException { + PassFailJFrame.builder() + .title("Repeated Repaint Test Instructions") + .instructions(INSTRUCTIONS) + .testUI(RepeatedRepaintTest::new) + .build() + .awaitAndCheck(); + } +} diff --git a/test/jdk/java/awt/Graphics/SmallPrimitives.java b/test/jdk/java/awt/Graphics/SmallPrimitives.java new file mode 100644 index 000000000000..7eb267cf0b94 --- /dev/null +++ b/test/jdk/java/awt/Graphics/SmallPrimitives.java @@ -0,0 +1,224 @@ +/* + * Copyright (c) 2002, 2025, 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.awt.Color; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Panel; +import java.awt.Polygon; +import java.awt.geom.GeneralPath; +import java.awt.geom.Line2D; +import java.lang.reflect.InvocationTargetException; + +/* + * @test + * @bug 4411814 4298688 4205762 4524760 4067534 + * @summary Check that Graphics rendering primitives function + * correctly when fed small and degenerate shapes + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual SmallPrimitives + */ + + +public class SmallPrimitives extends Panel { + + static String INSTRUCTIONS = """ + In the borderless frame next to this window there should be a + set of tiny narrow blue polygons painted next to the green rectangles. + If rectangle is vertical the corresponding polygon is painted to the right of it, + if rectangle is horizontal the polygon is painted below it. + The length of the polygon should be roughly the same as the length of the + green rectangle next to it. If size is significantly different or any of the + polygons is not painted press "Fail" otherwise press "Pass". + Note: one may consider using screen magnifier to compare sizes. + """; + + public void paint(Graphics g) { + Dimension d = getSize(); + Polygon p; + GeneralPath gp; + + g.setColor(Color.white); + g.fillRect(0, 0, d.width, d.height); + + // Reposition for horizontal tests (below) + g.translate(0, 20); + + // Reference shapes + g.setColor(Color.green); + g.fillRect(10, 7, 11, 1); + g.fillRect(10, 17, 11, 2); + g.fillRect(10, 27, 11, 1); + g.fillRect(10, 37, 11, 1); + g.fillRect(10, 47, 11, 2); + g.fillRect(10, 57, 11, 2); + g.fillRect(10, 67, 11, 1); + g.fillRect(10, 77, 11, 2); + g.fillRect(10, 87, 11, 1); + g.fillRect(10, 97, 11, 1); + g.fillRect(10, 107, 11, 1); + g.fillRect(10, 117, 6, 1); g.fillRect(20, 117, 6, 1); + + // Potentially problematic test shapes + g.setColor(Color.blue); + g.drawRect(10, 10, 10, 0); + g.drawRect(10, 20, 10, 1); + g.drawRoundRect(10, 30, 10, 0, 0, 0); + g.drawRoundRect(10, 40, 10, 0, 4, 4); + g.drawRoundRect(10, 50, 10, 1, 0, 0); + g.drawRoundRect(10, 60, 10, 1, 4, 4); + g.drawOval(10, 70, 10, 0); + g.drawOval(10, 80, 10, 1); + p = new Polygon(); + p.addPoint(10, 90); + p.addPoint(20, 90); + g.drawPolyline(p.xpoints, p.ypoints, p.npoints); + p = new Polygon(); + p.addPoint(10, 100); + p.addPoint(20, 100); + g.drawPolygon(p.xpoints, p.ypoints, p.npoints); + ((Graphics2D) g).draw(new Line2D.Double(10, 110, 20, 110)); + gp = new GeneralPath(); + gp.moveTo(10, 120); + gp.lineTo(15, 120); + gp.moveTo(20, 120); + gp.lineTo(25, 120); + ((Graphics2D) g).draw(gp); + + // Polygon limit tests + p = new Polygon(); + trypoly(g, p); + p.addPoint(10, 120); + trypoly(g, p); + + // Reposition for vertical tests (below) + g.translate(20, -20); + + // Reference shapes + g.setColor(Color.green); + g.fillRect(7, 10, 1, 11); + g.fillRect(17, 10, 2, 11); + g.fillRect(27, 10, 1, 11); + g.fillRect(37, 10, 1, 11); + g.fillRect(47, 10, 2, 11); + g.fillRect(57, 10, 2, 11); + g.fillRect(67, 10, 1, 11); + g.fillRect(77, 10, 2, 11); + g.fillRect(87, 10, 1, 11); + g.fillRect(97, 10, 1, 11); + g.fillRect(107, 10, 1, 11); + g.fillRect(117, 10, 1, 6); g.fillRect(117, 20, 1, 6); + + // Potentially problematic test shapes + g.setColor(Color.blue); + g.drawRect(10, 10, 0, 10); + g.drawRect(20, 10, 1, 10); + g.drawRoundRect(30, 10, 0, 10, 0, 0); + g.drawRoundRect(40, 10, 0, 10, 4, 4); + g.drawRoundRect(50, 10, 1, 10, 0, 0); + g.drawRoundRect(60, 10, 1, 10, 4, 4); + g.drawOval(70, 10, 0, 10); + g.drawOval(80, 10, 1, 10); + p = new Polygon(); + p.addPoint(90, 10); + p.addPoint(90, 20); + g.drawPolyline(p.xpoints, p.ypoints, p.npoints); + p = new Polygon(); + p.addPoint(100, 10); + p.addPoint(100, 20); + g.drawPolygon(p.xpoints, p.ypoints, p.npoints); + ((Graphics2D) g).draw(new Line2D.Double(110, 10, 110, 20)); + gp = new GeneralPath(); + gp.moveTo(120, 10); + gp.lineTo(120, 15); + gp.moveTo(120, 20); + gp.lineTo(120, 25); + ((Graphics2D) g).draw(gp); + + // Polygon limit tests + p = new Polygon(); + trypoly(g, p); + p.addPoint(110, 10); + trypoly(g, p); + + // Reposition for oval tests + g.translate(0, 20); + + for (int i = 0, xy = 8; i < 11; i++) { + g.setColor(Color.green); + g.fillRect(xy, 5, i, 1); + g.fillRect(5, xy, 1, i); + g.setColor(Color.blue); + g.fillOval(xy, 8, i, 1); + g.fillOval(8, xy, 1, i); + xy += i + 2; + } + + g.translate(10, 10); + for (int i = 0, xy = 9; i < 6; i++) { + g.setColor(Color.green); + g.fillRect(xy, 5, i, 2); + g.fillRect(5, xy, 2, i); + g.setColor(Color.blue); + g.fillOval(xy, 8, i, 2); + g.fillOval(8, xy, 2, i); + xy += i + 2; + } + } + + public static void trypoly(Graphics g, Polygon p) { + g.drawPolygon(p); + g.drawPolygon(p.xpoints, p.ypoints, p.npoints); + g.drawPolyline(p.xpoints, p.ypoints, p.npoints); + g.fillPolygon(p); + g.fillPolygon(p.xpoints, p.ypoints, p.npoints); + } + + public Dimension getPreferredSize() { + return new Dimension(150, 150); + } + + public static Frame createFrame() { + Frame f = new Frame(); + SmallPrimitives sp = new SmallPrimitives(); + sp.setLocation(0, 0); + f.add(sp); + f.setUndecorated(true); + f.pack(); + return f; + } + + public static void main(String argv[]) throws InterruptedException, + InvocationTargetException { + PassFailJFrame.builder() + .title("Small Primitives Instructions") + .instructions(INSTRUCTIONS) + .columns(60) + .testUI(SmallPrimitives::createFrame) + .build() + .awaitAndCheck(); + } +} diff --git a/test/jdk/java/awt/Graphics/TextAfterXor.java b/test/jdk/java/awt/Graphics/TextAfterXor.java new file mode 100644 index 000000000000..c9dc56d8b808 --- /dev/null +++ b/test/jdk/java/awt/Graphics/TextAfterXor.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2002, 2025, 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.awt.Color; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Panel; +import java.awt.RenderingHints; +import java.awt.image.VolatileImage; +import java.lang.reflect.InvocationTargetException; + +/* + * @test + * @bug 4505650 + * @summary Check that you can render solid text after doing XOR mode + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual TextAfterXor + */ + +public class TextAfterXor extends Panel { + public static final int TESTW = 300; + public static final int TESTH = 100; + static String INSTRUCTIONS = """ + In the window called "Text After XOR Test" there should be two + composite components, at the bottom of each component the green text + "Test passes if this is green!" should be visible. + + On the top component this text should be green on all platforms. + On the bottom component it is possible that on non-Windows + platforms text can be of other color or not visible at all. + That does not constitute a problem. + + So if platform is Windows and green text appears twice or on any + other platform green text appears at least once press "Pass", + otherwise press "Fail". + """; + + VolatileImage vimg; + + public void paint(Graphics g) { + render(g); + g.drawString("(Drawing to screen)", 10, 60); + if (vimg == null) { + vimg = createVolatileImage(TESTW, TESTH); + } + do { + vimg.validate(null); + Graphics g2 = vimg.getGraphics(); + render(g2); + String not = vimg.getCapabilities().isAccelerated() ? "" : "not "; + g2.drawString("Image was " + not + "accelerated", 10, 55); + g2.drawString("(only matters on Windows)", 10, 65); + g2.dispose(); + g.drawImage(vimg, 0, TESTH, null); + } while (vimg.contentsLost()); + } + + public void render(Graphics g) { + g.setColor(Color.black); + g.fillRect(0, 0, TESTW, TESTH); + g.setColor(Color.white); + g.fillRect(5, 5, TESTW-10, TESTH-10); + + g.setColor(Color.black); + g.drawString("Test only passes if green string appears", 10, 20); + + g.setColor(Color.white); + g.setXORMode(Color.blue); + g.drawRect(30, 30, 10, 10); + g.setPaintMode(); + g.setColor(Color.green); + + ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, + RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + g.drawString("Test passes if this is green!", 10, 80); + + g.setColor(Color.black); + } + + public Dimension getPreferredSize() { + return new Dimension(TESTW, TESTH*2); + } + + public static Frame createFrame() { + Frame f = new Frame("Text After XOR Test"); + f.add(new TextAfterXor()); + f.pack(); + return f; + } + + public static void main(String[] args) throws InterruptedException, + InvocationTargetException { + PassFailJFrame.builder() + .title("Text After XOR Instructions") + .instructions(INSTRUCTIONS) + .testUI(TextAfterXor::createFrame) + .build() + .awaitAndCheck(); + } +} From 75c803de2602d979ef798a3eaa824357a3d7423b Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Wed, 15 Oct 2025 17:09:58 +0000 Subject: [PATCH 177/323] 8340354: Open source AWT desktop properties and print related tests Backport-of: 988f13a3875a6d29d7de07c5e97fcd6e7f9a31ff --- .../awt/DesktopProperties/FontSmoothing.java | 93 ++++ .../ThreeDBackgroundColor.java | 100 ++++ .../awt/PrintJob/PrintCompatibilityTest.java | 446 ++++++++++++++++ .../java/awt/PrintJob/PrintComponentTest.java | 486 ++++++++++++++++++ .../awt/PrintJob/ScaledImagePrintingTest.java | 102 ++++ 5 files changed, 1227 insertions(+) create mode 100644 test/jdk/java/awt/DesktopProperties/FontSmoothing.java create mode 100644 test/jdk/java/awt/DesktopProperties/ThreeDBackgroundColor.java create mode 100644 test/jdk/java/awt/PrintJob/PrintCompatibilityTest.java create mode 100644 test/jdk/java/awt/PrintJob/PrintComponentTest.java create mode 100644 test/jdk/java/awt/PrintJob/ScaledImagePrintingTest.java diff --git a/test/jdk/java/awt/DesktopProperties/FontSmoothing.java b/test/jdk/java/awt/DesktopProperties/FontSmoothing.java new file mode 100644 index 000000000000..d3879d4893ff --- /dev/null +++ b/test/jdk/java/awt/DesktopProperties/FontSmoothing.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2003, 2024, 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.awt.Frame; +import java.awt.Toolkit; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +/* + * @test + * @bug 4808569 + * @requires (os.family == "windows") + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @summary add desktop property for the Windows XP or later font smoothing settings + * @run main/manual FontSmoothing + */ + +public class FontSmoothing { + + private static final String PROP_NAME = "win.text.fontSmoothingType"; + + public static void main(String[] args) throws Exception { + String INSTRUCTIONS = """ + This test should be run on Windows XP or later. + + On Windows 11: + 1. Open Run dialog by typing 'run' in search bar. + 2. Type 'cttune' and press Ok. + 3. Uncheck the "Turn On ClearType" checkbox and follow next instructions on screen. + 4. Repeat Step 1-2. + 5. Check the "Turn On ClearType" checkbox and follow next instructions on screen. + 6. Take a look at the output window to determine if the test passed or failed. + """; + + PassFailJFrame.builder() + .title("FontSmoothing Test Instructions") + .instructions(INSTRUCTIONS) + .rows((int) INSTRUCTIONS.lines().count() + 2) + .columns(40) + .testTimeOut(5) + .testUI(FontSmoothing::createUI) + .logArea(8) + .build() + .awaitAndCheck(); + } + + private static Frame createUI() { + Frame f = new Frame("FontSmoothing Test"); + f.setSize(50, 50); + + Object value = Toolkit.getDefaultToolkit().getDesktopProperty(PROP_NAME); + PassFailJFrame.log("toolkit.getDesktopProperty: " + PROP_NAME + " = " + value + "\n"); + + Toolkit.getDefaultToolkit().addPropertyChangeListener(PROP_NAME, new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent e) { + PassFailJFrame.log("PropertyChangeEvent: " + e.getPropertyName() + + "\n old value=" + e.getOldValue() + + "\n new value=" + e.getNewValue()); + + Integer value = (Integer) Toolkit.getDefaultToolkit().getDesktopProperty(PROP_NAME); + PassFailJFrame.log("toolkit.getDesktopProperty:" + PROP_NAME + "=" + value); + + if (value.equals((Integer) e.getNewValue())) { + PassFailJFrame.log("test PASSED"); + } else { + PassFailJFrame.log("test FAILED"); + } + } + }); + return f; + } +} diff --git a/test/jdk/java/awt/DesktopProperties/ThreeDBackgroundColor.java b/test/jdk/java/awt/DesktopProperties/ThreeDBackgroundColor.java new file mode 100644 index 000000000000..26792e79a92d --- /dev/null +++ b/test/jdk/java/awt/DesktopProperties/ThreeDBackgroundColor.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2000, 2024, 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.awt.Color; +import java.awt.Frame; +import java.awt.Toolkit; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +/* + * @test + * @bug 4368193 + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @requires (os.family == "windows") + * @summary Toolkit's getDesktopProperty returns stale values on Microsoft Windows + * @run main/manual ThreeDBackgroundColor + */ + +public class ThreeDBackgroundColor { + + private static final String PROP_NAME = "win.3d.backgroundColor"; + + public static void main(String[] args) throws Exception { + String INSTRUCTIONS = """ + On Windows 10: + 1. Open Windows Settings, in the search bar type + 'high contrast', in the list of suggestions choose option + 'Turn high contrast on or off' + 2. In the High contrast control panel click on the on/off switch + to initialize High contrast mode + 3. Wait for the High contrast mode to finish initialization + 4. Click on the same switch again to turn off High contrast mode + + On Windows 11: + 1. Open Windows settings, in the search bar type + 'Contrast Theme'. + 2. Select any value from 'Contrast themes' dropdown menu and press 'Apply'. + 3. Wait for the High contrast mode to finish initialization + 4. Select 'None' from 'Contrast themes' dropdown menu to revert the changes. + + Take a look at the output window to determine if the test passed or failed."""; + + PassFailJFrame.builder() + .title("ThreeDBackgroundColor Test Instructions") + .instructions(INSTRUCTIONS) + .rows((int) INSTRUCTIONS.lines().count() + 2) + .columns(40) + .testTimeOut(5) + .testUI(ThreeDBackgroundColor::createUI) + .logArea(8) + .build() + .awaitAndCheck(); + } + + private static Frame createUI() { + Frame f = new Frame("ThreeDBackgroundColor Test"); + f.setSize(50, 50); + + Object value = Toolkit.getDefaultToolkit().getDesktopProperty(PROP_NAME); + PassFailJFrame.log("toolkit.getDesktopProperty:" + PROP_NAME + "=" + value); + + Toolkit.getDefaultToolkit().addPropertyChangeListener(PROP_NAME, new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent e) { + PassFailJFrame.log("PropertyChangeEvent: " + e.getPropertyName() + + "\n old value=" + e.getOldValue() + + "\n new value=" + e.getNewValue()); + + Color value = (Color) Toolkit.getDefaultToolkit().getDesktopProperty(PROP_NAME); + PassFailJFrame.log("toolkit.getDesktopProperty:" + PROP_NAME + "=" + value); + if (value.equals((Color) e.getNewValue())) { + PassFailJFrame.log("test PASSED"); + } else { + PassFailJFrame.log("test FAILED"); + } + } + }); + return f; + } +} diff --git a/test/jdk/java/awt/PrintJob/PrintCompatibilityTest.java b/test/jdk/java/awt/PrintJob/PrintCompatibilityTest.java new file mode 100644 index 000000000000..a2433f455470 --- /dev/null +++ b/test/jdk/java/awt/PrintJob/PrintCompatibilityTest.java @@ -0,0 +1,446 @@ +/* + * Copyright (c) 1999, 2024, 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.awt.Button; +import java.awt.Canvas; +import java.awt.Checkbox; +import java.awt.Choice; +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Font; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Insets; +import java.awt.JobAttributes; +import java.awt.Label; +import java.awt.List; +import java.awt.Menu; +import java.awt.MenuBar; +import java.awt.MenuItem; +import java.awt.PageAttributes; +import java.awt.Panel; +import java.awt.PrintJob; +import java.awt.Scrollbar; +import java.awt.ScrollPane; +import java.awt.TextArea; +import java.awt.TextField; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.JobAttributes.DialogType; +import java.awt.PageAttributes.OriginType; + +import java.util.Enumeration; +import java.util.Properties; + +/* + * @test + * @bug 4247583 + * @key printer + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @summary Tests that the old Properties API still works + * @run main/manual PrintCompatibilityTest + */ + +public class PrintCompatibilityTest { + + public static void main(String[] args) throws Exception { + + String INSTRUCTIONS = """ + A frame window will appear. + Choose 'Print to Printer...' from the 'Print' menu. Make sure that you print + to a printer, not a file. Examine the output and verify that the frame and all + the components in it get printed properly. + + Known problems: + * The text in the second row of the menubar is not indented correctly. + + You can also use the 'Print to Screen...' command for a quick manual check that + printing works, but this is only for debugging purposes."""; + + PassFailJFrame.builder() + .title("PrintComponentTest Test Instructions") + .instructions(INSTRUCTIONS) + .rows((int) INSTRUCTIONS.lines().count() + 2) + .columns(60) + .testTimeOut(10) + .testUI(new MainFrame()) + .logArea(8) + .build() + .awaitAndCheck(); + } +} + +class MainFrame extends Frame { + private LWContainer lwc; + + public MainFrame() { + super("PrintCompatibilityTest"); + + setSize(800, 400); + setLayout(new FlowLayout()); + + // peered components + Button button = new Button("Button"); + button.setFont(new Font("Dialog", Font.PLAIN, 12)); + add(button); + add(new TestCanvas()); + Checkbox cbox = new Checkbox("Checkbox", true); + cbox.setFont(new Font("DialogInput", Font.PLAIN, 12)); + add(cbox); + Choice choice = new Choice(); + choice.add("Choice 1"); + choice.add("Choice Two"); + choice.setFont(new Font("Monospaced", Font.PLAIN, 12)); + add(choice); + Label label = new Label("Label"); + label.setFont(new Font("Serif", Font.PLAIN, 12)); + add(label); + List list = new List(); + list.add("List 1"); + list.add("List Two"); + list.setFont(new Font("SansSerif", Font.PLAIN, 12)); + add(list); + add(new Scrollbar(Scrollbar.VERTICAL) ); + add(new Scrollbar(Scrollbar.HORIZONTAL) ); + ScrollPane scrollpane = new ScrollPane(); + Button spButton = new Button("Button in a scrollpane"); + spButton.setFont(new Font("Monospaced", Font.PLAIN, 12)); + scrollpane.add(spButton); + add(scrollpane); + TextArea textarea = new TextArea("TextArea", 3, 30); + textarea.setFont(new Font("Dialog", Font.ITALIC, 10)); + add(textarea); + TextField textfield = new TextField("TextField"); + textfield.setFont(new Font("DialogInput", Font.ITALIC, 10)); + add(textfield); + + // nested components + Panel panel1 = new Panel(); + panel1.setLayout(new FlowLayout()); + panel1.setBackground(Color.red); + this.add(panel1); + + Button p1Button = new Button("level 2"); + p1Button.setFont(new Font("Monospaced", Font.ITALIC, 10)); + panel1.add(p1Button); + + Panel panel2 = new Panel(); + panel2.setLayout(new FlowLayout()); + panel2.setBackground(Color.green); + panel1.add(panel2); + + Button p2Button = new Button("level 3"); + p2Button.setFont(new Font("Serif", Font.ITALIC, 10)); + panel2.add(p2Button); + + + // lightweight components + LWButton lwbutton = new LWButton("LWbutton"); + lwbutton.setFont(new Font("SansSerif", Font.ITALIC, 10)); + add(lwbutton); + + lwc = new LWContainer("LWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainer"); + lwc.setFont(new Font("Monospaced", Font.ITALIC, 10)); + add(lwc); + Button lwcButton1 = new Button("HW Button 1"); + Button lwcButton2 = new Button("HW Button 2"); + LWButton lwcButton3 = new LWButton("LW Button"); + lwcButton1.setFont(new Font("Dialog", Font.BOLD, 14)); + lwcButton2.setFont(new Font("DialogInput", Font.BOLD, 14)); + lwcButton3.setFont(new Font("Monospaced", Font.BOLD, 14)); + lwc.add(lwcButton1); + lwc.add(lwcButton2); + lwc.add(lwcButton3); + + // overlapping components + add(new ZOrderPanel()); + + /////////////////////// + + Menu menu = new Menu("Print"); + Menu menu2 = new Menu("File"); + Menu menu3 = new Menu("Edit"); + Menu menu4 = new Menu("ReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyLong"); + menu2.setFont(new Font("SansSerif", Font.BOLD, 20)); + menu2.setEnabled(false); + menu3.setFont(new Font("Monospaced", Font.ITALIC, 18)); + menu3.setEnabled(false); + menu4.setEnabled(false); + MenuItem itemPrinter = new MenuItem("Print to Printer..."); + MenuItem itemScreen = new MenuItem("Print to Screen..."); + menu.add(itemPrinter); + menu.add(itemScreen); + MenuBar menuBar = new MenuBar(); + menuBar.add( menu ); + menuBar.add( menu2 ); + menuBar.add( menu3 ); + menuBar.add( menu4 ); + setMenuBar(menuBar); + + itemPrinter.addActionListener( new ActionPrint() ); + itemScreen.addActionListener( new ActionPrintToScreen() ); + setVisible(true); + } + + static void printProps(Properties props) + { + Enumeration propNames = props.propertyNames(); + while (propNames.hasMoreElements()) { + String propName = (String)propNames.nextElement(); + PassFailJFrame.log( propName + " = " + props.getProperty(propName)); + } + } + + class ActionPrint implements ActionListener { + private final int ITERATIONS = 1; + private Properties props = new Properties(); + + public void actionPerformed(ActionEvent ev) { + PassFailJFrame.log("About to show print dialog..."); + printProps(props); + PrintJob pj = getToolkit().getPrintJob( + MainFrame.this, "Print test!", props); + if (pj == null) { + return; + } + Dimension d = pj.getPageDimension(); + PassFailJFrame.log("About to print..."); + PassFailJFrame.log("Dimensions: " + d); + printProps(props); + + // For xor mode set, there is a printing issue with number of copies to be print. + // So, ITERATIONS are changed to 1 from 3. + // So, for now the XOR related code is commented out. + + //boolean xor = false; + + for (int i = 0; i < ITERATIONS; i++) { + Graphics g = pj.getGraphics(); + g.setColor(Color.red); + //if (xor) { + // g.setXORMode(Color.blue); + //} + g.translate(13, 13); + printAll(g); + g.dispose(); + //xor = (xor) ? false : true; + } + + // For xor mode set, LWC components don't get printed. + // So, for now the code is commented out and separate bug + // (JDK-8340495) is filed to handle it. + + // one more page so that we can test printing a lightweight + // at the top of the hierarchy (BugId 4212564) + //Graphics g = pj.getGraphics(); + //g.setColor(Color.red); + //g.translate(13, 13); + //lwc.printAll(g); + //g.dispose(); + // end 4212564 + + pj.end(); + } + } + + class ActionPrintToScreen implements ActionListener { + public void actionPerformed(ActionEvent ev) { + PrintFrame printFrame = new PrintFrame(MainFrame.this); + printFrame.show(); + Graphics g = printFrame.getGraphics(); + g.setColor(Color.red); + printAll(g); + g.dispose(); + } + } + + // Frame window that displays results of printing + // main window to a screen Graphics-- useful for + // quick testing of printing + class PrintFrame extends Frame + { + private Component printComponent; + public PrintFrame( Component c ) + { + super("Print to Screen"); + printComponent = c ; + addWindowListener( new WindowAdapter() { + public void windowClosing(WindowEvent ev) { + setVisible(false); + dispose(); + } + } + ); + setSize(printComponent.getSize()); + setResizable(false); + } + + public void paint( Graphics g ) { + printComponent.printAll(g); + } + } + + class LWButton extends Component { + String label; + int width = 100; + int height = 30; + + public LWButton(String label) { + super(); + this.label = label; + } + + public void paint(Graphics g) { + Dimension d = getSize(); + g.setColor(Color.orange); + g.setFont(getFont()); + g.fillRect(0, 0, d.width, d.height); + g.setColor(Color.black); + int x = 5; + int y = (d.height - 5); + g.drawString(label, x, y); + } + + public Dimension getPreferredSize() + { + return new Dimension(width, height); + } + } + + class LWContainer extends Container { + String label; + int width = 300; + int height = 100; + + public LWContainer(String label) { + super(); + this.label = label; + setLayout(new FlowLayout()); + } + + public void paint(Graphics g) { + super.paint(g); + Dimension d = getSize(); + g.setColor(Color.green); + g.setFont(getFont()); + g.drawLine(0, 0, d.width - 1, 0); + g.drawLine(d.width - 1, 0, d.width - 1, d.height - 1); + g.drawLine(d.width - 1, d.height - 1, 0, d.height - 1); + g.drawLine(0, d.height - 1, 0, 0); + g.setColor(Color.black); + int x = 5; + int y = (d.height - 5); + g.drawString(label, x, y); + } + + public Dimension getPreferredSize() + { + return new Dimension(width, height); + } + } + + class TestCanvas extends Canvas { + int width = 100; + int height = 100; + + public void paint(Graphics g) { + g.setColor(Color.blue); + g.fillRoundRect(10, 10, 50, 50, 15, 30); + g.setColor(Color.red); + g.fillOval(70, 70, 25, 25); + } + public Dimension getPreferredSize() { + return new Dimension(width, height); + } + } + + class ZOrderPanel extends Panel + { + ZOrderPanel() + { + setLayout(null); + + Component first, second, third, fourth; + + setVisible(true); + // add first component + first = makeBox("Second", Color.blue, + new Font("Serif", Font.BOLD, 14), + -1); + // insert on top + second = makeBox("First", Color.yellow, + new Font("SansSerif", Font.BOLD, 14), + 0); + // put at the back + fourth = makeBox("Fourth", Color.red, + new Font("Monospaced", Font.BOLD, 14), + 2); + // insert in last position + third = makeBox("Third", Color.green, + new Font("Dialog", Font.PLAIN, 12), + 3); + // swap third and fourth to correct positions + remove(third); + add(third, 2); + // re-validate so third and fourth peers change position + validate(); + // now make things really interesting with a lightweight + // component at the top of the z-order, that should print + // _below_ the native guys to match the screen... + add(new LWButton("LWButton"), 0); + } + + public Dimension preferredSize() + { + return new Dimension(260, 80); + } + + public void layout() + { + int i, n; + Insets ins = getInsets(); + n = getComponentCount(); + for (i = n-1; i >= 0; i--) { + Component p = getComponent(i); + p.setBounds(ins.left + 40 * i, ins.top + 5 * i, 60, 60); + } + } + + public Component makeBox(String s, Color c, Font f, int index) + { + Label l = new Label(s); + l.setBackground(c); + l.setAlignment(Label.RIGHT); + l.setFont(f); + add(l, index); + validate(); + return l; + } + } +} diff --git a/test/jdk/java/awt/PrintJob/PrintComponentTest.java b/test/jdk/java/awt/PrintJob/PrintComponentTest.java new file mode 100644 index 000000000000..d568c5a42797 --- /dev/null +++ b/test/jdk/java/awt/PrintJob/PrintComponentTest.java @@ -0,0 +1,486 @@ +/* + * Copyright (c) 1999, 2024, 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.awt.Button; +import java.awt.Canvas; +import java.awt.Checkbox; +import java.awt.Choice; +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Font; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Insets; +import java.awt.JobAttributes; +import java.awt.Label; +import java.awt.List; +import java.awt.Menu; +import java.awt.MenuBar; +import java.awt.MenuItem; +import java.awt.PageAttributes; +import java.awt.Panel; +import java.awt.PrintJob; +import java.awt.Scrollbar; +import java.awt.ScrollPane; +import java.awt.TextArea; +import java.awt.TextField; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.JobAttributes.DialogType; +import java.awt.PageAttributes.OriginType; + + +/* + * @test + * @bug 4111262 4035285 4038900 4046147 4049680 4084038 4100004 4105875 + * @bug 4117502 4037486 4068433 4128031 4151161 4151707 4155884 4212564 + * @bug 4025626 4029565 4034365 4036068 4040622 4061890 4067405 4086256 + * @bug 4113827 4116722 4121984 4145350 4146510 4172659 4179886 4218471 + * @bug 4219657 4227128 4242308 4245917 4265746 + * @key printer + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @summary Test printing of lightweight (and heavyweight) components + * @run main/manual PrintComponentTest + */ + +public class PrintComponentTest { + public static void main(String[] args) throws Exception { + + String INSTRUCTIONS = """ + A frame window will appear. + Choose 'Print to Printer...' from the 'Print' menu. Examine the output + and verify that the frame and all the components in it get printed properly. + + Print using both 'Portrait' and 'Landscape' orientation. + Verify that the paper dimensions printed to standard error + are exactly inverted. + (That is, if the output for 'Portrait' is + "Dimensions: java.awt.Dimension[width=612,height=792]" then the output + for 'Landscape' should be "Dimensions: java.awt.Dimension[width=792, height=612].) + + Now, attempt to print a second time. When the print dialog box appears, + however, cancel the print request. + Verify that _no_ output is sent to standard error. + + You should attempt to print with both the native and common print dialogs, + as well as with no dialog. + Note that on Linux the native and common print dialogs are identical. + + On Windows, the common print dialog communicates with the printer to + determine supported paper sizes and duplex capability. + Verify that these constraints are properly enforced in the common dialog + for the target printer. + + Known problems: + * The text in the second row of the menubar is not indented + correctly. + + You can also use the 'Print to Screen...' command for a quick manual + check that printing works, but this is only for debugging purposes."""; + + PassFailJFrame.builder() + .title("PrintComponentTest Test Instructions") + .instructions(INSTRUCTIONS) + .rows((int) INSTRUCTIONS.lines().count() + 2) + .columns(60) + .testTimeOut(10) + .testUI(new MainFrame()) + .logArea(8) + .build() + .awaitAndCheck(); + } +} + +class MainFrame extends Frame { + private LWContainer lwc; + + public MainFrame() { + super("PrintComponentTest"); + + setSize(800, 400); + setLayout(new FlowLayout()); + + // peered components + Button button = new Button("Button"); + button.setFont(new Font("Dialog", Font.PLAIN, 12)); + add(button); + add(new TestCanvas()); + Checkbox cbox = new Checkbox("Checkbox", true); + cbox.setFont(new Font("DialogInput", Font.PLAIN, 12)); + add(cbox); + Choice choice = new Choice(); + choice.add("Choice 1"); + choice.add("Choice Two"); + choice.setFont(new Font("Monospaced", Font.PLAIN, 12)); + add(choice); + Label label = new Label("Label"); + label.setFont(new Font("Serif", Font.PLAIN, 12)); + add(label); + List list = new List(); + list.add("List 1"); + list.add("List Two"); + list.setFont(new Font("SansSerif", Font.PLAIN, 12)); + add(list); + add(new Scrollbar(Scrollbar.VERTICAL) ); + add(new Scrollbar(Scrollbar.HORIZONTAL) ); + ScrollPane scrollpane = new ScrollPane(); + Button spButton = new Button("Button in a scrollpane"); + spButton.setFont(new Font("Monospaced", Font.PLAIN, 12)); + scrollpane.add(spButton); + add(scrollpane); + TextArea textarea = new TextArea("TextArea", 3, 30); + textarea.setFont(new Font("Dialog", Font.ITALIC, 10)); + add(textarea); + TextField textfield = new TextField("TextField"); + textfield.setFont(new Font("DialogInput", Font.ITALIC, 10)); + add(textfield); + + // nested components + Panel panel1 = new Panel(); + panel1.setLayout(new FlowLayout()); + panel1.setBackground(Color.red); + this.add(panel1); + + Button p1Button = new Button("level 2"); + p1Button.setFont(new Font("Monospaced", Font.ITALIC, 10)); + panel1.add(p1Button); + + Panel panel2 = new Panel(); + panel2.setLayout(new FlowLayout()); + panel2.setBackground(Color.green); + panel1.add(panel2); + + Button p2Button = new Button("level 3"); + p2Button.setFont(new Font("Serif", Font.ITALIC, 10)); + panel2.add(p2Button); + + + // lightweight components + LWButton lwbutton = new LWButton("LWbutton"); + lwbutton.setFont(new Font("SansSerif", Font.ITALIC, 10)); + add(lwbutton); + + lwc = new LWContainer("LWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainer"); + lwc.setFont(new Font("Monospaced", Font.ITALIC, 10)); + add(lwc); + Button lwcButton1 = new Button("HW Button 1"); + Button lwcButton2 = new Button("HW Button 2"); + LWButton lwcButton3 = new LWButton("LW Button"); + lwcButton1.setFont(new Font("Dialog", Font.BOLD, 14)); + lwcButton2.setFont(new Font("DialogInput", Font.BOLD, 14)); + lwcButton3.setFont(new Font("Monospaced", Font.BOLD, 14)); + lwc.add(lwcButton1); + lwc.add(lwcButton2); + lwc.add(lwcButton3); + + // overlapping components + add(new ZOrderPanel()); + + /////////////////////// + + Menu menu = new Menu("Print"); + Menu menu2 = new Menu("File"); + Menu menu3 = new Menu("Edit"); + Menu menu4 = new Menu("ReallyReallyReallyReallyReallyReallyReallyReally" + + "ReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReally" + + "ReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyLong"); + menu2.setFont(new Font("SansSerif", Font.BOLD, 20)); + menu2.setEnabled(false); + menu3.setFont(new Font("Monospaced", Font.ITALIC, 18)); + menu3.setEnabled(false); + menu4.setEnabled(false); + MenuItem itemJFC = + new MenuItem("Print to Printer with Cross-Platform Dialog..."); + itemJFC.setActionCommand("common"); + MenuItem itemNative = + new MenuItem("Print to Printer with Native Dialog..."); + itemNative.setActionCommand("native"); + MenuItem itemBackground = + new MenuItem("Print to Printer in Background"); + itemBackground.setActionCommand("none"); + MenuItem itemScreen = new MenuItem("Print to Screen..."); + menu.add(itemJFC); + menu.add(itemNative); + menu.add(itemBackground); + menu.add(itemScreen); + MenuBar menuBar = new MenuBar(); + menuBar.add( menu ); + menuBar.add( menu2 ); + menuBar.add( menu3 ); + menuBar.add( menu4 ); + setMenuBar(menuBar); + + ActionPrint actionPrint = new ActionPrint(); + + itemJFC.addActionListener( actionPrint ); + itemNative.addActionListener( actionPrint ); + itemBackground.addActionListener( actionPrint ); + itemScreen.addActionListener( new ActionPrintToScreen() ); + } + + class ActionPrint implements ActionListener { + private final int ITERATIONS = 1; + private PageAttributes pageAttributes = new PageAttributes(); + private JobAttributes jobAttributes = new JobAttributes(); + + public void actionPerformed(ActionEvent ev) { + DialogType dialog; + if (ev.getActionCommand().equals("common")) { + dialog = DialogType.COMMON; + } else if (ev.getActionCommand().equals("native")) { + dialog = DialogType.NATIVE; + } else { + dialog = DialogType.NONE; + } + jobAttributes.setDialog(dialog); + pageAttributes.setOrigin(OriginType.PRINTABLE); + System.err.println(jobAttributes); + System.err.println(pageAttributes); + + PassFailJFrame.log("About to show print dialog..."); + + PrintJob pj = getToolkit().getPrintJob( + MainFrame.this, "Print test!", jobAttributes, pageAttributes); + if (pj == null) { + return; + } + Dimension d = pj.getPageDimension(); + PassFailJFrame.log("About to print..."); + PassFailJFrame.log("Dimensions: " + d); + System.err.println(jobAttributes); + System.err.println(pageAttributes); + + // For xor mode set, there is a printing issue with number of copies to be print. + // So, ITERATIONS are changed to 1 from 3. + // So, for now the XOR related code is commented out. + + //boolean xor = false; + + for (int i = 0; i < ITERATIONS; i++) { + Graphics g = pj.getGraphics(); + g.setColor(Color.red); + //if (xor) { + // g.setXORMode(Color.blue); + //} + printAll(g); + g.dispose(); + //xor = (xor) ? false : true; + } + + // For xor mode set, LWC components don't get printed. + // So, for now the code is commented out and separate bug + // (JDK-8340495) is filed to handle it. + + // one more page so that we can test printing a lightweight + // at the top of the hierarchy (BugId 4212564) + //Graphics g = pj.getGraphics(); + //g.setColor(Color.red); + //lwc.printAll(g); + //g.dispose(); + // end 4212564 + + pj.end(); + } + } + + class ActionPrintToScreen implements ActionListener { + public void actionPerformed(ActionEvent ev) { + PrintFrame printFrame = new PrintFrame(MainFrame.this); + printFrame.show(); + Graphics g = printFrame.getGraphics(); + g.setColor(Color.red); + printAll(g); + g.dispose(); + } + } + + // Frame window that displays results of printing + // main window to a screen Graphics-- useful for + // quick testing of printing + class PrintFrame extends Frame + { + private Component printComponent; + public PrintFrame( Component c ) + { + super("Print to Screen"); + printComponent = c ; + addWindowListener( new WindowAdapter() { + public void windowClosing(WindowEvent ev) { + setVisible(false); + dispose(); + } + } + ); + setSize(printComponent.getSize()); + setResizable(false); + } + + public void paint( Graphics g ) { + printComponent.printAll(g); + } + } + + class LWButton extends Component { + String label; + int width = 100; + int height = 30; + + public LWButton(String label) { + super(); + this.label = label; + } + + public void paint(Graphics g) { + Dimension d = getSize(); + g.setColor(Color.orange); + g.setFont(getFont()); + g.fillRect(0, 0, d.width, d.height); + g.setColor(Color.black); + int x = 5; + int y = (d.height - 5); + g.drawString(label, x, y); + } + + public Dimension getPreferredSize() + { + return new Dimension(width, height); + } + } + + class LWContainer extends Container { + String label; + int width = 300; + int height = 100; + + public LWContainer(String label) { + super(); + this.label = label; + setLayout(new FlowLayout()); + } + + public void paint(Graphics g) { + super.paint(g); + Dimension d = getSize(); + g.setColor(Color.green); + g.setFont(getFont()); + g.drawLine(0, 0, d.width - 1, 0); + g.drawLine(d.width - 1, 0, d.width - 1, d.height - 1); + g.drawLine(d.width - 1, d.height - 1, 0, d.height - 1); + g.drawLine(0, d.height - 1, 0, 0); + g.setColor(Color.black); + int x = 5; + int y = (d.height - 5); + g.drawString(label, x, y); + } + + public Dimension getPreferredSize() + { + return new Dimension(width, height); + } + } + + class TestCanvas extends Canvas { + int width = 100; + int height = 100; + + public void paint(Graphics g) { + g.setColor(Color.blue); + g.fillRoundRect(10, 10, 50, 50, 15, 30); + g.setColor(Color.red); + g.fillOval(70, 70, 25, 25); + } + public Dimension getPreferredSize() { + return new Dimension(width, height); + } + } + + class ZOrderPanel extends Panel + { + ZOrderPanel() + { + setLayout(null); + + Component first, second, third, fourth; + + setVisible(true); + // add first component + first = makeBox("Second", Color.blue, + new Font("Serif", Font.BOLD, 14), + -1); + // insert on top + second = makeBox("First", Color.yellow, + new Font("SansSerif", Font.BOLD, 14), + 0); + // put at the back + fourth = makeBox("Fourth", Color.red, + new Font("Monospaced", Font.BOLD, 14), + 2); + // insert in last position + third = makeBox("Third", Color.green, + new Font("Dialog", Font.PLAIN, 12), + 3); + // swap third and fourth to correct positions + remove(third); + add(third, 2); + // re-validate so third and fourth peers change position + validate(); + // now make things really interesting with a lightweight + // component at the top of the z-order, that should print + // _below_ the native guys to match the screen... + add(new LWButton("LWButton"), 0); + } + + public Dimension preferredSize() + { + return new Dimension(260, 80); + } + + public void layout() + { + int i, n; + Insets ins = getInsets(); + n = getComponentCount(); + for (i = n-1; i >= 0; i--) { + Component p = getComponent(i); + p.setBounds(ins.left + 40 * i, ins.top + 5 * i, 60, 60); + } + } + + public Component makeBox(String s, Color c, Font f, int index) + { + Label l = new Label(s); + l.setBackground(c); + l.setAlignment(Label.RIGHT); + l.setFont(f); + add(l, index); + validate(); + return l; + } + } +} diff --git a/test/jdk/java/awt/PrintJob/ScaledImagePrintingTest.java b/test/jdk/java/awt/PrintJob/ScaledImagePrintingTest.java new file mode 100644 index 000000000000..838c9210e308 --- /dev/null +++ b/test/jdk/java/awt/PrintJob/ScaledImagePrintingTest.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 1999, 2024, 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.awt.Button; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Image; +import java.awt.PrintJob; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +/* + * @test + * @bug 4257962 + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @summary tests that scaled images are printed at resolution greater than 72dpi + * @run main/manual ScaledImagePrintingTest + */ + +public class ScaledImagePrintingTest { + + public static void main(String[] args) throws Exception { + String INSTRUCTIONS = """ + Press 'Print' button from the test UI. + + The test will bring up a print dialog. Select a printer and proceed. + Verify that the output is a series of a horizontal lines in a + rectangular box in the center of the page. + + If output is as mentioned above, press Pass else Fail."""; + + PassFailJFrame.builder() + .title("ScaledImagePrintingTest Test Instructions") + .instructions(INSTRUCTIONS) + .rows((int) INSTRUCTIONS.lines().count() + 2) + .columns(40) + .testTimeOut(5) + .testUI(ScaledImagePrintingTest::createUI) + .logArea(8) + .build() + .awaitAndCheck(); + } + + private static Frame createUI() { + Frame frame = new Frame("ResolutionTest"); + Button b = new Button("Print"); + b.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + PrintJob pj = frame.getToolkit().getPrintJob(frame, "ResolutionTest", null); + PassFailJFrame.log("Printing code started."); + if (pj != null) { + Graphics g = pj.getGraphics(); + g.setColor(Color.black); + int w = 200; + int h = 200; + Image image = frame.createImage(w, h); + Graphics imageGraphics = image.getGraphics(); + Dimension d = pj.getPageDimension(); + imageGraphics.setColor(Color.black); + for (int i = 0; i < h; i += 20) { + imageGraphics.drawLine(0, i, w, i); + } + g.translate(d.width / 2, d.height / 2); + g.drawImage(image, -w / 8, -h / 8, w / 4, h / 4, frame); + g.setColor(Color.black); + g.drawRect(-w / 4, -h / 4, w / 2, h / 2); + imageGraphics.dispose(); + g.dispose(); + pj.end(); + } + PassFailJFrame.log("Printing code finished."); + } + }); + frame.add(b); + frame.setSize(50, 50); + return frame; + } +} From 60f38fec2175bc8ba0ce38256816fe0e852282be Mon Sep 17 00:00:00 2001 From: Rui Li Date: Wed, 15 Oct 2025 20:39:05 +0000 Subject: [PATCH 178/323] 8364257: JFR: User-defined events and settings with a one-letter name cannot be configured Backport-of: ea7e943874288e1cbea10a6bd82d6c7f2a1c9ae0 --- .../classes/jdk/jfr/internal/SettingsManager.java | 2 +- .../api/flightrecorder/TestSettingsControl.java | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/SettingsManager.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/SettingsManager.java index 0055b9f4655a..c94f7e57d7ba 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/SettingsManager.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/SettingsManager.java @@ -193,7 +193,7 @@ private Collection makeInternalSettings(Map rec String key = entry.getKey(); String value = entry.getValue(); int index = key.indexOf("#"); - if (index > 1 && index < key.length() - 2) { + if (index > 0 && index < key.length() - 1) { String eventName = key.substring(0, index); eventName = Utils.upgradeLegacyJDKEvent(eventName); InternalSetting s = internals.get(eventName); diff --git a/test/jdk/jdk/jfr/api/flightrecorder/TestSettingsControl.java b/test/jdk/jdk/jfr/api/flightrecorder/TestSettingsControl.java index 0b54f218c43c..01eb803af807 100644 --- a/test/jdk/jdk/jfr/api/flightrecorder/TestSettingsControl.java +++ b/test/jdk/jdk/jfr/api/flightrecorder/TestSettingsControl.java @@ -28,6 +28,7 @@ import java.util.Set; import jdk.jfr.Event; +import jdk.jfr.Name; import jdk.jfr.Recording; import jdk.jfr.SettingControl; import jdk.jfr.SettingDefinition; @@ -42,7 +43,7 @@ public class TestSettingsControl { static class MySettingsControl extends SettingControl { - public static boolean setWasCalled; + public static boolean myvalueSet; private String value = "default"; @@ -57,7 +58,9 @@ public String combine(Set values) { @Override public void setValue(String value) { - setWasCalled = true; + if ("myvalue".equals(value)) { + myvalueSet = true; + } this.value = value; } @@ -67,9 +70,10 @@ public String getValue() { } } - + @Name("M") static class MyCustomSettingEvent extends Event { @SettingDefinition + @Name("m") boolean mySetting(MySettingsControl msc) { return true; } @@ -77,13 +81,13 @@ boolean mySetting(MySettingsControl msc) { public static void main(String[] args) throws Throwable { Recording r = new Recording(); - r.enable(MyCustomSettingEvent.class).with("mySetting", "myvalue"); + r.enable("M").with("m", "myvalue"); r.start(); MyCustomSettingEvent e = new MyCustomSettingEvent(); e.commit(); r.stop(); r.close(); - assertTrue(MySettingsControl.setWasCalled, "SettingControl.setValue was not called"); + assertTrue(MySettingsControl.myvalueSet, "SettingControl.setValue(\"myvalue\") was not called"); } } From b7d4c3b523b7205c766a0c4edc665fd850e3d9a7 Mon Sep 17 00:00:00 2001 From: Rui Li Date: Wed, 15 Oct 2025 20:39:25 +0000 Subject: [PATCH 179/323] 8368192: Test java/lang/ProcessBuilder/Basic.java#id0 fails with Exception: Stack trace Reviewed-by: rriggs Backport-of: 218e82c875237f82a649a214c72d925a5ebf188c --- test/jdk/java/lang/ProcessBuilder/Basic.java | 35 ++++++++++---------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/test/jdk/java/lang/ProcessBuilder/Basic.java b/test/jdk/java/lang/ProcessBuilder/Basic.java index d4c1af737e55..a91735216ca6 100644 --- a/test/jdk/java/lang/ProcessBuilder/Basic.java +++ b/test/jdk/java/lang/ProcessBuilder/Basic.java @@ -28,7 +28,7 @@ * 6464154 6523983 6206031 4960438 6631352 6631966 6850957 6850958 * 4947220 7018606 7034570 4244896 5049299 8003488 8054494 8058464 * 8067796 8224905 8263729 8265173 8272600 8231297 8282219 8285517 - * 8352533 + * 8352533 8368192 * @key intermittent * @summary Basic tests for Process and Environment Variable code * @modules java.base/java.lang:open @@ -780,30 +780,29 @@ private static boolean matches(String str, String regex) { return Pattern.compile(regex).matcher(str).find(); } - private static String matchAndExtract(String str, String regex) { - Matcher matcher = Pattern.compile(regex).matcher(str); - if (matcher.find()) { - return matcher.group(); - } else { - return ""; - } + // Return the string with the matching regex removed + private static String matchAndRemove(String str, String regex) { + return Pattern.compile(regex) + .matcher(str) + .replaceAll(""); } /* Only used for Mac OS X -- - * Mac OS X (may) add the variable __CF_USER_TEXT_ENCODING to an empty - * environment. The environment variable JAVA_MAIN_CLASS_ may also - * be set in Mac OS X. - * Remove them both from the list of env variables + * Mac OS X (may) add the variables: __CF_USER_TEXT_ENCODING, JAVA_MAIN_CLASS_, + * and TMPDIR. + * Remove them from the list of env variables */ private static String removeMacExpectedVars(String vars) { // Check for __CF_USER_TEXT_ENCODING - String cleanedVars = vars.replace("__CF_USER_TEXT_ENCODING=" - +cfUserTextEncoding+",",""); + String cleanedVars = matchAndRemove(vars, + "__CF_USER_TEXT_ENCODING=" + cfUserTextEncoding + ","); // Check for JAVA_MAIN_CLASS_ - String javaMainClassStr - = matchAndExtract(cleanedVars, - "JAVA_MAIN_CLASS_\\d+=Basic.JavaChild,"); - return cleanedVars.replace(javaMainClassStr,""); + cleanedVars = matchAndRemove(cleanedVars, + "JAVA_MAIN_CLASS_\\d+=Basic.JavaChild,"); + // Check and remove TMPDIR + cleanedVars = matchAndRemove(cleanedVars, + "TMPDIR=[^,]*,"); + return cleanedVars; } /* Only used for AIX -- From 0fa1014e036fb27349c84578c003be5e12aa3f5c Mon Sep 17 00:00:00 2001 From: Daniel Hu Date: Thu, 16 Oct 2025 15:13:24 +0000 Subject: [PATCH 180/323] 8313231: Redundant if statement in ZoneInfoFile Backport-of: f8c2b7fee101d66107704b3ee464737c5ccdc13a --- .../share/classes/sun/util/calendar/ZoneInfoFile.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/java.base/share/classes/sun/util/calendar/ZoneInfoFile.java b/src/java.base/share/classes/sun/util/calendar/ZoneInfoFile.java index 0a9e8a03c506..17c027063368 100644 --- a/src/java.base/share/classes/sun/util/calendar/ZoneInfoFile.java +++ b/src/java.base/share/classes/sun/util/calendar/ZoneInfoFile.java @@ -468,10 +468,9 @@ private static ZoneInfo getZoneInfo(String zoneId, } if (i < savingsInstantTransitions.length) { // javazic writes the last GMT offset into index 0! - if (i < savingsInstantTransitions.length) { - offsets[0] = standardOffsets[standardOffsets.length - 1] * 1000; - nOffsets = 1; - } + offsets[0] = standardOffsets[standardOffsets.length - 1] * 1000; + nOffsets = 1; + // ZoneInfo has a beginning entry for 1900. // Only add it if this is not the only one in table nOffsets = addTrans(transitions, nTrans++, From 6a0dd939a7d6ac98f20a2d5ae110e9fcd64c2b43 Mon Sep 17 00:00:00 2001 From: Daniel Hu Date: Thu, 16 Oct 2025 15:19:05 +0000 Subject: [PATCH 181/323] 8342582: user.region for formatting number no longer works for 21.0.5 Backport-of: e64f0798be64d334b3ec2a918687aafc2031a8b7 --- .../share/classes/java/util/Locale.java | 27 ++----- .../jdk/internal/util/StaticProperty.java | 24 ++++-- test/jdk/java/util/Locale/UserRegionTest.java | 74 +++++++++++++++++++ 3 files changed, 98 insertions(+), 27 deletions(-) create mode 100644 test/jdk/java/util/Locale/UserRegionTest.java diff --git a/src/java.base/share/classes/java/util/Locale.java b/src/java.base/share/classes/java/util/Locale.java index 02f556489e64..927b971c1302 100644 --- a/src/java.base/share/classes/java/util/Locale.java +++ b/src/java.base/share/classes/java/util/Locale.java @@ -1053,28 +1053,11 @@ private static synchronized Locale getFormatLocale() { } private static Locale initDefault() { - String language, region, script, country, variant; - language = StaticProperty.USER_LANGUAGE; - // for compatibility, check for old user.region property - region = StaticProperty.USER_REGION; - if (!region.isEmpty()) { - // region can be of form country, country_variant, or _variant - int i = region.indexOf('_'); - if (i >= 0) { - country = region.substring(0, i); - variant = region.substring(i + 1); - } else { - country = region; - variant = ""; - } - script = ""; - } else { - script = StaticProperty.USER_SCRIPT; - country = StaticProperty.USER_COUNTRY; - variant = StaticProperty.USER_VARIANT; - } - - return getInstance(language, script, country, variant, + return getInstance( + StaticProperty.USER_LANGUAGE, + StaticProperty.USER_SCRIPT, + StaticProperty.USER_COUNTRY, + StaticProperty.USER_VARIANT, getDefaultExtensions(StaticProperty.USER_EXTENSIONS) .orElse(null)); } diff --git a/src/java.base/share/classes/jdk/internal/util/StaticProperty.java b/src/java.base/share/classes/jdk/internal/util/StaticProperty.java index da06bf07a65a..9dcebeca470e 100644 --- a/src/java.base/share/classes/jdk/internal/util/StaticProperty.java +++ b/src/java.base/share/classes/jdk/internal/util/StaticProperty.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, 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 @@ -98,19 +98,33 @@ private StaticProperty() {} USER_LANGUAGE = getProperty(props, "user.language", "en"); USER_LANGUAGE_DISPLAY = getProperty(props, "user.language.display", USER_LANGUAGE); USER_LANGUAGE_FORMAT = getProperty(props, "user.language.format", USER_LANGUAGE); - USER_SCRIPT = getProperty(props, "user.script", ""); + // for compatibility, check for old user.region property + USER_REGION = getProperty(props, "user.region", ""); + if (!USER_REGION.isEmpty()) { + // region can be of form country, country_variant, or _variant + int i = USER_REGION.indexOf('_'); + if (i >= 0) { + USER_COUNTRY = USER_REGION.substring(0, i); + USER_VARIANT = USER_REGION.substring(i + 1); + } else { + USER_COUNTRY = USER_REGION; + USER_VARIANT = ""; + } + USER_SCRIPT = ""; + } else { + USER_SCRIPT = getProperty(props, "user.script", ""); + USER_COUNTRY = getProperty(props, "user.country", ""); + USER_VARIANT = getProperty(props, "user.variant", ""); + } USER_SCRIPT_DISPLAY = getProperty(props, "user.script.display", USER_SCRIPT); USER_SCRIPT_FORMAT = getProperty(props, "user.script.format", USER_SCRIPT); - USER_COUNTRY = getProperty(props, "user.country", ""); USER_COUNTRY_DISPLAY = getProperty(props, "user.country.display", USER_COUNTRY); USER_COUNTRY_FORMAT = getProperty(props, "user.country.format", USER_COUNTRY); - USER_VARIANT = getProperty(props, "user.variant", ""); USER_VARIANT_DISPLAY = getProperty(props, "user.variant.display", USER_VARIANT); USER_VARIANT_FORMAT = getProperty(props, "user.variant.format", USER_VARIANT); USER_EXTENSIONS = getProperty(props, "user.extensions", ""); USER_EXTENSIONS_DISPLAY = getProperty(props, "user.extensions.display", USER_EXTENSIONS); USER_EXTENSIONS_FORMAT = getProperty(props, "user.extensions.format", USER_EXTENSIONS); - USER_REGION = getProperty(props, "user.region", ""); } private static String getProperty(Properties props, String key) { diff --git a/test/jdk/java/util/Locale/UserRegionTest.java b/test/jdk/java/util/Locale/UserRegionTest.java new file mode 100644 index 000000000000..72a7106b2670 --- /dev/null +++ b/test/jdk/java/util/Locale/UserRegionTest.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2024, 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 8342582 + * @summary Test if "user.region" system property successfully overrides + * other locale related system properties at startup + * @modules jdk.localedata + * @run junit/othervm + * -Duser.region=DE + * -Duser.language=en + * -Duser.script=Latn + * -Duser.country=US + * -Duser.variant=FOO UserRegionTest + * @run junit/othervm + * -Duser.region=DE_POSIX + * -Duser.language=en + * -Duser.script=Latn + * -Duser.country=US + * -Duser.variant=FOO UserRegionTest + * @run junit/othervm + * -Duser.region=_POSIX + * -Duser.language=en + * -Duser.script=Latn + * -Duser.country=US + * -Duser.variant=FOO UserRegionTest + */ + +import java.util.Locale; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class UserRegionTest { + @Test + public void testDefaultLocale() { + var region = System.getProperty("user.region").split("_"); + var expected = Locale.of(System.getProperty("user.language"), + region[0], region.length > 1 ? region[1] : ""); + assertEquals(expected, Locale.getDefault()); + assertEquals(expected, Locale.getDefault(Locale.Category.FORMAT)); + assertEquals(expected, Locale.getDefault(Locale.Category.DISPLAY)); + } + + @Test + public void testNumberFormat() { + if (System.getProperty("user.region").startsWith("DE")) { + assertEquals("0,50000", String.format("%.5f", 0.5f)); + } else { + assertEquals("0.50000", String.format("%.5f", 0.5f)); + } + } +} From bfe2661ca648d6f988769ef1b328dfe343b4d395 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 17 Oct 2025 13:29:46 +0000 Subject: [PATCH 182/323] 8356145: ListEnterExitTest.java fails on macos Backport-of: 99e01301cd7f063f167db107d31468b1d3f901aa --- test/jdk/java/awt/List/ListEnterExitTest.java | 80 +++++++++---------- 1 file changed, 38 insertions(+), 42 deletions(-) diff --git a/test/jdk/java/awt/List/ListEnterExitTest.java b/test/jdk/java/awt/List/ListEnterExitTest.java index cb9c035d9779..201a0e43c135 100644 --- a/test/jdk/java/awt/List/ListEnterExitTest.java +++ b/test/jdk/java/awt/List/ListEnterExitTest.java @@ -36,16 +36,24 @@ import java.awt.Point; import java.awt.Robot; -import java.awt.event.InputEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + public class ListEnterExitTest { final List list = new List(); - final MouseEnterExitListener mouseEnterExitListener = new MouseEnterExitListener(); Frame frame; volatile Point p; + private static final int X_OFFSET = 30; + private static final int Y_OFFSET = 40; + private static final int LATCH_TIMEOUT = 3; + + private final CountDownLatch mouseEnterLatch = new CountDownLatch(1); + private final CountDownLatch mouseExitLatch = new CountDownLatch(1); + public static void main(String[] args) throws Exception { ListEnterExitTest test = new ListEnterExitTest(); test.start(); @@ -57,7 +65,11 @@ public void start() throws Exception { frame = new Frame("ListEnterExitTest"); list.add("Item 1"); list.add("Item 2"); - list.addMouseListener(mouseEnterExitListener); + list.add("Item 3"); + list.add("Item 4"); + list.add("Item 5"); + list.add("Item 6"); + list.addMouseListener(new MouseEnterExitListener()); frame.add(list); frame.setLayout(new FlowLayout()); frame.setSize(300, 200); @@ -66,25 +78,28 @@ public void start() throws Exception { }); final Robot robot = new Robot(); - robot.delay(1000); + robot.setAutoDelay(100); robot.waitForIdle(); + robot.delay(1000); EventQueue.invokeAndWait(() -> { p = list.getLocationOnScreen(); }); - robot.mouseMove(p.x + 10, p.y + 10); - robot.delay(100); + robot.mouseMove(p.x + X_OFFSET, p.y + Y_OFFSET); robot.waitForIdle(); - robot.mouseMove(p.x - 10, p.y - 10); - robot.delay(100); + + robot.mouseMove(p.x - X_OFFSET, p.y + Y_OFFSET); robot.waitForIdle(); - robot.mouseMove(p.x + 10, p.y + 10); - robot.mousePress(InputEvent.BUTTON1_MASK); - robot.mouseRelease(InputEvent.BUTTON1_MASK); + robot.mouseMove(p.x + X_OFFSET, p.y + Y_OFFSET); + robot.waitForIdle(); + + if (!mouseEnterLatch.await(LATCH_TIMEOUT, TimeUnit.SECONDS)) { + throw new RuntimeException("Mouse enter event timeout"); + } - synchronized (mouseEnterExitListener) { - mouseEnterExitListener.wait(2000); + if (!mouseExitLatch.await(LATCH_TIMEOUT, TimeUnit.SECONDS)) { + throw new RuntimeException("Mouse exit event timeout"); } } finally { EventQueue.invokeAndWait(() -> { @@ -93,38 +108,19 @@ public void start() throws Exception { } }); } - System.out.println("mouseEnterExitListener.isPassed() : " + mouseEnterExitListener.isPassed()); - if (!mouseEnterExitListener.isPassed()) { - throw new RuntimeException("Haven't receive mouse enter/exit events"); - } - } -} - -class MouseEnterExitListener extends MouseAdapter { - - volatile boolean passed_1 = false; - volatile boolean passed_2 = false; - - public void mouseEntered(MouseEvent e) { - passed_1 = true; - System.out.println("passed_1 is: " + passed_1); - } - - public void mouseExited(MouseEvent e) { - passed_2 = true; - System.out.println("passed_2 is: " + passed_2); - } - - public void mousePressed(MouseEvent e) { - synchronized (this) { - System.out.println("mouse pressed"); - this.notifyAll(); + private class MouseEnterExitListener extends MouseAdapter { + @Override + public void mouseEntered(MouseEvent e) { + System.out.println("Mouse Entered Event"); + mouseEnterLatch.countDown(); } - } - public boolean isPassed() { - return passed_1 & passed_2; + @Override + public void mouseExited(MouseEvent e) { + System.out.println("Mouse Exited Event"); + mouseExitLatch.countDown(); + } } } From 59d34250c034a969ebdf53e9a014a79200476e65 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 17 Oct 2025 13:32:12 +0000 Subject: [PATCH 183/323] 8359477: com/sun/net/httpserver/Test12.java appears to have a temp file race Backport-of: e1681c48287bcce6c8f617d9c0c25354dd62870a --- .../sun/net/httpserver/FileServerHandler.java | 28 ++- test/jdk/com/sun/net/httpserver/Test12.java | 162 ++++++++---------- 2 files changed, 84 insertions(+), 106 deletions(-) diff --git a/test/jdk/com/sun/net/httpserver/FileServerHandler.java b/test/jdk/com/sun/net/httpserver/FileServerHandler.java index bff78443839e..8e9fe5671f5c 100644 --- a/test/jdk/com/sun/net/httpserver/FileServerHandler.java +++ b/test/jdk/com/sun/net/httpserver/FileServerHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2025, 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 @@ -47,7 +47,6 @@ public FileServerHandler (String docroot) { this.docroot = docroot; } - int invocation = 1; public void handle (HttpExchange t) throws IOException { @@ -91,16 +90,16 @@ public void handle (HttpExchange t) rmap.set ("Content-Type", "text/html"); t.sendResponseHeaders (200, 0); String[] list = f.list(); - OutputStream os = t.getResponseBody(); - PrintStream p = new PrintStream (os); - p.println ("

          Directory listing for: " + path+ "

          "); - p.println ("
            "); - for (int i=0; i"+list[i]+""); + try (final OutputStream os = t.getResponseBody(); + final PrintStream p = new PrintStream (os)) { + p.println("

            Directory listing for: " + path + "

            "); + p.println("
              "); + for (int i = 0; i < list.length; i++) { + p.println("
            • " + list[i] + "
            • "); + } + p.println("


            "); + p.flush(); } - p.println ("


          "); - p.flush(); - p.close(); } else { int clen; if (fixedrequest != null) { @@ -109,10 +108,9 @@ public void handle (HttpExchange t) clen = 0; } t.sendResponseHeaders (200, clen); - OutputStream os = t.getResponseBody(); - FileInputStream fis = new FileInputStream (f); int count = 0; - try { + try (final OutputStream os = t.getResponseBody(); + final FileInputStream fis = new FileInputStream (f)) { byte[] buf = new byte [16 * 1024]; int len; while ((len=fis.read (buf)) != -1) { @@ -122,8 +120,6 @@ public void handle (HttpExchange t) } catch (IOException e) { e.printStackTrace(); } - fis.close(); - os.close(); } } diff --git a/test/jdk/com/sun/net/httpserver/Test12.java b/test/jdk/com/sun/net/httpserver/Test12.java index ab1d9d548e78..2a0ee1fc0a44 100644 --- a/test/jdk/com/sun/net/httpserver/Test12.java +++ b/test/jdk/com/sun/net/httpserver/Test12.java @@ -21,23 +21,12 @@ * questions. */ -/* - * @test - * @bug 6270015 - * @library /test/lib - * @build jdk.test.lib.Asserts - * jdk.test.lib.Utils - * jdk.test.lib.net.SimpleSSLContext - * jdk.test.lib.net.URIBuilder - * @run main/othervm Test12 - * @run main/othervm -Djava.net.preferIPv6Addresses=true Test12 - * @summary Light weight HTTP server - */ - import com.sun.net.httpserver.*; import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.*; import java.io.*; import java.net.*; @@ -49,11 +38,19 @@ import static jdk.test.lib.Asserts.assertFileContentsEqual; import static jdk.test.lib.Utils.createTempFileOfSize; -/* basic http/s connectivity test - * Tests: - * - same as Test1, but in parallel +/* + * @test + * @bug 6270015 8359477 + * @summary Light weight HTTP server - basic http/s connectivity test, same as Test1, + * but in parallel + * @library /test/lib + * @build jdk.test.lib.Asserts + * jdk.test.lib.Utils + * jdk.test.lib.net.SimpleSSLContext + * jdk.test.lib.net.URIBuilder + * @run main/othervm Test12 + * @run main/othervm -Djava.net.preferIPv6Addresses=true Test12 */ - public class Test12 extends Test { private static final String TEMP_FILE_PREFIX = @@ -61,14 +58,12 @@ public class Test12 extends Test { static SSLContext ctx; - static boolean fail = false; - public static void main (String[] args) throws Exception { HttpServer s1 = null; HttpsServer s2 = null; - ExecutorService executor=null; Path smallFilePath = createTempFileOfSize(TEMP_FILE_PREFIX, null, 23); Path largeFilePath = createTempFileOfSize(TEMP_FILE_PREFIX, null, 2730088); + final ExecutorService executor = Executors.newCachedThreadPool(); try { System.out.print ("Test12: "); InetAddress loopback = InetAddress.getLoopbackAddress(); @@ -80,7 +75,6 @@ public static void main (String[] args) throws Exception { HttpHandler h = new FileServerHandler(smallFilePath.getParent().toString()); HttpContext c1 = s1.createContext ("/", h); HttpContext c2 = s2.createContext ("/", h); - executor = Executors.newCachedThreadPool(); s1.setExecutor (executor); s2.setExecutor (executor); ctx = new SimpleSSLContext().get(); @@ -90,7 +84,7 @@ public static void main (String[] args) throws Exception { int port = s1.getAddress().getPort(); int httpsport = s2.getAddress().getPort(); - Runner r[] = new Runner[8]; + final Runner[] r = new Runner[8]; r[0] = new Runner (true, "http", port, smallFilePath); r[1] = new Runner (true, "http", port, largeFilePath); r[2] = new Runner (true, "https", httpsport, smallFilePath); @@ -99,95 +93,83 @@ public static void main (String[] args) throws Exception { r[5] = new Runner (false, "http", port, largeFilePath); r[6] = new Runner (false, "https", httpsport, smallFilePath); r[7] = new Runner (false, "https", httpsport, largeFilePath); - start (r); - join (r); - System.out.println ("OK"); + // submit the tasks + final List> futures = new ArrayList<>(); + for (Runner runner : r) { + futures.add(executor.submit(runner)); + } + // wait for the tasks' completion + for (Future f : futures) { + f.get(); + } + System.out.println ("All " + futures.size() + " tasks completed successfully"); } finally { - if (s1 != null) + if (s1 != null) { s1.stop(0); - if (s2 != null) + } + if (s2 != null) { s2.stop(0); - if (executor != null) - executor.shutdown (); + } + executor.close(); + // it's OK to delete these files since the server side handlers + // serving these files have completed (guaranteed by the completion of Executor.close()) + System.out.println("deleting " + smallFilePath); Files.delete(smallFilePath); + System.out.println("deleting " + largeFilePath); Files.delete(largeFilePath); } } - static void start (Runner[] x) { - for (int i=0; i { boolean fixedLen; String protocol; int port; private final Path filePath; - Runner (boolean fixedLen, String protocol, int port, Path filePath) { + Runner(boolean fixedLen, String protocol, int port, Path filePath) { this.fixedLen=fixedLen; this.protocol=protocol; this.port=port; this.filePath = filePath; } - public void run () { - try { - URL url = URIBuilder.newBuilder() - .scheme(protocol) - .loopback() - .port(port) - .path("/" + filePath.getFileName()) - .toURL(); - HttpURLConnection urlc = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY); - if (urlc instanceof HttpsURLConnection) { - HttpsURLConnection urlcs = (HttpsURLConnection) urlc; - urlcs.setHostnameVerifier (new HostnameVerifier () { - public boolean verify (String s, SSLSession s1) { - return true; - } - }); - urlcs.setSSLSocketFactory (ctx.getSocketFactory()); - } - byte [] buf = new byte [4096]; - - if (fixedLen) { - urlc.setRequestProperty ("XFixed", "yes"); - } - InputStream is = urlc.getInputStream(); - File temp = File.createTempFile ("Test1", null); - temp.deleteOnExit(); - OutputStream fout = new BufferedOutputStream (new FileOutputStream(temp)); - int c, count = 0; - while ((c=is.read(buf)) != -1) { - count += c; - fout.write (buf, 0, c); - } - is.close(); - fout.close(); - - if (count != filePath.toFile().length()) { - throw new RuntimeException ("wrong amount of data returned"); - } - assertFileContentsEqual(filePath, temp.toPath()); - temp.delete(); - } catch (Exception e) { - e.printStackTrace(); - fail = true; + @Override + public Void call() throws Exception { + final URL url = URIBuilder.newBuilder() + .scheme(protocol) + .loopback() + .port(port) + .path("/" + filePath.getFileName()) + .toURL(); + final HttpURLConnection urlc = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY); + if (urlc instanceof HttpsURLConnection) { + HttpsURLConnection urlcs = (HttpsURLConnection) urlc; + urlcs.setHostnameVerifier (new HostnameVerifier () { + public boolean verify (String s, SSLSession s1) { + return true; + } + }); + urlcs.setSSLSocketFactory (ctx.getSocketFactory()); } + if (fixedLen) { + urlc.setRequestProperty ("XFixed", "yes"); + } + final Path temp = Files.createTempFile(Path.of("."), "Test12", null); + final long numReceived; + try (InputStream is = urlc.getInputStream(); + OutputStream fout = new BufferedOutputStream(new FileOutputStream(temp.toFile()))) { + numReceived = is.transferTo(fout); + } + System.out.println("received " + numReceived + " response bytes for " + url); + final long expected = filePath.toFile().length(); + if (numReceived != expected) { + throw new RuntimeException ("expected " + expected + " bytes, but received " + + numReceived); + } + assertFileContentsEqual(filePath, temp); + Files.delete(temp); + return null; } } - } From afe4c44188f19e4b2e9ebc93be3e1dc81ae56df7 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 17 Oct 2025 13:34:19 +0000 Subject: [PATCH 184/323] 8364993: JFR: Disable jdk.ModuleExport in default.jfc Backport-of: a382996bb496d50b4eb5a6be9f61e5c2f8aaae2d --- src/jdk.jfr/share/conf/jfr/default.jfc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jdk.jfr/share/conf/jfr/default.jfc b/src/jdk.jfr/share/conf/jfr/default.jfc index 34e9d5b90644..f81519252090 100644 --- a/src/jdk.jfr/share/conf/jfr/default.jfc +++ b/src/jdk.jfr/share/conf/jfr/default.jfc @@ -700,7 +700,7 @@ - true + false endChunk From 530553c0266aff4f371dd42aa13bf9ad130b010c Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 17 Oct 2025 13:36:26 +0000 Subject: [PATCH 185/323] 8364556: JFR: Disable SymbolTableStatistics and StringTableStatistics in default.jfc Backport-of: 7698c373a684235812c9dc11edd751059f9e8e81 --- src/jdk.jfr/share/conf/jfr/default.jfc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/jdk.jfr/share/conf/jfr/default.jfc b/src/jdk.jfr/share/conf/jfr/default.jfc index f81519252090..ee03f66162e5 100644 --- a/src/jdk.jfr/share/conf/jfr/default.jfc +++ b/src/jdk.jfr/share/conf/jfr/default.jfc @@ -33,12 +33,12 @@ - true + false 10 s - true + false 10 s From 86b1fc8e6977f4c177130590a1be12f4eca29708 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 17 Oct 2025 13:38:28 +0000 Subject: [PATCH 186/323] 8364263: HttpClient: Improve encapsulation of ProxyServer Backport-of: 190e113031bc6ece781fdf0d9f3c853ce324f170 --- test/jdk/java/net/httpclient/ProxyServer.java | 28 +++++++------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/test/jdk/java/net/httpclient/ProxyServer.java b/test/jdk/java/net/httpclient/ProxyServer.java index 7de14a79225a..8e3e2bed5b93 100644 --- a/test/jdk/java/net/httpclient/ProxyServer.java +++ b/test/jdk/java/net/httpclient/ProxyServer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2025, 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 @@ -42,7 +42,7 @@ * Two threads are created per client connection. So, it's not * intended for large numbers of parallel connections. */ -public class ProxyServer extends Thread implements Closeable { +public final class ProxyServer implements Closeable { // could use the test library here - Platform.isWindows(), // but it would force all tests that use ProxyServer to @@ -99,9 +99,7 @@ public ProxyServer(Integer port, this(port, debug, null); } - public ProxyServer(Integer port, - Boolean debug, - Credentials credentials) + private ProxyServer(Integer port, Boolean debug, Credentials credentials) throws IOException { this.debug = debug; @@ -110,15 +108,8 @@ public ProxyServer(Integer port, listener.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), port)); this.port = ((InetSocketAddress)listener.getLocalAddress()).getPort(); this.credentials = credentials; - setName("ProxyListener"); - setDaemon(true); - connections = new CopyOnWriteArrayList(); - start(); - } - - public ProxyServer(String s) { - credentials = null; connections = new CopyOnWriteArrayList(); + Thread.ofPlatform().name("ProxyListener").daemon().start(this::run); } /** @@ -150,7 +141,7 @@ public void close() throws IOException { volatile boolean done; - public void run() { + private void run() { if (System.getSecurityManager() == null) { execute(); } else { @@ -672,10 +663,11 @@ public static void main(String[] args) throws Exception { int port = Integer.parseInt(args[0]); boolean debug = args.length > 1 && args[1].equals("-debug"); System.out.println("Debugging : " + debug); - ProxyServer ps = new ProxyServer(port, debug); - System.out.println("Proxy server listening on port " + ps.getPort()); - while (true) { - Thread.sleep(5000); + try (ProxyServer ps = new ProxyServer(port, debug)) { + System.out.println("Proxy server listening on port " + ps.getPort()); + while (true) { + Thread.sleep(5000); + } } } } From d8f8df9c92049a351606a53b4246ae46bc644ab6 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 17 Oct 2025 13:46:43 +0000 Subject: [PATCH 187/323] 8366750: Remove test 'java/awt/Choice/ChoiceMouseWheelTest/ChoiceMouseWheelTest.java' from problemlist Backport-of: b674a425531974bb78c4622e0f1d9b46a117f575 --- test/jdk/ProblemList.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index b1111cf287ef..b78195aaa13b 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -255,7 +255,7 @@ java/awt/FullScreen/DisplayChangeVITest/DisplayChangeVITest.java 8169469,8273617 java/awt/FullScreen/UninitializedDisplayModeChangeTest/UninitializedDisplayModeChangeTest.java 8273617 macosx-all java/awt/print/PrinterJob/PSQuestionMark.java 7003378 generic-all java/awt/print/PrinterJob/GlyphPositions.java 7003378 generic-all -java/awt/Choice/ChoiceMouseWheelTest/ChoiceMouseWheelTest.java 6849371 macosx-all,linux-all +java/awt/Choice/ChoiceMouseWheelTest/ChoiceMouseWheelTest.java 8366852 generic-all java/awt/Component/GetScreenLocTest/GetScreenLocTest.java 4753654 generic-all java/awt/Component/SetEnabledPerformance/SetEnabledPerformance.java 8165863 macosx-all java/awt/Clipboard/PasteNullToTextComponentsTest.java 8234140 macosx-all,windows-all From 3f67ac57cd44a804035663c335ec26496a16bf07 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 17 Oct 2025 13:47:01 +0000 Subject: [PATCH 188/323] 8365615: Improve JMenuBar/RightLeftOrientation.java Backport-of: afa8e79ba1a76066cf969cb3b5f76ea804780872 --- .../swing/JMenuBar/RightLeftOrientation.java | 85 ++++++++++--------- 1 file changed, 46 insertions(+), 39 deletions(-) diff --git a/test/jdk/javax/swing/JMenuBar/RightLeftOrientation.java b/test/jdk/javax/swing/JMenuBar/RightLeftOrientation.java index 80779c9ce1d0..8308034d0601 100644 --- a/test/jdk/javax/swing/JMenuBar/RightLeftOrientation.java +++ b/test/jdk/javax/swing/JMenuBar/RightLeftOrientation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -20,75 +20,76 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + /* * @test * @bug 4211731 4214512 * @summary * This test checks if menu bars lay out correctly when their - * ComponentOrientation property is set to RIGHT_TO_LEFT. This test is - * manual. The tester is asked to compare left-to-right and - * right-to-left menu bars and judge whether they are mirror images of each - * other. + * ComponentOrientation property is set to RIGHT_TO_LEFT. + * The tester is asked to compare left-to-right and + * right-to-left menu bars and decide whether they are mirror + * images of each other. * @library /test/jdk/java/awt/regtesthelpers * @build PassFailJFrame * @run main/manual RightLeftOrientation */ import java.awt.ComponentOrientation; -import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.List; + import javax.swing.ButtonGroup; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; +import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.SwingUtilities; import javax.swing.UIManager; -public class RightLeftOrientation { +public final class RightLeftOrientation { - static JFrame ltrFrame; - static JFrame rtlFrame; + private static List frames; private static final String INSTRUCTIONS = """ - This test checks menu bars for correct Right-To-Left Component Orientation. - - You should see two frames, each containing a menu bar. + This test checks menu bars for correct Right-To-Left component orientation. - One frame will be labelled "Left To Right" and will contain + You should see two frames, each contains a menu bar. + One frame is labelled "Left To Right" and contains a menu bar with menus starting on its left side. - The other frame will be labelled "Right To Left" and will - contain a menu bar with menus starting on its right side. + The other frame is labelled "Right To Left" and + contains a menu bar with menus starting on its right side. - The test will also contain radio buttons that can be used to set - the look and feel of the menu bars. - For each look and feel, you should compare the two menu - bars and make sure they are mirror images of each other. """; + The test also displays a frame with radio buttons + to change the look and feel of the menu bars. + For each look and feel, compare the two menu bars + in LTR and RTL orientation and make sure they are mirror + images of each other."""; public static void main(String[] args) throws Exception { PassFailJFrame.builder() - .title("RTL test Instructions") + .title("Menu Bar RTL Instructions") .instructions(INSTRUCTIONS) - .rows((int) INSTRUCTIONS.lines().count() + 2) .columns(30) .testUI(RightLeftOrientation::createTestUI) + .positionTestUIRightColumn() .build() .awaitAndCheck(); } - private static JFrame createTestUI() { - JFrame frame = new JFrame("RightLeftOrientation"); + private static JFrame createPlafChangerFrame() { + JFrame frame = new JFrame("Change Look and Feel"); JPanel panel = new JPanel(); ButtonGroup group = new ButtonGroup(); - JRadioButton rb; ActionListener plafChanger = new PlafChanger(); UIManager.LookAndFeelInfo[] lafInfos = UIManager.getInstalledLookAndFeels(); for (int i = 0; i < lafInfos.length; i++) { - rb = new JRadioButton(lafInfos[i].getName()); + JRadioButton rb = new JRadioButton(lafInfos[i].getName()); rb.setActionCommand(lafInfos[i].getClassName()); rb.addActionListener(plafChanger); group.add(rb); @@ -99,33 +100,39 @@ private static JFrame createTestUI() { } frame.add(panel); + frame.pack(); + return frame; + } - ltrFrame = new JFrame("Left To Right"); + private static List createTestUI() { + JFrame plafFrame = createPlafChangerFrame(); + + JFrame ltrFrame = new JFrame("Left To Right"); ltrFrame.setJMenuBar(createMenuBar(ComponentOrientation.LEFT_TO_RIGHT)); ltrFrame.setSize(400, 100); - ltrFrame.setLocation(new Point(10, 10)); - ltrFrame.setVisible(true); - rtlFrame = new JFrame("Right To Left"); + JFrame rtlFrame = new JFrame("Right To Left"); rtlFrame.setJMenuBar(createMenuBar(ComponentOrientation.RIGHT_TO_LEFT)); rtlFrame.setSize(400, 100); - rtlFrame.setLocation(new Point(10, 120)); - rtlFrame.setVisible(true); - frame.pack(); - return frame; + + return (frames = List.of(plafFrame, ltrFrame, rtlFrame)); } - static class PlafChanger implements ActionListener { + private static final class PlafChanger implements ActionListener { + @Override public void actionPerformed(ActionEvent e) { String lnfName = e.getActionCommand(); try { UIManager.setLookAndFeel(lnfName); - SwingUtilities.updateComponentTreeUI(ltrFrame); - SwingUtilities.updateComponentTreeUI(rtlFrame); - } - catch (Exception exc) { - System.err.println("Could not load LookAndFeel: " + lnfName); + frames.forEach(SwingUtilities::updateComponentTreeUI); + } catch (Exception exc) { + String message = "Could not set Look and Feel to " + lnfName; + System.err.println(message); + JOptionPane.showMessageDialog(frames.get(0), + message, + "Look and Feel Error", + JOptionPane.ERROR_MESSAGE); } } From 35df7abb19e2d4fb78039f14bc5b0647c79eecf9 Mon Sep 17 00:00:00 2001 From: Rui Li Date: Fri, 17 Oct 2025 15:51:56 +0000 Subject: [PATCH 189/323] 8333783: java/nio/channels/FileChannel/directio/DirectIOTest.java is unstable with AV software Backport-of: 8c6d12250b524c0f4ee25dbbc6fe959581b7617b --- .../FileChannel/directio/DirectIOTest.java | 90 +++++++++++++------ .../FileChannel/directio/libDirectIO.c | 34 ++++--- 2 files changed, 84 insertions(+), 40 deletions(-) diff --git a/test/jdk/java/nio/channels/FileChannel/directio/DirectIOTest.java b/test/jdk/java/nio/channels/FileChannel/directio/DirectIOTest.java index 34f2bacc7dd8..b9dd309d0f76 100644 --- a/test/jdk/java/nio/channels/FileChannel/directio/DirectIOTest.java +++ b/test/jdk/java/nio/channels/FileChannel/directio/DirectIOTest.java @@ -27,11 +27,13 @@ * @summary Test for ExtendedOpenOption.DIRECT flag * @requires (os.family == "linux" | os.family == "aix") * @library /test/lib + * @modules java.base/sun.nio.ch:+open java.base/java.io:+open * @build jdk.test.lib.Platform * @run main/native DirectIOTest */ import java.io.*; +import java.lang.reflect.Field; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.channels.*; @@ -47,10 +49,25 @@ public class DirectIOTest { private static final int BASE_SIZE = 4096; + private static final int TRIES = 3; + + public static int getFD(FileChannel channel) throws Exception { + Field fFdFd = channel.getClass().getDeclaredField("fd"); + fFdFd.setAccessible(true); + FileDescriptor fd = (FileDescriptor) fFdFd.get(channel); + + Field fFd = FileDescriptor.class.getDeclaredField("fd"); + fFd.setAccessible(true); + return fFd.getInt(fd); + } + + private static void testWrite(Path p, long blockSize) throws Exception { + try (FileChannel fc = FileChannel.open(p, + StandardOpenOption.READ, + StandardOpenOption.WRITE, + ExtendedOpenOption.DIRECT)) { + int fd = getFD(fc); - private static int testWrite(Path p, long blockSize) throws Exception { - try (FileChannel fc = FileChannel.open(p, StandardOpenOption.WRITE, - ExtendedOpenOption.DIRECT)) { int bs = (int)blockSize; int size = Math.max(BASE_SIZE, bs); int alignment = bs; @@ -60,22 +77,55 @@ private static int testWrite(Path p, long blockSize) throws Exception { for (int j = 0; j < size; j++) { src.put((byte)0); } - src.flip(); - fc.write(src); - return size; + + // If there is AV or other FS tracing software, it may cache the file + // contents on first access, even though we have asked for DIRECT here. + // Do several attempts to make test more resilient. + + for (int t = 0; t < TRIES; t++) { + flushFileCache(size, fd); + src.flip(); + fc.position(0); + fc.write(src); + if (!isFileInCache(size, fd)) { + return; + } + } + + throw new RuntimeException("DirectIO is not working properly with " + + "write. File still exists in cache!"); } } - private static int testRead(Path p, long blockSize) throws Exception { - try (FileChannel fc = FileChannel.open(p, ExtendedOpenOption.DIRECT)) { + private static void testRead(Path p, long blockSize) throws Exception { + try (FileChannel fc = FileChannel.open(p, + StandardOpenOption.READ, + ExtendedOpenOption.DIRECT)) { + int fd = getFD(fc); + int bs = (int)blockSize; int size = Math.max(BASE_SIZE, bs); int alignment = bs; ByteBuffer dest = ByteBuffer.allocateDirect(size + alignment - 1) .alignedSlice(alignment); assert dest.capacity() != 0; - fc.read(dest); - return size; + + // If there is AV or other FS tracing software, it may cache the file + // contents on first access, even though we have asked for DIRECT here. + // Do several attempts to make test more resilient. + + for (int t = 0; t < TRIES; t++) { + flushFileCache(size, fd); + dest.clear(); + fc.position(0); + fc.read(dest); + if (!isFileInCache(size, fd)) { + return; + } + } + + throw new RuntimeException("DirectIO is not working properly with " + + "read. File still exists in cache!"); } } @@ -84,12 +134,8 @@ public static Path createTempFile() throws IOException { Paths.get(System.getProperty("test.dir", ".")), "test", null); } - private static boolean isFileInCache(int size, Path p) { - String path = p.toString(); - return isFileInCache0(size, path); - } - - private static native boolean isFileInCache0(int size, String path); + private static native boolean flushFileCache(int size, int fd); + private static native boolean isFileInCache(int size, int fd); public static void main(String[] args) throws Exception { Path p = createTempFile(); @@ -98,16 +144,8 @@ public static void main(String[] args) throws Exception { System.loadLibrary("DirectIO"); try { - int size = testWrite(p, blockSize); - if (isFileInCache(size, p)) { - throw new RuntimeException("DirectIO is not working properly with " - + "write. File still exists in cache!"); - } - size = testRead(p, blockSize); - if (isFileInCache(size, p)) { - throw new RuntimeException("DirectIO is not working properly with " - + "read. File still exists in cache!"); - } + testWrite(p, blockSize); + testRead(p, blockSize); } finally { Files.delete(p); } diff --git a/test/jdk/java/nio/channels/FileChannel/directio/libDirectIO.c b/test/jdk/java/nio/channels/FileChannel/directio/libDirectIO.c index 4897500bf2d4..5eea51da4c7e 100644 --- a/test/jdk/java/nio/channels/FileChannel/directio/libDirectIO.c +++ b/test/jdk/java/nio/channels/FileChannel/directio/libDirectIO.c @@ -45,13 +45,27 @@ static void ThrowException(JNIEnv *env, const char *name, const char *msg) { /* * Class: DirectIO - * Method: isFileInCache0 - * Signature: (ILjava/lang/String;)Z + * Method: flushFileCache + * Signature: (II;)V */ -JNIEXPORT jboolean Java_DirectIOTest_isFileInCache0(JNIEnv *env, +JNIEXPORT void Java_DirectIOTest_flushFileCache(JNIEnv *env, jclass cls, jint file_size, - jstring file_path) { + jint fd) { +#ifdef __linux__ + posix_fadvise(fd, 0, file_size, POSIX_FADV_DONTNEED); +#endif +} + +/* + * Class: DirectIO + * Method: isFileInCache + * Signature: (II;)Z + */ +JNIEXPORT jboolean Java_DirectIOTest_isFileInCache(JNIEnv *env, + jclass cls, + jint file_size, + jint fd) { void *f_mmap; #ifdef __linux__ unsigned char *f_seg; @@ -69,17 +83,10 @@ JNIEXPORT jboolean Java_DirectIOTest_isFileInCache0(JNIEnv *env, size_t index = (file_size + page_size - 1) /page_size; jboolean result = JNI_FALSE; - const char* path = (*env)->GetStringUTFChars(env, file_path, JNI_FALSE); - - int fd = open(path, O_RDWR); - - (*env)->ReleaseStringUTFChars(env, file_path, path); - f_mmap = mmap(0, file_size, PROT_NONE, MAP_SHARED, fd, 0); if (f_mmap == MAP_FAILED) { - close(fd); ThrowException(env, "java/io/IOException", - "test of whether file exists in cache failed"); + "test of whether file exists in cache failed: mmap failed"); } f_seg = malloc(index); if (f_seg != NULL) { @@ -95,9 +102,8 @@ JNIEXPORT jboolean Java_DirectIOTest_isFileInCache0(JNIEnv *env, free(f_seg); } else { ThrowException(env, "java/io/IOException", - "test of whether file exists in cache failed"); + "test of whether file exists in cache failed: malloc failed"); } - close(fd); munmap(f_mmap, file_size); return result; } From b85525768f0ed1f6972c28036e869a953b3631a2 Mon Sep 17 00:00:00 2001 From: Rui Li Date: Fri, 17 Oct 2025 15:52:11 +0000 Subject: [PATCH 190/323] 8201778: Speed up test javax/net/ssl/DTLS/PacketLossRetransmission.java Backport-of: fc3e3e26c515ae0f9ae32aec504974fba393928d --- .../javax/net/ssl/DTLS/DTLSOverDatagram.java | 12 ++++++--- .../ssl/DTLS/PacketLossRetransmission.java | 27 +++---------------- 2 files changed, 12 insertions(+), 27 deletions(-) diff --git a/test/jdk/javax/net/ssl/DTLS/DTLSOverDatagram.java b/test/jdk/javax/net/ssl/DTLS/DTLSOverDatagram.java index 1820dbe54237..9780586cd57f 100644 --- a/test/jdk/javax/net/ssl/DTLS/DTLSOverDatagram.java +++ b/test/jdk/javax/net/ssl/DTLS/DTLSOverDatagram.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2025, 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,7 +52,6 @@ */ public class DTLSOverDatagram { - private static final int SOCKET_TIMEOUT = 10 * 1000; // in millis private static final int BUFFER_SIZE = 1024; private static final int MAXIMUM_PACKET_SIZE = 1024; @@ -78,6 +77,7 @@ public class DTLSOverDatagram { private final AtomicBoolean exceptionOccurred = new AtomicBoolean(false); private final CountDownLatch serverStarted = new CountDownLatch(1); + private int socketTimeout = 10 * 1000; // in millis /* * ============================================================= * The test case @@ -476,6 +476,10 @@ static DatagramPacket getPacket( return null; } + public void setSocketTimeout(int socketTimeout) { + this.socketTimeout = socketTimeout; + } + // run delegated tasks void runDelegatedTasks(SSLEngine engine) throws Exception { Runnable runnable; @@ -529,8 +533,8 @@ public final void runTest(DTLSOverDatagram testCase) throws Exception { try (DatagramSocket serverSocket = new DatagramSocket(serverSocketAddress); DatagramSocket clientSocket = new DatagramSocket(clientSocketAddress)) { - serverSocket.setSoTimeout(SOCKET_TIMEOUT); - clientSocket.setSoTimeout(SOCKET_TIMEOUT); + serverSocket.setSoTimeout(socketTimeout); + clientSocket.setSoTimeout(socketTimeout); InetSocketAddress serverSocketAddr = new InetSocketAddress( InetAddress.getLoopbackAddress(), serverSocket.getLocalPort()); diff --git a/test/jdk/javax/net/ssl/DTLS/PacketLossRetransmission.java b/test/jdk/javax/net/ssl/DTLS/PacketLossRetransmission.java index 24a12600087f..2dd0de830f1a 100644 --- a/test/jdk/javax/net/ssl/DTLS/PacketLossRetransmission.java +++ b/test/jdk/javax/net/ssl/DTLS/PacketLossRetransmission.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2025, 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 @@ -32,37 +32,16 @@ * @library /test/lib * @build DTLSOverDatagram * - * @run main/othervm PacketLossRetransmission client 0 hello_request * @run main/othervm PacketLossRetransmission client 1 client_hello - * @run main/othervm PacketLossRetransmission client 2 server_hello - * @run main/othervm PacketLossRetransmission client 3 hello_verify_request - * @run main/othervm -Djdk.tls.client.enableSessionTicketExtension=false PacketLossRetransmission client 4 new_session_ticket - * @run main/othervm PacketLossRetransmission client 11 certificate - * @run main/othervm PacketLossRetransmission client 12 server_key_exchange - * @run main/othervm PacketLossRetransmission client 13 certificate_request - * @run main/othervm PacketLossRetransmission client 14 server_hello_done - * @run main/othervm PacketLossRetransmission client 15 certificate_verify * @run main/othervm PacketLossRetransmission client 16 client_key_exchange * @run main/othervm PacketLossRetransmission client 20 finished - * @run main/othervm PacketLossRetransmission client 21 certificate_url - * @run main/othervm PacketLossRetransmission client 22 certificate_status - * @run main/othervm PacketLossRetransmission client 23 supplemental_data * @run main/othervm PacketLossRetransmission client -1 change_cipher_spec - * @run main/othervm PacketLossRetransmission server 0 hello_request - * @run main/othervm PacketLossRetransmission server 1 client_hello * @run main/othervm PacketLossRetransmission server 2 server_hello * @run main/othervm PacketLossRetransmission server 3 hello_verify_request - * @run main/othervm -Djdk.tls.client.enableSessionTicketExtension=false PacketLossRetransmission server 4 new_session_ticket * @run main/othervm PacketLossRetransmission server 11 certificate * @run main/othervm PacketLossRetransmission server 12 server_key_exchange - * @run main/othervm PacketLossRetransmission server 13 certificate_request * @run main/othervm PacketLossRetransmission server 14 server_hello_done - * @run main/othervm PacketLossRetransmission server 15 certificate_verify - * @run main/othervm PacketLossRetransmission server 16 client_key_exchange * @run main/othervm PacketLossRetransmission server 20 finished - * @run main/othervm PacketLossRetransmission server 21 certificate_url - * @run main/othervm PacketLossRetransmission server 22 certificate_status - * @run main/othervm PacketLossRetransmission server 23 supplemental_data * @run main/othervm PacketLossRetransmission server -1 change_cipher_spec */ @@ -79,6 +58,7 @@ public class PacketLossRetransmission extends DTLSOverDatagram { private static boolean isClient; private static byte handshakeType; + private static final int TIMEOUT = 500; private boolean needPacketLoss = true; @@ -87,6 +67,7 @@ public static void main(String[] args) throws Exception { handshakeType = Byte.parseByte(args[1]); PacketLossRetransmission testCase = new PacketLossRetransmission(); + testCase.setSocketTimeout(TIMEOUT); testCase.runTest(testCase); } @@ -102,7 +83,7 @@ boolean produceHandshakePackets(SSLEngine engine, SocketAddress socketAddr, if (packet != null) { needPacketLoss = false; - System.out.println("Loss a packet of handshake messahe"); + System.out.println("Loss a packet of handshake message"); packets.remove(packet); } } From ff424c80b550cd7a2e88eecbe93359347955202c Mon Sep 17 00:00:00 2001 From: Rui Li Date: Fri, 17 Oct 2025 15:52:32 +0000 Subject: [PATCH 191/323] 8353953: com/sun/jdi tests should be fixed to not always require includevirtualthreads=y Backport-of: d1d81dd01ca6f3fc1e4710e6055c5a3185f43d9a --- test/jdk/com/sun/jdi/EventQueueDisconnectTest.java | 4 ++-- .../jdi/RedefineNestmateAttr/TestNestmateAttr.java | 3 ++- test/jdk/com/sun/jdi/TestScaffold.java | 12 ++++++++++-- test/jdk/com/sun/jdi/VMConnection.java | 6 +++--- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/test/jdk/com/sun/jdi/EventQueueDisconnectTest.java b/test/jdk/com/sun/jdi/EventQueueDisconnectTest.java index c050cb792eb6..848046186efa 100644 --- a/test/jdk/com/sun/jdi/EventQueueDisconnectTest.java +++ b/test/jdk/com/sun/jdi/EventQueueDisconnectTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2025, 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 @@ -62,7 +62,7 @@ public class EventQueueDisconnectTest { public static void main(String args[]) throws Exception { VMConnection connection = new VMConnection( "com.sun.jdi.CommandLineLaunch:", - VirtualMachine.TRACE_NONE); + VirtualMachine.TRACE_NONE, false); connection.setConnectorArg("main", "EventQueueDisconnectTarg"); String debuggeeVMOptions = VMConnection.getDebuggeeVMOptions(); if (!debuggeeVMOptions.equals("")) { diff --git a/test/jdk/com/sun/jdi/RedefineNestmateAttr/TestNestmateAttr.java b/test/jdk/com/sun/jdi/RedefineNestmateAttr/TestNestmateAttr.java index 76bd3bf5dc15..21ea9f389217 100644 --- a/test/jdk/com/sun/jdi/RedefineNestmateAttr/TestNestmateAttr.java +++ b/test/jdk/com/sun/jdi/RedefineNestmateAttr/TestNestmateAttr.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, 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 @@ -213,6 +213,7 @@ public class TestNestmateAttr extends TestScaffold { TestNestmateAttr (String[] args) { super(args); + enableIncludeVirtualthreads(); // need to run debug agent with includevirtualthreads=y } public static void main(String[] args) throws Throwable { diff --git a/test/jdk/com/sun/jdi/TestScaffold.java b/test/jdk/com/sun/jdi/TestScaffold.java index e410ae2c76d7..92779738998c 100644 --- a/test/jdk/com/sun/jdi/TestScaffold.java +++ b/test/jdk/com/sun/jdi/TestScaffold.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2025, 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 @@ -42,6 +42,9 @@ abstract public class TestScaffold extends TargetAdapter { private boolean redefineAsynchronously = false; private ReferenceType mainStartClass = null; + // Set true by tests that need the debug agent to be run with includevirtualthreads=y. + private boolean includeVThreads = false; + ThreadReference mainThread; /** * We create a VMDeathRequest, SUSPEND_ALL, to sync the BE and FE. @@ -84,6 +87,10 @@ public void mySleep(int millis) { } } + void enableIncludeVirtualthreads() { + includeVThreads = true; + } + boolean getExceptionCaught() { return exceptionCaught; } @@ -588,7 +595,8 @@ public void connect(String args[]) { argInfo.targetVMArgs = VMConnection.getDebuggeeVMOptions() + " " + argInfo.targetVMArgs; connection = new VMConnection(argInfo.connectorSpec, - argInfo.traceFlags); + argInfo.traceFlags, + includeVThreads); addListener(new TargetAdapter() { public void eventSetComplete(EventSet set) { diff --git a/test/jdk/com/sun/jdi/VMConnection.java b/test/jdk/com/sun/jdi/VMConnection.java index 18bd3d8956a5..4be407825cea 100644 --- a/test/jdk/com/sun/jdi/VMConnection.java +++ b/test/jdk/com/sun/jdi/VMConnection.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2025, 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 @@ -123,9 +123,9 @@ private Map parseConnectorArgs(Connector connector, String argString) { return arguments; } - VMConnection(String connectSpec, int traceFlags) { + VMConnection(String connectSpec, int traceFlags, boolean includeVThreads) { String nameString; - String argString = "includevirtualthreads=y"; + String argString = "includevirtualthreads=" + (includeVThreads ? 'y' : 'n'); int index = connectSpec.indexOf(':'); if (index == -1) { nameString = connectSpec; From 999a90153c5a2a4068de2fb74eb242a783dff126 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Fri, 17 Oct 2025 17:58:09 +0000 Subject: [PATCH 192/323] 8339366: [jittester] Make it possible to generate tests without execution Backport-of: 559fc711e03cf0086bea399ffb40cf294cbbb6e1 --- .../src/jdk/test/lib/jittester/Automatic.java | 68 ++----------- .../test/lib/jittester/ByteCodeGenerator.java | 26 +++-- .../test/lib/jittester/IRTreeGenerator.java | 97 +++++++++++++++++++ .../test/lib/jittester/JavaCodeGenerator.java | 23 ++++- .../test/lib/jittester/ProductionParams.java | 23 ++++- .../test/lib/jittester/TestsGenerator.java | 9 +- .../lib/jittester/utils/OptionResolver.java | 22 ++++- 7 files changed, 188 insertions(+), 80 deletions(-) create mode 100644 test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/IRTreeGenerator.java diff --git a/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/Automatic.java b/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/Automatic.java index c74c01f1bf70..61ec487c7ffc 100644 --- a/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/Automatic.java +++ b/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/Automatic.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2024, 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 @@ -23,13 +23,6 @@ package jdk.test.lib.jittester; -import jdk.test.lib.util.Pair; -import jdk.test.lib.jittester.factories.IRNodeBuilder; -import jdk.test.lib.jittester.types.TypeKlass; -import jdk.test.lib.jittester.utils.FixedTrees; -import jdk.test.lib.jittester.utils.OptionResolver; -import jdk.test.lib.jittester.utils.OptionResolver.Option; -import jdk.test.lib.jittester.utils.PseudoRandom; import java.time.LocalTime; import java.util.ArrayList; import java.util.List; @@ -39,57 +32,6 @@ public class Automatic { public static final int MINUTES_TO_WAIT = Integer.getInteger("jdk.test.lib.jittester", 3); - private static Pair generateIRTree(String name) { - ProductionLimiter.resetTimer(); - SymbolTable.removeAll(); - TypeList.removeAll(); - - IRNodeBuilder builder = new IRNodeBuilder() - .setPrefix(name) - .setName(name) - .setLevel(0); - - Long complexityLimit = ProductionParams.complexityLimit.value(); - IRNode privateClasses = null; - if (!ProductionParams.disableClasses.value()) { - long privateClassComlexity = (long) (complexityLimit * PseudoRandom.random()); - try { - privateClasses = builder.setComplexityLimit(privateClassComlexity) - .getClassDefinitionBlockFactory() - .produce(); - } catch (ProductionFailedException ex) { - ex.printStackTrace(System.out); - } - } - long mainClassComplexity = (long) (complexityLimit * PseudoRandom.random()); - IRNode mainClass = null; - try { - mainClass = builder.setComplexityLimit(mainClassComplexity) - .getMainKlassFactory() - .produce(); - TypeKlass aClass = new TypeKlass(name); - mainClass.getChild(1).addChild(FixedTrees.generateMainOrExecuteMethod(aClass, true)); - mainClass.getChild(1).addChild(FixedTrees.generateMainOrExecuteMethod(aClass, false)); - } catch (ProductionFailedException ex) { - ex.printStackTrace(System.out); - } - return new Pair<>(mainClass, privateClasses); - } - - private static void initializeTestGenerator(String[] params) { - OptionResolver parser = new OptionResolver(); - Option propertyFileOpt = parser.addStringOption('p', "property-file", - "conf/default.properties", "File to read properties from"); - ProductionParams.register(parser); - parser.parse(params, propertyFileOpt); - PseudoRandom.reset(ProductionParams.seed.value()); - TypesParser.parseTypesAndMethods(ProductionParams.classesFile.value(), - ProductionParams.excludeMethodsFile.value()); - if (ProductionParams.specificSeed.isSet()) { - PseudoRandom.setCurrentSeed(ProductionParams.specificSeed.value()); - } - } - private static List getTestGenerators() { List result = new ArrayList<>(); Class factoryClass; @@ -109,7 +51,9 @@ private static List getTestGenerators() { } public static void main(String[] args) { - initializeTestGenerator(args); + ProductionParams.initializeFromCmdline(args); + IRTreeGenerator.initializeWithProductionParams(); + int counter = 0; System.out.printf("Generating %d tests...%n", ProductionParams.numberOfTests.value()); System.out.printf(" %13s | %8s | %8s | %8s |%n", "start time", "count", "generat", @@ -121,7 +65,7 @@ public static void main(String[] args) { try { System.out.print("[" + LocalTime.now() + "] |"); String name = "Test_" + counter; - Pair irTree = generateIRTree(name); + var test = IRTreeGenerator.generateIRTree(name); System.out.printf(" %8d |", counter); long maxWaitTime = TimeUnit.MINUTES.toMillis(MINUTES_TO_WAIT); double generationTime = System.currentTimeMillis() - start; @@ -129,7 +73,7 @@ public static void main(String[] args) { start = System.currentTimeMillis(); Thread generatorThread = new Thread(() -> { for (TestsGenerator generator : generators) { - generator.accept(irTree.first, irTree.second); + generator.accept(test); } }); generatorThread.start(); diff --git a/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/ByteCodeGenerator.java b/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/ByteCodeGenerator.java index 87ca48c5acbf..fac88a1833ee 100644 --- a/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/ByteCodeGenerator.java +++ b/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/ByteCodeGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, 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 @@ -47,16 +47,17 @@ class ByteCodeGenerator extends TestsGenerator { } @Override - public void accept(IRNode mainClass, IRNode privateClasses) { - generateClassFiles(mainClass, privateClasses); - generateSeparateJtregHeader(mainClass); + public void accept(IRTreeGenerator.Test test) { + IRNode mainClass = test.mainClass(); + generateClassFiles(mainClass, test.privateClasses()); + generateSeparateJtregHeader(test.seed(), mainClass); compilePrinter(); generateGoldenOut(mainClass.getName()); } - private void generateSeparateJtregHeader(IRNode mainClass) { + private void generateSeparateJtregHeader(long seed, IRNode mainClass) { String mainClassName = mainClass.getName(); - writeFile(generatorDir, mainClassName + ".java", getJtregHeader(mainClassName)); + writeFile(generatorDir, mainClassName + ".java", getJtregHeader(mainClassName, seed)); } private void generateClassFiles(IRNode mainClass, IRNode privateClasses) { @@ -94,4 +95,17 @@ private void writeFile(String fileName, byte[] bytecode) { ex.printStackTrace(); } } + + public static void main(String[] args) throws Exception { + ProductionParams.initializeFromCmdline(args); + IRTreeGenerator.initializeWithProductionParams(); + + ByteCodeGenerator generator = new ByteCodeGenerator(); + + for (String mainClass : ProductionParams.mainClassNames.value()) { + var test = IRTreeGenerator.generateIRTree(mainClass); + generator.generateClassFiles(test.mainClass(), test.privateClasses()); + generator.generateSeparateJtregHeader(test.seed(), test.mainClass()); + } + } } diff --git a/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/IRTreeGenerator.java b/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/IRTreeGenerator.java new file mode 100644 index 000000000000..b748fadde590 --- /dev/null +++ b/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/IRTreeGenerator.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2024, 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 jdk.test.lib.jittester; + +import jdk.test.lib.jittester.factories.IRNodeBuilder; +import jdk.test.lib.jittester.types.TypeKlass; +import jdk.test.lib.jittester.utils.FixedTrees; +import jdk.test.lib.jittester.utils.PseudoRandom; + +/** + * Generates IR trees for fuzzy test classes. + */ +public class IRTreeGenerator { + + /** + * Generated Test - main and private classes trees along with random seed used for generation. + */ + public record Test (long seed, IRNode mainClass, IRNode privateClasses) {}; + + /** + * Generates IR trees for main and private classes. + * + * @param name main class name + * @return a pair (main class; private classes) + */ + public static Test generateIRTree(String name) { + long seed = PseudoRandom.getCurrentSeed(); + ProductionLimiter.resetTimer(); + //NB: SymbolTable is a widely-used singleton, hence all the locking. + SymbolTable.removeAll(); + TypeList.removeAll(); + + IRNodeBuilder builder = new IRNodeBuilder() + .setPrefix(name) + .setName(name) + .setLevel(0); + + Long complexityLimit = ProductionParams.complexityLimit.value(); + IRNode privateClasses = null; + if (!ProductionParams.disableClasses.value()) { + long privateClassComlexity = (long) (complexityLimit * PseudoRandom.random()); + try { + privateClasses = builder.setComplexityLimit(privateClassComlexity) + .getClassDefinitionBlockFactory() + .produce(); + } catch (ProductionFailedException ex) { + ex.printStackTrace(System.out); + } + } + long mainClassComplexity = (long) (complexityLimit * PseudoRandom.random()); + IRNode mainClass = null; + try { + mainClass = builder.setComplexityLimit(mainClassComplexity) + .getMainKlassFactory() + .produce(); + TypeKlass aClass = new TypeKlass(name); + mainClass.getChild(1).addChild(FixedTrees.generateMainOrExecuteMethod(aClass, true)); + mainClass.getChild(1).addChild(FixedTrees.generateMainOrExecuteMethod(aClass, false)); + } catch (ProductionFailedException ex) { + ex.printStackTrace(System.out); + } + return new Test(seed, mainClass, privateClasses); + } + + /** + * Initializes the generator from ProductionParams static class. + */ + public static void initializeWithProductionParams() { + TypesParser.parseTypesAndMethods(ProductionParams.classesFile.value(), + ProductionParams.excludeMethodsFile.value()); + if (ProductionParams.specificSeed.isSet()) { + PseudoRandom.setCurrentSeed(ProductionParams.specificSeed.value()); + } + } + +} diff --git a/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/JavaCodeGenerator.java b/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/JavaCodeGenerator.java index 7ca940fe5317..16d02f91d8e5 100644 --- a/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/JavaCodeGenerator.java +++ b/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/JavaCodeGenerator.java @@ -42,19 +42,20 @@ public class JavaCodeGenerator extends TestsGenerator { } @Override - public void accept(IRNode mainClass, IRNode privateClasses) { + public void accept(IRTreeGenerator.Test test) { + IRNode mainClass = test.mainClass(); String mainClassName = mainClass.getName(); - generateSources(mainClass, privateClasses); + generateSources(test.seed(), mainClass, test.privateClasses()); compilePrinter(); compileJavaFile(mainClassName); generateGoldenOut(mainClassName); } - private void generateSources(IRNode mainClass, IRNode privateClasses) { + private void generateSources(long seed, IRNode mainClass, IRNode privateClasses) { String mainClassName = mainClass.getName(); StringBuilder code = new StringBuilder(); JavaCodeVisitor vis = new JavaCodeVisitor(); - code.append(getJtregHeader(mainClassName)); + code.append(getJtregHeader(mainClassName, seed)); if (privateClasses != null) { code.append(privateClasses.accept(vis)); } @@ -79,7 +80,19 @@ private void compileJavaFile(String mainClassName) { } } - private static String[] generatePrerunAction(String mainClassName) { + protected static String[] generatePrerunAction(String mainClassName) { return new String[] {"@compile " + mainClassName + ".java"}; } + + public static void main(String[] args) throws Exception { + ProductionParams.initializeFromCmdline(args); + IRTreeGenerator.initializeWithProductionParams(); + + JavaCodeGenerator generator = new JavaCodeGenerator(); + + for (String mainClass : ProductionParams.mainClassNames.value()) { + var test = IRTreeGenerator.generateIRTree(mainClass); + generator.generateSources(test.seed(), test.mainClass(), test.privateClasses()); + } + } } diff --git a/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/ProductionParams.java b/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/ProductionParams.java index 69d489bf00dd..afc526e81c71 100644 --- a/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/ProductionParams.java +++ b/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/ProductionParams.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2024, 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 @@ -23,11 +23,15 @@ package jdk.test.lib.jittester; +import java.util.List; + import jdk.test.lib.jittester.utils.OptionResolver; import jdk.test.lib.jittester.utils.OptionResolver.Option; +import jdk.test.lib.jittester.utils.PseudoRandom; public class ProductionParams { + public static Option> mainClassNames = null; public static Option productionLimit = null; public static Option productionLimitSeconds = null; public static Option dataMemberLimit = null; @@ -72,6 +76,7 @@ public class ProductionParams { // workaraound: to reduce chance throwing ArrayIndexOutOfBoundsException public static Option chanceExpressionIndex = null; public static Option testbaseDir = null; + public static Option tempDir = null; public static Option numberOfTests = null; public static Option seed = null; public static Option specificSeed = null; @@ -81,6 +86,7 @@ public class ProductionParams { public static Option generatorsFactories = null; public static void register(OptionResolver optionResolver) { + mainClassNames = optionResolver.addRepeatingOption('k', "main-class", "", "Main class name"); productionLimit = optionResolver.addIntegerOption('l', "production-limit", 100, "Limit on steps in the production of an expression"); productionLimitSeconds = optionResolver.addIntegerOption("production-limit-seconds", 600, "Limit the time a test generation may take"); dataMemberLimit = optionResolver.addIntegerOption('v', "data-member-limit", 10, "Upper limit on data members"); @@ -124,6 +130,7 @@ public static void register(OptionResolver optionResolver) { enableFinalizers = optionResolver.addBooleanOption("enable-finalizers", "Enable finalizers (for stress testing)"); chanceExpressionIndex = optionResolver.addIntegerOption("chance-expression-index", 0, "A non negative decimal integer used to restrict chane of generating expression in array index while creating or accessing by index"); testbaseDir = optionResolver.addStringOption("testbase-dir", ".", "Testbase dir"); + tempDir = optionResolver.addStringOption("temp-dir", ".", "Temp dir path"); numberOfTests = optionResolver.addIntegerOption('n', "number-of-tests", 0, "Number of test classes to generate"); seed = optionResolver.addStringOption("seed", "", "Random seed"); specificSeed = optionResolver.addLongOption('z', "specificSeed", 0L, "A seed to be set for specific test generation(regular seed still needed for initialization)"); @@ -132,4 +139,18 @@ public static void register(OptionResolver optionResolver) { generators = optionResolver.addStringOption("generators", "", "Comma-separated list of generator names"); generatorsFactories = optionResolver.addStringOption("generatorsFactories", "", "Comma-separated list of generators factories class names"); } + + /** + * Initializes from the given command-line args + * + * @param args command-line arguments to use for initialization + */ + public static void initializeFromCmdline(String[] args) { + OptionResolver parser = new OptionResolver(); + Option propertyFileOpt = parser.addStringOption('p', "property-file", + "conf/default.properties", "File to read properties from"); + ProductionParams.register(parser); + parser.parse(args, propertyFileOpt); + PseudoRandom.reset(ProductionParams.seed.value()); + } } diff --git a/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/TestsGenerator.java b/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/TestsGenerator.java index 5d8ac107d6ad..3eee8e5a0216 100644 --- a/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/TestsGenerator.java +++ b/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/TestsGenerator.java @@ -30,13 +30,12 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.concurrent.TimeUnit; -import java.util.function.BiConsumer; +import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; import jdk.test.lib.jittester.types.TypeKlass; -import jdk.test.lib.jittester.utils.PseudoRandom; -public abstract class TestsGenerator implements BiConsumer { +public abstract class TestsGenerator implements Consumer { private static final int DEFAULT_JTREG_TIMEOUT = 120; protected static final String JAVA_BIN = getJavaPath(); protected static final String JAVAC = Paths.get(JAVA_BIN, "javac").toString(); @@ -121,9 +120,9 @@ protected static void ensureExisting(Path path) { } } - protected String getJtregHeader(String mainClassName) { + protected String getJtregHeader(String mainClassName, long seed) { String synopsis = "seed = '" + ProductionParams.seed.value() + "'" - + ", specificSeed = '" + PseudoRandom.getCurrentSeed() + "'"; + + ", specificSeed = '" + seed + "'"; StringBuilder header = new StringBuilder(); header.append("/*\n * @test\n * @summary ") .append(synopsis) diff --git a/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/utils/OptionResolver.java b/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/utils/OptionResolver.java index 09f7f20695c8..87207628df3b 100644 --- a/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/utils/OptionResolver.java +++ b/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/utils/OptionResolver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, 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 @@ -156,6 +156,12 @@ public Option addBooleanOption(String name, String description) { return addBooleanOption(null, name, false, description); } + public Option> addRepeatingOption(Character key, String name, String defaultValue, String description) { + final Option> option = new RepeatingOption(key, name, defaultValue, description); + register(option); + return option; + } + private void register(Option option) { if (options.put("--" + option.longName, option) != null) { throw new RuntimeException("Option is already registered for key " + option.longName); @@ -264,6 +270,20 @@ public Boolean parseFromString(String arg) { } } + private class RepeatingOption extends Option> { + List accumulated = new ArrayList(); + + RepeatingOption(Character s, String l, String v, String d) { + super(s, l, List.of(v), d); + } + + @Override + public List parseFromString(String arg) { + accumulated.add(arg); + return accumulated; + } + } + public Collection> getRegisteredOptions() { return Collections.unmodifiableSet(new LinkedHashSet<>(options.values())); } From 9d9df23d4a57034e277fa78ff3e63a5f71e19d43 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 20 Oct 2025 05:26:04 +0000 Subject: [PATCH 193/323] 8308780: Fix the Java Integer types on Windows Backport-of: c92b049db7853a061ce05cebdc1fd73205ed0c83 --- src/hotspot/share/c1/c1_Canonicalizer.hpp | 6 +----- src/java.base/windows/native/include/jni_md.h | 7 +++---- .../windows/native/libawt/java2d/windows/GDIRenderer.cpp | 8 ++++---- .../native/libawt/java2d/windows/GDIWindowSurfaceData.cpp | 4 ++-- .../windows/native/libawt/windows/ShellFolder2.cpp | 8 ++++---- src/java.desktop/windows/native/libawt/windows/awt_Menu.h | 4 ++-- .../windows/native/libawt/windows/awt_MenuBar.cpp | 4 ++-- .../windows/native/libawt/windows/awt_MenuBar.h | 4 ++-- .../windows/native/jaccesswalker/jaccesswalker.cpp | 2 +- .../windows/native/toolscommon/AccessInfo.cpp | 4 ++-- 10 files changed, 23 insertions(+), 28 deletions(-) diff --git a/src/hotspot/share/c1/c1_Canonicalizer.hpp b/src/hotspot/share/c1/c1_Canonicalizer.hpp index bc340587cba6..8c7651256e95 100644 --- a/src/hotspot/share/c1/c1_Canonicalizer.hpp +++ b/src/hotspot/share/c1/c1_Canonicalizer.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2023, 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 @@ -40,10 +40,6 @@ class Canonicalizer: InstructionVisitor { void set_constant(jlong x) { set_canonical(new Constant(new LongConstant(x))); } void set_constant(jfloat x) { set_canonical(new Constant(new FloatConstant(x))); } void set_constant(jdouble x) { set_canonical(new Constant(new DoubleConstant(x))); } -#ifdef _WINDOWS - // jint is defined as long in jni_md.h, so convert from int to jint - void set_constant(int x) { set_constant((jint)x); } -#endif void move_const_to_right(Op2* x); void do_Op2(Op2* x); diff --git a/src/java.base/windows/native/include/jni_md.h b/src/java.base/windows/native/include/jni_md.h index b8c144fb047f..f795421937e9 100644 --- a/src/java.base/windows/native/include/jni_md.h +++ b/src/java.base/windows/native/include/jni_md.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2023, 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 @@ -32,9 +32,8 @@ #define JNIIMPORT __declspec(dllimport) #define JNICALL __stdcall -// 'long' is always 32 bit on windows so this matches what jdk expects -typedef long jint; -typedef __int64 jlong; +typedef int jint; +typedef long long jlong; typedef signed char jbyte; #endif /* !_JAVASOFT_JNI_MD_H_ */ diff --git a/src/java.desktop/windows/native/libawt/java2d/windows/GDIRenderer.cpp b/src/java.desktop/windows/native/libawt/java2d/windows/GDIRenderer.cpp index 5e35ac7af344..08ff3214632b 100644 --- a/src/java.desktop/windows/native/libawt/java2d/windows/GDIRenderer.cpp +++ b/src/java.desktop/windows/native/libawt/java2d/windows/GDIRenderer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2023, 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 @@ -49,7 +49,7 @@ extern "C" { #define POLYTEMPSIZE (512 / sizeof(POINT)) -static void AngleToCoord(jint angle, jint w, jint h, jint *x, jint *y) +static void AngleToCoord(int angle, int w, int h, int *x, int *y) { const double pi = 3.1415926535; const double toRadians = 2 * pi / 360; @@ -322,7 +322,7 @@ Java_sun_java2d_windows_GDIRenderer_doDrawArc return; } - long sx, sy, ex, ey; + int sx, sy, ex, ey; if (angleExtent >= 360 || angleExtent <= -360) { sx = ex = x + w; sy = ey = y + h/2; @@ -602,7 +602,7 @@ Java_sun_java2d_windows_GDIRenderer_doFillArc if (wsdo == NULL) { return; } - long sx, sy, ex, ey; + int sx, sy, ex, ey; int angleEnd; if (angleExtent < 0) { angleEnd = angleStart; diff --git a/src/java.desktop/windows/native/libawt/java2d/windows/GDIWindowSurfaceData.cpp b/src/java.desktop/windows/native/libawt/java2d/windows/GDIWindowSurfaceData.cpp index 804a8efb8e92..77528dc33306 100644 --- a/src/java.desktop/windows/native/libawt/java2d/windows/GDIWindowSurfaceData.cpp +++ b/src/java.desktop/windows/native/libawt/java2d/windows/GDIWindowSurfaceData.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2023, 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 @@ -897,7 +897,7 @@ static void GDIWinSD_GetRasInfo(JNIEnv *env, } if (wsdo->lockFlags & SD_LOCK_LUT) { pRasInfo->lutBase = - (long *) wsdo->device->GetSystemPaletteEntries(); + (jint *) wsdo->device->GetSystemPaletteEntries(); pRasInfo->lutSize = 256; } else { pRasInfo->lutBase = NULL; diff --git a/src/java.desktop/windows/native/libawt/windows/ShellFolder2.cpp b/src/java.desktop/windows/native/libawt/windows/ShellFolder2.cpp index 2d0745f763fb..b3f13a5bf826 100644 --- a/src/java.desktop/windows/native/libawt/windows/ShellFolder2.cpp +++ b/src/java.desktop/windows/native/libawt/windows/ShellFolder2.cpp @@ -1080,12 +1080,12 @@ JNIEXPORT jintArray JNICALL Java_sun_awt_shell_Win32ShellFolder2_getIconBits // Extract the color bitmap int nBits = iconSize * iconSize; - long *colorBits = NULL; - long *maskBits = NULL; + jint *colorBits = NULL; + int *maskBits = NULL; try { entry_point(); - colorBits = (long*)safe_Malloc(MAX_ICON_SIZE * MAX_ICON_SIZE * sizeof(long)); + colorBits = (jint*)safe_Malloc(MAX_ICON_SIZE * MAX_ICON_SIZE * sizeof(jint)); GetDIBits(dc, iconInfo.hbmColor, 0, iconSize, colorBits, &bmi, DIB_RGB_COLORS); // XP supports alpha in some icons, and depending on device. // This should take precedence over the icon mask bits. @@ -1100,7 +1100,7 @@ JNIEXPORT jintArray JNICALL Java_sun_awt_shell_Win32ShellFolder2_getIconBits } if (!hasAlpha) { // Extract the mask bitmap - maskBits = (long*)safe_Malloc(MAX_ICON_SIZE * MAX_ICON_SIZE * sizeof(long)); + maskBits = (int*)safe_Malloc(MAX_ICON_SIZE * MAX_ICON_SIZE * sizeof(int)); GetDIBits(dc, iconInfo.hbmMask, 0, iconSize, maskBits, &bmi, DIB_RGB_COLORS); // Copy the mask alphas into the color bits for (int i = 0; i < nBits; i++) { diff --git a/src/java.desktop/windows/native/libawt/windows/awt_Menu.h b/src/java.desktop/windows/native/libawt/windows/awt_Menu.h index 4392f293678c..9ee61f8b433b 100644 --- a/src/java.desktop/windows/native/libawt/windows/awt_Menu.h +++ b/src/java.desktop/windows/native/libawt/windows/awt_Menu.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2023, 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 @@ -73,7 +73,7 @@ class AwtMenu : public AwtMenuItem { /*for multifont menu */ BOOL IsTopMenu(); - virtual AwtMenuItem* GetItem(jobject target, long index); + virtual AwtMenuItem* GetItem(jobject target, jint index); virtual int CountItem(jobject target); diff --git a/src/java.desktop/windows/native/libawt/windows/awt_MenuBar.cpp b/src/java.desktop/windows/native/libawt/windows/awt_MenuBar.cpp index cf12bf59607a..24a9a24281b3 100644 --- a/src/java.desktop/windows/native/libawt/windows/awt_MenuBar.cpp +++ b/src/java.desktop/windows/native/libawt/windows/awt_MenuBar.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2023, 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 @@ -145,7 +145,7 @@ int AwtMenuBar::CountItem(jobject menuBar) return nCount; } -AwtMenuItem* AwtMenuBar::GetItem(jobject target, long index) +AwtMenuItem* AwtMenuBar::GetItem(jobject target, jint index) { JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); if (env->EnsureLocalCapacity(2) < 0) { diff --git a/src/java.desktop/windows/native/libawt/windows/awt_MenuBar.h b/src/java.desktop/windows/native/libawt/windows/awt_MenuBar.h index 3e60a9b399aa..d55f656b5396 100644 --- a/src/java.desktop/windows/native/libawt/windows/awt_MenuBar.h +++ b/src/java.desktop/windows/native/libawt/windows/awt_MenuBar.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2023, 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 @@ -66,7 +66,7 @@ class AwtMenuBar : public AwtMenu { virtual HWND GetOwnerHWnd(); virtual void RedrawMenuBar(); - AwtMenuItem* GetItem(jobject target, long index); + AwtMenuItem* GetItem(jobject target, jint index); int CountItem(jobject menuBar); void DrawItem(DRAWITEMSTRUCT& drawInfo); diff --git a/src/jdk.accessibility/windows/native/jaccesswalker/jaccesswalker.cpp b/src/jdk.accessibility/windows/native/jaccesswalker/jaccesswalker.cpp index 726ed4010bd0..797e6fc4762f 100644 --- a/src/jdk.accessibility/windows/native/jaccesswalker/jaccesswalker.cpp +++ b/src/jdk.accessibility/windows/native/jaccesswalker/jaccesswalker.cpp @@ -543,7 +543,7 @@ void Jaccesswalker::addComponentNodes(long vmID, AccessibleContext context, } else { char s[LINE_BUFSIZE]; snprintf( s, sizeof(s), - "ERROR calling GetAccessibleContextInfo; vmID = %X, context = %p", + "ERROR calling GetAccessibleContextInfo; vmID = %lX, context = %p", vmID, (void*)context ); TVITEM tvi; diff --git a/src/jdk.accessibility/windows/native/toolscommon/AccessInfo.cpp b/src/jdk.accessibility/windows/native/toolscommon/AccessInfo.cpp index 76d8f71ca3fe..b9cd8434fc7c 100644 --- a/src/jdk.accessibility/windows/native/toolscommon/AccessInfo.cpp +++ b/src/jdk.accessibility/windows/native/toolscommon/AccessInfo.cpp @@ -149,8 +149,8 @@ char *getAccessibleInfo(long vmID, AccessibleContext ac, int x, int y, wchar_t tmpBuf[LINE_BUFSIZE]; wchar_t name[LINE_BUFSIZE]; int i, j; - long start; - long end; + jint start; + jint end; if (buffer == NULL || bufsize <= 0) { return NULL; From 89726ecec7122aabc08851c4ff393f00fba7e7c1 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 20 Oct 2025 05:27:49 +0000 Subject: [PATCH 194/323] 8324065: Daylight saving information for `Africa/Casablanca` are incorrect Backport-of: 0d8543d6773a516dad54038070dce507179d0709 --- .../classes/sun/util/calendar/ZoneInfo.java | 10 +++---- .../sun/util/calendar/ZoneInfoFile.java | 26 ++++++++++--------- .../java/util/TimeZone/NegativeDSTTest.java | 7 +++-- .../sun/util/calendar/zi/TestZoneInfo310.java | 19 +++++--------- .../jdk/sun/util/calendar/zi/ZoneInfoOld.java | 10 +++---- test/jdk/sun/util/calendar/zi/Zoneinfo.java | 4 +-- 6 files changed, 37 insertions(+), 39 deletions(-) diff --git a/src/java.base/share/classes/sun/util/calendar/ZoneInfo.java b/src/java.base/share/classes/sun/util/calendar/ZoneInfo.java index f14c98a77c3f..8cbfd77d5bee 100644 --- a/src/java.base/share/classes/sun/util/calendar/ZoneInfo.java +++ b/src/java.base/share/classes/sun/util/calendar/ZoneInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2024, 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 @@ -45,14 +45,14 @@ * for the {@link #getOffset(int,int,int,int,int,int) getOffset} * method that takes Gregorian calendar date fields. *

          - * This table covers transitions from 1900 until 2037 (as of version - * 1.4), Before 1900, it assumes that there was no daylight saving + * This table covers transitions from 1900 until 2100 (as of version + * 23), Before 1900, it assumes that there was no daylight saving * time and the getOffset methods always return the * {@link #getRawOffset} value. No Local Mean Time is supported. If a * specified date is beyond the transition table and this time zone is - * supposed to observe daylight saving time in 2037, it delegates + * supposed to observe daylight saving time in 2100, it delegates * operations to a {@link java.util.SimpleTimeZone SimpleTimeZone} - * object created using the daylight saving time schedule as of 2037. + * object created using the daylight saving time schedule as of 2100. *

          * The date items, transitions, GMT offset(s), etc. are read from a database * file. See {@link ZoneInfoFile} for details. diff --git a/src/java.base/share/classes/sun/util/calendar/ZoneInfoFile.java b/src/java.base/share/classes/sun/util/calendar/ZoneInfoFile.java index 17c027063368..82353007ddde 100644 --- a/src/java.base/share/classes/sun/util/calendar/ZoneInfoFile.java +++ b/src/java.base/share/classes/sun/util/calendar/ZoneInfoFile.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, 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 @@ -406,16 +406,16 @@ static long readEpochSec(DataInput in) throws IOException { // ZoneInfo starts with UTC1900 private static final long UTC1900 = -2208988800L; - // ZoneInfo ends with UTC2037 - // LocalDateTime.of(2038, 1, 1, 0, 0, 0).toEpochSecond(ZoneOffset.UTC) - 1; - private static final long UTC2037 = 2145916799L; + // ZoneInfo ends with UTC2100 + // LocalDateTime.of(2101, 1, 1, 0, 0, 0).toEpochSecond(ZoneOffset.UTC) - 1; + private static final long UTC2100 = 4133980799L; - // ZoneInfo has an ending entry for 2037, this need to be offset by + // ZoneInfo has an ending entry for 2100, this need to be offset by // a "rawOffset" - // LocalDateTime.of(2037, 1, 1, 0, 0, 0).toEpochSecond(ZoneOffset.UTC)); - private static final long LDT2037 = 2114380800L; + // LocalDateTime.of(2100, 1, 1, 0, 0, 0).toEpochSecond(ZoneOffset.UTC); + private static final long LDT2100 = 4102444800L; - //Current time. Used to determine future GMToffset transitions + //Current time. Used to determine future GMT offset transitions private static final long CURRT = System.currentTimeMillis()/1000; /** @@ -482,7 +482,7 @@ private static ZoneInfo getZoneInfo(String zoneId, for (; i < savingsInstantTransitions.length; i++) { long trans = savingsInstantTransitions[i]; - if (trans > UTC2037) { + if (trans > UTC2100) { // no trans beyond LASTYEAR lastyear = LASTYEAR; break; @@ -629,11 +629,11 @@ private static ZoneInfo getZoneInfo(String zoneId, } } else if (nTrans > 0) { // only do this if there is something in table already if (lastyear < LASTYEAR) { - // ZoneInfo has an ending entry for 2037 + // ZoneInfo has an ending entry for 2100 //long trans = OffsetDateTime.of(LASTYEAR, 1, 1, 0, 0, 0, 0, // ZoneOffset.ofTotalSeconds(rawOffset/1000)) // .toEpochSecond(); - long trans = LDT2037 - rawOffset/1000; + long trans = LDT2100 - rawOffset/1000; int offsetIndex = indexOf(offsets, 0, nOffsets, rawOffset/1000); if (offsetIndex == nOffsets) @@ -814,7 +814,9 @@ private static int getYear(long epochSecond, int offset) { private static final long DST_MASK = 0xf0L; private static final int DST_NSHIFT = 4; private static final int TRANSITION_NSHIFT = 12; - private static final int LASTYEAR = 2037; + // The `last` year that transitions are accounted for. If there are + // rules that go beyond this LASTYEAR, the value needs to be expanded. + private static final int LASTYEAR = 2100; // from: 0 for offset lookup, 1 for dstsvings lookup private static int indexOf(int[] offsets, int from, int nOffsets, int offset) { diff --git a/test/jdk/java/util/TimeZone/NegativeDSTTest.java b/test/jdk/java/util/TimeZone/NegativeDSTTest.java index b237f0fd4eee..eb46b8d4b29f 100644 --- a/test/jdk/java/util/TimeZone/NegativeDSTTest.java +++ b/test/jdk/java/util/TimeZone/NegativeDSTTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, 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 @@ -37,7 +37,7 @@ /** * @test - * @bug 8212970 + * @bug 8212970 8324065 * @summary Test whether the savings are positive in time zones that have * negative savings in the source TZ files. * @run testng NegativeDSTTest @@ -81,7 +81,10 @@ private Object[][] negativeDST () { {CASABLANCA, LocalDate.of(2019, 5, 6), 0, false}, {CASABLANCA, LocalDate.of(2037, 10, 5), 0, false}, {CASABLANCA, LocalDate.of(2037, 11, 16), ONE_HOUR, true}, + {CASABLANCA, LocalDate.of(2038, 9, 27), 0, false}, {CASABLANCA, LocalDate.of(2038, 11, 1), ONE_HOUR, true}, + {CASABLANCA, LocalDate.of(2087, 3, 31), 0, false}, + {CASABLANCA, LocalDate.of(2087, 5, 12), ONE_HOUR, true}, }; } diff --git a/test/jdk/sun/util/calendar/zi/TestZoneInfo310.java b/test/jdk/sun/util/calendar/zi/TestZoneInfo310.java index 4fa589c7b276..b533aab5966f 100644 --- a/test/jdk/sun/util/calendar/zi/TestZoneInfo310.java +++ b/test/jdk/sun/util/calendar/zi/TestZoneInfo310.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 8007572 8008161 8157792 8212970 8224560 + * @bug 8007572 8008161 8157792 8212970 8224560 8324065 * @summary Test whether the TimeZone generated from JSR310 tzdb is the same * as the one from the tz data from javazic * @modules java.base/sun.util.calendar:+open @@ -173,9 +173,9 @@ public static void main(String[] args) throws Throwable { ZoneInfoOld zi = toZoneInfoOld(TimeZone.getTimeZone(zid)); ZoneInfoOld ziOLD = (ZoneInfoOld)ZoneInfoOld.getTimeZone(zid); /* - * Temporary ignoring the failing TimeZones which are having zone - * rules defined till year 2037 and/or above and have negative DST - * save time in IANA tzdata. This bug is tracked via JDK-8223388. + * Ignoring the failing TimeZones which have negative DST + * save time in IANA tzdata, as javazic/ZoneInfoOld cannot + * handle the negative DST. * * These are the zones/rules that employ negative DST in vanguard * format (as of 2019a), Palestine added in 2022d: @@ -185,11 +185,6 @@ public static void main(String[] args) throws Throwable { * - Rule "Namibia" * - Rule "Palestine" * - Zone "Europe/Prague" - * - * Tehran/Iran rule has rules beyond 2037, in which javazic assumes - * to be the last year. Thus javazic's rule is based on year 2037 - * (Mar 20th/Sep 20th are the cutover dates), while the real rule - * has year 2087 where Mar 21st/Sep 21st are the cutover dates. */ if (zid.equals("Africa/Casablanca") || // uses "Morocco" rule zid.equals("Africa/El_Aaiun") || // uses "Morocco" rule @@ -198,10 +193,8 @@ public static void main(String[] args) throws Throwable { zid.equals("Europe/Bratislava") || // link to "Europe/Prague" zid.equals("Europe/Dublin") || // uses "Eire" rule zid.equals("Europe/Prague") || - zid.equals("Asia/Tehran") || // last rule mismatch zid.equals("Asia/Gaza") || // uses "Palestine" rule - zid.equals("Asia/Hebron") || // uses "Palestine" rule - zid.equals("Iran")) { // last rule mismatch + zid.equals("Asia/Hebron")) { // uses "Palestine" rule continue; } if (! zi.equalsTo(ziOLD)) { diff --git a/test/jdk/sun/util/calendar/zi/ZoneInfoOld.java b/test/jdk/sun/util/calendar/zi/ZoneInfoOld.java index 45e8a3469468..40f9cb9056cc 100644 --- a/test/jdk/sun/util/calendar/zi/ZoneInfoOld.java +++ b/test/jdk/sun/util/calendar/zi/ZoneInfoOld.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2024, 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 @@ -51,14 +51,14 @@ * for the {@link #getOffset(int,int,int,int,int,int) getOffset} * method that takes Gregorian calendar date fields. *

          - * This table covers transitions from 1900 until 2037 (as of version - * 1.4), Before 1900, it assumes that there was no daylight saving + * This table covers transitions from 1900 until 2100 (as of version + * 23), Before 1900, it assumes that there was no daylight saving * time and the getOffset methods always return the * {@link #getRawOffset} value. No Local Mean Time is supported. If a * specified date is beyond the transition table and this time zone is - * supposed to observe daylight saving time in 2037, it delegates + * supposed to observe daylight saving time in 2100, it delegates * operations to a {@link java.util.SimpleTimeZone SimpleTimeZone} - * object created using the daylight saving time schedule as of 2037. + * object created using the daylight saving time schedule as of 2100. *

          * The date items, transitions, GMT offset(s), etc. are read from a database * file. See {@link ZoneInfoFile} for details. diff --git a/test/jdk/sun/util/calendar/zi/Zoneinfo.java b/test/jdk/sun/util/calendar/zi/Zoneinfo.java index a68aa7826b0f..e125ad2cb87d 100644 --- a/test/jdk/sun/util/calendar/zi/Zoneinfo.java +++ b/test/jdk/sun/util/calendar/zi/Zoneinfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2024, 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 @@ -37,7 +37,7 @@ class Zoneinfo { private static final int minYear = 1900; - private static final int maxYear = 2037; + private static final int maxYear = 2100; private static final long minTime = Time.getLocalTime(minYear, Month.JANUARY, 1, 0); private static int startYear = minYear; private static int endYear = maxYear; From ae2ced472d3d4bf4e807ab6c928edcc0ac02a267 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 20 Oct 2025 05:29:38 +0000 Subject: [PATCH 195/323] 8367237: Thread-Safety Usage Warning for java.text.Collator Classes Backport-of: 64155dfac068cf01bcab6adb401b360499f33a5f --- src/java.base/share/classes/java/text/Collator.java | 9 +++++++-- .../share/classes/java/text/RuleBasedCollator.java | 11 ++++++----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/java.base/share/classes/java/text/Collator.java b/src/java.base/share/classes/java/text/Collator.java index be158d034c44..3c1d79d4e91c 100644 --- a/src/java.base/share/classes/java/text/Collator.java +++ b/src/java.base/share/classes/java/text/Collator.java @@ -111,8 +111,13 @@ *
          * @apiNote {@code CollationKey}s from different * {@code Collator}s can not be compared. See the class description - * for {@link CollationKey} - * for an example using {@code CollationKey}s. + * for {@link CollationKey} for an example using {@code CollationKey}s. + * + * @implNote Significant thread contention may occur during concurrent usage + * of the JDK Reference Implementation's {@link RuleBasedCollator}, which is the + * subtype returned by the default provider of the {@link #getInstance()} factory + * methods. As such, users should consider retrieving a separate instance for + * each thread when used in multithreaded environments. * * @see RuleBasedCollator * @see CollationKey diff --git a/src/java.base/share/classes/java/text/RuleBasedCollator.java b/src/java.base/share/classes/java/text/RuleBasedCollator.java index 047fd9d4b149..5b1a7650a70f 100644 --- a/src/java.base/share/classes/java/text/RuleBasedCollator.java +++ b/src/java.base/share/classes/java/text/RuleBasedCollator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2025, 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 @@ -38,10 +38,6 @@ package java.text; -import java.text.Normalizer; -import java.util.Vector; -import java.util.Locale; - /** * The {@code RuleBasedCollator} class is a concrete subclass of * {@code Collator} that provides a simple, data-driven, table @@ -239,6 +235,11 @@ * * * + * @implNote For this implementation, concurrent usage of this class may + * lead to significant thread contention since {@code synchronized} is employed + * to ensure thread-safety. As such, users of this class should consider creating + * a separate instance for each thread when used in multithreaded environments. + * * @see Collator * @see CollationElementIterator * @author Helena Shih, Laura Werner, Richard Gillam From fed9f41eb5ba8b8fff6d9ed15d67bfc06eac48e5 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 20 Oct 2025 05:33:10 +0000 Subject: [PATCH 196/323] 8367133: DTLS: fragmentation of Finished message results in handshake failure Backport-of: 80cb0ead502ae439660f2a3bbab42df4da39d9d6 --- .../sun/security/ssl/DTLSInputRecord.java | 9 ++- .../net/ssl/DTLS/FragmentedFinished.java | 72 +++++++++++++++++++ 2 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 test/jdk/javax/net/ssl/DTLS/FragmentedFinished.java diff --git a/src/java.base/share/classes/sun/security/ssl/DTLSInputRecord.java b/src/java.base/share/classes/sun/security/ssl/DTLSInputRecord.java index e0196f3009cb..101a42a54070 100644 --- a/src/java.base/share/classes/sun/security/ssl/DTLSInputRecord.java +++ b/src/java.base/share/classes/sun/security/ssl/DTLSInputRecord.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2025, 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 @@ -801,8 +801,11 @@ void queueUpHandshake(HandshakeFragment hsf) throws SSLProtocolException { // buffer this fragment if (hsf.handshakeType == SSLHandshake.FINISHED.id) { - // Need no status update. - bufferedFragments.add(hsf); + // Make sure it's not a retransmitted message + if (hsf.recordEpoch > handshakeEpoch) { + bufferedFragments.add(hsf); + flightIsReady = holes.isEmpty(); + } } else { bufferFragment(hsf); } diff --git a/test/jdk/javax/net/ssl/DTLS/FragmentedFinished.java b/test/jdk/javax/net/ssl/DTLS/FragmentedFinished.java new file mode 100644 index 000000000000..2b6fd16005c0 --- /dev/null +++ b/test/jdk/javax/net/ssl/DTLS/FragmentedFinished.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2025, 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. + */ + +// SunJSSE does not support dynamic system properties, no way to re-use +// system properties in samevm/agentvm mode. + +/* + * @test + * @bug 8367133 + * @summary Verify that handshake succeeds when Finished message is fragmented + * @modules java.base/sun.security.util + * @library /test/lib + * @build DTLSOverDatagram + * @run main/othervm FragmentedFinished + */ + +import javax.net.ssl.SSLEngine; +import javax.net.ssl.SSLParameters; +import java.net.DatagramPacket; +import java.net.SocketAddress; +import java.util.ArrayList; +import java.util.List; + +public class FragmentedFinished extends DTLSOverDatagram { + private SSLEngine serverSSLEngine; + public static void main(String[] args) throws Exception { + FragmentedFinished testCase = new FragmentedFinished(); + testCase.runTest(testCase); + } + + @Override + SSLEngine createSSLEngine(boolean isClient) throws Exception { + SSLEngine sslEngine = super.createSSLEngine(isClient); + if (!isClient) { + serverSSLEngine = sslEngine; + } + return sslEngine; + } + + @Override + DatagramPacket createHandshakePacket(byte[] ba, SocketAddress socketAddr) { + if (ba.length < 30) { // detect ChangeCipherSpec + // Reduce the maximumPacketSize to force fragmentation + // of the Finished message + SSLParameters params = serverSSLEngine.getSSLParameters(); + params.setMaximumPacketSize(53); + serverSSLEngine.setSSLParameters(params); + } + + return super.createHandshakePacket(ba, socketAddr); + } +} From 9400a0a5b81194f9648984f60bfff67f0ee9597d Mon Sep 17 00:00:00 2001 From: Matthias Baesken Date: Mon, 20 Oct 2025 10:49:26 +0000 Subject: [PATCH 197/323] 8362516: Support of GCC static analyzer (-fanalyzer) Reviewed-by: lucy Backport-of: ba90ccc6a8ca7b0b728568ea614470c85a5f7f8a --- make/autoconf/configure.ac | 3 +++ make/autoconf/jdk-options.m4 | 25 +++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/make/autoconf/configure.ac b/make/autoconf/configure.ac index f7e9844a6430..44f0c15f15d3 100644 --- a/make/autoconf/configure.ac +++ b/make/autoconf/configure.ac @@ -223,6 +223,9 @@ JDKOPT_SETUP_UNDEFINED_BEHAVIOR_SANITIZER # LeakSanitizer JDKOPT_SETUP_LEAK_SANITIZER +# Setup static analyzer +JDKOPT_SETUP_STATIC_ANALYZER + # Fallback linker # This needs to go before 'LIB_DETERMINE_DEPENDENCIES' JDKOPT_SETUP_FALLBACK_LINKER diff --git a/make/autoconf/jdk-options.m4 b/make/autoconf/jdk-options.m4 index 8f3458ee9d68..2b3b0dc50eac 100644 --- a/make/autoconf/jdk-options.m4 +++ b/make/autoconf/jdk-options.m4 @@ -487,6 +487,31 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_ADDRESS_SANITIZER], ############################################################################### # +# Static analyzer +# +AC_DEFUN_ONCE([JDKOPT_SETUP_STATIC_ANALYZER], +[ + UTIL_ARG_ENABLE(NAME: static-analyzer, DEFAULT: false, RESULT: STATIC_ANALYZER_ENABLED, + DESC: [enable the GCC static analyzer], + CHECK_AVAILABLE: [ + AC_MSG_CHECKING([if static analyzer is available]) + if test "x$TOOLCHAIN_TYPE" = "xgcc"; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + AVAILABLE=false + fi + ], + IF_ENABLED: [ + STATIC_ANALYZER_CFLAGS="-fanalyzer -Wno-analyzer-fd-leak" + CFLAGS_JDKLIB="$CFLAGS_JDKLIB $STATIC_ANALYZER_CFLAGS" + CFLAGS_JDKEXE="$CFLAGS_JDKEXE $STATIC_ANALYZER_CFLAGS" + ]) + AC_SUBST(STATIC_ANALYZER_ENABLED) +]) + +################################################################################ +# # LeakSanitizer # AC_DEFUN_ONCE([JDKOPT_SETUP_LEAK_SANITIZER], From 57b9c03325d65388c27fdfa981407347a3276324 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 20 Oct 2025 12:20:00 +0000 Subject: [PATCH 198/323] 8347841: Test fixes that use deprecated time zone IDs Reviewed-by: rrich Backport-of: 81912e958ba77c1c9371305ecfedad13aaa3fa6a --- .../java/io/File/TimeZoneLastModified.java | 10 +++-- .../DateFormat/DateFormatRegression.java | 14 +++---- .../Format/DateFormat/DateFormatTest.java | 16 ++++--- .../DateFormat/SDFTCKZoneNamesTest.java | 8 +++- .../text/Format/DateFormat/bug4358730.java | 6 +-- .../util/Calendar/CalendarRegression.java | 27 +++++++----- test/jdk/java/util/Calendar/JavatimeTest.java | 17 ++++---- test/jdk/java/util/Calendar/bug4316678.java | 6 +-- test/jdk/java/util/Calendar/bug4372743.java | 6 +-- test/jdk/java/util/Date/Bug4955000.java | 6 +-- test/jdk/java/util/Date/DateRegression.java | 7 ++-- test/jdk/java/util/Date/DateTest.java | 10 ++--- .../TimeZoneNameProviderTest.java | 42 +++++-------------- .../java/util/Properties/StoreDeadlock.java | 6 +-- test/jdk/java/util/TimeZone/Bug5097350.java | 11 +++-- test/jdk/java/util/TimeZone/Bug6329116.java | 13 ++++-- test/jdk/java/util/TimeZone/Bug6772689.java | 11 +++-- .../java/util/TimeZone/DaylightTimeTest.java | 10 +++-- test/jdk/java/util/TimeZone/IDTest.java | 22 +++++++--- .../jdk/java/util/TimeZone/ListTimeZones.java | 10 +++-- .../util/TimeZone/TimeZoneBoundaryTest.java | 12 +++--- .../util/TimeZone/TimeZoneRegression.java | 20 ++++----- test/jdk/java/util/TimeZone/bug4096952.java | 6 +-- .../x509/X509CertImpl/V3Certificate.java | 6 +-- .../util/resources/TimeZone/Bug4640234.java | 11 +++-- .../sun/util/resources/cldr/Bug8134384.java | 7 +++- .../sun/util/resources/cldr/Bug8202764.java | 5 ++- 27 files changed, 179 insertions(+), 146 deletions(-) diff --git a/test/jdk/java/io/File/TimeZoneLastModified.java b/test/jdk/java/io/File/TimeZoneLastModified.java index 11c61a24408b..bd423de619b8 100644 --- a/test/jdk/java/io/File/TimeZoneLastModified.java +++ b/test/jdk/java/io/File/TimeZoneLastModified.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, 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 @@ -23,15 +23,14 @@ /* * @test - * @bug 6212869 + * @bug 6212869 8347841 * @summary Determine if lastModified() works after TimeZone.setDefault() * @run main/othervm TimeZoneLastModified */ import java.io.File; -import java.util.Date; +import java.time.ZoneId; import java.util.TimeZone; -import java.text.SimpleDateFormat; public class TimeZoneLastModified { // Tue, 04 Jun 2002 13:56:50.002 GMT @@ -40,6 +39,9 @@ public class TimeZoneLastModified { public static void main(String[] args) throws Throwable { int failures = test(null); for (String timeZoneID : TimeZone.getAvailableIDs()) { + if (ZoneId.SHORT_IDS.containsKey(timeZoneID)) { + continue; + } failures += test(timeZoneID); } if (failures != 0) { diff --git a/test/jdk/java/text/Format/DateFormat/DateFormatRegression.java b/test/jdk/java/text/Format/DateFormat/DateFormatRegression.java index a1851908ca95..7d8b2551c358 100644 --- a/test/jdk/java/text/Format/DateFormat/DateFormatRegression.java +++ b/test/jdk/java/text/Format/DateFormat/DateFormatRegression.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2025, 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 @@ -34,7 +34,7 @@ * @bug 4029195 4052408 4056591 4059917 4060212 4061287 4065240 4071441 4073003 * 4089106 4100302 4101483 4103340 4103341 4104136 4104522 4106807 4108407 * 4134203 4138203 4148168 4151631 4151706 4153860 4162071 4182066 4209272 4210209 - * 4213086 4250359 4253490 4266432 4406615 4413980 8008577 8305853 + * 4213086 4250359 4253490 4266432 4406615 4413980 8008577 8305853 8347841 * @library /java/text/testlib * @run junit/othervm -Djava.locale.providers=COMPAT,SPI DateFormatRegression */ @@ -274,7 +274,7 @@ public void Test4065240() { try { Locale curLocale = Locale.GERMANY; Locale.setDefault(curLocale); - TimeZone.setDefault(TimeZone.getTimeZone("EST")); + TimeZone.setDefault(TimeZone.getTimeZone("America/Panama")); curDate = new Date(98, 0, 1); shortdate = DateFormat.getDateInstance(DateFormat.SHORT); fulldate = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG @@ -453,7 +453,7 @@ public void Test4413980() { TimeZone savedTimeZone = TimeZone.getDefault(); try { boolean pass = true; - String[] IDs = new String[] {"Undefined", "PST", "US/Pacific", + String[] IDs = new String[] {"Undefined", "America/Los_Angeles", "US/Pacific", "GMT+3:00", "GMT-01:30"}; for (int i = 0; i < IDs.length; i++) { TimeZone tz = TimeZone.getTimeZone(IDs[i]); @@ -543,7 +543,7 @@ public void Test4103340() { public void Test4103341() { TimeZone saveZone =TimeZone.getDefault(); try { - TimeZone.setDefault(TimeZone.getTimeZone("CST")); + TimeZone.setDefault(TimeZone.getTimeZone("America/Chicago")); SimpleDateFormat simple = new SimpleDateFormat("MM/dd/yyyy HH:mm"); if (!simple.getTimeZone().equals(TimeZone.getDefault())) fail("Fail: SimpleDateFormat not using default zone"); @@ -794,7 +794,7 @@ public void Test4406615() { Locale savedLocale = Locale.getDefault(); TimeZone savedTimeZone = TimeZone.getDefault(); Locale.setDefault(Locale.US); - TimeZone.setDefault(TimeZone.getTimeZone("PST")); + TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles")); Date d1, d2; String dt = "Mon, 1 Jan 2001 00:00:00"; @@ -1096,7 +1096,7 @@ public void Test4261506() { // XXX: Test assumes "PST" is not TimeZoneNames_ja. Need to // pick up another time zone when L10N is done to that file. - TimeZone.setDefault(TimeZone.getTimeZone("PST")); + TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles")); SimpleDateFormat fmt = new SimpleDateFormat("yy/MM/dd hh:ss zzz", Locale.JAPAN); @SuppressWarnings("deprecation") String result = fmt.format(new Date(1999 - 1900, 0, 1)); diff --git a/test/jdk/java/text/Format/DateFormat/DateFormatTest.java b/test/jdk/java/text/Format/DateFormat/DateFormatTest.java index 5f02c12e80d3..4dd98323f682 100644 --- a/test/jdk/java/text/Format/DateFormat/DateFormatTest.java +++ b/test/jdk/java/text/Format/DateFormat/DateFormatTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,14 +24,16 @@ /** * @test * @bug 4052223 4089987 4469904 4326988 4486735 8008577 8045998 8140571 - * 8190748 8216969 + * 8190748 8216969 8347841 * @summary test DateFormat and SimpleDateFormat. * @modules jdk.localedata * @run junit/othervm -Djava.locale.providers=COMPAT,SPI DateFormatTest */ -import java.util.*; +import java.time.ZoneId; import java.text.*; +import java.util.*; +import java.util.function.Predicate; import static java.util.GregorianCalendar.*; import org.junit.jupiter.api.Test; @@ -89,7 +91,9 @@ public void TestWallyWedel() /* * A String array for the time zone ids. */ - String[] ids = TimeZone.getAvailableIDs(); + String[] ids = Arrays.stream(TimeZone.getAvailableIDs()) + .filter(Predicate.not(ZoneId.SHORT_IDS::containsKey)) + .toArray(String[]::new); /* * How many ids do we have? */ @@ -179,7 +183,7 @@ public void TestTwoDigitYearDSTParse() //logln(fmt.format(date)); // This shows what the current locale format is //logln(((SimpleDateFormat)fmt).toPattern()); TimeZone save = TimeZone.getDefault(); - TimeZone PST = TimeZone.getTimeZone("PST"); + TimeZone PST = TimeZone.getTimeZone("America/Los_Angeles"); String s = "03-Apr-04 2:20:47 o'clock AM PST"; int hour = 2; try { @@ -271,7 +275,7 @@ public void TestFieldPosition() "0034", "0012", "0513", "Pacific Daylight Time", }; Date someDate = new Date(871508052513L); - TimeZone PST = TimeZone.getTimeZone("PST"); + TimeZone PST = TimeZone.getTimeZone("America/Los_Angeles"); for (int j = 0, exp = 0; j < dateFormats.length; ++j) { DateFormat df = dateFormats[j]; if (!(df instanceof SimpleDateFormat)) { diff --git a/test/jdk/java/text/Format/DateFormat/SDFTCKZoneNamesTest.java b/test/jdk/java/text/Format/DateFormat/SDFTCKZoneNamesTest.java index a9f2e30a4d05..aea3706f70ef 100644 --- a/test/jdk/java/text/Format/DateFormat/SDFTCKZoneNamesTest.java +++ b/test/jdk/java/text/Format/DateFormat/SDFTCKZoneNamesTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, 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 @@ -23,12 +23,13 @@ /** * @test - * @bug 8218948 + * @bug 8218948 8347841 * @summary TCK tests that check the time zone names between DFS.getZoneStrings() * and SDF.format("z*") * @run main SDFTCKZoneNamesTest */ import java.text.*; +import java.time.ZoneId; import java.util.Calendar; import java.util.Date; import java.util.List; @@ -325,6 +326,9 @@ public void SimpleDateFormat0062() { SimpleDateFormat sdf = new SimpleDateFormat(); Date date = new Date(1234567890); for (String[] tz : sdf.getDateFormatSymbols().getZoneStrings()) { + if (ZoneId.SHORT_IDS.containsKey(tz[0])) { + continue; + } sdf.setTimeZone(TimeZone.getTimeZone(tz[0])); for (int i = 0; i < patterns.length && passed; i++) { StringBuffer result = new StringBuffer("qwerty"); diff --git a/test/jdk/java/text/Format/DateFormat/bug4358730.java b/test/jdk/java/text/Format/DateFormat/bug4358730.java index 445a6c23fcfc..9b37f9f56be0 100644 --- a/test/jdk/java/text/Format/DateFormat/bug4358730.java +++ b/test/jdk/java/text/Format/DateFormat/bug4358730.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2025, 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 @@ -31,7 +31,7 @@ /** * @test - * @bug 4358730 + * @bug 4358730 8347841 * @summary test that confirms Zero-Padding on year. * @run junit bug4358730 */ @@ -56,7 +56,7 @@ public void Test4358730() { Locale saveLocale = Locale.getDefault(); try { - TimeZone.setDefault(TimeZone.getTimeZone("PST")); + TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles")); Locale.setDefault(Locale.US); SimpleDateFormat sdf = new SimpleDateFormat(); diff --git a/test/jdk/java/util/Calendar/CalendarRegression.java b/test/jdk/java/util/Calendar/CalendarRegression.java index 24d34533bde5..93869e0af3bc 100644 --- a/test/jdk/java/util/Calendar/CalendarRegression.java +++ b/test/jdk/java/util/Calendar/CalendarRegression.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2025, 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 @@ -30,7 +30,7 @@ * 4174361 4177484 4197699 4209071 4288792 4328747 4413980 4546637 4623997 * 4685354 4655637 4683492 4080631 4080631 4167995 4340146 4639407 * 4652815 4652830 4740554 4936355 4738710 4633646 4846659 4822110 4960642 - * 4973919 4980088 4965624 5013094 5006864 8152077 + * 4973919 4980088 4965624 5013094 5006864 8152077 8347841 * @library /java/text/testlib * @run junit CalendarRegression */ @@ -42,6 +42,8 @@ import java.text.DateFormat; import java.text.NumberFormat; import java.text.SimpleDateFormat; +import java.time.ZoneId; +import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; @@ -50,6 +52,7 @@ import java.util.Map; import java.util.SimpleTimeZone; import java.util.TimeZone; +import java.util.function.Predicate; import static java.util.Calendar.*; @@ -75,7 +78,9 @@ public class CalendarRegression { public void Test4031502() { // This bug actually occurs on Windows NT as well, and doesn't // require the host zone to be set; it can be set in Java. - String[] ids = TimeZone.getAvailableIDs(); + String[] ids = Arrays.stream(TimeZone.getAvailableIDs()) + .filter(Predicate.not(ZoneId.SHORT_IDS::containsKey)) + .toArray(String[]::new); boolean bad = false; for (int i = 0; i < ids.length; ++i) { TimeZone zone = TimeZone.getTimeZone(ids[i]); @@ -489,7 +494,7 @@ public void Test4095407() { @Test public void Test4096231() { TimeZone GMT = TimeZone.getTimeZone("GMT"); - TimeZone PST = TimeZone.getTimeZone("PST"); + TimeZone PST = TimeZone.getTimeZone("America/Los_Angeles"); int sec = 0, min = 0, hr = 0, day = 1, month = 10, year = 1997; Calendar cal1 = new GregorianCalendar(PST); @@ -838,7 +843,7 @@ public void Test4114578() { TimeZone saveZone = TimeZone.getDefault(); boolean fail = false; try { - TimeZone.setDefault(TimeZone.getTimeZone("PST")); + TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles")); Calendar cal = Calendar.getInstance(); long onset = new Date(98, APRIL, 5, 1, 0).getTime() + ONE_HOUR; long cease = new Date(98, OCTOBER, 25, 0, 0).getTime() + 2 * ONE_HOUR; @@ -1163,8 +1168,8 @@ public void Test4147269() { @Test public void Test4149677() { TimeZone[] zones = {TimeZone.getTimeZone("GMT"), - TimeZone.getTimeZone("PST"), - TimeZone.getTimeZone("EAT")}; + TimeZone.getTimeZone("America/Los_Angeles"), + TimeZone.getTimeZone("Africa/Addis_Ababa")}; for (int i = 0; i < zones.length; ++i) { GregorianCalendar calendar = new GregorianCalendar(zones[i]); @@ -1197,7 +1202,7 @@ public void Test4149677() { @Test public void Test4162587() { TimeZone savedTz = TimeZone.getDefault(); - TimeZone tz = TimeZone.getTimeZone("PST"); + TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles"); TimeZone.setDefault(tz); GregorianCalendar cal = new GregorianCalendar(tz); Date d; @@ -1511,8 +1516,8 @@ public void Test4174361() { */ @Test public void Test4177484() { - TimeZone PST = TimeZone.getTimeZone("PST"); - TimeZone EST = TimeZone.getTimeZone("EST"); + TimeZone PST = TimeZone.getTimeZone("America/Los_Angeles"); + TimeZone EST = TimeZone.getTimeZone("America/Panama"); Calendar cal = Calendar.getInstance(PST, Locale.US); cal.clear(); @@ -1770,7 +1775,7 @@ public void Test4413980() { TimeZone savedTimeZone = TimeZone.getDefault(); try { boolean pass = true; - String[] IDs = new String[]{"Undefined", "PST", "US/Pacific", + String[] IDs = new String[]{"Undefined", "America/Los_Angeles", "US/Pacific", "GMT+3:00", "GMT-01:30"}; for (int i = 0; i < IDs.length; i++) { TimeZone tz = TimeZone.getTimeZone(IDs[i]); diff --git a/test/jdk/java/util/Calendar/JavatimeTest.java b/test/jdk/java/util/Calendar/JavatimeTest.java index 8f32801a307d..115b1e4e8b87 100644 --- a/test/jdk/java/util/Calendar/JavatimeTest.java +++ b/test/jdk/java/util/Calendar/JavatimeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2025, 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 @@ -23,7 +23,7 @@ /* *@test - *@bug 8007520 8008254 + *@bug 8007520 8008254 8347841 *@summary Test those bridge methods to/from java.time date/time classes * @key randomness */ @@ -107,23 +107,22 @@ public static void main(String[] args) throws Throwable { ///////////// java.util.TimeZone ///////////////////////// for (String zidStr : TimeZone.getAvailableIDs()) { - // TBD: tzdt intergration + if (ZoneId.SHORT_IDS.containsKey(zidStr)) { + continue; + } + // TBD: tzdt integration if (zidStr.startsWith("SystemV") || zidStr.contains("Riyadh8") - || zidStr.equals("US/Pacific-New") - || zidStr.equals("EST") - || zidStr.equals("HST") - || zidStr.equals("MST")) { + || zidStr.equals("US/Pacific-New")) { continue; } - ZoneId zid = ZoneId.of(zidStr, ZoneId.SHORT_IDS); + ZoneId zid = ZoneId.of(zidStr); if (!zid.equals(TimeZone.getTimeZone(zid).toZoneId())) { throw new RuntimeException("FAILED: zid -> tz -> zid :" + zidStr); } TimeZone tz = TimeZone.getTimeZone(zidStr); // no round-trip for alias and "GMT" if (!tz.equals(TimeZone.getTimeZone(tz.toZoneId())) - && !ZoneId.SHORT_IDS.containsKey(zidStr) && !zidStr.startsWith("GMT")) { throw new RuntimeException("FAILED: tz -> zid -> tz :" + zidStr); } diff --git a/test/jdk/java/util/Calendar/bug4316678.java b/test/jdk/java/util/Calendar/bug4316678.java index f6bd4b87cae4..b1c24a6a0c4a 100644 --- a/test/jdk/java/util/Calendar/bug4316678.java +++ b/test/jdk/java/util/Calendar/bug4316678.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2025, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 4316678 + * @bug 4316678 8347841 * @summary test that Calendar's Serialization works correctly. * @run junit bug4316678 */ @@ -53,7 +53,7 @@ public class bug4316678 { // Set custom JVM default TimeZone @BeforeAll static void initAll() { - TimeZone.setDefault(TimeZone.getTimeZone("PST")); + TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles")); } // Restore JVM default Locale and TimeZone diff --git a/test/jdk/java/util/Calendar/bug4372743.java b/test/jdk/java/util/Calendar/bug4372743.java index 193ad53d813b..d3d2b39b5fc6 100644 --- a/test/jdk/java/util/Calendar/bug4372743.java +++ b/test/jdk/java/util/Calendar/bug4372743.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2025, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 4372743 + * @bug 4372743 8347841 * @summary test that checks transitions of ERA and YEAR which are caused by add(MONTH). * @run junit bug4372743 */ @@ -67,7 +67,7 @@ public class bug4372743 { // Set custom JVM default timezone @BeforeAll static void initAll() { - TimeZone.setDefault(TimeZone.getTimeZone("PST")); + TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles")); } // Restore JVM default timezone diff --git a/test/jdk/java/util/Date/Bug4955000.java b/test/jdk/java/util/Date/Bug4955000.java index 4339f848f580..f05e6ccd3f80 100644 --- a/test/jdk/java/util/Date/Bug4955000.java +++ b/test/jdk/java/util/Date/Bug4955000.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2025, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 4955000 + * @bug 4955000 8347841 * @summary Make sure that a Date and a GregorianCalendar produce the * same date/time. Both are new implementations in 1.5. */ @@ -42,7 +42,7 @@ public class Bug4955000 { public static void main(String[] args) { TimeZone defaultTZ = TimeZone.getDefault(); try { - TimeZone.setDefault(TimeZone.getTimeZone("NST")); + TimeZone.setDefault(TimeZone.getTimeZone("Pacific/Auckland")); GregorianCalendar gc = new GregorianCalendar(TimeZone.getTimeZone("UTC")); // Date1025 int[] years1 = { diff --git a/test/jdk/java/util/Date/DateRegression.java b/test/jdk/java/util/Date/DateRegression.java index 8fe89d9d59bd..eda575743e32 100644 --- a/test/jdk/java/util/Date/DateRegression.java +++ b/test/jdk/java/util/Date/DateRegression.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2025, 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 @@ -23,7 +23,8 @@ /* * @test - * @bug 4023247 4027685 4032037 4072029 4073003 4118010 4120606 4133833 4136916 6274757 6314387 + * @bug 4023247 4027685 4032037 4072029 4073003 4118010 4120606 4133833 + * 4136916 6274757 6314387 8347841 * @run junit DateRegression */ @@ -106,7 +107,7 @@ public void Test4072029() { TimeZone saveZone = TimeZone.getDefault(); try { - TimeZone.setDefault(TimeZone.getTimeZone("PST")); + TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles")); Date now = new Date(); String s = now.toString(); Date now2 = new Date(now.toString()); diff --git a/test/jdk/java/util/Date/DateTest.java b/test/jdk/java/util/Date/DateTest.java index 6740cb16faa3..7dbb19409d37 100644 --- a/test/jdk/java/util/Date/DateTest.java +++ b/test/jdk/java/util/Date/DateTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2025, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 4143459 + * @bug 4143459 8347841 * @summary test Date * @run junit DateTest */ @@ -56,7 +56,7 @@ public void TestDefaultZoneLite() { d.setMonth(Calendar.JANUARY); d.setDate(1); d.setHours(6); - TimeZone.setDefault(TimeZone.getTimeZone("PST")); + TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles")); if (d.getHours() != 22) { fail("Fail: Date.setHours()/getHours() ignoring default zone"); } @@ -79,7 +79,7 @@ public void TestDefaultZone() { Date ref = new Date(883634400000L); // This is Thu Jan 1 1998 6:00 am GMT String refstr = "Jan 1 1998 6:00"; TimeZone GMT = TimeZone.getTimeZone("GMT"); - TimeZone PST = TimeZone.getTimeZone("PST"); + TimeZone PST = TimeZone.getTimeZone("America/Los_Angeles"); String[] names = { "year", "month", "date", "day of week", "hour", "offset" }; int[] GMT_EXP = { 98, Calendar.JANUARY, 1, Calendar.THURSDAY - Calendar.SUNDAY, 6, 0 }; @@ -207,7 +207,7 @@ public void TestDate480() { TimeZone save = TimeZone.getDefault(); try { - TimeZone.setDefault(TimeZone.getTimeZone("PST")); + TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles")); Date d1=new java.util.Date(97,8,13,10,8,13); System.out.println("d = "+d1); Date d2=new java.util.Date(97,8,13,30,8,13); // 20 hours later diff --git a/test/jdk/java/util/PluggableLocale/TimeZoneNameProviderTest.java b/test/jdk/java/util/PluggableLocale/TimeZoneNameProviderTest.java index dffddda193d7..4871dc27e270 100644 --- a/test/jdk/java/util/PluggableLocale/TimeZoneNameProviderTest.java +++ b/test/jdk/java/util/PluggableLocale/TimeZoneNameProviderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2025, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 4052440 8003267 8062588 8210406 8327434 + * @bug 4052440 8003267 8062588 8210406 8327434 8347841 * @summary TimeZoneNameProvider tests * @library providersrc/foobarutils * providersrc/barprovider @@ -37,6 +37,7 @@ import java.text.DateFormatSymbols; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.time.ZoneId; import java.time.format.TextStyle; import java.util.Arrays; import java.util.Calendar; @@ -45,6 +46,7 @@ import java.util.Locale; import java.util.MissingResourceException; import java.util.TimeZone; +import java.util.function.Predicate; import java.util.stream.Stream; import com.bar.TimeZoneNameProviderImpl; @@ -72,7 +74,9 @@ public static void main(String[] s) { void test1() { List jreimplloc = Arrays.asList(LocaleProviderAdapter.forJRE().getTimeZoneNameProvider().getAvailableLocales()); List providerLocales = Arrays.asList(tznp.getAvailableLocales()); - String[] ids = TimeZone.getAvailableIDs(); + String[] ids = Arrays.stream(TimeZone.getAvailableIDs()) + .filter(Predicate.not(ZoneId.SHORT_IDS::containsKey)) + .toArray(String[]::new); // Sampling relevant locales Stream.concat(Stream.of(Locale.ROOT, Locale.US, Locale.JAPAN), providerLocales.stream()).forEach(target -> { @@ -176,7 +180,7 @@ void test2() { df.parse(DISPLAY_NAMES_KYOTO[i]); } } catch (ParseException pe) { - throw new RuntimeException("parse error occured" + pe); + throw new RuntimeException("parse error occurred" + pe); } finally { // restore the reserved locale and time zone Locale.setDefault(defaultLocale); @@ -186,8 +190,8 @@ void test2() { void test3() { final String[] TZNAMES = { - LATIME, PST, PST8PDT, US_PACIFIC, - TOKYOTIME, JST, JAPAN, + LATIME, PST8PDT, US_PACIFIC, + TOKYOTIME, JAPAN, }; for (String tzname : TZNAMES) { TimeZone tz = TimeZone.getTimeZone(tzname); @@ -208,17 +212,13 @@ void test3() { } final String LATIME = "America/Los_Angeles"; - final String PST = "PST"; final String PST8PDT = "PST8PDT"; final String US_PACIFIC = "US/Pacific"; final String LATIME_IN_OSAKA = tznp.getDisplayName(LATIME, false, TimeZone.LONG, OSAKA); final String TOKYOTIME = "Asia/Tokyo"; - final String JST = "JST"; final String JAPAN = "Japan"; - final String JST_IN_OSAKA = - tznp.getDisplayName(JST, false, TimeZone.LONG, OSAKA); void aliasTest() { // Check that provider's name for a standard id (America/Los_Angeles) is @@ -228,32 +228,10 @@ void aliasTest() { throw new RuntimeException("Could not get provider's localized name. result: "+latime+" expected: "+LATIME_IN_OSAKA); } - String pst = TimeZone.getTimeZone(PST).getDisplayName(OSAKA); - if (!LATIME_IN_OSAKA.equals(pst)) { - throw new RuntimeException("Provider's localized name is not available for an alias ID: "+PST+". result: "+pst+" expected: "+LATIME_IN_OSAKA); - } - String us_pacific = TimeZone.getTimeZone(US_PACIFIC).getDisplayName(OSAKA); if (!LATIME_IN_OSAKA.equals(us_pacific)) { throw new RuntimeException("Provider's localized name is not available for an alias ID: "+US_PACIFIC+". result: "+us_pacific+" expected: "+LATIME_IN_OSAKA); } - - // Check that provider's name for an alias id (JST) is - // propagated to its standard id and alias ids. - String jstime = TimeZone.getTimeZone(JST).getDisplayName(OSAKA); - if (!JST_IN_OSAKA.equals(jstime)) { - throw new RuntimeException("Could not get provider's localized name. result: "+jstime+" expected: "+JST_IN_OSAKA); - } - - String tokyotime = TimeZone.getTimeZone(TOKYOTIME).getDisplayName(OSAKA); - if (!JST_IN_OSAKA.equals(tokyotime)) { - throw new RuntimeException("Provider's localized name is not available for a standard ID: "+TOKYOTIME+". result: "+tokyotime+" expected: "+JST_IN_OSAKA); - } - - String japan = TimeZone.getTimeZone(JAPAN).getDisplayName(OSAKA); - if (!JST_IN_OSAKA.equals(japan)) { - throw new RuntimeException("Provider's localized name is not available for an alias ID: "+JAPAN+". result: "+japan+" expected: "+JST_IN_OSAKA); - } } /* diff --git a/test/jdk/java/util/Properties/StoreDeadlock.java b/test/jdk/java/util/Properties/StoreDeadlock.java index d59a44452518..0eb3e930a81c 100644 --- a/test/jdk/java/util/Properties/StoreDeadlock.java +++ b/test/jdk/java/util/Properties/StoreDeadlock.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 6199320 + * @bug 6199320 8347841 * @summary Properties.store() causes deadlock when concurrently calling TimeZone apis * @run main/timeout=20 StoreDeadlock * @author Xueming Shen @@ -59,7 +59,7 @@ public void run() { } class Thread2 extends Thread { public void run() { - System.out.println("tz=" + TimeZone.getTimeZone("PST")); + System.out.println("tz=" + TimeZone.getTimeZone("America/Los_Angeles")); } } } diff --git a/test/jdk/java/util/TimeZone/Bug5097350.java b/test/jdk/java/util/TimeZone/Bug5097350.java index ff0894bf3d74..862d7f90a155 100644 --- a/test/jdk/java/util/TimeZone/Bug5097350.java +++ b/test/jdk/java/util/TimeZone/Bug5097350.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2025, 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 @@ -23,16 +23,19 @@ /* * @test - * @bug 5097350 + * @bug 5097350 8347841 * @summary Make sure that TimeZone.getTimeZone returns a clone of a cached TimeZone instance. */ +import java.time.ZoneId; import java.util.*; -import java.text.*; +import java.util.function.Predicate; public class Bug5097350 { public static void main(String[] args) { - String[] tzids = TimeZone.getAvailableIDs(); + String[] tzids = Arrays.stream(TimeZone.getAvailableIDs()) + .filter(Predicate.not(ZoneId.SHORT_IDS::containsKey)) + .toArray(String[]::new); List ids = new ArrayList<>(tzids.length + 10); ids.addAll(Arrays.asList(tzids)); // add some custom ids diff --git a/test/jdk/java/util/TimeZone/Bug6329116.java b/test/jdk/java/util/TimeZone/Bug6329116.java index 6e85fe8cb5b6..f005b6344642 100644 --- a/test/jdk/java/util/TimeZone/Bug6329116.java +++ b/test/jdk/java/util/TimeZone/Bug6329116.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2025, 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 @@ -25,14 +25,16 @@ * @test * @bug 6329116 6756569 6757131 6758988 6764308 6796489 6834474 6609737 6507067 * 7039469 7090843 7103108 7103405 7158483 8008577 8059206 8064560 8072042 - * 8077685 8151876 8166875 8169191 8170316 8176044 + * 8077685 8151876 8166875 8169191 8170316 8176044 8347841 * @summary Make sure that timezone short display names are idenical to Olson's data. * @run junit/othervm -Djava.locale.providers=COMPAT,SPI Bug6329116 */ import java.io.*; import java.text.*; +import java.time.ZoneId; import java.util.*; +import java.util.function.Predicate; import org.junit.jupiter.api.Test; @@ -41,7 +43,9 @@ public class Bug6329116 { static Locale[] locales = Locale.getAvailableLocales(); - static String[] timezones = TimeZone.getAvailableIDs(); + static String[] timezones = Arrays.stream(TimeZone.getAvailableIDs()) + .filter(Predicate.not(ZoneId.SHORT_IDS::containsKey)) + .toArray(String[]::new); @Test public void bug6329116() throws IOException { @@ -98,6 +102,9 @@ public void bug6329116() throws IOException { tzs[0] = timezoneID; for (int j = 0; j < tzs.length; j++) { + if (ZoneId.SHORT_IDS.containsKey(tzs[j])) { + continue; + } tz = TimeZone.getTimeZone(tzs[j]); if (!tzs[j].equals(tz.getID())) { diff --git a/test/jdk/java/util/TimeZone/Bug6772689.java b/test/jdk/java/util/TimeZone/Bug6772689.java index f730567013d3..b2ce085fc226 100644 --- a/test/jdk/java/util/TimeZone/Bug6772689.java +++ b/test/jdk/java/util/TimeZone/Bug6772689.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2025, 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 @@ -23,15 +23,18 @@ /* * @test - * @bug 6772689 + * @bug 6772689 8347841 * @summary Test for standard-to-daylight transitions at midnight: * date stays on the given day. */ +import java.time.ZoneId; +import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.TimeZone; +import java.util.function.Predicate; import static java.util.GregorianCalendar.*; public class Bug6772689 { @@ -43,7 +46,9 @@ public static void main(String[] args) { int errors = 0; Calendar cal = new GregorianCalendar(BEGIN_YEAR, MARCH, 1); - String[] tzids = TimeZone.getAvailableIDs(); + String[] tzids = Arrays.stream(TimeZone.getAvailableIDs()) + .filter(Predicate.not(ZoneId.SHORT_IDS::containsKey)) + .toArray(String[]::new); try { for (String id : tzids) { TimeZone tz = TimeZone.getTimeZone(id); diff --git a/test/jdk/java/util/TimeZone/DaylightTimeTest.java b/test/jdk/java/util/TimeZone/DaylightTimeTest.java index 4b637136f96b..006f03424eea 100644 --- a/test/jdk/java/util/TimeZone/DaylightTimeTest.java +++ b/test/jdk/java/util/TimeZone/DaylightTimeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2025, 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 @@ -23,17 +23,21 @@ /* * @test - * @bug 6936350 + * @bug 6936350 8347841 * @summary Test case for TimeZone.observesDaylightTime() */ +import java.time.ZoneId; import java.util.*; +import java.util.function.Predicate; import static java.util.GregorianCalendar.*; public class DaylightTimeTest { private static final int ONE_HOUR = 60 * 60 * 1000; // one hour private static final int INTERVAL = 24 * ONE_HOUR; // one day - private static final String[] ZONES = TimeZone.getAvailableIDs(); + private static final String[] ZONES = Arrays.stream(TimeZone.getAvailableIDs()) + .filter(Predicate.not(ZoneId.SHORT_IDS::containsKey)) + .toArray(String[]::new); private static int errors = 0; public static void main(String[] args) { diff --git a/test/jdk/java/util/TimeZone/IDTest.java b/test/jdk/java/util/TimeZone/IDTest.java index d5396b619b8e..97bf971abc90 100644 --- a/test/jdk/java/util/TimeZone/IDTest.java +++ b/test/jdk/java/util/TimeZone/IDTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2025, 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 @@ -23,24 +23,30 @@ /* * @test - * @bug 4509255 5055567 6176318 7090844 + * @bug 4509255 5055567 6176318 7090844 8347841 * @summary Tests consistencies of time zone IDs. */ +import java.time.ZoneId; import java.util.Arrays; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.TimeZone; import java.util.TreeMap; +import java.util.function.Predicate; public class IDTest { public static void main(String[] args) { Set ids = new HashSet<>(); Map> tree = new TreeMap<>(); - String[] tzs = TimeZone.getAvailableIDs(); - String[] tzs2 = TimeZone.getAvailableIDs(); + String[] tzs = Arrays.stream(TimeZone.getAvailableIDs()) + .filter(Predicate.not(ZoneId.SHORT_IDS::containsKey)) + .toArray(String[]::new); + String[] tzs2 = Arrays.stream(TimeZone.getAvailableIDs()) + .filter(Predicate.not(ZoneId.SHORT_IDS::containsKey)) + .toArray(String[]::new); if (tzs.length != tzs2.length) { throw new RuntimeException("tzs.length(" + tzs.length + ") != tzs2.length(" + tzs2.length + ")"); @@ -83,8 +89,12 @@ public static void main(String[] args) { // Check the getAvailableIDs(int) call to return the same // set of IDs int offset = key.intValue(); - tzs = TimeZone.getAvailableIDs(offset); - tzs2 = TimeZone.getAvailableIDs(offset); + tzs = Arrays.stream(TimeZone.getAvailableIDs(offset)) + .filter(Predicate.not(ZoneId.SHORT_IDS::containsKey)) + .toArray(String[]::new); + tzs2 = Arrays.stream(TimeZone.getAvailableIDs(offset)) + .filter(Predicate.not(ZoneId.SHORT_IDS::containsKey)) + .toArray(String[]::new); if (!Arrays.equals(tzs, tzs2)) { throw new RuntimeException("inconsistent tzs from getAvailableIDs("+offset+")"); } diff --git a/test/jdk/java/util/TimeZone/ListTimeZones.java b/test/jdk/java/util/TimeZone/ListTimeZones.java index 7dd309473e64..dad59a91a95e 100644 --- a/test/jdk/java/util/TimeZone/ListTimeZones.java +++ b/test/jdk/java/util/TimeZone/ListTimeZones.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2025, 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 @@ -23,17 +23,21 @@ /** * @test - * @bug 6851214 + * @bug 6851214 8347841 * @summary Allow 24:00 as a valid end/start DST time stamp * @run main ListTimeZones */ +import java.time.ZoneId; import java.util.*; +import java.util.function.Predicate; public class ListTimeZones{ public static void main(String[] args){ Date date = new Date(); - String TimeZoneIds[] = TimeZone.getAvailableIDs(); + String[] TimeZoneIds = Arrays.stream(TimeZone.getAvailableIDs()) + .filter(Predicate.not(ZoneId.SHORT_IDS::containsKey)) + .toArray(String[]::new); for(int i = 0; i < TimeZoneIds.length; i++){ TimeZone tz = TimeZone.getTimeZone(TimeZoneIds[i]); Calendar calendar = new GregorianCalendar(tz); diff --git a/test/jdk/java/util/TimeZone/TimeZoneBoundaryTest.java b/test/jdk/java/util/TimeZone/TimeZoneBoundaryTest.java index c70ccc204de5..9e4ca02731d3 100644 --- a/test/jdk/java/util/TimeZone/TimeZoneBoundaryTest.java +++ b/test/jdk/java/util/TimeZone/TimeZoneBoundaryTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2025, 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 @@ -23,6 +23,7 @@ /* * @test + * @bug 8347841 * @summary test Time Zone Boundary * @run junit TimeZoneBoundaryTest */ @@ -251,7 +252,7 @@ void verifyDST(Date d, TimeZone time_zone, @Test public void TestBoundaries() { - TimeZone pst = TimeZone.getTimeZone("PST"); + TimeZone pst = TimeZone.getTimeZone("America/Los_Angeles"); TimeZone save = TimeZone.getDefault(); try { TimeZone.setDefault(pst); @@ -410,11 +411,8 @@ else if (!z.useDaylightTime()) @Test public void TestStepwise() { - findBoundariesStepwise(1997, ONE_DAY, TimeZone.getTimeZone("ACT"), 0); - // "EST" is disabled because its behavior depends on the mapping property. (6466476). - //findBoundariesStepwise(1997, ONE_DAY, TimeZone.getTimeZone("EST"), 2); - findBoundariesStepwise(1997, ONE_DAY, TimeZone.getTimeZone("HST"), 0); - findBoundariesStepwise(1997, ONE_DAY, TimeZone.getTimeZone("PST"), 2); + findBoundariesStepwise(1997, ONE_DAY, TimeZone.getTimeZone("Australia/Darwin"), 0); + findBoundariesStepwise(1997, ONE_DAY, TimeZone.getTimeZone("Pacific/Honolulu"), 0); findBoundariesStepwise(1997, ONE_DAY, TimeZone.getTimeZone("PST8PDT"), 2); findBoundariesStepwise(1997, ONE_DAY, TimeZone.getTimeZone("SystemV/PST"), 0); findBoundariesStepwise(1997, ONE_DAY, TimeZone.getTimeZone("SystemV/PST8PDT"), 2); diff --git a/test/jdk/java/util/TimeZone/TimeZoneRegression.java b/test/jdk/java/util/TimeZone/TimeZoneRegression.java index 6343279689fc..bb191a47cd9c 100644 --- a/test/jdk/java/util/TimeZone/TimeZoneRegression.java +++ b/test/jdk/java/util/TimeZone/TimeZoneRegression.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2025, 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 @@ -25,7 +25,7 @@ * @test * @bug 4052967 4073209 4073215 4084933 4096952 4109314 4126678 4151406 4151429 * 4154525 4154537 4154542 4154650 4159922 4162593 4173604 4176686 4184229 4208960 - * 4966229 6433179 6851214 8007520 8008577 + * 4966229 6433179 6851214 8007520 8008577 8347841 * @library /java/text/testlib * @run junit/othervm -Djava.locale.providers=COMPAT,SPI TimeZoneRegression */ @@ -42,8 +42,8 @@ public class TimeZoneRegression { @Test public void Test4073209() { - TimeZone z1 = TimeZone.getTimeZone("PST"); - TimeZone z2 = TimeZone.getTimeZone("PST"); + TimeZone z1 = TimeZone.getTimeZone("America/Los_Angeles"); + TimeZone z2 = TimeZone.getTimeZone("America/Los_Angeles"); if (z1 == z2) { fail("Fail: TimeZone should return clones"); } @@ -81,7 +81,7 @@ public void Test4084933() { // test both SimpleTimeZone and ZoneInfo objects. // @since 1.4 sub4084933(getPST()); - sub4084933(TimeZone.getTimeZone("PST")); + sub4084933(TimeZone.getTimeZone("America/Los_Angeles")); } private void sub4084933(TimeZone tz) { @@ -122,7 +122,7 @@ private void sub4084933(TimeZone tz) { @Test public void Test4096952() { - String[] ZONES = { "GMT", "MET", "IST" }; + String[] ZONES = { "GMT", "MET", "Asia/Kolkata" }; boolean pass = true; try { for (int i=0; i zoneIds = ZoneId.getAvailableZoneIds(); Arrays.stream(DateFormatSymbols.getInstance(Locale.US).getZoneStrings()) + .filter(zone -> !ZoneId.SHORT_IDS.containsKey(zone[0])) .forEach(zone -> { System.out.println(zone[0]); TimeZone tz = TimeZone.getTimeZone(zone[0]); From 52ece99f8571458cce7dddf6fb223282ef9ade13 Mon Sep 17 00:00:00 2001 From: Daniel Hu Date: Wed, 22 Oct 2025 10:26:41 +0000 Subject: [PATCH 199/323] 8323803: ConstantOopReadValue::print_on should print 'null' instead of 'nullptr' Backport-of: 7620b129888d57514d9ef588e0681f1d43377236 --- src/hotspot/share/code/debugInfo.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hotspot/share/code/debugInfo.cpp b/src/hotspot/share/code/debugInfo.cpp index 5a420fd8a148..b66f396e1ad0 100644 --- a/src/hotspot/share/code/debugInfo.cpp +++ b/src/hotspot/share/code/debugInfo.cpp @@ -277,7 +277,7 @@ void ConstantOopReadValue::print_on(outputStream* st) const { if (value()() != nullptr) { value()()->print_value_on(st); } else { - st->print("nullptr"); + st->print("null"); } } From b69a659a795fbb3f64b37f9ebaf8110f6fe46094 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Wed, 22 Oct 2025 16:28:20 +0000 Subject: [PATCH 200/323] 8355387: [jittester] Disable downcasts by default Backport-of: b41e0b17490b203b19787a0d0742318fc0d03b33 --- .../src/jdk/test/lib/jittester/ProductionParams.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/ProductionParams.java b/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/ProductionParams.java index afc526e81c71..87b5f23f58cb 100644 --- a/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/ProductionParams.java +++ b/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/ProductionParams.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2025, 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 @@ -121,7 +121,7 @@ public static void register(OptionResolver optionResolver) { disableExternalSymbols = optionResolver.addBooleanOption("disable-external-symbols", "Don\'t use external symbols"); addExternalSymbols = optionResolver.addStringOption("add-external-symbols", "all", "Add symbols for listed classes (comma-separated list)"); disableInheritance = optionResolver.addBooleanOption("disable-inheritance", "Disable inheritance"); - disableDowncasts = optionResolver.addBooleanOption("disable-downcasts", "Disable downcasting of objects"); + disableDowncasts = optionResolver.addBooleanOption(null, "disable-downcasts", true, "Disable downcasting of objects"); disableStatic = optionResolver.addBooleanOption("disable-static", "Disable generation of static objects and functions"); disableInterfaces = optionResolver.addBooleanOption("disable-interfaces", "Disable generation of interfaces"); disableClasses = optionResolver.addBooleanOption("disable-classes", "Disable generation of classes"); From 8516a40450f14b84132b1d0b53891344f19590bd Mon Sep 17 00:00:00 2001 From: Feilong Jiang Date: Thu, 23 Oct 2025 03:26:53 +0000 Subject: [PATCH 201/323] 8369616: JavaFrameAnchor on RISC-V has unnecessary barriers and wrong store order in MacroAssembler Backport-of: 72663695da9a51c8eefbd496f14a6d1625ad7b42 --- src/hotspot/cpu/riscv/javaFrameAnchor_riscv.hpp | 14 ++++++-------- src/hotspot/cpu/riscv/macroAssembler_riscv.cpp | 6 ++++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/hotspot/cpu/riscv/javaFrameAnchor_riscv.hpp b/src/hotspot/cpu/riscv/javaFrameAnchor_riscv.hpp index f276d51b1693..f4fbc6fb5645 100644 --- a/src/hotspot/cpu/riscv/javaFrameAnchor_riscv.hpp +++ b/src/hotspot/cpu/riscv/javaFrameAnchor_riscv.hpp @@ -39,25 +39,23 @@ // 3 - restoring an old state (javaCalls) void clear(void) { + // No hardware barriers are necessary. All members are volatile and the profiler + // is run from a signal handler and the only observer is the thread its running on. + // clearing _last_Java_sp must be first _last_Java_sp = nullptr; - OrderAccess::release(); _last_Java_fp = nullptr; _last_Java_pc = nullptr; } void copy(JavaFrameAnchor* src) { - // In order to make sure the transition state is valid for "this" + // No hardware barriers are necessary. All members are volatile and the profiler + // is run from a signal handler and the only observer is the thread its running on. + // We must clear _last_Java_sp before copying the rest of the new data - // - // Hack Alert: Temporary bugfix for 4717480/4721647 - // To act like previous version (pd_cache_state) don't null _last_Java_sp - // unless the value is changing - // assert(src != nullptr, "Src should not be null."); if (_last_Java_sp != src->_last_Java_sp) { _last_Java_sp = nullptr; - OrderAccess::release(); } _last_Java_fp = src->_last_Java_fp; _last_Java_pc = src->_last_Java_pc; diff --git a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp index e398d353ac06..9e0c81b004f7 100644 --- a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp +++ b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp @@ -244,12 +244,14 @@ void MacroAssembler::set_last_Java_frame(Register last_java_sp, last_java_sp = esp; } - sd(last_java_sp, Address(xthread, JavaThread::last_Java_sp_offset())); - // last_java_fp is optional if (last_java_fp->is_valid()) { sd(last_java_fp, Address(xthread, JavaThread::last_Java_fp_offset())); } + + // We must set sp last. + sd(last_java_sp, Address(xthread, JavaThread::last_Java_sp_offset())); + } void MacroAssembler::set_last_Java_frame(Register last_java_sp, From 316d7200febfc21bd727344d1e6612210f37a6a5 Mon Sep 17 00:00:00 2001 From: SendaoYan Date: Thu, 23 Oct 2025 03:55:54 +0000 Subject: [PATCH 202/323] 8367904: Test java/net/InetAddress/ptr/Lookup.java should throw SkippedException Backport-of: c0815e40b6f5feeb4bfa791ccd91d662c205068d --- test/jdk/java/net/InetAddress/ptr/Lookup.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/test/jdk/java/net/InetAddress/ptr/Lookup.java b/test/jdk/java/net/InetAddress/ptr/Lookup.java index 1248916023ec..39e5f720cefd 100644 --- a/test/jdk/java/net/InetAddress/ptr/Lookup.java +++ b/test/jdk/java/net/InetAddress/ptr/Lookup.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2025, 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 @@ -46,6 +46,7 @@ import jdk.test.lib.process.OutputAnalyzer; import jdk.test.lib.process.ProcessTools; +import jtreg.SkippedException; public class Lookup { private static final String HOST = "icann.org"; @@ -91,8 +92,7 @@ public static void main(String args[]) throws IOException { String tmp = lookupWithIPv4Prefer(); System.out.println("IPv4 lookup results: [" + tmp + "]"); if (SKIP.equals(tmp)) { - System.out.println(HOST + " can't be resolved - test skipped."); - return; + throw new SkippedException(HOST + " can't be resolved - test skipped."); } String[] strs = tmp.split(":"); @@ -104,8 +104,7 @@ public static void main(String args[]) throws IOException { tmp = reverseWithIPv4Prefer(addr); System.out.println("IPv4 reverse lookup results: [" + tmp + "]"); if (SKIP.equals(tmp)) { - System.out.println(addr + " can't be resolved with preferIPv4 - test skipped."); - return; + throw new SkippedException(addr + " can't be resolved with preferIPv4 - test skipped."); } strs = tmp.split(":"); From 052ad8577248553c7614480da59f6a261e9a22e9 Mon Sep 17 00:00:00 2001 From: Chris Dennis Date: Thu, 23 Oct 2025 11:43:05 +0000 Subject: [PATCH 203/323] 8362123: ClassLoader Leak via Executors.newSingleThreadExecutor(...) Backport-of: d5a207994b9c374e6638e57826326f8f4593b96b --- .../java/util/concurrent/Executors.java | 7 +++ .../concurrent/Executors/AutoShutdown.java | 59 ++++++++++++++++++- 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/src/java.base/share/classes/java/util/concurrent/Executors.java b/src/java.base/share/classes/java/util/concurrent/Executors.java index 24aa3f0a08c6..146808e6d770 100644 --- a/src/java.base/share/classes/java/util/concurrent/Executors.java +++ b/src/java.base/share/classes/java/util/concurrent/Executors.java @@ -846,6 +846,13 @@ public void shutdown() { super.shutdown(); cleanable.clean(); // unregisters the cleanable } + + @Override + public List shutdownNow() { + List unexecuted = super.shutdownNow(); + cleanable.clean(); // unregisters the cleanable + return unexecuted; + } } /** diff --git a/test/jdk/java/util/concurrent/Executors/AutoShutdown.java b/test/jdk/java/util/concurrent/Executors/AutoShutdown.java index 2b7fa7b883fa..ec58a472f7b0 100644 --- a/test/jdk/java/util/concurrent/Executors/AutoShutdown.java +++ b/test/jdk/java/util/concurrent/Executors/AutoShutdown.java @@ -23,23 +23,32 @@ /* * @test - * @bug 6399443 8302899 + * @bug 6399443 8302899 8362123 * @summary Test that Executors.newSingleThreadExecutor wraps an ExecutorService that * automatically shuts down and terminates when the wrapper is GC'ed + * @library /test/lib/ * @modules java.base/java.util.concurrent:+open * @run junit AutoShutdown */ +import java.lang.ref.PhantomReference; +import java.lang.ref.Reference; +import java.lang.ref.ReferenceQueue; import java.lang.reflect.Field; import java.time.Duration; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; import java.util.function.Supplier; import java.util.stream.Stream; import java.util.stream.IntStream; +import jdk.test.lib.Utils; +import jdk.test.lib.util.ForceGC; + import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -61,6 +70,13 @@ private static Stream executorAndQueuedTaskCounts() { .mapToObj(i -> Arguments.of(s, i))); } + private static Stream shutdownMethods() { + return Stream.>of( + e -> e.shutdown(), + e -> e.shutdownNow() + ).map(Arguments::of); + } + /** * SingleThreadExecutor with no worker threads. */ @@ -110,6 +126,28 @@ void testActiveWorker(Supplier supplier,int queuedTaskCount) th assertEquals(ntasks, completedTaskCount.get()); } + @ParameterizedTest + @MethodSource("shutdownMethods") + void testShutdownUnlinksCleaner(Consumer shutdown) throws Exception { + ClassLoader classLoader = + Utils.getTestClassPathURLClassLoader(ClassLoader.getPlatformClassLoader()); + + ReferenceQueue queue = new ReferenceQueue<>(); + Reference reference = new PhantomReference(classLoader, queue); + try { + Class isolatedClass = classLoader.loadClass("AutoShutdown$IsolatedClass"); + assertSame(isolatedClass.getClassLoader(), classLoader); + isolatedClass.getDeclaredMethod("shutdown", Consumer.class).invoke(null, shutdown); + + isolatedClass = null; + classLoader = null; + + assertTrue(ForceGC.wait(() -> queue.poll() != null)); + } finally { + Reference.reachabilityFence(reference); + } + } + /** * Returns the delegate for the given ExecutorService. The given ExecutorService * must be a Executors$DelegatedExecutorService. @@ -132,5 +170,22 @@ private void gcAndAwaitTermination(ExecutorService executor) throws Exception { terminated = executor.awaitTermination(100, TimeUnit.MILLISECONDS); } } -} + public static class IsolatedClass { + + private static final ExecutorService executor = + Executors.newSingleThreadExecutor(new IsolatedThreadFactory()); + + public static void shutdown(Consumer shutdown) { + shutdown.accept(executor); + } + } + + public static class IsolatedThreadFactory implements ThreadFactory { + + @Override + public Thread newThread(Runnable r) { + return new Thread(r); + } + } +} From b7751ee50370a817e28354b3966743969c839263 Mon Sep 17 00:00:00 2001 From: SendaoYan Date: Fri, 24 Oct 2025 02:49:39 +0000 Subject: [PATCH 204/323] 8334771: [TESTBUG] Run TestDockerMemoryMetrics.java with -Xcomp fails exitValue = 137 Backport-of: fa5ad700bb6a92aef7577969e09b4fbd93feb388 --- .../jdk/jdk/internal/platform/docker/MetricsMemoryTester.java | 4 +++- .../jdk/internal/platform/docker/TestDockerMemoryMetrics.java | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/test/jdk/jdk/internal/platform/docker/MetricsMemoryTester.java b/test/jdk/jdk/internal/platform/docker/MetricsMemoryTester.java index 6307a93fa569..8069965e8d87 100644 --- a/test/jdk/jdk/internal/platform/docker/MetricsMemoryTester.java +++ b/test/jdk/jdk/internal/platform/docker/MetricsMemoryTester.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, 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 @@ -48,6 +48,8 @@ public static void main(String[] args) { case "softlimit": testMemorySoftLimit(args[1]); break; + default: + throw new RuntimeException("unknown args: " + args[0] + " for MetricsMemoryTester"); } } diff --git a/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetrics.java b/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetrics.java index 009e0ba0c09e..7cbab5c3b868 100644 --- a/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetrics.java +++ b/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetrics.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, 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 @@ -76,7 +76,7 @@ public static void main(String[] args) throws Exception { } testOomKillFlag("100m", true); - testMemoryFailCount("64m"); + testMemoryFailCount("128m"); testMemorySoftLimit("500m","200m"); From 381ec8b688b6e296217448e1cecac55c3c15d0b7 Mon Sep 17 00:00:00 2001 From: SendaoYan Date: Fri, 24 Oct 2025 06:35:34 +0000 Subject: [PATCH 205/323] 8305186: Reference.waitForReferenceProcessing should be more accessible to tests Backport-of: d8f012ea2a0514020434d5db6047e36941e9349b --- test/lib/jdk/test/whitebox/WhiteBox.java | 51 ++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/test/lib/jdk/test/whitebox/WhiteBox.java b/test/lib/jdk/test/whitebox/WhiteBox.java index b0e2530f7c05..00fa5b9787d7 100644 --- a/test/lib/jdk/test/whitebox/WhiteBox.java +++ b/test/lib/jdk/test/whitebox/WhiteBox.java @@ -24,7 +24,11 @@ package jdk.test.whitebox; import java.lang.management.MemoryUsage; +import java.lang.ref.Reference; import java.lang.reflect.Executable; +import java.lang.reflect.InaccessibleObjectException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; import java.util.function.BiFunction; @@ -526,6 +530,53 @@ public void clearInlineCaches(boolean preserve_static_stubs) { // Force Full GC public native void fullGC(); + // Infrastructure for waitForReferenceProcessing() + private static volatile Method waitForReferenceProcessingMethod = null; + + private static Method getWaitForReferenceProcessingMethod() { + Method wfrp = waitForReferenceProcessingMethod; + if (wfrp == null) { + try { + wfrp = Reference.class.getDeclaredMethod("waitForReferenceProcessing"); + wfrp.setAccessible(true); + assert wfrp.getReturnType() == Boolean.class; + Class[] ev = wfrp.getExceptionTypes(); + assert ev.length == 1; + assert ev[0] == InterruptedException.class; + waitForReferenceProcessingMethod = wfrp; + } catch (InaccessibleObjectException e) { + throw new RuntimeException("Need to add @modules java.base/java.lang.ref:open to test?", e); + } catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } + } + return wfrp; + } + + /** + * Wait for reference processing, via Reference.waitForReferenceProcessing(). + * Callers of this method will need the + * @modules java.base/java.lang.ref:open + * jtreg tag. + * + * This method should usually be called after a call to WhiteBox.fullGC(). + */ + public boolean waitForReferenceProcessing() throws InterruptedException { + try { + Method wfrp = getWaitForReferenceProcessingMethod(); + return (Boolean) wfrp.invoke(null); + } catch (IllegalAccessException e) { + throw new RuntimeException("Shouldn't happen, we call setAccessible()", e); + } catch (InvocationTargetException e) { + Throwable cause = e.getCause(); + if (cause instanceof InterruptedException) { + throw (InterruptedException) cause; + } else { + throw new RuntimeException(e); + } + } + } + // Returns true if the current GC supports concurrent collection control. public native boolean supportsConcurrentGCBreakpoints(); From 8ecee5d91858fb477021e354ac5fc6887edf4496 Mon Sep 17 00:00:00 2001 From: Aleksey Shipilev Date: Fri, 24 Oct 2025 11:36:49 +0000 Subject: [PATCH 206/323] 8341097: GHA: Demote Mac x86 jobs to build only Backport-of: d66737ea1cfd92bcb208ded4e64822d12760205d --- .github/workflows/main.yml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7685d2c6fec7..c0f842c6864f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -308,17 +308,6 @@ jobs: bootjdk-platform: linux-x64 runs-on: ubuntu-22.04 - test-macos-x64: - name: macos-x64 - needs: - - build-macos-x64 - uses: ./.github/workflows/test.yml - with: - platform: macos-x64 - bootjdk-platform: macos-x64 - runs-on: macos-13 - xcode-toolset-version: '14.3.1' - test-macos-aarch64: name: macos-aarch64 needs: From 77902c284853b900324a366e4cb6a5b3a108c3a7 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 24 Oct 2025 12:48:27 +0000 Subject: [PATCH 207/323] 8317132: Prepare HotSpot for permissive- Reviewed-by: rschmelter Backport-of: 4a85f6ae9f0381f0e29160fb1d304d7bde5840ba --- make/autoconf/flags-cflags.m4 | 2 +- src/hotspot/os/windows/os_windows.cpp | 23 ++++++++++++----------- src/hotspot/os/windows/symbolengine.cpp | 4 ++-- src/hotspot/share/memory/allocation.cpp | 2 +- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/make/autoconf/flags-cflags.m4 b/make/autoconf/flags-cflags.m4 index 9b022792e15d..7cad3701987c 100644 --- a/make/autoconf/flags-cflags.m4 +++ b/make/autoconf/flags-cflags.m4 @@ -625,7 +625,7 @@ AC_DEFUN([FLAGS_SETUP_CFLAGS_HELPER], TOOLCHAIN_CFLAGS_JVM="-qtbtable=full -qtune=balanced -fno-exceptions \ -qalias=noansi -qstrict -qtls=default -qnortti -qnoeh -qignerrno -qstackprotect" elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then - TOOLCHAIN_CFLAGS_JVM="-nologo -MD -Zc:preprocessor -Zc:strictStrings -MP" + TOOLCHAIN_CFLAGS_JVM="-nologo -MD -Zc:preprocessor -Zc:strictStrings -permissive- -MP" TOOLCHAIN_CFLAGS_JDK="-nologo -MD -Zc:preprocessor -Zc:strictStrings -Zc:wchar_t-" fi diff --git a/src/hotspot/os/windows/os_windows.cpp b/src/hotspot/os/windows/os_windows.cpp index b3e14e54035b..669e96e54058 100644 --- a/src/hotspot/os/windows/os_windows.cpp +++ b/src/hotspot/os/windows/os_windows.cpp @@ -2496,7 +2496,7 @@ void* os::win32::install_signal_handler(int sig, signal_handler_t handler) { sigbreakHandler = handler; return oldHandler; } else { - return ::signal(sig, handler); + return CAST_FROM_FN_PTR(void*, ::signal(sig, handler)); } } @@ -3147,22 +3147,23 @@ LONG WINAPI topLevelVectoredExceptionFilter(struct _EXCEPTION_POINTERS* exceptio #if defined(USE_VECTORED_EXCEPTION_HANDLING) LONG WINAPI topLevelUnhandledExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) { - if (InterceptOSException) goto exit; - DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode; + if (!InterceptOSException) { + DWORD exceptionCode = exceptionInfo->ExceptionRecord->ExceptionCode; #if defined(_M_ARM64) - address pc = (address)exceptionInfo->ContextRecord->Pc; + address pc = (address) exceptionInfo->ContextRecord->Pc; #elif defined(_M_AMD64) - address pc = (address) exceptionInfo->ContextRecord->Rip; + address pc = (address) exceptionInfo->ContextRecord->Rip; #else - address pc = (address) exceptionInfo->ContextRecord->Eip; + address pc = (address) exceptionInfo->ContextRecord->Eip; #endif - Thread* t = Thread::current_or_null_safe(); + Thread* thread = Thread::current_or_null_safe(); - if (exception_code != EXCEPTION_BREAKPOINT) { - report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord, - exceptionInfo->ContextRecord); + if (exceptionCode != EXCEPTION_BREAKPOINT) { + report_error(thread, exceptionCode, pc, exceptionInfo->ExceptionRecord, + exceptionInfo->ContextRecord); + } } -exit: + return previousUnhandledExceptionFilter ? previousUnhandledExceptionFilter(exceptionInfo) : EXCEPTION_CONTINUE_SEARCH; } #endif diff --git a/src/hotspot/os/windows/symbolengine.cpp b/src/hotspot/os/windows/symbolengine.cpp index f178c3648b40..40c11b9e54dd 100644 --- a/src/hotspot/os/windows/symbolengine.cpp +++ b/src/hotspot/os/windows/symbolengine.cpp @@ -111,7 +111,7 @@ class SimpleBufferWithFallback { _p = _fallback_buffer; _capacity = (int)(sizeof(_fallback_buffer) / sizeof(T)); } - _p[0] = '\0'; + _p[0] = 0; imprint_sentinel(); } @@ -123,7 +123,7 @@ class SimpleBufferWithFallback { } _p = _fallback_buffer; _capacity = (int)(sizeof(_fallback_buffer) / sizeof(T)); - _p[0] = '\0'; + _p[0] = 0; imprint_sentinel(); } diff --git a/src/hotspot/share/memory/allocation.cpp b/src/hotspot/share/memory/allocation.cpp index 64b00a136942..120d0df53580 100644 --- a/src/hotspot/share/memory/allocation.cpp +++ b/src/hotspot/share/memory/allocation.cpp @@ -111,7 +111,7 @@ void* ArenaObj::operator new(size_t size, Arena *arena) throw() { // AnyObj // -void* AnyObj::operator new(size_t size, Arena *arena) throw() { +void* AnyObj::operator new(size_t size, Arena *arena) { address res = (address)arena->Amalloc(size); DEBUG_ONLY(set_allocation_type(res, ARENA);) return res; From 82b442334a07dd09479d800507d15701c9675aeb Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 24 Oct 2025 12:48:47 +0000 Subject: [PATCH 208/323] 8370214: [21u] Remove -Xdebug and -Xnoagent from tests: backport parts of 8227229 and 8312072 Reviewed-by: mbaesken --- make/ide/netbeans/langtools/build.xml | 4 ++-- .../classes/com/sun/tools/jdi/SunCommandLineLauncher.java | 1 - .../hotspot/jtreg/runtime/6294277/SourceDebugExtension.java | 6 +++--- .../nsk/jdi/AttachingConnector/attach/attach001.java | 4 ++-- .../nsk/jdi/AttachingConnector/attach/attach002.java | 4 ++-- .../attachnosuspend/attachnosuspend001.java | 4 ++-- .../nsk/jdi/LaunchingConnector/launch/launch003.java | 4 ++-- .../nsk/jdi/LaunchingConnector/launch/launch004.java | 4 ++-- .../nsk/jdi/ListeningConnector/accept/accept001.java | 4 ++-- .../nsk/jdi/ListeningConnector/accept/accept002.java | 4 ++-- .../listennosuspend/listennosuspend001.java | 4 ++-- .../jdi/ListeningConnector/startListening/startlis001.java | 4 ++-- .../jdi/ListeningConnector/startListening/startlis002.java | 4 ++-- .../createVirtualMachine/createVM002.java | 4 ++-- .../createVirtualMachine/createVM003.java | 4 ++-- .../createVirtualMachine/createVM004.java | 4 ++-- .../createVirtualMachine/createVM005.java | 4 ++-- .../com/sun/jdi/connect/spi/SimpleLaunchingConnector.java | 4 ++-- .../awt/Clipboard/HTMLTransferTest/HTMLTransferTest.java | 4 ++-- .../DragUnicodeBetweenJVMTest.java | 4 ++-- 20 files changed, 39 insertions(+), 40 deletions(-) diff --git a/make/ide/netbeans/langtools/build.xml b/make/ide/netbeans/langtools/build.xml index b23614649b88..f417b256eb69 100644 --- a/make/ide/netbeans/langtools/build.xml +++ b/make/ide/netbeans/langtools/build.xml @@ -1,6 +1,6 @@ - - - - High resolution custom cursor test, bug ID 8028212 - - - -

          See the dialog box (usually in upper left corner) for instructions

          - - diff --git a/test/jdk/java/awt/Cursor/MultiResolutionCursorTest/MultiResolutionCursorTest.java b/test/jdk/java/awt/Cursor/MultiResolutionCursorTest/MultiResolutionCursorTest.java deleted file mode 100644 index 6821f9c55e65..000000000000 --- a/test/jdk/java/awt/Cursor/MultiResolutionCursorTest/MultiResolutionCursorTest.java +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright (c) 2013, 2018, 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.awt.BorderLayout; -import java.awt.Color; -import java.awt.Cursor; -import java.awt.Dialog; -import java.awt.Frame; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.Label; -import java.awt.Point; -import java.awt.TextArea; -import java.awt.Toolkit; -import java.awt.image.BaseMultiResolutionImage; -import java.awt.image.BufferedImage; -import javax.swing.JApplet; - -import jdk.test.lib.Platform; - -/** - * @test - * @bug 8028212 - * @summary [macosx] Custom Cursor HiDPI support - * @author Alexander Scherbatiy - * @library /test/lib - * @modules java.desktop/sun.awt.image - * @build jdk.test.lib.Platform - * @run applet/manual=yesno MultiResolutionCursorTest.html - */ -public class MultiResolutionCursorTest extends JApplet { - //Declare things used in the test, like buttons and labels here - - static final int sizes[] = {8, 16, 32, 128}; - static final Color colors[] = {Color.WHITE, Color.RED, Color.GREEN, Color.BLUE}; - - public void init() { - //Create instructions for the user here, as well as set up - // the environment -- set the layout manager, add buttons, - // etc. - this.setLayout(new BorderLayout()); - - if (Platform.isOSX()) { - String[] instructions = { - "Verify that high resolution custom cursor is used" - + " on HiDPI displays.", - "1) Run the test on Retina display or enable the Quartz Debug" - + " and select the screen resolution with (HiDPI) label", - "2) Move the cursor to the Test Frame", - "3) Check that cursor has red, green or blue color", - "If so, press PASS, else press FAIL." - }; - Sysout.createDialogWithInstructions(instructions); - - } else { - String[] instructions = { - "This test is not applicable to the current platform. Press PASS." - }; - Sysout.createDialogWithInstructions(instructions); - } - }//End init() - - public void start() { - //Get things going. Request focus, set size, et cetera - setSize(200, 200); - setVisible(true); - validate(); - - final Image image = new BaseMultiResolutionImage( - createResolutionVariant(0), - createResolutionVariant(1), - createResolutionVariant(2), - createResolutionVariant(3) - ); - - int center = sizes[0] / 2; - Cursor cursor = Toolkit.getDefaultToolkit().createCustomCursor( - image, new Point(center, center), "multi-resolution cursor"); - - Frame frame = new Frame("Test Frame"); - frame.setSize(300, 300); - frame.setLocation(300, 50); - frame.add(new Label("Move cursor here")); - frame.setCursor(cursor); - frame.setVisible(true); - }// start() - - static BufferedImage createResolutionVariant(int i) { - BufferedImage resolutionVariant = new BufferedImage(sizes[i], sizes[i], - BufferedImage.TYPE_INT_RGB); - Graphics2D g2 = resolutionVariant.createGraphics(); - g2.setColor(colors[i]); - g2.fillRect(0, 0, sizes[i], sizes[i]); - g2.dispose(); - return resolutionVariant; - } -}// class BlockedWindowTest - -/* Place other classes related to the test after this line */ -/** - * ************************************************** - * Standard Test Machinery DO NOT modify anything below -- it's a standard chunk - * of code whose purpose is to make user interaction uniform, and thereby make - * it simpler to read and understand someone else's test. - * ************************************************** - */ -/** - * This is part of the standard test machinery. It creates a dialog (with the - * instructions), and is the interface for sending text messages to the user. To - * print the instructions, send an array of strings to Sysout.createDialog - * WithInstructions method. Put one line of instructions per array entry. To - * display a message for the tester to see, simply call Sysout.println with the - * string to be displayed. This mimics System.out.println but works within the - * test harness as well as standalone. - */ -class Sysout { - - private static TestDialog dialog; - - public static void createDialogWithInstructions(String[] instructions) { - dialog = new TestDialog(new Frame(), "Instructions"); - dialog.printInstructions(instructions); - dialog.setVisible(true); - println("Any messages for the tester will display here."); - } - - public static void createDialog() { - dialog = new TestDialog(new Frame(), "Instructions"); - String[] defInstr = {"Instructions will appear here. ", ""}; - dialog.printInstructions(defInstr); - dialog.setVisible(true); - println("Any messages for the tester will display here."); - } - - public static void printInstructions(String[] instructions) { - dialog.printInstructions(instructions); - } - - public static void println(String messageIn) { - dialog.displayMessage(messageIn); - } -}// Sysout class - -/** - * This is part of the standard test machinery. It provides a place for the test - * instructions to be displayed, and a place for interactive messages to the - * user to be displayed. To have the test instructions displayed, see Sysout. To - * have a message to the user be displayed, see Sysout. Do not call anything in - * this dialog directly. - */ -class TestDialog extends Dialog { - - TextArea instructionsText; - TextArea messageText; - int maxStringLength = 80; - - //DO NOT call this directly, go through Sysout - public TestDialog(Frame frame, String name) { - super(frame, name); - int scrollBoth = TextArea.SCROLLBARS_BOTH; - instructionsText = new TextArea("", 15, maxStringLength, scrollBoth); - add("North", instructionsText); - - messageText = new TextArea("", 5, maxStringLength, scrollBoth); - add("Center", messageText); - - pack(); - - setVisible(true); - }// TestDialog() - - //DO NOT call this directly, go through Sysout - public void printInstructions(String[] instructions) { - //Clear out any current instructions - instructionsText.setText(""); - - //Go down array of instruction strings - - String printStr, remainingStr; - for (int i = 0; i < instructions.length; i++) { - //chop up each into pieces maxSringLength long - remainingStr = instructions[ i]; - while (remainingStr.length() > 0) { - //if longer than max then chop off first max chars to print - if (remainingStr.length() >= maxStringLength) { - //Try to chop on a word boundary - int posOfSpace = remainingStr.lastIndexOf(' ', maxStringLength - 1); - - if (posOfSpace <= 0) { - posOfSpace = maxStringLength - 1; - } - - printStr = remainingStr.substring(0, posOfSpace + 1); - remainingStr = remainingStr.substring(posOfSpace + 1); - } //else just print - else { - printStr = remainingStr; - remainingStr = ""; - } - - instructionsText.append(printStr + "\n"); - - }// while - - }// for - - }//printInstructions() - - //DO NOT call this directly, go through Sysout - public void displayMessage(String messageIn) { - messageText.append(messageIn + "\n"); - System.out.println(messageIn); - } -}// Te From c5394791c1c26ceae711ad3873b81ecd66702b5f Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 31 Oct 2025 10:03:05 +0000 Subject: [PATCH 260/323] 8334509: Cancelling PageDialog does not return the same PageFormat object Backport-of: 689cee3d0950e15e88a1f6738bfded00655dca9c --- .../native/libawt/windows/awt_PrintJob.cpp | 16 ++--- .../PrinterJob/PageDialogCancelTest.java | 58 +++++++++++++++++++ 2 files changed, 67 insertions(+), 7 deletions(-) create mode 100644 test/jdk/java/awt/print/PrinterJob/PageDialogCancelTest.java diff --git a/src/java.desktop/windows/native/libawt/windows/awt_PrintJob.cpp b/src/java.desktop/windows/native/libawt/windows/awt_PrintJob.cpp index 293fb2ab62e6..7b00215ccded 100644 --- a/src/java.desktop/windows/native/libawt/windows/awt_PrintJob.cpp +++ b/src/java.desktop/windows/native/libawt/windows/awt_PrintJob.cpp @@ -534,6 +534,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer) AwtComponent *awtParent = (parent != NULL) ? (AwtComponent *)JNI_GET_PDATA(parent) : NULL; HWND hwndOwner = awtParent ? awtParent->GetHWnd() : NULL; + jboolean doIt = JNI_FALSE; PAGESETUPDLG setup; memset(&setup, 0, sizeof(setup)); @@ -589,7 +590,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer) */ if ((setup.hDevMode == NULL) && (setup.hDevNames == NULL)) { CLEANUP_SHOW; - return JNI_FALSE; + return doIt; } } else { int measure = PSD_INTHOUSANDTHSOFINCHES; @@ -617,7 +618,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer) pageFormatToSetup(env, self, page, &setup, AwtPrintControl::getPrintDC(env, self)); if (env->ExceptionCheck()) { CLEANUP_SHOW; - return JNI_FALSE; + return doIt; } setup.lpfnPageSetupHook = reinterpret_cast(pageDlgHook); @@ -631,7 +632,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer) jobject paper = getPaper(env, page); if (paper == NULL) { CLEANUP_SHOW; - return JNI_FALSE; + return doIt; } int units = setup.Flags & PSD_INTHOUSANDTHSOFINCHES ? MM_HIENGLISH : @@ -673,7 +674,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer) setPaperValues(env, paper, &paperSize, &margins, units); if (env->ExceptionCheck()) { CLEANUP_SHOW; - return JNI_FALSE; + return doIt; } /* * Put the updated Paper instance and the orientation into @@ -682,7 +683,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer) setPaper(env, page, paper); if (env->ExceptionCheck()) { CLEANUP_SHOW; - return JNI_FALSE; + return doIt; } setPageFormatOrientation(env, page, orientation); if (env->ExceptionCheck()) { @@ -696,12 +697,13 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer) jboolean err = setPrintPaperSize(env, self, devmode->dmPaperSize); if (err) { CLEANUP_SHOW; - return JNI_FALSE; + return doIt; } } } ::GlobalUnlock(setup.hDevMode); } + doIt = JNI_TRUE; } AwtDialog::CheckUninstallModalHook(); @@ -720,7 +722,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer) CLEANUP_SHOW; - return JNI_TRUE; + return doIt; CATCH_BAD_ALLOC_RET(0); } diff --git a/test/jdk/java/awt/print/PrinterJob/PageDialogCancelTest.java b/test/jdk/java/awt/print/PrinterJob/PageDialogCancelTest.java new file mode 100644 index 000000000000..f9ce1b7c196a --- /dev/null +++ b/test/jdk/java/awt/print/PrinterJob/PageDialogCancelTest.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2024, 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 8334366 + * @key headful printer + * @summary Verifies original pageobject is returned unmodified + * on cancelling pagedialog + * @requires (os.family == "windows") + * @run main PageDialogCancelTest + */ + +import java.awt.Robot; +import java.awt.event.KeyEvent; +import java.awt.print.PageFormat; +import java.awt.print.PrinterJob; + +public class PageDialogCancelTest { + + public static void main(String[] args) throws Exception { + PrinterJob pj = PrinterJob.getPrinterJob(); + PageFormat oldFormat = new PageFormat(); + Robot robot = new Robot(); + Thread t1 = new Thread(() -> { + robot.delay(2000); + robot.keyPress(KeyEvent.VK_ESCAPE); + robot.keyRelease(KeyEvent.VK_ESCAPE); + robot.waitForIdle(); + }); + t1.start(); + PageFormat newFormat = pj.pageDialog(oldFormat); + if (!newFormat.equals(oldFormat)) { + throw new RuntimeException("Original PageFormat not returned on cancelling PageDialog"); + } + } +} + From 41f50daa0249755e2c7ee1d141ce5b0ea8054b0e Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 31 Oct 2025 10:04:48 +0000 Subject: [PATCH 261/323] 8355241: Move NativeDialogToFrontBackTest.java PL test to manual category Backport-of: 33bdc807b18914bb57ca7853ab45d4fa8fdefd47 --- test/jdk/ProblemList.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index a8e0432ccb37..b2aceda1a5dc 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -400,7 +400,6 @@ java/awt/Modal/MultipleDialogs/MultipleDialogs2Test.java 8198665 macosx-all java/awt/Modal/MultipleDialogs/MultipleDialogs3Test.java 8198665 macosx-all java/awt/Modal/MultipleDialogs/MultipleDialogs4Test.java 8198665 macosx-all java/awt/Modal/MultipleDialogs/MultipleDialogs5Test.java 8198665 macosx-all -java/awt/Modal/NativeDialogToFrontBackTest.java 7188049 windows-all,linux-all java/awt/Mouse/EnterExitEvents/DragWindowOutOfFrameTest.java 8177326 macosx-all java/awt/Mouse/EnterExitEvents/ResizingFrameTest.java 8005021 macosx-all java/awt/Mouse/EnterExitEvents/FullscreenEnterEventTest.java 8051455 macosx-all @@ -845,4 +844,5 @@ java/awt/Checkbox/CheckboxNullLabelTest.java 8340870 windows-all java/awt/dnd/WinMoveFileToShellTest.java 8341665 windows-all java/awt/Focus/MinimizeNonfocusableWindowTest.java 8024487 windows-all java/awt/Menu/MenuVisibilityTest.java 8161110 macosx-all +java/awt/Modal/NativeDialogToFrontBackTest.java 7188049 windows-all,linux-all java/awt/Cursor/CursorDragTest/ListDragCursor.java 7177297 macosx-all From 7bbf8d84261be401f3d6b164c0fdad616a0f41b3 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 31 Oct 2025 10:09:48 +0000 Subject: [PATCH 262/323] 8358813: JPasswordField identifies spaces in password via delete shortcuts Backport-of: 8d73fe91bccd1da53424b9f8a52d9efafabeb243 --- .../com/apple/laf/AquaKeyBindings.java | 3 + .../PasswordFieldInputMapWordTest.java | 118 ++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 test/jdk/javax/swing/JPasswordField/PasswordFieldInputMapWordTest.java diff --git a/src/java.desktop/macosx/classes/com/apple/laf/AquaKeyBindings.java b/src/java.desktop/macosx/classes/com/apple/laf/AquaKeyBindings.java index 52572643511e..d1736c5aa752 100644 --- a/src/java.desktop/macosx/classes/com/apple/laf/AquaKeyBindings.java +++ b/src/java.desktop/macosx/classes/com/apple/laf/AquaKeyBindings.java @@ -157,6 +157,9 @@ LateBoundInputMap getPasswordFieldInputMap() { "shift alt KP_LEFT", null, "shift alt RIGHT", null, "shift alt KP_RIGHT", null, + "alt BACK_SPACE", null, + "ctrl W", null, + "alt DELETE", null, })); } diff --git a/test/jdk/javax/swing/JPasswordField/PasswordFieldInputMapWordTest.java b/test/jdk/javax/swing/JPasswordField/PasswordFieldInputMapWordTest.java new file mode 100644 index 000000000000..c49e9f7083cf --- /dev/null +++ b/test/jdk/javax/swing/JPasswordField/PasswordFieldInputMapWordTest.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @key headful + * @bug 8358813 + * @summary Password fields' InputMap should not include any word-related action. + * + * @run main PasswordFieldInputMapWordTest + */ + +import java.util.Collection; +import java.util.Set; + +import javax.swing.InputMap; +import javax.swing.JComponent; +import javax.swing.JPasswordField; +import javax.swing.KeyStroke; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.text.DefaultEditorKit; + +public class PasswordFieldInputMapWordTest { + public static void main(String[] args) throws Exception { + for (UIManager.LookAndFeelInfo laf : + UIManager.getInstalledLookAndFeels()) { + System.out.println("Testing LAF: " + laf.getClassName()); + SwingUtilities.invokeAndWait(() -> { + if (setLookAndFeel(laf)) { + runTest(); + } + }); + } + } + + private static boolean setLookAndFeel(UIManager.LookAndFeelInfo laf) { + try { + UIManager.setLookAndFeel(laf.getClassName()); + return true; + } catch (UnsupportedLookAndFeelException e) { + System.err.println("Skipping unsupported look and feel:"); + e.printStackTrace(); + return false; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + static int[] inputMapConditions = new int[] { + JComponent.WHEN_IN_FOCUSED_WINDOW, + JComponent.WHEN_FOCUSED, + JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT + }; + + /** + * These are all the actions with "word" in their field name. + */ + static Collection wordActions = Set.of( + DefaultEditorKit.deleteNextWordAction, + DefaultEditorKit.deletePrevWordAction, + DefaultEditorKit.beginWordAction, + DefaultEditorKit.endWordAction, + DefaultEditorKit.selectionBeginWordAction, + DefaultEditorKit.selectionEndWordAction, + DefaultEditorKit.previousWordAction, + DefaultEditorKit.nextWordAction, + DefaultEditorKit.selectionPreviousWordAction, + DefaultEditorKit.selectionNextWordAction + ); + + private static void runTest() { + JPasswordField field = new JPasswordField(); + + boolean testPassed = true; + for (int condition : inputMapConditions) { + InputMap inputMap = field.getInputMap(condition); + if (inputMap.allKeys() == null) { + continue; + } + for (KeyStroke keyStroke : inputMap.allKeys()) { + Object actionBinding = inputMap.get(keyStroke); + if (wordActions.contains(actionBinding)) { + if (testPassed) { + System.err.println("The following inputs/actions should not be available in a JPasswordField:"); + } + System.err.println(inputMap.get(keyStroke) + " (try typing " + keyStroke + ")"); + testPassed = false; + } + } + } + + if (!testPassed) { + throw new RuntimeException("One or more input/action binding was observed for a JPasswordField."); + } + } +} From dfefaace71f14391d996317454cd74b0b734109f Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 31 Oct 2025 10:12:22 +0000 Subject: [PATCH 263/323] 8325766: Extend CertificateBuilder to create trust and end entity certificates programmatically Reviewed-by: rrich Backport-of: 31847149c1956b23c19a99309982660b4bbdd2d6 --- .../HttpsURLConnection/IPIdentities.java | 716 +++--------------- .../https/HttpsURLConnection/TEST.properties | 3 + .../test/lib/security/CertificateBuilder.java | 98 ++- 3 files changed, 209 insertions(+), 608 deletions(-) create mode 100644 test/jdk/sun/net/www/protocol/https/HttpsURLConnection/TEST.properties diff --git a/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/IPIdentities.java b/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/IPIdentities.java index 6ea625265662..9ce71064b541 100644 --- a/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/IPIdentities.java +++ b/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/IPIdentities.java @@ -34,379 +34,41 @@ * @author Xuelei Fan */ -import java.net.*; -import java.util.*; -import java.io.*; -import javax.net.ssl.*; -import java.security.Security; + +import java.io.PrintStream; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.Proxy; +import java.net.URL; +import java.security.KeyPair; +import java.security.KeyPairGenerator; import java.security.KeyStore; -import java.security.KeyFactory; +import java.security.SecureRandom; +import java.security.Security; +import java.security.cert.X509Certificate; + import java.security.cert.Certificate; -import java.security.cert.CertificateFactory; -import java.security.spec.*; -import java.security.interfaces.*; import java.math.BigInteger; import jdk.test.lib.net.URIBuilder; - -/* - * Certificates and key used in the test. - * - * TLS server certificate: - * server private key: - * -----BEGIN RSA PRIVATE KEY----- - * Proc-Type: 4,ENCRYPTED - * DEK-Info: DES-EDE3-CBC,D9AE407F6D0E389A - * - * WPrA7TFol/cQCcp9oHnXWNpYlvRbbIcQj0m+RKT2Iuzfus+DHt3Zadf8nJpKfX2e - * h2rnhlzCN9M7djRDooZKDOPCsdBn51Au7HlZF3S3Opgo7D8XFM1a8t1Je4ke14oI - * nw6QKYsBblRziPnP2PZ0zvX24nOv7bbY8beynlJHGs00VWSFdoH2DS0aE1p6D+3n - * ptJuJ75dVfZFK4X7162APlNXevX8D6PEQpSiRw1rjjGGcnvQ4HdWk3BxDVDcCNJb - * Y1aGNRxsjTDvPi3R9Qx2M+W03QzEPx4SR3ZHVskeSJHaetM0TM/w/45Paq4GokXP - * ZeTnbEx1xmjkA7h+t4doLL4watx5F6yLsJzu8xB3lt/1EtmkYtLz1t7X4BetPAXz - * zS69X/VwhKfsOI3qXBWuL2oHPyhDmT1gcaUQwEPSV6ogHEEQEDXdiUS8heNK13KF - * TCQYFkETvV2BLxUhV1hypPzRQ6tUpJiAbD5KmoK2lD9slshG2QtvKQq0/bgkDY5J - * LhDHV2dtcZ3kDPkkZXpbcJQvoeH3d09C5sIsuTFo2zgNR6oETHUc5TzP6FY2YYRa - * QcK5HcmtsRRiXFm01ac+aMejJUIujjFt84SiKWT/73vC8AmY4tYcJBLjCg4XIxSH - * fdDFLL1YZENNO5ivlp8mdiHqcawx+36L7DrEZQ8RZt6cqST5t/+XTdM74s6k81GT - * pNsa82P2K2zmIUZ/DL2mKjW1vfRByw1NQFEBkN3vdyZxYfM/JyUzX4hbjXBEkh9Q - * QYrcwLKLjis2QzSvK04B3bvRzRb+4ocWiso8ZPAXAIxZFBWDpTMM2A== - * -----END RSA PRIVATE KEY----- - * - * -----BEGIN RSA PRIVATE KEY----- - * MIICXAIBAAKBgQClrFscN6LdmYktsnm4j9VIpecchBeNaZzGrG358h0fORna03Ie - * buxEzHCk3LoAMPagTz1UemFqzFfQCn+VKBg/mtmU8hvIJIh+/p0PPftXUwizIDPU - * PxdHFNHN6gjYDnVOr77M0uyvqXpJ38LZrLgkQJCmA1Yq0DAFQCxPq9l0iQIDAQAB - * AoGAbqcbg1E1mkR99uOJoNeQYKFOJyGiiXTMnXV1TseC4+PDfQBU7Dax35GcesBi - * CtapIpFKKS5D+ozY6b7ZT8ojxuQ/uHLPAvz0WDR3ds4iRF8tyu71Q1ZHcQsJa17y - * yO7UbkSSKn/Mp9Rb+/dKqftUGNXVFLqgHBOzN2s3We3bbbECQQDYBPKOg3hkaGHo - * OhpHKqtQ6EVkldihG/3i4WejRonelXN+HRh1KrB2HBx0M8D/qAzP1i3rNSlSHer4 - * 59YRTJnHAkEAxFX/sVYSn07BHv9Zhn6XXct/Cj43z/tKNbzlNbcxqQwQerw3IH51 - * 8UH2YOA+GD3lXbKp+MytoFLWv8zg4YT/LwJAfqan75Z1R6lLffRS49bIiq8jwE16 - * rTrUJ+kv8jKxMqc9B3vXkxpsS1M/+4E8bqgAmvpgAb8xcsvHsBd9ErdukQJBAKs2 - * j67W75BrPjBI34pQ1LEfp56IGWXOrq1kF8IbCjxv3+MYRT6Z6UJFkpRymNPNDjsC - * dgUYgITiGJHUGXuw3lMCQHEHqo9ZtXz92yFT+VhsNc29B8m/sqUJdtCcMd/jGpAF - * u6GHufjqIZBpQsk63wbwESAPZZ+kk1O1kS5GIRLX608= - * -----END RSA PRIVATE KEY----- - * - * Private-Key: (1024 bit) - * modulus: - * 00:a5:ac:5b:1c:37:a2:dd:99:89:2d:b2:79:b8:8f: - * d5:48:a5:e7:1c:84:17:8d:69:9c:c6:ac:6d:f9:f2: - * 1d:1f:39:19:da:d3:72:1e:6e:ec:44:cc:70:a4:dc: - * ba:00:30:f6:a0:4f:3d:54:7a:61:6a:cc:57:d0:0a: - * 7f:95:28:18:3f:9a:d9:94:f2:1b:c8:24:88:7e:fe: - * 9d:0f:3d:fb:57:53:08:b3:20:33:d4:3f:17:47:14: - * d1:cd:ea:08:d8:0e:75:4e:af:be:cc:d2:ec:af:a9: - * 7a:49:df:c2:d9:ac:b8:24:40:90:a6:03:56:2a:d0: - * 30:05:40:2c:4f:ab:d9:74:89 - * publicExponent: 65537 (0x10001) - * privateExponent: - * 6e:a7:1b:83:51:35:9a:44:7d:f6:e3:89:a0:d7:90: - * 60:a1:4e:27:21:a2:89:74:cc:9d:75:75:4e:c7:82: - * e3:e3:c3:7d:00:54:ec:36:b1:df:91:9c:7a:c0:62: - * 0a:d6:a9:22:91:4a:29:2e:43:fa:8c:d8:e9:be:d9: - * 4f:ca:23:c6:e4:3f:b8:72:cf:02:fc:f4:58:34:77: - * 76:ce:22:44:5f:2d:ca:ee:f5:43:56:47:71:0b:09: - * 6b:5e:f2:c8:ee:d4:6e:44:92:2a:7f:cc:a7:d4:5b: - * fb:f7:4a:a9:fb:54:18:d5:d5:14:ba:a0:1c:13:b3: - * 37:6b:37:59:ed:db:6d:b1 - * prime1: - * 00:d8:04:f2:8e:83:78:64:68:61:e8:3a:1a:47:2a: - * ab:50:e8:45:64:95:d8:a1:1b:fd:e2:e1:67:a3:46: - * 89:de:95:73:7e:1d:18:75:2a:b0:76:1c:1c:74:33: - * c0:ff:a8:0c:cf:d6:2d:eb:35:29:52:1d:ea:f8:e7: - * d6:11:4c:99:c7 - * prime2: - * 00:c4:55:ff:b1:56:12:9f:4e:c1:1e:ff:59:86:7e: - * 97:5d:cb:7f:0a:3e:37:cf:fb:4a:35:bc:e5:35:b7: - * 31:a9:0c:10:7a:bc:37:20:7e:75:f1:41:f6:60:e0: - * 3e:18:3d:e5:5d:b2:a9:f8:cc:ad:a0:52:d6:bf:cc: - * e0:e1:84:ff:2f - * exponent1: - * 7e:a6:a7:ef:96:75:47:a9:4b:7d:f4:52:e3:d6:c8: - * 8a:af:23:c0:4d:7a:ad:3a:d4:27:e9:2f:f2:32:b1: - * 32:a7:3d:07:7b:d7:93:1a:6c:4b:53:3f:fb:81:3c: - * 6e:a8:00:9a:fa:60:01:bf:31:72:cb:c7:b0:17:7d: - * 12:b7:6e:91 - * exponent2: - * 00:ab:36:8f:ae:d6:ef:90:6b:3e:30:48:df:8a:50: - * d4:b1:1f:a7:9e:88:19:65:ce:ae:ad:64:17:c2:1b: - * 0a:3c:6f:df:e3:18:45:3e:99:e9:42:45:92:94:72: - * 98:d3:cd:0e:3b:02:76:05:18:80:84:e2:18:91:d4: - * 19:7b:b0:de:53 - * coefficient: - * 71:07:aa:8f:59:b5:7c:fd:db:21:53:f9:58:6c:35: - * cd:bd:07:c9:bf:b2:a5:09:76:d0:9c:31:df:e3:1a: - * 90:05:bb:a1:87:b9:f8:ea:21:90:69:42:c9:3a:df: - * 06:f0:11:20:0f:65:9f:a4:93:53:b5:91:2e:46:21: - * 12:d7:eb:4f - * - * - * server certificate: - * Data: - * Version: 3 (0x2) - * Serial Number: 7 (0x7) - * Signature Algorithm: md5WithRSAEncryption - * Issuer: C=US, ST=Some-State, L=Some-City, O=Some-Org - * Validity - * Not Before: Dec 8 03:27:57 2008 GMT - * Not After : Aug 25 03:27:57 2028 GMT - * Subject: C=US, ST=Some-State, L=Some-City, O=Some-Org, OU=SSL-Server, CN=localhost - * Subject Public Key Info: - * Public Key Algorithm: rsaEncryption - * RSA Public Key: (1024 bit) - * Modulus (1024 bit): - * 00:a5:ac:5b:1c:37:a2:dd:99:89:2d:b2:79:b8:8f: - * d5:48:a5:e7:1c:84:17:8d:69:9c:c6:ac:6d:f9:f2: - * 1d:1f:39:19:da:d3:72:1e:6e:ec:44:cc:70:a4:dc: - * ba:00:30:f6:a0:4f:3d:54:7a:61:6a:cc:57:d0:0a: - * 7f:95:28:18:3f:9a:d9:94:f2:1b:c8:24:88:7e:fe: - * 9d:0f:3d:fb:57:53:08:b3:20:33:d4:3f:17:47:14: - * d1:cd:ea:08:d8:0e:75:4e:af:be:cc:d2:ec:af:a9: - * 7a:49:df:c2:d9:ac:b8:24:40:90:a6:03:56:2a:d0: - * 30:05:40:2c:4f:ab:d9:74:89 - * Exponent: 65537 (0x10001) - * X509v3 extensions: - * X509v3 Basic Constraints: - * CA:FALSE - * X509v3 Key Usage: - * Digital Signature, Non Repudiation, Key Encipherment - * X509v3 Subject Key Identifier: - * ED:6E:DB:F4:B5:56:C8:FB:1A:06:61:3F:0F:08:BB:A6:04:D8:16:54 - * X509v3 Authority Key Identifier: - * keyid:FA:B9:51:BF:4C:E7:D9:86:98:33:F9:E7:CB:1E:F1:33:49:F7:A8:14 - * - * X509v3 Subject Alternative Name: critical - * IP Address:127.0.0.1 - * Signature Algorithm: md5WithRSAEncryption - * - * -----BEGIN CERTIFICATE----- - * MIICnzCCAgigAwIBAgIBBzANBgkqhkiG9w0BAQQFADBJMQswCQYDVQQGEwJVUzET - * MBEGA1UECBMKU29tZS1TdGF0ZTESMBAGA1UEBxMJU29tZS1DaXR5MREwDwYDVQQK - * EwhTb21lLU9yZzAeFw0wODEyMDgwMzI3NTdaFw0yODA4MjUwMzI3NTdaMHIxCzAJ - * BgNVBAYTAlVTMRMwEQYDVQQIEwpTb21lLVN0YXRlMRIwEAYDVQQHEwlTb21lLUNp - * dHkxETAPBgNVBAoTCFNvbWUtT3JnMRMwEQYDVQQLEwpTU0wtU2VydmVyMRIwEAYD - * VQQDEwlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKWsWxw3 - * ot2ZiS2yebiP1Uil5xyEF41pnMasbfnyHR85GdrTch5u7ETMcKTcugAw9qBPPVR6 - * YWrMV9AKf5UoGD+a2ZTyG8gkiH7+nQ89+1dTCLMgM9Q/F0cU0c3qCNgOdU6vvszS - * 7K+peknfwtmsuCRAkKYDVirQMAVALE+r2XSJAgMBAAGjbjBsMAkGA1UdEwQCMAAw - * CwYDVR0PBAQDAgXgMB0GA1UdDgQWBBTtbtv0tVbI+xoGYT8PCLumBNgWVDAfBgNV - * HSMEGDAWgBT6uVG/TOfZhpgz+efLHvEzSfeoFDASBgNVHREBAf8ECDAGhwR/AAAB - * MA0GCSqGSIb3DQEBBAUAA4GBAFJjItCtCBZcjD69wdqfIbKmRFa6eJAjR6LcoDva - * cKC/sDOLelpspiZ66Zb0Xdv5qQ7QrfOXt3K8QqJKRMdZLF9WfUfy0gJDM32ub91h - * pu+TmcGPs+6RdrAQcuvU1ZDV9X8SMj7BtKaim4d5sqFw1npncKiA5xFn8vOYwdun - * nZif - * -----END CERTIFICATE----- - * - * - * TLS client certificate: - * client private key: - * ----BEGIN RSA PRIVATE KEY----- - * Proc-Type: 4,ENCRYPTED - * DEK-Info: DES-EDE3-CBC,FA2A435CD35A9390 - * - * Z+Y2uaETbsUWIyJUyVu1UV2G4rgFYJyACZT6Tp1KjRtxflSh2kXkJ9MpuXMXA0V4 - * Yy3fDzPqCL9NJmQAYRlAx/W/+j4F5EyMWDIx8fUxzONRZyoiwF7jLm+KscAfv6Pf - * q7ItWOdj3z7IYrwlB8YIGd3F2cDKT3S+lYRk7rKb/qT7itbuHnY4Ardh3yl+MZak - * jBp+ELUlRsUqSr1V0LoM+0rCCykarpyfhpxEcqsrl0v9Cyi5uhU50/oKv5zql3SH - * l2ImgDjp3batAs8+Bd4NF2aqi0a7Hy44JUHxRm4caZryU/i/D9N1MbuM6882HLat - * 5N0G+NaIUfywa8mjwq2D5aiit18HqKA6XeRRYeJ5Dvu9DCO4GeFSwcUFIBMI0L46 - * 7s114+oDodg57pMgITi+04vmUxvqlN9aiyd7f5Fgd7PeHGeOdbMz1NaJLJaPI9++ - * NakK8eK9iwT/Gdq0Uap5/CHW7vCT5PO+h3HY0STH0lWStXhdWnFO04zTdywsbSp+ - * DLpHeFT66shfeUlxR0PsCbG9vPRt/QmGLeYQZITppWo/ylSq4j+pRIuXvuWHdBRN - * rTZ8QF4Y7AxQUXVz1j1++s6ZMHTzaK2i9HrhmDs1MbJl+QwWre3Xpv3LvTVz3k5U - * wX8kuY1m3STt71QCaRWENq5sRaMImLxZbxc/ivFl9RAzUqo4NCxLod/QgA4iLqtO - * ztnlpzwlC/F8HbQ1oqYWwnZAPhzU/cULtstl+Yrws2c2atO323LbPXZqbASySgig - * sNpFXQMObdfP6LN23bY+1SvtK7V4NUTNhpdIc6INQAQ= - * -----END RSA PRIVATE KEY----- - * - * -----BEGIN RSA PRIVATE KEY----- - * MIICWwIBAAKBgQC78EA2rCZUTvSjWgAvaSFvuXo6k+yi9uGOx2PYLxIwmS6w8o/4 - * Jy0keCiE9wG/jUR53TvSVfPOPLJbIX3v/TNKsaP/xsibuQ98QTWX+ds6BWAFFa9Z - * F5KjEK0WHOQHU6+odqJWKpLT+SjgeM9eH0irXBnd4WdDunWN9YKsQ5JEGwIDAQAB - * AoGAEbdqNj0wN85hnWyEi/ObJU8UyKTdL9eaF72QGfcF/fLSxfd3vurihIeXOkGW - * tpn4lIxYcVGM9CognhqgJpl11jFTQzn1KqZ+NEJRKkCHA4hDabKJbSC9fXHvRwrf - * BsFpZqgiNxp3HseUTiwnaUVeyPgMt/jAj5nB5Sib+UyUxrECQQDnNQBiF2aifEg6 - * zbJOOC7he5CHAdkFxSxWVFVHL6EfXfqdLVkUohMbgZv+XxyIeU2biOExSg49Kds3 - * FOKgTau1AkEA0Bd1haj6QuCo8I0AXm2WO+MMTZMTvtHD/bGjKNM+fT4I8rKYnQRX - * 1acHdqS9Xx2rNJqZgkMmpESIdPR2fc4yjwJALFeM6EMmqvj8/VIf5UJ/Mz14fXwM - * PEARfckUxd9LnnFutCBTWlKvKXJVEZb6KO5ixPaegc57Jp3Vbh3yTN44lQJADD/1 - * SSMDaIB1MYP7a5Oj7m6VQNPRq8AJe5vDcRnOae0G9dKRrVyeFxO4GsHj6/+BHp2j - * P8nYMn9eURQ7DXjf/QJAAQzMlWnKGSO8pyTDtnQx3hRMoUkOEhmNq4bQhLkYqtnY - * FcqpUQ2qMjW+NiNWk5HnTrMS3L9EdJobMUzaNZLy4w== - * -----END RSA PRIVATE KEY----- - * - * Private-Key: (1024 bit) - * modulus: - * 00:bb:f0:40:36:ac:26:54:4e:f4:a3:5a:00:2f:69: - * 21:6f:b9:7a:3a:93:ec:a2:f6:e1:8e:c7:63:d8:2f: - * 12:30:99:2e:b0:f2:8f:f8:27:2d:24:78:28:84:f7: - * 01:bf:8d:44:79:dd:3b:d2:55:f3:ce:3c:b2:5b:21: - * 7d:ef:fd:33:4a:b1:a3:ff:c6:c8:9b:b9:0f:7c:41: - * 35:97:f9:db:3a:05:60:05:15:af:59:17:92:a3:10: - * ad:16:1c:e4:07:53:af:a8:76:a2:56:2a:92:d3:f9: - * 28:e0:78:cf:5e:1f:48:ab:5c:19:dd:e1:67:43:ba: - * 75:8d:f5:82:ac:43:92:44:1b - * publicExponent: 65537 (0x10001) - * privateExponent: - * 11:b7:6a:36:3d:30:37:ce:61:9d:6c:84:8b:f3:9b: - * 25:4f:14:c8:a4:dd:2f:d7:9a:17:bd:90:19:f7:05: - * fd:f2:d2:c5:f7:77:be:ea:e2:84:87:97:3a:41:96: - * b6:99:f8:94:8c:58:71:51:8c:f4:2a:20:9e:1a:a0: - * 26:99:75:d6:31:53:43:39:f5:2a:a6:7e:34:42:51: - * 2a:40:87:03:88:43:69:b2:89:6d:20:bd:7d:71:ef: - * 47:0a:df:06:c1:69:66:a8:22:37:1a:77:1e:c7:94: - * 4e:2c:27:69:45:5e:c8:f8:0c:b7:f8:c0:8f:99:c1: - * e5:28:9b:f9:4c:94:c6:b1 - * prime1: - * 00:e7:35:00:62:17:66:a2:7c:48:3a:cd:b2:4e:38: - * 2e:e1:7b:90:87:01:d9:05:c5:2c:56:54:55:47:2f: - * a1:1f:5d:fa:9d:2d:59:14:a2:13:1b:81:9b:fe:5f: - * 1c:88:79:4d:9b:88:e1:31:4a:0e:3d:29:db:37:14: - * e2:a0:4d:ab:b5 - * prime2: - * 00:d0:17:75:85:a8:fa:42:e0:a8:f0:8d:00:5e:6d: - * 96:3b:e3:0c:4d:93:13:be:d1:c3:fd:b1:a3:28:d3: - * 3e:7d:3e:08:f2:b2:98:9d:04:57:d5:a7:07:76:a4: - * bd:5f:1d:ab:34:9a:99:82:43:26:a4:44:88:74:f4: - * 76:7d:ce:32:8f - * exponent1: - * 2c:57:8c:e8:43:26:aa:f8:fc:fd:52:1f:e5:42:7f: - * 33:3d:78:7d:7c:0c:3c:40:11:7d:c9:14:c5:df:4b: - * 9e:71:6e:b4:20:53:5a:52:af:29:72:55:11:96:fa: - * 28:ee:62:c4:f6:9e:81:ce:7b:26:9d:d5:6e:1d:f2: - * 4c:de:38:95 - * exponent2: - * 0c:3f:f5:49:23:03:68:80:75:31:83:fb:6b:93:a3: - * ee:6e:95:40:d3:d1:ab:c0:09:7b:9b:c3:71:19:ce: - * 69:ed:06:f5:d2:91:ad:5c:9e:17:13:b8:1a:c1:e3: - * eb:ff:81:1e:9d:a3:3f:c9:d8:32:7f:5e:51:14:3b: - * 0d:78:df:fd - * coefficient: - * 01:0c:cc:95:69:ca:19:23:bc:a7:24:c3:b6:74:31: - * de:14:4c:a1:49:0e:12:19:8d:ab:86:d0:84:b9:18: - * aa:d9:d8:15:ca:a9:51:0d:aa:32:35:be:36:23:56: - * 93:91:e7:4e:b3:12:dc:bf:44:74:9a:1b:31:4c:da: - * 35:92:f2:e3 - * - * client certificate: - * Data: - * Version: 3 (0x2) - * Serial Number: 6 (0x6) - * Signature Algorithm: md5WithRSAEncryption - * Issuer: C=US, ST=Some-State, L=Some-City, O=Some-Org - * Validity - * Not Before: Dec 8 03:27:34 2008 GMT - * Not After : Aug 25 03:27:34 2028 GMT - * Subject: C=US, ST=Some-State, L=Some-City, O=Some-Org, OU=SSL-Client, CN=localhost - * Subject Public Key Info: - * Public Key Algorithm: rsaEncryption - * RSA Public Key: (1024 bit) - * Modulus (1024 bit): - * 00:bb:f0:40:36:ac:26:54:4e:f4:a3:5a:00:2f:69: - * 21:6f:b9:7a:3a:93:ec:a2:f6:e1:8e:c7:63:d8:2f: - * 12:30:99:2e:b0:f2:8f:f8:27:2d:24:78:28:84:f7: - * 01:bf:8d:44:79:dd:3b:d2:55:f3:ce:3c:b2:5b:21: - * 7d:ef:fd:33:4a:b1:a3:ff:c6:c8:9b:b9:0f:7c:41: - * 35:97:f9:db:3a:05:60:05:15:af:59:17:92:a3:10: - * ad:16:1c:e4:07:53:af:a8:76:a2:56:2a:92:d3:f9: - * 28:e0:78:cf:5e:1f:48:ab:5c:19:dd:e1:67:43:ba: - * 75:8d:f5:82:ac:43:92:44:1b - * Exponent: 65537 (0x10001) - * X509v3 extensions: - * X509v3 Basic Constraints: - * CA:FALSE - * X509v3 Key Usage: - * Digital Signature, Non Repudiation, Key Encipherment - * X509v3 Subject Key Identifier: - * CD:BB:C8:85:AA:91:BD:FD:1D:BE:CD:67:7C:FF:B3:E9:4C:A8:22:E6 - * X509v3 Authority Key Identifier: - * keyid:FA:B9:51:BF:4C:E7:D9:86:98:33:F9:E7:CB:1E:F1:33:49:F7:A8:14 - * - * X509v3 Subject Alternative Name: critical - * IP Address:127.0.0.1 - * Signature Algorithm: md5WithRSAEncryption - * - * -----BEGIN CERTIFICATE----- - * MIICnzCCAgigAwIBAgIBBjANBgkqhkiG9w0BAQQFADBJMQswCQYDVQQGEwJVUzET - * MBEGA1UECBMKU29tZS1TdGF0ZTESMBAGA1UEBxMJU29tZS1DaXR5MREwDwYDVQQK - * EwhTb21lLU9yZzAeFw0wODEyMDgwMzI3MzRaFw0yODA4MjUwMzI3MzRaMHIxCzAJ - * BgNVBAYTAlVTMRMwEQYDVQQIEwpTb21lLVN0YXRlMRIwEAYDVQQHEwlTb21lLUNp - * dHkxETAPBgNVBAoTCFNvbWUtT3JnMRMwEQYDVQQLEwpTU0wtQ2xpZW50MRIwEAYD - * VQQDEwlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALvwQDas - * JlRO9KNaAC9pIW+5ejqT7KL24Y7HY9gvEjCZLrDyj/gnLSR4KIT3Ab+NRHndO9JV - * 8848slshfe/9M0qxo//GyJu5D3xBNZf52zoFYAUVr1kXkqMQrRYc5AdTr6h2olYq - * ktP5KOB4z14fSKtcGd3hZ0O6dY31gqxDkkQbAgMBAAGjbjBsMAkGA1UdEwQCMAAw - * CwYDVR0PBAQDAgXgMB0GA1UdDgQWBBTNu8iFqpG9/R2+zWd8/7PpTKgi5jAfBgNV - * HSMEGDAWgBT6uVG/TOfZhpgz+efLHvEzSfeoFDASBgNVHREBAf8ECDAGhwR/AAAB - * MA0GCSqGSIb3DQEBBAUAA4GBACjj9PS+W6XOF7toFMwMOv/AemZeBOpcEF1Ei1Hx - * HjvB6EOHkMY8tFm5OPzkiWiK3+s3awpSW0jWdzMYwrQJ3/klMsPDpI7PEuirqwHP - * i5Wyl/vk7jmfWVcBO9MVhPUo4BYl4vS9aj6JA5QbkbkB95LOgT/BowY0WmHeVsXC - * I9aw - * -----END CERTIFICATE----- - * - * - * - * Trusted CA certificate: - * Certificate: - * Data: - * Version: 3 (0x2) - * Serial Number: 0 (0x0) - * Signature Algorithm: md5WithRSAEncryption - * Issuer: C=US, ST=Some-State, L=Some-City, O=Some-Org - * Validity - * Not Before: Dec 8 02:43:36 2008 GMT - * Not After : Aug 25 02:43:36 2028 GMT - * Subject: C=US, ST=Some-State, L=Some-City, O=Some-Org - * Subject Public Key Info: - * Public Key Algorithm: rsaEncryption - * RSA Public Key: (1024 bit) - * Modulus (1024 bit): - * 00:cb:c4:38:20:07:be:88:a7:93:b0:a1:43:51:2d: - * d7:8e:85:af:54:dd:ad:a2:7b:23:5b:cf:99:13:53: - * 99:45:7d:ee:6d:ba:2d:bf:e3:ad:6e:3d:9f:1a:f9: - * 03:97:e0:17:55:ae:11:26:57:de:01:29:8e:05:3f: - * 21:f7:e7:36:e8:2e:37:d7:48:ac:53:d6:60:0e:c7: - * 50:6d:f6:c5:85:f7:8b:a6:c5:91:35:72:3c:94:ee: - * f1:17:f0:71:e3:ec:1b:ce:ca:4e:40:42:b0:6d:ee: - * 6a:0e:d6:e5:ad:3c:0f:c9:ba:82:4f:78:f8:89:97: - * 89:2a:95:12:4c:d8:09:2a:e9 - * Exponent: 65537 (0x10001) - * X509v3 extensions: - * X509v3 Subject Key Identifier: - * FA:B9:51:BF:4C:E7:D9:86:98:33:F9:E7:CB:1E:F1:33:49:F7:A8:14 - * X509v3 Authority Key Identifier: - * keyid:FA:B9:51:BF:4C:E7:D9:86:98:33:F9:E7:CB:1E:F1:33:49:F7:A8:14 - * DirName:/C=US/ST=Some-State/L=Some-City/O=Some-Org - * serial:00 - * - * X509v3 Basic Constraints: - * CA:TRUE - * Signature Algorithm: md5WithRSAEncryption - * - * -----BEGIN CERTIFICATE----- - * MIICrDCCAhWgAwIBAgIBADANBgkqhkiG9w0BAQQFADBJMQswCQYDVQQGEwJVUzET - * MBEGA1UECBMKU29tZS1TdGF0ZTESMBAGA1UEBxMJU29tZS1DaXR5MREwDwYDVQQK - * EwhTb21lLU9yZzAeFw0wODEyMDgwMjQzMzZaFw0yODA4MjUwMjQzMzZaMEkxCzAJ - * BgNVBAYTAlVTMRMwEQYDVQQIEwpTb21lLVN0YXRlMRIwEAYDVQQHEwlTb21lLUNp - * dHkxETAPBgNVBAoTCFNvbWUtT3JnMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB - * gQDLxDggB76Ip5OwoUNRLdeOha9U3a2ieyNbz5kTU5lFfe5tui2/461uPZ8a+QOX - * 4BdVrhEmV94BKY4FPyH35zboLjfXSKxT1mAOx1Bt9sWF94umxZE1cjyU7vEX8HHj - * 7BvOyk5AQrBt7moO1uWtPA/JuoJPePiJl4kqlRJM2Akq6QIDAQABo4GjMIGgMB0G - * A1UdDgQWBBT6uVG/TOfZhpgz+efLHvEzSfeoFDBxBgNVHSMEajBogBT6uVG/TOfZ - * hpgz+efLHvEzSfeoFKFNpEswSTELMAkGA1UEBhMCVVMxEzARBgNVBAgTClNvbWUt - * U3RhdGUxEjAQBgNVBAcTCVNvbWUtQ2l0eTERMA8GA1UEChMIU29tZS1PcmeCAQAw - * DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQBcIm534U123Hz+rtyYO5uA - * ofd81G6FnTfEAV8Kw9fGyyEbQZclBv34A9JsFKeMvU4OFIaixD7nLZ/NZ+IWbhmZ - * LovmJXyCkOufea73pNiZ+f/4/ScZaIlM/PRycQSqbFNd4j9Wott+08qxHPLpsf3P - * 6Mvf0r1PNTY2hwTJLJmKtg== - * -----END CERTIFICATE--- - */ +import jdk.test.lib.security.CertificateBuilder; +import jdk.test.lib.security.CertificateBuilder.KeyUsage; +import sun.security.x509.AuthorityKeyIdentifierExtension; +import sun.security.x509.GeneralName; +import sun.security.x509.GeneralNames; +import sun.security.x509.KeyIdentifier; +import sun.security.x509.SerialNumber; +import sun.security.x509.X500Name; + +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLServerSocket; +import javax.net.ssl.SSLServerSocketFactory; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.TrustManagerFactory; public class IPIdentities { - static Map cookies; - ServerSocket ss; /* * ============================================================= @@ -421,208 +83,14 @@ public class IPIdentities { */ static boolean separateServerThread = true; - /* - * Where do we find the keystores? - */ - static String trusedCertStr = - "-----BEGIN CERTIFICATE-----\n" + - "MIICrDCCAhWgAwIBAgIBADANBgkqhkiG9w0BAQQFADBJMQswCQYDVQQGEwJVUzET\n" + - "MBEGA1UECBMKU29tZS1TdGF0ZTESMBAGA1UEBxMJU29tZS1DaXR5MREwDwYDVQQK\n" + - "EwhTb21lLU9yZzAeFw0wODEyMDgwMjQzMzZaFw0yODA4MjUwMjQzMzZaMEkxCzAJ\n" + - "BgNVBAYTAlVTMRMwEQYDVQQIEwpTb21lLVN0YXRlMRIwEAYDVQQHEwlTb21lLUNp\n" + - "dHkxETAPBgNVBAoTCFNvbWUtT3JnMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB\n" + - "gQDLxDggB76Ip5OwoUNRLdeOha9U3a2ieyNbz5kTU5lFfe5tui2/461uPZ8a+QOX\n" + - "4BdVrhEmV94BKY4FPyH35zboLjfXSKxT1mAOx1Bt9sWF94umxZE1cjyU7vEX8HHj\n" + - "7BvOyk5AQrBt7moO1uWtPA/JuoJPePiJl4kqlRJM2Akq6QIDAQABo4GjMIGgMB0G\n" + - "A1UdDgQWBBT6uVG/TOfZhpgz+efLHvEzSfeoFDBxBgNVHSMEajBogBT6uVG/TOfZ\n" + - "hpgz+efLHvEzSfeoFKFNpEswSTELMAkGA1UEBhMCVVMxEzARBgNVBAgTClNvbWUt\n" + - "U3RhdGUxEjAQBgNVBAcTCVNvbWUtQ2l0eTERMA8GA1UEChMIU29tZS1PcmeCAQAw\n" + - "DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQBcIm534U123Hz+rtyYO5uA\n" + - "ofd81G6FnTfEAV8Kw9fGyyEbQZclBv34A9JsFKeMvU4OFIaixD7nLZ/NZ+IWbhmZ\n" + - "LovmJXyCkOufea73pNiZ+f/4/ScZaIlM/PRycQSqbFNd4j9Wott+08qxHPLpsf3P\n" + - "6Mvf0r1PNTY2hwTJLJmKtg==\n" + - "-----END CERTIFICATE-----"; - - static String serverCertStr = - "-----BEGIN CERTIFICATE-----\n" + - "MIICnzCCAgigAwIBAgIBBzANBgkqhkiG9w0BAQQFADBJMQswCQYDVQQGEwJVUzET\n" + - "MBEGA1UECBMKU29tZS1TdGF0ZTESMBAGA1UEBxMJU29tZS1DaXR5MREwDwYDVQQK\n" + - "EwhTb21lLU9yZzAeFw0wODEyMDgwMzI3NTdaFw0yODA4MjUwMzI3NTdaMHIxCzAJ\n" + - "BgNVBAYTAlVTMRMwEQYDVQQIEwpTb21lLVN0YXRlMRIwEAYDVQQHEwlTb21lLUNp\n" + - "dHkxETAPBgNVBAoTCFNvbWUtT3JnMRMwEQYDVQQLEwpTU0wtU2VydmVyMRIwEAYD\n" + - "VQQDEwlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKWsWxw3\n" + - "ot2ZiS2yebiP1Uil5xyEF41pnMasbfnyHR85GdrTch5u7ETMcKTcugAw9qBPPVR6\n" + - "YWrMV9AKf5UoGD+a2ZTyG8gkiH7+nQ89+1dTCLMgM9Q/F0cU0c3qCNgOdU6vvszS\n" + - "7K+peknfwtmsuCRAkKYDVirQMAVALE+r2XSJAgMBAAGjbjBsMAkGA1UdEwQCMAAw\n" + - "CwYDVR0PBAQDAgXgMB0GA1UdDgQWBBTtbtv0tVbI+xoGYT8PCLumBNgWVDAfBgNV\n" + - "HSMEGDAWgBT6uVG/TOfZhpgz+efLHvEzSfeoFDASBgNVHREBAf8ECDAGhwR/AAAB\n" + - "MA0GCSqGSIb3DQEBBAUAA4GBAFJjItCtCBZcjD69wdqfIbKmRFa6eJAjR6LcoDva\n" + - "cKC/sDOLelpspiZ66Zb0Xdv5qQ7QrfOXt3K8QqJKRMdZLF9WfUfy0gJDM32ub91h\n" + - "pu+TmcGPs+6RdrAQcuvU1ZDV9X8SMj7BtKaim4d5sqFw1npncKiA5xFn8vOYwdun\n" + - "nZif\n" + - "-----END CERTIFICATE-----"; - - static String clientCertStr = - "-----BEGIN CERTIFICATE-----\n" + - "MIICnzCCAgigAwIBAgIBBjANBgkqhkiG9w0BAQQFADBJMQswCQYDVQQGEwJVUzET\n" + - "MBEGA1UECBMKU29tZS1TdGF0ZTESMBAGA1UEBxMJU29tZS1DaXR5MREwDwYDVQQK\n" + - "EwhTb21lLU9yZzAeFw0wODEyMDgwMzI3MzRaFw0yODA4MjUwMzI3MzRaMHIxCzAJ\n" + - "BgNVBAYTAlVTMRMwEQYDVQQIEwpTb21lLVN0YXRlMRIwEAYDVQQHEwlTb21lLUNp\n" + - "dHkxETAPBgNVBAoTCFNvbWUtT3JnMRMwEQYDVQQLEwpTU0wtQ2xpZW50MRIwEAYD\n" + - "VQQDEwlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALvwQDas\n" + - "JlRO9KNaAC9pIW+5ejqT7KL24Y7HY9gvEjCZLrDyj/gnLSR4KIT3Ab+NRHndO9JV\n" + - "8848slshfe/9M0qxo//GyJu5D3xBNZf52zoFYAUVr1kXkqMQrRYc5AdTr6h2olYq\n" + - "ktP5KOB4z14fSKtcGd3hZ0O6dY31gqxDkkQbAgMBAAGjbjBsMAkGA1UdEwQCMAAw\n" + - "CwYDVR0PBAQDAgXgMB0GA1UdDgQWBBTNu8iFqpG9/R2+zWd8/7PpTKgi5jAfBgNV\n" + - "HSMEGDAWgBT6uVG/TOfZhpgz+efLHvEzSfeoFDASBgNVHREBAf8ECDAGhwR/AAAB\n" + - "MA0GCSqGSIb3DQEBBAUAA4GBACjj9PS+W6XOF7toFMwMOv/AemZeBOpcEF1Ei1Hx\n" + - "HjvB6EOHkMY8tFm5OPzkiWiK3+s3awpSW0jWdzMYwrQJ3/klMsPDpI7PEuirqwHP\n" + - "i5Wyl/vk7jmfWVcBO9MVhPUo4BYl4vS9aj6JA5QbkbkB95LOgT/BowY0WmHeVsXC\n" + - "I9aw\n" + - "-----END CERTIFICATE-----"; - - - static byte serverPrivateExponent[] = { - (byte)0x6e, (byte)0xa7, (byte)0x1b, (byte)0x83, - (byte)0x51, (byte)0x35, (byte)0x9a, (byte)0x44, - (byte)0x7d, (byte)0xf6, (byte)0xe3, (byte)0x89, - (byte)0xa0, (byte)0xd7, (byte)0x90, (byte)0x60, - (byte)0xa1, (byte)0x4e, (byte)0x27, (byte)0x21, - (byte)0xa2, (byte)0x89, (byte)0x74, (byte)0xcc, - (byte)0x9d, (byte)0x75, (byte)0x75, (byte)0x4e, - (byte)0xc7, (byte)0x82, (byte)0xe3, (byte)0xe3, - (byte)0xc3, (byte)0x7d, (byte)0x00, (byte)0x54, - (byte)0xec, (byte)0x36, (byte)0xb1, (byte)0xdf, - (byte)0x91, (byte)0x9c, (byte)0x7a, (byte)0xc0, - (byte)0x62, (byte)0x0a, (byte)0xd6, (byte)0xa9, - (byte)0x22, (byte)0x91, (byte)0x4a, (byte)0x29, - (byte)0x2e, (byte)0x43, (byte)0xfa, (byte)0x8c, - (byte)0xd8, (byte)0xe9, (byte)0xbe, (byte)0xd9, - (byte)0x4f, (byte)0xca, (byte)0x23, (byte)0xc6, - (byte)0xe4, (byte)0x3f, (byte)0xb8, (byte)0x72, - (byte)0xcf, (byte)0x02, (byte)0xfc, (byte)0xf4, - (byte)0x58, (byte)0x34, (byte)0x77, (byte)0x76, - (byte)0xce, (byte)0x22, (byte)0x44, (byte)0x5f, - (byte)0x2d, (byte)0xca, (byte)0xee, (byte)0xf5, - (byte)0x43, (byte)0x56, (byte)0x47, (byte)0x71, - (byte)0x0b, (byte)0x09, (byte)0x6b, (byte)0x5e, - (byte)0xf2, (byte)0xc8, (byte)0xee, (byte)0xd4, - (byte)0x6e, (byte)0x44, (byte)0x92, (byte)0x2a, - (byte)0x7f, (byte)0xcc, (byte)0xa7, (byte)0xd4, - (byte)0x5b, (byte)0xfb, (byte)0xf7, (byte)0x4a, - (byte)0xa9, (byte)0xfb, (byte)0x54, (byte)0x18, - (byte)0xd5, (byte)0xd5, (byte)0x14, (byte)0xba, - (byte)0xa0, (byte)0x1c, (byte)0x13, (byte)0xb3, - (byte)0x37, (byte)0x6b, (byte)0x37, (byte)0x59, - (byte)0xed, (byte)0xdb, (byte)0x6d, (byte)0xb1 - }; - - static byte serverModulus[] = { - (byte)0x00, - (byte)0xa5, (byte)0xac, (byte)0x5b, (byte)0x1c, - (byte)0x37, (byte)0xa2, (byte)0xdd, (byte)0x99, - (byte)0x89, (byte)0x2d, (byte)0xb2, (byte)0x79, - (byte)0xb8, (byte)0x8f, (byte)0xd5, (byte)0x48, - (byte)0xa5, (byte)0xe7, (byte)0x1c, (byte)0x84, - (byte)0x17, (byte)0x8d, (byte)0x69, (byte)0x9c, - (byte)0xc6, (byte)0xac, (byte)0x6d, (byte)0xf9, - (byte)0xf2, (byte)0x1d, (byte)0x1f, (byte)0x39, - (byte)0x19, (byte)0xda, (byte)0xd3, (byte)0x72, - (byte)0x1e, (byte)0x6e, (byte)0xec, (byte)0x44, - (byte)0xcc, (byte)0x70, (byte)0xa4, (byte)0xdc, - (byte)0xba, (byte)0x00, (byte)0x30, (byte)0xf6, - (byte)0xa0, (byte)0x4f, (byte)0x3d, (byte)0x54, - (byte)0x7a, (byte)0x61, (byte)0x6a, (byte)0xcc, - (byte)0x57, (byte)0xd0, (byte)0x0a, (byte)0x7f, - (byte)0x95, (byte)0x28, (byte)0x18, (byte)0x3f, - (byte)0x9a, (byte)0xd9, (byte)0x94, (byte)0xf2, - (byte)0x1b, (byte)0xc8, (byte)0x24, (byte)0x88, - (byte)0x7e, (byte)0xfe, (byte)0x9d, (byte)0x0f, - (byte)0x3d, (byte)0xfb, (byte)0x57, (byte)0x53, - (byte)0x08, (byte)0xb3, (byte)0x20, (byte)0x33, - (byte)0xd4, (byte)0x3f, (byte)0x17, (byte)0x47, - (byte)0x14, (byte)0xd1, (byte)0xcd, (byte)0xea, - (byte)0x08, (byte)0xd8, (byte)0x0e, (byte)0x75, - (byte)0x4e, (byte)0xaf, (byte)0xbe, (byte)0xcc, - (byte)0xd2, (byte)0xec, (byte)0xaf, (byte)0xa9, - (byte)0x7a, (byte)0x49, (byte)0xdf, (byte)0xc2, - (byte)0xd9, (byte)0xac, (byte)0xb8, (byte)0x24, - (byte)0x40, (byte)0x90, (byte)0xa6, (byte)0x03, - (byte)0x56, (byte)0x2a, (byte)0xd0, (byte)0x30, - (byte)0x05, (byte)0x40, (byte)0x2c, (byte)0x4f, - (byte)0xab, (byte)0xd9, (byte)0x74, (byte)0x89 - }; - - static byte clientPrivateExponent[] = { - (byte)0x11, (byte)0xb7, (byte)0x6a, (byte)0x36, - (byte)0x3d, (byte)0x30, (byte)0x37, (byte)0xce, - (byte)0x61, (byte)0x9d, (byte)0x6c, (byte)0x84, - (byte)0x8b, (byte)0xf3, (byte)0x9b, (byte)0x25, - (byte)0x4f, (byte)0x14, (byte)0xc8, (byte)0xa4, - (byte)0xdd, (byte)0x2f, (byte)0xd7, (byte)0x9a, - (byte)0x17, (byte)0xbd, (byte)0x90, (byte)0x19, - (byte)0xf7, (byte)0x05, (byte)0xfd, (byte)0xf2, - (byte)0xd2, (byte)0xc5, (byte)0xf7, (byte)0x77, - (byte)0xbe, (byte)0xea, (byte)0xe2, (byte)0x84, - (byte)0x87, (byte)0x97, (byte)0x3a, (byte)0x41, - (byte)0x96, (byte)0xb6, (byte)0x99, (byte)0xf8, - (byte)0x94, (byte)0x8c, (byte)0x58, (byte)0x71, - (byte)0x51, (byte)0x8c, (byte)0xf4, (byte)0x2a, - (byte)0x20, (byte)0x9e, (byte)0x1a, (byte)0xa0, - (byte)0x26, (byte)0x99, (byte)0x75, (byte)0xd6, - (byte)0x31, (byte)0x53, (byte)0x43, (byte)0x39, - (byte)0xf5, (byte)0x2a, (byte)0xa6, (byte)0x7e, - (byte)0x34, (byte)0x42, (byte)0x51, (byte)0x2a, - (byte)0x40, (byte)0x87, (byte)0x03, (byte)0x88, - (byte)0x43, (byte)0x69, (byte)0xb2, (byte)0x89, - (byte)0x6d, (byte)0x20, (byte)0xbd, (byte)0x7d, - (byte)0x71, (byte)0xef, (byte)0x47, (byte)0x0a, - (byte)0xdf, (byte)0x06, (byte)0xc1, (byte)0x69, - (byte)0x66, (byte)0xa8, (byte)0x22, (byte)0x37, - (byte)0x1a, (byte)0x77, (byte)0x1e, (byte)0xc7, - (byte)0x94, (byte)0x4e, (byte)0x2c, (byte)0x27, - (byte)0x69, (byte)0x45, (byte)0x5e, (byte)0xc8, - (byte)0xf8, (byte)0x0c, (byte)0xb7, (byte)0xf8, - (byte)0xc0, (byte)0x8f, (byte)0x99, (byte)0xc1, - (byte)0xe5, (byte)0x28, (byte)0x9b, (byte)0xf9, - (byte)0x4c, (byte)0x94, (byte)0xc6, (byte)0xb1 - }; - - static byte clientModulus[] = { - (byte)0x00, - (byte)0xbb, (byte)0xf0, (byte)0x40, (byte)0x36, - (byte)0xac, (byte)0x26, (byte)0x54, (byte)0x4e, - (byte)0xf4, (byte)0xa3, (byte)0x5a, (byte)0x00, - (byte)0x2f, (byte)0x69, (byte)0x21, (byte)0x6f, - (byte)0xb9, (byte)0x7a, (byte)0x3a, (byte)0x93, - (byte)0xec, (byte)0xa2, (byte)0xf6, (byte)0xe1, - (byte)0x8e, (byte)0xc7, (byte)0x63, (byte)0xd8, - (byte)0x2f, (byte)0x12, (byte)0x30, (byte)0x99, - (byte)0x2e, (byte)0xb0, (byte)0xf2, (byte)0x8f, - (byte)0xf8, (byte)0x27, (byte)0x2d, (byte)0x24, - (byte)0x78, (byte)0x28, (byte)0x84, (byte)0xf7, - (byte)0x01, (byte)0xbf, (byte)0x8d, (byte)0x44, - (byte)0x79, (byte)0xdd, (byte)0x3b, (byte)0xd2, - (byte)0x55, (byte)0xf3, (byte)0xce, (byte)0x3c, - (byte)0xb2, (byte)0x5b, (byte)0x21, (byte)0x7d, - (byte)0xef, (byte)0xfd, (byte)0x33, (byte)0x4a, - (byte)0xb1, (byte)0xa3, (byte)0xff, (byte)0xc6, - (byte)0xc8, (byte)0x9b, (byte)0xb9, (byte)0x0f, - (byte)0x7c, (byte)0x41, (byte)0x35, (byte)0x97, - (byte)0xf9, (byte)0xdb, (byte)0x3a, (byte)0x05, - (byte)0x60, (byte)0x05, (byte)0x15, (byte)0xaf, - (byte)0x59, (byte)0x17, (byte)0x92, (byte)0xa3, - (byte)0x10, (byte)0xad, (byte)0x16, (byte)0x1c, - (byte)0xe4, (byte)0x07, (byte)0x53, (byte)0xaf, - (byte)0xa8, (byte)0x76, (byte)0xa2, (byte)0x56, - (byte)0x2a, (byte)0x92, (byte)0xd3, (byte)0xf9, - (byte)0x28, (byte)0xe0, (byte)0x78, (byte)0xcf, - (byte)0x5e, (byte)0x1f, (byte)0x48, (byte)0xab, - (byte)0x5c, (byte)0x19, (byte)0xdd, (byte)0xe1, - (byte)0x67, (byte)0x43, (byte)0xba, (byte)0x75, - (byte)0x8d, (byte)0xf5, (byte)0x82, (byte)0xac, - (byte)0x43, (byte)0x92, (byte)0x44, (byte)0x1b - }; + static X509Certificate trustedCert; + + static X509Certificate serverCert; + + static X509Certificate clientCert; + + static KeyPair serverKeys; + static KeyPair clientKeys; static char passphrase[] = "passphrase".toCharArray(); @@ -639,7 +107,7 @@ public class IPIdentities { /* * Turn on SSL debugging? */ - static boolean debug = false; + static boolean debug = Boolean.getBoolean("test.debug"); private SSLServerSocket sslServerSocket = null; @@ -650,8 +118,8 @@ public class IPIdentities { * to avoid infinite hangs. */ void doServerSide() throws Exception { - SSLContext context = getSSLContext(trusedCertStr, serverCertStr, - serverModulus, serverPrivateExponent, passphrase); + SSLContext context = getSSLContext(trustedCert, serverCert, + serverKeys, passphrase); SSLServerSocketFactory sslssf = context.getServerSocketFactory(); // doClientSide() connects to the loopback address @@ -706,8 +174,8 @@ void doServerSide() throws Exception { void doClientSide() throws Exception { SSLContext reservedSSLContext = SSLContext.getDefault(); try { - SSLContext context = getSSLContext(trusedCertStr, clientCertStr, - clientModulus, clientPrivateExponent, passphrase); + SSLContext context = getSSLContext(trustedCert, clientCert, + clientKeys, passphrase); SSLContext.setDefault(context); /* @@ -755,6 +223,65 @@ void doClientSide() throws Exception { volatile Exception serverException = null; volatile Exception clientException = null; + private static X509Certificate createTrustedCert(KeyPair caKeys) throws Exception { + SecureRandom random = new SecureRandom(); + + KeyIdentifier kid = new KeyIdentifier(caKeys.getPublic()); + GeneralNames gns = new GeneralNames(); + GeneralName name = new GeneralName(new X500Name( + "O=Some-Org, L=Some-City, ST=Some-State, C=US")); + gns.add(name); + BigInteger serialNumber = BigInteger.valueOf(random.nextLong(1000000)+1); + return CertificateBuilder.newCertificateBuilder( + "O=Some-Org, L=Some-City, ST=Some-State, C=US", + caKeys.getPublic(), caKeys.getPublic()) + .setSerialNumber(serialNumber) + .addExtension(new AuthorityKeyIdentifierExtension(kid, gns, + new SerialNumber(serialNumber))) + .addBasicConstraintsExt(true, true, -1) + .setOneHourValidity() + .build(null, caKeys.getPrivate(), "MD5WithRSA"); + } + + private static void setupCertificates() throws Exception { + KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); + KeyPair caKeys = kpg.generateKeyPair(); + serverKeys = kpg.generateKeyPair(); + clientKeys = kpg.generateKeyPair(); + + trustedCert = createTrustedCert(caKeys); + if (debug) { + System.out.println("----------- Trusted Cert -----------"); + CertificateBuilder.printCertificate(trustedCert, System.out); + } + + serverCert = CertificateBuilder.newCertificateBuilder( + "O=Some-Org, L=Some-City, ST=Some-State, C=US", + serverKeys.getPublic(), caKeys.getPublic(), + KeyUsage.DIGITAL_SIGNATURE, KeyUsage.NONREPUDIATION, KeyUsage.KEY_ENCIPHERMENT) + .addBasicConstraintsExt(false, false, -1) + .addExtension(CertificateBuilder.createIPSubjectAltNameExt(true, "127.0.0.1")) + .setOneHourValidity() + .build(trustedCert, caKeys.getPrivate(), "MD5WithRSA"); + if (debug) { + System.out.println("----------- Server Cert -----------"); + CertificateBuilder.printCertificate(serverCert, System.out); + } + + clientCert = CertificateBuilder.newCertificateBuilder( + "CN=localhost, OU=SSL-Client, O=Some-Org, L=Some-City, ST=Some-State, C=US", + clientKeys.getPublic(), caKeys.getPublic(), + KeyUsage.DIGITAL_SIGNATURE, KeyUsage.NONREPUDIATION, KeyUsage.KEY_ENCIPHERMENT) + .addExtension(CertificateBuilder.createIPSubjectAltNameExt(true, "127.0.0.1")) + .addBasicConstraintsExt(false, false, -1) + .setOneHourValidity() + .build(trustedCert, caKeys.getPrivate(), "MD5WithRSA"); + if (debug) { + System.out.println("----------- Client Cert -----------"); + CertificateBuilder.printCertificate(clientCert, System.out); + } + } + public static void main(String args[]) throws Exception { // MD5 is used in this test case, don't disable MD5 algorithm. Security.setProperty("jdk.certpath.disabledAlgorithms", @@ -762,8 +289,11 @@ public static void main(String args[]) throws Exception { Security.setProperty("jdk.tls.disabledAlgorithms", "SSLv3, RC4, DH keySize < 768"); - if (debug) + if (debug) { System.setProperty("javax.net.debug", "all"); + } + + setupCertificates(); /* * Start the tests. @@ -855,45 +385,23 @@ public void run() { } // get the ssl context - private static SSLContext getSSLContext(String trusedCertStr, - String keyCertStr, byte[] modulus, - byte[] privateExponent, char[] passphrase) throws Exception { - - // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - - ByteArrayInputStream is = - new ByteArrayInputStream(trusedCertStr.getBytes()); - Certificate trusedCert = cf.generateCertificate(is); - is.close(); + private static SSLContext getSSLContext(X509Certificate trustedCert, + X509Certificate keyCert, KeyPair key, char[] passphrase) throws Exception { // create a key store - KeyStore ks = KeyStore.getInstance("JKS"); + KeyStore ks = KeyStore.getInstance("PKCS12"); ks.load(null, null); // import the trused cert - ks.setCertificateEntry("RSA Export Signer", trusedCert); - - if (keyCertStr != null) { - // generate the private key. - RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec( - new BigInteger(modulus), - new BigInteger(privateExponent)); - KeyFactory kf = KeyFactory.getInstance("RSA"); - RSAPrivateKey priKey = - (RSAPrivateKey)kf.generatePrivate(priKeySpec); - - // generate certificate chain - is = new ByteArrayInputStream(keyCertStr.getBytes()); - Certificate keyCert = cf.generateCertificate(is); - is.close(); + ks.setCertificateEntry("RSA Export Signer", trustedCert); + if (keyCert != null) { Certificate[] chain = new Certificate[2]; chain[0] = keyCert; - chain[1] = trusedCert; + chain[1] = trustedCert; // import the key entry. - ks.setKeyEntry("Whatever", priKey, passphrase, chain); + ks.setKeyEntry("Whatever", key.getPrivate(), passphrase, chain); } // create SSL context @@ -902,7 +410,7 @@ private static SSLContext getSSLContext(String trusedCertStr, SSLContext ctx = SSLContext.getInstance("TLSv1.2"); - if (keyCertStr != null) { + if (keyCert != null) { KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); kmf.init(ks, passphrase); diff --git a/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/TEST.properties b/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/TEST.properties new file mode 100644 index 000000000000..e1ed216f21db --- /dev/null +++ b/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/TEST.properties @@ -0,0 +1,3 @@ +modules = \ + java.base/sun.security.util \ + java.base/sun.security.x509 diff --git a/test/lib/jdk/test/lib/security/CertificateBuilder.java b/test/lib/jdk/test/lib/security/CertificateBuilder.java index 951b6cb9d2e3..a1078185560d 100644 --- a/test/lib/jdk/test/lib/security/CertificateBuilder.java +++ b/test/lib/jdk/test/lib/security/CertificateBuilder.java @@ -24,12 +24,12 @@ package jdk.test.lib.security; import java.io.*; +import java.security.cert.*; +import java.security.cert.Extension; import java.util.*; import java.security.*; -import java.security.cert.X509Certificate; -import java.security.cert.CertificateException; -import java.security.cert.CertificateFactory; -import java.security.cert.Extension; +import java.time.temporal.ChronoUnit; +import java.time.Instant; import javax.security.auth.x500.X500Principal; import java.math.BigInteger; @@ -41,6 +41,7 @@ import sun.security.x509.AlgorithmId; import sun.security.x509.AuthorityInfoAccessExtension; import sun.security.x509.AuthorityKeyIdentifierExtension; +import sun.security.x509.IPAddressName; import sun.security.x509.SubjectKeyIdentifierExtension; import sun.security.x509.BasicConstraintsExtension; import sun.security.x509.ExtendedKeyUsageExtension; @@ -54,6 +55,7 @@ import sun.security.x509.KeyIdentifier; import sun.security.x509.X500Name; + /** * Helper class that builds and signs X.509 certificates. * @@ -98,6 +100,89 @@ public class CertificateBuilder { private byte[] tbsCertBytes; private byte[] signatureBytes; + public enum KeyUsage { + DIGITAL_SIGNATURE, + NONREPUDIATION, + KEY_ENCIPHERMENT, + DATA_ENCIPHERMENT, + KEY_AGREEMENT, + KEY_CERT_SIGN, + CRL_SIGN, + ENCIPHER_ONLY, + DECIPHER_ONLY; + } + + /** + * Create a new CertificateBuilder instance. This method sets the subject name, + * public key, authority key id, and serial number. + * + * @param subjectName entity associated with the public key + * @param publicKey the entity's public key + * @param caKey public key of certificate signer + * @param keyUsages list of key uses + * @return + * @throws CertificateException + * @throws IOException + */ + public static CertificateBuilder newCertificateBuilder(String subjectName, + PublicKey publicKey, PublicKey caKey, KeyUsage... keyUsages) + throws CertificateException, IOException { + SecureRandom random = new SecureRandom(); + + boolean [] keyUsage = new boolean[KeyUsage.values().length]; + for (KeyUsage ku : keyUsages) { + keyUsage[ku.ordinal()] = true; + } + + CertificateBuilder builder = new CertificateBuilder() + .setSubjectName(subjectName) + .setPublicKey(publicKey) + .setSerialNumber(BigInteger.valueOf(random.nextLong(1000000)+1)) + .addSubjectKeyIdExt(publicKey) + .addAuthorityKeyIdExt(caKey); + if (keyUsages.length != 0) { + builder.addKeyUsageExt(keyUsage); + } + return builder; + } + + /** + * Create a Subject Alternative Name extension for the given DNS name + * @param critical Sets the extension to critical or non-critical + * @param dnsName DNS name to use in the extension + * @throws IOException + */ + public static SubjectAlternativeNameExtension createDNSSubjectAltNameExt( + boolean critical, String dnsName) throws IOException { + GeneralNames gns = new GeneralNames(); + gns.add(new GeneralName(new DNSName(dnsName))); + return new SubjectAlternativeNameExtension(critical, gns); + } + + /** + * Create a Subject Alternative Name extension for the given IP address + * @param critical Sets the extension to critical or non-critical + * @param ipAddress IP address to use in the extension + * @throws IOException + */ + public static SubjectAlternativeNameExtension createIPSubjectAltNameExt( + boolean critical, String ipAddress) throws IOException { + GeneralNames gns = new GeneralNames(); + gns.add(new GeneralName(new IPAddressName(ipAddress))); + return new SubjectAlternativeNameExtension(critical, gns); + } + + public static void printCertificate(X509Certificate certificate, PrintStream ps) { + try { + Base64.Encoder encoder = Base64.getEncoder(); + ps.println("-----BEGIN CERTIFICATE-----"); + ps.println(encoder.encodeToString(certificate.getEncoded())); + ps.println("-----END CERTIFICATE-----"); + } catch (CertificateEncodingException exc) { + exc.printStackTrace(ps); + } + } + /** * Default constructor for a {@code CertificateBuilder} object. * @@ -191,6 +276,11 @@ public CertificateBuilder setValidity(Date nbDate, Date naDate) { return setNotBefore(nbDate).setNotAfter(naDate); } + public CertificateBuilder setOneHourValidity() { + return setNotBefore(Date.from(Instant.now().minus(5, ChronoUnit.MINUTES))) + .setNotAfter(Date.from(Instant.now().plus(1, ChronoUnit.HOURS))); + } + /** * Set the serial number on the certificate. * From 6dd5234851ebc936d65a0213ad7f36f69d995491 Mon Sep 17 00:00:00 2001 From: Justin King Date: Fri, 31 Oct 2025 13:55:26 +0000 Subject: [PATCH 264/323] 8369506: Bytecode rewriting causes Java heap corruption on AArch64 Reviewed-by: mdoerr Backport-of: 18fd04770294e27011bd576b5ea5fe43fa03e5e3 --- src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp | 12 ++++++++++++ src/hotspot/cpu/aarch64/interp_masm_aarch64.hpp | 2 ++ .../cpu/aarch64/templateTable_aarch64.cpp | 17 +++++++++++++++-- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp b/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp index 9e69c913a7b5..a1a76fa5eeca 100644 --- a/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp @@ -1892,3 +1892,15 @@ void InterpreterMacroAssembler::load_resolved_indy_entry(Register cache, Registe add(cache, cache, Array::base_offset_in_bytes()); lea(cache, Address(cache, index)); } + +#ifdef ASSERT +void InterpreterMacroAssembler::verify_field_offset(Register reg) { + // Verify the field offset is not in the header, implicitly checks for 0 + Label L; + subs(zr, reg, static_cast(sizeof(markWord) + (UseCompressedClassPointers ? sizeof(narrowKlass) : sizeof(Klass*)))); + br(Assembler::GE, L); + stop("bad field offset"); + bind(L); +} +#endif + diff --git a/src/hotspot/cpu/aarch64/interp_masm_aarch64.hpp b/src/hotspot/cpu/aarch64/interp_masm_aarch64.hpp index 019eb2355817..401e107bcd53 100644 --- a/src/hotspot/cpu/aarch64/interp_masm_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/interp_masm_aarch64.hpp @@ -321,6 +321,8 @@ class InterpreterMacroAssembler: public MacroAssembler { } void load_resolved_indy_entry(Register cache, Register index); + + void verify_field_offset(Register reg) NOT_DEBUG_RETURN; }; #endif // CPU_AARCH64_INTERP_MASM_AARCH64_HPP diff --git a/src/hotspot/cpu/aarch64/templateTable_aarch64.cpp b/src/hotspot/cpu/aarch64/templateTable_aarch64.cpp index 240190ab692a..b034fc314824 100644 --- a/src/hotspot/cpu/aarch64/templateTable_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/templateTable_aarch64.cpp @@ -166,6 +166,7 @@ void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg, Register temp_reg, bool load_bc_into_bc_reg/*=true*/, int byte_no) { + assert_different_registers(bc_reg, temp_reg); if (!RewriteBytecodes) return; Label L_patch_done; @@ -223,8 +224,12 @@ void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg, __ bind(L_okay); #endif - // patch bytecode - __ strb(bc_reg, at_bcp(0)); + // Patch bytecode with release store to coordinate with ConstantPoolCacheEntry loads + // in fast bytecode codelets. The fast bytecode codelets have a memory barrier that gains + // the needed ordering, together with control dependency on entering the fast codelet + // itself. + __ lea(temp_reg, at_bcp(0)); + __ stlrb(bc_reg, temp_reg); __ bind(L_patch_done); } @@ -2982,6 +2987,7 @@ void TemplateTable::fast_storefield(TosState state) // replace index with field offset from cache entry __ ldr(r1, Address(r2, in_bytes(base + ConstantPoolCacheEntry::f2_offset()))); + __ verify_field_offset(r1); { Label notVolatile; @@ -3075,6 +3081,8 @@ void TemplateTable::fast_accessfield(TosState state) __ ldr(r1, Address(r2, in_bytes(ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::f2_offset()))); + __ verify_field_offset(r1); + __ ldrw(r3, Address(r2, in_bytes(ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::flags_offset()))); @@ -3142,8 +3150,13 @@ void TemplateTable::fast_xaccess(TosState state) __ ldr(r0, aaddress(0)); // access constant pool cache __ get_cache_and_index_at_bcp(r2, r3, 2); + + // Must prevent reordering of the following cp cache loads with bytecode load + __ membar(MacroAssembler::LoadLoad); + __ ldr(r1, Address(r2, in_bytes(ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::f2_offset()))); + __ verify_field_offset(r1); // 8179954: We need to make sure that the code generated for // volatile accesses forms a sequentially-consistent set of From 90ccc6c8501fff0ebd47f0767cb7f00d8536ca1f Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Fri, 31 Oct 2025 15:18:26 +0000 Subject: [PATCH 265/323] 8346753: Test javax/swing/JMenuItem/RightLeftOrientation/RightLeftOrientation.java fails on Windows Server 2025 x64 because the icons of RBMenuItem and CBMenuItem are not visible in Nimbus LookAndFeel Backport-of: 5205eae6ff28c4587ec4cb659ddffce84f00441b --- .../swing/JMenuItem/RightLeftOrientation.java | 95 ++++++++++++------- 1 file changed, 59 insertions(+), 36 deletions(-) diff --git a/test/jdk/javax/swing/JMenuItem/RightLeftOrientation.java b/test/jdk/javax/swing/JMenuItem/RightLeftOrientation.java index 6c7185b547ac..7080f03ad2a6 100644 --- a/test/jdk/javax/swing/JMenuItem/RightLeftOrientation.java +++ b/test/jdk/javax/swing/JMenuItem/RightLeftOrientation.java @@ -22,18 +22,36 @@ */ /* - * @test + * @test id=metal * @bug 4211052 * @requires (os.family == "windows") - * @summary - * This test checks if menu items lay out correctly when their + * @summary Verifies if menu items lay out correctly when their * ComponentOrientation property is set to RIGHT_TO_LEFT. - * The tester is asked to compare left-to-right and - * right-to-left menus and judge whether they are mirror images of each - * other. * @library /java/awt/regtesthelpers * @build PassFailJFrame - * @run main/manual RightLeftOrientation + * @run main/manual RightLeftOrientation metal + */ + +/* + * @test id=motif + * @bug 4211052 + * @requires (os.family == "windows") + * @summary Verifies if menu items lay out correctly when their + * ComponentOrientation property is set to RIGHT_TO_LEFT. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual RightLeftOrientation motif + */ + +/* + * @test id=windows + * @bug 4211052 + * @requires (os.family == "windows") + * @summary Verifies if menu items lay out correctly when their + * ComponentOrientation property is set to RIGHT_TO_LEFT. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual RightLeftOrientation windows */ import java.awt.Color; @@ -52,29 +70,47 @@ import javax.swing.JMenuItem; import javax.swing.JRadioButtonMenuItem; import javax.swing.KeyStroke; -import javax.swing.LookAndFeel; import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; import javax.swing.UIManager; public class RightLeftOrientation { private static final String INSTRUCTIONS = """ - A menu bar is shown containing a menu for each look and feel. - A disabled menu means that the look and feel is not available for - testing in this environment. - Every effort should be made to run this test - in an environment that covers all look and feels. + A menu bar is shown with a menu. - Each menu is divided into two halves. The upper half is oriented + The menu is divided into two halves. The upper half is oriented left-to-right and the lower half is oriented right-to-left. - For each menu, ensure that the lower half mirrors the upper half. + Ensure that the lower half mirrors the upper half. Note that when checking the positioning of the sub-menus, it helps to position the frame away from the screen edges."""; public static void main(String[] args) throws Exception { + if (args.length < 1) { + throw new IllegalArgumentException("Look-and-Feel keyword is required"); + } + + final String lafClassName; + switch (args[0]) { + case "metal" -> lafClassName = UIManager.getCrossPlatformLookAndFeelClassName(); + case "motif" -> lafClassName = "com.sun.java.swing.plaf.motif.MotifLookAndFeel"; + case "windows" -> lafClassName = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"; + default -> throw new IllegalArgumentException( + "Unsupported Look-and-Feel keyword for this test: " + args[0]); + } + + SwingUtilities.invokeAndWait(() -> { + try { + UIManager.setLookAndFeel(lafClassName); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + + System.out.println("Test for LookAndFeel " + lafClassName); + PassFailJFrame.builder() - .title("RightLeftOrientation Instructions") .instructions(INSTRUCTIONS) .columns(35) .testUI(RightLeftOrientation::createTestUI) @@ -86,32 +122,19 @@ private static JFrame createTestUI() { JFrame frame = new JFrame("RightLeftOrientation"); JMenuBar menuBar = new JMenuBar(); - menuBar.add(createMenu("javax.swing.plaf.metal.MetalLookAndFeel", - "Metal")); - menuBar.add(createMenu("com.sun.java.swing.plaf.motif.MotifLookAndFeel", - "Motif")); - menuBar.add(createMenu("com.sun.java.swing.plaf.windows.WindowsLookAndFeel", - "Windows")); + menuBar.add(createMenu()); frame.setJMenuBar(menuBar); - frame.pack(); + frame.setSize(250, 70); return frame; } - static JMenu createMenu(String laf, String name) { - JMenu menu = new JMenu(name); - try { - LookAndFeel save = UIManager.getLookAndFeel(); - UIManager.setLookAndFeel(laf); - addMenuItems(menu, ComponentOrientation.LEFT_TO_RIGHT); - menu.addSeparator(); - addMenuItems(menu, ComponentOrientation.RIGHT_TO_LEFT); - UIManager.setLookAndFeel(save); - } catch (Exception e) { - menu = new JMenu(name); - menu.setEnabled(false); - } + static JMenu createMenu() { + JMenu menu = new JMenu(UIManager.getLookAndFeel().getID()); + addMenuItems(menu, ComponentOrientation.LEFT_TO_RIGHT); + menu.addSeparator(); + addMenuItems(menu, ComponentOrientation.RIGHT_TO_LEFT); return menu; } From 6c85353ca3eb51cc5dd35bd3beac574c401471c0 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Fri, 31 Oct 2025 16:41:49 +0000 Subject: [PATCH 266/323] 8353832: Opensource FontClass, Selection and Icon tests Backport-of: 8c6b611f35af22af5b6c3eb663b30985857c1da3 --- .../FontClass/FontTransformAttributeTest.java | 84 +++++++++++++ .../awt/FontClass/FontUnderscoreTest.java | 77 ++++++++++++ .../jdk/java/awt/Icon/ChildFrameIconTest.java | 76 ++++++++++++ .../jdk/java/awt/Selection/TestClipboard.java | 113 ++++++++++++++++++ 4 files changed, 350 insertions(+) create mode 100644 test/jdk/java/awt/FontClass/FontTransformAttributeTest.java create mode 100644 test/jdk/java/awt/FontClass/FontUnderscoreTest.java create mode 100644 test/jdk/java/awt/Icon/ChildFrameIconTest.java create mode 100644 test/jdk/java/awt/Selection/TestClipboard.java diff --git a/test/jdk/java/awt/FontClass/FontTransformAttributeTest.java b/test/jdk/java/awt/FontClass/FontTransformAttributeTest.java new file mode 100644 index 000000000000..7bbf5d11d28b --- /dev/null +++ b/test/jdk/java/awt/FontClass/FontTransformAttributeTest.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2002, 2025, 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.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.font.TextAttribute; +import java.awt.font.TransformAttribute; +import java.awt.geom.AffineTransform; +import java.text.AttributedCharacterIterator; +import java.text.AttributedString; + +import javax.swing.JPanel; + +/* + * @test + * @bug 4650042 + * @summary Draw text using a transform to simulate superscript, it should look like a superscript + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual FontTransformAttributeTest + */ + +public class FontTransformAttributeTest extends JPanel { + AttributedCharacterIterator iter; + + public static void main(String[] args) throws Exception { + final String INSTRUCTIONS = """ + This test should display a string ending with the superscripted number '11'. + Pass the test if you see the superscript."""; + + PassFailJFrame.builder() + .title("FontTransformAttributeTest Instruction") + .instructions(INSTRUCTIONS) + .columns(35) + .splitUI(FontTransformAttributeTest::new) + .build() + .awaitAndCheck(); + } + + FontTransformAttributeTest() { + AffineTransform superTransform = AffineTransform.getScaleInstance(0.65, 0.65); + superTransform.translate(0, -7); + TransformAttribute superAttribute = new TransformAttribute(superTransform); + String s = "a big number 7 11"; + AttributedString as = new AttributedString(s); + as.addAttribute(TextAttribute.TRANSFORM, superAttribute, 15, 17); + iter = as.getIterator(); + setBackground(Color.WHITE); + } + + @Override + public Dimension getPreferredSize() { + return new Dimension(200, 100); + } + + @Override + public void paint(Graphics g) { + Graphics2D g2 = (Graphics2D) g; + Dimension d = getSize(); + g2.drawString(iter, 20, d.height / 2 + 8); + } +} diff --git a/test/jdk/java/awt/FontClass/FontUnderscoreTest.java b/test/jdk/java/awt/FontClass/FontUnderscoreTest.java new file mode 100644 index 000000000000..101a0b490886 --- /dev/null +++ b/test/jdk/java/awt/FontClass/FontUnderscoreTest.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 1999, 2025, 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.awt.Dimension; +import java.awt.Font; +import java.awt.Graphics; + +import javax.swing.JPanel; + +/* + * @test + * @bug 4248579 + * @summary Make sure the underscore glyph appears in the different strings + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual FontUnderscoreTest + */ + +public class FontUnderscoreTest extends JPanel { + public static void main(String[] args) throws Exception { + final String INSTRUCTIONS = """ + Make sure all 8 underscore characters appear in each + of the 3 strings. + + Press PASS if all 8 are there, else FAIL."""; + + PassFailJFrame.builder() + .title("FontUnderscoreTest Instruction") + .instructions(INSTRUCTIONS) + .columns(35) + .splitUI(FontUnderscoreTest::new) + .build() + .awaitAndCheck(); + } + + @Override + public Dimension getPreferredSize() { + return new Dimension(550, 230); + } + + @Override + public void paint(Graphics g) { + Font f = new Font(Font.SANS_SERIF, Font.PLAIN, 24); + g.setFont(f); + g.drawString ("8 underscore characters appear in each string", 5, 200); + + g.drawString("J_A_V_A_2_j_a_v_a", 25, 50); + + f = new Font(Font.SERIF, Font.PLAIN, 24); + g.setFont(f); + g.drawString("J_A_V_A_2_j_a_v_a", 25, 100); + + f = new Font(Font.MONOSPACED, Font.PLAIN, 24); + g.setFont(f); + g.drawString("J_A_V_A_2_j_a_v_a", 25, 150); + } +} diff --git a/test/jdk/java/awt/Icon/ChildFrameIconTest.java b/test/jdk/java/awt/Icon/ChildFrameIconTest.java new file mode 100644 index 000000000000..6d83fa95acba --- /dev/null +++ b/test/jdk/java/awt/Icon/ChildFrameIconTest.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2000, 2025, 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.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JOptionPane; + +/* + * @test + * @bug 4284610 + * @summary Tests that a child of the non-resizable dialog acquires valid icon. + * @requires (os.family == "windows") + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual ChildFrameIconTest + */ + +public class ChildFrameIconTest { + public static void main(String[] args) throws Exception { + final String INSTRUCTIONS = """ + Press "Show Dialog" button to open a dialog with this message: + Do you see a coffee cup icon in the upper left corner ? + + Look at the icon in the upper left corner of the message dialog. + + Press Pass if you see default coffee cup icon else press Fail."""; + + PassFailJFrame.builder() + .title("ChildFrameIconTest Instruction") + .instructions(INSTRUCTIONS) + .columns(35) + .testUI(ChildFrameIconTest::createUI) + .build() + .awaitAndCheck(); + } + + private static JFrame createUI() { + JFrame f = new JFrame("ChildFrameIconTest UI"); + JButton b = new JButton("Show Dialog"); + b.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + String msg = "Do you see a coffee cup icon in the upper left corner ?"; + JDialog dlg = new JDialog(f, "Non-resizable JDialog", false); + dlg.setResizable(false); + JOptionPane.showMessageDialog(dlg, msg); + } + }); + f.add(b); + f.setSize(250, 100); + return f; + } +} diff --git a/test/jdk/java/awt/Selection/TestClipboard.java b/test/jdk/java/awt/Selection/TestClipboard.java new file mode 100644 index 000000000000..ed65d55489c3 --- /dev/null +++ b/test/jdk/java/awt/Selection/TestClipboard.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 1999, 2025, 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.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import java.io.Serializable; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JOptionPane; + +/* + * @test + * @bug 4139552 + * @summary Checks to see if 'isDataFlavorSupported' throws exception. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual TestClipboard + */ + +public class TestClipboard { + + public static void main(String[] args) throws Exception { + final String INSTRUCTIONS = """ + This test has two steps: + + 1. you need to place some text onto the system clipboard, + for example, + on Windows, you could highlight some text in notepad, and do a Ctrl-C + or select menu Edit->Copy; + + on Linux or Mac, you can do the same with any Terminal or Console or + Text application. + + 2. After you copy to system clipboard, press "Click Me" button. + + Test will fail if any exception is thrown. + + Press Pass if you see "Test Passed" in log area."""; + + PassFailJFrame.builder() + .title("TestClipboard Instruction") + .instructions(INSTRUCTIONS) + .columns(45) + .testUI(TestClipboard::createUI) + .logArea(4) + .build() + .awaitAndCheck(); + } + + private static JFrame createUI() { + JFrame f = new JFrame("ChildFrameIconTest UI"); + JButton b = new JButton("Click Me"); + b.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + try { + new MyTest(); + } catch (Exception ex) { + throw new RuntimeException("Exception Thrown : " + ex); + } + } + }); + f.add(b); + f.setSize(200, 100); + return f; + } + + static class MyFlavor extends Object implements Serializable { + // Stub class needed in order to define the data flavor type + } + + static class MyTest { + public MyTest() throws Exception { + // Create an arbitrary dataflavor + DataFlavor myFlavor = new DataFlavor(MyFlavor.class, "TestClipboard"); + // Get the system clipboard + Clipboard theClipboard = + Toolkit.getDefaultToolkit().getSystemClipboard(); + // Get the current contents of the clipboard + Transferable theTransfer = theClipboard.getContents(this); + + // See if the flavor is supported. This may result in a null + // pointer exception. + theTransfer.isDataFlavorSupported(myFlavor); + PassFailJFrame.log("Test Passed"); + } + } +} From c1feecb18cea70c36858ac6d23c200a57e8e54d7 Mon Sep 17 00:00:00 2001 From: Feilong Jiang Date: Sat, 1 Nov 2025 12:34:50 +0000 Subject: [PATCH 267/323] 8369947: Bytecode rewriting causes Java heap corruption on RISC-V Reviewed-by: fyang Backport-of: 462519935827e25475f2fb35746ad81a14bc5da7 --- src/hotspot/cpu/riscv/interp_masm_riscv.cpp | 9 +++++++++ src/hotspot/cpu/riscv/interp_masm_riscv.hpp | 2 ++ src/hotspot/cpu/riscv/templateTable_riscv.cpp | 15 ++++++++++++++- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/hotspot/cpu/riscv/interp_masm_riscv.cpp b/src/hotspot/cpu/riscv/interp_masm_riscv.cpp index 458c5689ce1a..1d6a72110f8c 100644 --- a/src/hotspot/cpu/riscv/interp_masm_riscv.cpp +++ b/src/hotspot/cpu/riscv/interp_masm_riscv.cpp @@ -2011,6 +2011,15 @@ void InterpreterMacroAssembler::get_method_counters(Register method, } #ifdef ASSERT +void InterpreterMacroAssembler::verify_field_offset(Register reg) { + // Verify the field offset is not in the header, implicitly checks for 0 + Label L; + mv(t0, static_cast(sizeof(markWord) + (UseCompressedClassPointers ? sizeof(narrowKlass) : sizeof(Klass*)))); + bge(reg, t0, L); + stop("bad field offset"); + bind(L); +} + void InterpreterMacroAssembler::verify_access_flags(Register access_flags, uint32_t flag, const char* msg, bool stop_by_hit) { Label L; diff --git a/src/hotspot/cpu/riscv/interp_masm_riscv.hpp b/src/hotspot/cpu/riscv/interp_masm_riscv.hpp index fbccf2401be6..6ff480019a6d 100644 --- a/src/hotspot/cpu/riscv/interp_masm_riscv.hpp +++ b/src/hotspot/cpu/riscv/interp_masm_riscv.hpp @@ -301,6 +301,8 @@ class InterpreterMacroAssembler: public MacroAssembler { void load_resolved_indy_entry(Register cache, Register index); + void verify_field_offset(Register reg) NOT_DEBUG_RETURN; + #ifdef ASSERT void verify_access_flags(Register access_flags, uint32_t flag, const char* msg, bool stop_by_hit = true); diff --git a/src/hotspot/cpu/riscv/templateTable_riscv.cpp b/src/hotspot/cpu/riscv/templateTable_riscv.cpp index a6002b718ff3..a9e52d8dbff1 100644 --- a/src/hotspot/cpu/riscv/templateTable_riscv.cpp +++ b/src/hotspot/cpu/riscv/templateTable_riscv.cpp @@ -131,6 +131,7 @@ Address TemplateTable::at_bcp(int offset) { void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg, Register temp_reg, bool load_bc_into_bc_reg /*=true*/, int byte_no) { + assert_different_registers(bc_reg, temp_reg); if (!RewriteBytecodes) { return; } Label L_patch_done; @@ -186,7 +187,11 @@ void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg, __ bind(L_okay); #endif - // patch bytecode + // Patch bytecode with release store to coordinate with ResolvedFieldEntry loads + // in fast bytecode codelets. load_field_entry has a memory barrier that gains + // the needed ordering, together with control dependency on entering the fast codelet + // itself. + __ membar(MacroAssembler::LoadStore | MacroAssembler::StoreStore); __ sb(bc_reg, at_bcp(0)); __ bind(L_patch_done); } @@ -2908,6 +2913,7 @@ void TemplateTable::fast_storefield(TosState state) { // replace index with field offset from cache entry __ ld(x11, Address(x12, in_bytes(base + ConstantPoolCacheEntry::f2_offset()))); + __ verify_field_offset(x11); { Label notVolatile; @@ -3003,6 +3009,8 @@ void TemplateTable::fast_accessfield(TosState state) { __ ld(x11, Address(x12, in_bytes(ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::f2_offset()))); + __ verify_field_offset(x11); + __ lwu(x13, Address(x12, in_bytes(ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::flags_offset()))); @@ -3059,8 +3067,13 @@ void TemplateTable::fast_xaccess(TosState state) { __ ld(x10, aaddress(0)); // access constant pool cache __ get_cache_and_index_at_bcp(x12, x13, 2); + + // Must prevent reordering of the following cp cache loads with bytecode load + __ membar(MacroAssembler::LoadLoad); + __ ld(x11, Address(x12, in_bytes(ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::f2_offset()))); + __ verify_field_offset(x11); // make sure exception is reported in correct bcp range (getfield is // next instruction) From ec566c71f87bf57bfe10a75d2b0b757736d47f5a Mon Sep 17 00:00:00 2001 From: Vladimir Petko Date: Tue, 4 Nov 2025 19:18:34 +0000 Subject: [PATCH 268/323] 8369450: [Ubuntu 25.10] openjdk fails to build due to rust-coreutils date Backport-of: b73228b51c1b1c59c8cd8ee7b14522edc12d564a --- make/autoconf/basic_tools.m4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/make/autoconf/basic_tools.m4 b/make/autoconf/basic_tools.m4 index 92a4582ecddc..3ad7d778be15 100644 --- a/make/autoconf/basic_tools.m4 +++ b/make/autoconf/basic_tools.m4 @@ -378,7 +378,7 @@ AC_DEFUN_ONCE([BASIC_SETUP_COMPLEX_TOOLS], # Check if it's a GNU date compatible version AC_MSG_CHECKING([if date is a GNU compatible version]) - check_date=`$DATE --version 2>&1 | $GREP "GNU\|BusyBox"` + check_date=`$DATE --version 2>&1 | $GREP "GNU\|BusyBox\|uutils"` if test "x$check_date" != x; then AC_MSG_RESULT([yes]) IS_GNU_DATE=yes From 466ff7ae69bf0cb299f6c46ef642737a4489c767 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Tue, 4 Nov 2025 19:50:24 +0000 Subject: [PATCH 269/323] 8353007: Open some JComboBox bugs 2 Backport-of: 1889dacb1981d3d15174bc5a201e683a6cdab725 --- .../jdk/javax/swing/JComboBox/bug4185024.java | 109 +++++++++++++++ .../jdk/javax/swing/JComboBox/bug4201964.java | 77 +++++++++++ .../jdk/javax/swing/JComboBox/bug4249732.java | 72 ++++++++++ .../jdk/javax/swing/JComboBox/bug4368848.java | 129 ++++++++++++++++++ 4 files changed, 387 insertions(+) create mode 100644 test/jdk/javax/swing/JComboBox/bug4185024.java create mode 100644 test/jdk/javax/swing/JComboBox/bug4201964.java create mode 100644 test/jdk/javax/swing/JComboBox/bug4249732.java create mode 100644 test/jdk/javax/swing/JComboBox/bug4368848.java diff --git a/test/jdk/javax/swing/JComboBox/bug4185024.java b/test/jdk/javax/swing/JComboBox/bug4185024.java new file mode 100644 index 000000000000..da0360143d66 --- /dev/null +++ b/test/jdk/javax/swing/JComboBox/bug4185024.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 1998, 2025, 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.awt.BorderLayout; +import java.awt.Point; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JDesktopPane; +import javax.swing.JFrame; +import javax.swing.JInternalFrame; +import javax.swing.JPanel; + +/* + * @test + * @bug 4185024 + * @summary Tests that Heavyweight combo boxes on JDesktop work correctly + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4185024 + */ + +public class bug4185024 { + private static final String INSTRUCTIONS = """ + Click on the JComboBox button inside the JInternalFrame to bring up the menu. + Select one of the menu items and verify that the choice is highlighted correctly. + Click and drag the menu's scroll bar down and verify that it causes the menu to scroll down. + + Inside JInternalFrame: + This test is for the JComboBox in the JInternalFrame. + To test, please click on the combobox and check the following: + Does the selection in the popup list follow the mouse? + Does the popup list respond to clicking and dragging the scroll bar? + If so, press PASS, otherwise, press FAIL. + """; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(50) + .testUI(bug4185024::createTestUI) + .build() + .awaitAndCheck(); + } + + public static JFrame createTestUI() { + JFrame frame = new JFrame("bug4185024"); + JPanel p = new JPanel(); + p.setLayout(new BorderLayout()); + JDesktopPane desktop = new JDesktopPane(); + p.add(desktop); + frame.add(p); + + JComboBox months = new JComboBox(); + months.addItem("January"); + months.addItem("February"); + months.addItem("March"); + months.addItem("April"); + months.addItem("May"); + months.addItem("June"); + months.addItem("July"); + months.addItem("August"); + months.addItem("September"); + months.addItem("October"); + months.addItem("November"); + months.addItem("December"); + months.getAccessibleContext().setAccessibleName("Months"); + months.getAccessibleContext().setAccessibleDescription("Choose a month of the year"); + + // Set this to true and the popup works correctly... + months.setLightWeightPopupEnabled(false); + + addFrame("Months", desktop, months); + + frame.setSize(300, 300); + return frame; + } + + private static void addFrame(String title, JDesktopPane desktop, JComponent component) { + JInternalFrame jf = new JInternalFrame(title); + Point newPos = new Point(20, 20); + jf.setResizable(true); + jf.add(component); + jf.setLocation(newPos); + desktop.add(jf); + + jf.pack(); + jf.show(); + } +} diff --git a/test/jdk/javax/swing/JComboBox/bug4201964.java b/test/jdk/javax/swing/JComboBox/bug4201964.java new file mode 100644 index 000000000000..5c3a0f301993 --- /dev/null +++ b/test/jdk/javax/swing/JComboBox/bug4201964.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 1999, 2025, 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.JComboBox; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.UIManager; + +/* + * @test + * @bug 4201964 + * @summary Tests that JComboBox's arrow button isn't drawn too wide in Windows Look&Feel + * @requires (os.family == "windows") + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4201964 + */ + +public class bug4201964 { + private static final String INSTRUCTIONS = """ + Does the arrow look too large? If not, it passes. + """; + + public static void main(String[] args) throws Exception { + try { + UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); + } catch (Exception e) { + PassFailJFrame.forceFail("Couldn't load the Windows look and feel."); + } + + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .rows(8) + .columns(30) + .testUI(bug4201964::createTestUI) + .build() + .awaitAndCheck(); + } + + public static JFrame createTestUI() { + JFrame frame = new JFrame("bug4201964"); + JPanel panel = new JPanel(); + JComboBox comboBox; + + comboBox = new JComboBox(new Object[]{ + "Coma Berenices", + "Triangulum", + "Camelopardis", + "Cassiopea"}); + + panel.add(comboBox); + + frame.add(panel); + frame.pack(); + return frame; + } +} diff --git a/test/jdk/javax/swing/JComboBox/bug4249732.java b/test/jdk/javax/swing/JComboBox/bug4249732.java new file mode 100644 index 000000000000..b8de7fa48b78 --- /dev/null +++ b/test/jdk/javax/swing/JComboBox/bug4249732.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 1999, 2025, 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.awt.BorderLayout; +import javax.swing.JComboBox; +import javax.swing.JFrame; +import javax.swing.UIManager; + +/* + * @test + * @bug 4249732 + * @requires (os.family == "windows") + * @summary Tests that Windows editable combo box selects text picked from its list + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4249732 + */ + +public class bug4249732 { + private static final String INSTRUCTIONS = """ + Click on combo box arrow button to open its dropdown list, and + select an item from there. The text in the combo box editor should + be selected, otherwise test fails. + """; + + public static void main(String[] args) throws Exception { + try { + UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); + } catch (Exception e) { + PassFailJFrame.forceFail("Couldn't load the Windows look and feel."); + } + + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .rows(8) + .columns(40) + .testUI(bug4249732::createTestUI) + .build() + .awaitAndCheck(); + } + + public static JFrame createTestUI() { + JFrame frame = new JFrame("bug4249732"); + + JComboBox cb = new JComboBox(new Object[]{"foo", "bar", "baz"}); + cb.setEditable(true); + + frame.add(cb, BorderLayout.NORTH); + frame.pack(); + return frame; + } +} diff --git a/test/jdk/javax/swing/JComboBox/bug4368848.java b/test/jdk/javax/swing/JComboBox/bug4368848.java new file mode 100644 index 000000000000..1673c458cac0 --- /dev/null +++ b/test/jdk/javax/swing/JComboBox/bug4368848.java @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2000, 2025, 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.DefaultCellEditor; +import javax.swing.JComboBox; +import javax.swing.JFrame; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.table.AbstractTableModel; + +/* + * @test + * @bug 4368848 + * @summary Tests that mouse wheel events cancel popups + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4368848 + */ + +public class bug4368848 { + static final String[] names = {"First Name", "Last Name", "Veggy"}; + static Object[][] data = { + {"Mark", "Andrews", false}, + {"Tom", "Ball", false}, + {"Alan", "Chung", false}, + {"Jeff", "Dinkins", false}, + {"Amy", "Fowler", false}, + {"Brian", "Gerhold", false}, + {"James", "Gosling", false}, + {"David", "Karlton", false}, + {"Dave", "Kloba", false}, + {"Peter", "Korn", false}, + {"Phil", "Milne", false}, + {"Dave", "Moore", false}, + {"Hans", "Muller", false}, + {"Rick", "Levenson", false}, + {"Tim", "Prinzing", false}, + {"Chester", "Rose", false}, + {"Ray", "Ryan", false}, + {"Georges", "Saab", false}, + {"Willie", "Walker", false}, + {"Kathy", "Walrath", false}, + {"Arnaud", "Weber", false} + }; + + private static final String INSTRUCTIONS = """ + Click any cell in the 'Veggy' column, so that combo box appears. + Make sure mouse pointer is over the table, but _not_ over the combo + box. Try scrolling the table using the mouse wheel. The combo popup + should disappear. If it stays visible, test fails. + """; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(50) + .testUI(bug4368848::createTestUI) + .build() + .awaitAndCheck(); + } + + public static JFrame createTestUI() { + JFrame frame = new JFrame("bug4368848"); + ExampleTableModel dataModel = new ExampleTableModel(); + + JComboBox _editor = new JComboBox(); + _editor.addItem(false); + _editor.addItem(true); + + JTable tableView = new JTable(dataModel); + tableView.setDefaultEditor(Boolean.class, new DefaultCellEditor(_editor)); + + frame.add(new JScrollPane(tableView)); + frame.setSize(200, 200); + return frame; + } + + static class ExampleTableModel extends AbstractTableModel { + // These methods always need to be implemented. + @Override + public int getColumnCount() { + return names.length; + } + + @Override + public int getRowCount() { + return data.length; + } + + public Object getValueAt(int row, int col) { + return data[row][col]; + } + + @Override + public boolean isCellEditable(int row, int col) { + return true; + } + + @Override + public String getColumnName(int column) { + return names[column]; + } + + @Override + public Class getColumnClass(int col) { + return getValueAt(0, col).getClass(); + } + } +} From 8cfc56b3fbeb143a9b61e22fa80e4c55f616f439 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Tue, 4 Nov 2025 19:50:53 +0000 Subject: [PATCH 270/323] 8352966: Opensource Several Font related tests - Batch 2 Backport-of: db08726884d90f9139db5d30ee4d36d88c288a06 --- .../awt/font/GlyphVector/TestOutline.java | 104 ++++++++++ .../awt/font/NumericShaper/ShaperTest.java | 180 ++++++++++++++++++ .../awt/font/TextLayout/TestGASPHint.java | 113 +++++++++++ .../awt/font/TextLayout/TestSelection.java | 134 +++++++++++++ .../font/TextLayout/TestStrikethrough.java | 92 +++++++++ 5 files changed, 623 insertions(+) create mode 100644 test/jdk/java/awt/font/GlyphVector/TestOutline.java create mode 100644 test/jdk/java/awt/font/NumericShaper/ShaperTest.java create mode 100644 test/jdk/java/awt/font/TextLayout/TestGASPHint.java create mode 100644 test/jdk/java/awt/font/TextLayout/TestSelection.java create mode 100644 test/jdk/java/awt/font/TextLayout/TestStrikethrough.java diff --git a/test/jdk/java/awt/font/GlyphVector/TestOutline.java b/test/jdk/java/awt/font/GlyphVector/TestOutline.java new file mode 100644 index 000000000000..cc45456b21ab --- /dev/null +++ b/test/jdk/java/awt/font/GlyphVector/TestOutline.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 1999, 2025, 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.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Rectangle; +import java.awt.Shape; +import java.awt.font.GlyphVector; +import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; + +import javax.swing.JPanel; + +/* + * @test + * @bug 4255072 + * @summary Display the outline of a GlyphVector that has overlapping 'O' characters in it. + * The places where the strokes of the characters cross should be filled in. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual TestOutline + */ + +public final class TestOutline extends JPanel { + Shape outline; + + public static void main(String[] args) throws Exception { + final String INSTRUCTIONS = """ + Two overlapping 'O' characters should appear. Pass the test if + the places where the strokes of the characters cross is filled in. + Fail it if these places are not filled in."""; + + PassFailJFrame.builder() + .title("TestOutline Instruction") + .instructions(INSTRUCTIONS) + .columns(35) + .splitUI(TestOutline::new) + .build() + .awaitAndCheck(); + } + + @Override + public Dimension getPreferredSize() { + return new Dimension(200, 250); + } + + @Override + public void paint(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + g2d.setColor(Color.WHITE); + g2d.fillRect(0, 0, getWidth(), getHeight()); + + if (outline == null) { + outline = createLayout(g2d); + } + + g2d.setColor(Color.BLACK); + g2d.fill(outline); + } + + private Shape createLayout(Graphics2D g2d) { + Font font = new Font(Font.DIALOG, Font.PLAIN, 144); + GlyphVector gv = font.createGlyphVector(g2d.getFontRenderContext(), "OO"); + gv.performDefaultLayout(); + Point2D pt = gv.getGlyphPosition(1); + double delta = -pt.getX() / 2.0; + pt.setLocation(pt.getX() + delta, pt.getY()); + gv.setGlyphPosition(1, pt); + + pt = gv.getGlyphPosition(2); + pt.setLocation(pt.getX() + delta, pt.getY()); + gv.setGlyphPosition(2, pt); + + Rectangle2D bounds = gv.getLogicalBounds(); + Rectangle d = getBounds(); + float x = (float) ((d.width - bounds.getWidth()) / 2 + bounds.getX()); + float y = (float) ((d.height - bounds.getHeight()) / 2 - bounds.getY()); + System.out.println("loc: " + x + ", " + y); + return gv.getOutline(x, y); + } +} diff --git a/test/jdk/java/awt/font/NumericShaper/ShaperTest.java b/test/jdk/java/awt/font/NumericShaper/ShaperTest.java new file mode 100644 index 000000000000..adc81cfd7e04 --- /dev/null +++ b/test/jdk/java/awt/font/NumericShaper/ShaperTest.java @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2000, 2025, 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.awt.Color; +import java.awt.Font; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Panel; +import java.awt.font.FontRenderContext; +import java.awt.font.LineBreakMeasurer; +import java.awt.font.NumericShaper; +import java.awt.font.TextAttribute; +import java.awt.font.TextLayout; +import java.text.AttributedCharacterIterator; +import java.text.AttributedString; +import java.util.HashMap; + +/* + * @test + * @bug 4210199 + * @summary Draw a string with mixed ASCII digits and different scripts, applying + * different kinds of numeric shapers. Verify that the proper digits are affected. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual ShaperTest + */ + +public class ShaperTest extends Panel { + private static final String fontName = Font.DIALOG; + private final TextLayout[][] layouts; + private final String[] titles; + private static final String text = + "-123 (English) 456.00 (Arabic) \u0641\u0642\u0643 -789 (Thai) \u0e01\u0e33 01.23"; + + public static void main(String[] args) throws Exception { + final String INSTRUCTIONS = """ + A line of text containing mixed numeric and other text is drawn four times + (Depending on the font/platform, some of the other text may not be visible). + + There are four runs of digits, '-123' at the front of the text, '456.00' after + English text, '-789' after Arabic text, and '01.23' after Thai text. + + In the first line, all four runs of digits should be present as ASCII digits. + + In the second line, all four runs of digits should be Arabic digits + (they may not be visible if the font does not support Arabic). + + In the third line, the initial run of digits (-123) and the one following the + Arabic text (-789) should be Arabic, while the others should be ASCII. + + In the fourth line, only the digits following the Arabic text (-789) should be Arabic, + and the others should be ASCII. + + Pass the test if this is true."""; + + PassFailJFrame.builder() + .title("ShaperTest Instruction") + .instructions(INSTRUCTIONS) + .columns(45) + .testUI(ShaperTest::createUI) + .logArea(8) + .build() + .awaitAndCheck(); + } + + private static Frame createUI() { + Frame frame = new Frame("ShaperTest Test UI"); + frame.add(new ShaperTest()); + frame.setSize(600, 400); + return frame; + } + + void dumpChars(char[] chars) { + for (int i = 0; i < chars.length; ++i) { + char c = chars[i]; + if (c < 0x7f) { + System.out.print(c); + } else { + String n = Integer.toHexString(c); + n = "0000".substring(n.length()) + n; + System.out.print("0x" + n); + } + } + } + + private ShaperTest() { + setBackground(Color.WHITE); + setForeground(Color.BLACK); + + Font textfont = new Font(fontName, Font.PLAIN, 12); + PassFailJFrame.log("asked for: " + fontName + " and got: " + textfont.getFontName()); + setFont(textfont); + + Font font = new Font(fontName, Font.PLAIN, 18); + PassFailJFrame.log("asked for: " + fontName + " and got: " + font.getFontName()); + + FontRenderContext frc = new FontRenderContext(null, false, false); + + layouts = new TextLayout[5][2]; + + HashMap map = new HashMap<>(); + map.put(TextAttribute.FONT, font); + layouts[0][0] = new TextLayout(text, map, frc); + AttributedCharacterIterator iter = new AttributedString(text, map).getIterator(); + layouts[0][1] = new LineBreakMeasurer(iter, frc).nextLayout(Float.MAX_VALUE); + + NumericShaper arabic = NumericShaper.getShaper(NumericShaper.ARABIC); + map.put(TextAttribute.NUMERIC_SHAPING, arabic); + layouts[1][0] = new TextLayout(text, map, frc); + iter = new AttributedString(text, map).getIterator(); + layouts[1][1] = new LineBreakMeasurer(iter, frc).nextLayout(Float.MAX_VALUE); + + NumericShaper contextualArabic = NumericShaper.getContextualShaper(NumericShaper.ARABIC, NumericShaper.ARABIC); + map.put(TextAttribute.NUMERIC_SHAPING, contextualArabic); + layouts[2][0] = new TextLayout(text, map, frc); + iter = new AttributedString(text, map).getIterator(); + layouts[2][1] = new LineBreakMeasurer(iter, frc).nextLayout(Float.MAX_VALUE); + + NumericShaper contextualArabicASCII = NumericShaper.getContextualShaper(NumericShaper.ARABIC); + map.put(TextAttribute.NUMERIC_SHAPING, contextualArabicASCII); + layouts[3][0] = new TextLayout(text, map, frc); + iter = new AttributedString(text, map).getIterator(); + layouts[3][1] = new LineBreakMeasurer(iter, frc).nextLayout(Float.MAX_VALUE); + + NumericShaper contextualAll = NumericShaper.getContextualShaper(NumericShaper.ALL_RANGES); + map.put(TextAttribute.NUMERIC_SHAPING, contextualAll); + layouts[4][0] = new TextLayout(text, map, frc); + iter = new AttributedString(text, map).getIterator(); + layouts[4][1] = new LineBreakMeasurer(iter, frc).nextLayout(Float.MAX_VALUE); + + titles = new String[]{ + "plain -- all digits ASCII", + "Arabic -- all digits Arabic", + "contextual Arabic default Arabic -- only leading digits and digits following Arabic text are Arabic", + "contextual Arabic default ASCII -- only digits following Arabic text are Arabic", + "contextual all default ASCII -- leading digits english, others correspond to context" + }; + } + + @Override + public void paint(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + + float x = 5; + float y = 5; + + for (int i = 0; i < layouts.length; ++i) { + y += 18; + g2d.drawString(titles[i], x, y); + y += 4; + + for (int j = 0; j < 2; ++j) { + y += layouts[i][j].getAscent(); + layouts[i][j].draw(g2d, x, y); + y += layouts[i][j].getDescent() + layouts[i][j].getLeading(); + } + } + } +} diff --git a/test/jdk/java/awt/font/TextLayout/TestGASPHint.java b/test/jdk/java/awt/font/TextLayout/TestGASPHint.java new file mode 100644 index 000000000000..e7caeb8eabf6 --- /dev/null +++ b/test/jdk/java/awt/font/TextLayout/TestGASPHint.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2006, 2025, 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.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.GraphicsEnvironment; +import java.awt.RenderingHints; + +import javax.swing.JPanel; + +/* + * @test + * @bug 6320502 + * @summary Display laid out text which substitutes invisible glyphs correctly. + * @library /java/awt/regtesthelpers /test/lib + * @build PassFailJFrame jtreg.SkippedException + * @run main/manual TestGASPHint + */ + +public class TestGASPHint extends JPanel { + private static final String text = "\u0905\u0901\u0917\u094d\u0930\u0947\u091c\u093c\u0940"; + private static final Font font = getPhysicalFontForText(text, Font.PLAIN, 36); + + public static void main(String[] args) throws Exception { + if (font == null) { + throw new jtreg.SkippedException("No Devanagari font found. Test Skipped"); + } + + final String INSTRUCTIONS = """ + A short piece of Devanagari text should appear without any + artifacts. In particular there should be no "empty rectangles" + representing the missing glyph. + + If the above condition is true, press Pass, else Fail."""; + + PassFailJFrame.builder() + .title("TestGASPHint Instruction") + .instructions(INSTRUCTIONS) + .columns(32) + .splitUI(TestGASPHint::new) + .build() + .awaitAndCheck(); + } + + @Override + public Dimension getPreferredSize() { + return new Dimension(200, 200); + } + + @Override + public void paint(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + + g2d.setColor(Color.WHITE); + g2d.fillRect(0, 0, getWidth(), getHeight()); + + g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, + RenderingHints.VALUE_TEXT_ANTIALIAS_GASP); + + g2d.setFont(font); + g2d.setColor(Color.BLACK); + g2d.drawString(text, 10, 50); + } + + /* + * Searches the available system fonts for a font which can display all the + * glyphs in the input text correctly. Returns null, if not found. + */ + private static Font getPhysicalFontForText(String text, int style, int size) { + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + String[] names = ge.getAvailableFontFamilyNames(); + + for (String n : names) { + switch (n.toLowerCase()) { + case "dialog": + case "dialoginput": + case "serif": + case "sansserif": + case "monospaced": + break; + default: + Font f = new Font(n, style, size); + if (f.canDisplayUpTo(text) == -1) { + return f; + } + } + } + return null; + } +} diff --git a/test/jdk/java/awt/font/TextLayout/TestSelection.java b/test/jdk/java/awt/font/TextLayout/TestSelection.java new file mode 100644 index 000000000000..4a1a74994dfe --- /dev/null +++ b/test/jdk/java/awt/font/TextLayout/TestSelection.java @@ -0,0 +1,134 @@ +/* + * Copyright (c) 1999, 2025, 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.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Shape; +import java.awt.font.FontRenderContext; +import java.awt.font.TextAttribute; +import java.awt.font.TextLayout; +import java.text.AttributedString; + +import javax.swing.JPanel; + +/* + * @test + * @bug 4221422 + * @summary Display several TextLayouts with various selections. + * All the selections should be between non-italic and italic text, + * and the top and bottom of the selection region should be horizontal. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual TestSelection + */ + +public final class TestSelection extends JPanel { + private static final float MARGIN = 20; + + public static void main(String[] args) throws Exception { + final String INSTRUCTIONS = """ + Several TextLayouts are displayed along with selections. + The selection regions should have horizontal top and bottom segments. + + If above condition is true, press Pass else Fail."""; + + PassFailJFrame.builder() + .title("TestSelection Instruction") + .instructions(INSTRUCTIONS) + .columns(40) + .splitUI(TestSelection::new) + .build() + .awaitAndCheck(); + } + + @Override + public Dimension getPreferredSize() { + return new Dimension(300, 300); + } + + private float drawSelectionAndLayout(Graphics2D g2d, + TextLayout layout, + float y, + int selStart, + int selLimit) { + Color selectionColor = Color.PINK; + Color textColor = Color.BLACK; + + y += layout.getAscent(); + + g2d.translate(MARGIN, y); + Shape hl = layout.getLogicalHighlightShape(selStart, selLimit); + g2d.setColor(selectionColor); + g2d.fill(hl); + g2d.setColor(textColor); + layout.draw(g2d, 0, 0); + g2d.translate(-MARGIN, -y); + + y += layout.getDescent() + layout.getLeading() + 10; + return y; + } + + @Override + public void paint(Graphics g) { + String text = "Hello world"; + + Graphics2D g2d = (Graphics2D) g; + g2d.setColor(Color.WHITE); + g2d.fillRect(0, 0, getWidth(), getHeight()); + + AttributedString attrStr = new AttributedString(text); + + FontRenderContext frc = g2d.getFontRenderContext(); + + final int midPoint = text.indexOf('w'); + final int selStart = midPoint / 2; + final int selLimit = text.length() - selStart; + final Font italic = new Font(Font.SANS_SERIF, Font.ITALIC, 24); + + float y = MARGIN; + + attrStr.addAttribute(TextAttribute.FONT, italic, 0, midPoint); + TextLayout layout = new TextLayout(attrStr.getIterator(), frc); + + y = drawSelectionAndLayout(g2d, layout, y, selStart - 1, selLimit); + y = drawSelectionAndLayout(g2d, layout, y, selStart, selLimit); + y = drawSelectionAndLayout(g2d, layout, y, selStart + 1, selLimit); + + attrStr = new AttributedString(text); + attrStr.addAttribute(TextAttribute.FONT, + italic, midPoint, text.length()); + layout = new TextLayout(attrStr.getIterator(), frc); + + y = drawSelectionAndLayout(g2d, layout, y, selStart, selLimit); + + attrStr = new AttributedString(text); + attrStr.addAttribute(TextAttribute.FONT, italic, 0, midPoint); + attrStr.addAttribute(TextAttribute.SIZE, 48f, midPoint, text.length()); + layout = new TextLayout(attrStr.getIterator(), frc); + + y = drawSelectionAndLayout(g2d, layout, y, selStart, selLimit); + } +} diff --git a/test/jdk/java/awt/font/TextLayout/TestStrikethrough.java b/test/jdk/java/awt/font/TextLayout/TestStrikethrough.java new file mode 100644 index 000000000000..eff16d5aa642 --- /dev/null +++ b/test/jdk/java/awt/font/TextLayout/TestStrikethrough.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2005, 2025, 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.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.font.FontRenderContext; +import java.awt.font.TextAttribute; +import java.awt.font.TextLayout; +import java.text.AttributedCharacterIterator; +import java.text.AttributedString; + +import javax.swing.JPanel; + +/* + * @test + * @bug 6426360 + * @summary Display a TextLayout with strikethrough at a number of + * different offsets relative to the pixel grid. + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual TestStrikethrough + */ + +public class TestStrikethrough extends JPanel { + + public static void main(String[] args) throws Exception { + final String INSTRUCTIONS = """ + Display text with strikethrough at a number of different positions. + + Press Fail if any line is missing a strikethrough else press Pass."""; + + PassFailJFrame.builder() + .title("TestStrikethrough Instruction") + .instructions(INSTRUCTIONS) + .columns(35) + .splitUI(TestStrikethrough::new) + .build() + .awaitAndCheck(); + } + + @Override + public Dimension getPreferredSize() { + return new Dimension(200, 120); + } + + @Override + public void paint(Graphics aContext) { + Graphics2D g2d = (Graphics2D) aContext; + + g2d.setColor(Color.WHITE); + g2d.fillRect(0, 0, getWidth(), getHeight()); + + Font font = new Font(Font.DIALOG, Font.PLAIN, 9); + FontRenderContext frc = g2d.getFontRenderContext(); + String str = "Where is the strikethrough?"; + AttributedString as = new AttributedString(str); + as.addAttribute(TextAttribute.FONT, font); + as.addAttribute(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON); + AttributedCharacterIterator aci = as.getIterator(); + TextLayout tl = new TextLayout(aci, frc); + float delta = (float) (Math.ceil(tl.getAscent() + tl.getDescent() + tl.getLeading()) + .1); + float y = delta - .1f; + g2d.setColor(Color.BLACK); + for (int i = 0; i < 11; ++i) { + tl.draw(g2d, 10f, y); + y += delta; + } + } +} From b78af53785c7b13038c951c23affbba173eef9ac Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Wed, 5 Nov 2025 09:14:37 +0000 Subject: [PATCH 271/323] 8357882: Use UTF-8 encoded data in LocaleDataTest Reviewed-by: rrich Backport-of: 4fa4f15122213afea5cb25166c3b36a1c395b06c --- test/jdk/sun/text/resources/LocaleData | 7712 ++++++++-------- test/jdk/sun/text/resources/LocaleData.cldr | 8118 ++++++++--------- .../sun/text/resources/LocaleDataTest.java | 127 +- 3 files changed, 7928 insertions(+), 8029 deletions(-) diff --git a/test/jdk/sun/text/resources/LocaleData b/test/jdk/sun/text/resources/LocaleData index 441d9ee85ac6..ca825b6751ab 100644 --- a/test/jdk/sun/text/resources/LocaleData +++ b/test/jdk/sun/text/resources/LocaleData @@ -9,7 +9,7 @@ LocaleNames/en/es=Spanish LocaleNames//es=Spanish # bug #4052679 -LocaleNames/fr/fr=fran\u00e7ais +LocaleNames/fr/fr=français # bug #4055602, 4290801, 8013836 CurrencyNames/pt_BR/BRL=R$ @@ -33,13 +33,13 @@ FormatData/pt_BR/DayAbbreviations/1=Seg FormatData/pt_BR/DayAbbreviations/2=Ter FormatData/pt_BR/DayNames/0=Domingo FormatData/pt_BR/DayNames/1=Segunda-feira -FormatData/pt_BR/DayNames/2=Ter\u00e7a-feira +FormatData/pt_BR/DayNames/2=Terça-feira CalendarData/pt_BR/firstDayOfWeek=1 CalendarData/pt_BR/minimalDaysInFirstWeek=1 FormatData/pt_BR/MonthNames/0=Janeiro FormatData/pt_BR/MonthNames/1=Fevereiro -FormatData/pt_BR/MonthNames/2=Mar\u00e7o -LocaleNames/pt_BR/pt=portugu\u00eas +FormatData/pt_BR/MonthNames/2=Março +LocaleNames/pt_BR/pt=português LocaleNames/pt_BR/PT=Portugal LocaleNames/pt_BR/BR=Brasil @@ -47,17 +47,17 @@ LocaleNames/pt_BR/BR=Brasil CalendarData/hr/firstDayOfWeek=2 # bug #4066550 -FormatData/ja/Eras/0=\u7d00\u5143\u524d -FormatData/ja/Eras/1=\u897f\u66a6 +FormatData/ja/Eras/0=紀元前 +FormatData/ja/Eras/1=西暦 # bug #4067619 LocaleNames//LT=Lithuania LocaleNames/en/LT=Lithuania # bug #4068012, 4290801, 4942982 -CurrencyNames/ru_RU/RUB=\u0440\u0443\u0431. +CurrencyNames/ru_RU/RUB=руб. FormatData/ru_RU/NumberPatterns/0=#,##0.###;-#,##0.### -# FormatData/ru_RU/NumberPatterns/1=#,##0.##'\u0440.';-#,##0.##'\u0440.' # Changed; see bug 4122840 +# FormatData/ru_RU/NumberPatterns/1=#,##0.##'р.';-#,##0.##'р.' # Changed; see bug 4122840 FormatData/ru_RU/NumberPatterns/2=#,##0% # bug #4070174 @@ -89,60 +89,60 @@ FormatData/fr_FR/DatePatterns/0=EEEE d MMMM yyyy # FormatData/it_IT/NumberPatterns/1='L.' #,##0;-'L.' #,##0 # Changed; see bug 4122840 # bug #4071782 -FormatData/ru/DayAbbreviations/0=\u0412\u0441 -FormatData/ru/DayAbbreviations/1=\u041f\u043d -FormatData/ru/DayAbbreviations/2=\u0412\u0442 -FormatData/ru/DayAbbreviations/3=\u0421\u0440 -FormatData/ru/DayAbbreviations/4=\u0427\u0442 -FormatData/ru/DayAbbreviations/5=\u041f\u0442 -FormatData/ru/DayAbbreviations/6=\u0421\u0431 +FormatData/ru/DayAbbreviations/0=Вс +FormatData/ru/DayAbbreviations/1=Пн +FormatData/ru/DayAbbreviations/2=Вт +FormatData/ru/DayAbbreviations/3=Ср +FormatData/ru/DayAbbreviations/4=Чт +FormatData/ru/DayAbbreviations/5=Пт +FormatData/ru/DayAbbreviations/6=Сб # bug #4072013 - obsoleted by 6386647: Full date format in DateFormat does not include day of the week for UK locale #FormatData/en_GB/DatePatterns/0=dd MMMM yyyy # bug #4072388 -LocaleNames/cs/cs=\u010de\u0161tina +LocaleNames/cs/cs=čeština # bug #4072773 FormatData/ja/DatePatterns/2=yyyy/MM/dd FormatData/ja/DatePatterns/3=yy/MM/dd # bug #4075404, 4290801, 4942982 -CurrencyNames/ru_RU/RUB=\u0440\u0443\u0431. +CurrencyNames/ru_RU/RUB=руб. FormatData/ru_RU/TimePatterns/0=H:mm:ss z FormatData/ru_RU/TimePatterns/1=H:mm:ss z FormatData/ru_RU/TimePatterns/2=H:mm:ss FormatData/ru_RU/TimePatterns/3=H:mm -FormatData/ru_RU/DatePatterns/0=d MMMM yyyy '\u0433.' -FormatData/ru_RU/DatePatterns/1=d MMMM yyyy '\u0433.' +FormatData/ru_RU/DatePatterns/0=d MMMM yyyy 'г.' +FormatData/ru_RU/DatePatterns/1=d MMMM yyyy 'г.' FormatData/ru_RU/DatePatterns/2=dd.MM.yyyy FormatData/ru_RU/DatePatterns/3=dd.MM.yy FormatData/ru_RU/DateTimePatterns/0={1} {0} # bug #4084356, 4290801 -CurrencyNames/pl_PL/PLN=z\u0142 +CurrencyNames/pl_PL/PLN=zł FormatData/pl_PL/NumberPatterns/0=#,##0.###;-#,##0.### -# FormatData/pl_PL/NumberPatterns/1=#,##0.## z\u0142;-#,##0.## z\u0142 # Changed; see bug 4122840 +# FormatData/pl_PL/NumberPatterns/1=#,##0.## zł;-#,##0.## zł # Changed; see bug 4122840 FormatData/pl_PL/NumberPatterns/2=#,##0% FormatData/pl_PL/DayNames/0=niedziela -FormatData/pl_PL/DayNames/1=poniedzia\u0142ek +FormatData/pl_PL/DayNames/1=poniedziałek FormatData/pl_PL/DayNames/2=wtorek -FormatData/pl_PL/DayNames/3=\u015broda +FormatData/pl_PL/DayNames/3=środa FormatData/pl_PL/DayNames/4=czwartek -FormatData/pl_PL/DayNames/5=pi\u0105tek +FormatData/pl_PL/DayNames/5=piątek FormatData/pl_PL/DayNames/6=sobota -FormatData/pl_PL/standalone.MonthNames/0=stycze\u0144 +FormatData/pl_PL/standalone.MonthNames/0=styczeń FormatData/pl_PL/standalone.MonthNames/1=luty FormatData/pl_PL/standalone.MonthNames/2=marzec -FormatData/pl_PL/standalone.MonthNames/3=kwiecie\u0144 +FormatData/pl_PL/standalone.MonthNames/3=kwiecień FormatData/pl_PL/standalone.MonthNames/4=maj FormatData/pl_PL/standalone.MonthNames/5=czerwiec FormatData/pl_PL/standalone.MonthNames/6=lipiec -FormatData/pl_PL/standalone.MonthNames/7=sierpie\u0144 -FormatData/pl_PL/standalone.MonthNames/8=wrzesie\u0144 -FormatData/pl_PL/standalone.MonthNames/9=pa\u017adziernik +FormatData/pl_PL/standalone.MonthNames/7=sierpień +FormatData/pl_PL/standalone.MonthNames/8=wrzesień +FormatData/pl_PL/standalone.MonthNames/9=październik FormatData/pl_PL/standalone.MonthNames/10=listopad -FormatData/pl_PL/standalone.MonthNames/11=grudzie\u0144 +FormatData/pl_PL/standalone.MonthNames/11=grudzień FormatData/pl_PL/standalone.MonthNames/12= LocaleNames/pl_PL/pl=polski FormatData/pl_PL/TimePatterns/0=HH:mm:ss z @@ -156,23 +156,23 @@ FormatData/pl_PL/DatePatterns/2=yyyy-MM-dd FormatData/pl_PL/DatePatterns/3=dd.MM.yy FormatData/pl_PL/DateTimePatterns/0={1} {0} FormatData/pl_PL/NumberElements/0=, -FormatData/pl_PL/NumberElements/1=\u00a0 +FormatData/pl_PL/NumberElements/1=  FormatData/pl_PL/NumberElements/2=; FormatData/pl_PL/NumberElements/3=% FormatData/pl_PL/NumberElements/4=0 FormatData/pl_PL/NumberElements/5=# FormatData/pl_PL/NumberElements/6=- FormatData/pl_PL/NumberElements/7=E -FormatData/pl_PL/NumberElements/8=\u2030 -FormatData/pl_PL/NumberElements/9=\u221e -FormatData/pl_PL/NumberElements/10=\ufffd +FormatData/pl_PL/NumberElements/8=‰ +FormatData/pl_PL/NumberElements/9=∞ +FormatData/pl_PL/NumberElements/10=� FormatData/pl_PL/Eras/0=p.n.e. FormatData/pl_PL/Eras/1=n.e. LocaleNames/pl_PL/PL=Polska FormatData/pl_PL/DayAbbreviations/0=N FormatData/pl_PL/DayAbbreviations/1=Pn FormatData/pl_PL/DayAbbreviations/2=Wt -FormatData/pl_PL/DayAbbreviations/3=\u015ar +FormatData/pl_PL/DayAbbreviations/3=Śr FormatData/pl_PL/DayAbbreviations/4=Cz FormatData/pl_PL/DayAbbreviations/5=Pt FormatData/pl_PL/DayAbbreviations/6=So @@ -185,7 +185,7 @@ FormatData/pl_PL/MonthAbbreviations/5=cze FormatData/pl_PL/MonthAbbreviations/6=lip FormatData/pl_PL/MonthAbbreviations/7=sie FormatData/pl_PL/MonthAbbreviations/8=wrz -FormatData/pl_PL/MonthAbbreviations/9=pa\u017a +FormatData/pl_PL/MonthAbbreviations/9=paź FormatData/pl_PL/MonthAbbreviations/10=lis FormatData/pl_PL/MonthAbbreviations/11=gru FormatData/pl_PL/MonthAbbreviations/12= @@ -196,8 +196,8 @@ FormatData/pl_PL/AmPmMarkers/1=PM # bug #4087238, 4290801 # bug 4156708 - changed currency symbol from 00a5 to ffe5 -CurrencyNames/ja_JP/JPY=\uffe5 -# FormatData/ja_JP/NumberPatterns/1=\u00a5#,##0.00 # Changed; see bug 4122840 +CurrencyNames/ja_JP/JPY=¥ +# FormatData/ja_JP/NumberPatterns/1=¥#,##0.00 # Changed; see bug 4122840 # bug #4092361 FormatData/en_US/TimePatterns/0=h:mm:ss a z @@ -211,113 +211,113 @@ FormatData/en_US/DatePatterns/3=M/d/yy FormatData/en_US/DateTimePatterns/0={1} {0} # bug #4094033, 4290801, 4942982 -CurrencyNames/ru_RU/RUB=\u0440\u0443\u0431. +CurrencyNames/ru_RU/RUB=руб. FormatData/ru_RU/NumberPatterns/0=#,##0.###;-#,##0.### -# FormatData/ru_RU/NumberPatterns/1=#,##0.##'\u0440.';-#,##0.##'\u0440.' # Changed; see bug 4122840 +# FormatData/ru_RU/NumberPatterns/1=#,##0.##'р.';-#,##0.##'р.' # Changed; see bug 4122840 FormatData/ru_RU/NumberPatterns/2=#,##0% -FormatData/ru_RU/MonthNames/0=\u044f\u043d\u0432\u0430\u0440\u044f -FormatData/ru_RU/MonthNames/1=\u0444\u0435\u0432\u0440\u0430\u043b\u044f -FormatData/ru_RU/MonthNames/2=\u043c\u0430\u0440\u0442\u0430 -FormatData/ru_RU/MonthNames/3=\u0430\u043f\u0440\u0435\u043b\u044f -FormatData/ru_RU/MonthNames/4=\u043c\u0430\u044f -FormatData/ru_RU/MonthNames/5=\u0438\u044e\u043d\u044f -FormatData/ru_RU/MonthNames/6=\u0438\u044e\u043b\u044f -FormatData/ru_RU/MonthNames/7=\u0430\u0432\u0433\u0443\u0441\u0442\u0430 -FormatData/ru_RU/MonthNames/8=\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f -FormatData/ru_RU/MonthNames/9=\u043e\u043a\u0442\u044f\u0431\u0440\u044f -FormatData/ru_RU/MonthNames/10=\u043d\u043e\u044f\u0431\u0440\u044f -FormatData/ru_RU/MonthNames/11=\u0434\u0435\u043a\u0430\u0431\u0440\u044f +FormatData/ru_RU/MonthNames/0=января +FormatData/ru_RU/MonthNames/1=февраля +FormatData/ru_RU/MonthNames/2=марта +FormatData/ru_RU/MonthNames/3=апреля +FormatData/ru_RU/MonthNames/4=мая +FormatData/ru_RU/MonthNames/5=июня +FormatData/ru_RU/MonthNames/6=июля +FormatData/ru_RU/MonthNames/7=августа +FormatData/ru_RU/MonthNames/8=сентября +FormatData/ru_RU/MonthNames/9=октября +FormatData/ru_RU/MonthNames/10=ноября +FormatData/ru_RU/MonthNames/11=декабря FormatData/ru_RU/MonthNames/12= -FormatData/ru_RU/standalone.MonthNames/0=\u042f\u043d\u0432\u0430\u0440\u044c -FormatData/ru_RU/standalone.MonthNames/1=\u0424\u0435\u0432\u0440\u0430\u043b\u044c -FormatData/ru_RU/standalone.MonthNames/2=\u041c\u0430\u0440\u0442 -FormatData/ru_RU/standalone.MonthNames/3=\u0410\u043f\u0440\u0435\u043b\u044c -FormatData/ru_RU/standalone.MonthNames/4=\u041c\u0430\u0439 -FormatData/ru_RU/standalone.MonthNames/5=\u0418\u044e\u043d\u044c -FormatData/ru_RU/standalone.MonthNames/6=\u0418\u044e\u043b\u044c -FormatData/ru_RU/standalone.MonthNames/7=\u0410\u0432\u0433\u0443\u0441\u0442 -FormatData/ru_RU/standalone.MonthNames/8=\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c -FormatData/ru_RU/standalone.MonthNames/9=\u041e\u043a\u0442\u044f\u0431\u0440\u044c -FormatData/ru_RU/standalone.MonthNames/10=\u041d\u043e\u044f\u0431\u0440\u044c -FormatData/ru_RU/standalone.MonthNames/11=\u0414\u0435\u043a\u0430\u0431\u0440\u044c +FormatData/ru_RU/standalone.MonthNames/0=Январь +FormatData/ru_RU/standalone.MonthNames/1=Февраль +FormatData/ru_RU/standalone.MonthNames/2=Март +FormatData/ru_RU/standalone.MonthNames/3=Апрель +FormatData/ru_RU/standalone.MonthNames/4=Май +FormatData/ru_RU/standalone.MonthNames/5=Июнь +FormatData/ru_RU/standalone.MonthNames/6=Июль +FormatData/ru_RU/standalone.MonthNames/7=Август +FormatData/ru_RU/standalone.MonthNames/8=Сентябрь +FormatData/ru_RU/standalone.MonthNames/9=Октябрь +FormatData/ru_RU/standalone.MonthNames/10=Ноябрь +FormatData/ru_RU/standalone.MonthNames/11=Декабрь FormatData/ru_RU/standalone.MonthNames/12= -FormatData/ru_RU/Eras/0=\u0434\u043e \u043d.\u044d. -FormatData/ru_RU/Eras/1=\u043d.\u044d. -LocaleNames/ru_RU/ru=\u0440\u0443\u0441\u0441\u043a\u0438\u0439 -FormatData/ru_RU/MonthAbbreviations/0=\u044f\u043d\u0432 -FormatData/ru_RU/MonthAbbreviations/1=\u0444\u0435\u0432 -FormatData/ru_RU/MonthAbbreviations/2=\u043c\u0430\u0440 -FormatData/ru_RU/MonthAbbreviations/3=\u0430\u043f\u0440 -FormatData/ru_RU/MonthAbbreviations/4=\u043c\u0430\u044f -FormatData/ru_RU/MonthAbbreviations/5=\u0438\u044e\u043d -FormatData/ru_RU/MonthAbbreviations/6=\u0438\u044e\u043b -FormatData/ru_RU/MonthAbbreviations/7=\u0430\u0432\u0433 -FormatData/ru_RU/MonthAbbreviations/8=\u0441\u0435\u043d -FormatData/ru_RU/MonthAbbreviations/9=\u043e\u043a\u0442 -FormatData/ru_RU/MonthAbbreviations/10=\u043d\u043e\u044f -FormatData/ru_RU/MonthAbbreviations/11=\u0434\u0435\u043a +FormatData/ru_RU/Eras/0=до н.э. +FormatData/ru_RU/Eras/1=н.э. +LocaleNames/ru_RU/ru=русский +FormatData/ru_RU/MonthAbbreviations/0=янв +FormatData/ru_RU/MonthAbbreviations/1=фев +FormatData/ru_RU/MonthAbbreviations/2=мар +FormatData/ru_RU/MonthAbbreviations/3=апр +FormatData/ru_RU/MonthAbbreviations/4=мая +FormatData/ru_RU/MonthAbbreviations/5=июн +FormatData/ru_RU/MonthAbbreviations/6=июл +FormatData/ru_RU/MonthAbbreviations/7=авг +FormatData/ru_RU/MonthAbbreviations/8=сен +FormatData/ru_RU/MonthAbbreviations/9=окт +FormatData/ru_RU/MonthAbbreviations/10=ноя +FormatData/ru_RU/MonthAbbreviations/11=дек FormatData/ru_RU/MonthAbbreviations/12= -# FormatData/ru_RU/standalone.MonthAbbreviations/0=\u044f\u043d\u0432 -# FormatData/ru_RU/standalone.MonthAbbreviations/1=\u0444\u0435\u0432 -# FormatData/ru_RU/standalone.MonthAbbreviations/2=\u043c\u0430\u0440 -# FormatData/ru_RU/standalone.MonthAbbreviations/3=\u0430\u043f\u0440 -# FormatData/ru_RU/standalone.MonthAbbreviations/4=\u043c\u0430\u0439 -# FormatData/ru_RU/standalone.MonthAbbreviations/5=\u0438\u044e\u043d -# FormatData/ru_RU/standalone.MonthAbbreviations/6=\u0438\u044e\u043b -# FormatData/ru_RU/standalone.MonthAbbreviations/7=\u0430\u0432\u0433 -# FormatData/ru_RU/standalone.MonthAbbreviations/8=\u0441\u0435\u043d -# FormatData/ru_RU/standalone.MonthAbbreviations/9=\u043e\u043a\u0442 -# FormatData/ru_RU/standalone.MonthAbbreviations/10=\u043d\u043e\u044f -# FormatData/ru_RU/standalone.MonthAbbreviations/11=\u0434\u0435\u043a +# FormatData/ru_RU/standalone.MonthAbbreviations/0=янв +# FormatData/ru_RU/standalone.MonthAbbreviations/1=фев +# FormatData/ru_RU/standalone.MonthAbbreviations/2=мар +# FormatData/ru_RU/standalone.MonthAbbreviations/3=апр +# FormatData/ru_RU/standalone.MonthAbbreviations/4=май +# FormatData/ru_RU/standalone.MonthAbbreviations/5=июн +# FormatData/ru_RU/standalone.MonthAbbreviations/6=июл +# FormatData/ru_RU/standalone.MonthAbbreviations/7=авг +# FormatData/ru_RU/standalone.MonthAbbreviations/8=сен +# FormatData/ru_RU/standalone.MonthAbbreviations/9=окт +# FormatData/ru_RU/standalone.MonthAbbreviations/10=ноя +# FormatData/ru_RU/standalone.MonthAbbreviations/11=дек # FormatData/ru_RU/standalone.MonthAbbreviations/12= -FormatData/ru_RU/standalone.MonthAbbreviations/0=\u042f\u043d\u0432. -FormatData/ru_RU/standalone.MonthAbbreviations/1=\u0424\u0435\u0432\u0440. -FormatData/ru_RU/standalone.MonthAbbreviations/2=\u041c\u0430\u0440\u0442 -FormatData/ru_RU/standalone.MonthAbbreviations/3=\u0410\u043f\u0440. -FormatData/ru_RU/standalone.MonthAbbreviations/4=\u041c\u0430\u0439 -FormatData/ru_RU/standalone.MonthAbbreviations/5=\u0418\u044e\u043d\u044c -FormatData/ru_RU/standalone.MonthAbbreviations/6=\u0418\u044e\u043b\u044c -FormatData/ru_RU/standalone.MonthAbbreviations/7=\u0410\u0432\u0433. -FormatData/ru_RU/standalone.MonthAbbreviations/8=\u0421\u0435\u043d\u0442. -FormatData/ru_RU/standalone.MonthAbbreviations/9=\u041e\u043a\u0442. -FormatData/ru_RU/standalone.MonthAbbreviations/10=\u041d\u043e\u044f\u0431. -FormatData/ru_RU/standalone.MonthAbbreviations/11=\u0414\u0435\u043a. +FormatData/ru_RU/standalone.MonthAbbreviations/0=Янв. +FormatData/ru_RU/standalone.MonthAbbreviations/1=Февр. +FormatData/ru_RU/standalone.MonthAbbreviations/2=Март +FormatData/ru_RU/standalone.MonthAbbreviations/3=Апр. +FormatData/ru_RU/standalone.MonthAbbreviations/4=Май +FormatData/ru_RU/standalone.MonthAbbreviations/5=Июнь +FormatData/ru_RU/standalone.MonthAbbreviations/6=Июль +FormatData/ru_RU/standalone.MonthAbbreviations/7=Авг. +FormatData/ru_RU/standalone.MonthAbbreviations/8=Сент. +FormatData/ru_RU/standalone.MonthAbbreviations/9=Окт. +FormatData/ru_RU/standalone.MonthAbbreviations/10=Нояб. +FormatData/ru_RU/standalone.MonthAbbreviations/11=Дек. FormatData/ru_RU/standalone.MonthAbbreviations/12= FormatData/ru_RU/TimePatterns/0=H:mm:ss z FormatData/ru_RU/TimePatterns/1=H:mm:ss z FormatData/ru_RU/TimePatterns/2=H:mm:ss FormatData/ru_RU/TimePatterns/3=H:mm -FormatData/ru_RU/DatePatterns/0=d MMMM yyyy '\u0433.' -FormatData/ru_RU/DatePatterns/1=d MMMM yyyy '\u0433.' +FormatData/ru_RU/DatePatterns/0=d MMMM yyyy 'г.' +FormatData/ru_RU/DatePatterns/1=d MMMM yyyy 'г.' FormatData/ru_RU/DatePatterns/2=dd.MM.yyyy FormatData/ru_RU/DatePatterns/3=dd.MM.yy FormatData/ru_RU/DateTimePatterns/0={1} {0} -FormatData/ru_RU/DayNames/0=\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435 -FormatData/ru_RU/DayNames/1=\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a -FormatData/ru_RU/DayNames/2=\u0432\u0442\u043e\u0440\u043d\u0438\u043a -FormatData/ru_RU/DayNames/3=\u0441\u0440\u0435\u0434\u0430 -FormatData/ru_RU/DayNames/4=\u0447\u0435\u0442\u0432\u0435\u0440\u0433 -FormatData/ru_RU/DayNames/5=\u043f\u044f\u0442\u043d\u0438\u0446\u0430 -FormatData/ru_RU/DayNames/6=\u0441\u0443\u0431\u0431\u043e\u0442\u0430 +FormatData/ru_RU/DayNames/0=воскресенье +FormatData/ru_RU/DayNames/1=понедельник +FormatData/ru_RU/DayNames/2=вторник +FormatData/ru_RU/DayNames/3=среда +FormatData/ru_RU/DayNames/4=четверг +FormatData/ru_RU/DayNames/5=пятница +FormatData/ru_RU/DayNames/6=суббота FormatData/ru_RU/NumberElements/0=, -FormatData/ru_RU/NumberElements/1=\u00a0 +FormatData/ru_RU/NumberElements/1=  FormatData/ru_RU/NumberElements/2=; FormatData/ru_RU/NumberElements/3=% FormatData/ru_RU/NumberElements/4=0 FormatData/ru_RU/NumberElements/5=# FormatData/ru_RU/NumberElements/6=- FormatData/ru_RU/NumberElements/7=E -FormatData/ru_RU/NumberElements/8=\u2030 -FormatData/ru_RU/NumberElements/9=\u221e -FormatData/ru_RU/NumberElements/10=\ufffd -LocaleNames/ru_RU/RU=\u0420\u043e\u0441\u0441\u0438\u044f -FormatData/ru_RU/DayAbbreviations/0=\u0412\u0441 -FormatData/ru_RU/DayAbbreviations/1=\u041f\u043d -FormatData/ru_RU/DayAbbreviations/2=\u0412\u0442 -FormatData/ru_RU/DayAbbreviations/3=\u0421\u0440 -FormatData/ru_RU/DayAbbreviations/4=\u0427\u0442 -FormatData/ru_RU/DayAbbreviations/5=\u041f\u0442 -FormatData/ru_RU/DayAbbreviations/6=\u0421\u0431 +FormatData/ru_RU/NumberElements/8=‰ +FormatData/ru_RU/NumberElements/9=∞ +FormatData/ru_RU/NumberElements/10=� +LocaleNames/ru_RU/RU=Россия +FormatData/ru_RU/DayAbbreviations/0=Вс +FormatData/ru_RU/DayAbbreviations/1=Пн +FormatData/ru_RU/DayAbbreviations/2=Вт +FormatData/ru_RU/DayAbbreviations/3=Ср +FormatData/ru_RU/DayAbbreviations/4=Чт +FormatData/ru_RU/DayAbbreviations/5=Пт +FormatData/ru_RU/DayAbbreviations/6=Сб FormatData/ru_RU/AmPmMarkers/0=AM FormatData/ru_RU/AmPmMarkers/1=PM CalendarData/ru_RU/firstDayOfWeek=2 @@ -503,20 +503,20 @@ FormatData/es_EC/DateTimePatterns/0={1} {0} FormatData/es_EC/NumberElements/0=, FormatData/es_EC/NumberElements/1=. FormatData/es_EC/NumberElements/2=; -LocaleNames/es/ES=Espa\u00f1a +LocaleNames/es/ES=España LocaleNames/es/AR=Argentina LocaleNames/es/BO=Bolivia LocaleNames/es/CL=Chile LocaleNames/es/CO=Colombia LocaleNames/es/CR=Costa Rica -LocaleNames/es/DO=Rep\u00fablica Dominicana +LocaleNames/es/DO=República Dominicana LocaleNames/es/EC=Ecuador LocaleNames/es/GT=Guatemala LocaleNames/es/HN=Honduras -LocaleNames/es/MX=M\u00e9xico +LocaleNames/es/MX=México LocaleNames/es/NI=Nicaragua -LocaleNames/es/PA=Panam\u00e1 -LocaleNames/es/PE=Per\u00fa +LocaleNames/es/PA=Panamá +LocaleNames/es/PE=Perú LocaleNames/es/PR=Puerto Rico LocaleNames/es/PY=Paraguay # LocaleNames/es/SV=El SalvadorUY # Changed, see bug 4331446 @@ -698,19 +698,19 @@ FormatData/es_VE/NumberElements/1=. FormatData/es_VE/NumberElements/2=; # bug #4099810, 4290801, 6868106, 6916787 -CurrencyNames/uk_UA/UAH=\u0433\u0440\u043d. +CurrencyNames/uk_UA/UAH=грн. FormatData/uk_UA/NumberPatterns/0=#,##0.###;-#,##0.### -# FormatData/uk_UA/NumberPatterns/1=#,##0.## '\u0433\u0440\u0432.';-#,##0.## '\u0433\u0440\u0432.' # Changed; see bug 4122840 +# FormatData/uk_UA/NumberPatterns/1=#,##0.## 'грв.';-#,##0.## 'грв.' # Changed; see bug 4122840 FormatData/uk_UA/NumberPatterns/2=#,##0% # bug 6245766 -FormatData/uk/DatePatterns/0=EEEE, d MMMM yyyy \u0440. +FormatData/uk/DatePatterns/0=EEEE, d MMMM yyyy р. FormatData/uk/DatePatterns/1=d MMMM yyyy FormatData/uk/DatePatterns/2=d MMM yyyy FormatData/uk/DatePatterns/3=dd.MM.yy # bug #4103218 -# FormatData/ko_KR/NumberPatterns/1=\u20a9#,##0;-\u20a9#,##0 # Changed; see bug 4122840 +# FormatData/ko_KR/NumberPatterns/1=₩#,##0;-₩#,##0 # Changed; see bug 4122840 # bug #4103220 should be adequately tested by the above tests, which represent a pretty # good cross-section of the locale data @@ -732,57 +732,57 @@ FormatData/fr_CA/TimePatterns/0=H' h 'mm z FormatData/fr_CA/TimePatterns/1=HH:mm:ss z # bug #4113638, 4290801 -CurrencyNames/ar_AE/AED=\u062f.\u0625.\u200f +CurrencyNames/ar_AE/AED=د.إ.‏ FormatData/ar_AE/NumberPatterns/0=#,##0.###;#,##0.###- -# FormatData/ar_AE/NumberPatterns/1='\u062f.\u0625.\u200f' #,##0.###;'\u062f.\u0625.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_AE/NumberPatterns/1='د.إ.‏' #,##0.###;'د.إ.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_AE/NumberPatterns/2=#,##0% -FormatData/ar_AE/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_AE/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_AE/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_AE/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_AE/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_AE/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_AE/DayNames/6=\u0627\u0644\u0633\u0628\u062a +FormatData/ar_AE/DayNames/0=الأحد +FormatData/ar_AE/DayNames/1=الاثنين +FormatData/ar_AE/DayNames/2=الثلاثاء +FormatData/ar_AE/DayNames/3=الأربعاء +FormatData/ar_AE/DayNames/4=الخميس +FormatData/ar_AE/DayNames/5=الجمعة +FormatData/ar_AE/DayNames/6=السبت CalendarData/ar_AE/firstDayOfWeek=7 CalendarData/ar_AE/minimalDaysInFirstWeek=1 -FormatData/ar_AE/MonthAbbreviations/0=\u064a\u0646\u0627 -FormatData/ar_AE/MonthAbbreviations/1=\u0641\u0628\u0631 -FormatData/ar_AE/MonthAbbreviations/2=\u0645\u0627\u0631 -FormatData/ar_AE/MonthAbbreviations/3=\u0623\u0628\u0631 -FormatData/ar_AE/MonthAbbreviations/4=\u0645\u0627\u064a -FormatData/ar_AE/MonthAbbreviations/5=\u064a\u0648\u0646 -FormatData/ar_AE/MonthAbbreviations/6=\u064a\u0648\u0644 -FormatData/ar_AE/MonthAbbreviations/7=\u0623\u063a\u0633 -FormatData/ar_AE/MonthAbbreviations/8=\u0633\u0628\u062a -FormatData/ar_AE/MonthAbbreviations/9=\u0623\u0643\u062a -FormatData/ar_AE/MonthAbbreviations/10=\u0646\u0648\u0641 -FormatData/ar_AE/MonthAbbreviations/11=\u062f\u064a\u0633 +FormatData/ar_AE/MonthAbbreviations/0=ينا +FormatData/ar_AE/MonthAbbreviations/1=فبر +FormatData/ar_AE/MonthAbbreviations/2=مار +FormatData/ar_AE/MonthAbbreviations/3=أبر +FormatData/ar_AE/MonthAbbreviations/4=ماي +FormatData/ar_AE/MonthAbbreviations/5=يون +FormatData/ar_AE/MonthAbbreviations/6=يول +FormatData/ar_AE/MonthAbbreviations/7=أغس +FormatData/ar_AE/MonthAbbreviations/8=سبت +FormatData/ar_AE/MonthAbbreviations/9=أكت +FormatData/ar_AE/MonthAbbreviations/10=نوف +FormatData/ar_AE/MonthAbbreviations/11=ديس FormatData/ar_AE/MonthAbbreviations/12= -FormatData/ar_AE/Eras/0=\u0642.\u0645 -FormatData/ar_AE/Eras/1=\u0645 -FormatData/ar_AE/DayAbbreviations/0=\u062d -FormatData/ar_AE/DayAbbreviations/1=\u0646 -FormatData/ar_AE/DayAbbreviations/2=\u062b -FormatData/ar_AE/DayAbbreviations/3=\u0631 -FormatData/ar_AE/DayAbbreviations/4=\u062e -FormatData/ar_AE/DayAbbreviations/5=\u062c -FormatData/ar_AE/DayAbbreviations/6=\u0633 -LocaleNames/ar_AE/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_AE/MonthNames/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_AE/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_AE/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_AE/MonthNames/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_AE/MonthNames/4=\u0645\u0627\u064a\u0648 -FormatData/ar_AE/MonthNames/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_AE/MonthNames/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_AE/MonthNames/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_AE/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_AE/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_AE/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_AE/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_AE/Eras/0=ق.م +FormatData/ar_AE/Eras/1=م +FormatData/ar_AE/DayAbbreviations/0=ح +FormatData/ar_AE/DayAbbreviations/1=ن +FormatData/ar_AE/DayAbbreviations/2=ث +FormatData/ar_AE/DayAbbreviations/3=ر +FormatData/ar_AE/DayAbbreviations/4=خ +FormatData/ar_AE/DayAbbreviations/5=ج +FormatData/ar_AE/DayAbbreviations/6=س +LocaleNames/ar_AE/ar=العربية +FormatData/ar_AE/MonthNames/0=يناير +FormatData/ar_AE/MonthNames/1=فبراير +FormatData/ar_AE/MonthNames/2=مارس +FormatData/ar_AE/MonthNames/3=أبريل +FormatData/ar_AE/MonthNames/4=مايو +FormatData/ar_AE/MonthNames/5=يونيو +FormatData/ar_AE/MonthNames/6=يوليو +FormatData/ar_AE/MonthNames/7=أغسطس +FormatData/ar_AE/MonthNames/8=سبتمبر +FormatData/ar_AE/MonthNames/9=أكتوبر +FormatData/ar_AE/MonthNames/10=نوفمبر +FormatData/ar_AE/MonthNames/11=ديسمبر FormatData/ar_AE/MonthNames/12= -FormatData/ar_AE/AmPmMarkers/0=\u0635 -FormatData/ar_AE/AmPmMarkers/1=\u0645 +FormatData/ar_AE/AmPmMarkers/0=ص +FormatData/ar_AE/AmPmMarkers/1=م FormatData/ar_AE/TimePatterns/0=z hh:mm:ss a FormatData/ar_AE/TimePatterns/1=z hh:mm:ss a FormatData/ar_AE/TimePatterns/2=hh:mm:ss a @@ -792,23 +792,23 @@ FormatData/ar_AE/DatePatterns/1=dd MMMM, yyyy FormatData/ar_AE/DatePatterns/2=dd/MM/yyyy FormatData/ar_AE/DatePatterns/3=dd/MM/yy FormatData/ar_AE/DateTimePatterns/0={1} {0} -LocaleNames/ar_AE/EG=\u0645\u0635\u0631 -LocaleNames/ar_AE/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_AE/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_AE/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_AE/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_AE/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_AE/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_AE/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_AE/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_AE/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_AE/QA=\u0642\u0637\u0631 -LocaleNames/ar_AE/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_AE/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_AE/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_AE/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_AE/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_AE/YE=\u0627\u0644\u064a\u0645\u0646 +LocaleNames/ar_AE/EG=مصر +LocaleNames/ar_AE/DZ=الجزائر +LocaleNames/ar_AE/BH=البحرين +LocaleNames/ar_AE/IQ=العراق +LocaleNames/ar_AE/JO=الأردن +LocaleNames/ar_AE/KW=الكويت +LocaleNames/ar_AE/LB=لبنان +LocaleNames/ar_AE/LY=ليبيا +LocaleNames/ar_AE/MA=المغرب +LocaleNames/ar_AE/OM=عُمان +LocaleNames/ar_AE/QA=قطر +LocaleNames/ar_AE/SA=المملكة العربية السعودية +LocaleNames/ar_AE/SD=السودان +LocaleNames/ar_AE/SY=سوريا +LocaleNames/ar_AE/TN=تونس +LocaleNames/ar_AE/AE=الإمارات العربية المتحدة +LocaleNames/ar_AE/YE=اليمن FormatData/ar_AE/NumberElements/0=. FormatData/ar_AE/NumberElements/1=, FormatData/ar_AE/NumberElements/2=; @@ -817,60 +817,60 @@ FormatData/ar_AE/NumberElements/4=0 FormatData/ar_AE/NumberElements/5=# FormatData/ar_AE/NumberElements/6=- FormatData/ar_AE/NumberElements/7=E -FormatData/ar_AE/NumberElements/8=\u2030 -FormatData/ar_AE/NumberElements/9=\u221e -FormatData/ar_AE/NumberElements/10=\ufffd -CurrencyNames/ar_BH/BHD=\u062f.\u0628.\u200f +FormatData/ar_AE/NumberElements/8=‰ +FormatData/ar_AE/NumberElements/9=∞ +FormatData/ar_AE/NumberElements/10=� +CurrencyNames/ar_BH/BHD=د.ب.‏ FormatData/ar_BH/NumberPatterns/0=#,##0.###;#,##0.###- -# FormatData/ar_BH/NumberPatterns/1='\u062f.\u0628.\u200f' #,##0.###;'\u062f.\u0628.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_BH/NumberPatterns/1='د.ب.‏' #,##0.###;'د.ب.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_BH/NumberPatterns/2=#,##0% -FormatData/ar_BH/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_BH/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_BH/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_BH/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_BH/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_BH/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_BH/DayNames/6=\u0627\u0644\u0633\u0628\u062a +FormatData/ar_BH/DayNames/0=الأحد +FormatData/ar_BH/DayNames/1=الاثنين +FormatData/ar_BH/DayNames/2=الثلاثاء +FormatData/ar_BH/DayNames/3=الأربعاء +FormatData/ar_BH/DayNames/4=الخميس +FormatData/ar_BH/DayNames/5=الجمعة +FormatData/ar_BH/DayNames/6=السبت CalendarData/ar_BH/firstDayOfWeek=7 CalendarData/ar_BH/minimalDaysInFirstWeek=1 -FormatData/ar_BH/MonthAbbreviations/0=\u064a\u0646\u0627 -FormatData/ar_BH/MonthAbbreviations/1=\u0641\u0628\u0631 -FormatData/ar_BH/MonthAbbreviations/2=\u0645\u0627\u0631 -FormatData/ar_BH/MonthAbbreviations/3=\u0623\u0628\u0631 -FormatData/ar_BH/MonthAbbreviations/4=\u0645\u0627\u064a -FormatData/ar_BH/MonthAbbreviations/5=\u064a\u0648\u0646 -FormatData/ar_BH/MonthAbbreviations/6=\u064a\u0648\u0644 -FormatData/ar_BH/MonthAbbreviations/7=\u0623\u063a\u0633 -FormatData/ar_BH/MonthAbbreviations/8=\u0633\u0628\u062a -FormatData/ar_BH/MonthAbbreviations/9=\u0623\u0643\u062a -FormatData/ar_BH/MonthAbbreviations/10=\u0646\u0648\u0641 -FormatData/ar_BH/MonthAbbreviations/11=\u062f\u064a\u0633 +FormatData/ar_BH/MonthAbbreviations/0=ينا +FormatData/ar_BH/MonthAbbreviations/1=فبر +FormatData/ar_BH/MonthAbbreviations/2=مار +FormatData/ar_BH/MonthAbbreviations/3=أبر +FormatData/ar_BH/MonthAbbreviations/4=ماي +FormatData/ar_BH/MonthAbbreviations/5=يون +FormatData/ar_BH/MonthAbbreviations/6=يول +FormatData/ar_BH/MonthAbbreviations/7=أغس +FormatData/ar_BH/MonthAbbreviations/8=سبت +FormatData/ar_BH/MonthAbbreviations/9=أكت +FormatData/ar_BH/MonthAbbreviations/10=نوف +FormatData/ar_BH/MonthAbbreviations/11=ديس FormatData/ar_BH/MonthAbbreviations/12= -FormatData/ar_BH/Eras/0=\u0642.\u0645 -FormatData/ar_BH/Eras/1=\u0645 -FormatData/ar_BH/DayAbbreviations/0=\u062d -FormatData/ar_BH/DayAbbreviations/1=\u0646 -FormatData/ar_BH/DayAbbreviations/2=\u062b -FormatData/ar_BH/DayAbbreviations/3=\u0631 -FormatData/ar_BH/DayAbbreviations/4=\u062e -FormatData/ar_BH/DayAbbreviations/5=\u062c -FormatData/ar_BH/DayAbbreviations/6=\u0633 -LocaleNames/ar_BH/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_BH/MonthNames/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_BH/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_BH/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_BH/MonthNames/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_BH/MonthNames/4=\u0645\u0627\u064a\u0648 -FormatData/ar_BH/MonthNames/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_BH/MonthNames/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_BH/MonthNames/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_BH/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_BH/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_BH/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_BH/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_BH/Eras/0=ق.م +FormatData/ar_BH/Eras/1=م +FormatData/ar_BH/DayAbbreviations/0=ح +FormatData/ar_BH/DayAbbreviations/1=ن +FormatData/ar_BH/DayAbbreviations/2=ث +FormatData/ar_BH/DayAbbreviations/3=ر +FormatData/ar_BH/DayAbbreviations/4=خ +FormatData/ar_BH/DayAbbreviations/5=ج +FormatData/ar_BH/DayAbbreviations/6=س +LocaleNames/ar_BH/ar=العربية +FormatData/ar_BH/MonthNames/0=يناير +FormatData/ar_BH/MonthNames/1=فبراير +FormatData/ar_BH/MonthNames/2=مارس +FormatData/ar_BH/MonthNames/3=أبريل +FormatData/ar_BH/MonthNames/4=مايو +FormatData/ar_BH/MonthNames/5=يونيو +FormatData/ar_BH/MonthNames/6=يوليو +FormatData/ar_BH/MonthNames/7=أغسطس +FormatData/ar_BH/MonthNames/8=سبتمبر +FormatData/ar_BH/MonthNames/9=أكتوبر +FormatData/ar_BH/MonthNames/10=نوفمبر +FormatData/ar_BH/MonthNames/11=ديسمبر FormatData/ar_BH/MonthNames/12= -FormatData/ar_BH/AmPmMarkers/0=\u0635 -FormatData/ar_BH/AmPmMarkers/1=\u0645 +FormatData/ar_BH/AmPmMarkers/0=ص +FormatData/ar_BH/AmPmMarkers/1=م FormatData/ar_BH/TimePatterns/0=z hh:mm:ss a FormatData/ar_BH/TimePatterns/1=z hh:mm:ss a FormatData/ar_BH/TimePatterns/2=hh:mm:ss a @@ -880,23 +880,23 @@ FormatData/ar_BH/DatePatterns/1=dd MMMM, yyyy FormatData/ar_BH/DatePatterns/2=dd/MM/yyyy FormatData/ar_BH/DatePatterns/3=dd/MM/yy FormatData/ar_BH/DateTimePatterns/0={1} {0} -LocaleNames/ar_BH/EG=\u0645\u0635\u0631 -LocaleNames/ar_BH/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_BH/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_BH/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_BH/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_BH/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_BH/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_BH/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_BH/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_BH/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_BH/QA=\u0642\u0637\u0631 -LocaleNames/ar_BH/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_BH/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_BH/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_BH/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_BH/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_BH/YE=\u0627\u0644\u064a\u0645\u0646 +LocaleNames/ar_BH/EG=مصر +LocaleNames/ar_BH/DZ=الجزائر +LocaleNames/ar_BH/BH=البحرين +LocaleNames/ar_BH/IQ=العراق +LocaleNames/ar_BH/JO=الأردن +LocaleNames/ar_BH/KW=الكويت +LocaleNames/ar_BH/LB=لبنان +LocaleNames/ar_BH/LY=ليبيا +LocaleNames/ar_BH/MA=المغرب +LocaleNames/ar_BH/OM=عُمان +LocaleNames/ar_BH/QA=قطر +LocaleNames/ar_BH/SA=المملكة العربية السعودية +LocaleNames/ar_BH/SD=السودان +LocaleNames/ar_BH/SY=سوريا +LocaleNames/ar_BH/TN=تونس +LocaleNames/ar_BH/AE=الإمارات العربية المتحدة +LocaleNames/ar_BH/YE=اليمن FormatData/ar_BH/NumberElements/0=. FormatData/ar_BH/NumberElements/1=, FormatData/ar_BH/NumberElements/2=; @@ -905,60 +905,60 @@ FormatData/ar_BH/NumberElements/4=0 FormatData/ar_BH/NumberElements/5=# FormatData/ar_BH/NumberElements/6=- FormatData/ar_BH/NumberElements/7=E -FormatData/ar_BH/NumberElements/8=\u2030 -FormatData/ar_BH/NumberElements/9=\u221e -FormatData/ar_BH/NumberElements/10=\ufffd -CurrencyNames/ar_DZ/DZD=\u062f.\u062c.\u200f +FormatData/ar_BH/NumberElements/8=‰ +FormatData/ar_BH/NumberElements/9=∞ +FormatData/ar_BH/NumberElements/10=� +CurrencyNames/ar_DZ/DZD=د.ج.‏ FormatData/ar_DZ/NumberPatterns/0=#,##0.###;#,##0.###- -# FormatData/ar_DZ/NumberPatterns/1='\u062f.\u062c.\u200f' #,##0.###;'\u062f.\u062c.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_DZ/NumberPatterns/1='د.ج.‏' #,##0.###;'د.ج.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_DZ/NumberPatterns/2=#,##0% -FormatData/ar_DZ/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_DZ/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_DZ/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_DZ/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_DZ/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_DZ/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_DZ/DayNames/6=\u0627\u0644\u0633\u0628\u062a +FormatData/ar_DZ/DayNames/0=الأحد +FormatData/ar_DZ/DayNames/1=الاثنين +FormatData/ar_DZ/DayNames/2=الثلاثاء +FormatData/ar_DZ/DayNames/3=الأربعاء +FormatData/ar_DZ/DayNames/4=الخميس +FormatData/ar_DZ/DayNames/5=الجمعة +FormatData/ar_DZ/DayNames/6=السبت CalendarData/ar_DZ/firstDayOfWeek=7 CalendarData/ar_DZ/minimalDaysInFirstWeek=1 -FormatData/ar_DZ/MonthAbbreviations/0=\u064a\u0646\u0627 -FormatData/ar_DZ/MonthAbbreviations/1=\u0641\u0628\u0631 -FormatData/ar_DZ/MonthAbbreviations/2=\u0645\u0627\u0631 -FormatData/ar_DZ/MonthAbbreviations/3=\u0623\u0628\u0631 -FormatData/ar_DZ/MonthAbbreviations/4=\u0645\u0627\u064a -FormatData/ar_DZ/MonthAbbreviations/5=\u064a\u0648\u0646 -FormatData/ar_DZ/MonthAbbreviations/6=\u064a\u0648\u0644 -FormatData/ar_DZ/MonthAbbreviations/7=\u0623\u063a\u0633 -FormatData/ar_DZ/MonthAbbreviations/8=\u0633\u0628\u062a -FormatData/ar_DZ/MonthAbbreviations/9=\u0623\u0643\u062a -FormatData/ar_DZ/MonthAbbreviations/10=\u0646\u0648\u0641 -FormatData/ar_DZ/MonthAbbreviations/11=\u062f\u064a\u0633 +FormatData/ar_DZ/MonthAbbreviations/0=ينا +FormatData/ar_DZ/MonthAbbreviations/1=فبر +FormatData/ar_DZ/MonthAbbreviations/2=مار +FormatData/ar_DZ/MonthAbbreviations/3=أبر +FormatData/ar_DZ/MonthAbbreviations/4=ماي +FormatData/ar_DZ/MonthAbbreviations/5=يون +FormatData/ar_DZ/MonthAbbreviations/6=يول +FormatData/ar_DZ/MonthAbbreviations/7=أغس +FormatData/ar_DZ/MonthAbbreviations/8=سبت +FormatData/ar_DZ/MonthAbbreviations/9=أكت +FormatData/ar_DZ/MonthAbbreviations/10=نوف +FormatData/ar_DZ/MonthAbbreviations/11=ديس FormatData/ar_DZ/MonthAbbreviations/12= -FormatData/ar_DZ/Eras/0=\u0642.\u0645 -FormatData/ar_DZ/Eras/1=\u0645 -FormatData/ar_DZ/DayAbbreviations/0=\u062d -FormatData/ar_DZ/DayAbbreviations/1=\u0646 -FormatData/ar_DZ/DayAbbreviations/2=\u062b -FormatData/ar_DZ/DayAbbreviations/3=\u0631 -FormatData/ar_DZ/DayAbbreviations/4=\u062e -FormatData/ar_DZ/DayAbbreviations/5=\u062c -FormatData/ar_DZ/DayAbbreviations/6=\u0633 -LocaleNames/ar_DZ/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_DZ/MonthNames/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_DZ/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_DZ/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_DZ/MonthNames/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_DZ/MonthNames/4=\u0645\u0627\u064a\u0648 -FormatData/ar_DZ/MonthNames/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_DZ/MonthNames/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_DZ/MonthNames/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_DZ/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_DZ/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_DZ/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_DZ/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_DZ/Eras/0=ق.م +FormatData/ar_DZ/Eras/1=م +FormatData/ar_DZ/DayAbbreviations/0=ح +FormatData/ar_DZ/DayAbbreviations/1=ن +FormatData/ar_DZ/DayAbbreviations/2=ث +FormatData/ar_DZ/DayAbbreviations/3=ر +FormatData/ar_DZ/DayAbbreviations/4=خ +FormatData/ar_DZ/DayAbbreviations/5=ج +FormatData/ar_DZ/DayAbbreviations/6=س +LocaleNames/ar_DZ/ar=العربية +FormatData/ar_DZ/MonthNames/0=يناير +FormatData/ar_DZ/MonthNames/1=فبراير +FormatData/ar_DZ/MonthNames/2=مارس +FormatData/ar_DZ/MonthNames/3=أبريل +FormatData/ar_DZ/MonthNames/4=مايو +FormatData/ar_DZ/MonthNames/5=يونيو +FormatData/ar_DZ/MonthNames/6=يوليو +FormatData/ar_DZ/MonthNames/7=أغسطس +FormatData/ar_DZ/MonthNames/8=سبتمبر +FormatData/ar_DZ/MonthNames/9=أكتوبر +FormatData/ar_DZ/MonthNames/10=نوفمبر +FormatData/ar_DZ/MonthNames/11=ديسمبر FormatData/ar_DZ/MonthNames/12= -FormatData/ar_DZ/AmPmMarkers/0=\u0635 -FormatData/ar_DZ/AmPmMarkers/1=\u0645 +FormatData/ar_DZ/AmPmMarkers/0=ص +FormatData/ar_DZ/AmPmMarkers/1=م FormatData/ar_DZ/TimePatterns/0=z hh:mm:ss a FormatData/ar_DZ/TimePatterns/1=z hh:mm:ss a FormatData/ar_DZ/TimePatterns/2=hh:mm:ss a @@ -968,23 +968,23 @@ FormatData/ar_DZ/DatePatterns/1=dd MMMM, yyyy FormatData/ar_DZ/DatePatterns/2=dd/MM/yyyy FormatData/ar_DZ/DatePatterns/3=dd/MM/yy FormatData/ar_DZ/DateTimePatterns/0={1} {0} -LocaleNames/ar_DZ/EG=\u0645\u0635\u0631 -LocaleNames/ar_DZ/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_DZ/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_DZ/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_DZ/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_DZ/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_DZ/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_DZ/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_DZ/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_DZ/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_DZ/QA=\u0642\u0637\u0631 -LocaleNames/ar_DZ/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_DZ/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_DZ/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_DZ/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_DZ/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_DZ/YE=\u0627\u0644\u064a\u0645\u0646 +LocaleNames/ar_DZ/EG=مصر +LocaleNames/ar_DZ/DZ=الجزائر +LocaleNames/ar_DZ/BH=البحرين +LocaleNames/ar_DZ/IQ=العراق +LocaleNames/ar_DZ/JO=الأردن +LocaleNames/ar_DZ/KW=الكويت +LocaleNames/ar_DZ/LB=لبنان +LocaleNames/ar_DZ/LY=ليبيا +LocaleNames/ar_DZ/MA=المغرب +LocaleNames/ar_DZ/OM=عُمان +LocaleNames/ar_DZ/QA=قطر +LocaleNames/ar_DZ/SA=المملكة العربية السعودية +LocaleNames/ar_DZ/SD=السودان +LocaleNames/ar_DZ/SY=سوريا +LocaleNames/ar_DZ/TN=تونس +LocaleNames/ar_DZ/AE=الإمارات العربية المتحدة +LocaleNames/ar_DZ/YE=اليمن FormatData/ar_DZ/NumberElements/0=. FormatData/ar_DZ/NumberElements/1=, FormatData/ar_DZ/NumberElements/2=; @@ -993,60 +993,60 @@ FormatData/ar_DZ/NumberElements/4=0 FormatData/ar_DZ/NumberElements/5=# FormatData/ar_DZ/NumberElements/6=- FormatData/ar_DZ/NumberElements/7=E -FormatData/ar_DZ/NumberElements/8=\u2030 -FormatData/ar_DZ/NumberElements/9=\u221e -FormatData/ar_DZ/NumberElements/10=\ufffd -CurrencyNames/ar_EG/EGP=\u062c.\u0645.\u200f +FormatData/ar_DZ/NumberElements/8=‰ +FormatData/ar_DZ/NumberElements/9=∞ +FormatData/ar_DZ/NumberElements/10=� +CurrencyNames/ar_EG/EGP=ج.م.‏ FormatData/ar_EG/NumberPatterns/0=#,##0.###;#,##0.###- -# FormatData/ar_EG/NumberPatterns/1='\u062c.\u0645.\u200f' #,##0.###;'\u062c.\u0645.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_EG/NumberPatterns/1='ج.م.‏' #,##0.###;'ج.م.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_EG/NumberPatterns/2=#,##0% -FormatData/ar_EG/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_EG/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_EG/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_EG/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_EG/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_EG/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_EG/DayNames/6=\u0627\u0644\u0633\u0628\u062a +FormatData/ar_EG/DayNames/0=الأحد +FormatData/ar_EG/DayNames/1=الاثنين +FormatData/ar_EG/DayNames/2=الثلاثاء +FormatData/ar_EG/DayNames/3=الأربعاء +FormatData/ar_EG/DayNames/4=الخميس +FormatData/ar_EG/DayNames/5=الجمعة +FormatData/ar_EG/DayNames/6=السبت CalendarData/ar_EG/firstDayOfWeek=7 CalendarData/ar_EG/minimalDaysInFirstWeek=1 -FormatData/ar_EG/MonthAbbreviations/0=\u064a\u0646\u0627 -FormatData/ar_EG/MonthAbbreviations/1=\u0641\u0628\u0631 -FormatData/ar_EG/MonthAbbreviations/2=\u0645\u0627\u0631 -FormatData/ar_EG/MonthAbbreviations/3=\u0623\u0628\u0631 -FormatData/ar_EG/MonthAbbreviations/4=\u0645\u0627\u064a -FormatData/ar_EG/MonthAbbreviations/5=\u064a\u0648\u0646 -FormatData/ar_EG/MonthAbbreviations/6=\u064a\u0648\u0644 -FormatData/ar_EG/MonthAbbreviations/7=\u0623\u063a\u0633 -FormatData/ar_EG/MonthAbbreviations/8=\u0633\u0628\u062a -FormatData/ar_EG/MonthAbbreviations/9=\u0623\u0643\u062a -FormatData/ar_EG/MonthAbbreviations/10=\u0646\u0648\u0641 -FormatData/ar_EG/MonthAbbreviations/11=\u062f\u064a\u0633 +FormatData/ar_EG/MonthAbbreviations/0=ينا +FormatData/ar_EG/MonthAbbreviations/1=فبر +FormatData/ar_EG/MonthAbbreviations/2=مار +FormatData/ar_EG/MonthAbbreviations/3=أبر +FormatData/ar_EG/MonthAbbreviations/4=ماي +FormatData/ar_EG/MonthAbbreviations/5=يون +FormatData/ar_EG/MonthAbbreviations/6=يول +FormatData/ar_EG/MonthAbbreviations/7=أغس +FormatData/ar_EG/MonthAbbreviations/8=سبت +FormatData/ar_EG/MonthAbbreviations/9=أكت +FormatData/ar_EG/MonthAbbreviations/10=نوف +FormatData/ar_EG/MonthAbbreviations/11=ديس FormatData/ar_EG/MonthAbbreviations/12= -FormatData/ar_EG/Eras/0=\u0642.\u0645 -FormatData/ar_EG/Eras/1=\u0645 -FormatData/ar_EG/DayAbbreviations/0=\u062d -FormatData/ar_EG/DayAbbreviations/1=\u0646 -FormatData/ar_EG/DayAbbreviations/2=\u062b -FormatData/ar_EG/DayAbbreviations/3=\u0631 -FormatData/ar_EG/DayAbbreviations/4=\u062e -FormatData/ar_EG/DayAbbreviations/5=\u062c -FormatData/ar_EG/DayAbbreviations/6=\u0633 -LocaleNames/ar_EG/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_EG/MonthNames/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_EG/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_EG/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_EG/MonthNames/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_EG/MonthNames/4=\u0645\u0627\u064a\u0648 -FormatData/ar_EG/MonthNames/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_EG/MonthNames/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_EG/MonthNames/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_EG/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_EG/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_EG/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_EG/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_EG/Eras/0=ق.م +FormatData/ar_EG/Eras/1=م +FormatData/ar_EG/DayAbbreviations/0=ح +FormatData/ar_EG/DayAbbreviations/1=ن +FormatData/ar_EG/DayAbbreviations/2=ث +FormatData/ar_EG/DayAbbreviations/3=ر +FormatData/ar_EG/DayAbbreviations/4=خ +FormatData/ar_EG/DayAbbreviations/5=ج +FormatData/ar_EG/DayAbbreviations/6=س +LocaleNames/ar_EG/ar=العربية +FormatData/ar_EG/MonthNames/0=يناير +FormatData/ar_EG/MonthNames/1=فبراير +FormatData/ar_EG/MonthNames/2=مارس +FormatData/ar_EG/MonthNames/3=أبريل +FormatData/ar_EG/MonthNames/4=مايو +FormatData/ar_EG/MonthNames/5=يونيو +FormatData/ar_EG/MonthNames/6=يوليو +FormatData/ar_EG/MonthNames/7=أغسطس +FormatData/ar_EG/MonthNames/8=سبتمبر +FormatData/ar_EG/MonthNames/9=أكتوبر +FormatData/ar_EG/MonthNames/10=نوفمبر +FormatData/ar_EG/MonthNames/11=ديسمبر FormatData/ar_EG/MonthNames/12= -FormatData/ar_EG/AmPmMarkers/0=\u0635 -FormatData/ar_EG/AmPmMarkers/1=\u0645 +FormatData/ar_EG/AmPmMarkers/0=ص +FormatData/ar_EG/AmPmMarkers/1=م FormatData/ar_EG/TimePatterns/0=z hh:mm:ss a FormatData/ar_EG/TimePatterns/1=z hh:mm:ss a FormatData/ar_EG/TimePatterns/2=hh:mm:ss a @@ -1056,23 +1056,23 @@ FormatData/ar_EG/DatePatterns/1=dd MMMM, yyyy FormatData/ar_EG/DatePatterns/2=dd/MM/yyyy FormatData/ar_EG/DatePatterns/3=dd/MM/yy FormatData/ar_EG/DateTimePatterns/0={1} {0} -LocaleNames/ar_EG/EG=\u0645\u0635\u0631 -LocaleNames/ar_EG/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_EG/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_EG/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_EG/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_EG/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_EG/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_EG/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_EG/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_EG/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_EG/QA=\u0642\u0637\u0631 -LocaleNames/ar_EG/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_EG/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_EG/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_EG/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_EG/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_EG/YE=\u0627\u0644\u064a\u0645\u0646 +LocaleNames/ar_EG/EG=مصر +LocaleNames/ar_EG/DZ=الجزائر +LocaleNames/ar_EG/BH=البحرين +LocaleNames/ar_EG/IQ=العراق +LocaleNames/ar_EG/JO=الأردن +LocaleNames/ar_EG/KW=الكويت +LocaleNames/ar_EG/LB=لبنان +LocaleNames/ar_EG/LY=ليبيا +LocaleNames/ar_EG/MA=المغرب +LocaleNames/ar_EG/OM=عُمان +LocaleNames/ar_EG/QA=قطر +LocaleNames/ar_EG/SA=المملكة العربية السعودية +LocaleNames/ar_EG/SD=السودان +LocaleNames/ar_EG/SY=سوريا +LocaleNames/ar_EG/TN=تونس +LocaleNames/ar_EG/AE=الإمارات العربية المتحدة +LocaleNames/ar_EG/YE=اليمن FormatData/ar_EG/NumberElements/0=. FormatData/ar_EG/NumberElements/1=, FormatData/ar_EG/NumberElements/2=; @@ -1081,60 +1081,60 @@ FormatData/ar_EG/NumberElements/4=0 FormatData/ar_EG/NumberElements/5=# FormatData/ar_EG/NumberElements/6=- FormatData/ar_EG/NumberElements/7=E -FormatData/ar_EG/NumberElements/8=\u2030 -FormatData/ar_EG/NumberElements/9=\u221e -FormatData/ar_EG/NumberElements/10=\ufffd -CurrencyNames/ar_IQ/IQD=\u062f.\u0639.\u200f +FormatData/ar_EG/NumberElements/8=‰ +FormatData/ar_EG/NumberElements/9=∞ +FormatData/ar_EG/NumberElements/10=� +CurrencyNames/ar_IQ/IQD=د.ع.‏ FormatData/ar_IQ/NumberPatterns/0=#,##0.###;#,##0.###- -# FormatData/ar_IQ/NumberPatterns/1='\u062f.\u0639.\u200f' #,##0.###;'\u062f.\u0639.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_IQ/NumberPatterns/1='د.ع.‏' #,##0.###;'د.ع.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_IQ/NumberPatterns/2=#,##0% -FormatData/ar_IQ/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_IQ/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_IQ/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_IQ/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_IQ/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_IQ/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_IQ/DayNames/6=\u0627\u0644\u0633\u0628\u062a +FormatData/ar_IQ/DayNames/0=الأحد +FormatData/ar_IQ/DayNames/1=الاثنين +FormatData/ar_IQ/DayNames/2=الثلاثاء +FormatData/ar_IQ/DayNames/3=الأربعاء +FormatData/ar_IQ/DayNames/4=الخميس +FormatData/ar_IQ/DayNames/5=الجمعة +FormatData/ar_IQ/DayNames/6=السبت CalendarData/ar_IQ/firstDayOfWeek=7 CalendarData/ar_IQ/minimalDaysInFirstWeek=1 -FormatData/ar_IQ/MonthAbbreviations/0=\u064a\u0646\u0627 -FormatData/ar_IQ/MonthAbbreviations/1=\u0641\u0628\u0631 -FormatData/ar_IQ/MonthAbbreviations/2=\u0645\u0627\u0631 -FormatData/ar_IQ/MonthAbbreviations/3=\u0623\u0628\u0631 -FormatData/ar_IQ/MonthAbbreviations/4=\u0645\u0627\u064a -FormatData/ar_IQ/MonthAbbreviations/5=\u064a\u0648\u0646 -FormatData/ar_IQ/MonthAbbreviations/6=\u064a\u0648\u0644 -FormatData/ar_IQ/MonthAbbreviations/7=\u0623\u063a\u0633 -FormatData/ar_IQ/MonthAbbreviations/8=\u0633\u0628\u062a -FormatData/ar_IQ/MonthAbbreviations/9=\u0623\u0643\u062a -FormatData/ar_IQ/MonthAbbreviations/10=\u0646\u0648\u0641 -FormatData/ar_IQ/MonthAbbreviations/11=\u062f\u064a\u0633 +FormatData/ar_IQ/MonthAbbreviations/0=ينا +FormatData/ar_IQ/MonthAbbreviations/1=فبر +FormatData/ar_IQ/MonthAbbreviations/2=مار +FormatData/ar_IQ/MonthAbbreviations/3=أبر +FormatData/ar_IQ/MonthAbbreviations/4=ماي +FormatData/ar_IQ/MonthAbbreviations/5=يون +FormatData/ar_IQ/MonthAbbreviations/6=يول +FormatData/ar_IQ/MonthAbbreviations/7=أغس +FormatData/ar_IQ/MonthAbbreviations/8=سبت +FormatData/ar_IQ/MonthAbbreviations/9=أكت +FormatData/ar_IQ/MonthAbbreviations/10=نوف +FormatData/ar_IQ/MonthAbbreviations/11=ديس FormatData/ar_IQ/MonthAbbreviations/12= -FormatData/ar_IQ/Eras/0=\u0642.\u0645 -FormatData/ar_IQ/Eras/1=\u0645 -FormatData/ar_IQ/DayAbbreviations/0=\u062d -FormatData/ar_IQ/DayAbbreviations/1=\u0646 -FormatData/ar_IQ/DayAbbreviations/2=\u062b -FormatData/ar_IQ/DayAbbreviations/3=\u0631 -FormatData/ar_IQ/DayAbbreviations/4=\u062e -FormatData/ar_IQ/DayAbbreviations/5=\u062c -FormatData/ar_IQ/DayAbbreviations/6=\u0633 -LocaleNames/ar_IQ/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_IQ/MonthNames/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_IQ/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_IQ/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_IQ/MonthNames/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_IQ/MonthNames/4=\u0645\u0627\u064a\u0648 -FormatData/ar_IQ/MonthNames/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_IQ/MonthNames/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_IQ/MonthNames/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_IQ/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_IQ/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_IQ/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_IQ/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_IQ/Eras/0=ق.م +FormatData/ar_IQ/Eras/1=م +FormatData/ar_IQ/DayAbbreviations/0=ح +FormatData/ar_IQ/DayAbbreviations/1=ن +FormatData/ar_IQ/DayAbbreviations/2=ث +FormatData/ar_IQ/DayAbbreviations/3=ر +FormatData/ar_IQ/DayAbbreviations/4=خ +FormatData/ar_IQ/DayAbbreviations/5=ج +FormatData/ar_IQ/DayAbbreviations/6=س +LocaleNames/ar_IQ/ar=العربية +FormatData/ar_IQ/MonthNames/0=يناير +FormatData/ar_IQ/MonthNames/1=فبراير +FormatData/ar_IQ/MonthNames/2=مارس +FormatData/ar_IQ/MonthNames/3=أبريل +FormatData/ar_IQ/MonthNames/4=مايو +FormatData/ar_IQ/MonthNames/5=يونيو +FormatData/ar_IQ/MonthNames/6=يوليو +FormatData/ar_IQ/MonthNames/7=أغسطس +FormatData/ar_IQ/MonthNames/8=سبتمبر +FormatData/ar_IQ/MonthNames/9=أكتوبر +FormatData/ar_IQ/MonthNames/10=نوفمبر +FormatData/ar_IQ/MonthNames/11=ديسمبر FormatData/ar_IQ/MonthNames/12= -FormatData/ar_IQ/AmPmMarkers/0=\u0635 -FormatData/ar_IQ/AmPmMarkers/1=\u0645 +FormatData/ar_IQ/AmPmMarkers/0=ص +FormatData/ar_IQ/AmPmMarkers/1=م FormatData/ar_IQ/TimePatterns/0=z hh:mm:ss a FormatData/ar_IQ/TimePatterns/1=z hh:mm:ss a FormatData/ar_IQ/TimePatterns/2=hh:mm:ss a @@ -1144,23 +1144,23 @@ FormatData/ar_IQ/DatePatterns/1=dd MMMM, yyyy FormatData/ar_IQ/DatePatterns/2=dd/MM/yyyy FormatData/ar_IQ/DatePatterns/3=dd/MM/yy FormatData/ar_IQ/DateTimePatterns/0={1} {0} -LocaleNames/ar_IQ/EG=\u0645\u0635\u0631 -LocaleNames/ar_IQ/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_IQ/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_IQ/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_IQ/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_IQ/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_IQ/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_IQ/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_IQ/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_IQ/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_IQ/QA=\u0642\u0637\u0631 -LocaleNames/ar_IQ/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_IQ/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_IQ/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_IQ/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_IQ/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_IQ/YE=\u0627\u0644\u064a\u0645\u0646 +LocaleNames/ar_IQ/EG=مصر +LocaleNames/ar_IQ/DZ=الجزائر +LocaleNames/ar_IQ/BH=البحرين +LocaleNames/ar_IQ/IQ=العراق +LocaleNames/ar_IQ/JO=الأردن +LocaleNames/ar_IQ/KW=الكويت +LocaleNames/ar_IQ/LB=لبنان +LocaleNames/ar_IQ/LY=ليبيا +LocaleNames/ar_IQ/MA=المغرب +LocaleNames/ar_IQ/OM=عُمان +LocaleNames/ar_IQ/QA=قطر +LocaleNames/ar_IQ/SA=المملكة العربية السعودية +LocaleNames/ar_IQ/SD=السودان +LocaleNames/ar_IQ/SY=سوريا +LocaleNames/ar_IQ/TN=تونس +LocaleNames/ar_IQ/AE=الإمارات العربية المتحدة +LocaleNames/ar_IQ/YE=اليمن FormatData/ar_IQ/NumberElements/0=. FormatData/ar_IQ/NumberElements/1=, FormatData/ar_IQ/NumberElements/2=; @@ -1169,60 +1169,60 @@ FormatData/ar_IQ/NumberElements/4=0 FormatData/ar_IQ/NumberElements/5=# FormatData/ar_IQ/NumberElements/6=- FormatData/ar_IQ/NumberElements/7=E -FormatData/ar_IQ/NumberElements/8=\u2030 -FormatData/ar_IQ/NumberElements/9=\u221e -FormatData/ar_IQ/NumberElements/10=\ufffd +FormatData/ar_IQ/NumberElements/8=‰ +FormatData/ar_IQ/NumberElements/9=∞ +FormatData/ar_IQ/NumberElements/10=� FormatData/ar_JO/NumberPatterns/0=#,##0.###;#,##0.###- -# FormatData/ar_JO/NumberPatterns/1='\u062f.\u0623.\u200f' #,##0.###;'\u062f.\u0623.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_JO/NumberPatterns/1='د.أ.‏' #,##0.###;'د.أ.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_JO/NumberPatterns/2=#,##0% -CurrencyNames/ar_JO/JOD=\u062f.\u0623.\u200f -FormatData/ar_JO/DayAbbreviations/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_JO/DayAbbreviations/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_JO/DayAbbreviations/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_JO/DayAbbreviations/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_JO/DayAbbreviations/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_JO/DayAbbreviations/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_JO/DayAbbreviations/6=\u0627\u0644\u0633\u0628\u062a -FormatData/ar_JO/MonthNames/0=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_JO/MonthNames/1=\u0634\u0628\u0627\u0637 -FormatData/ar_JO/MonthNames/2=\u0622\u0630\u0627\u0631 -FormatData/ar_JO/MonthNames/3=\u0646\u064a\u0633\u0627\u0646 -FormatData/ar_JO/MonthNames/4=\u0623\u064a\u0627\u0631 -FormatData/ar_JO/MonthNames/5=\u062d\u0632\u064a\u0631\u0627\u0646 -FormatData/ar_JO/MonthNames/6=\u062a\u0645\u0648\u0632 -FormatData/ar_JO/MonthNames/7=\u0622\u0628 -FormatData/ar_JO/MonthNames/8=\u0623\u064a\u0644\u0648\u0644 -FormatData/ar_JO/MonthNames/9=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644 -FormatData/ar_JO/MonthNames/10=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_JO/MonthNames/11=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644 +CurrencyNames/ar_JO/JOD=د.أ.‏ +FormatData/ar_JO/DayAbbreviations/0=الأحد +FormatData/ar_JO/DayAbbreviations/1=الاثنين +FormatData/ar_JO/DayAbbreviations/2=الثلاثاء +FormatData/ar_JO/DayAbbreviations/3=الأربعاء +FormatData/ar_JO/DayAbbreviations/4=الخميس +FormatData/ar_JO/DayAbbreviations/5=الجمعة +FormatData/ar_JO/DayAbbreviations/6=السبت +FormatData/ar_JO/MonthNames/0=كانون الثاني +FormatData/ar_JO/MonthNames/1=شباط +FormatData/ar_JO/MonthNames/2=آذار +FormatData/ar_JO/MonthNames/3=نيسان +FormatData/ar_JO/MonthNames/4=أيار +FormatData/ar_JO/MonthNames/5=حزيران +FormatData/ar_JO/MonthNames/6=تموز +FormatData/ar_JO/MonthNames/7=آب +FormatData/ar_JO/MonthNames/8=أيلول +FormatData/ar_JO/MonthNames/9=تشرين الأول +FormatData/ar_JO/MonthNames/10=تشرين الثاني +FormatData/ar_JO/MonthNames/11=كانون الأول FormatData/ar_JO/MonthNames/12= -FormatData/ar_JO/MonthAbbreviations/0=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_JO/MonthAbbreviations/1=\u0634\u0628\u0627\u0637 -FormatData/ar_JO/MonthAbbreviations/2=\u0622\u0630\u0627\u0631 -FormatData/ar_JO/MonthAbbreviations/3=\u0646\u064a\u0633\u0627\u0646 -FormatData/ar_JO/MonthAbbreviations/4=\u0623\u064a\u0627\u0631 -FormatData/ar_JO/MonthAbbreviations/5=\u062d\u0632\u064a\u0631\u0627\u0646 -FormatData/ar_JO/MonthAbbreviations/6=\u062a\u0645\u0648\u0632 -FormatData/ar_JO/MonthAbbreviations/7=\u0622\u0628 -FormatData/ar_JO/MonthAbbreviations/8=\u0623\u064a\u0644\u0648\u0644 -FormatData/ar_JO/MonthAbbreviations/9=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644 -FormatData/ar_JO/MonthAbbreviations/10=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_JO/MonthAbbreviations/11=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644 +FormatData/ar_JO/MonthAbbreviations/0=كانون الثاني +FormatData/ar_JO/MonthAbbreviations/1=شباط +FormatData/ar_JO/MonthAbbreviations/2=آذار +FormatData/ar_JO/MonthAbbreviations/3=نيسان +FormatData/ar_JO/MonthAbbreviations/4=أيار +FormatData/ar_JO/MonthAbbreviations/5=حزيران +FormatData/ar_JO/MonthAbbreviations/6=تموز +FormatData/ar_JO/MonthAbbreviations/7=آب +FormatData/ar_JO/MonthAbbreviations/8=أيلول +FormatData/ar_JO/MonthAbbreviations/9=تشرين الأول +FormatData/ar_JO/MonthAbbreviations/10=تشرين الثاني +FormatData/ar_JO/MonthAbbreviations/11=كانون الأول FormatData/ar_JO/MonthAbbreviations/12= -FormatData/ar_JO/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_JO/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_JO/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_JO/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_JO/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_JO/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_JO/DayNames/6=\u0627\u0644\u0633\u0628\u062a +FormatData/ar_JO/DayNames/0=الأحد +FormatData/ar_JO/DayNames/1=الاثنين +FormatData/ar_JO/DayNames/2=الثلاثاء +FormatData/ar_JO/DayNames/3=الأربعاء +FormatData/ar_JO/DayNames/4=الخميس +FormatData/ar_JO/DayNames/5=الجمعة +FormatData/ar_JO/DayNames/6=السبت CalendarData/ar_JO/firstDayOfWeek=7 CalendarData/ar_JO/minimalDaysInFirstWeek=1 -FormatData/ar_JO/Eras/0=\u0642.\u0645 -FormatData/ar_JO/Eras/1=\u0645 -LocaleNames/ar_JO/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_JO/AmPmMarkers/0=\u0635 -FormatData/ar_JO/AmPmMarkers/1=\u0645 +FormatData/ar_JO/Eras/0=ق.م +FormatData/ar_JO/Eras/1=م +LocaleNames/ar_JO/ar=العربية +FormatData/ar_JO/AmPmMarkers/0=ص +FormatData/ar_JO/AmPmMarkers/1=م FormatData/ar_JO/TimePatterns/0=z hh:mm:ss a FormatData/ar_JO/TimePatterns/1=z hh:mm:ss a FormatData/ar_JO/TimePatterns/2=hh:mm:ss a @@ -1232,23 +1232,23 @@ FormatData/ar_JO/DatePatterns/1=dd MMMM, yyyy FormatData/ar_JO/DatePatterns/2=dd/MM/yyyy FormatData/ar_JO/DatePatterns/3=dd/MM/yy FormatData/ar_JO/DateTimePatterns/0={1} {0} -LocaleNames/ar_JO/EG=\u0645\u0635\u0631 -LocaleNames/ar_JO/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_JO/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_JO/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_JO/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_JO/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_JO/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_JO/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_JO/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_JO/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_JO/QA=\u0642\u0637\u0631 -LocaleNames/ar_JO/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_JO/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_JO/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_JO/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_JO/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_JO/YE=\u0627\u0644\u064a\u0645\u0646 +LocaleNames/ar_JO/EG=مصر +LocaleNames/ar_JO/DZ=الجزائر +LocaleNames/ar_JO/BH=البحرين +LocaleNames/ar_JO/IQ=العراق +LocaleNames/ar_JO/JO=الأردن +LocaleNames/ar_JO/KW=الكويت +LocaleNames/ar_JO/LB=لبنان +LocaleNames/ar_JO/LY=ليبيا +LocaleNames/ar_JO/MA=المغرب +LocaleNames/ar_JO/OM=عُمان +LocaleNames/ar_JO/QA=قطر +LocaleNames/ar_JO/SA=المملكة العربية السعودية +LocaleNames/ar_JO/SD=السودان +LocaleNames/ar_JO/SY=سوريا +LocaleNames/ar_JO/TN=تونس +LocaleNames/ar_JO/AE=الإمارات العربية المتحدة +LocaleNames/ar_JO/YE=اليمن FormatData/ar_JO/NumberElements/0=. FormatData/ar_JO/NumberElements/1=, FormatData/ar_JO/NumberElements/2=; @@ -1257,60 +1257,60 @@ FormatData/ar_JO/NumberElements/4=0 FormatData/ar_JO/NumberElements/5=# FormatData/ar_JO/NumberElements/6=- FormatData/ar_JO/NumberElements/7=E -FormatData/ar_JO/NumberElements/8=\u2030 -FormatData/ar_JO/NumberElements/9=\u221e -FormatData/ar_JO/NumberElements/10=\ufffd -CurrencyNames/ar_KW/KWD=\u062f.\u0643.\u200f +FormatData/ar_JO/NumberElements/8=‰ +FormatData/ar_JO/NumberElements/9=∞ +FormatData/ar_JO/NumberElements/10=� +CurrencyNames/ar_KW/KWD=د.ك.‏ FormatData/ar_KW/NumberPatterns/0=#,##0.###;#,##0.###- -# FormatData/ar_KW/NumberPatterns/1='\u062f.\u0643.\u200f' #,##0.###;'\u062f.\u0643.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_KW/NumberPatterns/1='د.ك.‏' #,##0.###;'د.ك.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_KW/NumberPatterns/2=#,##0% -FormatData/ar_KW/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_KW/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_KW/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_KW/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_KW/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_KW/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_KW/DayNames/6=\u0627\u0644\u0633\u0628\u062a +FormatData/ar_KW/DayNames/0=الأحد +FormatData/ar_KW/DayNames/1=الاثنين +FormatData/ar_KW/DayNames/2=الثلاثاء +FormatData/ar_KW/DayNames/3=الأربعاء +FormatData/ar_KW/DayNames/4=الخميس +FormatData/ar_KW/DayNames/5=الجمعة +FormatData/ar_KW/DayNames/6=السبت CalendarData/ar_KW/firstDayOfWeek=7 CalendarData/ar_KW/minimalDaysInFirstWeek=1 -FormatData/ar_KW/MonthAbbreviations/0=\u064a\u0646\u0627 -FormatData/ar_KW/MonthAbbreviations/1=\u0641\u0628\u0631 -FormatData/ar_KW/MonthAbbreviations/2=\u0645\u0627\u0631 -FormatData/ar_KW/MonthAbbreviations/3=\u0623\u0628\u0631 -FormatData/ar_KW/MonthAbbreviations/4=\u0645\u0627\u064a -FormatData/ar_KW/MonthAbbreviations/5=\u064a\u0648\u0646 -FormatData/ar_KW/MonthAbbreviations/6=\u064a\u0648\u0644 -FormatData/ar_KW/MonthAbbreviations/7=\u0623\u063a\u0633 -FormatData/ar_KW/MonthAbbreviations/8=\u0633\u0628\u062a -FormatData/ar_KW/MonthAbbreviations/9=\u0623\u0643\u062a -FormatData/ar_KW/MonthAbbreviations/10=\u0646\u0648\u0641 -FormatData/ar_KW/MonthAbbreviations/11=\u062f\u064a\u0633 +FormatData/ar_KW/MonthAbbreviations/0=ينا +FormatData/ar_KW/MonthAbbreviations/1=فبر +FormatData/ar_KW/MonthAbbreviations/2=مار +FormatData/ar_KW/MonthAbbreviations/3=أبر +FormatData/ar_KW/MonthAbbreviations/4=ماي +FormatData/ar_KW/MonthAbbreviations/5=يون +FormatData/ar_KW/MonthAbbreviations/6=يول +FormatData/ar_KW/MonthAbbreviations/7=أغس +FormatData/ar_KW/MonthAbbreviations/8=سبت +FormatData/ar_KW/MonthAbbreviations/9=أكت +FormatData/ar_KW/MonthAbbreviations/10=نوف +FormatData/ar_KW/MonthAbbreviations/11=ديس FormatData/ar_KW/MonthAbbreviations/12= -FormatData/ar_KW/Eras/0=\u0642.\u0645 -FormatData/ar_KW/Eras/1=\u0645 -FormatData/ar_KW/DayAbbreviations/0=\u062d -FormatData/ar_KW/DayAbbreviations/1=\u0646 -FormatData/ar_KW/DayAbbreviations/2=\u062b -FormatData/ar_KW/DayAbbreviations/3=\u0631 -FormatData/ar_KW/DayAbbreviations/4=\u062e -FormatData/ar_KW/DayAbbreviations/5=\u062c -FormatData/ar_KW/DayAbbreviations/6=\u0633 -LocaleNames/ar_KW/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_KW/MonthNames/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_KW/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_KW/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_KW/MonthNames/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_KW/MonthNames/4=\u0645\u0627\u064a\u0648 -FormatData/ar_KW/MonthNames/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_KW/MonthNames/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_KW/MonthNames/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_KW/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_KW/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_KW/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_KW/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_KW/Eras/0=ق.م +FormatData/ar_KW/Eras/1=م +FormatData/ar_KW/DayAbbreviations/0=ح +FormatData/ar_KW/DayAbbreviations/1=ن +FormatData/ar_KW/DayAbbreviations/2=ث +FormatData/ar_KW/DayAbbreviations/3=ر +FormatData/ar_KW/DayAbbreviations/4=خ +FormatData/ar_KW/DayAbbreviations/5=ج +FormatData/ar_KW/DayAbbreviations/6=س +LocaleNames/ar_KW/ar=العربية +FormatData/ar_KW/MonthNames/0=يناير +FormatData/ar_KW/MonthNames/1=فبراير +FormatData/ar_KW/MonthNames/2=مارس +FormatData/ar_KW/MonthNames/3=أبريل +FormatData/ar_KW/MonthNames/4=مايو +FormatData/ar_KW/MonthNames/5=يونيو +FormatData/ar_KW/MonthNames/6=يوليو +FormatData/ar_KW/MonthNames/7=أغسطس +FormatData/ar_KW/MonthNames/8=سبتمبر +FormatData/ar_KW/MonthNames/9=أكتوبر +FormatData/ar_KW/MonthNames/10=نوفمبر +FormatData/ar_KW/MonthNames/11=ديسمبر FormatData/ar_KW/MonthNames/12= -FormatData/ar_KW/AmPmMarkers/0=\u0635 -FormatData/ar_KW/AmPmMarkers/1=\u0645 +FormatData/ar_KW/AmPmMarkers/0=ص +FormatData/ar_KW/AmPmMarkers/1=م FormatData/ar_KW/TimePatterns/0=z hh:mm:ss a FormatData/ar_KW/TimePatterns/1=z hh:mm:ss a FormatData/ar_KW/TimePatterns/2=hh:mm:ss a @@ -1320,23 +1320,23 @@ FormatData/ar_KW/DatePatterns/1=dd MMMM, yyyy FormatData/ar_KW/DatePatterns/2=dd/MM/yyyy FormatData/ar_KW/DatePatterns/3=dd/MM/yy FormatData/ar_KW/DateTimePatterns/0={1} {0} -LocaleNames/ar_KW/EG=\u0645\u0635\u0631 -LocaleNames/ar_KW/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_KW/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_KW/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_KW/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_KW/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_KW/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_KW/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_KW/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_KW/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_KW/QA=\u0642\u0637\u0631 -LocaleNames/ar_KW/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_KW/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_KW/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_KW/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_KW/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_KW/YE=\u0627\u0644\u064a\u0645\u0646 +LocaleNames/ar_KW/EG=مصر +LocaleNames/ar_KW/DZ=الجزائر +LocaleNames/ar_KW/BH=البحرين +LocaleNames/ar_KW/IQ=العراق +LocaleNames/ar_KW/JO=الأردن +LocaleNames/ar_KW/KW=الكويت +LocaleNames/ar_KW/LB=لبنان +LocaleNames/ar_KW/LY=ليبيا +LocaleNames/ar_KW/MA=المغرب +LocaleNames/ar_KW/OM=عُمان +LocaleNames/ar_KW/QA=قطر +LocaleNames/ar_KW/SA=المملكة العربية السعودية +LocaleNames/ar_KW/SD=السودان +LocaleNames/ar_KW/SY=سوريا +LocaleNames/ar_KW/TN=تونس +LocaleNames/ar_KW/AE=الإمارات العربية المتحدة +LocaleNames/ar_KW/YE=اليمن FormatData/ar_KW/NumberElements/0=. FormatData/ar_KW/NumberElements/1=, FormatData/ar_KW/NumberElements/2=; @@ -1345,60 +1345,60 @@ FormatData/ar_KW/NumberElements/4=0 FormatData/ar_KW/NumberElements/5=# FormatData/ar_KW/NumberElements/6=- FormatData/ar_KW/NumberElements/7=E -FormatData/ar_KW/NumberElements/8=\u2030 -FormatData/ar_KW/NumberElements/9=\u221e -FormatData/ar_KW/NumberElements/10=\ufffd +FormatData/ar_KW/NumberElements/8=‰ +FormatData/ar_KW/NumberElements/9=∞ +FormatData/ar_KW/NumberElements/10=� FormatData/ar_LB/NumberPatterns/0=#,##0.###;#,##0.###- -# FormatData/ar_LB/NumberPatterns/1='\u0644.\u0644.\u200f' #,##0.###;'\u0644.\u0644.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_LB/NumberPatterns/1='ل.ل.‏' #,##0.###;'ل.ل.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_LB/NumberPatterns/2=#,##0% -CurrencyNames/ar_LB/LBP=\u0644.\u0644.\u200f -FormatData/ar_LB/DayAbbreviations/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_LB/DayAbbreviations/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_LB/DayAbbreviations/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_LB/DayAbbreviations/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_LB/DayAbbreviations/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_LB/DayAbbreviations/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_LB/DayAbbreviations/6=\u0627\u0644\u0633\u0628\u062a -FormatData/ar_LB/MonthNames/0=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_LB/MonthNames/1=\u0634\u0628\u0627\u0637 -FormatData/ar_LB/MonthNames/2=\u0622\u0630\u0627\u0631 -FormatData/ar_LB/MonthNames/3=\u0646\u064a\u0633\u0627\u0646 -FormatData/ar_LB/MonthNames/4=\u0623\u064a\u0627\u0631 -FormatData/ar_LB/MonthNames/5=\u062d\u0632\u064a\u0631\u0627\u0646 -FormatData/ar_LB/MonthNames/6=\u062a\u0645\u0648\u0632 -FormatData/ar_LB/MonthNames/7=\u0622\u0628 -FormatData/ar_LB/MonthNames/8=\u0623\u064a\u0644\u0648\u0644 -FormatData/ar_LB/MonthNames/9=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644 -FormatData/ar_LB/MonthNames/10=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_LB/MonthNames/11=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644 +CurrencyNames/ar_LB/LBP=ل.ل.‏ +FormatData/ar_LB/DayAbbreviations/0=الأحد +FormatData/ar_LB/DayAbbreviations/1=الاثنين +FormatData/ar_LB/DayAbbreviations/2=الثلاثاء +FormatData/ar_LB/DayAbbreviations/3=الأربعاء +FormatData/ar_LB/DayAbbreviations/4=الخميس +FormatData/ar_LB/DayAbbreviations/5=الجمعة +FormatData/ar_LB/DayAbbreviations/6=السبت +FormatData/ar_LB/MonthNames/0=كانون الثاني +FormatData/ar_LB/MonthNames/1=شباط +FormatData/ar_LB/MonthNames/2=آذار +FormatData/ar_LB/MonthNames/3=نيسان +FormatData/ar_LB/MonthNames/4=أيار +FormatData/ar_LB/MonthNames/5=حزيران +FormatData/ar_LB/MonthNames/6=تموز +FormatData/ar_LB/MonthNames/7=آب +FormatData/ar_LB/MonthNames/8=أيلول +FormatData/ar_LB/MonthNames/9=تشرين الأول +FormatData/ar_LB/MonthNames/10=تشرين الثاني +FormatData/ar_LB/MonthNames/11=كانون الأول FormatData/ar_LB/MonthNames/12= -FormatData/ar_LB/MonthAbbreviations/0=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_LB/MonthAbbreviations/1=\u0634\u0628\u0627\u0637 -FormatData/ar_LB/MonthAbbreviations/2=\u0622\u0630\u0627\u0631 -FormatData/ar_LB/MonthAbbreviations/3=\u0646\u064a\u0633\u0627\u0646 -FormatData/ar_LB/MonthAbbreviations/4=\u0623\u064a\u0627\u0631 -FormatData/ar_LB/MonthAbbreviations/5=\u062d\u0632\u064a\u0631\u0627\u0646 -FormatData/ar_LB/MonthAbbreviations/6=\u062a\u0645\u0648\u0632 -FormatData/ar_LB/MonthAbbreviations/7=\u0622\u0628 -FormatData/ar_LB/MonthAbbreviations/8=\u0623\u064a\u0644\u0648\u0644 -FormatData/ar_LB/MonthAbbreviations/9=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644 -FormatData/ar_LB/MonthAbbreviations/10=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_LB/MonthAbbreviations/11=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644 +FormatData/ar_LB/MonthAbbreviations/0=كانون الثاني +FormatData/ar_LB/MonthAbbreviations/1=شباط +FormatData/ar_LB/MonthAbbreviations/2=آذار +FormatData/ar_LB/MonthAbbreviations/3=نيسان +FormatData/ar_LB/MonthAbbreviations/4=أيار +FormatData/ar_LB/MonthAbbreviations/5=حزيران +FormatData/ar_LB/MonthAbbreviations/6=تموز +FormatData/ar_LB/MonthAbbreviations/7=آب +FormatData/ar_LB/MonthAbbreviations/8=أيلول +FormatData/ar_LB/MonthAbbreviations/9=تشرين الأول +FormatData/ar_LB/MonthAbbreviations/10=تشرين الثاني +FormatData/ar_LB/MonthAbbreviations/11=كانون الأول FormatData/ar_LB/MonthAbbreviations/12= -FormatData/ar_LB/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_LB/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_LB/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_LB/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_LB/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_LB/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_LB/DayNames/6=\u0627\u0644\u0633\u0628\u062a +FormatData/ar_LB/DayNames/0=الأحد +FormatData/ar_LB/DayNames/1=الاثنين +FormatData/ar_LB/DayNames/2=الثلاثاء +FormatData/ar_LB/DayNames/3=الأربعاء +FormatData/ar_LB/DayNames/4=الخميس +FormatData/ar_LB/DayNames/5=الجمعة +FormatData/ar_LB/DayNames/6=السبت CalendarData/ar_LB/firstDayOfWeek=7 CalendarData/ar_LB/minimalDaysInFirstWeek=1 -FormatData/ar_LB/Eras/0=\u0642.\u0645 -FormatData/ar_LB/Eras/1=\u0645 -LocaleNames/ar_LB/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_LB/AmPmMarkers/0=\u0635 -FormatData/ar_LB/AmPmMarkers/1=\u0645 +FormatData/ar_LB/Eras/0=ق.م +FormatData/ar_LB/Eras/1=م +LocaleNames/ar_LB/ar=العربية +FormatData/ar_LB/AmPmMarkers/0=ص +FormatData/ar_LB/AmPmMarkers/1=م FormatData/ar_LB/TimePatterns/0=z hh:mm:ss a FormatData/ar_LB/TimePatterns/1=z hh:mm:ss a FormatData/ar_LB/TimePatterns/2=hh:mm:ss a @@ -1408,23 +1408,23 @@ FormatData/ar_LB/DatePatterns/1=dd MMMM, yyyy FormatData/ar_LB/DatePatterns/2=dd/MM/yyyy FormatData/ar_LB/DatePatterns/3=dd/MM/yy FormatData/ar_LB/DateTimePatterns/0={1} {0} -LocaleNames/ar_LB/EG=\u0645\u0635\u0631 -LocaleNames/ar_LB/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_LB/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_LB/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_LB/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_LB/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_LB/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_LB/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_LB/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_LB/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_LB/QA=\u0642\u0637\u0631 -LocaleNames/ar_LB/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_LB/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_LB/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_LB/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_LB/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_LB/YE=\u0627\u0644\u064a\u0645\u0646 +LocaleNames/ar_LB/EG=مصر +LocaleNames/ar_LB/DZ=الجزائر +LocaleNames/ar_LB/BH=البحرين +LocaleNames/ar_LB/IQ=العراق +LocaleNames/ar_LB/JO=الأردن +LocaleNames/ar_LB/KW=الكويت +LocaleNames/ar_LB/LB=لبنان +LocaleNames/ar_LB/LY=ليبيا +LocaleNames/ar_LB/MA=المغرب +LocaleNames/ar_LB/OM=عُمان +LocaleNames/ar_LB/QA=قطر +LocaleNames/ar_LB/SA=المملكة العربية السعودية +LocaleNames/ar_LB/SD=السودان +LocaleNames/ar_LB/SY=سوريا +LocaleNames/ar_LB/TN=تونس +LocaleNames/ar_LB/AE=الإمارات العربية المتحدة +LocaleNames/ar_LB/YE=اليمن FormatData/ar_LB/NumberElements/0=. FormatData/ar_LB/NumberElements/1=, FormatData/ar_LB/NumberElements/2=; @@ -1433,60 +1433,60 @@ FormatData/ar_LB/NumberElements/4=0 FormatData/ar_LB/NumberElements/5=# FormatData/ar_LB/NumberElements/6=- FormatData/ar_LB/NumberElements/7=E -FormatData/ar_LB/NumberElements/8=\u2030 -FormatData/ar_LB/NumberElements/9=\u221e -FormatData/ar_LB/NumberElements/10=\ufffd -CurrencyNames/ar_LY/LYD=\u062f.\u0644.\u200f +FormatData/ar_LB/NumberElements/8=‰ +FormatData/ar_LB/NumberElements/9=∞ +FormatData/ar_LB/NumberElements/10=� +CurrencyNames/ar_LY/LYD=د.ل.‏ FormatData/ar_LY/NumberPatterns/0=#,##0.###;#,##0.###- -# FormatData/ar_LY/NumberPatterns/1='\u062f.\u0644.\u200f' #,##0.###;'\u062f.\u0644.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_LY/NumberPatterns/1='د.ل.‏' #,##0.###;'د.ل.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_LY/NumberPatterns/2=#,##0% -FormatData/ar_LY/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_LY/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_LY/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_LY/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_LY/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_LY/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_LY/DayNames/6=\u0627\u0644\u0633\u0628\u062a +FormatData/ar_LY/DayNames/0=الأحد +FormatData/ar_LY/DayNames/1=الاثنين +FormatData/ar_LY/DayNames/2=الثلاثاء +FormatData/ar_LY/DayNames/3=الأربعاء +FormatData/ar_LY/DayNames/4=الخميس +FormatData/ar_LY/DayNames/5=الجمعة +FormatData/ar_LY/DayNames/6=السبت CalendarData/ar_LY/firstDayOfWeek=7 CalendarData/ar_LY/minimalDaysInFirstWeek=1 -FormatData/ar_LY/MonthAbbreviations/0=\u064a\u0646\u0627 -FormatData/ar_LY/MonthAbbreviations/1=\u0641\u0628\u0631 -FormatData/ar_LY/MonthAbbreviations/2=\u0645\u0627\u0631 -FormatData/ar_LY/MonthAbbreviations/3=\u0623\u0628\u0631 -FormatData/ar_LY/MonthAbbreviations/4=\u0645\u0627\u064a -FormatData/ar_LY/MonthAbbreviations/5=\u064a\u0648\u0646 -FormatData/ar_LY/MonthAbbreviations/6=\u064a\u0648\u0644 -FormatData/ar_LY/MonthAbbreviations/7=\u0623\u063a\u0633 -FormatData/ar_LY/MonthAbbreviations/8=\u0633\u0628\u062a -FormatData/ar_LY/MonthAbbreviations/9=\u0623\u0643\u062a -FormatData/ar_LY/MonthAbbreviations/10=\u0646\u0648\u0641 -FormatData/ar_LY/MonthAbbreviations/11=\u062f\u064a\u0633 +FormatData/ar_LY/MonthAbbreviations/0=ينا +FormatData/ar_LY/MonthAbbreviations/1=فبر +FormatData/ar_LY/MonthAbbreviations/2=مار +FormatData/ar_LY/MonthAbbreviations/3=أبر +FormatData/ar_LY/MonthAbbreviations/4=ماي +FormatData/ar_LY/MonthAbbreviations/5=يون +FormatData/ar_LY/MonthAbbreviations/6=يول +FormatData/ar_LY/MonthAbbreviations/7=أغس +FormatData/ar_LY/MonthAbbreviations/8=سبت +FormatData/ar_LY/MonthAbbreviations/9=أكت +FormatData/ar_LY/MonthAbbreviations/10=نوف +FormatData/ar_LY/MonthAbbreviations/11=ديس FormatData/ar_LY/MonthAbbreviations/12= -FormatData/ar_LY/Eras/0=\u0642.\u0645 -FormatData/ar_LY/Eras/1=\u0645 -FormatData/ar_LY/DayAbbreviations/0=\u062d -FormatData/ar_LY/DayAbbreviations/1=\u0646 -FormatData/ar_LY/DayAbbreviations/2=\u062b -FormatData/ar_LY/DayAbbreviations/3=\u0631 -FormatData/ar_LY/DayAbbreviations/4=\u062e -FormatData/ar_LY/DayAbbreviations/5=\u062c -FormatData/ar_LY/DayAbbreviations/6=\u0633 -LocaleNames/ar_LY/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_LY/MonthNames/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_LY/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_LY/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_LY/MonthNames/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_LY/MonthNames/4=\u0645\u0627\u064a\u0648 -FormatData/ar_LY/MonthNames/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_LY/MonthNames/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_LY/MonthNames/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_LY/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_LY/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_LY/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_LY/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_LY/Eras/0=ق.م +FormatData/ar_LY/Eras/1=م +FormatData/ar_LY/DayAbbreviations/0=ح +FormatData/ar_LY/DayAbbreviations/1=ن +FormatData/ar_LY/DayAbbreviations/2=ث +FormatData/ar_LY/DayAbbreviations/3=ر +FormatData/ar_LY/DayAbbreviations/4=خ +FormatData/ar_LY/DayAbbreviations/5=ج +FormatData/ar_LY/DayAbbreviations/6=س +LocaleNames/ar_LY/ar=العربية +FormatData/ar_LY/MonthNames/0=يناير +FormatData/ar_LY/MonthNames/1=فبراير +FormatData/ar_LY/MonthNames/2=مارس +FormatData/ar_LY/MonthNames/3=أبريل +FormatData/ar_LY/MonthNames/4=مايو +FormatData/ar_LY/MonthNames/5=يونيو +FormatData/ar_LY/MonthNames/6=يوليو +FormatData/ar_LY/MonthNames/7=أغسطس +FormatData/ar_LY/MonthNames/8=سبتمبر +FormatData/ar_LY/MonthNames/9=أكتوبر +FormatData/ar_LY/MonthNames/10=نوفمبر +FormatData/ar_LY/MonthNames/11=ديسمبر FormatData/ar_LY/MonthNames/12= -FormatData/ar_LY/AmPmMarkers/0=\u0635 -FormatData/ar_LY/AmPmMarkers/1=\u0645 +FormatData/ar_LY/AmPmMarkers/0=ص +FormatData/ar_LY/AmPmMarkers/1=م FormatData/ar_LY/TimePatterns/0=z hh:mm:ss a FormatData/ar_LY/TimePatterns/1=z hh:mm:ss a FormatData/ar_LY/TimePatterns/2=hh:mm:ss a @@ -1496,23 +1496,23 @@ FormatData/ar_LY/DatePatterns/1=dd MMMM, yyyy FormatData/ar_LY/DatePatterns/2=dd/MM/yyyy FormatData/ar_LY/DatePatterns/3=dd/MM/yy FormatData/ar_LY/DateTimePatterns/0={1} {0} -LocaleNames/ar_LY/EG=\u0645\u0635\u0631 -LocaleNames/ar_LY/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_LY/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_LY/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_LY/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_LY/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_LY/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_LY/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_LY/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_LY/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_LY/QA=\u0642\u0637\u0631 -LocaleNames/ar_LY/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_LY/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_LY/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_LY/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_LY/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_LY/YE=\u0627\u0644\u064a\u0645\u0646 +LocaleNames/ar_LY/EG=مصر +LocaleNames/ar_LY/DZ=الجزائر +LocaleNames/ar_LY/BH=البحرين +LocaleNames/ar_LY/IQ=العراق +LocaleNames/ar_LY/JO=الأردن +LocaleNames/ar_LY/KW=الكويت +LocaleNames/ar_LY/LB=لبنان +LocaleNames/ar_LY/LY=ليبيا +LocaleNames/ar_LY/MA=المغرب +LocaleNames/ar_LY/OM=عُمان +LocaleNames/ar_LY/QA=قطر +LocaleNames/ar_LY/SA=المملكة العربية السعودية +LocaleNames/ar_LY/SD=السودان +LocaleNames/ar_LY/SY=سوريا +LocaleNames/ar_LY/TN=تونس +LocaleNames/ar_LY/AE=الإمارات العربية المتحدة +LocaleNames/ar_LY/YE=اليمن FormatData/ar_LY/NumberElements/0=. FormatData/ar_LY/NumberElements/1=, FormatData/ar_LY/NumberElements/2=; @@ -1521,60 +1521,60 @@ FormatData/ar_LY/NumberElements/4=0 FormatData/ar_LY/NumberElements/5=# FormatData/ar_LY/NumberElements/6=- FormatData/ar_LY/NumberElements/7=E -FormatData/ar_LY/NumberElements/8=\u2030 -FormatData/ar_LY/NumberElements/9=\u221e -FormatData/ar_LY/NumberElements/10=\ufffd -CurrencyNames/ar_MA/MAD=\u062f.\u0645.\u200f +FormatData/ar_LY/NumberElements/8=‰ +FormatData/ar_LY/NumberElements/9=∞ +FormatData/ar_LY/NumberElements/10=� +CurrencyNames/ar_MA/MAD=د.م.‏ FormatData/ar_MA/NumberPatterns/0=#,##0.###;#,##0.###- -# FormatData/ar_MA/NumberPatterns/1='\u062f.\u0645.\u200f' #,##0.###;'\u062f.\u0645.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_MA/NumberPatterns/1='د.م.‏' #,##0.###;'د.م.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_MA/NumberPatterns/2=#,##0% -FormatData/ar_MA/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_MA/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_MA/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_MA/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_MA/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_MA/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_MA/DayNames/6=\u0627\u0644\u0633\u0628\u062a +FormatData/ar_MA/DayNames/0=الأحد +FormatData/ar_MA/DayNames/1=الاثنين +FormatData/ar_MA/DayNames/2=الثلاثاء +FormatData/ar_MA/DayNames/3=الأربعاء +FormatData/ar_MA/DayNames/4=الخميس +FormatData/ar_MA/DayNames/5=الجمعة +FormatData/ar_MA/DayNames/6=السبت CalendarData/ar_MA/firstDayOfWeek=7 CalendarData/ar_MA/minimalDaysInFirstWeek=1 -FormatData/ar_MA/MonthAbbreviations/0=\u064a\u0646\u0627 -FormatData/ar_MA/MonthAbbreviations/1=\u0641\u0628\u0631 -FormatData/ar_MA/MonthAbbreviations/2=\u0645\u0627\u0631 -FormatData/ar_MA/MonthAbbreviations/3=\u0623\u0628\u0631 -FormatData/ar_MA/MonthAbbreviations/4=\u0645\u0627\u064a -FormatData/ar_MA/MonthAbbreviations/5=\u064a\u0648\u0646 -FormatData/ar_MA/MonthAbbreviations/6=\u064a\u0648\u0644 -FormatData/ar_MA/MonthAbbreviations/7=\u0623\u063a\u0633 -FormatData/ar_MA/MonthAbbreviations/8=\u0633\u0628\u062a -FormatData/ar_MA/MonthAbbreviations/9=\u0623\u0643\u062a -FormatData/ar_MA/MonthAbbreviations/10=\u0646\u0648\u0641 -FormatData/ar_MA/MonthAbbreviations/11=\u062f\u064a\u0633 +FormatData/ar_MA/MonthAbbreviations/0=ينا +FormatData/ar_MA/MonthAbbreviations/1=فبر +FormatData/ar_MA/MonthAbbreviations/2=مار +FormatData/ar_MA/MonthAbbreviations/3=أبر +FormatData/ar_MA/MonthAbbreviations/4=ماي +FormatData/ar_MA/MonthAbbreviations/5=يون +FormatData/ar_MA/MonthAbbreviations/6=يول +FormatData/ar_MA/MonthAbbreviations/7=أغس +FormatData/ar_MA/MonthAbbreviations/8=سبت +FormatData/ar_MA/MonthAbbreviations/9=أكت +FormatData/ar_MA/MonthAbbreviations/10=نوف +FormatData/ar_MA/MonthAbbreviations/11=ديس FormatData/ar_MA/MonthAbbreviations/12= -FormatData/ar_MA/Eras/0=\u0642.\u0645 -FormatData/ar_MA/Eras/1=\u0645 -FormatData/ar_MA/DayAbbreviations/0=\u062d -FormatData/ar_MA/DayAbbreviations/1=\u0646 -FormatData/ar_MA/DayAbbreviations/2=\u062b -FormatData/ar_MA/DayAbbreviations/3=\u0631 -FormatData/ar_MA/DayAbbreviations/4=\u062e -FormatData/ar_MA/DayAbbreviations/5=\u062c -FormatData/ar_MA/DayAbbreviations/6=\u0633 -LocaleNames/ar_MA/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_MA/MonthNames/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_MA/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_MA/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_MA/MonthNames/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_MA/MonthNames/4=\u0645\u0627\u064a\u0648 -FormatData/ar_MA/MonthNames/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_MA/MonthNames/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_MA/MonthNames/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_MA/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_MA/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_MA/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_MA/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_MA/Eras/0=ق.م +FormatData/ar_MA/Eras/1=م +FormatData/ar_MA/DayAbbreviations/0=ح +FormatData/ar_MA/DayAbbreviations/1=ن +FormatData/ar_MA/DayAbbreviations/2=ث +FormatData/ar_MA/DayAbbreviations/3=ر +FormatData/ar_MA/DayAbbreviations/4=خ +FormatData/ar_MA/DayAbbreviations/5=ج +FormatData/ar_MA/DayAbbreviations/6=س +LocaleNames/ar_MA/ar=العربية +FormatData/ar_MA/MonthNames/0=يناير +FormatData/ar_MA/MonthNames/1=فبراير +FormatData/ar_MA/MonthNames/2=مارس +FormatData/ar_MA/MonthNames/3=أبريل +FormatData/ar_MA/MonthNames/4=مايو +FormatData/ar_MA/MonthNames/5=يونيو +FormatData/ar_MA/MonthNames/6=يوليو +FormatData/ar_MA/MonthNames/7=أغسطس +FormatData/ar_MA/MonthNames/8=سبتمبر +FormatData/ar_MA/MonthNames/9=أكتوبر +FormatData/ar_MA/MonthNames/10=نوفمبر +FormatData/ar_MA/MonthNames/11=ديسمبر FormatData/ar_MA/MonthNames/12= -FormatData/ar_MA/AmPmMarkers/0=\u0635 -FormatData/ar_MA/AmPmMarkers/1=\u0645 +FormatData/ar_MA/AmPmMarkers/0=ص +FormatData/ar_MA/AmPmMarkers/1=م FormatData/ar_MA/TimePatterns/0=z hh:mm:ss a FormatData/ar_MA/TimePatterns/1=z hh:mm:ss a FormatData/ar_MA/TimePatterns/2=hh:mm:ss a @@ -1584,23 +1584,23 @@ FormatData/ar_MA/DatePatterns/1=dd MMMM, yyyy FormatData/ar_MA/DatePatterns/2=dd/MM/yyyy FormatData/ar_MA/DatePatterns/3=dd/MM/yy FormatData/ar_MA/DateTimePatterns/0={1} {0} -LocaleNames/ar_MA/EG=\u0645\u0635\u0631 -LocaleNames/ar_MA/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_MA/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_MA/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_MA/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_MA/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_MA/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_MA/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_MA/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_MA/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_MA/QA=\u0642\u0637\u0631 -LocaleNames/ar_MA/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_MA/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_MA/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_MA/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_MA/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_MA/YE=\u0627\u0644\u064a\u0645\u0646 +LocaleNames/ar_MA/EG=مصر +LocaleNames/ar_MA/DZ=الجزائر +LocaleNames/ar_MA/BH=البحرين +LocaleNames/ar_MA/IQ=العراق +LocaleNames/ar_MA/JO=الأردن +LocaleNames/ar_MA/KW=الكويت +LocaleNames/ar_MA/LB=لبنان +LocaleNames/ar_MA/LY=ليبيا +LocaleNames/ar_MA/MA=المغرب +LocaleNames/ar_MA/OM=عُمان +LocaleNames/ar_MA/QA=قطر +LocaleNames/ar_MA/SA=المملكة العربية السعودية +LocaleNames/ar_MA/SD=السودان +LocaleNames/ar_MA/SY=سوريا +LocaleNames/ar_MA/TN=تونس +LocaleNames/ar_MA/AE=الإمارات العربية المتحدة +LocaleNames/ar_MA/YE=اليمن FormatData/ar_MA/NumberElements/0=. FormatData/ar_MA/NumberElements/1=, FormatData/ar_MA/NumberElements/2=; @@ -1609,60 +1609,60 @@ FormatData/ar_MA/NumberElements/4=0 FormatData/ar_MA/NumberElements/5=# FormatData/ar_MA/NumberElements/6=- FormatData/ar_MA/NumberElements/7=E -FormatData/ar_MA/NumberElements/8=\u2030 -FormatData/ar_MA/NumberElements/9=\u221e -FormatData/ar_MA/NumberElements/10=\ufffd -CurrencyNames/ar_OM/OMR=\u0631.\u0639.\u200f +FormatData/ar_MA/NumberElements/8=‰ +FormatData/ar_MA/NumberElements/9=∞ +FormatData/ar_MA/NumberElements/10=� +CurrencyNames/ar_OM/OMR=ر.ع.‏ FormatData/ar_OM/NumberPatterns/0=#,##0.###;#,##0.###- -# FormatData/ar_OM/NumberPatterns/1='\u0631.\u0639.\u200f' #,##0.###;'\u0631.\u0639.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_OM/NumberPatterns/1='ر.ع.‏' #,##0.###;'ر.ع.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_OM/NumberPatterns/2=#,##0% -FormatData/ar_OM/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_OM/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_OM/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_OM/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_OM/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_OM/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_OM/DayNames/6=\u0627\u0644\u0633\u0628\u062a +FormatData/ar_OM/DayNames/0=الأحد +FormatData/ar_OM/DayNames/1=الاثنين +FormatData/ar_OM/DayNames/2=الثلاثاء +FormatData/ar_OM/DayNames/3=الأربعاء +FormatData/ar_OM/DayNames/4=الخميس +FormatData/ar_OM/DayNames/5=الجمعة +FormatData/ar_OM/DayNames/6=السبت CalendarData/ar_OM/firstDayOfWeek=7 CalendarData/ar_OM/minimalDaysInFirstWeek=1 -FormatData/ar_OM/MonthAbbreviations/0=\u064a\u0646\u0627 -FormatData/ar_OM/MonthAbbreviations/1=\u0641\u0628\u0631 -FormatData/ar_OM/MonthAbbreviations/2=\u0645\u0627\u0631 -FormatData/ar_OM/MonthAbbreviations/3=\u0623\u0628\u0631 -FormatData/ar_OM/MonthAbbreviations/4=\u0645\u0627\u064a -FormatData/ar_OM/MonthAbbreviations/5=\u064a\u0648\u0646 -FormatData/ar_OM/MonthAbbreviations/6=\u064a\u0648\u0644 -FormatData/ar_OM/MonthAbbreviations/7=\u0623\u063a\u0633 -FormatData/ar_OM/MonthAbbreviations/8=\u0633\u0628\u062a -FormatData/ar_OM/MonthAbbreviations/9=\u0623\u0643\u062a -FormatData/ar_OM/MonthAbbreviations/10=\u0646\u0648\u0641 -FormatData/ar_OM/MonthAbbreviations/11=\u062f\u064a\u0633 +FormatData/ar_OM/MonthAbbreviations/0=ينا +FormatData/ar_OM/MonthAbbreviations/1=فبر +FormatData/ar_OM/MonthAbbreviations/2=مار +FormatData/ar_OM/MonthAbbreviations/3=أبر +FormatData/ar_OM/MonthAbbreviations/4=ماي +FormatData/ar_OM/MonthAbbreviations/5=يون +FormatData/ar_OM/MonthAbbreviations/6=يول +FormatData/ar_OM/MonthAbbreviations/7=أغس +FormatData/ar_OM/MonthAbbreviations/8=سبت +FormatData/ar_OM/MonthAbbreviations/9=أكت +FormatData/ar_OM/MonthAbbreviations/10=نوف +FormatData/ar_OM/MonthAbbreviations/11=ديس FormatData/ar_OM/MonthAbbreviations/12= -FormatData/ar_OM/Eras/0=\u0642.\u0645 -FormatData/ar_OM/Eras/1=\u0645 -FormatData/ar_OM/DayAbbreviations/0=\u062d -FormatData/ar_OM/DayAbbreviations/1=\u0646 -FormatData/ar_OM/DayAbbreviations/2=\u062b -FormatData/ar_OM/DayAbbreviations/3=\u0631 -FormatData/ar_OM/DayAbbreviations/4=\u062e -FormatData/ar_OM/DayAbbreviations/5=\u062c -FormatData/ar_OM/DayAbbreviations/6=\u0633 -LocaleNames/ar_OM/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_OM/MonthNames/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_OM/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_OM/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_OM/MonthNames/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_OM/MonthNames/4=\u0645\u0627\u064a\u0648 -FormatData/ar_OM/MonthNames/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_OM/MonthNames/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_OM/MonthNames/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_OM/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_OM/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_OM/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_OM/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_OM/Eras/0=ق.م +FormatData/ar_OM/Eras/1=م +FormatData/ar_OM/DayAbbreviations/0=ح +FormatData/ar_OM/DayAbbreviations/1=ن +FormatData/ar_OM/DayAbbreviations/2=ث +FormatData/ar_OM/DayAbbreviations/3=ر +FormatData/ar_OM/DayAbbreviations/4=خ +FormatData/ar_OM/DayAbbreviations/5=ج +FormatData/ar_OM/DayAbbreviations/6=س +LocaleNames/ar_OM/ar=العربية +FormatData/ar_OM/MonthNames/0=يناير +FormatData/ar_OM/MonthNames/1=فبراير +FormatData/ar_OM/MonthNames/2=مارس +FormatData/ar_OM/MonthNames/3=أبريل +FormatData/ar_OM/MonthNames/4=مايو +FormatData/ar_OM/MonthNames/5=يونيو +FormatData/ar_OM/MonthNames/6=يوليو +FormatData/ar_OM/MonthNames/7=أغسطس +FormatData/ar_OM/MonthNames/8=سبتمبر +FormatData/ar_OM/MonthNames/9=أكتوبر +FormatData/ar_OM/MonthNames/10=نوفمبر +FormatData/ar_OM/MonthNames/11=ديسمبر FormatData/ar_OM/MonthNames/12= -FormatData/ar_OM/AmPmMarkers/0=\u0635 -FormatData/ar_OM/AmPmMarkers/1=\u0645 +FormatData/ar_OM/AmPmMarkers/0=ص +FormatData/ar_OM/AmPmMarkers/1=م FormatData/ar_OM/TimePatterns/0=z hh:mm:ss a FormatData/ar_OM/TimePatterns/1=z hh:mm:ss a FormatData/ar_OM/TimePatterns/2=hh:mm:ss a @@ -1672,23 +1672,23 @@ FormatData/ar_OM/DatePatterns/1=dd MMMM, yyyy FormatData/ar_OM/DatePatterns/2=dd/MM/yyyy FormatData/ar_OM/DatePatterns/3=dd/MM/yy FormatData/ar_OM/DateTimePatterns/0={1} {0} -LocaleNames/ar_OM/EG=\u0645\u0635\u0631 -LocaleNames/ar_OM/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_OM/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_OM/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_OM/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_OM/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_OM/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_OM/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_OM/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_OM/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_OM/QA=\u0642\u0637\u0631 -LocaleNames/ar_OM/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_OM/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_OM/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_OM/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_OM/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_OM/YE=\u0627\u0644\u064a\u0645\u0646 +LocaleNames/ar_OM/EG=مصر +LocaleNames/ar_OM/DZ=الجزائر +LocaleNames/ar_OM/BH=البحرين +LocaleNames/ar_OM/IQ=العراق +LocaleNames/ar_OM/JO=الأردن +LocaleNames/ar_OM/KW=الكويت +LocaleNames/ar_OM/LB=لبنان +LocaleNames/ar_OM/LY=ليبيا +LocaleNames/ar_OM/MA=المغرب +LocaleNames/ar_OM/OM=عُمان +LocaleNames/ar_OM/QA=قطر +LocaleNames/ar_OM/SA=المملكة العربية السعودية +LocaleNames/ar_OM/SD=السودان +LocaleNames/ar_OM/SY=سوريا +LocaleNames/ar_OM/TN=تونس +LocaleNames/ar_OM/AE=الإمارات العربية المتحدة +LocaleNames/ar_OM/YE=اليمن FormatData/ar_OM/NumberElements/0=. FormatData/ar_OM/NumberElements/1=, FormatData/ar_OM/NumberElements/2=; @@ -1697,60 +1697,60 @@ FormatData/ar_OM/NumberElements/4=0 FormatData/ar_OM/NumberElements/5=# FormatData/ar_OM/NumberElements/6=- FormatData/ar_OM/NumberElements/7=E -FormatData/ar_OM/NumberElements/8=\u2030 -FormatData/ar_OM/NumberElements/9=\u221e -FormatData/ar_OM/NumberElements/10=\ufffd -CurrencyNames/ar_QA/QAR=\u0631.\u0642.\u200f +FormatData/ar_OM/NumberElements/8=‰ +FormatData/ar_OM/NumberElements/9=∞ +FormatData/ar_OM/NumberElements/10=� +CurrencyNames/ar_QA/QAR=ر.ق.‏ FormatData/ar_QA/NumberPatterns/0=#,##0.###;#,##0.###- -# FormatData/ar_QA/NumberPatterns/1='\u0631.\u0642.\u200f' #,##0.###;'\u0631.\u0642.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_QA/NumberPatterns/1='ر.ق.‏' #,##0.###;'ر.ق.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_QA/NumberPatterns/2=#,##0% -FormatData/ar_QA/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_QA/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_QA/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_QA/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_QA/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_QA/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_QA/DayNames/6=\u0627\u0644\u0633\u0628\u062a +FormatData/ar_QA/DayNames/0=الأحد +FormatData/ar_QA/DayNames/1=الاثنين +FormatData/ar_QA/DayNames/2=الثلاثاء +FormatData/ar_QA/DayNames/3=الأربعاء +FormatData/ar_QA/DayNames/4=الخميس +FormatData/ar_QA/DayNames/5=الجمعة +FormatData/ar_QA/DayNames/6=السبت CalendarData/ar_QA/firstDayOfWeek=7 CalendarData/ar_QA/minimalDaysInFirstWeek=1 -FormatData/ar_QA/MonthAbbreviations/0=\u064a\u0646\u0627 -FormatData/ar_QA/MonthAbbreviations/1=\u0641\u0628\u0631 -FormatData/ar_QA/MonthAbbreviations/2=\u0645\u0627\u0631 -FormatData/ar_QA/MonthAbbreviations/3=\u0623\u0628\u0631 -FormatData/ar_QA/MonthAbbreviations/4=\u0645\u0627\u064a -FormatData/ar_QA/MonthAbbreviations/5=\u064a\u0648\u0646 -FormatData/ar_QA/MonthAbbreviations/6=\u064a\u0648\u0644 -FormatData/ar_QA/MonthAbbreviations/7=\u0623\u063a\u0633 -FormatData/ar_QA/MonthAbbreviations/8=\u0633\u0628\u062a -FormatData/ar_QA/MonthAbbreviations/9=\u0623\u0643\u062a -FormatData/ar_QA/MonthAbbreviations/10=\u0646\u0648\u0641 -FormatData/ar_QA/MonthAbbreviations/11=\u062f\u064a\u0633 +FormatData/ar_QA/MonthAbbreviations/0=ينا +FormatData/ar_QA/MonthAbbreviations/1=فبر +FormatData/ar_QA/MonthAbbreviations/2=مار +FormatData/ar_QA/MonthAbbreviations/3=أبر +FormatData/ar_QA/MonthAbbreviations/4=ماي +FormatData/ar_QA/MonthAbbreviations/5=يون +FormatData/ar_QA/MonthAbbreviations/6=يول +FormatData/ar_QA/MonthAbbreviations/7=أغس +FormatData/ar_QA/MonthAbbreviations/8=سبت +FormatData/ar_QA/MonthAbbreviations/9=أكت +FormatData/ar_QA/MonthAbbreviations/10=نوف +FormatData/ar_QA/MonthAbbreviations/11=ديس FormatData/ar_QA/MonthAbbreviations/12= -FormatData/ar_QA/Eras/0=\u0642.\u0645 -FormatData/ar_QA/Eras/1=\u0645 -FormatData/ar_QA/DayAbbreviations/0=\u062d -FormatData/ar_QA/DayAbbreviations/1=\u0646 -FormatData/ar_QA/DayAbbreviations/2=\u062b -FormatData/ar_QA/DayAbbreviations/3=\u0631 -FormatData/ar_QA/DayAbbreviations/4=\u062e -FormatData/ar_QA/DayAbbreviations/5=\u062c -FormatData/ar_QA/DayAbbreviations/6=\u0633 -LocaleNames/ar_QA/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_QA/MonthNames/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_QA/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_QA/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_QA/MonthNames/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_QA/MonthNames/4=\u0645\u0627\u064a\u0648 -FormatData/ar_QA/MonthNames/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_QA/MonthNames/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_QA/MonthNames/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_QA/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_QA/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_QA/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_QA/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_QA/Eras/0=ق.م +FormatData/ar_QA/Eras/1=م +FormatData/ar_QA/DayAbbreviations/0=ح +FormatData/ar_QA/DayAbbreviations/1=ن +FormatData/ar_QA/DayAbbreviations/2=ث +FormatData/ar_QA/DayAbbreviations/3=ر +FormatData/ar_QA/DayAbbreviations/4=خ +FormatData/ar_QA/DayAbbreviations/5=ج +FormatData/ar_QA/DayAbbreviations/6=س +LocaleNames/ar_QA/ar=العربية +FormatData/ar_QA/MonthNames/0=يناير +FormatData/ar_QA/MonthNames/1=فبراير +FormatData/ar_QA/MonthNames/2=مارس +FormatData/ar_QA/MonthNames/3=أبريل +FormatData/ar_QA/MonthNames/4=مايو +FormatData/ar_QA/MonthNames/5=يونيو +FormatData/ar_QA/MonthNames/6=يوليو +FormatData/ar_QA/MonthNames/7=أغسطس +FormatData/ar_QA/MonthNames/8=سبتمبر +FormatData/ar_QA/MonthNames/9=أكتوبر +FormatData/ar_QA/MonthNames/10=نوفمبر +FormatData/ar_QA/MonthNames/11=ديسمبر FormatData/ar_QA/MonthNames/12= -FormatData/ar_QA/AmPmMarkers/0=\u0635 -FormatData/ar_QA/AmPmMarkers/1=\u0645 +FormatData/ar_QA/AmPmMarkers/0=ص +FormatData/ar_QA/AmPmMarkers/1=م FormatData/ar_QA/TimePatterns/0=z hh:mm:ss a FormatData/ar_QA/TimePatterns/1=z hh:mm:ss a FormatData/ar_QA/TimePatterns/2=hh:mm:ss a @@ -1760,23 +1760,23 @@ FormatData/ar_QA/DatePatterns/1=dd MMMM, yyyy FormatData/ar_QA/DatePatterns/2=dd/MM/yyyy FormatData/ar_QA/DatePatterns/3=dd/MM/yy FormatData/ar_QA/DateTimePatterns/0={1} {0} -LocaleNames/ar_QA/EG=\u0645\u0635\u0631 -LocaleNames/ar_QA/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_QA/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_QA/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_QA/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_QA/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_QA/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_QA/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_QA/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_QA/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_QA/QA=\u0642\u0637\u0631 -LocaleNames/ar_QA/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_QA/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_QA/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_QA/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_QA/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_QA/YE=\u0627\u0644\u064a\u0645\u0646 +LocaleNames/ar_QA/EG=مصر +LocaleNames/ar_QA/DZ=الجزائر +LocaleNames/ar_QA/BH=البحرين +LocaleNames/ar_QA/IQ=العراق +LocaleNames/ar_QA/JO=الأردن +LocaleNames/ar_QA/KW=الكويت +LocaleNames/ar_QA/LB=لبنان +LocaleNames/ar_QA/LY=ليبيا +LocaleNames/ar_QA/MA=المغرب +LocaleNames/ar_QA/OM=عُمان +LocaleNames/ar_QA/QA=قطر +LocaleNames/ar_QA/SA=المملكة العربية السعودية +LocaleNames/ar_QA/SD=السودان +LocaleNames/ar_QA/SY=سوريا +LocaleNames/ar_QA/TN=تونس +LocaleNames/ar_QA/AE=الإمارات العربية المتحدة +LocaleNames/ar_QA/YE=اليمن FormatData/ar_QA/NumberElements/0=. FormatData/ar_QA/NumberElements/1=, FormatData/ar_QA/NumberElements/2=; @@ -1785,60 +1785,60 @@ FormatData/ar_QA/NumberElements/4=0 FormatData/ar_QA/NumberElements/5=# FormatData/ar_QA/NumberElements/6=- FormatData/ar_QA/NumberElements/7=E -FormatData/ar_QA/NumberElements/8=\u2030 -FormatData/ar_QA/NumberElements/9=\u221e -FormatData/ar_QA/NumberElements/10=\ufffd -CurrencyNames/ar_SA/SAR=\u0631.\u0633.\u200f +FormatData/ar_QA/NumberElements/8=‰ +FormatData/ar_QA/NumberElements/9=∞ +FormatData/ar_QA/NumberElements/10=� +CurrencyNames/ar_SA/SAR=ر.س.‏ FormatData/ar_SA/NumberPatterns/0=#,##0.###;#,##0.###- -# FormatData/ar_SA/NumberPatterns/1='\u0631.\u0633.\u200f' #,##0.###;'\u0631.\u0633.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_SA/NumberPatterns/1='ر.س.‏' #,##0.###;'ر.س.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_SA/NumberPatterns/2=#,##0% -FormatData/ar_SA/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_SA/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_SA/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_SA/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_SA/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_SA/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_SA/DayNames/6=\u0627\u0644\u0633\u0628\u062a +FormatData/ar_SA/DayNames/0=الأحد +FormatData/ar_SA/DayNames/1=الاثنين +FormatData/ar_SA/DayNames/2=الثلاثاء +FormatData/ar_SA/DayNames/3=الأربعاء +FormatData/ar_SA/DayNames/4=الخميس +FormatData/ar_SA/DayNames/5=الجمعة +FormatData/ar_SA/DayNames/6=السبت CalendarData/ar_SA/firstDayOfWeek=7 CalendarData/ar_SA/minimalDaysInFirstWeek=1 -FormatData/ar_SA/MonthAbbreviations/0=\u064a\u0646\u0627 -FormatData/ar_SA/MonthAbbreviations/1=\u0641\u0628\u0631 -FormatData/ar_SA/MonthAbbreviations/2=\u0645\u0627\u0631 -FormatData/ar_SA/MonthAbbreviations/3=\u0623\u0628\u0631 -FormatData/ar_SA/MonthAbbreviations/4=\u0645\u0627\u064a -FormatData/ar_SA/MonthAbbreviations/5=\u064a\u0648\u0646 -FormatData/ar_SA/MonthAbbreviations/6=\u064a\u0648\u0644 -FormatData/ar_SA/MonthAbbreviations/7=\u0623\u063a\u0633 -FormatData/ar_SA/MonthAbbreviations/8=\u0633\u0628\u062a -FormatData/ar_SA/MonthAbbreviations/9=\u0623\u0643\u062a -FormatData/ar_SA/MonthAbbreviations/10=\u0646\u0648\u0641 -FormatData/ar_SA/MonthAbbreviations/11=\u062f\u064a\u0633 +FormatData/ar_SA/MonthAbbreviations/0=ينا +FormatData/ar_SA/MonthAbbreviations/1=فبر +FormatData/ar_SA/MonthAbbreviations/2=مار +FormatData/ar_SA/MonthAbbreviations/3=أبر +FormatData/ar_SA/MonthAbbreviations/4=ماي +FormatData/ar_SA/MonthAbbreviations/5=يون +FormatData/ar_SA/MonthAbbreviations/6=يول +FormatData/ar_SA/MonthAbbreviations/7=أغس +FormatData/ar_SA/MonthAbbreviations/8=سبت +FormatData/ar_SA/MonthAbbreviations/9=أكت +FormatData/ar_SA/MonthAbbreviations/10=نوف +FormatData/ar_SA/MonthAbbreviations/11=ديس FormatData/ar_SA/MonthAbbreviations/12= -FormatData/ar_SA/Eras/0=\u0642.\u0645 -FormatData/ar_SA/Eras/1=\u0645 -FormatData/ar_SA/DayAbbreviations/0=\u062d -FormatData/ar_SA/DayAbbreviations/1=\u0646 -FormatData/ar_SA/DayAbbreviations/2=\u062b -FormatData/ar_SA/DayAbbreviations/3=\u0631 -FormatData/ar_SA/DayAbbreviations/4=\u062e -FormatData/ar_SA/DayAbbreviations/5=\u062c -FormatData/ar_SA/DayAbbreviations/6=\u0633 -LocaleNames/ar_SA/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_SA/MonthNames/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_SA/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_SA/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_SA/MonthNames/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_SA/MonthNames/4=\u0645\u0627\u064a\u0648 -FormatData/ar_SA/MonthNames/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_SA/MonthNames/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_SA/MonthNames/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_SA/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_SA/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_SA/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_SA/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_SA/Eras/0=ق.م +FormatData/ar_SA/Eras/1=م +FormatData/ar_SA/DayAbbreviations/0=ح +FormatData/ar_SA/DayAbbreviations/1=ن +FormatData/ar_SA/DayAbbreviations/2=ث +FormatData/ar_SA/DayAbbreviations/3=ر +FormatData/ar_SA/DayAbbreviations/4=خ +FormatData/ar_SA/DayAbbreviations/5=ج +FormatData/ar_SA/DayAbbreviations/6=س +LocaleNames/ar_SA/ar=العربية +FormatData/ar_SA/MonthNames/0=يناير +FormatData/ar_SA/MonthNames/1=فبراير +FormatData/ar_SA/MonthNames/2=مارس +FormatData/ar_SA/MonthNames/3=أبريل +FormatData/ar_SA/MonthNames/4=مايو +FormatData/ar_SA/MonthNames/5=يونيو +FormatData/ar_SA/MonthNames/6=يوليو +FormatData/ar_SA/MonthNames/7=أغسطس +FormatData/ar_SA/MonthNames/8=سبتمبر +FormatData/ar_SA/MonthNames/9=أكتوبر +FormatData/ar_SA/MonthNames/10=نوفمبر +FormatData/ar_SA/MonthNames/11=ديسمبر FormatData/ar_SA/MonthNames/12= -FormatData/ar_SA/AmPmMarkers/0=\u0635 -FormatData/ar_SA/AmPmMarkers/1=\u0645 +FormatData/ar_SA/AmPmMarkers/0=ص +FormatData/ar_SA/AmPmMarkers/1=م FormatData/ar_SA/TimePatterns/0=z hh:mm:ss a FormatData/ar_SA/TimePatterns/1=z hh:mm:ss a FormatData/ar_SA/TimePatterns/2=hh:mm:ss a @@ -1848,23 +1848,23 @@ FormatData/ar_SA/DatePatterns/1=dd MMMM, yyyy FormatData/ar_SA/DatePatterns/2=dd/MM/yyyy FormatData/ar_SA/DatePatterns/3=dd/MM/yy FormatData/ar_SA/DateTimePatterns/0={1} {0} -LocaleNames/ar_SA/EG=\u0645\u0635\u0631 -LocaleNames/ar_SA/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_SA/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_SA/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_SA/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_SA/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_SA/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_SA/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_SA/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_SA/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_SA/QA=\u0642\u0637\u0631 -LocaleNames/ar_SA/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_SA/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_SA/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_SA/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_SA/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_SA/YE=\u0627\u0644\u064a\u0645\u0646 +LocaleNames/ar_SA/EG=مصر +LocaleNames/ar_SA/DZ=الجزائر +LocaleNames/ar_SA/BH=البحرين +LocaleNames/ar_SA/IQ=العراق +LocaleNames/ar_SA/JO=الأردن +LocaleNames/ar_SA/KW=الكويت +LocaleNames/ar_SA/LB=لبنان +LocaleNames/ar_SA/LY=ليبيا +LocaleNames/ar_SA/MA=المغرب +LocaleNames/ar_SA/OM=عُمان +LocaleNames/ar_SA/QA=قطر +LocaleNames/ar_SA/SA=المملكة العربية السعودية +LocaleNames/ar_SA/SD=السودان +LocaleNames/ar_SA/SY=سوريا +LocaleNames/ar_SA/TN=تونس +LocaleNames/ar_SA/AE=الإمارات العربية المتحدة +LocaleNames/ar_SA/YE=اليمن FormatData/ar_SA/NumberElements/0=. FormatData/ar_SA/NumberElements/1=, FormatData/ar_SA/NumberElements/2=; @@ -1873,61 +1873,61 @@ FormatData/ar_SA/NumberElements/4=0 FormatData/ar_SA/NumberElements/5=# FormatData/ar_SA/NumberElements/6=- FormatData/ar_SA/NumberElements/7=E -FormatData/ar_SA/NumberElements/8=\u2030 -FormatData/ar_SA/NumberElements/9=\u221e -FormatData/ar_SA/NumberElements/10=\ufffd +FormatData/ar_SA/NumberElements/8=‰ +FormatData/ar_SA/NumberElements/9=∞ +FormatData/ar_SA/NumberElements/10=� # changed for 4945388, removed for 6531591, see bellow -# CurrencyNames/ar_SD/SDD=\u062c.\u0633.\u200f +# CurrencyNames/ar_SD/SDD=ج.س.‏ FormatData/ar_SD/NumberPatterns/0=#,##0.###;#,##0.###- -# FormatData/ar_SD/NumberPatterns/1='\u062c.\u0633.\u200f' #,##0.###;'\u062c.\u0633.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_SD/NumberPatterns/1='ج.س.‏' #,##0.###;'ج.س.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_SD/NumberPatterns/2=#,##0% -FormatData/ar_SD/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_SD/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_SD/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_SD/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_SD/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_SD/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_SD/DayNames/6=\u0627\u0644\u0633\u0628\u062a +FormatData/ar_SD/DayNames/0=الأحد +FormatData/ar_SD/DayNames/1=الاثنين +FormatData/ar_SD/DayNames/2=الثلاثاء +FormatData/ar_SD/DayNames/3=الأربعاء +FormatData/ar_SD/DayNames/4=الخميس +FormatData/ar_SD/DayNames/5=الجمعة +FormatData/ar_SD/DayNames/6=السبت CalendarData/ar_SD/firstDayOfWeek=7 CalendarData/ar_SD/minimalDaysInFirstWeek=1 -FormatData/ar_SD/MonthAbbreviations/0=\u064a\u0646\u0627 -FormatData/ar_SD/MonthAbbreviations/1=\u0641\u0628\u0631 -FormatData/ar_SD/MonthAbbreviations/2=\u0645\u0627\u0631 -FormatData/ar_SD/MonthAbbreviations/3=\u0623\u0628\u0631 -FormatData/ar_SD/MonthAbbreviations/4=\u0645\u0627\u064a -FormatData/ar_SD/MonthAbbreviations/5=\u064a\u0648\u0646 -FormatData/ar_SD/MonthAbbreviations/6=\u064a\u0648\u0644 -FormatData/ar_SD/MonthAbbreviations/7=\u0623\u063a\u0633 -FormatData/ar_SD/MonthAbbreviations/8=\u0633\u0628\u062a -FormatData/ar_SD/MonthAbbreviations/9=\u0623\u0643\u062a -FormatData/ar_SD/MonthAbbreviations/10=\u0646\u0648\u0641 -FormatData/ar_SD/MonthAbbreviations/11=\u062f\u064a\u0633 +FormatData/ar_SD/MonthAbbreviations/0=ينا +FormatData/ar_SD/MonthAbbreviations/1=فبر +FormatData/ar_SD/MonthAbbreviations/2=مار +FormatData/ar_SD/MonthAbbreviations/3=أبر +FormatData/ar_SD/MonthAbbreviations/4=ماي +FormatData/ar_SD/MonthAbbreviations/5=يون +FormatData/ar_SD/MonthAbbreviations/6=يول +FormatData/ar_SD/MonthAbbreviations/7=أغس +FormatData/ar_SD/MonthAbbreviations/8=سبت +FormatData/ar_SD/MonthAbbreviations/9=أكت +FormatData/ar_SD/MonthAbbreviations/10=نوف +FormatData/ar_SD/MonthAbbreviations/11=ديس FormatData/ar_SD/MonthAbbreviations/12= -FormatData/ar_SD/Eras/0=\u0642.\u0645 -FormatData/ar_SD/Eras/1=\u0645 -FormatData/ar_SD/DayAbbreviations/0=\u062d -FormatData/ar_SD/DayAbbreviations/1=\u0646 -FormatData/ar_SD/DayAbbreviations/2=\u062b -FormatData/ar_SD/DayAbbreviations/3=\u0631 -FormatData/ar_SD/DayAbbreviations/4=\u062e -FormatData/ar_SD/DayAbbreviations/5=\u062c -FormatData/ar_SD/DayAbbreviations/6=\u0633 -LocaleNames/ar_SD/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_SD/MonthNames/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_SD/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_SD/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_SD/MonthNames/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_SD/MonthNames/4=\u0645\u0627\u064a\u0648 -FormatData/ar_SD/MonthNames/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_SD/MonthNames/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_SD/MonthNames/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_SD/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_SD/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_SD/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_SD/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_SD/Eras/0=ق.م +FormatData/ar_SD/Eras/1=م +FormatData/ar_SD/DayAbbreviations/0=ح +FormatData/ar_SD/DayAbbreviations/1=ن +FormatData/ar_SD/DayAbbreviations/2=ث +FormatData/ar_SD/DayAbbreviations/3=ر +FormatData/ar_SD/DayAbbreviations/4=خ +FormatData/ar_SD/DayAbbreviations/5=ج +FormatData/ar_SD/DayAbbreviations/6=س +LocaleNames/ar_SD/ar=العربية +FormatData/ar_SD/MonthNames/0=يناير +FormatData/ar_SD/MonthNames/1=فبراير +FormatData/ar_SD/MonthNames/2=مارس +FormatData/ar_SD/MonthNames/3=أبريل +FormatData/ar_SD/MonthNames/4=مايو +FormatData/ar_SD/MonthNames/5=يونيو +FormatData/ar_SD/MonthNames/6=يوليو +FormatData/ar_SD/MonthNames/7=أغسطس +FormatData/ar_SD/MonthNames/8=سبتمبر +FormatData/ar_SD/MonthNames/9=أكتوبر +FormatData/ar_SD/MonthNames/10=نوفمبر +FormatData/ar_SD/MonthNames/11=ديسمبر FormatData/ar_SD/MonthNames/12= -FormatData/ar_SD/AmPmMarkers/0=\u0635 -FormatData/ar_SD/AmPmMarkers/1=\u0645 +FormatData/ar_SD/AmPmMarkers/0=ص +FormatData/ar_SD/AmPmMarkers/1=م FormatData/ar_SD/TimePatterns/0=z hh:mm:ss a FormatData/ar_SD/TimePatterns/1=z hh:mm:ss a FormatData/ar_SD/TimePatterns/2=hh:mm:ss a @@ -1937,23 +1937,23 @@ FormatData/ar_SD/DatePatterns/1=dd MMMM, yyyy FormatData/ar_SD/DatePatterns/2=dd/MM/yyyy FormatData/ar_SD/DatePatterns/3=dd/MM/yy FormatData/ar_SD/DateTimePatterns/0={1} {0} -LocaleNames/ar_SD/EG=\u0645\u0635\u0631 -LocaleNames/ar_SD/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_SD/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_SD/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_SD/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_SD/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_SD/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_SD/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_SD/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_SD/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_SD/QA=\u0642\u0637\u0631 -LocaleNames/ar_SD/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_SD/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_SD/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_SD/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_SD/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_SD/YE=\u0627\u0644\u064a\u0645\u0646 +LocaleNames/ar_SD/EG=مصر +LocaleNames/ar_SD/DZ=الجزائر +LocaleNames/ar_SD/BH=البحرين +LocaleNames/ar_SD/IQ=العراق +LocaleNames/ar_SD/JO=الأردن +LocaleNames/ar_SD/KW=الكويت +LocaleNames/ar_SD/LB=لبنان +LocaleNames/ar_SD/LY=ليبيا +LocaleNames/ar_SD/MA=المغرب +LocaleNames/ar_SD/OM=عُمان +LocaleNames/ar_SD/QA=قطر +LocaleNames/ar_SD/SA=المملكة العربية السعودية +LocaleNames/ar_SD/SD=السودان +LocaleNames/ar_SD/SY=سوريا +LocaleNames/ar_SD/TN=تونس +LocaleNames/ar_SD/AE=الإمارات العربية المتحدة +LocaleNames/ar_SD/YE=اليمن FormatData/ar_SD/NumberElements/0=. FormatData/ar_SD/NumberElements/1=, FormatData/ar_SD/NumberElements/2=; @@ -1962,60 +1962,60 @@ FormatData/ar_SD/NumberElements/4=0 FormatData/ar_SD/NumberElements/5=# FormatData/ar_SD/NumberElements/6=- FormatData/ar_SD/NumberElements/7=E -FormatData/ar_SD/NumberElements/8=\u2030 -FormatData/ar_SD/NumberElements/9=\u221e -FormatData/ar_SD/NumberElements/10=\ufffd +FormatData/ar_SD/NumberElements/8=‰ +FormatData/ar_SD/NumberElements/9=∞ +FormatData/ar_SD/NumberElements/10=� FormatData/ar_SY/NumberPatterns/0=#,##0.###;#,##0.###- -# FormatData/ar_SY/NumberPatterns/1='\u0644.\u0633.\u200f' #,##0.###;'\u0644.\u0633.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_SY/NumberPatterns/1='ل.س.‏' #,##0.###;'ل.س.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_SY/NumberPatterns/2=#,##0% -CurrencyNames/ar_SY/SYP=\u0644.\u0633.\u200f -FormatData/ar_SY/DayAbbreviations/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_SY/DayAbbreviations/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_SY/DayAbbreviations/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_SY/DayAbbreviations/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_SY/DayAbbreviations/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_SY/DayAbbreviations/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_SY/DayAbbreviations/6=\u0627\u0644\u0633\u0628\u062a -FormatData/ar_SY/MonthNames/0=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_SY/MonthNames/1=\u0634\u0628\u0627\u0637 -FormatData/ar_SY/MonthNames/2=\u0622\u0630\u0627\u0631 -FormatData/ar_SY/MonthNames/3=\u0646\u064a\u0633\u0627\u0646 -FormatData/ar_SY/MonthNames/4=\u0623\u064a\u0627\u0631 -FormatData/ar_SY/MonthNames/5=\u062d\u0632\u064a\u0631\u0627\u0646 -FormatData/ar_SY/MonthNames/6=\u062a\u0645\u0648\u0632 -FormatData/ar_SY/MonthNames/7=\u0622\u0628 -FormatData/ar_SY/MonthNames/8=\u0623\u064a\u0644\u0648\u0644 -FormatData/ar_SY/MonthNames/9=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644 -FormatData/ar_SY/MonthNames/10=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_SY/MonthNames/11=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644 +CurrencyNames/ar_SY/SYP=ل.س.‏ +FormatData/ar_SY/DayAbbreviations/0=الأحد +FormatData/ar_SY/DayAbbreviations/1=الاثنين +FormatData/ar_SY/DayAbbreviations/2=الثلاثاء +FormatData/ar_SY/DayAbbreviations/3=الأربعاء +FormatData/ar_SY/DayAbbreviations/4=الخميس +FormatData/ar_SY/DayAbbreviations/5=الجمعة +FormatData/ar_SY/DayAbbreviations/6=السبت +FormatData/ar_SY/MonthNames/0=كانون الثاني +FormatData/ar_SY/MonthNames/1=شباط +FormatData/ar_SY/MonthNames/2=آذار +FormatData/ar_SY/MonthNames/3=نيسان +FormatData/ar_SY/MonthNames/4=أيار +FormatData/ar_SY/MonthNames/5=حزيران +FormatData/ar_SY/MonthNames/6=تموز +FormatData/ar_SY/MonthNames/7=آب +FormatData/ar_SY/MonthNames/8=أيلول +FormatData/ar_SY/MonthNames/9=تشرين الأول +FormatData/ar_SY/MonthNames/10=تشرين الثاني +FormatData/ar_SY/MonthNames/11=كانون الأول FormatData/ar_SY/MonthNames/12= -FormatData/ar_SY/MonthAbbreviations/0=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_SY/MonthAbbreviations/1=\u0634\u0628\u0627\u0637 -FormatData/ar_SY/MonthAbbreviations/2=\u0622\u0630\u0627\u0631 -FormatData/ar_SY/MonthAbbreviations/3=\u0646\u064a\u0633\u0627\u0646 -FormatData/ar_SY/MonthAbbreviations/4=\u0623\u064a\u0627\u0631 -FormatData/ar_SY/MonthAbbreviations/5=\u062d\u0632\u064a\u0631\u0627\u0646 -FormatData/ar_SY/MonthAbbreviations/6=\u062a\u0645\u0648\u0632 -FormatData/ar_SY/MonthAbbreviations/7=\u0622\u0628 -FormatData/ar_SY/MonthAbbreviations/8=\u0623\u064a\u0644\u0648\u0644 -FormatData/ar_SY/MonthAbbreviations/9=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644 -FormatData/ar_SY/MonthAbbreviations/10=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_SY/MonthAbbreviations/11=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644 +FormatData/ar_SY/MonthAbbreviations/0=كانون الثاني +FormatData/ar_SY/MonthAbbreviations/1=شباط +FormatData/ar_SY/MonthAbbreviations/2=آذار +FormatData/ar_SY/MonthAbbreviations/3=نيسان +FormatData/ar_SY/MonthAbbreviations/4=أيار +FormatData/ar_SY/MonthAbbreviations/5=حزيران +FormatData/ar_SY/MonthAbbreviations/6=تموز +FormatData/ar_SY/MonthAbbreviations/7=آب +FormatData/ar_SY/MonthAbbreviations/8=أيلول +FormatData/ar_SY/MonthAbbreviations/9=تشرين الأول +FormatData/ar_SY/MonthAbbreviations/10=تشرين الثاني +FormatData/ar_SY/MonthAbbreviations/11=كانون الأول FormatData/ar_SY/MonthAbbreviations/12= -FormatData/ar_SY/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_SY/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_SY/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_SY/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_SY/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_SY/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_SY/DayNames/6=\u0627\u0644\u0633\u0628\u062a +FormatData/ar_SY/DayNames/0=الأحد +FormatData/ar_SY/DayNames/1=الاثنين +FormatData/ar_SY/DayNames/2=الثلاثاء +FormatData/ar_SY/DayNames/3=الأربعاء +FormatData/ar_SY/DayNames/4=الخميس +FormatData/ar_SY/DayNames/5=الجمعة +FormatData/ar_SY/DayNames/6=السبت CalendarData/ar_SY/firstDayOfWeek=7 CalendarData/ar_SY/minimalDaysInFirstWeek=1 -FormatData/ar_SY/Eras/0=\u0642.\u0645 -FormatData/ar_SY/Eras/1=\u0645 -LocaleNames/ar_SY/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_SY/AmPmMarkers/0=\u0635 -FormatData/ar_SY/AmPmMarkers/1=\u0645 +FormatData/ar_SY/Eras/0=ق.م +FormatData/ar_SY/Eras/1=م +LocaleNames/ar_SY/ar=العربية +FormatData/ar_SY/AmPmMarkers/0=ص +FormatData/ar_SY/AmPmMarkers/1=م FormatData/ar_SY/TimePatterns/0=z hh:mm:ss a FormatData/ar_SY/TimePatterns/1=z hh:mm:ss a FormatData/ar_SY/TimePatterns/2=hh:mm:ss a @@ -2025,23 +2025,23 @@ FormatData/ar_SY/DatePatterns/1=dd MMMM, yyyy FormatData/ar_SY/DatePatterns/2=dd/MM/yyyy FormatData/ar_SY/DatePatterns/3=dd/MM/yy FormatData/ar_SY/DateTimePatterns/0={1} {0} -LocaleNames/ar_SY/EG=\u0645\u0635\u0631 -LocaleNames/ar_SY/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_SY/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_SY/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_SY/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_SY/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_SY/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_SY/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_SY/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_SY/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_SY/QA=\u0642\u0637\u0631 -LocaleNames/ar_SY/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_SY/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_SY/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_SY/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_SY/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_SY/YE=\u0627\u0644\u064a\u0645\u0646 +LocaleNames/ar_SY/EG=مصر +LocaleNames/ar_SY/DZ=الجزائر +LocaleNames/ar_SY/BH=البحرين +LocaleNames/ar_SY/IQ=العراق +LocaleNames/ar_SY/JO=الأردن +LocaleNames/ar_SY/KW=الكويت +LocaleNames/ar_SY/LB=لبنان +LocaleNames/ar_SY/LY=ليبيا +LocaleNames/ar_SY/MA=المغرب +LocaleNames/ar_SY/OM=عُمان +LocaleNames/ar_SY/QA=قطر +LocaleNames/ar_SY/SA=المملكة العربية السعودية +LocaleNames/ar_SY/SD=السودان +LocaleNames/ar_SY/SY=سوريا +LocaleNames/ar_SY/TN=تونس +LocaleNames/ar_SY/AE=الإمارات العربية المتحدة +LocaleNames/ar_SY/YE=اليمن FormatData/ar_SY/NumberElements/0=. FormatData/ar_SY/NumberElements/1=, FormatData/ar_SY/NumberElements/2=; @@ -2050,60 +2050,60 @@ FormatData/ar_SY/NumberElements/4=0 FormatData/ar_SY/NumberElements/5=# FormatData/ar_SY/NumberElements/6=- FormatData/ar_SY/NumberElements/7=E -FormatData/ar_SY/NumberElements/8=\u2030 -FormatData/ar_SY/NumberElements/9=\u221e -FormatData/ar_SY/NumberElements/10=\ufffd -CurrencyNames/ar_TN/TND=\u062f.\u062a.\u200f +FormatData/ar_SY/NumberElements/8=‰ +FormatData/ar_SY/NumberElements/9=∞ +FormatData/ar_SY/NumberElements/10=� +CurrencyNames/ar_TN/TND=د.ت.‏ FormatData/ar_TN/NumberPatterns/0=#,##0.###;#,##0.###- -# FormatData/ar_TN/NumberPatterns/1='\u062f.\u062a.\u200f' #,##0.###;'\u062f.\u062a.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_TN/NumberPatterns/1='د.ت.‏' #,##0.###;'د.ت.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_TN/NumberPatterns/2=#,##0% -FormatData/ar_TN/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_TN/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_TN/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_TN/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_TN/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_TN/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_TN/DayNames/6=\u0627\u0644\u0633\u0628\u062a +FormatData/ar_TN/DayNames/0=الأحد +FormatData/ar_TN/DayNames/1=الاثنين +FormatData/ar_TN/DayNames/2=الثلاثاء +FormatData/ar_TN/DayNames/3=الأربعاء +FormatData/ar_TN/DayNames/4=الخميس +FormatData/ar_TN/DayNames/5=الجمعة +FormatData/ar_TN/DayNames/6=السبت CalendarData/ar_TN/firstDayOfWeek=7 CalendarData/ar_TN/minimalDaysInFirstWeek=1 -FormatData/ar_TN/MonthAbbreviations/0=\u064a\u0646\u0627 -FormatData/ar_TN/MonthAbbreviations/1=\u0641\u0628\u0631 -FormatData/ar_TN/MonthAbbreviations/2=\u0645\u0627\u0631 -FormatData/ar_TN/MonthAbbreviations/3=\u0623\u0628\u0631 -FormatData/ar_TN/MonthAbbreviations/4=\u0645\u0627\u064a -FormatData/ar_TN/MonthAbbreviations/5=\u064a\u0648\u0646 -FormatData/ar_TN/MonthAbbreviations/6=\u064a\u0648\u0644 -FormatData/ar_TN/MonthAbbreviations/7=\u0623\u063a\u0633 -FormatData/ar_TN/MonthAbbreviations/8=\u0633\u0628\u062a -FormatData/ar_TN/MonthAbbreviations/9=\u0623\u0643\u062a -FormatData/ar_TN/MonthAbbreviations/10=\u0646\u0648\u0641 -FormatData/ar_TN/MonthAbbreviations/11=\u062f\u064a\u0633 +FormatData/ar_TN/MonthAbbreviations/0=ينا +FormatData/ar_TN/MonthAbbreviations/1=فبر +FormatData/ar_TN/MonthAbbreviations/2=مار +FormatData/ar_TN/MonthAbbreviations/3=أبر +FormatData/ar_TN/MonthAbbreviations/4=ماي +FormatData/ar_TN/MonthAbbreviations/5=يون +FormatData/ar_TN/MonthAbbreviations/6=يول +FormatData/ar_TN/MonthAbbreviations/7=أغس +FormatData/ar_TN/MonthAbbreviations/8=سبت +FormatData/ar_TN/MonthAbbreviations/9=أكت +FormatData/ar_TN/MonthAbbreviations/10=نوف +FormatData/ar_TN/MonthAbbreviations/11=ديس FormatData/ar_TN/MonthAbbreviations/12= -FormatData/ar_TN/Eras/0=\u0642.\u0645 -FormatData/ar_TN/Eras/1=\u0645 -FormatData/ar_TN/DayAbbreviations/0=\u062d -FormatData/ar_TN/DayAbbreviations/1=\u0646 -FormatData/ar_TN/DayAbbreviations/2=\u062b -FormatData/ar_TN/DayAbbreviations/3=\u0631 -FormatData/ar_TN/DayAbbreviations/4=\u062e -FormatData/ar_TN/DayAbbreviations/5=\u062c -FormatData/ar_TN/DayAbbreviations/6=\u0633 -LocaleNames/ar_TN/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_TN/MonthNames/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_TN/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_TN/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_TN/MonthNames/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_TN/MonthNames/4=\u0645\u0627\u064a\u0648 -FormatData/ar_TN/MonthNames/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_TN/MonthNames/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_TN/MonthNames/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_TN/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_TN/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_TN/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_TN/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_TN/Eras/0=ق.م +FormatData/ar_TN/Eras/1=م +FormatData/ar_TN/DayAbbreviations/0=ح +FormatData/ar_TN/DayAbbreviations/1=ن +FormatData/ar_TN/DayAbbreviations/2=ث +FormatData/ar_TN/DayAbbreviations/3=ر +FormatData/ar_TN/DayAbbreviations/4=خ +FormatData/ar_TN/DayAbbreviations/5=ج +FormatData/ar_TN/DayAbbreviations/6=س +LocaleNames/ar_TN/ar=العربية +FormatData/ar_TN/MonthNames/0=يناير +FormatData/ar_TN/MonthNames/1=فبراير +FormatData/ar_TN/MonthNames/2=مارس +FormatData/ar_TN/MonthNames/3=أبريل +FormatData/ar_TN/MonthNames/4=مايو +FormatData/ar_TN/MonthNames/5=يونيو +FormatData/ar_TN/MonthNames/6=يوليو +FormatData/ar_TN/MonthNames/7=أغسطس +FormatData/ar_TN/MonthNames/8=سبتمبر +FormatData/ar_TN/MonthNames/9=أكتوبر +FormatData/ar_TN/MonthNames/10=نوفمبر +FormatData/ar_TN/MonthNames/11=ديسمبر FormatData/ar_TN/MonthNames/12= -FormatData/ar_TN/AmPmMarkers/0=\u0635 -FormatData/ar_TN/AmPmMarkers/1=\u0645 +FormatData/ar_TN/AmPmMarkers/0=ص +FormatData/ar_TN/AmPmMarkers/1=م FormatData/ar_TN/TimePatterns/0=z hh:mm:ss a FormatData/ar_TN/TimePatterns/1=z hh:mm:ss a FormatData/ar_TN/TimePatterns/2=hh:mm:ss a @@ -2113,23 +2113,23 @@ FormatData/ar_TN/DatePatterns/1=dd MMMM, yyyy FormatData/ar_TN/DatePatterns/2=dd/MM/yyyy FormatData/ar_TN/DatePatterns/3=dd/MM/yy FormatData/ar_TN/DateTimePatterns/0={1} {0} -LocaleNames/ar_TN/EG=\u0645\u0635\u0631 -LocaleNames/ar_TN/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_TN/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_TN/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_TN/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_TN/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_TN/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_TN/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_TN/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_TN/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_TN/QA=\u0642\u0637\u0631 -LocaleNames/ar_TN/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_TN/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_TN/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_TN/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_TN/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_TN/YE=\u0627\u0644\u064a\u0645\u0646 +LocaleNames/ar_TN/EG=مصر +LocaleNames/ar_TN/DZ=الجزائر +LocaleNames/ar_TN/BH=البحرين +LocaleNames/ar_TN/IQ=العراق +LocaleNames/ar_TN/JO=الأردن +LocaleNames/ar_TN/KW=الكويت +LocaleNames/ar_TN/LB=لبنان +LocaleNames/ar_TN/LY=ليبيا +LocaleNames/ar_TN/MA=المغرب +LocaleNames/ar_TN/OM=عُمان +LocaleNames/ar_TN/QA=قطر +LocaleNames/ar_TN/SA=المملكة العربية السعودية +LocaleNames/ar_TN/SD=السودان +LocaleNames/ar_TN/SY=سوريا +LocaleNames/ar_TN/TN=تونس +LocaleNames/ar_TN/AE=الإمارات العربية المتحدة +LocaleNames/ar_TN/YE=اليمن FormatData/ar_TN/NumberElements/0=. FormatData/ar_TN/NumberElements/1=, FormatData/ar_TN/NumberElements/2=; @@ -2138,60 +2138,60 @@ FormatData/ar_TN/NumberElements/4=0 FormatData/ar_TN/NumberElements/5=# FormatData/ar_TN/NumberElements/6=- FormatData/ar_TN/NumberElements/7=E -FormatData/ar_TN/NumberElements/8=\u2030 -FormatData/ar_TN/NumberElements/9=\u221e -FormatData/ar_TN/NumberElements/10=\ufffd -CurrencyNames/ar_YE/YER=\u0631.\u064a.\u200f +FormatData/ar_TN/NumberElements/8=‰ +FormatData/ar_TN/NumberElements/9=∞ +FormatData/ar_TN/NumberElements/10=� +CurrencyNames/ar_YE/YER=ر.ي.‏ FormatData/ar_YE/NumberPatterns/0=#,##0.###;#,##0.###- -# FormatData/ar_YE/NumberPatterns/1='\u0631.\u064a.\u200f' #,##0.###;'\u0631.\u064a.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_YE/NumberPatterns/1='ر.ي.‏' #,##0.###;'ر.ي.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_YE/NumberPatterns/2=#,##0% -FormatData/ar_YE/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_YE/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_YE/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_YE/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_YE/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_YE/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_YE/DayNames/6=\u0627\u0644\u0633\u0628\u062a +FormatData/ar_YE/DayNames/0=الأحد +FormatData/ar_YE/DayNames/1=الاثنين +FormatData/ar_YE/DayNames/2=الثلاثاء +FormatData/ar_YE/DayNames/3=الأربعاء +FormatData/ar_YE/DayNames/4=الخميس +FormatData/ar_YE/DayNames/5=الجمعة +FormatData/ar_YE/DayNames/6=السبت CalendarData/ar_YE/firstDayOfWeek=7 CalendarData/ar_YE/minimalDaysInFirstWeek=1 -FormatData/ar_YE/MonthAbbreviations/0=\u064a\u0646\u0627 -FormatData/ar_YE/MonthAbbreviations/1=\u0641\u0628\u0631 -FormatData/ar_YE/MonthAbbreviations/2=\u0645\u0627\u0631 -FormatData/ar_YE/MonthAbbreviations/3=\u0623\u0628\u0631 -FormatData/ar_YE/MonthAbbreviations/4=\u0645\u0627\u064a -FormatData/ar_YE/MonthAbbreviations/5=\u064a\u0648\u0646 -FormatData/ar_YE/MonthAbbreviations/6=\u064a\u0648\u0644 -FormatData/ar_YE/MonthAbbreviations/7=\u0623\u063a\u0633 -FormatData/ar_YE/MonthAbbreviations/8=\u0633\u0628\u062a -FormatData/ar_YE/MonthAbbreviations/9=\u0623\u0643\u062a -FormatData/ar_YE/MonthAbbreviations/10=\u0646\u0648\u0641 -FormatData/ar_YE/MonthAbbreviations/11=\u062f\u064a\u0633 +FormatData/ar_YE/MonthAbbreviations/0=ينا +FormatData/ar_YE/MonthAbbreviations/1=فبر +FormatData/ar_YE/MonthAbbreviations/2=مار +FormatData/ar_YE/MonthAbbreviations/3=أبر +FormatData/ar_YE/MonthAbbreviations/4=ماي +FormatData/ar_YE/MonthAbbreviations/5=يون +FormatData/ar_YE/MonthAbbreviations/6=يول +FormatData/ar_YE/MonthAbbreviations/7=أغس +FormatData/ar_YE/MonthAbbreviations/8=سبت +FormatData/ar_YE/MonthAbbreviations/9=أكت +FormatData/ar_YE/MonthAbbreviations/10=نوف +FormatData/ar_YE/MonthAbbreviations/11=ديس FormatData/ar_YE/MonthAbbreviations/12= -FormatData/ar_YE/Eras/0=\u0642.\u0645 -FormatData/ar_YE/Eras/1=\u0645 -FormatData/ar_YE/DayAbbreviations/0=\u062d -FormatData/ar_YE/DayAbbreviations/1=\u0646 -FormatData/ar_YE/DayAbbreviations/2=\u062b -FormatData/ar_YE/DayAbbreviations/3=\u0631 -FormatData/ar_YE/DayAbbreviations/4=\u062e -FormatData/ar_YE/DayAbbreviations/5=\u062c -FormatData/ar_YE/DayAbbreviations/6=\u0633 -LocaleNames/ar_YE/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_YE/MonthNames/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_YE/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_YE/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_YE/MonthNames/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_YE/MonthNames/4=\u0645\u0627\u064a\u0648 -FormatData/ar_YE/MonthNames/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_YE/MonthNames/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_YE/MonthNames/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_YE/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_YE/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_YE/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_YE/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_YE/Eras/0=ق.م +FormatData/ar_YE/Eras/1=م +FormatData/ar_YE/DayAbbreviations/0=ح +FormatData/ar_YE/DayAbbreviations/1=ن +FormatData/ar_YE/DayAbbreviations/2=ث +FormatData/ar_YE/DayAbbreviations/3=ر +FormatData/ar_YE/DayAbbreviations/4=خ +FormatData/ar_YE/DayAbbreviations/5=ج +FormatData/ar_YE/DayAbbreviations/6=س +LocaleNames/ar_YE/ar=العربية +FormatData/ar_YE/MonthNames/0=يناير +FormatData/ar_YE/MonthNames/1=فبراير +FormatData/ar_YE/MonthNames/2=مارس +FormatData/ar_YE/MonthNames/3=أبريل +FormatData/ar_YE/MonthNames/4=مايو +FormatData/ar_YE/MonthNames/5=يونيو +FormatData/ar_YE/MonthNames/6=يوليو +FormatData/ar_YE/MonthNames/7=أغسطس +FormatData/ar_YE/MonthNames/8=سبتمبر +FormatData/ar_YE/MonthNames/9=أكتوبر +FormatData/ar_YE/MonthNames/10=نوفمبر +FormatData/ar_YE/MonthNames/11=ديسمبر FormatData/ar_YE/MonthNames/12= -FormatData/ar_YE/AmPmMarkers/0=\u0635 -FormatData/ar_YE/AmPmMarkers/1=\u0645 +FormatData/ar_YE/AmPmMarkers/0=ص +FormatData/ar_YE/AmPmMarkers/1=م FormatData/ar_YE/TimePatterns/0=z hh:mm:ss a FormatData/ar_YE/TimePatterns/1=z hh:mm:ss a FormatData/ar_YE/TimePatterns/2=hh:mm:ss a @@ -2201,23 +2201,23 @@ FormatData/ar_YE/DatePatterns/1=dd MMMM, yyyy FormatData/ar_YE/DatePatterns/2=dd/MM/yyyy FormatData/ar_YE/DatePatterns/3=dd/MM/yy FormatData/ar_YE/DateTimePatterns/0={1} {0} -LocaleNames/ar_YE/EG=\u0645\u0635\u0631 -LocaleNames/ar_YE/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_YE/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_YE/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_YE/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_YE/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_YE/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_YE/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_YE/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_YE/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_YE/QA=\u0642\u0637\u0631 -LocaleNames/ar_YE/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_YE/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_YE/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_YE/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_YE/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_YE/YE=\u0627\u0644\u064a\u0645\u0646 +LocaleNames/ar_YE/EG=مصر +LocaleNames/ar_YE/DZ=الجزائر +LocaleNames/ar_YE/BH=البحرين +LocaleNames/ar_YE/IQ=العراق +LocaleNames/ar_YE/JO=الأردن +LocaleNames/ar_YE/KW=الكويت +LocaleNames/ar_YE/LB=لبنان +LocaleNames/ar_YE/LY=ليبيا +LocaleNames/ar_YE/MA=المغرب +LocaleNames/ar_YE/OM=عُمان +LocaleNames/ar_YE/QA=قطر +LocaleNames/ar_YE/SA=المملكة العربية السعودية +LocaleNames/ar_YE/SD=السودان +LocaleNames/ar_YE/SY=سوريا +LocaleNames/ar_YE/TN=تونس +LocaleNames/ar_YE/AE=الإمارات العربية المتحدة +LocaleNames/ar_YE/YE=اليمن FormatData/ar_YE/NumberElements/0=. FormatData/ar_YE/NumberElements/1=, FormatData/ar_YE/NumberElements/2=; @@ -2226,21 +2226,21 @@ FormatData/ar_YE/NumberElements/4=0 FormatData/ar_YE/NumberElements/5=# FormatData/ar_YE/NumberElements/6=- FormatData/ar_YE/NumberElements/7=E -FormatData/ar_YE/NumberElements/8=\u2030 -FormatData/ar_YE/NumberElements/9=\u221e -FormatData/ar_YE/NumberElements/10=\ufffd +FormatData/ar_YE/NumberElements/8=‰ +FormatData/ar_YE/NumberElements/9=∞ +FormatData/ar_YE/NumberElements/10=� # bug #4113654 (this is obviously not an exhaustive test; I'm trying it here for a single # inheritance chain only. This bug fix also gets tested fairly well by the tests for all # the other bugs as given above) FormatData//NumberPatterns/0=#,##0.###;-#,##0.### -# FormatData//NumberPatterns/1=\u00a4 #,##0.00;-\u00a4 #,##0.00 # Changed; see bug 4122840 +# FormatData//NumberPatterns/1=¤ #,##0.00;-¤ #,##0.00 # Changed; see bug 4122840 FormatData//NumberPatterns/2=#,##0% FormatData/fr/NumberPatterns/0=#,##0.###;-#,##0.### -# FormatData/fr/NumberPatterns/1=\u00a4 #,##0.00;-\u00a4 #,##0.00 # Changed; see bug 4122840 +# FormatData/fr/NumberPatterns/1=¤ #,##0.00;-¤ #,##0.00 # Changed; see bug 4122840 # FormatData/fr/NumberPatterns/2=#,##0% # changed, see bug 6547501 CurrencyNames/fr_FR/FRF=F -CurrencyNames/fr_FR/EUR=\u20ac +CurrencyNames/fr_FR/EUR=€ FormatData/fr_FR/NumberPatterns/0=#,##0.###;-#,##0.### # FormatData/fr_FR/NumberPatterns/1=#,##0.00 F;-#,##0.00 F # Changed; see bug 4122840 # FormatData/fr_FR/NumberPatterns/2=#,##0% # changed; see bug 6547501 @@ -2252,19 +2252,19 @@ FormatData/fr_FR/DayNames/4=jeudi FormatData/fr_FR/DayNames/5=vendredi FormatData/fr_FR/DayNames/6=samedi FormatData/fr_FR/MonthNames/0=janvier -FormatData/fr_FR/MonthNames/1=f\u00e9vrier +FormatData/fr_FR/MonthNames/1=février FormatData/fr_FR/MonthNames/2=mars FormatData/fr_FR/MonthNames/3=avril FormatData/fr_FR/MonthNames/4=mai FormatData/fr_FR/MonthNames/5=juin FormatData/fr_FR/MonthNames/6=juillet -FormatData/fr_FR/MonthNames/7=ao\u00fbt +FormatData/fr_FR/MonthNames/7=août FormatData/fr_FR/MonthNames/8=septembre FormatData/fr_FR/MonthNames/9=octobre FormatData/fr_FR/MonthNames/10=novembre -FormatData/fr_FR/MonthNames/11=d\u00e9cembre +FormatData/fr_FR/MonthNames/11=décembre FormatData/fr_FR/MonthNames/12= -LocaleNames/fr_FR/fr=fran\u00e7ais +LocaleNames/fr_FR/fr=français LocaleNames/fr_FR/en=anglais LocaleNames/fr_FR/de=allemand LocaleNames/fr_FR/da=danois @@ -2274,10 +2274,10 @@ LocaleNames/fr_FR/fi=finnois LocaleNames/fr_FR/it=italien LocaleNames/fr_FR/ja=japonais #bug 4965260 -LocaleNames/fr_FR/nl=n\u00e9erlandais -LocaleNames/fr_FR/no=norv\u00e9gien +LocaleNames/fr_FR/nl=néerlandais +LocaleNames/fr_FR/no=norvégien LocaleNames/fr_FR/pt=portugais -LocaleNames/fr_FR/sv=su\u00e9dois +LocaleNames/fr_FR/sv=suédois LocaleNames/fr_FR/tr=turc FormatData/fr_FR/TimePatterns/0=HH' h 'mm z FormatData/fr_FR/TimePatterns/1=HH:mm:ss z @@ -2289,24 +2289,24 @@ FormatData/fr_FR/DatePatterns/2=d MMM yyyy FormatData/fr_FR/DatePatterns/3=dd/MM/yy FormatData/fr_FR/DateTimePatterns/0={1} {0} FormatData/fr_FR/NumberElements/0=, -FormatData/fr_FR/NumberElements/1=\u00a0 +FormatData/fr_FR/NumberElements/1=  FormatData/fr_FR/NumberElements/2=; FormatData/fr_FR/NumberElements/3=% FormatData/fr_FR/NumberElements/4=0 FormatData/fr_FR/NumberElements/5=# FormatData/fr_FR/NumberElements/6=- FormatData/fr_FR/NumberElements/7=E -FormatData/fr_FR/NumberElements/8=\u2030 -FormatData/fr_FR/NumberElements/9=\u221e -FormatData/fr_FR/NumberElements/10=\ufffd +FormatData/fr_FR/NumberElements/8=‰ +FormatData/fr_FR/NumberElements/9=∞ +FormatData/fr_FR/NumberElements/10=� FormatData/fr_FR/Eras/0=BC FormatData/fr_FR/Eras/1=ap. J.-C. LocaleNames/fr_FR/FR=France -LocaleNames/fr_FR/US=\u00c9tats-Unis +LocaleNames/fr_FR/US=États-Unis LocaleNames/fr_FR/DK=Danemark LocaleNames/fr_FR/DE=Allemagne LocaleNames/fr_FR/AT=Autriche -LocaleNames/fr_FR/GR=Gr\u00e8ce +LocaleNames/fr_FR/GR=Grèce LocaleNames/fr_FR/ES=Espagne LocaleNames/fr_FR/FI=Finlande LocaleNames/fr_FR/IT=Italie @@ -2315,9 +2315,9 @@ LocaleNames/fr_FR/BE=Belgique LocaleNames/fr_FR/CA=Canada LocaleNames/fr_FR/JP=Japon LocaleNames/fr_FR/NL=Pays-Bas -LocaleNames/fr_FR/NO=Norv\u00e8ge +LocaleNames/fr_FR/NO=Norvège LocaleNames/fr_FR/PT=Portugal -LocaleNames/fr_FR/SE=Su\u00e8de +LocaleNames/fr_FR/SE=Suède LocaleNames/fr_FR/TR=Turquie FormatData/fr_FR/DayAbbreviations/0=dim. FormatData/fr_FR/DayAbbreviations/1=lun. @@ -2327,17 +2327,17 @@ FormatData/fr_FR/DayAbbreviations/4=jeu. FormatData/fr_FR/DayAbbreviations/5=ven. FormatData/fr_FR/DayAbbreviations/6=sam. FormatData/fr_FR/MonthAbbreviations/0=janv. -FormatData/fr_FR/MonthAbbreviations/1=f\u00e9vr. +FormatData/fr_FR/MonthAbbreviations/1=févr. FormatData/fr_FR/MonthAbbreviations/2=mars FormatData/fr_FR/MonthAbbreviations/3=avr. FormatData/fr_FR/MonthAbbreviations/4=mai FormatData/fr_FR/MonthAbbreviations/5=juin FormatData/fr_FR/MonthAbbreviations/6=juil. -FormatData/fr_FR/MonthAbbreviations/7=ao\u00fbt +FormatData/fr_FR/MonthAbbreviations/7=août FormatData/fr_FR/MonthAbbreviations/8=sept. FormatData/fr_FR/MonthAbbreviations/9=oct. FormatData/fr_FR/MonthAbbreviations/10=nov. -FormatData/fr_FR/MonthAbbreviations/11=d\u00e9c. +FormatData/fr_FR/MonthAbbreviations/11=déc. FormatData/fr_FR/MonthAbbreviations/12= CalendarData/fr_FR/firstDayOfWeek=2 # next line changed according the 4518811 bug @@ -2346,60 +2346,60 @@ FormatData/fr_FR/AmPmMarkers/0=AM FormatData/fr_FR/AmPmMarkers/1=PM # bug #4117054 -FormatData/ja_JP/AmPmMarkers/0=\u5348\u524d -FormatData/ja_JP/AmPmMarkers/1=\u5348\u5f8c +FormatData/ja_JP/AmPmMarkers/0=午前 +FormatData/ja_JP/AmPmMarkers/1=午後 # bug #4122840, 4290801 -FormatData/ar_AE/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###- -FormatData/ar_BH/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###- -FormatData/ar_DZ/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###- -FormatData/ar_EG/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###- -FormatData/ar_IQ/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###- -FormatData/ar_JO/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###- -FormatData/ar_KW/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###- -FormatData/ar_LB/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###- -FormatData/ar_LY/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###- -FormatData/ar_MA/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###- -FormatData/ar_OM/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###- -FormatData/ar_QA/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###- -FormatData/ar_SA/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###- -FormatData/ar_SD/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###- -FormatData/ar_SY/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###- -FormatData/ar_TN/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###- -FormatData/ar_YE/NumberPatterns/1=\u00a4 #,##0.###;\u00a4 #,##0.###- -FormatData/en_AU/NumberPatterns/1=\u00a4#,##0.00;-\u00a4#,##0.00 -FormatData/en_NZ/NumberPatterns/1=\u00a4#,##0.00;-\u00a4#,##0.00 -FormatData/en_ZA/NumberPatterns/1=\u00a4 #,##0.00;\u00a4-#,##0.00 -FormatData/es_AR/NumberPatterns/1=\u00a4#,##0.00;\u00a4-#,##0.00 -FormatData/es_BO/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00) -FormatData/es_CL/NumberPatterns/1=\u00a4#,##0.00;\u00a4-#,##0.00 -FormatData/es_CO/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00) -FormatData/es_CR/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00) -FormatData/es_DO/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00) -FormatData/es_EC/NumberPatterns/1=\u00a4#,##0.00;\u00a4-#,##0.00 -FormatData/es_GT/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00) -FormatData/es_HN/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00) -FormatData/es_MX/NumberPatterns/1=\u00a4#,##0.00;-\u00a4#,##0.00 -FormatData/es_NI/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00) -FormatData/es_PA/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00) -FormatData/es_PE/NumberPatterns/1=\u00a4#,##0.00;\u00a4-#,##0.00 -FormatData/es_PR/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00) -FormatData/es_PY/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00) -FormatData/es_SV/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00) -FormatData/es_UY/NumberPatterns/1=\u00a4 #,##0.00;(\u00a4#,##0.00) -FormatData/es_VE/NumberPatterns/1=\u00a4#,##0.00;\u00a4 -#,##0.00 -FormatData/fr_FR/NumberPatterns/1=#,##0.00 \u00a4;-#,##0.00 \u00a4 -FormatData/it_IT/NumberPatterns/1=\u00a4 #,##0.00;-\u00a4 #,##0.00 -#FormatData/ja_JP/NumberPatterns/1=\u00a4#,##0.00 #see bug 4175306 -FormatData/ko_KR/NumberPatterns/1=\u00a4#,##0;-\u00a4#,##0 -FormatData/pl_PL/NumberPatterns/1=#,##0.## \u00a4;-#,##0.## \u00a4 -FormatData/pt_BR/NumberPatterns/1=\u00a4 #,##0.00;-\u00a4 #,##0.00 +FormatData/ar_AE/NumberPatterns/1=¤ #,##0.###;¤ #,##0.###- +FormatData/ar_BH/NumberPatterns/1=¤ #,##0.###;¤ #,##0.###- +FormatData/ar_DZ/NumberPatterns/1=¤ #,##0.###;¤ #,##0.###- +FormatData/ar_EG/NumberPatterns/1=¤ #,##0.###;¤ #,##0.###- +FormatData/ar_IQ/NumberPatterns/1=¤ #,##0.###;¤ #,##0.###- +FormatData/ar_JO/NumberPatterns/1=¤ #,##0.###;¤ #,##0.###- +FormatData/ar_KW/NumberPatterns/1=¤ #,##0.###;¤ #,##0.###- +FormatData/ar_LB/NumberPatterns/1=¤ #,##0.###;¤ #,##0.###- +FormatData/ar_LY/NumberPatterns/1=¤ #,##0.###;¤ #,##0.###- +FormatData/ar_MA/NumberPatterns/1=¤ #,##0.###;¤ #,##0.###- +FormatData/ar_OM/NumberPatterns/1=¤ #,##0.###;¤ #,##0.###- +FormatData/ar_QA/NumberPatterns/1=¤ #,##0.###;¤ #,##0.###- +FormatData/ar_SA/NumberPatterns/1=¤ #,##0.###;¤ #,##0.###- +FormatData/ar_SD/NumberPatterns/1=¤ #,##0.###;¤ #,##0.###- +FormatData/ar_SY/NumberPatterns/1=¤ #,##0.###;¤ #,##0.###- +FormatData/ar_TN/NumberPatterns/1=¤ #,##0.###;¤ #,##0.###- +FormatData/ar_YE/NumberPatterns/1=¤ #,##0.###;¤ #,##0.###- +FormatData/en_AU/NumberPatterns/1=¤#,##0.00;-¤#,##0.00 +FormatData/en_NZ/NumberPatterns/1=¤#,##0.00;-¤#,##0.00 +FormatData/en_ZA/NumberPatterns/1=¤ #,##0.00;¤-#,##0.00 +FormatData/es_AR/NumberPatterns/1=¤#,##0.00;¤-#,##0.00 +FormatData/es_BO/NumberPatterns/1=¤#,##0.00;(¤#,##0.00) +FormatData/es_CL/NumberPatterns/1=¤#,##0.00;¤-#,##0.00 +FormatData/es_CO/NumberPatterns/1=¤#,##0.00;(¤#,##0.00) +FormatData/es_CR/NumberPatterns/1=¤#,##0.00;(¤#,##0.00) +FormatData/es_DO/NumberPatterns/1=¤#,##0.00;(¤#,##0.00) +FormatData/es_EC/NumberPatterns/1=¤#,##0.00;¤-#,##0.00 +FormatData/es_GT/NumberPatterns/1=¤#,##0.00;(¤#,##0.00) +FormatData/es_HN/NumberPatterns/1=¤#,##0.00;(¤#,##0.00) +FormatData/es_MX/NumberPatterns/1=¤#,##0.00;-¤#,##0.00 +FormatData/es_NI/NumberPatterns/1=¤#,##0.00;(¤#,##0.00) +FormatData/es_PA/NumberPatterns/1=¤#,##0.00;(¤#,##0.00) +FormatData/es_PE/NumberPatterns/1=¤#,##0.00;¤-#,##0.00 +FormatData/es_PR/NumberPatterns/1=¤#,##0.00;(¤#,##0.00) +FormatData/es_PY/NumberPatterns/1=¤#,##0.00;(¤#,##0.00) +FormatData/es_SV/NumberPatterns/1=¤#,##0.00;(¤#,##0.00) +FormatData/es_UY/NumberPatterns/1=¤ #,##0.00;(¤#,##0.00) +FormatData/es_VE/NumberPatterns/1=¤#,##0.00;¤ -#,##0.00 +FormatData/fr_FR/NumberPatterns/1=#,##0.00 ¤;-#,##0.00 ¤ +FormatData/it_IT/NumberPatterns/1=¤ #,##0.00;-¤ #,##0.00 +#FormatData/ja_JP/NumberPatterns/1=¤#,##0.00 #see bug 4175306 +FormatData/ko_KR/NumberPatterns/1=¤#,##0;-¤#,##0 +FormatData/pl_PL/NumberPatterns/1=#,##0.## ¤;-#,##0.## ¤ +FormatData/pt_BR/NumberPatterns/1=¤ #,##0.00;-¤ #,##0.00 #Changed; see 4936845 -FormatData/ru_RU/NumberPatterns/1=#,##0.## \u00a4;-#,##0.## \u00a4 -FormatData/uk_UA/NumberPatterns/1=#,##0.## \u00a4;-#,##0.## \u00a4 +FormatData/ru_RU/NumberPatterns/1=#,##0.## ¤;-#,##0.## ¤ +FormatData/uk_UA/NumberPatterns/1=#,##0.## ¤;-#,##0.## ¤ # bug #4122468 # Use common country names -LocaleNames//CI=C\u00f4te d\u2019Ivoire +LocaleNames//CI=Côte d’Ivoire LocaleNames//LY=Libya LocaleNames//RU=Russia LocaleNames//VN=Vietnam @@ -2409,59 +2409,59 @@ FormatData/cs/DatePatterns/0=EEEE, d. MMMM yyyy FormatData/cs/DatePatterns/1=d. MMMM yyyy FormatData/cs/DatePatterns/2=d.M.yyyy FormatData/cs/DatePatterns/3=d.M.yy -FormatData/cs/NumberElements/1=\u00a0 +FormatData/cs/NumberElements/1=  FormatData/cs_CZ/NumberPatterns/0=#,##0.##;-#,##0.## -FormatData/cs_CZ/NumberPatterns/1=#,##0.## \u00a4;-#,##0.## \u00a4 +FormatData/cs_CZ/NumberPatterns/1=#,##0.## ¤;-#,##0.## ¤ FormatData/cs_CZ/NumberPatterns/2=#,##0% #bug #4135752 -FormatData/th_TH/NumberPatterns/1=\u00a4#,##0.00;\u00a4-#,##0.00 -CurrencyNames/th_TH/THB=\u0e3f +FormatData/th_TH/NumberPatterns/1=¤#,##0.00;¤-#,##0.00 +CurrencyNames/th_TH/THB=฿ #bug #4153698 # TimeZoneNames/zh_HK/zoneStrings/0/1=Hong Kong Standard Time # changed, see bug 4261506 # TimeZoneNames/zh_HK/zoneStrings/0/2=HKST # changed, see bug 4261506 -LocaleNames/zh/HK=\u4e2d\u56fd\u9999\u6e2f\u7279\u522b\u884c\u653f\u533a -FormatData/zh_HK/MonthNames/0=\u4e00\u6708 -FormatData/zh_HK/MonthNames/1=\u4e8c\u6708 -FormatData/zh_HK/MonthNames/2=\u4e09\u6708 -FormatData/zh_HK/MonthNames/3=\u56db\u6708 -FormatData/zh_HK/MonthAbbreviations/0=1\u6708 -FormatData/zh_HK/MonthAbbreviations/1=2\u6708 -FormatData/zh_HK/MonthAbbreviations/2=3\u6708 -FormatData/zh_HK/MonthAbbreviations/3=4\u6708 -FormatData/zh_HK/DayNames/0=\u661f\u671f\u65e5 -FormatData/zh_HK/DayNames/1=\u661f\u671f\u4e00 -FormatData/zh_HK/DayNames/2=\u661f\u671f\u4e8c -FormatData/zh_HK/DayAbbreviations/0=\u65e5 -FormatData/zh_HK/DayAbbreviations/1=\u4e00 -FormatData/zh_HK/DayAbbreviations/2=\u4e8c -FormatData/zh_HK/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00) +LocaleNames/zh/HK=中国香港特别行政区 +FormatData/zh_HK/MonthNames/0=一月 +FormatData/zh_HK/MonthNames/1=二月 +FormatData/zh_HK/MonthNames/2=三月 +FormatData/zh_HK/MonthNames/3=四月 +FormatData/zh_HK/MonthAbbreviations/0=1月 +FormatData/zh_HK/MonthAbbreviations/1=2月 +FormatData/zh_HK/MonthAbbreviations/2=3月 +FormatData/zh_HK/MonthAbbreviations/3=4月 +FormatData/zh_HK/DayNames/0=星期日 +FormatData/zh_HK/DayNames/1=星期一 +FormatData/zh_HK/DayNames/2=星期二 +FormatData/zh_HK/DayAbbreviations/0=日 +FormatData/zh_HK/DayAbbreviations/1=一 +FormatData/zh_HK/DayAbbreviations/2=二 +FormatData/zh_HK/NumberPatterns/1=¤#,##0.00;(¤#,##0.00) CurrencyNames/zh_HK/HKD=HK$ -FormatData/zh_HK/TimePatterns/0=ahh'\u6642'mm'\u5206'ss'\u79d2' z -FormatData/zh_HK/TimePatterns/1=ahh'\u6642'mm'\u5206'ss'\u79d2' +FormatData/zh_HK/TimePatterns/0=ahh'時'mm'分'ss'秒' z +FormatData/zh_HK/TimePatterns/1=ahh'時'mm'分'ss'秒' FormatData/zh_HK/TimePatterns/2=ahh:mm:ss FormatData/zh_HK/TimePatterns/3=ah:mm -FormatData/zh_HK/DatePatterns/0=yyyy'\u5e74'MM'\u6708'dd'\u65e5' EEEE -FormatData/zh_HK/DatePatterns/1=yyyy'\u5e74'MM'\u6708'dd'\u65e5' EEEE -FormatData/zh_HK/DatePatterns/2=yyyy'\u5e74'M'\u6708'd'\u65e5' -FormatData/zh_HK/DatePatterns/3=yy'\u5e74'M'\u6708'd'\u65e5' +FormatData/zh_HK/DatePatterns/0=yyyy'年'MM'月'dd'日' EEEE +FormatData/zh_HK/DatePatterns/1=yyyy'年'MM'月'dd'日' EEEE +FormatData/zh_HK/DatePatterns/2=yyyy'年'M'月'd'日' +FormatData/zh_HK/DatePatterns/3=yy'年'M'月'd'日' FormatData/zh_HK/DateTimePatterns/0={1} {0} #bug #4149569 -LocaleNames/tr/TR=T\u00fcrkiye +LocaleNames/tr/TR=Türkiye #bug 4175306 -FormatData/es_ES/NumberPatterns/1=#,##0 \u00a4;-#,##0 \u00a4 -FormatData/ja_JP/NumberPatterns/1=\u00a4#,##0;-\u00a4#,##0 +FormatData/es_ES/NumberPatterns/1=#,##0 ¤;-#,##0 ¤ +FormatData/ja_JP/NumberPatterns/1=¤#,##0;-¤#,##0 #bug #4215747 - commented out by mfang due to 4900884 -#FormatData/ko/TimePatterns/0=a h'\uc2dc' m'\ubd84' s'\ucd08' z -#FormatData/ko/TimePatterns/1=a h'\uc2dc' m'\ubd84' s'\ucd08' +#FormatData/ko/TimePatterns/0=a h'시' m'분' s'초' z +#FormatData/ko/TimePatterns/1=a h'시' m'분' s'초' #bug 4900884 -FormatData/ko/TimePatterns/0=a h'\uc2dc' mm'\ubd84' ss'\ucd08' z -FormatData/ko/TimePatterns/1=a h'\uc2dc' mm'\ubd84' ss'\ucd08' +FormatData/ko/TimePatterns/0=a h'시' mm'분' ss'초' z +FormatData/ko/TimePatterns/1=a h'시' mm'분' ss'초' FormatData/ko/TimePatterns/2=a h:mm:ss FormatData/ko/TimePatterns/3=a h:mm @@ -2480,10 +2480,10 @@ TimeZoneNames/en_CA/CTT/1=China Standard Time TimeZoneNames/en_CA/CTT/2=CST #bug nobugid, 4290801, 4942982 -CurrencyNames/ru_RU/RUB=\u0440\u0443\u0431. +CurrencyNames/ru_RU/RUB=руб. #bug 4826794 -LocaleNames/ru_RU/MM=\u041c\u044c\u044f\u043d\u043c\u0430 (\u0411\u0438\u0440\u043c\u0430) +LocaleNames/ru_RU/MM=Мьянма (Бирма) #bug 4518811 CalendarData/ca_ES/minimalDaysInFirstWeek=4 @@ -2501,24 +2501,24 @@ CalendarData/pl_PL/minimalDaysInFirstWeek=4 CalendarData/pt_PT/minimalDaysInFirstWeek=4 #bug 4945388 -CurrencyNames/be_BY/BYR=\u0420\u0443\u0431 -CurrencyNames/bg_BG/BGN=\u043b\u0432. +CurrencyNames/be_BY/BYR=Руб +CurrencyNames/bg_BG/BGN=лв. #bug 4794068 FormatData/ca_ES/NumberPatterns/0=#,##0.###;-#,##0.### #bug 5032580 -FormatData/sk/DayNames/0=Nede\u013ea +FormatData/sk/DayNames/0=Nedeľa FormatData/sk/DayAbbreviations/5=Pi #bug 5074431 -FormatData/bg/DayNames/4=\u0427\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a +FormatData/bg/DayNames/4=Четвъртък #bug 2121133 -FormatData/sv/NumberElements/1=\u00a0 +FormatData/sv/NumberElements/1=  #bug 6208712 -LocaleNames/zh/tw=\u5951\u7ef4\u8bed +LocaleNames/zh/tw=契维语 #bug 6277020 CalendarData/ca_ES/firstDayOfWeek=2 @@ -2526,15 +2526,15 @@ CalendarData/ca_ES/firstDayOfWeek=2 #bug 6277696 #zh_SG, id, id_ID, en_MT, mt_MT, en_PH, el, el_CY, ms, ms_MY #zh_SG -FormatData/zh_SG/DayAbbreviations/0=\u5468\u65e5 -FormatData/zh_SG/DayAbbreviations/1=\u5468\u4e00 -FormatData/zh_SG/DayAbbreviations/2=\u5468\u4e8c -FormatData/zh_SG/DayAbbreviations/3=\u5468\u4e09 -FormatData/zh_SG/DayAbbreviations/4=\u5468\u56db -FormatData/zh_SG/DayAbbreviations/5=\u5468\u4e94 -FormatData/zh_SG/DayAbbreviations/6=\u5468\u516d +FormatData/zh_SG/DayAbbreviations/0=周日 +FormatData/zh_SG/DayAbbreviations/1=周一 +FormatData/zh_SG/DayAbbreviations/2=周二 +FormatData/zh_SG/DayAbbreviations/3=周三 +FormatData/zh_SG/DayAbbreviations/4=周四 +FormatData/zh_SG/DayAbbreviations/5=周五 +FormatData/zh_SG/DayAbbreviations/6=周六 FormatData/zh_SG/NumberPatterns/0=#,##0.### -FormatData/zh_SG/NumberPatterns/1=\u00a4#,##0.00 +FormatData/zh_SG/NumberPatterns/1=¤#,##0.00 FormatData/zh_SG/NumberPatterns/2=#,##0% CurrencyNames/zh_SG/SGD=S$ FormatData/zh_SG/TimePatterns/0=a hh:mm:ss @@ -2546,64 +2546,64 @@ FormatData/zh_SG/DatePatterns/1=dd MMM yyyy FormatData/zh_SG/DatePatterns/2=dd-MMM-yy FormatData/zh_SG/DatePatterns/3=dd/MM/yy FormatData/zh_SG/DateTimePatterns/0={1} {0} -LocaleNames/zh_SG/ae=\u963f\u7ef4\u65af\u5854\u8bed -LocaleNames/zh_SG/ak=\u963f\u80af\u8bed -LocaleNames/zh_SG/cr=\u514b\u91cc\u65cf\u8bed -LocaleNames/zh_SG/cu=\u6559\u4f1a\u65af\u62c9\u592b\u8bed -LocaleNames/zh_SG/ff=\u5bcc\u62c9\u8bed -LocaleNames/zh_SG/gv=\u9a6c\u6069\u8bed -LocaleNames/zh_SG/ig=\u4f0a\u535a\u8bed -LocaleNames/zh_SG/ii=\u56db\u5ddd\u5f5d\u8bed -LocaleNames/zh_SG/ko=\u97e9\u8bed -LocaleNames/zh_SG/kw=\u5eb7\u6c83\u5c14\u8bed -LocaleNames/zh_SG/lg=\u5362\u5e72\u8fbe\u8bed -LocaleNames/zh_SG/li=\u6797\u5821\u8bed -LocaleNames/zh_SG/lu=\u9c81\u5df4\u52a0\u4e39\u52a0\u8bed -LocaleNames/zh_SG/nd=\u5317\u6069\u5fb7\u8d1d\u52d2\u8bed -LocaleNames/zh_SG/nr=\u5357\u6069\u5fb7\u8d1d\u52d2\u8bed -LocaleNames/zh_SG/sc=\u8428\u4e01\u8bed -LocaleNames/zh_SG/ty=\u5854\u5e0c\u63d0\u8bed -LocaleNames/zh_SG/AS=\u7f8e\u5c5e\u8428\u6469\u4e9a -LocaleNames/zh_SG/AU=\u6fb3\u5927\u5229\u4e9a -LocaleNames/zh_SG/BD=\u5b5f\u52a0\u62c9\u56fd -LocaleNames/zh_SG/BV=\u5e03\u97e6\u5c9b -LocaleNames/zh_SG/BZ=\u4f2f\u5229\u5179 -LocaleNames/zh_SG/CZ=\u6377\u514b -LocaleNames/zh_SG/ER=\u5384\u7acb\u7279\u91cc\u4e9a -LocaleNames/zh_SG/FK=\u798f\u514b\u5170\u7fa4\u5c9b -LocaleNames/zh_SG/FM=\u5bc6\u514b\u7f57\u5c3c\u897f\u4e9a -LocaleNames/zh_SG/GS=\u5357\u4e54\u6cbb\u4e9a\u548c\u5357\u6851\u5a01\u5947\u7fa4\u5c9b -LocaleNames/zh_SG/GW=\u51e0\u5185\u4e9a\u6bd4\u7ecd -LocaleNames/zh_SG/HK=\u4e2d\u56fd\u9999\u6e2f\u7279\u522b\u884c\u653f\u533a -LocaleNames/zh_SG/HM=\u8d6b\u5fb7\u5c9b\u548c\u9ea6\u514b\u5510\u7eb3\u7fa4\u5c9b -LocaleNames/zh_SG/ID=\u5370\u5ea6\u5c3c\u897f\u4e9a -LocaleNames/zh_SG/KR=\u97e9\u56fd -LocaleNames/zh_SG/LA=\u8001\u631d -LocaleNames/zh_SG/MK=\u5317\u9a6c\u5176\u987f -LocaleNames/zh_SG/MO=\u4e2d\u56fd\u6fb3\u95e8\u7279\u522b\u884c\u653f\u533a -LocaleNames/zh_SG/MP=\u5317\u9a6c\u91cc\u4e9a\u7eb3\u7fa4\u5c9b -LocaleNames/zh_SG/NU=\u7ebd\u57c3 -LocaleNames/zh_SG/NZ=\u65b0\u897f\u5170 -LocaleNames/zh_SG/PF=\u6cd5\u5c5e\u6ce2\u5229\u5c3c\u897f\u4e9a -LocaleNames/zh_SG/PM=\u5723\u76ae\u57c3\u5c14\u548c\u5bc6\u514b\u9686\u7fa4\u5c9b -LocaleNames/zh_SG/PN=\u76ae\u7279\u51ef\u6069\u7fa4\u5c9b -LocaleNames/zh_SG/PR=\u6ce2\u591a\u9ece\u5404 -LocaleNames/zh_SG/PS=\u5df4\u52d2\u65af\u5766\u9886\u571f -LocaleNames/zh_SG/RE=\u7559\u5c3c\u6c6a -LocaleNames/zh_SG/SA=\u6c99\u7279\u963f\u62c9\u4f2f -LocaleNames/zh_SG/SH=\u5723\u8d6b\u52d2\u62ff -LocaleNames/zh_SG/SJ=\u65af\u74e6\u5c14\u5df4\u548c\u626c\u9a6c\u5ef6 -LocaleNames/zh_SG/SL=\u585e\u62c9\u5229\u6602 -LocaleNames/zh_SG/TC=\u7279\u514b\u65af\u548c\u51ef\u79d1\u65af\u7fa4\u5c9b -LocaleNames/zh_SG/TK=\u6258\u514b\u52b3 -LocaleNames/zh_SG/TW=\u53f0\u6e7e -LocaleNames/zh_SG/UM=\u7f8e\u56fd\u672c\u571f\u5916\u5c0f\u5c9b\u5c7f -LocaleNames/zh_SG/WF=\u74e6\u5229\u65af\u548c\u5bcc\u56fe\u7eb3 -LocaleNames/zh_SG/WS=\u8428\u6469\u4e9a -LocaleNames/zh_SG/YT=\u9a6c\u7ea6\u7279 +LocaleNames/zh_SG/ae=阿维斯塔语 +LocaleNames/zh_SG/ak=阿肯语 +LocaleNames/zh_SG/cr=克里族语 +LocaleNames/zh_SG/cu=教会斯拉夫语 +LocaleNames/zh_SG/ff=富拉语 +LocaleNames/zh_SG/gv=马恩语 +LocaleNames/zh_SG/ig=伊博语 +LocaleNames/zh_SG/ii=四川彝语 +LocaleNames/zh_SG/ko=韩语 +LocaleNames/zh_SG/kw=康沃尔语 +LocaleNames/zh_SG/lg=卢干达语 +LocaleNames/zh_SG/li=林堡语 +LocaleNames/zh_SG/lu=鲁巴加丹加语 +LocaleNames/zh_SG/nd=北恩德贝勒语 +LocaleNames/zh_SG/nr=南恩德贝勒语 +LocaleNames/zh_SG/sc=萨丁语 +LocaleNames/zh_SG/ty=塔希提语 +LocaleNames/zh_SG/AS=美属萨摩亚 +LocaleNames/zh_SG/AU=澳大利亚 +LocaleNames/zh_SG/BD=孟加拉国 +LocaleNames/zh_SG/BV=布韦岛 +LocaleNames/zh_SG/BZ=伯利兹 +LocaleNames/zh_SG/CZ=捷克 +LocaleNames/zh_SG/ER=厄立特里亚 +LocaleNames/zh_SG/FK=福克兰群岛 +LocaleNames/zh_SG/FM=密克罗尼西亚 +LocaleNames/zh_SG/GS=南乔治亚和南桑威奇群岛 +LocaleNames/zh_SG/GW=几内亚比绍 +LocaleNames/zh_SG/HK=中国香港特别行政区 +LocaleNames/zh_SG/HM=赫德岛和麦克唐纳群岛 +LocaleNames/zh_SG/ID=印度尼西亚 +LocaleNames/zh_SG/KR=韩国 +LocaleNames/zh_SG/LA=老挝 +LocaleNames/zh_SG/MK=北马其顿 +LocaleNames/zh_SG/MO=中国澳门特别行政区 +LocaleNames/zh_SG/MP=北马里亚纳群岛 +LocaleNames/zh_SG/NU=纽埃 +LocaleNames/zh_SG/NZ=新西兰 +LocaleNames/zh_SG/PF=法属波利尼西亚 +LocaleNames/zh_SG/PM=圣皮埃尔和密克隆群岛 +LocaleNames/zh_SG/PN=皮特凯恩群岛 +LocaleNames/zh_SG/PR=波多黎各 +LocaleNames/zh_SG/PS=巴勒斯坦领土 +LocaleNames/zh_SG/RE=留尼汪 +LocaleNames/zh_SG/SA=沙特阿拉伯 +LocaleNames/zh_SG/SH=圣赫勒拿 +LocaleNames/zh_SG/SJ=斯瓦尔巴和扬马延 +LocaleNames/zh_SG/SL=塞拉利昂 +LocaleNames/zh_SG/TC=特克斯和凯科斯群岛 +LocaleNames/zh_SG/TK=托克劳 +LocaleNames/zh_SG/TW=台湾 +LocaleNames/zh_SG/UM=美国本土外小岛屿 +LocaleNames/zh_SG/WF=瓦利斯和富图纳 +LocaleNames/zh_SG/WS=萨摩亚 +LocaleNames/zh_SG/YT=马约特 #en_SG FormatData/en_SG/NumberPatterns/0=#,##0.### -FormatData/en_SG/NumberPatterns/1=\u00a4#,##0.00 +FormatData/en_SG/NumberPatterns/1=¤#,##0.00 FormatData/en_SG/NumberPatterns/2=#,##0% CurrencyNames/en_SG/SGD=$ LocaleNames/en_SG/kj=Kuanyama @@ -2615,14 +2615,14 @@ LocaleNames/en_SG/pa=Punjabi LocaleNames/en_SG/rm=Romansh LocaleNames/en_SG/to=Tongan LocaleNames/en_SG/CC=Cocos (Keeling) Islands -LocaleNames/en_SG/CI=C\u00f4te d\u2019Ivoire +LocaleNames/en_SG/CI=Côte d’Ivoire LocaleNames/en_SG/GS=South Georgia & South Sandwich Islands LocaleNames/en_SG/HM=Heard & McDonald Islands LocaleNames/en_SG/KN=St. Kitts & Nevis LocaleNames/en_SG/PM=St. Pierre & Miquelon LocaleNames/en_SG/PS=Palestinian Territories LocaleNames/en_SG/SJ=Svalbard & Jan Mayen -LocaleNames/en_SG/ST=S\u00e3o Tom\u00e9 & Pr\u00edncipe +LocaleNames/en_SG/ST=São Tomé & Príncipe LocaleNames/en_SG/TC=Turks & Caicos Islands LocaleNames/en_SG/TL=Timor-Leste LocaleNames/en_SG/VC=St. Vincent & Grenadines @@ -2670,7 +2670,7 @@ FormatData/in/DayAbbreviations/6=Sab FormatData/in/Eras/0=BCE FormatData/in/Eras/1=CE FormatData/in/NumberPatterns/0=#,##0.### -FormatData/in/NumberPatterns/1=\u00a4#,##0.00 +FormatData/in/NumberPatterns/1=¤#,##0.00 FormatData/in/NumberPatterns/2=#,##0% FormatData/in/NumberElements/0=, FormatData/in/NumberElements/1=. @@ -2680,8 +2680,8 @@ FormatData/in/NumberElements/4=0 FormatData/in/NumberElements/5=# FormatData/in/NumberElements/6=- FormatData/in/NumberElements/7=E -FormatData/in/NumberElements/8=\u2030 -FormatData/in/NumberElements/9=\u221e +FormatData/in/NumberElements/8=‰ +FormatData/in/NumberElements/9=∞ FormatData/in/NumberElements/10=NaN FormatData/in/TimePatterns/0=HH:mm:ss z FormatData/in/TimePatterns/1=HH:mm:ss z @@ -2764,7 +2764,7 @@ LocaleNames/in/CD=Kongo - Kinshasa LocaleNames/in/CF=Republik Afrika Tengah LocaleNames/in/CG=Kongo - Brazzaville LocaleNames/in/CH=Swiss -LocaleNames/in/CI=C\u00f4te d\u2019Ivoire +LocaleNames/in/CI=Côte d’Ivoire LocaleNames/in/CK=Kepulauan Cook LocaleNames/in/CL=Cile LocaleNames/in/CM=Kamerun @@ -2828,7 +2828,7 @@ LocaleNames/in/PM=Saint Pierre dan Miquelon LocaleNames/in/PR=Puerto Riko LocaleNames/in/PS=Wilayah Palestina LocaleNames/in/PT=Portugal -LocaleNames/in/RE=R\u00e9union +LocaleNames/in/RE=Réunion LocaleNames/in/RU=Rusia LocaleNames/in/SA=Arab Saudi LocaleNames/in/SB=Kepulauan Solomon @@ -2858,7 +2858,7 @@ FormatData/in_ID/DateTimePatterns/0={1} {0} CurrencyNames/in_ID/IDR/0=Rp #en_MT FormatData/en_MT/NumberPatterns/0=#,##0.### -FormatData/en_MT/NumberPatterns/1=\u00a4#,##0.00 +FormatData/en_MT/NumberPatterns/1=¤#,##0.00 FormatData/en_MT/NumberPatterns/2=#,##0% FormatData/en_MT/TimePatterns/0=HH:mm:ss z FormatData/en_MT/TimePatterns/1=HH:mm:ss z @@ -2870,7 +2870,7 @@ FormatData/en_MT/DatePatterns/2=dd MMM yyyy FormatData/en_MT/DatePatterns/3=dd/MM/yyyy FormatData/en_MT/DateTimePatterns/0={1} {0} CurrencyNames/en_MT/MTL=Lm -CurrencyNames/en_MT/EUR=\u20ac +CurrencyNames/en_MT/EUR=€ LocaleNames/en_MT/kj=Kuanyama LocaleNames/en_MT/kl=Kalaallisut LocaleNames/en_MT/ny=Nyanja @@ -2880,27 +2880,27 @@ LocaleNames/en_MT/pa=Punjabi LocaleNames/en_MT/rm=Romansh LocaleNames/en_MT/to=Tongan LocaleNames/en_MT/CC=Cocos (Keeling) Islands -LocaleNames/en_MT/CI=C\u00f4te d\u2019Ivoire +LocaleNames/en_MT/CI=Côte d’Ivoire LocaleNames/en_MT/GS=South Georgia & South Sandwich Islands LocaleNames/en_MT/HM=Heard & McDonald Islands LocaleNames/en_MT/KN=St. Kitts & Nevis LocaleNames/en_MT/PM=St. Pierre & Miquelon LocaleNames/en_MT/PS=Palestinian Territories LocaleNames/en_MT/SJ=Svalbard & Jan Mayen -LocaleNames/en_MT/ST=S\u00e3o Tom\u00e9 & Pr\u00edncipe +LocaleNames/en_MT/ST=São Tomé & Príncipe LocaleNames/en_MT/TC=Turks & Caicos Islands LocaleNames/en_MT/TL=Timor-Leste LocaleNames/en_MT/VC=St. Vincent & Grenadines LocaleNames/en_MT/WF=Wallis & Futuna #mt_MT FormatData/mt_MT/NumberPatterns/0=#,##0.### -FormatData/mt_MT/NumberPatterns/1=\u00a4#,##0.00 +FormatData/mt_MT/NumberPatterns/1=¤#,##0.00 FormatData/mt_MT/NumberPatterns/2=#,##0% CurrencyNames/mt_MT/MTL=Lm -CurrencyNames/mt_MT/EUR=\u20ac +CurrencyNames/mt_MT/EUR=€ #en_PH FormatData/en_PH/NumberPatterns/0=#,##0.### -FormatData/en_PH/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00) +FormatData/en_PH/NumberPatterns/1=¤#,##0.00;(¤#,##0.00) FormatData/en_PH/NumberPatterns/2=#,##0% FormatData/en_PH/TimePatterns/0=h:mm:ss a z FormatData/en_PH/TimePatterns/1=h:mm:ss a z @@ -2920,56 +2920,56 @@ LocaleNames/en_PH/pa=Punjabi LocaleNames/en_PH/rm=Romansh LocaleNames/en_PH/to=Tongan LocaleNames/en_PH/CC=Cocos (Keeling) Islands -LocaleNames/en_PH/CI=C\u00f4te d\u2019Ivoire +LocaleNames/en_PH/CI=Côte d’Ivoire LocaleNames/en_PH/GS=South Georgia & South Sandwich Islands LocaleNames/en_PH/HM=Heard & McDonald Islands LocaleNames/en_PH/KN=St. Kitts & Nevis LocaleNames/en_PH/PM=St. Pierre & Miquelon LocaleNames/en_PH/PS=Palestinian Territories LocaleNames/en_PH/SJ=Svalbard & Jan Mayen -LocaleNames/en_PH/ST=S\u00e3o Tom\u00e9 & Pr\u00edncipe +LocaleNames/en_PH/ST=São Tomé & Príncipe #el -FormatData/el/standalone.MonthNames/0=\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2 -FormatData/el/standalone.MonthNames/1=\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2 -FormatData/el/standalone.MonthNames/2=\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2 -FormatData/el/standalone.MonthNames/3=\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2 -FormatData/el/standalone.MonthNames/4=\u039c\u03ac\u03ca\u03bf\u03c2 -FormatData/el/standalone.MonthNames/5=\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2 -FormatData/el/standalone.MonthNames/6=\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2 -FormatData/el/standalone.MonthNames/7=\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2 -FormatData/el/standalone.MonthNames/8=\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2 -FormatData/el/standalone.MonthNames/9=\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2 -FormatData/el/standalone.MonthNames/10=\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2 -FormatData/el/standalone.MonthNames/11=\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2 +FormatData/el/standalone.MonthNames/0=Ιανουάριος +FormatData/el/standalone.MonthNames/1=Φεβρουάριος +FormatData/el/standalone.MonthNames/2=Μάρτιος +FormatData/el/standalone.MonthNames/3=Απρίλιος +FormatData/el/standalone.MonthNames/4=Μάϊος +FormatData/el/standalone.MonthNames/5=Ιούνιος +FormatData/el/standalone.MonthNames/6=Ιούλιος +FormatData/el/standalone.MonthNames/7=Αύγουστος +FormatData/el/standalone.MonthNames/8=Σεπτέμβριος +FormatData/el/standalone.MonthNames/9=Οκτώβριος +FormatData/el/standalone.MonthNames/10=Νοέμβριος +FormatData/el/standalone.MonthNames/11=Δεκέμβριος FormatData/el/standalone.MonthNames/12= -FormatData/el/MonthAbbreviations/0=\u0399\u03b1\u03bd -FormatData/el/MonthAbbreviations/1=\u03a6\u03b5\u03b2 -FormatData/el/MonthAbbreviations/2=\u039c\u03b1\u03c1 -FormatData/el/MonthAbbreviations/3=\u0391\u03c0\u03c1 -FormatData/el/MonthAbbreviations/4=\u039c\u03b1\u03ca -FormatData/el/MonthAbbreviations/5=\u0399\u03bf\u03c5\u03bd -FormatData/el/MonthAbbreviations/6=\u0399\u03bf\u03c5\u03bb -FormatData/el/MonthAbbreviations/7=\u0391\u03c5\u03b3 -FormatData/el/MonthAbbreviations/8=\u03a3\u03b5\u03c0 -FormatData/el/MonthAbbreviations/9=\u039f\u03ba\u03c4 -FormatData/el/MonthAbbreviations/10=\u039d\u03bf\u03b5 -FormatData/el/MonthAbbreviations/11=\u0394\u03b5\u03ba -FormatData/el/DayNames/0=\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae -FormatData/el/DayNames/1=\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1 -FormatData/el/DayNames/2=\u03a4\u03c1\u03af\u03c4\u03b7 -FormatData/el/DayNames/3=\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7 -FormatData/el/DayNames/4=\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7 -FormatData/el/DayNames/5=\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae -FormatData/el/DayNames/6=\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf -FormatData/el/DayAbbreviations/0=\u039a\u03c5\u03c1 -FormatData/el/DayAbbreviations/1=\u0394\u03b5\u03c5 -FormatData/el/DayAbbreviations/2=\u03a4\u03c1\u03b9 -FormatData/el/DayAbbreviations/3=\u03a4\u03b5\u03c4 -FormatData/el/DayAbbreviations/4=\u03a0\u03b5\u03bc -FormatData/el/DayAbbreviations/5=\u03a0\u03b1\u03c1 -FormatData/el/DayAbbreviations/6=\u03a3\u03b1\u03b2 -FormatData/el/AmPmMarkers/0=\u03c0\u03bc -FormatData/el/AmPmMarkers/1=\u03bc\u03bc +FormatData/el/MonthAbbreviations/0=Ιαν +FormatData/el/MonthAbbreviations/1=Φεβ +FormatData/el/MonthAbbreviations/2=Μαρ +FormatData/el/MonthAbbreviations/3=Απρ +FormatData/el/MonthAbbreviations/4=Μαϊ +FormatData/el/MonthAbbreviations/5=Ιουν +FormatData/el/MonthAbbreviations/6=Ιουλ +FormatData/el/MonthAbbreviations/7=Αυγ +FormatData/el/MonthAbbreviations/8=Σεπ +FormatData/el/MonthAbbreviations/9=Οκτ +FormatData/el/MonthAbbreviations/10=Νοε +FormatData/el/MonthAbbreviations/11=Δεκ +FormatData/el/DayNames/0=Κυριακή +FormatData/el/DayNames/1=Δευτέρα +FormatData/el/DayNames/2=Τρίτη +FormatData/el/DayNames/3=Τετάρτη +FormatData/el/DayNames/4=Πέμπτη +FormatData/el/DayNames/5=Παρασκευή +FormatData/el/DayNames/6=Σάββατο +FormatData/el/DayAbbreviations/0=Κυρ +FormatData/el/DayAbbreviations/1=Δευ +FormatData/el/DayAbbreviations/2=Τρι +FormatData/el/DayAbbreviations/3=Τετ +FormatData/el/DayAbbreviations/4=Πεμ +FormatData/el/DayAbbreviations/5=Παρ +FormatData/el/DayAbbreviations/6=Σαβ +FormatData/el/AmPmMarkers/0=πμ +FormatData/el/AmPmMarkers/1=μμ FormatData/el/NumberElements/0=, FormatData/el/NumberElements/1=. FormatData/el/NumberElements/2=; @@ -2978,9 +2978,9 @@ FormatData/el/NumberElements/4=0 FormatData/el/NumberElements/5=# FormatData/el/NumberElements/6=- FormatData/el/NumberElements/7=E -FormatData/el/NumberElements/8=\u2030 -FormatData/el/NumberElements/9=\u221e -FormatData/el/NumberElements/10=\ufffd +FormatData/el/NumberElements/8=‰ +FormatData/el/NumberElements/9=∞ +FormatData/el/NumberElements/10=� FormatData/el/TimePatterns/0=h:mm:ss a z FormatData/el/TimePatterns/1=h:mm:ss a z FormatData/el/TimePatterns/2=h:mm:ss a @@ -2990,28 +2990,28 @@ FormatData/el/DatePatterns/1=d MMMM yyyy FormatData/el/DatePatterns/2=d MMM yyyy FormatData/el/DatePatterns/3=d/M/yyyy FormatData/el/DateTimePatterns/0={1} {0} -LocaleNames/el/GR=\u0395\u03bb\u03bb\u03ac\u03b4\u03b1 +LocaleNames/el/GR=Ελλάδα #el_CY #bug 6483191 -FormatData/el_CY/MonthNames/0=\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2 -FormatData/el_CY/MonthNames/1=\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2 -FormatData/el_CY/MonthNames/2=\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2 -FormatData/el_CY/MonthNames/3=\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2 -FormatData/el_CY/MonthNames/4=\u039c\u03ac\u03b9\u03bf\u03c2 -FormatData/el_CY/MonthNames/5=\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2 -FormatData/el_CY/MonthNames/6=\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2 -FormatData/el_CY/MonthNames/7=\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2 -FormatData/el_CY/MonthNames/8=\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2 -FormatData/el_CY/MonthNames/9=\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2 -FormatData/el_CY/MonthNames/10=\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2 -FormatData/el_CY/MonthNames/11=\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2 +FormatData/el_CY/MonthNames/0=Ιανουάριος +FormatData/el_CY/MonthNames/1=Φεβρουάριος +FormatData/el_CY/MonthNames/2=Μάρτιος +FormatData/el_CY/MonthNames/3=Απρίλιος +FormatData/el_CY/MonthNames/4=Μάιος +FormatData/el_CY/MonthNames/5=Ιούνιος +FormatData/el_CY/MonthNames/6=Ιούλιος +FormatData/el_CY/MonthNames/7=Αύγουστος +FormatData/el_CY/MonthNames/8=Σεπτέμβριος +FormatData/el_CY/MonthNames/9=Οκτώβριος +FormatData/el_CY/MonthNames/10=Νοέμβριος +FormatData/el_CY/MonthNames/11=Δεκέμβριος FormatData/el_CY/MonthNames/12= -FormatData/el_CY/AmPmMarkers/0=\u03a0\u039c -FormatData/el_CY/AmPmMarkers/1=\u039c\u039c -FormatData/el_CY/Eras/0=\u03c0.\u03a7. -FormatData/el_CY/Eras/1=\u03bc.\u03a7. +FormatData/el_CY/AmPmMarkers/0=ΠΜ +FormatData/el_CY/AmPmMarkers/1=ΜΜ +FormatData/el_CY/Eras/0=π.Χ. +FormatData/el_CY/Eras/1=μ.Χ. FormatData/el_CY/NumberPatterns/0=#,##0.### -FormatData/el_CY/NumberPatterns/1=\u00a4#,##0.00 +FormatData/el_CY/NumberPatterns/1=¤#,##0.00 FormatData/el_CY/NumberPatterns/2=#,##0% FormatData/el_CY/TimePatterns/0=h:mm:ss a z FormatData/el_CY/TimePatterns/1=h:mm:ss a z @@ -3022,311 +3022,311 @@ FormatData/el_CY/DatePatterns/1=dd MMMM yyyy FormatData/el_CY/DatePatterns/2=dd MMM yyyy FormatData/el_CY/DatePatterns/3=dd/MM/yyyy FormatData/el_CY/DateTimePatterns/0={1} {0} -LocaleNames/el_CY/ar=\u0391\u03c1\u03b1\u03b2\u03b9\u03ba\u03ac -LocaleNames/el_CY/be=\u039b\u03b5\u03c5\u03ba\u03bf\u03c1\u03c9\u03c3\u03b9\u03ba\u03ac -LocaleNames/el_CY/bg=\u0392\u03bf\u03c5\u03bb\u03b3\u03b1\u03c1\u03b9\u03ba\u03ac -LocaleNames/el_CY/bo=\u0398\u03b9\u03b2\u03b5\u03c4\u03b9\u03b1\u03bd\u03ac -LocaleNames/el_CY/bs=\u0392\u03bf\u03c3\u03bd\u03b9\u03b1\u03ba\u03ac -LocaleNames/el_CY/bn=\u0392\u03b5\u03b3\u03b3\u03b1\u03bb\u03b9\u03ba\u03ac -LocaleNames/el_CY/ca=\u039a\u03b1\u03c4\u03b1\u03bb\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/co=\u039a\u03bf\u03c1\u03c3\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/cs=\u03a4\u03c3\u03b5\u03c7\u03b9\u03ba\u03ac -LocaleNames/el_CY/cy=\u039f\u03c5\u03b1\u03bb\u03b9\u03ba\u03ac -LocaleNames/el_CY/da=\u0394\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/de=\u0393\u03b5\u03c1\u03bc\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/el=\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/en=\u0391\u03b3\u03b3\u03bb\u03b9\u03ba\u03ac -LocaleNames/el_CY/es=\u0399\u03c3\u03c0\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/et=\u0395\u03c3\u03b8\u03bf\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/eu=\u0392\u03b1\u03c3\u03ba\u03b9\u03ba\u03ac -LocaleNames/el_CY/fa=\u03a0\u03b5\u03c1\u03c3\u03b9\u03ba\u03ac -LocaleNames/el_CY/fi=\u03a6\u03b9\u03bd\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac -LocaleNames/el_CY/fr=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ac -LocaleNames/el_CY/ga=\u0399\u03c1\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac -LocaleNames/el_CY/gd=\u03a3\u03ba\u03c9\u03c4\u03b9\u03ba\u03ac \u039a\u03b5\u03bb\u03c4\u03b9\u03ba\u03ac -LocaleNames/el_CY/he=\u0395\u03b2\u03c1\u03b1\u03ca\u03ba\u03ac -LocaleNames/el_CY/hi=\u03a7\u03af\u03bd\u03c4\u03b9 -LocaleNames/el_CY/hr=\u039a\u03c1\u03bf\u03b1\u03c4\u03b9\u03ba\u03ac -LocaleNames/el_CY/hu=\u039f\u03c5\u03b3\u03b3\u03c1\u03b9\u03ba\u03ac -LocaleNames/el_CY/hy=\u0391\u03c1\u03bc\u03b5\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/id=\u0399\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03b9\u03b1\u03ba\u03ac -LocaleNames/el_CY/in=\u0399\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03b9\u03b1\u03ba\u03ac -LocaleNames/el_CY/is=\u0399\u03c3\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac -LocaleNames/el_CY/it=\u0399\u03c4\u03b1\u03bb\u03b9\u03ba\u03ac -LocaleNames/el_CY/iw=\u0395\u03b2\u03c1\u03b1\u03ca\u03ba\u03ac -LocaleNames/el_CY/ja=\u0399\u03b1\u03c0\u03c9\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/ji=\u0393\u03af\u03bd\u03c4\u03b9\u03c2 -LocaleNames/el_CY/ka=\u0393\u03b5\u03c9\u03c1\u03b3\u03b9\u03b1\u03bd\u03ac -LocaleNames/el_CY/ko=\u039a\u03bf\u03c1\u03b5\u03b1\u03c4\u03b9\u03ba\u03ac -LocaleNames/el_CY/la=\u039b\u03b1\u03c4\u03b9\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/lt=\u039b\u03b9\u03b8\u03bf\u03c5\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/lv=\u039b\u03b5\u03c4\u03bf\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/mk=\u03a3\u03bb\u03b1\u03b2\u03bf\u03bc\u03b1\u03ba\u03b5\u03b4\u03bf\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/mn=\u039c\u03bf\u03b3\u03b3\u03bf\u03bb\u03b9\u03ba\u03ac -LocaleNames/el_CY/mo=\u039c\u03bf\u03bb\u03b4\u03b1\u03b2\u03b9\u03ba\u03ac -LocaleNames/el_CY/mt=\u039c\u03b1\u03bb\u03c4\u03b5\u03b6\u03b9\u03ba\u03ac -LocaleNames/el_CY/nl=\u039f\u03bb\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac -LocaleNames/el_CY/no=\u039d\u03bf\u03c1\u03b2\u03b7\u03b3\u03b9\u03ba\u03ac -LocaleNames/el_CY/pl=\u03a0\u03bf\u03bb\u03c9\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/pt=\u03a0\u03bf\u03c1\u03c4\u03bf\u03b3\u03b1\u03bb\u03b9\u03ba\u03ac -LocaleNames/el_CY/ro=\u03a1\u03bf\u03c5\u03bc\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/ru=\u03a1\u03c9\u03c3\u03b9\u03ba\u03ac -LocaleNames/el_CY/sk=\u03a3\u03bb\u03bf\u03b2\u03b1\u03ba\u03b9\u03ba\u03ac -LocaleNames/el_CY/sl=\u03a3\u03bb\u03bf\u03b2\u03b5\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/sq=\u0391\u03bb\u03b2\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/sr=\u03a3\u03b5\u03c1\u03b2\u03b9\u03ba\u03ac -LocaleNames/el_CY/sv=\u03a3\u03bf\u03c5\u03b7\u03b4\u03b9\u03ba\u03ac -LocaleNames/el_CY/th=\u03a4\u03b1\u03ca\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac -LocaleNames/el_CY/tr=\u03a4\u03bf\u03c5\u03c1\u03ba\u03b9\u03ba\u03ac -LocaleNames/el_CY/uk=\u039f\u03c5\u03ba\u03c1\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/vi=\u0392\u03b9\u03b5\u03c4\u03bd\u03b1\u03bc\u03b9\u03ba\u03ac -LocaleNames/el_CY/yi=\u0393\u03af\u03bd\u03c4\u03b9\u03c2 -LocaleNames/el_CY/zh=\u039a\u03b9\u03bd\u03b5\u03b6\u03b9\u03ba\u03ac -LocaleNames/el_CY/AD=\u0391\u03bd\u03b4\u03cc\u03c1\u03b1 -LocaleNames/el_CY/AE=\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03b1 \u0391\u03c1\u03b1\u03b2\u03b9\u03ba\u03ac \u0395\u03bc\u03b9\u03c1\u03ac\u03c4\u03b1 -LocaleNames/el_CY/AF=\u0391\u03c6\u03b3\u03b1\u03bd\u03b9\u03c3\u03c4\u03ac\u03bd -LocaleNames/el_CY/AG=\u0391\u03bd\u03c4\u03af\u03b3\u03ba\u03bf\u03c5\u03b1 \u03ba\u03b1\u03b9 \u039c\u03c0\u03b1\u03c1\u03bc\u03c0\u03bf\u03cd\u03bd\u03c4\u03b1 -LocaleNames/el_CY/AI=\u0391\u03bd\u03b3\u03ba\u03bf\u03c5\u03af\u03bb\u03b1 -LocaleNames/el_CY/AL=\u0391\u03bb\u03b2\u03b1\u03bd\u03af\u03b1 -LocaleNames/el_CY/AM=\u0391\u03c1\u03bc\u03b5\u03bd\u03af\u03b1 -LocaleNames/el_CY/AN=\u039f\u03bb\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ad\u03c2 \u0391\u03bd\u03c4\u03af\u03bb\u03bb\u03b5\u03c2 -LocaleNames/el_CY/AO=\u0391\u03b3\u03ba\u03cc\u03bb\u03b1 -LocaleNames/el_CY/AQ=\u0391\u03bd\u03c4\u03b1\u03c1\u03ba\u03c4\u03b9\u03ba\u03ae -LocaleNames/el_CY/AR=\u0391\u03c1\u03b3\u03b5\u03bd\u03c4\u03b9\u03bd\u03ae -LocaleNames/el_CY/AS=\u0391\u03bc\u03b5\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ae \u03a3\u03b1\u03bc\u03cc\u03b1 -LocaleNames/el_CY/AT=\u0391\u03c5\u03c3\u03c4\u03c1\u03af\u03b1 -LocaleNames/el_CY/AU=\u0391\u03c5\u03c3\u03c4\u03c1\u03b1\u03bb\u03af\u03b1 -LocaleNames/el_CY/AW=\u0391\u03c1\u03bf\u03cd\u03bc\u03c0\u03b1 -LocaleNames/el_CY/AX=\u039d\u03ae\u03c3\u03bf\u03b9 \u038c\u03bb\u03b1\u03bd\u03c4 -LocaleNames/el_CY/AZ=\u0391\u03b6\u03b5\u03c1\u03bc\u03c0\u03b1\u03ca\u03c4\u03b6\u03ac\u03bd -LocaleNames/el_CY/BA=\u0392\u03bf\u03c3\u03bd\u03af\u03b1 - \u0395\u03c1\u03b6\u03b5\u03b3\u03bf\u03b2\u03af\u03bd\u03b7 -LocaleNames/el_CY/BB=\u039c\u03c0\u03b1\u03c1\u03bc\u03c0\u03ad\u03b9\u03bd\u03c4\u03bf\u03c2 -LocaleNames/el_CY/BD=\u039c\u03c0\u03b1\u03bd\u03b3\u03ba\u03bb\u03b1\u03bd\u03c4\u03ad\u03c2 -LocaleNames/el_CY/BE=\u0392\u03ad\u03bb\u03b3\u03b9\u03bf -LocaleNames/el_CY/BF=\u039c\u03c0\u03bf\u03c5\u03c1\u03ba\u03af\u03bd\u03b1 \u03a6\u03ac\u03c3\u03bf -LocaleNames/el_CY/BG=\u0392\u03bf\u03c5\u03bb\u03b3\u03b1\u03c1\u03af\u03b1 -LocaleNames/el_CY/BH=\u039c\u03c0\u03b1\u03c7\u03c1\u03ad\u03b9\u03bd -LocaleNames/el_CY/BI=\u039c\u03c0\u03bf\u03c5\u03c1\u03bf\u03cd\u03bd\u03c4\u03b9 -LocaleNames/el_CY/BJ=\u039c\u03c0\u03b5\u03bd\u03af\u03bd -LocaleNames/el_CY/BM=\u0392\u03b5\u03c1\u03bc\u03bf\u03cd\u03b4\u03b5\u03c2 -LocaleNames/el_CY/BN=\u039c\u03c0\u03c1\u03bf\u03c5\u03bd\u03ad\u03b9 -LocaleNames/el_CY/BO=\u0392\u03bf\u03bb\u03b9\u03b2\u03af\u03b1 -LocaleNames/el_CY/BR=\u0392\u03c1\u03b1\u03b6\u03b9\u03bb\u03af\u03b1 -LocaleNames/el_CY/BS=\u039c\u03c0\u03b1\u03c7\u03ac\u03bc\u03b5\u03c2 -LocaleNames/el_CY/BT=\u039c\u03c0\u03bf\u03c5\u03c4\u03ac\u03bd -LocaleNames/el_CY/BV=\u039d\u03ae\u03c3\u03bf\u03c2 \u039c\u03c0\u03bf\u03c5\u03b2\u03ad -LocaleNames/el_CY/BW=\u039c\u03c0\u03bf\u03c4\u03c3\u03bf\u03c5\u03ac\u03bd\u03b1 -LocaleNames/el_CY/BY=\u039b\u03b5\u03c5\u03ba\u03bf\u03c1\u03c9\u03c3\u03af\u03b1 -LocaleNames/el_CY/BZ=\u039c\u03c0\u03b5\u03bb\u03af\u03b6 -LocaleNames/el_CY/CA=\u039a\u03b1\u03bd\u03b1\u03b4\u03ac\u03c2 -LocaleNames/el_CY/CC=\u039d\u03ae\u03c3\u03bf\u03b9 \u039a\u03cc\u03ba\u03bf\u03c2 (\u039a\u03af\u03bb\u03b9\u03bd\u03b3\u03ba) -LocaleNames/el_CY/CD=\u039a\u03bf\u03bd\u03b3\u03ba\u03cc - \u039a\u03b9\u03bd\u03c3\u03ac\u03c3\u03b1 -LocaleNames/el_CY/CF=\u039a\u03b5\u03bd\u03c4\u03c1\u03bf\u03b1\u03c6\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ae \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1 -LocaleNames/el_CY/CG=\u039a\u03bf\u03bd\u03b3\u03ba\u03cc - \u039c\u03c0\u03c1\u03b1\u03b6\u03b1\u03b2\u03af\u03bb -LocaleNames/el_CY/CH=\u0395\u03bb\u03b2\u03b5\u03c4\u03af\u03b1 -LocaleNames/el_CY/CI=\u0391\u03ba\u03c4\u03ae \u0395\u03bb\u03b5\u03c6\u03b1\u03bd\u03c4\u03bf\u03c3\u03c4\u03bf\u03cd -LocaleNames/el_CY/CK=\u039d\u03ae\u03c3\u03bf\u03b9 \u039a\u03bf\u03c5\u03ba -LocaleNames/el_CY/CL=\u03a7\u03b9\u03bb\u03ae -LocaleNames/el_CY/CM=\u039a\u03b1\u03bc\u03b5\u03c1\u03bf\u03cd\u03bd -LocaleNames/el_CY/CN=\u039a\u03af\u03bd\u03b1 -LocaleNames/el_CY/CO=\u039a\u03bf\u03bb\u03bf\u03bc\u03b2\u03af\u03b1 -LocaleNames/el_CY/CR=\u039a\u03cc\u03c3\u03c4\u03b1 \u03a1\u03af\u03ba\u03b1 -LocaleNames/el_CY/CS=\u03a3\u03b5\u03c1\u03b2\u03af\u03b1 \u03ba\u03b1\u03b9 \u039c\u03b1\u03c5\u03c1\u03bf\u03b2\u03bf\u03cd\u03bd\u03b9\u03bf -LocaleNames/el_CY/CU=\u039a\u03bf\u03cd\u03b2\u03b1 -LocaleNames/el_CY/CV=\u03a0\u03c1\u03ac\u03c3\u03b9\u03bd\u03bf \u0391\u03ba\u03c1\u03c9\u03c4\u03ae\u03c1\u03b9\u03bf -LocaleNames/el_CY/CX=\u039d\u03ae\u03c3\u03bf\u03c2 \u03c4\u03c9\u03bd \u03a7\u03c1\u03b9\u03c3\u03c4\u03bf\u03c5\u03b3\u03ad\u03bd\u03bd\u03c9\u03bd -LocaleNames/el_CY/CY=\u039a\u03cd\u03c0\u03c1\u03bf\u03c2 -LocaleNames/el_CY/CZ=\u03a4\u03c3\u03b5\u03c7\u03af\u03b1 -LocaleNames/el_CY/DE=\u0393\u03b5\u03c1\u03bc\u03b1\u03bd\u03af\u03b1 -LocaleNames/el_CY/DJ=\u03a4\u03b6\u03b9\u03bc\u03c0\u03bf\u03c5\u03c4\u03af -LocaleNames/el_CY/DK=\u0394\u03b1\u03bd\u03af\u03b1 -LocaleNames/el_CY/DM=\u039d\u03c4\u03bf\u03bc\u03af\u03bd\u03b9\u03ba\u03b1 -LocaleNames/el_CY/DO=\u0394\u03bf\u03bc\u03b9\u03bd\u03b9\u03ba\u03b1\u03bd\u03ae \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1 -LocaleNames/el_CY/DZ=\u0391\u03bb\u03b3\u03b5\u03c1\u03af\u03b1 -LocaleNames/el_CY/EC=\u0399\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03cc\u03c2 -LocaleNames/el_CY/EE=\u0395\u03c3\u03b8\u03bf\u03bd\u03af\u03b1 -LocaleNames/el_CY/EG=\u0391\u03af\u03b3\u03c5\u03c0\u03c4\u03bf\u03c2 -LocaleNames/el_CY/EH=\u0394\u03c5\u03c4\u03b9\u03ba\u03ae \u03a3\u03b1\u03c7\u03ac\u03c1\u03b1 -LocaleNames/el_CY/ER=\u0395\u03c1\u03c5\u03b8\u03c1\u03b1\u03af\u03b1 -LocaleNames/el_CY/ES=\u0399\u03c3\u03c0\u03b1\u03bd\u03af\u03b1 -LocaleNames/el_CY/ET=\u0391\u03b9\u03b8\u03b9\u03bf\u03c0\u03af\u03b1 -LocaleNames/el_CY/FI=\u03a6\u03b9\u03bd\u03bb\u03b1\u03bd\u03b4\u03af\u03b1 -LocaleNames/el_CY/FJ=\u03a6\u03af\u03c4\u03b6\u03b9 -LocaleNames/el_CY/FK=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a6\u03cc\u03ba\u03bb\u03b1\u03bd\u03c4 -LocaleNames/el_CY/FM=\u039c\u03b9\u03ba\u03c1\u03bf\u03bd\u03b7\u03c3\u03af\u03b1 -LocaleNames/el_CY/FO=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a6\u03b5\u03c1\u03cc\u03b5\u03c2 -LocaleNames/el_CY/FR=\u0393\u03b1\u03bb\u03bb\u03af\u03b1 -LocaleNames/el_CY/GA=\u0393\u03ba\u03b1\u03bc\u03c0\u03cc\u03bd -LocaleNames/el_CY/GB=\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03bf \u0392\u03b1\u03c3\u03af\u03bb\u03b5\u03b9\u03bf -LocaleNames/el_CY/GD=\u0393\u03c1\u03b5\u03bd\u03ac\u03b4\u03b1 -LocaleNames/el_CY/GE=\u0393\u03b5\u03c9\u03c1\u03b3\u03af\u03b1 -LocaleNames/el_CY/GF=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ae \u0393\u03bf\u03c5\u03b9\u03ac\u03bd\u03b1 -LocaleNames/el_CY/GH=\u0393\u03ba\u03ac\u03bd\u03b1 -LocaleNames/el_CY/GI=\u0393\u03b9\u03b2\u03c1\u03b1\u03bb\u03c4\u03ac\u03c1 -LocaleNames/el_CY/GL=\u0393\u03c1\u03bf\u03b9\u03bb\u03b1\u03bd\u03b4\u03af\u03b1 -LocaleNames/el_CY/GM=\u0393\u03ba\u03ac\u03bc\u03c0\u03b9\u03b1 -LocaleNames/el_CY/GN=\u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1 -LocaleNames/el_CY/GP=\u0393\u03bf\u03c5\u03b1\u03b4\u03b5\u03bb\u03bf\u03cd\u03c0\u03b7 -LocaleNames/el_CY/GQ=\u0399\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03ae \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1 -LocaleNames/el_CY/GS=\u039d\u03ae\u03c3\u03bf\u03b9 \u039d\u03cc\u03c4\u03b9\u03b1 \u0393\u03b5\u03c9\u03c1\u03b3\u03af\u03b1 \u03ba\u03b1\u03b9 \u039d\u03cc\u03c4\u03b9\u03b5\u03c2 \u03a3\u03ac\u03bd\u03c4\u03bf\u03c5\u03b9\u03c4\u03c2 -LocaleNames/el_CY/GT=\u0393\u03bf\u03c5\u03b1\u03c4\u03b5\u03bc\u03ac\u03bb\u03b1 -LocaleNames/el_CY/GU=\u0393\u03ba\u03bf\u03c5\u03ac\u03bc -LocaleNames/el_CY/GW=\u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1 \u039c\u03c0\u03b9\u03c3\u03ac\u03bf\u03c5 -LocaleNames/el_CY/GY=\u0393\u03bf\u03c5\u03b9\u03ac\u03bd\u03b1 -LocaleNames/el_CY/HK=\u03a7\u03bf\u03bd\u03b3\u03ba \u039a\u03bf\u03bd\u03b3\u03ba \u0395\u0394\u03a0 \u039a\u03af\u03bd\u03b1\u03c2 -LocaleNames/el_CY/HM=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a7\u03b5\u03c1\u03bd\u03c4 \u03ba\u03b1\u03b9 \u039c\u03b1\u03ba\u03bd\u03c4\u03cc\u03bd\u03b1\u03bb\u03bd\u03c4 -LocaleNames/el_CY/HN=\u039f\u03bd\u03b4\u03bf\u03cd\u03c1\u03b1 -LocaleNames/el_CY/HR=\u039a\u03c1\u03bf\u03b1\u03c4\u03af\u03b1 -LocaleNames/el_CY/HT=\u0391\u03ca\u03c4\u03ae -LocaleNames/el_CY/HU=\u039f\u03c5\u03b3\u03b3\u03b1\u03c1\u03af\u03b1 -LocaleNames/el_CY/ID=\u0399\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03af\u03b1 -LocaleNames/el_CY/IE=\u0399\u03c1\u03bb\u03b1\u03bd\u03b4\u03af\u03b1 -LocaleNames/el_CY/IL=\u0399\u03c3\u03c1\u03b1\u03ae\u03bb -LocaleNames/el_CY/IN=\u0399\u03bd\u03b4\u03af\u03b1 -LocaleNames/el_CY/IO=\u0392\u03c1\u03b5\u03c4\u03b1\u03bd\u03b9\u03ba\u03ac \u0395\u03b4\u03ac\u03c6\u03b7 \u0399\u03bd\u03b4\u03b9\u03ba\u03bf\u03cd \u03a9\u03ba\u03b5\u03b1\u03bd\u03bf\u03cd -LocaleNames/el_CY/IQ=\u0399\u03c1\u03ac\u03ba -LocaleNames/el_CY/IR=\u0399\u03c1\u03ac\u03bd -LocaleNames/el_CY/IS=\u0399\u03c3\u03bb\u03b1\u03bd\u03b4\u03af\u03b1 -LocaleNames/el_CY/IT=\u0399\u03c4\u03b1\u03bb\u03af\u03b1 -LocaleNames/el_CY/JM=\u03a4\u03b6\u03b1\u03bc\u03ac\u03b9\u03ba\u03b1 -LocaleNames/el_CY/JO=\u0399\u03bf\u03c1\u03b4\u03b1\u03bd\u03af\u03b1 -LocaleNames/el_CY/JP=\u0399\u03b1\u03c0\u03c9\u03bd\u03af\u03b1 -LocaleNames/el_CY/KE=\u039a\u03ad\u03bd\u03c5\u03b1 -LocaleNames/el_CY/KG=\u039a\u03b9\u03c1\u03b3\u03b9\u03c3\u03c4\u03ac\u03bd -LocaleNames/el_CY/KH=\u039a\u03b1\u03bc\u03c0\u03cc\u03c4\u03b6\u03b7 -LocaleNames/el_CY/KI=\u039a\u03b9\u03c1\u03b9\u03bc\u03c0\u03ac\u03c4\u03b9 -LocaleNames/el_CY/KM=\u039a\u03bf\u03bc\u03cc\u03c1\u03b5\u03c2 -LocaleNames/el_CY/KN=\u03a3\u03b5\u03bd \u039a\u03b9\u03c4\u03c2 \u03ba\u03b1\u03b9 \u039d\u03ad\u03b2\u03b9\u03c2 -LocaleNames/el_CY/KP=\u0392\u03cc\u03c1\u03b5\u03b9\u03b1 \u039a\u03bf\u03c1\u03ad\u03b1 -LocaleNames/el_CY/KR=\u039d\u03cc\u03c4\u03b9\u03b1 \u039a\u03bf\u03c1\u03ad\u03b1 -LocaleNames/el_CY/KW=\u039a\u03bf\u03c5\u03b2\u03ad\u03b9\u03c4 -LocaleNames/el_CY/KY=\u039d\u03ae\u03c3\u03bf\u03b9 \u039a\u03ad\u03b9\u03bc\u03b1\u03bd -LocaleNames/el_CY/KZ=\u039a\u03b1\u03b6\u03b1\u03ba\u03c3\u03c4\u03ac\u03bd -LocaleNames/el_CY/LA=\u039b\u03ac\u03bf\u03c2 -LocaleNames/el_CY/LB=\u039b\u03af\u03b2\u03b1\u03bd\u03bf\u03c2 -LocaleNames/el_CY/LC=\u0391\u03b3\u03af\u03b1 \u039b\u03bf\u03c5\u03ba\u03af\u03b1 -LocaleNames/el_CY/LI=\u039b\u03b9\u03c7\u03c4\u03b5\u03bd\u03c3\u03c4\u03ac\u03b9\u03bd -LocaleNames/el_CY/LK=\u03a3\u03c1\u03b9 \u039b\u03ac\u03bd\u03ba\u03b1 -LocaleNames/el_CY/LR=\u039b\u03b9\u03b2\u03b5\u03c1\u03af\u03b1 -LocaleNames/el_CY/LS=\u039b\u03b5\u03c3\u03cc\u03c4\u03bf -LocaleNames/el_CY/LT=\u039b\u03b9\u03b8\u03bf\u03c5\u03b1\u03bd\u03af\u03b1 -LocaleNames/el_CY/LU=\u039b\u03bf\u03c5\u03be\u03b5\u03bc\u03b2\u03bf\u03cd\u03c1\u03b3\u03bf -LocaleNames/el_CY/LV=\u039b\u03b5\u03c4\u03bf\u03bd\u03af\u03b1 -LocaleNames/el_CY/LY=\u039b\u03b9\u03b2\u03cd\u03b7 -LocaleNames/el_CY/MA=\u039c\u03b1\u03c1\u03cc\u03ba\u03bf -LocaleNames/el_CY/MC=\u039c\u03bf\u03bd\u03b1\u03ba\u03cc -LocaleNames/el_CY/MD=\u039c\u03bf\u03bb\u03b4\u03b1\u03b2\u03af\u03b1 -LocaleNames/el_CY/MG=\u039c\u03b1\u03b4\u03b1\u03b3\u03b1\u03c3\u03ba\u03ac\u03c1\u03b7 -LocaleNames/el_CY/MH=\u039d\u03ae\u03c3\u03bf\u03b9 \u039c\u03ac\u03c1\u03c3\u03b1\u03bb -LocaleNames/el_CY/MK=\u0392\u03cc\u03c1\u03b5\u03b9\u03b1 \u039c\u03b1\u03ba\u03b5\u03b4\u03bf\u03bd\u03af\u03b1 -LocaleNames/el_CY/ML=\u039c\u03ac\u03bb\u03b9 -LocaleNames/el_CY/MM=\u039c\u03b9\u03b1\u03bd\u03bc\u03ac\u03c1 (\u0392\u03b9\u03c1\u03bc\u03b1\u03bd\u03af\u03b1) -LocaleNames/el_CY/MN=\u039c\u03bf\u03b3\u03b3\u03bf\u03bb\u03af\u03b1 -LocaleNames/el_CY/MO=\u039c\u03b1\u03ba\u03ac\u03bf \u0395\u0394\u03a0 \u039a\u03af\u03bd\u03b1\u03c2 -LocaleNames/el_CY/MP=\u039d\u03ae\u03c3\u03bf\u03b9 \u0392\u03cc\u03c1\u03b5\u03b9\u03b5\u03c2 \u039c\u03b1\u03c1\u03b9\u03ac\u03bd\u03b5\u03c2 -LocaleNames/el_CY/MQ=\u039c\u03b1\u03c1\u03c4\u03b9\u03bd\u03af\u03ba\u03b1 -LocaleNames/el_CY/MR=\u039c\u03b1\u03c5\u03c1\u03b9\u03c4\u03b1\u03bd\u03af\u03b1 -LocaleNames/el_CY/MS=\u039c\u03bf\u03bd\u03c3\u03b5\u03c1\u03ac\u03c4 -LocaleNames/el_CY/MT=\u039c\u03ac\u03bb\u03c4\u03b1 -LocaleNames/el_CY/MU=\u039c\u03b1\u03c5\u03c1\u03af\u03ba\u03b9\u03bf\u03c2 -LocaleNames/el_CY/MV=\u039c\u03b1\u03bb\u03b4\u03af\u03b2\u03b5\u03c2 -LocaleNames/el_CY/MW=\u039c\u03b1\u03bb\u03ac\u03bf\u03c5\u03b9 -LocaleNames/el_CY/MX=\u039c\u03b5\u03be\u03b9\u03ba\u03cc -LocaleNames/el_CY/MY=\u039c\u03b1\u03bb\u03b1\u03b9\u03c3\u03af\u03b1 -LocaleNames/el_CY/MZ=\u039c\u03bf\u03b6\u03b1\u03bc\u03b2\u03af\u03ba\u03b7 -LocaleNames/el_CY/NA=\u039d\u03b1\u03bc\u03af\u03bc\u03c0\u03b9\u03b1 -LocaleNames/el_CY/NC=\u039d\u03ad\u03b1 \u039a\u03b1\u03bb\u03b7\u03b4\u03bf\u03bd\u03af\u03b1 -LocaleNames/el_CY/NE=\u039d\u03af\u03b3\u03b7\u03c1\u03b1\u03c2 -LocaleNames/el_CY/NF=\u039d\u03ae\u03c3\u03bf\u03c2 \u039d\u03cc\u03c1\u03c6\u03bf\u03bb\u03ba -LocaleNames/el_CY/NG=\u039d\u03b9\u03b3\u03b7\u03c1\u03af\u03b1 -LocaleNames/el_CY/NI=\u039d\u03b9\u03ba\u03b1\u03c1\u03ac\u03b3\u03bf\u03c5\u03b1 -LocaleNames/el_CY/NL=\u039f\u03bb\u03bb\u03b1\u03bd\u03b4\u03af\u03b1 -LocaleNames/el_CY/NO=\u039d\u03bf\u03c1\u03b2\u03b7\u03b3\u03af\u03b1 -LocaleNames/el_CY/NP=\u039d\u03b5\u03c0\u03ac\u03bb -LocaleNames/el_CY/NR=\u039d\u03b1\u03bf\u03c5\u03c1\u03bf\u03cd -LocaleNames/el_CY/NU=\u039d\u03b9\u03bf\u03cd\u03b5 -LocaleNames/el_CY/NZ=\u039d\u03ad\u03b1 \u0396\u03b7\u03bb\u03b1\u03bd\u03b4\u03af\u03b1 -LocaleNames/el_CY/OM=\u039f\u03bc\u03ac\u03bd -LocaleNames/el_CY/PA=\u03a0\u03b1\u03bd\u03b1\u03bc\u03ac\u03c2 -LocaleNames/el_CY/PE=\u03a0\u03b5\u03c1\u03bf\u03cd -LocaleNames/el_CY/PF=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ae \u03a0\u03bf\u03bb\u03c5\u03bd\u03b7\u03c3\u03af\u03b1 -LocaleNames/el_CY/PG=\u03a0\u03b1\u03c0\u03bf\u03cd\u03b1 \u039d\u03ad\u03b1 \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1 -LocaleNames/el_CY/PH=\u03a6\u03b9\u03bb\u03b9\u03c0\u03c0\u03af\u03bd\u03b5\u03c2 -LocaleNames/el_CY/PK=\u03a0\u03b1\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd -LocaleNames/el_CY/PL=\u03a0\u03bf\u03bb\u03c9\u03bd\u03af\u03b1 -LocaleNames/el_CY/PM=\u03a3\u03b5\u03bd \u03a0\u03b9\u03b5\u03c1 \u03ba\u03b1\u03b9 \u039c\u03b9\u03ba\u03b5\u03bb\u03cc\u03bd -LocaleNames/el_CY/PN=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a0\u03af\u03c4\u03ba\u03b5\u03c1\u03bd -LocaleNames/el_CY/PR=\u03a0\u03bf\u03c5\u03ad\u03c1\u03c4\u03bf \u03a1\u03af\u03ba\u03bf -LocaleNames/el_CY/PS=\u03a0\u03b1\u03bb\u03b1\u03b9\u03c3\u03c4\u03b9\u03bd\u03b9\u03b1\u03ba\u03ac \u0395\u03b4\u03ac\u03c6\u03b7 -LocaleNames/el_CY/PT=\u03a0\u03bf\u03c1\u03c4\u03bf\u03b3\u03b1\u03bb\u03af\u03b1 -LocaleNames/el_CY/PW=\u03a0\u03b1\u03bb\u03ac\u03bf\u03c5 -LocaleNames/el_CY/PY=\u03a0\u03b1\u03c1\u03b1\u03b3\u03bf\u03c5\u03ac\u03b7 -LocaleNames/el_CY/QA=\u039a\u03b1\u03c4\u03ac\u03c1 -LocaleNames/el_CY/RE=\u03a1\u03b5\u03ca\u03bd\u03b9\u03cc\u03bd -LocaleNames/el_CY/RO=\u03a1\u03bf\u03c5\u03bc\u03b1\u03bd\u03af\u03b1 -LocaleNames/el_CY/RU=\u03a1\u03c9\u03c3\u03af\u03b1 -LocaleNames/el_CY/RW=\u03a1\u03bf\u03c5\u03ac\u03bd\u03c4\u03b1 -LocaleNames/el_CY/SA=\u03a3\u03b1\u03bf\u03c5\u03b4\u03b9\u03ba\u03ae \u0391\u03c1\u03b1\u03b2\u03af\u03b1 -LocaleNames/el_CY/SB=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a3\u03bf\u03bb\u03bf\u03bc\u03ce\u03bd\u03c4\u03bf\u03c2 -LocaleNames/el_CY/SC=\u03a3\u03b5\u03cb\u03c7\u03ad\u03bb\u03bb\u03b5\u03c2 -LocaleNames/el_CY/SD=\u03a3\u03bf\u03c5\u03b4\u03ac\u03bd -LocaleNames/el_CY/SE=\u03a3\u03bf\u03c5\u03b7\u03b4\u03af\u03b1 -LocaleNames/el_CY/SG=\u03a3\u03b9\u03b3\u03ba\u03b1\u03c0\u03bf\u03cd\u03c1\u03b7 -LocaleNames/el_CY/SH=\u0391\u03b3\u03af\u03b1 \u0395\u03bb\u03ad\u03bd\u03b7 -LocaleNames/el_CY/SI=\u03a3\u03bb\u03bf\u03b2\u03b5\u03bd\u03af\u03b1 -LocaleNames/el_CY/SJ=\u03a3\u03b2\u03ac\u03bb\u03bc\u03c0\u03b1\u03c1\u03bd\u03c4 \u03ba\u03b1\u03b9 \u0393\u03b9\u03b1\u03bd \u039c\u03b1\u03b3\u03b9\u03ad\u03bd -LocaleNames/el_CY/SK=\u03a3\u03bb\u03bf\u03b2\u03b1\u03ba\u03af\u03b1 -LocaleNames/el_CY/SL=\u03a3\u03b9\u03ad\u03c1\u03b1 \u039b\u03b5\u03cc\u03bd\u03b5 -LocaleNames/el_CY/SM=\u0386\u03b3\u03b9\u03bf\u03c2 \u039c\u03b1\u03c1\u03af\u03bd\u03bf\u03c2 -LocaleNames/el_CY/SN=\u03a3\u03b5\u03bd\u03b5\u03b3\u03ac\u03bb\u03b7 -LocaleNames/el_CY/SO=\u03a3\u03bf\u03bc\u03b1\u03bb\u03af\u03b1 -LocaleNames/el_CY/SR=\u03a3\u03bf\u03c5\u03c1\u03b9\u03bd\u03ac\u03bc -LocaleNames/el_CY/ST=\u03a3\u03ac\u03bf \u03a4\u03bf\u03bc\u03ad \u03ba\u03b1\u03b9 \u03a0\u03c1\u03af\u03bd\u03c3\u03b9\u03c0\u03b5 -LocaleNames/el_CY/SV=\u0395\u03bb \u03a3\u03b1\u03bb\u03b2\u03b1\u03b4\u03cc\u03c1 -LocaleNames/el_CY/SY=\u03a3\u03c5\u03c1\u03af\u03b1 -LocaleNames/el_CY/TC=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a4\u03b5\u03c1\u03ba\u03c2 \u03ba\u03b1\u03b9 \u039a\u03ac\u03b9\u03ba\u03bf\u03c2 -LocaleNames/el_CY/TD=\u03a4\u03c3\u03b1\u03bd\u03c4 -LocaleNames/el_CY/TF=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ac \u039d\u03cc\u03c4\u03b9\u03b1 \u0395\u03b4\u03ac\u03c6\u03b7 -LocaleNames/el_CY/TG=\u03a4\u03cc\u03b3\u03ba\u03bf -LocaleNames/el_CY/TH=\u03a4\u03b1\u03ca\u03bb\u03ac\u03bd\u03b4\u03b7 -LocaleNames/el_CY/TJ=\u03a4\u03b1\u03c4\u03b6\u03b9\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd -LocaleNames/el_CY/TK=\u03a4\u03bf\u03ba\u03b5\u03bb\u03ac\u03bf\u03c5 -LocaleNames/el_CY/TL=\u03a4\u03b9\u03bc\u03cc\u03c1-\u039b\u03ad\u03c3\u03c4\u03b5 -LocaleNames/el_CY/TM=\u03a4\u03bf\u03c5\u03c1\u03ba\u03bc\u03b5\u03bd\u03b9\u03c3\u03c4\u03ac\u03bd -LocaleNames/el_CY/TN=\u03a4\u03c5\u03bd\u03b7\u03c3\u03af\u03b1 -LocaleNames/el_CY/TO=\u03a4\u03cc\u03bd\u03b3\u03ba\u03b1 -LocaleNames/el_CY/TR=\u03a4\u03bf\u03c5\u03c1\u03ba\u03af\u03b1 -LocaleNames/el_CY/TT=\u03a4\u03c1\u03b9\u03bd\u03b9\u03bd\u03c4\u03ac\u03bd\u03c4 \u03ba\u03b1\u03b9 \u03a4\u03bf\u03bc\u03c0\u03ac\u03b3\u03ba\u03bf -LocaleNames/el_CY/TV=\u03a4\u03bf\u03c5\u03b2\u03b1\u03bb\u03bf\u03cd -LocaleNames/el_CY/TW=\u03a4\u03b1\u03ca\u03b2\u03ac\u03bd -LocaleNames/el_CY/TZ=\u03a4\u03b1\u03bd\u03b6\u03b1\u03bd\u03af\u03b1 -LocaleNames/el_CY/UA=\u039f\u03c5\u03ba\u03c1\u03b1\u03bd\u03af\u03b1 -LocaleNames/el_CY/UG=\u039f\u03c5\u03b3\u03ba\u03ac\u03bd\u03c4\u03b1 -LocaleNames/el_CY/UM=\u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b5\u03c2 \u039d\u03b7\u03c3\u03af\u03b4\u03b5\u03c2 \u0397\u03a0\u0391 -LocaleNames/el_CY/US=\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03b5\u03c2 \u03a0\u03bf\u03bb\u03b9\u03c4\u03b5\u03af\u03b5\u03c2 -LocaleNames/el_CY/UY=\u039f\u03c5\u03c1\u03bf\u03c5\u03b3\u03bf\u03c5\u03ac\u03b7 -LocaleNames/el_CY/UZ=\u039f\u03c5\u03b6\u03bc\u03c0\u03b5\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd -LocaleNames/el_CY/VA=\u0392\u03b1\u03c4\u03b9\u03ba\u03b1\u03bd\u03cc -LocaleNames/el_CY/VC=\u0386\u03b3\u03b9\u03bf\u03c2 \u0392\u03b9\u03ba\u03ad\u03bd\u03c4\u03b9\u03bf\u03c2 \u03ba\u03b1\u03b9 \u0393\u03c1\u03b5\u03bd\u03b1\u03b4\u03af\u03bd\u03b5\u03c2 -LocaleNames/el_CY/VE=\u0392\u03b5\u03bd\u03b5\u03b6\u03bf\u03c5\u03ad\u03bb\u03b1 -LocaleNames/el_CY/VG=\u0392\u03c1\u03b5\u03c4\u03b1\u03bd\u03b9\u03ba\u03ad\u03c2 \u03a0\u03b1\u03c1\u03b8\u03ad\u03bd\u03b5\u03c2 \u039d\u03ae\u03c3\u03bf\u03b9 -LocaleNames/el_CY/VI=\u0391\u03bc\u03b5\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ad\u03c2 \u03a0\u03b1\u03c1\u03b8\u03ad\u03bd\u03b5\u03c2 \u039d\u03ae\u03c3\u03bf\u03b9 -LocaleNames/el_CY/VN=\u0392\u03b9\u03b5\u03c4\u03bd\u03ac\u03bc -LocaleNames/el_CY/VU=\u0392\u03b1\u03bd\u03bf\u03c5\u03ac\u03c4\u03bf\u03c5 -LocaleNames/el_CY/WF=\u0393\u03bf\u03c5\u03ac\u03bb\u03b9\u03c2 \u03ba\u03b1\u03b9 \u03a6\u03bf\u03c5\u03c4\u03bf\u03cd\u03bd\u03b1 -LocaleNames/el_CY/WS=\u03a3\u03b1\u03bc\u03cc\u03b1 -LocaleNames/el_CY/YE=\u03a5\u03b5\u03bc\u03ad\u03bd\u03b7 -LocaleNames/el_CY/YT=\u039c\u03b1\u03b3\u03b9\u03cc\u03c4 -LocaleNames/el_CY/ZA=\u039d\u03cc\u03c4\u03b9\u03b1 \u0391\u03c6\u03c1\u03b9\u03ba\u03ae -LocaleNames/el_CY/ZM=\u0396\u03ac\u03bc\u03c0\u03b9\u03b1 -LocaleNames/el_CY/ZW=\u0396\u03b9\u03bc\u03c0\u03ac\u03bc\u03c0\u03bf\u03c5\u03b5 -CurrencyNames/el_CY/CYP=\u00a3 -CurrencyNames/el_CY/EUR=\u20ac +LocaleNames/el_CY/ar=Αραβικά +LocaleNames/el_CY/be=Λευκορωσικά +LocaleNames/el_CY/bg=Βουλγαρικά +LocaleNames/el_CY/bo=Θιβετιανά +LocaleNames/el_CY/bs=Βοσνιακά +LocaleNames/el_CY/bn=Βεγγαλικά +LocaleNames/el_CY/ca=Καταλανικά +LocaleNames/el_CY/co=Κορσικανικά +LocaleNames/el_CY/cs=Τσεχικά +LocaleNames/el_CY/cy=Ουαλικά +LocaleNames/el_CY/da=Δανικά +LocaleNames/el_CY/de=Γερμανικά +LocaleNames/el_CY/el=Ελληνικά +LocaleNames/el_CY/en=Αγγλικά +LocaleNames/el_CY/es=Ισπανικά +LocaleNames/el_CY/et=Εσθονικά +LocaleNames/el_CY/eu=Βασκικά +LocaleNames/el_CY/fa=Περσικά +LocaleNames/el_CY/fi=Φινλανδικά +LocaleNames/el_CY/fr=Γαλλικά +LocaleNames/el_CY/ga=Ιρλανδικά +LocaleNames/el_CY/gd=Σκωτικά Κελτικά +LocaleNames/el_CY/he=Εβραϊκά +LocaleNames/el_CY/hi=Χίντι +LocaleNames/el_CY/hr=Κροατικά +LocaleNames/el_CY/hu=Ουγγρικά +LocaleNames/el_CY/hy=Αρμενικά +LocaleNames/el_CY/id=Ινδονησιακά +LocaleNames/el_CY/in=Ινδονησιακά +LocaleNames/el_CY/is=Ισλανδικά +LocaleNames/el_CY/it=Ιταλικά +LocaleNames/el_CY/iw=Εβραϊκά +LocaleNames/el_CY/ja=Ιαπωνικά +LocaleNames/el_CY/ji=Γίντις +LocaleNames/el_CY/ka=Γεωργιανά +LocaleNames/el_CY/ko=Κορεατικά +LocaleNames/el_CY/la=Λατινικά +LocaleNames/el_CY/lt=Λιθουανικά +LocaleNames/el_CY/lv=Λετονικά +LocaleNames/el_CY/mk=Σλαβομακεδονικά +LocaleNames/el_CY/mn=Μογγολικά +LocaleNames/el_CY/mo=Μολδαβικά +LocaleNames/el_CY/mt=Μαλτεζικά +LocaleNames/el_CY/nl=Ολλανδικά +LocaleNames/el_CY/no=Νορβηγικά +LocaleNames/el_CY/pl=Πολωνικά +LocaleNames/el_CY/pt=Πορτογαλικά +LocaleNames/el_CY/ro=Ρουμανικά +LocaleNames/el_CY/ru=Ρωσικά +LocaleNames/el_CY/sk=Σλοβακικά +LocaleNames/el_CY/sl=Σλοβενικά +LocaleNames/el_CY/sq=Αλβανικά +LocaleNames/el_CY/sr=Σερβικά +LocaleNames/el_CY/sv=Σουηδικά +LocaleNames/el_CY/th=Ταϊλανδικά +LocaleNames/el_CY/tr=Τουρκικά +LocaleNames/el_CY/uk=Ουκρανικά +LocaleNames/el_CY/vi=Βιετναμικά +LocaleNames/el_CY/yi=Γίντις +LocaleNames/el_CY/zh=Κινεζικά +LocaleNames/el_CY/AD=Ανδόρα +LocaleNames/el_CY/AE=Ηνωμένα Αραβικά Εμιράτα +LocaleNames/el_CY/AF=Αφγανιστάν +LocaleNames/el_CY/AG=Αντίγκουα και Μπαρμπούντα +LocaleNames/el_CY/AI=Ανγκουίλα +LocaleNames/el_CY/AL=Αλβανία +LocaleNames/el_CY/AM=Αρμενία +LocaleNames/el_CY/AN=Ολλανδικές Αντίλλες +LocaleNames/el_CY/AO=Αγκόλα +LocaleNames/el_CY/AQ=Ανταρκτική +LocaleNames/el_CY/AR=Αργεντινή +LocaleNames/el_CY/AS=Αμερικανική Σαμόα +LocaleNames/el_CY/AT=Αυστρία +LocaleNames/el_CY/AU=Αυστραλία +LocaleNames/el_CY/AW=Αρούμπα +LocaleNames/el_CY/AX=Νήσοι Όλαντ +LocaleNames/el_CY/AZ=Αζερμπαϊτζάν +LocaleNames/el_CY/BA=Βοσνία - Ερζεγοβίνη +LocaleNames/el_CY/BB=Μπαρμπέιντος +LocaleNames/el_CY/BD=Μπανγκλαντές +LocaleNames/el_CY/BE=Βέλγιο +LocaleNames/el_CY/BF=Μπουρκίνα Φάσο +LocaleNames/el_CY/BG=Βουλγαρία +LocaleNames/el_CY/BH=Μπαχρέιν +LocaleNames/el_CY/BI=Μπουρούντι +LocaleNames/el_CY/BJ=Μπενίν +LocaleNames/el_CY/BM=Βερμούδες +LocaleNames/el_CY/BN=Μπρουνέι +LocaleNames/el_CY/BO=Βολιβία +LocaleNames/el_CY/BR=Βραζιλία +LocaleNames/el_CY/BS=Μπαχάμες +LocaleNames/el_CY/BT=Μπουτάν +LocaleNames/el_CY/BV=Νήσος Μπουβέ +LocaleNames/el_CY/BW=Μποτσουάνα +LocaleNames/el_CY/BY=Λευκορωσία +LocaleNames/el_CY/BZ=Μπελίζ +LocaleNames/el_CY/CA=Καναδάς +LocaleNames/el_CY/CC=Νήσοι Κόκος (Κίλινγκ) +LocaleNames/el_CY/CD=Κονγκό - Κινσάσα +LocaleNames/el_CY/CF=Κεντροαφρικανική Δημοκρατία +LocaleNames/el_CY/CG=Κονγκό - Μπραζαβίλ +LocaleNames/el_CY/CH=Ελβετία +LocaleNames/el_CY/CI=Ακτή Ελεφαντοστού +LocaleNames/el_CY/CK=Νήσοι Κουκ +LocaleNames/el_CY/CL=Χιλή +LocaleNames/el_CY/CM=Καμερούν +LocaleNames/el_CY/CN=Κίνα +LocaleNames/el_CY/CO=Κολομβία +LocaleNames/el_CY/CR=Κόστα Ρίκα +LocaleNames/el_CY/CS=Σερβία και Μαυροβούνιο +LocaleNames/el_CY/CU=Κούβα +LocaleNames/el_CY/CV=Πράσινο Ακρωτήριο +LocaleNames/el_CY/CX=Νήσος των Χριστουγέννων +LocaleNames/el_CY/CY=Κύπρος +LocaleNames/el_CY/CZ=Τσεχία +LocaleNames/el_CY/DE=Γερμανία +LocaleNames/el_CY/DJ=Τζιμπουτί +LocaleNames/el_CY/DK=Δανία +LocaleNames/el_CY/DM=Ντομίνικα +LocaleNames/el_CY/DO=Δομινικανή Δημοκρατία +LocaleNames/el_CY/DZ=Αλγερία +LocaleNames/el_CY/EC=Ισημερινός +LocaleNames/el_CY/EE=Εσθονία +LocaleNames/el_CY/EG=Αίγυπτος +LocaleNames/el_CY/EH=Δυτική Σαχάρα +LocaleNames/el_CY/ER=Ερυθραία +LocaleNames/el_CY/ES=Ισπανία +LocaleNames/el_CY/ET=Αιθιοπία +LocaleNames/el_CY/FI=Φινλανδία +LocaleNames/el_CY/FJ=Φίτζι +LocaleNames/el_CY/FK=Νήσοι Φόκλαντ +LocaleNames/el_CY/FM=Μικρονησία +LocaleNames/el_CY/FO=Νήσοι Φερόες +LocaleNames/el_CY/FR=Γαλλία +LocaleNames/el_CY/GA=Γκαμπόν +LocaleNames/el_CY/GB=Ηνωμένο Βασίλειο +LocaleNames/el_CY/GD=Γρενάδα +LocaleNames/el_CY/GE=Γεωργία +LocaleNames/el_CY/GF=Γαλλική Γουιάνα +LocaleNames/el_CY/GH=Γκάνα +LocaleNames/el_CY/GI=Γιβραλτάρ +LocaleNames/el_CY/GL=Γροιλανδία +LocaleNames/el_CY/GM=Γκάμπια +LocaleNames/el_CY/GN=Γουινέα +LocaleNames/el_CY/GP=Γουαδελούπη +LocaleNames/el_CY/GQ=Ισημερινή Γουινέα +LocaleNames/el_CY/GS=Νήσοι Νότια Γεωργία και Νότιες Σάντουιτς +LocaleNames/el_CY/GT=Γουατεμάλα +LocaleNames/el_CY/GU=Γκουάμ +LocaleNames/el_CY/GW=Γουινέα Μπισάου +LocaleNames/el_CY/GY=Γουιάνα +LocaleNames/el_CY/HK=Χονγκ Κονγκ ΕΔΠ Κίνας +LocaleNames/el_CY/HM=Νήσοι Χερντ και Μακντόναλντ +LocaleNames/el_CY/HN=Ονδούρα +LocaleNames/el_CY/HR=Κροατία +LocaleNames/el_CY/HT=Αϊτή +LocaleNames/el_CY/HU=Ουγγαρία +LocaleNames/el_CY/ID=Ινδονησία +LocaleNames/el_CY/IE=Ιρλανδία +LocaleNames/el_CY/IL=Ισραήλ +LocaleNames/el_CY/IN=Ινδία +LocaleNames/el_CY/IO=Βρετανικά Εδάφη Ινδικού Ωκεανού +LocaleNames/el_CY/IQ=Ιράκ +LocaleNames/el_CY/IR=Ιράν +LocaleNames/el_CY/IS=Ισλανδία +LocaleNames/el_CY/IT=Ιταλία +LocaleNames/el_CY/JM=Τζαμάικα +LocaleNames/el_CY/JO=Ιορδανία +LocaleNames/el_CY/JP=Ιαπωνία +LocaleNames/el_CY/KE=Κένυα +LocaleNames/el_CY/KG=Κιργιστάν +LocaleNames/el_CY/KH=Καμπότζη +LocaleNames/el_CY/KI=Κιριμπάτι +LocaleNames/el_CY/KM=Κομόρες +LocaleNames/el_CY/KN=Σεν Κιτς και Νέβις +LocaleNames/el_CY/KP=Βόρεια Κορέα +LocaleNames/el_CY/KR=Νότια Κορέα +LocaleNames/el_CY/KW=Κουβέιτ +LocaleNames/el_CY/KY=Νήσοι Κέιμαν +LocaleNames/el_CY/KZ=Καζακστάν +LocaleNames/el_CY/LA=Λάος +LocaleNames/el_CY/LB=Λίβανος +LocaleNames/el_CY/LC=Αγία Λουκία +LocaleNames/el_CY/LI=Λιχτενστάιν +LocaleNames/el_CY/LK=Σρι Λάνκα +LocaleNames/el_CY/LR=Λιβερία +LocaleNames/el_CY/LS=Λεσότο +LocaleNames/el_CY/LT=Λιθουανία +LocaleNames/el_CY/LU=Λουξεμβούργο +LocaleNames/el_CY/LV=Λετονία +LocaleNames/el_CY/LY=Λιβύη +LocaleNames/el_CY/MA=Μαρόκο +LocaleNames/el_CY/MC=Μονακό +LocaleNames/el_CY/MD=Μολδαβία +LocaleNames/el_CY/MG=Μαδαγασκάρη +LocaleNames/el_CY/MH=Νήσοι Μάρσαλ +LocaleNames/el_CY/MK=Βόρεια Μακεδονία +LocaleNames/el_CY/ML=Μάλι +LocaleNames/el_CY/MM=Μιανμάρ (Βιρμανία) +LocaleNames/el_CY/MN=Μογγολία +LocaleNames/el_CY/MO=Μακάο ΕΔΠ Κίνας +LocaleNames/el_CY/MP=Νήσοι Βόρειες Μαριάνες +LocaleNames/el_CY/MQ=Μαρτινίκα +LocaleNames/el_CY/MR=Μαυριτανία +LocaleNames/el_CY/MS=Μονσεράτ +LocaleNames/el_CY/MT=Μάλτα +LocaleNames/el_CY/MU=Μαυρίκιος +LocaleNames/el_CY/MV=Μαλδίβες +LocaleNames/el_CY/MW=Μαλάουι +LocaleNames/el_CY/MX=Μεξικό +LocaleNames/el_CY/MY=Μαλαισία +LocaleNames/el_CY/MZ=Μοζαμβίκη +LocaleNames/el_CY/NA=Ναμίμπια +LocaleNames/el_CY/NC=Νέα Καληδονία +LocaleNames/el_CY/NE=Νίγηρας +LocaleNames/el_CY/NF=Νήσος Νόρφολκ +LocaleNames/el_CY/NG=Νιγηρία +LocaleNames/el_CY/NI=Νικαράγουα +LocaleNames/el_CY/NL=Ολλανδία +LocaleNames/el_CY/NO=Νορβηγία +LocaleNames/el_CY/NP=Νεπάλ +LocaleNames/el_CY/NR=Ναουρού +LocaleNames/el_CY/NU=Νιούε +LocaleNames/el_CY/NZ=Νέα Ζηλανδία +LocaleNames/el_CY/OM=Ομάν +LocaleNames/el_CY/PA=Παναμάς +LocaleNames/el_CY/PE=Περού +LocaleNames/el_CY/PF=Γαλλική Πολυνησία +LocaleNames/el_CY/PG=Παπούα Νέα Γουινέα +LocaleNames/el_CY/PH=Φιλιππίνες +LocaleNames/el_CY/PK=Πακιστάν +LocaleNames/el_CY/PL=Πολωνία +LocaleNames/el_CY/PM=Σεν Πιερ και Μικελόν +LocaleNames/el_CY/PN=Νήσοι Πίτκερν +LocaleNames/el_CY/PR=Πουέρτο Ρίκο +LocaleNames/el_CY/PS=Παλαιστινιακά Εδάφη +LocaleNames/el_CY/PT=Πορτογαλία +LocaleNames/el_CY/PW=Παλάου +LocaleNames/el_CY/PY=Παραγουάη +LocaleNames/el_CY/QA=Κατάρ +LocaleNames/el_CY/RE=Ρεϊνιόν +LocaleNames/el_CY/RO=Ρουμανία +LocaleNames/el_CY/RU=Ρωσία +LocaleNames/el_CY/RW=Ρουάντα +LocaleNames/el_CY/SA=Σαουδική Αραβία +LocaleNames/el_CY/SB=Νήσοι Σολομώντος +LocaleNames/el_CY/SC=Σεϋχέλλες +LocaleNames/el_CY/SD=Σουδάν +LocaleNames/el_CY/SE=Σουηδία +LocaleNames/el_CY/SG=Σιγκαπούρη +LocaleNames/el_CY/SH=Αγία Ελένη +LocaleNames/el_CY/SI=Σλοβενία +LocaleNames/el_CY/SJ=Σβάλμπαρντ και Γιαν Μαγιέν +LocaleNames/el_CY/SK=Σλοβακία +LocaleNames/el_CY/SL=Σιέρα Λεόνε +LocaleNames/el_CY/SM=Άγιος Μαρίνος +LocaleNames/el_CY/SN=Σενεγάλη +LocaleNames/el_CY/SO=Σομαλία +LocaleNames/el_CY/SR=Σουρινάμ +LocaleNames/el_CY/ST=Σάο Τομέ και Πρίνσιπε +LocaleNames/el_CY/SV=Ελ Σαλβαδόρ +LocaleNames/el_CY/SY=Συρία +LocaleNames/el_CY/TC=Νήσοι Τερκς και Κάικος +LocaleNames/el_CY/TD=Τσαντ +LocaleNames/el_CY/TF=Γαλλικά Νότια Εδάφη +LocaleNames/el_CY/TG=Τόγκο +LocaleNames/el_CY/TH=Ταϊλάνδη +LocaleNames/el_CY/TJ=Τατζικιστάν +LocaleNames/el_CY/TK=Τοκελάου +LocaleNames/el_CY/TL=Τιμόρ-Λέστε +LocaleNames/el_CY/TM=Τουρκμενιστάν +LocaleNames/el_CY/TN=Τυνησία +LocaleNames/el_CY/TO=Τόνγκα +LocaleNames/el_CY/TR=Τουρκία +LocaleNames/el_CY/TT=Τρινιντάντ και Τομπάγκο +LocaleNames/el_CY/TV=Τουβαλού +LocaleNames/el_CY/TW=Ταϊβάν +LocaleNames/el_CY/TZ=Τανζανία +LocaleNames/el_CY/UA=Ουκρανία +LocaleNames/el_CY/UG=Ουγκάντα +LocaleNames/el_CY/UM=Απομακρυσμένες Νησίδες ΗΠΑ +LocaleNames/el_CY/US=Ηνωμένες Πολιτείες +LocaleNames/el_CY/UY=Ουρουγουάη +LocaleNames/el_CY/UZ=Ουζμπεκιστάν +LocaleNames/el_CY/VA=Βατικανό +LocaleNames/el_CY/VC=Άγιος Βικέντιος και Γρεναδίνες +LocaleNames/el_CY/VE=Βενεζουέλα +LocaleNames/el_CY/VG=Βρετανικές Παρθένες Νήσοι +LocaleNames/el_CY/VI=Αμερικανικές Παρθένες Νήσοι +LocaleNames/el_CY/VN=Βιετνάμ +LocaleNames/el_CY/VU=Βανουάτου +LocaleNames/el_CY/WF=Γουάλις και Φουτούνα +LocaleNames/el_CY/WS=Σαμόα +LocaleNames/el_CY/YE=Υεμένη +LocaleNames/el_CY/YT=Μαγιότ +LocaleNames/el_CY/ZA=Νότια Αφρική +LocaleNames/el_CY/ZM=Ζάμπια +LocaleNames/el_CY/ZW=Ζιμπάμπουε +CurrencyNames/el_CY/CYP=£ +CurrencyNames/el_CY/EUR=€ CalendarData/el_CY/minimalDaysInFirstWeek=1 #ms_MY and ms FormatData/ms_MY/NumberPatterns/0=#,##0.### -FormatData/ms_MY/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00) +FormatData/ms_MY/NumberPatterns/1=¤#,##0.00;(¤#,##0.00) FormatData/ms_MY/NumberPatterns/2=#,##0% FormatData/ms_MY/TimePatterns/0=h:mm:ss a z FormatData/ms_MY/TimePatterns/1=h:mm:ss a z @@ -3346,7 +3346,7 @@ LocaleNames/ms/CA=Kanada LocaleNames/ms/CC=Kepulauan Cocos (Keeling) LocaleNames/ms/CD=Congo - Kinshasa LocaleNames/ms/CF=Republik Afrika Tengah -LocaleNames/ms/CI=Cote d\u2019Ivoire +LocaleNames/ms/CI=Cote d’Ivoire LocaleNames/ms/CL=Chile LocaleNames/ms/CM=Cameroon LocaleNames/ms/CN=China @@ -3412,7 +3412,7 @@ LocaleNames/ms/ZA=Afrika Selatan FormatData/es_US/Eras/0=a.C. FormatData/es_US/Eras/1=d.C. FormatData/es_US/NumberPatterns/0=#,##0.### -FormatData/es_US/NumberPatterns/1=\u00a4#,##0.00;(\u00a4#,##0.00) +FormatData/es_US/NumberPatterns/1=¤#,##0.00;(¤#,##0.00) FormatData/es_US/NumberPatterns/2=#,##0% FormatData/es_US/TimePatterns/0=h:mm:ss a z FormatData/es_US/TimePatterns/1=h:mm:ss a z @@ -3424,57 +3424,57 @@ FormatData/es_US/DatePatterns/2=MMM d, yyyy FormatData/es_US/DatePatterns/3=M/d/yy FormatData/es_US/DateTimePatterns/0={1} {0} LocaleNames/es_US/aa=afar -LocaleNames/es_US/ae=av\u00e9stico +LocaleNames/es_US/ae=avéstico LocaleNames/es_US/ak=akan -LocaleNames/es_US/an=aragon\u00e9s +LocaleNames/es_US/an=aragonés LocaleNames/es_US/av=avar LocaleNames/es_US/ay=aimara LocaleNames/es_US/az=azerbaiyano LocaleNames/es_US/ba=baskir LocaleNames/es_US/bh=bihari LocaleNames/es_US/bm=bambara -LocaleNames/es_US/bn=bengal\u00ed +LocaleNames/es_US/bn=bengalí LocaleNames/es_US/bs=bosnio LocaleNames/es_US/ce=checheno LocaleNames/es_US/ch=chamorro LocaleNames/es_US/cr=cree -LocaleNames/es_US/cu=eslavo eclesi\u00e1stico +LocaleNames/es_US/cu=eslavo eclesiástico LocaleNames/es_US/cv=chuvasio LocaleNames/es_US/dv=divehi -LocaleNames/es_US/ee=ew\u00e9 +LocaleNames/es_US/ee=ewé LocaleNames/es_US/eu=euskera LocaleNames/es_US/ff=fula -LocaleNames/es_US/fo=fero\u00e9s -LocaleNames/es_US/fy=fris\u00f3n occidental -LocaleNames/es_US/gu=gurayat\u00ed -LocaleNames/es_US/gv=man\u00e9s +LocaleNames/es_US/fo=feroés +LocaleNames/es_US/fy=frisón occidental +LocaleNames/es_US/gu=gurayatí +LocaleNames/es_US/gv=manés LocaleNames/es_US/hi=hindi LocaleNames/es_US/ho=hiri motu LocaleNames/es_US/ht=criollo haitiano LocaleNames/es_US/hz=herero LocaleNames/es_US/ie=interlingue LocaleNames/es_US/ig=igbo -LocaleNames/es_US/ii=yi de Sichu\u00e1n +LocaleNames/es_US/ii=yi de Sichuán LocaleNames/es_US/io=ido -LocaleNames/es_US/jv=javan\u00e9s +LocaleNames/es_US/jv=javanés LocaleNames/es_US/kg=kongo LocaleNames/es_US/ki=kikuyu LocaleNames/es_US/kj=kuanyama LocaleNames/es_US/kk=kazajo LocaleNames/es_US/km=jemer -LocaleNames/es_US/kn=canar\u00e9s +LocaleNames/es_US/kn=canarés LocaleNames/es_US/kr=kanuri LocaleNames/es_US/ks=cachemiro LocaleNames/es_US/ku=kurdo LocaleNames/es_US/kv=komi -LocaleNames/es_US/kw=c\u00f3rnico -LocaleNames/es_US/ky=kirgu\u00eds -LocaleNames/es_US/lb=luxemburgu\u00e9s +LocaleNames/es_US/kw=córnico +LocaleNames/es_US/ky=kirguís +LocaleNames/es_US/lb=luxemburgués LocaleNames/es_US/lg=ganda -LocaleNames/es_US/li=limburgu\u00e9s +LocaleNames/es_US/li=limburgués LocaleNames/es_US/lu=luba-katanga -LocaleNames/es_US/mh=marshal\u00e9s -LocaleNames/es_US/mr=marat\u00ed +LocaleNames/es_US/mh=marshalés +LocaleNames/es_US/mr=maratí LocaleNames/es_US/nb=noruego bokmal LocaleNames/es_US/nd=ndebele del norte LocaleNames/es_US/ng=ndonga @@ -3484,7 +3484,7 @@ LocaleNames/es_US/nv=navajo LocaleNames/es_US/ny=nyanja LocaleNames/es_US/oc=occitano LocaleNames/es_US/oj=ojibwa -LocaleNames/es_US/os=os\u00e9tico +LocaleNames/es_US/os=osético LocaleNames/es_US/pi=pali LocaleNames/es_US/rm=romanche LocaleNames/es_US/rn=kirundi @@ -3496,7 +3496,7 @@ LocaleNames/es_US/sl=esloveno LocaleNames/es_US/sn=shona LocaleNames/es_US/ss=siswati LocaleNames/es_US/st=sesoto -LocaleNames/es_US/su=sundan\u00e9s +LocaleNames/es_US/su=sundanés LocaleNames/es_US/sw=swahili LocaleNames/es_US/tg=tayiko LocaleNames/es_US/tn=setchwana @@ -3507,7 +3507,7 @@ LocaleNames/es_US/ug=uigur LocaleNames/es_US/uk=ucraniano LocaleNames/es_US/uz=uzbeko LocaleNames/es_US/ve=venda -LocaleNames/es_US/wa=val\u00f3n +LocaleNames/es_US/wa=valón LocaleNames/es_US/za=zhuang LocaleNames/es_US/AN=Antillas Neerlandesas LocaleNames/es_US/BA=Bosnia y Herzegovina @@ -3518,192 +3518,192 @@ LocaleNames/es_US/EH=Sahara Occidental LocaleNames/es_US/FK=Islas Malvinas LocaleNames/es_US/HK=RAE de Hong Kong (China) LocaleNames/es_US/KM=Comoras -LocaleNames/es_US/LC=Santa Luc\u00eda +LocaleNames/es_US/LC=Santa Lucía LocaleNames/es_US/LS=Lesoto LocaleNames/es_US/MO=RAE de Macao (China) LocaleNames/es_US/MW=Malaui -LocaleNames/es_US/NL=Pa\u00edses Bajos +LocaleNames/es_US/NL=Países Bajos LocaleNames/es_US/NU=Niue -LocaleNames/es_US/PG=Pap\u00faa Nueva Guinea -LocaleNames/es_US/PK=Pakist\u00e1n +LocaleNames/es_US/PG=Papúa Nueva Guinea +LocaleNames/es_US/PK=Pakistán LocaleNames/es_US/PN=Islas Pitcairn LocaleNames/es_US/PS=Territorios Palestinos LocaleNames/es_US/PW=Palaos -LocaleNames/es_US/RO=Ruman\u00eda -LocaleNames/es_US/SA=Arabia Saud\u00ed +LocaleNames/es_US/RO=Rumanía +LocaleNames/es_US/SA=Arabia Saudí LocaleNames/es_US/SH=Santa Elena LocaleNames/es_US/TF=Territorios Australes Franceses LocaleNames/es_US/TK=Tokelau LocaleNames/es_US/TT=Trinidad y Tobago -LocaleNames/es_US/VI=Islas V\u00edrgenes de EE. UU. +LocaleNames/es_US/VI=Islas Vírgenes de EE. UU. CurrencyNames/es_US/USD=US$ CalendarData/es_US/firstDayOfWeek=1 #bug 4400849 LocaleNames/pt/aa=afar -LocaleNames/pt/ab=abc\u00e1zio -LocaleNames/pt/ae=av\u00e9stico -LocaleNames/pt/af=afric\u00e2ner -LocaleNames/pt/am=am\u00e1rico -LocaleNames/pt/an=aragon\u00eas -LocaleNames/pt/ar=\u00e1rabe -LocaleNames/pt/as=assam\u00eas -LocaleNames/pt/av=av\u00e1rico -LocaleNames/pt/ay=aimar\u00e1 +LocaleNames/pt/ab=abcázio +LocaleNames/pt/ae=avéstico +LocaleNames/pt/af=africâner +LocaleNames/pt/am=amárico +LocaleNames/pt/an=aragonês +LocaleNames/pt/ar=árabe +LocaleNames/pt/as=assamês +LocaleNames/pt/av=avárico +LocaleNames/pt/ay=aimará LocaleNames/pt/az=azerbaijano LocaleNames/pt/ba=bashkir LocaleNames/pt/be=bielorrusso -LocaleNames/pt/bg=b\u00falgaro +LocaleNames/pt/bg=búlgaro LocaleNames/pt/bh=biari -LocaleNames/pt/bi=bislam\u00e1 +LocaleNames/pt/bi=bislamá LocaleNames/pt/bm=bambara LocaleNames/pt/bn=bengali LocaleNames/pt/bo=tibetano -LocaleNames/pt/br=bret\u00e3o -LocaleNames/pt/bs=b\u00f3snio -LocaleNames/pt/ca=catal\u00e3o +LocaleNames/pt/br=bretão +LocaleNames/pt/bs=bósnio +LocaleNames/pt/ca=catalão LocaleNames/pt/ce=checheno LocaleNames/pt/ch=chamorro LocaleNames/pt/co=corso LocaleNames/pt/cr=cree LocaleNames/pt/cs=tcheco -LocaleNames/pt/cu=eslavo eclesi\u00e1stico +LocaleNames/pt/cu=eslavo eclesiástico LocaleNames/pt/cv=tchuvache -LocaleNames/pt/cy=gal\u00eas -LocaleNames/pt/da=dinamarqu\u00eas -LocaleNames/pt/de=alem\u00e3o +LocaleNames/pt/cy=galês +LocaleNames/pt/da=dinamarquês +LocaleNames/pt/de=alemão LocaleNames/pt/dv=divehi LocaleNames/pt/dz=dzonga LocaleNames/pt/ee=ewe LocaleNames/pt/el=grego -LocaleNames/pt/en=ingl\u00eas +LocaleNames/pt/en=inglês LocaleNames/pt/eo=esperanto LocaleNames/pt/es=espanhol LocaleNames/pt/et=estoniano LocaleNames/pt/eu=basco LocaleNames/pt/fa=persa LocaleNames/pt/ff=fula -LocaleNames/pt/fi=finland\u00eas +LocaleNames/pt/fi=finlandês LocaleNames/pt/fj=fijiano -LocaleNames/pt/fo=fero\u00eas -LocaleNames/pt/fr=franc\u00eas -LocaleNames/pt/fy=fr\u00edsio ocidental -LocaleNames/pt/ga=irland\u00eas -LocaleNames/pt/gd=ga\u00e9lico escoc\u00eas +LocaleNames/pt/fo=feroês +LocaleNames/pt/fr=francês +LocaleNames/pt/fy=frísio ocidental +LocaleNames/pt/ga=irlandês +LocaleNames/pt/gd=gaélico escocês LocaleNames/pt/gl=galego LocaleNames/pt/gn=guarani LocaleNames/pt/gu=guzerate LocaleNames/pt/gv=manx -LocaleNames/pt/ha=hau\u00e7\u00e1 +LocaleNames/pt/ha=hauçá LocaleNames/pt/he=hebraico -LocaleNames/pt/hi=h\u00edndi +LocaleNames/pt/hi=híndi LocaleNames/pt/ho=hiri motu LocaleNames/pt/hr=croata LocaleNames/pt/ht=haitiano -LocaleNames/pt/hu=h\u00fangaro -LocaleNames/pt/hy=arm\u00eanio +LocaleNames/pt/hu=húngaro +LocaleNames/pt/hy=armênio LocaleNames/pt/hz=herero -LocaleNames/pt/ia=interl\u00edngua -LocaleNames/pt/id=indon\u00e9sio +LocaleNames/pt/ia=interlíngua +LocaleNames/pt/id=indonésio LocaleNames/pt/ie=interlingue LocaleNames/pt/ig=igbo LocaleNames/pt/ii=sichuan yi -LocaleNames/pt/in=indon\u00e9sio +LocaleNames/pt/in=indonésio LocaleNames/pt/io=ido -LocaleNames/pt/is=island\u00eas +LocaleNames/pt/is=islandês LocaleNames/pt/it=italiano LocaleNames/pt/iu=inuktitut LocaleNames/pt/iw=hebraico -LocaleNames/pt/ja=japon\u00eas -LocaleNames/pt/ji=i\u00eddiche +LocaleNames/pt/ja=japonês +LocaleNames/pt/ji=iídiche LocaleNames/pt/ka=georgiano -LocaleNames/pt/kg=congol\u00eas +LocaleNames/pt/kg=congolês LocaleNames/pt/ki=quicuio LocaleNames/pt/kj=cuanhama LocaleNames/pt/kk=cazaque -LocaleNames/pt/kl=groenland\u00eas +LocaleNames/pt/kl=groenlandês LocaleNames/pt/km=khmer LocaleNames/pt/kn=canarim LocaleNames/pt/ko=coreano -LocaleNames/pt/kr=can\u00fari +LocaleNames/pt/kr=canúri LocaleNames/pt/ks=caxemira LocaleNames/pt/ku=curdo LocaleNames/pt/kv=komi -LocaleNames/pt/kw=c\u00f3rnico +LocaleNames/pt/kw=córnico LocaleNames/pt/ky=quirguiz LocaleNames/pt/la=latim -LocaleNames/pt/lb=luxemburgu\u00eas +LocaleNames/pt/lb=luxemburguês LocaleNames/pt/lg=luganda -LocaleNames/pt/li=limburgu\u00eas +LocaleNames/pt/li=limburguês LocaleNames/pt/ln=lingala LocaleNames/pt/lo=laosiano LocaleNames/pt/lt=lituano LocaleNames/pt/lu=luba-catanga -LocaleNames/pt/lv=let\u00e3o +LocaleNames/pt/lv=letão LocaleNames/pt/mg=malgaxe -LocaleNames/pt/mh=marshal\u00eas +LocaleNames/pt/mh=marshalês LocaleNames/pt/mi=maori -LocaleNames/pt/mk=maced\u00f4nio +LocaleNames/pt/mk=macedônio LocaleNames/pt/ml=malaiala LocaleNames/pt/mn=mongol -LocaleNames/pt/mo=mold\u00e1vio +LocaleNames/pt/mo=moldávio LocaleNames/pt/mr=marati LocaleNames/pt/ms=malaio -LocaleNames/pt/mt=malt\u00eas -LocaleNames/pt/my=birman\u00eas +LocaleNames/pt/mt=maltês +LocaleNames/pt/my=birmanês LocaleNames/pt/na=nauruano -LocaleNames/pt/nb=bokm\u00e5l noruegu\u00eas +LocaleNames/pt/nb=bokmål norueguês LocaleNames/pt/nd=ndebele do norte -LocaleNames/pt/ne=nepal\u00eas +LocaleNames/pt/ne=nepalês LocaleNames/pt/ng=dongo -LocaleNames/pt/nl=holand\u00eas -LocaleNames/pt/nn=nynorsk noruegu\u00eas -LocaleNames/pt/no=noruegu\u00eas +LocaleNames/pt/nl=holandês +LocaleNames/pt/nn=nynorsk norueguês +LocaleNames/pt/no=norueguês LocaleNames/pt/nr=ndebele do sul LocaleNames/pt/nv=navajo LocaleNames/pt/ny=nianja -LocaleNames/pt/oc=occit\u00e2nico +LocaleNames/pt/oc=occitânico LocaleNames/pt/oj=ojibwa LocaleNames/pt/om=oromo -LocaleNames/pt/or=ori\u00e1 +LocaleNames/pt/or=oriá LocaleNames/pt/os=osseto LocaleNames/pt/pa=panjabi -LocaleNames/pt/pi=p\u00e1li -LocaleNames/pt/pl=polon\u00eas +LocaleNames/pt/pi=páli +LocaleNames/pt/pl=polonês LocaleNames/pt/ps=pashto -LocaleNames/pt/pt=portugu\u00eas -LocaleNames/pt/qu=qu\u00edchua +LocaleNames/pt/pt=português +LocaleNames/pt/qu=quíchua LocaleNames/pt/rm=romanche LocaleNames/pt/rn=rundi LocaleNames/pt/ro=romeno LocaleNames/pt/ru=russo LocaleNames/pt/rw=quiniaruanda -LocaleNames/pt/sa=s\u00e2nscrito +LocaleNames/pt/sa=sânscrito LocaleNames/pt/sc=sardo LocaleNames/pt/sd=sindi LocaleNames/pt/se=sami setentrional LocaleNames/pt/sg=sango -LocaleNames/pt/si=cingal\u00eas +LocaleNames/pt/si=cingalês LocaleNames/pt/sk=eslovaco LocaleNames/pt/sl=esloveno LocaleNames/pt/so=somali -LocaleNames/pt/sq=alban\u00eas -LocaleNames/pt/sr=s\u00e9rvio -LocaleNames/pt/ss=su\u00e1zi +LocaleNames/pt/sq=albanês +LocaleNames/pt/sr=sérvio +LocaleNames/pt/ss=suázi LocaleNames/pt/st=soto do sul -LocaleNames/pt/su=sundan\u00eas +LocaleNames/pt/su=sundanês LocaleNames/pt/sv=sueco -LocaleNames/pt/sw=sua\u00edli -LocaleNames/pt/ta=t\u00e2mil -LocaleNames/pt/te=t\u00e9lugo +LocaleNames/pt/sw=suaíli +LocaleNames/pt/ta=tâmil +LocaleNames/pt/te=télugo LocaleNames/pt/tg=tadjique -LocaleNames/pt/th=tailand\u00eas -LocaleNames/pt/ti=tigr\u00ednia +LocaleNames/pt/th=tailandês +LocaleNames/pt/ti=tigrínia LocaleNames/pt/tk=turcomeno LocaleNames/pt/tn=tswana -LocaleNames/pt/to=tongan\u00eas +LocaleNames/pt/to=tonganês LocaleNames/pt/tr=turco LocaleNames/pt/ts=tsonga -LocaleNames/pt/tt=t\u00e1rtaro +LocaleNames/pt/tt=tártaro LocaleNames/pt/tw=twi LocaleNames/pt/ty=taitiano LocaleNames/pt/ug=uigur @@ -3713,632 +3713,632 @@ LocaleNames/pt/uz=uzbeque LocaleNames/pt/ve=venda LocaleNames/pt/vi=vietnamita LocaleNames/pt/vo=volapuque -LocaleNames/pt/wa=val\u00e3o +LocaleNames/pt/wa=valão LocaleNames/pt/wo=uolofe LocaleNames/pt/xh=xhosa -LocaleNames/pt/yi=i\u00eddiche -LocaleNames/pt/yo=iorub\u00e1 +LocaleNames/pt/yi=iídiche +LocaleNames/pt/yo=iorubá LocaleNames/pt/za=zhuang -LocaleNames/pt/zh=chin\u00eas +LocaleNames/pt/zh=chinês LocaleNames/pt/zu=zulu -LocaleNames/pt/AE=Emirados \u00c1rabes Unidos -LocaleNames/pt/AF=Afeganist\u00e3o -LocaleNames/pt/AG=Ant\u00edgua e Barbuda -LocaleNames/pt/AL=Alb\u00e2nia -LocaleNames/pt/AM=Arm\u00eania +LocaleNames/pt/AE=Emirados Árabes Unidos +LocaleNames/pt/AF=Afeganistão +LocaleNames/pt/AG=Antígua e Barbuda +LocaleNames/pt/AL=Albânia +LocaleNames/pt/AM=Armênia LocaleNames/pt/AN=Antilhas Holandesas -LocaleNames/pt/AQ=Ant\u00e1rtida +LocaleNames/pt/AQ=Antártida LocaleNames/pt/AS=Samoa Americana -LocaleNames/pt/AT=\u00c1ustria -LocaleNames/pt/AU=Austr\u00e1lia -LocaleNames/pt/AZ=Azerbaij\u00e3o -LocaleNames/pt/BA=B\u00f3snia e Herzegovina -LocaleNames/pt/BE=B\u00e9lgica +LocaleNames/pt/AT=Áustria +LocaleNames/pt/AU=Austrália +LocaleNames/pt/AZ=Azerbaijão +LocaleNames/pt/BA=Bósnia e Herzegovina +LocaleNames/pt/BE=Bélgica LocaleNames/pt/BF=Burquina Faso -LocaleNames/pt/BG=Bulg\u00e1ria +LocaleNames/pt/BG=Bulgária LocaleNames/pt/BH=Barein LocaleNames/pt/BM=Bermudas -LocaleNames/pt/BO=Bol\u00edvia +LocaleNames/pt/BO=Bolívia LocaleNames/pt/BR=Brasil -LocaleNames/pt/BT=But\u00e3o +LocaleNames/pt/BT=Butão LocaleNames/pt/BV=Ilha Bouvet LocaleNames/pt/BW=Botsuana -LocaleNames/pt/CA=Canad\u00e1 +LocaleNames/pt/CA=Canadá LocaleNames/pt/CC=Ilhas Cocos (Keeling) LocaleNames/pt/CD=Congo - Kinshasa -LocaleNames/pt/CF=Rep\u00fablica Centro-Africana -LocaleNames/pt/CH=Su\u00ed\u00e7a +LocaleNames/pt/CF=República Centro-Africana +LocaleNames/pt/CH=Suíça LocaleNames/pt/CI=Costa do Marfim LocaleNames/pt/CK=Ilhas Cook -LocaleNames/pt/CM=Camar\u00f5es -LocaleNames/pt/CO=Col\u00f4mbia +LocaleNames/pt/CM=Camarões +LocaleNames/pt/CO=Colômbia LocaleNames/pt/CV=Cabo Verde LocaleNames/pt/CX=Ilha Christmas LocaleNames/pt/CY=Chipre -LocaleNames/pt/CZ=Tch\u00e9quia +LocaleNames/pt/CZ=Tchéquia LocaleNames/pt/DE=Alemanha LocaleNames/pt/DJ=Djibuti LocaleNames/pt/DK=Dinamarca -LocaleNames/pt/DO=Rep\u00fablica Dominicana -LocaleNames/pt/DZ=Arg\u00e9lia +LocaleNames/pt/DO=República Dominicana +LocaleNames/pt/DZ=Argélia LocaleNames/pt/EC=Equador -LocaleNames/pt/EE=Est\u00f4nia +LocaleNames/pt/EE=Estônia LocaleNames/pt/EG=Egito LocaleNames/pt/EH=Saara Ocidental LocaleNames/pt/ER=Eritreia LocaleNames/pt/ES=Espanha -LocaleNames/pt/ET=Eti\u00f3pia -LocaleNames/pt/FI=Finl\u00e2ndia +LocaleNames/pt/ET=Etiópia +LocaleNames/pt/FI=Finlândia LocaleNames/pt/FK=Ilhas Malvinas -LocaleNames/pt/FM=Micron\u00e9sia -LocaleNames/pt/FO=Ilhas Faro\u00e9 -LocaleNames/pt/FR=Fran\u00e7a -LocaleNames/pt/GA=Gab\u00e3o +LocaleNames/pt/FM=Micronésia +LocaleNames/pt/FO=Ilhas Faroé +LocaleNames/pt/FR=França +LocaleNames/pt/GA=Gabão LocaleNames/pt/GB=Reino Unido LocaleNames/pt/GD=Granada -LocaleNames/pt/GE=Ge\u00f3rgia +LocaleNames/pt/GE=Geórgia LocaleNames/pt/GF=Guiana Francesa LocaleNames/pt/GH=Gana -LocaleNames/pt/GL=Groenl\u00e2ndia -LocaleNames/pt/GM=G\u00e2mbia -LocaleNames/pt/GN=Guin\u00e9 +LocaleNames/pt/GL=Groenlândia +LocaleNames/pt/GM=Gâmbia +LocaleNames/pt/GN=Guiné LocaleNames/pt/GP=Guadalupe -LocaleNames/pt/GQ=Guin\u00e9 Equatorial -LocaleNames/pt/GR=Gr\u00e9cia -LocaleNames/pt/GS=Ilhas Ge\u00f3rgia do Sul e Sandwich do Sul -LocaleNames/pt/GW=Guin\u00e9-Bissau +LocaleNames/pt/GQ=Guiné Equatorial +LocaleNames/pt/GR=Grécia +LocaleNames/pt/GS=Ilhas Geórgia do Sul e Sandwich do Sul +LocaleNames/pt/GW=Guiné-Bissau LocaleNames/pt/GY=Guiana LocaleNames/pt/HK=Hong Kong, RAE da China LocaleNames/pt/HM=Ilhas Heard e McDonald -LocaleNames/pt/HR=Cro\u00e1cia +LocaleNames/pt/HR=Croácia LocaleNames/pt/HU=Hungria -LocaleNames/pt/ID=Indon\u00e9sia +LocaleNames/pt/ID=Indonésia LocaleNames/pt/IE=Irlanda -LocaleNames/pt/IN=\u00cdndia -LocaleNames/pt/IO=Territ\u00f3rio Brit\u00e2nico do Oceano \u00cdndico +LocaleNames/pt/IN=Índia +LocaleNames/pt/IO=Território Britânico do Oceano Índico LocaleNames/pt/IQ=Iraque -LocaleNames/pt/IR=Ir\u00e3 -LocaleNames/pt/IS=Isl\u00e2ndia -LocaleNames/pt/IT=It\u00e1lia -LocaleNames/pt/JO=Jord\u00e2nia -LocaleNames/pt/JP=Jap\u00e3o -LocaleNames/pt/KE=Qu\u00eania -LocaleNames/pt/KG=Quirguist\u00e3o +LocaleNames/pt/IR=Irã +LocaleNames/pt/IS=Islândia +LocaleNames/pt/IT=Itália +LocaleNames/pt/JO=Jordânia +LocaleNames/pt/JP=Japão +LocaleNames/pt/KE=Quênia +LocaleNames/pt/KG=Quirguistão LocaleNames/pt/KH=Camboja LocaleNames/pt/KI=Quiribati LocaleNames/pt/KM=Comores -LocaleNames/pt/KN=S\u00e3o Crist\u00f3v\u00e3o e N\u00e9vis +LocaleNames/pt/KN=São Cristóvão e Névis LocaleNames/pt/KP=Coreia do Norte LocaleNames/pt/KR=Coreia do Sul LocaleNames/pt/KY=Ilhas Cayman -LocaleNames/pt/KZ=Cazaquist\u00e3o +LocaleNames/pt/KZ=Cazaquistão LocaleNames/pt/LA=Laos -LocaleNames/pt/LB=L\u00edbano -LocaleNames/pt/LC=Santa L\u00facia -LocaleNames/pt/LR=Lib\u00e9ria +LocaleNames/pt/LB=Líbano +LocaleNames/pt/LC=Santa Lúcia +LocaleNames/pt/LR=Libéria LocaleNames/pt/LS=Lesoto -LocaleNames/pt/LT=Litu\u00e2nia +LocaleNames/pt/LT=Lituânia LocaleNames/pt/LU=Luxemburgo -LocaleNames/pt/LV=Let\u00f4nia -LocaleNames/pt/LY=L\u00edbia +LocaleNames/pt/LV=Letônia +LocaleNames/pt/LY=Líbia LocaleNames/pt/MA=Marrocos -LocaleNames/pt/MC=M\u00f4naco -LocaleNames/pt/MD=Mold\u00e1via +LocaleNames/pt/MC=Mônaco +LocaleNames/pt/MD=Moldávia LocaleNames/pt/MH=Ilhas Marshall -LocaleNames/pt/MK=Maced\u00f4nia do Norte -LocaleNames/pt/MM=Mianmar (Birm\u00e2nia) -LocaleNames/pt/MN=Mong\u00f3lia +LocaleNames/pt/MK=Macedônia do Norte +LocaleNames/pt/MM=Mianmar (Birmânia) +LocaleNames/pt/MN=Mongólia LocaleNames/pt/MO=Macau, RAE da China LocaleNames/pt/MP=Ilhas Marianas do Norte LocaleNames/pt/MQ=Martinica -LocaleNames/pt/MR=Maurit\u00e2nia -LocaleNames/pt/MU=Maur\u00edcio +LocaleNames/pt/MR=Mauritânia +LocaleNames/pt/MU=Maurício LocaleNames/pt/MV=Maldivas -LocaleNames/pt/MX=M\u00e9xico -LocaleNames/pt/MY=Mal\u00e1sia -LocaleNames/pt/MZ=Mo\u00e7ambique -LocaleNames/pt/NA=Nam\u00edbia -LocaleNames/pt/NC=Nova Caled\u00f4nia -LocaleNames/pt/NE=N\u00edger +LocaleNames/pt/MX=México +LocaleNames/pt/MY=Malásia +LocaleNames/pt/MZ=Moçambique +LocaleNames/pt/NA=Namíbia +LocaleNames/pt/NC=Nova Caledônia +LocaleNames/pt/NE=Níger LocaleNames/pt/NF=Ilha Norfolk -LocaleNames/pt/NG=Nig\u00e9ria -LocaleNames/pt/NI=Nicar\u00e1gua -LocaleNames/pt/NL=Pa\u00edses Baixos +LocaleNames/pt/NG=Nigéria +LocaleNames/pt/NI=Nicarágua +LocaleNames/pt/NL=Países Baixos LocaleNames/pt/NO=Noruega -LocaleNames/pt/NZ=Nova Zel\u00e2ndia -LocaleNames/pt/OM=Om\u00e3 -LocaleNames/pt/PA=Panam\u00e1 -LocaleNames/pt/PF=Polin\u00e9sia Francesa -LocaleNames/pt/PG=Papua-Nova Guin\u00e9 +LocaleNames/pt/NZ=Nova Zelândia +LocaleNames/pt/OM=Omã +LocaleNames/pt/PA=Panamá +LocaleNames/pt/PF=Polinésia Francesa +LocaleNames/pt/PG=Papua-Nova Guiné LocaleNames/pt/PH=Filipinas -LocaleNames/pt/PK=Paquist\u00e3o -LocaleNames/pt/PL=Pol\u00f4nia -LocaleNames/pt/PM=S\u00e3o Pedro e Miquel\u00e3o +LocaleNames/pt/PK=Paquistão +LocaleNames/pt/PL=Polônia +LocaleNames/pt/PM=São Pedro e Miquelão LocaleNames/pt/PR=Porto Rico -LocaleNames/pt/PS=Territ\u00f3rios palestinos +LocaleNames/pt/PS=Territórios palestinos LocaleNames/pt/PY=Paraguai LocaleNames/pt/QA=Catar -LocaleNames/pt/RE=Reuni\u00e3o -LocaleNames/pt/RO=Rom\u00eania -LocaleNames/pt/RU=R\u00fassia +LocaleNames/pt/RE=Reunião +LocaleNames/pt/RO=Romênia +LocaleNames/pt/RU=Rússia LocaleNames/pt/RW=Ruanda -LocaleNames/pt/SA=Ar\u00e1bia Saudita -LocaleNames/pt/SB=Ilhas Salom\u00e3o -LocaleNames/pt/SD=Sud\u00e3o -LocaleNames/pt/SE=Su\u00e9cia +LocaleNames/pt/SA=Arábia Saudita +LocaleNames/pt/SB=Ilhas Salomão +LocaleNames/pt/SD=Sudão +LocaleNames/pt/SE=Suécia LocaleNames/pt/SG=Singapura LocaleNames/pt/SH=Santa Helena -LocaleNames/pt/SI=Eslov\u00eania +LocaleNames/pt/SI=Eslovênia LocaleNames/pt/SJ=Svalbard e Jan Mayen -LocaleNames/pt/SK=Eslov\u00e1quia +LocaleNames/pt/SK=Eslováquia LocaleNames/pt/SL=Serra Leoa -LocaleNames/pt/SO=Som\u00e1lia -LocaleNames/pt/ST=S\u00e3o Tom\u00e9 e Pr\u00edncipe -LocaleNames/pt/SY=S\u00edria +LocaleNames/pt/SO=Somália +LocaleNames/pt/ST=São Tomé e Príncipe +LocaleNames/pt/SY=Síria LocaleNames/pt/TC=Ilhas Turcas e Caicos LocaleNames/pt/TD=Chade -LocaleNames/pt/TF=Territ\u00f3rios Franceses do Sul -LocaleNames/pt/TH=Tail\u00e2ndia -LocaleNames/pt/TJ=Tadjiquist\u00e3o +LocaleNames/pt/TF=Territórios Franceses do Sul +LocaleNames/pt/TH=Tailândia +LocaleNames/pt/TJ=Tadjiquistão LocaleNames/pt/TL=Timor-Leste -LocaleNames/pt/TM=Turcomenist\u00e3o -LocaleNames/pt/TN=Tun\u00edsia +LocaleNames/pt/TM=Turcomenistão +LocaleNames/pt/TN=Tunísia LocaleNames/pt/TR=Turquia LocaleNames/pt/TT=Trinidad e Tobago -LocaleNames/pt/TZ=Tanz\u00e2nia -LocaleNames/pt/UA=Ucr\u00e2nia +LocaleNames/pt/TZ=Tanzânia +LocaleNames/pt/UA=Ucrânia LocaleNames/pt/UM=Ilhas Menores Distantes dos EUA LocaleNames/pt/US=Estados Unidos LocaleNames/pt/UY=Uruguai -LocaleNames/pt/UZ=Uzbequist\u00e3o +LocaleNames/pt/UZ=Uzbequistão LocaleNames/pt/VA=Cidade do Vaticano -LocaleNames/pt/VC=S\u00e3o Vicente e Granadinas -LocaleNames/pt/VG=Ilhas Virgens Brit\u00e2nicas +LocaleNames/pt/VC=São Vicente e Granadinas +LocaleNames/pt/VG=Ilhas Virgens Britânicas LocaleNames/pt/VI=Ilhas Virgens Americanas -LocaleNames/pt/VN=Vietn\u00e3 +LocaleNames/pt/VN=Vietnã LocaleNames/pt/WF=Wallis e Futuna -LocaleNames/pt/YE=I\u00eamen -LocaleNames/pt/ZA=\u00c1frica do Sul -LocaleNames/pt/ZM=Z\u00e2mbia -LocaleNames/pt/ZW=Zimb\u00e1bue +LocaleNames/pt/YE=Iêmen +LocaleNames/pt/ZA=África do Sul +LocaleNames/pt/ZM=Zâmbia +LocaleNames/pt/ZW=Zimbábue # pt_PT LocaleNames/pt_PT/cs=checo -LocaleNames/pt_PT/et=est\u00f3nio +LocaleNames/pt_PT/et=estónio LocaleNames/pt_PT/pl=polaco LocaleNames/pt_PT/sl=esloveno -LocaleNames/pt_PT/AE=Emirados \u00c1rabes Unidos -LocaleNames/pt_PT/AM=Arm\u00e9nia -LocaleNames/pt_PT/AQ=Ant\u00e1rtida -LocaleNames/pt_PT/AZ=Azerbaij\u00e3o -LocaleNames/pt_PT/BA=B\u00f3snia e Herzegovina +LocaleNames/pt_PT/AE=Emirados Árabes Unidos +LocaleNames/pt_PT/AM=Arménia +LocaleNames/pt_PT/AQ=Antártida +LocaleNames/pt_PT/AZ=Azerbaijão +LocaleNames/pt_PT/BA=Bósnia e Herzegovina LocaleNames/pt_PT/BJ=Benim -LocaleNames/pt_PT/BY=Bielorr\u00fassia -LocaleNames/pt_PT/CM=Camar\u00f5es +LocaleNames/pt_PT/BY=Bielorrússia +LocaleNames/pt_PT/CM=Camarões LocaleNames/pt_PT/CX=Ilha do Natal -LocaleNames/pt_PT/CZ=Ch\u00e9quia -LocaleNames/pt_PT/EE=Est\u00f3nia +LocaleNames/pt_PT/CZ=Chéquia +LocaleNames/pt_PT/EE=Estónia LocaleNames/pt_PT/EG=Egito LocaleNames/pt_PT/EH=Sara Ocidental LocaleNames/pt_PT/ER=Eritreia LocaleNames/pt_PT/FK=Ilhas Falkland -LocaleNames/pt_PT/GL=Gronel\u00e2ndia -LocaleNames/pt_PT/GS=Ilhas Ge\u00f3rgia do Sul e Sandwich do Sul -LocaleNames/pt_PT/GW=Guin\u00e9-Bissau +LocaleNames/pt_PT/GL=Gronelândia +LocaleNames/pt_PT/GS=Ilhas Geórgia do Sul e Sandwich do Sul +LocaleNames/pt_PT/GW=Guiné-Bissau LocaleNames/pt_PT/HK=Hong Kong, RAE da China -LocaleNames/pt_PT/KE=Qu\u00e9nia -LocaleNames/pt_PT/KG=Quirguist\u00e3o -LocaleNames/pt_PT/KN=S\u00e3o Crist\u00f3v\u00e3o e Neves +LocaleNames/pt_PT/KE=Quénia +LocaleNames/pt_PT/KG=Quirguistão +LocaleNames/pt_PT/KN=São Cristóvão e Neves LocaleNames/pt_PT/KP=Coreia do Norte LocaleNames/pt_PT/KR=Coreia do Sul -LocaleNames/pt_PT/KY=Ilhas Caim\u00e3o -LocaleNames/pt_PT/KZ=Cazaquist\u00e3o +LocaleNames/pt_PT/KY=Ilhas Caimão +LocaleNames/pt_PT/KZ=Cazaquistão LocaleNames/pt_PT/LA=Laos -LocaleNames/pt_PT/LV=Let\u00f3nia -LocaleNames/pt_PT/MC=M\u00f3naco -LocaleNames/pt_PT/MD=Mold\u00e1via -LocaleNames/pt_PT/MG=Madag\u00e1scar -LocaleNames/pt_PT/MK=Maced\u00f3nia do Norte +LocaleNames/pt_PT/LV=Letónia +LocaleNames/pt_PT/MC=Mónaco +LocaleNames/pt_PT/MD=Moldávia +LocaleNames/pt_PT/MG=Madagáscar +LocaleNames/pt_PT/MK=Macedónia do Norte LocaleNames/pt_PT/MO=Macau, RAE da China LocaleNames/pt_PT/MP=Ilhas Marianas do Norte -LocaleNames/pt_PT/MU=Maur\u00edcia -LocaleNames/pt_PT/NC=Nova Caled\u00f3nia -LocaleNames/pt_PT/PG=Papua-Nova Guin\u00e9 -LocaleNames/pt_PT/PL=Pol\u00f3nia -LocaleNames/pt_PT/PS=Territ\u00f3rios palestinianos -LocaleNames/pt_PT/RE=Reuni\u00e3o -LocaleNames/pt_PT/RO=Rom\u00e9nia +LocaleNames/pt_PT/MU=Maurícia +LocaleNames/pt_PT/NC=Nova Caledónia +LocaleNames/pt_PT/PG=Papua-Nova Guiné +LocaleNames/pt_PT/PL=Polónia +LocaleNames/pt_PT/PS=Territórios palestinianos +LocaleNames/pt_PT/RE=Reunião +LocaleNames/pt_PT/RO=Roménia LocaleNames/pt_PT/SC=Seicheles LocaleNames/pt_PT/SG=Singapura -LocaleNames/pt_PT/SI=Eslov\u00e9nia -LocaleNames/pt_PT/SM=S\u00e3o Marinho +LocaleNames/pt_PT/SI=Eslovénia +LocaleNames/pt_PT/SM=São Marinho LocaleNames/pt_PT/TC=Ilhas Turcas e Caicos LocaleNames/pt_PT/TD=Chade -LocaleNames/pt_PT/TF=Territ\u00f3rios Austrais Franceses -LocaleNames/pt_PT/TJ=Tajiquist\u00e3o -LocaleNames/pt_PT/TM=Turquemenist\u00e3o +LocaleNames/pt_PT/TF=Territórios Austrais Franceses +LocaleNames/pt_PT/TJ=Tajiquistão +LocaleNames/pt_PT/TM=Turquemenistão LocaleNames/pt_PT/UM=Ilhas Menores Afastadas dos EUA -LocaleNames/pt_PT/UZ=Usbequist\u00e3o +LocaleNames/pt_PT/UZ=Usbequistão LocaleNames/pt_PT/VA=Cidade do Vaticano -LocaleNames/pt_PT/VC=S\u00e3o Vicente e Granadinas -LocaleNames/pt_PT/VG=Ilhas Virgens Brit\u00e2nicas +LocaleNames/pt_PT/VC=São Vicente e Granadinas +LocaleNames/pt_PT/VG=Ilhas Virgens Britânicas LocaleNames/pt_PT/VI=Ilhas Virgens dos EUA LocaleNames/pt_PT/VN=Vietname -LocaleNames/pt_PT/YE=I\u00e9men +LocaleNames/pt_PT/YE=Iémen #bug 6290792 Gaelic support -LocaleNames/ga/ab=Abc\u00e1isis -LocaleNames/ga/ae=Aiv\u00e9istis -LocaleNames/ga/af=Afrac\u00e1inis +LocaleNames/ga/ab=Abcáisis +LocaleNames/ga/ae=Aivéistis +LocaleNames/ga/af=Afracáinis LocaleNames/ga/ar=Araibis LocaleNames/ga/as=Asaimis -LocaleNames/ga/az=Asarbaise\u00e1inis -LocaleNames/ga/ba=Baisc\u00edris -LocaleNames/ga/be=Bealar\u00faisis -LocaleNames/ga/bg=Bulg\u00e1iris -LocaleNames/ga/bn=Beang\u00e1ilis -LocaleNames/ga/bo=Tib\u00e9idis -LocaleNames/ga/br=Briot\u00e1inis +LocaleNames/ga/az=Asarbaiseáinis +LocaleNames/ga/ba=Baiscíris +LocaleNames/ga/be=Bealarúisis +LocaleNames/ga/bg=Bulgáiris +LocaleNames/ga/bn=Beangáilis +LocaleNames/ga/bo=Tibéidis +LocaleNames/ga/br=Briotáinis LocaleNames/ga/bs=Boisnis -LocaleNames/ga/ca=Catal\u00f3inis +LocaleNames/ga/ca=Catalóinis LocaleNames/ga/ce=Seisnis LocaleNames/ga/co=Corsaicis -LocaleNames/ga/cr=Cra\u00eds +LocaleNames/ga/cr=Craís LocaleNames/ga/cs=Seicis LocaleNames/ga/cu=Slavais na hEaglaise LocaleNames/ga/cv=Suvaisis LocaleNames/ga/cy=Breatnais LocaleNames/ga/da=Danmhairgis -LocaleNames/ga/de=Gearm\u00e1inis -LocaleNames/ga/el=Gr\u00e9igis -LocaleNames/ga/en=B\u00e9arla -LocaleNames/ga/es=Sp\u00e1innis -LocaleNames/ga/et=East\u00f3inis +LocaleNames/ga/de=Gearmáinis +LocaleNames/ga/el=Gréigis +LocaleNames/ga/en=Béarla +LocaleNames/ga/es=Spáinnis +LocaleNames/ga/et=Eastóinis LocaleNames/ga/eu=Bascais LocaleNames/ga/fa=Peirsis LocaleNames/ga/fi=Fionlainnis LocaleNames/ga/fj=Fidsis -LocaleNames/ga/fo=Far\u00f3is +LocaleNames/ga/fo=Faróis LocaleNames/ga/fr=Fraincis LocaleNames/ga/fy=Freaslainnis Iartharach LocaleNames/ga/ga=Gaeilge LocaleNames/ga/gd=Gaeilge na hAlban -LocaleNames/ga/gu=G\u00faisear\u00e1itis +LocaleNames/ga/gu=Gúisearáitis LocaleNames/ga/gv=Manainnis LocaleNames/ga/he=Eabhrais -LocaleNames/ga/hi=Hiond\u00fais -LocaleNames/ga/hr=Cr\u00f3itis -LocaleNames/ga/hu=Ung\u00e1iris -LocaleNames/ga/hy=Airm\u00e9inis -LocaleNames/ga/id=Indin\u00e9isis -LocaleNames/ga/in=Indin\u00e9isis -LocaleNames/ga/is=\u00cdoslainnis -LocaleNames/ga/it=Iod\u00e1ilis -LocaleNames/ga/iu=Ion\u00faitis +LocaleNames/ga/hi=Hiondúis +LocaleNames/ga/hr=Cróitis +LocaleNames/ga/hu=Ungáiris +LocaleNames/ga/hy=Airméinis +LocaleNames/ga/id=Indinéisis +LocaleNames/ga/in=Indinéisis +LocaleNames/ga/is=Íoslainnis +LocaleNames/ga/it=Iodáilis +LocaleNames/ga/iu=Ionúitis LocaleNames/ga/iw=Eabhrais -LocaleNames/ga/ja=Seap\u00e1inis -LocaleNames/ga/ji=Gi\u00fadais -LocaleNames/ga/jv=I\u00e1ivis +LocaleNames/ga/ja=Seapáinis +LocaleNames/ga/ji=Giúdais +LocaleNames/ga/jv=Iáivis LocaleNames/ga/ka=Seoirsis LocaleNames/ga/kk=Casaicis LocaleNames/ga/kn=Cannadais -LocaleNames/ga/ko=C\u00f3ir\u00e9is -LocaleNames/ga/ks=Caism\u00edris +LocaleNames/ga/ko=Cóiréis +LocaleNames/ga/ks=Caismíris LocaleNames/ga/kw=Coirnis LocaleNames/ga/ky=Cirgisis LocaleNames/ga/la=Laidin LocaleNames/ga/lb=Lucsambuirgis LocaleNames/ga/lo=Laoisis -LocaleNames/ga/lt=Liotu\u00e1inis +LocaleNames/ga/lt=Liotuáinis LocaleNames/ga/lv=Laitvis -LocaleNames/ga/mg=Malag\u00e1isis +LocaleNames/ga/mg=Malagáisis LocaleNames/ga/mi=Maorais -LocaleNames/ga/mk=Macad\u00f3inis -LocaleNames/ga/ml=Mail\u00e9alaimis -LocaleNames/ga/mn=Mong\u00f3ilis -LocaleNames/ga/mo=Mold\u00e1ivis +LocaleNames/ga/mk=Macadóinis +LocaleNames/ga/ml=Mailéalaimis +LocaleNames/ga/mn=Mongóilis +LocaleNames/ga/mo=Moldáivis LocaleNames/ga/mr=Maraitis -LocaleNames/ga/mt=M\u00e1ltais +LocaleNames/ga/mt=Máltais LocaleNames/ga/my=Burmais -LocaleNames/ga/na=N\u00e1r\u00fais -LocaleNames/ga/nb=Bocm\u00e1l +LocaleNames/ga/na=Nárúis +LocaleNames/ga/nb=Bocmál LocaleNames/ga/ne=Neipeailis LocaleNames/ga/nl=Ollainnis LocaleNames/ga/nn=Nua-Ioruais LocaleNames/ga/no=Ioruais -LocaleNames/ga/nv=Navach\u00f3is -LocaleNames/ga/oc=Ocsat\u00e1inis -LocaleNames/ga/os=Ois\u00e9itis -LocaleNames/ga/pa=Puinse\u00e1ibis +LocaleNames/ga/nv=Navachóis +LocaleNames/ga/oc=Ocsatáinis +LocaleNames/ga/os=Oiséitis +LocaleNames/ga/pa=Puinseáibis LocaleNames/ga/pl=Polainnis LocaleNames/ga/ps=Paistis -LocaleNames/ga/pt=Portaing\u00e9ilis +LocaleNames/ga/pt=Portaingéilis LocaleNames/ga/qu=Ceatsuais -LocaleNames/ga/ro=R\u00f3m\u00e1inis -LocaleNames/ga/ru=R\u00faisis +LocaleNames/ga/ro=Rómáinis +LocaleNames/ga/ru=Rúisis LocaleNames/ga/sa=Sanscrait -LocaleNames/ga/sc=Saird\u00ednis +LocaleNames/ga/sc=Sairdínis LocaleNames/ga/sd=Sindis -LocaleNames/ga/se=S\u00e1imis an Tuaiscirt -LocaleNames/ga/sk=Sl\u00f3vaicis -LocaleNames/ga/sl=Sl\u00f3iv\u00e9inis -LocaleNames/ga/sm=Sam\u00f3is -LocaleNames/ga/so=Som\u00e1ilis -LocaleNames/ga/sq=Alb\u00e1inis +LocaleNames/ga/se=Sáimis an Tuaiscirt +LocaleNames/ga/sk=Slóvaicis +LocaleNames/ga/sl=Slóivéinis +LocaleNames/ga/sm=Samóis +LocaleNames/ga/so=Somáilis +LocaleNames/ga/sq=Albáinis LocaleNames/ga/sr=Seirbis LocaleNames/ga/sv=Sualainnis -LocaleNames/ga/sw=Svaha\u00edlis +LocaleNames/ga/sw=Svahaílis LocaleNames/ga/ta=Tamailis -LocaleNames/ga/th=T\u00e9alainnis -LocaleNames/ga/tl=Tag\u00e1laigis +LocaleNames/ga/th=Téalainnis +LocaleNames/ga/tl=Tagálaigis LocaleNames/ga/tr=Tuircis LocaleNames/ga/tt=Tatairis -LocaleNames/ga/ty=Taih\u00edtis -LocaleNames/ga/uk=\u00dacr\u00e1inis -LocaleNames/ga/ur=Urd\u00fais -LocaleNames/ga/uz=\u00daisb\u00e9iceast\u00e1inis -LocaleNames/ga/vi=V\u00edtneaimis -LocaleNames/ga/wa=Vall\u00fanais -LocaleNames/ga/yi=Gi\u00fadais -LocaleNames/ga/zh=S\u00ednis -LocaleNames/ga/zu=S\u00fal\u00fais -LocaleNames/ga/AD=And\u00f3ra -LocaleNames/ga/AE=Aontas na n\u00c9im\u00edr\u00edochta\u00ed Arabacha -LocaleNames/ga/AF=an Afganast\u00e1in -LocaleNames/ga/AG=Antigua agus Barb\u00fada -LocaleNames/ga/AL=an Alb\u00e1in -LocaleNames/ga/AM=an Airm\u00e9in -LocaleNames/ga/AN=Antill\u00ed na h\u00cdsilt\u00edre -LocaleNames/ga/AO=Ang\u00f3la +LocaleNames/ga/ty=Taihítis +LocaleNames/ga/uk=Úcráinis +LocaleNames/ga/ur=Urdúis +LocaleNames/ga/uz=Úisbéiceastáinis +LocaleNames/ga/vi=Vítneaimis +LocaleNames/ga/wa=Vallúnais +LocaleNames/ga/yi=Giúdais +LocaleNames/ga/zh=Sínis +LocaleNames/ga/zu=Súlúis +LocaleNames/ga/AD=Andóra +LocaleNames/ga/AE=Aontas na nÉimíríochtaí Arabacha +LocaleNames/ga/AF=an Afganastáin +LocaleNames/ga/AG=Antigua agus Barbúda +LocaleNames/ga/AL=an Albáin +LocaleNames/ga/AM=an Airméin +LocaleNames/ga/AN=Antillí na hÍsiltíre +LocaleNames/ga/AO=Angóla LocaleNames/ga/AQ=Antartaice -LocaleNames/ga/AR=an Airgint\u00edn -LocaleNames/ga/AS=Sam\u00f3 Mheirice\u00e1 +LocaleNames/ga/AR=an Airgintín +LocaleNames/ga/AS=Samó Mheiriceá LocaleNames/ga/AT=an Ostair -LocaleNames/ga/AU=an Astr\u00e1il -LocaleNames/ga/AZ=an Asarbaise\u00e1in -LocaleNames/ga/BA=an Bhoisnia agus an Heirseagaiv\u00e9in -LocaleNames/ga/BB=Barbad\u00f3s -LocaleNames/ga/BD=an Bhanglaid\u00e9is +LocaleNames/ga/AU=an Astráil +LocaleNames/ga/AZ=an Asarbaiseáin +LocaleNames/ga/BA=an Bhoisnia agus an Heirseagaivéin +LocaleNames/ga/BB=Barbadós +LocaleNames/ga/BD=an Bhanglaidéis LocaleNames/ga/BE=an Bheilg -LocaleNames/ga/BF=Buirc\u00edne Fas\u00f3 -LocaleNames/ga/BG=an Bhulg\u00e1ir -LocaleNames/ga/BH=Bair\u00e9in -LocaleNames/ga/BI=an Bhur\u00fain +LocaleNames/ga/BF=Buircíne Fasó +LocaleNames/ga/BG=an Bhulgáir +LocaleNames/ga/BH=Bairéin +LocaleNames/ga/BI=an Bhurúin LocaleNames/ga/BJ=Beinin -LocaleNames/ga/BM=Beirmi\u00fada -LocaleNames/ga/BN=Br\u00fain\u00e9 +LocaleNames/ga/BM=Beirmiúda +LocaleNames/ga/BN=Brúiné LocaleNames/ga/BO=an Bholaiv -LocaleNames/ga/BR=an Bhrasa\u00edl -LocaleNames/ga/BS=na Bah\u00e1ma\u00ed -LocaleNames/ga/BT=an Bh\u00fat\u00e1in -LocaleNames/ga/BV=Oile\u00e1n Bouvet -LocaleNames/ga/BW=an Bhotsu\u00e1in -LocaleNames/ga/BY=an Bhealar\u00fais -LocaleNames/ga/BZ=an Bheil\u00eds +LocaleNames/ga/BR=an Bhrasaíl +LocaleNames/ga/BS=na Bahámaí +LocaleNames/ga/BT=an Bhútáin +LocaleNames/ga/BV=Oileán Bouvet +LocaleNames/ga/BW=an Bhotsuáin +LocaleNames/ga/BY=an Bhealarúis +LocaleNames/ga/BZ=an Bheilís LocaleNames/ga/CA=Ceanada -LocaleNames/ga/CC=Oile\u00e1in Cocos (Keeling) -LocaleNames/ga/CD=Poblacht Dhaonlathach an Chong\u00f3 -LocaleNames/ga/CF=Poblacht na hAfraice L\u00e1ir -LocaleNames/ga/CG=Cong\u00f3-Brazzaville -LocaleNames/ga/CH=an Eilv\u00e9is -LocaleNames/ga/CI=an C\u00f3sta Eabhair -LocaleNames/ga/CK=Oile\u00e1in Cook +LocaleNames/ga/CC=Oileáin Cocos (Keeling) +LocaleNames/ga/CD=Poblacht Dhaonlathach an Chongó +LocaleNames/ga/CF=Poblacht na hAfraice Láir +LocaleNames/ga/CG=Congó-Brazzaville +LocaleNames/ga/CH=an Eilvéis +LocaleNames/ga/CI=an Cósta Eabhair +LocaleNames/ga/CK=Oileáin Cook LocaleNames/ga/CL=an tSile -LocaleNames/ga/CM=Camar\u00fan -LocaleNames/ga/CN=an tS\u00edn -LocaleNames/ga/CO=an Chol\u00f3im -LocaleNames/ga/CR=C\u00f3sta R\u00edce -LocaleNames/ga/CU=C\u00faba +LocaleNames/ga/CM=Camarún +LocaleNames/ga/CN=an tSín +LocaleNames/ga/CO=an Cholóim +LocaleNames/ga/CR=Cósta Ríce +LocaleNames/ga/CU=Cúba LocaleNames/ga/CV=Rinn Verde -LocaleNames/ga/CX=Oile\u00e1n na Nollag +LocaleNames/ga/CX=Oileán na Nollag LocaleNames/ga/CY=an Chipir LocaleNames/ga/CZ=an tSeicia -LocaleNames/ga/DE=an Ghearm\u00e1in +LocaleNames/ga/DE=an Ghearmáin LocaleNames/ga/DK=an Danmhairg LocaleNames/ga/DM=Doiminice LocaleNames/ga/DO=an Phoblacht Dhoiminiceach -LocaleNames/ga/DZ=an Ailg\u00e9ir -LocaleNames/ga/EC=Eacuad\u00f3r -LocaleNames/ga/EE=an East\u00f3in -LocaleNames/ga/EG=an \u00c9igipt -LocaleNames/ga/EH=an Sah\u00e1ra Thiar -LocaleNames/ga/ES=an Sp\u00e1inn -LocaleNames/ga/ET=an Aet\u00f3ip +LocaleNames/ga/DZ=an Ailgéir +LocaleNames/ga/EC=Eacuadór +LocaleNames/ga/EE=an Eastóin +LocaleNames/ga/EG=an Éigipt +LocaleNames/ga/EH=an Sahára Thiar +LocaleNames/ga/ES=an Spáinn +LocaleNames/ga/ET=an Aetóip LocaleNames/ga/FI=an Fhionlainn -LocaleNames/ga/FJ=Fids\u00ed -LocaleNames/ga/FK=Oile\u00e1in Fh\u00e1clainne -LocaleNames/ga/FM=an Mhicrin\u00e9is -LocaleNames/ga/FO=Oile\u00e1in Fhar\u00f3 +LocaleNames/ga/FJ=Fidsí +LocaleNames/ga/FK=Oileáin Fháclainne +LocaleNames/ga/FM=an Mhicrinéis +LocaleNames/ga/FO=Oileáin Fharó LocaleNames/ga/FR=an Fhrainc -LocaleNames/ga/GA=an Ghab\u00fain -LocaleNames/ga/GB=an R\u00edocht Aontaithe +LocaleNames/ga/GA=an Ghabúin +LocaleNames/ga/GB=an Ríocht Aontaithe LocaleNames/ga/GE=an tSeoirsia -LocaleNames/ga/GF=Gu\u00e1in na Fraince -LocaleNames/ga/GH=G\u00e1na -LocaleNames/ga/GI=Giobr\u00e1ltar +LocaleNames/ga/GF=Guáin na Fraince +LocaleNames/ga/GH=Gána +LocaleNames/ga/GI=Giobráltar LocaleNames/ga/GL=an Ghraonlainn LocaleNames/ga/GM=an Ghaimbia LocaleNames/ga/GN=an Ghuine -LocaleNames/ga/GP=Guadal\u00faip -LocaleNames/ga/GQ=an Ghuine Mhe\u00e1nchiorclach -LocaleNames/ga/GR=an Ghr\u00e9ig -LocaleNames/ga/GS=an tSeoirsia Theas agus Oile\u00e1in Sandwich Theas +LocaleNames/ga/GP=Guadalúip +LocaleNames/ga/GQ=an Ghuine Mheánchiorclach +LocaleNames/ga/GR=an Ghréig +LocaleNames/ga/GS=an tSeoirsia Theas agus Oileáin Sandwich Theas LocaleNames/ga/GT=Guatamala LocaleNames/ga/GW=Guine Bissau -LocaleNames/ga/GY=an Ghu\u00e1in -LocaleNames/ga/HM=Oile\u00e1n Heard agus Oile\u00e1in McDonald -LocaleNames/ga/HN=Hond\u00faras -LocaleNames/ga/HR=an Chr\u00f3it -LocaleNames/ga/HT=H\u00e1\u00edt\u00ed -LocaleNames/ga/HU=an Ung\u00e1ir -LocaleNames/ga/ID=an Indin\u00e9is -LocaleNames/ga/IE=\u00c9ire +LocaleNames/ga/GY=an Ghuáin +LocaleNames/ga/HM=Oileán Heard agus Oileáin McDonald +LocaleNames/ga/HN=Hondúras +LocaleNames/ga/HR=an Chróit +LocaleNames/ga/HT=Háítí +LocaleNames/ga/HU=an Ungáir +LocaleNames/ga/ID=an Indinéis +LocaleNames/ga/IE=Éire LocaleNames/ga/IL=Iosrael LocaleNames/ga/IN=an India -LocaleNames/ga/IO=Cr\u00edoch Aig\u00e9an Indiach na Breataine -LocaleNames/ga/IQ=an Iar\u00e1ic -LocaleNames/ga/IR=an Iar\u00e1in -LocaleNames/ga/IS=an \u00cdoslainn -LocaleNames/ga/IT=an Iod\u00e1il -LocaleNames/ga/JM=Iam\u00e1ice -LocaleNames/ga/JO=an Iord\u00e1in -LocaleNames/ga/JP=an tSeap\u00e1in -LocaleNames/ga/KE=an Ch\u00e9inia -LocaleNames/ga/KG=an Chirgeast\u00e1in -LocaleNames/ga/KH=an Chamb\u00f3id +LocaleNames/ga/IO=Críoch Aigéan Indiach na Breataine +LocaleNames/ga/IQ=an Iaráic +LocaleNames/ga/IR=an Iaráin +LocaleNames/ga/IS=an Íoslainn +LocaleNames/ga/IT=an Iodáil +LocaleNames/ga/JM=Iamáice +LocaleNames/ga/JO=an Iordáin +LocaleNames/ga/JP=an tSeapáin +LocaleNames/ga/KE=an Chéinia +LocaleNames/ga/KG=an Chirgeastáin +LocaleNames/ga/KH=an Chambóid LocaleNames/ga/KI=Ciribeas -LocaleNames/ga/KM=Oile\u00e1in Chom\u00f3ra -LocaleNames/ga/KN=San Cr\u00edost\u00f3ir-Nimheas -LocaleNames/ga/KP=an Ch\u00f3ir\u00e9 Thuaidh -LocaleNames/ga/KR=an Ch\u00f3ir\u00e9 Theas -LocaleNames/ga/KW=Cu\u00e1it -LocaleNames/ga/KY=Oile\u00e1in Cayman -LocaleNames/ga/KZ=an Chasacst\u00e1in -LocaleNames/ga/LB=an Liob\u00e1in -LocaleNames/ga/LI=Lichtinst\u00e9in -LocaleNames/ga/LK=Sr\u00ed Lanca -LocaleNames/ga/LR=an Lib\u00e9ir -LocaleNames/ga/LS=Leos\u00f3ta -LocaleNames/ga/LT=an Liotu\u00e1in +LocaleNames/ga/KM=Oileáin Chomóra +LocaleNames/ga/KN=San Críostóir-Nimheas +LocaleNames/ga/KP=an Chóiré Thuaidh +LocaleNames/ga/KR=an Chóiré Theas +LocaleNames/ga/KW=Cuáit +LocaleNames/ga/KY=Oileáin Cayman +LocaleNames/ga/KZ=an Chasacstáin +LocaleNames/ga/LB=an Liobáin +LocaleNames/ga/LI=Lichtinstéin +LocaleNames/ga/LK=Srí Lanca +LocaleNames/ga/LR=an Libéir +LocaleNames/ga/LS=Leosóta +LocaleNames/ga/LT=an Liotuáin LocaleNames/ga/LU=Lucsamburg LocaleNames/ga/LV=an Laitvia LocaleNames/ga/LY=an Libia -LocaleNames/ga/MA=Marac\u00f3 -LocaleNames/ga/MC=Monac\u00f3 -LocaleNames/ga/MD=an Mhold\u00f3iv -LocaleNames/ga/MH=Oile\u00e1in Marshall -LocaleNames/ga/MK=an Mhacad\u00f3in Thuaidh -LocaleNames/ga/ML=Mail\u00ed +LocaleNames/ga/MA=Maracó +LocaleNames/ga/MC=Monacó +LocaleNames/ga/MD=an Mholdóiv +LocaleNames/ga/MH=Oileáin Marshall +LocaleNames/ga/MK=an Mhacadóin Thuaidh +LocaleNames/ga/ML=Mailí LocaleNames/ga/MM=Maenmar (Burma) -LocaleNames/ga/MN=an Mhong\u00f3il -LocaleNames/ga/MP=na hOile\u00e1in Mh\u00e1irianacha Thuaidh -LocaleNames/ga/MR=an Mh\u00e1rat\u00e1in +LocaleNames/ga/MN=an Mhongóil +LocaleNames/ga/MP=na hOileáin Mháirianacha Thuaidh +LocaleNames/ga/MR=an Mháratáin LocaleNames/ga/MS=Montsarat -LocaleNames/ga/MT=M\u00e1lta -LocaleNames/ga/MU=Oile\u00e1n Mhuir\u00eds -LocaleNames/ga/MV=Oile\u00e1in Mhaild\u00edve -LocaleNames/ga/MW=an Mhal\u00e1iv +LocaleNames/ga/MT=Málta +LocaleNames/ga/MU=Oileán Mhuirís +LocaleNames/ga/MV=Oileáin Mhaildíve +LocaleNames/ga/MW=an Mhaláiv LocaleNames/ga/MX=Meicsiceo LocaleNames/ga/MY=an Mhalaeisia -LocaleNames/ga/MZ=M\u00f3saimb\u00edc +LocaleNames/ga/MZ=Mósaimbíc LocaleNames/ga/NA=an Namaib -LocaleNames/ga/NC=an Nua-Chalad\u00f3in -LocaleNames/ga/NE=an N\u00edgir -LocaleNames/ga/NF=Oile\u00e1n Norfolk -LocaleNames/ga/NG=an Nig\u00e9ir +LocaleNames/ga/NC=an Nua-Chaladóin +LocaleNames/ga/NE=an Nígir +LocaleNames/ga/NF=Oileán Norfolk +LocaleNames/ga/NG=an Nigéir LocaleNames/ga/NI=Nicearagua -LocaleNames/ga/NL=an \u00cdsilt\u00edr +LocaleNames/ga/NL=an Ísiltír LocaleNames/ga/NO=an Iorua LocaleNames/ga/NP=Neipeal -LocaleNames/ga/NR=N\u00e1r\u00fa -LocaleNames/ga/NZ=an Nua-Sh\u00e9alainn -LocaleNames/ga/PE=Peiri\u00fa -LocaleNames/ga/PF=Polain\u00e9is na Fraince +LocaleNames/ga/NR=Nárú +LocaleNames/ga/NZ=an Nua-Shéalainn +LocaleNames/ga/PE=Peiriú +LocaleNames/ga/PF=Polainéis na Fraince LocaleNames/ga/PG=Nua-Ghuine Phapua -LocaleNames/ga/PH=na hOile\u00e1in Fhilip\u00edneacha -LocaleNames/ga/PK=an Phacast\u00e1in +LocaleNames/ga/PH=na hOileáin Fhilipíneacha +LocaleNames/ga/PK=an Phacastáin LocaleNames/ga/PL=an Pholainn LocaleNames/ga/PM=San Pierre agus Miquelon -LocaleNames/ga/PR=P\u00f3rt\u00f3 R\u00edce -LocaleNames/ga/PS=na Cr\u00edocha Palaist\u00edneacha -LocaleNames/ga/PT=an Phortaing\u00e9il +LocaleNames/ga/PR=Pórtó Ríce +LocaleNames/ga/PS=na Críocha Palaistíneacha +LocaleNames/ga/PT=an Phortaingéil LocaleNames/ga/PY=Paragua LocaleNames/ga/QA=Catar -LocaleNames/ga/RE=La R\u00e9union -LocaleNames/ga/RO=an R\u00f3m\u00e1in -LocaleNames/ga/RU=an R\u00fais +LocaleNames/ga/RE=La Réunion +LocaleNames/ga/RO=an Rómáin +LocaleNames/ga/RU=an Rúis LocaleNames/ga/RW=Ruanda -LocaleNames/ga/SA=an Araib Sh\u00e1dach -LocaleNames/ga/SB=Oile\u00e1in Sholaimh -LocaleNames/ga/SC=na S\u00e9is\u00e9il -LocaleNames/ga/SD=an tS\u00fad\u00e1in +LocaleNames/ga/SA=an Araib Shádach +LocaleNames/ga/SB=Oileáin Sholaimh +LocaleNames/ga/SC=na Séiséil +LocaleNames/ga/SD=an tSúdáin LocaleNames/ga/SE=an tSualainn -LocaleNames/ga/SG=Singeap\u00f3r -LocaleNames/ga/SH=San H\u00e9ilin -LocaleNames/ga/SI=an tSl\u00f3iv\u00e9in +LocaleNames/ga/SG=Singeapór +LocaleNames/ga/SH=San Héilin +LocaleNames/ga/SI=an tSlóivéin LocaleNames/ga/SJ=Svalbard agus Jan Mayen -LocaleNames/ga/SK=an tSl\u00f3vaic +LocaleNames/ga/SK=an tSlóvaic LocaleNames/ga/SL=Siarra Leon -LocaleNames/ga/SM=San Mair\u00edne -LocaleNames/ga/SN=an tSeineag\u00e1il -LocaleNames/ga/SO=an tSom\u00e1il +LocaleNames/ga/SM=San Mairíne +LocaleNames/ga/SN=an tSeineagáil +LocaleNames/ga/SO=an tSomáil LocaleNames/ga/SR=Suranam -LocaleNames/ga/ST=S\u00e3o Tom\u00e9 agus Pr\u00edncipe -LocaleNames/ga/SV=an tSalvad\u00f3ir +LocaleNames/ga/ST=São Tomé agus Príncipe +LocaleNames/ga/SV=an tSalvadóir LocaleNames/ga/SY=an tSiria -LocaleNames/ga/TC=Oile\u00e1in na dTurcach agus Caicos +LocaleNames/ga/TC=Oileáin na dTurcach agus Caicos LocaleNames/ga/TD=Sead -LocaleNames/ga/TF=Cr\u00edocha Francacha Dheisceart an Domhain -LocaleNames/ga/TG=T\u00f3ga -LocaleNames/ga/TH=an T\u00e9alainn -LocaleNames/ga/TJ=an T\u00e1ids\u00edceast\u00e1in -LocaleNames/ga/TK=T\u00f3cal\u00e1 -LocaleNames/ga/TL=T\u00edom\u00f3r Thoir -LocaleNames/ga/TM=an Tuircm\u00e9anast\u00e1in -LocaleNames/ga/TN=an T\u00fain\u00e9is +LocaleNames/ga/TF=Críocha Francacha Dheisceart an Domhain +LocaleNames/ga/TG=Tóga +LocaleNames/ga/TH=an Téalainn +LocaleNames/ga/TJ=an Táidsíceastáin +LocaleNames/ga/TK=Tócalá +LocaleNames/ga/TL=Tíomór Thoir +LocaleNames/ga/TM=an Tuircméanastáin +LocaleNames/ga/TN=an Túinéis LocaleNames/ga/TR=an Tuirc -LocaleNames/ga/TT=Oile\u00e1n na Tr\u00edon\u00f3ide agus Tob\u00e1ga -LocaleNames/ga/TV=T\u00faval\u00fa -LocaleNames/ga/TW=an T\u00e9av\u00e1in -LocaleNames/ga/TZ=an Tans\u00e1in -LocaleNames/ga/UA=an \u00dacr\u00e1in -LocaleNames/ga/UM=Oile\u00e1in Imeallacha S.A.M. -LocaleNames/ga/US=St\u00e1it Aontaithe Mheirice\u00e1 +LocaleNames/ga/TT=Oileán na Tríonóide agus Tobága +LocaleNames/ga/TV=Túvalú +LocaleNames/ga/TW=an Téaváin +LocaleNames/ga/TZ=an Tansáin +LocaleNames/ga/UA=an Úcráin +LocaleNames/ga/UM=Oileáin Imeallacha S.A.M. +LocaleNames/ga/US=Stáit Aontaithe Mheiriceá LocaleNames/ga/UY=Uragua -LocaleNames/ga/UZ=an \u00daisb\u00e9iceast\u00e1in -LocaleNames/ga/VA=Cathair na Vatac\u00e1ine -LocaleNames/ga/VC=San Uinseann agus na Grean\u00e1id\u00edn\u00ed -LocaleNames/ga/VE=Veinis\u00e9ala -LocaleNames/ga/VG=Oile\u00e1in Bhriotanacha na Maighdean -LocaleNames/ga/VI=Oile\u00e1in Mheirice\u00e1nacha na Maighdean -LocaleNames/ga/VN=V\u00edtneam -LocaleNames/ga/VU=Vanuat\u00fa -LocaleNames/ga/WF=Vail\u00eds agus Fut\u00fana -LocaleNames/ga/WS=Sam\u00f3 -LocaleNames/ga/YE=\u00c9imin +LocaleNames/ga/UZ=an Úisbéiceastáin +LocaleNames/ga/VA=Cathair na Vatacáine +LocaleNames/ga/VC=San Uinseann agus na Greanáidíní +LocaleNames/ga/VE=Veiniséala +LocaleNames/ga/VG=Oileáin Bhriotanacha na Maighdean +LocaleNames/ga/VI=Oileáin Mheiriceánacha na Maighdean +LocaleNames/ga/VN=Vítneam +LocaleNames/ga/VU=Vanuatú +LocaleNames/ga/WF=Vailís agus Futúna +LocaleNames/ga/WS=Samó +LocaleNames/ga/YE=Éimin LocaleNames/ga/ZA=an Afraic Theas LocaleNames/ga/ZM=an tSaimbia # bug #6277696 -FormatData/sr/MonthNames/0=\u0458\u0430\u043d\u0443\u0430\u0440 -FormatData/sr/MonthNames/1=\u0444\u0435\u0431\u0440\u0443\u0430\u0440 -FormatData/sr/MonthNames/2=\u043c\u0430\u0440\u0442 -FormatData/sr/MonthNames/3=\u0430\u043f\u0440\u0438\u043b -FormatData/sr/MonthNames/4=\u043c\u0430\u0458 -FormatData/sr/MonthNames/5=\u0458\u0443\u043d -FormatData/sr/MonthNames/6=\u0458\u0443\u043b -FormatData/sr/MonthNames/7=\u0430\u0432\u0433\u0443\u0441\u0442 -FormatData/sr/MonthNames/8=\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440 -FormatData/sr/MonthNames/9=\u043e\u043a\u0442\u043e\u0431\u0430\u0440 -FormatData/sr/MonthNames/10=\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440 -FormatData/sr/MonthNames/11=\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440 -FormatData/sr/MonthAbbreviations/0=\u0458\u0430\u043d -FormatData/sr/MonthAbbreviations/1=\u0444\u0435\u0431 -FormatData/sr/MonthAbbreviations/2=\u043c\u0430\u0440 -FormatData/sr/MonthAbbreviations/3=\u0430\u043f\u0440 -FormatData/sr/MonthAbbreviations/4=\u043c\u0430\u0458 -FormatData/sr/MonthAbbreviations/5=\u0458\u0443\u043d -FormatData/sr/MonthAbbreviations/6=\u0458\u0443\u043b -FormatData/sr/MonthAbbreviations/7=\u0430\u0432\u0433 -FormatData/sr/MonthAbbreviations/8=\u0441\u0435\u043f -FormatData/sr/MonthAbbreviations/9=\u043e\u043a\u0442 -FormatData/sr/MonthAbbreviations/10=\u043d\u043e\u0432 -FormatData/sr/MonthAbbreviations/11=\u0434\u0435\u0446 -FormatData/sr/DayNames/0=\u043d\u0435\u0434\u0435\u0459\u0430 -FormatData/sr/DayNames/1=\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a -FormatData/sr/DayNames/2=\u0443\u0442\u043e\u0440\u0430\u043a -FormatData/sr/DayNames/3=\u0441\u0440\u0435\u0434\u0430 -FormatData/sr/DayNames/4=\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a -FormatData/sr/DayNames/5=\u043f\u0435\u0442\u0430\u043a -FormatData/sr/DayNames/6=\u0441\u0443\u0431\u043e\u0442\u0430 -FormatData/sr/DayAbbreviations/0=\u043d\u0435\u0434 -FormatData/sr/DayAbbreviations/1=\u043f\u043e\u043d -FormatData/sr/DayAbbreviations/2=\u0443\u0442\u043e -FormatData/sr/DayAbbreviations/3=\u0441\u0440\u0435 -FormatData/sr/DayAbbreviations/4=\u0447\u0435\u0442 -FormatData/sr/DayAbbreviations/5=\u043f\u0435\u0442 -FormatData/sr/DayAbbreviations/6=\u0441\u0443\u0431 -FormatData/sr/Eras/0=\u043f. \u043d. \u0435. -FormatData/sr/Eras/1=\u043d. \u0435 +FormatData/sr/MonthNames/0=јануар +FormatData/sr/MonthNames/1=фебруар +FormatData/sr/MonthNames/2=март +FormatData/sr/MonthNames/3=април +FormatData/sr/MonthNames/4=мај +FormatData/sr/MonthNames/5=јун +FormatData/sr/MonthNames/6=јул +FormatData/sr/MonthNames/7=август +FormatData/sr/MonthNames/8=септембар +FormatData/sr/MonthNames/9=октобар +FormatData/sr/MonthNames/10=новембар +FormatData/sr/MonthNames/11=децембар +FormatData/sr/MonthAbbreviations/0=јан +FormatData/sr/MonthAbbreviations/1=феб +FormatData/sr/MonthAbbreviations/2=мар +FormatData/sr/MonthAbbreviations/3=апр +FormatData/sr/MonthAbbreviations/4=мај +FormatData/sr/MonthAbbreviations/5=јун +FormatData/sr/MonthAbbreviations/6=јул +FormatData/sr/MonthAbbreviations/7=авг +FormatData/sr/MonthAbbreviations/8=сеп +FormatData/sr/MonthAbbreviations/9=окт +FormatData/sr/MonthAbbreviations/10=нов +FormatData/sr/MonthAbbreviations/11=дец +FormatData/sr/DayNames/0=недеља +FormatData/sr/DayNames/1=понедељак +FormatData/sr/DayNames/2=уторак +FormatData/sr/DayNames/3=среда +FormatData/sr/DayNames/4=четвртак +FormatData/sr/DayNames/5=петак +FormatData/sr/DayNames/6=субота +FormatData/sr/DayAbbreviations/0=нед +FormatData/sr/DayAbbreviations/1=пон +FormatData/sr/DayAbbreviations/2=уто +FormatData/sr/DayAbbreviations/3=сре +FormatData/sr/DayAbbreviations/4=чет +FormatData/sr/DayAbbreviations/5=пет +FormatData/sr/DayAbbreviations/6=суб +FormatData/sr/Eras/0=п. н. е. +FormatData/sr/Eras/1=н. е FormatData/sr/NumberPatterns/0=#,##0.### -FormatData/sr/NumberPatterns/1=\u00a4 #,##0.00 +FormatData/sr/NumberPatterns/1=¤ #,##0.00 FormatData/sr/NumberPatterns/2=#,##0% FormatData/sr/NumberElements/0=, FormatData/sr/NumberElements/1=. @@ -4348,8 +4348,8 @@ FormatData/sr/NumberElements/4=0 FormatData/sr/NumberElements/5=# FormatData/sr/NumberElements/6=- FormatData/sr/NumberElements/7=E -FormatData/sr/NumberElements/8=\u2030 -FormatData/sr/NumberElements/9=\u221e +FormatData/sr/NumberElements/8=‰ +FormatData/sr/NumberElements/9=∞ FormatData/sr/NumberElements/10=NaN FormatData/sr/TimePatterns/0=HH.mm.ss z FormatData/sr/TimePatterns/1=HH.mm.ss z @@ -4360,624 +4360,624 @@ FormatData/sr/DatePatterns/1=dd.MM.yyyy. FormatData/sr/DatePatterns/2=dd.MM.yyyy. FormatData/sr/DatePatterns/3=d.M.yy. FormatData/sr/DateTimePatterns/0={1} {0} -LocaleNames/sr/af=\u0430\u0444\u0440\u0438\u043a\u0430\u043d\u0441 -LocaleNames/sr/ar=\u0430\u0440\u0430\u043f\u0441\u043a\u0438 -LocaleNames/sr/be=\u0431\u0435\u043b\u043e\u0440\u0443\u0441\u043a\u0438 -LocaleNames/sr/bg=\u0431\u0443\u0433\u0430\u0440\u0441\u043a\u0438 -LocaleNames/sr/br=\u0431\u0440\u0435\u0442\u043e\u043d\u0441\u043a\u0438 -LocaleNames/sr/ca=\u043a\u0430\u0442\u0430\u043b\u043e\u043d\u0441\u043a\u0438 -LocaleNames/sr/co=\u043a\u043e\u0440\u0437\u0438\u043a\u0430\u043d\u0441\u043a\u0438 -LocaleNames/sr/cs=\u0447\u0435\u0448\u043a\u0438 -LocaleNames/sr/da=\u0434\u0430\u043d\u0441\u043a\u0438 -LocaleNames/sr/de=\u043d\u0435\u043c\u0430\u0447\u043a\u0438 -LocaleNames/sr/el=\u0433\u0440\u0447\u043a\u0438 -LocaleNames/sr/en=\u0435\u043d\u0433\u043b\u0435\u0441\u043a\u0438 -LocaleNames/sr/eo=\u0435\u0441\u043f\u0435\u0440\u0430\u043d\u0442\u043e -LocaleNames/sr/es=\u0448\u043f\u0430\u043d\u0441\u043a\u0438 -LocaleNames/sr/et=\u0435\u0441\u0442\u043e\u043d\u0441\u043a\u0438 -LocaleNames/sr/eu=\u0431\u0430\u0441\u043a\u0438\u0458\u0441\u043a\u0438 -LocaleNames/sr/fa=\u043f\u0435\u0440\u0441\u0438\u0458\u0441\u043a\u0438 -LocaleNames/sr/fi=\u0444\u0438\u043d\u0441\u043a\u0438 -LocaleNames/sr/fr=\u0444\u0440\u0430\u043d\u0446\u0443\u0441\u043a\u0438 -LocaleNames/sr/ga=\u0438\u0440\u0441\u043a\u0438 -LocaleNames/sr/he=\u0445\u0435\u0431\u0440\u0435\u0458\u0441\u043a\u0438 -LocaleNames/sr/hi=\u0445\u0438\u043d\u0434\u0438 -LocaleNames/sr/hr=\u0445\u0440\u0432\u0430\u0442\u0441\u043a\u0438 -LocaleNames/sr/hu=\u043c\u0430\u0452\u0430\u0440\u0441\u043a\u0438 -LocaleNames/sr/hy=\u0458\u0435\u0440\u043c\u0435\u043d\u0441\u043a\u0438 -LocaleNames/sr/id=\u0438\u043d\u0434\u043e\u043d\u0435\u0436\u0430\u043d\u0441\u043a\u0438 -LocaleNames/sr/in=\u0438\u043d\u0434\u043e\u043d\u0435\u0436\u0430\u043d\u0441\u043a\u0438 -LocaleNames/sr/is=\u0438\u0441\u043b\u0430\u043d\u0434\u0441\u043a\u0438 -LocaleNames/sr/it=\u0438\u0442\u0430\u043b\u0438\u0458\u0430\u043d\u0441\u043a\u0438 -LocaleNames/sr/iw=\u0445\u0435\u0431\u0440\u0435\u0458\u0441\u043a\u0438 -LocaleNames/sr/ja=\u0458\u0430\u043f\u0430\u043d\u0441\u043a\u0438 -LocaleNames/sr/ji=\u0458\u0438\u0434\u0438\u0448 -LocaleNames/sr/ka=\u0433\u0440\u0443\u0437\u0438\u0458\u0441\u043a\u0438 -LocaleNames/sr/km=\u043a\u043c\u0435\u0440\u0441\u043a\u0438 -LocaleNames/sr/ko=\u043a\u043e\u0440\u0435\u0458\u0441\u043a\u0438 -LocaleNames/sr/ku=\u043a\u0443\u0440\u0434\u0441\u043a\u0438 -LocaleNames/sr/ky=\u043a\u0438\u0440\u0433\u0438\u0441\u043a\u0438 -LocaleNames/sr/la=\u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438 -LocaleNames/sr/lt=\u043b\u0438\u0442\u0432\u0430\u043d\u0441\u043a\u0438 -LocaleNames/sr/lv=\u043b\u0435\u0442\u043e\u043d\u0441\u043a\u0438 -LocaleNames/sr/mk=\u043c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438 -LocaleNames/sr/mn=\u043c\u043e\u043d\u0433\u043e\u043b\u0441\u043a\u0438 -LocaleNames/sr/mo=\u041c\u043e\u043b\u0434\u0430\u0432\u0441\u043a\u0438 -LocaleNames/sr/my=\u0431\u0443\u0440\u043c\u0430\u043d\u0441\u043a\u0438 -LocaleNames/sr/nl=\u0445\u043e\u043b\u0430\u043d\u0434\u0441\u043a\u0438 -LocaleNames/sr/no=\u043d\u043e\u0440\u0432\u0435\u0448\u043a\u0438 -LocaleNames/sr/pl=\u043f\u043e\u0459\u0441\u043a\u0438 -LocaleNames/sr/pt=\u043f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0441\u043a\u0438 -LocaleNames/sr/rm=\u0440\u043e\u043c\u0430\u043d\u0448 -LocaleNames/sr/ro=\u0440\u0443\u043c\u0443\u043d\u0441\u043a\u0438 -LocaleNames/sr/ru=\u0440\u0443\u0441\u043a\u0438 -LocaleNames/sr/sa=\u0441\u0430\u043d\u0441\u043a\u0440\u0438\u0442 -LocaleNames/sr/sk=\u0441\u043b\u043e\u0432\u0430\u0447\u043a\u0438 -LocaleNames/sr/sl=\u0441\u043b\u043e\u0432\u0435\u043d\u0430\u0447\u043a\u0438 -LocaleNames/sr/sq=\u0430\u043b\u0431\u0430\u043d\u0441\u043a\u0438 -LocaleNames/sr/sr=\u0441\u0440\u043f\u0441\u043a\u0438 -LocaleNames/sr/sv=\u0448\u0432\u0435\u0434\u0441\u043a\u0438 -LocaleNames/sr/sw=\u0441\u0432\u0430\u0445\u0438\u043b\u0438 -LocaleNames/sr/tr=\u0442\u0443\u0440\u0441\u043a\u0438 -LocaleNames/sr/uk=\u0443\u043a\u0440\u0430\u0458\u0438\u043d\u0441\u043a\u0438 -LocaleNames/sr/vi=\u0432\u0438\u0458\u0435\u0442\u043d\u0430\u043c\u0441\u043a\u0438 -LocaleNames/sr/yi=\u0458\u0438\u0434\u0438\u0448 -LocaleNames/sr/zh=\u043a\u0438\u043d\u0435\u0441\u043a\u0438 -LocaleNames/sr/AD=\u0410\u043d\u0434\u043e\u0440\u0430 -LocaleNames/sr/AE=\u0423\u0458\u0435\u0434\u0438\u045a\u0435\u043d\u0438 \u0410\u0440\u0430\u043f\u0441\u043a\u0438 \u0415\u043c\u0438\u0440\u0430\u0442\u0438 -LocaleNames/sr/AF=\u0410\u0432\u0433\u0430\u043d\u0438\u0441\u0442\u0430\u043d -LocaleNames/sr/AL=\u0410\u043b\u0431\u0430\u043d\u0438\u0458\u0430 -LocaleNames/sr/AM=\u0408\u0435\u0440\u043c\u0435\u043d\u0438\u0458\u0430 -LocaleNames/sr/AN=\u0425\u043e\u043b\u0430\u043d\u0434\u0441\u043a\u0438 \u0410\u043d\u0442\u0438\u043b\u0438 -LocaleNames/sr/AO=\u0410\u043d\u0433\u043e\u043b\u0430 -LocaleNames/sr/AR=\u0410\u0440\u0433\u0435\u043d\u0442\u0438\u043d\u0430 -LocaleNames/sr/AT=\u0410\u0443\u0441\u0442\u0440\u0438\u0458\u0430 -LocaleNames/sr/AU=\u0410\u0443\u0441\u0442\u0440\u0430\u043b\u0438\u0458\u0430 -LocaleNames/sr/AW=\u0410\u0440\u0443\u0431\u0430 -LocaleNames/sr/AX=\u041e\u043b\u0430\u043d\u0434\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/AZ=\u0410\u0437\u0435\u0440\u0431\u0435\u0458\u045f\u0430\u043d -LocaleNames/sr/BA=\u0411\u043e\u0441\u043d\u0430 \u0438 \u0425\u0435\u0440\u0446\u0435\u0433\u043e\u0432\u0438\u043d\u0430 -LocaleNames/sr/BB=\u0411\u0430\u0440\u0431\u0430\u0434\u043e\u0441 -LocaleNames/sr/BD=\u0411\u0430\u043d\u0433\u043b\u0430\u0434\u0435\u0448 -LocaleNames/sr/BE=\u0411\u0435\u043b\u0433\u0438\u0458\u0430 -LocaleNames/sr/BF=\u0411\u0443\u0440\u043a\u0438\u043d\u0430 \u0424\u0430\u0441\u043e -LocaleNames/sr/BG=\u0411\u0443\u0433\u0430\u0440\u0441\u043a\u0430 -LocaleNames/sr/BH=\u0411\u0430\u0445\u0440\u0435\u0438\u043d -LocaleNames/sr/BI=\u0411\u0443\u0440\u0443\u043d\u0434\u0438 -LocaleNames/sr/BJ=\u0411\u0435\u043d\u0438\u043d -LocaleNames/sr/BM=\u0411\u0435\u0440\u043c\u0443\u0434\u0430 -LocaleNames/sr/BN=\u0411\u0440\u0443\u043d\u0435\u0458 -LocaleNames/sr/BO=\u0411\u043e\u043b\u0438\u0432\u0438\u0458\u0430 -LocaleNames/sr/BR=\u0411\u0440\u0430\u0437\u0438\u043b -LocaleNames/sr/BS=\u0411\u0430\u0445\u0430\u043c\u0438 -LocaleNames/sr/BT=\u0411\u0443\u0442\u0430\u043d -LocaleNames/sr/BV=\u041e\u0441\u0442\u0440\u0432\u043e \u0411\u0443\u0432\u0435 -LocaleNames/sr/BW=\u0411\u043e\u0446\u0432\u0430\u043d\u0430 -LocaleNames/sr/BY=\u0411\u0435\u043b\u043e\u0440\u0443\u0441\u0438\u0458\u0430 -LocaleNames/sr/BZ=\u0411\u0435\u043b\u0438\u0437\u0435 -LocaleNames/sr/CA=\u041a\u0430\u043d\u0430\u0434\u0430 -LocaleNames/sr/CC=\u041a\u043e\u043a\u043e\u0441\u043e\u0432\u0430 (\u041a\u0438\u043b\u0438\u043d\u0433\u043e\u0432\u0430) \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/CD=\u041a\u043e\u043d\u0433\u043e - \u041a\u0438\u043d\u0448\u0430\u0441\u0430 -LocaleNames/sr/CF=\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u043d\u043e\u0430\u0444\u0440\u0438\u0447\u043a\u0430 \u0420\u0435\u043f\u0443\u0431\u043b\u0438\u043a\u0430 -LocaleNames/sr/CG=\u041a\u043e\u043d\u0433\u043e - \u0411\u0440\u0430\u0437\u0430\u0432\u0438\u043b -LocaleNames/sr/CH=\u0428\u0432\u0430\u0458\u0446\u0430\u0440\u0441\u043a\u0430 -LocaleNames/sr/CI=\u041e\u0431\u0430\u043b\u0430 \u0421\u043b\u043e\u043d\u043e\u0432\u0430\u0447\u0435 (\u041a\u043e\u0442 \u0434\u2019\u0418\u0432\u043e\u0430\u0440) -LocaleNames/sr/CL=\u0427\u0438\u043b\u0435 -LocaleNames/sr/CM=\u041a\u0430\u043c\u0435\u0440\u0443\u043d -LocaleNames/sr/CN=\u041a\u0438\u043d\u0430 -LocaleNames/sr/CO=\u041a\u043e\u043b\u0443\u043c\u0431\u0438\u0458\u0430 -LocaleNames/sr/CR=\u041a\u043e\u0441\u0442\u0430\u0440\u0438\u043a\u0430 -LocaleNames/sr/CS=\u0421\u0440\u0431\u0438\u0458\u0430 \u0438 \u0426\u0440\u043d\u0430 \u0413\u043e\u0440\u0430 -LocaleNames/sr/CU=\u041a\u0443\u0431\u0430 -LocaleNames/sr/CV=\u0417\u0435\u043b\u0435\u043d\u043e\u0440\u0442\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/CX=\u0411\u043e\u0436\u0438\u045b\u043d\u043e \u041e\u0441\u0442\u0440\u0432\u043e -LocaleNames/sr/CY=\u041a\u0438\u043f\u0430\u0440 -LocaleNames/sr/CZ=\u0427\u0435\u0448\u043a\u0430 -LocaleNames/sr/DE=\u041d\u0435\u043c\u0430\u0447\u043a\u0430 -LocaleNames/sr/DJ=\u040f\u0438\u0431\u0443\u0442\u0438 -LocaleNames/sr/DK=\u0414\u0430\u043d\u0441\u043a\u0430 -LocaleNames/sr/DM=\u0414\u043e\u043c\u0438\u043d\u0438\u043a\u0430 -LocaleNames/sr/DO=\u0414\u043e\u043c\u0438\u043d\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u0420\u0435\u043f\u0443\u0431\u043b\u0438\u043a\u0430 -LocaleNames/sr/DZ=\u0410\u043b\u0436\u0438\u0440 -LocaleNames/sr/EC=\u0415\u043a\u0432\u0430\u0434\u043e\u0440 -LocaleNames/sr/EE=\u0415\u0441\u0442\u043e\u043d\u0438\u0458\u0430 -LocaleNames/sr/EG=\u0415\u0433\u0438\u043f\u0430\u0442 -LocaleNames/sr/EH=\u0417\u0430\u043f\u0430\u0434\u043d\u0430 \u0421\u0430\u0445\u0430\u0440\u0430 -LocaleNames/sr/ER=\u0415\u0440\u0438\u0442\u0440\u0435\u0458\u0430 -LocaleNames/sr/ES=\u0428\u043f\u0430\u043d\u0438\u0458\u0430 -LocaleNames/sr/ET=\u0415\u0442\u0438\u043e\u043f\u0438\u0458\u0430 -LocaleNames/sr/FI=\u0424\u0438\u043d\u0441\u043a\u0430 -LocaleNames/sr/FJ=\u0424\u0438\u045f\u0438 -LocaleNames/sr/FK=\u0424\u043e\u043a\u043b\u0430\u043d\u0434\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/FM=\u041c\u0438\u043a\u0440\u043e\u043d\u0435\u0437\u0438\u0458\u0430 -LocaleNames/sr/FO=\u0424\u0430\u0440\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/FR=\u0424\u0440\u0430\u043d\u0446\u0443\u0441\u043a\u0430 -LocaleNames/sr/GA=\u0413\u0430\u0431\u043e\u043d -LocaleNames/sr/GB=\u0423\u0458\u0435\u0434\u0438\u045a\u0435\u043d\u043e \u041a\u0440\u0430\u0459\u0435\u0432\u0441\u0442\u0432\u043e -LocaleNames/sr/GD=\u0413\u0440\u0435\u043d\u0430\u0434\u0430 -LocaleNames/sr/GE=\u0413\u0440\u0443\u0437\u0438\u0458\u0430 -LocaleNames/sr/GF=\u0424\u0440\u0430\u043d\u0446\u0443\u0441\u043a\u0430 \u0413\u0432\u0430\u0458\u0430\u043d\u0430 -LocaleNames/sr/GH=\u0413\u0430\u043d\u0430 -LocaleNames/sr/GI=\u0413\u0438\u0431\u0440\u0430\u043b\u0442\u0430\u0440 -LocaleNames/sr/GL=\u0413\u0440\u0435\u043d\u043b\u0430\u043d\u0434 -LocaleNames/sr/GM=\u0413\u0430\u043c\u0431\u0438\u0458\u0430 -LocaleNames/sr/GN=\u0413\u0432\u0438\u043d\u0435\u0458\u0430 -LocaleNames/sr/GP=\u0413\u0432\u0430\u0434\u0435\u043b\u0443\u043f -LocaleNames/sr/GQ=\u0415\u043a\u0432\u0430\u0442\u043e\u0440\u0438\u0458\u0430\u043b\u043d\u0430 \u0413\u0432\u0438\u043d\u0435\u0458\u0430 -LocaleNames/sr/GR=\u0413\u0440\u0447\u043a\u0430 -LocaleNames/sr/GS=\u0408\u0443\u0436\u043d\u0430 \u040f\u043e\u0440\u045f\u0438\u0458\u0430 \u0438 \u0408\u0443\u0436\u043d\u0430 \u0421\u0435\u043d\u0434\u0432\u0438\u0447\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/GT=\u0413\u0432\u0430\u0442\u0435\u043c\u0430\u043b\u0430 -LocaleNames/sr/GU=\u0413\u0443\u0430\u043c -LocaleNames/sr/GW=\u0413\u0432\u0438\u043d\u0435\u0458\u0430-\u0411\u0438\u0441\u0430\u043e -LocaleNames/sr/GY=\u0413\u0432\u0430\u0458\u0430\u043d\u0430 -LocaleNames/sr/HK=\u0421\u0410\u0420 \u0425\u043e\u043d\u0433\u043a\u043e\u043d\u0433 (\u041a\u0438\u043d\u0430) -LocaleNames/sr/HM=\u041e\u0441\u0442\u0440\u0432\u043e \u0425\u0435\u0440\u0434 \u0438 \u041c\u0435\u043a\u0434\u043e\u043d\u0430\u043b\u0434\u043e\u0432\u0430 \u043e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/HN=\u0425\u043e\u043d\u0434\u0443\u0440\u0430\u0441 -LocaleNames/sr/HR=\u0425\u0440\u0432\u0430\u0442\u0441\u043a\u0430 -LocaleNames/sr/HT=\u0425\u0430\u0438\u0442\u0438 -LocaleNames/sr/HU=\u041c\u0430\u0452\u0430\u0440\u0441\u043a\u0430 -LocaleNames/sr/ID=\u0418\u043d\u0434\u043e\u043d\u0435\u0437\u0438\u0458\u0430 -LocaleNames/sr/IE=\u0418\u0440\u0441\u043a\u0430 -LocaleNames/sr/IL=\u0418\u0437\u0440\u0430\u0435\u043b -LocaleNames/sr/IN=\u0418\u043d\u0434\u0438\u0458\u0430 -LocaleNames/sr/IQ=\u0418\u0440\u0430\u043a -LocaleNames/sr/IR=\u0418\u0440\u0430\u043d -LocaleNames/sr/IS=\u0418\u0441\u043b\u0430\u043d\u0434 -LocaleNames/sr/IT=\u0418\u0442\u0430\u043b\u0438\u0458\u0430 -LocaleNames/sr/JM=\u0408\u0430\u043c\u0430\u0458\u043a\u0430 -LocaleNames/sr/JO=\u0408\u043e\u0440\u0434\u0430\u043d -LocaleNames/sr/JP=\u0408\u0430\u043f\u0430\u043d -LocaleNames/sr/KE=\u041a\u0435\u043d\u0438\u0458\u0430 -LocaleNames/sr/KG=\u041a\u0438\u0440\u0433\u0438\u0441\u0442\u0430\u043d -LocaleNames/sr/KH=\u041a\u0430\u043c\u0431\u043e\u045f\u0430 -LocaleNames/sr/KI=\u041a\u0438\u0440\u0438\u0431\u0430\u0442\u0438 -LocaleNames/sr/KM=\u041a\u043e\u043c\u043e\u0440\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/KN=\u0421\u0435\u043d\u0442 \u041a\u0438\u0442\u0441 \u0438 \u041d\u0435\u0432\u0438\u0441 -LocaleNames/sr/KP=\u0421\u0435\u0432\u0435\u0440\u043d\u0430 \u041a\u043e\u0440\u0435\u0458\u0430 -LocaleNames/sr/KR=\u0408\u0443\u0436\u043d\u0430 \u041a\u043e\u0440\u0435\u0458\u0430 -LocaleNames/sr/KW=\u041a\u0443\u0432\u0430\u0458\u0442 -LocaleNames/sr/KY=\u041a\u0430\u0458\u043c\u0430\u043d\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/KZ=\u041a\u0430\u0437\u0430\u0445\u0441\u0442\u0430\u043d -LocaleNames/sr/LA=\u041b\u0430\u043e\u0441 -LocaleNames/sr/LB=\u041b\u0438\u0431\u0430\u043d -LocaleNames/sr/LC=\u0421\u0432\u0435\u0442\u0430 \u041b\u0443\u0446\u0438\u0458\u0430 -LocaleNames/sr/LI=\u041b\u0438\u0445\u0442\u0435\u043d\u0448\u0442\u0430\u0458\u043d -LocaleNames/sr/LK=\u0428\u0440\u0438 \u041b\u0430\u043d\u043a\u0430 -LocaleNames/sr/LR=\u041b\u0438\u0431\u0435\u0440\u0438\u0458\u0430 -LocaleNames/sr/LS=\u041b\u0435\u0441\u043e\u0442\u043e -LocaleNames/sr/LT=\u041b\u0438\u0442\u0432\u0430\u043d\u0438\u0458\u0430 -LocaleNames/sr/LU=\u041b\u0443\u043a\u0441\u0435\u043c\u0431\u0443\u0440\u0433 -LocaleNames/sr/LV=\u041b\u0435\u0442\u043e\u043d\u0438\u0458\u0430 -LocaleNames/sr/LY=\u041b\u0438\u0431\u0438\u0458\u0430 -LocaleNames/sr/MA=\u041c\u0430\u0440\u043e\u043a\u043e -LocaleNames/sr/MC=\u041c\u043e\u043d\u0430\u043a\u043e -LocaleNames/sr/MD=\u041c\u043e\u043b\u0434\u0430\u0432\u0438\u0458\u0430 -LocaleNames/sr/MG=\u041c\u0430\u0434\u0430\u0433\u0430\u0441\u043a\u0430\u0440 -LocaleNames/sr/MH=\u041c\u0430\u0440\u0448\u0430\u043b\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/MK=\u0421\u0435\u0432\u0435\u0440\u043d\u0430 \u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0438\u0458\u0430 -LocaleNames/sr/ML=\u041c\u0430\u043b\u0438 -LocaleNames/sr/MM=\u041c\u0438\u0458\u0430\u043d\u043c\u0430\u0440 (\u0411\u0443\u0440\u043c\u0430) -LocaleNames/sr/MN=\u041c\u043e\u043d\u0433\u043e\u043b\u0438\u0458\u0430 -LocaleNames/sr/MO=\u0421\u0410\u0420 \u041c\u0430\u043a\u0430\u043e (\u041a\u0438\u043d\u0430) -LocaleNames/sr/MP=\u0421\u0435\u0432\u0435\u0440\u043d\u0430 \u041c\u0430\u0440\u0438\u0458\u0430\u043d\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/MQ=\u041c\u0430\u0440\u0442\u0438\u043d\u0438\u043a -LocaleNames/sr/MR=\u041c\u0430\u0443\u0440\u0438\u0442\u0430\u043d\u0438\u0458\u0430 -LocaleNames/sr/MS=\u041c\u043e\u043d\u0441\u0435\u0440\u0430\u0442 -LocaleNames/sr/MT=\u041c\u0430\u043b\u0442\u0430 -LocaleNames/sr/MU=\u041c\u0430\u0443\u0440\u0438\u0446\u0438\u0458\u0443\u0441 -LocaleNames/sr/MV=\u041c\u0430\u043b\u0434\u0438\u0432\u0438 -LocaleNames/sr/MW=\u041c\u0430\u043b\u0430\u0432\u0438 -LocaleNames/sr/MX=\u041c\u0435\u043a\u0441\u0438\u043a\u043e -LocaleNames/sr/MY=\u041c\u0430\u043b\u0435\u0437\u0438\u0458\u0430 -LocaleNames/sr/MZ=\u041c\u043e\u0437\u0430\u043c\u0431\u0438\u043a -LocaleNames/sr/NA=\u041d\u0430\u043c\u0438\u0431\u0438\u0458\u0430 -LocaleNames/sr/NC=\u041d\u043e\u0432\u0430 \u041a\u0430\u043b\u0435\u0434\u043e\u043d\u0438\u0458\u0430 -LocaleNames/sr/NE=\u041d\u0438\u0433\u0435\u0440 -LocaleNames/sr/NF=\u041e\u0441\u0442\u0440\u0432\u043e \u041d\u043e\u0440\u0444\u043e\u043a -LocaleNames/sr/NG=\u041d\u0438\u0433\u0435\u0440\u0438\u0458\u0430 -LocaleNames/sr/NI=\u041d\u0438\u043a\u0430\u0440\u0430\u0433\u0432\u0430 -LocaleNames/sr/NL=\u0425\u043e\u043b\u0430\u043d\u0434\u0438\u0458\u0430 -LocaleNames/sr/NO=\u041d\u043e\u0440\u0432\u0435\u0448\u043a\u0430 -LocaleNames/sr/NP=\u041d\u0435\u043f\u0430\u043b -LocaleNames/sr/NR=\u041d\u0430\u0443\u0440\u0443 -LocaleNames/sr/NU=\u041d\u0438\u0443\u0435 -LocaleNames/sr/NZ=\u041d\u043e\u0432\u0438 \u0417\u0435\u043b\u0430\u043d\u0434 -LocaleNames/sr/OM=\u041e\u043c\u0430\u043d -LocaleNames/sr/PA=\u041f\u0430\u043d\u0430\u043c\u0430 -LocaleNames/sr/PE=\u041f\u0435\u0440\u0443 -LocaleNames/sr/PF=\u0424\u0440\u0430\u043d\u0446\u0443\u0441\u043a\u0430 \u041f\u043e\u043b\u0438\u043d\u0435\u0437\u0438\u0458\u0430 -LocaleNames/sr/PG=\u041f\u0430\u043f\u0443\u0430 \u041d\u043e\u0432\u0430 \u0413\u0432\u0438\u043d\u0435\u0458\u0430 -LocaleNames/sr/PH=\u0424\u0438\u043b\u0438\u043f\u0438\u043d\u0438 -LocaleNames/sr/PK=\u041f\u0430\u043a\u0438\u0441\u0442\u0430\u043d -LocaleNames/sr/PL=\u041f\u043e\u0459\u0441\u043a\u0430 -LocaleNames/sr/PM=\u0421\u0435\u043d \u041f\u0458\u0435\u0440 \u0438 \u041c\u0438\u043a\u0435\u043b\u043e\u043d -LocaleNames/sr/PN=\u041f\u0438\u0442\u043a\u0435\u0440\u043d -LocaleNames/sr/PR=\u041f\u043e\u0440\u0442\u043e\u0440\u0438\u043a\u043e -LocaleNames/sr/PS=\u041f\u0430\u043b\u0435\u0441\u0442\u0438\u043d\u0441\u043a\u0435 \u0442\u0435\u0440\u0438\u0442\u043e\u0440\u0438\u0458\u0435 -LocaleNames/sr/PT=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0438\u0458\u0430 -LocaleNames/sr/PW=\u041f\u0430\u043b\u0430\u0443 -LocaleNames/sr/PY=\u041f\u0430\u0440\u0430\u0433\u0432\u0430\u0458 -LocaleNames/sr/QA=\u041a\u0430\u0442\u0430\u0440 -LocaleNames/sr/RE=\u0420\u0435\u0438\u043d\u0438\u043e\u043d -LocaleNames/sr/RO=\u0420\u0443\u043c\u0443\u043d\u0438\u0458\u0430 -LocaleNames/sr/RU=\u0420\u0443\u0441\u0438\u0458\u0430 -LocaleNames/sr/RW=\u0420\u0443\u0430\u043d\u0434\u0430 -LocaleNames/sr/SA=\u0421\u0430\u0443\u0434\u0438\u0458\u0441\u043a\u0430 \u0410\u0440\u0430\u0431\u0438\u0458\u0430 -LocaleNames/sr/SB=\u0421\u043e\u043b\u043e\u043c\u043e\u043d\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/SC=\u0421\u0435\u0458\u0448\u0435\u043b\u0438 -LocaleNames/sr/SD=\u0421\u0443\u0434\u0430\u043d -LocaleNames/sr/SE=\u0428\u0432\u0435\u0434\u0441\u043a\u0430 -LocaleNames/sr/SG=\u0421\u0438\u043d\u0433\u0430\u043f\u0443\u0440 -LocaleNames/sr/SH=\u0421\u0432\u0435\u0442\u0430 \u0408\u0435\u043b\u0435\u043d\u0430 -LocaleNames/sr/SI=\u0421\u043b\u043e\u0432\u0435\u043d\u0438\u0458\u0430 -LocaleNames/sr/SJ=\u0421\u0432\u0430\u043b\u0431\u0430\u0440\u0434 \u0438 \u0408\u0430\u043d \u041c\u0430\u0458\u0435\u043d -LocaleNames/sr/SK=\u0421\u043b\u043e\u0432\u0430\u0447\u043a\u0430 -LocaleNames/sr/SL=\u0421\u0438\u0458\u0435\u0440\u0430 \u041b\u0435\u043e\u043d\u0435 -LocaleNames/sr/SM=\u0421\u0430\u043d \u041c\u0430\u0440\u0438\u043d\u043e -LocaleNames/sr/SN=\u0421\u0435\u043d\u0435\u0433\u0430\u043b -LocaleNames/sr/SO=\u0421\u043e\u043c\u0430\u043b\u0438\u0458\u0430 -LocaleNames/sr/SR=\u0421\u0443\u0440\u0438\u043d\u0430\u043c -LocaleNames/sr/ST=\u0421\u0430\u043e \u0422\u043e\u043c\u0435 \u0438 \u041f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 -LocaleNames/sr/SV=\u0421\u0430\u043b\u0432\u0430\u0434\u043e\u0440 -LocaleNames/sr/SY=\u0421\u0438\u0440\u0438\u0458\u0430 -LocaleNames/sr/TC=\u041e\u0441\u0442\u0440\u0432\u0430 \u0422\u0443\u0440\u043a\u0441 \u0438 \u041a\u0430\u0438\u043a\u043e\u0441 -LocaleNames/sr/TD=\u0427\u0430\u0434 -LocaleNames/sr/TF=\u0424\u0440\u0430\u043d\u0446\u0443\u0441\u043a\u0435 \u0408\u0443\u0436\u043d\u0435 \u0422\u0435\u0440\u0438\u0442\u043e\u0440\u0438\u0458\u0435 -LocaleNames/sr/TG=\u0422\u043e\u0433\u043e -LocaleNames/sr/TH=\u0422\u0430\u0458\u043b\u0430\u043d\u0434 -LocaleNames/sr/TJ=\u0422\u0430\u045f\u0438\u043a\u0438\u0441\u0442\u0430\u043d -LocaleNames/sr/TK=\u0422\u043e\u043a\u0435\u043b\u0430\u0443 -LocaleNames/sr/TL=\u0422\u0438\u043c\u043e\u0440-\u041b\u0435\u0441\u0442\u0435 (\u0418\u0441\u0442\u043e\u0447\u043d\u0438 \u0422\u0438\u043c\u043e\u0440) -LocaleNames/sr/TM=\u0422\u0443\u0440\u043a\u043c\u0435\u043d\u0438\u0441\u0442\u0430\u043d -LocaleNames/sr/TN=\u0422\u0443\u043d\u0438\u0441 -LocaleNames/sr/TO=\u0422\u043e\u043d\u0433\u0430 -LocaleNames/sr/TR=\u0422\u0443\u0440\u0441\u043a\u0430 -LocaleNames/sr/TT=\u0422\u0440\u0438\u043d\u0438\u0434\u0430\u0434 \u0438 \u0422\u043e\u0431\u0430\u0433\u043e -LocaleNames/sr/TV=\u0422\u0443\u0432\u0430\u043b\u0443 -LocaleNames/sr/TW=\u0422\u0430\u0458\u0432\u0430\u043d -LocaleNames/sr/TZ=\u0422\u0430\u043d\u0437\u0430\u043d\u0438\u0458\u0430 -LocaleNames/sr/UA=\u0423\u043a\u0440\u0430\u0458\u0438\u043d\u0430 -LocaleNames/sr/UG=\u0423\u0433\u0430\u043d\u0434\u0430 -LocaleNames/sr/UM=\u0423\u0434\u0430\u0459\u0435\u043d\u0430 \u043e\u0441\u0442\u0440\u0432\u0430 \u0421\u0410\u0414 -LocaleNames/sr/US=\u0421\u0458\u0435\u0434\u0438\u045a\u0435\u043d\u0435 \u0414\u0440\u0436\u0430\u0432\u0435 -LocaleNames/sr/UY=\u0423\u0440\u0443\u0433\u0432\u0430\u0458 -LocaleNames/sr/UZ=\u0423\u0437\u0431\u0435\u043a\u0438\u0441\u0442\u0430\u043d -LocaleNames/sr/VA=\u0412\u0430\u0442\u0438\u043a\u0430\u043d -LocaleNames/sr/VC=\u0421\u0435\u043d\u0442 \u0412\u0438\u043d\u0441\u0435\u043d\u0442 \u0438 \u0413\u0440\u0435\u043d\u0430\u0434\u0438\u043d\u0438 -LocaleNames/sr/VE=\u0412\u0435\u043d\u0435\u0446\u0443\u0435\u043b\u0430 -LocaleNames/sr/VG=\u0411\u0440\u0438\u0442\u0430\u043d\u0441\u043a\u0430 \u0414\u0435\u0432\u0438\u0447\u0430\u043d\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/VI=\u0410\u043c\u0435\u0440\u0438\u0447\u043a\u0430 \u0414\u0435\u0432\u0438\u0447\u0430\u043d\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/VN=\u0412\u0438\u0458\u0435\u0442\u043d\u0430\u043c -LocaleNames/sr/VU=\u0412\u0430\u043d\u0443\u0430\u0442\u0443 -LocaleNames/sr/WF=\u0412\u0430\u043b\u0438\u0441 \u0438 \u0424\u0443\u0442\u0443\u043d\u0430 -LocaleNames/sr/WS=\u0421\u0430\u043c\u043e\u0430 -LocaleNames/sr/YE=\u0408\u0435\u043c\u0435\u043d -LocaleNames/sr/YT=\u041c\u0430\u0458\u043e\u0442 -LocaleNames/sr/ZM=\u0417\u0430\u043c\u0431\u0438\u0458\u0430 -LocaleNames/sr/ZW=\u0417\u0438\u043c\u0431\u0430\u0431\u0432\u0435 +LocaleNames/sr/af=африканс +LocaleNames/sr/ar=арапски +LocaleNames/sr/be=белоруски +LocaleNames/sr/bg=бугарски +LocaleNames/sr/br=бретонски +LocaleNames/sr/ca=каталонски +LocaleNames/sr/co=корзикански +LocaleNames/sr/cs=чешки +LocaleNames/sr/da=дански +LocaleNames/sr/de=немачки +LocaleNames/sr/el=грчки +LocaleNames/sr/en=енглески +LocaleNames/sr/eo=есперанто +LocaleNames/sr/es=шпански +LocaleNames/sr/et=естонски +LocaleNames/sr/eu=баскијски +LocaleNames/sr/fa=персијски +LocaleNames/sr/fi=фински +LocaleNames/sr/fr=француски +LocaleNames/sr/ga=ирски +LocaleNames/sr/he=хебрејски +LocaleNames/sr/hi=хинди +LocaleNames/sr/hr=хрватски +LocaleNames/sr/hu=мађарски +LocaleNames/sr/hy=јерменски +LocaleNames/sr/id=индонежански +LocaleNames/sr/in=индонежански +LocaleNames/sr/is=исландски +LocaleNames/sr/it=италијански +LocaleNames/sr/iw=хебрејски +LocaleNames/sr/ja=јапански +LocaleNames/sr/ji=јидиш +LocaleNames/sr/ka=грузијски +LocaleNames/sr/km=кмерски +LocaleNames/sr/ko=корејски +LocaleNames/sr/ku=курдски +LocaleNames/sr/ky=киргиски +LocaleNames/sr/la=латински +LocaleNames/sr/lt=литвански +LocaleNames/sr/lv=летонски +LocaleNames/sr/mk=македонски +LocaleNames/sr/mn=монголски +LocaleNames/sr/mo=Молдавски +LocaleNames/sr/my=бурмански +LocaleNames/sr/nl=холандски +LocaleNames/sr/no=норвешки +LocaleNames/sr/pl=пољски +LocaleNames/sr/pt=португалски +LocaleNames/sr/rm=романш +LocaleNames/sr/ro=румунски +LocaleNames/sr/ru=руски +LocaleNames/sr/sa=санскрит +LocaleNames/sr/sk=словачки +LocaleNames/sr/sl=словеначки +LocaleNames/sr/sq=албански +LocaleNames/sr/sr=српски +LocaleNames/sr/sv=шведски +LocaleNames/sr/sw=свахили +LocaleNames/sr/tr=турски +LocaleNames/sr/uk=украјински +LocaleNames/sr/vi=вијетнамски +LocaleNames/sr/yi=јидиш +LocaleNames/sr/zh=кинески +LocaleNames/sr/AD=Андора +LocaleNames/sr/AE=Уједињени Арапски Емирати +LocaleNames/sr/AF=Авганистан +LocaleNames/sr/AL=Албанија +LocaleNames/sr/AM=Јерменија +LocaleNames/sr/AN=Холандски Антили +LocaleNames/sr/AO=Ангола +LocaleNames/sr/AR=Аргентина +LocaleNames/sr/AT=Аустрија +LocaleNames/sr/AU=Аустралија +LocaleNames/sr/AW=Аруба +LocaleNames/sr/AX=Оландска Острва +LocaleNames/sr/AZ=Азербејџан +LocaleNames/sr/BA=Босна и Херцеговина +LocaleNames/sr/BB=Барбадос +LocaleNames/sr/BD=Бангладеш +LocaleNames/sr/BE=Белгија +LocaleNames/sr/BF=Буркина Фасо +LocaleNames/sr/BG=Бугарска +LocaleNames/sr/BH=Бахреин +LocaleNames/sr/BI=Бурунди +LocaleNames/sr/BJ=Бенин +LocaleNames/sr/BM=Бермуда +LocaleNames/sr/BN=Брунеј +LocaleNames/sr/BO=Боливија +LocaleNames/sr/BR=Бразил +LocaleNames/sr/BS=Бахами +LocaleNames/sr/BT=Бутан +LocaleNames/sr/BV=Острво Буве +LocaleNames/sr/BW=Боцвана +LocaleNames/sr/BY=Белорусија +LocaleNames/sr/BZ=Белизе +LocaleNames/sr/CA=Канада +LocaleNames/sr/CC=Кокосова (Килингова) Острва +LocaleNames/sr/CD=Конго - Киншаса +LocaleNames/sr/CF=Централноафричка Република +LocaleNames/sr/CG=Конго - Бразавил +LocaleNames/sr/CH=Швајцарска +LocaleNames/sr/CI=Обала Слоноваче (Кот д’Ивоар) +LocaleNames/sr/CL=Чиле +LocaleNames/sr/CM=Камерун +LocaleNames/sr/CN=Кина +LocaleNames/sr/CO=Колумбија +LocaleNames/sr/CR=Костарика +LocaleNames/sr/CS=Србија и Црна Гора +LocaleNames/sr/CU=Куба +LocaleNames/sr/CV=Зеленортска Острва +LocaleNames/sr/CX=Божићно Острво +LocaleNames/sr/CY=Кипар +LocaleNames/sr/CZ=Чешка +LocaleNames/sr/DE=Немачка +LocaleNames/sr/DJ=Џибути +LocaleNames/sr/DK=Данска +LocaleNames/sr/DM=Доминика +LocaleNames/sr/DO=Доминиканска Република +LocaleNames/sr/DZ=Алжир +LocaleNames/sr/EC=Еквадор +LocaleNames/sr/EE=Естонија +LocaleNames/sr/EG=Египат +LocaleNames/sr/EH=Западна Сахара +LocaleNames/sr/ER=Еритреја +LocaleNames/sr/ES=Шпанија +LocaleNames/sr/ET=Етиопија +LocaleNames/sr/FI=Финска +LocaleNames/sr/FJ=Фиџи +LocaleNames/sr/FK=Фокландска Острва +LocaleNames/sr/FM=Микронезија +LocaleNames/sr/FO=Фарска Острва +LocaleNames/sr/FR=Француска +LocaleNames/sr/GA=Габон +LocaleNames/sr/GB=Уједињено Краљевство +LocaleNames/sr/GD=Гренада +LocaleNames/sr/GE=Грузија +LocaleNames/sr/GF=Француска Гвајана +LocaleNames/sr/GH=Гана +LocaleNames/sr/GI=Гибралтар +LocaleNames/sr/GL=Гренланд +LocaleNames/sr/GM=Гамбија +LocaleNames/sr/GN=Гвинеја +LocaleNames/sr/GP=Гваделуп +LocaleNames/sr/GQ=Екваторијална Гвинеја +LocaleNames/sr/GR=Грчка +LocaleNames/sr/GS=Јужна Џорџија и Јужна Сендвичка Острва +LocaleNames/sr/GT=Гватемала +LocaleNames/sr/GU=Гуам +LocaleNames/sr/GW=Гвинеја-Бисао +LocaleNames/sr/GY=Гвајана +LocaleNames/sr/HK=САР Хонгконг (Кина) +LocaleNames/sr/HM=Острво Херд и Мекдоналдова острва +LocaleNames/sr/HN=Хондурас +LocaleNames/sr/HR=Хрватска +LocaleNames/sr/HT=Хаити +LocaleNames/sr/HU=Мађарска +LocaleNames/sr/ID=Индонезија +LocaleNames/sr/IE=Ирска +LocaleNames/sr/IL=Израел +LocaleNames/sr/IN=Индија +LocaleNames/sr/IQ=Ирак +LocaleNames/sr/IR=Иран +LocaleNames/sr/IS=Исланд +LocaleNames/sr/IT=Италија +LocaleNames/sr/JM=Јамајка +LocaleNames/sr/JO=Јордан +LocaleNames/sr/JP=Јапан +LocaleNames/sr/KE=Кенија +LocaleNames/sr/KG=Киргистан +LocaleNames/sr/KH=Камбоџа +LocaleNames/sr/KI=Кирибати +LocaleNames/sr/KM=Коморска Острва +LocaleNames/sr/KN=Сент Китс и Невис +LocaleNames/sr/KP=Северна Кореја +LocaleNames/sr/KR=Јужна Кореја +LocaleNames/sr/KW=Кувајт +LocaleNames/sr/KY=Кајманска Острва +LocaleNames/sr/KZ=Казахстан +LocaleNames/sr/LA=Лаос +LocaleNames/sr/LB=Либан +LocaleNames/sr/LC=Света Луција +LocaleNames/sr/LI=Лихтенштајн +LocaleNames/sr/LK=Шри Ланка +LocaleNames/sr/LR=Либерија +LocaleNames/sr/LS=Лесото +LocaleNames/sr/LT=Литванија +LocaleNames/sr/LU=Луксембург +LocaleNames/sr/LV=Летонија +LocaleNames/sr/LY=Либија +LocaleNames/sr/MA=Мароко +LocaleNames/sr/MC=Монако +LocaleNames/sr/MD=Молдавија +LocaleNames/sr/MG=Мадагаскар +LocaleNames/sr/MH=Маршалска Острва +LocaleNames/sr/MK=Северна Македонија +LocaleNames/sr/ML=Мали +LocaleNames/sr/MM=Мијанмар (Бурма) +LocaleNames/sr/MN=Монголија +LocaleNames/sr/MO=САР Макао (Кина) +LocaleNames/sr/MP=Северна Маријанска Острва +LocaleNames/sr/MQ=Мартиник +LocaleNames/sr/MR=Мауританија +LocaleNames/sr/MS=Монсерат +LocaleNames/sr/MT=Малта +LocaleNames/sr/MU=Маурицијус +LocaleNames/sr/MV=Малдиви +LocaleNames/sr/MW=Малави +LocaleNames/sr/MX=Мексико +LocaleNames/sr/MY=Малезија +LocaleNames/sr/MZ=Мозамбик +LocaleNames/sr/NA=Намибија +LocaleNames/sr/NC=Нова Каледонија +LocaleNames/sr/NE=Нигер +LocaleNames/sr/NF=Острво Норфок +LocaleNames/sr/NG=Нигерија +LocaleNames/sr/NI=Никарагва +LocaleNames/sr/NL=Холандија +LocaleNames/sr/NO=Норвешка +LocaleNames/sr/NP=Непал +LocaleNames/sr/NR=Науру +LocaleNames/sr/NU=Ниуе +LocaleNames/sr/NZ=Нови Зеланд +LocaleNames/sr/OM=Оман +LocaleNames/sr/PA=Панама +LocaleNames/sr/PE=Перу +LocaleNames/sr/PF=Француска Полинезија +LocaleNames/sr/PG=Папуа Нова Гвинеја +LocaleNames/sr/PH=Филипини +LocaleNames/sr/PK=Пакистан +LocaleNames/sr/PL=Пољска +LocaleNames/sr/PM=Сен Пјер и Микелон +LocaleNames/sr/PN=Питкерн +LocaleNames/sr/PR=Порторико +LocaleNames/sr/PS=Палестинске територије +LocaleNames/sr/PT=Португалија +LocaleNames/sr/PW=Палау +LocaleNames/sr/PY=Парагвај +LocaleNames/sr/QA=Катар +LocaleNames/sr/RE=Реинион +LocaleNames/sr/RO=Румунија +LocaleNames/sr/RU=Русија +LocaleNames/sr/RW=Руанда +LocaleNames/sr/SA=Саудијска Арабија +LocaleNames/sr/SB=Соломонска Острва +LocaleNames/sr/SC=Сејшели +LocaleNames/sr/SD=Судан +LocaleNames/sr/SE=Шведска +LocaleNames/sr/SG=Сингапур +LocaleNames/sr/SH=Света Јелена +LocaleNames/sr/SI=Словенија +LocaleNames/sr/SJ=Свалбард и Јан Мајен +LocaleNames/sr/SK=Словачка +LocaleNames/sr/SL=Сијера Леоне +LocaleNames/sr/SM=Сан Марино +LocaleNames/sr/SN=Сенегал +LocaleNames/sr/SO=Сомалија +LocaleNames/sr/SR=Суринам +LocaleNames/sr/ST=Сао Томе и Принципе +LocaleNames/sr/SV=Салвадор +LocaleNames/sr/SY=Сирија +LocaleNames/sr/TC=Острва Туркс и Каикос +LocaleNames/sr/TD=Чад +LocaleNames/sr/TF=Француске Јужне Територије +LocaleNames/sr/TG=Того +LocaleNames/sr/TH=Тајланд +LocaleNames/sr/TJ=Таџикистан +LocaleNames/sr/TK=Токелау +LocaleNames/sr/TL=Тимор-Лесте (Источни Тимор) +LocaleNames/sr/TM=Туркменистан +LocaleNames/sr/TN=Тунис +LocaleNames/sr/TO=Тонга +LocaleNames/sr/TR=Турска +LocaleNames/sr/TT=Тринидад и Тобаго +LocaleNames/sr/TV=Тувалу +LocaleNames/sr/TW=Тајван +LocaleNames/sr/TZ=Танзанија +LocaleNames/sr/UA=Украјина +LocaleNames/sr/UG=Уганда +LocaleNames/sr/UM=Удаљена острва САД +LocaleNames/sr/US=Сједињене Државе +LocaleNames/sr/UY=Уругвај +LocaleNames/sr/UZ=Узбекистан +LocaleNames/sr/VA=Ватикан +LocaleNames/sr/VC=Сент Винсент и Гренадини +LocaleNames/sr/VE=Венецуела +LocaleNames/sr/VG=Британска Девичанска Острва +LocaleNames/sr/VI=Америчка Девичанска Острва +LocaleNames/sr/VN=Вијетнам +LocaleNames/sr/VU=Вануату +LocaleNames/sr/WF=Валис и Футуна +LocaleNames/sr/WS=Самоа +LocaleNames/sr/YE=Јемен +LocaleNames/sr/YT=Мајот +LocaleNames/sr/ZM=Замбија +LocaleNames/sr/ZW=Зимбабве CalendarData/sr/firstDayOfWeek=2 -CurrencyNames/sr_CS/EUR=\u20ac +CurrencyNames/sr_CS/EUR=€ # bug 6498742: data is changed -CurrencyNames/sr_BA/BAM=\u041a\u041c. +CurrencyNames/sr_BA/BAM=КМ. -CurrencyNames/sr_BA/EUR=\u20ac +CurrencyNames/sr_BA/EUR=€ # bug #6351682 Country name for Korean is wrong in Simplified Chinese -LocaleNames/zh/KP=\u671d\u9c9c -LocaleNames/zh/KR=\u97e9\u56fd +LocaleNames/zh/KP=朝鲜 +LocaleNames/zh/KR=韩国 # bug 6379382: Finnish time of day should be formatted as "H.mm.ss", not "hh:mm:ss" FormatData/fi/TimePatterns/0=H.mm.ss z FormatData/fi/TimePatterns/1='klo 'H.mm.ss # bug 6455680 Update locale data derived from CLDR1.3 to CLDR1.4 -LocaleNames/pt/CS=S\u00e9rvia e Montenegro +LocaleNames/pt/CS=Sérvia e Montenegro # bug 6498742: data for IR & ZW changed -LocaleNames/pt_PT/IR=Ir\u00e3 -LocaleNames/pt_PT/ZW=Zimb\u00e1bue - -LocaleNames/el/ar=\u0391\u03c1\u03b1\u03b2\u03b9\u03ba\u03ac -LocaleNames/el/be=\u039b\u03b5\u03c5\u03ba\u03bf\u03c1\u03c9\u03c3\u03b9\u03ba\u03ac -LocaleNames/el/bg=\u0392\u03bf\u03c5\u03bb\u03b3\u03b1\u03c1\u03b9\u03ba\u03ac -LocaleNames/el/bn=\u0392\u03b5\u03b3\u03b3\u03b1\u03bb\u03b9\u03ba\u03ac -LocaleNames/el/bo=\u0398\u03b9\u03b2\u03b5\u03c4\u03b9\u03b1\u03bd\u03ac -LocaleNames/el/bs=\u0392\u03bf\u03c3\u03bd\u03b9\u03b1\u03ba\u03ac -LocaleNames/el/ca=\u039a\u03b1\u03c4\u03b1\u03bb\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/co=\u039a\u03bf\u03c1\u03c3\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/cs=\u03a4\u03c3\u03b5\u03c7\u03b9\u03ba\u03ac -LocaleNames/el/cy=\u039f\u03c5\u03b1\u03bb\u03b9\u03ba\u03ac -LocaleNames/el/da=\u0394\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/de=\u0393\u03b5\u03c1\u03bc\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/el=\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/en=\u0391\u03b3\u03b3\u03bb\u03b9\u03ba\u03ac -LocaleNames/el/es=\u0399\u03c3\u03c0\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/et=\u0395\u03c3\u03b8\u03bf\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/eu=\u0392\u03b1\u03c3\u03ba\u03b9\u03ba\u03ac -LocaleNames/el/fa=\u03a0\u03b5\u03c1\u03c3\u03b9\u03ba\u03ac -LocaleNames/el/fi=\u03a6\u03b9\u03bd\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac -LocaleNames/el/fr=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ac -LocaleNames/el/ga=\u0399\u03c1\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac -LocaleNames/el/gd=\u03a3\u03ba\u03c9\u03c4\u03b9\u03ba\u03ac \u039a\u03b5\u03bb\u03c4\u03b9\u03ba\u03ac -LocaleNames/el/he=\u0395\u03b2\u03c1\u03b1\u03ca\u03ba\u03ac -LocaleNames/el/hi=\u03a7\u03af\u03bd\u03c4\u03b9 -LocaleNames/el/hr=\u039a\u03c1\u03bf\u03b1\u03c4\u03b9\u03ba\u03ac -LocaleNames/el/hu=\u039f\u03c5\u03b3\u03b3\u03c1\u03b9\u03ba\u03ac -LocaleNames/el/hy=\u0391\u03c1\u03bc\u03b5\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/id=\u0399\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03b9\u03b1\u03ba\u03ac -LocaleNames/el/in=\u0399\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03b9\u03b1\u03ba\u03ac -LocaleNames/el/is=\u0399\u03c3\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac -LocaleNames/el/it=\u0399\u03c4\u03b1\u03bb\u03b9\u03ba\u03ac -LocaleNames/el/iw=\u0395\u03b2\u03c1\u03b1\u03ca\u03ba\u03ac -LocaleNames/el/ja=\u0399\u03b1\u03c0\u03c9\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/ji=\u0393\u03af\u03bd\u03c4\u03b9\u03c2 -LocaleNames/el/ka=\u0393\u03b5\u03c9\u03c1\u03b3\u03b9\u03b1\u03bd\u03ac -LocaleNames/el/ko=\u039a\u03bf\u03c1\u03b5\u03b1\u03c4\u03b9\u03ba\u03ac -LocaleNames/el/la=\u039b\u03b1\u03c4\u03b9\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/lt=\u039b\u03b9\u03b8\u03bf\u03c5\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/lv=\u039b\u03b5\u03c4\u03bf\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/mk=\u03a3\u03bb\u03b1\u03b2\u03bf\u03bc\u03b1\u03ba\u03b5\u03b4\u03bf\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/mn=\u039c\u03bf\u03b3\u03b3\u03bf\u03bb\u03b9\u03ba\u03ac -LocaleNames/el/mo=\u039c\u03bf\u03bb\u03b4\u03b1\u03b2\u03b9\u03ba\u03ac -LocaleNames/el/mt=\u039c\u03b1\u03bb\u03c4\u03b5\u03b6\u03b9\u03ba\u03ac -LocaleNames/el/no=\u039d\u03bf\u03c1\u03b2\u03b7\u03b3\u03b9\u03ba\u03ac -LocaleNames/el/pl=\u03a0\u03bf\u03bb\u03c9\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/pt=\u03a0\u03bf\u03c1\u03c4\u03bf\u03b3\u03b1\u03bb\u03b9\u03ba\u03ac -LocaleNames/el/ro=\u03a1\u03bf\u03c5\u03bc\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/ru=\u03a1\u03c9\u03c3\u03b9\u03ba\u03ac -LocaleNames/el/sk=\u03a3\u03bb\u03bf\u03b2\u03b1\u03ba\u03b9\u03ba\u03ac -LocaleNames/el/sl=\u03a3\u03bb\u03bf\u03b2\u03b5\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/sq=\u0391\u03bb\u03b2\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/sr=\u03a3\u03b5\u03c1\u03b2\u03b9\u03ba\u03ac -LocaleNames/el/sv=\u03a3\u03bf\u03c5\u03b7\u03b4\u03b9\u03ba\u03ac -LocaleNames/el/th=\u03a4\u03b1\u03ca\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac -LocaleNames/el/tr=\u03a4\u03bf\u03c5\u03c1\u03ba\u03b9\u03ba\u03ac -LocaleNames/el/uk=\u039f\u03c5\u03ba\u03c1\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/vi=\u0392\u03b9\u03b5\u03c4\u03bd\u03b1\u03bc\u03b9\u03ba\u03ac -LocaleNames/el/yi=\u0393\u03af\u03bd\u03c4\u03b9\u03c2 -LocaleNames/el/zh=\u039a\u03b9\u03bd\u03b5\u03b6\u03b9\u03ba\u03ac -LocaleNames/el/AD=\u0391\u03bd\u03b4\u03cc\u03c1\u03b1 -LocaleNames/el/AE=\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03b1 \u0391\u03c1\u03b1\u03b2\u03b9\u03ba\u03ac \u0395\u03bc\u03b9\u03c1\u03ac\u03c4\u03b1 -LocaleNames/el/AF=\u0391\u03c6\u03b3\u03b1\u03bd\u03b9\u03c3\u03c4\u03ac\u03bd -LocaleNames/el/AG=\u0391\u03bd\u03c4\u03af\u03b3\u03ba\u03bf\u03c5\u03b1 \u03ba\u03b1\u03b9 \u039c\u03c0\u03b1\u03c1\u03bc\u03c0\u03bf\u03cd\u03bd\u03c4\u03b1 -LocaleNames/el/AI=\u0391\u03bd\u03b3\u03ba\u03bf\u03c5\u03af\u03bb\u03b1 -LocaleNames/el/AL=\u0391\u03bb\u03b2\u03b1\u03bd\u03af\u03b1 -LocaleNames/el/AM=\u0391\u03c1\u03bc\u03b5\u03bd\u03af\u03b1 -LocaleNames/el/AN=\u039f\u03bb\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ad\u03c2 \u0391\u03bd\u03c4\u03af\u03bb\u03bb\u03b5\u03c2 -LocaleNames/el/AO=\u0391\u03b3\u03ba\u03cc\u03bb\u03b1 -LocaleNames/el/AQ=\u0391\u03bd\u03c4\u03b1\u03c1\u03ba\u03c4\u03b9\u03ba\u03ae -LocaleNames/el/AR=\u0391\u03c1\u03b3\u03b5\u03bd\u03c4\u03b9\u03bd\u03ae -LocaleNames/el/AS=\u0391\u03bc\u03b5\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ae \u03a3\u03b1\u03bc\u03cc\u03b1 -LocaleNames/el/AT=\u0391\u03c5\u03c3\u03c4\u03c1\u03af\u03b1 -LocaleNames/el/AU=\u0391\u03c5\u03c3\u03c4\u03c1\u03b1\u03bb\u03af\u03b1 -LocaleNames/el/AW=\u0391\u03c1\u03bf\u03cd\u03bc\u03c0\u03b1 -LocaleNames/el/AX=\u039d\u03ae\u03c3\u03bf\u03b9 \u038c\u03bb\u03b1\u03bd\u03c4 -LocaleNames/el/AZ=\u0391\u03b6\u03b5\u03c1\u03bc\u03c0\u03b1\u03ca\u03c4\u03b6\u03ac\u03bd -LocaleNames/el/BA=\u0392\u03bf\u03c3\u03bd\u03af\u03b1 - \u0395\u03c1\u03b6\u03b5\u03b3\u03bf\u03b2\u03af\u03bd\u03b7 -LocaleNames/el/BB=\u039c\u03c0\u03b1\u03c1\u03bc\u03c0\u03ad\u03b9\u03bd\u03c4\u03bf\u03c2 -LocaleNames/el/BD=\u039c\u03c0\u03b1\u03bd\u03b3\u03ba\u03bb\u03b1\u03bd\u03c4\u03ad\u03c2 -LocaleNames/el/BE=\u0392\u03ad\u03bb\u03b3\u03b9\u03bf -LocaleNames/el/BF=\u039c\u03c0\u03bf\u03c5\u03c1\u03ba\u03af\u03bd\u03b1 \u03a6\u03ac\u03c3\u03bf -LocaleNames/el/BG=\u0392\u03bf\u03c5\u03bb\u03b3\u03b1\u03c1\u03af\u03b1 -LocaleNames/el/BH=\u039c\u03c0\u03b1\u03c7\u03c1\u03ad\u03b9\u03bd -LocaleNames/el/BI=\u039c\u03c0\u03bf\u03c5\u03c1\u03bf\u03cd\u03bd\u03c4\u03b9 -LocaleNames/el/BJ=\u039c\u03c0\u03b5\u03bd\u03af\u03bd -LocaleNames/el/BM=\u0392\u03b5\u03c1\u03bc\u03bf\u03cd\u03b4\u03b5\u03c2 -LocaleNames/el/BN=\u039c\u03c0\u03c1\u03bf\u03c5\u03bd\u03ad\u03b9 -LocaleNames/el/BO=\u0392\u03bf\u03bb\u03b9\u03b2\u03af\u03b1 -LocaleNames/el/BR=\u0392\u03c1\u03b1\u03b6\u03b9\u03bb\u03af\u03b1 -LocaleNames/el/BS=\u039c\u03c0\u03b1\u03c7\u03ac\u03bc\u03b5\u03c2 -LocaleNames/el/BT=\u039c\u03c0\u03bf\u03c5\u03c4\u03ac\u03bd -LocaleNames/el/BV=\u039d\u03ae\u03c3\u03bf\u03c2 \u039c\u03c0\u03bf\u03c5\u03b2\u03ad -LocaleNames/el/BW=\u039c\u03c0\u03bf\u03c4\u03c3\u03bf\u03c5\u03ac\u03bd\u03b1 -LocaleNames/el/BY=\u039b\u03b5\u03c5\u03ba\u03bf\u03c1\u03c9\u03c3\u03af\u03b1 -LocaleNames/el/BZ=\u039c\u03c0\u03b5\u03bb\u03af\u03b6 -LocaleNames/el/CA=\u039a\u03b1\u03bd\u03b1\u03b4\u03ac\u03c2 -LocaleNames/el/CC=\u039d\u03ae\u03c3\u03bf\u03b9 \u039a\u03cc\u03ba\u03bf\u03c2 (\u039a\u03af\u03bb\u03b9\u03bd\u03b3\u03ba) -LocaleNames/el/CD=\u039a\u03bf\u03bd\u03b3\u03ba\u03cc - \u039a\u03b9\u03bd\u03c3\u03ac\u03c3\u03b1 -LocaleNames/el/CF=\u039a\u03b5\u03bd\u03c4\u03c1\u03bf\u03b1\u03c6\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ae \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1 -LocaleNames/el/CG=\u039a\u03bf\u03bd\u03b3\u03ba\u03cc - \u039c\u03c0\u03c1\u03b1\u03b6\u03b1\u03b2\u03af\u03bb -LocaleNames/el/CH=\u0395\u03bb\u03b2\u03b5\u03c4\u03af\u03b1 -LocaleNames/el/CI=\u0391\u03ba\u03c4\u03ae \u0395\u03bb\u03b5\u03c6\u03b1\u03bd\u03c4\u03bf\u03c3\u03c4\u03bf\u03cd -LocaleNames/el/CK=\u039d\u03ae\u03c3\u03bf\u03b9 \u039a\u03bf\u03c5\u03ba -LocaleNames/el/CL=\u03a7\u03b9\u03bb\u03ae -LocaleNames/el/CM=\u039a\u03b1\u03bc\u03b5\u03c1\u03bf\u03cd\u03bd -LocaleNames/el/CN=\u039a\u03af\u03bd\u03b1 -LocaleNames/el/CO=\u039a\u03bf\u03bb\u03bf\u03bc\u03b2\u03af\u03b1 -LocaleNames/el/CR=\u039a\u03cc\u03c3\u03c4\u03b1 \u03a1\u03af\u03ba\u03b1 -LocaleNames/el/CS=\u03a3\u03b5\u03c1\u03b2\u03af\u03b1 \u03ba\u03b1\u03b9 \u039c\u03b1\u03c5\u03c1\u03bf\u03b2\u03bf\u03cd\u03bd\u03b9\u03bf -LocaleNames/el/CU=\u039a\u03bf\u03cd\u03b2\u03b1 -LocaleNames/el/CV=\u03a0\u03c1\u03ac\u03c3\u03b9\u03bd\u03bf \u0391\u03ba\u03c1\u03c9\u03c4\u03ae\u03c1\u03b9\u03bf -LocaleNames/el/CX=\u039d\u03ae\u03c3\u03bf\u03c2 \u03c4\u03c9\u03bd \u03a7\u03c1\u03b9\u03c3\u03c4\u03bf\u03c5\u03b3\u03ad\u03bd\u03bd\u03c9\u03bd -LocaleNames/el/CY=\u039a\u03cd\u03c0\u03c1\u03bf\u03c2 -LocaleNames/el/CZ=\u03a4\u03c3\u03b5\u03c7\u03af\u03b1 -LocaleNames/el/DE=\u0393\u03b5\u03c1\u03bc\u03b1\u03bd\u03af\u03b1 -LocaleNames/el/DJ=\u03a4\u03b6\u03b9\u03bc\u03c0\u03bf\u03c5\u03c4\u03af -LocaleNames/el/DK=\u0394\u03b1\u03bd\u03af\u03b1 -LocaleNames/el/DM=\u039d\u03c4\u03bf\u03bc\u03af\u03bd\u03b9\u03ba\u03b1 -LocaleNames/el/DO=\u0394\u03bf\u03bc\u03b9\u03bd\u03b9\u03ba\u03b1\u03bd\u03ae \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1 -LocaleNames/el/DZ=\u0391\u03bb\u03b3\u03b5\u03c1\u03af\u03b1 -LocaleNames/el/EC=\u0399\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03cc\u03c2 -LocaleNames/el/EE=\u0395\u03c3\u03b8\u03bf\u03bd\u03af\u03b1 -LocaleNames/el/EG=\u0391\u03af\u03b3\u03c5\u03c0\u03c4\u03bf\u03c2 -LocaleNames/el/EH=\u0394\u03c5\u03c4\u03b9\u03ba\u03ae \u03a3\u03b1\u03c7\u03ac\u03c1\u03b1 -LocaleNames/el/ER=\u0395\u03c1\u03c5\u03b8\u03c1\u03b1\u03af\u03b1 -LocaleNames/el/ES=\u0399\u03c3\u03c0\u03b1\u03bd\u03af\u03b1 -LocaleNames/el/ET=\u0391\u03b9\u03b8\u03b9\u03bf\u03c0\u03af\u03b1 -LocaleNames/el/FI=\u03a6\u03b9\u03bd\u03bb\u03b1\u03bd\u03b4\u03af\u03b1 -LocaleNames/el/FJ=\u03a6\u03af\u03c4\u03b6\u03b9 -LocaleNames/el/FK=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a6\u03cc\u03ba\u03bb\u03b1\u03bd\u03c4 -LocaleNames/el/FM=\u039c\u03b9\u03ba\u03c1\u03bf\u03bd\u03b7\u03c3\u03af\u03b1 -LocaleNames/el/FO=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a6\u03b5\u03c1\u03cc\u03b5\u03c2 -LocaleNames/el/FR=\u0393\u03b1\u03bb\u03bb\u03af\u03b1 -LocaleNames/el/GA=\u0393\u03ba\u03b1\u03bc\u03c0\u03cc\u03bd -LocaleNames/el/GB=\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03bf \u0392\u03b1\u03c3\u03af\u03bb\u03b5\u03b9\u03bf -LocaleNames/el/GD=\u0393\u03c1\u03b5\u03bd\u03ac\u03b4\u03b1 -LocaleNames/el/GE=\u0393\u03b5\u03c9\u03c1\u03b3\u03af\u03b1 -LocaleNames/el/GF=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ae \u0393\u03bf\u03c5\u03b9\u03ac\u03bd\u03b1 -LocaleNames/el/GH=\u0393\u03ba\u03ac\u03bd\u03b1 -LocaleNames/el/GI=\u0393\u03b9\u03b2\u03c1\u03b1\u03bb\u03c4\u03ac\u03c1 -LocaleNames/el/GL=\u0393\u03c1\u03bf\u03b9\u03bb\u03b1\u03bd\u03b4\u03af\u03b1 -LocaleNames/el/GM=\u0393\u03ba\u03ac\u03bc\u03c0\u03b9\u03b1 -LocaleNames/el/GN=\u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1 -LocaleNames/el/GP=\u0393\u03bf\u03c5\u03b1\u03b4\u03b5\u03bb\u03bf\u03cd\u03c0\u03b7 -LocaleNames/el/GQ=\u0399\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03ae \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1 -LocaleNames/el/GS=\u039d\u03ae\u03c3\u03bf\u03b9 \u039d\u03cc\u03c4\u03b9\u03b1 \u0393\u03b5\u03c9\u03c1\u03b3\u03af\u03b1 \u03ba\u03b1\u03b9 \u039d\u03cc\u03c4\u03b9\u03b5\u03c2 \u03a3\u03ac\u03bd\u03c4\u03bf\u03c5\u03b9\u03c4\u03c2 -LocaleNames/el/GT=\u0393\u03bf\u03c5\u03b1\u03c4\u03b5\u03bc\u03ac\u03bb\u03b1 -LocaleNames/el/GU=\u0393\u03ba\u03bf\u03c5\u03ac\u03bc -LocaleNames/el/GW=\u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1 \u039c\u03c0\u03b9\u03c3\u03ac\u03bf\u03c5 -LocaleNames/el/GY=\u0393\u03bf\u03c5\u03b9\u03ac\u03bd\u03b1 -LocaleNames/el/HK=\u03a7\u03bf\u03bd\u03b3\u03ba \u039a\u03bf\u03bd\u03b3\u03ba \u0395\u0394\u03a0 \u039a\u03af\u03bd\u03b1\u03c2 -LocaleNames/el/HM=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a7\u03b5\u03c1\u03bd\u03c4 \u03ba\u03b1\u03b9 \u039c\u03b1\u03ba\u03bd\u03c4\u03cc\u03bd\u03b1\u03bb\u03bd\u03c4 -LocaleNames/el/HN=\u039f\u03bd\u03b4\u03bf\u03cd\u03c1\u03b1 -LocaleNames/el/HR=\u039a\u03c1\u03bf\u03b1\u03c4\u03af\u03b1 -LocaleNames/el/HT=\u0391\u03ca\u03c4\u03ae -LocaleNames/el/HU=\u039f\u03c5\u03b3\u03b3\u03b1\u03c1\u03af\u03b1 -LocaleNames/el/ID=\u0399\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03af\u03b1 -LocaleNames/el/IE=\u0399\u03c1\u03bb\u03b1\u03bd\u03b4\u03af\u03b1 -LocaleNames/el/IL=\u0399\u03c3\u03c1\u03b1\u03ae\u03bb -LocaleNames/el/IN=\u0399\u03bd\u03b4\u03af\u03b1 -LocaleNames/el/IO=\u0392\u03c1\u03b5\u03c4\u03b1\u03bd\u03b9\u03ba\u03ac \u0395\u03b4\u03ac\u03c6\u03b7 \u0399\u03bd\u03b4\u03b9\u03ba\u03bf\u03cd \u03a9\u03ba\u03b5\u03b1\u03bd\u03bf\u03cd -LocaleNames/el/IQ=\u0399\u03c1\u03ac\u03ba -LocaleNames/el/IR=\u0399\u03c1\u03ac\u03bd -LocaleNames/el/IS=\u0399\u03c3\u03bb\u03b1\u03bd\u03b4\u03af\u03b1 -LocaleNames/el/IT=\u0399\u03c4\u03b1\u03bb\u03af\u03b1 -LocaleNames/el/JM=\u03a4\u03b6\u03b1\u03bc\u03ac\u03b9\u03ba\u03b1 -LocaleNames/el/JO=\u0399\u03bf\u03c1\u03b4\u03b1\u03bd\u03af\u03b1 -LocaleNames/el/JP=\u0399\u03b1\u03c0\u03c9\u03bd\u03af\u03b1 -LocaleNames/el/KE=\u039a\u03ad\u03bd\u03c5\u03b1 -LocaleNames/el/KG=\u039a\u03b9\u03c1\u03b3\u03b9\u03c3\u03c4\u03ac\u03bd -LocaleNames/el/KH=\u039a\u03b1\u03bc\u03c0\u03cc\u03c4\u03b6\u03b7 -LocaleNames/el/KI=\u039a\u03b9\u03c1\u03b9\u03bc\u03c0\u03ac\u03c4\u03b9 -LocaleNames/el/KM=\u039a\u03bf\u03bc\u03cc\u03c1\u03b5\u03c2 -LocaleNames/el/KN=\u03a3\u03b5\u03bd \u039a\u03b9\u03c4\u03c2 \u03ba\u03b1\u03b9 \u039d\u03ad\u03b2\u03b9\u03c2 -LocaleNames/el/KP=\u0392\u03cc\u03c1\u03b5\u03b9\u03b1 \u039a\u03bf\u03c1\u03ad\u03b1 -LocaleNames/el/KR=\u039d\u03cc\u03c4\u03b9\u03b1 \u039a\u03bf\u03c1\u03ad\u03b1 -LocaleNames/el/KW=\u039a\u03bf\u03c5\u03b2\u03ad\u03b9\u03c4 -LocaleNames/el/KY=\u039d\u03ae\u03c3\u03bf\u03b9 \u039a\u03ad\u03b9\u03bc\u03b1\u03bd -LocaleNames/el/KZ=\u039a\u03b1\u03b6\u03b1\u03ba\u03c3\u03c4\u03ac\u03bd -LocaleNames/el/LA=\u039b\u03ac\u03bf\u03c2 -LocaleNames/el/LB=\u039b\u03af\u03b2\u03b1\u03bd\u03bf\u03c2 -LocaleNames/el/LC=\u0391\u03b3\u03af\u03b1 \u039b\u03bf\u03c5\u03ba\u03af\u03b1 -LocaleNames/el/LI=\u039b\u03b9\u03c7\u03c4\u03b5\u03bd\u03c3\u03c4\u03ac\u03b9\u03bd -LocaleNames/el/LK=\u03a3\u03c1\u03b9 \u039b\u03ac\u03bd\u03ba\u03b1 -LocaleNames/el/LR=\u039b\u03b9\u03b2\u03b5\u03c1\u03af\u03b1 -LocaleNames/el/LS=\u039b\u03b5\u03c3\u03cc\u03c4\u03bf -LocaleNames/el/LT=\u039b\u03b9\u03b8\u03bf\u03c5\u03b1\u03bd\u03af\u03b1 -LocaleNames/el/LU=\u039b\u03bf\u03c5\u03be\u03b5\u03bc\u03b2\u03bf\u03cd\u03c1\u03b3\u03bf -LocaleNames/el/LV=\u039b\u03b5\u03c4\u03bf\u03bd\u03af\u03b1 -LocaleNames/el/LY=\u039b\u03b9\u03b2\u03cd\u03b7 -LocaleNames/el/MA=\u039c\u03b1\u03c1\u03cc\u03ba\u03bf -LocaleNames/el/MC=\u039c\u03bf\u03bd\u03b1\u03ba\u03cc -LocaleNames/el/MD=\u039c\u03bf\u03bb\u03b4\u03b1\u03b2\u03af\u03b1 -LocaleNames/el/MG=\u039c\u03b1\u03b4\u03b1\u03b3\u03b1\u03c3\u03ba\u03ac\u03c1\u03b7 -LocaleNames/el/MH=\u039d\u03ae\u03c3\u03bf\u03b9 \u039c\u03ac\u03c1\u03c3\u03b1\u03bb -LocaleNames/el/MK=\u0392\u03cc\u03c1\u03b5\u03b9\u03b1 \u039c\u03b1\u03ba\u03b5\u03b4\u03bf\u03bd\u03af\u03b1 -LocaleNames/el/ML=\u039c\u03ac\u03bb\u03b9 -LocaleNames/el/MM=\u039c\u03b9\u03b1\u03bd\u03bc\u03ac\u03c1 (\u0392\u03b9\u03c1\u03bc\u03b1\u03bd\u03af\u03b1) -LocaleNames/el/MN=\u039c\u03bf\u03b3\u03b3\u03bf\u03bb\u03af\u03b1 -LocaleNames/el/MO=\u039c\u03b1\u03ba\u03ac\u03bf \u0395\u0394\u03a0 \u039a\u03af\u03bd\u03b1\u03c2 -LocaleNames/el/MP=\u039d\u03ae\u03c3\u03bf\u03b9 \u0392\u03cc\u03c1\u03b5\u03b9\u03b5\u03c2 \u039c\u03b1\u03c1\u03b9\u03ac\u03bd\u03b5\u03c2 -LocaleNames/el/MQ=\u039c\u03b1\u03c1\u03c4\u03b9\u03bd\u03af\u03ba\u03b1 -LocaleNames/el/MR=\u039c\u03b1\u03c5\u03c1\u03b9\u03c4\u03b1\u03bd\u03af\u03b1 -LocaleNames/el/MS=\u039c\u03bf\u03bd\u03c3\u03b5\u03c1\u03ac\u03c4 -LocaleNames/el/MT=\u039c\u03ac\u03bb\u03c4\u03b1 -LocaleNames/el/MU=\u039c\u03b1\u03c5\u03c1\u03af\u03ba\u03b9\u03bf\u03c2 -LocaleNames/el/MV=\u039c\u03b1\u03bb\u03b4\u03af\u03b2\u03b5\u03c2 -LocaleNames/el/MW=\u039c\u03b1\u03bb\u03ac\u03bf\u03c5\u03b9 -LocaleNames/el/MX=\u039c\u03b5\u03be\u03b9\u03ba\u03cc -LocaleNames/el/MY=\u039c\u03b1\u03bb\u03b1\u03b9\u03c3\u03af\u03b1 -LocaleNames/el/MZ=\u039c\u03bf\u03b6\u03b1\u03bc\u03b2\u03af\u03ba\u03b7 -LocaleNames/el/NA=\u039d\u03b1\u03bc\u03af\u03bc\u03c0\u03b9\u03b1 -LocaleNames/el/NC=\u039d\u03ad\u03b1 \u039a\u03b1\u03bb\u03b7\u03b4\u03bf\u03bd\u03af\u03b1 -LocaleNames/el/NE=\u039d\u03af\u03b3\u03b7\u03c1\u03b1\u03c2 -LocaleNames/el/NF=\u039d\u03ae\u03c3\u03bf\u03c2 \u039d\u03cc\u03c1\u03c6\u03bf\u03bb\u03ba -LocaleNames/el/NG=\u039d\u03b9\u03b3\u03b7\u03c1\u03af\u03b1 -LocaleNames/el/NI=\u039d\u03b9\u03ba\u03b1\u03c1\u03ac\u03b3\u03bf\u03c5\u03b1 -LocaleNames/el/NL=\u039f\u03bb\u03bb\u03b1\u03bd\u03b4\u03af\u03b1 -LocaleNames/el/NO=\u039d\u03bf\u03c1\u03b2\u03b7\u03b3\u03af\u03b1 -LocaleNames/el/NP=\u039d\u03b5\u03c0\u03ac\u03bb -LocaleNames/el/NR=\u039d\u03b1\u03bf\u03c5\u03c1\u03bf\u03cd -LocaleNames/el/NU=\u039d\u03b9\u03bf\u03cd\u03b5 -LocaleNames/el/NZ=\u039d\u03ad\u03b1 \u0396\u03b7\u03bb\u03b1\u03bd\u03b4\u03af\u03b1 -LocaleNames/el/OM=\u039f\u03bc\u03ac\u03bd -LocaleNames/el/PA=\u03a0\u03b1\u03bd\u03b1\u03bc\u03ac\u03c2 -LocaleNames/el/PE=\u03a0\u03b5\u03c1\u03bf\u03cd -LocaleNames/el/PF=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ae \u03a0\u03bf\u03bb\u03c5\u03bd\u03b7\u03c3\u03af\u03b1 -LocaleNames/el/PG=\u03a0\u03b1\u03c0\u03bf\u03cd\u03b1 \u039d\u03ad\u03b1 \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1 -LocaleNames/el/PH=\u03a6\u03b9\u03bb\u03b9\u03c0\u03c0\u03af\u03bd\u03b5\u03c2 -LocaleNames/el/PK=\u03a0\u03b1\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd -LocaleNames/el/PL=\u03a0\u03bf\u03bb\u03c9\u03bd\u03af\u03b1 -LocaleNames/el/PM=\u03a3\u03b5\u03bd \u03a0\u03b9\u03b5\u03c1 \u03ba\u03b1\u03b9 \u039c\u03b9\u03ba\u03b5\u03bb\u03cc\u03bd -LocaleNames/el/PN=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a0\u03af\u03c4\u03ba\u03b5\u03c1\u03bd -LocaleNames/el/PR=\u03a0\u03bf\u03c5\u03ad\u03c1\u03c4\u03bf \u03a1\u03af\u03ba\u03bf -LocaleNames/el/PS=\u03a0\u03b1\u03bb\u03b1\u03b9\u03c3\u03c4\u03b9\u03bd\u03b9\u03b1\u03ba\u03ac \u0395\u03b4\u03ac\u03c6\u03b7 -LocaleNames/el/PT=\u03a0\u03bf\u03c1\u03c4\u03bf\u03b3\u03b1\u03bb\u03af\u03b1 -LocaleNames/el/PW=\u03a0\u03b1\u03bb\u03ac\u03bf\u03c5 -LocaleNames/el/PY=\u03a0\u03b1\u03c1\u03b1\u03b3\u03bf\u03c5\u03ac\u03b7 -LocaleNames/el/QA=\u039a\u03b1\u03c4\u03ac\u03c1 -LocaleNames/el/RE=\u03a1\u03b5\u03ca\u03bd\u03b9\u03cc\u03bd -LocaleNames/el/RO=\u03a1\u03bf\u03c5\u03bc\u03b1\u03bd\u03af\u03b1 -LocaleNames/el/RU=\u03a1\u03c9\u03c3\u03af\u03b1 -LocaleNames/el/RW=\u03a1\u03bf\u03c5\u03ac\u03bd\u03c4\u03b1 -LocaleNames/el/SA=\u03a3\u03b1\u03bf\u03c5\u03b4\u03b9\u03ba\u03ae \u0391\u03c1\u03b1\u03b2\u03af\u03b1 -LocaleNames/el/SB=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a3\u03bf\u03bb\u03bf\u03bc\u03ce\u03bd\u03c4\u03bf\u03c2 -LocaleNames/el/SC=\u03a3\u03b5\u03cb\u03c7\u03ad\u03bb\u03bb\u03b5\u03c2 -LocaleNames/el/SD=\u03a3\u03bf\u03c5\u03b4\u03ac\u03bd -LocaleNames/el/SE=\u03a3\u03bf\u03c5\u03b7\u03b4\u03af\u03b1 -LocaleNames/el/SG=\u03a3\u03b9\u03b3\u03ba\u03b1\u03c0\u03bf\u03cd\u03c1\u03b7 -LocaleNames/el/SH=\u0391\u03b3\u03af\u03b1 \u0395\u03bb\u03ad\u03bd\u03b7 -LocaleNames/el/SI=\u03a3\u03bb\u03bf\u03b2\u03b5\u03bd\u03af\u03b1 -LocaleNames/el/SJ=\u03a3\u03b2\u03ac\u03bb\u03bc\u03c0\u03b1\u03c1\u03bd\u03c4 \u03ba\u03b1\u03b9 \u0393\u03b9\u03b1\u03bd \u039c\u03b1\u03b3\u03b9\u03ad\u03bd -LocaleNames/el/SK=\u03a3\u03bb\u03bf\u03b2\u03b1\u03ba\u03af\u03b1 -LocaleNames/el/SL=\u03a3\u03b9\u03ad\u03c1\u03b1 \u039b\u03b5\u03cc\u03bd\u03b5 -LocaleNames/el/SM=\u0386\u03b3\u03b9\u03bf\u03c2 \u039c\u03b1\u03c1\u03af\u03bd\u03bf\u03c2 -LocaleNames/el/SN=\u03a3\u03b5\u03bd\u03b5\u03b3\u03ac\u03bb\u03b7 -LocaleNames/el/SO=\u03a3\u03bf\u03bc\u03b1\u03bb\u03af\u03b1 -LocaleNames/el/SR=\u03a3\u03bf\u03c5\u03c1\u03b9\u03bd\u03ac\u03bc -LocaleNames/el/ST=\u03a3\u03ac\u03bf \u03a4\u03bf\u03bc\u03ad \u03ba\u03b1\u03b9 \u03a0\u03c1\u03af\u03bd\u03c3\u03b9\u03c0\u03b5 -LocaleNames/el/SV=\u0395\u03bb \u03a3\u03b1\u03bb\u03b2\u03b1\u03b4\u03cc\u03c1 -LocaleNames/el/SY=\u03a3\u03c5\u03c1\u03af\u03b1 -LocaleNames/el/TC=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a4\u03b5\u03c1\u03ba\u03c2 \u03ba\u03b1\u03b9 \u039a\u03ac\u03b9\u03ba\u03bf\u03c2 -LocaleNames/el/TD=\u03a4\u03c3\u03b1\u03bd\u03c4 -LocaleNames/el/TF=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ac \u039d\u03cc\u03c4\u03b9\u03b1 \u0395\u03b4\u03ac\u03c6\u03b7 -LocaleNames/el/TG=\u03a4\u03cc\u03b3\u03ba\u03bf -LocaleNames/el/TH=\u03a4\u03b1\u03ca\u03bb\u03ac\u03bd\u03b4\u03b7 -LocaleNames/el/TJ=\u03a4\u03b1\u03c4\u03b6\u03b9\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd -LocaleNames/el/TK=\u03a4\u03bf\u03ba\u03b5\u03bb\u03ac\u03bf\u03c5 -LocaleNames/el/TL=\u03a4\u03b9\u03bc\u03cc\u03c1-\u039b\u03ad\u03c3\u03c4\u03b5 -LocaleNames/el/TM=\u03a4\u03bf\u03c5\u03c1\u03ba\u03bc\u03b5\u03bd\u03b9\u03c3\u03c4\u03ac\u03bd -LocaleNames/el/TN=\u03a4\u03c5\u03bd\u03b7\u03c3\u03af\u03b1 -LocaleNames/el/TO=\u03a4\u03cc\u03bd\u03b3\u03ba\u03b1 -LocaleNames/el/TR=\u03a4\u03bf\u03c5\u03c1\u03ba\u03af\u03b1 -LocaleNames/el/TT=\u03a4\u03c1\u03b9\u03bd\u03b9\u03bd\u03c4\u03ac\u03bd\u03c4 \u03ba\u03b1\u03b9 \u03a4\u03bf\u03bc\u03c0\u03ac\u03b3\u03ba\u03bf -LocaleNames/el/TV=\u03a4\u03bf\u03c5\u03b2\u03b1\u03bb\u03bf\u03cd -LocaleNames/el/TW=\u03a4\u03b1\u03ca\u03b2\u03ac\u03bd -LocaleNames/el/TZ=\u03a4\u03b1\u03bd\u03b6\u03b1\u03bd\u03af\u03b1 -LocaleNames/el/UA=\u039f\u03c5\u03ba\u03c1\u03b1\u03bd\u03af\u03b1 -LocaleNames/el/UG=\u039f\u03c5\u03b3\u03ba\u03ac\u03bd\u03c4\u03b1 -LocaleNames/el/UM=\u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b5\u03c2 \u039d\u03b7\u03c3\u03af\u03b4\u03b5\u03c2 \u0397\u03a0\u0391 -LocaleNames/el/US=\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03b5\u03c2 \u03a0\u03bf\u03bb\u03b9\u03c4\u03b5\u03af\u03b5\u03c2 -LocaleNames/el/UY=\u039f\u03c5\u03c1\u03bf\u03c5\u03b3\u03bf\u03c5\u03ac\u03b7 -LocaleNames/el/UZ=\u039f\u03c5\u03b6\u03bc\u03c0\u03b5\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd -LocaleNames/el/VA=\u0392\u03b1\u03c4\u03b9\u03ba\u03b1\u03bd\u03cc -LocaleNames/el/VC=\u0386\u03b3\u03b9\u03bf\u03c2 \u0392\u03b9\u03ba\u03ad\u03bd\u03c4\u03b9\u03bf\u03c2 \u03ba\u03b1\u03b9 \u0393\u03c1\u03b5\u03bd\u03b1\u03b4\u03af\u03bd\u03b5\u03c2 -LocaleNames/el/VE=\u0392\u03b5\u03bd\u03b5\u03b6\u03bf\u03c5\u03ad\u03bb\u03b1 -LocaleNames/el/VG=\u0392\u03c1\u03b5\u03c4\u03b1\u03bd\u03b9\u03ba\u03ad\u03c2 \u03a0\u03b1\u03c1\u03b8\u03ad\u03bd\u03b5\u03c2 \u039d\u03ae\u03c3\u03bf\u03b9 -LocaleNames/el/VI=\u0391\u03bc\u03b5\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ad\u03c2 \u03a0\u03b1\u03c1\u03b8\u03ad\u03bd\u03b5\u03c2 \u039d\u03ae\u03c3\u03bf\u03b9 -LocaleNames/el/VN=\u0392\u03b9\u03b5\u03c4\u03bd\u03ac\u03bc -LocaleNames/el/VU=\u0392\u03b1\u03bd\u03bf\u03c5\u03ac\u03c4\u03bf\u03c5 -LocaleNames/el/WF=\u0393\u03bf\u03c5\u03ac\u03bb\u03b9\u03c2 \u03ba\u03b1\u03b9 \u03a6\u03bf\u03c5\u03c4\u03bf\u03cd\u03bd\u03b1 -LocaleNames/el/WS=\u03a3\u03b1\u03bc\u03cc\u03b1 -LocaleNames/el/YE=\u03a5\u03b5\u03bc\u03ad\u03bd\u03b7 -LocaleNames/el/YT=\u039c\u03b1\u03b3\u03b9\u03cc\u03c4 -LocaleNames/el/ZA=\u039d\u03cc\u03c4\u03b9\u03b1 \u0391\u03c6\u03c1\u03b9\u03ba\u03ae -LocaleNames/el/ZM=\u0396\u03ac\u03bc\u03c0\u03b9\u03b1 -LocaleNames/el/ZW=\u0396\u03b9\u03bc\u03c0\u03ac\u03bc\u03c0\u03bf\u03c5\u03b5 +LocaleNames/pt_PT/IR=Irã +LocaleNames/pt_PT/ZW=Zimbábue + +LocaleNames/el/ar=Αραβικά +LocaleNames/el/be=Λευκορωσικά +LocaleNames/el/bg=Βουλγαρικά +LocaleNames/el/bn=Βεγγαλικά +LocaleNames/el/bo=Θιβετιανά +LocaleNames/el/bs=Βοσνιακά +LocaleNames/el/ca=Καταλανικά +LocaleNames/el/co=Κορσικανικά +LocaleNames/el/cs=Τσεχικά +LocaleNames/el/cy=Ουαλικά +LocaleNames/el/da=Δανικά +LocaleNames/el/de=Γερμανικά +LocaleNames/el/el=Ελληνικά +LocaleNames/el/en=Αγγλικά +LocaleNames/el/es=Ισπανικά +LocaleNames/el/et=Εσθονικά +LocaleNames/el/eu=Βασκικά +LocaleNames/el/fa=Περσικά +LocaleNames/el/fi=Φινλανδικά +LocaleNames/el/fr=Γαλλικά +LocaleNames/el/ga=Ιρλανδικά +LocaleNames/el/gd=Σκωτικά Κελτικά +LocaleNames/el/he=Εβραϊκά +LocaleNames/el/hi=Χίντι +LocaleNames/el/hr=Κροατικά +LocaleNames/el/hu=Ουγγρικά +LocaleNames/el/hy=Αρμενικά +LocaleNames/el/id=Ινδονησιακά +LocaleNames/el/in=Ινδονησιακά +LocaleNames/el/is=Ισλανδικά +LocaleNames/el/it=Ιταλικά +LocaleNames/el/iw=Εβραϊκά +LocaleNames/el/ja=Ιαπωνικά +LocaleNames/el/ji=Γίντις +LocaleNames/el/ka=Γεωργιανά +LocaleNames/el/ko=Κορεατικά +LocaleNames/el/la=Λατινικά +LocaleNames/el/lt=Λιθουανικά +LocaleNames/el/lv=Λετονικά +LocaleNames/el/mk=Σλαβομακεδονικά +LocaleNames/el/mn=Μογγολικά +LocaleNames/el/mo=Μολδαβικά +LocaleNames/el/mt=Μαλτεζικά +LocaleNames/el/no=Νορβηγικά +LocaleNames/el/pl=Πολωνικά +LocaleNames/el/pt=Πορτογαλικά +LocaleNames/el/ro=Ρουμανικά +LocaleNames/el/ru=Ρωσικά +LocaleNames/el/sk=Σλοβακικά +LocaleNames/el/sl=Σλοβενικά +LocaleNames/el/sq=Αλβανικά +LocaleNames/el/sr=Σερβικά +LocaleNames/el/sv=Σουηδικά +LocaleNames/el/th=Ταϊλανδικά +LocaleNames/el/tr=Τουρκικά +LocaleNames/el/uk=Ουκρανικά +LocaleNames/el/vi=Βιετναμικά +LocaleNames/el/yi=Γίντις +LocaleNames/el/zh=Κινεζικά +LocaleNames/el/AD=Ανδόρα +LocaleNames/el/AE=Ηνωμένα Αραβικά Εμιράτα +LocaleNames/el/AF=Αφγανιστάν +LocaleNames/el/AG=Αντίγκουα και Μπαρμπούντα +LocaleNames/el/AI=Ανγκουίλα +LocaleNames/el/AL=Αλβανία +LocaleNames/el/AM=Αρμενία +LocaleNames/el/AN=Ολλανδικές Αντίλλες +LocaleNames/el/AO=Αγκόλα +LocaleNames/el/AQ=Ανταρκτική +LocaleNames/el/AR=Αργεντινή +LocaleNames/el/AS=Αμερικανική Σαμόα +LocaleNames/el/AT=Αυστρία +LocaleNames/el/AU=Αυστραλία +LocaleNames/el/AW=Αρούμπα +LocaleNames/el/AX=Νήσοι Όλαντ +LocaleNames/el/AZ=Αζερμπαϊτζάν +LocaleNames/el/BA=Βοσνία - Ερζεγοβίνη +LocaleNames/el/BB=Μπαρμπέιντος +LocaleNames/el/BD=Μπανγκλαντές +LocaleNames/el/BE=Βέλγιο +LocaleNames/el/BF=Μπουρκίνα Φάσο +LocaleNames/el/BG=Βουλγαρία +LocaleNames/el/BH=Μπαχρέιν +LocaleNames/el/BI=Μπουρούντι +LocaleNames/el/BJ=Μπενίν +LocaleNames/el/BM=Βερμούδες +LocaleNames/el/BN=Μπρουνέι +LocaleNames/el/BO=Βολιβία +LocaleNames/el/BR=Βραζιλία +LocaleNames/el/BS=Μπαχάμες +LocaleNames/el/BT=Μπουτάν +LocaleNames/el/BV=Νήσος Μπουβέ +LocaleNames/el/BW=Μποτσουάνα +LocaleNames/el/BY=Λευκορωσία +LocaleNames/el/BZ=Μπελίζ +LocaleNames/el/CA=Καναδάς +LocaleNames/el/CC=Νήσοι Κόκος (Κίλινγκ) +LocaleNames/el/CD=Κονγκό - Κινσάσα +LocaleNames/el/CF=Κεντροαφρικανική Δημοκρατία +LocaleNames/el/CG=Κονγκό - Μπραζαβίλ +LocaleNames/el/CH=Ελβετία +LocaleNames/el/CI=Ακτή Ελεφαντοστού +LocaleNames/el/CK=Νήσοι Κουκ +LocaleNames/el/CL=Χιλή +LocaleNames/el/CM=Καμερούν +LocaleNames/el/CN=Κίνα +LocaleNames/el/CO=Κολομβία +LocaleNames/el/CR=Κόστα Ρίκα +LocaleNames/el/CS=Σερβία και Μαυροβούνιο +LocaleNames/el/CU=Κούβα +LocaleNames/el/CV=Πράσινο Ακρωτήριο +LocaleNames/el/CX=Νήσος των Χριστουγέννων +LocaleNames/el/CY=Κύπρος +LocaleNames/el/CZ=Τσεχία +LocaleNames/el/DE=Γερμανία +LocaleNames/el/DJ=Τζιμπουτί +LocaleNames/el/DK=Δανία +LocaleNames/el/DM=Ντομίνικα +LocaleNames/el/DO=Δομινικανή Δημοκρατία +LocaleNames/el/DZ=Αλγερία +LocaleNames/el/EC=Ισημερινός +LocaleNames/el/EE=Εσθονία +LocaleNames/el/EG=Αίγυπτος +LocaleNames/el/EH=Δυτική Σαχάρα +LocaleNames/el/ER=Ερυθραία +LocaleNames/el/ES=Ισπανία +LocaleNames/el/ET=Αιθιοπία +LocaleNames/el/FI=Φινλανδία +LocaleNames/el/FJ=Φίτζι +LocaleNames/el/FK=Νήσοι Φόκλαντ +LocaleNames/el/FM=Μικρονησία +LocaleNames/el/FO=Νήσοι Φερόες +LocaleNames/el/FR=Γαλλία +LocaleNames/el/GA=Γκαμπόν +LocaleNames/el/GB=Ηνωμένο Βασίλειο +LocaleNames/el/GD=Γρενάδα +LocaleNames/el/GE=Γεωργία +LocaleNames/el/GF=Γαλλική Γουιάνα +LocaleNames/el/GH=Γκάνα +LocaleNames/el/GI=Γιβραλτάρ +LocaleNames/el/GL=Γροιλανδία +LocaleNames/el/GM=Γκάμπια +LocaleNames/el/GN=Γουινέα +LocaleNames/el/GP=Γουαδελούπη +LocaleNames/el/GQ=Ισημερινή Γουινέα +LocaleNames/el/GS=Νήσοι Νότια Γεωργία και Νότιες Σάντουιτς +LocaleNames/el/GT=Γουατεμάλα +LocaleNames/el/GU=Γκουάμ +LocaleNames/el/GW=Γουινέα Μπισάου +LocaleNames/el/GY=Γουιάνα +LocaleNames/el/HK=Χονγκ Κονγκ ΕΔΠ Κίνας +LocaleNames/el/HM=Νήσοι Χερντ και Μακντόναλντ +LocaleNames/el/HN=Ονδούρα +LocaleNames/el/HR=Κροατία +LocaleNames/el/HT=Αϊτή +LocaleNames/el/HU=Ουγγαρία +LocaleNames/el/ID=Ινδονησία +LocaleNames/el/IE=Ιρλανδία +LocaleNames/el/IL=Ισραήλ +LocaleNames/el/IN=Ινδία +LocaleNames/el/IO=Βρετανικά Εδάφη Ινδικού Ωκεανού +LocaleNames/el/IQ=Ιράκ +LocaleNames/el/IR=Ιράν +LocaleNames/el/IS=Ισλανδία +LocaleNames/el/IT=Ιταλία +LocaleNames/el/JM=Τζαμάικα +LocaleNames/el/JO=Ιορδανία +LocaleNames/el/JP=Ιαπωνία +LocaleNames/el/KE=Κένυα +LocaleNames/el/KG=Κιργιστάν +LocaleNames/el/KH=Καμπότζη +LocaleNames/el/KI=Κιριμπάτι +LocaleNames/el/KM=Κομόρες +LocaleNames/el/KN=Σεν Κιτς και Νέβις +LocaleNames/el/KP=Βόρεια Κορέα +LocaleNames/el/KR=Νότια Κορέα +LocaleNames/el/KW=Κουβέιτ +LocaleNames/el/KY=Νήσοι Κέιμαν +LocaleNames/el/KZ=Καζακστάν +LocaleNames/el/LA=Λάος +LocaleNames/el/LB=Λίβανος +LocaleNames/el/LC=Αγία Λουκία +LocaleNames/el/LI=Λιχτενστάιν +LocaleNames/el/LK=Σρι Λάνκα +LocaleNames/el/LR=Λιβερία +LocaleNames/el/LS=Λεσότο +LocaleNames/el/LT=Λιθουανία +LocaleNames/el/LU=Λουξεμβούργο +LocaleNames/el/LV=Λετονία +LocaleNames/el/LY=Λιβύη +LocaleNames/el/MA=Μαρόκο +LocaleNames/el/MC=Μονακό +LocaleNames/el/MD=Μολδαβία +LocaleNames/el/MG=Μαδαγασκάρη +LocaleNames/el/MH=Νήσοι Μάρσαλ +LocaleNames/el/MK=Βόρεια Μακεδονία +LocaleNames/el/ML=Μάλι +LocaleNames/el/MM=Μιανμάρ (Βιρμανία) +LocaleNames/el/MN=Μογγολία +LocaleNames/el/MO=Μακάο ΕΔΠ Κίνας +LocaleNames/el/MP=Νήσοι Βόρειες Μαριάνες +LocaleNames/el/MQ=Μαρτινίκα +LocaleNames/el/MR=Μαυριτανία +LocaleNames/el/MS=Μονσεράτ +LocaleNames/el/MT=Μάλτα +LocaleNames/el/MU=Μαυρίκιος +LocaleNames/el/MV=Μαλδίβες +LocaleNames/el/MW=Μαλάουι +LocaleNames/el/MX=Μεξικό +LocaleNames/el/MY=Μαλαισία +LocaleNames/el/MZ=Μοζαμβίκη +LocaleNames/el/NA=Ναμίμπια +LocaleNames/el/NC=Νέα Καληδονία +LocaleNames/el/NE=Νίγηρας +LocaleNames/el/NF=Νήσος Νόρφολκ +LocaleNames/el/NG=Νιγηρία +LocaleNames/el/NI=Νικαράγουα +LocaleNames/el/NL=Ολλανδία +LocaleNames/el/NO=Νορβηγία +LocaleNames/el/NP=Νεπάλ +LocaleNames/el/NR=Ναουρού +LocaleNames/el/NU=Νιούε +LocaleNames/el/NZ=Νέα Ζηλανδία +LocaleNames/el/OM=Ομάν +LocaleNames/el/PA=Παναμάς +LocaleNames/el/PE=Περού +LocaleNames/el/PF=Γαλλική Πολυνησία +LocaleNames/el/PG=Παπούα Νέα Γουινέα +LocaleNames/el/PH=Φιλιππίνες +LocaleNames/el/PK=Πακιστάν +LocaleNames/el/PL=Πολωνία +LocaleNames/el/PM=Σεν Πιερ και Μικελόν +LocaleNames/el/PN=Νήσοι Πίτκερν +LocaleNames/el/PR=Πουέρτο Ρίκο +LocaleNames/el/PS=Παλαιστινιακά Εδάφη +LocaleNames/el/PT=Πορτογαλία +LocaleNames/el/PW=Παλάου +LocaleNames/el/PY=Παραγουάη +LocaleNames/el/QA=Κατάρ +LocaleNames/el/RE=Ρεϊνιόν +LocaleNames/el/RO=Ρουμανία +LocaleNames/el/RU=Ρωσία +LocaleNames/el/RW=Ρουάντα +LocaleNames/el/SA=Σαουδική Αραβία +LocaleNames/el/SB=Νήσοι Σολομώντος +LocaleNames/el/SC=Σεϋχέλλες +LocaleNames/el/SD=Σουδάν +LocaleNames/el/SE=Σουηδία +LocaleNames/el/SG=Σιγκαπούρη +LocaleNames/el/SH=Αγία Ελένη +LocaleNames/el/SI=Σλοβενία +LocaleNames/el/SJ=Σβάλμπαρντ και Γιαν Μαγιέν +LocaleNames/el/SK=Σλοβακία +LocaleNames/el/SL=Σιέρα Λεόνε +LocaleNames/el/SM=Άγιος Μαρίνος +LocaleNames/el/SN=Σενεγάλη +LocaleNames/el/SO=Σομαλία +LocaleNames/el/SR=Σουρινάμ +LocaleNames/el/ST=Σάο Τομέ και Πρίνσιπε +LocaleNames/el/SV=Ελ Σαλβαδόρ +LocaleNames/el/SY=Συρία +LocaleNames/el/TC=Νήσοι Τερκς και Κάικος +LocaleNames/el/TD=Τσαντ +LocaleNames/el/TF=Γαλλικά Νότια Εδάφη +LocaleNames/el/TG=Τόγκο +LocaleNames/el/TH=Ταϊλάνδη +LocaleNames/el/TJ=Τατζικιστάν +LocaleNames/el/TK=Τοκελάου +LocaleNames/el/TL=Τιμόρ-Λέστε +LocaleNames/el/TM=Τουρκμενιστάν +LocaleNames/el/TN=Τυνησία +LocaleNames/el/TO=Τόνγκα +LocaleNames/el/TR=Τουρκία +LocaleNames/el/TT=Τρινιντάντ και Τομπάγκο +LocaleNames/el/TV=Τουβαλού +LocaleNames/el/TW=Ταϊβάν +LocaleNames/el/TZ=Τανζανία +LocaleNames/el/UA=Ουκρανία +LocaleNames/el/UG=Ουγκάντα +LocaleNames/el/UM=Απομακρυσμένες Νησίδες ΗΠΑ +LocaleNames/el/US=Ηνωμένες Πολιτείες +LocaleNames/el/UY=Ουρουγουάη +LocaleNames/el/UZ=Ουζμπεκιστάν +LocaleNames/el/VA=Βατικανό +LocaleNames/el/VC=Άγιος Βικέντιος και Γρεναδίνες +LocaleNames/el/VE=Βενεζουέλα +LocaleNames/el/VG=Βρετανικές Παρθένες Νήσοι +LocaleNames/el/VI=Αμερικανικές Παρθένες Νήσοι +LocaleNames/el/VN=Βιετνάμ +LocaleNames/el/VU=Βανουάτου +LocaleNames/el/WF=Γουάλις και Φουτούνα +LocaleNames/el/WS=Σαμόα +LocaleNames/el/YE=Υεμένη +LocaleNames/el/YT=Μαγιότ +LocaleNames/el/ZA=Νότια Αφρική +LocaleNames/el/ZM=Ζάμπια +LocaleNames/el/ZW=Ζιμπάμπουε LocaleNames/en_MT/fy=Western Frisian LocaleNames/en_MT/gl=Galician LocaleNames/en_MT/ps=Pashto -LocaleNames/en_MT/AX=\u00c5land Islands +LocaleNames/en_MT/AX=Åland Islands LocaleNames/en_MT/CD=Congo - Kinshasa LocaleNames/en_MT/CG=Congo - Brazzaville LocaleNames/en_MT/CS=Serbia And Montenegro @@ -4986,7 +4986,7 @@ LocaleNames/en_MT/MO=Macao SAR China LocaleNames/en_PH/fy=Western Frisian LocaleNames/en_PH/gl=Galician LocaleNames/en_PH/ps=Pashto -LocaleNames/en_PH/AX=\u00c5land Islands +LocaleNames/en_PH/AX=Åland Islands LocaleNames/en_PH/CD=Congo - Kinshasa LocaleNames/en_PH/CG=Congo - Brazzaville LocaleNames/en_PH/CS=Serbia And Montenegro @@ -4996,7 +4996,7 @@ LocaleNames/en_PH/MO=Macao SAR China LocaleNames/en_SG/fy=Western Frisian LocaleNames/en_SG/gl=Galician LocaleNames/en_SG/ps=Pashto -LocaleNames/en_SG/AX=\u00c5land Islands +LocaleNames/en_SG/AX=Åland Islands LocaleNames/en_SG/CD=Congo - Kinshasa LocaleNames/en_SG/CG=Congo - Brazzaville LocaleNames/en_SG/CS=Serbia And Montenegro @@ -5005,54 +5005,54 @@ LocaleNames/en_SG/MO=Macao SAR China LocaleNames/es_US/ab=abjasio LocaleNames/es_US/dz=dzongkha LocaleNames/es_US/fj=fiyiano -LocaleNames/es_US/si=cingal\u00e9s -LocaleNames/es_US/ti=tigri\u00f1a -LocaleNames/es_US/vo=volap\u00fck -LocaleNames/es_US/AX=Islas \u00c5land -LocaleNames/es_US/BH=Bar\u00e9in -LocaleNames/es_US/KG=Kirguist\u00e1n -LocaleNames/mt/ab=Abka\u017cjan +LocaleNames/es_US/si=cingalés +LocaleNames/es_US/ti=tigriña +LocaleNames/es_US/vo=volapük +LocaleNames/es_US/AX=Islas Åland +LocaleNames/es_US/BH=Baréin +LocaleNames/es_US/KG=Kirguistán +LocaleNames/mt/ab=Abkażjan LocaleNames/mt/af=Afrikans LocaleNames/mt/am=Amhariku -LocaleNames/mt/ar=G\u0127arbi +LocaleNames/mt/ar=Għarbi LocaleNames/mt/av=Avarik LocaleNames/mt/ay=Aymara -LocaleNames/mt/az=A\u017cerbaj\u0121ani +LocaleNames/mt/az=Ażerbajġani LocaleNames/mt/ba=Bashkir LocaleNames/mt/be=Belarussu LocaleNames/mt/bg=Bulgaru -LocaleNames/mt/bh=Bi\u0127ari +LocaleNames/mt/bh=Biħari LocaleNames/mt/bo=Tibetjan LocaleNames/mt/br=Breton -LocaleNames/mt/bs=Bo\u017cnijaku +LocaleNames/mt/bs=Bożnijaku LocaleNames/mt/ca=Katalan LocaleNames/mt/ce=Chechen LocaleNames/mt/ch=Chamorro LocaleNames/mt/co=Korsiku LocaleNames/mt/cr=Cree -LocaleNames/mt/cs=\u010aek +LocaleNames/mt/cs=Ċek LocaleNames/mt/cu=Slaviku tal-Knisja LocaleNames/mt/cv=Chuvash LocaleNames/mt/cy=Welsh -LocaleNames/mt/da=Dani\u017c -LocaleNames/mt/de=\u0120ermani\u017c +LocaleNames/mt/da=Daniż +LocaleNames/mt/de=Ġermaniż LocaleNames/mt/dv=Divehi LocaleNames/mt/dz=Dzongkha LocaleNames/mt/el=Grieg -LocaleNames/mt/en=Ingli\u017c +LocaleNames/mt/en=Ingliż LocaleNames/mt/es=Spanjol LocaleNames/mt/et=Estonjan LocaleNames/mt/eu=Bask LocaleNames/mt/fa=Persjan LocaleNames/mt/ff=Fulah -LocaleNames/mt/fi=Finlandi\u017c -LocaleNames/mt/fj=Fi\u0121jan +LocaleNames/mt/fi=Finlandiż +LocaleNames/mt/fj=Fiġjan LocaleNames/mt/fo=Faroese -LocaleNames/mt/fr=Fran\u010bi\u017c +LocaleNames/mt/fr=Franċiż LocaleNames/mt/fy=Frisian tal-Punent -LocaleNames/mt/ga=Irlandi\u017c -LocaleNames/mt/gd=Galliku Sko\u010b\u010bi\u017c -LocaleNames/mt/gl=Gali\u010bjan +LocaleNames/mt/ga=Irlandiż +LocaleNames/mt/gd=Galliku Skoċċiż +LocaleNames/mt/gl=Galiċjan LocaleNames/mt/gn=Guarani LocaleNames/mt/gu=Gujarati LocaleNames/mt/gv=Manx @@ -5061,63 +5061,63 @@ LocaleNames/mt/he=Ebrajk LocaleNames/mt/hi=Hindi LocaleNames/mt/ho=Hiri Motu LocaleNames/mt/hr=Kroat -LocaleNames/mt/hu=Ungeri\u017c +LocaleNames/mt/hu=Ungeriż LocaleNames/mt/hy=Armen LocaleNames/mt/hz=Herero -LocaleNames/mt/id=Indone\u017cjan +LocaleNames/mt/id=Indoneżjan LocaleNames/mt/ik=Inupjak -LocaleNames/mt/in=Indone\u017cjan -LocaleNames/mt/is=I\u017clandi\u017c +LocaleNames/mt/in=Indoneżjan +LocaleNames/mt/is=Iżlandiż LocaleNames/mt/it=Taljan LocaleNames/mt/iu=Inuktitut LocaleNames/mt/iw=Ebrajk -LocaleNames/mt/ja=\u0120appuni\u017c +LocaleNames/mt/ja=Ġappuniż LocaleNames/mt/ji=Yiddish -LocaleNames/mt/jv=\u0120avani\u017c -LocaleNames/mt/ka=\u0120or\u0121jan +LocaleNames/mt/jv=Ġavaniż +LocaleNames/mt/ka=Ġorġjan LocaleNames/mt/ki=Kikuju LocaleNames/mt/kj=Kuanyama -LocaleNames/mt/kk=Ka\u017cak +LocaleNames/mt/kk=Każak LocaleNames/mt/kl=Kalallisut LocaleNames/mt/km=Khmer LocaleNames/mt/ko=Korean LocaleNames/mt/ks=Kashmiri LocaleNames/mt/ku=Kurd LocaleNames/mt/kw=Korniku -LocaleNames/mt/ky=Kirgi\u017c -LocaleNames/mt/lb=Lussemburgi\u017c +LocaleNames/mt/ky=Kirgiż +LocaleNames/mt/lb=Lussemburgiż LocaleNames/mt/ln=Lingaljan LocaleNames/mt/lt=Litwan LocaleNames/mt/lv=Latvjan LocaleNames/mt/mg=Malagasy -LocaleNames/mt/mh=Marshalljani\u017c -LocaleNames/mt/mk=Ma\u010bedonjan +LocaleNames/mt/mh=Marshalljaniż +LocaleNames/mt/mk=Maċedonjan LocaleNames/mt/ml=Malayalam LocaleNames/mt/mn=Mongoljan LocaleNames/mt/mo=Moldavjan LocaleNames/mt/mr=Marathi LocaleNames/mt/ms=Malay LocaleNames/mt/mt=Malti -LocaleNames/mt/my=Burmi\u017c +LocaleNames/mt/my=Burmiż LocaleNames/mt/na=Naurujan -LocaleNames/mt/nb=Bokmal Norve\u0121i\u017c +LocaleNames/mt/nb=Bokmal Norveġiż LocaleNames/mt/nd=Ndebeli tat-Tramuntana -LocaleNames/mt/ne=Nepali\u017c -LocaleNames/mt/nl=Olandi\u017c -LocaleNames/mt/nn=Ninorsk Norve\u0121i\u017c -LocaleNames/mt/no=Norve\u0121i\u017c +LocaleNames/mt/ne=Nepaliż +LocaleNames/mt/nl=Olandiż +LocaleNames/mt/nn=Ninorsk Norveġiż +LocaleNames/mt/no=Norveġiż LocaleNames/mt/nr=Ndebele tan-Nofsinhar LocaleNames/mt/nv=Navajo LocaleNames/mt/ny=Nyanja -LocaleNames/mt/oc=O\u010b\u010bitan -LocaleNames/mt/oj=O\u0121ibwa +LocaleNames/mt/oc=Oċċitan +LocaleNames/mt/oj=Oġibwa LocaleNames/mt/om=Oromo LocaleNames/mt/or=Odia LocaleNames/mt/os=Ossettiku LocaleNames/mt/pa=Punjabi LocaleNames/mt/pl=Pollakk LocaleNames/mt/ps=Pashto -LocaleNames/mt/pt=Portugi\u017c +LocaleNames/mt/pt=Portugiż LocaleNames/mt/qu=Quechua LocaleNames/mt/rm=Romanz LocaleNames/mt/ro=Rumen @@ -5131,129 +5131,129 @@ LocaleNames/mt/sk=Slovakk LocaleNames/mt/sl=Sloven LocaleNames/mt/sm=Samoan LocaleNames/mt/sn=Shona -LocaleNames/mt/sq=Albani\u017c +LocaleNames/mt/sq=Albaniż LocaleNames/mt/sr=Serb LocaleNames/mt/st=Soto tan-Nofsinhar -LocaleNames/mt/su=Sundani\u017c -LocaleNames/mt/sv=\u017bvedi\u017c +LocaleNames/mt/su=Sundaniż +LocaleNames/mt/sv=Żvediż LocaleNames/mt/sw=Swahili -LocaleNames/mt/tg=Ta\u0121ik -LocaleNames/mt/th=Tajlandi\u017c +LocaleNames/mt/tg=Taġik +LocaleNames/mt/th=Tajlandiż LocaleNames/mt/ti=Tigrinya LocaleNames/mt/tk=Turkmeni LocaleNames/mt/tn=Tswana LocaleNames/mt/to=Tongan LocaleNames/mt/tr=Tork -LocaleNames/mt/ty=Ta\u0127itjan +LocaleNames/mt/ty=Taħitjan LocaleNames/mt/ug=Uyghur LocaleNames/mt/uk=Ukren LocaleNames/mt/uz=Uzbek -LocaleNames/mt/vi=Vjetnami\u017c +LocaleNames/mt/vi=Vjetnamiż LocaleNames/mt/vo=Volapuk LocaleNames/mt/xh=Xhosa LocaleNames/mt/yi=Yiddish LocaleNames/mt/yo=Yoruba LocaleNames/mt/za=Zhuang -LocaleNames/mt/zh=\u010aini\u017c +LocaleNames/mt/zh=Ċiniż LocaleNames/mt/zu=Zulu -LocaleNames/mt/AE=l-Emirati G\u0127arab Mag\u0127quda +LocaleNames/mt/AE=l-Emirati Għarab Magħquda LocaleNames/mt/AF=l-Afganistan LocaleNames/mt/AI=Anguilla LocaleNames/mt/AL=l-Albanija LocaleNames/mt/AM=l-Armenja -LocaleNames/mt/AN=Antilles Olandi\u017ci +LocaleNames/mt/AN=Antilles Olandiżi LocaleNames/mt/AQ=l-Antartika -LocaleNames/mt/AR=l-Ar\u0121entina +LocaleNames/mt/AR=l-Arġentina LocaleNames/mt/AS=is-Samoa Amerikana LocaleNames/mt/AT=l-Awstrija LocaleNames/mt/AU=l-Awstralja -LocaleNames/mt/AZ=l-A\u017cerbaj\u0121an -LocaleNames/mt/BA=il-Bo\u017cnija-\u0126erzegovina +LocaleNames/mt/AZ=l-Ażerbajġan +LocaleNames/mt/BA=il-Bożnija-Ħerzegovina LocaleNames/mt/BD=il-Bangladesh -LocaleNames/mt/BE=il-Bel\u0121ju +LocaleNames/mt/BE=il-Belġju LocaleNames/mt/BG=il-Bulgarija LocaleNames/mt/BH=il-Bahrain LocaleNames/mt/BN=il-Brunei LocaleNames/mt/BO=il-Bolivja -LocaleNames/mt/BR=Il-Bra\u017cil +LocaleNames/mt/BR=Il-Brażil LocaleNames/mt/BS=il-Bahamas LocaleNames/mt/BT=il-Bhutan LocaleNames/mt/BY=il-Belarussja LocaleNames/mt/BZ=il-Belize LocaleNames/mt/CA=il-Kanada -LocaleNames/mt/CC=G\u017cejjer Cocos (Keeling) +LocaleNames/mt/CC=Gżejjer Cocos (Keeling) LocaleNames/mt/CD=ir-Repubblika Demokratika tal-Kongo -LocaleNames/mt/CF=ir-Repubblika \u010aentru-Afrikana +LocaleNames/mt/CF=ir-Repubblika Ċentru-Afrikana LocaleNames/mt/CG=il-Kongo - Brazzaville -LocaleNames/mt/CH=l-I\u017cvizzera +LocaleNames/mt/CH=l-Iżvizzera LocaleNames/mt/CI=il-Kosta tal-Avorju -LocaleNames/mt/CL=i\u010b-\u010aili +LocaleNames/mt/CL=iċ-Ċili LocaleNames/mt/CM=il-Kamerun -LocaleNames/mt/CN=i\u010b-\u010aina +LocaleNames/mt/CN=iċ-Ċina LocaleNames/mt/CO=il-Kolombja LocaleNames/mt/CR=il-Costa Rica LocaleNames/mt/CS=Serbja u Montenegro LocaleNames/mt/CU=Kuba LocaleNames/mt/CV=Cape Verde -LocaleNames/mt/CY=\u010aipru -LocaleNames/mt/CZ=ir-Repubblika \u010aeka -LocaleNames/mt/DE=il-\u0120ermanja +LocaleNames/mt/CY=Ċipru +LocaleNames/mt/CZ=ir-Repubblika Ċeka +LocaleNames/mt/DE=il-Ġermanja LocaleNames/mt/DJ=il-Djibouti LocaleNames/mt/DK=id-Danimarka LocaleNames/mt/DM=Dominica LocaleNames/mt/DO=ir-Repubblika Dominicana -LocaleNames/mt/DZ=l-Al\u0121erija +LocaleNames/mt/DZ=l-Alġerija LocaleNames/mt/EC=l-Ekwador LocaleNames/mt/EE=l-Estonja -LocaleNames/mt/EG=l-E\u0121ittu -LocaleNames/mt/EH=is-Sa\u0127ara tal-Punent +LocaleNames/mt/EG=l-Eġittu +LocaleNames/mt/EH=is-Saħara tal-Punent LocaleNames/mt/ER=l-Eritrea LocaleNames/mt/ES=Spanja LocaleNames/mt/ET=l-Etjopja LocaleNames/mt/FI=il-Finlandja -LocaleNames/mt/FJ=Fi\u0121i -LocaleNames/mt/FM=il-Mikrone\u017cja -LocaleNames/mt/FO=il-G\u017cejjer Faeroe +LocaleNames/mt/FJ=Fiġi +LocaleNames/mt/FM=il-Mikroneżja +LocaleNames/mt/FO=il-Gżejjer Faeroe LocaleNames/mt/FR=Franza LocaleNames/mt/GB=ir-Renju Unit LocaleNames/mt/GE=il-Georgia -LocaleNames/mt/GF=il-Guyana Fran\u010bi\u017ca +LocaleNames/mt/GF=il-Guyana Franċiża LocaleNames/mt/GH=il-Ghana LocaleNames/mt/GL=Greenland LocaleNames/mt/GM=il-Gambja LocaleNames/mt/GN=il-Guinea LocaleNames/mt/GP=Guadeloupe LocaleNames/mt/GQ=il-Guinea Ekwatorjali -LocaleNames/mt/GR=il-Gre\u010bja -LocaleNames/mt/GS=il-Georgia tan-Nofsinhar u l-G\u017cejjer Sandwich tan-Nofsinhar +LocaleNames/mt/GR=il-Greċja +LocaleNames/mt/GS=il-Georgia tan-Nofsinhar u l-Gżejjer Sandwich tan-Nofsinhar LocaleNames/mt/GT=il-Gwatemala LocaleNames/mt/GU=Guam LocaleNames/mt/GW=il-Guinea-Bissau LocaleNames/mt/GY=il-Guyana -LocaleNames/mt/HK=ir-Re\u0121jun Amministrattiv Spe\u010bjali ta\u2019 Hong Kong tar-Repubblika tal-Poplu ta\u010b-\u010aina -LocaleNames/mt/HM=il-G\u017cejjer Heard u l-G\u017cejjer McDonald +LocaleNames/mt/HK=ir-Reġjun Amministrattiv Speċjali ta’ Hong Kong tar-Repubblika tal-Poplu taċ-Ċina +LocaleNames/mt/HM=il-Gżejjer Heard u l-Gżejjer McDonald LocaleNames/mt/HN=il-Honduras LocaleNames/mt/HR=il-Kroazja LocaleNames/mt/HT=il-Haiti LocaleNames/mt/HU=l-Ungerija -LocaleNames/mt/ID=l-Indone\u017cja +LocaleNames/mt/ID=l-Indoneżja LocaleNames/mt/IE=l-Irlanda -LocaleNames/mt/IL=I\u017crael +LocaleNames/mt/IL=Iżrael LocaleNames/mt/IN=l-Indja -LocaleNames/mt/IS=l-I\u017clanda +LocaleNames/mt/IS=l-Iżlanda LocaleNames/mt/IT=l-Italja -LocaleNames/mt/JM=il-\u0120amajka -LocaleNames/mt/JO=il-\u0120ordan -LocaleNames/mt/JP=il-\u0120appun +LocaleNames/mt/JM=il-Ġamajka +LocaleNames/mt/JO=il-Ġordan +LocaleNames/mt/JP=il-Ġappun LocaleNames/mt/KE=il-Kenja -LocaleNames/mt/KG=il-Kirgi\u017cistan +LocaleNames/mt/KG=il-Kirgiżistan LocaleNames/mt/KH=il-Kambodja LocaleNames/mt/KM=Comoros LocaleNames/mt/KN=Saint Kitts u Nevis -LocaleNames/mt/KP=il-Korea ta\u2019 Fuq -LocaleNames/mt/KR=il-Korea t\u2019Isfel +LocaleNames/mt/KP=il-Korea ta’ Fuq +LocaleNames/mt/KR=il-Korea t’Isfel LocaleNames/mt/KW=il-Kuwajt -LocaleNames/mt/KZ=il-Ka\u017cakistan +LocaleNames/mt/KZ=il-Każakistan LocaleNames/mt/LB=il-Libanu LocaleNames/mt/LC=Saint Lucia LocaleNames/mt/LR=il-Liberja @@ -5266,12 +5266,12 @@ LocaleNames/mt/MA=il-Marokk LocaleNames/mt/MC=Monaco LocaleNames/mt/MD=il-Moldova LocaleNames/mt/MG=Madagascar -LocaleNames/mt/MH=G\u017cejjer Marshall -LocaleNames/mt/MK=il-Ma\u010bedonja ta\u2019 Fuq +LocaleNames/mt/MH=Gżejjer Marshall +LocaleNames/mt/MK=il-Maċedonja ta’ Fuq LocaleNames/mt/MM=il-Myanmar/Burma LocaleNames/mt/MN=il-Mongolja -LocaleNames/mt/MO=ir-Re\u0121jun Amministrattiv Spe\u010bjali tal-Macao tar-Repubblika tal-Poplu ta\u010b-\u010aina -LocaleNames/mt/MP=\u0120\u017cejjer Mariana tat-Tramuntana +LocaleNames/mt/MO=ir-Reġjun Amministrattiv Speċjali tal-Macao tar-Repubblika tal-Poplu taċ-Ċina +LocaleNames/mt/MP=Ġżejjer Mariana tat-Tramuntana LocaleNames/mt/MQ=Martinique LocaleNames/mt/MR=il-Mauritania LocaleNames/mt/MU=Mauritius @@ -5279,12 +5279,12 @@ LocaleNames/mt/MX=il-Messiku LocaleNames/mt/MY=il-Malasja LocaleNames/mt/MZ=il-Mozambique LocaleNames/mt/NA=in-Namibja -LocaleNames/mt/NE=in-Ni\u0121er -LocaleNames/mt/NG=in-Ni\u0121erja +LocaleNames/mt/NE=in-Niġer +LocaleNames/mt/NG=in-Niġerja LocaleNames/mt/NI=in-Nikaragwa LocaleNames/mt/NL=in-Netherlands -LocaleNames/mt/NO=in-Norve\u0121ja -LocaleNames/mt/PF=Poline\u017cja Fran\u010bi\u017ca +LocaleNames/mt/NO=in-Norveġja +LocaleNames/mt/PF=Polineżja Franċiża LocaleNames/mt/PG=Papua New Guinea LocaleNames/mt/PH=il-Filippini LocaleNames/mt/PL=il-Polonja @@ -5292,27 +5292,27 @@ LocaleNames/mt/PM=Saint Pierre u Miquelon LocaleNames/mt/PS=it-Territorji Palestinjani LocaleNames/mt/PT=il-Portugall LocaleNames/mt/PY=il-Paragwaj -LocaleNames/mt/RE=R\u00e9union +LocaleNames/mt/RE=Réunion LocaleNames/mt/RO=ir-Rumanija LocaleNames/mt/RU=ir-Russja LocaleNames/mt/SA=l-Arabja Sawdija -LocaleNames/mt/SE=l-I\u017cvezja +LocaleNames/mt/SE=l-Iżvezja LocaleNames/mt/SG=Singapore LocaleNames/mt/SI=is-Slovenja LocaleNames/mt/SJ=Svalbard u Jan Mayen LocaleNames/mt/SK=is-Slovakkja LocaleNames/mt/SO=is-Somalja LocaleNames/mt/SR=is-Suriname -LocaleNames/mt/ST=S\u00e3o Tom\u00e9 u Pr\u00edncipe +LocaleNames/mt/ST=São Tomé u Príncipe LocaleNames/mt/SY=is-Sirja -LocaleNames/mt/TC=il-G\u017cejjer Turks u Caicos -LocaleNames/mt/TD=i\u010b-Chad -LocaleNames/mt/TF=It-Territorji Fran\u010bi\u017ci tan-Nofsinhar +LocaleNames/mt/TC=il-Gżejjer Turks u Caicos +LocaleNames/mt/TD=iċ-Chad +LocaleNames/mt/TF=It-Territorji Franċiżi tan-Nofsinhar LocaleNames/mt/TH=it-Tajlandja -LocaleNames/mt/TJ=it-Ta\u0121ikistan +LocaleNames/mt/TJ=it-Taġikistan LocaleNames/mt/TK=it-Tokelau LocaleNames/mt/TL=Timor Leste -LocaleNames/mt/TN=it-Tune\u017cija +LocaleNames/mt/TN=it-Tuneżija LocaleNames/mt/TR=it-Turkija LocaleNames/mt/TT=Trinidad u Tobago LocaleNames/mt/TW=it-Tajwan @@ -5320,7 +5320,7 @@ LocaleNames/mt/TZ=it-Tanzanija LocaleNames/mt/UA=l-Ukrajna LocaleNames/mt/US=l-Istati Uniti LocaleNames/mt/UY=l-Urugwaj -LocaleNames/mt/UZ=l-U\u017cbekistan +LocaleNames/mt/UZ=l-Użbekistan LocaleNames/mt/VA=l-Istat tal-Belt tal-Vatikan LocaleNames/mt/VC=Saint Vincent u l-Grenadini LocaleNames/mt/VE=il-Venezwela @@ -5329,48 +5329,48 @@ LocaleNames/mt/VU=Vanuatu LocaleNames/mt/WF=Wallis u Futuna LocaleNames/mt/YE=il-Jemen LocaleNames/mt/YT=Mayotte -LocaleNames/mt/ZA=l-Afrika t\u2019Isfel -LocaleNames/mt/ZM=i\u017c-\u017bambja -LocaleNames/mt/ZW=i\u017c-\u017bimbabwe -LocaleNames/sr/ZA=\u0408\u0443\u0436\u043d\u043e\u0430\u0444\u0440\u0438\u0447\u043a\u0430 \u0420\u0435\u043f\u0443\u0431\u043b\u0438\u043a\u0430 -LocaleNames/zh_SG/bo=\u85cf\u8bed -LocaleNames/zh_SG/gd=\u82cf\u683c\u5170\u76d6\u5c14\u8bed -LocaleNames/zh_SG/ho=\u5e0c\u91cc\u83ab\u56fe\u8bed -LocaleNames/zh_SG/ia=\u56fd\u9645\u8bed -LocaleNames/zh_SG/ie=\u56fd\u9645\u6587\u5b57\uff08E\uff09 -LocaleNames/zh_SG/iu=\u56e0\u7ebd\u7279\u8bed -LocaleNames/zh_SG/kj=\u5bbd\u4e9a\u739b\u8bed -LocaleNames/zh_SG/kn=\u5361\u7eb3\u8fbe\u8bed -LocaleNames/zh_SG/lv=\u62c9\u8131\u7ef4\u4e9a\u8bed -LocaleNames/zh_SG/ny=\u9f50\u5207\u74e6\u8bed -LocaleNames/zh_SG/oc=\u5965\u514b\u8bed -LocaleNames/zh_SG/om=\u5965\u7f57\u83ab\u8bed -LocaleNames/zh_SG/rm=\u7f57\u66fc\u4ec0\u8bed -LocaleNames/zh_SG/sd=\u4fe1\u5fb7\u8bed -LocaleNames/zh_SG/se=\u5317\u65b9\u8428\u7c73\u8bed -LocaleNames/zh_SG/sn=\u7ecd\u7eb3\u8bed -LocaleNames/zh_SG/ss=\u65af\u74e6\u8482\u8bed -LocaleNames/zh_SG/su=\u5dfd\u4ed6\u8bed -LocaleNames/zh_SG/tl=\u4ed6\u52a0\u7984\u8bed -LocaleNames/zh_SG/tn=\u8328\u74e6\u7eb3\u8bed -LocaleNames/zh_SG/ts=\u806a\u52a0\u8bed -LocaleNames/zh_SG/tt=\u9791\u977c\u8bed -LocaleNames/zh_SG/tw=\u5951\u7ef4\u8bed -LocaleNames/zh_SG/wa=\u74e6\u9686\u8bed -LocaleNames/zh_SG/wo=\u6c83\u6d1b\u592b\u8bed -LocaleNames/zh_SG/xh=\u79d1\u8428\u8bed -LocaleNames/zh_SG/za=\u58ee\u8bed -LocaleNames/zh_SG/BA=\u6ce2\u65af\u5c3c\u4e9a\u548c\u9ed1\u585e\u54e5\u7ef4\u90a3 -LocaleNames/zh_SG/CC=\u79d1\u79d1\u65af\uff08\u57fa\u6797\uff09\u7fa4\u5c9b -LocaleNames/zh_SG/CD=\u521a\u679c\uff08\u91d1\uff09 -LocaleNames/zh_SG/CG=\u521a\u679c\uff08\u5e03\uff09 -LocaleNames/zh_SG/DM=\u591a\u7c73\u5c3c\u514b -LocaleNames/zh_SG/KG=\u5409\u5c14\u5409\u65af\u65af\u5766 -LocaleNames/zh_SG/KP=\u671d\u9c9c -LocaleNames/zh_SG/MQ=\u9a6c\u63d0\u5c3c\u514b -LocaleNames/zh_SG/MQ=\u9a6c\u63d0\u5c3c\u514b -LocaleNames/zh_SG/NC=\u65b0\u5580\u91cc\u591a\u5c3c\u4e9a -LocaleNames/zh_SG/TF=\u6cd5\u5c5e\u5357\u90e8\u9886\u5730 +LocaleNames/mt/ZA=l-Afrika t’Isfel +LocaleNames/mt/ZM=iż-Żambja +LocaleNames/mt/ZW=iż-Żimbabwe +LocaleNames/sr/ZA=Јужноафричка Република +LocaleNames/zh_SG/bo=藏语 +LocaleNames/zh_SG/gd=苏格兰盖尔语 +LocaleNames/zh_SG/ho=希里莫图语 +LocaleNames/zh_SG/ia=国际语 +LocaleNames/zh_SG/ie=国际文字(E) +LocaleNames/zh_SG/iu=因纽特语 +LocaleNames/zh_SG/kj=宽亚玛语 +LocaleNames/zh_SG/kn=卡纳达语 +LocaleNames/zh_SG/lv=拉脱维亚语 +LocaleNames/zh_SG/ny=齐切瓦语 +LocaleNames/zh_SG/oc=奥克语 +LocaleNames/zh_SG/om=奥罗莫语 +LocaleNames/zh_SG/rm=罗曼什语 +LocaleNames/zh_SG/sd=信德语 +LocaleNames/zh_SG/se=北方萨米语 +LocaleNames/zh_SG/sn=绍纳语 +LocaleNames/zh_SG/ss=斯瓦蒂语 +LocaleNames/zh_SG/su=巽他语 +LocaleNames/zh_SG/tl=他加禄语 +LocaleNames/zh_SG/tn=茨瓦纳语 +LocaleNames/zh_SG/ts=聪加语 +LocaleNames/zh_SG/tt=鞑靼语 +LocaleNames/zh_SG/tw=契维语 +LocaleNames/zh_SG/wa=瓦隆语 +LocaleNames/zh_SG/wo=沃洛夫语 +LocaleNames/zh_SG/xh=科萨语 +LocaleNames/zh_SG/za=壮语 +LocaleNames/zh_SG/BA=波斯尼亚和黑塞哥维那 +LocaleNames/zh_SG/CC=科科斯(基林)群岛 +LocaleNames/zh_SG/CD=刚果(金) +LocaleNames/zh_SG/CG=刚果(布) +LocaleNames/zh_SG/DM=多米尼克 +LocaleNames/zh_SG/KG=吉尔吉斯斯坦 +LocaleNames/zh_SG/KP=朝鲜 +LocaleNames/zh_SG/MQ=马提尼克 +LocaleNames/zh_SG/MQ=马提尼克 +LocaleNames/zh_SG/NC=新喀里多尼亚 +LocaleNames/zh_SG/TF=法属南部领地 FormatData/es_US/AmPmMarkers/0=a.m. FormatData/es_US/AmPmMarkers/1=p.m. FormatData/es_US/NumberElements/0=. @@ -5381,12 +5381,12 @@ FormatData/es_US/NumberElements/4=0 FormatData/es_US/NumberElements/5=# FormatData/es_US/NumberElements/6=- FormatData/es_US/NumberElements/7=E -FormatData/es_US/NumberElements/8=\u2030 -FormatData/es_US/NumberElements/9=\u221e +FormatData/es_US/NumberElements/8=‰ +FormatData/es_US/NumberElements/9=∞ FormatData/es_US/NumberElements/10=NaN FormatData/mt/AmPmMarkers/0=QN FormatData/mt/AmPmMarkers/1=WN -FormatData/mt/DatePatterns/0=EEEE, d 'ta\u2019' MMMM yyyy +FormatData/mt/DatePatterns/0=EEEE, d 'ta’' MMMM yyyy # bug# 6483191 CalendarData/ga_IE/firstDayOfWeek=1 CalendarData/en_PH/firstDayOfWeek=1 @@ -5416,11 +5416,11 @@ FormatData/en_SG/DatePatterns/3=d/M/yy # Use approved data FormatData/ms/Eras/0=BCE FormatData/ms/Eras/1=CE -FormatData/sr_BA/MonthNames/5=\u0458\u0443\u043d\u0438 -FormatData/sr_BA/MonthNames/6=\u0458\u0443\u043b\u0438 -FormatData/sr_BA/DayNames/3=\u0441\u0440\u0438\u0458\u0435\u0434\u0430 -FormatData/sr_BA/DayAbbreviations/3=\u0441\u0440\u0438 -FormatData/sr_BA/TimePatterns/0=HH '\u0447\u0430\u0441\u043e\u0432\u0430', mm '\u043c\u0438\u043d\u0443\u0442\u0430', ss' \u0441\u0435\u043a\u0443\u043d\u0434\u0438' +FormatData/sr_BA/MonthNames/5=јуни +FormatData/sr_BA/MonthNames/6=јули +FormatData/sr_BA/DayNames/3=сриједа +FormatData/sr_BA/DayAbbreviations/3=сри +FormatData/sr_BA/TimePatterns/0=HH 'часова', mm 'минута', ss' секунди' FormatData/sr_BA/TimePatterns/1=HH.mm.ss z FormatData/sr_BA/TimePatterns/2=HH:mm:ss FormatData/sr_BA/TimePatterns/3=HH:mm @@ -5431,33 +5431,33 @@ FormatData/sr_BA/DatePatterns/3=yy-MM-dd FormatData/sr_BA/DateTimePatterns/0={1} {0} LocaleNames/pt_BR/ce=checheno LocaleNames/pt_BR/ik=inupiaque -LocaleNames/pt_BR/jv=javan\u00eas +LocaleNames/pt_BR/jv=javanês LocaleNames/pt_BR/nd=ndebele do norte LocaleNames/pt_BR/nr=ndebele do sul LocaleNames/pt_BR/st=soto do sul LocaleNames/pt_BR/AX=Ilhas Aland -LocaleNames/pt_BR/BA=B\u00f3snia e Herzegovina +LocaleNames/pt_BR/BA=Bósnia e Herzegovina LocaleNames/pt_BR/BH=Barein LocaleNames/pt_BR/KP=Coreia do Norte -LocaleNames/pt_BR/MK=Maced\u00f4nia do Norte -LocaleNames/pt_BR/ZW=Zimb\u00e1bue +LocaleNames/pt_BR/MK=Macedônia do Norte +LocaleNames/pt_BR/ZW=Zimbábue LocaleNames/pt_PT/ee=ewe -LocaleNames/pt_PT/fo=fero\u00eas +LocaleNames/pt_PT/fo=feroês LocaleNames/pt_PT/gl=galego -LocaleNames/pt_PT/ha=hau\u00e7\u00e1 -LocaleNames/pt_PT/hy=arm\u00eanio +LocaleNames/pt_PT/ha=hauçá +LocaleNames/pt_PT/hy=armênio LocaleNames/pt_PT/ig=igbo LocaleNames/pt_PT/ki=quicuio -LocaleNames/pt_PT/kl=groenland\u00eas +LocaleNames/pt_PT/kl=groenlandês LocaleNames/pt_PT/km=khmer -LocaleNames/pt_PT/mh=marshal\u00eas -LocaleNames/pt_PT/mk=maced\u00f4nio +LocaleNames/pt_PT/mh=marshalês +LocaleNames/pt_PT/mk=macedônio LocaleNames/pt_PT/nr=ndebele do sul LocaleNames/pt_PT/os=osseto LocaleNames/pt_PT/st=soto do sul -LocaleNames/pt_PT/ta=t\u00e2mil +LocaleNames/pt_PT/ta=tâmil LocaleNames/pt_PT/AI=Anguilla -LocaleNames/pt_PT/AX=\u00c5land Islands +LocaleNames/pt_PT/AX=Åland Islands # JE, GG, IM (6544471) LocaleNames//JE=Jersey @@ -5482,7 +5482,7 @@ FormatData/nl/Eras/1=n. Chr. LocaleNames/da/da=dansk # bug 6485516 -LocaleNames/fr/GF=Guyane fran\u00e7aise +LocaleNames/fr/GF=Guyane française # bug 6486607 LocaleNames/fr/GY=Guyana @@ -5512,27 +5512,27 @@ LocaleNames/de/ME=Montenegro LocaleNames/de/RS=Serbien LocaleNames/es/ME=Montenegro LocaleNames/es/RS=Serbia -LocaleNames/fr/ME=Mont\u00e9n\u00e9gro +LocaleNames/fr/ME=Monténégro LocaleNames/fr/RS=Serbie LocaleNames/it/ME=Montenegro LocaleNames/it/RS=Serbia -LocaleNames/ja/ME=\u30e2\u30f3\u30c6\u30cd\u30b0\u30ed -LocaleNames/ja/RS=\u30bb\u30eb\u30d3\u30a2 -LocaleNames/ko/ME=\ubaac\ud14c\ub124\uadf8\ub85c -LocaleNames/ko/RS=\uc138\ub974\ube44\uc544 +LocaleNames/ja/ME=モンテネグロ +LocaleNames/ja/RS=セルビア +LocaleNames/ko/ME=몬테네그로 +LocaleNames/ko/RS=세르비아 LocaleNames/sv/ME=Montenegro LocaleNames/sv/RS=Serbien -LocaleNames/zh/ME=\u9ed1\u5c71 -LocaleNames/zh/RS=\u585e\u5c14\u7ef4\u4e9a -LocaleNames/zh_TW/ME=\u8499\u7279\u5167\u54e5\u7f85 -LocaleNames/zh_TW/RS=\u585e\u723e\u7dad\u4e9e +LocaleNames/zh/ME=黑山 +LocaleNames/zh/RS=塞尔维亚 +LocaleNames/zh_TW/ME=蒙特內哥羅 +LocaleNames/zh_TW/RS=塞爾維亞 # bug 6531591 -CurrencyNames/ar_SD/SDD=\u062f.\u0633.\u200f -CurrencyNames/ar_SD/SDG=\u062c.\u0633.\u200f +CurrencyNames/ar_SD/SDD=د.س.‏ +CurrencyNames/ar_SD/SDG=ج.س.‏ # bug 6531593 -FormatData/is_IS/NumberPatterns/1=#,##0. \u00a4;-#,##0. \u00a4 +FormatData/is_IS/NumberPatterns/1=#,##0. ¤;-#,##0. ¤ # bug 6509039 FormatData/sv/AmPmMarkers/0=fm @@ -5544,14 +5544,14 @@ LocaleNames//GG=Guernsey LocaleNames//IM=Isle of Man # BL, MF (6627549) -LocaleNames//BL=St. Barth\u00e9lemy +LocaleNames//BL=St. Barthélemy LocaleNames//MF=St. Martin # bug 6609737 FormatData/de/TimePatterns/0=HH:mm' Uhr 'z -TimeZoneNames/de/CET/1=Mitteleurop\u00e4ische Zeit +TimeZoneNames/de/CET/1=Mitteleuropäische Zeit TimeZoneNames/de/CET/2=MEZ -TimeZoneNames/de/CET/3=Mitteleurop\u00e4ische Sommerzeit +TimeZoneNames/de/CET/3=Mitteleuropäische Sommerzeit TimeZoneNames/de/CET/4=MESZ TimeZoneNames/de/EET/2=OEZ TimeZoneNames/de/EET/4=OESZ @@ -5563,7 +5563,7 @@ FormatData/fi/AmPmMarkers/0=ap. FormatData/fi/AmPmMarkers/1=ip. # bug 6507067 -TimeZoneNames/zh_TW/Asia\/Taipei/1=\u53f0\u7063\u6a19\u6e96\u6642\u9593 +TimeZoneNames/zh_TW/Asia\/Taipei/1=台灣標準時間 TimeZoneNames/zh_TW/Asia\/Taipei/2=TST # bug 6645271 @@ -5576,7 +5576,7 @@ CurrencyNames/tr_TR/TRY=TL #bug 6450945 CalendarData/ro/firstDayOfWeek=2 CalendarData/ro/minimalDaysInFirstWeek=1 -FormatData/ro/DayNames/6=s\u00e2mb\u0103t\u0103 +FormatData/ro/DayNames/6=sâmbătă #bug 6645268 LocaleNames/fi/fr=ranska @@ -5585,14 +5585,14 @@ LocaleNames/fi_FI/fr=ranska LocaleNames/fi_FI/FR=Ranska # bug 6646611, 6914413 -FormatData/be_BY/MonthNames/10=\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434\u0430 -FormatData/be_BY/MonthAbbreviations/10=\u043b\u0456\u0441 +FormatData/be_BY/MonthNames/10=лістапада +FormatData/be_BY/MonthAbbreviations/10=ліс # bug 6645405 -FormatData/hu_HU/NumberPatterns/1=#,##0.## \u00a4;-#,##0.## \u00a4 +FormatData/hu_HU/NumberPatterns/1=#,##0.## ¤;-#,##0.## ¤ # bug 6650730 -FormatData/lt/NumberElements/1=\u00a0 +FormatData/lt/NumberElements/1=  FormatData/lt/DatePatterns/2=yyyy-MM-dd #bug 6910489 @@ -5604,7 +5604,7 @@ CurrencyNames/en_CA/USD=US$ # bug 6870908 FormatData/et/MonthNames/0=jaanuar FormatData/et/MonthNames/1=veebruar -FormatData/et/MonthNames/2=m\u00e4rts +FormatData/et/MonthNames/2=märts FormatData/et/MonthNames/3=aprill FormatData/et/MonthNames/4=mai FormatData/et/MonthNames/5=juuni @@ -5616,7 +5616,7 @@ FormatData/et/MonthNames/10=november FormatData/et/MonthNames/11=detsember FormatData/et/MonthAbbreviations/0=jaan FormatData/et/MonthAbbreviations/1=veebr -FormatData/et/MonthAbbreviations/2=m\u00e4rts +FormatData/et/MonthAbbreviations/2=märts FormatData/et/MonthAbbreviations/3=apr FormatData/et/MonthAbbreviations/4=mai FormatData/et/MonthAbbreviations/5=juuni @@ -5633,39 +5633,39 @@ LocaleNames/es/av=avar LocaleNames/es/az=azerbaiyano LocaleNames/es/ba=baskir LocaleNames/es/bh=bihari -LocaleNames/es/bn=bengal\u00ed -LocaleNames/es/cu=eslavo eclesi\u00e1stico +LocaleNames/es/bn=bengalí +LocaleNames/es/cu=eslavo eclesiástico LocaleNames/es/dz=dzongkha LocaleNames/es/eu=euskera LocaleNames/es/fa=persa LocaleNames/es/ff=fula LocaleNames/es/fj=fiyiano -LocaleNames/es/fo=fero\u00e9s -LocaleNames/es/fy=fris\u00f3n occidental -LocaleNames/es/gu=guyarat\u00ed -LocaleNames/es/gv=man\u00e9s +LocaleNames/es/fo=feroés +LocaleNames/es/fy=frisón occidental +LocaleNames/es/gu=guyaratí +LocaleNames/es/gv=manés LocaleNames/es/hi=hindi LocaleNames/es/ho=hiri motu LocaleNames/es/ie=interlingue LocaleNames/es/ig=igbo -LocaleNames/es/ii=yi de Sichu\u00e1n +LocaleNames/es/ii=yi de Sichuán LocaleNames/es/ik=inupiaq LocaleNames/es/kg=kongo LocaleNames/es/ki=kikuyu LocaleNames/es/kj=kuanyama LocaleNames/es/kk=kazajo LocaleNames/es/km=jemer -LocaleNames/es/kn=canar\u00e9s +LocaleNames/es/kn=canarés LocaleNames/es/ks=cachemir LocaleNames/es/ku=kurdo -LocaleNames/es/ky=kirgu\u00eds +LocaleNames/es/ky=kirguís LocaleNames/es/lu=luba-katanga -LocaleNames/es/mr=marat\u00ed +LocaleNames/es/mr=maratí LocaleNames/es/nb=noruego bokmal LocaleNames/es/nd=ndebele septentrional LocaleNames/es/nn=noruego nynorsk LocaleNames/es/nr=ndebele meridional -LocaleNames/es/os=os\u00e9tico +LocaleNames/es/os=osético LocaleNames/es/rm=romanche LocaleNames/es/rn=kirundi LocaleNames/es/rw=kinyarwanda @@ -5675,10 +5675,10 @@ LocaleNames/es/sl=esloveno LocaleNames/es/sn=shona LocaleNames/es/ss=suazi LocaleNames/es/st=sotho meridional -LocaleNames/es/su=sundan\u00e9s +LocaleNames/es/su=sundanés LocaleNames/es/sw=suajili LocaleNames/es/tg=tayiko -LocaleNames/es/ti=tigri\u00f1a +LocaleNames/es/ti=tigriña LocaleNames/es/tn=setsuana LocaleNames/es/to=tongano LocaleNames/es/tw=twi @@ -5686,7 +5686,7 @@ LocaleNames/es/ty=tahitiano LocaleNames/es/ug=uigur LocaleNames/es/uk=ucraniano LocaleNames/es/uz=uzbeko -LocaleNames/es/vo=volap\u00fck +LocaleNames/es/vo=volapük LocaleNames/es/za=zhuang # bug 6716626 - language @@ -5736,13 +5736,13 @@ LocaleNames/nl/fa=Perzisch LocaleNames/nl/ff=Fulah LocaleNames/nl/fi=Fins LocaleNames/nl/fj=Fijisch -LocaleNames/nl/fo=Faer\u00f6ers +LocaleNames/nl/fo=Faeröers LocaleNames/nl/fr=Frans LocaleNames/nl/fy=Fries LocaleNames/nl/ga=Iers LocaleNames/nl/gd=Schots-Gaelisch LocaleNames/nl/gl=Galicisch -LocaleNames/nl/gn=Guaran\u00ed +LocaleNames/nl/gn=Guaraní LocaleNames/nl/gu=Gujarati LocaleNames/nl/gv=Manx LocaleNames/nl/ha=Hausa @@ -5750,7 +5750,7 @@ LocaleNames/nl/he=Hebreeuws LocaleNames/nl/hi=Hindi LocaleNames/nl/ho=Hiri Motu LocaleNames/nl/hr=Kroatisch -LocaleNames/nl/ht=Ha\u00eftiaans Creools +LocaleNames/nl/ht=Haïtiaans Creools LocaleNames/nl/hu=Hongaars LocaleNames/nl/hy=Armeens LocaleNames/nl/hz=Herero @@ -5802,7 +5802,7 @@ LocaleNames/nl/ms=Maleis LocaleNames/nl/mt=Maltees LocaleNames/nl/my=Birmaans LocaleNames/nl/na=Nauruaans -LocaleNames/nl/nb=Noors - Bokm\u00e5l +LocaleNames/nl/nb=Noors - Bokmål LocaleNames/nl/nd=Noord-Ndebele LocaleNames/nl/ne=Nepalees LocaleNames/nl/ng=Ndonga @@ -5861,12 +5861,12 @@ LocaleNames/nl/tt=Tataars LocaleNames/nl/tw=Twi LocaleNames/nl/ty=Tahitiaans LocaleNames/nl/ug=Oeigoers -LocaleNames/nl/uk=Oekra\u00efens +LocaleNames/nl/uk=Oekraïens LocaleNames/nl/ur=Urdu LocaleNames/nl/uz=Oezbeeks LocaleNames/nl/ve=Venda LocaleNames/nl/vi=Vietnamees -LocaleNames/nl/vo=Volap\u00fck +LocaleNames/nl/vo=Volapük LocaleNames/nl/wa=Waals LocaleNames/nl/wo=Wolof LocaleNames/nl/xh=Xhosa @@ -5882,22 +5882,22 @@ LocaleNames/nl/AE=Verenigde Arabische Emiraten LocaleNames/nl/AF=Afghanistan LocaleNames/nl/AG=Antigua en Barbuda LocaleNames/nl/AI=Anguilla -LocaleNames/nl/AL=Albani\u00eb -LocaleNames/nl/AM=Armeni\u00eb +LocaleNames/nl/AL=Albanië +LocaleNames/nl/AM=Armenië LocaleNames/nl/AN=Nederlandse Antillen LocaleNames/nl/AO=Angola LocaleNames/nl/AQ=Antarctica -LocaleNames/nl/AR=Argentini\u00eb +LocaleNames/nl/AR=Argentinië LocaleNames/nl/AS=Amerikaans-Samoa LocaleNames/nl/AT=Oostenrijk -LocaleNames/nl/AU=Australi\u00eb +LocaleNames/nl/AU=Australië LocaleNames/nl/AW=Aruba -LocaleNames/nl/AX=\u00c5land +LocaleNames/nl/AX=Åland LocaleNames/nl/AZ=Azerbeidzjan -LocaleNames/nl/BA=Bosni\u00eb en Herzegovina +LocaleNames/nl/BA=Bosnië en Herzegovina LocaleNames/nl/BB=Barbados LocaleNames/nl/BD=Bangladesh -LocaleNames/nl/BE=Belgi\u00eb +LocaleNames/nl/BE=België LocaleNames/nl/BF=Burkina Faso LocaleNames/nl/BG=Bulgarije LocaleNames/nl/BH=Bahrein @@ -5906,8 +5906,8 @@ LocaleNames/nl/BJ=Benin LocaleNames/nl/BM=Bermuda LocaleNames/nl/BN=Brunei LocaleNames/nl/BO=Bolivia -LocaleNames/nl/BR=Brazili\u00eb -LocaleNames/nl/BS=Bahama\u2019s +LocaleNames/nl/BR=Brazilië +LocaleNames/nl/BS=Bahama’s LocaleNames/nl/BT=Bhutan LocaleNames/nl/BV=Bouveteiland LocaleNames/nl/BW=Botswana @@ -5926,12 +5926,12 @@ LocaleNames/nl/CM=Kameroen LocaleNames/nl/CN=China LocaleNames/nl/CO=Colombia LocaleNames/nl/CR=Costa Rica -LocaleNames/nl/CS=Servi\u00eb en Montenegro +LocaleNames/nl/CS=Servië en Montenegro LocaleNames/nl/CU=Cuba -LocaleNames/nl/CV=Kaapverdi\u00eb +LocaleNames/nl/CV=Kaapverdië LocaleNames/nl/CX=Christmaseiland LocaleNames/nl/CY=Cyprus -LocaleNames/nl/CZ=Tsjechi\u00eb +LocaleNames/nl/CZ=Tsjechië LocaleNames/nl/DE=Duitsland LocaleNames/nl/DJ=Djibouti LocaleNames/nl/DK=Denemarken @@ -5944,17 +5944,17 @@ LocaleNames/nl/EG=Egypte LocaleNames/nl/EH=Westelijke Sahara LocaleNames/nl/ER=Eritrea LocaleNames/nl/ES=Spanje -LocaleNames/nl/ET=Ethiopi\u00eb +LocaleNames/nl/ET=Ethiopië LocaleNames/nl/FI=Finland LocaleNames/nl/FJ=Fiji LocaleNames/nl/FK=Falklandeilanden LocaleNames/nl/FM=Micronesia -LocaleNames/nl/FO=Faer\u00f6er +LocaleNames/nl/FO=Faeröer LocaleNames/nl/FR=Frankrijk LocaleNames/nl/GA=Gabon LocaleNames/nl/GB=Verenigd Koninkrijk LocaleNames/nl/GD=Grenada -LocaleNames/nl/GE=Georgi\u00eb +LocaleNames/nl/GE=Georgië LocaleNames/nl/GF=Frans-Guyana LocaleNames/nl/GH=Ghana LocaleNames/nl/GI=Gibraltar @@ -5972,23 +5972,23 @@ LocaleNames/nl/GY=Guyana LocaleNames/nl/HK=Hongkong SAR van China LocaleNames/nl/HM=Heard en McDonaldeilanden LocaleNames/nl/HN=Honduras -LocaleNames/nl/HR=Kroati\u00eb -LocaleNames/nl/HT=Ha\u00efti +LocaleNames/nl/HR=Kroatië +LocaleNames/nl/HT=Haïti LocaleNames/nl/HU=Hongarije -LocaleNames/nl/ID=Indonesi\u00eb +LocaleNames/nl/ID=Indonesië LocaleNames/nl/IE=Ierland -LocaleNames/nl/IL=Isra\u00ebl +LocaleNames/nl/IL=Israël LocaleNames/nl/IN=India LocaleNames/nl/IO=Brits Indische Oceaanterritorium LocaleNames/nl/IQ=Irak LocaleNames/nl/IR=Iran LocaleNames/nl/IS=IJsland -LocaleNames/nl/IT=Itali\u00eb +LocaleNames/nl/IT=Italië LocaleNames/nl/JM=Jamaica -LocaleNames/nl/JO=Jordani\u00eb +LocaleNames/nl/JO=Jordanië LocaleNames/nl/JP=Japan LocaleNames/nl/KE=Kenia -LocaleNames/nl/KG=Kirgizi\u00eb +LocaleNames/nl/KG=Kirgizië LocaleNames/nl/KH=Cambodja LocaleNames/nl/KI=Kiribati LocaleNames/nl/KM=Comoren @@ -6008,31 +6008,31 @@ LocaleNames/nl/LS=Lesotho LocaleNames/nl/LT=Litouwen LocaleNames/nl/LU=Luxemburg LocaleNames/nl/LV=Letland -LocaleNames/nl/LY=Libi\u00eb +LocaleNames/nl/LY=Libië LocaleNames/nl/MA=Marokko LocaleNames/nl/MC=Monaco -LocaleNames/nl/MD=Moldavi\u00eb +LocaleNames/nl/MD=Moldavië LocaleNames/nl/ME=Montenegro LocaleNames/nl/MG=Madagaskar LocaleNames/nl/MH=Marshalleilanden -LocaleNames/nl/MK=Noord-Macedoni\u00eb +LocaleNames/nl/MK=Noord-Macedonië LocaleNames/nl/ML=Mali LocaleNames/nl/MM=Myanmar (Birma) -LocaleNames/nl/MN=Mongoli\u00eb +LocaleNames/nl/MN=Mongolië LocaleNames/nl/MO=Macau SAR van China LocaleNames/nl/MP=Noordelijke Marianen LocaleNames/nl/MQ=Martinique -LocaleNames/nl/MR=Mauritani\u00eb +LocaleNames/nl/MR=Mauritanië LocaleNames/nl/MS=Montserrat LocaleNames/nl/MT=Malta LocaleNames/nl/MU=Mauritius LocaleNames/nl/MV=Maldiven LocaleNames/nl/MW=Malawi LocaleNames/nl/MX=Mexico -LocaleNames/nl/MY=Maleisi\u00eb +LocaleNames/nl/MY=Maleisië LocaleNames/nl/MZ=Mozambique -LocaleNames/nl/NA=Namibi\u00eb -LocaleNames/nl/NC=Nieuw-Caledoni\u00eb +LocaleNames/nl/NA=Namibië +LocaleNames/nl/NC=Nieuw-Caledonië LocaleNames/nl/NE=Niger LocaleNames/nl/NF=Norfolk LocaleNames/nl/NG=Nigeria @@ -6046,7 +6046,7 @@ LocaleNames/nl/NZ=Nieuw-Zeeland LocaleNames/nl/OM=Oman LocaleNames/nl/PA=Panama LocaleNames/nl/PE=Peru -LocaleNames/nl/PF=Frans-Polynesi\u00eb +LocaleNames/nl/PF=Frans-Polynesië LocaleNames/nl/PG=Papoea-Nieuw-Guinea LocaleNames/nl/PH=Filipijnen LocaleNames/nl/PK=Pakistan @@ -6059,29 +6059,29 @@ LocaleNames/nl/PT=Portugal LocaleNames/nl/PW=Palau LocaleNames/nl/PY=Paraguay LocaleNames/nl/QA=Qatar -LocaleNames/nl/RE=R\u00e9union -LocaleNames/nl/RO=Roemeni\u00eb -LocaleNames/nl/RS=Servi\u00eb +LocaleNames/nl/RE=Réunion +LocaleNames/nl/RO=Roemenië +LocaleNames/nl/RS=Servië LocaleNames/nl/RU=Rusland LocaleNames/nl/RW=Rwanda -LocaleNames/nl/SA=Saoedi-Arabi\u00eb +LocaleNames/nl/SA=Saoedi-Arabië LocaleNames/nl/SB=Salomonseilanden LocaleNames/nl/SC=Seychellen LocaleNames/nl/SD=Soedan LocaleNames/nl/SE=Zweden LocaleNames/nl/SG=Singapore LocaleNames/nl/SH=Sint-Helena -LocaleNames/nl/SI=Sloveni\u00eb +LocaleNames/nl/SI=Slovenië LocaleNames/nl/SJ=Spitsbergen en Jan Mayen LocaleNames/nl/SK=Slowakije LocaleNames/nl/SL=Sierra Leone LocaleNames/nl/SM=San Marino LocaleNames/nl/SN=Senegal -LocaleNames/nl/SO=Somali\u00eb +LocaleNames/nl/SO=Somalië LocaleNames/nl/SR=Suriname -LocaleNames/nl/ST=Sao Tom\u00e9 en Principe +LocaleNames/nl/ST=Sao Tomé en Principe LocaleNames/nl/SV=El Salvador -LocaleNames/nl/SY=Syri\u00eb +LocaleNames/nl/SY=Syrië LocaleNames/nl/TC=Turks- en Caicoseilanden LocaleNames/nl/TD=Tsjaad LocaleNames/nl/TF=Franse Gebieden in de zuidelijke Indische Oceaan @@ -6091,14 +6091,14 @@ LocaleNames/nl/TJ=Tadzjikistan LocaleNames/nl/TK=Tokelau LocaleNames/nl/TL=Oost-Timor LocaleNames/nl/TM=Turkmenistan -LocaleNames/nl/TN=Tunesi\u00eb +LocaleNames/nl/TN=Tunesië LocaleNames/nl/TO=Tonga LocaleNames/nl/TR=Turkije LocaleNames/nl/TT=Trinidad en Tobago LocaleNames/nl/TV=Tuvalu LocaleNames/nl/TW=Taiwan LocaleNames/nl/TZ=Tanzania -LocaleNames/nl/UA=Oekra\u00efne +LocaleNames/nl/UA=Oekraïne LocaleNames/nl/UG=Oeganda LocaleNames/nl/UM=Kleine afgelegen eilanden van de Verenigde Staten LocaleNames/nl/US=Verenigde Staten @@ -6145,17 +6145,17 @@ FormatData/sr-Latn-RS/MonthNames/8=septembar FormatData/sr-Latn/DayNames/1=ponedeljak FormatData/sr-Latn-BA/DayNames/2=utorak FormatData/sr-Latn-ME/DayNames/3=sreda -FormatData/sr-Latn-RS/DayNames/4=\u010detvrtak +FormatData/sr-Latn-RS/DayNames/4=četvrtak # FormatData/sr-Latn/DayAbbreviations/1=pon FormatData/sr-Latn-BA/DayAbbreviations/2=uto FormatData/sr-Latn-ME/DayAbbreviations/3=sre -FormatData/sr-Latn-RS/DayAbbreviations/4=\u010det +FormatData/sr-Latn-RS/DayAbbreviations/4=čet # CurrencyNames/sr-Latn/EUR=EUR -CurrencyNames/sr-Latn-BA/EUR=\u20ac +CurrencyNames/sr-Latn-BA/EUR=€ CurrencyNames/sr-Latn-BA/BAM=KM -CurrencyNames/sr-Latn-ME/EUR=\u20ac +CurrencyNames/sr-Latn-ME/EUR=€ CurrencyNames/sr-Latn-RS/EUR=EUR # FormatData/sr-Latn/TimePatterns/1=HH.mm.ss z @@ -6165,81 +6165,81 @@ FormatData/sr-Latn-RS/DatePatterns/1=dd. MMMM y. # bug 7019267 CurrencyNames/pt/adp=Peseta de Andorra -CurrencyNames/pt/aed=Dirham dos Emirados \u00c1rabes Unidos -CurrencyNames/pt/afa=Afegane (1927\u20132002) -CurrencyNames/pt/afn=Afegane afeg\u00e3o -CurrencyNames/pt/all=Lek alban\u00eas -CurrencyNames/pt/amd=Dram arm\u00eanio +CurrencyNames/pt/aed=Dirham dos Emirados Árabes Unidos +CurrencyNames/pt/afa=Afegane (1927–2002) +CurrencyNames/pt/afn=Afegane afegão +CurrencyNames/pt/all=Lek albanês +CurrencyNames/pt/amd=Dram armênio CurrencyNames/pt/ang=Florim das Antilhas Holandesas CurrencyNames/pt/aoa=Kwanza angolano CurrencyNames/pt/ars=Peso argentino -CurrencyNames/pt/ats=Xelim austr\u00edaco -CurrencyNames/pt/aud=D\u00f3lar australiano +CurrencyNames/pt/ats=Xelim austríaco +CurrencyNames/pt/aud=Dólar australiano CurrencyNames/pt/awg=Florim arubano -CurrencyNames/pt/azm=Manat azerbaijano (1993\u20132006) +CurrencyNames/pt/azm=Manat azerbaijano (1993–2006) CurrencyNames/pt/azn=Manat azeri -CurrencyNames/pt/bam=Marco convers\u00edvel da B\u00f3snia e Herzegovina -CurrencyNames/pt/bbd=D\u00f3lar barbadense +CurrencyNames/pt/bam=Marco conversível da Bósnia e Herzegovina +CurrencyNames/pt/bbd=Dólar barbadense CurrencyNames/pt/bdt=Taka bengali CurrencyNames/pt/bef=Franco belga -CurrencyNames/pt/bgl=Lev forte b\u00falgaro -CurrencyNames/pt/bgn=Lev b\u00falgaro +CurrencyNames/pt/bgl=Lev forte búlgaro +CurrencyNames/pt/bgn=Lev búlgaro CurrencyNames/pt/bhd=Dinar bareinita CurrencyNames/pt/bif=Franco burundiano -CurrencyNames/pt/bmd=D\u00f3lar bermudense -CurrencyNames/pt/bnd=D\u00f3lar bruneano +CurrencyNames/pt/bmd=Dólar bermudense +CurrencyNames/pt/bnd=Dólar bruneano CurrencyNames/pt/bov=Mvdol boliviano CurrencyNames/pt/brl=Real brasileiro -CurrencyNames/pt/bsd=D\u00f3lar bahamense -CurrencyNames/pt/btn=Ngultrum butan\u00eas +CurrencyNames/pt/bsd=Dólar bahamense +CurrencyNames/pt/btn=Ngultrum butanês CurrencyNames/pt/bwp=Pula botsuanesa -CurrencyNames/pt/byb=Rublo novo bielo-russo (1994\u20131999) -CurrencyNames/pt/byr=Rublo bielorrusso (2000\u20132016) -CurrencyNames/pt/bzd=D\u00f3lar belizenho -CurrencyNames/pt/cad=D\u00f3lar canadense -CurrencyNames/pt/cdf=Franco congol\u00eas -CurrencyNames/pt/chf=Franco su\u00ed\u00e7o +CurrencyNames/pt/byb=Rublo novo bielo-russo (1994–1999) +CurrencyNames/pt/byr=Rublo bielorrusso (2000–2016) +CurrencyNames/pt/bzd=Dólar belizenho +CurrencyNames/pt/cad=Dólar canadense +CurrencyNames/pt/cdf=Franco congolês +CurrencyNames/pt/chf=Franco suíço CurrencyNames/pt/clf=Unidades de Fomento chilenas CurrencyNames/pt/clp=Peso chileno -CurrencyNames/pt/cny=Yuan chin\u00eas +CurrencyNames/pt/cny=Yuan chinês CurrencyNames/pt/cop=Peso colombiano -CurrencyNames/pt/crc=Col\u00f3n costarriquenho -CurrencyNames/pt/csd=Dinar s\u00e9rvio (2002\u20132006) +CurrencyNames/pt/crc=Colón costarriquenho +CurrencyNames/pt/csd=Dinar sérvio (2002–2006) CurrencyNames/pt/cup=Peso cubano CurrencyNames/pt/cve=Escudo cabo-verdiano CurrencyNames/pt/cyp=Libra cipriota CurrencyNames/pt/czk=Coroa tcheca -CurrencyNames/pt/dem=Marco alem\u00e3o +CurrencyNames/pt/dem=Marco alemão CurrencyNames/pt/djf=Franco djiboutiano CurrencyNames/pt/dkk=Coroa dinamarquesa CurrencyNames/pt/dop=Peso dominicano CurrencyNames/pt/dzd=Dinar argelino CurrencyNames/pt/eek=Coroa estoniana -CurrencyNames/pt/egp=Libra eg\u00edpcia +CurrencyNames/pt/egp=Libra egípcia CurrencyNames/pt/ern=Nakfa da Eritreia CurrencyNames/pt/esp=Peseta espanhola -CurrencyNames/pt/etb=Birr et\u00edope +CurrencyNames/pt/etb=Birr etíope CurrencyNames/pt/fim=Marca finlandesa -CurrencyNames/pt/fjd=D\u00f3lar fijiano +CurrencyNames/pt/fjd=Dólar fijiano CurrencyNames/pt/fkp=Libra malvinense -CurrencyNames/pt/frf=Franco franc\u00eas +CurrencyNames/pt/frf=Franco francês CurrencyNames/pt/gbp=Libra esterlina CurrencyNames/pt/gel=Lari georgiano -CurrencyNames/pt/ghc=Cedi de Gana (1979\u20132007) -CurrencyNames/pt/ghs=Cedi gan\u00eas +CurrencyNames/pt/ghc=Cedi de Gana (1979–2007) +CurrencyNames/pt/ghs=Cedi ganês CurrencyNames/pt/gip=Libra de Gibraltar CurrencyNames/pt/gmd=Dalasi gambiano CurrencyNames/pt/gnf=Franco guineano CurrencyNames/pt/grd=Dracma grego CurrencyNames/pt/gtq=Quetzal guatemalteco -CurrencyNames/pt/gwp=Peso da Guin\u00e9-Bissau -CurrencyNames/pt/gyd=D\u00f3lar guianense -CurrencyNames/pt/hkd=D\u00f3lar de Hong Kong +CurrencyNames/pt/gwp=Peso da Guiné-Bissau +CurrencyNames/pt/gyd=Dólar guianense +CurrencyNames/pt/hkd=Dólar de Hong Kong CurrencyNames/pt/hnl=Lempira hondurenha CurrencyNames/pt/hrk=Kuna croata CurrencyNames/pt/htg=Gourde haitiano -CurrencyNames/pt/huf=Florim h\u00fangaro -CurrencyNames/pt/idr=Rupia indon\u00e9sia +CurrencyNames/pt/huf=Florim húngaro +CurrencyNames/pt/idr=Rupia indonésia CurrencyNames/pt/iep=Libra irlandesa CurrencyNames/pt/ils=Novo shekel israelense CurrencyNames/pt/inr=Rupia indiana @@ -6247,9 +6247,9 @@ CurrencyNames/pt/iqd=Dinar iraquiano CurrencyNames/pt/irr=Rial iraniano CurrencyNames/pt/isk=Coroa islandesa CurrencyNames/pt/itl=Lira italiana -CurrencyNames/pt/jmd=D\u00f3lar jamaicano +CurrencyNames/pt/jmd=Dólar jamaicano CurrencyNames/pt/jod=Dinar jordaniano -CurrencyNames/pt/jpy=Iene japon\u00eas +CurrencyNames/pt/jpy=Iene japonês CurrencyNames/pt/kes=Xelim queniano CurrencyNames/pt/kgs=Som quirguiz CurrencyNames/pt/khr=Riel cambojano @@ -6257,26 +6257,26 @@ CurrencyNames/pt/kmf=Franco comoriano CurrencyNames/pt/kpw=Won norte-coreano CurrencyNames/pt/krw=Won sul-coreano CurrencyNames/pt/kwd=Dinar kuwaitiano -CurrencyNames/pt/kyd=D\u00f3lar das Ilhas Cayman +CurrencyNames/pt/kyd=Dólar das Ilhas Cayman CurrencyNames/pt/kzt=Tenge cazaque CurrencyNames/pt/lak=Kip laosiano CurrencyNames/pt/lbp=Libra libanesa CurrencyNames/pt/lkr=Rupia cingalesa -CurrencyNames/pt/lrd=D\u00f3lar liberiano +CurrencyNames/pt/lrd=Dólar liberiano CurrencyNames/pt/lsl=Loti lesotiano CurrencyNames/pt/ltl=Litas lituano -CurrencyNames/pt/luf=Franco luxemburgu\u00eas -CurrencyNames/pt/lvl=Lats let\u00e3o -CurrencyNames/pt/lyd=Dinar l\u00edbio +CurrencyNames/pt/luf=Franco luxemburguês +CurrencyNames/pt/lvl=Lats letão +CurrencyNames/pt/lyd=Dinar líbio CurrencyNames/pt/mad=Dirham marroquino -CurrencyNames/pt/mdl=Leu mold\u00e1vio +CurrencyNames/pt/mdl=Leu moldávio CurrencyNames/pt/mga=Ariary malgaxe CurrencyNames/pt/mgf=Franco de Madagascar -CurrencyNames/pt/mkd=Dinar maced\u00f4nio +CurrencyNames/pt/mkd=Dinar macedônio CurrencyNames/pt/mmk=Quiate mianmarense CurrencyNames/pt/mnt=Tugrik mongol CurrencyNames/pt/mop=Pataca macaense -CurrencyNames/pt/mro=Ouguiya mauritana (1973\u20132017) +CurrencyNames/pt/mro=Ouguiya mauritana (1973–2017) CurrencyNames/pt/mtl=Lira maltesa CurrencyNames/pt/mur=Rupia mauriciana CurrencyNames/pt/mvr=Rupia maldivana @@ -6284,69 +6284,69 @@ CurrencyNames/pt/mwk=Kwacha malauiana CurrencyNames/pt/mxn=Peso mexicano CurrencyNames/pt/mxv=Unidade Mexicana de Investimento (UDI) CurrencyNames/pt/myr=Ringgit malaio -CurrencyNames/pt/mzm=Metical de Mo\u00e7ambique (1980\u20132006) -CurrencyNames/pt/mzn=Metical mo\u00e7ambicano -CurrencyNames/pt/nad=D\u00f3lar namibiano +CurrencyNames/pt/mzm=Metical de Moçambique (1980–2006) +CurrencyNames/pt/mzn=Metical moçambicano +CurrencyNames/pt/nad=Dólar namibiano CurrencyNames/pt/ngn=Naira nigeriana -CurrencyNames/pt/nio=C\u00f3rdoba nicaraguense -CurrencyNames/pt/nlg=Florim holand\u00eas +CurrencyNames/pt/nio=Córdoba nicaraguense +CurrencyNames/pt/nlg=Florim holandês CurrencyNames/pt/nok=Coroa norueguesa CurrencyNames/pt/npr=Rupia nepalesa -CurrencyNames/pt/nzd=D\u00f3lar neozeland\u00eas +CurrencyNames/pt/nzd=Dólar neozelandês CurrencyNames/pt/omr=Rial omanense CurrencyNames/pt/pab=Balboa panamenho CurrencyNames/pt/pen=Novo sol peruano -CurrencyNames/pt/pgk=Kina papu\u00e1sia +CurrencyNames/pt/pgk=Kina papuásia CurrencyNames/pt/php=Peso filipino CurrencyNames/pt/pkr=Rupia paquistanesa -CurrencyNames/pt/pln=Zloty polon\u00eas -CurrencyNames/pt/pte=Escudo portugu\u00eas +CurrencyNames/pt/pln=Zloty polonês +CurrencyNames/pt/pte=Escudo português CurrencyNames/pt/pyg=Guarani paraguaio CurrencyNames/pt/qar=Rial catariano -CurrencyNames/pt/rol=Leu romeno (1952\u20132006) +CurrencyNames/pt/rol=Leu romeno (1952–2006) CurrencyNames/pt/ron=Leu romeno -CurrencyNames/pt/rsd=Dinar s\u00e9rvio +CurrencyNames/pt/rsd=Dinar sérvio CurrencyNames/pt/rub=Rublo russo -CurrencyNames/pt/rur=Rublo russo (1991\u20131998) -CurrencyNames/pt/rwf=Franco ruand\u00eas +CurrencyNames/pt/rur=Rublo russo (1991–1998) +CurrencyNames/pt/rwf=Franco ruandês CurrencyNames/pt/sar=Riyal saudita -CurrencyNames/pt/sbd=D\u00f3lar das Ilhas Salom\u00e3o +CurrencyNames/pt/sbd=Dólar das Ilhas Salomão CurrencyNames/pt/scr=Rupia seichelense -CurrencyNames/pt/sdd=Dinar sudan\u00eas (1992\u20132007) +CurrencyNames/pt/sdd=Dinar sudanês (1992–2007) CurrencyNames/pt/sdg=Libra sudanesa CurrencyNames/pt/sek=Coroa sueca -CurrencyNames/pt/sgd=D\u00f3lar singapuriano +CurrencyNames/pt/sgd=Dólar singapuriano CurrencyNames/pt/shp=Libra de Santa Helena CurrencyNames/pt/sit=Tolar Bons esloveno CurrencyNames/pt/skk=Coroa eslovaca CurrencyNames/pt/sll=Leone de Serra Leoa CurrencyNames/pt/sos=Xelim somali -CurrencyNames/pt/srd=D\u00f3lar surinam\u00eas +CurrencyNames/pt/srd=Dólar surinamês CurrencyNames/pt/srg=Florim do Suriname -CurrencyNames/pt/std=Dobra de S\u00e3o Tom\u00e9 e Pr\u00edncipe (1977\u20132017) +CurrencyNames/pt/std=Dobra de São Tomé e Príncipe (1977–2017) CurrencyNames/pt/svc=Colom salvadorenho -CurrencyNames/pt/syp=Libra s\u00edria +CurrencyNames/pt/syp=Libra síria CurrencyNames/pt/szl=Lilangeni suazi -CurrencyNames/pt/thb=Baht tailand\u00eas +CurrencyNames/pt/thb=Baht tailandês CurrencyNames/pt/tjs=Somoni tadjique -CurrencyNames/pt/tmm=Manat do Turcomenist\u00e3o (1993\u20132009) +CurrencyNames/pt/tmm=Manat do Turcomenistão (1993–2009) CurrencyNames/pt/tnd=Dinar tunisiano -CurrencyNames/pt/top=Pa\u02bbanga tonganesa +CurrencyNames/pt/top=Paʻanga tonganesa CurrencyNames/pt/tpe=Escudo timorense -CurrencyNames/pt/trl=Lira turca (1922\u20132005) +CurrencyNames/pt/trl=Lira turca (1922–2005) CurrencyNames/pt/try=Lira turca -CurrencyNames/pt/ttd=D\u00f3lar de Trinidad e Tobago -CurrencyNames/pt/twd=Novo d\u00f3lar taiwan\u00eas +CurrencyNames/pt/ttd=Dólar de Trinidad e Tobago +CurrencyNames/pt/twd=Novo dólar taiwanês CurrencyNames/pt/tzs=Xelim tanzaniano CurrencyNames/pt/uah=Hryvnia ucraniano CurrencyNames/pt/ugx=Xelim ugandense -CurrencyNames/pt/usd=D\u00f3lar americano -CurrencyNames/pt/usn=D\u00f3lar norte-americano (Dia seguinte) -CurrencyNames/pt/uss=D\u00f3lar norte-americano (Mesmo dia) +CurrencyNames/pt/usd=Dólar americano +CurrencyNames/pt/usn=Dólar norte-americano (Dia seguinte) +CurrencyNames/pt/uss=Dólar norte-americano (Mesmo dia) CurrencyNames/pt/uyu=Peso uruguaio CurrencyNames/pt/uzs=Som uzbeque -CurrencyNames/pt/veb=Bol\u00edvar venezuelano (1871\u20132008) -CurrencyNames/pt/vef=Bol\u00edvar venezuelano (2008\u20132018) +CurrencyNames/pt/veb=Bolívar venezuelano (1871–2008) +CurrencyNames/pt/vef=Bolívar venezuelano (2008–2018) CurrencyNames/pt/vnd=Dong vietnamita CurrencyNames/pt/vuv=Vatu de Vanuatu CurrencyNames/pt/wst=Tala samoano @@ -6354,30 +6354,30 @@ CurrencyNames/pt/xaf=Franco CFA de BEAC CurrencyNames/pt/xag=Prata CurrencyNames/pt/xau=Ouro CurrencyNames/pt/xba=Unidade Composta Europeia -CurrencyNames/pt/xbb=Unidade Monet\u00e1ria Europeia +CurrencyNames/pt/xbb=Unidade Monetária Europeia CurrencyNames/pt/xbc=Unidade de Conta Europeia (XBC) CurrencyNames/pt/xbd=Unidade de Conta Europeia (XBD) -CurrencyNames/pt/xcd=D\u00f3lar do Caribe Oriental +CurrencyNames/pt/xcd=Dólar do Caribe Oriental CurrencyNames/pt/xdr=Direitos Especiais de Giro -CurrencyNames/pt/xfo=Franco-ouro franc\u00eas -CurrencyNames/pt/xfu=Franco UIC franc\u00eas +CurrencyNames/pt/xfo=Franco-ouro francês +CurrencyNames/pt/xfu=Franco UIC francês CurrencyNames/pt/xof=Franco CFA de BCEAO -CurrencyNames/pt/xpd=Pal\u00e1dio +CurrencyNames/pt/xpd=Paládio CurrencyNames/pt/xpf=Franco CFP CurrencyNames/pt/xpt=Platina -CurrencyNames/pt/xts=C\u00f3digo de Moeda de Teste +CurrencyNames/pt/xts=Código de Moeda de Teste CurrencyNames/pt/xxx=Moeda desconhecida CurrencyNames/pt/yer=Rial iemenita -CurrencyNames/pt/yum=Dinar noviy iugoslavo (1994\u20132002) +CurrencyNames/pt/yum=Dinar noviy iugoslavo (1994–2002) CurrencyNames/pt/zar=Rand sul-africano -CurrencyNames/pt/zmk=Cuacha zambiano (1968\u20132012) -CurrencyNames/pt/zwd=D\u00f3lar do Zimb\u00e1bue (1980\u20132008) +CurrencyNames/pt/zmk=Cuacha zambiano (1968–2012) +CurrencyNames/pt/zwd=Dólar do Zimbábue (1980–2008) # bug 7020960 -CurrencyNames/sr_RS/RSD=\u0434\u0438\u043d. +CurrencyNames/sr_RS/RSD=дин. # bug 7025837 -CurrencyNames/sr-Latn-BA/bam=Bosanskohercegova\u010dka konvertibilna marka +CurrencyNames/sr-Latn-BA/bam=Bosanskohercegovačka konvertibilna marka CurrencyNames/sr-Latn-BA/eur=Evro CurrencyNames/sr-Latn-ME/eur=Evro CurrencyNames/sr-Latn-RS/rsd=srpski dinar @@ -6398,7 +6398,7 @@ CurrencyNames//byr=Belarusian Ruble (2000-2016) CurrencyNames//cdf=Congolese Franc CurrencyNames//clf=Chilean Unit of Account (UF) CurrencyNames//cny=Chinese Yuan -CurrencyNames//crc=Costa Rican Col\u00f3n +CurrencyNames//crc=Costa Rican Colón CurrencyNames//csd=Serbian Dinar (2002-2006) CurrencyNames//cve=Cape Verdean Escudo CurrencyNames//cyp=Cypriot Pound @@ -6412,7 +6412,7 @@ CurrencyNames//gnf=Guinean Franc CurrencyNames//gtq=Guatemalan Quetzal CurrencyNames//gyd=Guyanaese Dollar CurrencyNames//hnl=Honduran Lempira -CurrencyNames//isk=Icelandic Kr\u00f3na +CurrencyNames//isk=Icelandic Króna CurrencyNames//kgs=Kyrgystani Som CurrencyNames//kmf=Comorian Franc CurrencyNames//kzt=Kazakhstani Tenge @@ -6430,7 +6430,7 @@ CurrencyNames//mxv=Mexican Investment Unit CurrencyNames//mzm=Mozambican Metical (1980-2006) CurrencyNames//mzn=Mozambican Metical CurrencyNames//nad=Namibian Dollar -CurrencyNames//nio=Nicaraguan C\u00f3rdoba +CurrencyNames//nio=Nicaraguan Córdoba CurrencyNames//nlg=Dutch Guilder CurrencyNames//omr=Omani Rial CurrencyNames//pgk=Papua New Guinean Kina @@ -6445,20 +6445,20 @@ CurrencyNames//sle=Sierra Leonean Leone CurrencyNames//sll=Sierra Leonean Leone CurrencyNames//srd=Surinamese Dollar CurrencyNames//srg=Surinamese Guilder -CurrencyNames//std=S\u00e3o Tom\u00e9 and Pr\u00edncipe Dobra -CurrencyNames//svc=Salvadoran Col\u00f3n +CurrencyNames//std=São Tomé and Príncipe Dobra +CurrencyNames//svc=Salvadoran Colón CurrencyNames//szl=Swazi Lilangeni CurrencyNames//tjs=Tajikistani Somoni CurrencyNames//tmm=Turkmenistani Manat (1993-2009) -CurrencyNames//top=Tongan Pa\u02bbanga +CurrencyNames//top=Tongan Paʻanga CurrencyNames//tpe=Timorese Escudo CurrencyNames//trl=Turkish Lira (1922-2005) CurrencyNames//try=Turkish Lira CurrencyNames//twd=New Taiwan Dollar CurrencyNames//uyu=Uruguayan Peso CurrencyNames//uzs=Uzbekistan Som -CurrencyNames//veb=Venezuelan Bol\u00edvar (1871-2008) -CurrencyNames//vef=Venezuelan Bol\u00edvar +CurrencyNames//veb=Venezuelan Bolívar (1871-2008) +CurrencyNames//vef=Venezuelan Bolívar CurrencyNames//wst=Samoan Tala CurrencyNames//xxx=Unknown Currency CurrencyNames//yum=Yugoslavian New Dinar (1994-2002) @@ -6485,8 +6485,8 @@ CurrencyNames/de/mur=Mauritius-Rupie CurrencyNames/de/mzm=Mosambikanischer Metical (1980-2006) CurrencyNames/de/mzn=Mosambikanischer Metical CurrencyNames/de/nad=Namibischer Dollar -CurrencyNames/de/nzd=Neuseel\u00e4ndischer Dollar -CurrencyNames/de/ron=Rum\u00e4nischer Leu +CurrencyNames/de/nzd=Neuseeländischer Dollar +CurrencyNames/de/ron=Rumänischer Leu CurrencyNames/de/rsd=Serbischer Dinar CurrencyNames/de/rwf=Ruanda-Franc CurrencyNames/de/sbd=Salomonen-Dollar @@ -6496,226 +6496,226 @@ CurrencyNames/de/sgd=Singapur-Dollar CurrencyNames/de/sos=Somalischer Schilling CurrencyNames/de/srd=Suriname-Dollar CurrencyNames/de/tpe=Escudo (Portugiesisch-Timor) -CurrencyNames/de/trl=T\u00fcrkische Lira (1922-2005) -CurrencyNames/de/try=T\u00fcrkische Lira +CurrencyNames/de/trl=Türkische Lira (1922-2005) +CurrencyNames/de/try=Türkische Lira CurrencyNames/de/ttd=Trinidad/Tobago-Dollar CurrencyNames/de/twd=Neu-Taiwan Dollar CurrencyNames/de/tzs=Tansania-Schilling CurrencyNames/de/ugx=Uganda-Schilling CurrencyNames/de/usd=US-Dollar -CurrencyNames/de/vef=Venezolanischer Bol\u00edvar Fuerte +CurrencyNames/de/vef=Venezolanischer Bolívar Fuerte CurrencyNames/de/xag=Silber CurrencyNames/de/xau=Gold CurrencyNames/de/xbb=European Monetary Unit CurrencyNames/de/xpd=Palladium CurrencyNames/de/xpt=Platin -CurrencyNames/de/xts=Testw\u00e4hrungscode -CurrencyNames/de/xxx=Unbekannte W\u00e4hrung +CurrencyNames/de/xts=Testwährungscode +CurrencyNames/de/xxx=Unbekannte Währung CurrencyNames/de/yer=Jemen-Rial -CurrencyNames/de/zar=S\u00fcdafrikanischer Rand +CurrencyNames/de/zar=Südafrikanischer Rand CurrencyNames/de/zwd=Simbabwe-Dollar (1980-2008) -CurrencyNames/es/aed=d\u00edrham de los Emiratos \u00c1rabes Unidos -CurrencyNames/es/azm=manat azer\u00ed (1993\u20132006) +CurrencyNames/es/aed=dírham de los Emiratos Árabes Unidos +CurrencyNames/es/azm=manat azerí (1993–2006) CurrencyNames/es/azn=manat azerbaiyano CurrencyNames/es/csd=antiguo dinar serbio -CurrencyNames/es/ghc=cedi ghan\u00e9s (1979\u20132007) +CurrencyNames/es/ghc=cedi ghanés (1979–2007) CurrencyNames/es/ghs=cedi -CurrencyNames/es/mzm=antiguo metical mozambique\u00f1o +CurrencyNames/es/mzm=antiguo metical mozambiqueño CurrencyNames/es/mzn=metical CurrencyNames/es/rsd=dinar serbio CurrencyNames/es/sdg=libra sudanesa -CurrencyNames/es/trl=lira turca (1922\u20132005) -CurrencyNames/es/vef=bol\u00edvar venezolano (2008\u20132018) +CurrencyNames/es/trl=lira turca (1922–2005) +CurrencyNames/es/vef=bolívar venezolano (2008–2018) -CurrencyNames/fr/afa=afghani (1927\u20132002) +CurrencyNames/fr/afa=afghani (1927–2002) CurrencyNames/fr/all=lek albanais CurrencyNames/fr/ang=florin antillais CurrencyNames/fr/awg=florin arubais -CurrencyNames/fr/azm=manat az\u00e9ri (1993\u20132006) -CurrencyNames/fr/azn=manat az\u00e9ri +CurrencyNames/fr/azm=manat azéri (1993–2006) +CurrencyNames/fr/azn=manat azéri CurrencyNames/fr/bam=mark convertible bosniaque CurrencyNames/fr/bbd=dollar barbadien CurrencyNames/fr/bdt=taka bangladeshi -CurrencyNames/fr/bgl=lev bulgare (1962\u20131999) +CurrencyNames/fr/bgl=lev bulgare (1962–1999) CurrencyNames/fr/bgn=lev bulgare -CurrencyNames/fr/bhd=dinar bahre\u00efni +CurrencyNames/fr/bhd=dinar bahreïni CurrencyNames/fr/bif=franc burundais CurrencyNames/fr/bmd=dollar bermudien -CurrencyNames/fr/bnd=dollar brun\u00e9ien +CurrencyNames/fr/bnd=dollar brunéien CurrencyNames/fr/bov=mvdol bolivien -CurrencyNames/fr/brl=r\u00e9al br\u00e9silien -CurrencyNames/fr/bsd=dollar baham\u00e9en +CurrencyNames/fr/brl=réal brésilien +CurrencyNames/fr/bsd=dollar bahaméen CurrencyNames/fr/btn=ngultrum bouthanais CurrencyNames/fr/bwp=pula botswanais -CurrencyNames/fr/bzd=dollar b\u00e9liz\u00e9en +CurrencyNames/fr/bzd=dollar bélizéen CurrencyNames/fr/cny=yuan renminbi chinois -CurrencyNames/fr/crc=col\u00f3n costaricain -CurrencyNames/fr/csd=dinar serbo-mont\u00e9n\u00e9grin +CurrencyNames/fr/crc=colón costaricain +CurrencyNames/fr/csd=dinar serbo-monténégrin CurrencyNames/fr/cve=escudo capverdien CurrencyNames/fr/cyp=livre chypriote CurrencyNames/fr/dem=mark allemand CurrencyNames/fr/djf=franc djiboutien -CurrencyNames/fr/ern=nafka \u00e9rythr\u00e9en -CurrencyNames/fr/etb=birr \u00e9thiopien +CurrencyNames/fr/ern=nafka érythréen +CurrencyNames/fr/etb=birr éthiopien CurrencyNames/fr/fjd=dollar fidjien -CurrencyNames/fr/fkp=livre des \u00eeles Malouines -CurrencyNames/fr/gel=lari g\u00e9orgien -CurrencyNames/fr/ghs=c\u00e9di ghan\u00e9en +CurrencyNames/fr/fkp=livre des îles Malouines +CurrencyNames/fr/gel=lari géorgien +CurrencyNames/fr/ghs=cédi ghanéen CurrencyNames/fr/gmd=dalasi gambien CurrencyNames/fr/grd=drachme grecque -CurrencyNames/fr/gtq=quetzal guat\u00e9malt\u00e8que -CurrencyNames/fr/gwp=peso bissau-guin\u00e9en +CurrencyNames/fr/gtq=quetzal guatémaltèque +CurrencyNames/fr/gwp=peso bissau-guinéen CurrencyNames/fr/hnl=lempira hondurien CurrencyNames/fr/hrk=kuna croate -CurrencyNames/fr/htg=gourde ha\u00eftienne +CurrencyNames/fr/htg=gourde haïtienne CurrencyNames/fr/huf=forint hongrois -CurrencyNames/fr/idr=roupie indon\u00e9sienne -CurrencyNames/fr/ils=nouveau shekel isra\u00e9lien +CurrencyNames/fr/idr=roupie indonésienne +CurrencyNames/fr/ils=nouveau shekel israélien CurrencyNames/fr/iqd=dinar irakien CurrencyNames/fr/jpy=yen japonais -CurrencyNames/fr/kes=shilling k\u00e9nyan +CurrencyNames/fr/kes=shilling kényan CurrencyNames/fr/kgs=som kirghize CurrencyNames/fr/khr=riel cambodgien CurrencyNames/fr/kmf=franc comorien -CurrencyNames/fr/kwd=dinar kowe\u00eftien +CurrencyNames/fr/kwd=dinar koweïtien CurrencyNames/fr/kzt=tenge kazakh CurrencyNames/fr/lak=kip loatien CurrencyNames/fr/lkr=roupie srilankaise CurrencyNames/fr/lsl=loti lesothan CurrencyNames/fr/mga=ariary malgache -CurrencyNames/fr/mkd=denar mac\u00e9donien +CurrencyNames/fr/mkd=denar macédonien CurrencyNames/fr/mmk=kyat myanmarais CurrencyNames/fr/mnt=tugrik mongol CurrencyNames/fr/mop=pataca macanaise -CurrencyNames/fr/mro=ouguiya mauritanien (1973\u20132017) +CurrencyNames/fr/mro=ouguiya mauritanien (1973–2017) CurrencyNames/fr/mvr=rufiyaa maldivien CurrencyNames/fr/mwk=kwacha malawite CurrencyNames/fr/myr=ringgit malais CurrencyNames/fr/mzn=metical mozambicain -CurrencyNames/fr/ngn=naira nig\u00e9rian -CurrencyNames/fr/nio=c\u00f3rdoba oro nicaraguayen -CurrencyNames/fr/npr=roupie n\u00e9palaise -CurrencyNames/fr/pab=balboa panam\u00e9en -CurrencyNames/fr/pgk=kina papouan-n\u00e9o-guin\u00e9en +CurrencyNames/fr/ngn=naira nigérian +CurrencyNames/fr/nio=córdoba oro nicaraguayen +CurrencyNames/fr/npr=roupie népalaise +CurrencyNames/fr/pab=balboa panaméen +CurrencyNames/fr/pgk=kina papouan-néo-guinéen CurrencyNames/fr/pkr=roupie pakistanaise CurrencyNames/fr/pln=zloty polonais -CurrencyNames/fr/pyg=guaran\u00ed paraguayen +CurrencyNames/fr/pyg=guaraní paraguayen CurrencyNames/fr/qar=riyal qatari CurrencyNames/fr/ron=leu roumain CurrencyNames/fr/rsd=dinar serbe CurrencyNames/fr/rub=rouble russe -CurrencyNames/fr/rur=rouble russe (1991\u20131998) -CurrencyNames/fr/sbd=dollar des \u00eeles Salomon +CurrencyNames/fr/rur=rouble russe (1991–1998) +CurrencyNames/fr/sbd=dollar des îles Salomon CurrencyNames/fr/sdg=livre soudanaise -CurrencyNames/fr/sit=tolar slov\u00e8ne -CurrencyNames/fr/sll=leone sierra-l\u00e9onais +CurrencyNames/fr/sit=tolar slovène +CurrencyNames/fr/sll=leone sierra-léonais CurrencyNames/fr/sos=shilling somalien CurrencyNames/fr/srg=florin surinamais -CurrencyNames/fr/std=dobra santom\u00e9en (1977\u20132017) -CurrencyNames/fr/svc=col\u00f3n salvadorien +CurrencyNames/fr/std=dobra santoméen (1977–2017) +CurrencyNames/fr/svc=colón salvadorien CurrencyNames/fr/szl=lilangeni swazi -CurrencyNames/fr/thb=baht tha\u00eflandais +CurrencyNames/fr/thb=baht thaïlandais CurrencyNames/fr/tjs=somoni tadjik -CurrencyNames/fr/tmm=manat turkm\u00e8ne -CurrencyNames/fr/top=pa\u2019anga tongan +CurrencyNames/fr/tmm=manat turkmène +CurrencyNames/fr/top=pa’anga tongan CurrencyNames/fr/tpe=escudo timorais -CurrencyNames/fr/ttd=dollar de Trinit\u00e9-et-Tobago -CurrencyNames/fr/twd=nouveau dollar ta\u00efwanais +CurrencyNames/fr/ttd=dollar de Trinité-et-Tobago +CurrencyNames/fr/twd=nouveau dollar taïwanais CurrencyNames/fr/tzs=shilling tanzanien CurrencyNames/fr/uah=hryvnia ukrainienne CurrencyNames/fr/uzs=sum ouzbek -CurrencyNames/fr/vef=bolivar v\u00e9n\u00e9zu\u00e9lien (2008\u20132018) -CurrencyNames/fr/vnd=d\u00f4ng vietnamien +CurrencyNames/fr/vef=bolivar vénézuélien (2008–2018) +CurrencyNames/fr/vnd=dông vietnamien CurrencyNames/fr/vuv=vatu vanuatuan CurrencyNames/fr/wst=tala samoan CurrencyNames/fr/xts=(devise de test) CurrencyNames/fr/xxx=devise inconnue ou non valide -CurrencyNames/fr/yer=riyal y\u00e9m\u00e9nite +CurrencyNames/fr/yer=riyal yéménite CurrencyNames/fr/zar=rand sud-africain -CurrencyNames/fr/zmk=kwacha zambien (1968\u20132012) -CurrencyNames/fr/zwd=dollar zimbabw\u00e9en +CurrencyNames/fr/zmk=kwacha zambien (1968–2012) +CurrencyNames/fr/zwd=dollar zimbabwéen -CurrencyNames/it/azm=manat azero (1993\u20132006) +CurrencyNames/it/azm=manat azero (1993–2006) CurrencyNames/it/ghs=cedi ghanese CurrencyNames/it/iep=sterlina irlandese CurrencyNames/it/mzn=metical mozambicano CurrencyNames/it/rsd=dinaro serbo CurrencyNames/it/sdg=sterlina sudanese CurrencyNames/it/srd=dollaro del Suriname -CurrencyNames/it/vef=bol\u00edvar venezuelano (2008\u20132018) +CurrencyNames/it/vef=bolívar venezuelano (2008–2018) CurrencyNames/it/xag=argento CurrencyNames/it/xpd=palladio -CurrencyNames/ja/azm=\u30a2\u30bc\u30eb\u30d0\u30a4\u30b8\u30e3\u30f3\u30fb\u30de\u30ca\u30c8(1993-2006) -CurrencyNames/ja/azn=\u30a2\u30bc\u30eb\u30d0\u30a4\u30b8\u30e3\u30f3\u30fb\u30de\u30ca\u30c8 -CurrencyNames/ja/ghc=\u30ac\u30fc\u30ca\u30fb\u30bb\u30c7\u30a3(1979-2007) -CurrencyNames/ja/ghs=\u30ac\u30fc\u30ca\u30fb\u30bb\u30c7\u30a3 -CurrencyNames/ja/mzn=\u30e2\u30b6\u30f3\u30d3\u30fc\u30af\u30fb\u30e1\u30c6\u30a3\u30ab\u30eb -CurrencyNames/ja/rol=\u30eb\u30fc\u30de\u30cb\u30a2\u30fb\u30ec\u30a4(1952-2006) -CurrencyNames/ja/ron=\u30eb\u30fc\u30de\u30cb\u30a2\u30fb\u30ec\u30a4 -CurrencyNames/ja/rsd=\u30bb\u30eb\u30d3\u30a2\u30fb\u30c7\u30a3\u30ca\u30fc\u30eb -CurrencyNames/ja/sdg=\u30b9\u30fc\u30c0\u30f3\u30fb\u30dd\u30f3\u30c9 -CurrencyNames/ja/srd=\u30b9\u30ea\u30ca\u30e0\u30fb\u30c9\u30eb -CurrencyNames/ja/vef=\u30d9\u30cd\u30ba\u30a8\u30e9\u30fb\u30dc\u30ea\u30d0\u30eb -CurrencyNames/ja/xag=\u9280 -CurrencyNames/ja/xpd=\u30d1\u30e9\u30b8\u30a6\u30e0 -CurrencyNames/ja/xpt=\u30d7\u30e9\u30c1\u30ca -CurrencyNames/ja/xts=\u30c6\u30b9\u30c8\u901a\u8ca8\u30b3\u30fc\u30c9 -CurrencyNames/ja/xxx=\u4e0d\u660e\u306a\u901a\u8ca8 -CurrencyNames/ja/zmk=\u30b6\u30f3\u30d3\u30a2\u30fb\u30af\u30ef\u30c1\u30e3 - -CurrencyNames/ko/aed=\uc544\ub78d\uc5d0\ubbf8\ub9ac\ud2b8 \ub514\ub974\ud568 -CurrencyNames/ko/ang=\ub124\ub35c\ub780\ub4dc\ub839 \uc548\ud2f8\ub808\uc2a4 \uae38\ub354 -CurrencyNames/ko/azm=\uc544\uc81c\ub974\ubc14\uc774\uc820 \ub9c8\ub098\ud2b8(1993\u20132006) -CurrencyNames/ko/azn=\uc544\uc81c\ub974\ubc14\uc774\uc794 \ub9c8\ub098\ud2b8 -CurrencyNames/ko/bov=\ubcfc\ub9ac\ube44\uc544\ub178 Mvdol(\uae30\uae08) -CurrencyNames/ko/chf=\uc2a4\uc704\uc2a4 \ud504\ub791 -CurrencyNames/ko/clf=\uce60\ub808 (UF) -CurrencyNames/ko/csd=\uace0 \uc138\ub974\ube44\uc544 \ub514\ub098\ub974 -CurrencyNames/ko/ghc=\uac00\ub098 \uc2dc\ub514 (1979\u20132007) -CurrencyNames/ko/ghs=\uac00\ub098 \uc2dc\ub514 -CurrencyNames/ko/mxv=\uba55\uc2dc\ucf54 (UDI) -CurrencyNames/ko/myr=\ub9d0\ub808\uc774\uc2dc\uc544 \ub9c1\uae43 -CurrencyNames/ko/mzm=\uace0 \ubaa8\uc7a0\ube44\ud06c \uba54\ud2f0\uce7c -CurrencyNames/ko/mzn=\ubaa8\uc7a0\ube44\ud06c \uba54\ud2f0\uce7c -CurrencyNames/ko/ron=\ub8e8\ub9c8\ub2c8\uc544 \ub808\uc6b0 -CurrencyNames/ko/rsd=\uc138\ub974\ube44\uc544 \ub514\ub098\ub974 -CurrencyNames/ko/sdg=\uc218\ub2e8 \ud30c\uc6b4\ub4dc -CurrencyNames/ko/srd=\uc218\ub9ac\ub0a8 \ub2ec\ub7ec -CurrencyNames/ko/top=\ud1b5\uac00 \ud30c\uc559\uac00 -CurrencyNames/ko/trl=\ud130\ud0a4 \ub9ac\ub77c -CurrencyNames/ko/try=\uc2e0 \ud130\ud0a4 \ub9ac\ub77c -CurrencyNames/ko/usn=\ubbf8\uad6d \ub2ec\ub7ec(\ub2e4\uc74c\ub0a0) -CurrencyNames/ko/uss=\ubbf8\uad6d \ub2ec\ub7ec(\ub2f9\uc77c) -CurrencyNames/ko/vef=\ubca0\ub124\uc218\uc5d8\ub77c \ubcfc\ub9ac\ubc14\ub974 (2008\u20132018) -CurrencyNames/ko/xaf=\uc911\uc559\uc544\ud504\ub9ac\uce74 CFA \ud504\ub791 -CurrencyNames/ko/xag=\uc740\ud654 -CurrencyNames/ko/xba=\uc720\ub974\ucf54 (\uc720\ub7fd \ud68c\uacc4 \ub2e8\uc704) -CurrencyNames/ko/xbb=\uc720\ub7fd \ud1b5\ud654 \ub3d9\ub9f9 -CurrencyNames/ko/xbc=\uc720\ub7fd \uacc4\uc0b0 \ub2e8\uc704 (XBC) -CurrencyNames/ko/xbd=\uc720\ub7fd \uacc4\uc0b0 \ub2e8\uc704 (XBD) -CurrencyNames/ko/xof=\uc11c\uc544\ud504\ub9ac\uce74 CFA \ud504\ub791 -CurrencyNames/ko/xpd=\ud314\ub77c\ub4d0 -CurrencyNames/ko/xpf=CFP \ud504\ub791 -CurrencyNames/ko/xpt=\ubc31\uae08 -CurrencyNames/ko/xts=\ud14c\uc2a4\ud2b8 \ud1b5\ud654 \ucf54\ub4dc -CurrencyNames/ko/xxx=\uc54c \uc218 \uc5c6\ub294 \ud1b5\ud654 \ub2e8\uc704 -CurrencyNames/ko/zwd=\uc9d0\ubc14\ube0c\uc6e8 \ub2ec\ub7ec +CurrencyNames/ja/azm=アゼルバイジャン・マナト(1993-2006) +CurrencyNames/ja/azn=アゼルバイジャン・マナト +CurrencyNames/ja/ghc=ガーナ・セディ(1979-2007) +CurrencyNames/ja/ghs=ガーナ・セディ +CurrencyNames/ja/mzn=モザンビーク・メティカル +CurrencyNames/ja/rol=ルーマニア・レイ(1952-2006) +CurrencyNames/ja/ron=ルーマニア・レイ +CurrencyNames/ja/rsd=セルビア・ディナール +CurrencyNames/ja/sdg=スーダン・ポンド +CurrencyNames/ja/srd=スリナム・ドル +CurrencyNames/ja/vef=ベネズエラ・ボリバル +CurrencyNames/ja/xag=銀 +CurrencyNames/ja/xpd=パラジウム +CurrencyNames/ja/xpt=プラチナ +CurrencyNames/ja/xts=テスト通貨コード +CurrencyNames/ja/xxx=不明な通貨 +CurrencyNames/ja/zmk=ザンビア・クワチャ + +CurrencyNames/ko/aed=아랍에미리트 디르함 +CurrencyNames/ko/ang=네덜란드령 안틸레스 길더 +CurrencyNames/ko/azm=아제르바이젠 마나트(1993–2006) +CurrencyNames/ko/azn=아제르바이잔 마나트 +CurrencyNames/ko/bov=볼리비아노 Mvdol(기금) +CurrencyNames/ko/chf=스위스 프랑 +CurrencyNames/ko/clf=칠레 (UF) +CurrencyNames/ko/csd=고 세르비아 디나르 +CurrencyNames/ko/ghc=가나 시디 (1979–2007) +CurrencyNames/ko/ghs=가나 시디 +CurrencyNames/ko/mxv=멕시코 (UDI) +CurrencyNames/ko/myr=말레이시아 링깃 +CurrencyNames/ko/mzm=고 모잠비크 메티칼 +CurrencyNames/ko/mzn=모잠비크 메티칼 +CurrencyNames/ko/ron=루마니아 레우 +CurrencyNames/ko/rsd=세르비아 디나르 +CurrencyNames/ko/sdg=수단 파운드 +CurrencyNames/ko/srd=수리남 달러 +CurrencyNames/ko/top=통가 파앙가 +CurrencyNames/ko/trl=터키 리라 +CurrencyNames/ko/try=신 터키 리라 +CurrencyNames/ko/usn=미국 달러(다음날) +CurrencyNames/ko/uss=미국 달러(당일) +CurrencyNames/ko/vef=베네수엘라 볼리바르 (2008–2018) +CurrencyNames/ko/xaf=중앙아프리카 CFA 프랑 +CurrencyNames/ko/xag=은화 +CurrencyNames/ko/xba=유르코 (유럽 회계 단위) +CurrencyNames/ko/xbb=유럽 통화 동맹 +CurrencyNames/ko/xbc=유럽 계산 단위 (XBC) +CurrencyNames/ko/xbd=유럽 계산 단위 (XBD) +CurrencyNames/ko/xof=서아프리카 CFA 프랑 +CurrencyNames/ko/xpd=팔라듐 +CurrencyNames/ko/xpf=CFP 프랑 +CurrencyNames/ko/xpt=백금 +CurrencyNames/ko/xts=테스트 통화 코드 +CurrencyNames/ko/xxx=알 수 없는 통화 단위 +CurrencyNames/ko/zwd=짐바브웨 달러 CurrencyNames/sv/adp=andorransk peseta CurrencyNames/sv/aed=emiratisk dirham -CurrencyNames/sv/afa=afghani (1927\u20132002) +CurrencyNames/sv/afa=afghani (1927–2002) CurrencyNames/sv/afn=afghansk afghani CurrencyNames/sv/all=albansk lek CurrencyNames/sv/amd=armenisk dram CurrencyNames/sv/ang=antillergulden CurrencyNames/sv/aoa=angolansk kwanza CurrencyNames/sv/ars=argentinsk peso -CurrencyNames/sv/ats=\u00f6sterrikisk schilling +CurrencyNames/sv/ats=österrikisk schilling CurrencyNames/sv/aud=australisk dollar CurrencyNames/sv/awg=arubansk florin -CurrencyNames/sv/azm=azerbajdzjansk manat (1993\u20132006) +CurrencyNames/sv/azm=azerbajdzjansk manat (1993–2006) CurrencyNames/sv/azn=azerbajdzjansk manat CurrencyNames/sv/bam=bosnisk-hercegovinsk mark (konvertibel) CurrencyNames/sv/bbd=barbadisk dollar @@ -6731,8 +6731,8 @@ CurrencyNames/sv/brl=brasiliansk real CurrencyNames/sv/bsd=bahamansk dollar CurrencyNames/sv/btn=bhutanesisk ngultrum CurrencyNames/sv/bwp=botswansk pula -CurrencyNames/sv/byb=vitrysk ny rubel (1994\u20131999) -CurrencyNames/sv/byr=vitrysk rubel (2000\u20132016) +CurrencyNames/sv/byb=vitrysk ny rubel (1994–1999) +CurrencyNames/sv/byr=vitrysk rubel (2000–2016) CurrencyNames/sv/bzd=belizisk dollar CurrencyNames/sv/cad=kanadensisk dollar CurrencyNames/sv/cdf=kongolesisk franc @@ -6741,8 +6741,8 @@ CurrencyNames/sv/clf=chilensk unidad de fomento CurrencyNames/sv/clp=chilensk peso CurrencyNames/sv/cny=kinesisk yuan CurrencyNames/sv/cop=colombiansk peso -CurrencyNames/sv/crc=costarikansk col\u00f3n -CurrencyNames/sv/csd=serbisk dinar (2002\u20132006) +CurrencyNames/sv/crc=costarikansk colón +CurrencyNames/sv/csd=serbisk dinar (2002–2006) CurrencyNames/sv/cup=kubansk peso CurrencyNames/sv/cve=kapverdisk escudo CurrencyNames/sv/cyp=cypriotiskt pund @@ -6763,7 +6763,7 @@ CurrencyNames/sv/fjd=Fijidollar CurrencyNames/sv/frf=fransk franc CurrencyNames/sv/gbp=brittiskt pund CurrencyNames/sv/gel=georgisk lari -CurrencyNames/sv/ghc=ghanansk cedi (1979\u20132007) +CurrencyNames/sv/ghc=ghanansk cedi (1979–2007) CurrencyNames/sv/ghs=ghanansk cedi CurrencyNames/sv/gip=gibraltiskt pund CurrencyNames/sv/gmd=gambisk dalasi @@ -6776,12 +6776,12 @@ CurrencyNames/sv/hrk=kroatisk kuna CurrencyNames/sv/htg=haitisk gourde CurrencyNames/sv/huf=ungersk forint CurrencyNames/sv/idr=indonesisk rupie -CurrencyNames/sv/iep=irl\u00e4ndskt pund +CurrencyNames/sv/iep=irländskt pund CurrencyNames/sv/ils=israelisk ny shekel CurrencyNames/sv/inr=indisk rupie CurrencyNames/sv/iqd=irakisk dinar CurrencyNames/sv/irr=iransk rial -CurrencyNames/sv/isk=isl\u00e4ndsk krona +CurrencyNames/sv/isk=isländsk krona CurrencyNames/sv/itl=italiensk lire CurrencyNames/sv/jmd=jamaicansk dollar CurrencyNames/sv/jod=jordansk dinar @@ -6809,9 +6809,9 @@ CurrencyNames/sv/mga=madagaskisk ariary CurrencyNames/sv/mgf=madagaskisk franc CurrencyNames/sv/mkd=makedonisk denar CurrencyNames/sv/mmk=myanmarisk kyat -CurrencyNames/sv/mnt=mongolisk t\u00f6gr\u00f6g +CurrencyNames/sv/mnt=mongolisk tögrög CurrencyNames/sv/mop=makanesisk pataca -CurrencyNames/sv/mro=mauretansk ouguiya (1973\u20132017) +CurrencyNames/sv/mro=mauretansk ouguiya (1973–2017) CurrencyNames/sv/mtl=maltesisk lire CurrencyNames/sv/mur=mauritisk rupie CurrencyNames/sv/mvr=maldivisk rufiyaa @@ -6819,15 +6819,15 @@ CurrencyNames/sv/mwk=malawisk kwacha CurrencyNames/sv/mxn=mexikansk peso CurrencyNames/sv/mxv=mexikansk unidad de inversion CurrencyNames/sv/myr=malaysisk ringgit -CurrencyNames/sv/mzm=gammal mo\u00e7ambikisk metical -CurrencyNames/sv/mzn=mo\u00e7ambikisk metical +CurrencyNames/sv/mzm=gammal moçambikisk metical +CurrencyNames/sv/mzn=moçambikisk metical CurrencyNames/sv/nad=namibisk dollar CurrencyNames/sv/ngn=nigeriansk naira -CurrencyNames/sv/nio=nicaraguansk c\u00f3rdoba -CurrencyNames/sv/nlg=nederl\u00e4ndsk gulden +CurrencyNames/sv/nio=nicaraguansk córdoba +CurrencyNames/sv/nlg=nederländsk gulden CurrencyNames/sv/nok=norsk krona CurrencyNames/sv/npr=nepalesisk rupie -CurrencyNames/sv/nzd=nyzeel\u00e4ndsk dollar +CurrencyNames/sv/nzd=nyzeeländsk dollar CurrencyNames/sv/omr=omansk rial CurrencyNames/sv/pab=panamansk balboa CurrencyNames/sv/pen=peruansk sol @@ -6838,15 +6838,15 @@ CurrencyNames/sv/pln=polsk zloty CurrencyNames/sv/pte=portugisisk escudo CurrencyNames/sv/pyg=paraguayansk guarani CurrencyNames/sv/qar=qatarisk rial -CurrencyNames/sv/rol=rum\u00e4nsk leu (1952\u20132005) -CurrencyNames/sv/ron=rum\u00e4nsk leu +CurrencyNames/sv/rol=rumänsk leu (1952–2005) +CurrencyNames/sv/ron=rumänsk leu CurrencyNames/sv/rsd=serbisk dinar CurrencyNames/sv/rub=rysk rubel -CurrencyNames/sv/rur=rysk rubel (1991\u20131998) +CurrencyNames/sv/rur=rysk rubel (1991–1998) CurrencyNames/sv/rwf=rwandisk franc CurrencyNames/sv/sar=saudisk riyal CurrencyNames/sv/scr=seychellisk rupie -CurrencyNames/sv/sdd=sudansk dinar (1992\u20132007) +CurrencyNames/sv/sdd=sudansk dinar (1992–2007) CurrencyNames/sv/sdg=sudanesiskt pund CurrencyNames/sv/sek=svensk krona CurrencyNames/sv/sgd=singaporiansk dollar @@ -6856,16 +6856,16 @@ CurrencyNames/sv/sll=sierraleonsk leone CurrencyNames/sv/sos=somalisk shilling CurrencyNames/sv/srd=surinamesisk dollar CurrencyNames/sv/srg=surinamesisk gulden -CurrencyNames/sv/svc=salvadoransk col\u00f3n +CurrencyNames/sv/svc=salvadoransk colón CurrencyNames/sv/syp=syriskt pund -CurrencyNames/sv/szl=swazil\u00e4ndsk lilangeni -CurrencyNames/sv/thb=thail\u00e4ndsk baht +CurrencyNames/sv/szl=swaziländsk lilangeni +CurrencyNames/sv/thb=thailändsk baht CurrencyNames/sv/tjs=tadzjikisk somoni -CurrencyNames/sv/tmm=turkmenistansk manat (1993\u20132009) +CurrencyNames/sv/tmm=turkmenistansk manat (1993–2009) CurrencyNames/sv/tnd=tunisisk dinar -CurrencyNames/sv/top=tongansk pa\u02bbanga -CurrencyNames/sv/tpe=\u00f6sttimoresisk escudo -CurrencyNames/sv/trl=turkisk lire (1922\u20132005) +CurrencyNames/sv/top=tongansk paʻanga +CurrencyNames/sv/tpe=östtimoresisk escudo +CurrencyNames/sv/trl=turkisk lire (1922–2005) CurrencyNames/sv/try=turkisk lira CurrencyNames/sv/ttd=Trinidaddollar CurrencyNames/sv/twd=taiwanesisk dollar @@ -6874,91 +6874,91 @@ CurrencyNames/sv/uah=ukrainsk hryvnia CurrencyNames/sv/ugx=ugandisk shilling CurrencyNames/sv/uyu=uruguayansk peso CurrencyNames/sv/uzs=uzbekisk sum -CurrencyNames/sv/veb=venezuelansk bolivar (1871\u20132008) -CurrencyNames/sv/vef=venezuelansk bol\u00edvar (2008\u20132018) +CurrencyNames/sv/veb=venezuelansk bolivar (1871–2008) +CurrencyNames/sv/vef=venezuelansk bolívar (2008–2018) CurrencyNames/sv/vnd=vietnamesisk dong CurrencyNames/sv/vuv=vanuatisk vatu -CurrencyNames/sv/wst=v\u00e4stsamoansk tala +CurrencyNames/sv/wst=västsamoansk tala CurrencyNames/sv/xag=silver CurrencyNames/sv/xau=guld CurrencyNames/sv/xba=europeisk kompositenhet -CurrencyNames/sv/xbb=europeisk monet\u00e4r enhet +CurrencyNames/sv/xbb=europeisk monetär enhet CurrencyNames/sv/xbc=europeisk kontoenhet (XBC) CurrencyNames/sv/xbd=europeisk kontoenhet (XBD) -CurrencyNames/sv/xcd=\u00f6stkaribisk dollar -CurrencyNames/sv/xdr=IMF s\u00e4rskild dragningsr\u00e4tt +CurrencyNames/sv/xcd=östkaribisk dollar +CurrencyNames/sv/xdr=IMF särskild dragningsrätt CurrencyNames/sv/xfo=fransk guldfranc CurrencyNames/sv/xpd=palladium CurrencyNames/sv/xpt=platina CurrencyNames/sv/xts=testvalutaenhet -CurrencyNames/sv/xxx=ok\u00e4nd valuta +CurrencyNames/sv/xxx=okänd valuta CurrencyNames/sv/yer=jemenitisk rial -CurrencyNames/sv/yum=jugoslavisk dinar (1994\u20132002) +CurrencyNames/sv/yum=jugoslavisk dinar (1994–2002) CurrencyNames/sv/zar=sydafrikansk rand -CurrencyNames/sv/zmk=zambisk kwacha (1968\u20132012) +CurrencyNames/sv/zmk=zambisk kwacha (1968–2012) CurrencyNames/sv/zwd=Zimbabwe-dollar -CurrencyNames/zh_CN/ang=\u8377\u5c5e\u5b89\u7684\u5217\u65af\u76fe -CurrencyNames/zh_CN/azm=\u963f\u585e\u62dc\u7586\u9a6c\u7eb3\u7279 (1993-2006) -CurrencyNames/zh_CN/azn=\u963f\u585e\u62dc\u7586\u9a6c\u7eb3\u7279 -CurrencyNames/zh_CN/csd=\u585e\u5c14\u7ef4\u4e9a\u7b2c\u7eb3\u5c14 (2002-2006) -CurrencyNames/zh_CN/ghs=\u52a0\u7eb3\u585e\u5730 -CurrencyNames/zh_CN/mzm=\u83ab\u6851\u6bd4\u514b\u7f8e\u63d0\u5361 (1980-2006) -CurrencyNames/zh_CN/mzn=\u83ab\u6851\u6bd4\u514b\u7f8e\u63d0\u5361 -CurrencyNames/zh_CN/ron=\u7f57\u9a6c\u5c3c\u4e9a\u5217\u4f0a -CurrencyNames/zh_CN/rsd=\u585e\u5c14\u7ef4\u4e9a\u7b2c\u7eb3\u5c14 -CurrencyNames/zh_CN/shp=\u5723\u8d6b\u52d2\u62ff\u9551 -CurrencyNames/zh_CN/twd=\u65b0\u53f0\u5e01 -CurrencyNames/zh_CN/vef=\u59d4\u5185\u745e\u62c9\u73bb\u5229\u74e6\u5c14 -CurrencyNames/zh_CN/xxx=\u672a\u77e5\u8d27\u5e01 - -CurrencyNames/zh_TW/afa=\u963f\u5bcc\u6c57\u5c3c (1927\u20132002) -CurrencyNames/zh_TW/ang=\u8377\u5c6c\u5b89\u5730\u5217\u65af\u76fe -CurrencyNames/zh_TW/azm=\u4e9e\u585e\u62dc\u7136\u99ac\u7d0d\u7279 (1993\u20132006) -CurrencyNames/zh_TW/azn=\u4e9e\u585e\u62dc\u7136\u99ac\u7d0d\u7279 -CurrencyNames/zh_TW/bwp=\u6ce2\u672d\u90a3\u666e\u62c9 -CurrencyNames/zh_TW/bzd=\u8c9d\u91cc\u65af\u5143 -CurrencyNames/zh_TW/csd=\u820a\u585e\u723e\u7dad\u4e9e\u7b2c\u7d0d\u723e -CurrencyNames/zh_TW/cyp=\u8cfd\u666e\u52d2\u65af\u938a -CurrencyNames/zh_TW/ghc=\u8fe6\u7d0d\u8cfd\u5730 (1979\u20132007) -CurrencyNames/zh_TW/ghs=\u8fe6\u7d0d\u585e\u5730 -CurrencyNames/zh_TW/gwp=\u5e7e\u5167\u4e9e\u6bd4\u7d22\u62ab\u7d22 -CurrencyNames/zh_TW/huf=\u5308\u7259\u5229\u798f\u6797 -CurrencyNames/zh_TW/idr=\u5370\u5c3c\u76fe -CurrencyNames/zh_TW/inr=\u5370\u5ea6\u76e7\u6bd4 -CurrencyNames/zh_TW/kpw=\u5317\u97d3\u5143 -CurrencyNames/zh_TW/krw=\u97d3\u5143 -CurrencyNames/zh_TW/lak=\u5bee\u570b\u57fa\u666e -CurrencyNames/zh_TW/mad=\u6469\u6d1b\u54e5\u8fea\u62c9\u59c6 -CurrencyNames/zh_TW/mxn=\u58a8\u897f\u54e5\u62ab\u7d22 -CurrencyNames/zh_TW/mxv=\u58a8\u897f\u54e5\u8f49\u63db\u55ae\u4f4d (UDI) -CurrencyNames/zh_TW/myr=\u99ac\u4f86\u897f\u4e9e\u4ee4\u5409 -CurrencyNames/zh_TW/mzn=\u83ab\u4e09\u6bd4\u514b\u6885\u8482\u5361\u723e -CurrencyNames/zh_TW/nio=\u5c3c\u52a0\u62c9\u74dc\u91d1\u79d1\u591a\u5df4 -CurrencyNames/zh_TW/rol=\u820a\u7f85\u99ac\u5c3c\u4e9e\u5217\u4f0a -CurrencyNames/zh_TW/ron=\u7f85\u99ac\u5c3c\u4e9e\u5217\u4f0a -CurrencyNames/zh_TW/rsd=\u585e\u723e\u7dad\u4e9e\u6234\u7d0d -CurrencyNames/zh_TW/scr=\u585e\u5e2d\u723e\u76e7\u6bd4 -CurrencyNames/zh_TW/sdg=\u8607\u4e39\u938a -CurrencyNames/zh_TW/shp=\u8056\u8d6b\u52d2\u62ff\u938a -CurrencyNames/zh_TW/srd=\u8607\u5229\u5357\u5143 -CurrencyNames/zh_TW/srg=\u8607\u5229\u5357\u57fa\u723e -CurrencyNames/zh_TW/svc=\u85a9\u723e\u74e6\u591a\u79d1\u90ce -CurrencyNames/zh_TW/szl=\u53f2\u74e6\u6fdf\u862d\u91cc\u6717\u5409\u5c3c -CurrencyNames/zh_TW/tpe=\u5e1d\u6c76\u57c3\u65af\u5eab\u591a -CurrencyNames/zh_TW/ttd=\u5343\u91cc\u9054\u53ca\u6258\u5df4\u54e5\u5143 -CurrencyNames/zh_TW/tzs=\u5766\u5c1a\u5c3c\u4e9e\u5148\u4ee4 -CurrencyNames/zh_TW/uzs=\u70cf\u8332\u5225\u514b\u7d22\u59c6 -CurrencyNames/zh_TW/veb=\u59d4\u5167\u745e\u62c9\u73bb\u5229\u74e6 (1871\u20132008) -CurrencyNames/zh_TW/vef=\u59d4\u5167\u745e\u62c9\u73bb\u5229\u74e6 (2008\u20132018) -CurrencyNames/zh_TW/xaf=\u6cd5\u90ce (CFA\u2013BEAC) -CurrencyNames/zh_TW/xag=\u767d\u9280 -CurrencyNames/zh_TW/xof=\u6cd5\u90ce (CFA\u2013BCEAO) -CurrencyNames/zh_TW/xpd=\u5e15\u62c9\u72c4\u6602 -CurrencyNames/zh_TW/xpt=\u767d\u91d1 -CurrencyNames/zh_TW/xts=\u6e2c\u8a66\u7528\u8ca8\u5e63\u4ee3\u78bc -CurrencyNames/zh_TW/xxx=\u672a\u77e5\u8ca8\u5e63 -CurrencyNames/zh_TW/yer=\u8449\u9580\u91cc\u4e9e\u723e +CurrencyNames/zh_CN/ang=荷属安的列斯盾 +CurrencyNames/zh_CN/azm=阿塞拜疆马纳特 (1993-2006) +CurrencyNames/zh_CN/azn=阿塞拜疆马纳特 +CurrencyNames/zh_CN/csd=塞尔维亚第纳尔 (2002-2006) +CurrencyNames/zh_CN/ghs=加纳塞地 +CurrencyNames/zh_CN/mzm=莫桑比克美提卡 (1980-2006) +CurrencyNames/zh_CN/mzn=莫桑比克美提卡 +CurrencyNames/zh_CN/ron=罗马尼亚列伊 +CurrencyNames/zh_CN/rsd=塞尔维亚第纳尔 +CurrencyNames/zh_CN/shp=圣赫勒拿镑 +CurrencyNames/zh_CN/twd=新台币 +CurrencyNames/zh_CN/vef=委内瑞拉玻利瓦尔 +CurrencyNames/zh_CN/xxx=未知货币 + +CurrencyNames/zh_TW/afa=阿富汗尼 (1927–2002) +CurrencyNames/zh_TW/ang=荷屬安地列斯盾 +CurrencyNames/zh_TW/azm=亞塞拜然馬納特 (1993–2006) +CurrencyNames/zh_TW/azn=亞塞拜然馬納特 +CurrencyNames/zh_TW/bwp=波札那普拉 +CurrencyNames/zh_TW/bzd=貝里斯元 +CurrencyNames/zh_TW/csd=舊塞爾維亞第納爾 +CurrencyNames/zh_TW/cyp=賽普勒斯鎊 +CurrencyNames/zh_TW/ghc=迦納賽地 (1979–2007) +CurrencyNames/zh_TW/ghs=迦納塞地 +CurrencyNames/zh_TW/gwp=幾內亞比索披索 +CurrencyNames/zh_TW/huf=匈牙利福林 +CurrencyNames/zh_TW/idr=印尼盾 +CurrencyNames/zh_TW/inr=印度盧比 +CurrencyNames/zh_TW/kpw=北韓元 +CurrencyNames/zh_TW/krw=韓元 +CurrencyNames/zh_TW/lak=寮國基普 +CurrencyNames/zh_TW/mad=摩洛哥迪拉姆 +CurrencyNames/zh_TW/mxn=墨西哥披索 +CurrencyNames/zh_TW/mxv=墨西哥轉換單位 (UDI) +CurrencyNames/zh_TW/myr=馬來西亞令吉 +CurrencyNames/zh_TW/mzn=莫三比克梅蒂卡爾 +CurrencyNames/zh_TW/nio=尼加拉瓜金科多巴 +CurrencyNames/zh_TW/rol=舊羅馬尼亞列伊 +CurrencyNames/zh_TW/ron=羅馬尼亞列伊 +CurrencyNames/zh_TW/rsd=塞爾維亞戴納 +CurrencyNames/zh_TW/scr=塞席爾盧比 +CurrencyNames/zh_TW/sdg=蘇丹鎊 +CurrencyNames/zh_TW/shp=聖赫勒拿鎊 +CurrencyNames/zh_TW/srd=蘇利南元 +CurrencyNames/zh_TW/srg=蘇利南基爾 +CurrencyNames/zh_TW/svc=薩爾瓦多科郎 +CurrencyNames/zh_TW/szl=史瓦濟蘭里朗吉尼 +CurrencyNames/zh_TW/tpe=帝汶埃斯庫多 +CurrencyNames/zh_TW/ttd=千里達及托巴哥元 +CurrencyNames/zh_TW/tzs=坦尚尼亞先令 +CurrencyNames/zh_TW/uzs=烏茲別克索姆 +CurrencyNames/zh_TW/veb=委內瑞拉玻利瓦 (1871–2008) +CurrencyNames/zh_TW/vef=委內瑞拉玻利瓦 (2008–2018) +CurrencyNames/zh_TW/xaf=法郎 (CFA–BEAC) +CurrencyNames/zh_TW/xag=白銀 +CurrencyNames/zh_TW/xof=法郎 (CFA–BCEAO) +CurrencyNames/zh_TW/xpd=帕拉狄昂 +CurrencyNames/zh_TW/xpt=白金 +CurrencyNames/zh_TW/xts=測試用貨幣代碼 +CurrencyNames/zh_TW/xxx=未知貨幣 +CurrencyNames/zh_TW/yer=葉門里亞爾 # bug 7036905 CurrencyNames/de/afa=Afghani (1927-2002) @@ -6967,7 +6967,7 @@ CurrencyNames/de/bob=Bolivianischer Boliviano CurrencyNames/de/dem=Deutsche Mark CurrencyNames/de/mwk=Malawi-Kwacha CurrencyNames/de/mxv=Unidad De Inversion (Mexiko) -CurrencyNames/de/svc=El-Salvador-Col\u00f3n +CurrencyNames/de/svc=El-Salvador-Colón CurrencyNames/it/bob=boliviano @@ -6989,40 +6989,40 @@ CurrencyNames/de/zwl=Simbabwe-Dollar (2009) CurrencyNames/es/cuc=peso cubano convertible CurrencyNames/es/tmt=manat turcomano -CurrencyNames/es/zwl=d\u00f3lar zimbabuense +CurrencyNames/es/zwl=dólar zimbabuense CurrencyNames/es_CU/CUP=CU$ CurrencyNames/es_CU/CUC=CUC$ CurrencyNames/et_EE/eek=Eesti kroon -CurrencyNames/et_EE/EUR=\u20ac +CurrencyNames/et_EE/EUR=€ CurrencyNames/et_EE/eur=euro CurrencyNames/fr/cuc=peso cubain convertible -CurrencyNames/fr/tmt=nouveau manat turkm\u00e8ne +CurrencyNames/fr/tmt=nouveau manat turkmène -CurrencyNames/ja/cuc=\u30ad\u30e5\u30fc\u30d0\u514c\u63db\u30da\u30bd -CurrencyNames/ja/tmt=\u30c8\u30eb\u30af\u30e1\u30cb\u30b9\u30bf\u30f3\u30fb\u30de\u30ca\u30c8 -CurrencyNames/ja/zwl=\u30b8\u30f3\u30d0\u30d6\u30a8\u30fb\u30c9\u30eb(2009) +CurrencyNames/ja/cuc=キューバ兌換ペソ +CurrencyNames/ja/tmt=トルクメニスタン・マナト +CurrencyNames/ja/zwl=ジンバブエ・ドル(2009) -CurrencyNames/ko/cuc=\ucfe0\ubc14 \ud0dc\ud658 \ud398\uc18c +CurrencyNames/ko/cuc=쿠바 태환 페소 -CurrencyNames/pt/bob=Boliviano da Bol\u00edvia -CurrencyNames/pt/cuc=Peso cubano convers\u00edvel +CurrencyNames/pt/bob=Boliviano da Bolívia +CurrencyNames/pt/cuc=Peso cubano conversível CurrencyNames/pt/tmt=Manat turcomeno -CurrencyNames/pt/zwl=D\u00f3lar do Zimb\u00e1bue (2009) -CurrencyNames/pt/zwr=D\u00f3lar do Zimb\u00e1bue (2008) +CurrencyNames/pt/zwl=Dólar do Zimbábue (2009) +CurrencyNames/pt/zwr=Dólar do Zimbábue (2008) -CurrencyNames/sk_SK/skk=slovensk\u00e1 koruna -CurrencyNames/sk_SK/EUR=\u20ac +CurrencyNames/sk_SK/skk=slovenská koruna +CurrencyNames/sk_SK/EUR=€ -CurrencyNames/zh_CN/cuc=\u53e4\u5df4\u53ef\u5151\u6362\u6bd4\u7d22 -CurrencyNames/zh_CN/tmt=\u571f\u5e93\u66fc\u65af\u5766\u9a6c\u7eb3\u7279 -CurrencyNames/zh_CN/zwl=\u6d25\u5df4\u5e03\u97e6\u5143 (2009) +CurrencyNames/zh_CN/cuc=古巴可兑换比索 +CurrencyNames/zh_CN/tmt=土库曼斯坦马纳特 +CurrencyNames/zh_CN/zwl=津巴布韦元 (2009) -CurrencyNames/zh_TW/cuc=\u53e4\u5df4\u53ef\u8f49\u63db\u62ab\u7d22 -CurrencyNames/zh_TW/tmt=\u571f\u5eab\u66fc\u99ac\u7d0d\u7279 -CurrencyNames/zh_TW/zwl=\u8f9b\u5df4\u5a01\u5143 (2009) +CurrencyNames/zh_TW/cuc=古巴可轉換披索 +CurrencyNames/zh_TW/tmt=土庫曼馬納特 +CurrencyNames/zh_TW/zwl=辛巴威元 (2009) # bug 7101495 CalendarData/lv/firstDayOfWeek=2 @@ -7075,42 +7075,42 @@ FormatData//japanese.narrow.Eras/2=T FormatData//japanese.narrow.Eras/3=S FormatData//japanese.narrow.Eras/4=H -FormatData/ar/DayNarrows/0=\u062d -FormatData/ar/DayNarrows/1=\u0646 -FormatData/ar/DayNarrows/2=\u062b -FormatData/ar/DayNarrows/3=\u0631 -FormatData/ar/DayNarrows/4=\u062e -FormatData/ar/DayNarrows/5=\u062c -FormatData/ar/DayNarrows/6=\u0633 - -FormatData/be/standalone.MonthNarrows/0=\u0441 -FormatData/be/standalone.MonthNarrows/1=\u043b -FormatData/be/standalone.MonthNarrows/2=\u0441 -FormatData/be/standalone.MonthNarrows/3=\u043a -FormatData/be/standalone.MonthNarrows/4=\u043c -FormatData/be/standalone.MonthNarrows/5=\u0447 -FormatData/be/standalone.MonthNarrows/6=\u043b -FormatData/be/standalone.MonthNarrows/7=\u0436 -FormatData/be/standalone.MonthNarrows/8=\u0432 -FormatData/be/standalone.MonthNarrows/9=\u043a -FormatData/be/standalone.MonthNarrows/10=\u043b -FormatData/be/standalone.MonthNarrows/11=\u0441 +FormatData/ar/DayNarrows/0=ح +FormatData/ar/DayNarrows/1=ن +FormatData/ar/DayNarrows/2=ث +FormatData/ar/DayNarrows/3=ر +FormatData/ar/DayNarrows/4=خ +FormatData/ar/DayNarrows/5=ج +FormatData/ar/DayNarrows/6=س + +FormatData/be/standalone.MonthNarrows/0=с +FormatData/be/standalone.MonthNarrows/1=л +FormatData/be/standalone.MonthNarrows/2=с +FormatData/be/standalone.MonthNarrows/3=к +FormatData/be/standalone.MonthNarrows/4=м +FormatData/be/standalone.MonthNarrows/5=ч +FormatData/be/standalone.MonthNarrows/6=л +FormatData/be/standalone.MonthNarrows/7=ж +FormatData/be/standalone.MonthNarrows/8=в +FormatData/be/standalone.MonthNarrows/9=к +FormatData/be/standalone.MonthNarrows/10=л +FormatData/be/standalone.MonthNarrows/11=с FormatData/be/standalone.MonthNarrows/12= -FormatData/be/DayNarrows/0=\u043d -FormatData/be/DayNarrows/1=\u043f -FormatData/be/DayNarrows/2=\u0430 -FormatData/be/DayNarrows/3=\u0441 -FormatData/be/DayNarrows/4=\u0447 -FormatData/be/DayNarrows/5=\u043f -FormatData/be/DayNarrows/6=\u0441 - -FormatData/bg/DayNarrows/0=\u043d -FormatData/bg/DayNarrows/1=\u043f -FormatData/bg/DayNarrows/2=\u0432 -FormatData/bg/DayNarrows/3=\u0441 -FormatData/bg/DayNarrows/4=\u0447 -FormatData/bg/DayNarrows/5=\u043f -FormatData/bg/DayNarrows/6=\u0441 +FormatData/be/DayNarrows/0=н +FormatData/be/DayNarrows/1=п +FormatData/be/DayNarrows/2=а +FormatData/be/DayNarrows/3=с +FormatData/be/DayNarrows/4=ч +FormatData/be/DayNarrows/5=п +FormatData/be/DayNarrows/6=с + +FormatData/bg/DayNarrows/0=н +FormatData/bg/DayNarrows/1=п +FormatData/bg/DayNarrows/2=в +FormatData/bg/DayNarrows/3=с +FormatData/bg/DayNarrows/4=ч +FormatData/bg/DayNarrows/5=п +FormatData/bg/DayNarrows/6=с FormatData/ca/standalone.MonthNarrows/0=g FormatData/ca/standalone.MonthNarrows/1=f @@ -7143,9 +7143,9 @@ FormatData/ca/standalone.DayNarrows/6=s FormatData/cs/DayNarrows/0=N FormatData/cs/DayNarrows/1=P -FormatData/cs/DayNarrows/2=\u00da +FormatData/cs/DayNarrows/2=Ú FormatData/cs/DayNarrows/3=S -FormatData/cs/DayNarrows/4=\u010c +FormatData/cs/DayNarrows/4=Č FormatData/cs/DayNarrows/5=P FormatData/cs/DayNarrows/6=S @@ -7165,13 +7165,13 @@ FormatData/de/DayNarrows/4=D FormatData/de/DayNarrows/5=F FormatData/de/DayNarrows/6=S -FormatData/el/DayNarrows/0=\u039a -FormatData/el/DayNarrows/1=\u0394 -FormatData/el/DayNarrows/2=\u03a4 -FormatData/el/DayNarrows/3=\u03a4 -FormatData/el/DayNarrows/4=\u03a0 -FormatData/el/DayNarrows/5=\u03a0 -FormatData/el/DayNarrows/6=\u03a3 +FormatData/el/DayNarrows/0=Κ +FormatData/el/DayNarrows/1=Δ +FormatData/el/DayNarrows/2=Τ +FormatData/el/DayNarrows/3=Τ +FormatData/el/DayNarrows/4=Π +FormatData/el/DayNarrows/5=Π +FormatData/el/DayNarrows/6=Σ FormatData/es/DayNarrows/0=D FormatData/es/DayNarrows/1=L @@ -7227,13 +7227,13 @@ FormatData/fr/DayNarrows/4=J FormatData/fr/DayNarrows/5=V FormatData/fr/DayNarrows/6=S -FormatData/hi_IN/DayNarrows/0=\u0930 -FormatData/hi_IN/DayNarrows/1=\u0938\u094b -FormatData/hi_IN/DayNarrows/2=\u092e\u0902 -FormatData/hi_IN/DayNarrows/3=\u092c\u0941 -FormatData/hi_IN/DayNarrows/4=\u0917\u0941 -FormatData/hi_IN/DayNarrows/5=\u0936\u0941 -FormatData/hi_IN/DayNarrows/6=\u0936 +FormatData/hi_IN/DayNarrows/0=र +FormatData/hi_IN/DayNarrows/1=सो +FormatData/hi_IN/DayNarrows/2=मं +FormatData/hi_IN/DayNarrows/3=बु +FormatData/hi_IN/DayNarrows/4=गु +FormatData/hi_IN/DayNarrows/5=शु +FormatData/hi_IN/DayNarrows/6=श FormatData/hr/standalone.MonthNarrows/0=1. FormatData/hr/standalone.MonthNarrows/1=2. @@ -7252,14 +7252,14 @@ FormatData/hr/DayNarrows/0=N FormatData/hr/DayNarrows/1=P FormatData/hr/DayNarrows/2=U FormatData/hr/DayNarrows/3=S -FormatData/hr/DayNarrows/4=\u010c +FormatData/hr/DayNarrows/4=Č FormatData/hr/DayNarrows/5=P FormatData/hr/DayNarrows/6=S FormatData/hr/standalone.DayNarrows/0=n FormatData/hr/standalone.DayNarrows/1=p FormatData/hr/standalone.DayNarrows/2=u FormatData/hr/standalone.DayNarrows/3=s -FormatData/hr/standalone.DayNarrows/4=\u010d +FormatData/hr/standalone.DayNarrows/4=č FormatData/hr/standalone.DayNarrows/5=p FormatData/hr/standalone.DayNarrows/6=s @@ -7278,7 +7278,7 @@ FormatData/is/standalone.MonthNarrows/3=a FormatData/is/standalone.MonthNarrows/4=m FormatData/is/standalone.MonthNarrows/5=j FormatData/is/standalone.MonthNarrows/6=j -FormatData/is/standalone.MonthNarrows/7=\u00e1 +FormatData/is/standalone.MonthNarrows/7=á FormatData/is/standalone.MonthNarrows/8=s FormatData/is/standalone.MonthNarrows/9=o FormatData/is/standalone.MonthNarrows/10=n @@ -7286,14 +7286,14 @@ FormatData/is/standalone.MonthNarrows/11=d FormatData/is/standalone.MonthNarrows/12= FormatData/is/DayNarrows/0=S FormatData/is/DayNarrows/1=M -FormatData/is/DayNarrows/2=\u00de +FormatData/is/DayNarrows/2=Þ FormatData/is/DayNarrows/3=M FormatData/is/DayNarrows/4=F FormatData/is/DayNarrows/5=F FormatData/is/DayNarrows/6=L FormatData/is/standalone.DayNarrows/0=s FormatData/is/standalone.DayNarrows/1=m -FormatData/is/standalone.DayNarrows/2=\u00fe +FormatData/is/standalone.DayNarrows/2=þ FormatData/is/standalone.DayNarrows/3=m FormatData/is/standalone.DayNarrows/4=f FormatData/is/standalone.DayNarrows/5=f @@ -7307,36 +7307,36 @@ FormatData/it/DayNarrows/4=G FormatData/it/DayNarrows/5=V FormatData/it/DayNarrows/6=S -FormatData/iw/DayNarrows/0=\u05d0 -FormatData/iw/DayNarrows/1=\u05d1 -FormatData/iw/DayNarrows/2=\u05d2 -FormatData/iw/DayNarrows/3=\u05d3 -FormatData/iw/DayNarrows/4=\u05d4 -FormatData/iw/DayNarrows/5=\u05d5 -FormatData/iw/DayNarrows/6=\u05e9 -FormatData/iw/standalone.DayNarrows/0=\u05d0 -FormatData/iw/standalone.DayNarrows/1=\u05d1 -FormatData/iw/standalone.DayNarrows/2=\u05d2 -FormatData/iw/standalone.DayNarrows/3=\u05d3 -FormatData/iw/standalone.DayNarrows/4=\u05d4 -FormatData/iw/standalone.DayNarrows/5=\u05d5 -FormatData/iw/standalone.DayNarrows/6=\u05e9 - -FormatData/ja/DayNarrows/0=\u65e5 -FormatData/ja/DayNarrows/1=\u6708 -FormatData/ja/DayNarrows/2=\u706b -FormatData/ja/DayNarrows/3=\u6c34 -FormatData/ja/DayNarrows/4=\u6728 -FormatData/ja/DayNarrows/5=\u91d1 -FormatData/ja/DayNarrows/6=\u571f - -FormatData/ko/DayNarrows/0=\uc77c -FormatData/ko/DayNarrows/1=\uc6d4 -FormatData/ko/DayNarrows/2=\ud654 -FormatData/ko/DayNarrows/3=\uc218 -FormatData/ko/DayNarrows/4=\ubaa9 -FormatData/ko/DayNarrows/5=\uae08 -FormatData/ko/DayNarrows/6=\ud1a0 +FormatData/iw/DayNarrows/0=א +FormatData/iw/DayNarrows/1=ב +FormatData/iw/DayNarrows/2=ג +FormatData/iw/DayNarrows/3=ד +FormatData/iw/DayNarrows/4=ה +FormatData/iw/DayNarrows/5=ו +FormatData/iw/DayNarrows/6=ש +FormatData/iw/standalone.DayNarrows/0=א +FormatData/iw/standalone.DayNarrows/1=ב +FormatData/iw/standalone.DayNarrows/2=ג +FormatData/iw/standalone.DayNarrows/3=ד +FormatData/iw/standalone.DayNarrows/4=ה +FormatData/iw/standalone.DayNarrows/5=ו +FormatData/iw/standalone.DayNarrows/6=ש + +FormatData/ja/DayNarrows/0=日 +FormatData/ja/DayNarrows/1=月 +FormatData/ja/DayNarrows/2=火 +FormatData/ja/DayNarrows/3=水 +FormatData/ja/DayNarrows/4=木 +FormatData/ja/DayNarrows/5=金 +FormatData/ja/DayNarrows/6=土 + +FormatData/ko/DayNarrows/0=일 +FormatData/ko/DayNarrows/1=월 +FormatData/ko/DayNarrows/2=화 +FormatData/ko/DayNarrows/3=수 +FormatData/ko/DayNarrows/4=목 +FormatData/ko/DayNarrows/5=금 +FormatData/ko/DayNarrows/6=토 FormatData/lt/standalone.MonthNarrows/0=S FormatData/lt/standalone.MonthNarrows/1=V @@ -7358,14 +7358,14 @@ FormatData/lt/DayNarrows/2=A FormatData/lt/DayNarrows/3=T FormatData/lt/DayNarrows/4=K FormatData/lt/DayNarrows/5=P -FormatData/lt/DayNarrows/6=\u0160 +FormatData/lt/DayNarrows/6=Š FormatData/lt/standalone.DayNarrows/0=S FormatData/lt/standalone.DayNarrows/1=P FormatData/lt/standalone.DayNarrows/2=A FormatData/lt/standalone.DayNarrows/3=T FormatData/lt/standalone.DayNarrows/4=K FormatData/lt/standalone.DayNarrows/5=P -FormatData/lt/standalone.DayNarrows/6=\u0160 +FormatData/lt/standalone.DayNarrows/6=Š FormatData/lv/DayNarrows/0=S FormatData/lv/DayNarrows/1=P @@ -7375,13 +7375,13 @@ FormatData/lv/DayNarrows/4=C FormatData/lv/DayNarrows/5=P FormatData/lv/DayNarrows/6=S -FormatData/mk/DayNarrows/0=\u043d -FormatData/mk/DayNarrows/1=\u043f -FormatData/mk/DayNarrows/2=\u0432 -FormatData/mk/DayNarrows/3=\u0441 -FormatData/mk/DayNarrows/4=\u0447 -FormatData/mk/DayNarrows/5=\u043f -FormatData/mk/DayNarrows/6=\u0441 +FormatData/mk/DayNarrows/0=н +FormatData/mk/DayNarrows/1=п +FormatData/mk/DayNarrows/2=в +FormatData/mk/DayNarrows/3=с +FormatData/mk/DayNarrows/4=ч +FormatData/mk/DayNarrows/5=п +FormatData/mk/DayNarrows/6=с FormatData/ms/standalone.MonthNarrows/0=J FormatData/ms/standalone.MonthNarrows/1=F @@ -7411,12 +7411,12 @@ FormatData/ms/standalone.DayNarrows/4=K FormatData/ms/standalone.DayNarrows/5=J FormatData/ms/standalone.DayNarrows/6=S -FormatData/mt/DayNarrows/0=\u0126 +FormatData/mt/DayNarrows/0=Ħ FormatData/mt/DayNarrows/1=T FormatData/mt/DayNarrows/2=T FormatData/mt/DayNarrows/3=E -FormatData/mt/DayNarrows/4=\u0126 -FormatData/mt/DayNarrows/5=\u0120 +FormatData/mt/DayNarrows/4=Ħ +FormatData/mt/DayNarrows/5=Ġ FormatData/mt/DayNarrows/6=S FormatData/nl/DayNarrows/0=Z @@ -7430,7 +7430,7 @@ FormatData/nl/DayNarrows/6=Z FormatData/pl/DayNarrows/0=N FormatData/pl/DayNarrows/1=P FormatData/pl/DayNarrows/2=W -FormatData/pl/DayNarrows/3=\u015a +FormatData/pl/DayNarrows/3=Ś FormatData/pl/DayNarrows/4=C FormatData/pl/DayNarrows/5=P FormatData/pl/DayNarrows/6=S @@ -7472,28 +7472,28 @@ FormatData/ro/standalone.DayNarrows/4=J FormatData/ro/standalone.DayNarrows/5=V FormatData/ro/standalone.DayNarrows/6=S -FormatData/ru/DayNarrows/0=\u0412 -FormatData/ru/DayNarrows/1=\u041f\u043d -FormatData/ru/DayNarrows/2=\u0412\u0442 -FormatData/ru/DayNarrows/3=\u0421 -FormatData/ru/DayNarrows/4=\u0427 -FormatData/ru/DayNarrows/5=\u041f +FormatData/ru/DayNarrows/0=В +FormatData/ru/DayNarrows/1=Пн +FormatData/ru/DayNarrows/2=Вт +FormatData/ru/DayNarrows/3=С +FormatData/ru/DayNarrows/4=Ч +FormatData/ru/DayNarrows/5=П # Note: "sat" is an contributed item in CLDR. -FormatData/ru/DayNarrows/6=\u0421 +FormatData/ru/DayNarrows/6=С -FormatData/ru/standalone.DayNarrows/0=\u0412 -FormatData/ru/standalone.DayNarrows/1=\u041f -FormatData/ru/standalone.DayNarrows/2=\u0412 -FormatData/ru/standalone.DayNarrows/3=\u0421 -FormatData/ru/standalone.DayNarrows/4=\u0427 -FormatData/ru/standalone.DayNarrows/5=\u041f -FormatData/ru/standalone.DayNarrows/6=\u0421 +FormatData/ru/standalone.DayNarrows/0=В +FormatData/ru/standalone.DayNarrows/1=П +FormatData/ru/standalone.DayNarrows/2=В +FormatData/ru/standalone.DayNarrows/3=С +FormatData/ru/standalone.DayNarrows/4=Ч +FormatData/ru/standalone.DayNarrows/5=П +FormatData/ru/standalone.DayNarrows/6=С FormatData/sk/DayNarrows/0=N FormatData/sk/DayNarrows/1=P FormatData/sk/DayNarrows/2=U FormatData/sk/DayNarrows/3=S -FormatData/sk/DayNarrows/4=\u0160 +FormatData/sk/DayNarrows/4=Š FormatData/sk/DayNarrows/5=P FormatData/sk/DayNarrows/6=S @@ -7501,7 +7501,7 @@ FormatData/sl/DayNarrows/0=n FormatData/sl/DayNarrows/1=p FormatData/sl/DayNarrows/2=t FormatData/sl/DayNarrows/3=s -FormatData/sl/DayNarrows/4=\u010d +FormatData/sl/DayNarrows/4=č FormatData/sl/DayNarrows/5=p FormatData/sl/DayNarrows/6=s @@ -7513,17 +7513,17 @@ FormatData/sq/DayNarrows/4=E FormatData/sq/DayNarrows/5=P FormatData/sq/DayNarrows/6=S -FormatData/sr/DayNarrows/0=\u043d -FormatData/sr/DayNarrows/1=\u043f -FormatData/sr/DayNarrows/2=\u0443 -FormatData/sr/DayNarrows/3=\u0441 -FormatData/sr/DayNarrows/4=\u0447 -FormatData/sr/DayNarrows/5=\u043f -FormatData/sr/DayNarrows/6=\u0441 -FormatData/sr/short.Eras/0=\u043f. \u043d. \u0435. -FormatData/sr/short.Eras/1=\u043d. \u0435. -FormatData/sr/narrow.Eras/0=\u043f.\u043d.\u0435. -FormatData/sr/narrow.Eras/1=\u043d.\u0435. +FormatData/sr/DayNarrows/0=н +FormatData/sr/DayNarrows/1=п +FormatData/sr/DayNarrows/2=у +FormatData/sr/DayNarrows/3=с +FormatData/sr/DayNarrows/4=ч +FormatData/sr/DayNarrows/5=п +FormatData/sr/DayNarrows/6=с +FormatData/sr/short.Eras/0=п. н. е. +FormatData/sr/short.Eras/1=н. е. +FormatData/sr/narrow.Eras/0=п.н.е. +FormatData/sr/narrow.Eras/1=н.е. FormatData/sv/standalone.MonthNarrows/0=J FormatData/sv/standalone.MonthNarrows/1=F @@ -7557,31 +7557,31 @@ FormatData/sv/narrow.Eras/1=e.Kr. FormatData/sv/narrow.AmPmMarkers/0=f FormatData/sv/narrow.AmPmMarkers/1=e -FormatData/th/standalone.MonthNarrows/0=\u0e21.\u0e04. -FormatData/th/standalone.MonthNarrows/1=\u0e01.\u0e1e. -FormatData/th/standalone.MonthNarrows/2=\u0e21\u0e35.\u0e04. -FormatData/th/standalone.MonthNarrows/3=\u0e40\u0e21.\u0e22. -FormatData/th/standalone.MonthNarrows/4=\u0e1e.\u0e04. -FormatData/th/standalone.MonthNarrows/5=\u0e21\u0e34.\u0e22. -FormatData/th/standalone.MonthNarrows/6=\u0e01.\u0e04. -FormatData/th/standalone.MonthNarrows/7=\u0e2a.\u0e04. -FormatData/th/standalone.MonthNarrows/8=\u0e01.\u0e22. -FormatData/th/standalone.MonthNarrows/9=\u0e15.\u0e04. -FormatData/th/standalone.MonthNarrows/10=\u0e1e.\u0e22. -FormatData/th/standalone.MonthNarrows/11=\u0e18.\u0e04. +FormatData/th/standalone.MonthNarrows/0=ม.ค. +FormatData/th/standalone.MonthNarrows/1=ก.พ. +FormatData/th/standalone.MonthNarrows/2=มี.ค. +FormatData/th/standalone.MonthNarrows/3=เม.ย. +FormatData/th/standalone.MonthNarrows/4=พ.ค. +FormatData/th/standalone.MonthNarrows/5=มิ.ย. +FormatData/th/standalone.MonthNarrows/6=ก.ค. +FormatData/th/standalone.MonthNarrows/7=ส.ค. +FormatData/th/standalone.MonthNarrows/8=ก.ย. +FormatData/th/standalone.MonthNarrows/9=ต.ค. +FormatData/th/standalone.MonthNarrows/10=พ.ย. +FormatData/th/standalone.MonthNarrows/11=ธ.ค. FormatData/th/standalone.MonthNarrows/12= -FormatData/th/DayNarrows/0=\u0e2d -FormatData/th/DayNarrows/1=\u0e08 -FormatData/th/DayNarrows/2=\u0e2d -FormatData/th/DayNarrows/3=\u0e1e -FormatData/th/DayNarrows/4=\u0e1e -FormatData/th/DayNarrows/5=\u0e28 -FormatData/th/DayNarrows/6=\u0e2a -FormatData/th/narrow.Eras/0=\u0e01\u0e48\u0e2d\u0e19 \u0e04.\u0e28. -FormatData/th/narrow.Eras/1=\u0e04.\u0e28. +FormatData/th/DayNarrows/0=อ +FormatData/th/DayNarrows/1=จ +FormatData/th/DayNarrows/2=อ +FormatData/th/DayNarrows/3=พ +FormatData/th/DayNarrows/4=พ +FormatData/th/DayNarrows/5=ศ +FormatData/th/DayNarrows/6=ส +FormatData/th/narrow.Eras/0=ก่อน ค.ศ. +FormatData/th/narrow.Eras/1=ค.ศ. FormatData/tr/standalone.MonthNarrows/0=O -FormatData/tr/standalone.MonthNarrows/1=\u015e +FormatData/tr/standalone.MonthNarrows/1=Ş FormatData/tr/standalone.MonthNarrows/2=M FormatData/tr/standalone.MonthNarrows/3=N FormatData/tr/standalone.MonthNarrows/4=M @@ -7596,18 +7596,18 @@ FormatData/tr/standalone.MonthNarrows/12= FormatData/tr/DayNarrows/0=P FormatData/tr/DayNarrows/1=P FormatData/tr/DayNarrows/2=S -FormatData/tr/DayNarrows/3=\u00c7 +FormatData/tr/DayNarrows/3=Ç FormatData/tr/DayNarrows/4=P FormatData/tr/DayNarrows/5=C FormatData/tr/DayNarrows/6=C -FormatData/uk/DayNarrows/0=\u041d -FormatData/uk/DayNarrows/1=\u041f -FormatData/uk/DayNarrows/2=\u0412 -FormatData/uk/DayNarrows/3=\u0421 -FormatData/uk/DayNarrows/4=\u0427 -FormatData/uk/DayNarrows/5=\u041f -FormatData/uk/DayNarrows/6=\u0421 +FormatData/uk/DayNarrows/0=Н +FormatData/uk/DayNarrows/1=П +FormatData/uk/DayNarrows/2=В +FormatData/uk/DayNarrows/3=С +FormatData/uk/DayNarrows/4=Ч +FormatData/uk/DayNarrows/5=П +FormatData/uk/DayNarrows/6=С FormatData/vi/DayNarrows/0=CN FormatData/vi/DayNarrows/1=T2 @@ -7617,26 +7617,26 @@ FormatData/vi/DayNarrows/4=T5 FormatData/vi/DayNarrows/5=T6 FormatData/vi/DayNarrows/6=T7 -FormatData/zh/standalone.MonthNarrows/0=1\u6708 -FormatData/zh/standalone.MonthNarrows/1=2\u6708 -FormatData/zh/standalone.MonthNarrows/2=3\u6708 -FormatData/zh/standalone.MonthNarrows/3=4\u6708 -FormatData/zh/standalone.MonthNarrows/4=5\u6708 -FormatData/zh/standalone.MonthNarrows/5=6\u6708 -FormatData/zh/standalone.MonthNarrows/6=7\u6708 -FormatData/zh/standalone.MonthNarrows/7=8\u6708 -FormatData/zh/standalone.MonthNarrows/8=9\u6708 -FormatData/zh/standalone.MonthNarrows/9=10\u6708 -FormatData/zh/standalone.MonthNarrows/10=11\u6708 -FormatData/zh/standalone.MonthNarrows/11=12\u6708 +FormatData/zh/standalone.MonthNarrows/0=1月 +FormatData/zh/standalone.MonthNarrows/1=2月 +FormatData/zh/standalone.MonthNarrows/2=3月 +FormatData/zh/standalone.MonthNarrows/3=4月 +FormatData/zh/standalone.MonthNarrows/4=5月 +FormatData/zh/standalone.MonthNarrows/5=6月 +FormatData/zh/standalone.MonthNarrows/6=7月 +FormatData/zh/standalone.MonthNarrows/7=8月 +FormatData/zh/standalone.MonthNarrows/8=9月 +FormatData/zh/standalone.MonthNarrows/9=10月 +FormatData/zh/standalone.MonthNarrows/10=11月 +FormatData/zh/standalone.MonthNarrows/11=12月 FormatData/zh/standalone.MonthNarrows/12= -FormatData/zh/DayNarrows/0=\u65e5 -FormatData/zh/DayNarrows/1=\u4e00 -FormatData/zh/DayNarrows/2=\u4e8c -FormatData/zh/DayNarrows/3=\u4e09 -FormatData/zh/DayNarrows/4=\u56db -FormatData/zh/DayNarrows/5=\u4e94 -FormatData/zh/DayNarrows/6=\u516d +FormatData/zh/DayNarrows/0=日 +FormatData/zh/DayNarrows/1=一 +FormatData/zh/DayNarrows/2=二 +FormatData/zh/DayNarrows/3=三 +FormatData/zh/DayNarrows/4=四 +FormatData/zh/DayNarrows/5=五 +FormatData/zh/DayNarrows/6=六 # bug 7195759 CurrencyNames//ZMW=ZMW @@ -7663,10 +7663,10 @@ FormatData/pt/MonthAbbreviations/10=nov FormatData/pt/MonthAbbreviations/11=dez # bug 8021121 -CurrencyNames/lv_LV/EUR=\u20ac +CurrencyNames/lv_LV/EUR=€ # bug # 6192407 -LocaleNames/ko/PT=\ud3ec\ub974\ud22c\uac08 +LocaleNames/ko/PT=포르투갈 # bug 6931564 LocaleNames/sv/ZA=Sydafrika @@ -7689,7 +7689,7 @@ FormatData/es_DO/DatePatterns/2=dd/MM/yyyy FormatData/es_DO/DatePatterns/3=dd/MM/yy # bug 8055222 -CurrencyNames/lt_LT/EUR=\u20ac +CurrencyNames/lt_LT/EUR=€ # bug 8042126 + missing MonthNarrows data FormatData//MonthNarrows/0=1 @@ -7705,18 +7705,18 @@ FormatData//MonthNarrows/9=10 FormatData//MonthNarrows/10=11 FormatData//MonthNarrows/11=12 FormatData//MonthNarrows/12= -FormatData/bg/MonthNarrows/0=\u044f -FormatData/bg/MonthNarrows/1=\u0444 -FormatData/bg/MonthNarrows/2=\u043c -FormatData/bg/MonthNarrows/3=\u0430 -FormatData/bg/MonthNarrows/4=\u043c -FormatData/bg/MonthNarrows/5=\u044e -FormatData/bg/MonthNarrows/6=\u044e -FormatData/bg/MonthNarrows/7=\u0430 -FormatData/bg/MonthNarrows/8=\u0441 -FormatData/bg/MonthNarrows/9=\u043e -FormatData/bg/MonthNarrows/10=\u043d -FormatData/bg/MonthNarrows/11=\u0434 +FormatData/bg/MonthNarrows/0=я +FormatData/bg/MonthNarrows/1=ф +FormatData/bg/MonthNarrows/2=м +FormatData/bg/MonthNarrows/3=а +FormatData/bg/MonthNarrows/4=м +FormatData/bg/MonthNarrows/5=ю +FormatData/bg/MonthNarrows/6=ю +FormatData/bg/MonthNarrows/7=а +FormatData/bg/MonthNarrows/8=с +FormatData/bg/MonthNarrows/9=о +FormatData/bg/MonthNarrows/10=н +FormatData/bg/MonthNarrows/11=д FormatData/bg/MonthNarrows/12= FormatData/zh_TW/MonthNarrows/0=1 FormatData/zh_TW/MonthNarrows/1=2 @@ -7744,31 +7744,31 @@ FormatData/it/MonthNarrows/9=O FormatData/it/MonthNarrows/10=N FormatData/it/MonthNarrows/11=D FormatData/it/MonthNarrows/12= -FormatData/ko/MonthNarrows/0=1\uc6d4 -FormatData/ko/MonthNarrows/1=2\uc6d4 -FormatData/ko/MonthNarrows/2=3\uc6d4 -FormatData/ko/MonthNarrows/3=4\uc6d4 -FormatData/ko/MonthNarrows/4=5\uc6d4 -FormatData/ko/MonthNarrows/5=6\uc6d4 -FormatData/ko/MonthNarrows/6=7\uc6d4 -FormatData/ko/MonthNarrows/7=8\uc6d4 -FormatData/ko/MonthNarrows/8=9\uc6d4 -FormatData/ko/MonthNarrows/9=10\uc6d4 -FormatData/ko/MonthNarrows/10=11\uc6d4 -FormatData/ko/MonthNarrows/11=12\uc6d4 +FormatData/ko/MonthNarrows/0=1월 +FormatData/ko/MonthNarrows/1=2월 +FormatData/ko/MonthNarrows/2=3월 +FormatData/ko/MonthNarrows/3=4월 +FormatData/ko/MonthNarrows/4=5월 +FormatData/ko/MonthNarrows/5=6월 +FormatData/ko/MonthNarrows/6=7월 +FormatData/ko/MonthNarrows/7=8월 +FormatData/ko/MonthNarrows/8=9월 +FormatData/ko/MonthNarrows/9=10월 +FormatData/ko/MonthNarrows/10=11월 +FormatData/ko/MonthNarrows/11=12월 FormatData/ko/MonthNarrows/12= -FormatData/uk/MonthNarrows/0=\u0421 -FormatData/uk/MonthNarrows/1=\u041b -FormatData/uk/MonthNarrows/2=\u0411 -FormatData/uk/MonthNarrows/3=\u041a -FormatData/uk/MonthNarrows/4=\u0422 -FormatData/uk/MonthNarrows/5=\u0427 -FormatData/uk/MonthNarrows/6=\u041b -FormatData/uk/MonthNarrows/7=\u0421 -FormatData/uk/MonthNarrows/8=\u0412 -FormatData/uk/MonthNarrows/9=\u0416 -FormatData/uk/MonthNarrows/10=\u041b -FormatData/uk/MonthNarrows/11=\u0413 +FormatData/uk/MonthNarrows/0=С +FormatData/uk/MonthNarrows/1=Л +FormatData/uk/MonthNarrows/2=Б +FormatData/uk/MonthNarrows/3=К +FormatData/uk/MonthNarrows/4=Т +FormatData/uk/MonthNarrows/5=Ч +FormatData/uk/MonthNarrows/6=Л +FormatData/uk/MonthNarrows/7=С +FormatData/uk/MonthNarrows/8=В +FormatData/uk/MonthNarrows/9=Ж +FormatData/uk/MonthNarrows/10=Л +FormatData/uk/MonthNarrows/11=Г FormatData/uk/MonthNarrows/12= FormatData/lv/MonthNarrows/0=J FormatData/lv/MonthNarrows/1=F @@ -7809,18 +7809,18 @@ FormatData/sk/MonthNarrows/9=o FormatData/sk/MonthNarrows/10=n FormatData/sk/MonthNarrows/11=d FormatData/sk/MonthNarrows/12= -FormatData/hi_IN/MonthNarrows/0=\u091c -FormatData/hi_IN/MonthNarrows/1=\u092b\u093c -FormatData/hi_IN/MonthNarrows/2=\u092e\u093e -FormatData/hi_IN/MonthNarrows/3=\u0905 -FormatData/hi_IN/MonthNarrows/4=\u092e -FormatData/hi_IN/MonthNarrows/5=\u091c\u0942 -FormatData/hi_IN/MonthNarrows/6=\u091c\u0941 -FormatData/hi_IN/MonthNarrows/7=\u0905 -FormatData/hi_IN/MonthNarrows/8=\u0938\u093f -FormatData/hi_IN/MonthNarrows/9=\u0905 -FormatData/hi_IN/MonthNarrows/10=\u0928 -FormatData/hi_IN/MonthNarrows/11=\u0926\u093f +FormatData/hi_IN/MonthNarrows/0=ज +FormatData/hi_IN/MonthNarrows/1=फ़ +FormatData/hi_IN/MonthNarrows/2=मा +FormatData/hi_IN/MonthNarrows/3=अ +FormatData/hi_IN/MonthNarrows/4=म +FormatData/hi_IN/MonthNarrows/5=जू +FormatData/hi_IN/MonthNarrows/6=जु +FormatData/hi_IN/MonthNarrows/7=अ +FormatData/hi_IN/MonthNarrows/8=सि +FormatData/hi_IN/MonthNarrows/9=अ +FormatData/hi_IN/MonthNarrows/10=न +FormatData/hi_IN/MonthNarrows/11=दि FormatData/hi_IN/MonthNarrows/12= FormatData/ga/MonthNarrows/0=E FormatData/ga/MonthNarrows/1=F @@ -7862,35 +7862,35 @@ FormatData/sv/MonthNarrows/10=N FormatData/sv/MonthNarrows/11=D FormatData/sv/MonthNarrows/12= FormatData/cs/MonthNarrows/0=l -FormatData/cs/MonthNarrows/1=\u00fa +FormatData/cs/MonthNarrows/1=ú FormatData/cs/MonthNarrows/2=b FormatData/cs/MonthNarrows/3=d FormatData/cs/MonthNarrows/4=k -FormatData/cs/MonthNarrows/5=\u010d -FormatData/cs/MonthNarrows/6=\u010d +FormatData/cs/MonthNarrows/5=č +FormatData/cs/MonthNarrows/6=č FormatData/cs/MonthNarrows/7=s FormatData/cs/MonthNarrows/8=z -FormatData/cs/MonthNarrows/9=\u0159 +FormatData/cs/MonthNarrows/9=ř FormatData/cs/MonthNarrows/10=l FormatData/cs/MonthNarrows/11=p FormatData/cs/MonthNarrows/12= -FormatData/el/MonthNarrows/0=\u0399 -FormatData/el/MonthNarrows/1=\u03a6 -FormatData/el/MonthNarrows/2=\u039c -FormatData/el/MonthNarrows/3=\u0391 -FormatData/el/MonthNarrows/4=\u039c -FormatData/el/MonthNarrows/5=\u0399 -FormatData/el/MonthNarrows/6=\u0399 -FormatData/el/MonthNarrows/7=\u0391 -FormatData/el/MonthNarrows/8=\u03a3 -FormatData/el/MonthNarrows/9=\u039f -FormatData/el/MonthNarrows/10=\u039d -FormatData/el/MonthNarrows/11=\u0394 +FormatData/el/MonthNarrows/0=Ι +FormatData/el/MonthNarrows/1=Φ +FormatData/el/MonthNarrows/2=Μ +FormatData/el/MonthNarrows/3=Α +FormatData/el/MonthNarrows/4=Μ +FormatData/el/MonthNarrows/5=Ι +FormatData/el/MonthNarrows/6=Ι +FormatData/el/MonthNarrows/7=Α +FormatData/el/MonthNarrows/8=Σ +FormatData/el/MonthNarrows/9=Ο +FormatData/el/MonthNarrows/10=Ν +FormatData/el/MonthNarrows/11=Δ FormatData/el/MonthNarrows/12= FormatData/hu/MonthNarrows/0=J FormatData/hu/MonthNarrows/1=F FormatData/hu/MonthNarrows/2=M -FormatData/hu/MonthNarrows/3=\u00c1 +FormatData/hu/MonthNarrows/3=Á FormatData/hu/MonthNarrows/4=M FormatData/hu/MonthNarrows/5=J FormatData/hu/MonthNarrows/6=J @@ -7914,7 +7914,7 @@ FormatData/es/MonthNarrows/10=N FormatData/es/MonthNarrows/11=D FormatData/es/MonthNarrows/12= FormatData/tr/MonthNarrows/0=O -FormatData/tr/MonthNarrows/1=\u015e +FormatData/tr/MonthNarrows/1=Ş FormatData/tr/MonthNarrows/2=M FormatData/tr/MonthNarrows/3=N FormatData/tr/MonthNarrows/4=M @@ -7985,7 +7985,7 @@ FormatData/is/MonthNarrows/3=A FormatData/is/MonthNarrows/4=M FormatData/is/MonthNarrows/5=J FormatData/is/MonthNarrows/6=J -FormatData/is/MonthNarrows/7=\u00c1 +FormatData/is/MonthNarrows/7=Á FormatData/is/MonthNarrows/8=L FormatData/is/MonthNarrows/9=O FormatData/is/MonthNarrows/10=N @@ -8056,18 +8056,18 @@ FormatData/fi/MonthNarrows/9=L FormatData/fi/MonthNarrows/10=M FormatData/fi/MonthNarrows/11=J FormatData/fi/MonthNarrows/12= -FormatData/mk/MonthNarrows/0=\u0458 -FormatData/mk/MonthNarrows/1=\u0444 -FormatData/mk/MonthNarrows/2=\u043c -FormatData/mk/MonthNarrows/3=\u0430 -FormatData/mk/MonthNarrows/4=\u043c -FormatData/mk/MonthNarrows/5=\u0458 -FormatData/mk/MonthNarrows/6=\u0458 -FormatData/mk/MonthNarrows/7=\u0430 -FormatData/mk/MonthNarrows/8=\u0441 -FormatData/mk/MonthNarrows/9=\u043e -FormatData/mk/MonthNarrows/10=\u043d -FormatData/mk/MonthNarrows/11=\u0434 +FormatData/mk/MonthNarrows/0=ј +FormatData/mk/MonthNarrows/1=ф +FormatData/mk/MonthNarrows/2=м +FormatData/mk/MonthNarrows/3=а +FormatData/mk/MonthNarrows/4=м +FormatData/mk/MonthNarrows/5=ј +FormatData/mk/MonthNarrows/6=ј +FormatData/mk/MonthNarrows/7=а +FormatData/mk/MonthNarrows/8=с +FormatData/mk/MonthNarrows/9=о +FormatData/mk/MonthNarrows/10=н +FormatData/mk/MonthNarrows/11=д FormatData/mk/MonthNarrows/12= FormatData/sr-Latn/MonthNarrows/0=j FormatData/sr-Latn/MonthNarrows/1=f @@ -8082,44 +8082,44 @@ FormatData/sr-Latn/MonthNarrows/9=o FormatData/sr-Latn/MonthNarrows/10=n FormatData/sr-Latn/MonthNarrows/11=d FormatData/sr-Latn/MonthNarrows/12= -FormatData/th/MonthNarrows/0=\u0e21.\u0e04. -FormatData/th/MonthNarrows/1=\u0e01.\u0e1e. -FormatData/th/MonthNarrows/2=\u0e21\u0e35.\u0e04. -FormatData/th/MonthNarrows/3=\u0e40\u0e21.\u0e22. -FormatData/th/MonthNarrows/4=\u0e1e.\u0e04. -FormatData/th/MonthNarrows/5=\u0e21\u0e34.\u0e22 -FormatData/th/MonthNarrows/6=\u0e01.\u0e04. -FormatData/th/MonthNarrows/7=\u0e2a.\u0e04. -FormatData/th/MonthNarrows/8=\u0e01.\u0e22. -FormatData/th/MonthNarrows/9=\u0e15.\u0e04. -FormatData/th/MonthNarrows/10=\u0e1e.\u0e22. -FormatData/th/MonthNarrows/11=\u0e18.\u0e04. +FormatData/th/MonthNarrows/0=ม.ค. +FormatData/th/MonthNarrows/1=ก.พ. +FormatData/th/MonthNarrows/2=มี.ค. +FormatData/th/MonthNarrows/3=เม.ย. +FormatData/th/MonthNarrows/4=พ.ค. +FormatData/th/MonthNarrows/5=มิ.ย +FormatData/th/MonthNarrows/6=ก.ค. +FormatData/th/MonthNarrows/7=ส.ค. +FormatData/th/MonthNarrows/8=ก.ย. +FormatData/th/MonthNarrows/9=ต.ค. +FormatData/th/MonthNarrows/10=พ.ย. +FormatData/th/MonthNarrows/11=ธ.ค. FormatData/th/MonthNarrows/12= -FormatData/ar/MonthNarrows/0=\u064a -FormatData/ar/MonthNarrows/1=\u0641 -FormatData/ar/MonthNarrows/2=\u0645 -FormatData/ar/MonthNarrows/3=\u0623 -FormatData/ar/MonthNarrows/4=\u0648 -FormatData/ar/MonthNarrows/5=\u0646 -FormatData/ar/MonthNarrows/6=\u0644 -FormatData/ar/MonthNarrows/7=\u063a -FormatData/ar/MonthNarrows/8=\u0633 -FormatData/ar/MonthNarrows/9=\u0643 -FormatData/ar/MonthNarrows/10=\u0628 -FormatData/ar/MonthNarrows/11=\u062f +FormatData/ar/MonthNarrows/0=ي +FormatData/ar/MonthNarrows/1=ف +FormatData/ar/MonthNarrows/2=م +FormatData/ar/MonthNarrows/3=أ +FormatData/ar/MonthNarrows/4=و +FormatData/ar/MonthNarrows/5=ن +FormatData/ar/MonthNarrows/6=ل +FormatData/ar/MonthNarrows/7=غ +FormatData/ar/MonthNarrows/8=س +FormatData/ar/MonthNarrows/9=ك +FormatData/ar/MonthNarrows/10=ب +FormatData/ar/MonthNarrows/11=د FormatData/ar/MonthNarrows/12= -FormatData/ru/MonthNarrows/0=\u042f -FormatData/ru/MonthNarrows/1=\u0424 -FormatData/ru/MonthNarrows/2=\u041c -FormatData/ru/MonthNarrows/3=\u0410 -FormatData/ru/MonthNarrows/4=\u041c -FormatData/ru/MonthNarrows/5=\u0418 -FormatData/ru/MonthNarrows/6=\u0418 -FormatData/ru/MonthNarrows/7=\u0410 -FormatData/ru/MonthNarrows/8=\u0421 -FormatData/ru/MonthNarrows/9=\u041e -FormatData/ru/MonthNarrows/10=\u041d -FormatData/ru/MonthNarrows/11=\u0414 +FormatData/ru/MonthNarrows/0=Я +FormatData/ru/MonthNarrows/1=Ф +FormatData/ru/MonthNarrows/2=М +FormatData/ru/MonthNarrows/3=А +FormatData/ru/MonthNarrows/4=М +FormatData/ru/MonthNarrows/5=И +FormatData/ru/MonthNarrows/6=И +FormatData/ru/MonthNarrows/7=А +FormatData/ru/MonthNarrows/8=С +FormatData/ru/MonthNarrows/9=О +FormatData/ru/MonthNarrows/10=Н +FormatData/ru/MonthNarrows/11=Д FormatData/ru/MonthNarrows/12= FormatData/ms/MonthNarrows/0=J FormatData/ms/MonthNarrows/1=F @@ -8160,25 +8160,25 @@ FormatData/vi/MonthNarrows/9=10 FormatData/vi/MonthNarrows/10=11 FormatData/vi/MonthNarrows/11=12 FormatData/vi/MonthNarrows/12= -FormatData/sr/MonthNarrows/0=\u0458 -FormatData/sr/MonthNarrows/1=\u0444 -FormatData/sr/MonthNarrows/2=\u043c -FormatData/sr/MonthNarrows/3=\u0430 -FormatData/sr/MonthNarrows/4=\u043c -FormatData/sr/MonthNarrows/5=\u0458 -FormatData/sr/MonthNarrows/6=\u0458 -FormatData/sr/MonthNarrows/7=\u0430 -FormatData/sr/MonthNarrows/8=\u0441 -FormatData/sr/MonthNarrows/9=\u043e -FormatData/sr/MonthNarrows/10=\u043d -FormatData/sr/MonthNarrows/11=\u0434 +FormatData/sr/MonthNarrows/0=ј +FormatData/sr/MonthNarrows/1=ф +FormatData/sr/MonthNarrows/2=м +FormatData/sr/MonthNarrows/3=а +FormatData/sr/MonthNarrows/4=м +FormatData/sr/MonthNarrows/5=ј +FormatData/sr/MonthNarrows/6=ј +FormatData/sr/MonthNarrows/7=а +FormatData/sr/MonthNarrows/8=с +FormatData/sr/MonthNarrows/9=о +FormatData/sr/MonthNarrows/10=н +FormatData/sr/MonthNarrows/11=д FormatData/sr/MonthNarrows/12= FormatData/mt/MonthNarrows/0=J FormatData/mt/MonthNarrows/1=F FormatData/mt/MonthNarrows/2=M FormatData/mt/MonthNarrows/3=A FormatData/mt/MonthNarrows/4=M -FormatData/mt/MonthNarrows/5=\u0120 +FormatData/mt/MonthNarrows/5=Ġ FormatData/mt/MonthNarrows/6=L FormatData/mt/MonthNarrows/7=A FormatData/mt/MonthNarrows/8=S @@ -8272,7 +8272,7 @@ FormatData/fi/DatePatterns/2=d.M.yyyy FormatData/fi/DatePatterns/3=d.M.yyyy # bug #8075173 -FormatData/de/standalone.MonthAbbreviations/2=M\u00e4r +FormatData/de/standalone.MonthAbbreviations/2=Mär # bug #8129361 CurrencyNames//hrk=Kuna @@ -8282,13 +8282,13 @@ CurrencyNames/de/sar=Saudischer Rial CurrencyNames/de/xpf=CFP-Franc CurrencyNames/it/azn=manat azero CurrencyNames/it/ron=leu rumeno -CurrencyNames/it/trl=lira turca (1922\u20132005) +CurrencyNames/it/trl=lira turca (1922–2005) CurrencyNames/it/try=lira turca -CurrencyNames/sv/bgl=bulgarisk h\u00e5rd lev (1962\u20131999) +CurrencyNames/sv/bgl=bulgarisk hård lev (1962–1999) CurrencyNames/sv/xaf=centralafrikansk franc -CurrencyNames/sv/xfu=internationella j\u00e4rnv\u00e4gsunionens franc -CurrencyNames/sv/xof=v\u00e4stafrikansk franc -CurrencyNames/zh_CN/sdg=\u82cf\u4e39\u9551 +CurrencyNames/sv/xfu=internationella järnvägsunionens franc +CurrencyNames/sv/xof=västafrikansk franc +CurrencyNames/zh_CN/sdg=苏丹镑 # bug #8164784 CurrencyNames//mwk=Malawian Malawi Kwacha @@ -8296,7 +8296,7 @@ CurrencyNames//pen=Peruvian Sol # bug #8145952 CurrencyNames//byn=Belarusian Ruble -CurrencyNames/be_BY/BYN=\u0420\u0443\u0431 +CurrencyNames/be_BY/BYN=Руб # bug #8037111 FormatData/sv/NumberPatterns/2=#,##0 % @@ -8305,7 +8305,7 @@ FormatData/sr-Latin/NumberElements/0=, FormatData/sr-Latin/NumberElements/1=. # bug #8187946 -CurrencyNames//stn=S\u00e3o Tom\u00e9 and Pr\u00edncipe Dobra +CurrencyNames//stn=São Tomé and Príncipe Dobra CurrencyNames//lak=Lao Kip CurrencyNames//php=Philippine Peso CurrencyNames//azn=Azerbaijan Manat @@ -8314,8 +8314,8 @@ CurrencyNames//azn=Azerbaijan Manat CurrencyNames//mru=Mauritanian Ouguiya # bug #8208746, #8274658 -CurrencyNames//ved=Venezuelan Bol\u00edvar Soberano -CurrencyNames//ves=Venezuelan Bol\u00edvar Soberano +CurrencyNames//ved=Venezuelan Bolívar Soberano +CurrencyNames//ves=Venezuelan Bolívar Soberano # bug #8206879 # For Peru decimal separator is changed to dot(.) and grouping separator is changed to comma(,) @@ -8323,12 +8323,12 @@ FormatData/es_PE/NumberElements/0=. FormatData/es_PE/NumberElements/1=, # bug #8227127 -FormatData/ja/short.Eras/0=\u7d00\u5143\u524d -FormatData/ja/short.Eras/1=\u897f\u66a6 -FormatData/zh/short.Eras/0=\u516c\u5143\u524d -FormatData/zh/short.Eras/1=\u516c\u5143 -FormatData/zh_TW/short.Eras/0=\u897f\u5143\u524d -FormatData/zh_TW/short.Eras/1=\u897f\u5143 +FormatData/ja/short.Eras/0=紀元前 +FormatData/ja/short.Eras/1=西暦 +FormatData/zh/short.Eras/0=公元前 +FormatData/zh/short.Eras/1=公元 +FormatData/zh_TW/short.Eras/0=西元前 +FormatData/zh_TW/short.Eras/1=西元 # bug 8234288 TimeZoneNames/en/Asia\/Istanbul/1=Turkey Time @@ -8352,7 +8352,7 @@ LocaleNames//ht=Haitian Creole LocaleNames//kj=Kuanyama LocaleNames//kl=Kalaallisut LocaleNames//ky=Kyrgyz -LocaleNames//nb=Norwegian Bokm\u00e5l +LocaleNames//nb=Norwegian Bokmål LocaleNames//or=Odia LocaleNames//os=Ossetic LocaleNames//pa=Punjabi @@ -8361,7 +8361,7 @@ LocaleNames//rm=Romansh LocaleNames//si=Sinhala LocaleNames//to=Tongan LocaleNames//ug=Uyghur -LocaleNames//vo=Volap\u00fck +LocaleNames//vo=Volapük LocaleNames//ang=Old English LocaleNames//arc=Aramaic LocaleNames//arn=Mapuche @@ -8378,26 +8378,26 @@ LocaleNames//fro=Old French LocaleNames//gmh=Middle High German LocaleNames//goh=Old High German LocaleNames//grc=Ancient Greek -LocaleNames//gwi=Gwich\u02bcin +LocaleNames//gwi=Gwichʼin LocaleNames//luo=Luo LocaleNames//lus=Mizo LocaleNames//mga=Middle Irish LocaleNames//mul=Multiple languages LocaleNames//mus=Muscogee LocaleNames//new=Newari -LocaleNames//nob=Bokm\u00e5l, Norwegian +LocaleNames//nob=Bokmål, Norwegian LocaleNames//non=Old Norse -LocaleNames//nqo=N\u2019Ko +LocaleNames//nqo=N’Ko LocaleNames//nso=Northern Sotho LocaleNames//ota=Ottoman Turkish LocaleNames//peo=Old Persian -LocaleNames//pro=Old Proven\u00e7al +LocaleNames//pro=Old Provençal LocaleNames//sah=Sakha LocaleNames//sga=Old Irish LocaleNames//sog=Sogdien LocaleNames//tog=Nyasa Tonga LocaleNames//und=Unknown language -LocaleNames//vol=Volap\u00fck +LocaleNames//vol=Volapük LocaleNames//wal=Wolaytta LocaleNames//Beng=Bangla LocaleNames//Geok=Georgian Khutsuri @@ -8416,15 +8416,15 @@ LocaleNames//Zinh=Inherited LocaleNames//Zyyy=Common LocaleNames//Zzzz=Unknown Script LocaleNames//AG=Antigua & Barbuda -LocaleNames//AX=\u00c5land Islands +LocaleNames//AX=Åland Islands LocaleNames//BA=Bosnia & Herzegovina -LocaleNames//BL=St. Barth\u00e9lemy +LocaleNames//BL=St. Barthélemy LocaleNames//BQ=Caribbean Netherlands LocaleNames//CC=Cocos (Keeling) Islands LocaleNames//CD=Congo - Kinshasa LocaleNames//CG=Congo - Brazzaville -LocaleNames//CI=C\u00f4te d\u2019Ivoire -LocaleNames//CW=Cura\u00e7ao +LocaleNames//CI=Côte d’Ivoire +LocaleNames//CW=Curaçao LocaleNames//CZ=Czechia LocaleNames//GS=South Georgia & South Sandwich Islands LocaleNames//HK=Hong Kong SAR China @@ -8439,10 +8439,10 @@ LocaleNames//MO=Macao SAR China LocaleNames//PM=St. Pierre & Miquelon LocaleNames//PN=Pitcairn Islands LocaleNames//PS=Palestinian Territories -LocaleNames//RE=R\u00e9union +LocaleNames//RE=Réunion LocaleNames//SH=St. Helena LocaleNames//SJ=Svalbard & Jan Mayen -LocaleNames//ST=S\u00e3o Tom\u00e9 & Pr\u00edncipe +LocaleNames//ST=São Tomé & Príncipe LocaleNames//SX=Sint Maarten LocaleNames//SZ=Eswatini LocaleNames//TC=Turks & Caicos Islands @@ -8457,20 +8457,20 @@ LocaleNames//419=Latin America #bug 8287868 LocaleNames/ca/SZ=eSwatini -LocaleNames/el/SZ=\u0395\u03c3\u03bf\u03c5\u03b1\u03c4\u03af\u03bd\u03b9 -LocaleNames/el_CY/SZ=\u0395\u03c3\u03bf\u03c5\u03b1\u03c4\u03af\u03bd\u03b9 +LocaleNames/el/SZ=Εσουατίνι +LocaleNames/el_CY/SZ=Εσουατίνι LocaleNames/es/SZ=Esuatini -LocaleNames/ga/SZ=eSuait\u00edn\u00ed +LocaleNames/ga/SZ=eSuaitíní LocaleNames/it/SZ=Swaziland -LocaleNames/ja/SZ=\u30a8\u30b9\u30ef\u30c6\u30a3\u30cb -LocaleNames/ko/SZ=\uc5d0\uc2a4\uc640\ud2f0\ub2c8 +LocaleNames/ja/SZ=エスワティニ +LocaleNames/ko/SZ=에스와티니 LocaleNames/mt/SZ=l-Eswatini -LocaleNames/pt/SZ=Essuat\u00edni -LocaleNames/ru/SZ=\u042d\u0441\u0432\u0430\u0442\u0438\u043d\u0438 -LocaleNames/sr/SZ=\u0421\u0432\u0430\u0437\u0438\u043b\u0435\u043d\u0434 -LocaleNames/th/SZ=\u0e40\u0e2d\u0e2a\u0e27\u0e32\u0e15\u0e35\u0e19\u0e35 -LocaleNames/zh/SZ=\u65af\u5a01\u58eb\u5170 -LocaleNames/zh_TW/SZ=\u53f2\u74e6\u5e1d\u5c3c +LocaleNames/pt/SZ=Essuatíni +LocaleNames/ru/SZ=Эсватини +LocaleNames/sr/SZ=Свазиленд +LocaleNames/th/SZ=เอสวาตีนี +LocaleNames/zh/SZ=斯威士兰 +LocaleNames/zh_TW/SZ=史瓦帝尼 #bug 8303472 -LocaleNames//TR=T\u00fcrkiye +LocaleNames//TR=Türkiye diff --git a/test/jdk/sun/text/resources/LocaleData.cldr b/test/jdk/sun/text/resources/LocaleData.cldr index 21f1d016cfc3..529eb2022df6 100644 --- a/test/jdk/sun/text/resources/LocaleData.cldr +++ b/test/jdk/sun/text/resources/LocaleData.cldr @@ -8,7 +8,7 @@ LocaleNames/en/es=Spanish # bug #4052679 -LocaleNames/fr/fr=fran\u00e7ais +LocaleNames/fr/fr=français # bug #4055602, 4290801, 8013836 CurrencyNames/pt_BR/BRL=R$ @@ -32,26 +32,26 @@ FormatData/pt_BR/DayAbbreviations/1=seg. FormatData/pt_BR/DayAbbreviations/2=ter. FormatData/pt_BR/DayNames/0=domingo FormatData/pt_BR/DayNames/1=segunda-feira -FormatData/pt_BR/DayNames/2=ter\u00e7a-feira +FormatData/pt_BR/DayNames/2=terça-feira FormatData/pt_BR/MonthNames/0=janeiro FormatData/pt_BR/MonthNames/1=fevereiro -FormatData/pt_BR/MonthNames/2=mar\u00e7o -LocaleNames/pt_BR/pt=portugu\u00eas +FormatData/pt_BR/MonthNames/2=março +LocaleNames/pt_BR/pt=português LocaleNames/pt_BR/PT=Portugal LocaleNames/pt_BR/BR=Brasil # bug #4066550 -FormatData/ja/Eras/0=\u7d00\u5143\u524d -FormatData/ja/Eras/1=\u897f\u66a6 +FormatData/ja/Eras/0=紀元前 +FormatData/ja/Eras/1=西暦 # bug #4067619 LocaleNames/en/LT=Lithuania # bug #4068012, 4290801, 4942982 -CurrencyNames/ru_RU/RUB=\u20bd +CurrencyNames/ru_RU/RUB=₽ FormatData/ru_RU/latn.NumberPatterns/0=#,##0.### -# FormatData/ru_RU/NumberPatterns/1=#,##0.##'\u0440.';-#,##0.##'\u0440.' # Changed; see bug 4122840 -FormatData/ru_RU/latn.NumberPatterns/2=#,##0\u00a0% +# FormatData/ru_RU/NumberPatterns/1=#,##0.##'р.';-#,##0.##'р.' # Changed; see bug 4122840 +FormatData/ru_RU/latn.NumberPatterns/2=#,##0 % # bug #4070174 FormatData/en_CA/latn.NumberElements/1=, @@ -82,60 +82,60 @@ FormatData/fr_FR/DatePatterns/0=EEEE d MMMM y # FormatData/it_IT/NumberPatterns/1='L.' #,##0;-'L.' #,##0 # Changed; see bug 4122840 # bug #4071782 -FormatData/ru/DayAbbreviations/0=\u0432\u0441 -FormatData/ru/DayAbbreviations/1=\u043f\u043d -FormatData/ru/DayAbbreviations/2=\u0432\u0442 -FormatData/ru/DayAbbreviations/3=\u0441\u0440 -FormatData/ru/DayAbbreviations/4=\u0447\u0442 -FormatData/ru/DayAbbreviations/5=\u043f\u0442 -FormatData/ru/DayAbbreviations/6=\u0441\u0431 +FormatData/ru/DayAbbreviations/0=вс +FormatData/ru/DayAbbreviations/1=пн +FormatData/ru/DayAbbreviations/2=вт +FormatData/ru/DayAbbreviations/3=ср +FormatData/ru/DayAbbreviations/4=чт +FormatData/ru/DayAbbreviations/5=пт +FormatData/ru/DayAbbreviations/6=сб # bug #4072013 - obsoleted by 6386647: Full date format in DateFormat does not include day of the week for UK locale #FormatData/en_GB/DatePatterns/0=dd MMMM yyyy # bug #4072388 -LocaleNames/cs/cs=\u010de\u0161tina +LocaleNames/cs/cs=čeština # bug #4072773 FormatData/ja/DatePatterns/2=y/MM/dd FormatData/ja/DatePatterns/3=y/MM/dd # bug #4075404, 4290801, 4942982 -CurrencyNames/ru_RU/RUB=\u20bd +CurrencyNames/ru_RU/RUB=₽ FormatData/ru_RU/TimePatterns/0=HH:mm:ss zzzz FormatData/ru_RU/TimePatterns/1=HH:mm:ss z FormatData/ru_RU/TimePatterns/2=HH:mm:ss FormatData/ru_RU/TimePatterns/3=HH:mm -FormatData/ru_RU/DatePatterns/0=EEEE, d MMMM y\u202f'\u0433'. -FormatData/ru_RU/DatePatterns/1=d MMMM y\u202f'\u0433'. -FormatData/ru_RU/DatePatterns/2=d MMM y\u202f'\u0433'. +FormatData/ru_RU/DatePatterns/0=EEEE, d MMMM y 'г'. +FormatData/ru_RU/DatePatterns/1=d MMMM y 'г'. +FormatData/ru_RU/DatePatterns/2=d MMM y 'г'. FormatData/ru_RU/DatePatterns/3=dd.MM.y FormatData/ru_RU/DateTimePatterns/0={1}, {0} # bug #4084356, 4290801 -CurrencyNames/pl_PL/PLN=z\u0142 +CurrencyNames/pl_PL/PLN=zł FormatData/pl_PL/latn.NumberPatterns/0=#,##0.### -# FormatData/pl_PL/NumberPatterns/1=#,##0.## z\u0142;-#,##0.## z\u0142 # Changed; see bug 4122840 +# FormatData/pl_PL/NumberPatterns/1=#,##0.## zł;-#,##0.## zł # Changed; see bug 4122840 FormatData/pl_PL/latn.NumberPatterns/2=#,##0% FormatData/pl_PL/DayNames/0=niedziela -FormatData/pl_PL/DayNames/1=poniedzia\u0142ek +FormatData/pl_PL/DayNames/1=poniedziałek FormatData/pl_PL/DayNames/2=wtorek -FormatData/pl_PL/DayNames/3=\u015broda +FormatData/pl_PL/DayNames/3=środa FormatData/pl_PL/DayNames/4=czwartek -FormatData/pl_PL/DayNames/5=pi\u0105tek +FormatData/pl_PL/DayNames/5=piątek FormatData/pl_PL/DayNames/6=sobota -FormatData/pl_PL/standalone.MonthNames/0=stycze\u0144 +FormatData/pl_PL/standalone.MonthNames/0=styczeń FormatData/pl_PL/standalone.MonthNames/1=luty FormatData/pl_PL/standalone.MonthNames/2=marzec -FormatData/pl_PL/standalone.MonthNames/3=kwiecie\u0144 +FormatData/pl_PL/standalone.MonthNames/3=kwiecień FormatData/pl_PL/standalone.MonthNames/4=maj FormatData/pl_PL/standalone.MonthNames/5=czerwiec FormatData/pl_PL/standalone.MonthNames/6=lipiec -FormatData/pl_PL/standalone.MonthNames/7=sierpie\u0144 -FormatData/pl_PL/standalone.MonthNames/8=wrzesie\u0144 -FormatData/pl_PL/standalone.MonthNames/9=pa\u017adziernik +FormatData/pl_PL/standalone.MonthNames/7=sierpień +FormatData/pl_PL/standalone.MonthNames/8=wrzesień +FormatData/pl_PL/standalone.MonthNames/9=październik FormatData/pl_PL/standalone.MonthNames/10=listopad -FormatData/pl_PL/standalone.MonthNames/11=grudzie\u0144 +FormatData/pl_PL/standalone.MonthNames/11=grudzień FormatData/pl_PL/standalone.MonthNames/12= LocaleNames/pl_PL/pl=polski FormatData/pl_PL/TimePatterns/0=HH:mm:ss zzzz @@ -149,15 +149,15 @@ FormatData/pl_PL/DatePatterns/2=d MMM y FormatData/pl_PL/DatePatterns/3=d.MM.y FormatData/pl_PL/DateTimePatterns/0={1} {0} FormatData/pl_PL/latn.NumberElements/0=, -FormatData/pl_PL/latn.NumberElements/1=\u00a0 +FormatData/pl_PL/latn.NumberElements/1=  FormatData/pl_PL/latn.NumberElements/2=; FormatData/pl_PL/latn.NumberElements/3=% FormatData/pl_PL/latn.NumberElements/4=0 FormatData/pl_PL/latn.NumberElements/5=# FormatData/pl_PL/latn.NumberElements/6=- FormatData/pl_PL/latn.NumberElements/7=E -FormatData/pl_PL/latn.NumberElements/8=\u2030 -FormatData/pl_PL/latn.NumberElements/9=\u221e +FormatData/pl_PL/latn.NumberElements/8=‰ +FormatData/pl_PL/latn.NumberElements/9=∞ FormatData/pl_PL/latn.NumberElements/10=NaN FormatData/pl_PL/Eras/0=p.n.e. FormatData/pl_PL/Eras/1=n.e. @@ -165,7 +165,7 @@ LocaleNames/pl_PL/PL=Polska FormatData/pl_PL/DayAbbreviations/0=niedz. FormatData/pl_PL/DayAbbreviations/1=pon. FormatData/pl_PL/DayAbbreviations/2=wt. -FormatData/pl_PL/DayAbbreviations/3=\u015br. +FormatData/pl_PL/DayAbbreviations/3=śr. FormatData/pl_PL/DayAbbreviations/4=czw. FormatData/pl_PL/DayAbbreviations/5=pt. FormatData/pl_PL/DayAbbreviations/6=sob. @@ -178,7 +178,7 @@ FormatData/pl_PL/MonthAbbreviations/5=cze FormatData/pl_PL/MonthAbbreviations/6=lip FormatData/pl_PL/MonthAbbreviations/7=sie FormatData/pl_PL/MonthAbbreviations/8=wrz -FormatData/pl_PL/MonthAbbreviations/9=pa\u017a +FormatData/pl_PL/MonthAbbreviations/9=paź FormatData/pl_PL/MonthAbbreviations/10=lis FormatData/pl_PL/MonthAbbreviations/11=gru FormatData/pl_PL/MonthAbbreviations/12= @@ -187,14 +187,14 @@ FormatData/pl_PL/AmPmMarkers/1=PM # bug #4087238, 4290801 # bug 4156708 - changed currency symbol from 00a5 to ffe5 -CurrencyNames/ja_JP/JPY=\uffe5 -# FormatData/ja_JP/NumberPatterns/1=\u00a5#,##0.00 # Changed; see bug 4122840 +CurrencyNames/ja_JP/JPY=¥ +# FormatData/ja_JP/NumberPatterns/1=¥#,##0.00 # Changed; see bug 4122840 # bug #4092361 -FormatData/en_US/TimePatterns/0=h:mm:ss\u202fa zzzz -FormatData/en_US/TimePatterns/1=h:mm:ss\u202fa z -FormatData/en_US/TimePatterns/2=h:mm:ss\u202fa -FormatData/en_US/TimePatterns/3=h:mm\u202fa +FormatData/en_US/TimePatterns/0=h:mm:ss a zzzz +FormatData/en_US/TimePatterns/1=h:mm:ss a z +FormatData/en_US/TimePatterns/2=h:mm:ss a +FormatData/en_US/TimePatterns/3=h:mm a FormatData/en_US/DatePatterns/0=EEEE, MMMM d, y FormatData/en_US/DatePatterns/1=MMMM d, y FormatData/en_US/DatePatterns/2=MMM d, y @@ -202,121 +202,121 @@ FormatData/en_US/DatePatterns/3=M/d/yy FormatData/en_US/DateTimePatterns/0={1}, {0} # bug #4094033, 4290801, 4942982 -CurrencyNames/ru_RU/RUB=\u20bd +CurrencyNames/ru_RU/RUB=₽ FormatData/ru_RU/latn.NumberPatterns/0=#,##0.### -# FormatData/ru_RU/NumberPatterns/1=#,##0.##'\u0440.';-#,##0.##'\u0440.' # Changed; see bug 4122840 -FormatData/ru_RU/latn.NumberPatterns/2=#,##0\u00a0% -FormatData/ru_RU/MonthNames/0=\u044f\u043d\u0432\u0430\u0440\u044f -FormatData/ru_RU/MonthNames/1=\u0444\u0435\u0432\u0440\u0430\u043b\u044f -FormatData/ru_RU/MonthNames/2=\u043c\u0430\u0440\u0442\u0430 -FormatData/ru_RU/MonthNames/3=\u0430\u043f\u0440\u0435\u043b\u044f -FormatData/ru_RU/MonthNames/4=\u043c\u0430\u044f -FormatData/ru_RU/MonthNames/5=\u0438\u044e\u043d\u044f -FormatData/ru_RU/MonthNames/6=\u0438\u044e\u043b\u044f -FormatData/ru_RU/MonthNames/7=\u0430\u0432\u0433\u0443\u0441\u0442\u0430 -FormatData/ru_RU/MonthNames/8=\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f -FormatData/ru_RU/MonthNames/9=\u043e\u043a\u0442\u044f\u0431\u0440\u044f -FormatData/ru_RU/MonthNames/10=\u043d\u043e\u044f\u0431\u0440\u044f -FormatData/ru_RU/MonthNames/11=\u0434\u0435\u043a\u0430\u0431\u0440\u044f +# FormatData/ru_RU/NumberPatterns/1=#,##0.##'р.';-#,##0.##'р.' # Changed; see bug 4122840 +FormatData/ru_RU/latn.NumberPatterns/2=#,##0 % +FormatData/ru_RU/MonthNames/0=января +FormatData/ru_RU/MonthNames/1=февраля +FormatData/ru_RU/MonthNames/2=марта +FormatData/ru_RU/MonthNames/3=апреля +FormatData/ru_RU/MonthNames/4=мая +FormatData/ru_RU/MonthNames/5=июня +FormatData/ru_RU/MonthNames/6=июля +FormatData/ru_RU/MonthNames/7=августа +FormatData/ru_RU/MonthNames/8=сентября +FormatData/ru_RU/MonthNames/9=октября +FormatData/ru_RU/MonthNames/10=ноября +FormatData/ru_RU/MonthNames/11=декабря FormatData/ru_RU/MonthNames/12= -FormatData/ru_RU/standalone.MonthNames/0=\u044f\u043d\u0432\u0430\u0440\u044c -FormatData/ru_RU/standalone.MonthNames/1=\u0444\u0435\u0432\u0440\u0430\u043b\u044c -FormatData/ru_RU/standalone.MonthNames/2=\u043c\u0430\u0440\u0442 -FormatData/ru_RU/standalone.MonthNames/3=\u0430\u043f\u0440\u0435\u043b\u044c -FormatData/ru_RU/standalone.MonthNames/4=\u043c\u0430\u0439 -FormatData/ru_RU/standalone.MonthNames/5=\u0438\u044e\u043d\u044c -FormatData/ru_RU/standalone.MonthNames/6=\u0438\u044e\u043b\u044c -FormatData/ru_RU/standalone.MonthNames/7=\u0430\u0432\u0433\u0443\u0441\u0442 -FormatData/ru_RU/standalone.MonthNames/8=\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c -FormatData/ru_RU/standalone.MonthNames/9=\u043e\u043a\u0442\u044f\u0431\u0440\u044c -FormatData/ru_RU/standalone.MonthNames/10=\u043d\u043e\u044f\u0431\u0440\u044c -FormatData/ru_RU/standalone.MonthNames/11=\u0434\u0435\u043a\u0430\u0431\u0440\u044c +FormatData/ru_RU/standalone.MonthNames/0=январь +FormatData/ru_RU/standalone.MonthNames/1=февраль +FormatData/ru_RU/standalone.MonthNames/2=март +FormatData/ru_RU/standalone.MonthNames/3=апрель +FormatData/ru_RU/standalone.MonthNames/4=май +FormatData/ru_RU/standalone.MonthNames/5=июнь +FormatData/ru_RU/standalone.MonthNames/6=июль +FormatData/ru_RU/standalone.MonthNames/7=август +FormatData/ru_RU/standalone.MonthNames/8=сентябрь +FormatData/ru_RU/standalone.MonthNames/9=октябрь +FormatData/ru_RU/standalone.MonthNames/10=ноябрь +FormatData/ru_RU/standalone.MonthNames/11=декабрь FormatData/ru_RU/standalone.MonthNames/12= -FormatData/ru_RU/Eras/0=\u0434\u043e \u043d. \u044d. -FormatData/ru_RU/Eras/1=\u043d. \u044d. -LocaleNames/ru_RU/ru=\u0440\u0443\u0441\u0441\u043a\u0438\u0439 -FormatData/ru_RU/MonthAbbreviations/0=\u044f\u043d\u0432. -FormatData/ru_RU/MonthAbbreviations/1=\u0444\u0435\u0432\u0440. -FormatData/ru_RU/MonthAbbreviations/2=\u043c\u0430\u0440. -FormatData/ru_RU/MonthAbbreviations/3=\u0430\u043f\u0440. -FormatData/ru_RU/MonthAbbreviations/4=\u043c\u0430\u044f -FormatData/ru_RU/MonthAbbreviations/5=\u0438\u044e\u043d. -FormatData/ru_RU/MonthAbbreviations/6=\u0438\u044e\u043b. -FormatData/ru_RU/MonthAbbreviations/7=\u0430\u0432\u0433. -FormatData/ru_RU/MonthAbbreviations/8=\u0441\u0435\u043d\u0442. -FormatData/ru_RU/MonthAbbreviations/9=\u043e\u043a\u0442. -FormatData/ru_RU/MonthAbbreviations/10=\u043d\u043e\u044f\u0431. -FormatData/ru_RU/MonthAbbreviations/11=\u0434\u0435\u043a. +FormatData/ru_RU/Eras/0=до н. э. +FormatData/ru_RU/Eras/1=н. э. +LocaleNames/ru_RU/ru=русский +FormatData/ru_RU/MonthAbbreviations/0=янв. +FormatData/ru_RU/MonthAbbreviations/1=февр. +FormatData/ru_RU/MonthAbbreviations/2=мар. +FormatData/ru_RU/MonthAbbreviations/3=апр. +FormatData/ru_RU/MonthAbbreviations/4=мая +FormatData/ru_RU/MonthAbbreviations/5=июн. +FormatData/ru_RU/MonthAbbreviations/6=июл. +FormatData/ru_RU/MonthAbbreviations/7=авг. +FormatData/ru_RU/MonthAbbreviations/8=сент. +FormatData/ru_RU/MonthAbbreviations/9=окт. +FormatData/ru_RU/MonthAbbreviations/10=нояб. +FormatData/ru_RU/MonthAbbreviations/11=дек. FormatData/ru_RU/MonthAbbreviations/12= -# FormatData/ru_RU/standalone.MonthAbbreviations/0=\u044f\u043d\u0432 -# FormatData/ru_RU/standalone.MonthAbbreviations/1=\u0444\u0435\u0432 -# FormatData/ru_RU/standalone.MonthAbbreviations/2=\u043c\u0430\u0440 -# FormatData/ru_RU/standalone.MonthAbbreviations/3=\u0430\u043f\u0440 -# FormatData/ru_RU/standalone.MonthAbbreviations/4=\u043c\u0430\u0439 -# FormatData/ru_RU/standalone.MonthAbbreviations/5=\u0438\u044e\u043d -# FormatData/ru_RU/standalone.MonthAbbreviations/6=\u0438\u044e\u043b -# FormatData/ru_RU/standalone.MonthAbbreviations/7=\u0430\u0432\u0433 -# FormatData/ru_RU/standalone.MonthAbbreviations/8=\u0441\u0435\u043d -# FormatData/ru_RU/standalone.MonthAbbreviations/9=\u043e\u043a\u0442 -# FormatData/ru_RU/standalone.MonthAbbreviations/10=\u043d\u043e\u044f -# FormatData/ru_RU/standalone.MonthAbbreviations/11=\u0434\u0435\u043a +# FormatData/ru_RU/standalone.MonthAbbreviations/0=янв +# FormatData/ru_RU/standalone.MonthAbbreviations/1=фев +# FormatData/ru_RU/standalone.MonthAbbreviations/2=мар +# FormatData/ru_RU/standalone.MonthAbbreviations/3=апр +# FormatData/ru_RU/standalone.MonthAbbreviations/4=май +# FormatData/ru_RU/standalone.MonthAbbreviations/5=июн +# FormatData/ru_RU/standalone.MonthAbbreviations/6=июл +# FormatData/ru_RU/standalone.MonthAbbreviations/7=авг +# FormatData/ru_RU/standalone.MonthAbbreviations/8=сен +# FormatData/ru_RU/standalone.MonthAbbreviations/9=окт +# FormatData/ru_RU/standalone.MonthAbbreviations/10=ноя +# FormatData/ru_RU/standalone.MonthAbbreviations/11=дек # FormatData/ru_RU/standalone.MonthAbbreviations/12= -FormatData/ru_RU/standalone.MonthAbbreviations/0=\u044f\u043d\u0432. -FormatData/ru_RU/standalone.MonthAbbreviations/1=\u0444\u0435\u0432\u0440. -FormatData/ru_RU/standalone.MonthAbbreviations/2=\u043c\u0430\u0440\u0442 -FormatData/ru_RU/standalone.MonthAbbreviations/3=\u0430\u043f\u0440. -FormatData/ru_RU/standalone.MonthAbbreviations/4=\u043c\u0430\u0439 -FormatData/ru_RU/standalone.MonthAbbreviations/5=\u0438\u044e\u043d\u044c -FormatData/ru_RU/standalone.MonthAbbreviations/6=\u0438\u044e\u043b\u044c -FormatData/ru_RU/standalone.MonthAbbreviations/7=\u0430\u0432\u0433. -FormatData/ru_RU/standalone.MonthAbbreviations/8=\u0441\u0435\u043d\u0442. -FormatData/ru_RU/standalone.MonthAbbreviations/9=\u043e\u043a\u0442. -FormatData/ru_RU/standalone.MonthAbbreviations/10=\u043d\u043e\u044f\u0431. -FormatData/ru_RU/standalone.MonthAbbreviations/11=\u0434\u0435\u043a. +FormatData/ru_RU/standalone.MonthAbbreviations/0=янв. +FormatData/ru_RU/standalone.MonthAbbreviations/1=февр. +FormatData/ru_RU/standalone.MonthAbbreviations/2=март +FormatData/ru_RU/standalone.MonthAbbreviations/3=апр. +FormatData/ru_RU/standalone.MonthAbbreviations/4=май +FormatData/ru_RU/standalone.MonthAbbreviations/5=июнь +FormatData/ru_RU/standalone.MonthAbbreviations/6=июль +FormatData/ru_RU/standalone.MonthAbbreviations/7=авг. +FormatData/ru_RU/standalone.MonthAbbreviations/8=сент. +FormatData/ru_RU/standalone.MonthAbbreviations/9=окт. +FormatData/ru_RU/standalone.MonthAbbreviations/10=нояб. +FormatData/ru_RU/standalone.MonthAbbreviations/11=дек. FormatData/ru_RU/standalone.MonthAbbreviations/12= FormatData/ru_RU/TimePatterns/0=HH:mm:ss zzzz FormatData/ru_RU/TimePatterns/1=HH:mm:ss z FormatData/ru_RU/TimePatterns/2=HH:mm:ss FormatData/ru_RU/TimePatterns/3=HH:mm -FormatData/ru_RU/DatePatterns/0=EEEE, d MMMM y\u202f'\u0433'. -FormatData/ru_RU/DatePatterns/1=d MMMM y\u202f'\u0433'. -FormatData/ru_RU/DatePatterns/2=d MMM y\u202f'\u0433'. +FormatData/ru_RU/DatePatterns/0=EEEE, d MMMM y 'г'. +FormatData/ru_RU/DatePatterns/1=d MMMM y 'г'. +FormatData/ru_RU/DatePatterns/2=d MMM y 'г'. FormatData/ru_RU/DatePatterns/3=dd.MM.y FormatData/ru_RU/DateTimePatterns/0={1}, {0} -FormatData/ru_RU/DayNames/0=\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435 -FormatData/ru_RU/DayNames/1=\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a -FormatData/ru_RU/DayNames/2=\u0432\u0442\u043e\u0440\u043d\u0438\u043a -FormatData/ru_RU/DayNames/3=\u0441\u0440\u0435\u0434\u0430 -FormatData/ru_RU/DayNames/4=\u0447\u0435\u0442\u0432\u0435\u0440\u0433 -FormatData/ru_RU/DayNames/5=\u043f\u044f\u0442\u043d\u0438\u0446\u0430 -FormatData/ru_RU/DayNames/6=\u0441\u0443\u0431\u0431\u043e\u0442\u0430 +FormatData/ru_RU/DayNames/0=воскресенье +FormatData/ru_RU/DayNames/1=понедельник +FormatData/ru_RU/DayNames/2=вторник +FormatData/ru_RU/DayNames/3=среда +FormatData/ru_RU/DayNames/4=четверг +FormatData/ru_RU/DayNames/5=пятница +FormatData/ru_RU/DayNames/6=суббота FormatData/ru_RU/latn.NumberElements/0=, -FormatData/ru_RU/latn.NumberElements/1=\u00a0 +FormatData/ru_RU/latn.NumberElements/1=  FormatData/ru_RU/latn.NumberElements/2=; FormatData/ru_RU/latn.NumberElements/3=% FormatData/ru_RU/latn.NumberElements/4=0 FormatData/ru_RU/latn.NumberElements/5=# FormatData/ru_RU/latn.NumberElements/6=- FormatData/ru_RU/latn.NumberElements/7=E -FormatData/ru_RU/latn.NumberElements/8=\u2030 -FormatData/ru_RU/latn.NumberElements/9=\u221e -FormatData/ru_RU/latn.NumberElements/10=\u043d\u0435\u00a0\u0447\u0438\u0441\u043b\u043e -LocaleNames/ru_RU/RU=\u0420\u043e\u0441\u0441\u0438\u044f -FormatData/ru_RU/DayAbbreviations/0=\u0432\u0441 -FormatData/ru_RU/DayAbbreviations/1=\u043f\u043d -FormatData/ru_RU/DayAbbreviations/2=\u0432\u0442 -FormatData/ru_RU/DayAbbreviations/3=\u0441\u0440 -FormatData/ru_RU/DayAbbreviations/4=\u0447\u0442 -FormatData/ru_RU/DayAbbreviations/5=\u043f\u0442 -FormatData/ru_RU/DayAbbreviations/6=\u0441\u0431 +FormatData/ru_RU/latn.NumberElements/8=‰ +FormatData/ru_RU/latn.NumberElements/9=∞ +FormatData/ru_RU/latn.NumberElements/10=не число +LocaleNames/ru_RU/RU=Россия +FormatData/ru_RU/DayAbbreviations/0=вс +FormatData/ru_RU/DayAbbreviations/1=пн +FormatData/ru_RU/DayAbbreviations/2=вт +FormatData/ru_RU/DayAbbreviations/3=ср +FormatData/ru_RU/DayAbbreviations/4=чт +FormatData/ru_RU/DayAbbreviations/5=пт +FormatData/ru_RU/DayAbbreviations/6=сб FormatData/ru_RU/AmPmMarkers/0=AM FormatData/ru_RU/AmPmMarkers/1=PM # bug #4094371, 4098518, 4290801, 6558863 -FormatData/en_AU/TimePatterns/0=h:mm:ss\u202fa zzzz -FormatData/en_AU/TimePatterns/1=h:mm:ss\u202fa z -FormatData/en_AU/TimePatterns/2=h:mm:ss\u202fa -FormatData/en_AU/TimePatterns/3=h:mm\u202fa +FormatData/en_AU/TimePatterns/0=h:mm:ss a zzzz +FormatData/en_AU/TimePatterns/1=h:mm:ss a z +FormatData/en_AU/TimePatterns/2=h:mm:ss a +FormatData/en_AU/TimePatterns/3=h:mm a FormatData/en_AU/DatePatterns/0=EEEE, d MMMM y FormatData/en_AU/DatePatterns/1=d MMMM y FormatData/en_AU/DatePatterns/2=d MMM y @@ -337,10 +337,10 @@ FormatData/en_AU/MonthNames/0=January FormatData/en_AU/MonthNames/1=February FormatData/en_AU/MonthNames/2=March # changed, bug 6558863 -FormatData/en_NZ/TimePatterns/0=h:mm:ss\u202fa zzzz -FormatData/en_NZ/TimePatterns/1=h:mm:ss\u202fa z -FormatData/en_NZ/TimePatterns/2=h:mm:ss\u202fa -FormatData/en_NZ/TimePatterns/3=h:mm\u202fa +FormatData/en_NZ/TimePatterns/0=h:mm:ss a zzzz +FormatData/en_NZ/TimePatterns/1=h:mm:ss a z +FormatData/en_NZ/TimePatterns/2=h:mm:ss a +FormatData/en_NZ/TimePatterns/3=h:mm a FormatData/en_NZ/DatePatterns/0=EEEE, d MMMM y FormatData/en_NZ/DatePatterns/1=d MMMM y FormatData/en_NZ/DatePatterns/2=d/MM/y @@ -386,7 +386,7 @@ FormatData/en_ZA/MonthNames/2=March CurrencyNames/es_AR/ARS=$ FormatData/es_AR/latn.NumberPatterns/0=#,##0.### # FormatData/es_AR/NumberPatterns/1=$#,##0.00;($#,##0.00) # Changed; see bug 4122840 -FormatData/es_AR/latn.NumberPatterns/2=#,##0\u00a0% +FormatData/es_AR/latn.NumberPatterns/2=#,##0 % FormatData/es_AR/TimePatterns/0=HH:mm:ss zzzz FormatData/es_AR/TimePatterns/1=HH:mm:ss z FormatData/es_AR/TimePatterns/2=HH:mm:ss @@ -401,7 +401,7 @@ FormatData/es_AR/latn.NumberElements/1=. FormatData/es_AR/latn.NumberElements/2=; FormatData/es_BO/latn.NumberPatterns/0=#,##0.### # FormatData/es_BO/NumberPatterns/1=B$#,##0.00;(B$#,##0.00) # Changed; see bug 4122840 -FormatData/es_BO/latn.NumberPatterns/2=#,##0\u00a0% +FormatData/es_BO/latn.NumberPatterns/2=#,##0 % CurrencyNames/es_BO/BOB=Bs FormatData/es_BO/TimePatterns/0=HH:mm:ss zzzz FormatData/es_BO/TimePatterns/1=HH:mm:ss z @@ -419,7 +419,7 @@ FormatData/es_BO/latn.NumberElements/2=; CurrencyNames/es_CL/CLP=$ FormatData/es_CL/latn.NumberPatterns/0=#,##0.### # FormatData/es_CL/NumberPatterns/1=Ch$#,##0.00;Ch$-#,##0.00 # Changed; see bug 4122840 -FormatData/es_CL/latn.NumberPatterns/2=#,##0\u00a0% +FormatData/es_CL/latn.NumberPatterns/2=#,##0 % FormatData/es_CL/DatePatterns/0=EEEE, d 'de' MMMM 'de' y FormatData/es_CL/DatePatterns/1=d 'de' MMMM 'de' y FormatData/es_CL/DatePatterns/2=dd-MM-y @@ -430,13 +430,13 @@ FormatData/es_CL/latn.NumberElements/1=. FormatData/es_CL/latn.NumberElements/2=; FormatData/es_CO/latn.NumberPatterns/0=#,##0.### # FormatData/es_CO/NumberPatterns/1=C$#,##0.00;(C$#,##0.00) # Changed; see bug 4122840 -FormatData/es_CO/latn.NumberPatterns/2=#,##0\u00a0% +FormatData/es_CO/latn.NumberPatterns/2=#,##0 % # changed currency symbol during 5102005 bugfix CurrencyNames/es_CO/COP=$ -FormatData/es_CO/TimePatterns/0=h:mm:ss\u202fa zzzz -FormatData/es_CO/TimePatterns/1=h:mm:ss\u202fa z -FormatData/es_CO/TimePatterns/2=h:mm:ss\u202fa -FormatData/es_CO/TimePatterns/3=h:mm\u202fa +FormatData/es_CO/TimePatterns/0=h:mm:ss a zzzz +FormatData/es_CO/TimePatterns/1=h:mm:ss a z +FormatData/es_CO/TimePatterns/2=h:mm:ss a +FormatData/es_CO/TimePatterns/3=h:mm a FormatData/es_CO/DatePatterns/0=EEEE, d 'de' MMMM 'de' y FormatData/es_CO/DatePatterns/1=d 'de' MMMM 'de' y FormatData/es_CO/DatePatterns/2=d/MM/y @@ -448,8 +448,8 @@ FormatData/es_CO/latn.NumberElements/1=. FormatData/es_CO/latn.NumberElements/2=; FormatData/es_CR/latn.NumberPatterns/0=#,##0.### # FormatData/es_CR/NumberPatterns/1=C#,##0.00;(C#,##0.00) # Changed; see bug 4122840 -FormatData/es_CR/latn.NumberPatterns/2=#,##0\u00a0% -CurrencyNames/es_CR/CRC=\u20a1 +FormatData/es_CR/latn.NumberPatterns/2=#,##0 % +CurrencyNames/es_CR/CRC=₡ FormatData/es_CR/TimePatterns/0=HH:mm:ss zzzz FormatData/es_CR/TimePatterns/1=HH:mm:ss z FormatData/es_CR/TimePatterns/2=HH:mm:ss @@ -460,16 +460,16 @@ FormatData/es_CR/DatePatterns/2=d MMM y FormatData/es_CR/DatePatterns/3=d/M/yy FormatData/es_CR/DateTimePatterns/0={1}, {0} FormatData/es_CR/latn.NumberElements/0=, -FormatData/es_CR/latn.NumberElements/1=\u00a0 +FormatData/es_CR/latn.NumberElements/1=  FormatData/es_CR/latn.NumberElements/2=; FormatData/es_DO/latn.NumberPatterns/0=#,##0.### # FormatData/es_DO/NumberPatterns/1=RD$#,##0.00;(RD$#,##0.00) # Changed; see bug 4122840 -FormatData/es_DO/latn.NumberPatterns/2=#,##0\u00a0% +FormatData/es_DO/latn.NumberPatterns/2=#,##0 % CurrencyNames/es_DO/DOP=RD$ -FormatData/es_DO/TimePatterns/0=h:mm:ss\u202fa zzzz -FormatData/es_DO/TimePatterns/1=h:mm:ss\u202fa z -FormatData/es_DO/TimePatterns/2=h:mm:ss\u202fa -FormatData/es_DO/TimePatterns/3=h:mm\u202fa +FormatData/es_DO/TimePatterns/0=h:mm:ss a zzzz +FormatData/es_DO/TimePatterns/1=h:mm:ss a z +FormatData/es_DO/TimePatterns/2=h:mm:ss a +FormatData/es_DO/TimePatterns/3=h:mm a FormatData/es_DO/DatePatterns/0=EEEE, d 'de' MMMM 'de' y FormatData/es_DO/DatePatterns/1=d 'de' MMMM 'de' y # FormatData/es_DO/DatePatterns/2=MM/dd/yyyy # Changed: see bug 8037343 @@ -480,7 +480,7 @@ FormatData/es_DO/latn.NumberElements/1=, FormatData/es_DO/latn.NumberElements/2=; FormatData/es_EC/latn.NumberPatterns/0=#,##0.### # FormatData/es_EC/NumberPatterns/1=S/#,##0.00;S/-#,##0.00 # Changed; see bug 4122840 -FormatData/es_EC/latn.NumberPatterns/2=#,##0\u00a0% +FormatData/es_EC/latn.NumberPatterns/2=#,##0 % #changed for 4945388 CurrencyNames/es_EC/USD=$ FormatData/es_EC/DatePatterns/0=EEEE, d 'de' MMMM 'de' y @@ -492,20 +492,20 @@ FormatData/es_EC/DateTimePatterns/0={1}, {0} FormatData/es_EC/latn.NumberElements/0=, FormatData/es_EC/latn.NumberElements/1=. FormatData/es_EC/latn.NumberElements/2=; -LocaleNames/es/ES=Espa\u00f1a +LocaleNames/es/ES=España LocaleNames/es/AR=Argentina LocaleNames/es/BO=Bolivia LocaleNames/es/CL=Chile LocaleNames/es/CO=Colombia LocaleNames/es/CR=Costa Rica -LocaleNames/es/DO=Rep\u00fablica Dominicana +LocaleNames/es/DO=República Dominicana LocaleNames/es/EC=Ecuador LocaleNames/es/GT=Guatemala LocaleNames/es/HN=Honduras -LocaleNames/es/MX=M\u00e9xico +LocaleNames/es/MX=México LocaleNames/es/NI=Nicaragua -LocaleNames/es/PA=Panam\u00e1 -LocaleNames/es/PE=Per\u00fa +LocaleNames/es/PA=Panamá +LocaleNames/es/PE=Perú LocaleNames/es/PR=Puerto Rico LocaleNames/es/PY=Paraguay # LocaleNames/es/SV=El SalvadorUY # Changed, see bug 4331446 @@ -513,7 +513,7 @@ LocaleNames/es/UY=Uruguay LocaleNames/es/VE=Venezuela FormatData/es_GT/latn.NumberPatterns/0=#,##0.### # FormatData/es_GT/NumberPatterns/1=Q#,##0.00;(Q#,##0.00) # Changed; see bug 4122840 -FormatData/es_GT/latn.NumberPatterns/2=#,##0\u00a0% +FormatData/es_GT/latn.NumberPatterns/2=#,##0 % CurrencyNames/es_GT/GTQ=Q FormatData/es_GT/TimePatterns/0=HH:mm:ss zzzz FormatData/es_GT/TimePatterns/1=HH:mm:ss z @@ -529,7 +529,7 @@ FormatData/es_GT/latn.NumberElements/1=, FormatData/es_GT/latn.NumberElements/2=; FormatData/es_HN/latn.NumberPatterns/0=#,##0.### # FormatData/es_HN/NumberPatterns/1=L#,##0.00;(L#,##0.00) # Changed; see bug 4122840 -FormatData/es_HN/latn.NumberPatterns/2=#,##0\u00a0% +FormatData/es_HN/latn.NumberPatterns/2=#,##0 % CurrencyNames/es_HN/HNL=L FormatData/es_HN/TimePatterns/0=HH:mm:ss zzzz FormatData/es_HN/TimePatterns/1=HH:mm:ss z @@ -561,7 +561,7 @@ FormatData/es_MX/latn.NumberElements/1=, FormatData/es_MX/latn.NumberElements/2=; FormatData/es_NI/latn.NumberPatterns/0=#,##0.### # FormatData/es_NI/NumberPatterns/1=$C#,##0.00;($C#,##0.00) # Changed; see bug 4122840 -FormatData/es_NI/latn.NumberPatterns/2=#,##0\u00a0% +FormatData/es_NI/latn.NumberPatterns/2=#,##0 % CurrencyNames/es_NI/NIO=C$ FormatData/es_NI/TimePatterns/0=HH:mm:ss zzzz FormatData/es_NI/TimePatterns/1=HH:mm:ss z @@ -577,12 +577,12 @@ FormatData/es_NI/latn.NumberElements/1=, FormatData/es_NI/latn.NumberElements/2=; FormatData/es_PA/latn.NumberPatterns/0=#,##0.### # FormatData/es_PA/NumberPatterns/1=B#,##0.00;(B#,##0.00) # Changed; see bug 4122840 -FormatData/es_PA/latn.NumberPatterns/2=#,##0\u00a0% +FormatData/es_PA/latn.NumberPatterns/2=#,##0 % CurrencyNames/es_PA/PAB=B/. -FormatData/es_PA/TimePatterns/0=h:mm:ss\u202fa zzzz -FormatData/es_PA/TimePatterns/1=h:mm:ss\u202fa z -FormatData/es_PA/TimePatterns/2=h:mm:ss\u202fa -FormatData/es_PA/TimePatterns/3=h:mm\u202fa +FormatData/es_PA/TimePatterns/0=h:mm:ss a zzzz +FormatData/es_PA/TimePatterns/1=h:mm:ss a z +FormatData/es_PA/TimePatterns/2=h:mm:ss a +FormatData/es_PA/TimePatterns/3=h:mm a FormatData/es_PA/DatePatterns/0=EEEE, d 'de' MMMM 'de' y FormatData/es_PA/DatePatterns/1=d 'de' MMMM 'de' y FormatData/es_PA/DatePatterns/2=MM/dd/y @@ -593,7 +593,7 @@ FormatData/es_PA/latn.NumberElements/1=, FormatData/es_PA/latn.NumberElements/2=; FormatData/es_PE/latn.NumberPatterns/0=#,##0.### # FormatData/es_PE/NumberPatterns/1=S/#,##0.00;S/-#,##0.00 # Changed; see bug 4122840 -FormatData/es_PE/latn.NumberPatterns/2=#,##0\u00a0% +FormatData/es_PE/latn.NumberPatterns/2=#,##0 % FormatData/es_PE/TimePatterns/0=HH:mm:ss zzzz FormatData/es_PE/TimePatterns/1=HH:mm:ss z FormatData/es_PE/TimePatterns/2=HH:mm:ss @@ -608,12 +608,12 @@ FormatData/es_PE/latn.NumberElements/1=, FormatData/es_PE/latn.NumberElements/2=; FormatData/es_PR/latn.NumberPatterns/0=#,##0.### # FormatData/es_PR/NumberPatterns/1=$#,##0.00;($#,##0.00) # Changed; see bug 4122840 -FormatData/es_PR/latn.NumberPatterns/2=#,##0\u00a0% +FormatData/es_PR/latn.NumberPatterns/2=#,##0 % CurrencyNames/es_PR/USD=$ -FormatData/es_PR/TimePatterns/0=h:mm:ss\u202fa zzzz -FormatData/es_PR/TimePatterns/1=h:mm:ss\u202fa z -FormatData/es_PR/TimePatterns/2=h:mm:ss\u202fa -FormatData/es_PR/TimePatterns/3=h:mm\u202fa +FormatData/es_PR/TimePatterns/0=h:mm:ss a zzzz +FormatData/es_PR/TimePatterns/1=h:mm:ss a z +FormatData/es_PR/TimePatterns/2=h:mm:ss a +FormatData/es_PR/TimePatterns/3=h:mm a FormatData/es_PR/DatePatterns/0=EEEE, d 'de' MMMM 'de' y FormatData/es_PR/DatePatterns/1=d 'de' MMMM 'de' y FormatData/es_PR/DatePatterns/2=MM/dd/y @@ -625,7 +625,7 @@ FormatData/es_PR/latn.NumberElements/2=; CurrencyNames/es_PY/PYG=Gs. FormatData/es_PY/latn.NumberPatterns/0=#,##0.### # FormatData/es_PY/NumberPatterns/1=G#,##0.00;(G#,##0.00) # Changed; see bug 4122840 -FormatData/es_PY/latn.NumberPatterns/2=#,##0\u00a0% +FormatData/es_PY/latn.NumberPatterns/2=#,##0 % FormatData/es_PY/TimePatterns/0=HH:mm:ss zzzz FormatData/es_PY/TimePatterns/1=HH:mm:ss z FormatData/es_PY/TimePatterns/2=HH:mm:ss @@ -640,7 +640,7 @@ FormatData/es_PY/latn.NumberElements/1=. FormatData/es_PY/latn.NumberElements/2=; FormatData/es_SV/latn.NumberPatterns/0=#,##0.### # FormatData/es_SV/NumberPatterns/1=C#,##0.00;(C#,##0.00) # Changed; see bug 4122840 -FormatData/es_SV/latn.NumberPatterns/2=#,##0\u00a0% +FormatData/es_SV/latn.NumberPatterns/2=#,##0 % FormatData/es_SV/TimePatterns/0=HH:mm:ss zzzz FormatData/es_SV/TimePatterns/1=HH:mm:ss z FormatData/es_SV/TimePatterns/2=HH:mm:ss @@ -656,7 +656,7 @@ FormatData/es_SV/latn.NumberElements/2=; CurrencyNames/es_UY/UYU=$ FormatData/es_UY/latn.NumberPatterns/0=#,##0.### # FormatData/es_UY/NumberPatterns/1=NU$ #,##0.00;(NU$#,##0.00) # Changed; see bug 4122840 -FormatData/es_UY/latn.NumberPatterns/2=#,##0\u00a0% +FormatData/es_UY/latn.NumberPatterns/2=#,##0 % FormatData/es_UY/TimePatterns/0=HH:mm:ss zzzz FormatData/es_UY/TimePatterns/1=HH:mm:ss z FormatData/es_UY/TimePatterns/2=HH:mm:ss @@ -672,11 +672,11 @@ FormatData/es_UY/latn.NumberElements/2=; # bug 6570259 FormatData/es_VE/latn.NumberPatterns/0=#,##0.### # FormatData/es_VE/NumberPatterns/1=Bs#,##0.00;Bs -#,##0.00 # Changed; see bug 4122840 -FormatData/es_VE/latn.NumberPatterns/2=#,##0\u00a0% -FormatData/es_VE/TimePatterns/0=h:mm:ss\u202fa zzzz -FormatData/es_VE/TimePatterns/1=h:mm:ss\u202fa z -FormatData/es_VE/TimePatterns/2=h:mm:ss\u202fa -FormatData/es_VE/TimePatterns/3=h:mm\u202fa +FormatData/es_VE/latn.NumberPatterns/2=#,##0 % +FormatData/es_VE/TimePatterns/0=h:mm:ss a zzzz +FormatData/es_VE/TimePatterns/1=h:mm:ss a z +FormatData/es_VE/TimePatterns/2=h:mm:ss a +FormatData/es_VE/TimePatterns/3=h:mm a FormatData/es_VE/DatePatterns/0=EEEE, d 'de' MMMM 'de' y FormatData/es_VE/DatePatterns/1=d 'de' MMMM 'de' y FormatData/es_VE/DatePatterns/2=d MMM y @@ -687,19 +687,19 @@ FormatData/es_VE/latn.NumberElements/1=. FormatData/es_VE/latn.NumberElements/2=; # bug #4099810, 4290801, 6868106, 6916787 -CurrencyNames/uk_UA/UAH=\u20b4 +CurrencyNames/uk_UA/UAH=₴ FormatData/uk_UA/latn.NumberPatterns/0=#,##0.### -# FormatData/uk_UA/NumberPatterns/1=#,##0.## '\u0433\u0440\u0432.';-#,##0.## '\u0433\u0440\u0432.' # Changed; see bug 4122840 +# FormatData/uk_UA/NumberPatterns/1=#,##0.## 'грв.';-#,##0.## 'грв.' # Changed; see bug 4122840 FormatData/uk_UA/latn.NumberPatterns/2=#,##0% # bug 6245766 -FormatData/uk/DatePatterns/0=EEEE, d MMMM y\u202f'\u0440'. -FormatData/uk/DatePatterns/1=d MMMM y\u202f'\u0440'. -FormatData/uk/DatePatterns/2=d MMM y\u202f'\u0440'. +FormatData/uk/DatePatterns/0=EEEE, d MMMM y 'р'. +FormatData/uk/DatePatterns/1=d MMMM y 'р'. +FormatData/uk/DatePatterns/2=d MMM y 'р'. FormatData/uk/DatePatterns/3=dd.MM.yy # bug #4103218 -# FormatData/ko_KR/NumberPatterns/1=\u20a9#,##0;-\u20a9#,##0 # Changed; see bug 4122840 +# FormatData/ko_KR/NumberPatterns/1=₩#,##0;-₩#,##0 # Changed; see bug 4122840 # bug #4103220 should be adequately tested by the above tests, which represent a pretty # good cross-section of the locale data @@ -721,1481 +721,1481 @@ FormatData/fr_CA/TimePatterns/0=HH 'h' mm 'min' ss 's' zzzz FormatData/fr_CA/TimePatterns/1=HH 'h' mm 'min' ss 's' z # bug #4113638, 4290801 -CurrencyNames/ar_AE/AED=\u062f.\u0625.\u200f +CurrencyNames/ar_AE/AED=د.إ.‏ FormatData/ar_AE/arab.NumberPatterns/0=#,##0.### -# FormatData/ar_AE/NumberPatterns/1='\u062f.\u0625.\u200f' #,##0.###;'\u062f.\u0625.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_AE/NumberPatterns/1='د.إ.‏' #,##0.###;'د.إ.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_AE/arab.NumberPatterns/2=#,##0% -FormatData/ar_AE/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_AE/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_AE/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_AE/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_AE/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_AE/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_AE/DayNames/6=\u0627\u0644\u0633\u0628\u062a -FormatData/ar_AE/MonthAbbreviations/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_AE/MonthAbbreviations/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_AE/MonthAbbreviations/2=\u0645\u0627\u0631\u0633 -FormatData/ar_AE/MonthAbbreviations/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_AE/MonthAbbreviations/4=\u0645\u0627\u064a\u0648 -FormatData/ar_AE/MonthAbbreviations/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_AE/MonthAbbreviations/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_AE/MonthAbbreviations/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_AE/MonthAbbreviations/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_AE/MonthAbbreviations/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_AE/MonthAbbreviations/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_AE/MonthAbbreviations/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_AE/DayNames/0=الأحد +FormatData/ar_AE/DayNames/1=الاثنين +FormatData/ar_AE/DayNames/2=الثلاثاء +FormatData/ar_AE/DayNames/3=الأربعاء +FormatData/ar_AE/DayNames/4=الخميس +FormatData/ar_AE/DayNames/5=الجمعة +FormatData/ar_AE/DayNames/6=السبت +FormatData/ar_AE/MonthAbbreviations/0=يناير +FormatData/ar_AE/MonthAbbreviations/1=فبراير +FormatData/ar_AE/MonthAbbreviations/2=مارس +FormatData/ar_AE/MonthAbbreviations/3=أبريل +FormatData/ar_AE/MonthAbbreviations/4=مايو +FormatData/ar_AE/MonthAbbreviations/5=يونيو +FormatData/ar_AE/MonthAbbreviations/6=يوليو +FormatData/ar_AE/MonthAbbreviations/7=أغسطس +FormatData/ar_AE/MonthAbbreviations/8=سبتمبر +FormatData/ar_AE/MonthAbbreviations/9=أكتوبر +FormatData/ar_AE/MonthAbbreviations/10=نوفمبر +FormatData/ar_AE/MonthAbbreviations/11=ديسمبر FormatData/ar_AE/MonthAbbreviations/12= -FormatData/ar_AE/Eras/0=\u0642.\u0645 -FormatData/ar_AE/Eras/1=\u0645 -FormatData/ar_AE/DayAbbreviations/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_AE/DayAbbreviations/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_AE/DayAbbreviations/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_AE/DayAbbreviations/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_AE/DayAbbreviations/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_AE/DayAbbreviations/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_AE/DayAbbreviations/6=\u0627\u0644\u0633\u0628\u062a -LocaleNames/ar_AE/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_AE/MonthNames/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_AE/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_AE/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_AE/MonthNames/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_AE/MonthNames/4=\u0645\u0627\u064a\u0648 -FormatData/ar_AE/MonthNames/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_AE/MonthNames/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_AE/MonthNames/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_AE/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_AE/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_AE/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_AE/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_AE/Eras/0=ق.م +FormatData/ar_AE/Eras/1=م +FormatData/ar_AE/DayAbbreviations/0=الأحد +FormatData/ar_AE/DayAbbreviations/1=الاثنين +FormatData/ar_AE/DayAbbreviations/2=الثلاثاء +FormatData/ar_AE/DayAbbreviations/3=الأربعاء +FormatData/ar_AE/DayAbbreviations/4=الخميس +FormatData/ar_AE/DayAbbreviations/5=الجمعة +FormatData/ar_AE/DayAbbreviations/6=السبت +LocaleNames/ar_AE/ar=العربية +FormatData/ar_AE/MonthNames/0=يناير +FormatData/ar_AE/MonthNames/1=فبراير +FormatData/ar_AE/MonthNames/2=مارس +FormatData/ar_AE/MonthNames/3=أبريل +FormatData/ar_AE/MonthNames/4=مايو +FormatData/ar_AE/MonthNames/5=يونيو +FormatData/ar_AE/MonthNames/6=يوليو +FormatData/ar_AE/MonthNames/7=أغسطس +FormatData/ar_AE/MonthNames/8=سبتمبر +FormatData/ar_AE/MonthNames/9=أكتوبر +FormatData/ar_AE/MonthNames/10=نوفمبر +FormatData/ar_AE/MonthNames/11=ديسمبر FormatData/ar_AE/MonthNames/12= -FormatData/ar_AE/AmPmMarkers/0=\u0635 -FormatData/ar_AE/AmPmMarkers/1=\u0645 +FormatData/ar_AE/AmPmMarkers/0=ص +FormatData/ar_AE/AmPmMarkers/1=م FormatData/ar_AE/TimePatterns/0=h:mm:ss a zzzz FormatData/ar_AE/TimePatterns/1=h:mm:ss a z FormatData/ar_AE/TimePatterns/2=h:mm:ss a FormatData/ar_AE/TimePatterns/3=h:mm a -FormatData/ar_AE/DatePatterns/0=EEEE\u060c d MMMM y +FormatData/ar_AE/DatePatterns/0=EEEE، d MMMM y FormatData/ar_AE/DatePatterns/1=d MMMM y -FormatData/ar_AE/DatePatterns/2=dd\u200f/MM\u200f/y -FormatData/ar_AE/DatePatterns/3=d\u200f/M\u200f/y -FormatData/ar_AE/DateTimePatterns/0={1}\u060c {0} -LocaleNames/ar_AE/EG=\u0645\u0635\u0631 -LocaleNames/ar_AE/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_AE/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_AE/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_AE/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_AE/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_AE/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_AE/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_AE/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_AE/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_AE/QA=\u0642\u0637\u0631 -LocaleNames/ar_AE/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_AE/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_AE/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_AE/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_AE/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_AE/YE=\u0627\u0644\u064a\u0645\u0646 -FormatData/ar_AE/arab.NumberElements/0=\u066b -FormatData/ar_AE/arab.NumberElements/1=\u066c -FormatData/ar_AE/arab.NumberElements/2=\u061b -FormatData/ar_AE/arab.NumberElements/3=\u066a\u061c -FormatData/ar_AE/arab.NumberElements/4=\u0660 +FormatData/ar_AE/DatePatterns/2=dd‏/MM‏/y +FormatData/ar_AE/DatePatterns/3=d‏/M‏/y +FormatData/ar_AE/DateTimePatterns/0={1}، {0} +LocaleNames/ar_AE/EG=مصر +LocaleNames/ar_AE/DZ=الجزائر +LocaleNames/ar_AE/BH=البحرين +LocaleNames/ar_AE/IQ=العراق +LocaleNames/ar_AE/JO=الأردن +LocaleNames/ar_AE/KW=الكويت +LocaleNames/ar_AE/LB=لبنان +LocaleNames/ar_AE/LY=ليبيا +LocaleNames/ar_AE/MA=المغرب +LocaleNames/ar_AE/OM=عُمان +LocaleNames/ar_AE/QA=قطر +LocaleNames/ar_AE/SA=المملكة العربية السعودية +LocaleNames/ar_AE/SD=السودان +LocaleNames/ar_AE/SY=سوريا +LocaleNames/ar_AE/TN=تونس +LocaleNames/ar_AE/AE=الإمارات العربية المتحدة +LocaleNames/ar_AE/YE=اليمن +FormatData/ar_AE/arab.NumberElements/0=٫ +FormatData/ar_AE/arab.NumberElements/1=٬ +FormatData/ar_AE/arab.NumberElements/2=؛ +FormatData/ar_AE/arab.NumberElements/3=٪؜ +FormatData/ar_AE/arab.NumberElements/4=٠ FormatData/ar_AE/arab.NumberElements/5=# -FormatData/ar_AE/arab.NumberElements/6=\u061c- -FormatData/ar_AE/arab.NumberElements/7=\u0627\u0633 -FormatData/ar_AE/arab.NumberElements/8=\u0609 -FormatData/ar_AE/arab.NumberElements/9=\u221e -FormatData/ar_AE/arab.NumberElements/10=\u0644\u064a\u0633\u00a0\u0631\u0642\u0645 -CurrencyNames/ar_BH/BHD=\u062f.\u0628.\u200f +FormatData/ar_AE/arab.NumberElements/6=؜- +FormatData/ar_AE/arab.NumberElements/7=اس +FormatData/ar_AE/arab.NumberElements/8=؉ +FormatData/ar_AE/arab.NumberElements/9=∞ +FormatData/ar_AE/arab.NumberElements/10=ليس رقم +CurrencyNames/ar_BH/BHD=د.ب.‏ FormatData/ar_BH/arab.NumberPatterns/0=#,##0.### -# FormatData/ar_BH/NumberPatterns/1='\u062f.\u0628.\u200f' #,##0.###;'\u062f.\u0628.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_BH/NumberPatterns/1='د.ب.‏' #,##0.###;'د.ب.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_BH/arab.NumberPatterns/2=#,##0% -FormatData/ar_BH/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_BH/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_BH/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_BH/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_BH/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_BH/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_BH/DayNames/6=\u0627\u0644\u0633\u0628\u062a -FormatData/ar_BH/MonthAbbreviations/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_BH/MonthAbbreviations/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_BH/MonthAbbreviations/2=\u0645\u0627\u0631\u0633 -FormatData/ar_BH/MonthAbbreviations/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_BH/MonthAbbreviations/4=\u0645\u0627\u064a\u0648 -FormatData/ar_BH/MonthAbbreviations/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_BH/MonthAbbreviations/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_BH/MonthAbbreviations/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_BH/MonthAbbreviations/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_BH/MonthAbbreviations/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_BH/MonthAbbreviations/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_BH/MonthAbbreviations/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_BH/DayNames/0=الأحد +FormatData/ar_BH/DayNames/1=الاثنين +FormatData/ar_BH/DayNames/2=الثلاثاء +FormatData/ar_BH/DayNames/3=الأربعاء +FormatData/ar_BH/DayNames/4=الخميس +FormatData/ar_BH/DayNames/5=الجمعة +FormatData/ar_BH/DayNames/6=السبت +FormatData/ar_BH/MonthAbbreviations/0=يناير +FormatData/ar_BH/MonthAbbreviations/1=فبراير +FormatData/ar_BH/MonthAbbreviations/2=مارس +FormatData/ar_BH/MonthAbbreviations/3=أبريل +FormatData/ar_BH/MonthAbbreviations/4=مايو +FormatData/ar_BH/MonthAbbreviations/5=يونيو +FormatData/ar_BH/MonthAbbreviations/6=يوليو +FormatData/ar_BH/MonthAbbreviations/7=أغسطس +FormatData/ar_BH/MonthAbbreviations/8=سبتمبر +FormatData/ar_BH/MonthAbbreviations/9=أكتوبر +FormatData/ar_BH/MonthAbbreviations/10=نوفمبر +FormatData/ar_BH/MonthAbbreviations/11=ديسمبر FormatData/ar_BH/MonthAbbreviations/12= -FormatData/ar_BH/Eras/0=\u0642.\u0645 -FormatData/ar_BH/Eras/1=\u0645 -FormatData/ar_BH/DayAbbreviations/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_BH/DayAbbreviations/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_BH/DayAbbreviations/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_BH/DayAbbreviations/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_BH/DayAbbreviations/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_BH/DayAbbreviations/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_BH/DayAbbreviations/6=\u0627\u0644\u0633\u0628\u062a -LocaleNames/ar_BH/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_BH/MonthNames/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_BH/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_BH/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_BH/MonthNames/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_BH/MonthNames/4=\u0645\u0627\u064a\u0648 -FormatData/ar_BH/MonthNames/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_BH/MonthNames/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_BH/MonthNames/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_BH/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_BH/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_BH/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_BH/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_BH/Eras/0=ق.م +FormatData/ar_BH/Eras/1=م +FormatData/ar_BH/DayAbbreviations/0=الأحد +FormatData/ar_BH/DayAbbreviations/1=الاثنين +FormatData/ar_BH/DayAbbreviations/2=الثلاثاء +FormatData/ar_BH/DayAbbreviations/3=الأربعاء +FormatData/ar_BH/DayAbbreviations/4=الخميس +FormatData/ar_BH/DayAbbreviations/5=الجمعة +FormatData/ar_BH/DayAbbreviations/6=السبت +LocaleNames/ar_BH/ar=العربية +FormatData/ar_BH/MonthNames/0=يناير +FormatData/ar_BH/MonthNames/1=فبراير +FormatData/ar_BH/MonthNames/2=مارس +FormatData/ar_BH/MonthNames/3=أبريل +FormatData/ar_BH/MonthNames/4=مايو +FormatData/ar_BH/MonthNames/5=يونيو +FormatData/ar_BH/MonthNames/6=يوليو +FormatData/ar_BH/MonthNames/7=أغسطس +FormatData/ar_BH/MonthNames/8=سبتمبر +FormatData/ar_BH/MonthNames/9=أكتوبر +FormatData/ar_BH/MonthNames/10=نوفمبر +FormatData/ar_BH/MonthNames/11=ديسمبر FormatData/ar_BH/MonthNames/12= -FormatData/ar_BH/AmPmMarkers/0=\u0635 -FormatData/ar_BH/AmPmMarkers/1=\u0645 +FormatData/ar_BH/AmPmMarkers/0=ص +FormatData/ar_BH/AmPmMarkers/1=م FormatData/ar_BH/TimePatterns/0=h:mm:ss a zzzz FormatData/ar_BH/TimePatterns/1=h:mm:ss a z FormatData/ar_BH/TimePatterns/2=h:mm:ss a FormatData/ar_BH/TimePatterns/3=h:mm a -FormatData/ar_BH/DatePatterns/0=EEEE\u060c d MMMM y +FormatData/ar_BH/DatePatterns/0=EEEE، d MMMM y FormatData/ar_BH/DatePatterns/1=d MMMM y -FormatData/ar_BH/DatePatterns/2=dd\u200f/MM\u200f/y -FormatData/ar_BH/DatePatterns/3=d\u200f/M\u200f/y -FormatData/ar_BH/DateTimePatterns/0={1}\u060c {0} -LocaleNames/ar_BH/EG=\u0645\u0635\u0631 -LocaleNames/ar_BH/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_BH/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_BH/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_BH/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_BH/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_BH/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_BH/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_BH/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_BH/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_BH/QA=\u0642\u0637\u0631 -LocaleNames/ar_BH/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_BH/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_BH/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_BH/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_BH/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_BH/YE=\u0627\u0644\u064a\u0645\u0646 -FormatData/ar_BH/arab.NumberElements/0=\u066b -FormatData/ar_BH/arab.NumberElements/1=\u066c -FormatData/ar_BH/arab.NumberElements/2=\u061b -FormatData/ar_BH/arab.NumberElements/3=\u066a\u061c -FormatData/ar_BH/arab.NumberElements/4=\u0660 +FormatData/ar_BH/DatePatterns/2=dd‏/MM‏/y +FormatData/ar_BH/DatePatterns/3=d‏/M‏/y +FormatData/ar_BH/DateTimePatterns/0={1}، {0} +LocaleNames/ar_BH/EG=مصر +LocaleNames/ar_BH/DZ=الجزائر +LocaleNames/ar_BH/BH=البحرين +LocaleNames/ar_BH/IQ=العراق +LocaleNames/ar_BH/JO=الأردن +LocaleNames/ar_BH/KW=الكويت +LocaleNames/ar_BH/LB=لبنان +LocaleNames/ar_BH/LY=ليبيا +LocaleNames/ar_BH/MA=المغرب +LocaleNames/ar_BH/OM=عُمان +LocaleNames/ar_BH/QA=قطر +LocaleNames/ar_BH/SA=المملكة العربية السعودية +LocaleNames/ar_BH/SD=السودان +LocaleNames/ar_BH/SY=سوريا +LocaleNames/ar_BH/TN=تونس +LocaleNames/ar_BH/AE=الإمارات العربية المتحدة +LocaleNames/ar_BH/YE=اليمن +FormatData/ar_BH/arab.NumberElements/0=٫ +FormatData/ar_BH/arab.NumberElements/1=٬ +FormatData/ar_BH/arab.NumberElements/2=؛ +FormatData/ar_BH/arab.NumberElements/3=٪؜ +FormatData/ar_BH/arab.NumberElements/4=٠ FormatData/ar_BH/arab.NumberElements/5=# -FormatData/ar_BH/arab.NumberElements/6=\u061c- -FormatData/ar_BH/arab.NumberElements/7=\u0627\u0633 -FormatData/ar_BH/arab.NumberElements/8=\u0609 -FormatData/ar_BH/arab.NumberElements/9=\u221e -FormatData/ar_BH/arab.NumberElements/10=\u0644\u064a\u0633\u00a0\u0631\u0642\u0645 -CurrencyNames/ar_DZ/DZD=\u062f.\u062c.\u200f +FormatData/ar_BH/arab.NumberElements/6=؜- +FormatData/ar_BH/arab.NumberElements/7=اس +FormatData/ar_BH/arab.NumberElements/8=؉ +FormatData/ar_BH/arab.NumberElements/9=∞ +FormatData/ar_BH/arab.NumberElements/10=ليس رقم +CurrencyNames/ar_DZ/DZD=د.ج.‏ FormatData/ar_DZ/arab.NumberPatterns/0=#,##0.### -# FormatData/ar_DZ/NumberPatterns/1='\u062f.\u062c.\u200f' #,##0.###;'\u062f.\u062c.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_DZ/NumberPatterns/1='د.ج.‏' #,##0.###;'د.ج.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_DZ/arab.NumberPatterns/2=#,##0% -FormatData/ar_DZ/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_DZ/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_DZ/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_DZ/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_DZ/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_DZ/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_DZ/DayNames/6=\u0627\u0644\u0633\u0628\u062a -FormatData/ar_DZ/MonthAbbreviations/0=\u062c\u0627\u0646\u0641\u064a -FormatData/ar_DZ/MonthAbbreviations/1=\u0641\u064a\u0641\u0631\u064a -FormatData/ar_DZ/MonthAbbreviations/2=\u0645\u0627\u0631\u0633 -FormatData/ar_DZ/MonthAbbreviations/3=\u0623\u0641\u0631\u064a\u0644 -FormatData/ar_DZ/MonthAbbreviations/4=\u0645\u0627\u064a -FormatData/ar_DZ/MonthAbbreviations/5=\u062c\u0648\u0627\u0646 -FormatData/ar_DZ/MonthAbbreviations/6=\u062c\u0648\u064a\u0644\u064a\u0629 -FormatData/ar_DZ/MonthAbbreviations/7=\u0623\u0648\u062a -FormatData/ar_DZ/MonthAbbreviations/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_DZ/MonthAbbreviations/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_DZ/MonthAbbreviations/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_DZ/MonthAbbreviations/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_DZ/DayNames/0=الأحد +FormatData/ar_DZ/DayNames/1=الاثنين +FormatData/ar_DZ/DayNames/2=الثلاثاء +FormatData/ar_DZ/DayNames/3=الأربعاء +FormatData/ar_DZ/DayNames/4=الخميس +FormatData/ar_DZ/DayNames/5=الجمعة +FormatData/ar_DZ/DayNames/6=السبت +FormatData/ar_DZ/MonthAbbreviations/0=جانفي +FormatData/ar_DZ/MonthAbbreviations/1=فيفري +FormatData/ar_DZ/MonthAbbreviations/2=مارس +FormatData/ar_DZ/MonthAbbreviations/3=أفريل +FormatData/ar_DZ/MonthAbbreviations/4=ماي +FormatData/ar_DZ/MonthAbbreviations/5=جوان +FormatData/ar_DZ/MonthAbbreviations/6=جويلية +FormatData/ar_DZ/MonthAbbreviations/7=أوت +FormatData/ar_DZ/MonthAbbreviations/8=سبتمبر +FormatData/ar_DZ/MonthAbbreviations/9=أكتوبر +FormatData/ar_DZ/MonthAbbreviations/10=نوفمبر +FormatData/ar_DZ/MonthAbbreviations/11=ديسمبر FormatData/ar_DZ/MonthAbbreviations/12= -FormatData/ar_DZ/Eras/0=\u0642.\u0645 -FormatData/ar_DZ/Eras/1=\u0645 -FormatData/ar_DZ/DayAbbreviations/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_DZ/DayAbbreviations/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_DZ/DayAbbreviations/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_DZ/DayAbbreviations/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_DZ/DayAbbreviations/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_DZ/DayAbbreviations/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_DZ/DayAbbreviations/6=\u0627\u0644\u0633\u0628\u062a -LocaleNames/ar_DZ/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_DZ/MonthNames/0=\u062c\u0627\u0646\u0641\u064a -FormatData/ar_DZ/MonthNames/1=\u0641\u064a\u0641\u0631\u064a -FormatData/ar_DZ/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_DZ/MonthNames/3=\u0623\u0641\u0631\u064a\u0644 -FormatData/ar_DZ/MonthNames/4=\u0645\u0627\u064a -FormatData/ar_DZ/MonthNames/5=\u062c\u0648\u0627\u0646 -FormatData/ar_DZ/MonthNames/6=\u062c\u0648\u064a\u0644\u064a\u0629 -FormatData/ar_DZ/MonthNames/7=\u0623\u0648\u062a -FormatData/ar_DZ/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_DZ/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_DZ/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_DZ/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_DZ/Eras/0=ق.م +FormatData/ar_DZ/Eras/1=م +FormatData/ar_DZ/DayAbbreviations/0=الأحد +FormatData/ar_DZ/DayAbbreviations/1=الاثنين +FormatData/ar_DZ/DayAbbreviations/2=الثلاثاء +FormatData/ar_DZ/DayAbbreviations/3=الأربعاء +FormatData/ar_DZ/DayAbbreviations/4=الخميس +FormatData/ar_DZ/DayAbbreviations/5=الجمعة +FormatData/ar_DZ/DayAbbreviations/6=السبت +LocaleNames/ar_DZ/ar=العربية +FormatData/ar_DZ/MonthNames/0=جانفي +FormatData/ar_DZ/MonthNames/1=فيفري +FormatData/ar_DZ/MonthNames/2=مارس +FormatData/ar_DZ/MonthNames/3=أفريل +FormatData/ar_DZ/MonthNames/4=ماي +FormatData/ar_DZ/MonthNames/5=جوان +FormatData/ar_DZ/MonthNames/6=جويلية +FormatData/ar_DZ/MonthNames/7=أوت +FormatData/ar_DZ/MonthNames/8=سبتمبر +FormatData/ar_DZ/MonthNames/9=أكتوبر +FormatData/ar_DZ/MonthNames/10=نوفمبر +FormatData/ar_DZ/MonthNames/11=ديسمبر FormatData/ar_DZ/MonthNames/12= -FormatData/ar_DZ/AmPmMarkers/0=\u0635 -FormatData/ar_DZ/AmPmMarkers/1=\u0645 +FormatData/ar_DZ/AmPmMarkers/0=ص +FormatData/ar_DZ/AmPmMarkers/1=م FormatData/ar_DZ/TimePatterns/0=h:mm:ss a zzzz FormatData/ar_DZ/TimePatterns/1=h:mm:ss a z FormatData/ar_DZ/TimePatterns/2=h:mm:ss a FormatData/ar_DZ/TimePatterns/3=h:mm a -FormatData/ar_DZ/DatePatterns/0=EEEE\u060c d MMMM y +FormatData/ar_DZ/DatePatterns/0=EEEE، d MMMM y FormatData/ar_DZ/DatePatterns/1=d MMMM y -FormatData/ar_DZ/DatePatterns/2=dd\u200f/MM\u200f/y -FormatData/ar_DZ/DatePatterns/3=d\u200f/M\u200f/y -FormatData/ar_DZ/DateTimePatterns/0={1}\u060c {0} -LocaleNames/ar_DZ/EG=\u0645\u0635\u0631 -LocaleNames/ar_DZ/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_DZ/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_DZ/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_DZ/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_DZ/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_DZ/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_DZ/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_DZ/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_DZ/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_DZ/QA=\u0642\u0637\u0631 -LocaleNames/ar_DZ/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_DZ/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_DZ/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_DZ/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_DZ/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_DZ/YE=\u0627\u0644\u064a\u0645\u0646 -FormatData/ar_DZ/arab.NumberElements/0=\u066b -FormatData/ar_DZ/arab.NumberElements/1=\u066c -FormatData/ar_DZ/arab.NumberElements/2=\u061b -FormatData/ar_DZ/arab.NumberElements/3=\u066a\u061c -FormatData/ar_DZ/arab.NumberElements/4=\u0660 +FormatData/ar_DZ/DatePatterns/2=dd‏/MM‏/y +FormatData/ar_DZ/DatePatterns/3=d‏/M‏/y +FormatData/ar_DZ/DateTimePatterns/0={1}، {0} +LocaleNames/ar_DZ/EG=مصر +LocaleNames/ar_DZ/DZ=الجزائر +LocaleNames/ar_DZ/BH=البحرين +LocaleNames/ar_DZ/IQ=العراق +LocaleNames/ar_DZ/JO=الأردن +LocaleNames/ar_DZ/KW=الكويت +LocaleNames/ar_DZ/LB=لبنان +LocaleNames/ar_DZ/LY=ليبيا +LocaleNames/ar_DZ/MA=المغرب +LocaleNames/ar_DZ/OM=عُمان +LocaleNames/ar_DZ/QA=قطر +LocaleNames/ar_DZ/SA=المملكة العربية السعودية +LocaleNames/ar_DZ/SD=السودان +LocaleNames/ar_DZ/SY=سوريا +LocaleNames/ar_DZ/TN=تونس +LocaleNames/ar_DZ/AE=الإمارات العربية المتحدة +LocaleNames/ar_DZ/YE=اليمن +FormatData/ar_DZ/arab.NumberElements/0=٫ +FormatData/ar_DZ/arab.NumberElements/1=٬ +FormatData/ar_DZ/arab.NumberElements/2=؛ +FormatData/ar_DZ/arab.NumberElements/3=٪؜ +FormatData/ar_DZ/arab.NumberElements/4=٠ FormatData/ar_DZ/arab.NumberElements/5=# -FormatData/ar_DZ/arab.NumberElements/6=\u061c- -FormatData/ar_DZ/arab.NumberElements/7=\u0627\u0633 -FormatData/ar_DZ/arab.NumberElements/8=\u0609 -FormatData/ar_DZ/arab.NumberElements/9=\u221e -FormatData/ar_DZ/arab.NumberElements/10=\u0644\u064a\u0633\u00a0\u0631\u0642\u0645 -CurrencyNames/ar_EG/EGP=\u062c.\u0645.\u200f +FormatData/ar_DZ/arab.NumberElements/6=؜- +FormatData/ar_DZ/arab.NumberElements/7=اس +FormatData/ar_DZ/arab.NumberElements/8=؉ +FormatData/ar_DZ/arab.NumberElements/9=∞ +FormatData/ar_DZ/arab.NumberElements/10=ليس رقم +CurrencyNames/ar_EG/EGP=ج.م.‏ FormatData/ar_EG/arab.NumberPatterns/0=#,##0.### -# FormatData/ar_EG/NumberPatterns/1='\u062c.\u0645.\u200f' #,##0.###;'\u062c.\u0645.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_EG/NumberPatterns/1='ج.م.‏' #,##0.###;'ج.م.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_EG/arab.NumberPatterns/2=#,##0% -FormatData/ar_EG/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_EG/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_EG/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_EG/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_EG/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_EG/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_EG/DayNames/6=\u0627\u0644\u0633\u0628\u062a -FormatData/ar_EG/MonthAbbreviations/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_EG/MonthAbbreviations/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_EG/MonthAbbreviations/2=\u0645\u0627\u0631\u0633 -FormatData/ar_EG/MonthAbbreviations/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_EG/MonthAbbreviations/4=\u0645\u0627\u064a\u0648 -FormatData/ar_EG/MonthAbbreviations/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_EG/MonthAbbreviations/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_EG/MonthAbbreviations/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_EG/MonthAbbreviations/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_EG/MonthAbbreviations/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_EG/MonthAbbreviations/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_EG/MonthAbbreviations/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_EG/DayNames/0=الأحد +FormatData/ar_EG/DayNames/1=الاثنين +FormatData/ar_EG/DayNames/2=الثلاثاء +FormatData/ar_EG/DayNames/3=الأربعاء +FormatData/ar_EG/DayNames/4=الخميس +FormatData/ar_EG/DayNames/5=الجمعة +FormatData/ar_EG/DayNames/6=السبت +FormatData/ar_EG/MonthAbbreviations/0=يناير +FormatData/ar_EG/MonthAbbreviations/1=فبراير +FormatData/ar_EG/MonthAbbreviations/2=مارس +FormatData/ar_EG/MonthAbbreviations/3=أبريل +FormatData/ar_EG/MonthAbbreviations/4=مايو +FormatData/ar_EG/MonthAbbreviations/5=يونيو +FormatData/ar_EG/MonthAbbreviations/6=يوليو +FormatData/ar_EG/MonthAbbreviations/7=أغسطس +FormatData/ar_EG/MonthAbbreviations/8=سبتمبر +FormatData/ar_EG/MonthAbbreviations/9=أكتوبر +FormatData/ar_EG/MonthAbbreviations/10=نوفمبر +FormatData/ar_EG/MonthAbbreviations/11=ديسمبر FormatData/ar_EG/MonthAbbreviations/12= -FormatData/ar_EG/Eras/0=\u0642.\u0645 -FormatData/ar_EG/Eras/1=\u0645 -FormatData/ar_EG/DayAbbreviations/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_EG/DayAbbreviations/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_EG/DayAbbreviations/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_EG/DayAbbreviations/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_EG/DayAbbreviations/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_EG/DayAbbreviations/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_EG/DayAbbreviations/6=\u0627\u0644\u0633\u0628\u062a -LocaleNames/ar_EG/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_EG/MonthNames/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_EG/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_EG/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_EG/MonthNames/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_EG/MonthNames/4=\u0645\u0627\u064a\u0648 -FormatData/ar_EG/MonthNames/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_EG/MonthNames/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_EG/MonthNames/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_EG/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_EG/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_EG/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_EG/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_EG/Eras/0=ق.م +FormatData/ar_EG/Eras/1=م +FormatData/ar_EG/DayAbbreviations/0=الأحد +FormatData/ar_EG/DayAbbreviations/1=الاثنين +FormatData/ar_EG/DayAbbreviations/2=الثلاثاء +FormatData/ar_EG/DayAbbreviations/3=الأربعاء +FormatData/ar_EG/DayAbbreviations/4=الخميس +FormatData/ar_EG/DayAbbreviations/5=الجمعة +FormatData/ar_EG/DayAbbreviations/6=السبت +LocaleNames/ar_EG/ar=العربية +FormatData/ar_EG/MonthNames/0=يناير +FormatData/ar_EG/MonthNames/1=فبراير +FormatData/ar_EG/MonthNames/2=مارس +FormatData/ar_EG/MonthNames/3=أبريل +FormatData/ar_EG/MonthNames/4=مايو +FormatData/ar_EG/MonthNames/5=يونيو +FormatData/ar_EG/MonthNames/6=يوليو +FormatData/ar_EG/MonthNames/7=أغسطس +FormatData/ar_EG/MonthNames/8=سبتمبر +FormatData/ar_EG/MonthNames/9=أكتوبر +FormatData/ar_EG/MonthNames/10=نوفمبر +FormatData/ar_EG/MonthNames/11=ديسمبر FormatData/ar_EG/MonthNames/12= -FormatData/ar_EG/AmPmMarkers/0=\u0635 -FormatData/ar_EG/AmPmMarkers/1=\u0645 +FormatData/ar_EG/AmPmMarkers/0=ص +FormatData/ar_EG/AmPmMarkers/1=م FormatData/ar_EG/TimePatterns/0=h:mm:ss a zzzz FormatData/ar_EG/TimePatterns/1=h:mm:ss a z FormatData/ar_EG/TimePatterns/2=h:mm:ss a FormatData/ar_EG/TimePatterns/3=h:mm a -FormatData/ar_EG/DatePatterns/0=EEEE\u060c d MMMM y +FormatData/ar_EG/DatePatterns/0=EEEE، d MMMM y FormatData/ar_EG/DatePatterns/1=d MMMM y -FormatData/ar_EG/DatePatterns/2=dd\u200f/MM\u200f/y -FormatData/ar_EG/DatePatterns/3=d\u200f/M\u200f/y -FormatData/ar_EG/DateTimePatterns/0={1}\u060c {0} -LocaleNames/ar_EG/EG=\u0645\u0635\u0631 -LocaleNames/ar_EG/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_EG/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_EG/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_EG/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_EG/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_EG/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_EG/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_EG/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_EG/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_EG/QA=\u0642\u0637\u0631 -LocaleNames/ar_EG/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_EG/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_EG/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_EG/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_EG/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_EG/YE=\u0627\u0644\u064a\u0645\u0646 -FormatData/ar_EG/arab.NumberElements/0=\u066b -FormatData/ar_EG/arab.NumberElements/1=\u066c -FormatData/ar_EG/arab.NumberElements/2=\u061b -FormatData/ar_EG/arab.NumberElements/3=\u066a\u061c -FormatData/ar_EG/arab.NumberElements/4=\u0660 +FormatData/ar_EG/DatePatterns/2=dd‏/MM‏/y +FormatData/ar_EG/DatePatterns/3=d‏/M‏/y +FormatData/ar_EG/DateTimePatterns/0={1}، {0} +LocaleNames/ar_EG/EG=مصر +LocaleNames/ar_EG/DZ=الجزائر +LocaleNames/ar_EG/BH=البحرين +LocaleNames/ar_EG/IQ=العراق +LocaleNames/ar_EG/JO=الأردن +LocaleNames/ar_EG/KW=الكويت +LocaleNames/ar_EG/LB=لبنان +LocaleNames/ar_EG/LY=ليبيا +LocaleNames/ar_EG/MA=المغرب +LocaleNames/ar_EG/OM=عُمان +LocaleNames/ar_EG/QA=قطر +LocaleNames/ar_EG/SA=المملكة العربية السعودية +LocaleNames/ar_EG/SD=السودان +LocaleNames/ar_EG/SY=سوريا +LocaleNames/ar_EG/TN=تونس +LocaleNames/ar_EG/AE=الإمارات العربية المتحدة +LocaleNames/ar_EG/YE=اليمن +FormatData/ar_EG/arab.NumberElements/0=٫ +FormatData/ar_EG/arab.NumberElements/1=٬ +FormatData/ar_EG/arab.NumberElements/2=؛ +FormatData/ar_EG/arab.NumberElements/3=٪؜ +FormatData/ar_EG/arab.NumberElements/4=٠ FormatData/ar_EG/arab.NumberElements/5=# -FormatData/ar_EG/arab.NumberElements/6=\u061c- -FormatData/ar_EG/arab.NumberElements/7=\u0627\u0633 -FormatData/ar_EG/arab.NumberElements/8=\u0609 -FormatData/ar_EG/arab.NumberElements/9=\u221e -FormatData/ar_EG/arab.NumberElements/10=\u0644\u064a\u0633\u00a0\u0631\u0642\u0645 -CurrencyNames/ar_IQ/IQD=\u062f.\u0639.\u200f +FormatData/ar_EG/arab.NumberElements/6=؜- +FormatData/ar_EG/arab.NumberElements/7=اس +FormatData/ar_EG/arab.NumberElements/8=؉ +FormatData/ar_EG/arab.NumberElements/9=∞ +FormatData/ar_EG/arab.NumberElements/10=ليس رقم +CurrencyNames/ar_IQ/IQD=د.ع.‏ FormatData/ar_IQ/arab.NumberPatterns/0=#,##0.### -# FormatData/ar_IQ/NumberPatterns/1='\u062f.\u0639.\u200f' #,##0.###;'\u062f.\u0639.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_IQ/NumberPatterns/1='د.ع.‏' #,##0.###;'د.ع.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_IQ/arab.NumberPatterns/2=#,##0% -FormatData/ar_IQ/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_IQ/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_IQ/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_IQ/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_IQ/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_IQ/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_IQ/DayNames/6=\u0627\u0644\u0633\u0628\u062a -FormatData/ar_IQ/MonthAbbreviations/0=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_IQ/MonthAbbreviations/1=\u0634\u0628\u0627\u0637 -FormatData/ar_IQ/MonthAbbreviations/2=\u0622\u0630\u0627\u0631 -FormatData/ar_IQ/MonthAbbreviations/3=\u0646\u064a\u0633\u0627\u0646 -FormatData/ar_IQ/MonthAbbreviations/4=\u0623\u064a\u0627\u0631 -FormatData/ar_IQ/MonthAbbreviations/5=\u062d\u0632\u064a\u0631\u0627\u0646 -FormatData/ar_IQ/MonthAbbreviations/6=\u062a\u0645\u0648\u0632 -FormatData/ar_IQ/MonthAbbreviations/7=\u0622\u0628 -FormatData/ar_IQ/MonthAbbreviations/8=\u0623\u064a\u0644\u0648\u0644 -FormatData/ar_IQ/MonthAbbreviations/9=\u062a\u0634\u0631\u064a\u0646\u00a0\u0627\u0644\u0623\u0648\u0644 -FormatData/ar_IQ/MonthAbbreviations/10=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_IQ/MonthAbbreviations/11=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644 +FormatData/ar_IQ/DayNames/0=الأحد +FormatData/ar_IQ/DayNames/1=الاثنين +FormatData/ar_IQ/DayNames/2=الثلاثاء +FormatData/ar_IQ/DayNames/3=الأربعاء +FormatData/ar_IQ/DayNames/4=الخميس +FormatData/ar_IQ/DayNames/5=الجمعة +FormatData/ar_IQ/DayNames/6=السبت +FormatData/ar_IQ/MonthAbbreviations/0=كانون الثاني +FormatData/ar_IQ/MonthAbbreviations/1=شباط +FormatData/ar_IQ/MonthAbbreviations/2=آذار +FormatData/ar_IQ/MonthAbbreviations/3=نيسان +FormatData/ar_IQ/MonthAbbreviations/4=أيار +FormatData/ar_IQ/MonthAbbreviations/5=حزيران +FormatData/ar_IQ/MonthAbbreviations/6=تموز +FormatData/ar_IQ/MonthAbbreviations/7=آب +FormatData/ar_IQ/MonthAbbreviations/8=أيلول +FormatData/ar_IQ/MonthAbbreviations/9=تشرين الأول +FormatData/ar_IQ/MonthAbbreviations/10=تشرين الثاني +FormatData/ar_IQ/MonthAbbreviations/11=كانون الأول FormatData/ar_IQ/MonthAbbreviations/12= -FormatData/ar_IQ/Eras/0=\u0642.\u0645 -FormatData/ar_IQ/Eras/1=\u0645 -FormatData/ar_IQ/DayAbbreviations/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_IQ/DayAbbreviations/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_IQ/DayAbbreviations/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_IQ/DayAbbreviations/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_IQ/DayAbbreviations/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_IQ/DayAbbreviations/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_IQ/DayAbbreviations/6=\u0627\u0644\u0633\u0628\u062a -LocaleNames/ar_IQ/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_IQ/MonthNames/0=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_IQ/MonthNames/1=\u0634\u0628\u0627\u0637 -FormatData/ar_IQ/MonthNames/2=\u0622\u0630\u0627\u0631 -FormatData/ar_IQ/MonthNames/3=\u0646\u064a\u0633\u0627\u0646 -FormatData/ar_IQ/MonthNames/4=\u0623\u064a\u0627\u0631 -FormatData/ar_IQ/MonthNames/5=\u062d\u0632\u064a\u0631\u0627\u0646 -FormatData/ar_IQ/MonthNames/6=\u062a\u0645\u0648\u0632 -FormatData/ar_IQ/MonthNames/7=\u0622\u0628 -FormatData/ar_IQ/MonthNames/8=\u0623\u064a\u0644\u0648\u0644 -FormatData/ar_IQ/MonthNames/9=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644 -FormatData/ar_IQ/MonthNames/10=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_IQ/MonthNames/11=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644 +FormatData/ar_IQ/Eras/0=ق.م +FormatData/ar_IQ/Eras/1=م +FormatData/ar_IQ/DayAbbreviations/0=الأحد +FormatData/ar_IQ/DayAbbreviations/1=الاثنين +FormatData/ar_IQ/DayAbbreviations/2=الثلاثاء +FormatData/ar_IQ/DayAbbreviations/3=الأربعاء +FormatData/ar_IQ/DayAbbreviations/4=الخميس +FormatData/ar_IQ/DayAbbreviations/5=الجمعة +FormatData/ar_IQ/DayAbbreviations/6=السبت +LocaleNames/ar_IQ/ar=العربية +FormatData/ar_IQ/MonthNames/0=كانون الثاني +FormatData/ar_IQ/MonthNames/1=شباط +FormatData/ar_IQ/MonthNames/2=آذار +FormatData/ar_IQ/MonthNames/3=نيسان +FormatData/ar_IQ/MonthNames/4=أيار +FormatData/ar_IQ/MonthNames/5=حزيران +FormatData/ar_IQ/MonthNames/6=تموز +FormatData/ar_IQ/MonthNames/7=آب +FormatData/ar_IQ/MonthNames/8=أيلول +FormatData/ar_IQ/MonthNames/9=تشرين الأول +FormatData/ar_IQ/MonthNames/10=تشرين الثاني +FormatData/ar_IQ/MonthNames/11=كانون الأول FormatData/ar_IQ/MonthNames/12= -FormatData/ar_IQ/AmPmMarkers/0=\u0635 -FormatData/ar_IQ/AmPmMarkers/1=\u0645 +FormatData/ar_IQ/AmPmMarkers/0=ص +FormatData/ar_IQ/AmPmMarkers/1=م FormatData/ar_IQ/TimePatterns/0=h:mm:ss a zzzz FormatData/ar_IQ/TimePatterns/1=h:mm:ss a z FormatData/ar_IQ/TimePatterns/2=h:mm:ss a FormatData/ar_IQ/TimePatterns/3=h:mm a -FormatData/ar_IQ/DatePatterns/0=EEEE\u060c d MMMM y +FormatData/ar_IQ/DatePatterns/0=EEEE، d MMMM y FormatData/ar_IQ/DatePatterns/1=d MMMM y -FormatData/ar_IQ/DatePatterns/2=dd\u200f/MM\u200f/y -FormatData/ar_IQ/DatePatterns/3=d\u200f/M\u200f/y -FormatData/ar_IQ/DateTimePatterns/0={1}\u060c {0} -LocaleNames/ar_IQ/EG=\u0645\u0635\u0631 -LocaleNames/ar_IQ/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_IQ/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_IQ/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_IQ/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_IQ/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_IQ/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_IQ/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_IQ/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_IQ/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_IQ/QA=\u0642\u0637\u0631 -LocaleNames/ar_IQ/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_IQ/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_IQ/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_IQ/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_IQ/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_IQ/YE=\u0627\u0644\u064a\u0645\u0646 -FormatData/ar_IQ/arab.NumberElements/0=\u066b -FormatData/ar_IQ/arab.NumberElements/1=\u066c -FormatData/ar_IQ/arab.NumberElements/2=\u061b -FormatData/ar_IQ/arab.NumberElements/3=\u066a\u061c -FormatData/ar_IQ/arab.NumberElements/4=\u0660 +FormatData/ar_IQ/DatePatterns/2=dd‏/MM‏/y +FormatData/ar_IQ/DatePatterns/3=d‏/M‏/y +FormatData/ar_IQ/DateTimePatterns/0={1}، {0} +LocaleNames/ar_IQ/EG=مصر +LocaleNames/ar_IQ/DZ=الجزائر +LocaleNames/ar_IQ/BH=البحرين +LocaleNames/ar_IQ/IQ=العراق +LocaleNames/ar_IQ/JO=الأردن +LocaleNames/ar_IQ/KW=الكويت +LocaleNames/ar_IQ/LB=لبنان +LocaleNames/ar_IQ/LY=ليبيا +LocaleNames/ar_IQ/MA=المغرب +LocaleNames/ar_IQ/OM=عُمان +LocaleNames/ar_IQ/QA=قطر +LocaleNames/ar_IQ/SA=المملكة العربية السعودية +LocaleNames/ar_IQ/SD=السودان +LocaleNames/ar_IQ/SY=سوريا +LocaleNames/ar_IQ/TN=تونس +LocaleNames/ar_IQ/AE=الإمارات العربية المتحدة +LocaleNames/ar_IQ/YE=اليمن +FormatData/ar_IQ/arab.NumberElements/0=٫ +FormatData/ar_IQ/arab.NumberElements/1=٬ +FormatData/ar_IQ/arab.NumberElements/2=؛ +FormatData/ar_IQ/arab.NumberElements/3=٪؜ +FormatData/ar_IQ/arab.NumberElements/4=٠ FormatData/ar_IQ/arab.NumberElements/5=# -FormatData/ar_IQ/arab.NumberElements/6=\u061c- -FormatData/ar_IQ/arab.NumberElements/7=\u0627\u0633 -FormatData/ar_IQ/arab.NumberElements/8=\u0609 -FormatData/ar_IQ/arab.NumberElements/9=\u221e -FormatData/ar_IQ/arab.NumberElements/10=\u0644\u064a\u0633\u00a0\u0631\u0642\u0645 +FormatData/ar_IQ/arab.NumberElements/6=؜- +FormatData/ar_IQ/arab.NumberElements/7=اس +FormatData/ar_IQ/arab.NumberElements/8=؉ +FormatData/ar_IQ/arab.NumberElements/9=∞ +FormatData/ar_IQ/arab.NumberElements/10=ليس رقم FormatData/ar_JO/arab.NumberPatterns/0=#,##0.### -# FormatData/ar_JO/NumberPatterns/1='\u062f.\u0623.\u200f' #,##0.###;'\u062f.\u0623.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_JO/NumberPatterns/1='د.أ.‏' #,##0.###;'د.أ.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_JO/arab.NumberPatterns/2=#,##0% -CurrencyNames/ar_JO/JOD=\u062f.\u0623.\u200f -FormatData/ar_JO/DayAbbreviations/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_JO/DayAbbreviations/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_JO/DayAbbreviations/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_JO/DayAbbreviations/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_JO/DayAbbreviations/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_JO/DayAbbreviations/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_JO/DayAbbreviations/6=\u0627\u0644\u0633\u0628\u062a -FormatData/ar_JO/MonthNames/0=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_JO/MonthNames/1=\u0634\u0628\u0627\u0637 -FormatData/ar_JO/MonthNames/2=\u0622\u0630\u0627\u0631 -FormatData/ar_JO/MonthNames/3=\u0646\u064a\u0633\u0627\u0646 -FormatData/ar_JO/MonthNames/4=\u0623\u064a\u0627\u0631 -FormatData/ar_JO/MonthNames/5=\u062d\u0632\u064a\u0631\u0627\u0646 -FormatData/ar_JO/MonthNames/6=\u062a\u0645\u0648\u0632 -FormatData/ar_JO/MonthNames/7=\u0622\u0628 -FormatData/ar_JO/MonthNames/8=\u0623\u064a\u0644\u0648\u0644 -FormatData/ar_JO/MonthNames/9=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644 -FormatData/ar_JO/MonthNames/10=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_JO/MonthNames/11=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644 +CurrencyNames/ar_JO/JOD=د.أ.‏ +FormatData/ar_JO/DayAbbreviations/0=الأحد +FormatData/ar_JO/DayAbbreviations/1=الاثنين +FormatData/ar_JO/DayAbbreviations/2=الثلاثاء +FormatData/ar_JO/DayAbbreviations/3=الأربعاء +FormatData/ar_JO/DayAbbreviations/4=الخميس +FormatData/ar_JO/DayAbbreviations/5=الجمعة +FormatData/ar_JO/DayAbbreviations/6=السبت +FormatData/ar_JO/MonthNames/0=كانون الثاني +FormatData/ar_JO/MonthNames/1=شباط +FormatData/ar_JO/MonthNames/2=آذار +FormatData/ar_JO/MonthNames/3=نيسان +FormatData/ar_JO/MonthNames/4=أيار +FormatData/ar_JO/MonthNames/5=حزيران +FormatData/ar_JO/MonthNames/6=تموز +FormatData/ar_JO/MonthNames/7=آب +FormatData/ar_JO/MonthNames/8=أيلول +FormatData/ar_JO/MonthNames/9=تشرين الأول +FormatData/ar_JO/MonthNames/10=تشرين الثاني +FormatData/ar_JO/MonthNames/11=كانون الأول FormatData/ar_JO/MonthNames/12= -FormatData/ar_JO/MonthAbbreviations/0=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_JO/MonthAbbreviations/1=\u0634\u0628\u0627\u0637 -FormatData/ar_JO/MonthAbbreviations/2=\u0622\u0630\u0627\u0631 -FormatData/ar_JO/MonthAbbreviations/3=\u0646\u064a\u0633\u0627\u0646 -FormatData/ar_JO/MonthAbbreviations/4=\u0623\u064a\u0627\u0631 -FormatData/ar_JO/MonthAbbreviations/5=\u062d\u0632\u064a\u0631\u0627\u0646 -FormatData/ar_JO/MonthAbbreviations/6=\u062a\u0645\u0648\u0632 -FormatData/ar_JO/MonthAbbreviations/7=\u0622\u0628 -FormatData/ar_JO/MonthAbbreviations/8=\u0623\u064a\u0644\u0648\u0644 -FormatData/ar_JO/MonthAbbreviations/9=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644 -FormatData/ar_JO/MonthAbbreviations/10=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_JO/MonthAbbreviations/11=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644 +FormatData/ar_JO/MonthAbbreviations/0=كانون الثاني +FormatData/ar_JO/MonthAbbreviations/1=شباط +FormatData/ar_JO/MonthAbbreviations/2=آذار +FormatData/ar_JO/MonthAbbreviations/3=نيسان +FormatData/ar_JO/MonthAbbreviations/4=أيار +FormatData/ar_JO/MonthAbbreviations/5=حزيران +FormatData/ar_JO/MonthAbbreviations/6=تموز +FormatData/ar_JO/MonthAbbreviations/7=آب +FormatData/ar_JO/MonthAbbreviations/8=أيلول +FormatData/ar_JO/MonthAbbreviations/9=تشرين الأول +FormatData/ar_JO/MonthAbbreviations/10=تشرين الثاني +FormatData/ar_JO/MonthAbbreviations/11=كانون الأول FormatData/ar_JO/MonthAbbreviations/12= -FormatData/ar_JO/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_JO/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_JO/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_JO/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_JO/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_JO/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_JO/DayNames/6=\u0627\u0644\u0633\u0628\u062a -FormatData/ar_JO/Eras/0=\u0642.\u0645 -FormatData/ar_JO/Eras/1=\u0645 -LocaleNames/ar_JO/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_JO/AmPmMarkers/0=\u0635 -FormatData/ar_JO/AmPmMarkers/1=\u0645 +FormatData/ar_JO/DayNames/0=الأحد +FormatData/ar_JO/DayNames/1=الاثنين +FormatData/ar_JO/DayNames/2=الثلاثاء +FormatData/ar_JO/DayNames/3=الأربعاء +FormatData/ar_JO/DayNames/4=الخميس +FormatData/ar_JO/DayNames/5=الجمعة +FormatData/ar_JO/DayNames/6=السبت +FormatData/ar_JO/Eras/0=ق.م +FormatData/ar_JO/Eras/1=م +LocaleNames/ar_JO/ar=العربية +FormatData/ar_JO/AmPmMarkers/0=ص +FormatData/ar_JO/AmPmMarkers/1=م FormatData/ar_JO/TimePatterns/0=h:mm:ss a zzzz FormatData/ar_JO/TimePatterns/1=h:mm:ss a z FormatData/ar_JO/TimePatterns/2=h:mm:ss a FormatData/ar_JO/TimePatterns/3=h:mm a -FormatData/ar_JO/DatePatterns/0=EEEE\u060c d MMMM y +FormatData/ar_JO/DatePatterns/0=EEEE، d MMMM y FormatData/ar_JO/DatePatterns/1=d MMMM y -FormatData/ar_JO/DatePatterns/2=dd\u200f/MM\u200f/y -FormatData/ar_JO/DatePatterns/3=d\u200f/M\u200f/y -FormatData/ar_JO/DateTimePatterns/0={1}\u060c {0} -LocaleNames/ar_JO/EG=\u0645\u0635\u0631 -LocaleNames/ar_JO/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_JO/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_JO/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_JO/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_JO/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_JO/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_JO/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_JO/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_JO/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_JO/QA=\u0642\u0637\u0631 -LocaleNames/ar_JO/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_JO/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_JO/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_JO/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_JO/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_JO/YE=\u0627\u0644\u064a\u0645\u0646 -FormatData/ar_JO/arab.NumberElements/0=\u066b -FormatData/ar_JO/arab.NumberElements/1=\u066c -FormatData/ar_JO/arab.NumberElements/2=\u061b -FormatData/ar_JO/arab.NumberElements/3=\u066a\u061c -FormatData/ar_JO/arab.NumberElements/4=\u0660 +FormatData/ar_JO/DatePatterns/2=dd‏/MM‏/y +FormatData/ar_JO/DatePatterns/3=d‏/M‏/y +FormatData/ar_JO/DateTimePatterns/0={1}، {0} +LocaleNames/ar_JO/EG=مصر +LocaleNames/ar_JO/DZ=الجزائر +LocaleNames/ar_JO/BH=البحرين +LocaleNames/ar_JO/IQ=العراق +LocaleNames/ar_JO/JO=الأردن +LocaleNames/ar_JO/KW=الكويت +LocaleNames/ar_JO/LB=لبنان +LocaleNames/ar_JO/LY=ليبيا +LocaleNames/ar_JO/MA=المغرب +LocaleNames/ar_JO/OM=عُمان +LocaleNames/ar_JO/QA=قطر +LocaleNames/ar_JO/SA=المملكة العربية السعودية +LocaleNames/ar_JO/SD=السودان +LocaleNames/ar_JO/SY=سوريا +LocaleNames/ar_JO/TN=تونس +LocaleNames/ar_JO/AE=الإمارات العربية المتحدة +LocaleNames/ar_JO/YE=اليمن +FormatData/ar_JO/arab.NumberElements/0=٫ +FormatData/ar_JO/arab.NumberElements/1=٬ +FormatData/ar_JO/arab.NumberElements/2=؛ +FormatData/ar_JO/arab.NumberElements/3=٪؜ +FormatData/ar_JO/arab.NumberElements/4=٠ FormatData/ar_JO/arab.NumberElements/5=# -FormatData/ar_JO/arab.NumberElements/6=\u061c- -FormatData/ar_JO/arab.NumberElements/7=\u0627\u0633 -FormatData/ar_JO/arab.NumberElements/8=\u0609 -FormatData/ar_JO/arab.NumberElements/9=\u221e -FormatData/ar_JO/arab.NumberElements/10=\u0644\u064a\u0633\u00a0\u0631\u0642\u0645 -CurrencyNames/ar_KW/KWD=\u062f.\u0643.\u200f +FormatData/ar_JO/arab.NumberElements/6=؜- +FormatData/ar_JO/arab.NumberElements/7=اس +FormatData/ar_JO/arab.NumberElements/8=؉ +FormatData/ar_JO/arab.NumberElements/9=∞ +FormatData/ar_JO/arab.NumberElements/10=ليس رقم +CurrencyNames/ar_KW/KWD=د.ك.‏ FormatData/ar_KW/arab.NumberPatterns/0=#,##0.### -# FormatData/ar_KW/NumberPatterns/1='\u062f.\u0643.\u200f' #,##0.###;'\u062f.\u0643.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_KW/NumberPatterns/1='د.ك.‏' #,##0.###;'د.ك.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_KW/arab.NumberPatterns/2=#,##0% -FormatData/ar_KW/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_KW/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_KW/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_KW/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_KW/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_KW/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_KW/DayNames/6=\u0627\u0644\u0633\u0628\u062a -FormatData/ar_KW/MonthAbbreviations/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_KW/MonthAbbreviations/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_KW/MonthAbbreviations/2=\u0645\u0627\u0631\u0633 -FormatData/ar_KW/MonthAbbreviations/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_KW/MonthAbbreviations/4=\u0645\u0627\u064a\u0648 -FormatData/ar_KW/MonthAbbreviations/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_KW/MonthAbbreviations/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_KW/MonthAbbreviations/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_KW/MonthAbbreviations/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_KW/MonthAbbreviations/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_KW/MonthAbbreviations/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_KW/MonthAbbreviations/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_KW/DayNames/0=الأحد +FormatData/ar_KW/DayNames/1=الاثنين +FormatData/ar_KW/DayNames/2=الثلاثاء +FormatData/ar_KW/DayNames/3=الأربعاء +FormatData/ar_KW/DayNames/4=الخميس +FormatData/ar_KW/DayNames/5=الجمعة +FormatData/ar_KW/DayNames/6=السبت +FormatData/ar_KW/MonthAbbreviations/0=يناير +FormatData/ar_KW/MonthAbbreviations/1=فبراير +FormatData/ar_KW/MonthAbbreviations/2=مارس +FormatData/ar_KW/MonthAbbreviations/3=أبريل +FormatData/ar_KW/MonthAbbreviations/4=مايو +FormatData/ar_KW/MonthAbbreviations/5=يونيو +FormatData/ar_KW/MonthAbbreviations/6=يوليو +FormatData/ar_KW/MonthAbbreviations/7=أغسطس +FormatData/ar_KW/MonthAbbreviations/8=سبتمبر +FormatData/ar_KW/MonthAbbreviations/9=أكتوبر +FormatData/ar_KW/MonthAbbreviations/10=نوفمبر +FormatData/ar_KW/MonthAbbreviations/11=ديسمبر FormatData/ar_KW/MonthAbbreviations/12= -FormatData/ar_KW/Eras/0=\u0642.\u0645 -FormatData/ar_KW/Eras/1=\u0645 -FormatData/ar_KW/DayAbbreviations/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_KW/DayAbbreviations/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_KW/DayAbbreviations/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_KW/DayAbbreviations/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_KW/DayAbbreviations/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_KW/DayAbbreviations/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_KW/DayAbbreviations/6=\u0627\u0644\u0633\u0628\u062a -LocaleNames/ar_KW/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_KW/MonthNames/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_KW/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_KW/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_KW/MonthNames/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_KW/MonthNames/4=\u0645\u0627\u064a\u0648 -FormatData/ar_KW/MonthNames/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_KW/MonthNames/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_KW/MonthNames/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_KW/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_KW/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_KW/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_KW/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_KW/Eras/0=ق.م +FormatData/ar_KW/Eras/1=م +FormatData/ar_KW/DayAbbreviations/0=الأحد +FormatData/ar_KW/DayAbbreviations/1=الاثنين +FormatData/ar_KW/DayAbbreviations/2=الثلاثاء +FormatData/ar_KW/DayAbbreviations/3=الأربعاء +FormatData/ar_KW/DayAbbreviations/4=الخميس +FormatData/ar_KW/DayAbbreviations/5=الجمعة +FormatData/ar_KW/DayAbbreviations/6=السبت +LocaleNames/ar_KW/ar=العربية +FormatData/ar_KW/MonthNames/0=يناير +FormatData/ar_KW/MonthNames/1=فبراير +FormatData/ar_KW/MonthNames/2=مارس +FormatData/ar_KW/MonthNames/3=أبريل +FormatData/ar_KW/MonthNames/4=مايو +FormatData/ar_KW/MonthNames/5=يونيو +FormatData/ar_KW/MonthNames/6=يوليو +FormatData/ar_KW/MonthNames/7=أغسطس +FormatData/ar_KW/MonthNames/8=سبتمبر +FormatData/ar_KW/MonthNames/9=أكتوبر +FormatData/ar_KW/MonthNames/10=نوفمبر +FormatData/ar_KW/MonthNames/11=ديسمبر FormatData/ar_KW/MonthNames/12= -FormatData/ar_KW/AmPmMarkers/0=\u0635 -FormatData/ar_KW/AmPmMarkers/1=\u0645 +FormatData/ar_KW/AmPmMarkers/0=ص +FormatData/ar_KW/AmPmMarkers/1=م FormatData/ar_KW/TimePatterns/0=h:mm:ss a zzzz FormatData/ar_KW/TimePatterns/1=h:mm:ss a z FormatData/ar_KW/TimePatterns/2=h:mm:ss a FormatData/ar_KW/TimePatterns/3=h:mm a -FormatData/ar_KW/DatePatterns/0=EEEE\u060c d MMMM y +FormatData/ar_KW/DatePatterns/0=EEEE، d MMMM y FormatData/ar_KW/DatePatterns/1=d MMMM y -FormatData/ar_KW/DatePatterns/2=dd\u200f/MM\u200f/y -FormatData/ar_KW/DatePatterns/3=d\u200f/M\u200f/y -FormatData/ar_KW/DateTimePatterns/0={1}\u060c {0} -LocaleNames/ar_KW/EG=\u0645\u0635\u0631 -LocaleNames/ar_KW/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_KW/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_KW/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_KW/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_KW/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_KW/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_KW/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_KW/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_KW/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_KW/QA=\u0642\u0637\u0631 -LocaleNames/ar_KW/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_KW/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_KW/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_KW/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_KW/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_KW/YE=\u0627\u0644\u064a\u0645\u0646 -FormatData/ar_KW/arab.NumberElements/0=\u066b -FormatData/ar_KW/arab.NumberElements/1=\u066c -FormatData/ar_KW/arab.NumberElements/2=\u061b -FormatData/ar_KW/arab.NumberElements/3=\u066a\u061c -FormatData/ar_KW/arab.NumberElements/4=\u0660 +FormatData/ar_KW/DatePatterns/2=dd‏/MM‏/y +FormatData/ar_KW/DatePatterns/3=d‏/M‏/y +FormatData/ar_KW/DateTimePatterns/0={1}، {0} +LocaleNames/ar_KW/EG=مصر +LocaleNames/ar_KW/DZ=الجزائر +LocaleNames/ar_KW/BH=البحرين +LocaleNames/ar_KW/IQ=العراق +LocaleNames/ar_KW/JO=الأردن +LocaleNames/ar_KW/KW=الكويت +LocaleNames/ar_KW/LB=لبنان +LocaleNames/ar_KW/LY=ليبيا +LocaleNames/ar_KW/MA=المغرب +LocaleNames/ar_KW/OM=عُمان +LocaleNames/ar_KW/QA=قطر +LocaleNames/ar_KW/SA=المملكة العربية السعودية +LocaleNames/ar_KW/SD=السودان +LocaleNames/ar_KW/SY=سوريا +LocaleNames/ar_KW/TN=تونس +LocaleNames/ar_KW/AE=الإمارات العربية المتحدة +LocaleNames/ar_KW/YE=اليمن +FormatData/ar_KW/arab.NumberElements/0=٫ +FormatData/ar_KW/arab.NumberElements/1=٬ +FormatData/ar_KW/arab.NumberElements/2=؛ +FormatData/ar_KW/arab.NumberElements/3=٪؜ +FormatData/ar_KW/arab.NumberElements/4=٠ FormatData/ar_KW/arab.NumberElements/5=# -FormatData/ar_KW/arab.NumberElements/6=\u061c- -FormatData/ar_KW/arab.NumberElements/7=\u0627\u0633 -FormatData/ar_KW/arab.NumberElements/8=\u0609 -FormatData/ar_KW/arab.NumberElements/9=\u221e -FormatData/ar_KW/arab.NumberElements/10=\u0644\u064a\u0633\u00a0\u0631\u0642\u0645 +FormatData/ar_KW/arab.NumberElements/6=؜- +FormatData/ar_KW/arab.NumberElements/7=اس +FormatData/ar_KW/arab.NumberElements/8=؉ +FormatData/ar_KW/arab.NumberElements/9=∞ +FormatData/ar_KW/arab.NumberElements/10=ليس رقم FormatData/ar_LB/arab.NumberPatterns/0=#,##0.### -# FormatData/ar_LB/NumberPatterns/1='\u0644.\u0644.\u200f' #,##0.###;'\u0644.\u0644.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_LB/NumberPatterns/1='ل.ل.‏' #,##0.###;'ل.ل.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_LB/arab.NumberPatterns/2=#,##0% -CurrencyNames/ar_LB/LBP=\u0644.\u0644.\u200f -FormatData/ar_LB/DayAbbreviations/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_LB/DayAbbreviations/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_LB/DayAbbreviations/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_LB/DayAbbreviations/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_LB/DayAbbreviations/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_LB/DayAbbreviations/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_LB/DayAbbreviations/6=\u0627\u0644\u0633\u0628\u062a -FormatData/ar_LB/MonthNames/0=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_LB/MonthNames/1=\u0634\u0628\u0627\u0637 -FormatData/ar_LB/MonthNames/2=\u0622\u0630\u0627\u0631 -FormatData/ar_LB/MonthNames/3=\u0646\u064a\u0633\u0627\u0646 -FormatData/ar_LB/MonthNames/4=\u0623\u064a\u0627\u0631 -FormatData/ar_LB/MonthNames/5=\u062d\u0632\u064a\u0631\u0627\u0646 -FormatData/ar_LB/MonthNames/6=\u062a\u0645\u0648\u0632 -FormatData/ar_LB/MonthNames/7=\u0622\u0628 -FormatData/ar_LB/MonthNames/8=\u0623\u064a\u0644\u0648\u0644 -FormatData/ar_LB/MonthNames/9=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644 -FormatData/ar_LB/MonthNames/10=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_LB/MonthNames/11=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644 +CurrencyNames/ar_LB/LBP=ل.ل.‏ +FormatData/ar_LB/DayAbbreviations/0=الأحد +FormatData/ar_LB/DayAbbreviations/1=الاثنين +FormatData/ar_LB/DayAbbreviations/2=الثلاثاء +FormatData/ar_LB/DayAbbreviations/3=الأربعاء +FormatData/ar_LB/DayAbbreviations/4=الخميس +FormatData/ar_LB/DayAbbreviations/5=الجمعة +FormatData/ar_LB/DayAbbreviations/6=السبت +FormatData/ar_LB/MonthNames/0=كانون الثاني +FormatData/ar_LB/MonthNames/1=شباط +FormatData/ar_LB/MonthNames/2=آذار +FormatData/ar_LB/MonthNames/3=نيسان +FormatData/ar_LB/MonthNames/4=أيار +FormatData/ar_LB/MonthNames/5=حزيران +FormatData/ar_LB/MonthNames/6=تموز +FormatData/ar_LB/MonthNames/7=آب +FormatData/ar_LB/MonthNames/8=أيلول +FormatData/ar_LB/MonthNames/9=تشرين الأول +FormatData/ar_LB/MonthNames/10=تشرين الثاني +FormatData/ar_LB/MonthNames/11=كانون الأول FormatData/ar_LB/MonthNames/12= -FormatData/ar_LB/MonthAbbreviations/0=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_LB/MonthAbbreviations/1=\u0634\u0628\u0627\u0637 -FormatData/ar_LB/MonthAbbreviations/2=\u0622\u0630\u0627\u0631 -FormatData/ar_LB/MonthAbbreviations/3=\u0646\u064a\u0633\u0627\u0646 -FormatData/ar_LB/MonthAbbreviations/4=\u0623\u064a\u0627\u0631 -FormatData/ar_LB/MonthAbbreviations/5=\u062d\u0632\u064a\u0631\u0627\u0646 -FormatData/ar_LB/MonthAbbreviations/6=\u062a\u0645\u0648\u0632 -FormatData/ar_LB/MonthAbbreviations/7=\u0622\u0628 -FormatData/ar_LB/MonthAbbreviations/8=\u0623\u064a\u0644\u0648\u0644 -FormatData/ar_LB/MonthAbbreviations/9=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644 -FormatData/ar_LB/MonthAbbreviations/10=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_LB/MonthAbbreviations/11=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644 +FormatData/ar_LB/MonthAbbreviations/0=كانون الثاني +FormatData/ar_LB/MonthAbbreviations/1=شباط +FormatData/ar_LB/MonthAbbreviations/2=آذار +FormatData/ar_LB/MonthAbbreviations/3=نيسان +FormatData/ar_LB/MonthAbbreviations/4=أيار +FormatData/ar_LB/MonthAbbreviations/5=حزيران +FormatData/ar_LB/MonthAbbreviations/6=تموز +FormatData/ar_LB/MonthAbbreviations/7=آب +FormatData/ar_LB/MonthAbbreviations/8=أيلول +FormatData/ar_LB/MonthAbbreviations/9=تشرين الأول +FormatData/ar_LB/MonthAbbreviations/10=تشرين الثاني +FormatData/ar_LB/MonthAbbreviations/11=كانون الأول FormatData/ar_LB/MonthAbbreviations/12= -FormatData/ar_LB/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_LB/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_LB/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_LB/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_LB/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_LB/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_LB/DayNames/6=\u0627\u0644\u0633\u0628\u062a -FormatData/ar_LB/Eras/0=\u0642.\u0645 -FormatData/ar_LB/Eras/1=\u0645 -LocaleNames/ar_LB/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_LB/AmPmMarkers/0=\u0635 -FormatData/ar_LB/AmPmMarkers/1=\u0645 +FormatData/ar_LB/DayNames/0=الأحد +FormatData/ar_LB/DayNames/1=الاثنين +FormatData/ar_LB/DayNames/2=الثلاثاء +FormatData/ar_LB/DayNames/3=الأربعاء +FormatData/ar_LB/DayNames/4=الخميس +FormatData/ar_LB/DayNames/5=الجمعة +FormatData/ar_LB/DayNames/6=السبت +FormatData/ar_LB/Eras/0=ق.م +FormatData/ar_LB/Eras/1=م +LocaleNames/ar_LB/ar=العربية +FormatData/ar_LB/AmPmMarkers/0=ص +FormatData/ar_LB/AmPmMarkers/1=م FormatData/ar_LB/TimePatterns/0=h:mm:ss a zzzz FormatData/ar_LB/TimePatterns/1=h:mm:ss a z FormatData/ar_LB/TimePatterns/2=h:mm:ss a FormatData/ar_LB/TimePatterns/3=h:mm a -FormatData/ar_LB/DatePatterns/0=EEEE\u060c d MMMM y +FormatData/ar_LB/DatePatterns/0=EEEE، d MMMM y FormatData/ar_LB/DatePatterns/1=d MMMM y -FormatData/ar_LB/DatePatterns/2=dd\u200f/MM\u200f/y -FormatData/ar_LB/DatePatterns/3=d\u200f/M\u200f/y -FormatData/ar_LB/DateTimePatterns/0={1}\u060c {0} -LocaleNames/ar_LB/EG=\u0645\u0635\u0631 -LocaleNames/ar_LB/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_LB/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_LB/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_LB/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_LB/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_LB/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_LB/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_LB/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_LB/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_LB/QA=\u0642\u0637\u0631 -LocaleNames/ar_LB/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_LB/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_LB/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_LB/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_LB/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_LB/YE=\u0627\u0644\u064a\u0645\u0646 -FormatData/ar_LB/arab.NumberElements/0=\u066b -FormatData/ar_LB/arab.NumberElements/1=\u066c -FormatData/ar_LB/arab.NumberElements/2=\u061b -FormatData/ar_LB/arab.NumberElements/3=\u066a\u061c -FormatData/ar_LB/arab.NumberElements/4=\u0660 +FormatData/ar_LB/DatePatterns/2=dd‏/MM‏/y +FormatData/ar_LB/DatePatterns/3=d‏/M‏/y +FormatData/ar_LB/DateTimePatterns/0={1}، {0} +LocaleNames/ar_LB/EG=مصر +LocaleNames/ar_LB/DZ=الجزائر +LocaleNames/ar_LB/BH=البحرين +LocaleNames/ar_LB/IQ=العراق +LocaleNames/ar_LB/JO=الأردن +LocaleNames/ar_LB/KW=الكويت +LocaleNames/ar_LB/LB=لبنان +LocaleNames/ar_LB/LY=ليبيا +LocaleNames/ar_LB/MA=المغرب +LocaleNames/ar_LB/OM=عُمان +LocaleNames/ar_LB/QA=قطر +LocaleNames/ar_LB/SA=المملكة العربية السعودية +LocaleNames/ar_LB/SD=السودان +LocaleNames/ar_LB/SY=سوريا +LocaleNames/ar_LB/TN=تونس +LocaleNames/ar_LB/AE=الإمارات العربية المتحدة +LocaleNames/ar_LB/YE=اليمن +FormatData/ar_LB/arab.NumberElements/0=٫ +FormatData/ar_LB/arab.NumberElements/1=٬ +FormatData/ar_LB/arab.NumberElements/2=؛ +FormatData/ar_LB/arab.NumberElements/3=٪؜ +FormatData/ar_LB/arab.NumberElements/4=٠ FormatData/ar_LB/arab.NumberElements/5=# -FormatData/ar_LB/arab.NumberElements/6=\u061c- -FormatData/ar_LB/arab.NumberElements/7=\u0627\u0633 -FormatData/ar_LB/arab.NumberElements/8=\u0609 -FormatData/ar_LB/arab.NumberElements/9=\u221e -FormatData/ar_LB/arab.NumberElements/10=\u0644\u064a\u0633\u00a0\u0631\u0642\u0645 -CurrencyNames/ar_LY/LYD=\u062f.\u0644.\u200f +FormatData/ar_LB/arab.NumberElements/6=؜- +FormatData/ar_LB/arab.NumberElements/7=اس +FormatData/ar_LB/arab.NumberElements/8=؉ +FormatData/ar_LB/arab.NumberElements/9=∞ +FormatData/ar_LB/arab.NumberElements/10=ليس رقم +CurrencyNames/ar_LY/LYD=د.ل.‏ FormatData/ar_LY/arab.NumberPatterns/0=#,##0.### -# FormatData/ar_LY/NumberPatterns/1='\u062f.\u0644.\u200f' #,##0.###;'\u062f.\u0644.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_LY/NumberPatterns/1='د.ل.‏' #,##0.###;'د.ل.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_LY/arab.NumberPatterns/2=#,##0% -FormatData/ar_LY/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_LY/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_LY/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_LY/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_LY/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_LY/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_LY/DayNames/6=\u0627\u0644\u0633\u0628\u062a -FormatData/ar_LY/MonthAbbreviations/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_LY/MonthAbbreviations/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_LY/MonthAbbreviations/2=\u0645\u0627\u0631\u0633 -FormatData/ar_LY/MonthAbbreviations/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_LY/MonthAbbreviations/4=\u0645\u0627\u064a\u0648 -FormatData/ar_LY/MonthAbbreviations/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_LY/MonthAbbreviations/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_LY/MonthAbbreviations/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_LY/MonthAbbreviations/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_LY/MonthAbbreviations/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_LY/MonthAbbreviations/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_LY/MonthAbbreviations/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_LY/DayNames/0=الأحد +FormatData/ar_LY/DayNames/1=الاثنين +FormatData/ar_LY/DayNames/2=الثلاثاء +FormatData/ar_LY/DayNames/3=الأربعاء +FormatData/ar_LY/DayNames/4=الخميس +FormatData/ar_LY/DayNames/5=الجمعة +FormatData/ar_LY/DayNames/6=السبت +FormatData/ar_LY/MonthAbbreviations/0=يناير +FormatData/ar_LY/MonthAbbreviations/1=فبراير +FormatData/ar_LY/MonthAbbreviations/2=مارس +FormatData/ar_LY/MonthAbbreviations/3=أبريل +FormatData/ar_LY/MonthAbbreviations/4=مايو +FormatData/ar_LY/MonthAbbreviations/5=يونيو +FormatData/ar_LY/MonthAbbreviations/6=يوليو +FormatData/ar_LY/MonthAbbreviations/7=أغسطس +FormatData/ar_LY/MonthAbbreviations/8=سبتمبر +FormatData/ar_LY/MonthAbbreviations/9=أكتوبر +FormatData/ar_LY/MonthAbbreviations/10=نوفمبر +FormatData/ar_LY/MonthAbbreviations/11=ديسمبر FormatData/ar_LY/MonthAbbreviations/12= -FormatData/ar_LY/Eras/0=\u0642.\u0645 -FormatData/ar_LY/Eras/1=\u0645 -FormatData/ar_LY/DayAbbreviations/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_LY/DayAbbreviations/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_LY/DayAbbreviations/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_LY/DayAbbreviations/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_LY/DayAbbreviations/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_LY/DayAbbreviations/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_LY/DayAbbreviations/6=\u0627\u0644\u0633\u0628\u062a -LocaleNames/ar_LY/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_LY/MonthNames/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_LY/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_LY/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_LY/MonthNames/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_LY/MonthNames/4=\u0645\u0627\u064a\u0648 -FormatData/ar_LY/MonthNames/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_LY/MonthNames/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_LY/MonthNames/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_LY/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_LY/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_LY/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_LY/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_LY/Eras/0=ق.م +FormatData/ar_LY/Eras/1=م +FormatData/ar_LY/DayAbbreviations/0=الأحد +FormatData/ar_LY/DayAbbreviations/1=الاثنين +FormatData/ar_LY/DayAbbreviations/2=الثلاثاء +FormatData/ar_LY/DayAbbreviations/3=الأربعاء +FormatData/ar_LY/DayAbbreviations/4=الخميس +FormatData/ar_LY/DayAbbreviations/5=الجمعة +FormatData/ar_LY/DayAbbreviations/6=السبت +LocaleNames/ar_LY/ar=العربية +FormatData/ar_LY/MonthNames/0=يناير +FormatData/ar_LY/MonthNames/1=فبراير +FormatData/ar_LY/MonthNames/2=مارس +FormatData/ar_LY/MonthNames/3=أبريل +FormatData/ar_LY/MonthNames/4=مايو +FormatData/ar_LY/MonthNames/5=يونيو +FormatData/ar_LY/MonthNames/6=يوليو +FormatData/ar_LY/MonthNames/7=أغسطس +FormatData/ar_LY/MonthNames/8=سبتمبر +FormatData/ar_LY/MonthNames/9=أكتوبر +FormatData/ar_LY/MonthNames/10=نوفمبر +FormatData/ar_LY/MonthNames/11=ديسمبر FormatData/ar_LY/MonthNames/12= -FormatData/ar_LY/AmPmMarkers/0=\u0635 -FormatData/ar_LY/AmPmMarkers/1=\u0645 +FormatData/ar_LY/AmPmMarkers/0=ص +FormatData/ar_LY/AmPmMarkers/1=م FormatData/ar_LY/TimePatterns/0=h:mm:ss a zzzz FormatData/ar_LY/TimePatterns/1=h:mm:ss a z FormatData/ar_LY/TimePatterns/2=h:mm:ss a FormatData/ar_LY/TimePatterns/3=h:mm a -FormatData/ar_LY/DatePatterns/0=EEEE\u060c d MMMM y +FormatData/ar_LY/DatePatterns/0=EEEE، d MMMM y FormatData/ar_LY/DatePatterns/1=d MMMM y -FormatData/ar_LY/DatePatterns/2=dd\u200f/MM\u200f/y -FormatData/ar_LY/DatePatterns/3=d\u200f/M\u200f/y -FormatData/ar_LY/DateTimePatterns/0={1}\u060c {0} -LocaleNames/ar_LY/EG=\u0645\u0635\u0631 -LocaleNames/ar_LY/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_LY/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_LY/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_LY/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_LY/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_LY/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_LY/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_LY/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_LY/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_LY/QA=\u0642\u0637\u0631 -LocaleNames/ar_LY/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_LY/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_LY/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_LY/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_LY/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_LY/YE=\u0627\u0644\u064a\u0645\u0646 -FormatData/ar_LY/arab.NumberElements/0=\u066b -FormatData/ar_LY/arab.NumberElements/1=\u066c -FormatData/ar_LY/arab.NumberElements/2=\u061b -FormatData/ar_LY/arab.NumberElements/3=\u066a\u061c -FormatData/ar_LY/arab.NumberElements/4=\u0660 +FormatData/ar_LY/DatePatterns/2=dd‏/MM‏/y +FormatData/ar_LY/DatePatterns/3=d‏/M‏/y +FormatData/ar_LY/DateTimePatterns/0={1}، {0} +LocaleNames/ar_LY/EG=مصر +LocaleNames/ar_LY/DZ=الجزائر +LocaleNames/ar_LY/BH=البحرين +LocaleNames/ar_LY/IQ=العراق +LocaleNames/ar_LY/JO=الأردن +LocaleNames/ar_LY/KW=الكويت +LocaleNames/ar_LY/LB=لبنان +LocaleNames/ar_LY/LY=ليبيا +LocaleNames/ar_LY/MA=المغرب +LocaleNames/ar_LY/OM=عُمان +LocaleNames/ar_LY/QA=قطر +LocaleNames/ar_LY/SA=المملكة العربية السعودية +LocaleNames/ar_LY/SD=السودان +LocaleNames/ar_LY/SY=سوريا +LocaleNames/ar_LY/TN=تونس +LocaleNames/ar_LY/AE=الإمارات العربية المتحدة +LocaleNames/ar_LY/YE=اليمن +FormatData/ar_LY/arab.NumberElements/0=٫ +FormatData/ar_LY/arab.NumberElements/1=٬ +FormatData/ar_LY/arab.NumberElements/2=؛ +FormatData/ar_LY/arab.NumberElements/3=٪؜ +FormatData/ar_LY/arab.NumberElements/4=٠ FormatData/ar_LY/arab.NumberElements/5=# -FormatData/ar_LY/arab.NumberElements/6=\u061c- -FormatData/ar_LY/arab.NumberElements/7=\u0627\u0633 -FormatData/ar_LY/arab.NumberElements/8=\u0609 -FormatData/ar_LY/arab.NumberElements/9=\u221e -FormatData/ar_LY/arab.NumberElements/10=\u0644\u064a\u0633\u00a0\u0631\u0642\u0645 -CurrencyNames/ar_MA/MAD=\u062f.\u0645.\u200f +FormatData/ar_LY/arab.NumberElements/6=؜- +FormatData/ar_LY/arab.NumberElements/7=اس +FormatData/ar_LY/arab.NumberElements/8=؉ +FormatData/ar_LY/arab.NumberElements/9=∞ +FormatData/ar_LY/arab.NumberElements/10=ليس رقم +CurrencyNames/ar_MA/MAD=د.م.‏ FormatData/ar_MA/arab.NumberPatterns/0=#,##0.### -# FormatData/ar_MA/NumberPatterns/1='\u062f.\u0645.\u200f' #,##0.###;'\u062f.\u0645.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_MA/NumberPatterns/1='د.م.‏' #,##0.###;'د.م.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_MA/arab.NumberPatterns/2=#,##0% -FormatData/ar_MA/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_MA/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_MA/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_MA/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_MA/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_MA/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_MA/DayNames/6=\u0627\u0644\u0633\u0628\u062a -FormatData/ar_MA/MonthAbbreviations/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_MA/MonthAbbreviations/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_MA/MonthAbbreviations/2=\u0645\u0627\u0631\u0633 -FormatData/ar_MA/MonthAbbreviations/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_MA/MonthAbbreviations/4=\u0645\u0627\u064a -FormatData/ar_MA/MonthAbbreviations/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_MA/MonthAbbreviations/6=\u064a\u0648\u0644\u064a\u0648\u0632 -FormatData/ar_MA/MonthAbbreviations/7=\u063a\u0634\u062a -FormatData/ar_MA/MonthAbbreviations/8=\u0634\u062a\u0646\u0628\u0631 -FormatData/ar_MA/MonthAbbreviations/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_MA/MonthAbbreviations/10=\u0646\u0648\u0646\u0628\u0631 -FormatData/ar_MA/MonthAbbreviations/11=\u062f\u062c\u0646\u0628\u0631 +FormatData/ar_MA/DayNames/0=الأحد +FormatData/ar_MA/DayNames/1=الاثنين +FormatData/ar_MA/DayNames/2=الثلاثاء +FormatData/ar_MA/DayNames/3=الأربعاء +FormatData/ar_MA/DayNames/4=الخميس +FormatData/ar_MA/DayNames/5=الجمعة +FormatData/ar_MA/DayNames/6=السبت +FormatData/ar_MA/MonthAbbreviations/0=يناير +FormatData/ar_MA/MonthAbbreviations/1=فبراير +FormatData/ar_MA/MonthAbbreviations/2=مارس +FormatData/ar_MA/MonthAbbreviations/3=أبريل +FormatData/ar_MA/MonthAbbreviations/4=ماي +FormatData/ar_MA/MonthAbbreviations/5=يونيو +FormatData/ar_MA/MonthAbbreviations/6=يوليوز +FormatData/ar_MA/MonthAbbreviations/7=غشت +FormatData/ar_MA/MonthAbbreviations/8=شتنبر +FormatData/ar_MA/MonthAbbreviations/9=أكتوبر +FormatData/ar_MA/MonthAbbreviations/10=نونبر +FormatData/ar_MA/MonthAbbreviations/11=دجنبر FormatData/ar_MA/MonthAbbreviations/12= -FormatData/ar_MA/Eras/0=\u0642.\u0645 -FormatData/ar_MA/Eras/1=\u0645 -FormatData/ar_MA/DayAbbreviations/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_MA/DayAbbreviations/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_MA/DayAbbreviations/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_MA/DayAbbreviations/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_MA/DayAbbreviations/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_MA/DayAbbreviations/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_MA/DayAbbreviations/6=\u0627\u0644\u0633\u0628\u062a -LocaleNames/ar_MA/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_MA/MonthNames/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_MA/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_MA/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_MA/MonthNames/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_MA/MonthNames/4=\u0645\u0627\u064a -FormatData/ar_MA/MonthNames/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_MA/MonthNames/6=\u064a\u0648\u0644\u064a\u0648\u0632 -FormatData/ar_MA/MonthNames/7=\u063a\u0634\u062a -FormatData/ar_MA/MonthNames/8=\u0634\u062a\u0646\u0628\u0631 -FormatData/ar_MA/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_MA/MonthNames/10=\u0646\u0648\u0646\u0628\u0631 -FormatData/ar_MA/MonthNames/11=\u062f\u062c\u0646\u0628\u0631 +FormatData/ar_MA/Eras/0=ق.م +FormatData/ar_MA/Eras/1=م +FormatData/ar_MA/DayAbbreviations/0=الأحد +FormatData/ar_MA/DayAbbreviations/1=الاثنين +FormatData/ar_MA/DayAbbreviations/2=الثلاثاء +FormatData/ar_MA/DayAbbreviations/3=الأربعاء +FormatData/ar_MA/DayAbbreviations/4=الخميس +FormatData/ar_MA/DayAbbreviations/5=الجمعة +FormatData/ar_MA/DayAbbreviations/6=السبت +LocaleNames/ar_MA/ar=العربية +FormatData/ar_MA/MonthNames/0=يناير +FormatData/ar_MA/MonthNames/1=فبراير +FormatData/ar_MA/MonthNames/2=مارس +FormatData/ar_MA/MonthNames/3=أبريل +FormatData/ar_MA/MonthNames/4=ماي +FormatData/ar_MA/MonthNames/5=يونيو +FormatData/ar_MA/MonthNames/6=يوليوز +FormatData/ar_MA/MonthNames/7=غشت +FormatData/ar_MA/MonthNames/8=شتنبر +FormatData/ar_MA/MonthNames/9=أكتوبر +FormatData/ar_MA/MonthNames/10=نونبر +FormatData/ar_MA/MonthNames/11=دجنبر FormatData/ar_MA/MonthNames/12= -FormatData/ar_MA/AmPmMarkers/0=\u0635 -FormatData/ar_MA/AmPmMarkers/1=\u0645 +FormatData/ar_MA/AmPmMarkers/0=ص +FormatData/ar_MA/AmPmMarkers/1=م FormatData/ar_MA/TimePatterns/0=HH:mm:ss zzzz FormatData/ar_MA/TimePatterns/1=HH:mm:ss z FormatData/ar_MA/TimePatterns/2=HH:mm:ss FormatData/ar_MA/TimePatterns/3=HH:mm -FormatData/ar_MA/DatePatterns/0=EEEE\u060c d MMMM y +FormatData/ar_MA/DatePatterns/0=EEEE، d MMMM y FormatData/ar_MA/DatePatterns/1=d MMMM y -FormatData/ar_MA/DatePatterns/2=dd\u200f/MM\u200f/y -FormatData/ar_MA/DatePatterns/3=d\u200f/M\u200f/y -FormatData/ar_MA/DateTimePatterns/0={1}\u060c {0} -LocaleNames/ar_MA/EG=\u0645\u0635\u0631 -LocaleNames/ar_MA/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_MA/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_MA/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_MA/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_MA/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_MA/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_MA/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_MA/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_MA/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_MA/QA=\u0642\u0637\u0631 -LocaleNames/ar_MA/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_MA/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_MA/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_MA/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_MA/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_MA/YE=\u0627\u0644\u064a\u0645\u0646 -FormatData/ar_MA/arab.NumberElements/0=\u066b -FormatData/ar_MA/arab.NumberElements/1=\u066c -FormatData/ar_MA/arab.NumberElements/2=\u061b -FormatData/ar_MA/arab.NumberElements/3=\u066a\u061c -FormatData/ar_MA/arab.NumberElements/4=\u0660 +FormatData/ar_MA/DatePatterns/2=dd‏/MM‏/y +FormatData/ar_MA/DatePatterns/3=d‏/M‏/y +FormatData/ar_MA/DateTimePatterns/0={1}، {0} +LocaleNames/ar_MA/EG=مصر +LocaleNames/ar_MA/DZ=الجزائر +LocaleNames/ar_MA/BH=البحرين +LocaleNames/ar_MA/IQ=العراق +LocaleNames/ar_MA/JO=الأردن +LocaleNames/ar_MA/KW=الكويت +LocaleNames/ar_MA/LB=لبنان +LocaleNames/ar_MA/LY=ليبيا +LocaleNames/ar_MA/MA=المغرب +LocaleNames/ar_MA/OM=عُمان +LocaleNames/ar_MA/QA=قطر +LocaleNames/ar_MA/SA=المملكة العربية السعودية +LocaleNames/ar_MA/SD=السودان +LocaleNames/ar_MA/SY=سوريا +LocaleNames/ar_MA/TN=تونس +LocaleNames/ar_MA/AE=الإمارات العربية المتحدة +LocaleNames/ar_MA/YE=اليمن +FormatData/ar_MA/arab.NumberElements/0=٫ +FormatData/ar_MA/arab.NumberElements/1=٬ +FormatData/ar_MA/arab.NumberElements/2=؛ +FormatData/ar_MA/arab.NumberElements/3=٪؜ +FormatData/ar_MA/arab.NumberElements/4=٠ FormatData/ar_MA/arab.NumberElements/5=# -FormatData/ar_MA/arab.NumberElements/6=\u061c- -FormatData/ar_MA/arab.NumberElements/7=\u0627\u0633 -FormatData/ar_MA/arab.NumberElements/8=\u0609 -FormatData/ar_MA/arab.NumberElements/9=\u221e -FormatData/ar_MA/arab.NumberElements/10=\u0644\u064a\u0633\u00a0\u0631\u0642\u0645 -CurrencyNames/ar_OM/OMR=\u0631.\u0639.\u200f +FormatData/ar_MA/arab.NumberElements/6=؜- +FormatData/ar_MA/arab.NumberElements/7=اس +FormatData/ar_MA/arab.NumberElements/8=؉ +FormatData/ar_MA/arab.NumberElements/9=∞ +FormatData/ar_MA/arab.NumberElements/10=ليس رقم +CurrencyNames/ar_OM/OMR=ر.ع.‏ FormatData/ar_OM/arab.NumberPatterns/0=#,##0.### -# FormatData/ar_OM/NumberPatterns/1='\u0631.\u0639.\u200f' #,##0.###;'\u0631.\u0639.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_OM/NumberPatterns/1='ر.ع.‏' #,##0.###;'ر.ع.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_OM/arab.NumberPatterns/2=#,##0% -FormatData/ar_OM/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_OM/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_OM/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_OM/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_OM/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_OM/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_OM/DayNames/6=\u0627\u0644\u0633\u0628\u062a -FormatData/ar_OM/MonthAbbreviations/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_OM/MonthAbbreviations/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_OM/MonthAbbreviations/2=\u0645\u0627\u0631\u0633 -FormatData/ar_OM/MonthAbbreviations/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_OM/MonthAbbreviations/4=\u0645\u0627\u064a\u0648 -FormatData/ar_OM/MonthAbbreviations/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_OM/MonthAbbreviations/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_OM/MonthAbbreviations/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_OM/MonthAbbreviations/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_OM/MonthAbbreviations/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_OM/MonthAbbreviations/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_OM/MonthAbbreviations/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_OM/DayNames/0=الأحد +FormatData/ar_OM/DayNames/1=الاثنين +FormatData/ar_OM/DayNames/2=الثلاثاء +FormatData/ar_OM/DayNames/3=الأربعاء +FormatData/ar_OM/DayNames/4=الخميس +FormatData/ar_OM/DayNames/5=الجمعة +FormatData/ar_OM/DayNames/6=السبت +FormatData/ar_OM/MonthAbbreviations/0=يناير +FormatData/ar_OM/MonthAbbreviations/1=فبراير +FormatData/ar_OM/MonthAbbreviations/2=مارس +FormatData/ar_OM/MonthAbbreviations/3=أبريل +FormatData/ar_OM/MonthAbbreviations/4=مايو +FormatData/ar_OM/MonthAbbreviations/5=يونيو +FormatData/ar_OM/MonthAbbreviations/6=يوليو +FormatData/ar_OM/MonthAbbreviations/7=أغسطس +FormatData/ar_OM/MonthAbbreviations/8=سبتمبر +FormatData/ar_OM/MonthAbbreviations/9=أكتوبر +FormatData/ar_OM/MonthAbbreviations/10=نوفمبر +FormatData/ar_OM/MonthAbbreviations/11=ديسمبر FormatData/ar_OM/MonthAbbreviations/12= -FormatData/ar_OM/Eras/0=\u0642.\u0645 -FormatData/ar_OM/Eras/1=\u0645 -FormatData/ar_OM/DayAbbreviations/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_OM/DayAbbreviations/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_OM/DayAbbreviations/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_OM/DayAbbreviations/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_OM/DayAbbreviations/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_OM/DayAbbreviations/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_OM/DayAbbreviations/6=\u0627\u0644\u0633\u0628\u062a -LocaleNames/ar_OM/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_OM/MonthNames/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_OM/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_OM/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_OM/MonthNames/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_OM/MonthNames/4=\u0645\u0627\u064a\u0648 -FormatData/ar_OM/MonthNames/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_OM/MonthNames/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_OM/MonthNames/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_OM/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_OM/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_OM/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_OM/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_OM/Eras/0=ق.م +FormatData/ar_OM/Eras/1=م +FormatData/ar_OM/DayAbbreviations/0=الأحد +FormatData/ar_OM/DayAbbreviations/1=الاثنين +FormatData/ar_OM/DayAbbreviations/2=الثلاثاء +FormatData/ar_OM/DayAbbreviations/3=الأربعاء +FormatData/ar_OM/DayAbbreviations/4=الخميس +FormatData/ar_OM/DayAbbreviations/5=الجمعة +FormatData/ar_OM/DayAbbreviations/6=السبت +LocaleNames/ar_OM/ar=العربية +FormatData/ar_OM/MonthNames/0=يناير +FormatData/ar_OM/MonthNames/1=فبراير +FormatData/ar_OM/MonthNames/2=مارس +FormatData/ar_OM/MonthNames/3=أبريل +FormatData/ar_OM/MonthNames/4=مايو +FormatData/ar_OM/MonthNames/5=يونيو +FormatData/ar_OM/MonthNames/6=يوليو +FormatData/ar_OM/MonthNames/7=أغسطس +FormatData/ar_OM/MonthNames/8=سبتمبر +FormatData/ar_OM/MonthNames/9=أكتوبر +FormatData/ar_OM/MonthNames/10=نوفمبر +FormatData/ar_OM/MonthNames/11=ديسمبر FormatData/ar_OM/MonthNames/12= -FormatData/ar_OM/AmPmMarkers/0=\u0635 -FormatData/ar_OM/AmPmMarkers/1=\u0645 +FormatData/ar_OM/AmPmMarkers/0=ص +FormatData/ar_OM/AmPmMarkers/1=م FormatData/ar_OM/TimePatterns/0=h:mm:ss a zzzz FormatData/ar_OM/TimePatterns/1=h:mm:ss a z FormatData/ar_OM/TimePatterns/2=h:mm:ss a FormatData/ar_OM/TimePatterns/3=h:mm a -FormatData/ar_OM/DatePatterns/0=EEEE\u060c d MMMM y +FormatData/ar_OM/DatePatterns/0=EEEE، d MMMM y FormatData/ar_OM/DatePatterns/1=d MMMM y -FormatData/ar_OM/DatePatterns/2=dd\u200f/MM\u200f/y -FormatData/ar_OM/DatePatterns/3=d\u200f/M\u200f/y -FormatData/ar_OM/DateTimePatterns/0={1}\u060c {0} -LocaleNames/ar_OM/EG=\u0645\u0635\u0631 -LocaleNames/ar_OM/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_OM/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_OM/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_OM/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_OM/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_OM/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_OM/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_OM/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_OM/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_OM/QA=\u0642\u0637\u0631 -LocaleNames/ar_OM/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_OM/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_OM/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_OM/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_OM/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_OM/YE=\u0627\u0644\u064a\u0645\u0646 -FormatData/ar_OM/arab.NumberElements/0=\u066b -FormatData/ar_OM/arab.NumberElements/1=\u066c -FormatData/ar_OM/arab.NumberElements/2=\u061b -FormatData/ar_OM/arab.NumberElements/3=\u066a\u061c -FormatData/ar_OM/arab.NumberElements/4=\u0660 +FormatData/ar_OM/DatePatterns/2=dd‏/MM‏/y +FormatData/ar_OM/DatePatterns/3=d‏/M‏/y +FormatData/ar_OM/DateTimePatterns/0={1}، {0} +LocaleNames/ar_OM/EG=مصر +LocaleNames/ar_OM/DZ=الجزائر +LocaleNames/ar_OM/BH=البحرين +LocaleNames/ar_OM/IQ=العراق +LocaleNames/ar_OM/JO=الأردن +LocaleNames/ar_OM/KW=الكويت +LocaleNames/ar_OM/LB=لبنان +LocaleNames/ar_OM/LY=ليبيا +LocaleNames/ar_OM/MA=المغرب +LocaleNames/ar_OM/OM=عُمان +LocaleNames/ar_OM/QA=قطر +LocaleNames/ar_OM/SA=المملكة العربية السعودية +LocaleNames/ar_OM/SD=السودان +LocaleNames/ar_OM/SY=سوريا +LocaleNames/ar_OM/TN=تونس +LocaleNames/ar_OM/AE=الإمارات العربية المتحدة +LocaleNames/ar_OM/YE=اليمن +FormatData/ar_OM/arab.NumberElements/0=٫ +FormatData/ar_OM/arab.NumberElements/1=٬ +FormatData/ar_OM/arab.NumberElements/2=؛ +FormatData/ar_OM/arab.NumberElements/3=٪؜ +FormatData/ar_OM/arab.NumberElements/4=٠ FormatData/ar_OM/arab.NumberElements/5=# -FormatData/ar_OM/arab.NumberElements/6=\u061c- -FormatData/ar_OM/arab.NumberElements/7=\u0627\u0633 -FormatData/ar_OM/arab.NumberElements/8=\u0609 -FormatData/ar_OM/arab.NumberElements/9=\u221e -FormatData/ar_OM/arab.NumberElements/10=\u0644\u064a\u0633\u00a0\u0631\u0642\u0645 -CurrencyNames/ar_QA/QAR=\u0631.\u0642.\u200f +FormatData/ar_OM/arab.NumberElements/6=؜- +FormatData/ar_OM/arab.NumberElements/7=اس +FormatData/ar_OM/arab.NumberElements/8=؉ +FormatData/ar_OM/arab.NumberElements/9=∞ +FormatData/ar_OM/arab.NumberElements/10=ليس رقم +CurrencyNames/ar_QA/QAR=ر.ق.‏ FormatData/ar_QA/arab.NumberPatterns/0=#,##0.### -# FormatData/ar_QA/NumberPatterns/1='\u0631.\u0642.\u200f' #,##0.###;'\u0631.\u0642.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_QA/NumberPatterns/1='ر.ق.‏' #,##0.###;'ر.ق.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_QA/arab.NumberPatterns/2=#,##0% -FormatData/ar_QA/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_QA/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_QA/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_QA/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_QA/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_QA/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_QA/DayNames/6=\u0627\u0644\u0633\u0628\u062a -FormatData/ar_QA/MonthAbbreviations/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_QA/MonthAbbreviations/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_QA/MonthAbbreviations/2=\u0645\u0627\u0631\u0633 -FormatData/ar_QA/MonthAbbreviations/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_QA/MonthAbbreviations/4=\u0645\u0627\u064a\u0648 -FormatData/ar_QA/MonthAbbreviations/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_QA/MonthAbbreviations/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_QA/MonthAbbreviations/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_QA/MonthAbbreviations/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_QA/MonthAbbreviations/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_QA/MonthAbbreviations/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_QA/MonthAbbreviations/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_QA/DayNames/0=الأحد +FormatData/ar_QA/DayNames/1=الاثنين +FormatData/ar_QA/DayNames/2=الثلاثاء +FormatData/ar_QA/DayNames/3=الأربعاء +FormatData/ar_QA/DayNames/4=الخميس +FormatData/ar_QA/DayNames/5=الجمعة +FormatData/ar_QA/DayNames/6=السبت +FormatData/ar_QA/MonthAbbreviations/0=يناير +FormatData/ar_QA/MonthAbbreviations/1=فبراير +FormatData/ar_QA/MonthAbbreviations/2=مارس +FormatData/ar_QA/MonthAbbreviations/3=أبريل +FormatData/ar_QA/MonthAbbreviations/4=مايو +FormatData/ar_QA/MonthAbbreviations/5=يونيو +FormatData/ar_QA/MonthAbbreviations/6=يوليو +FormatData/ar_QA/MonthAbbreviations/7=أغسطس +FormatData/ar_QA/MonthAbbreviations/8=سبتمبر +FormatData/ar_QA/MonthAbbreviations/9=أكتوبر +FormatData/ar_QA/MonthAbbreviations/10=نوفمبر +FormatData/ar_QA/MonthAbbreviations/11=ديسمبر FormatData/ar_QA/MonthAbbreviations/12= -FormatData/ar_QA/Eras/0=\u0642.\u0645 -FormatData/ar_QA/Eras/1=\u0645 -FormatData/ar_QA/DayAbbreviations/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_QA/DayAbbreviations/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_QA/DayAbbreviations/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_QA/DayAbbreviations/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_QA/DayAbbreviations/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_QA/DayAbbreviations/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_QA/DayAbbreviations/6=\u0627\u0644\u0633\u0628\u062a -LocaleNames/ar_QA/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_QA/MonthNames/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_QA/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_QA/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_QA/MonthNames/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_QA/MonthNames/4=\u0645\u0627\u064a\u0648 -FormatData/ar_QA/MonthNames/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_QA/MonthNames/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_QA/MonthNames/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_QA/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_QA/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_QA/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_QA/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_QA/Eras/0=ق.م +FormatData/ar_QA/Eras/1=م +FormatData/ar_QA/DayAbbreviations/0=الأحد +FormatData/ar_QA/DayAbbreviations/1=الاثنين +FormatData/ar_QA/DayAbbreviations/2=الثلاثاء +FormatData/ar_QA/DayAbbreviations/3=الأربعاء +FormatData/ar_QA/DayAbbreviations/4=الخميس +FormatData/ar_QA/DayAbbreviations/5=الجمعة +FormatData/ar_QA/DayAbbreviations/6=السبت +LocaleNames/ar_QA/ar=العربية +FormatData/ar_QA/MonthNames/0=يناير +FormatData/ar_QA/MonthNames/1=فبراير +FormatData/ar_QA/MonthNames/2=مارس +FormatData/ar_QA/MonthNames/3=أبريل +FormatData/ar_QA/MonthNames/4=مايو +FormatData/ar_QA/MonthNames/5=يونيو +FormatData/ar_QA/MonthNames/6=يوليو +FormatData/ar_QA/MonthNames/7=أغسطس +FormatData/ar_QA/MonthNames/8=سبتمبر +FormatData/ar_QA/MonthNames/9=أكتوبر +FormatData/ar_QA/MonthNames/10=نوفمبر +FormatData/ar_QA/MonthNames/11=ديسمبر FormatData/ar_QA/MonthNames/12= -FormatData/ar_QA/AmPmMarkers/0=\u0635 -FormatData/ar_QA/AmPmMarkers/1=\u0645 +FormatData/ar_QA/AmPmMarkers/0=ص +FormatData/ar_QA/AmPmMarkers/1=م FormatData/ar_QA/TimePatterns/0=h:mm:ss a zzzz FormatData/ar_QA/TimePatterns/1=h:mm:ss a z FormatData/ar_QA/TimePatterns/2=h:mm:ss a FormatData/ar_QA/TimePatterns/3=h:mm a -FormatData/ar_QA/DatePatterns/0=EEEE\u060c d MMMM y +FormatData/ar_QA/DatePatterns/0=EEEE، d MMMM y FormatData/ar_QA/DatePatterns/1=d MMMM y -FormatData/ar_QA/DatePatterns/2=dd\u200f/MM\u200f/y -FormatData/ar_QA/DatePatterns/3=d\u200f/M\u200f/y -FormatData/ar_QA/DateTimePatterns/0={1}\u060c {0} -LocaleNames/ar_QA/EG=\u0645\u0635\u0631 -LocaleNames/ar_QA/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_QA/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_QA/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_QA/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_QA/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_QA/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_QA/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_QA/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_QA/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_QA/QA=\u0642\u0637\u0631 -LocaleNames/ar_QA/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_QA/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_QA/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_QA/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_QA/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_QA/YE=\u0627\u0644\u064a\u0645\u0646 -FormatData/ar_QA/arab.NumberElements/0=\u066b -FormatData/ar_QA/arab.NumberElements/1=\u066c -FormatData/ar_QA/arab.NumberElements/2=\u061b -FormatData/ar_QA/arab.NumberElements/3=\u066a\u061c -FormatData/ar_QA/arab.NumberElements/4=\u0660 +FormatData/ar_QA/DatePatterns/2=dd‏/MM‏/y +FormatData/ar_QA/DatePatterns/3=d‏/M‏/y +FormatData/ar_QA/DateTimePatterns/0={1}، {0} +LocaleNames/ar_QA/EG=مصر +LocaleNames/ar_QA/DZ=الجزائر +LocaleNames/ar_QA/BH=البحرين +LocaleNames/ar_QA/IQ=العراق +LocaleNames/ar_QA/JO=الأردن +LocaleNames/ar_QA/KW=الكويت +LocaleNames/ar_QA/LB=لبنان +LocaleNames/ar_QA/LY=ليبيا +LocaleNames/ar_QA/MA=المغرب +LocaleNames/ar_QA/OM=عُمان +LocaleNames/ar_QA/QA=قطر +LocaleNames/ar_QA/SA=المملكة العربية السعودية +LocaleNames/ar_QA/SD=السودان +LocaleNames/ar_QA/SY=سوريا +LocaleNames/ar_QA/TN=تونس +LocaleNames/ar_QA/AE=الإمارات العربية المتحدة +LocaleNames/ar_QA/YE=اليمن +FormatData/ar_QA/arab.NumberElements/0=٫ +FormatData/ar_QA/arab.NumberElements/1=٬ +FormatData/ar_QA/arab.NumberElements/2=؛ +FormatData/ar_QA/arab.NumberElements/3=٪؜ +FormatData/ar_QA/arab.NumberElements/4=٠ FormatData/ar_QA/arab.NumberElements/5=# -FormatData/ar_QA/arab.NumberElements/6=\u061c- -FormatData/ar_QA/arab.NumberElements/7=\u0627\u0633 -FormatData/ar_QA/arab.NumberElements/8=\u0609 -FormatData/ar_QA/arab.NumberElements/9=\u221e -FormatData/ar_QA/arab.NumberElements/10=\u0644\u064a\u0633\u00a0\u0631\u0642\u0645 -CurrencyNames/ar_SA/SAR=\u0631.\u0633.\u200f +FormatData/ar_QA/arab.NumberElements/6=؜- +FormatData/ar_QA/arab.NumberElements/7=اس +FormatData/ar_QA/arab.NumberElements/8=؉ +FormatData/ar_QA/arab.NumberElements/9=∞ +FormatData/ar_QA/arab.NumberElements/10=ليس رقم +CurrencyNames/ar_SA/SAR=ر.س.‏ FormatData/ar_SA/arab.NumberPatterns/0=#,##0.### -# FormatData/ar_SA/NumberPatterns/1='\u0631.\u0633.\u200f' #,##0.###;'\u0631.\u0633.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_SA/NumberPatterns/1='ر.س.‏' #,##0.###;'ر.س.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_SA/arab.NumberPatterns/2=#,##0% -FormatData/ar_SA/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_SA/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_SA/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_SA/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_SA/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_SA/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_SA/DayNames/6=\u0627\u0644\u0633\u0628\u062a -FormatData/ar_SA/MonthAbbreviations/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_SA/MonthAbbreviations/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_SA/MonthAbbreviations/2=\u0645\u0627\u0631\u0633 -FormatData/ar_SA/MonthAbbreviations/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_SA/MonthAbbreviations/4=\u0645\u0627\u064a\u0648 -FormatData/ar_SA/MonthAbbreviations/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_SA/MonthAbbreviations/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_SA/MonthAbbreviations/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_SA/MonthAbbreviations/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_SA/MonthAbbreviations/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_SA/MonthAbbreviations/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_SA/MonthAbbreviations/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_SA/DayNames/0=الأحد +FormatData/ar_SA/DayNames/1=الاثنين +FormatData/ar_SA/DayNames/2=الثلاثاء +FormatData/ar_SA/DayNames/3=الأربعاء +FormatData/ar_SA/DayNames/4=الخميس +FormatData/ar_SA/DayNames/5=الجمعة +FormatData/ar_SA/DayNames/6=السبت +FormatData/ar_SA/MonthAbbreviations/0=يناير +FormatData/ar_SA/MonthAbbreviations/1=فبراير +FormatData/ar_SA/MonthAbbreviations/2=مارس +FormatData/ar_SA/MonthAbbreviations/3=أبريل +FormatData/ar_SA/MonthAbbreviations/4=مايو +FormatData/ar_SA/MonthAbbreviations/5=يونيو +FormatData/ar_SA/MonthAbbreviations/6=يوليو +FormatData/ar_SA/MonthAbbreviations/7=أغسطس +FormatData/ar_SA/MonthAbbreviations/8=سبتمبر +FormatData/ar_SA/MonthAbbreviations/9=أكتوبر +FormatData/ar_SA/MonthAbbreviations/10=نوفمبر +FormatData/ar_SA/MonthAbbreviations/11=ديسمبر FormatData/ar_SA/MonthAbbreviations/12= -FormatData/ar_SA/Eras/0=\u0642.\u0645 -FormatData/ar_SA/Eras/1=\u0645 -FormatData/ar_SA/DayAbbreviations/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_SA/DayAbbreviations/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_SA/DayAbbreviations/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_SA/DayAbbreviations/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_SA/DayAbbreviations/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_SA/DayAbbreviations/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_SA/DayAbbreviations/6=\u0627\u0644\u0633\u0628\u062a -LocaleNames/ar_SA/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_SA/MonthNames/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_SA/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_SA/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_SA/MonthNames/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_SA/MonthNames/4=\u0645\u0627\u064a\u0648 -FormatData/ar_SA/MonthNames/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_SA/MonthNames/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_SA/MonthNames/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_SA/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_SA/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_SA/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_SA/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_SA/Eras/0=ق.م +FormatData/ar_SA/Eras/1=م +FormatData/ar_SA/DayAbbreviations/0=الأحد +FormatData/ar_SA/DayAbbreviations/1=الاثنين +FormatData/ar_SA/DayAbbreviations/2=الثلاثاء +FormatData/ar_SA/DayAbbreviations/3=الأربعاء +FormatData/ar_SA/DayAbbreviations/4=الخميس +FormatData/ar_SA/DayAbbreviations/5=الجمعة +FormatData/ar_SA/DayAbbreviations/6=السبت +LocaleNames/ar_SA/ar=العربية +FormatData/ar_SA/MonthNames/0=يناير +FormatData/ar_SA/MonthNames/1=فبراير +FormatData/ar_SA/MonthNames/2=مارس +FormatData/ar_SA/MonthNames/3=أبريل +FormatData/ar_SA/MonthNames/4=مايو +FormatData/ar_SA/MonthNames/5=يونيو +FormatData/ar_SA/MonthNames/6=يوليو +FormatData/ar_SA/MonthNames/7=أغسطس +FormatData/ar_SA/MonthNames/8=سبتمبر +FormatData/ar_SA/MonthNames/9=أكتوبر +FormatData/ar_SA/MonthNames/10=نوفمبر +FormatData/ar_SA/MonthNames/11=ديسمبر FormatData/ar_SA/MonthNames/12= -FormatData/ar_SA/AmPmMarkers/0=\u0635 -FormatData/ar_SA/AmPmMarkers/1=\u0645 +FormatData/ar_SA/AmPmMarkers/0=ص +FormatData/ar_SA/AmPmMarkers/1=م FormatData/ar_SA/TimePatterns/0=h:mm:ss a zzzz FormatData/ar_SA/TimePatterns/1=h:mm:ss a z FormatData/ar_SA/TimePatterns/2=h:mm:ss a FormatData/ar_SA/TimePatterns/3=h:mm a -FormatData/ar_SA/DatePatterns/0=EEEE\u060c d MMMM y +FormatData/ar_SA/DatePatterns/0=EEEE، d MMMM y FormatData/ar_SA/DatePatterns/1=d MMMM y -FormatData/ar_SA/DatePatterns/2=dd\u200f/MM\u200f/y -FormatData/ar_SA/DatePatterns/3=d\u200f/M\u200f/y -FormatData/ar_SA/DateTimePatterns/0={1}\u060c {0} -LocaleNames/ar_SA/EG=\u0645\u0635\u0631 -LocaleNames/ar_SA/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_SA/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_SA/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_SA/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_SA/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_SA/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_SA/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_SA/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_SA/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_SA/QA=\u0642\u0637\u0631 -LocaleNames/ar_SA/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_SA/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_SA/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_SA/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_SA/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_SA/YE=\u0627\u0644\u064a\u0645\u0646 -FormatData/ar_SA/arab.NumberElements/0=\u066b -FormatData/ar_SA/arab.NumberElements/1=\u066c -FormatData/ar_SA/arab.NumberElements/2=\u061b -FormatData/ar_SA/arab.NumberElements/3=\u066a\u061c -FormatData/ar_SA/arab.NumberElements/4=\u0660 +FormatData/ar_SA/DatePatterns/2=dd‏/MM‏/y +FormatData/ar_SA/DatePatterns/3=d‏/M‏/y +FormatData/ar_SA/DateTimePatterns/0={1}، {0} +LocaleNames/ar_SA/EG=مصر +LocaleNames/ar_SA/DZ=الجزائر +LocaleNames/ar_SA/BH=البحرين +LocaleNames/ar_SA/IQ=العراق +LocaleNames/ar_SA/JO=الأردن +LocaleNames/ar_SA/KW=الكويت +LocaleNames/ar_SA/LB=لبنان +LocaleNames/ar_SA/LY=ليبيا +LocaleNames/ar_SA/MA=المغرب +LocaleNames/ar_SA/OM=عُمان +LocaleNames/ar_SA/QA=قطر +LocaleNames/ar_SA/SA=المملكة العربية السعودية +LocaleNames/ar_SA/SD=السودان +LocaleNames/ar_SA/SY=سوريا +LocaleNames/ar_SA/TN=تونس +LocaleNames/ar_SA/AE=الإمارات العربية المتحدة +LocaleNames/ar_SA/YE=اليمن +FormatData/ar_SA/arab.NumberElements/0=٫ +FormatData/ar_SA/arab.NumberElements/1=٬ +FormatData/ar_SA/arab.NumberElements/2=؛ +FormatData/ar_SA/arab.NumberElements/3=٪؜ +FormatData/ar_SA/arab.NumberElements/4=٠ FormatData/ar_SA/arab.NumberElements/5=# -FormatData/ar_SA/arab.NumberElements/6=\u061c- -FormatData/ar_SA/arab.NumberElements/7=\u0627\u0633 -FormatData/ar_SA/arab.NumberElements/8=\u0609 -FormatData/ar_SA/arab.NumberElements/9=\u221e -FormatData/ar_SA/arab.NumberElements/10=\u0644\u064a\u0633\u00a0\u0631\u0642\u0645 +FormatData/ar_SA/arab.NumberElements/6=؜- +FormatData/ar_SA/arab.NumberElements/7=اس +FormatData/ar_SA/arab.NumberElements/8=؉ +FormatData/ar_SA/arab.NumberElements/9=∞ +FormatData/ar_SA/arab.NumberElements/10=ليس رقم # changed for 4945388, removed for 6531591, see bellow -# CurrencyNames/ar_SD/SDD=\u062c.\u0633.\u200f +# CurrencyNames/ar_SD/SDD=ج.س.‏ FormatData/ar_SD/arab.NumberPatterns/0=#,##0.### -# FormatData/ar_SD/NumberPatterns/1='\u062c.\u0633.\u200f' #,##0.###;'\u062c.\u0633.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_SD/NumberPatterns/1='ج.س.‏' #,##0.###;'ج.س.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_SD/arab.NumberPatterns/2=#,##0% -FormatData/ar_SD/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_SD/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_SD/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_SD/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_SD/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_SD/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_SD/DayNames/6=\u0627\u0644\u0633\u0628\u062a -FormatData/ar_SD/MonthAbbreviations/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_SD/MonthAbbreviations/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_SD/MonthAbbreviations/2=\u0645\u0627\u0631\u0633 -FormatData/ar_SD/MonthAbbreviations/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_SD/MonthAbbreviations/4=\u0645\u0627\u064a\u0648 -FormatData/ar_SD/MonthAbbreviations/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_SD/MonthAbbreviations/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_SD/MonthAbbreviations/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_SD/MonthAbbreviations/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_SD/MonthAbbreviations/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_SD/MonthAbbreviations/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_SD/MonthAbbreviations/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_SD/DayNames/0=الأحد +FormatData/ar_SD/DayNames/1=الاثنين +FormatData/ar_SD/DayNames/2=الثلاثاء +FormatData/ar_SD/DayNames/3=الأربعاء +FormatData/ar_SD/DayNames/4=الخميس +FormatData/ar_SD/DayNames/5=الجمعة +FormatData/ar_SD/DayNames/6=السبت +FormatData/ar_SD/MonthAbbreviations/0=يناير +FormatData/ar_SD/MonthAbbreviations/1=فبراير +FormatData/ar_SD/MonthAbbreviations/2=مارس +FormatData/ar_SD/MonthAbbreviations/3=أبريل +FormatData/ar_SD/MonthAbbreviations/4=مايو +FormatData/ar_SD/MonthAbbreviations/5=يونيو +FormatData/ar_SD/MonthAbbreviations/6=يوليو +FormatData/ar_SD/MonthAbbreviations/7=أغسطس +FormatData/ar_SD/MonthAbbreviations/8=سبتمبر +FormatData/ar_SD/MonthAbbreviations/9=أكتوبر +FormatData/ar_SD/MonthAbbreviations/10=نوفمبر +FormatData/ar_SD/MonthAbbreviations/11=ديسمبر FormatData/ar_SD/MonthAbbreviations/12= -FormatData/ar_SD/Eras/0=\u0642.\u0645 -FormatData/ar_SD/Eras/1=\u0645 -FormatData/ar_SD/DayAbbreviations/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_SD/DayAbbreviations/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_SD/DayAbbreviations/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_SD/DayAbbreviations/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_SD/DayAbbreviations/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_SD/DayAbbreviations/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_SD/DayAbbreviations/6=\u0627\u0644\u0633\u0628\u062a -LocaleNames/ar_SD/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_SD/MonthNames/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_SD/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_SD/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_SD/MonthNames/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_SD/MonthNames/4=\u0645\u0627\u064a\u0648 -FormatData/ar_SD/MonthNames/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_SD/MonthNames/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_SD/MonthNames/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_SD/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_SD/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_SD/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_SD/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_SD/Eras/0=ق.م +FormatData/ar_SD/Eras/1=م +FormatData/ar_SD/DayAbbreviations/0=الأحد +FormatData/ar_SD/DayAbbreviations/1=الاثنين +FormatData/ar_SD/DayAbbreviations/2=الثلاثاء +FormatData/ar_SD/DayAbbreviations/3=الأربعاء +FormatData/ar_SD/DayAbbreviations/4=الخميس +FormatData/ar_SD/DayAbbreviations/5=الجمعة +FormatData/ar_SD/DayAbbreviations/6=السبت +LocaleNames/ar_SD/ar=العربية +FormatData/ar_SD/MonthNames/0=يناير +FormatData/ar_SD/MonthNames/1=فبراير +FormatData/ar_SD/MonthNames/2=مارس +FormatData/ar_SD/MonthNames/3=أبريل +FormatData/ar_SD/MonthNames/4=مايو +FormatData/ar_SD/MonthNames/5=يونيو +FormatData/ar_SD/MonthNames/6=يوليو +FormatData/ar_SD/MonthNames/7=أغسطس +FormatData/ar_SD/MonthNames/8=سبتمبر +FormatData/ar_SD/MonthNames/9=أكتوبر +FormatData/ar_SD/MonthNames/10=نوفمبر +FormatData/ar_SD/MonthNames/11=ديسمبر FormatData/ar_SD/MonthNames/12= -FormatData/ar_SD/AmPmMarkers/0=\u0635 -FormatData/ar_SD/AmPmMarkers/1=\u0645 +FormatData/ar_SD/AmPmMarkers/0=ص +FormatData/ar_SD/AmPmMarkers/1=م FormatData/ar_SD/TimePatterns/0=h:mm:ss a zzzz FormatData/ar_SD/TimePatterns/1=h:mm:ss a z FormatData/ar_SD/TimePatterns/2=h:mm:ss a FormatData/ar_SD/TimePatterns/3=h:mm a -FormatData/ar_SD/DatePatterns/0=EEEE\u060c d MMMM y +FormatData/ar_SD/DatePatterns/0=EEEE، d MMMM y FormatData/ar_SD/DatePatterns/1=d MMMM y -FormatData/ar_SD/DatePatterns/2=dd\u200f/MM\u200f/y -FormatData/ar_SD/DatePatterns/3=d\u200f/M\u200f/y -FormatData/ar_SD/DateTimePatterns/0={1}\u060c {0} -LocaleNames/ar_SD/EG=\u0645\u0635\u0631 -LocaleNames/ar_SD/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_SD/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_SD/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_SD/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_SD/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_SD/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_SD/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_SD/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_SD/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_SD/QA=\u0642\u0637\u0631 -LocaleNames/ar_SD/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_SD/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_SD/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_SD/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_SD/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_SD/YE=\u0627\u0644\u064a\u0645\u0646 -FormatData/ar_SD/arab.NumberElements/0=\u066b -FormatData/ar_SD/arab.NumberElements/1=\u066c -FormatData/ar_SD/arab.NumberElements/2=\u061b -FormatData/ar_SD/arab.NumberElements/3=\u066a\u061c -FormatData/ar_SD/arab.NumberElements/4=\u0660 +FormatData/ar_SD/DatePatterns/2=dd‏/MM‏/y +FormatData/ar_SD/DatePatterns/3=d‏/M‏/y +FormatData/ar_SD/DateTimePatterns/0={1}، {0} +LocaleNames/ar_SD/EG=مصر +LocaleNames/ar_SD/DZ=الجزائر +LocaleNames/ar_SD/BH=البحرين +LocaleNames/ar_SD/IQ=العراق +LocaleNames/ar_SD/JO=الأردن +LocaleNames/ar_SD/KW=الكويت +LocaleNames/ar_SD/LB=لبنان +LocaleNames/ar_SD/LY=ليبيا +LocaleNames/ar_SD/MA=المغرب +LocaleNames/ar_SD/OM=عُمان +LocaleNames/ar_SD/QA=قطر +LocaleNames/ar_SD/SA=المملكة العربية السعودية +LocaleNames/ar_SD/SD=السودان +LocaleNames/ar_SD/SY=سوريا +LocaleNames/ar_SD/TN=تونس +LocaleNames/ar_SD/AE=الإمارات العربية المتحدة +LocaleNames/ar_SD/YE=اليمن +FormatData/ar_SD/arab.NumberElements/0=٫ +FormatData/ar_SD/arab.NumberElements/1=٬ +FormatData/ar_SD/arab.NumberElements/2=؛ +FormatData/ar_SD/arab.NumberElements/3=٪؜ +FormatData/ar_SD/arab.NumberElements/4=٠ FormatData/ar_SD/arab.NumberElements/5=# -FormatData/ar_SD/arab.NumberElements/6=\u061c- -FormatData/ar_SD/arab.NumberElements/7=\u0627\u0633 -FormatData/ar_SD/arab.NumberElements/8=\u0609 -FormatData/ar_SD/arab.NumberElements/9=\u221e -FormatData/ar_SD/arab.NumberElements/10=\u0644\u064a\u0633\u00a0\u0631\u0642\u0645 +FormatData/ar_SD/arab.NumberElements/6=؜- +FormatData/ar_SD/arab.NumberElements/7=اس +FormatData/ar_SD/arab.NumberElements/8=؉ +FormatData/ar_SD/arab.NumberElements/9=∞ +FormatData/ar_SD/arab.NumberElements/10=ليس رقم FormatData/ar_SY/arab.NumberPatterns/0=#,##0.### -# FormatData/ar_SY/NumberPatterns/1='\u0644.\u0633.\u200f' #,##0.###;'\u0644.\u0633.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_SY/NumberPatterns/1='ل.س.‏' #,##0.###;'ل.س.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_SY/arab.NumberPatterns/2=#,##0% -CurrencyNames/ar_SY/SYP=\u0644.\u0633.\u200f -FormatData/ar_SY/DayAbbreviations/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_SY/DayAbbreviations/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_SY/DayAbbreviations/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_SY/DayAbbreviations/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_SY/DayAbbreviations/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_SY/DayAbbreviations/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_SY/DayAbbreviations/6=\u0627\u0644\u0633\u0628\u062a -FormatData/ar_SY/MonthNames/0=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_SY/MonthNames/1=\u0634\u0628\u0627\u0637 -FormatData/ar_SY/MonthNames/2=\u0622\u0630\u0627\u0631 -FormatData/ar_SY/MonthNames/3=\u0646\u064a\u0633\u0627\u0646 -FormatData/ar_SY/MonthNames/4=\u0623\u064a\u0627\u0631 -FormatData/ar_SY/MonthNames/5=\u062d\u0632\u064a\u0631\u0627\u0646 -FormatData/ar_SY/MonthNames/6=\u062a\u0645\u0648\u0632 -FormatData/ar_SY/MonthNames/7=\u0622\u0628 -FormatData/ar_SY/MonthNames/8=\u0623\u064a\u0644\u0648\u0644 -FormatData/ar_SY/MonthNames/9=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644 -FormatData/ar_SY/MonthNames/10=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_SY/MonthNames/11=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644 +CurrencyNames/ar_SY/SYP=ل.س.‏ +FormatData/ar_SY/DayAbbreviations/0=الأحد +FormatData/ar_SY/DayAbbreviations/1=الاثنين +FormatData/ar_SY/DayAbbreviations/2=الثلاثاء +FormatData/ar_SY/DayAbbreviations/3=الأربعاء +FormatData/ar_SY/DayAbbreviations/4=الخميس +FormatData/ar_SY/DayAbbreviations/5=الجمعة +FormatData/ar_SY/DayAbbreviations/6=السبت +FormatData/ar_SY/MonthNames/0=كانون الثاني +FormatData/ar_SY/MonthNames/1=شباط +FormatData/ar_SY/MonthNames/2=آذار +FormatData/ar_SY/MonthNames/3=نيسان +FormatData/ar_SY/MonthNames/4=أيار +FormatData/ar_SY/MonthNames/5=حزيران +FormatData/ar_SY/MonthNames/6=تموز +FormatData/ar_SY/MonthNames/7=آب +FormatData/ar_SY/MonthNames/8=أيلول +FormatData/ar_SY/MonthNames/9=تشرين الأول +FormatData/ar_SY/MonthNames/10=تشرين الثاني +FormatData/ar_SY/MonthNames/11=كانون الأول FormatData/ar_SY/MonthNames/12= -FormatData/ar_SY/MonthAbbreviations/0=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_SY/MonthAbbreviations/1=\u0634\u0628\u0627\u0637 -FormatData/ar_SY/MonthAbbreviations/2=\u0622\u0630\u0627\u0631 -FormatData/ar_SY/MonthAbbreviations/3=\u0646\u064a\u0633\u0627\u0646 -FormatData/ar_SY/MonthAbbreviations/4=\u0623\u064a\u0627\u0631 -FormatData/ar_SY/MonthAbbreviations/5=\u062d\u0632\u064a\u0631\u0627\u0646 -FormatData/ar_SY/MonthAbbreviations/6=\u062a\u0645\u0648\u0632 -FormatData/ar_SY/MonthAbbreviations/7=\u0622\u0628 -FormatData/ar_SY/MonthAbbreviations/8=\u0623\u064a\u0644\u0648\u0644 -FormatData/ar_SY/MonthAbbreviations/9=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644 -FormatData/ar_SY/MonthAbbreviations/10=\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a -FormatData/ar_SY/MonthAbbreviations/11=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644 +FormatData/ar_SY/MonthAbbreviations/0=كانون الثاني +FormatData/ar_SY/MonthAbbreviations/1=شباط +FormatData/ar_SY/MonthAbbreviations/2=آذار +FormatData/ar_SY/MonthAbbreviations/3=نيسان +FormatData/ar_SY/MonthAbbreviations/4=أيار +FormatData/ar_SY/MonthAbbreviations/5=حزيران +FormatData/ar_SY/MonthAbbreviations/6=تموز +FormatData/ar_SY/MonthAbbreviations/7=آب +FormatData/ar_SY/MonthAbbreviations/8=أيلول +FormatData/ar_SY/MonthAbbreviations/9=تشرين الأول +FormatData/ar_SY/MonthAbbreviations/10=تشرين الثاني +FormatData/ar_SY/MonthAbbreviations/11=كانون الأول FormatData/ar_SY/MonthAbbreviations/12= -FormatData/ar_SY/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_SY/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_SY/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_SY/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_SY/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_SY/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_SY/DayNames/6=\u0627\u0644\u0633\u0628\u062a -FormatData/ar_SY/Eras/0=\u0642.\u0645 -FormatData/ar_SY/Eras/1=\u0645 -LocaleNames/ar_SY/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_SY/AmPmMarkers/0=\u0635 -FormatData/ar_SY/AmPmMarkers/1=\u0645 +FormatData/ar_SY/DayNames/0=الأحد +FormatData/ar_SY/DayNames/1=الاثنين +FormatData/ar_SY/DayNames/2=الثلاثاء +FormatData/ar_SY/DayNames/3=الأربعاء +FormatData/ar_SY/DayNames/4=الخميس +FormatData/ar_SY/DayNames/5=الجمعة +FormatData/ar_SY/DayNames/6=السبت +FormatData/ar_SY/Eras/0=ق.م +FormatData/ar_SY/Eras/1=م +LocaleNames/ar_SY/ar=العربية +FormatData/ar_SY/AmPmMarkers/0=ص +FormatData/ar_SY/AmPmMarkers/1=م FormatData/ar_SY/TimePatterns/0=h:mm:ss a zzzz FormatData/ar_SY/TimePatterns/1=h:mm:ss a z FormatData/ar_SY/TimePatterns/2=h:mm:ss a FormatData/ar_SY/TimePatterns/3=h:mm a -FormatData/ar_SY/DatePatterns/0=EEEE\u060c d MMMM y +FormatData/ar_SY/DatePatterns/0=EEEE، d MMMM y FormatData/ar_SY/DatePatterns/1=d MMMM y -FormatData/ar_SY/DatePatterns/2=dd\u200f/MM\u200f/y -FormatData/ar_SY/DatePatterns/3=d\u200f/M\u200f/y -FormatData/ar_SY/DateTimePatterns/0={1}\u060c {0} -LocaleNames/ar_SY/EG=\u0645\u0635\u0631 -LocaleNames/ar_SY/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_SY/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_SY/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_SY/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_SY/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_SY/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_SY/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_SY/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_SY/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_SY/QA=\u0642\u0637\u0631 -LocaleNames/ar_SY/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_SY/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_SY/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_SY/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_SY/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_SY/YE=\u0627\u0644\u064a\u0645\u0646 -FormatData/ar_SY/arab.NumberElements/0=\u066b -FormatData/ar_SY/arab.NumberElements/1=\u066c -FormatData/ar_SY/arab.NumberElements/2=\u061b -FormatData/ar_SY/arab.NumberElements/3=\u066a\u061c -FormatData/ar_SY/arab.NumberElements/4=\u0660 +FormatData/ar_SY/DatePatterns/2=dd‏/MM‏/y +FormatData/ar_SY/DatePatterns/3=d‏/M‏/y +FormatData/ar_SY/DateTimePatterns/0={1}، {0} +LocaleNames/ar_SY/EG=مصر +LocaleNames/ar_SY/DZ=الجزائر +LocaleNames/ar_SY/BH=البحرين +LocaleNames/ar_SY/IQ=العراق +LocaleNames/ar_SY/JO=الأردن +LocaleNames/ar_SY/KW=الكويت +LocaleNames/ar_SY/LB=لبنان +LocaleNames/ar_SY/LY=ليبيا +LocaleNames/ar_SY/MA=المغرب +LocaleNames/ar_SY/OM=عُمان +LocaleNames/ar_SY/QA=قطر +LocaleNames/ar_SY/SA=المملكة العربية السعودية +LocaleNames/ar_SY/SD=السودان +LocaleNames/ar_SY/SY=سوريا +LocaleNames/ar_SY/TN=تونس +LocaleNames/ar_SY/AE=الإمارات العربية المتحدة +LocaleNames/ar_SY/YE=اليمن +FormatData/ar_SY/arab.NumberElements/0=٫ +FormatData/ar_SY/arab.NumberElements/1=٬ +FormatData/ar_SY/arab.NumberElements/2=؛ +FormatData/ar_SY/arab.NumberElements/3=٪؜ +FormatData/ar_SY/arab.NumberElements/4=٠ FormatData/ar_SY/arab.NumberElements/5=# -FormatData/ar_SY/arab.NumberElements/6=\u061c- -FormatData/ar_SY/arab.NumberElements/7=\u0627\u0633 -FormatData/ar_SY/arab.NumberElements/8=\u0609 -FormatData/ar_SY/arab.NumberElements/9=\u221e -FormatData/ar_SY/arab.NumberElements/10=\u0644\u064a\u0633\u00a0\u0631\u0642\u0645 -CurrencyNames/ar_TN/TND=\u062f.\u062a.\u200f +FormatData/ar_SY/arab.NumberElements/6=؜- +FormatData/ar_SY/arab.NumberElements/7=اس +FormatData/ar_SY/arab.NumberElements/8=؉ +FormatData/ar_SY/arab.NumberElements/9=∞ +FormatData/ar_SY/arab.NumberElements/10=ليس رقم +CurrencyNames/ar_TN/TND=د.ت.‏ FormatData/ar_TN/arab.NumberPatterns/0=#,##0.### -# FormatData/ar_TN/NumberPatterns/1='\u062f.\u062a.\u200f' #,##0.###;'\u062f.\u062a.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_TN/NumberPatterns/1='د.ت.‏' #,##0.###;'د.ت.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_TN/arab.NumberPatterns/2=#,##0% -FormatData/ar_TN/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_TN/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_TN/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_TN/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_TN/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_TN/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_TN/DayNames/6=\u0627\u0644\u0633\u0628\u062a -FormatData/ar_TN/MonthAbbreviations/0=\u062c\u0627\u0646\u0641\u064a -FormatData/ar_TN/MonthAbbreviations/1=\u0641\u064a\u0641\u0631\u064a -FormatData/ar_TN/MonthAbbreviations/2=\u0645\u0627\u0631\u0633 -FormatData/ar_TN/MonthAbbreviations/3=\u0623\u0641\u0631\u064a\u0644 -FormatData/ar_TN/MonthAbbreviations/4=\u0645\u0627\u064a -FormatData/ar_TN/MonthAbbreviations/5=\u062c\u0648\u0627\u0646 -FormatData/ar_TN/MonthAbbreviations/6=\u062c\u0648\u064a\u0644\u064a\u0629 -FormatData/ar_TN/MonthAbbreviations/7=\u0623\u0648\u062a -FormatData/ar_TN/MonthAbbreviations/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_TN/MonthAbbreviations/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_TN/MonthAbbreviations/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_TN/MonthAbbreviations/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_TN/DayNames/0=الأحد +FormatData/ar_TN/DayNames/1=الاثنين +FormatData/ar_TN/DayNames/2=الثلاثاء +FormatData/ar_TN/DayNames/3=الأربعاء +FormatData/ar_TN/DayNames/4=الخميس +FormatData/ar_TN/DayNames/5=الجمعة +FormatData/ar_TN/DayNames/6=السبت +FormatData/ar_TN/MonthAbbreviations/0=جانفي +FormatData/ar_TN/MonthAbbreviations/1=فيفري +FormatData/ar_TN/MonthAbbreviations/2=مارس +FormatData/ar_TN/MonthAbbreviations/3=أفريل +FormatData/ar_TN/MonthAbbreviations/4=ماي +FormatData/ar_TN/MonthAbbreviations/5=جوان +FormatData/ar_TN/MonthAbbreviations/6=جويلية +FormatData/ar_TN/MonthAbbreviations/7=أوت +FormatData/ar_TN/MonthAbbreviations/8=سبتمبر +FormatData/ar_TN/MonthAbbreviations/9=أكتوبر +FormatData/ar_TN/MonthAbbreviations/10=نوفمبر +FormatData/ar_TN/MonthAbbreviations/11=ديسمبر FormatData/ar_TN/MonthAbbreviations/12= -FormatData/ar_TN/Eras/0=\u0642.\u0645 -FormatData/ar_TN/Eras/1=\u0645 -FormatData/ar_TN/DayAbbreviations/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_TN/DayAbbreviations/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_TN/DayAbbreviations/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_TN/DayAbbreviations/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_TN/DayAbbreviations/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_TN/DayAbbreviations/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_TN/DayAbbreviations/6=\u0627\u0644\u0633\u0628\u062a -LocaleNames/ar_TN/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_TN/MonthNames/0=\u062c\u0627\u0646\u0641\u064a -FormatData/ar_TN/MonthNames/1=\u0641\u064a\u0641\u0631\u064a -FormatData/ar_TN/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_TN/MonthNames/3=\u0623\u0641\u0631\u064a\u0644 -FormatData/ar_TN/MonthNames/4=\u0645\u0627\u064a -FormatData/ar_TN/MonthNames/5=\u062c\u0648\u0627\u0646 -FormatData/ar_TN/MonthNames/6=\u062c\u0648\u064a\u0644\u064a\u0629 -FormatData/ar_TN/MonthNames/7=\u0623\u0648\u062a -FormatData/ar_TN/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_TN/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_TN/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_TN/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_TN/Eras/0=ق.م +FormatData/ar_TN/Eras/1=م +FormatData/ar_TN/DayAbbreviations/0=الأحد +FormatData/ar_TN/DayAbbreviations/1=الاثنين +FormatData/ar_TN/DayAbbreviations/2=الثلاثاء +FormatData/ar_TN/DayAbbreviations/3=الأربعاء +FormatData/ar_TN/DayAbbreviations/4=الخميس +FormatData/ar_TN/DayAbbreviations/5=الجمعة +FormatData/ar_TN/DayAbbreviations/6=السبت +LocaleNames/ar_TN/ar=العربية +FormatData/ar_TN/MonthNames/0=جانفي +FormatData/ar_TN/MonthNames/1=فيفري +FormatData/ar_TN/MonthNames/2=مارس +FormatData/ar_TN/MonthNames/3=أفريل +FormatData/ar_TN/MonthNames/4=ماي +FormatData/ar_TN/MonthNames/5=جوان +FormatData/ar_TN/MonthNames/6=جويلية +FormatData/ar_TN/MonthNames/7=أوت +FormatData/ar_TN/MonthNames/8=سبتمبر +FormatData/ar_TN/MonthNames/9=أكتوبر +FormatData/ar_TN/MonthNames/10=نوفمبر +FormatData/ar_TN/MonthNames/11=ديسمبر FormatData/ar_TN/MonthNames/12= -FormatData/ar_TN/AmPmMarkers/0=\u0635 -FormatData/ar_TN/AmPmMarkers/1=\u0645 +FormatData/ar_TN/AmPmMarkers/0=ص +FormatData/ar_TN/AmPmMarkers/1=م FormatData/ar_TN/TimePatterns/0=h:mm:ss a zzzz FormatData/ar_TN/TimePatterns/1=h:mm:ss a z FormatData/ar_TN/TimePatterns/2=h:mm:ss a FormatData/ar_TN/TimePatterns/3=h:mm a -FormatData/ar_TN/DatePatterns/0=EEEE\u060c d MMMM y +FormatData/ar_TN/DatePatterns/0=EEEE، d MMMM y FormatData/ar_TN/DatePatterns/1=d MMMM y -FormatData/ar_TN/DatePatterns/2=dd\u200f/MM\u200f/y -FormatData/ar_TN/DatePatterns/3=d\u200f/M\u200f/y -FormatData/ar_TN/DateTimePatterns/0={1}\u060c {0} -LocaleNames/ar_TN/EG=\u0645\u0635\u0631 -LocaleNames/ar_TN/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_TN/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_TN/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_TN/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_TN/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_TN/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_TN/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_TN/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_TN/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_TN/QA=\u0642\u0637\u0631 -LocaleNames/ar_TN/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_TN/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_TN/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_TN/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_TN/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_TN/YE=\u0627\u0644\u064a\u0645\u0646 -FormatData/ar_TN/arab.NumberElements/0=\u066b -FormatData/ar_TN/arab.NumberElements/1=\u066c -FormatData/ar_TN/arab.NumberElements/2=\u061b -FormatData/ar_TN/arab.NumberElements/3=\u066a\u061c -FormatData/ar_TN/arab.NumberElements/4=\u0660 +FormatData/ar_TN/DatePatterns/2=dd‏/MM‏/y +FormatData/ar_TN/DatePatterns/3=d‏/M‏/y +FormatData/ar_TN/DateTimePatterns/0={1}، {0} +LocaleNames/ar_TN/EG=مصر +LocaleNames/ar_TN/DZ=الجزائر +LocaleNames/ar_TN/BH=البحرين +LocaleNames/ar_TN/IQ=العراق +LocaleNames/ar_TN/JO=الأردن +LocaleNames/ar_TN/KW=الكويت +LocaleNames/ar_TN/LB=لبنان +LocaleNames/ar_TN/LY=ليبيا +LocaleNames/ar_TN/MA=المغرب +LocaleNames/ar_TN/OM=عُمان +LocaleNames/ar_TN/QA=قطر +LocaleNames/ar_TN/SA=المملكة العربية السعودية +LocaleNames/ar_TN/SD=السودان +LocaleNames/ar_TN/SY=سوريا +LocaleNames/ar_TN/TN=تونس +LocaleNames/ar_TN/AE=الإمارات العربية المتحدة +LocaleNames/ar_TN/YE=اليمن +FormatData/ar_TN/arab.NumberElements/0=٫ +FormatData/ar_TN/arab.NumberElements/1=٬ +FormatData/ar_TN/arab.NumberElements/2=؛ +FormatData/ar_TN/arab.NumberElements/3=٪؜ +FormatData/ar_TN/arab.NumberElements/4=٠ FormatData/ar_TN/arab.NumberElements/5=# -FormatData/ar_TN/arab.NumberElements/6=\u061c- -FormatData/ar_TN/arab.NumberElements/7=\u0627\u0633 -FormatData/ar_TN/arab.NumberElements/8=\u0609 -FormatData/ar_TN/arab.NumberElements/9=\u221e -FormatData/ar_TN/arab.NumberElements/10=\u0644\u064a\u0633\u00a0\u0631\u0642\u0645 -CurrencyNames/ar_YE/YER=\u0631.\u064a.\u200f +FormatData/ar_TN/arab.NumberElements/6=؜- +FormatData/ar_TN/arab.NumberElements/7=اس +FormatData/ar_TN/arab.NumberElements/8=؉ +FormatData/ar_TN/arab.NumberElements/9=∞ +FormatData/ar_TN/arab.NumberElements/10=ليس رقم +CurrencyNames/ar_YE/YER=ر.ي.‏ FormatData/ar_YE/arab.NumberPatterns/0=#,##0.### -# FormatData/ar_YE/NumberPatterns/1='\u0631.\u064a.\u200f' #,##0.###;'\u0631.\u064a.\u200f' #,##0.###- # Changed; see bug 4122840 +# FormatData/ar_YE/NumberPatterns/1='ر.ي.‏' #,##0.###;'ر.ي.‏' #,##0.###- # Changed; see bug 4122840 FormatData/ar_YE/arab.NumberPatterns/2=#,##0% -FormatData/ar_YE/DayNames/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_YE/DayNames/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_YE/DayNames/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_YE/DayNames/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_YE/DayNames/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_YE/DayNames/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_YE/DayNames/6=\u0627\u0644\u0633\u0628\u062a -FormatData/ar_YE/MonthAbbreviations/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_YE/MonthAbbreviations/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_YE/MonthAbbreviations/2=\u0645\u0627\u0631\u0633 -FormatData/ar_YE/MonthAbbreviations/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_YE/MonthAbbreviations/4=\u0645\u0627\u064a\u0648 -FormatData/ar_YE/MonthAbbreviations/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_YE/MonthAbbreviations/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_YE/MonthAbbreviations/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_YE/MonthAbbreviations/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_YE/MonthAbbreviations/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_YE/MonthAbbreviations/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_YE/MonthAbbreviations/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_YE/DayNames/0=الأحد +FormatData/ar_YE/DayNames/1=الاثنين +FormatData/ar_YE/DayNames/2=الثلاثاء +FormatData/ar_YE/DayNames/3=الأربعاء +FormatData/ar_YE/DayNames/4=الخميس +FormatData/ar_YE/DayNames/5=الجمعة +FormatData/ar_YE/DayNames/6=السبت +FormatData/ar_YE/MonthAbbreviations/0=يناير +FormatData/ar_YE/MonthAbbreviations/1=فبراير +FormatData/ar_YE/MonthAbbreviations/2=مارس +FormatData/ar_YE/MonthAbbreviations/3=أبريل +FormatData/ar_YE/MonthAbbreviations/4=مايو +FormatData/ar_YE/MonthAbbreviations/5=يونيو +FormatData/ar_YE/MonthAbbreviations/6=يوليو +FormatData/ar_YE/MonthAbbreviations/7=أغسطس +FormatData/ar_YE/MonthAbbreviations/8=سبتمبر +FormatData/ar_YE/MonthAbbreviations/9=أكتوبر +FormatData/ar_YE/MonthAbbreviations/10=نوفمبر +FormatData/ar_YE/MonthAbbreviations/11=ديسمبر FormatData/ar_YE/MonthAbbreviations/12= -FormatData/ar_YE/Eras/0=\u0642.\u0645 -FormatData/ar_YE/Eras/1=\u0645 -FormatData/ar_YE/DayAbbreviations/0=\u0627\u0644\u0623\u062d\u062f -FormatData/ar_YE/DayAbbreviations/1=\u0627\u0644\u0627\u062b\u0646\u064a\u0646 -FormatData/ar_YE/DayAbbreviations/2=\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621 -FormatData/ar_YE/DayAbbreviations/3=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -FormatData/ar_YE/DayAbbreviations/4=\u0627\u0644\u062e\u0645\u064a\u0633 -FormatData/ar_YE/DayAbbreviations/5=\u0627\u0644\u062c\u0645\u0639\u0629 -FormatData/ar_YE/DayAbbreviations/6=\u0627\u0644\u0633\u0628\u062a -LocaleNames/ar_YE/ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 -FormatData/ar_YE/MonthNames/0=\u064a\u0646\u0627\u064a\u0631 -FormatData/ar_YE/MonthNames/1=\u0641\u0628\u0631\u0627\u064a\u0631 -FormatData/ar_YE/MonthNames/2=\u0645\u0627\u0631\u0633 -FormatData/ar_YE/MonthNames/3=\u0623\u0628\u0631\u064a\u0644 -FormatData/ar_YE/MonthNames/4=\u0645\u0627\u064a\u0648 -FormatData/ar_YE/MonthNames/5=\u064a\u0648\u0646\u064a\u0648 -FormatData/ar_YE/MonthNames/6=\u064a\u0648\u0644\u064a\u0648 -FormatData/ar_YE/MonthNames/7=\u0623\u063a\u0633\u0637\u0633 -FormatData/ar_YE/MonthNames/8=\u0633\u0628\u062a\u0645\u0628\u0631 -FormatData/ar_YE/MonthNames/9=\u0623\u0643\u062a\u0648\u0628\u0631 -FormatData/ar_YE/MonthNames/10=\u0646\u0648\u0641\u0645\u0628\u0631 -FormatData/ar_YE/MonthNames/11=\u062f\u064a\u0633\u0645\u0628\u0631 +FormatData/ar_YE/Eras/0=ق.م +FormatData/ar_YE/Eras/1=م +FormatData/ar_YE/DayAbbreviations/0=الأحد +FormatData/ar_YE/DayAbbreviations/1=الاثنين +FormatData/ar_YE/DayAbbreviations/2=الثلاثاء +FormatData/ar_YE/DayAbbreviations/3=الأربعاء +FormatData/ar_YE/DayAbbreviations/4=الخميس +FormatData/ar_YE/DayAbbreviations/5=الجمعة +FormatData/ar_YE/DayAbbreviations/6=السبت +LocaleNames/ar_YE/ar=العربية +FormatData/ar_YE/MonthNames/0=يناير +FormatData/ar_YE/MonthNames/1=فبراير +FormatData/ar_YE/MonthNames/2=مارس +FormatData/ar_YE/MonthNames/3=أبريل +FormatData/ar_YE/MonthNames/4=مايو +FormatData/ar_YE/MonthNames/5=يونيو +FormatData/ar_YE/MonthNames/6=يوليو +FormatData/ar_YE/MonthNames/7=أغسطس +FormatData/ar_YE/MonthNames/8=سبتمبر +FormatData/ar_YE/MonthNames/9=أكتوبر +FormatData/ar_YE/MonthNames/10=نوفمبر +FormatData/ar_YE/MonthNames/11=ديسمبر FormatData/ar_YE/MonthNames/12= -FormatData/ar_YE/AmPmMarkers/0=\u0635 -FormatData/ar_YE/AmPmMarkers/1=\u0645 +FormatData/ar_YE/AmPmMarkers/0=ص +FormatData/ar_YE/AmPmMarkers/1=م FormatData/ar_YE/TimePatterns/0=h:mm:ss a zzzz FormatData/ar_YE/TimePatterns/1=h:mm:ss a z FormatData/ar_YE/TimePatterns/2=h:mm:ss a FormatData/ar_YE/TimePatterns/3=h:mm a -FormatData/ar_YE/DatePatterns/0=EEEE\u060c d MMMM y +FormatData/ar_YE/DatePatterns/0=EEEE، d MMMM y FormatData/ar_YE/DatePatterns/1=d MMMM y -FormatData/ar_YE/DatePatterns/2=dd\u200f/MM\u200f/y -FormatData/ar_YE/DatePatterns/3=d\u200f/M\u200f/y -FormatData/ar_YE/DateTimePatterns/0={1}\u060c {0} -LocaleNames/ar_YE/EG=\u0645\u0635\u0631 -LocaleNames/ar_YE/DZ=\u0627\u0644\u062c\u0632\u0627\u0626\u0631 -LocaleNames/ar_YE/BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646 -LocaleNames/ar_YE/IQ=\u0627\u0644\u0639\u0631\u0627\u0642 -LocaleNames/ar_YE/JO=\u0627\u0644\u0623\u0631\u062f\u0646 -LocaleNames/ar_YE/KW=\u0627\u0644\u0643\u0648\u064a\u062a -LocaleNames/ar_YE/LB=\u0644\u0628\u0646\u0627\u0646 -LocaleNames/ar_YE/LY=\u0644\u064a\u0628\u064a\u0627 -LocaleNames/ar_YE/MA=\u0627\u0644\u0645\u063a\u0631\u0628 -LocaleNames/ar_YE/OM=\u0639\u064f\u0645\u0627\u0646 -LocaleNames/ar_YE/QA=\u0642\u0637\u0631 -LocaleNames/ar_YE/SA=\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629 -LocaleNames/ar_YE/SD=\u0627\u0644\u0633\u0648\u062f\u0627\u0646 -LocaleNames/ar_YE/SY=\u0633\u0648\u0631\u064a\u0627 -LocaleNames/ar_YE/TN=\u062a\u0648\u0646\u0633 -LocaleNames/ar_YE/AE=\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629 -LocaleNames/ar_YE/YE=\u0627\u0644\u064a\u0645\u0646 -FormatData/ar_YE/arab.NumberElements/0=\u066b -FormatData/ar_YE/arab.NumberElements/1=\u066c -FormatData/ar_YE/arab.NumberElements/2=\u061b -FormatData/ar_YE/arab.NumberElements/3=\u066a\u061c -FormatData/ar_YE/arab.NumberElements/4=\u0660 +FormatData/ar_YE/DatePatterns/2=dd‏/MM‏/y +FormatData/ar_YE/DatePatterns/3=d‏/M‏/y +FormatData/ar_YE/DateTimePatterns/0={1}، {0} +LocaleNames/ar_YE/EG=مصر +LocaleNames/ar_YE/DZ=الجزائر +LocaleNames/ar_YE/BH=البحرين +LocaleNames/ar_YE/IQ=العراق +LocaleNames/ar_YE/JO=الأردن +LocaleNames/ar_YE/KW=الكويت +LocaleNames/ar_YE/LB=لبنان +LocaleNames/ar_YE/LY=ليبيا +LocaleNames/ar_YE/MA=المغرب +LocaleNames/ar_YE/OM=عُمان +LocaleNames/ar_YE/QA=قطر +LocaleNames/ar_YE/SA=المملكة العربية السعودية +LocaleNames/ar_YE/SD=السودان +LocaleNames/ar_YE/SY=سوريا +LocaleNames/ar_YE/TN=تونس +LocaleNames/ar_YE/AE=الإمارات العربية المتحدة +LocaleNames/ar_YE/YE=اليمن +FormatData/ar_YE/arab.NumberElements/0=٫ +FormatData/ar_YE/arab.NumberElements/1=٬ +FormatData/ar_YE/arab.NumberElements/2=؛ +FormatData/ar_YE/arab.NumberElements/3=٪؜ +FormatData/ar_YE/arab.NumberElements/4=٠ FormatData/ar_YE/arab.NumberElements/5=# -FormatData/ar_YE/arab.NumberElements/6=\u061c- -FormatData/ar_YE/arab.NumberElements/7=\u0627\u0633 -FormatData/ar_YE/arab.NumberElements/8=\u0609 -FormatData/ar_YE/arab.NumberElements/9=\u221e -FormatData/ar_YE/arab.NumberElements/10=\u0644\u064a\u0633\u00a0\u0631\u0642\u0645 +FormatData/ar_YE/arab.NumberElements/6=؜- +FormatData/ar_YE/arab.NumberElements/7=اس +FormatData/ar_YE/arab.NumberElements/8=؉ +FormatData/ar_YE/arab.NumberElements/9=∞ +FormatData/ar_YE/arab.NumberElements/10=ليس رقم # bug #4113654 (this is obviously not an exhaustive test; I'm trying it here for a single # inheritance chain only. This bug fix also gets tested fairly well by the tests for all # the other bugs as given above) FormatData//latn.NumberPatterns/0=#,##0.### -# FormatData//NumberPatterns/1=\u00a4 #,##0.00;-\u00a4 #,##0.00 # Changed; see bug 4122840 +# FormatData//NumberPatterns/1=¤ #,##0.00;-¤ #,##0.00 # Changed; see bug 4122840 FormatData//latn.NumberPatterns/2=#,##0% FormatData/fr/latn.NumberPatterns/0=#,##0.### -# FormatData/fr/NumberPatterns/1=\u00a4 #,##0.00;-\u00a4 #,##0.00 # Changed; see bug 4122840 +# FormatData/fr/NumberPatterns/1=¤ #,##0.00;-¤ #,##0.00 # Changed; see bug 4122840 # FormatData/fr/NumberPatterns/2=#,##0% # changed, see bug 6547501 CurrencyNames/fr_FR/FRF=F -CurrencyNames/fr_FR/EUR=\u20ac +CurrencyNames/fr_FR/EUR=€ FormatData/fr_FR/latn.NumberPatterns/0=#,##0.### # FormatData/fr_FR/NumberPatterns/1=#,##0.00 F;-#,##0.00 F # Changed; see bug 4122840 # FormatData/fr_FR/NumberPatterns/2=#,##0% # changed; see bug 6547501 @@ -2207,19 +2207,19 @@ FormatData/fr_FR/DayNames/4=jeudi FormatData/fr_FR/DayNames/5=vendredi FormatData/fr_FR/DayNames/6=samedi FormatData/fr_FR/MonthNames/0=janvier -FormatData/fr_FR/MonthNames/1=f\u00e9vrier +FormatData/fr_FR/MonthNames/1=février FormatData/fr_FR/MonthNames/2=mars FormatData/fr_FR/MonthNames/3=avril FormatData/fr_FR/MonthNames/4=mai FormatData/fr_FR/MonthNames/5=juin FormatData/fr_FR/MonthNames/6=juillet -FormatData/fr_FR/MonthNames/7=ao\u00fbt +FormatData/fr_FR/MonthNames/7=août FormatData/fr_FR/MonthNames/8=septembre FormatData/fr_FR/MonthNames/9=octobre FormatData/fr_FR/MonthNames/10=novembre -FormatData/fr_FR/MonthNames/11=d\u00e9cembre +FormatData/fr_FR/MonthNames/11=décembre FormatData/fr_FR/MonthNames/12= -LocaleNames/fr_FR/fr=fran\u00e7ais +LocaleNames/fr_FR/fr=français LocaleNames/fr_FR/en=anglais LocaleNames/fr_FR/de=allemand LocaleNames/fr_FR/da=danois @@ -2229,10 +2229,10 @@ LocaleNames/fr_FR/fi=finnois LocaleNames/fr_FR/it=italien LocaleNames/fr_FR/ja=japonais #bug 4965260 -LocaleNames/fr_FR/nl=n\u00e9erlandais -LocaleNames/fr_FR/no=norv\u00e9gien +LocaleNames/fr_FR/nl=néerlandais +LocaleNames/fr_FR/no=norvégien LocaleNames/fr_FR/pt=portugais -LocaleNames/fr_FR/sv=su\u00e9dois +LocaleNames/fr_FR/sv=suédois LocaleNames/fr_FR/tr=turc FormatData/fr_FR/TimePatterns/0=HH:mm:ss zzzz FormatData/fr_FR/TimePatterns/1=HH:mm:ss z @@ -2244,24 +2244,24 @@ FormatData/fr_FR/DatePatterns/2=d MMM y FormatData/fr_FR/DatePatterns/3=dd/MM/y FormatData/fr_FR/DateTimePatterns/0={1}, {0} FormatData/fr_FR/latn.NumberElements/0=, -FormatData/fr_FR/latn.NumberElements/1=\u202f +FormatData/fr_FR/latn.NumberElements/1=  FormatData/fr_FR/latn.NumberElements/2=; FormatData/fr_FR/latn.NumberElements/3=% FormatData/fr_FR/latn.NumberElements/4=0 FormatData/fr_FR/latn.NumberElements/5=# FormatData/fr_FR/latn.NumberElements/6=- FormatData/fr_FR/latn.NumberElements/7=E -FormatData/fr_FR/latn.NumberElements/8=\u2030 -FormatData/fr_FR/latn.NumberElements/9=\u221e +FormatData/fr_FR/latn.NumberElements/8=‰ +FormatData/fr_FR/latn.NumberElements/9=∞ FormatData/fr_FR/latn.NumberElements/10=NaN FormatData/fr_FR/Eras/0=av. J.-C. FormatData/fr_FR/Eras/1=ap. J.-C. LocaleNames/fr_FR/FR=France -LocaleNames/fr_FR/US=\u00c9tats-Unis +LocaleNames/fr_FR/US=États-Unis LocaleNames/fr_FR/DK=Danemark LocaleNames/fr_FR/DE=Allemagne LocaleNames/fr_FR/AT=Autriche -LocaleNames/fr_FR/GR=Gr\u00e8ce +LocaleNames/fr_FR/GR=Grèce LocaleNames/fr_FR/ES=Espagne LocaleNames/fr_FR/FI=Finlande LocaleNames/fr_FR/IT=Italie @@ -2270,9 +2270,9 @@ LocaleNames/fr_FR/BE=Belgique LocaleNames/fr_FR/CA=Canada LocaleNames/fr_FR/JP=Japon LocaleNames/fr_FR/NL=Pays-Bas -LocaleNames/fr_FR/NO=Norv\u00e8ge +LocaleNames/fr_FR/NO=Norvège LocaleNames/fr_FR/PT=Portugal -LocaleNames/fr_FR/SE=Su\u00e8de +LocaleNames/fr_FR/SE=Suède LocaleNames/fr_FR/TR=Turquie FormatData/fr_FR/DayAbbreviations/0=dim. FormatData/fr_FR/DayAbbreviations/1=lun. @@ -2282,132 +2282,132 @@ FormatData/fr_FR/DayAbbreviations/4=jeu. FormatData/fr_FR/DayAbbreviations/5=ven. FormatData/fr_FR/DayAbbreviations/6=sam. FormatData/fr_FR/MonthAbbreviations/0=janv. -FormatData/fr_FR/MonthAbbreviations/1=f\u00e9vr. +FormatData/fr_FR/MonthAbbreviations/1=févr. FormatData/fr_FR/MonthAbbreviations/2=mars FormatData/fr_FR/MonthAbbreviations/3=avr. FormatData/fr_FR/MonthAbbreviations/4=mai FormatData/fr_FR/MonthAbbreviations/5=juin FormatData/fr_FR/MonthAbbreviations/6=juil. -FormatData/fr_FR/MonthAbbreviations/7=ao\u00fbt +FormatData/fr_FR/MonthAbbreviations/7=août FormatData/fr_FR/MonthAbbreviations/8=sept. FormatData/fr_FR/MonthAbbreviations/9=oct. FormatData/fr_FR/MonthAbbreviations/10=nov. -FormatData/fr_FR/MonthAbbreviations/11=d\u00e9c. +FormatData/fr_FR/MonthAbbreviations/11=déc. FormatData/fr_FR/MonthAbbreviations/12= FormatData/fr_FR/AmPmMarkers/0=AM FormatData/fr_FR/AmPmMarkers/1=PM # bug #4117054 -FormatData/ja_JP/AmPmMarkers/0=\u5348\u524d -FormatData/ja_JP/AmPmMarkers/1=\u5348\u5f8c +FormatData/ja_JP/AmPmMarkers/0=午前 +FormatData/ja_JP/AmPmMarkers/1=午後 # bug #4122840, 4290801 -FormatData/ar_AE/arab.NumberPatterns/1=\u200f#,##0.00\u00a0\u00a4 -FormatData/ar_BH/arab.NumberPatterns/1=\u200f#,##0.00\u00a0\u00a4 -FormatData/ar_DZ/arab.NumberPatterns/1=\u200f#,##0.00\u00a0\u00a4 -FormatData/ar_EG/arab.NumberPatterns/1=\u200f#,##0.00\u00a0\u00a4 -FormatData/ar_IQ/arab.NumberPatterns/1=\u200f#,##0.00\u00a0\u00a4 -FormatData/ar_JO/arab.NumberPatterns/1=\u200f#,##0.00\u00a0\u00a4 -FormatData/ar_KW/arab.NumberPatterns/1=\u200f#,##0.00\u00a0\u00a4 -FormatData/ar_LB/arab.NumberPatterns/1=\u200f#,##0.00\u00a0\u00a4 -FormatData/ar_LY/arab.NumberPatterns/1=\u200f#,##0.00\u00a0\u00a4 -FormatData/ar_MA/arab.NumberPatterns/1=\u200f#,##0.00\u00a0\u00a4 -FormatData/ar_OM/arab.NumberPatterns/1=\u200f#,##0.00\u00a0\u00a4 -FormatData/ar_QA/arab.NumberPatterns/1=\u200f#,##0.00\u00a0\u00a4 -FormatData/ar_SA/arab.NumberPatterns/1=\u200f#,##0.00\u00a0\u00a4 -FormatData/ar_SD/arab.NumberPatterns/1=\u200f#,##0.00\u00a0\u00a4 -FormatData/ar_SY/arab.NumberPatterns/1=\u200f#,##0.00\u00a0\u00a4 -FormatData/ar_TN/arab.NumberPatterns/1=\u200f#,##0.00\u00a0\u00a4 -FormatData/ar_YE/arab.NumberPatterns/1=\u200f#,##0.00\u00a0\u00a4 -FormatData/en_AU/latn.NumberPatterns/1=\u00a4#,##0.00 -FormatData/en_NZ/latn.NumberPatterns/1=\u00a4#,##0.00 -FormatData/en_ZA/latn.NumberPatterns/1=\u00a4#,##0.00 -FormatData/es_AR/latn.NumberPatterns/1=\u00a4\u00a0#,##0.00 -FormatData/es_BO/latn.NumberPatterns/1=\u00a4#,##0.00 -FormatData/es_CL/latn.NumberPatterns/1=\u00a4#,##0.00;\u00a4-#,##0.00 -FormatData/es_CO/latn.NumberPatterns/1=\u00a4\u00a0#,##0.00 -FormatData/es_CR/latn.NumberPatterns/1=\u00a4#,##0.00 -FormatData/es_DO/latn.NumberPatterns/1=\u00a4#,##0.00 -FormatData/es_EC/latn.NumberPatterns/1=\u00a4#,##0.00;\u00a4-#,##0.00 -FormatData/es_GT/latn.NumberPatterns/1=\u00a4#,##0.00 -FormatData/es_HN/latn.NumberPatterns/1=\u00a4#,##0.00 -FormatData/es_MX/latn.NumberPatterns/1=\u00a4#,##0.00 -FormatData/es_NI/latn.NumberPatterns/1=\u00a4#,##0.00 -FormatData/es_PA/latn.NumberPatterns/1=\u00a4#,##0.00 -FormatData/es_PE/latn.NumberPatterns/1=\u00a4\u00a0#,##0.00 -FormatData/es_PR/latn.NumberPatterns/1=\u00a4#,##0.00 -FormatData/es_PY/latn.NumberPatterns/1=\u00a4\u00a0#,##0.00;\u00a4\u00a0-#,##0.00 -FormatData/es_SV/latn.NumberPatterns/1=\u00a4#,##0.00 -FormatData/es_UY/latn.NumberPatterns/1=\u00a4\u00a0#,##0.00 -FormatData/es_VE/latn.NumberPatterns/1=\u00a4#,##0.00;\u00a4-#,##0.00 -FormatData/fr_FR/latn.NumberPatterns/1=#,##0.00\u00a0\u00a4 -FormatData/it_IT/latn.NumberPatterns/1=#,##0.00\u00a0\u00a4 -#FormatData/ja_JP/NumberPatterns/1=\u00a4#,##0.00 #see bug 4175306 -FormatData/ko_KR/latn.NumberPatterns/1=\u00a4#,##0.00 -FormatData/pl_PL/latn.NumberPatterns/1=#,##0.00\u00a0\u00a4 -FormatData/pt_BR/latn.NumberPatterns/1=\u00a4\u00a0#,##0.00 +FormatData/ar_AE/arab.NumberPatterns/1=‏#,##0.00 ¤ +FormatData/ar_BH/arab.NumberPatterns/1=‏#,##0.00 ¤ +FormatData/ar_DZ/arab.NumberPatterns/1=‏#,##0.00 ¤ +FormatData/ar_EG/arab.NumberPatterns/1=‏#,##0.00 ¤ +FormatData/ar_IQ/arab.NumberPatterns/1=‏#,##0.00 ¤ +FormatData/ar_JO/arab.NumberPatterns/1=‏#,##0.00 ¤ +FormatData/ar_KW/arab.NumberPatterns/1=‏#,##0.00 ¤ +FormatData/ar_LB/arab.NumberPatterns/1=‏#,##0.00 ¤ +FormatData/ar_LY/arab.NumberPatterns/1=‏#,##0.00 ¤ +FormatData/ar_MA/arab.NumberPatterns/1=‏#,##0.00 ¤ +FormatData/ar_OM/arab.NumberPatterns/1=‏#,##0.00 ¤ +FormatData/ar_QA/arab.NumberPatterns/1=‏#,##0.00 ¤ +FormatData/ar_SA/arab.NumberPatterns/1=‏#,##0.00 ¤ +FormatData/ar_SD/arab.NumberPatterns/1=‏#,##0.00 ¤ +FormatData/ar_SY/arab.NumberPatterns/1=‏#,##0.00 ¤ +FormatData/ar_TN/arab.NumberPatterns/1=‏#,##0.00 ¤ +FormatData/ar_YE/arab.NumberPatterns/1=‏#,##0.00 ¤ +FormatData/en_AU/latn.NumberPatterns/1=¤#,##0.00 +FormatData/en_NZ/latn.NumberPatterns/1=¤#,##0.00 +FormatData/en_ZA/latn.NumberPatterns/1=¤#,##0.00 +FormatData/es_AR/latn.NumberPatterns/1=¤ #,##0.00 +FormatData/es_BO/latn.NumberPatterns/1=¤#,##0.00 +FormatData/es_CL/latn.NumberPatterns/1=¤#,##0.00;¤-#,##0.00 +FormatData/es_CO/latn.NumberPatterns/1=¤ #,##0.00 +FormatData/es_CR/latn.NumberPatterns/1=¤#,##0.00 +FormatData/es_DO/latn.NumberPatterns/1=¤#,##0.00 +FormatData/es_EC/latn.NumberPatterns/1=¤#,##0.00;¤-#,##0.00 +FormatData/es_GT/latn.NumberPatterns/1=¤#,##0.00 +FormatData/es_HN/latn.NumberPatterns/1=¤#,##0.00 +FormatData/es_MX/latn.NumberPatterns/1=¤#,##0.00 +FormatData/es_NI/latn.NumberPatterns/1=¤#,##0.00 +FormatData/es_PA/latn.NumberPatterns/1=¤#,##0.00 +FormatData/es_PE/latn.NumberPatterns/1=¤ #,##0.00 +FormatData/es_PR/latn.NumberPatterns/1=¤#,##0.00 +FormatData/es_PY/latn.NumberPatterns/1=¤ #,##0.00;¤ -#,##0.00 +FormatData/es_SV/latn.NumberPatterns/1=¤#,##0.00 +FormatData/es_UY/latn.NumberPatterns/1=¤ #,##0.00 +FormatData/es_VE/latn.NumberPatterns/1=¤#,##0.00;¤-#,##0.00 +FormatData/fr_FR/latn.NumberPatterns/1=#,##0.00 ¤ +FormatData/it_IT/latn.NumberPatterns/1=#,##0.00 ¤ +#FormatData/ja_JP/NumberPatterns/1=¤#,##0.00 #see bug 4175306 +FormatData/ko_KR/latn.NumberPatterns/1=¤#,##0.00 +FormatData/pl_PL/latn.NumberPatterns/1=#,##0.00 ¤ +FormatData/pt_BR/latn.NumberPatterns/1=¤ #,##0.00 #Changed; see 4936845 -FormatData/ru_RU/latn.NumberPatterns/1=#,##0.00\u00a0\u00a4 -FormatData/uk_UA/latn.NumberPatterns/1=#,##0.00\u00a0\u00a4 +FormatData/ru_RU/latn.NumberPatterns/1=#,##0.00 ¤ +FormatData/uk_UA/latn.NumberPatterns/1=#,##0.00 ¤ # bug #4139860 FormatData/cs/DatePatterns/0=EEEE d. MMMM y FormatData/cs/DatePatterns/1=d. MMMM y FormatData/cs/DatePatterns/2=d. M. y FormatData/cs/DatePatterns/3=dd.MM.yy -FormatData/cs/latn.NumberElements/1=\u00a0 +FormatData/cs/latn.NumberElements/1=  FormatData/cs_CZ/latn.NumberPatterns/0=#,##0.### -FormatData/cs_CZ/latn.NumberPatterns/1=#,##0.00\u00a0\u00a4 -FormatData/cs_CZ/latn.NumberPatterns/2=#,##0\u00a0% +FormatData/cs_CZ/latn.NumberPatterns/1=#,##0.00 ¤ +FormatData/cs_CZ/latn.NumberPatterns/2=#,##0 % #bug #4135752 -FormatData/th_TH/latn.NumberPatterns/1=\u00a4#,##0.00 -CurrencyNames/th_TH/THB=\u0e3f +FormatData/th_TH/latn.NumberPatterns/1=¤#,##0.00 +CurrencyNames/th_TH/THB=฿ #bug #4153698 # TimeZoneNames/zh_HK/zoneStrings/0/1=Hong Kong Standard Time # changed, see bug 4261506 # TimeZoneNames/zh_HK/zoneStrings/0/2=HKST # changed, see bug 4261506 -LocaleNames/zh/HK=\u4e2d\u56fd\u9999\u6e2f\u7279\u522b\u884c\u653f\u533a -FormatData/zh_HK/MonthNames/0=1\u6708 -FormatData/zh_HK/MonthNames/1=2\u6708 -FormatData/zh_HK/MonthNames/2=3\u6708 -FormatData/zh_HK/MonthNames/3=4\u6708 -FormatData/zh_HK/MonthAbbreviations/0=1\u6708 -FormatData/zh_HK/MonthAbbreviations/1=2\u6708 -FormatData/zh_HK/MonthAbbreviations/2=3\u6708 -FormatData/zh_HK/MonthAbbreviations/3=4\u6708 -FormatData/zh_HK/DayNames/0=\u661f\u671f\u65e5 -FormatData/zh_HK/DayNames/1=\u661f\u671f\u4e00 -FormatData/zh_HK/DayNames/2=\u661f\u671f\u4e8c -FormatData/zh_HK/DayAbbreviations/0=\u9031\u65e5 -FormatData/zh_HK/DayAbbreviations/1=\u9031\u4e00 -FormatData/zh_HK/DayAbbreviations/2=\u9031\u4e8c -FormatData/zh_HK/latn.NumberPatterns/1=\u00a4#,##0.00 +LocaleNames/zh/HK=中国香港特别行政区 +FormatData/zh_HK/MonthNames/0=1月 +FormatData/zh_HK/MonthNames/1=2月 +FormatData/zh_HK/MonthNames/2=3月 +FormatData/zh_HK/MonthNames/3=4月 +FormatData/zh_HK/MonthAbbreviations/0=1月 +FormatData/zh_HK/MonthAbbreviations/1=2月 +FormatData/zh_HK/MonthAbbreviations/2=3月 +FormatData/zh_HK/MonthAbbreviations/3=4月 +FormatData/zh_HK/DayNames/0=星期日 +FormatData/zh_HK/DayNames/1=星期一 +FormatData/zh_HK/DayNames/2=星期二 +FormatData/zh_HK/DayAbbreviations/0=週日 +FormatData/zh_HK/DayAbbreviations/1=週一 +FormatData/zh_HK/DayAbbreviations/2=週二 +FormatData/zh_HK/latn.NumberPatterns/1=¤#,##0.00 CurrencyNames/zh_HK/HKD=HK$ FormatData/zh_HK/TimePatterns/0=ah:mm:ss [zzzz] FormatData/zh_HK/TimePatterns/1=ah:mm:ss [z] FormatData/zh_HK/TimePatterns/2=ah:mm:ss FormatData/zh_HK/TimePatterns/3=ah:mm -FormatData/zh_HK/DatePatterns/0=y\u5e74M\u6708d\u65e5EEEE -FormatData/zh_HK/DatePatterns/1=y\u5e74M\u6708d\u65e5 -FormatData/zh_HK/DatePatterns/2=y\u5e74M\u6708d\u65e5 +FormatData/zh_HK/DatePatterns/0=y年M月d日EEEE +FormatData/zh_HK/DatePatterns/1=y年M月d日 +FormatData/zh_HK/DatePatterns/2=y年M月d日 FormatData/zh_HK/DatePatterns/3=d/M/y FormatData/zh_HK/DateTimePatterns/0={1} {0} #bug #4149569 -LocaleNames/tr/TR=T\u00fcrkiye +LocaleNames/tr/TR=Türkiye #bug 4175306 -FormatData/es_ES/latn.NumberPatterns/1=#,##0.00\u00a0\u00a4 -FormatData/ja_JP/latn.NumberPatterns/1=\u00a4#,##0.00 +FormatData/es_ES/latn.NumberPatterns/1=#,##0.00 ¤ +FormatData/ja_JP/latn.NumberPatterns/1=¤#,##0.00 #bug #4215747 - commented out by mfang due to 4900884 -#FormatData/ko/TimePatterns/0=a h'\uc2dc' m'\ubd84' s'\ucd08' z -#FormatData/ko/TimePatterns/1=a h'\uc2dc' m'\ubd84' s'\ucd08' +#FormatData/ko/TimePatterns/0=a h'시' m'분' s'초' z +#FormatData/ko/TimePatterns/1=a h'시' m'분' s'초' #bug 4900884 -FormatData/ko/TimePatterns/0=a h\uc2dc m\ubd84 s\ucd08 zzzz -FormatData/ko/TimePatterns/1=a h\uc2dc m\ubd84 s\ucd08 z +FormatData/ko/TimePatterns/0=a h시 m분 s초 zzzz +FormatData/ko/TimePatterns/1=a h시 m분 s초 z FormatData/ko/TimePatterns/2=a h:mm:ss FormatData/ko/TimePatterns/3=a h:mm @@ -2415,112 +2415,112 @@ FormatData/ko/TimePatterns/3=a h:mm LocaleNames/es/SV=El Salvador #bug nobugid, 4290801, 4942982 -CurrencyNames/ru_RU/RUB=\u20bd +CurrencyNames/ru_RU/RUB=₽ #bug 4826794 -LocaleNames/ru_RU/MM=\u041c\u044c\u044f\u043d\u043c\u0430 (\u0411\u0438\u0440\u043c\u0430) +LocaleNames/ru_RU/MM=Мьянма (Бирма) #bug 4945388 CurrencyNames/be_BY/BYR=BYR -CurrencyNames/bg_BG/BGN=\u043b\u0432. +CurrencyNames/bg_BG/BGN=лв. #bug 4794068 FormatData/ca_ES/latn.NumberPatterns/0=#,##0.### #bug 5032580 -FormatData/sk/DayNames/0=nede\u013ea +FormatData/sk/DayNames/0=nedeľa FormatData/sk/DayAbbreviations/5=pi #bug 5074431 -FormatData/bg/DayNames/4=\u0447\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a +FormatData/bg/DayNames/4=четвъртък #bug 2121133 -FormatData/sv/latn.NumberElements/1=\u00a0 +FormatData/sv/latn.NumberElements/1=  #bug 6208712 -LocaleNames/zh/tw=\u5951\u7ef4\u8bed +LocaleNames/zh/tw=契维语 #bug 6277696 #zh_SG, id, id_ID, en_MT, mt_MT, en_PH, el, el_CY, ms, ms_MY #zh_SG -FormatData/zh_SG/DayAbbreviations/0=\u5468\u65e5 -FormatData/zh_SG/DayAbbreviations/1=\u5468\u4e00 -FormatData/zh_SG/DayAbbreviations/2=\u5468\u4e8c -FormatData/zh_SG/DayAbbreviations/3=\u5468\u4e09 -FormatData/zh_SG/DayAbbreviations/4=\u5468\u56db -FormatData/zh_SG/DayAbbreviations/5=\u5468\u4e94 -FormatData/zh_SG/DayAbbreviations/6=\u5468\u516d +FormatData/zh_SG/DayAbbreviations/0=周日 +FormatData/zh_SG/DayAbbreviations/1=周一 +FormatData/zh_SG/DayAbbreviations/2=周二 +FormatData/zh_SG/DayAbbreviations/3=周三 +FormatData/zh_SG/DayAbbreviations/4=周四 +FormatData/zh_SG/DayAbbreviations/5=周五 +FormatData/zh_SG/DayAbbreviations/6=周六 FormatData/zh_SG/latn.NumberPatterns/0=#,##0.### -FormatData/zh_SG/latn.NumberPatterns/1=\u00a4#,##0.00 +FormatData/zh_SG/latn.NumberPatterns/1=¤#,##0.00 FormatData/zh_SG/latn.NumberPatterns/2=#,##0% CurrencyNames/zh_SG/SGD=$ FormatData/zh_SG/TimePatterns/0=zzzz ah:mm:ss FormatData/zh_SG/TimePatterns/1=z ah:mm:ss FormatData/zh_SG/TimePatterns/2=ah:mm:ss FormatData/zh_SG/TimePatterns/3=ah:mm -FormatData/zh_SG/DatePatterns/0=y\u5e74M\u6708d\u65e5EEEE -FormatData/zh_SG/DatePatterns/1=y\u5e74M\u6708d\u65e5 -FormatData/zh_SG/DatePatterns/2=y\u5e74M\u6708d\u65e5 +FormatData/zh_SG/DatePatterns/0=y年M月d日EEEE +FormatData/zh_SG/DatePatterns/1=y年M月d日 +FormatData/zh_SG/DatePatterns/2=y年M月d日 FormatData/zh_SG/DatePatterns/3=dd/MM/yy FormatData/zh_SG/DateTimePatterns/0={1} {0} -LocaleNames/zh_SG/ae=\u963f\u7ef4\u65af\u5854\u8bed -LocaleNames/zh_SG/ak=\u963f\u80af\u8bed -LocaleNames/zh_SG/cr=\u514b\u91cc\u8bed -LocaleNames/zh_SG/cu=\u6559\u4f1a\u65af\u62c9\u592b\u8bed -LocaleNames/zh_SG/ff=\u5bcc\u62c9\u8bed -LocaleNames/zh_SG/gv=\u9a6c\u6069\u8bed -LocaleNames/zh_SG/ig=\u4f0a\u535a\u8bed -LocaleNames/zh_SG/ii=\u56db\u5ddd\u5f5d\u8bed -LocaleNames/zh_SG/ko=\u97e9\u8bed -LocaleNames/zh_SG/kw=\u5eb7\u6c83\u5c14\u8bed -LocaleNames/zh_SG/lg=\u5362\u5e72\u8fbe\u8bed -LocaleNames/zh_SG/li=\u6797\u5821\u8bed -LocaleNames/zh_SG/lu=\u9c81\u5df4\u52a0\u4e39\u52a0\u8bed -LocaleNames/zh_SG/nd=\u5317\u6069\u5fb7\u8d1d\u52d2\u8bed -LocaleNames/zh_SG/nr=\u5357\u6069\u5fb7\u8d1d\u52d2\u8bed -LocaleNames/zh_SG/sc=\u8428\u4e01\u8bed -LocaleNames/zh_SG/ty=\u5854\u5e0c\u63d0\u8bed -LocaleNames/zh_SG/AS=\u7f8e\u5c5e\u8428\u6469\u4e9a -LocaleNames/zh_SG/AU=\u6fb3\u5927\u5229\u4e9a -LocaleNames/zh_SG/BD=\u5b5f\u52a0\u62c9\u56fd -LocaleNames/zh_SG/BV=\u5e03\u97e6\u5c9b -LocaleNames/zh_SG/BZ=\u4f2f\u5229\u5179 -LocaleNames/zh_SG/CZ=\u6377\u514b -LocaleNames/zh_SG/ER=\u5384\u7acb\u7279\u91cc\u4e9a -LocaleNames/zh_SG/FK=\u798f\u514b\u5170\u7fa4\u5c9b -LocaleNames/zh_SG/FM=\u5bc6\u514b\u7f57\u5c3c\u897f\u4e9a -LocaleNames/zh_SG/GS=\u5357\u4e54\u6cbb\u4e9a\u548c\u5357\u6851\u5a01\u5947\u7fa4\u5c9b -LocaleNames/zh_SG/GW=\u51e0\u5185\u4e9a\u6bd4\u7ecd -LocaleNames/zh_SG/HK=\u4e2d\u56fd\u9999\u6e2f\u7279\u522b\u884c\u653f\u533a -LocaleNames/zh_SG/HM=\u8d6b\u5fb7\u5c9b\u548c\u9ea6\u514b\u5510\u7eb3\u7fa4\u5c9b -LocaleNames/zh_SG/ID=\u5370\u5ea6\u5c3c\u897f\u4e9a -LocaleNames/zh_SG/KR=\u97e9\u56fd -LocaleNames/zh_SG/LA=\u8001\u631d -LocaleNames/zh_SG/MK=\u5317\u9a6c\u5176\u987f -LocaleNames/zh_SG/MO=\u4e2d\u56fd\u6fb3\u95e8\u7279\u522b\u884c\u653f\u533a -LocaleNames/zh_SG/MP=\u5317\u9a6c\u91cc\u4e9a\u7eb3\u7fa4\u5c9b -LocaleNames/zh_SG/NU=\u7ebd\u57c3 -LocaleNames/zh_SG/NZ=\u65b0\u897f\u5170 -LocaleNames/zh_SG/PF=\u6cd5\u5c5e\u6ce2\u5229\u5c3c\u897f\u4e9a -LocaleNames/zh_SG/PM=\u5723\u76ae\u57c3\u5c14\u548c\u5bc6\u514b\u9686\u7fa4\u5c9b -LocaleNames/zh_SG/PN=\u76ae\u7279\u51ef\u6069\u7fa4\u5c9b -LocaleNames/zh_SG/PR=\u6ce2\u591a\u9ece\u5404 -LocaleNames/zh_SG/PS=\u5df4\u52d2\u65af\u5766\u9886\u571f -LocaleNames/zh_SG/RE=\u7559\u5c3c\u6c6a -LocaleNames/zh_SG/SA=\u6c99\u7279\u963f\u62c9\u4f2f -LocaleNames/zh_SG/SH=\u5723\u8d6b\u52d2\u62ff -LocaleNames/zh_SG/SJ=\u65af\u74e6\u5c14\u5df4\u548c\u626c\u9a6c\u5ef6 -LocaleNames/zh_SG/SL=\u585e\u62c9\u5229\u6602 -LocaleNames/zh_SG/TC=\u7279\u514b\u65af\u548c\u51ef\u79d1\u65af\u7fa4\u5c9b -LocaleNames/zh_SG/TK=\u6258\u514b\u52b3 -LocaleNames/zh_SG/TW=\u53f0\u6e7e -LocaleNames/zh_SG/UM=\u7f8e\u56fd\u672c\u571f\u5916\u5c0f\u5c9b\u5c7f -LocaleNames/zh_SG/WF=\u74e6\u5229\u65af\u548c\u5bcc\u56fe\u7eb3 -LocaleNames/zh_SG/WS=\u8428\u6469\u4e9a -LocaleNames/zh_SG/YT=\u9a6c\u7ea6\u7279 +LocaleNames/zh_SG/ae=阿维斯塔语 +LocaleNames/zh_SG/ak=阿肯语 +LocaleNames/zh_SG/cr=克里语 +LocaleNames/zh_SG/cu=教会斯拉夫语 +LocaleNames/zh_SG/ff=富拉语 +LocaleNames/zh_SG/gv=马恩语 +LocaleNames/zh_SG/ig=伊博语 +LocaleNames/zh_SG/ii=四川彝语 +LocaleNames/zh_SG/ko=韩语 +LocaleNames/zh_SG/kw=康沃尔语 +LocaleNames/zh_SG/lg=卢干达语 +LocaleNames/zh_SG/li=林堡语 +LocaleNames/zh_SG/lu=鲁巴加丹加语 +LocaleNames/zh_SG/nd=北恩德贝勒语 +LocaleNames/zh_SG/nr=南恩德贝勒语 +LocaleNames/zh_SG/sc=萨丁语 +LocaleNames/zh_SG/ty=塔希提语 +LocaleNames/zh_SG/AS=美属萨摩亚 +LocaleNames/zh_SG/AU=澳大利亚 +LocaleNames/zh_SG/BD=孟加拉国 +LocaleNames/zh_SG/BV=布韦岛 +LocaleNames/zh_SG/BZ=伯利兹 +LocaleNames/zh_SG/CZ=捷克 +LocaleNames/zh_SG/ER=厄立特里亚 +LocaleNames/zh_SG/FK=福克兰群岛 +LocaleNames/zh_SG/FM=密克罗尼西亚 +LocaleNames/zh_SG/GS=南乔治亚和南桑威奇群岛 +LocaleNames/zh_SG/GW=几内亚比绍 +LocaleNames/zh_SG/HK=中国香港特别行政区 +LocaleNames/zh_SG/HM=赫德岛和麦克唐纳群岛 +LocaleNames/zh_SG/ID=印度尼西亚 +LocaleNames/zh_SG/KR=韩国 +LocaleNames/zh_SG/LA=老挝 +LocaleNames/zh_SG/MK=北马其顿 +LocaleNames/zh_SG/MO=中国澳门特别行政区 +LocaleNames/zh_SG/MP=北马里亚纳群岛 +LocaleNames/zh_SG/NU=纽埃 +LocaleNames/zh_SG/NZ=新西兰 +LocaleNames/zh_SG/PF=法属波利尼西亚 +LocaleNames/zh_SG/PM=圣皮埃尔和密克隆群岛 +LocaleNames/zh_SG/PN=皮特凯恩群岛 +LocaleNames/zh_SG/PR=波多黎各 +LocaleNames/zh_SG/PS=巴勒斯坦领土 +LocaleNames/zh_SG/RE=留尼汪 +LocaleNames/zh_SG/SA=沙特阿拉伯 +LocaleNames/zh_SG/SH=圣赫勒拿 +LocaleNames/zh_SG/SJ=斯瓦尔巴和扬马延 +LocaleNames/zh_SG/SL=塞拉利昂 +LocaleNames/zh_SG/TC=特克斯和凯科斯群岛 +LocaleNames/zh_SG/TK=托克劳 +LocaleNames/zh_SG/TW=台湾 +LocaleNames/zh_SG/UM=美国本土外小岛屿 +LocaleNames/zh_SG/WF=瓦利斯和富图纳 +LocaleNames/zh_SG/WS=萨摩亚 +LocaleNames/zh_SG/YT=马约特 #en_SG FormatData/en_SG/latn.NumberPatterns/0=#,##0.### -FormatData/en_SG/latn.NumberPatterns/1=\u00a4#,##0.00 +FormatData/en_SG/latn.NumberPatterns/1=¤#,##0.00 FormatData/en_SG/latn.NumberPatterns/2=#,##0% CurrencyNames/en_SG/SGD=$ LocaleNames/en_SG/kj=Kuanyama @@ -2532,14 +2532,14 @@ LocaleNames/en_SG/pa=Punjabi LocaleNames/en_SG/rm=Romansh LocaleNames/en_SG/to=Tongan LocaleNames/en_SG/CC=Cocos (Keeling) Islands -LocaleNames/en_SG/CI=C\u00f4te d\u2019Ivoire +LocaleNames/en_SG/CI=Côte d’Ivoire LocaleNames/en_SG/GS=South Georgia & South Sandwich Islands LocaleNames/en_SG/HM=Heard & McDonald Islands LocaleNames/en_SG/KN=St Kitts & Nevis LocaleNames/en_SG/PM=St Pierre & Miquelon LocaleNames/en_SG/PS=Palestinian Territories LocaleNames/en_SG/SJ=Svalbard & Jan Mayen -LocaleNames/en_SG/ST=S\u00e3o Tom\u00e9 & Pr\u00edncipe +LocaleNames/en_SG/ST=São Tomé & Príncipe LocaleNames/en_SG/TC=Turks & Caicos Islands LocaleNames/en_SG/TL=Timor-Leste LocaleNames/en_SG/VC=St Vincent & the Grenadines @@ -2587,7 +2587,7 @@ FormatData/in/DayAbbreviations/6=Sab FormatData/in/Eras/0=SM FormatData/in/Eras/1=M FormatData/in/latn.NumberPatterns/0=#,##0.### -FormatData/in/latn.NumberPatterns/1=\u00a4#,##0.00 +FormatData/in/latn.NumberPatterns/1=¤#,##0.00 FormatData/in/latn.NumberPatterns/2=#,##0% FormatData/in/latn.NumberElements/0=, FormatData/in/latn.NumberElements/1=. @@ -2597,8 +2597,8 @@ FormatData/in/latn.NumberElements/4=0 FormatData/in/latn.NumberElements/5=# FormatData/in/latn.NumberElements/6=- FormatData/in/latn.NumberElements/7=E -FormatData/in/latn.NumberElements/8=\u2030 -FormatData/in/latn.NumberElements/9=\u221e +FormatData/in/latn.NumberElements/8=‰ +FormatData/in/latn.NumberElements/9=∞ FormatData/in/latn.NumberElements/10=NaN FormatData/in/TimePatterns/0=HH.mm.ss zzzz FormatData/in/TimePatterns/1=HH.mm.ss z @@ -2621,7 +2621,7 @@ FormatData/in_ID/DatePatterns/3=dd/MM/yy FormatData/in_ID/DateTimePatterns/0={1} {0} #en_MT FormatData/en_MT/latn.NumberPatterns/0=#,##0.### -FormatData/en_MT/latn.NumberPatterns/1=\u00a4#,##0.00 +FormatData/en_MT/latn.NumberPatterns/1=¤#,##0.00 FormatData/en_MT/latn.NumberPatterns/2=#,##0% FormatData/en_MT/TimePatterns/0=HH:mm:ss zzzz FormatData/en_MT/TimePatterns/1=HH:mm:ss z @@ -2632,7 +2632,7 @@ FormatData/en_MT/DatePatterns/1=dd MMMM y FormatData/en_MT/DatePatterns/2=dd MMM y FormatData/en_MT/DatePatterns/3=dd/MM/y FormatData/en_MT/DateTimePatterns/0={1}, {0} -CurrencyNames/en_MT/EUR=\u20ac +CurrencyNames/en_MT/EUR=€ LocaleNames/en_MT/kj=Kuanyama LocaleNames/en_MT/kl=Kalaallisut LocaleNames/en_MT/ny=Nyanja @@ -2642,31 +2642,31 @@ LocaleNames/en_MT/pa=Punjabi LocaleNames/en_MT/rm=Romansh LocaleNames/en_MT/to=Tongan LocaleNames/en_MT/CC=Cocos (Keeling) Islands -LocaleNames/en_MT/CI=C\u00f4te d\u2019Ivoire +LocaleNames/en_MT/CI=Côte d’Ivoire LocaleNames/en_MT/GS=South Georgia & South Sandwich Islands LocaleNames/en_MT/HM=Heard & McDonald Islands LocaleNames/en_MT/KN=St Kitts & Nevis LocaleNames/en_MT/PM=St Pierre & Miquelon LocaleNames/en_MT/PS=Palestinian Territories LocaleNames/en_MT/SJ=Svalbard & Jan Mayen -LocaleNames/en_MT/ST=S\u00e3o Tom\u00e9 & Pr\u00edncipe +LocaleNames/en_MT/ST=São Tomé & Príncipe LocaleNames/en_MT/TC=Turks & Caicos Islands LocaleNames/en_MT/TL=Timor-Leste LocaleNames/en_MT/VC=St Vincent & the Grenadines LocaleNames/en_MT/WF=Wallis & Futuna #mt_MT FormatData/mt_MT/latn.NumberPatterns/0=#,##0.### -FormatData/mt_MT/latn.NumberPatterns/1=\u00a4#,##0.00 +FormatData/mt_MT/latn.NumberPatterns/1=¤#,##0.00 FormatData/mt_MT/latn.NumberPatterns/2=#,##0% -CurrencyNames/mt_MT/EUR=\u20ac +CurrencyNames/mt_MT/EUR=€ #en_PH FormatData/en_PH/latn.NumberPatterns/0=#,##0.### -FormatData/en_PH/latn.NumberPatterns/1=\u00a4#,##0.00 +FormatData/en_PH/latn.NumberPatterns/1=¤#,##0.00 FormatData/en_PH/latn.NumberPatterns/2=#,##0% -FormatData/en_PH/TimePatterns/0=h:mm:ss\u202fa zzzz -FormatData/en_PH/TimePatterns/1=h:mm:ss\u202fa z -FormatData/en_PH/TimePatterns/2=h:mm:ss\u202fa -FormatData/en_PH/TimePatterns/3=h:mm\u202fa +FormatData/en_PH/TimePatterns/0=h:mm:ss a zzzz +FormatData/en_PH/TimePatterns/1=h:mm:ss a z +FormatData/en_PH/TimePatterns/2=h:mm:ss a +FormatData/en_PH/TimePatterns/3=h:mm a FormatData/en_PH/DatePatterns/0=EEEE, MMMM d, y FormatData/en_PH/DatePatterns/1=MMMM d, y FormatData/en_PH/DatePatterns/2=MMM d, y @@ -2681,56 +2681,56 @@ LocaleNames/en_PH/pa=Punjabi LocaleNames/en_PH/rm=Romansh LocaleNames/en_PH/to=Tongan LocaleNames/en_PH/CC=Cocos (Keeling) Islands -LocaleNames/en_PH/CI=C\u00f4te d\u2019Ivoire +LocaleNames/en_PH/CI=Côte d’Ivoire LocaleNames/en_PH/GS=South Georgia & South Sandwich Islands LocaleNames/en_PH/HM=Heard & McDonald Islands LocaleNames/en_PH/KN=St. Kitts & Nevis LocaleNames/en_PH/PM=St. Pierre & Miquelon LocaleNames/en_PH/PS=Palestinian Territories LocaleNames/en_PH/SJ=Svalbard & Jan Mayen -LocaleNames/en_PH/ST=S\u00e3o Tom\u00e9 & Pr\u00edncipe +LocaleNames/en_PH/ST=São Tomé & Príncipe #el -FormatData/el/standalone.MonthNames/0=\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2 -FormatData/el/standalone.MonthNames/1=\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2 -FormatData/el/standalone.MonthNames/2=\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2 -FormatData/el/standalone.MonthNames/3=\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2 -FormatData/el/standalone.MonthNames/4=\u039c\u03ac\u03b9\u03bf\u03c2 -FormatData/el/standalone.MonthNames/5=\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2 -FormatData/el/standalone.MonthNames/6=\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2 -FormatData/el/standalone.MonthNames/7=\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2 -FormatData/el/standalone.MonthNames/8=\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2 -FormatData/el/standalone.MonthNames/9=\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2 -FormatData/el/standalone.MonthNames/10=\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2 -FormatData/el/standalone.MonthNames/11=\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2 +FormatData/el/standalone.MonthNames/0=Ιανουάριος +FormatData/el/standalone.MonthNames/1=Φεβρουάριος +FormatData/el/standalone.MonthNames/2=Μάρτιος +FormatData/el/standalone.MonthNames/3=Απρίλιος +FormatData/el/standalone.MonthNames/4=Μάιος +FormatData/el/standalone.MonthNames/5=Ιούνιος +FormatData/el/standalone.MonthNames/6=Ιούλιος +FormatData/el/standalone.MonthNames/7=Αύγουστος +FormatData/el/standalone.MonthNames/8=Σεπτέμβριος +FormatData/el/standalone.MonthNames/9=Οκτώβριος +FormatData/el/standalone.MonthNames/10=Νοέμβριος +FormatData/el/standalone.MonthNames/11=Δεκέμβριος FormatData/el/standalone.MonthNames/12= -FormatData/el/MonthAbbreviations/0=\u0399\u03b1\u03bd -FormatData/el/MonthAbbreviations/1=\u03a6\u03b5\u03b2 -FormatData/el/MonthAbbreviations/2=\u039c\u03b1\u03c1 -FormatData/el/MonthAbbreviations/3=\u0391\u03c0\u03c1 -FormatData/el/MonthAbbreviations/4=\u039c\u03b1\u0390 -FormatData/el/MonthAbbreviations/5=\u0399\u03bf\u03c5\u03bd -FormatData/el/MonthAbbreviations/6=\u0399\u03bf\u03c5\u03bb -FormatData/el/MonthAbbreviations/7=\u0391\u03c5\u03b3 -FormatData/el/MonthAbbreviations/8=\u03a3\u03b5\u03c0 -FormatData/el/MonthAbbreviations/9=\u039f\u03ba\u03c4 -FormatData/el/MonthAbbreviations/10=\u039d\u03bf\u03b5 -FormatData/el/MonthAbbreviations/11=\u0394\u03b5\u03ba -FormatData/el/DayNames/0=\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae -FormatData/el/DayNames/1=\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1 -FormatData/el/DayNames/2=\u03a4\u03c1\u03af\u03c4\u03b7 -FormatData/el/DayNames/3=\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7 -FormatData/el/DayNames/4=\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7 -FormatData/el/DayNames/5=\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae -FormatData/el/DayNames/6=\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf -FormatData/el/DayAbbreviations/0=\u039a\u03c5\u03c1 -FormatData/el/DayAbbreviations/1=\u0394\u03b5\u03c5 -FormatData/el/DayAbbreviations/2=\u03a4\u03c1\u03af -FormatData/el/DayAbbreviations/3=\u03a4\u03b5\u03c4 -FormatData/el/DayAbbreviations/4=\u03a0\u03ad\u03bc -FormatData/el/DayAbbreviations/5=\u03a0\u03b1\u03c1 -FormatData/el/DayAbbreviations/6=\u03a3\u03ac\u03b2 -FormatData/el/AmPmMarkers/0=\u03c0.\u03bc. -FormatData/el/AmPmMarkers/1=\u03bc.\u03bc. +FormatData/el/MonthAbbreviations/0=Ιαν +FormatData/el/MonthAbbreviations/1=Φεβ +FormatData/el/MonthAbbreviations/2=Μαρ +FormatData/el/MonthAbbreviations/3=Απρ +FormatData/el/MonthAbbreviations/4=Μαΐ +FormatData/el/MonthAbbreviations/5=Ιουν +FormatData/el/MonthAbbreviations/6=Ιουλ +FormatData/el/MonthAbbreviations/7=Αυγ +FormatData/el/MonthAbbreviations/8=Σεπ +FormatData/el/MonthAbbreviations/9=Οκτ +FormatData/el/MonthAbbreviations/10=Νοε +FormatData/el/MonthAbbreviations/11=Δεκ +FormatData/el/DayNames/0=Κυριακή +FormatData/el/DayNames/1=Δευτέρα +FormatData/el/DayNames/2=Τρίτη +FormatData/el/DayNames/3=Τετάρτη +FormatData/el/DayNames/4=Πέμπτη +FormatData/el/DayNames/5=Παρασκευή +FormatData/el/DayNames/6=Σάββατο +FormatData/el/DayAbbreviations/0=Κυρ +FormatData/el/DayAbbreviations/1=Δευ +FormatData/el/DayAbbreviations/2=Τρί +FormatData/el/DayAbbreviations/3=Τετ +FormatData/el/DayAbbreviations/4=Πέμ +FormatData/el/DayAbbreviations/5=Παρ +FormatData/el/DayAbbreviations/6=Σάβ +FormatData/el/AmPmMarkers/0=π.μ. +FormatData/el/AmPmMarkers/1=μ.μ. FormatData/el/latn.NumberElements/0=, FormatData/el/latn.NumberElements/1=. FormatData/el/latn.NumberElements/2=; @@ -2739,353 +2739,353 @@ FormatData/el/latn.NumberElements/4=0 FormatData/el/latn.NumberElements/5=# FormatData/el/latn.NumberElements/6=- FormatData/el/latn.NumberElements/7=e -FormatData/el/latn.NumberElements/8=\u2030 -FormatData/el/latn.NumberElements/9=\u221e +FormatData/el/latn.NumberElements/8=‰ +FormatData/el/latn.NumberElements/9=∞ FormatData/el/latn.NumberElements/10=NaN -FormatData/el/TimePatterns/0=h:mm:ss\u202fa zzzz -FormatData/el/TimePatterns/1=h:mm:ss\u202fa z -FormatData/el/TimePatterns/2=h:mm:ss\u202fa -FormatData/el/TimePatterns/3=h:mm\u202fa +FormatData/el/TimePatterns/0=h:mm:ss a zzzz +FormatData/el/TimePatterns/1=h:mm:ss a z +FormatData/el/TimePatterns/2=h:mm:ss a +FormatData/el/TimePatterns/3=h:mm a FormatData/el/DatePatterns/0=EEEE d MMMM y FormatData/el/DatePatterns/1=d MMMM y FormatData/el/DatePatterns/2=d MMM y FormatData/el/DatePatterns/3=d/M/yy FormatData/el/DateTimePatterns/0={1} - {0} -LocaleNames/el/GR=\u0395\u03bb\u03bb\u03ac\u03b4\u03b1 +LocaleNames/el/GR=Ελλάδα #el_CY #bug 6483191 -FormatData/el_CY/MonthNames/0=\u0399\u03b1\u03bd\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5 -FormatData/el_CY/MonthNames/1=\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5 -FormatData/el_CY/MonthNames/2=\u039c\u03b1\u03c1\u03c4\u03af\u03bf\u03c5 -FormatData/el_CY/MonthNames/3=\u0391\u03c0\u03c1\u03b9\u03bb\u03af\u03bf\u03c5 -FormatData/el_CY/MonthNames/4=\u039c\u03b1\u0390\u03bf\u03c5 -FormatData/el_CY/MonthNames/5=\u0399\u03bf\u03c5\u03bd\u03af\u03bf\u03c5 -FormatData/el_CY/MonthNames/6=\u0399\u03bf\u03c5\u03bb\u03af\u03bf\u03c5 -FormatData/el_CY/MonthNames/7=\u0391\u03c5\u03b3\u03bf\u03cd\u03c3\u03c4\u03bf\u03c5 -FormatData/el_CY/MonthNames/8=\u03a3\u03b5\u03c0\u03c4\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5 -FormatData/el_CY/MonthNames/9=\u039f\u03ba\u03c4\u03c9\u03b2\u03c1\u03af\u03bf\u03c5 -FormatData/el_CY/MonthNames/10=\u039d\u03bf\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5 -FormatData/el_CY/MonthNames/11=\u0394\u03b5\u03ba\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5 +FormatData/el_CY/MonthNames/0=Ιανουαρίου +FormatData/el_CY/MonthNames/1=Φεβρουαρίου +FormatData/el_CY/MonthNames/2=Μαρτίου +FormatData/el_CY/MonthNames/3=Απριλίου +FormatData/el_CY/MonthNames/4=Μαΐου +FormatData/el_CY/MonthNames/5=Ιουνίου +FormatData/el_CY/MonthNames/6=Ιουλίου +FormatData/el_CY/MonthNames/7=Αυγούστου +FormatData/el_CY/MonthNames/8=Σεπτεμβρίου +FormatData/el_CY/MonthNames/9=Οκτωβρίου +FormatData/el_CY/MonthNames/10=Νοεμβρίου +FormatData/el_CY/MonthNames/11=Δεκεμβρίου FormatData/el_CY/MonthNames/12= -FormatData/el_CY/AmPmMarkers/0=\u03c0.\u03bc. -FormatData/el_CY/AmPmMarkers/1=\u03bc.\u03bc. -FormatData/el_CY/Eras/0=\u03c0.\u03a7. -FormatData/el_CY/Eras/1=\u03bc.\u03a7. +FormatData/el_CY/AmPmMarkers/0=π.μ. +FormatData/el_CY/AmPmMarkers/1=μ.μ. +FormatData/el_CY/Eras/0=π.Χ. +FormatData/el_CY/Eras/1=μ.Χ. FormatData/el_CY/latn.NumberPatterns/0=#,##0.### -FormatData/el_CY/latn.NumberPatterns/1=#,##0.00\u00a0\u00a4 +FormatData/el_CY/latn.NumberPatterns/1=#,##0.00 ¤ FormatData/el_CY/latn.NumberPatterns/2=#,##0% -FormatData/el_CY/TimePatterns/0=h:mm:ss\u202fa zzzz -FormatData/el_CY/TimePatterns/1=h:mm:ss\u202fa z -FormatData/el_CY/TimePatterns/2=h:mm:ss\u202fa -FormatData/el_CY/TimePatterns/3=h:mm\u202fa +FormatData/el_CY/TimePatterns/0=h:mm:ss a zzzz +FormatData/el_CY/TimePatterns/1=h:mm:ss a z +FormatData/el_CY/TimePatterns/2=h:mm:ss a +FormatData/el_CY/TimePatterns/3=h:mm a FormatData/el_CY/DatePatterns/0=EEEE d MMMM y FormatData/el_CY/DatePatterns/1=d MMMM y FormatData/el_CY/DatePatterns/2=d MMM y FormatData/el_CY/DatePatterns/3=d/M/yy FormatData/el_CY/DateTimePatterns/0={1} - {0} -LocaleNames/el_CY/ar=\u0391\u03c1\u03b1\u03b2\u03b9\u03ba\u03ac -LocaleNames/el_CY/be=\u039b\u03b5\u03c5\u03ba\u03bf\u03c1\u03c9\u03c3\u03b9\u03ba\u03ac -LocaleNames/el_CY/bg=\u0392\u03bf\u03c5\u03bb\u03b3\u03b1\u03c1\u03b9\u03ba\u03ac -LocaleNames/el_CY/bo=\u0398\u03b9\u03b2\u03b5\u03c4\u03b9\u03b1\u03bd\u03ac -LocaleNames/el_CY/bs=\u0392\u03bf\u03c3\u03bd\u03b9\u03b1\u03ba\u03ac -LocaleNames/el_CY/bn=\u0392\u03b5\u03b3\u03b3\u03b1\u03bb\u03b9\u03ba\u03ac -LocaleNames/el_CY/ca=\u039a\u03b1\u03c4\u03b1\u03bb\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/co=\u039a\u03bf\u03c1\u03c3\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/cs=\u03a4\u03c3\u03b5\u03c7\u03b9\u03ba\u03ac -LocaleNames/el_CY/cy=\u039f\u03c5\u03b1\u03bb\u03b9\u03ba\u03ac -LocaleNames/el_CY/da=\u0394\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/de=\u0393\u03b5\u03c1\u03bc\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/el=\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/en=\u0391\u03b3\u03b3\u03bb\u03b9\u03ba\u03ac -LocaleNames/el_CY/es=\u0399\u03c3\u03c0\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/et=\u0395\u03c3\u03b8\u03bf\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/eu=\u0392\u03b1\u03c3\u03ba\u03b9\u03ba\u03ac -LocaleNames/el_CY/fa=\u03a0\u03b5\u03c1\u03c3\u03b9\u03ba\u03ac -LocaleNames/el_CY/fi=\u03a6\u03b9\u03bd\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac -LocaleNames/el_CY/fr=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ac -LocaleNames/el_CY/ga=\u0399\u03c1\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac -LocaleNames/el_CY/gd=\u03a3\u03ba\u03c9\u03c4\u03b9\u03ba\u03ac \u039a\u03b5\u03bb\u03c4\u03b9\u03ba\u03ac -LocaleNames/el_CY/he=\u0395\u03b2\u03c1\u03b1\u03ca\u03ba\u03ac -LocaleNames/el_CY/hi=\u03a7\u03af\u03bd\u03c4\u03b9 -LocaleNames/el_CY/hr=\u039a\u03c1\u03bf\u03b1\u03c4\u03b9\u03ba\u03ac -LocaleNames/el_CY/hu=\u039f\u03c5\u03b3\u03b3\u03c1\u03b9\u03ba\u03ac -LocaleNames/el_CY/hy=\u0391\u03c1\u03bc\u03b5\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/id=\u0399\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03b9\u03b1\u03ba\u03ac -LocaleNames/el_CY/is=\u0399\u03c3\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac -LocaleNames/el_CY/it=\u0399\u03c4\u03b1\u03bb\u03b9\u03ba\u03ac -LocaleNames/el_CY/ja=\u0399\u03b1\u03c0\u03c9\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/ka=\u0393\u03b5\u03c9\u03c1\u03b3\u03b9\u03b1\u03bd\u03ac -LocaleNames/el_CY/ko=\u039a\u03bf\u03c1\u03b5\u03b1\u03c4\u03b9\u03ba\u03ac -LocaleNames/el_CY/la=\u039b\u03b1\u03c4\u03b9\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/lt=\u039b\u03b9\u03b8\u03bf\u03c5\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/lv=\u039b\u03b5\u03c4\u03bf\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/mk=\u03a3\u03bb\u03b1\u03b2\u03bf\u03bc\u03b1\u03ba\u03b5\u03b4\u03bf\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/mn=\u039c\u03bf\u03b3\u03b3\u03bf\u03bb\u03b9\u03ba\u03ac -LocaleNames/el_CY/mt=\u039c\u03b1\u03bb\u03c4\u03b5\u03b6\u03b9\u03ba\u03ac -LocaleNames/el_CY/nl=\u039f\u03bb\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac -LocaleNames/el_CY/no=\u039d\u03bf\u03c1\u03b2\u03b7\u03b3\u03b9\u03ba\u03ac -LocaleNames/el_CY/pl=\u03a0\u03bf\u03bb\u03c9\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/pt=\u03a0\u03bf\u03c1\u03c4\u03bf\u03b3\u03b1\u03bb\u03b9\u03ba\u03ac -LocaleNames/el_CY/ro=\u03a1\u03bf\u03c5\u03bc\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/ru=\u03a1\u03c9\u03c3\u03b9\u03ba\u03ac -LocaleNames/el_CY/sk=\u03a3\u03bb\u03bf\u03b2\u03b1\u03ba\u03b9\u03ba\u03ac -LocaleNames/el_CY/sl=\u03a3\u03bb\u03bf\u03b2\u03b5\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/sq=\u0391\u03bb\u03b2\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/sr=\u03a3\u03b5\u03c1\u03b2\u03b9\u03ba\u03ac -LocaleNames/el_CY/sv=\u03a3\u03bf\u03c5\u03b7\u03b4\u03b9\u03ba\u03ac -LocaleNames/el_CY/th=\u03a4\u03b1\u03ca\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac -LocaleNames/el_CY/tr=\u03a4\u03bf\u03c5\u03c1\u03ba\u03b9\u03ba\u03ac -LocaleNames/el_CY/uk=\u039f\u03c5\u03ba\u03c1\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el_CY/vi=\u0392\u03b9\u03b5\u03c4\u03bd\u03b1\u03bc\u03b9\u03ba\u03ac -LocaleNames/el_CY/yi=\u0393\u03af\u03bd\u03c4\u03b9\u03c2 -LocaleNames/el_CY/zh=\u039a\u03b9\u03bd\u03b5\u03b6\u03b9\u03ba\u03ac -LocaleNames/el_CY/AD=\u0391\u03bd\u03b4\u03cc\u03c1\u03b1 -LocaleNames/el_CY/AE=\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03b1 \u0391\u03c1\u03b1\u03b2\u03b9\u03ba\u03ac \u0395\u03bc\u03b9\u03c1\u03ac\u03c4\u03b1 -LocaleNames/el_CY/AF=\u0391\u03c6\u03b3\u03b1\u03bd\u03b9\u03c3\u03c4\u03ac\u03bd -LocaleNames/el_CY/AG=\u0391\u03bd\u03c4\u03af\u03b3\u03ba\u03bf\u03c5\u03b1 \u03ba\u03b1\u03b9 \u039c\u03c0\u03b1\u03c1\u03bc\u03c0\u03bf\u03cd\u03bd\u03c4\u03b1 -LocaleNames/el_CY/AI=\u0391\u03bd\u03b3\u03ba\u03bf\u03c5\u03af\u03bb\u03b1 -LocaleNames/el_CY/AL=\u0391\u03bb\u03b2\u03b1\u03bd\u03af\u03b1 -LocaleNames/el_CY/AM=\u0391\u03c1\u03bc\u03b5\u03bd\u03af\u03b1 -LocaleNames/el_CY/AO=\u0391\u03b3\u03ba\u03cc\u03bb\u03b1 -LocaleNames/el_CY/AQ=\u0391\u03bd\u03c4\u03b1\u03c1\u03ba\u03c4\u03b9\u03ba\u03ae -LocaleNames/el_CY/AR=\u0391\u03c1\u03b3\u03b5\u03bd\u03c4\u03b9\u03bd\u03ae -LocaleNames/el_CY/AS=\u0391\u03bc\u03b5\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ae \u03a3\u03b1\u03bc\u03cc\u03b1 -LocaleNames/el_CY/AT=\u0391\u03c5\u03c3\u03c4\u03c1\u03af\u03b1 -LocaleNames/el_CY/AU=\u0391\u03c5\u03c3\u03c4\u03c1\u03b1\u03bb\u03af\u03b1 -LocaleNames/el_CY/AW=\u0391\u03c1\u03bf\u03cd\u03bc\u03c0\u03b1 -LocaleNames/el_CY/AX=\u039d\u03ae\u03c3\u03bf\u03b9 \u038c\u03bb\u03b1\u03bd\u03c4 -LocaleNames/el_CY/AZ=\u0391\u03b6\u03b5\u03c1\u03bc\u03c0\u03b1\u03ca\u03c4\u03b6\u03ac\u03bd -LocaleNames/el_CY/BA=\u0392\u03bf\u03c3\u03bd\u03af\u03b1 - \u0395\u03c1\u03b6\u03b5\u03b3\u03bf\u03b2\u03af\u03bd\u03b7 -LocaleNames/el_CY/BB=\u039c\u03c0\u03b1\u03c1\u03bc\u03c0\u03ad\u03b9\u03bd\u03c4\u03bf\u03c2 -LocaleNames/el_CY/BD=\u039c\u03c0\u03b1\u03bd\u03b3\u03ba\u03bb\u03b1\u03bd\u03c4\u03ad\u03c2 -LocaleNames/el_CY/BE=\u0392\u03ad\u03bb\u03b3\u03b9\u03bf -LocaleNames/el_CY/BF=\u039c\u03c0\u03bf\u03c5\u03c1\u03ba\u03af\u03bd\u03b1 \u03a6\u03ac\u03c3\u03bf -LocaleNames/el_CY/BG=\u0392\u03bf\u03c5\u03bb\u03b3\u03b1\u03c1\u03af\u03b1 -LocaleNames/el_CY/BH=\u039c\u03c0\u03b1\u03c7\u03c1\u03ad\u03b9\u03bd -LocaleNames/el_CY/BI=\u039c\u03c0\u03bf\u03c5\u03c1\u03bf\u03cd\u03bd\u03c4\u03b9 -LocaleNames/el_CY/BJ=\u039c\u03c0\u03b5\u03bd\u03af\u03bd -LocaleNames/el_CY/BM=\u0392\u03b5\u03c1\u03bc\u03bf\u03cd\u03b4\u03b5\u03c2 -LocaleNames/el_CY/BN=\u039c\u03c0\u03c1\u03bf\u03c5\u03bd\u03ad\u03b9 -LocaleNames/el_CY/BO=\u0392\u03bf\u03bb\u03b9\u03b2\u03af\u03b1 -LocaleNames/el_CY/BR=\u0392\u03c1\u03b1\u03b6\u03b9\u03bb\u03af\u03b1 -LocaleNames/el_CY/BS=\u039c\u03c0\u03b1\u03c7\u03ac\u03bc\u03b5\u03c2 -LocaleNames/el_CY/BT=\u039c\u03c0\u03bf\u03c5\u03c4\u03ac\u03bd -LocaleNames/el_CY/BV=\u039d\u03ae\u03c3\u03bf\u03c2 \u039c\u03c0\u03bf\u03c5\u03b2\u03ad -LocaleNames/el_CY/BW=\u039c\u03c0\u03bf\u03c4\u03c3\u03bf\u03c5\u03ac\u03bd\u03b1 -LocaleNames/el_CY/BY=\u039b\u03b5\u03c5\u03ba\u03bf\u03c1\u03c9\u03c3\u03af\u03b1 -LocaleNames/el_CY/BZ=\u039c\u03c0\u03b5\u03bb\u03af\u03b6 -LocaleNames/el_CY/CA=\u039a\u03b1\u03bd\u03b1\u03b4\u03ac\u03c2 -LocaleNames/el_CY/CC=\u039d\u03ae\u03c3\u03bf\u03b9 \u039a\u03cc\u03ba\u03bf\u03c2 (\u039a\u03af\u03bb\u03b9\u03bd\u03b3\u03ba) -LocaleNames/el_CY/CD=\u039a\u03bf\u03bd\u03b3\u03ba\u03cc - \u039a\u03b9\u03bd\u03c3\u03ac\u03c3\u03b1 -LocaleNames/el_CY/CF=\u039a\u03b5\u03bd\u03c4\u03c1\u03bf\u03b1\u03c6\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ae \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1 -LocaleNames/el_CY/CG=\u039a\u03bf\u03bd\u03b3\u03ba\u03cc - \u039c\u03c0\u03c1\u03b1\u03b6\u03b1\u03b2\u03af\u03bb -LocaleNames/el_CY/CH=\u0395\u03bb\u03b2\u03b5\u03c4\u03af\u03b1 -LocaleNames/el_CY/CI=\u0391\u03ba\u03c4\u03ae \u0395\u03bb\u03b5\u03c6\u03b1\u03bd\u03c4\u03bf\u03c3\u03c4\u03bf\u03cd -LocaleNames/el_CY/CK=\u039d\u03ae\u03c3\u03bf\u03b9 \u039a\u03bf\u03c5\u03ba -LocaleNames/el_CY/CL=\u03a7\u03b9\u03bb\u03ae -LocaleNames/el_CY/CM=\u039a\u03b1\u03bc\u03b5\u03c1\u03bf\u03cd\u03bd -LocaleNames/el_CY/CN=\u039a\u03af\u03bd\u03b1 -LocaleNames/el_CY/CO=\u039a\u03bf\u03bb\u03bf\u03bc\u03b2\u03af\u03b1 -LocaleNames/el_CY/CR=\u039a\u03cc\u03c3\u03c4\u03b1 \u03a1\u03af\u03ba\u03b1 -LocaleNames/el_CY/CU=\u039a\u03bf\u03cd\u03b2\u03b1 -LocaleNames/el_CY/CV=\u03a0\u03c1\u03ac\u03c3\u03b9\u03bd\u03bf \u0391\u03ba\u03c1\u03c9\u03c4\u03ae\u03c1\u03b9\u03bf -LocaleNames/el_CY/CX=\u039d\u03ae\u03c3\u03bf\u03c2 \u03c4\u03c9\u03bd \u03a7\u03c1\u03b9\u03c3\u03c4\u03bf\u03c5\u03b3\u03ad\u03bd\u03bd\u03c9\u03bd -LocaleNames/el_CY/CY=\u039a\u03cd\u03c0\u03c1\u03bf\u03c2 -LocaleNames/el_CY/CZ=\u03a4\u03c3\u03b5\u03c7\u03af\u03b1 -LocaleNames/el_CY/DE=\u0393\u03b5\u03c1\u03bc\u03b1\u03bd\u03af\u03b1 -LocaleNames/el_CY/DJ=\u03a4\u03b6\u03b9\u03bc\u03c0\u03bf\u03c5\u03c4\u03af -LocaleNames/el_CY/DK=\u0394\u03b1\u03bd\u03af\u03b1 -LocaleNames/el_CY/DM=\u039d\u03c4\u03bf\u03bc\u03af\u03bd\u03b9\u03ba\u03b1 -LocaleNames/el_CY/DO=\u0394\u03bf\u03bc\u03b9\u03bd\u03b9\u03ba\u03b1\u03bd\u03ae \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1 -LocaleNames/el_CY/DZ=\u0391\u03bb\u03b3\u03b5\u03c1\u03af\u03b1 -LocaleNames/el_CY/EC=\u0399\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03cc\u03c2 -LocaleNames/el_CY/EE=\u0395\u03c3\u03b8\u03bf\u03bd\u03af\u03b1 -LocaleNames/el_CY/EG=\u0391\u03af\u03b3\u03c5\u03c0\u03c4\u03bf\u03c2 -LocaleNames/el_CY/EH=\u0394\u03c5\u03c4\u03b9\u03ba\u03ae \u03a3\u03b1\u03c7\u03ac\u03c1\u03b1 -LocaleNames/el_CY/ER=\u0395\u03c1\u03c5\u03b8\u03c1\u03b1\u03af\u03b1 -LocaleNames/el_CY/ES=\u0399\u03c3\u03c0\u03b1\u03bd\u03af\u03b1 -LocaleNames/el_CY/ET=\u0391\u03b9\u03b8\u03b9\u03bf\u03c0\u03af\u03b1 -LocaleNames/el_CY/FI=\u03a6\u03b9\u03bd\u03bb\u03b1\u03bd\u03b4\u03af\u03b1 -LocaleNames/el_CY/FJ=\u03a6\u03af\u03c4\u03b6\u03b9 -LocaleNames/el_CY/FK=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a6\u03cc\u03ba\u03bb\u03b1\u03bd\u03c4 -LocaleNames/el_CY/FM=\u039c\u03b9\u03ba\u03c1\u03bf\u03bd\u03b7\u03c3\u03af\u03b1 -LocaleNames/el_CY/FO=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a6\u03b5\u03c1\u03cc\u03b5\u03c2 -LocaleNames/el_CY/FR=\u0393\u03b1\u03bb\u03bb\u03af\u03b1 -LocaleNames/el_CY/GA=\u0393\u03ba\u03b1\u03bc\u03c0\u03cc\u03bd -LocaleNames/el_CY/GB=\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03bf \u0392\u03b1\u03c3\u03af\u03bb\u03b5\u03b9\u03bf -LocaleNames/el_CY/GD=\u0393\u03c1\u03b5\u03bd\u03ac\u03b4\u03b1 -LocaleNames/el_CY/GE=\u0393\u03b5\u03c9\u03c1\u03b3\u03af\u03b1 -LocaleNames/el_CY/GF=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ae \u0393\u03bf\u03c5\u03b9\u03ac\u03bd\u03b1 -LocaleNames/el_CY/GH=\u0393\u03ba\u03ac\u03bd\u03b1 -LocaleNames/el_CY/GI=\u0393\u03b9\u03b2\u03c1\u03b1\u03bb\u03c4\u03ac\u03c1 -LocaleNames/el_CY/GL=\u0393\u03c1\u03bf\u03b9\u03bb\u03b1\u03bd\u03b4\u03af\u03b1 -LocaleNames/el_CY/GM=\u0393\u03ba\u03ac\u03bc\u03c0\u03b9\u03b1 -LocaleNames/el_CY/GN=\u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1 -LocaleNames/el_CY/GP=\u0393\u03bf\u03c5\u03b1\u03b4\u03b5\u03bb\u03bf\u03cd\u03c0\u03b7 -LocaleNames/el_CY/GQ=\u0399\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03ae \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1 -LocaleNames/el_CY/GS=\u039d\u03ae\u03c3\u03bf\u03b9 \u039d\u03cc\u03c4\u03b9\u03b1 \u0393\u03b5\u03c9\u03c1\u03b3\u03af\u03b1 \u03ba\u03b1\u03b9 \u039d\u03cc\u03c4\u03b9\u03b5\u03c2 \u03a3\u03ac\u03bd\u03c4\u03bf\u03c5\u03b9\u03c4\u03c2 -LocaleNames/el_CY/GT=\u0393\u03bf\u03c5\u03b1\u03c4\u03b5\u03bc\u03ac\u03bb\u03b1 -LocaleNames/el_CY/GU=\u0393\u03ba\u03bf\u03c5\u03ac\u03bc -LocaleNames/el_CY/GW=\u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1 \u039c\u03c0\u03b9\u03c3\u03ac\u03bf\u03c5 -LocaleNames/el_CY/GY=\u0393\u03bf\u03c5\u03b9\u03ac\u03bd\u03b1 -LocaleNames/el_CY/HK=\u03a7\u03bf\u03bd\u03b3\u03ba \u039a\u03bf\u03bd\u03b3\u03ba \u0395\u0394\u03a0 \u039a\u03af\u03bd\u03b1\u03c2 -LocaleNames/el_CY/HM=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a7\u03b5\u03c1\u03bd\u03c4 \u03ba\u03b1\u03b9 \u039c\u03b1\u03ba\u03bd\u03c4\u03cc\u03bd\u03b1\u03bb\u03bd\u03c4 -LocaleNames/el_CY/HN=\u039f\u03bd\u03b4\u03bf\u03cd\u03c1\u03b1 -LocaleNames/el_CY/HR=\u039a\u03c1\u03bf\u03b1\u03c4\u03af\u03b1 -LocaleNames/el_CY/HT=\u0391\u03ca\u03c4\u03ae -LocaleNames/el_CY/HU=\u039f\u03c5\u03b3\u03b3\u03b1\u03c1\u03af\u03b1 -LocaleNames/el_CY/ID=\u0399\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03af\u03b1 -LocaleNames/el_CY/IE=\u0399\u03c1\u03bb\u03b1\u03bd\u03b4\u03af\u03b1 -LocaleNames/el_CY/IL=\u0399\u03c3\u03c1\u03b1\u03ae\u03bb -LocaleNames/el_CY/IN=\u0399\u03bd\u03b4\u03af\u03b1 -LocaleNames/el_CY/IO=\u0392\u03c1\u03b5\u03c4\u03b1\u03bd\u03b9\u03ba\u03ac \u0395\u03b4\u03ac\u03c6\u03b7 \u0399\u03bd\u03b4\u03b9\u03ba\u03bf\u03cd \u03a9\u03ba\u03b5\u03b1\u03bd\u03bf\u03cd -LocaleNames/el_CY/IQ=\u0399\u03c1\u03ac\u03ba -LocaleNames/el_CY/IR=\u0399\u03c1\u03ac\u03bd -LocaleNames/el_CY/IS=\u0399\u03c3\u03bb\u03b1\u03bd\u03b4\u03af\u03b1 -LocaleNames/el_CY/IT=\u0399\u03c4\u03b1\u03bb\u03af\u03b1 -LocaleNames/el_CY/JM=\u03a4\u03b6\u03b1\u03bc\u03ac\u03b9\u03ba\u03b1 -LocaleNames/el_CY/JO=\u0399\u03bf\u03c1\u03b4\u03b1\u03bd\u03af\u03b1 -LocaleNames/el_CY/JP=\u0399\u03b1\u03c0\u03c9\u03bd\u03af\u03b1 -LocaleNames/el_CY/KE=\u039a\u03ad\u03bd\u03c5\u03b1 -LocaleNames/el_CY/KG=\u039a\u03b9\u03c1\u03b3\u03b9\u03c3\u03c4\u03ac\u03bd -LocaleNames/el_CY/KH=\u039a\u03b1\u03bc\u03c0\u03cc\u03c4\u03b6\u03b7 -LocaleNames/el_CY/KI=\u039a\u03b9\u03c1\u03b9\u03bc\u03c0\u03ac\u03c4\u03b9 -LocaleNames/el_CY/KM=\u039a\u03bf\u03bc\u03cc\u03c1\u03b5\u03c2 -LocaleNames/el_CY/KN=\u03a3\u03b5\u03bd \u039a\u03b9\u03c4\u03c2 \u03ba\u03b1\u03b9 \u039d\u03ad\u03b2\u03b9\u03c2 -LocaleNames/el_CY/KP=\u0392\u03cc\u03c1\u03b5\u03b9\u03b1 \u039a\u03bf\u03c1\u03ad\u03b1 -LocaleNames/el_CY/KR=\u039d\u03cc\u03c4\u03b9\u03b1 \u039a\u03bf\u03c1\u03ad\u03b1 -LocaleNames/el_CY/KW=\u039a\u03bf\u03c5\u03b2\u03ad\u03b9\u03c4 -LocaleNames/el_CY/KY=\u039d\u03ae\u03c3\u03bf\u03b9 \u039a\u03ad\u03b9\u03bc\u03b1\u03bd -LocaleNames/el_CY/KZ=\u039a\u03b1\u03b6\u03b1\u03ba\u03c3\u03c4\u03ac\u03bd -LocaleNames/el_CY/LA=\u039b\u03ac\u03bf\u03c2 -LocaleNames/el_CY/LB=\u039b\u03af\u03b2\u03b1\u03bd\u03bf\u03c2 -LocaleNames/el_CY/LC=\u0391\u03b3\u03af\u03b1 \u039b\u03bf\u03c5\u03ba\u03af\u03b1 -LocaleNames/el_CY/LI=\u039b\u03b9\u03c7\u03c4\u03b5\u03bd\u03c3\u03c4\u03ac\u03b9\u03bd -LocaleNames/el_CY/LK=\u03a3\u03c1\u03b9 \u039b\u03ac\u03bd\u03ba\u03b1 -LocaleNames/el_CY/LR=\u039b\u03b9\u03b2\u03b5\u03c1\u03af\u03b1 -LocaleNames/el_CY/LS=\u039b\u03b5\u03c3\u03cc\u03c4\u03bf -LocaleNames/el_CY/LT=\u039b\u03b9\u03b8\u03bf\u03c5\u03b1\u03bd\u03af\u03b1 -LocaleNames/el_CY/LU=\u039b\u03bf\u03c5\u03be\u03b5\u03bc\u03b2\u03bf\u03cd\u03c1\u03b3\u03bf -LocaleNames/el_CY/LV=\u039b\u03b5\u03c4\u03bf\u03bd\u03af\u03b1 -LocaleNames/el_CY/LY=\u039b\u03b9\u03b2\u03cd\u03b7 -LocaleNames/el_CY/MA=\u039c\u03b1\u03c1\u03cc\u03ba\u03bf -LocaleNames/el_CY/MC=\u039c\u03bf\u03bd\u03b1\u03ba\u03cc -LocaleNames/el_CY/MD=\u039c\u03bf\u03bb\u03b4\u03b1\u03b2\u03af\u03b1 -LocaleNames/el_CY/MG=\u039c\u03b1\u03b4\u03b1\u03b3\u03b1\u03c3\u03ba\u03ac\u03c1\u03b7 -LocaleNames/el_CY/MH=\u039d\u03ae\u03c3\u03bf\u03b9 \u039c\u03ac\u03c1\u03c3\u03b1\u03bb -LocaleNames/el_CY/MK=\u0392\u03cc\u03c1\u03b5\u03b9\u03b1 \u039c\u03b1\u03ba\u03b5\u03b4\u03bf\u03bd\u03af\u03b1 -LocaleNames/el_CY/ML=\u039c\u03ac\u03bb\u03b9 -LocaleNames/el_CY/MM=\u039c\u03b9\u03b1\u03bd\u03bc\u03ac\u03c1 (\u0392\u03b9\u03c1\u03bc\u03b1\u03bd\u03af\u03b1) -LocaleNames/el_CY/MN=\u039c\u03bf\u03b3\u03b3\u03bf\u03bb\u03af\u03b1 -LocaleNames/el_CY/MO=\u039c\u03b1\u03ba\u03ac\u03bf \u0395\u0394\u03a0 \u039a\u03af\u03bd\u03b1\u03c2 -LocaleNames/el_CY/MP=\u039d\u03ae\u03c3\u03bf\u03b9 \u0392\u03cc\u03c1\u03b5\u03b9\u03b5\u03c2 \u039c\u03b1\u03c1\u03b9\u03ac\u03bd\u03b5\u03c2 -LocaleNames/el_CY/MQ=\u039c\u03b1\u03c1\u03c4\u03b9\u03bd\u03af\u03ba\u03b1 -LocaleNames/el_CY/MR=\u039c\u03b1\u03c5\u03c1\u03b9\u03c4\u03b1\u03bd\u03af\u03b1 -LocaleNames/el_CY/MS=\u039c\u03bf\u03bd\u03c3\u03b5\u03c1\u03ac\u03c4 -LocaleNames/el_CY/MT=\u039c\u03ac\u03bb\u03c4\u03b1 -LocaleNames/el_CY/MU=\u039c\u03b1\u03c5\u03c1\u03af\u03ba\u03b9\u03bf\u03c2 -LocaleNames/el_CY/MV=\u039c\u03b1\u03bb\u03b4\u03af\u03b2\u03b5\u03c2 -LocaleNames/el_CY/MW=\u039c\u03b1\u03bb\u03ac\u03bf\u03c5\u03b9 -LocaleNames/el_CY/MX=\u039c\u03b5\u03be\u03b9\u03ba\u03cc -LocaleNames/el_CY/MY=\u039c\u03b1\u03bb\u03b1\u03b9\u03c3\u03af\u03b1 -LocaleNames/el_CY/MZ=\u039c\u03bf\u03b6\u03b1\u03bc\u03b2\u03af\u03ba\u03b7 -LocaleNames/el_CY/NA=\u039d\u03b1\u03bc\u03af\u03bc\u03c0\u03b9\u03b1 -LocaleNames/el_CY/NC=\u039d\u03ad\u03b1 \u039a\u03b1\u03bb\u03b7\u03b4\u03bf\u03bd\u03af\u03b1 -LocaleNames/el_CY/NE=\u039d\u03af\u03b3\u03b7\u03c1\u03b1\u03c2 -LocaleNames/el_CY/NF=\u039d\u03ae\u03c3\u03bf\u03c2 \u039d\u03cc\u03c1\u03c6\u03bf\u03bb\u03ba -LocaleNames/el_CY/NG=\u039d\u03b9\u03b3\u03b7\u03c1\u03af\u03b1 -LocaleNames/el_CY/NI=\u039d\u03b9\u03ba\u03b1\u03c1\u03ac\u03b3\u03bf\u03c5\u03b1 -LocaleNames/el_CY/NL=\u039a\u03ac\u03c4\u03c9 \u03a7\u03ce\u03c1\u03b5\u03c2 -LocaleNames/el_CY/NO=\u039d\u03bf\u03c1\u03b2\u03b7\u03b3\u03af\u03b1 -LocaleNames/el_CY/NP=\u039d\u03b5\u03c0\u03ac\u03bb -LocaleNames/el_CY/NR=\u039d\u03b1\u03bf\u03c5\u03c1\u03bf\u03cd -LocaleNames/el_CY/NU=\u039d\u03b9\u03bf\u03cd\u03b5 -LocaleNames/el_CY/NZ=\u039d\u03ad\u03b1 \u0396\u03b7\u03bb\u03b1\u03bd\u03b4\u03af\u03b1 -LocaleNames/el_CY/OM=\u039f\u03bc\u03ac\u03bd -LocaleNames/el_CY/PA=\u03a0\u03b1\u03bd\u03b1\u03bc\u03ac\u03c2 -LocaleNames/el_CY/PE=\u03a0\u03b5\u03c1\u03bf\u03cd -LocaleNames/el_CY/PF=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ae \u03a0\u03bf\u03bb\u03c5\u03bd\u03b7\u03c3\u03af\u03b1 -LocaleNames/el_CY/PG=\u03a0\u03b1\u03c0\u03bf\u03cd\u03b1 \u039d\u03ad\u03b1 \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1 -LocaleNames/el_CY/PH=\u03a6\u03b9\u03bb\u03b9\u03c0\u03c0\u03af\u03bd\u03b5\u03c2 -LocaleNames/el_CY/PK=\u03a0\u03b1\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd -LocaleNames/el_CY/PL=\u03a0\u03bf\u03bb\u03c9\u03bd\u03af\u03b1 -LocaleNames/el_CY/PM=\u03a3\u03b5\u03bd \u03a0\u03b9\u03b5\u03c1 \u03ba\u03b1\u03b9 \u039c\u03b9\u03ba\u03b5\u03bb\u03cc\u03bd -LocaleNames/el_CY/PN=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a0\u03af\u03c4\u03ba\u03b5\u03c1\u03bd -LocaleNames/el_CY/PR=\u03a0\u03bf\u03c5\u03ad\u03c1\u03c4\u03bf \u03a1\u03af\u03ba\u03bf -LocaleNames/el_CY/PS=\u03a0\u03b1\u03bb\u03b1\u03b9\u03c3\u03c4\u03b9\u03bd\u03b9\u03b1\u03ba\u03ac \u0395\u03b4\u03ac\u03c6\u03b7 -LocaleNames/el_CY/PT=\u03a0\u03bf\u03c1\u03c4\u03bf\u03b3\u03b1\u03bb\u03af\u03b1 -LocaleNames/el_CY/PW=\u03a0\u03b1\u03bb\u03ac\u03bf\u03c5 -LocaleNames/el_CY/PY=\u03a0\u03b1\u03c1\u03b1\u03b3\u03bf\u03c5\u03ac\u03b7 -LocaleNames/el_CY/QA=\u039a\u03b1\u03c4\u03ac\u03c1 -LocaleNames/el_CY/RE=\u03a1\u03b5\u03ca\u03bd\u03b9\u03cc\u03bd -LocaleNames/el_CY/RO=\u03a1\u03bf\u03c5\u03bc\u03b1\u03bd\u03af\u03b1 -LocaleNames/el_CY/RU=\u03a1\u03c9\u03c3\u03af\u03b1 -LocaleNames/el_CY/RW=\u03a1\u03bf\u03c5\u03ac\u03bd\u03c4\u03b1 -LocaleNames/el_CY/SA=\u03a3\u03b1\u03bf\u03c5\u03b4\u03b9\u03ba\u03ae \u0391\u03c1\u03b1\u03b2\u03af\u03b1 -LocaleNames/el_CY/SB=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a3\u03bf\u03bb\u03bf\u03bc\u03ce\u03bd\u03c4\u03bf\u03c2 -LocaleNames/el_CY/SC=\u03a3\u03b5\u03cb\u03c7\u03ad\u03bb\u03bb\u03b5\u03c2 -LocaleNames/el_CY/SD=\u03a3\u03bf\u03c5\u03b4\u03ac\u03bd -LocaleNames/el_CY/SE=\u03a3\u03bf\u03c5\u03b7\u03b4\u03af\u03b1 -LocaleNames/el_CY/SG=\u03a3\u03b9\u03b3\u03ba\u03b1\u03c0\u03bf\u03cd\u03c1\u03b7 -LocaleNames/el_CY/SH=\u0391\u03b3\u03af\u03b1 \u0395\u03bb\u03ad\u03bd\u03b7 -LocaleNames/el_CY/SI=\u03a3\u03bb\u03bf\u03b2\u03b5\u03bd\u03af\u03b1 -LocaleNames/el_CY/SJ=\u03a3\u03b2\u03ac\u03bb\u03bc\u03c0\u03b1\u03c1\u03bd\u03c4 \u03ba\u03b1\u03b9 \u0393\u03b9\u03b1\u03bd \u039c\u03b1\u03b3\u03b9\u03ad\u03bd -LocaleNames/el_CY/SK=\u03a3\u03bb\u03bf\u03b2\u03b1\u03ba\u03af\u03b1 -LocaleNames/el_CY/SL=\u03a3\u03b9\u03ad\u03c1\u03b1 \u039b\u03b5\u03cc\u03bd\u03b5 -LocaleNames/el_CY/SM=\u0386\u03b3\u03b9\u03bf\u03c2 \u039c\u03b1\u03c1\u03af\u03bd\u03bf\u03c2 -LocaleNames/el_CY/SN=\u03a3\u03b5\u03bd\u03b5\u03b3\u03ac\u03bb\u03b7 -LocaleNames/el_CY/SO=\u03a3\u03bf\u03bc\u03b1\u03bb\u03af\u03b1 -LocaleNames/el_CY/SR=\u03a3\u03bf\u03c5\u03c1\u03b9\u03bd\u03ac\u03bc -LocaleNames/el_CY/ST=\u03a3\u03ac\u03bf \u03a4\u03bf\u03bc\u03ad \u03ba\u03b1\u03b9 \u03a0\u03c1\u03af\u03bd\u03c3\u03b9\u03c0\u03b5 -LocaleNames/el_CY/SV=\u0395\u03bb \u03a3\u03b1\u03bb\u03b2\u03b1\u03b4\u03cc\u03c1 -LocaleNames/el_CY/SY=\u03a3\u03c5\u03c1\u03af\u03b1 -LocaleNames/el_CY/SZ=\u0395\u03c3\u03bf\u03c5\u03b1\u03c4\u03af\u03bd\u03b9 -LocaleNames/el_CY/TC=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a4\u03b5\u03c1\u03ba\u03c2 \u03ba\u03b1\u03b9 \u039a\u03ac\u03b9\u03ba\u03bf\u03c2 -LocaleNames/el_CY/TD=\u03a4\u03c3\u03b1\u03bd\u03c4 -LocaleNames/el_CY/TF=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ac \u039d\u03cc\u03c4\u03b9\u03b1 \u0395\u03b4\u03ac\u03c6\u03b7 -LocaleNames/el_CY/TG=\u03a4\u03cc\u03b3\u03ba\u03bf -LocaleNames/el_CY/TH=\u03a4\u03b1\u03ca\u03bb\u03ac\u03bd\u03b4\u03b7 -LocaleNames/el_CY/TJ=\u03a4\u03b1\u03c4\u03b6\u03b9\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd -LocaleNames/el_CY/TK=\u03a4\u03bf\u03ba\u03b5\u03bb\u03ac\u03bf\u03c5 -LocaleNames/el_CY/TL=\u03a4\u03b9\u03bc\u03cc\u03c1-\u039b\u03ad\u03c3\u03c4\u03b5 -LocaleNames/el_CY/TM=\u03a4\u03bf\u03c5\u03c1\u03ba\u03bc\u03b5\u03bd\u03b9\u03c3\u03c4\u03ac\u03bd -LocaleNames/el_CY/TN=\u03a4\u03c5\u03bd\u03b7\u03c3\u03af\u03b1 -LocaleNames/el_CY/TO=\u03a4\u03cc\u03bd\u03b3\u03ba\u03b1 -LocaleNames/el_CY/TR=\u03a4\u03bf\u03c5\u03c1\u03ba\u03af\u03b1 -LocaleNames/el_CY/TT=\u03a4\u03c1\u03b9\u03bd\u03b9\u03bd\u03c4\u03ac\u03bd\u03c4 \u03ba\u03b1\u03b9 \u03a4\u03bf\u03bc\u03c0\u03ac\u03b3\u03ba\u03bf -LocaleNames/el_CY/TV=\u03a4\u03bf\u03c5\u03b2\u03b1\u03bb\u03bf\u03cd -LocaleNames/el_CY/TW=\u03a4\u03b1\u03ca\u03b2\u03ac\u03bd -LocaleNames/el_CY/TZ=\u03a4\u03b1\u03bd\u03b6\u03b1\u03bd\u03af\u03b1 -LocaleNames/el_CY/UA=\u039f\u03c5\u03ba\u03c1\u03b1\u03bd\u03af\u03b1 -LocaleNames/el_CY/UG=\u039f\u03c5\u03b3\u03ba\u03ac\u03bd\u03c4\u03b1 -LocaleNames/el_CY/UM=\u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b5\u03c2 \u039d\u03b7\u03c3\u03af\u03b4\u03b5\u03c2 \u0397\u03a0\u0391 -LocaleNames/el_CY/US=\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03b5\u03c2 \u03a0\u03bf\u03bb\u03b9\u03c4\u03b5\u03af\u03b5\u03c2 -LocaleNames/el_CY/UY=\u039f\u03c5\u03c1\u03bf\u03c5\u03b3\u03bf\u03c5\u03ac\u03b7 -LocaleNames/el_CY/UZ=\u039f\u03c5\u03b6\u03bc\u03c0\u03b5\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd -LocaleNames/el_CY/VA=\u0392\u03b1\u03c4\u03b9\u03ba\u03b1\u03bd\u03cc -LocaleNames/el_CY/VC=\u0386\u03b3\u03b9\u03bf\u03c2 \u0392\u03b9\u03ba\u03ad\u03bd\u03c4\u03b9\u03bf\u03c2 \u03ba\u03b1\u03b9 \u0393\u03c1\u03b5\u03bd\u03b1\u03b4\u03af\u03bd\u03b5\u03c2 -LocaleNames/el_CY/VE=\u0392\u03b5\u03bd\u03b5\u03b6\u03bf\u03c5\u03ad\u03bb\u03b1 -LocaleNames/el_CY/VG=\u0392\u03c1\u03b5\u03c4\u03b1\u03bd\u03b9\u03ba\u03ad\u03c2 \u03a0\u03b1\u03c1\u03b8\u03ad\u03bd\u03b5\u03c2 \u039d\u03ae\u03c3\u03bf\u03b9 -LocaleNames/el_CY/VI=\u0391\u03bc\u03b5\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ad\u03c2 \u03a0\u03b1\u03c1\u03b8\u03ad\u03bd\u03b5\u03c2 \u039d\u03ae\u03c3\u03bf\u03b9 -LocaleNames/el_CY/VN=\u0392\u03b9\u03b5\u03c4\u03bd\u03ac\u03bc -LocaleNames/el_CY/VU=\u0392\u03b1\u03bd\u03bf\u03c5\u03ac\u03c4\u03bf\u03c5 -LocaleNames/el_CY/WF=\u0393\u03bf\u03c5\u03ac\u03bb\u03b9\u03c2 \u03ba\u03b1\u03b9 \u03a6\u03bf\u03c5\u03c4\u03bf\u03cd\u03bd\u03b1 -LocaleNames/el_CY/WS=\u03a3\u03b1\u03bc\u03cc\u03b1 -LocaleNames/el_CY/YE=\u03a5\u03b5\u03bc\u03ad\u03bd\u03b7 -LocaleNames/el_CY/YT=\u039c\u03b1\u03b3\u03b9\u03cc\u03c4 -LocaleNames/el_CY/ZA=\u039d\u03cc\u03c4\u03b9\u03b1 \u0391\u03c6\u03c1\u03b9\u03ba\u03ae -LocaleNames/el_CY/ZM=\u0396\u03ac\u03bc\u03c0\u03b9\u03b1 -LocaleNames/el_CY/ZW=\u0396\u03b9\u03bc\u03c0\u03ac\u03bc\u03c0\u03bf\u03c5\u03b5 -CurrencyNames/el_CY/EUR=\u20ac +LocaleNames/el_CY/ar=Αραβικά +LocaleNames/el_CY/be=Λευκορωσικά +LocaleNames/el_CY/bg=Βουλγαρικά +LocaleNames/el_CY/bo=Θιβετιανά +LocaleNames/el_CY/bs=Βοσνιακά +LocaleNames/el_CY/bn=Βεγγαλικά +LocaleNames/el_CY/ca=Καταλανικά +LocaleNames/el_CY/co=Κορσικανικά +LocaleNames/el_CY/cs=Τσεχικά +LocaleNames/el_CY/cy=Ουαλικά +LocaleNames/el_CY/da=Δανικά +LocaleNames/el_CY/de=Γερμανικά +LocaleNames/el_CY/el=Ελληνικά +LocaleNames/el_CY/en=Αγγλικά +LocaleNames/el_CY/es=Ισπανικά +LocaleNames/el_CY/et=Εσθονικά +LocaleNames/el_CY/eu=Βασκικά +LocaleNames/el_CY/fa=Περσικά +LocaleNames/el_CY/fi=Φινλανδικά +LocaleNames/el_CY/fr=Γαλλικά +LocaleNames/el_CY/ga=Ιρλανδικά +LocaleNames/el_CY/gd=Σκωτικά Κελτικά +LocaleNames/el_CY/he=Εβραϊκά +LocaleNames/el_CY/hi=Χίντι +LocaleNames/el_CY/hr=Κροατικά +LocaleNames/el_CY/hu=Ουγγρικά +LocaleNames/el_CY/hy=Αρμενικά +LocaleNames/el_CY/id=Ινδονησιακά +LocaleNames/el_CY/is=Ισλανδικά +LocaleNames/el_CY/it=Ιταλικά +LocaleNames/el_CY/ja=Ιαπωνικά +LocaleNames/el_CY/ka=Γεωργιανά +LocaleNames/el_CY/ko=Κορεατικά +LocaleNames/el_CY/la=Λατινικά +LocaleNames/el_CY/lt=Λιθουανικά +LocaleNames/el_CY/lv=Λετονικά +LocaleNames/el_CY/mk=Σλαβομακεδονικά +LocaleNames/el_CY/mn=Μογγολικά +LocaleNames/el_CY/mt=Μαλτεζικά +LocaleNames/el_CY/nl=Ολλανδικά +LocaleNames/el_CY/no=Νορβηγικά +LocaleNames/el_CY/pl=Πολωνικά +LocaleNames/el_CY/pt=Πορτογαλικά +LocaleNames/el_CY/ro=Ρουμανικά +LocaleNames/el_CY/ru=Ρωσικά +LocaleNames/el_CY/sk=Σλοβακικά +LocaleNames/el_CY/sl=Σλοβενικά +LocaleNames/el_CY/sq=Αλβανικά +LocaleNames/el_CY/sr=Σερβικά +LocaleNames/el_CY/sv=Σουηδικά +LocaleNames/el_CY/th=Ταϊλανδικά +LocaleNames/el_CY/tr=Τουρκικά +LocaleNames/el_CY/uk=Ουκρανικά +LocaleNames/el_CY/vi=Βιετναμικά +LocaleNames/el_CY/yi=Γίντις +LocaleNames/el_CY/zh=Κινεζικά +LocaleNames/el_CY/AD=Ανδόρα +LocaleNames/el_CY/AE=Ηνωμένα Αραβικά Εμιράτα +LocaleNames/el_CY/AF=Αφγανιστάν +LocaleNames/el_CY/AG=Αντίγκουα και Μπαρμπούντα +LocaleNames/el_CY/AI=Ανγκουίλα +LocaleNames/el_CY/AL=Αλβανία +LocaleNames/el_CY/AM=Αρμενία +LocaleNames/el_CY/AO=Αγκόλα +LocaleNames/el_CY/AQ=Ανταρκτική +LocaleNames/el_CY/AR=Αργεντινή +LocaleNames/el_CY/AS=Αμερικανική Σαμόα +LocaleNames/el_CY/AT=Αυστρία +LocaleNames/el_CY/AU=Αυστραλία +LocaleNames/el_CY/AW=Αρούμπα +LocaleNames/el_CY/AX=Νήσοι Όλαντ +LocaleNames/el_CY/AZ=Αζερμπαϊτζάν +LocaleNames/el_CY/BA=Βοσνία - Ερζεγοβίνη +LocaleNames/el_CY/BB=Μπαρμπέιντος +LocaleNames/el_CY/BD=Μπανγκλαντές +LocaleNames/el_CY/BE=Βέλγιο +LocaleNames/el_CY/BF=Μπουρκίνα Φάσο +LocaleNames/el_CY/BG=Βουλγαρία +LocaleNames/el_CY/BH=Μπαχρέιν +LocaleNames/el_CY/BI=Μπουρούντι +LocaleNames/el_CY/BJ=Μπενίν +LocaleNames/el_CY/BM=Βερμούδες +LocaleNames/el_CY/BN=Μπρουνέι +LocaleNames/el_CY/BO=Βολιβία +LocaleNames/el_CY/BR=Βραζιλία +LocaleNames/el_CY/BS=Μπαχάμες +LocaleNames/el_CY/BT=Μπουτάν +LocaleNames/el_CY/BV=Νήσος Μπουβέ +LocaleNames/el_CY/BW=Μποτσουάνα +LocaleNames/el_CY/BY=Λευκορωσία +LocaleNames/el_CY/BZ=Μπελίζ +LocaleNames/el_CY/CA=Καναδάς +LocaleNames/el_CY/CC=Νήσοι Κόκος (Κίλινγκ) +LocaleNames/el_CY/CD=Κονγκό - Κινσάσα +LocaleNames/el_CY/CF=Κεντροαφρικανική Δημοκρατία +LocaleNames/el_CY/CG=Κονγκό - Μπραζαβίλ +LocaleNames/el_CY/CH=Ελβετία +LocaleNames/el_CY/CI=Ακτή Ελεφαντοστού +LocaleNames/el_CY/CK=Νήσοι Κουκ +LocaleNames/el_CY/CL=Χιλή +LocaleNames/el_CY/CM=Καμερούν +LocaleNames/el_CY/CN=Κίνα +LocaleNames/el_CY/CO=Κολομβία +LocaleNames/el_CY/CR=Κόστα Ρίκα +LocaleNames/el_CY/CU=Κούβα +LocaleNames/el_CY/CV=Πράσινο Ακρωτήριο +LocaleNames/el_CY/CX=Νήσος των Χριστουγέννων +LocaleNames/el_CY/CY=Κύπρος +LocaleNames/el_CY/CZ=Τσεχία +LocaleNames/el_CY/DE=Γερμανία +LocaleNames/el_CY/DJ=Τζιμπουτί +LocaleNames/el_CY/DK=Δανία +LocaleNames/el_CY/DM=Ντομίνικα +LocaleNames/el_CY/DO=Δομινικανή Δημοκρατία +LocaleNames/el_CY/DZ=Αλγερία +LocaleNames/el_CY/EC=Ισημερινός +LocaleNames/el_CY/EE=Εσθονία +LocaleNames/el_CY/EG=Αίγυπτος +LocaleNames/el_CY/EH=Δυτική Σαχάρα +LocaleNames/el_CY/ER=Ερυθραία +LocaleNames/el_CY/ES=Ισπανία +LocaleNames/el_CY/ET=Αιθιοπία +LocaleNames/el_CY/FI=Φινλανδία +LocaleNames/el_CY/FJ=Φίτζι +LocaleNames/el_CY/FK=Νήσοι Φόκλαντ +LocaleNames/el_CY/FM=Μικρονησία +LocaleNames/el_CY/FO=Νήσοι Φερόες +LocaleNames/el_CY/FR=Γαλλία +LocaleNames/el_CY/GA=Γκαμπόν +LocaleNames/el_CY/GB=Ηνωμένο Βασίλειο +LocaleNames/el_CY/GD=Γρενάδα +LocaleNames/el_CY/GE=Γεωργία +LocaleNames/el_CY/GF=Γαλλική Γουιάνα +LocaleNames/el_CY/GH=Γκάνα +LocaleNames/el_CY/GI=Γιβραλτάρ +LocaleNames/el_CY/GL=Γροιλανδία +LocaleNames/el_CY/GM=Γκάμπια +LocaleNames/el_CY/GN=Γουινέα +LocaleNames/el_CY/GP=Γουαδελούπη +LocaleNames/el_CY/GQ=Ισημερινή Γουινέα +LocaleNames/el_CY/GS=Νήσοι Νότια Γεωργία και Νότιες Σάντουιτς +LocaleNames/el_CY/GT=Γουατεμάλα +LocaleNames/el_CY/GU=Γκουάμ +LocaleNames/el_CY/GW=Γουινέα Μπισάου +LocaleNames/el_CY/GY=Γουιάνα +LocaleNames/el_CY/HK=Χονγκ Κονγκ ΕΔΠ Κίνας +LocaleNames/el_CY/HM=Νήσοι Χερντ και Μακντόναλντ +LocaleNames/el_CY/HN=Ονδούρα +LocaleNames/el_CY/HR=Κροατία +LocaleNames/el_CY/HT=Αϊτή +LocaleNames/el_CY/HU=Ουγγαρία +LocaleNames/el_CY/ID=Ινδονησία +LocaleNames/el_CY/IE=Ιρλανδία +LocaleNames/el_CY/IL=Ισραήλ +LocaleNames/el_CY/IN=Ινδία +LocaleNames/el_CY/IO=Βρετανικά Εδάφη Ινδικού Ωκεανού +LocaleNames/el_CY/IQ=Ιράκ +LocaleNames/el_CY/IR=Ιράν +LocaleNames/el_CY/IS=Ισλανδία +LocaleNames/el_CY/IT=Ιταλία +LocaleNames/el_CY/JM=Τζαμάικα +LocaleNames/el_CY/JO=Ιορδανία +LocaleNames/el_CY/JP=Ιαπωνία +LocaleNames/el_CY/KE=Κένυα +LocaleNames/el_CY/KG=Κιργιστάν +LocaleNames/el_CY/KH=Καμπότζη +LocaleNames/el_CY/KI=Κιριμπάτι +LocaleNames/el_CY/KM=Κομόρες +LocaleNames/el_CY/KN=Σεν Κιτς και Νέβις +LocaleNames/el_CY/KP=Βόρεια Κορέα +LocaleNames/el_CY/KR=Νότια Κορέα +LocaleNames/el_CY/KW=Κουβέιτ +LocaleNames/el_CY/KY=Νήσοι Κέιμαν +LocaleNames/el_CY/KZ=Καζακστάν +LocaleNames/el_CY/LA=Λάος +LocaleNames/el_CY/LB=Λίβανος +LocaleNames/el_CY/LC=Αγία Λουκία +LocaleNames/el_CY/LI=Λιχτενστάιν +LocaleNames/el_CY/LK=Σρι Λάνκα +LocaleNames/el_CY/LR=Λιβερία +LocaleNames/el_CY/LS=Λεσότο +LocaleNames/el_CY/LT=Λιθουανία +LocaleNames/el_CY/LU=Λουξεμβούργο +LocaleNames/el_CY/LV=Λετονία +LocaleNames/el_CY/LY=Λιβύη +LocaleNames/el_CY/MA=Μαρόκο +LocaleNames/el_CY/MC=Μονακό +LocaleNames/el_CY/MD=Μολδαβία +LocaleNames/el_CY/MG=Μαδαγασκάρη +LocaleNames/el_CY/MH=Νήσοι Μάρσαλ +LocaleNames/el_CY/MK=Βόρεια Μακεδονία +LocaleNames/el_CY/ML=Μάλι +LocaleNames/el_CY/MM=Μιανμάρ (Βιρμανία) +LocaleNames/el_CY/MN=Μογγολία +LocaleNames/el_CY/MO=Μακάο ΕΔΠ Κίνας +LocaleNames/el_CY/MP=Νήσοι Βόρειες Μαριάνες +LocaleNames/el_CY/MQ=Μαρτινίκα +LocaleNames/el_CY/MR=Μαυριτανία +LocaleNames/el_CY/MS=Μονσεράτ +LocaleNames/el_CY/MT=Μάλτα +LocaleNames/el_CY/MU=Μαυρίκιος +LocaleNames/el_CY/MV=Μαλδίβες +LocaleNames/el_CY/MW=Μαλάουι +LocaleNames/el_CY/MX=Μεξικό +LocaleNames/el_CY/MY=Μαλαισία +LocaleNames/el_CY/MZ=Μοζαμβίκη +LocaleNames/el_CY/NA=Ναμίμπια +LocaleNames/el_CY/NC=Νέα Καληδονία +LocaleNames/el_CY/NE=Νίγηρας +LocaleNames/el_CY/NF=Νήσος Νόρφολκ +LocaleNames/el_CY/NG=Νιγηρία +LocaleNames/el_CY/NI=Νικαράγουα +LocaleNames/el_CY/NL=Κάτω Χώρες +LocaleNames/el_CY/NO=Νορβηγία +LocaleNames/el_CY/NP=Νεπάλ +LocaleNames/el_CY/NR=Ναουρού +LocaleNames/el_CY/NU=Νιούε +LocaleNames/el_CY/NZ=Νέα Ζηλανδία +LocaleNames/el_CY/OM=Ομάν +LocaleNames/el_CY/PA=Παναμάς +LocaleNames/el_CY/PE=Περού +LocaleNames/el_CY/PF=Γαλλική Πολυνησία +LocaleNames/el_CY/PG=Παπούα Νέα Γουινέα +LocaleNames/el_CY/PH=Φιλιππίνες +LocaleNames/el_CY/PK=Πακιστάν +LocaleNames/el_CY/PL=Πολωνία +LocaleNames/el_CY/PM=Σεν Πιερ και Μικελόν +LocaleNames/el_CY/PN=Νήσοι Πίτκερν +LocaleNames/el_CY/PR=Πουέρτο Ρίκο +LocaleNames/el_CY/PS=Παλαιστινιακά Εδάφη +LocaleNames/el_CY/PT=Πορτογαλία +LocaleNames/el_CY/PW=Παλάου +LocaleNames/el_CY/PY=Παραγουάη +LocaleNames/el_CY/QA=Κατάρ +LocaleNames/el_CY/RE=Ρεϊνιόν +LocaleNames/el_CY/RO=Ρουμανία +LocaleNames/el_CY/RU=Ρωσία +LocaleNames/el_CY/RW=Ρουάντα +LocaleNames/el_CY/SA=Σαουδική Αραβία +LocaleNames/el_CY/SB=Νήσοι Σολομώντος +LocaleNames/el_CY/SC=Σεϋχέλλες +LocaleNames/el_CY/SD=Σουδάν +LocaleNames/el_CY/SE=Σουηδία +LocaleNames/el_CY/SG=Σιγκαπούρη +LocaleNames/el_CY/SH=Αγία Ελένη +LocaleNames/el_CY/SI=Σλοβενία +LocaleNames/el_CY/SJ=Σβάλμπαρντ και Γιαν Μαγιέν +LocaleNames/el_CY/SK=Σλοβακία +LocaleNames/el_CY/SL=Σιέρα Λεόνε +LocaleNames/el_CY/SM=Άγιος Μαρίνος +LocaleNames/el_CY/SN=Σενεγάλη +LocaleNames/el_CY/SO=Σομαλία +LocaleNames/el_CY/SR=Σουρινάμ +LocaleNames/el_CY/ST=Σάο Τομέ και Πρίνσιπε +LocaleNames/el_CY/SV=Ελ Σαλβαδόρ +LocaleNames/el_CY/SY=Συρία +LocaleNames/el_CY/SZ=Εσουατίνι +LocaleNames/el_CY/TC=Νήσοι Τερκς και Κάικος +LocaleNames/el_CY/TD=Τσαντ +LocaleNames/el_CY/TF=Γαλλικά Νότια Εδάφη +LocaleNames/el_CY/TG=Τόγκο +LocaleNames/el_CY/TH=Ταϊλάνδη +LocaleNames/el_CY/TJ=Τατζικιστάν +LocaleNames/el_CY/TK=Τοκελάου +LocaleNames/el_CY/TL=Τιμόρ-Λέστε +LocaleNames/el_CY/TM=Τουρκμενιστάν +LocaleNames/el_CY/TN=Τυνησία +LocaleNames/el_CY/TO=Τόνγκα +LocaleNames/el_CY/TR=Τουρκία +LocaleNames/el_CY/TT=Τρινιντάντ και Τομπάγκο +LocaleNames/el_CY/TV=Τουβαλού +LocaleNames/el_CY/TW=Ταϊβάν +LocaleNames/el_CY/TZ=Τανζανία +LocaleNames/el_CY/UA=Ουκρανία +LocaleNames/el_CY/UG=Ουγκάντα +LocaleNames/el_CY/UM=Απομακρυσμένες Νησίδες ΗΠΑ +LocaleNames/el_CY/US=Ηνωμένες Πολιτείες +LocaleNames/el_CY/UY=Ουρουγουάη +LocaleNames/el_CY/UZ=Ουζμπεκιστάν +LocaleNames/el_CY/VA=Βατικανό +LocaleNames/el_CY/VC=Άγιος Βικέντιος και Γρεναδίνες +LocaleNames/el_CY/VE=Βενεζουέλα +LocaleNames/el_CY/VG=Βρετανικές Παρθένες Νήσοι +LocaleNames/el_CY/VI=Αμερικανικές Παρθένες Νήσοι +LocaleNames/el_CY/VN=Βιετνάμ +LocaleNames/el_CY/VU=Βανουάτου +LocaleNames/el_CY/WF=Γουάλις και Φουτούνα +LocaleNames/el_CY/WS=Σαμόα +LocaleNames/el_CY/YE=Υεμένη +LocaleNames/el_CY/YT=Μαγιότ +LocaleNames/el_CY/ZA=Νότια Αφρική +LocaleNames/el_CY/ZM=Ζάμπια +LocaleNames/el_CY/ZW=Ζιμπάμπουε +CurrencyNames/el_CY/EUR=€ #ms_MY and ms FormatData/ms_MY/latn.NumberPatterns/0=#,##0.### -FormatData/ms_MY/latn.NumberPatterns/1=\u00a4#,##0.00 +FormatData/ms_MY/latn.NumberPatterns/1=¤#,##0.00 FormatData/ms_MY/latn.NumberPatterns/2=#,##0% -FormatData/ms_MY/TimePatterns/0=h:mm:ss\u202fa zzzz -FormatData/ms_MY/TimePatterns/1=h:mm:ss\u202fa z -FormatData/ms_MY/TimePatterns/2=h:mm:ss\u202fa -FormatData/ms_MY/TimePatterns/3=h:mm\u202fa +FormatData/ms_MY/TimePatterns/0=h:mm:ss a zzzz +FormatData/ms_MY/TimePatterns/1=h:mm:ss a z +FormatData/ms_MY/TimePatterns/2=h:mm:ss a +FormatData/ms_MY/TimePatterns/3=h:mm a FormatData/ms_MY/DatePatterns/0=EEEE, d MMMM y FormatData/ms_MY/DatePatterns/1=d MMMM y FormatData/ms_MY/DatePatterns/2=d MMM y @@ -3100,7 +3100,7 @@ LocaleNames/ms/CA=Kanada LocaleNames/ms/CC=Kepulauan Cocos (Keeling) LocaleNames/ms/CD=Congo - Kinshasa LocaleNames/ms/CF=Republik Afrika Tengah -LocaleNames/ms/CI=Cote d\u2019Ivoire +LocaleNames/ms/CI=Cote d’Ivoire LocaleNames/ms/CL=Chile LocaleNames/ms/CM=Cameroon LocaleNames/ms/CN=China @@ -3166,68 +3166,68 @@ LocaleNames/ms/ZA=Afrika Selatan FormatData/es_US/Eras/0=a.C. FormatData/es_US/Eras/1=d.C. FormatData/es_US/latn.NumberPatterns/0=#,##0.### -FormatData/es_US/latn.NumberPatterns/1=\u00a4#,##0.00 -FormatData/es_US/latn.NumberPatterns/2=#,##0\u00a0% -FormatData/es_US/TimePatterns/0=h:mm:ss\u202fa zzzz -FormatData/es_US/TimePatterns/1=h:mm:ss\u202fa z -FormatData/es_US/TimePatterns/2=h:mm:ss\u202fa -FormatData/es_US/TimePatterns/3=h:mm\u202fa +FormatData/es_US/latn.NumberPatterns/1=¤#,##0.00 +FormatData/es_US/latn.NumberPatterns/2=#,##0 % +FormatData/es_US/TimePatterns/0=h:mm:ss a zzzz +FormatData/es_US/TimePatterns/1=h:mm:ss a z +FormatData/es_US/TimePatterns/2=h:mm:ss a +FormatData/es_US/TimePatterns/3=h:mm a FormatData/es_US/DatePatterns/0=EEEE, d 'de' MMMM 'de' y FormatData/es_US/DatePatterns/1=d 'de' MMMM 'de' y FormatData/es_US/DatePatterns/2=d MMM y FormatData/es_US/DatePatterns/3=d/M/y FormatData/es_US/DateTimePatterns/0={1}, {0} LocaleNames/es_US/aa=afar -LocaleNames/es_US/ae=av\u00e9stico +LocaleNames/es_US/ae=avéstico LocaleNames/es_US/ak=akan -LocaleNames/es_US/an=aragon\u00e9s +LocaleNames/es_US/an=aragonés LocaleNames/es_US/av=avar LocaleNames/es_US/ay=aimara LocaleNames/es_US/az=azerbaiyano LocaleNames/es_US/ba=baskir LocaleNames/es_US/bm=bambara -LocaleNames/es_US/bn=bengal\u00ed +LocaleNames/es_US/bn=bengalí LocaleNames/es_US/bs=bosnio LocaleNames/es_US/ce=checheno LocaleNames/es_US/ch=chamorro LocaleNames/es_US/cr=cree -LocaleNames/es_US/cu=eslavo eclesi\u00e1stico +LocaleNames/es_US/cu=eslavo eclesiástico LocaleNames/es_US/cv=chuvasio LocaleNames/es_US/dv=divehi -LocaleNames/es_US/ee=ew\u00e9 +LocaleNames/es_US/ee=ewé LocaleNames/es_US/eu=euskera LocaleNames/es_US/ff=fula -LocaleNames/es_US/fo=fero\u00e9s -LocaleNames/es_US/fy=fris\u00f3n occidental -LocaleNames/es_US/gu=gurayat\u00ed -LocaleNames/es_US/gv=man\u00e9s +LocaleNames/es_US/fo=feroés +LocaleNames/es_US/fy=frisón occidental +LocaleNames/es_US/gu=gurayatí +LocaleNames/es_US/gv=manés LocaleNames/es_US/hi=hindi LocaleNames/es_US/ho=hiri motu LocaleNames/es_US/ht=criollo haitiano LocaleNames/es_US/hz=herero LocaleNames/es_US/ie=interlingue LocaleNames/es_US/ig=igbo -LocaleNames/es_US/ii=yi de Sichu\u00e1n +LocaleNames/es_US/ii=yi de Sichuán LocaleNames/es_US/io=ido -LocaleNames/es_US/jv=javan\u00e9s +LocaleNames/es_US/jv=javanés LocaleNames/es_US/kg=kongo LocaleNames/es_US/ki=kikuyu LocaleNames/es_US/kj=kuanyama LocaleNames/es_US/kk=kazajo LocaleNames/es_US/km=jemer -LocaleNames/es_US/kn=canar\u00e9s +LocaleNames/es_US/kn=canarés LocaleNames/es_US/kr=kanuri LocaleNames/es_US/ks=cachemiro LocaleNames/es_US/ku=kurdo LocaleNames/es_US/kv=komi -LocaleNames/es_US/kw=c\u00f3rnico -LocaleNames/es_US/ky=kirgu\u00eds -LocaleNames/es_US/lb=luxemburgu\u00e9s +LocaleNames/es_US/kw=córnico +LocaleNames/es_US/ky=kirguís +LocaleNames/es_US/lb=luxemburgués LocaleNames/es_US/lg=ganda -LocaleNames/es_US/li=limburgu\u00e9s +LocaleNames/es_US/li=limburgués LocaleNames/es_US/lu=luba-katanga -LocaleNames/es_US/mh=marshal\u00e9s -LocaleNames/es_US/mr=marat\u00ed +LocaleNames/es_US/mh=marshalés +LocaleNames/es_US/mr=maratí LocaleNames/es_US/nb=noruego bokmal LocaleNames/es_US/nd=ndebele del norte LocaleNames/es_US/ng=ndonga @@ -3237,7 +3237,7 @@ LocaleNames/es_US/nv=navajo LocaleNames/es_US/ny=nyanja LocaleNames/es_US/oc=occitano LocaleNames/es_US/oj=ojibwa -LocaleNames/es_US/os=os\u00e9tico +LocaleNames/es_US/os=osético LocaleNames/es_US/pi=pali LocaleNames/es_US/rm=romanche LocaleNames/es_US/rn=kirundi @@ -3249,7 +3249,7 @@ LocaleNames/es_US/sl=esloveno LocaleNames/es_US/sn=shona LocaleNames/es_US/ss=siswati LocaleNames/es_US/st=sesotho del sur -LocaleNames/es_US/su=sundan\u00e9s +LocaleNames/es_US/su=sundanés LocaleNames/es_US/sw=swahili LocaleNames/es_US/tg=tayiko LocaleNames/es_US/tn=setsuana @@ -3260,7 +3260,7 @@ LocaleNames/es_US/ug=uigur LocaleNames/es_US/uk=ucraniano LocaleNames/es_US/uz=uzbeko LocaleNames/es_US/ve=venda -LocaleNames/es_US/wa=val\u00f3n +LocaleNames/es_US/wa=valón LocaleNames/es_US/za=zhuang LocaleNames/es_US/BA=Bosnia y Herzegovina LocaleNames/es_US/CC=Islas Cocos @@ -3270,186 +3270,186 @@ LocaleNames/es_US/EH=Sahara Occidental LocaleNames/es_US/FK=Islas Malvinas LocaleNames/es_US/HK=RAE de Hong Kong (China) LocaleNames/es_US/KM=Comoras -LocaleNames/es_US/LC=Santa Luc\u00eda +LocaleNames/es_US/LC=Santa Lucía LocaleNames/es_US/LS=Lesoto LocaleNames/es_US/MO=RAE de Macao (China) LocaleNames/es_US/MW=Malaui -LocaleNames/es_US/NL=Pa\u00edses Bajos +LocaleNames/es_US/NL=Países Bajos LocaleNames/es_US/NU=Niue -LocaleNames/es_US/PG=Pap\u00faa Nueva Guinea -LocaleNames/es_US/PK=Pakist\u00e1n +LocaleNames/es_US/PG=Papúa Nueva Guinea +LocaleNames/es_US/PK=Pakistán LocaleNames/es_US/PN=Islas Pitcairn LocaleNames/es_US/PS=Territorios Palestinos LocaleNames/es_US/PW=Palaos -LocaleNames/es_US/RO=Ruman\u00eda -LocaleNames/es_US/SA=Arabia Saud\u00ed +LocaleNames/es_US/RO=Rumanía +LocaleNames/es_US/SA=Arabia Saudí LocaleNames/es_US/SH=Santa Elena LocaleNames/es_US/TF=Territorios Australes Franceses LocaleNames/es_US/TK=Tokelau LocaleNames/es_US/TT=Trinidad y Tobago -LocaleNames/es_US/VI=Islas V\u00edrgenes de EE. UU. +LocaleNames/es_US/VI=Islas Vírgenes de EE. UU. CurrencyNames/es_US/USD=$ #bug 4400849 LocaleNames/pt/aa=afar -LocaleNames/pt/ab=abc\u00e1zio -LocaleNames/pt/ae=av\u00e9stico -LocaleNames/pt/af=afric\u00e2ner -LocaleNames/pt/am=am\u00e1rico -LocaleNames/pt/an=aragon\u00eas -LocaleNames/pt/ar=\u00e1rabe -LocaleNames/pt/as=assam\u00eas -LocaleNames/pt/av=av\u00e1rico -LocaleNames/pt/ay=aimar\u00e1 +LocaleNames/pt/ab=abcázio +LocaleNames/pt/ae=avéstico +LocaleNames/pt/af=africâner +LocaleNames/pt/am=amárico +LocaleNames/pt/an=aragonês +LocaleNames/pt/ar=árabe +LocaleNames/pt/as=assamês +LocaleNames/pt/av=avárico +LocaleNames/pt/ay=aimará LocaleNames/pt/az=azerbaijano LocaleNames/pt/ba=bashkir LocaleNames/pt/be=bielorrusso -LocaleNames/pt/bg=b\u00falgaro -LocaleNames/pt/bi=bislam\u00e1 +LocaleNames/pt/bg=búlgaro +LocaleNames/pt/bi=bislamá LocaleNames/pt/bm=bambara LocaleNames/pt/bn=bengali LocaleNames/pt/bo=tibetano -LocaleNames/pt/br=bret\u00e3o -LocaleNames/pt/bs=b\u00f3snio -LocaleNames/pt/ca=catal\u00e3o +LocaleNames/pt/br=bretão +LocaleNames/pt/bs=bósnio +LocaleNames/pt/ca=catalão LocaleNames/pt/ce=checheno LocaleNames/pt/ch=chamorro LocaleNames/pt/co=corso LocaleNames/pt/cr=cree LocaleNames/pt/cs=tcheco -LocaleNames/pt/cu=eslavo eclesi\u00e1stico +LocaleNames/pt/cu=eslavo eclesiástico LocaleNames/pt/cv=tchuvache -LocaleNames/pt/cy=gal\u00eas -LocaleNames/pt/da=dinamarqu\u00eas -LocaleNames/pt/de=alem\u00e3o +LocaleNames/pt/cy=galês +LocaleNames/pt/da=dinamarquês +LocaleNames/pt/de=alemão LocaleNames/pt/dv=divehi LocaleNames/pt/dz=dzonga LocaleNames/pt/ee=ewe LocaleNames/pt/el=grego -LocaleNames/pt/en=ingl\u00eas +LocaleNames/pt/en=inglês LocaleNames/pt/eo=esperanto LocaleNames/pt/es=espanhol LocaleNames/pt/et=estoniano LocaleNames/pt/eu=basco LocaleNames/pt/fa=persa LocaleNames/pt/ff=fula -LocaleNames/pt/fi=finland\u00eas +LocaleNames/pt/fi=finlandês LocaleNames/pt/fj=fijiano -LocaleNames/pt/fo=fero\u00eas -LocaleNames/pt/fr=franc\u00eas -LocaleNames/pt/fy=fr\u00edsio ocidental -LocaleNames/pt/ga=irland\u00eas -LocaleNames/pt/gd=ga\u00e9lico escoc\u00eas +LocaleNames/pt/fo=feroês +LocaleNames/pt/fr=francês +LocaleNames/pt/fy=frísio ocidental +LocaleNames/pt/ga=irlandês +LocaleNames/pt/gd=gaélico escocês LocaleNames/pt/gl=galego LocaleNames/pt/gn=guarani LocaleNames/pt/gu=guzerate LocaleNames/pt/gv=manx -LocaleNames/pt/ha=hau\u00e7\u00e1 +LocaleNames/pt/ha=hauçá LocaleNames/pt/he=hebraico -LocaleNames/pt/hi=h\u00edndi +LocaleNames/pt/hi=híndi LocaleNames/pt/ho=hiri motu LocaleNames/pt/hr=croata LocaleNames/pt/ht=haitiano -LocaleNames/pt/hu=h\u00fangaro -LocaleNames/pt/hy=arm\u00eanio +LocaleNames/pt/hu=húngaro +LocaleNames/pt/hy=armênio LocaleNames/pt/hz=herero -LocaleNames/pt/ia=interl\u00edngua -LocaleNames/pt/id=indon\u00e9sio +LocaleNames/pt/ia=interlíngua +LocaleNames/pt/id=indonésio LocaleNames/pt/ie=interlingue LocaleNames/pt/ig=igbo LocaleNames/pt/ii=sichuan yi LocaleNames/pt/io=ido -LocaleNames/pt/is=island\u00eas +LocaleNames/pt/is=islandês LocaleNames/pt/it=italiano LocaleNames/pt/iu=inuktitut -LocaleNames/pt/ja=japon\u00eas +LocaleNames/pt/ja=japonês LocaleNames/pt/ka=georgiano -LocaleNames/pt/kg=congol\u00eas +LocaleNames/pt/kg=congolês LocaleNames/pt/ki=quicuio LocaleNames/pt/kj=cuanhama LocaleNames/pt/kk=cazaque -LocaleNames/pt/kl=groenland\u00eas +LocaleNames/pt/kl=groenlandês LocaleNames/pt/km=khmer LocaleNames/pt/kn=canarim LocaleNames/pt/ko=coreano -LocaleNames/pt/kr=can\u00fari +LocaleNames/pt/kr=canúri LocaleNames/pt/ks=caxemira LocaleNames/pt/ku=curdo LocaleNames/pt/kv=komi -LocaleNames/pt/kw=c\u00f3rnico +LocaleNames/pt/kw=córnico LocaleNames/pt/ky=quirguiz LocaleNames/pt/la=latim -LocaleNames/pt/lb=luxemburgu\u00eas +LocaleNames/pt/lb=luxemburguês LocaleNames/pt/lg=luganda -LocaleNames/pt/li=limburgu\u00eas +LocaleNames/pt/li=limburguês LocaleNames/pt/ln=lingala LocaleNames/pt/lo=laosiano LocaleNames/pt/lt=lituano LocaleNames/pt/lu=luba-catanga -LocaleNames/pt/lv=let\u00e3o +LocaleNames/pt/lv=letão LocaleNames/pt/mg=malgaxe -LocaleNames/pt/mh=marshal\u00eas +LocaleNames/pt/mh=marshalês LocaleNames/pt/mi=maori -LocaleNames/pt/mk=maced\u00f4nio +LocaleNames/pt/mk=macedônio LocaleNames/pt/ml=malaiala LocaleNames/pt/mn=mongol LocaleNames/pt/mr=marati LocaleNames/pt/ms=malaio -LocaleNames/pt/mt=malt\u00eas -LocaleNames/pt/my=birman\u00eas +LocaleNames/pt/mt=maltês +LocaleNames/pt/my=birmanês LocaleNames/pt/na=nauruano -LocaleNames/pt/nb=bokm\u00e5l noruegu\u00eas +LocaleNames/pt/nb=bokmål norueguês LocaleNames/pt/nd=ndebele do norte -LocaleNames/pt/ne=nepal\u00eas +LocaleNames/pt/ne=nepalês LocaleNames/pt/ng=dongo -LocaleNames/pt/nl=holand\u00eas -LocaleNames/pt/nn=nynorsk noruegu\u00eas -LocaleNames/pt/no=noruegu\u00eas +LocaleNames/pt/nl=holandês +LocaleNames/pt/nn=nynorsk norueguês +LocaleNames/pt/no=norueguês LocaleNames/pt/nr=ndebele do sul LocaleNames/pt/nv=navajo LocaleNames/pt/ny=nianja -LocaleNames/pt/oc=occit\u00e2nico +LocaleNames/pt/oc=occitânico LocaleNames/pt/oj=ojibwa LocaleNames/pt/om=oromo -LocaleNames/pt/or=ori\u00e1 +LocaleNames/pt/or=oriá LocaleNames/pt/os=osseto LocaleNames/pt/pa=panjabi -LocaleNames/pt/pi=p\u00e1li -LocaleNames/pt/pl=polon\u00eas +LocaleNames/pt/pi=páli +LocaleNames/pt/pl=polonês LocaleNames/pt/ps=pashto -LocaleNames/pt/pt=portugu\u00eas -LocaleNames/pt/qu=qu\u00edchua +LocaleNames/pt/pt=português +LocaleNames/pt/qu=quíchua LocaleNames/pt/rm=romanche LocaleNames/pt/rn=rundi LocaleNames/pt/ro=romeno LocaleNames/pt/ru=russo LocaleNames/pt/rw=quiniaruanda -LocaleNames/pt/sa=s\u00e2nscrito +LocaleNames/pt/sa=sânscrito LocaleNames/pt/sc=sardo LocaleNames/pt/sd=sindi LocaleNames/pt/se=sami setentrional LocaleNames/pt/sg=sango -LocaleNames/pt/si=cingal\u00eas +LocaleNames/pt/si=cingalês LocaleNames/pt/sk=eslovaco LocaleNames/pt/sl=esloveno LocaleNames/pt/so=somali -LocaleNames/pt/sq=alban\u00eas -LocaleNames/pt/sr=s\u00e9rvio -LocaleNames/pt/ss=su\u00e1zi +LocaleNames/pt/sq=albanês +LocaleNames/pt/sr=sérvio +LocaleNames/pt/ss=suázi LocaleNames/pt/st=soto do sul -LocaleNames/pt/su=sundan\u00eas +LocaleNames/pt/su=sundanês LocaleNames/pt/sv=sueco -LocaleNames/pt/sw=sua\u00edli -LocaleNames/pt/ta=t\u00e2mil -LocaleNames/pt/te=t\u00e9lugo +LocaleNames/pt/sw=suaíli +LocaleNames/pt/ta=tâmil +LocaleNames/pt/te=télugo LocaleNames/pt/tg=tadjique -LocaleNames/pt/th=tailand\u00eas -LocaleNames/pt/ti=tigr\u00ednia +LocaleNames/pt/th=tailandês +LocaleNames/pt/ti=tigrínia LocaleNames/pt/tk=turcomeno LocaleNames/pt/tn=tswana -LocaleNames/pt/to=tongan\u00eas +LocaleNames/pt/to=tonganês LocaleNames/pt/tr=turco LocaleNames/pt/ts=tsonga -LocaleNames/pt/tt=t\u00e1rtaro +LocaleNames/pt/tt=tártaro LocaleNames/pt/tw=twi LocaleNames/pt/ty=taitiano LocaleNames/pt/ug=uigur @@ -3459,628 +3459,628 @@ LocaleNames/pt/uz=uzbeque LocaleNames/pt/ve=venda LocaleNames/pt/vi=vietnamita LocaleNames/pt/vo=volapuque -LocaleNames/pt/wa=val\u00e3o +LocaleNames/pt/wa=valão LocaleNames/pt/wo=uolofe LocaleNames/pt/xh=xhosa -LocaleNames/pt/yi=i\u00eddiche -LocaleNames/pt/yo=iorub\u00e1 +LocaleNames/pt/yi=iídiche +LocaleNames/pt/yo=iorubá LocaleNames/pt/za=zhuang -LocaleNames/pt/zh=chin\u00eas +LocaleNames/pt/zh=chinês LocaleNames/pt/zu=zulu -LocaleNames/pt/AE=Emirados \u00c1rabes Unidos -LocaleNames/pt/AF=Afeganist\u00e3o -LocaleNames/pt/AG=Ant\u00edgua e Barbuda -LocaleNames/pt/AL=Alb\u00e2nia -LocaleNames/pt/AM=Arm\u00eania -LocaleNames/pt/AQ=Ant\u00e1rtida +LocaleNames/pt/AE=Emirados Árabes Unidos +LocaleNames/pt/AF=Afeganistão +LocaleNames/pt/AG=Antígua e Barbuda +LocaleNames/pt/AL=Albânia +LocaleNames/pt/AM=Armênia +LocaleNames/pt/AQ=Antártida LocaleNames/pt/AS=Samoa Americana -LocaleNames/pt/AT=\u00c1ustria -LocaleNames/pt/AU=Austr\u00e1lia -LocaleNames/pt/AZ=Azerbaij\u00e3o -LocaleNames/pt/BA=B\u00f3snia e Herzegovina -LocaleNames/pt/BE=B\u00e9lgica +LocaleNames/pt/AT=Áustria +LocaleNames/pt/AU=Austrália +LocaleNames/pt/AZ=Azerbaijão +LocaleNames/pt/BA=Bósnia e Herzegovina +LocaleNames/pt/BE=Bélgica LocaleNames/pt/BF=Burquina Faso -LocaleNames/pt/BG=Bulg\u00e1ria +LocaleNames/pt/BG=Bulgária LocaleNames/pt/BH=Barein LocaleNames/pt/BM=Bermudas -LocaleNames/pt/BO=Bol\u00edvia +LocaleNames/pt/BO=Bolívia LocaleNames/pt/BR=Brasil -LocaleNames/pt/BT=But\u00e3o +LocaleNames/pt/BT=Butão LocaleNames/pt/BV=Ilha Bouvet LocaleNames/pt/BW=Botsuana -LocaleNames/pt/CA=Canad\u00e1 +LocaleNames/pt/CA=Canadá LocaleNames/pt/CC=Ilhas Cocos (Keeling) LocaleNames/pt/CD=Congo - Kinshasa -LocaleNames/pt/CF=Rep\u00fablica Centro-Africana -LocaleNames/pt/CH=Su\u00ed\u00e7a +LocaleNames/pt/CF=República Centro-Africana +LocaleNames/pt/CH=Suíça LocaleNames/pt/CI=Costa do Marfim LocaleNames/pt/CK=Ilhas Cook -LocaleNames/pt/CM=Camar\u00f5es -LocaleNames/pt/CO=Col\u00f4mbia +LocaleNames/pt/CM=Camarões +LocaleNames/pt/CO=Colômbia LocaleNames/pt/CV=Cabo Verde LocaleNames/pt/CX=Ilha Christmas LocaleNames/pt/CY=Chipre -LocaleNames/pt/CZ=Tch\u00e9quia +LocaleNames/pt/CZ=Tchéquia LocaleNames/pt/DE=Alemanha LocaleNames/pt/DJ=Djibuti LocaleNames/pt/DK=Dinamarca -LocaleNames/pt/DO=Rep\u00fablica Dominicana -LocaleNames/pt/DZ=Arg\u00e9lia +LocaleNames/pt/DO=República Dominicana +LocaleNames/pt/DZ=Argélia LocaleNames/pt/EC=Equador -LocaleNames/pt/EE=Est\u00f4nia +LocaleNames/pt/EE=Estônia LocaleNames/pt/EG=Egito LocaleNames/pt/EH=Saara Ocidental LocaleNames/pt/ER=Eritreia LocaleNames/pt/ES=Espanha -LocaleNames/pt/ET=Eti\u00f3pia -LocaleNames/pt/FI=Finl\u00e2ndia +LocaleNames/pt/ET=Etiópia +LocaleNames/pt/FI=Finlândia LocaleNames/pt/FK=Ilhas Malvinas -LocaleNames/pt/FM=Micron\u00e9sia -LocaleNames/pt/FO=Ilhas Faro\u00e9 -LocaleNames/pt/FR=Fran\u00e7a -LocaleNames/pt/GA=Gab\u00e3o +LocaleNames/pt/FM=Micronésia +LocaleNames/pt/FO=Ilhas Faroé +LocaleNames/pt/FR=França +LocaleNames/pt/GA=Gabão LocaleNames/pt/GB=Reino Unido LocaleNames/pt/GD=Granada -LocaleNames/pt/GE=Ge\u00f3rgia +LocaleNames/pt/GE=Geórgia LocaleNames/pt/GF=Guiana Francesa LocaleNames/pt/GH=Gana -LocaleNames/pt/GL=Groenl\u00e2ndia -LocaleNames/pt/GM=G\u00e2mbia -LocaleNames/pt/GN=Guin\u00e9 +LocaleNames/pt/GL=Groenlândia +LocaleNames/pt/GM=Gâmbia +LocaleNames/pt/GN=Guiné LocaleNames/pt/GP=Guadalupe -LocaleNames/pt/GQ=Guin\u00e9 Equatorial -LocaleNames/pt/GR=Gr\u00e9cia -LocaleNames/pt/GS=Ilhas Ge\u00f3rgia do Sul e Sandwich do Sul -LocaleNames/pt/GW=Guin\u00e9-Bissau +LocaleNames/pt/GQ=Guiné Equatorial +LocaleNames/pt/GR=Grécia +LocaleNames/pt/GS=Ilhas Geórgia do Sul e Sandwich do Sul +LocaleNames/pt/GW=Guiné-Bissau LocaleNames/pt/GY=Guiana LocaleNames/pt/HK=Hong Kong, RAE da China LocaleNames/pt/HM=Ilhas Heard e McDonald -LocaleNames/pt/HR=Cro\u00e1cia +LocaleNames/pt/HR=Croácia LocaleNames/pt/HU=Hungria -LocaleNames/pt/ID=Indon\u00e9sia +LocaleNames/pt/ID=Indonésia LocaleNames/pt/IE=Irlanda -LocaleNames/pt/IN=\u00cdndia -LocaleNames/pt/IO=Territ\u00f3rio Brit\u00e2nico do Oceano \u00cdndico +LocaleNames/pt/IN=Índia +LocaleNames/pt/IO=Território Britânico do Oceano Índico LocaleNames/pt/IQ=Iraque -LocaleNames/pt/IR=Ir\u00e3 -LocaleNames/pt/IS=Isl\u00e2ndia -LocaleNames/pt/IT=It\u00e1lia -LocaleNames/pt/JO=Jord\u00e2nia -LocaleNames/pt/JP=Jap\u00e3o -LocaleNames/pt/KE=Qu\u00eania -LocaleNames/pt/KG=Quirguist\u00e3o +LocaleNames/pt/IR=Irã +LocaleNames/pt/IS=Islândia +LocaleNames/pt/IT=Itália +LocaleNames/pt/JO=Jordânia +LocaleNames/pt/JP=Japão +LocaleNames/pt/KE=Quênia +LocaleNames/pt/KG=Quirguistão LocaleNames/pt/KH=Camboja LocaleNames/pt/KI=Quiribati LocaleNames/pt/KM=Comores -LocaleNames/pt/KN=S\u00e3o Crist\u00f3v\u00e3o e N\u00e9vis +LocaleNames/pt/KN=São Cristóvão e Névis LocaleNames/pt/KP=Coreia do Norte LocaleNames/pt/KR=Coreia do Sul LocaleNames/pt/KY=Ilhas Cayman -LocaleNames/pt/KZ=Cazaquist\u00e3o +LocaleNames/pt/KZ=Cazaquistão LocaleNames/pt/LA=Laos -LocaleNames/pt/LB=L\u00edbano -LocaleNames/pt/LC=Santa L\u00facia -LocaleNames/pt/LR=Lib\u00e9ria +LocaleNames/pt/LB=Líbano +LocaleNames/pt/LC=Santa Lúcia +LocaleNames/pt/LR=Libéria LocaleNames/pt/LS=Lesoto -LocaleNames/pt/LT=Litu\u00e2nia +LocaleNames/pt/LT=Lituânia LocaleNames/pt/LU=Luxemburgo -LocaleNames/pt/LV=Let\u00f4nia -LocaleNames/pt/LY=L\u00edbia +LocaleNames/pt/LV=Letônia +LocaleNames/pt/LY=Líbia LocaleNames/pt/MA=Marrocos -LocaleNames/pt/MC=M\u00f4naco -LocaleNames/pt/MD=Mold\u00e1via +LocaleNames/pt/MC=Mônaco +LocaleNames/pt/MD=Moldávia LocaleNames/pt/MH=Ilhas Marshall -LocaleNames/pt/MK=Maced\u00f4nia do Norte -LocaleNames/pt/MM=Mianmar (Birm\u00e2nia) -LocaleNames/pt/MN=Mong\u00f3lia +LocaleNames/pt/MK=Macedônia do Norte +LocaleNames/pt/MM=Mianmar (Birmânia) +LocaleNames/pt/MN=Mongólia LocaleNames/pt/MO=Macau, RAE da China LocaleNames/pt/MP=Ilhas Marianas do Norte LocaleNames/pt/MQ=Martinica -LocaleNames/pt/MR=Maurit\u00e2nia -LocaleNames/pt/MU=Maur\u00edcio +LocaleNames/pt/MR=Mauritânia +LocaleNames/pt/MU=Maurício LocaleNames/pt/MV=Maldivas -LocaleNames/pt/MX=M\u00e9xico -LocaleNames/pt/MY=Mal\u00e1sia -LocaleNames/pt/MZ=Mo\u00e7ambique -LocaleNames/pt/NA=Nam\u00edbia -LocaleNames/pt/NC=Nova Caled\u00f4nia -LocaleNames/pt/NE=N\u00edger +LocaleNames/pt/MX=México +LocaleNames/pt/MY=Malásia +LocaleNames/pt/MZ=Moçambique +LocaleNames/pt/NA=Namíbia +LocaleNames/pt/NC=Nova Caledônia +LocaleNames/pt/NE=Níger LocaleNames/pt/NF=Ilha Norfolk -LocaleNames/pt/NG=Nig\u00e9ria -LocaleNames/pt/NI=Nicar\u00e1gua -LocaleNames/pt/NL=Pa\u00edses Baixos +LocaleNames/pt/NG=Nigéria +LocaleNames/pt/NI=Nicarágua +LocaleNames/pt/NL=Países Baixos LocaleNames/pt/NO=Noruega -LocaleNames/pt/NZ=Nova Zel\u00e2ndia -LocaleNames/pt/OM=Om\u00e3 -LocaleNames/pt/PA=Panam\u00e1 -LocaleNames/pt/PF=Polin\u00e9sia Francesa -LocaleNames/pt/PG=Papua-Nova Guin\u00e9 +LocaleNames/pt/NZ=Nova Zelândia +LocaleNames/pt/OM=Omã +LocaleNames/pt/PA=Panamá +LocaleNames/pt/PF=Polinésia Francesa +LocaleNames/pt/PG=Papua-Nova Guiné LocaleNames/pt/PH=Filipinas -LocaleNames/pt/PK=Paquist\u00e3o -LocaleNames/pt/PL=Pol\u00f4nia -LocaleNames/pt/PM=S\u00e3o Pedro e Miquel\u00e3o +LocaleNames/pt/PK=Paquistão +LocaleNames/pt/PL=Polônia +LocaleNames/pt/PM=São Pedro e Miquelão LocaleNames/pt/PR=Porto Rico -LocaleNames/pt/PS=Territ\u00f3rios palestinos +LocaleNames/pt/PS=Territórios palestinos LocaleNames/pt/PY=Paraguai LocaleNames/pt/QA=Catar -LocaleNames/pt/RE=Reuni\u00e3o -LocaleNames/pt/RO=Rom\u00eania -LocaleNames/pt/RU=R\u00fassia +LocaleNames/pt/RE=Reunião +LocaleNames/pt/RO=Romênia +LocaleNames/pt/RU=Rússia LocaleNames/pt/RW=Ruanda -LocaleNames/pt/SA=Ar\u00e1bia Saudita -LocaleNames/pt/SB=Ilhas Salom\u00e3o -LocaleNames/pt/SD=Sud\u00e3o -LocaleNames/pt/SE=Su\u00e9cia +LocaleNames/pt/SA=Arábia Saudita +LocaleNames/pt/SB=Ilhas Salomão +LocaleNames/pt/SD=Sudão +LocaleNames/pt/SE=Suécia LocaleNames/pt/SG=Singapura LocaleNames/pt/SH=Santa Helena -LocaleNames/pt/SI=Eslov\u00eania +LocaleNames/pt/SI=Eslovênia LocaleNames/pt/SJ=Svalbard e Jan Mayen -LocaleNames/pt/SK=Eslov\u00e1quia +LocaleNames/pt/SK=Eslováquia LocaleNames/pt/SL=Serra Leoa -LocaleNames/pt/SO=Som\u00e1lia -LocaleNames/pt/ST=S\u00e3o Tom\u00e9 e Pr\u00edncipe -LocaleNames/pt/SY=S\u00edria -LocaleNames/pt/SZ=Essuat\u00edni +LocaleNames/pt/SO=Somália +LocaleNames/pt/ST=São Tomé e Príncipe +LocaleNames/pt/SY=Síria +LocaleNames/pt/SZ=Essuatíni LocaleNames/pt/TC=Ilhas Turcas e Caicos LocaleNames/pt/TD=Chade -LocaleNames/pt/TF=Territ\u00f3rios Franceses do Sul -LocaleNames/pt/TH=Tail\u00e2ndia -LocaleNames/pt/TJ=Tadjiquist\u00e3o +LocaleNames/pt/TF=Territórios Franceses do Sul +LocaleNames/pt/TH=Tailândia +LocaleNames/pt/TJ=Tadjiquistão LocaleNames/pt/TL=Timor-Leste -LocaleNames/pt/TM=Turcomenist\u00e3o -LocaleNames/pt/TN=Tun\u00edsia +LocaleNames/pt/TM=Turcomenistão +LocaleNames/pt/TN=Tunísia LocaleNames/pt/TR=Turquia LocaleNames/pt/TT=Trinidad e Tobago -LocaleNames/pt/TZ=Tanz\u00e2nia -LocaleNames/pt/UA=Ucr\u00e2nia +LocaleNames/pt/TZ=Tanzânia +LocaleNames/pt/UA=Ucrânia LocaleNames/pt/UM=Ilhas Menores Distantes dos EUA LocaleNames/pt/US=Estados Unidos LocaleNames/pt/UY=Uruguai -LocaleNames/pt/UZ=Uzbequist\u00e3o +LocaleNames/pt/UZ=Uzbequistão LocaleNames/pt/VA=Cidade do Vaticano -LocaleNames/pt/VC=S\u00e3o Vicente e Granadinas -LocaleNames/pt/VG=Ilhas Virgens Brit\u00e2nicas +LocaleNames/pt/VC=São Vicente e Granadinas +LocaleNames/pt/VG=Ilhas Virgens Britânicas LocaleNames/pt/VI=Ilhas Virgens Americanas -LocaleNames/pt/VN=Vietn\u00e3 +LocaleNames/pt/VN=Vietnã LocaleNames/pt/WF=Wallis e Futuna -LocaleNames/pt/YE=I\u00eamen -LocaleNames/pt/ZA=\u00c1frica do Sul -LocaleNames/pt/ZM=Z\u00e2mbia -LocaleNames/pt/ZW=Zimb\u00e1bue +LocaleNames/pt/YE=Iêmen +LocaleNames/pt/ZA=África do Sul +LocaleNames/pt/ZM=Zâmbia +LocaleNames/pt/ZW=Zimbábue # pt_PT LocaleNames/pt_PT/cs=checo -LocaleNames/pt_PT/et=est\u00f3nio +LocaleNames/pt_PT/et=estónio LocaleNames/pt_PT/pl=polaco LocaleNames/pt_PT/sl=esloveno -LocaleNames/pt_PT/AE=Emirados \u00c1rabes Unidos -LocaleNames/pt_PT/AM=Arm\u00e9nia -LocaleNames/pt_PT/AQ=Ant\u00e1rtida -LocaleNames/pt_PT/AZ=Azerbaij\u00e3o -LocaleNames/pt_PT/BA=B\u00f3snia e Herzegovina +LocaleNames/pt_PT/AE=Emirados Árabes Unidos +LocaleNames/pt_PT/AM=Arménia +LocaleNames/pt_PT/AQ=Antártida +LocaleNames/pt_PT/AZ=Azerbaijão +LocaleNames/pt_PT/BA=Bósnia e Herzegovina LocaleNames/pt_PT/BJ=Benim -LocaleNames/pt_PT/BY=Bielorr\u00fassia -LocaleNames/pt_PT/CM=Camar\u00f5es +LocaleNames/pt_PT/BY=Bielorrússia +LocaleNames/pt_PT/CM=Camarões LocaleNames/pt_PT/CX=Ilha do Natal -LocaleNames/pt_PT/CZ=Ch\u00e9quia -LocaleNames/pt_PT/EE=Est\u00f3nia +LocaleNames/pt_PT/CZ=Chéquia +LocaleNames/pt_PT/EE=Estónia LocaleNames/pt_PT/EG=Egito LocaleNames/pt_PT/EH=Sara Ocidental LocaleNames/pt_PT/ER=Eritreia LocaleNames/pt_PT/FK=Ilhas Falkland -LocaleNames/pt_PT/GL=Gronel\u00e2ndia -LocaleNames/pt_PT/GS=Ilhas Ge\u00f3rgia do Sul e Sandwich do Sul -LocaleNames/pt_PT/GW=Guin\u00e9-Bissau +LocaleNames/pt_PT/GL=Gronelândia +LocaleNames/pt_PT/GS=Ilhas Geórgia do Sul e Sandwich do Sul +LocaleNames/pt_PT/GW=Guiné-Bissau LocaleNames/pt_PT/HK=Hong Kong, RAE da China -LocaleNames/pt_PT/KE=Qu\u00e9nia -LocaleNames/pt_PT/KG=Quirguist\u00e3o -LocaleNames/pt_PT/KN=S\u00e3o Crist\u00f3v\u00e3o e Neves +LocaleNames/pt_PT/KE=Quénia +LocaleNames/pt_PT/KG=Quirguistão +LocaleNames/pt_PT/KN=São Cristóvão e Neves LocaleNames/pt_PT/KP=Coreia do Norte LocaleNames/pt_PT/KR=Coreia do Sul -LocaleNames/pt_PT/KY=Ilhas Caim\u00e3o -LocaleNames/pt_PT/KZ=Cazaquist\u00e3o +LocaleNames/pt_PT/KY=Ilhas Caimão +LocaleNames/pt_PT/KZ=Cazaquistão LocaleNames/pt_PT/LA=Laos -LocaleNames/pt_PT/LV=Let\u00f3nia -LocaleNames/pt_PT/MC=M\u00f3naco -LocaleNames/pt_PT/MD=Mold\u00e1via -LocaleNames/pt_PT/MG=Madag\u00e1scar -LocaleNames/pt_PT/MK=Maced\u00f3nia do Norte +LocaleNames/pt_PT/LV=Letónia +LocaleNames/pt_PT/MC=Mónaco +LocaleNames/pt_PT/MD=Moldávia +LocaleNames/pt_PT/MG=Madagáscar +LocaleNames/pt_PT/MK=Macedónia do Norte LocaleNames/pt_PT/MO=Macau, RAE da China LocaleNames/pt_PT/MP=Ilhas Marianas do Norte -LocaleNames/pt_PT/MU=Maur\u00edcia -LocaleNames/pt_PT/NC=Nova Caled\u00f3nia -LocaleNames/pt_PT/PG=Papua-Nova Guin\u00e9 -LocaleNames/pt_PT/PL=Pol\u00f3nia -LocaleNames/pt_PT/PS=Territ\u00f3rios palestinianos -LocaleNames/pt_PT/RE=Reuni\u00e3o -LocaleNames/pt_PT/RO=Rom\u00e9nia +LocaleNames/pt_PT/MU=Maurícia +LocaleNames/pt_PT/NC=Nova Caledónia +LocaleNames/pt_PT/PG=Papua-Nova Guiné +LocaleNames/pt_PT/PL=Polónia +LocaleNames/pt_PT/PS=Territórios palestinianos +LocaleNames/pt_PT/RE=Reunião +LocaleNames/pt_PT/RO=Roménia LocaleNames/pt_PT/SC=Seicheles LocaleNames/pt_PT/SG=Singapura -LocaleNames/pt_PT/SI=Eslov\u00e9nia -LocaleNames/pt_PT/SM=S\u00e3o Marinho +LocaleNames/pt_PT/SI=Eslovénia +LocaleNames/pt_PT/SM=São Marinho LocaleNames/pt_PT/TC=Ilhas Turcas e Caicos LocaleNames/pt_PT/TD=Chade -LocaleNames/pt_PT/TF=Territ\u00f3rios Austrais Franceses -LocaleNames/pt_PT/TJ=Tajiquist\u00e3o -LocaleNames/pt_PT/TM=Turquemenist\u00e3o +LocaleNames/pt_PT/TF=Territórios Austrais Franceses +LocaleNames/pt_PT/TJ=Tajiquistão +LocaleNames/pt_PT/TM=Turquemenistão LocaleNames/pt_PT/UM=Ilhas Menores Afastadas dos EUA -LocaleNames/pt_PT/UZ=Usbequist\u00e3o +LocaleNames/pt_PT/UZ=Usbequistão LocaleNames/pt_PT/VA=Cidade do Vaticano -LocaleNames/pt_PT/VC=S\u00e3o Vicente e Granadinas -LocaleNames/pt_PT/VG=Ilhas Virgens Brit\u00e2nicas +LocaleNames/pt_PT/VC=São Vicente e Granadinas +LocaleNames/pt_PT/VG=Ilhas Virgens Britânicas LocaleNames/pt_PT/VI=Ilhas Virgens dos EUA LocaleNames/pt_PT/VN=Vietname -LocaleNames/pt_PT/YE=I\u00e9men +LocaleNames/pt_PT/YE=Iémen #bug 6290792 Gaelic support -LocaleNames/ga/ab=Abc\u00e1isis -LocaleNames/ga/ae=Aiv\u00e9istis -LocaleNames/ga/af=Afrac\u00e1inis +LocaleNames/ga/ab=Abcáisis +LocaleNames/ga/ae=Aivéistis +LocaleNames/ga/af=Afracáinis LocaleNames/ga/ar=Araibis LocaleNames/ga/as=Asaimis -LocaleNames/ga/az=Asarbaise\u00e1inis -LocaleNames/ga/ba=Baisc\u00edris -LocaleNames/ga/be=Bealar\u00faisis -LocaleNames/ga/bg=Bulg\u00e1iris -LocaleNames/ga/bn=Beang\u00e1ilis -LocaleNames/ga/bo=Tib\u00e9idis -LocaleNames/ga/br=Briot\u00e1inis +LocaleNames/ga/az=Asarbaiseáinis +LocaleNames/ga/ba=Baiscíris +LocaleNames/ga/be=Bealarúisis +LocaleNames/ga/bg=Bulgáiris +LocaleNames/ga/bn=Beangáilis +LocaleNames/ga/bo=Tibéidis +LocaleNames/ga/br=Briotáinis LocaleNames/ga/bs=Boisnis -LocaleNames/ga/ca=Catal\u00f3inis +LocaleNames/ga/ca=Catalóinis LocaleNames/ga/ce=Seisnis LocaleNames/ga/co=Corsaicis -LocaleNames/ga/cr=Cra\u00eds +LocaleNames/ga/cr=Craís LocaleNames/ga/cs=Seicis LocaleNames/ga/cu=Slavais na hEaglaise LocaleNames/ga/cv=Suvaisis LocaleNames/ga/cy=Breatnais LocaleNames/ga/da=Danmhairgis -LocaleNames/ga/de=Gearm\u00e1inis -LocaleNames/ga/el=Gr\u00e9igis -LocaleNames/ga/en=B\u00e9arla -LocaleNames/ga/es=Sp\u00e1innis -LocaleNames/ga/et=East\u00f3inis +LocaleNames/ga/de=Gearmáinis +LocaleNames/ga/el=Gréigis +LocaleNames/ga/en=Béarla +LocaleNames/ga/es=Spáinnis +LocaleNames/ga/et=Eastóinis LocaleNames/ga/eu=Bascais LocaleNames/ga/fa=Peirsis LocaleNames/ga/fi=Fionlainnis LocaleNames/ga/fj=Fidsis -LocaleNames/ga/fo=Far\u00f3is +LocaleNames/ga/fo=Faróis LocaleNames/ga/fr=Fraincis LocaleNames/ga/fy=Freaslainnis Iartharach LocaleNames/ga/ga=Gaeilge LocaleNames/ga/gd=Gaeilge na hAlban -LocaleNames/ga/gu=G\u00faisear\u00e1itis +LocaleNames/ga/gu=Gúisearáitis LocaleNames/ga/gv=Manainnis LocaleNames/ga/he=Eabhrais -LocaleNames/ga/hi=Hiond\u00fais -LocaleNames/ga/hr=Cr\u00f3itis -LocaleNames/ga/hu=Ung\u00e1iris -LocaleNames/ga/hy=Airm\u00e9inis -LocaleNames/ga/id=Indin\u00e9isis -LocaleNames/ga/is=\u00cdoslainnis -LocaleNames/ga/it=Iod\u00e1ilis -LocaleNames/ga/iu=Ion\u00faitis -LocaleNames/ga/ja=Seap\u00e1inis -LocaleNames/ga/jv=I\u00e1ivis +LocaleNames/ga/hi=Hiondúis +LocaleNames/ga/hr=Cróitis +LocaleNames/ga/hu=Ungáiris +LocaleNames/ga/hy=Airméinis +LocaleNames/ga/id=Indinéisis +LocaleNames/ga/is=Íoslainnis +LocaleNames/ga/it=Iodáilis +LocaleNames/ga/iu=Ionúitis +LocaleNames/ga/ja=Seapáinis +LocaleNames/ga/jv=Iáivis LocaleNames/ga/ka=Seoirsis LocaleNames/ga/kk=Casaicis LocaleNames/ga/kn=Cannadais -LocaleNames/ga/ko=C\u00f3ir\u00e9is -LocaleNames/ga/ks=Caism\u00edris +LocaleNames/ga/ko=Cóiréis +LocaleNames/ga/ks=Caismíris LocaleNames/ga/kw=Coirnis LocaleNames/ga/ky=Cirgisis LocaleNames/ga/la=Laidin LocaleNames/ga/lb=Lucsambuirgis LocaleNames/ga/lo=Laoisis -LocaleNames/ga/lt=Liotu\u00e1inis +LocaleNames/ga/lt=Liotuáinis LocaleNames/ga/lv=Laitvis -LocaleNames/ga/mg=Malag\u00e1isis +LocaleNames/ga/mg=Malagáisis LocaleNames/ga/mi=Maorais -LocaleNames/ga/mk=Macad\u00f3inis -LocaleNames/ga/ml=Mail\u00e9alaimis -LocaleNames/ga/mn=Mong\u00f3ilis +LocaleNames/ga/mk=Macadóinis +LocaleNames/ga/ml=Mailéalaimis +LocaleNames/ga/mn=Mongóilis LocaleNames/ga/mr=Maraitis -LocaleNames/ga/mt=M\u00e1ltais +LocaleNames/ga/mt=Máltais LocaleNames/ga/my=Burmais -LocaleNames/ga/na=N\u00e1r\u00fais -LocaleNames/ga/nb=Bocm\u00e1l +LocaleNames/ga/na=Nárúis +LocaleNames/ga/nb=Bocmál LocaleNames/ga/ne=Neipeailis LocaleNames/ga/nl=Ollainnis LocaleNames/ga/nn=Nua-Ioruais LocaleNames/ga/no=Ioruais -LocaleNames/ga/nv=Navach\u00f3is -LocaleNames/ga/oc=Ocsat\u00e1inis -LocaleNames/ga/os=Ois\u00e9itis -LocaleNames/ga/pa=Puinse\u00e1ibis +LocaleNames/ga/nv=Navachóis +LocaleNames/ga/oc=Ocsatáinis +LocaleNames/ga/os=Oiséitis +LocaleNames/ga/pa=Puinseáibis LocaleNames/ga/pl=Polainnis LocaleNames/ga/ps=Paistis -LocaleNames/ga/pt=Portaing\u00e9ilis +LocaleNames/ga/pt=Portaingéilis LocaleNames/ga/qu=Ceatsuais -LocaleNames/ga/ro=R\u00f3m\u00e1inis -LocaleNames/ga/ru=R\u00faisis +LocaleNames/ga/ro=Rómáinis +LocaleNames/ga/ru=Rúisis LocaleNames/ga/sa=Sanscrait -LocaleNames/ga/sc=Saird\u00ednis +LocaleNames/ga/sc=Sairdínis LocaleNames/ga/sd=Sindis -LocaleNames/ga/se=S\u00e1imis an Tuaiscirt -LocaleNames/ga/sk=Sl\u00f3vaicis -LocaleNames/ga/sl=Sl\u00f3iv\u00e9inis -LocaleNames/ga/sm=Sam\u00f3is -LocaleNames/ga/so=Som\u00e1ilis -LocaleNames/ga/sq=Alb\u00e1inis +LocaleNames/ga/se=Sáimis an Tuaiscirt +LocaleNames/ga/sk=Slóvaicis +LocaleNames/ga/sl=Slóivéinis +LocaleNames/ga/sm=Samóis +LocaleNames/ga/so=Somáilis +LocaleNames/ga/sq=Albáinis LocaleNames/ga/sr=Seirbis LocaleNames/ga/sv=Sualainnis -LocaleNames/ga/sw=Svaha\u00edlis +LocaleNames/ga/sw=Svahaílis LocaleNames/ga/ta=Tamailis -LocaleNames/ga/th=T\u00e9alainnis -LocaleNames/ga/tl=Tag\u00e1laigis +LocaleNames/ga/th=Téalainnis +LocaleNames/ga/tl=Tagálaigis LocaleNames/ga/tr=Tuircis LocaleNames/ga/tt=Tatairis -LocaleNames/ga/ty=Taih\u00edtis -LocaleNames/ga/uk=\u00dacr\u00e1inis -LocaleNames/ga/ur=Urd\u00fais -LocaleNames/ga/uz=\u00daisb\u00e9iceast\u00e1inis -LocaleNames/ga/vi=V\u00edtneaimis -LocaleNames/ga/wa=Vall\u00fanais -LocaleNames/ga/yi=Gi\u00fadais -LocaleNames/ga/zh=S\u00ednis -LocaleNames/ga/zu=S\u00fal\u00fais -LocaleNames/ga/AD=And\u00f3ra -LocaleNames/ga/AE=Aontas na n\u00c9im\u00edr\u00edochta\u00ed Arabacha -LocaleNames/ga/AF=an Afganast\u00e1in -LocaleNames/ga/AG=Antigua agus Barb\u00fada -LocaleNames/ga/AL=an Alb\u00e1in -LocaleNames/ga/AM=an Airm\u00e9in -LocaleNames/ga/AO=Ang\u00f3la +LocaleNames/ga/ty=Taihítis +LocaleNames/ga/uk=Úcráinis +LocaleNames/ga/ur=Urdúis +LocaleNames/ga/uz=Úisbéiceastáinis +LocaleNames/ga/vi=Vítneaimis +LocaleNames/ga/wa=Vallúnais +LocaleNames/ga/yi=Giúdais +LocaleNames/ga/zh=Sínis +LocaleNames/ga/zu=Súlúis +LocaleNames/ga/AD=Andóra +LocaleNames/ga/AE=Aontas na nÉimíríochtaí Arabacha +LocaleNames/ga/AF=an Afganastáin +LocaleNames/ga/AG=Antigua agus Barbúda +LocaleNames/ga/AL=an Albáin +LocaleNames/ga/AM=an Airméin +LocaleNames/ga/AO=Angóla LocaleNames/ga/AQ=Antartaice -LocaleNames/ga/AR=an Airgint\u00edn -LocaleNames/ga/AS=Sam\u00f3 Mheirice\u00e1 +LocaleNames/ga/AR=an Airgintín +LocaleNames/ga/AS=Samó Mheiriceá LocaleNames/ga/AT=an Ostair -LocaleNames/ga/AU=an Astr\u00e1il -LocaleNames/ga/AZ=an Asarbaise\u00e1in -LocaleNames/ga/BA=an Bhoisnia agus an Heirseagaiv\u00e9in -LocaleNames/ga/BB=Barbad\u00f3s -LocaleNames/ga/BD=an Bhanglaid\u00e9is +LocaleNames/ga/AU=an Astráil +LocaleNames/ga/AZ=an Asarbaiseáin +LocaleNames/ga/BA=an Bhoisnia agus an Heirseagaivéin +LocaleNames/ga/BB=Barbadós +LocaleNames/ga/BD=an Bhanglaidéis LocaleNames/ga/BE=an Bheilg -LocaleNames/ga/BF=Buirc\u00edne Fas\u00f3 -LocaleNames/ga/BG=an Bhulg\u00e1ir -LocaleNames/ga/BH=Bair\u00e9in -LocaleNames/ga/BI=an Bhur\u00fain +LocaleNames/ga/BF=Buircíne Fasó +LocaleNames/ga/BG=an Bhulgáir +LocaleNames/ga/BH=Bairéin +LocaleNames/ga/BI=an Bhurúin LocaleNames/ga/BJ=Beinin -LocaleNames/ga/BM=Beirmi\u00fada -LocaleNames/ga/BN=Br\u00fain\u00e9 +LocaleNames/ga/BM=Beirmiúda +LocaleNames/ga/BN=Brúiné LocaleNames/ga/BO=an Bholaiv -LocaleNames/ga/BR=an Bhrasa\u00edl -LocaleNames/ga/BS=na Bah\u00e1ma\u00ed -LocaleNames/ga/BT=an Bh\u00fat\u00e1in -LocaleNames/ga/BV=Oile\u00e1n Bouvet -LocaleNames/ga/BW=an Bhotsu\u00e1in -LocaleNames/ga/BY=an Bhealar\u00fais -LocaleNames/ga/BZ=an Bheil\u00eds +LocaleNames/ga/BR=an Bhrasaíl +LocaleNames/ga/BS=na Bahámaí +LocaleNames/ga/BT=an Bhútáin +LocaleNames/ga/BV=Oileán Bouvet +LocaleNames/ga/BW=an Bhotsuáin +LocaleNames/ga/BY=an Bhealarúis +LocaleNames/ga/BZ=an Bheilís LocaleNames/ga/CA=Ceanada -LocaleNames/ga/CC=Oile\u00e1in Cocos (Keeling) -LocaleNames/ga/CD=Poblacht Dhaonlathach an Chong\u00f3 -LocaleNames/ga/CF=Poblacht na hAfraice L\u00e1ir -LocaleNames/ga/CG=Cong\u00f3-Brazzaville -LocaleNames/ga/CH=an Eilv\u00e9is -LocaleNames/ga/CI=an C\u00f3sta Eabhair -LocaleNames/ga/CK=Oile\u00e1in Cook +LocaleNames/ga/CC=Oileáin Cocos (Keeling) +LocaleNames/ga/CD=Poblacht Dhaonlathach an Chongó +LocaleNames/ga/CF=Poblacht na hAfraice Láir +LocaleNames/ga/CG=Congó-Brazzaville +LocaleNames/ga/CH=an Eilvéis +LocaleNames/ga/CI=an Cósta Eabhair +LocaleNames/ga/CK=Oileáin Cook LocaleNames/ga/CL=an tSile -LocaleNames/ga/CM=Camar\u00fan -LocaleNames/ga/CN=an tS\u00edn -LocaleNames/ga/CO=an Chol\u00f3im -LocaleNames/ga/CR=C\u00f3sta R\u00edce -LocaleNames/ga/CU=C\u00faba +LocaleNames/ga/CM=Camarún +LocaleNames/ga/CN=an tSín +LocaleNames/ga/CO=an Cholóim +LocaleNames/ga/CR=Cósta Ríce +LocaleNames/ga/CU=Cúba LocaleNames/ga/CV=Rinn Verde -LocaleNames/ga/CX=Oile\u00e1n na Nollag +LocaleNames/ga/CX=Oileán na Nollag LocaleNames/ga/CY=an Chipir LocaleNames/ga/CZ=an tSeicia -LocaleNames/ga/DE=an Ghearm\u00e1in +LocaleNames/ga/DE=an Ghearmáin LocaleNames/ga/DK=an Danmhairg LocaleNames/ga/DM=Doiminice LocaleNames/ga/DO=an Phoblacht Dhoiminiceach -LocaleNames/ga/DZ=an Ailg\u00e9ir -LocaleNames/ga/EC=Eacuad\u00f3r -LocaleNames/ga/EE=an East\u00f3in -LocaleNames/ga/EG=an \u00c9igipt -LocaleNames/ga/EH=an Sah\u00e1ra Thiar -LocaleNames/ga/ES=an Sp\u00e1inn -LocaleNames/ga/ET=an Aet\u00f3ip +LocaleNames/ga/DZ=an Ailgéir +LocaleNames/ga/EC=Eacuadór +LocaleNames/ga/EE=an Eastóin +LocaleNames/ga/EG=an Éigipt +LocaleNames/ga/EH=an Sahára Thiar +LocaleNames/ga/ES=an Spáinn +LocaleNames/ga/ET=an Aetóip LocaleNames/ga/FI=an Fhionlainn -LocaleNames/ga/FJ=Fids\u00ed -LocaleNames/ga/FK=Oile\u00e1in Fh\u00e1clainne -LocaleNames/ga/FM=an Mhicrin\u00e9is -LocaleNames/ga/FO=Oile\u00e1in Fhar\u00f3 +LocaleNames/ga/FJ=Fidsí +LocaleNames/ga/FK=Oileáin Fháclainne +LocaleNames/ga/FM=an Mhicrinéis +LocaleNames/ga/FO=Oileáin Fharó LocaleNames/ga/FR=an Fhrainc -LocaleNames/ga/GA=an Ghab\u00fain -LocaleNames/ga/GB=an R\u00edocht Aontaithe +LocaleNames/ga/GA=an Ghabúin +LocaleNames/ga/GB=an Ríocht Aontaithe LocaleNames/ga/GE=an tSeoirsia -LocaleNames/ga/GF=Gu\u00e1in na Fraince -LocaleNames/ga/GH=G\u00e1na -LocaleNames/ga/GI=Giobr\u00e1ltar +LocaleNames/ga/GF=Guáin na Fraince +LocaleNames/ga/GH=Gána +LocaleNames/ga/GI=Giobráltar LocaleNames/ga/GL=an Ghraonlainn LocaleNames/ga/GM=an Ghaimbia LocaleNames/ga/GN=an Ghuine -LocaleNames/ga/GP=Guadal\u00faip -LocaleNames/ga/GQ=an Ghuine Mhe\u00e1nchiorclach -LocaleNames/ga/GR=an Ghr\u00e9ig -LocaleNames/ga/GS=an tSeoirsia Theas agus Oile\u00e1in Sandwich Theas +LocaleNames/ga/GP=Guadalúip +LocaleNames/ga/GQ=an Ghuine Mheánchiorclach +LocaleNames/ga/GR=an Ghréig +LocaleNames/ga/GS=an tSeoirsia Theas agus Oileáin Sandwich Theas LocaleNames/ga/GT=Guatamala LocaleNames/ga/GW=Guine Bissau -LocaleNames/ga/GY=an Ghu\u00e1in -LocaleNames/ga/HM=Oile\u00e1n Heard agus Oile\u00e1in McDonald -LocaleNames/ga/HN=Hond\u00faras -LocaleNames/ga/HR=an Chr\u00f3it -LocaleNames/ga/HT=H\u00e1\u00edt\u00ed -LocaleNames/ga/HU=an Ung\u00e1ir -LocaleNames/ga/ID=an Indin\u00e9is -LocaleNames/ga/IE=\u00c9ire +LocaleNames/ga/GY=an Ghuáin +LocaleNames/ga/HM=Oileán Heard agus Oileáin McDonald +LocaleNames/ga/HN=Hondúras +LocaleNames/ga/HR=an Chróit +LocaleNames/ga/HT=Háítí +LocaleNames/ga/HU=an Ungáir +LocaleNames/ga/ID=an Indinéis +LocaleNames/ga/IE=Éire LocaleNames/ga/IL=Iosrael LocaleNames/ga/IN=an India -LocaleNames/ga/IO=Cr\u00edoch Aig\u00e9an Indiach na Breataine -LocaleNames/ga/IQ=an Iar\u00e1ic -LocaleNames/ga/IR=an Iar\u00e1in -LocaleNames/ga/IS=an \u00cdoslainn -LocaleNames/ga/IT=an Iod\u00e1il -LocaleNames/ga/JM=Iam\u00e1ice -LocaleNames/ga/JO=an Iord\u00e1in -LocaleNames/ga/JP=an tSeap\u00e1in -LocaleNames/ga/KE=an Ch\u00e9inia -LocaleNames/ga/KG=an Chirgeast\u00e1in -LocaleNames/ga/KH=an Chamb\u00f3id +LocaleNames/ga/IO=Críoch Aigéan Indiach na Breataine +LocaleNames/ga/IQ=an Iaráic +LocaleNames/ga/IR=an Iaráin +LocaleNames/ga/IS=an Íoslainn +LocaleNames/ga/IT=an Iodáil +LocaleNames/ga/JM=Iamáice +LocaleNames/ga/JO=an Iordáin +LocaleNames/ga/JP=an tSeapáin +LocaleNames/ga/KE=an Chéinia +LocaleNames/ga/KG=an Chirgeastáin +LocaleNames/ga/KH=an Chambóid LocaleNames/ga/KI=Ciribeas -LocaleNames/ga/KM=Oile\u00e1in Chom\u00f3ra -LocaleNames/ga/KN=San Cr\u00edost\u00f3ir-Nimheas -LocaleNames/ga/KP=an Ch\u00f3ir\u00e9 Thuaidh -LocaleNames/ga/KR=an Ch\u00f3ir\u00e9 Theas -LocaleNames/ga/KW=Cu\u00e1it -LocaleNames/ga/KY=Oile\u00e1in Cayman -LocaleNames/ga/KZ=an Chasacst\u00e1in -LocaleNames/ga/LB=an Liob\u00e1in -LocaleNames/ga/LI=Lichtinst\u00e9in -LocaleNames/ga/LK=Sr\u00ed Lanca -LocaleNames/ga/LR=an Lib\u00e9ir -LocaleNames/ga/LS=Leos\u00f3ta -LocaleNames/ga/LT=an Liotu\u00e1in +LocaleNames/ga/KM=Oileáin Chomóra +LocaleNames/ga/KN=San Críostóir-Nimheas +LocaleNames/ga/KP=an Chóiré Thuaidh +LocaleNames/ga/KR=an Chóiré Theas +LocaleNames/ga/KW=Cuáit +LocaleNames/ga/KY=Oileáin Cayman +LocaleNames/ga/KZ=an Chasacstáin +LocaleNames/ga/LB=an Liobáin +LocaleNames/ga/LI=Lichtinstéin +LocaleNames/ga/LK=Srí Lanca +LocaleNames/ga/LR=an Libéir +LocaleNames/ga/LS=Leosóta +LocaleNames/ga/LT=an Liotuáin LocaleNames/ga/LU=Lucsamburg LocaleNames/ga/LV=an Laitvia LocaleNames/ga/LY=an Libia -LocaleNames/ga/MA=Marac\u00f3 -LocaleNames/ga/MC=Monac\u00f3 -LocaleNames/ga/MD=an Mhold\u00f3iv -LocaleNames/ga/MH=Oile\u00e1in Marshall -LocaleNames/ga/MK=an Mhacad\u00f3in Thuaidh -LocaleNames/ga/ML=Mail\u00ed +LocaleNames/ga/MA=Maracó +LocaleNames/ga/MC=Monacó +LocaleNames/ga/MD=an Mholdóiv +LocaleNames/ga/MH=Oileáin Marshall +LocaleNames/ga/MK=an Mhacadóin Thuaidh +LocaleNames/ga/ML=Mailí LocaleNames/ga/MM=Maenmar (Burma) -LocaleNames/ga/MN=an Mhong\u00f3il -LocaleNames/ga/MP=na hOile\u00e1in Mh\u00e1irianacha Thuaidh -LocaleNames/ga/MR=an Mh\u00e1rat\u00e1in +LocaleNames/ga/MN=an Mhongóil +LocaleNames/ga/MP=na hOileáin Mháirianacha Thuaidh +LocaleNames/ga/MR=an Mháratáin LocaleNames/ga/MS=Montsarat -LocaleNames/ga/MT=M\u00e1lta -LocaleNames/ga/MU=Oile\u00e1n Mhuir\u00eds -LocaleNames/ga/MV=Oile\u00e1in Mhaild\u00edve -LocaleNames/ga/MW=an Mhal\u00e1iv +LocaleNames/ga/MT=Málta +LocaleNames/ga/MU=Oileán Mhuirís +LocaleNames/ga/MV=Oileáin Mhaildíve +LocaleNames/ga/MW=an Mhaláiv LocaleNames/ga/MX=Meicsiceo LocaleNames/ga/MY=an Mhalaeisia -LocaleNames/ga/MZ=M\u00f3saimb\u00edc +LocaleNames/ga/MZ=Mósaimbíc LocaleNames/ga/NA=an Namaib -LocaleNames/ga/NC=an Nua-Chalad\u00f3in -LocaleNames/ga/NE=an N\u00edgir -LocaleNames/ga/NF=Oile\u00e1n Norfolk -LocaleNames/ga/NG=an Nig\u00e9ir +LocaleNames/ga/NC=an Nua-Chaladóin +LocaleNames/ga/NE=an Nígir +LocaleNames/ga/NF=Oileán Norfolk +LocaleNames/ga/NG=an Nigéir LocaleNames/ga/NI=Nicearagua -LocaleNames/ga/NL=an \u00cdsilt\u00edr +LocaleNames/ga/NL=an Ísiltír LocaleNames/ga/NO=an Iorua LocaleNames/ga/NP=Neipeal -LocaleNames/ga/NR=N\u00e1r\u00fa -LocaleNames/ga/NZ=an Nua-Sh\u00e9alainn -LocaleNames/ga/PE=Peiri\u00fa -LocaleNames/ga/PF=Polain\u00e9is na Fraince +LocaleNames/ga/NR=Nárú +LocaleNames/ga/NZ=an Nua-Shéalainn +LocaleNames/ga/PE=Peiriú +LocaleNames/ga/PF=Polainéis na Fraince LocaleNames/ga/PG=Nua-Ghuine Phapua -LocaleNames/ga/PH=na hOile\u00e1in Fhilip\u00edneacha -LocaleNames/ga/PK=an Phacast\u00e1in +LocaleNames/ga/PH=na hOileáin Fhilipíneacha +LocaleNames/ga/PK=an Phacastáin LocaleNames/ga/PL=an Pholainn LocaleNames/ga/PM=San Pierre agus Miquelon -LocaleNames/ga/PR=P\u00f3rt\u00f3 R\u00edce -LocaleNames/ga/PS=na Cr\u00edocha Palaist\u00edneacha -LocaleNames/ga/PT=an Phortaing\u00e9il +LocaleNames/ga/PR=Pórtó Ríce +LocaleNames/ga/PS=na Críocha Palaistíneacha +LocaleNames/ga/PT=an Phortaingéil LocaleNames/ga/PY=Paragua LocaleNames/ga/QA=Catar -LocaleNames/ga/RE=La R\u00e9union -LocaleNames/ga/RO=an R\u00f3m\u00e1in -LocaleNames/ga/RU=an R\u00fais +LocaleNames/ga/RE=La Réunion +LocaleNames/ga/RO=an Rómáin +LocaleNames/ga/RU=an Rúis LocaleNames/ga/RW=Ruanda -LocaleNames/ga/SA=an Araib Sh\u00e1dach -LocaleNames/ga/SB=Oile\u00e1in Sholaimh -LocaleNames/ga/SC=na S\u00e9is\u00e9il -LocaleNames/ga/SD=an tS\u00fad\u00e1in +LocaleNames/ga/SA=an Araib Shádach +LocaleNames/ga/SB=Oileáin Sholaimh +LocaleNames/ga/SC=na Séiséil +LocaleNames/ga/SD=an tSúdáin LocaleNames/ga/SE=an tSualainn -LocaleNames/ga/SG=Singeap\u00f3r -LocaleNames/ga/SH=San H\u00e9ilin -LocaleNames/ga/SI=an tSl\u00f3iv\u00e9in +LocaleNames/ga/SG=Singeapór +LocaleNames/ga/SH=San Héilin +LocaleNames/ga/SI=an tSlóivéin LocaleNames/ga/SJ=Svalbard agus Jan Mayen -LocaleNames/ga/SK=an tSl\u00f3vaic +LocaleNames/ga/SK=an tSlóvaic LocaleNames/ga/SL=Siarra Leon -LocaleNames/ga/SM=San Mair\u00edne -LocaleNames/ga/SN=an tSeineag\u00e1il -LocaleNames/ga/SO=an tSom\u00e1il +LocaleNames/ga/SM=San Mairíne +LocaleNames/ga/SN=an tSeineagáil +LocaleNames/ga/SO=an tSomáil LocaleNames/ga/SR=Suranam -LocaleNames/ga/ST=S\u00e3o Tom\u00e9 agus Pr\u00edncipe -LocaleNames/ga/SV=an tSalvad\u00f3ir +LocaleNames/ga/ST=São Tomé agus Príncipe +LocaleNames/ga/SV=an tSalvadóir LocaleNames/ga/SY=an tSiria -LocaleNames/ga/SZ=eSuait\u00edn\u00ed -LocaleNames/ga/TC=Oile\u00e1in na dTurcach agus Caicos +LocaleNames/ga/SZ=eSuaitíní +LocaleNames/ga/TC=Oileáin na dTurcach agus Caicos LocaleNames/ga/TD=Sead -LocaleNames/ga/TF=Cr\u00edocha Francacha Dheisceart an Domhain -LocaleNames/ga/TG=T\u00f3ga -LocaleNames/ga/TH=an T\u00e9alainn -LocaleNames/ga/TJ=an T\u00e1ids\u00edceast\u00e1in -LocaleNames/ga/TK=T\u00f3cal\u00e1 -LocaleNames/ga/TL=T\u00edom\u00f3r Thoir -LocaleNames/ga/TM=an Tuircm\u00e9anast\u00e1in -LocaleNames/ga/TN=an T\u00fain\u00e9is +LocaleNames/ga/TF=Críocha Francacha Dheisceart an Domhain +LocaleNames/ga/TG=Tóga +LocaleNames/ga/TH=an Téalainn +LocaleNames/ga/TJ=an Táidsíceastáin +LocaleNames/ga/TK=Tócalá +LocaleNames/ga/TL=Tíomór Thoir +LocaleNames/ga/TM=an Tuircméanastáin +LocaleNames/ga/TN=an Túinéis LocaleNames/ga/TR=an Tuirc -LocaleNames/ga/TT=Oile\u00e1n na Tr\u00edon\u00f3ide agus Tob\u00e1ga -LocaleNames/ga/TV=T\u00faval\u00fa -LocaleNames/ga/TW=an T\u00e9av\u00e1in -LocaleNames/ga/TZ=an Tans\u00e1in -LocaleNames/ga/UA=an \u00dacr\u00e1in -LocaleNames/ga/UM=Oile\u00e1in Imeallacha S.A.M. -LocaleNames/ga/US=St\u00e1it Aontaithe Mheirice\u00e1 +LocaleNames/ga/TT=Oileán na Tríonóide agus Tobága +LocaleNames/ga/TV=Túvalú +LocaleNames/ga/TW=an Téaváin +LocaleNames/ga/TZ=an Tansáin +LocaleNames/ga/UA=an Úcráin +LocaleNames/ga/UM=Oileáin Imeallacha S.A.M. +LocaleNames/ga/US=Stáit Aontaithe Mheiriceá LocaleNames/ga/UY=Uragua -LocaleNames/ga/UZ=an \u00daisb\u00e9iceast\u00e1in -LocaleNames/ga/VA=Cathair na Vatac\u00e1ine -LocaleNames/ga/VC=San Uinseann agus na Grean\u00e1id\u00edn\u00ed -LocaleNames/ga/VE=Veinis\u00e9ala -LocaleNames/ga/VG=Oile\u00e1in Bhriotanacha na Maighdean -LocaleNames/ga/VI=Oile\u00e1in Mheirice\u00e1nacha na Maighdean -LocaleNames/ga/VN=V\u00edtneam -LocaleNames/ga/VU=Vanuat\u00fa -LocaleNames/ga/WF=Vail\u00eds agus Fut\u00fana -LocaleNames/ga/WS=Sam\u00f3 -LocaleNames/ga/YE=\u00c9imin +LocaleNames/ga/UZ=an Úisbéiceastáin +LocaleNames/ga/VA=Cathair na Vatacáine +LocaleNames/ga/VC=San Uinseann agus na Greanáidíní +LocaleNames/ga/VE=Veiniséala +LocaleNames/ga/VG=Oileáin Bhriotanacha na Maighdean +LocaleNames/ga/VI=Oileáin Mheiriceánacha na Maighdean +LocaleNames/ga/VN=Vítneam +LocaleNames/ga/VU=Vanuatú +LocaleNames/ga/WF=Vailís agus Futúna +LocaleNames/ga/WS=Samó +LocaleNames/ga/YE=Éimin LocaleNames/ga/ZA=an Afraic Theas LocaleNames/ga/ZM=an tSaimbia # bug #6277696 -FormatData/sr/MonthNames/0=\u0458\u0430\u043d\u0443\u0430\u0440 -FormatData/sr/MonthNames/1=\u0444\u0435\u0431\u0440\u0443\u0430\u0440 -FormatData/sr/MonthNames/2=\u043c\u0430\u0440\u0442 -FormatData/sr/MonthNames/3=\u0430\u043f\u0440\u0438\u043b -FormatData/sr/MonthNames/4=\u043c\u0430\u0458 -FormatData/sr/MonthNames/5=\u0458\u0443\u043d -FormatData/sr/MonthNames/6=\u0458\u0443\u043b -FormatData/sr/MonthNames/7=\u0430\u0432\u0433\u0443\u0441\u0442 -FormatData/sr/MonthNames/8=\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440 -FormatData/sr/MonthNames/9=\u043e\u043a\u0442\u043e\u0431\u0430\u0440 -FormatData/sr/MonthNames/10=\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440 -FormatData/sr/MonthNames/11=\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440 -FormatData/sr/MonthAbbreviations/0=\u0458\u0430\u043d -FormatData/sr/MonthAbbreviations/1=\u0444\u0435\u0431 -FormatData/sr/MonthAbbreviations/2=\u043c\u0430\u0440 -FormatData/sr/MonthAbbreviations/3=\u0430\u043f\u0440 -FormatData/sr/MonthAbbreviations/4=\u043c\u0430\u0458 -FormatData/sr/MonthAbbreviations/5=\u0458\u0443\u043d -FormatData/sr/MonthAbbreviations/6=\u0458\u0443\u043b -FormatData/sr/MonthAbbreviations/7=\u0430\u0432\u0433 -FormatData/sr/MonthAbbreviations/8=\u0441\u0435\u043f -FormatData/sr/MonthAbbreviations/9=\u043e\u043a\u0442 -FormatData/sr/MonthAbbreviations/10=\u043d\u043e\u0432 -FormatData/sr/MonthAbbreviations/11=\u0434\u0435\u0446 -FormatData/sr/DayNames/0=\u043d\u0435\u0434\u0435\u0459\u0430 -FormatData/sr/DayNames/1=\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a -FormatData/sr/DayNames/2=\u0443\u0442\u043e\u0440\u0430\u043a -FormatData/sr/DayNames/3=\u0441\u0440\u0435\u0434\u0430 -FormatData/sr/DayNames/4=\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a -FormatData/sr/DayNames/5=\u043f\u0435\u0442\u0430\u043a -FormatData/sr/DayNames/6=\u0441\u0443\u0431\u043e\u0442\u0430 -FormatData/sr/DayAbbreviations/0=\u043d\u0435\u0434 -FormatData/sr/DayAbbreviations/1=\u043f\u043e\u043d -FormatData/sr/DayAbbreviations/2=\u0443\u0442\u043e -FormatData/sr/DayAbbreviations/3=\u0441\u0440\u0435 -FormatData/sr/DayAbbreviations/4=\u0447\u0435\u0442 -FormatData/sr/DayAbbreviations/5=\u043f\u0435\u0442 -FormatData/sr/DayAbbreviations/6=\u0441\u0443\u0431 -FormatData/sr/Eras/0=\u043f. \u043d. \u0435. -FormatData/sr/Eras/1=\u043d. \u0435. +FormatData/sr/MonthNames/0=јануар +FormatData/sr/MonthNames/1=фебруар +FormatData/sr/MonthNames/2=март +FormatData/sr/MonthNames/3=април +FormatData/sr/MonthNames/4=мај +FormatData/sr/MonthNames/5=јун +FormatData/sr/MonthNames/6=јул +FormatData/sr/MonthNames/7=август +FormatData/sr/MonthNames/8=септембар +FormatData/sr/MonthNames/9=октобар +FormatData/sr/MonthNames/10=новембар +FormatData/sr/MonthNames/11=децембар +FormatData/sr/MonthAbbreviations/0=јан +FormatData/sr/MonthAbbreviations/1=феб +FormatData/sr/MonthAbbreviations/2=мар +FormatData/sr/MonthAbbreviations/3=апр +FormatData/sr/MonthAbbreviations/4=мај +FormatData/sr/MonthAbbreviations/5=јун +FormatData/sr/MonthAbbreviations/6=јул +FormatData/sr/MonthAbbreviations/7=авг +FormatData/sr/MonthAbbreviations/8=сеп +FormatData/sr/MonthAbbreviations/9=окт +FormatData/sr/MonthAbbreviations/10=нов +FormatData/sr/MonthAbbreviations/11=дец +FormatData/sr/DayNames/0=недеља +FormatData/sr/DayNames/1=понедељак +FormatData/sr/DayNames/2=уторак +FormatData/sr/DayNames/3=среда +FormatData/sr/DayNames/4=четвртак +FormatData/sr/DayNames/5=петак +FormatData/sr/DayNames/6=субота +FormatData/sr/DayAbbreviations/0=нед +FormatData/sr/DayAbbreviations/1=пон +FormatData/sr/DayAbbreviations/2=уто +FormatData/sr/DayAbbreviations/3=сре +FormatData/sr/DayAbbreviations/4=чет +FormatData/sr/DayAbbreviations/5=пет +FormatData/sr/DayAbbreviations/6=суб +FormatData/sr/Eras/0=п. н. е. +FormatData/sr/Eras/1=н. е. FormatData/sr/latn.NumberPatterns/0=#,##0.### -FormatData/sr/latn.NumberPatterns/1=#,##0.00\u00a0\u00a4 +FormatData/sr/latn.NumberPatterns/1=#,##0.00 ¤ FormatData/sr/latn.NumberPatterns/2=#,##0% FormatData/sr/latn.NumberElements/0=, FormatData/sr/latn.NumberElements/1=. @@ -4090,8 +4090,8 @@ FormatData/sr/latn.NumberElements/4=0 FormatData/sr/latn.NumberElements/5=# FormatData/sr/latn.NumberElements/6=- FormatData/sr/latn.NumberElements/7=E -FormatData/sr/latn.NumberElements/8=\u2030 -FormatData/sr/latn.NumberElements/9=\u221e +FormatData/sr/latn.NumberElements/8=‰ +FormatData/sr/latn.NumberElements/9=∞ FormatData/sr/latn.NumberElements/10=NaN FormatData/sr/TimePatterns/0=HH:mm:ss zzzz FormatData/sr/TimePatterns/1=HH:mm:ss z @@ -4102,610 +4102,610 @@ FormatData/sr/DatePatterns/1=d. MMMM y. FormatData/sr/DatePatterns/2=d. M. y. FormatData/sr/DatePatterns/3=d.M.yy. FormatData/sr/DateTimePatterns/0={1} {0} -LocaleNames/sr/af=\u0430\u0444\u0440\u0438\u043a\u0430\u043d\u0441 -LocaleNames/sr/ar=\u0430\u0440\u0430\u043f\u0441\u043a\u0438 -LocaleNames/sr/be=\u0431\u0435\u043b\u043e\u0440\u0443\u0441\u043a\u0438 -LocaleNames/sr/bg=\u0431\u0443\u0433\u0430\u0440\u0441\u043a\u0438 -LocaleNames/sr/br=\u0431\u0440\u0435\u0442\u043e\u043d\u0441\u043a\u0438 -LocaleNames/sr/ca=\u043a\u0430\u0442\u0430\u043b\u043e\u043d\u0441\u043a\u0438 -LocaleNames/sr/co=\u043a\u043e\u0440\u0437\u0438\u043a\u0430\u043d\u0441\u043a\u0438 -LocaleNames/sr/cs=\u0447\u0435\u0448\u043a\u0438 -LocaleNames/sr/da=\u0434\u0430\u043d\u0441\u043a\u0438 -LocaleNames/sr/de=\u043d\u0435\u043c\u0430\u0447\u043a\u0438 -LocaleNames/sr/el=\u0433\u0440\u0447\u043a\u0438 -LocaleNames/sr/en=\u0435\u043d\u0433\u043b\u0435\u0441\u043a\u0438 -LocaleNames/sr/eo=\u0435\u0441\u043f\u0435\u0440\u0430\u043d\u0442\u043e -LocaleNames/sr/es=\u0448\u043f\u0430\u043d\u0441\u043a\u0438 -LocaleNames/sr/et=\u0435\u0441\u0442\u043e\u043d\u0441\u043a\u0438 -LocaleNames/sr/eu=\u0431\u0430\u0441\u043a\u0438\u0458\u0441\u043a\u0438 -LocaleNames/sr/fa=\u043f\u0435\u0440\u0441\u0438\u0458\u0441\u043a\u0438 -LocaleNames/sr/fi=\u0444\u0438\u043d\u0441\u043a\u0438 -LocaleNames/sr/fr=\u0444\u0440\u0430\u043d\u0446\u0443\u0441\u043a\u0438 -LocaleNames/sr/ga=\u0438\u0440\u0441\u043a\u0438 -LocaleNames/sr/he=\u0445\u0435\u0431\u0440\u0435\u0458\u0441\u043a\u0438 -LocaleNames/sr/hi=\u0445\u0438\u043d\u0434\u0438 -LocaleNames/sr/hr=\u0445\u0440\u0432\u0430\u0442\u0441\u043a\u0438 -LocaleNames/sr/hu=\u043c\u0430\u0452\u0430\u0440\u0441\u043a\u0438 -LocaleNames/sr/hy=\u0458\u0435\u0440\u043c\u0435\u043d\u0441\u043a\u0438 -LocaleNames/sr/id=\u0438\u043d\u0434\u043e\u043d\u0435\u0436\u0430\u043d\u0441\u043a\u0438 -LocaleNames/sr/is=\u0438\u0441\u043b\u0430\u043d\u0434\u0441\u043a\u0438 -LocaleNames/sr/it=\u0438\u0442\u0430\u043b\u0438\u0458\u0430\u043d\u0441\u043a\u0438 -LocaleNames/sr/ja=\u0458\u0430\u043f\u0430\u043d\u0441\u043a\u0438 -LocaleNames/sr/ka=\u0433\u0440\u0443\u0437\u0438\u0458\u0441\u043a\u0438 -LocaleNames/sr/km=\u043a\u043c\u0435\u0440\u0441\u043a\u0438 -LocaleNames/sr/ko=\u043a\u043e\u0440\u0435\u0458\u0441\u043a\u0438 -LocaleNames/sr/ku=\u043a\u0443\u0440\u0434\u0441\u043a\u0438 -LocaleNames/sr/ky=\u043a\u0438\u0440\u0433\u0438\u0441\u043a\u0438 -LocaleNames/sr/la=\u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438 -LocaleNames/sr/lt=\u043b\u0438\u0442\u0432\u0430\u043d\u0441\u043a\u0438 -LocaleNames/sr/lv=\u043b\u0435\u0442\u043e\u043d\u0441\u043a\u0438 -LocaleNames/sr/mk=\u043c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438 -LocaleNames/sr/mn=\u043c\u043e\u043d\u0433\u043e\u043b\u0441\u043a\u0438 -LocaleNames/sr/my=\u0431\u0443\u0440\u043c\u0430\u043d\u0441\u043a\u0438 -LocaleNames/sr/nl=\u0445\u043e\u043b\u0430\u043d\u0434\u0441\u043a\u0438 -LocaleNames/sr/no=\u043d\u043e\u0440\u0432\u0435\u0448\u043a\u0438 -LocaleNames/sr/pl=\u043f\u043e\u0459\u0441\u043a\u0438 -LocaleNames/sr/pt=\u043f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0441\u043a\u0438 -LocaleNames/sr/rm=\u0440\u043e\u043c\u0430\u043d\u0448 -LocaleNames/sr/ro=\u0440\u0443\u043c\u0443\u043d\u0441\u043a\u0438 -LocaleNames/sr/ru=\u0440\u0443\u0441\u043a\u0438 -LocaleNames/sr/sa=\u0441\u0430\u043d\u0441\u043a\u0440\u0438\u0442 -LocaleNames/sr/sk=\u0441\u043b\u043e\u0432\u0430\u0447\u043a\u0438 -LocaleNames/sr/sl=\u0441\u043b\u043e\u0432\u0435\u043d\u0430\u0447\u043a\u0438 -LocaleNames/sr/sq=\u0430\u043b\u0431\u0430\u043d\u0441\u043a\u0438 -LocaleNames/sr/sr=\u0441\u0440\u043f\u0441\u043a\u0438 -LocaleNames/sr/sv=\u0448\u0432\u0435\u0434\u0441\u043a\u0438 -LocaleNames/sr/sw=\u0441\u0432\u0430\u0445\u0438\u043b\u0438 -LocaleNames/sr/tr=\u0442\u0443\u0440\u0441\u043a\u0438 -LocaleNames/sr/uk=\u0443\u043a\u0440\u0430\u0458\u0438\u043d\u0441\u043a\u0438 -LocaleNames/sr/vi=\u0432\u0438\u0458\u0435\u0442\u043d\u0430\u043c\u0441\u043a\u0438 -LocaleNames/sr/yi=\u0458\u0438\u0434\u0438\u0448 -LocaleNames/sr/zh=\u043a\u0438\u043d\u0435\u0441\u043a\u0438 -LocaleNames/sr/AD=\u0410\u043d\u0434\u043e\u0440\u0430 -LocaleNames/sr/AE=\u0423\u0458\u0435\u0434\u0438\u045a\u0435\u043d\u0438 \u0410\u0440\u0430\u043f\u0441\u043a\u0438 \u0415\u043c\u0438\u0440\u0430\u0442\u0438 -LocaleNames/sr/AF=\u0410\u0432\u0433\u0430\u043d\u0438\u0441\u0442\u0430\u043d -LocaleNames/sr/AL=\u0410\u043b\u0431\u0430\u043d\u0438\u0458\u0430 -LocaleNames/sr/AM=\u0408\u0435\u0440\u043c\u0435\u043d\u0438\u0458\u0430 -LocaleNames/sr/AO=\u0410\u043d\u0433\u043e\u043b\u0430 -LocaleNames/sr/AR=\u0410\u0440\u0433\u0435\u043d\u0442\u0438\u043d\u0430 -LocaleNames/sr/AT=\u0410\u0443\u0441\u0442\u0440\u0438\u0458\u0430 -LocaleNames/sr/AU=\u0410\u0443\u0441\u0442\u0440\u0430\u043b\u0438\u0458\u0430 -LocaleNames/sr/AW=\u0410\u0440\u0443\u0431\u0430 -LocaleNames/sr/AX=\u041e\u043b\u0430\u043d\u0434\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/AZ=\u0410\u0437\u0435\u0440\u0431\u0435\u0458\u045f\u0430\u043d -LocaleNames/sr/BA=\u0411\u043e\u0441\u043d\u0430 \u0438 \u0425\u0435\u0440\u0446\u0435\u0433\u043e\u0432\u0438\u043d\u0430 -LocaleNames/sr/BB=\u0411\u0430\u0440\u0431\u0430\u0434\u043e\u0441 -LocaleNames/sr/BD=\u0411\u0430\u043d\u0433\u043b\u0430\u0434\u0435\u0448 -LocaleNames/sr/BE=\u0411\u0435\u043b\u0433\u0438\u0458\u0430 -LocaleNames/sr/BF=\u0411\u0443\u0440\u043a\u0438\u043d\u0430 \u0424\u0430\u0441\u043e -LocaleNames/sr/BG=\u0411\u0443\u0433\u0430\u0440\u0441\u043a\u0430 -LocaleNames/sr/BH=\u0411\u0430\u0445\u0440\u0435\u0438\u043d -LocaleNames/sr/BI=\u0411\u0443\u0440\u0443\u043d\u0434\u0438 -LocaleNames/sr/BJ=\u0411\u0435\u043d\u0438\u043d -LocaleNames/sr/BM=\u0411\u0435\u0440\u043c\u0443\u0434\u0430 -LocaleNames/sr/BN=\u0411\u0440\u0443\u043d\u0435\u0458 -LocaleNames/sr/BO=\u0411\u043e\u043b\u0438\u0432\u0438\u0458\u0430 -LocaleNames/sr/BR=\u0411\u0440\u0430\u0437\u0438\u043b -LocaleNames/sr/BS=\u0411\u0430\u0445\u0430\u043c\u0438 -LocaleNames/sr/BT=\u0411\u0443\u0442\u0430\u043d -LocaleNames/sr/BV=\u041e\u0441\u0442\u0440\u0432\u043e \u0411\u0443\u0432\u0435 -LocaleNames/sr/BW=\u0411\u043e\u0446\u0432\u0430\u043d\u0430 -LocaleNames/sr/BY=\u0411\u0435\u043b\u043e\u0440\u0443\u0441\u0438\u0458\u0430 -LocaleNames/sr/BZ=\u0411\u0435\u043b\u0438\u0437\u0435 -LocaleNames/sr/CA=\u041a\u0430\u043d\u0430\u0434\u0430 -LocaleNames/sr/CC=\u041a\u043e\u043a\u043e\u0441\u043e\u0432\u0430 (\u041a\u0438\u043b\u0438\u043d\u0433\u043e\u0432\u0430) \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/CD=\u041a\u043e\u043d\u0433\u043e - \u041a\u0438\u043d\u0448\u0430\u0441\u0430 -LocaleNames/sr/CF=\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u043d\u043e\u0430\u0444\u0440\u0438\u0447\u043a\u0430 \u0420\u0435\u043f\u0443\u0431\u043b\u0438\u043a\u0430 -LocaleNames/sr/CG=\u041a\u043e\u043d\u0433\u043e - \u0411\u0440\u0430\u0437\u0430\u0432\u0438\u043b -LocaleNames/sr/CH=\u0428\u0432\u0430\u0458\u0446\u0430\u0440\u0441\u043a\u0430 -LocaleNames/sr/CI=\u041e\u0431\u0430\u043b\u0430 \u0421\u043b\u043e\u043d\u043e\u0432\u0430\u0447\u0435 (\u041a\u043e\u0442 \u0434\u2019\u0418\u0432\u043e\u0430\u0440) -LocaleNames/sr/CL=\u0427\u0438\u043b\u0435 -LocaleNames/sr/CM=\u041a\u0430\u043c\u0435\u0440\u0443\u043d -LocaleNames/sr/CN=\u041a\u0438\u043d\u0430 -LocaleNames/sr/CO=\u041a\u043e\u043b\u0443\u043c\u0431\u0438\u0458\u0430 -LocaleNames/sr/CR=\u041a\u043e\u0441\u0442\u0430\u0440\u0438\u043a\u0430 -LocaleNames/sr/CU=\u041a\u0443\u0431\u0430 -LocaleNames/sr/CV=\u0417\u0435\u043b\u0435\u043d\u043e\u0440\u0442\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/CX=\u0411\u043e\u0436\u0438\u045b\u043d\u043e \u041e\u0441\u0442\u0440\u0432\u043e -LocaleNames/sr/CY=\u041a\u0438\u043f\u0430\u0440 -LocaleNames/sr/CZ=\u0427\u0435\u0448\u043a\u0430 -LocaleNames/sr/DE=\u041d\u0435\u043c\u0430\u0447\u043a\u0430 -LocaleNames/sr/DJ=\u040f\u0438\u0431\u0443\u0442\u0438 -LocaleNames/sr/DK=\u0414\u0430\u043d\u0441\u043a\u0430 -LocaleNames/sr/DM=\u0414\u043e\u043c\u0438\u043d\u0438\u043a\u0430 -LocaleNames/sr/DO=\u0414\u043e\u043c\u0438\u043d\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u0420\u0435\u043f\u0443\u0431\u043b\u0438\u043a\u0430 -LocaleNames/sr/DZ=\u0410\u043b\u0436\u0438\u0440 -LocaleNames/sr/EC=\u0415\u043a\u0432\u0430\u0434\u043e\u0440 -LocaleNames/sr/EE=\u0415\u0441\u0442\u043e\u043d\u0438\u0458\u0430 -LocaleNames/sr/EG=\u0415\u0433\u0438\u043f\u0430\u0442 -LocaleNames/sr/EH=\u0417\u0430\u043f\u0430\u0434\u043d\u0430 \u0421\u0430\u0445\u0430\u0440\u0430 -LocaleNames/sr/ER=\u0415\u0440\u0438\u0442\u0440\u0435\u0458\u0430 -LocaleNames/sr/ES=\u0428\u043f\u0430\u043d\u0438\u0458\u0430 -LocaleNames/sr/ET=\u0415\u0442\u0438\u043e\u043f\u0438\u0458\u0430 -LocaleNames/sr/FI=\u0424\u0438\u043d\u0441\u043a\u0430 -LocaleNames/sr/FJ=\u0424\u0438\u045f\u0438 -LocaleNames/sr/FK=\u0424\u043e\u043a\u043b\u0430\u043d\u0434\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/FM=\u041c\u0438\u043a\u0440\u043e\u043d\u0435\u0437\u0438\u0458\u0430 -LocaleNames/sr/FO=\u0424\u0430\u0440\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/FR=\u0424\u0440\u0430\u043d\u0446\u0443\u0441\u043a\u0430 -LocaleNames/sr/GA=\u0413\u0430\u0431\u043e\u043d -LocaleNames/sr/GB=\u0423\u0458\u0435\u0434\u0438\u045a\u0435\u043d\u043e \u041a\u0440\u0430\u0459\u0435\u0432\u0441\u0442\u0432\u043e -LocaleNames/sr/GD=\u0413\u0440\u0435\u043d\u0430\u0434\u0430 -LocaleNames/sr/GE=\u0413\u0440\u0443\u0437\u0438\u0458\u0430 -LocaleNames/sr/GF=\u0424\u0440\u0430\u043d\u0446\u0443\u0441\u043a\u0430 \u0413\u0432\u0430\u0458\u0430\u043d\u0430 -LocaleNames/sr/GH=\u0413\u0430\u043d\u0430 -LocaleNames/sr/GI=\u0413\u0438\u0431\u0440\u0430\u043b\u0442\u0430\u0440 -LocaleNames/sr/GL=\u0413\u0440\u0435\u043d\u043b\u0430\u043d\u0434 -LocaleNames/sr/GM=\u0413\u0430\u043c\u0431\u0438\u0458\u0430 -LocaleNames/sr/GN=\u0413\u0432\u0438\u043d\u0435\u0458\u0430 -LocaleNames/sr/GP=\u0413\u0432\u0430\u0434\u0435\u043b\u0443\u043f -LocaleNames/sr/GQ=\u0415\u043a\u0432\u0430\u0442\u043e\u0440\u0438\u0458\u0430\u043b\u043d\u0430 \u0413\u0432\u0438\u043d\u0435\u0458\u0430 -LocaleNames/sr/GR=\u0413\u0440\u0447\u043a\u0430 -LocaleNames/sr/GS=\u0408\u0443\u0436\u043d\u0430 \u040f\u043e\u0440\u045f\u0438\u0458\u0430 \u0438 \u0408\u0443\u0436\u043d\u0430 \u0421\u0435\u043d\u0434\u0432\u0438\u0447\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/GT=\u0413\u0432\u0430\u0442\u0435\u043c\u0430\u043b\u0430 -LocaleNames/sr/GU=\u0413\u0443\u0430\u043c -LocaleNames/sr/GW=\u0413\u0432\u0438\u043d\u0435\u0458\u0430-\u0411\u0438\u0441\u0430\u043e -LocaleNames/sr/GY=\u0413\u0432\u0430\u0458\u0430\u043d\u0430 -LocaleNames/sr/HK=\u0421\u0410\u0420 \u0425\u043e\u043d\u0433\u043a\u043e\u043d\u0433 (\u041a\u0438\u043d\u0430) -LocaleNames/sr/HM=\u041e\u0441\u0442\u0440\u0432\u043e \u0425\u0435\u0440\u0434 \u0438 \u041c\u0435\u043a\u0434\u043e\u043d\u0430\u043b\u0434\u043e\u0432\u0430 \u043e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/HN=\u0425\u043e\u043d\u0434\u0443\u0440\u0430\u0441 -LocaleNames/sr/HR=\u0425\u0440\u0432\u0430\u0442\u0441\u043a\u0430 -LocaleNames/sr/HT=\u0425\u0430\u0438\u0442\u0438 -LocaleNames/sr/HU=\u041c\u0430\u0452\u0430\u0440\u0441\u043a\u0430 -LocaleNames/sr/ID=\u0418\u043d\u0434\u043e\u043d\u0435\u0437\u0438\u0458\u0430 -LocaleNames/sr/IE=\u0418\u0440\u0441\u043a\u0430 -LocaleNames/sr/IL=\u0418\u0437\u0440\u0430\u0435\u043b -LocaleNames/sr/IN=\u0418\u043d\u0434\u0438\u0458\u0430 -LocaleNames/sr/IQ=\u0418\u0440\u0430\u043a -LocaleNames/sr/IR=\u0418\u0440\u0430\u043d -LocaleNames/sr/IS=\u0418\u0441\u043b\u0430\u043d\u0434 -LocaleNames/sr/IT=\u0418\u0442\u0430\u043b\u0438\u0458\u0430 -LocaleNames/sr/JM=\u0408\u0430\u043c\u0430\u0458\u043a\u0430 -LocaleNames/sr/JO=\u0408\u043e\u0440\u0434\u0430\u043d -LocaleNames/sr/JP=\u0408\u0430\u043f\u0430\u043d -LocaleNames/sr/KE=\u041a\u0435\u043d\u0438\u0458\u0430 -LocaleNames/sr/KG=\u041a\u0438\u0440\u0433\u0438\u0441\u0442\u0430\u043d -LocaleNames/sr/KH=\u041a\u0430\u043c\u0431\u043e\u045f\u0430 -LocaleNames/sr/KI=\u041a\u0438\u0440\u0438\u0431\u0430\u0442\u0438 -LocaleNames/sr/KM=\u041a\u043e\u043c\u043e\u0440\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/KN=\u0421\u0435\u043d\u0442 \u041a\u0438\u0442\u0441 \u0438 \u041d\u0435\u0432\u0438\u0441 -LocaleNames/sr/KP=\u0421\u0435\u0432\u0435\u0440\u043d\u0430 \u041a\u043e\u0440\u0435\u0458\u0430 -LocaleNames/sr/KR=\u0408\u0443\u0436\u043d\u0430 \u041a\u043e\u0440\u0435\u0458\u0430 -LocaleNames/sr/KW=\u041a\u0443\u0432\u0430\u0458\u0442 -LocaleNames/sr/KY=\u041a\u0430\u0458\u043c\u0430\u043d\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/KZ=\u041a\u0430\u0437\u0430\u0445\u0441\u0442\u0430\u043d -LocaleNames/sr/LA=\u041b\u0430\u043e\u0441 -LocaleNames/sr/LB=\u041b\u0438\u0431\u0430\u043d -LocaleNames/sr/LC=\u0421\u0432\u0435\u0442\u0430 \u041b\u0443\u0446\u0438\u0458\u0430 -LocaleNames/sr/LI=\u041b\u0438\u0445\u0442\u0435\u043d\u0448\u0442\u0430\u0458\u043d -LocaleNames/sr/LK=\u0428\u0440\u0438 \u041b\u0430\u043d\u043a\u0430 -LocaleNames/sr/LR=\u041b\u0438\u0431\u0435\u0440\u0438\u0458\u0430 -LocaleNames/sr/LS=\u041b\u0435\u0441\u043e\u0442\u043e -LocaleNames/sr/LT=\u041b\u0438\u0442\u0432\u0430\u043d\u0438\u0458\u0430 -LocaleNames/sr/LU=\u041b\u0443\u043a\u0441\u0435\u043c\u0431\u0443\u0440\u0433 -LocaleNames/sr/LV=\u041b\u0435\u0442\u043e\u043d\u0438\u0458\u0430 -LocaleNames/sr/LY=\u041b\u0438\u0431\u0438\u0458\u0430 -LocaleNames/sr/MA=\u041c\u0430\u0440\u043e\u043a\u043e -LocaleNames/sr/MC=\u041c\u043e\u043d\u0430\u043a\u043e -LocaleNames/sr/MD=\u041c\u043e\u043b\u0434\u0430\u0432\u0438\u0458\u0430 -LocaleNames/sr/MG=\u041c\u0430\u0434\u0430\u0433\u0430\u0441\u043a\u0430\u0440 -LocaleNames/sr/MH=\u041c\u0430\u0440\u0448\u0430\u043b\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/MK=\u0421\u0435\u0432\u0435\u0440\u043d\u0430 \u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0438\u0458\u0430 -LocaleNames/sr/ML=\u041c\u0430\u043b\u0438 -LocaleNames/sr/MM=\u041c\u0438\u0458\u0430\u043d\u043c\u0430\u0440 (\u0411\u0443\u0440\u043c\u0430) -LocaleNames/sr/MN=\u041c\u043e\u043d\u0433\u043e\u043b\u0438\u0458\u0430 -LocaleNames/sr/MO=\u0421\u0410\u0420 \u041c\u0430\u043a\u0430\u043e (\u041a\u0438\u043d\u0430) -LocaleNames/sr/MP=\u0421\u0435\u0432\u0435\u0440\u043d\u0430 \u041c\u0430\u0440\u0438\u0458\u0430\u043d\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/MQ=\u041c\u0430\u0440\u0442\u0438\u043d\u0438\u043a -LocaleNames/sr/MR=\u041c\u0430\u0443\u0440\u0438\u0442\u0430\u043d\u0438\u0458\u0430 -LocaleNames/sr/MS=\u041c\u043e\u043d\u0441\u0435\u0440\u0430\u0442 -LocaleNames/sr/MT=\u041c\u0430\u043b\u0442\u0430 -LocaleNames/sr/MU=\u041c\u0430\u0443\u0440\u0438\u0446\u0438\u0458\u0443\u0441 -LocaleNames/sr/MV=\u041c\u0430\u043b\u0434\u0438\u0432\u0438 -LocaleNames/sr/MW=\u041c\u0430\u043b\u0430\u0432\u0438 -LocaleNames/sr/MX=\u041c\u0435\u043a\u0441\u0438\u043a\u043e -LocaleNames/sr/MY=\u041c\u0430\u043b\u0435\u0437\u0438\u0458\u0430 -LocaleNames/sr/MZ=\u041c\u043e\u0437\u0430\u043c\u0431\u0438\u043a -LocaleNames/sr/NA=\u041d\u0430\u043c\u0438\u0431\u0438\u0458\u0430 -LocaleNames/sr/NC=\u041d\u043e\u0432\u0430 \u041a\u0430\u043b\u0435\u0434\u043e\u043d\u0438\u0458\u0430 -LocaleNames/sr/NE=\u041d\u0438\u0433\u0435\u0440 -LocaleNames/sr/NF=\u041e\u0441\u0442\u0440\u0432\u043e \u041d\u043e\u0440\u0444\u043e\u043a -LocaleNames/sr/NG=\u041d\u0438\u0433\u0435\u0440\u0438\u0458\u0430 -LocaleNames/sr/NI=\u041d\u0438\u043a\u0430\u0440\u0430\u0433\u0432\u0430 -LocaleNames/sr/NL=\u0425\u043e\u043b\u0430\u043d\u0434\u0438\u0458\u0430 -LocaleNames/sr/NO=\u041d\u043e\u0440\u0432\u0435\u0448\u043a\u0430 -LocaleNames/sr/NP=\u041d\u0435\u043f\u0430\u043b -LocaleNames/sr/NR=\u041d\u0430\u0443\u0440\u0443 -LocaleNames/sr/NU=\u041d\u0438\u0443\u0435 -LocaleNames/sr/NZ=\u041d\u043e\u0432\u0438 \u0417\u0435\u043b\u0430\u043d\u0434 -LocaleNames/sr/OM=\u041e\u043c\u0430\u043d -LocaleNames/sr/PA=\u041f\u0430\u043d\u0430\u043c\u0430 -LocaleNames/sr/PE=\u041f\u0435\u0440\u0443 -LocaleNames/sr/PF=\u0424\u0440\u0430\u043d\u0446\u0443\u0441\u043a\u0430 \u041f\u043e\u043b\u0438\u043d\u0435\u0437\u0438\u0458\u0430 -LocaleNames/sr/PG=\u041f\u0430\u043f\u0443\u0430 \u041d\u043e\u0432\u0430 \u0413\u0432\u0438\u043d\u0435\u0458\u0430 -LocaleNames/sr/PH=\u0424\u0438\u043b\u0438\u043f\u0438\u043d\u0438 -LocaleNames/sr/PK=\u041f\u0430\u043a\u0438\u0441\u0442\u0430\u043d -LocaleNames/sr/PL=\u041f\u043e\u0459\u0441\u043a\u0430 -LocaleNames/sr/PM=\u0421\u0435\u043d \u041f\u0458\u0435\u0440 \u0438 \u041c\u0438\u043a\u0435\u043b\u043e\u043d -LocaleNames/sr/PN=\u041f\u0438\u0442\u043a\u0435\u0440\u043d -LocaleNames/sr/PR=\u041f\u043e\u0440\u0442\u043e\u0440\u0438\u043a\u043e -LocaleNames/sr/PS=\u041f\u0430\u043b\u0435\u0441\u0442\u0438\u043d\u0441\u043a\u0435 \u0442\u0435\u0440\u0438\u0442\u043e\u0440\u0438\u0458\u0435 -LocaleNames/sr/PT=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0438\u0458\u0430 -LocaleNames/sr/PW=\u041f\u0430\u043b\u0430\u0443 -LocaleNames/sr/PY=\u041f\u0430\u0440\u0430\u0433\u0432\u0430\u0458 -LocaleNames/sr/QA=\u041a\u0430\u0442\u0430\u0440 -LocaleNames/sr/RE=\u0420\u0435\u0438\u043d\u0438\u043e\u043d -LocaleNames/sr/RO=\u0420\u0443\u043c\u0443\u043d\u0438\u0458\u0430 -LocaleNames/sr/RU=\u0420\u0443\u0441\u0438\u0458\u0430 -LocaleNames/sr/RW=\u0420\u0443\u0430\u043d\u0434\u0430 -LocaleNames/sr/SA=\u0421\u0430\u0443\u0434\u0438\u0458\u0441\u043a\u0430 \u0410\u0440\u0430\u0431\u0438\u0458\u0430 -LocaleNames/sr/SB=\u0421\u043e\u043b\u043e\u043c\u043e\u043d\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/SC=\u0421\u0435\u0458\u0448\u0435\u043b\u0438 -LocaleNames/sr/SD=\u0421\u0443\u0434\u0430\u043d -LocaleNames/sr/SE=\u0428\u0432\u0435\u0434\u0441\u043a\u0430 -LocaleNames/sr/SG=\u0421\u0438\u043d\u0433\u0430\u043f\u0443\u0440 -LocaleNames/sr/SH=\u0421\u0432\u0435\u0442\u0430 \u0408\u0435\u043b\u0435\u043d\u0430 -LocaleNames/sr/SI=\u0421\u043b\u043e\u0432\u0435\u043d\u0438\u0458\u0430 -LocaleNames/sr/SJ=\u0421\u0432\u0430\u043b\u0431\u0430\u0440\u0434 \u0438 \u0408\u0430\u043d \u041c\u0430\u0458\u0435\u043d -LocaleNames/sr/SK=\u0421\u043b\u043e\u0432\u0430\u0447\u043a\u0430 -LocaleNames/sr/SL=\u0421\u0438\u0458\u0435\u0440\u0430 \u041b\u0435\u043e\u043d\u0435 -LocaleNames/sr/SM=\u0421\u0430\u043d \u041c\u0430\u0440\u0438\u043d\u043e -LocaleNames/sr/SN=\u0421\u0435\u043d\u0435\u0433\u0430\u043b -LocaleNames/sr/SO=\u0421\u043e\u043c\u0430\u043b\u0438\u0458\u0430 -LocaleNames/sr/SR=\u0421\u0443\u0440\u0438\u043d\u0430\u043c -LocaleNames/sr/ST=\u0421\u0430\u043e \u0422\u043e\u043c\u0435 \u0438 \u041f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 -LocaleNames/sr/SV=\u0421\u0430\u043b\u0432\u0430\u0434\u043e\u0440 -LocaleNames/sr/SY=\u0421\u0438\u0440\u0438\u0458\u0430 -LocaleNames/sr/SZ=\u0421\u0432\u0430\u0437\u0438\u043b\u0435\u043d\u0434 -LocaleNames/sr/TC=\u041e\u0441\u0442\u0440\u0432\u0430 \u0422\u0443\u0440\u043a\u0441 \u0438 \u041a\u0430\u0438\u043a\u043e\u0441 -LocaleNames/sr/TD=\u0427\u0430\u0434 -LocaleNames/sr/TF=\u0424\u0440\u0430\u043d\u0446\u0443\u0441\u043a\u0435 \u0408\u0443\u0436\u043d\u0435 \u0422\u0435\u0440\u0438\u0442\u043e\u0440\u0438\u0458\u0435 -LocaleNames/sr/TG=\u0422\u043e\u0433\u043e -LocaleNames/sr/TH=\u0422\u0430\u0458\u043b\u0430\u043d\u0434 -LocaleNames/sr/TJ=\u0422\u0430\u045f\u0438\u043a\u0438\u0441\u0442\u0430\u043d -LocaleNames/sr/TK=\u0422\u043e\u043a\u0435\u043b\u0430\u0443 -LocaleNames/sr/TL=\u0422\u0438\u043c\u043e\u0440-\u041b\u0435\u0441\u0442\u0435 (\u0418\u0441\u0442\u043e\u0447\u043d\u0438 \u0422\u0438\u043c\u043e\u0440) -LocaleNames/sr/TM=\u0422\u0443\u0440\u043a\u043c\u0435\u043d\u0438\u0441\u0442\u0430\u043d -LocaleNames/sr/TN=\u0422\u0443\u043d\u0438\u0441 -LocaleNames/sr/TO=\u0422\u043e\u043d\u0433\u0430 -LocaleNames/sr/TR=\u0422\u0443\u0440\u0441\u043a\u0430 -LocaleNames/sr/TT=\u0422\u0440\u0438\u043d\u0438\u0434\u0430\u0434 \u0438 \u0422\u043e\u0431\u0430\u0433\u043e -LocaleNames/sr/TV=\u0422\u0443\u0432\u0430\u043b\u0443 -LocaleNames/sr/TW=\u0422\u0430\u0458\u0432\u0430\u043d -LocaleNames/sr/TZ=\u0422\u0430\u043d\u0437\u0430\u043d\u0438\u0458\u0430 -LocaleNames/sr/UA=\u0423\u043a\u0440\u0430\u0458\u0438\u043d\u0430 -LocaleNames/sr/UG=\u0423\u0433\u0430\u043d\u0434\u0430 -LocaleNames/sr/UM=\u0423\u0434\u0430\u0459\u0435\u043d\u0430 \u043e\u0441\u0442\u0440\u0432\u0430 \u0421\u0410\u0414 -LocaleNames/sr/US=\u0421\u0458\u0435\u0434\u0438\u045a\u0435\u043d\u0435 \u0414\u0440\u0436\u0430\u0432\u0435 -LocaleNames/sr/UY=\u0423\u0440\u0443\u0433\u0432\u0430\u0458 -LocaleNames/sr/UZ=\u0423\u0437\u0431\u0435\u043a\u0438\u0441\u0442\u0430\u043d -LocaleNames/sr/VA=\u0412\u0430\u0442\u0438\u043a\u0430\u043d -LocaleNames/sr/VC=\u0421\u0435\u043d\u0442 \u0412\u0438\u043d\u0441\u0435\u043d\u0442 \u0438 \u0413\u0440\u0435\u043d\u0430\u0434\u0438\u043d\u0438 -LocaleNames/sr/VE=\u0412\u0435\u043d\u0435\u0446\u0443\u0435\u043b\u0430 -LocaleNames/sr/VG=\u0411\u0440\u0438\u0442\u0430\u043d\u0441\u043a\u0430 \u0414\u0435\u0432\u0438\u0447\u0430\u043d\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/VI=\u0410\u043c\u0435\u0440\u0438\u0447\u043a\u0430 \u0414\u0435\u0432\u0438\u0447\u0430\u043d\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430 -LocaleNames/sr/VN=\u0412\u0438\u0458\u0435\u0442\u043d\u0430\u043c -LocaleNames/sr/VU=\u0412\u0430\u043d\u0443\u0430\u0442\u0443 -LocaleNames/sr/WF=\u0412\u0430\u043b\u0438\u0441 \u0438 \u0424\u0443\u0442\u0443\u043d\u0430 -LocaleNames/sr/WS=\u0421\u0430\u043c\u043e\u0430 -LocaleNames/sr/YE=\u0408\u0435\u043c\u0435\u043d -LocaleNames/sr/YT=\u041c\u0430\u0458\u043e\u0442 -LocaleNames/sr/ZM=\u0417\u0430\u043c\u0431\u0438\u0458\u0430 -LocaleNames/sr/ZW=\u0417\u0438\u043c\u0431\u0430\u0431\u0432\u0435 -CurrencyNames/sr_CS/EUR=\u20ac +LocaleNames/sr/af=африканс +LocaleNames/sr/ar=арапски +LocaleNames/sr/be=белоруски +LocaleNames/sr/bg=бугарски +LocaleNames/sr/br=бретонски +LocaleNames/sr/ca=каталонски +LocaleNames/sr/co=корзикански +LocaleNames/sr/cs=чешки +LocaleNames/sr/da=дански +LocaleNames/sr/de=немачки +LocaleNames/sr/el=грчки +LocaleNames/sr/en=енглески +LocaleNames/sr/eo=есперанто +LocaleNames/sr/es=шпански +LocaleNames/sr/et=естонски +LocaleNames/sr/eu=баскијски +LocaleNames/sr/fa=персијски +LocaleNames/sr/fi=фински +LocaleNames/sr/fr=француски +LocaleNames/sr/ga=ирски +LocaleNames/sr/he=хебрејски +LocaleNames/sr/hi=хинди +LocaleNames/sr/hr=хрватски +LocaleNames/sr/hu=мађарски +LocaleNames/sr/hy=јерменски +LocaleNames/sr/id=индонежански +LocaleNames/sr/is=исландски +LocaleNames/sr/it=италијански +LocaleNames/sr/ja=јапански +LocaleNames/sr/ka=грузијски +LocaleNames/sr/km=кмерски +LocaleNames/sr/ko=корејски +LocaleNames/sr/ku=курдски +LocaleNames/sr/ky=киргиски +LocaleNames/sr/la=латински +LocaleNames/sr/lt=литвански +LocaleNames/sr/lv=летонски +LocaleNames/sr/mk=македонски +LocaleNames/sr/mn=монголски +LocaleNames/sr/my=бурмански +LocaleNames/sr/nl=холандски +LocaleNames/sr/no=норвешки +LocaleNames/sr/pl=пољски +LocaleNames/sr/pt=португалски +LocaleNames/sr/rm=романш +LocaleNames/sr/ro=румунски +LocaleNames/sr/ru=руски +LocaleNames/sr/sa=санскрит +LocaleNames/sr/sk=словачки +LocaleNames/sr/sl=словеначки +LocaleNames/sr/sq=албански +LocaleNames/sr/sr=српски +LocaleNames/sr/sv=шведски +LocaleNames/sr/sw=свахили +LocaleNames/sr/tr=турски +LocaleNames/sr/uk=украјински +LocaleNames/sr/vi=вијетнамски +LocaleNames/sr/yi=јидиш +LocaleNames/sr/zh=кинески +LocaleNames/sr/AD=Андора +LocaleNames/sr/AE=Уједињени Арапски Емирати +LocaleNames/sr/AF=Авганистан +LocaleNames/sr/AL=Албанија +LocaleNames/sr/AM=Јерменија +LocaleNames/sr/AO=Ангола +LocaleNames/sr/AR=Аргентина +LocaleNames/sr/AT=Аустрија +LocaleNames/sr/AU=Аустралија +LocaleNames/sr/AW=Аруба +LocaleNames/sr/AX=Оландска Острва +LocaleNames/sr/AZ=Азербејџан +LocaleNames/sr/BA=Босна и Херцеговина +LocaleNames/sr/BB=Барбадос +LocaleNames/sr/BD=Бангладеш +LocaleNames/sr/BE=Белгија +LocaleNames/sr/BF=Буркина Фасо +LocaleNames/sr/BG=Бугарска +LocaleNames/sr/BH=Бахреин +LocaleNames/sr/BI=Бурунди +LocaleNames/sr/BJ=Бенин +LocaleNames/sr/BM=Бермуда +LocaleNames/sr/BN=Брунеј +LocaleNames/sr/BO=Боливија +LocaleNames/sr/BR=Бразил +LocaleNames/sr/BS=Бахами +LocaleNames/sr/BT=Бутан +LocaleNames/sr/BV=Острво Буве +LocaleNames/sr/BW=Боцвана +LocaleNames/sr/BY=Белорусија +LocaleNames/sr/BZ=Белизе +LocaleNames/sr/CA=Канада +LocaleNames/sr/CC=Кокосова (Килингова) Острва +LocaleNames/sr/CD=Конго - Киншаса +LocaleNames/sr/CF=Централноафричка Република +LocaleNames/sr/CG=Конго - Бразавил +LocaleNames/sr/CH=Швајцарска +LocaleNames/sr/CI=Обала Слоноваче (Кот д’Ивоар) +LocaleNames/sr/CL=Чиле +LocaleNames/sr/CM=Камерун +LocaleNames/sr/CN=Кина +LocaleNames/sr/CO=Колумбија +LocaleNames/sr/CR=Костарика +LocaleNames/sr/CU=Куба +LocaleNames/sr/CV=Зеленортска Острва +LocaleNames/sr/CX=Божићно Острво +LocaleNames/sr/CY=Кипар +LocaleNames/sr/CZ=Чешка +LocaleNames/sr/DE=Немачка +LocaleNames/sr/DJ=Џибути +LocaleNames/sr/DK=Данска +LocaleNames/sr/DM=Доминика +LocaleNames/sr/DO=Доминиканска Република +LocaleNames/sr/DZ=Алжир +LocaleNames/sr/EC=Еквадор +LocaleNames/sr/EE=Естонија +LocaleNames/sr/EG=Египат +LocaleNames/sr/EH=Западна Сахара +LocaleNames/sr/ER=Еритреја +LocaleNames/sr/ES=Шпанија +LocaleNames/sr/ET=Етиопија +LocaleNames/sr/FI=Финска +LocaleNames/sr/FJ=Фиџи +LocaleNames/sr/FK=Фокландска Острва +LocaleNames/sr/FM=Микронезија +LocaleNames/sr/FO=Фарска Острва +LocaleNames/sr/FR=Француска +LocaleNames/sr/GA=Габон +LocaleNames/sr/GB=Уједињено Краљевство +LocaleNames/sr/GD=Гренада +LocaleNames/sr/GE=Грузија +LocaleNames/sr/GF=Француска Гвајана +LocaleNames/sr/GH=Гана +LocaleNames/sr/GI=Гибралтар +LocaleNames/sr/GL=Гренланд +LocaleNames/sr/GM=Гамбија +LocaleNames/sr/GN=Гвинеја +LocaleNames/sr/GP=Гваделуп +LocaleNames/sr/GQ=Екваторијална Гвинеја +LocaleNames/sr/GR=Грчка +LocaleNames/sr/GS=Јужна Џорџија и Јужна Сендвичка Острва +LocaleNames/sr/GT=Гватемала +LocaleNames/sr/GU=Гуам +LocaleNames/sr/GW=Гвинеја-Бисао +LocaleNames/sr/GY=Гвајана +LocaleNames/sr/HK=САР Хонгконг (Кина) +LocaleNames/sr/HM=Острво Херд и Мекдоналдова острва +LocaleNames/sr/HN=Хондурас +LocaleNames/sr/HR=Хрватска +LocaleNames/sr/HT=Хаити +LocaleNames/sr/HU=Мађарска +LocaleNames/sr/ID=Индонезија +LocaleNames/sr/IE=Ирска +LocaleNames/sr/IL=Израел +LocaleNames/sr/IN=Индија +LocaleNames/sr/IQ=Ирак +LocaleNames/sr/IR=Иран +LocaleNames/sr/IS=Исланд +LocaleNames/sr/IT=Италија +LocaleNames/sr/JM=Јамајка +LocaleNames/sr/JO=Јордан +LocaleNames/sr/JP=Јапан +LocaleNames/sr/KE=Кенија +LocaleNames/sr/KG=Киргистан +LocaleNames/sr/KH=Камбоџа +LocaleNames/sr/KI=Кирибати +LocaleNames/sr/KM=Коморска Острва +LocaleNames/sr/KN=Сент Китс и Невис +LocaleNames/sr/KP=Северна Кореја +LocaleNames/sr/KR=Јужна Кореја +LocaleNames/sr/KW=Кувајт +LocaleNames/sr/KY=Кајманска Острва +LocaleNames/sr/KZ=Казахстан +LocaleNames/sr/LA=Лаос +LocaleNames/sr/LB=Либан +LocaleNames/sr/LC=Света Луција +LocaleNames/sr/LI=Лихтенштајн +LocaleNames/sr/LK=Шри Ланка +LocaleNames/sr/LR=Либерија +LocaleNames/sr/LS=Лесото +LocaleNames/sr/LT=Литванија +LocaleNames/sr/LU=Луксембург +LocaleNames/sr/LV=Летонија +LocaleNames/sr/LY=Либија +LocaleNames/sr/MA=Мароко +LocaleNames/sr/MC=Монако +LocaleNames/sr/MD=Молдавија +LocaleNames/sr/MG=Мадагаскар +LocaleNames/sr/MH=Маршалска Острва +LocaleNames/sr/MK=Северна Македонија +LocaleNames/sr/ML=Мали +LocaleNames/sr/MM=Мијанмар (Бурма) +LocaleNames/sr/MN=Монголија +LocaleNames/sr/MO=САР Макао (Кина) +LocaleNames/sr/MP=Северна Маријанска Острва +LocaleNames/sr/MQ=Мартиник +LocaleNames/sr/MR=Мауританија +LocaleNames/sr/MS=Монсерат +LocaleNames/sr/MT=Малта +LocaleNames/sr/MU=Маурицијус +LocaleNames/sr/MV=Малдиви +LocaleNames/sr/MW=Малави +LocaleNames/sr/MX=Мексико +LocaleNames/sr/MY=Малезија +LocaleNames/sr/MZ=Мозамбик +LocaleNames/sr/NA=Намибија +LocaleNames/sr/NC=Нова Каледонија +LocaleNames/sr/NE=Нигер +LocaleNames/sr/NF=Острво Норфок +LocaleNames/sr/NG=Нигерија +LocaleNames/sr/NI=Никарагва +LocaleNames/sr/NL=Холандија +LocaleNames/sr/NO=Норвешка +LocaleNames/sr/NP=Непал +LocaleNames/sr/NR=Науру +LocaleNames/sr/NU=Ниуе +LocaleNames/sr/NZ=Нови Зеланд +LocaleNames/sr/OM=Оман +LocaleNames/sr/PA=Панама +LocaleNames/sr/PE=Перу +LocaleNames/sr/PF=Француска Полинезија +LocaleNames/sr/PG=Папуа Нова Гвинеја +LocaleNames/sr/PH=Филипини +LocaleNames/sr/PK=Пакистан +LocaleNames/sr/PL=Пољска +LocaleNames/sr/PM=Сен Пјер и Микелон +LocaleNames/sr/PN=Питкерн +LocaleNames/sr/PR=Порторико +LocaleNames/sr/PS=Палестинске територије +LocaleNames/sr/PT=Португалија +LocaleNames/sr/PW=Палау +LocaleNames/sr/PY=Парагвај +LocaleNames/sr/QA=Катар +LocaleNames/sr/RE=Реинион +LocaleNames/sr/RO=Румунија +LocaleNames/sr/RU=Русија +LocaleNames/sr/RW=Руанда +LocaleNames/sr/SA=Саудијска Арабија +LocaleNames/sr/SB=Соломонска Острва +LocaleNames/sr/SC=Сејшели +LocaleNames/sr/SD=Судан +LocaleNames/sr/SE=Шведска +LocaleNames/sr/SG=Сингапур +LocaleNames/sr/SH=Света Јелена +LocaleNames/sr/SI=Словенија +LocaleNames/sr/SJ=Свалбард и Јан Мајен +LocaleNames/sr/SK=Словачка +LocaleNames/sr/SL=Сијера Леоне +LocaleNames/sr/SM=Сан Марино +LocaleNames/sr/SN=Сенегал +LocaleNames/sr/SO=Сомалија +LocaleNames/sr/SR=Суринам +LocaleNames/sr/ST=Сао Томе и Принципе +LocaleNames/sr/SV=Салвадор +LocaleNames/sr/SY=Сирија +LocaleNames/sr/SZ=Свазиленд +LocaleNames/sr/TC=Острва Туркс и Каикос +LocaleNames/sr/TD=Чад +LocaleNames/sr/TF=Француске Јужне Територије +LocaleNames/sr/TG=Того +LocaleNames/sr/TH=Тајланд +LocaleNames/sr/TJ=Таџикистан +LocaleNames/sr/TK=Токелау +LocaleNames/sr/TL=Тимор-Лесте (Источни Тимор) +LocaleNames/sr/TM=Туркменистан +LocaleNames/sr/TN=Тунис +LocaleNames/sr/TO=Тонга +LocaleNames/sr/TR=Турска +LocaleNames/sr/TT=Тринидад и Тобаго +LocaleNames/sr/TV=Тувалу +LocaleNames/sr/TW=Тајван +LocaleNames/sr/TZ=Танзанија +LocaleNames/sr/UA=Украјина +LocaleNames/sr/UG=Уганда +LocaleNames/sr/UM=Удаљена острва САД +LocaleNames/sr/US=Сједињене Државе +LocaleNames/sr/UY=Уругвај +LocaleNames/sr/UZ=Узбекистан +LocaleNames/sr/VA=Ватикан +LocaleNames/sr/VC=Сент Винсент и Гренадини +LocaleNames/sr/VE=Венецуела +LocaleNames/sr/VG=Британска Девичанска Острва +LocaleNames/sr/VI=Америчка Девичанска Острва +LocaleNames/sr/VN=Вијетнам +LocaleNames/sr/VU=Вануату +LocaleNames/sr/WF=Валис и Футуна +LocaleNames/sr/WS=Самоа +LocaleNames/sr/YE=Јемен +LocaleNames/sr/YT=Мајот +LocaleNames/sr/ZM=Замбија +LocaleNames/sr/ZW=Зимбабве +CurrencyNames/sr_CS/EUR=€ # bug 6498742: data is changed -CurrencyNames/sr_BA/BAM=\u041a\u041c +CurrencyNames/sr_BA/BAM=КМ -CurrencyNames/sr_BA/EUR=\u20ac +CurrencyNames/sr_BA/EUR=€ # bug #6351682 Country name for Korean is wrong in Simplified Chinese -LocaleNames/zh/KP=\u671d\u9c9c -LocaleNames/zh/KR=\u97e9\u56fd +LocaleNames/zh/KP=朝鲜 +LocaleNames/zh/KR=韩国 # bug 6379382: Finnish time of day should be formatted as "H.mm.ss", not "hh:mm:ss" FormatData/fi/TimePatterns/0=H.mm.ss zzzz FormatData/fi/TimePatterns/1=H.mm.ss z # bug 6498742: data for IR & ZW changed -LocaleNames/pt_PT/IR=Ir\u00e3o -LocaleNames/pt_PT/ZW=Zimbabu\u00e9 - -LocaleNames/el/ar=\u0391\u03c1\u03b1\u03b2\u03b9\u03ba\u03ac -LocaleNames/el/be=\u039b\u03b5\u03c5\u03ba\u03bf\u03c1\u03c9\u03c3\u03b9\u03ba\u03ac -LocaleNames/el/bg=\u0392\u03bf\u03c5\u03bb\u03b3\u03b1\u03c1\u03b9\u03ba\u03ac -LocaleNames/el/bn=\u0392\u03b5\u03b3\u03b3\u03b1\u03bb\u03b9\u03ba\u03ac -LocaleNames/el/bo=\u0398\u03b9\u03b2\u03b5\u03c4\u03b9\u03b1\u03bd\u03ac -LocaleNames/el/bs=\u0392\u03bf\u03c3\u03bd\u03b9\u03b1\u03ba\u03ac -LocaleNames/el/ca=\u039a\u03b1\u03c4\u03b1\u03bb\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/co=\u039a\u03bf\u03c1\u03c3\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/cs=\u03a4\u03c3\u03b5\u03c7\u03b9\u03ba\u03ac -LocaleNames/el/cy=\u039f\u03c5\u03b1\u03bb\u03b9\u03ba\u03ac -LocaleNames/el/da=\u0394\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/de=\u0393\u03b5\u03c1\u03bc\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/el=\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/en=\u0391\u03b3\u03b3\u03bb\u03b9\u03ba\u03ac -LocaleNames/el/es=\u0399\u03c3\u03c0\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/et=\u0395\u03c3\u03b8\u03bf\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/eu=\u0392\u03b1\u03c3\u03ba\u03b9\u03ba\u03ac -LocaleNames/el/fa=\u03a0\u03b5\u03c1\u03c3\u03b9\u03ba\u03ac -LocaleNames/el/fi=\u03a6\u03b9\u03bd\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac -LocaleNames/el/fr=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ac -LocaleNames/el/ga=\u0399\u03c1\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac -LocaleNames/el/gd=\u03a3\u03ba\u03c9\u03c4\u03b9\u03ba\u03ac \u039a\u03b5\u03bb\u03c4\u03b9\u03ba\u03ac -LocaleNames/el/he=\u0395\u03b2\u03c1\u03b1\u03ca\u03ba\u03ac -LocaleNames/el/hi=\u03a7\u03af\u03bd\u03c4\u03b9 -LocaleNames/el/hr=\u039a\u03c1\u03bf\u03b1\u03c4\u03b9\u03ba\u03ac -LocaleNames/el/hu=\u039f\u03c5\u03b3\u03b3\u03c1\u03b9\u03ba\u03ac -LocaleNames/el/hy=\u0391\u03c1\u03bc\u03b5\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/id=\u0399\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03b9\u03b1\u03ba\u03ac -LocaleNames/el/is=\u0399\u03c3\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac -LocaleNames/el/it=\u0399\u03c4\u03b1\u03bb\u03b9\u03ba\u03ac -LocaleNames/el/ja=\u0399\u03b1\u03c0\u03c9\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/ka=\u0393\u03b5\u03c9\u03c1\u03b3\u03b9\u03b1\u03bd\u03ac -LocaleNames/el/ko=\u039a\u03bf\u03c1\u03b5\u03b1\u03c4\u03b9\u03ba\u03ac -LocaleNames/el/la=\u039b\u03b1\u03c4\u03b9\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/lt=\u039b\u03b9\u03b8\u03bf\u03c5\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/lv=\u039b\u03b5\u03c4\u03bf\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/mk=\u03a3\u03bb\u03b1\u03b2\u03bf\u03bc\u03b1\u03ba\u03b5\u03b4\u03bf\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/mn=\u039c\u03bf\u03b3\u03b3\u03bf\u03bb\u03b9\u03ba\u03ac -LocaleNames/el/mt=\u039c\u03b1\u03bb\u03c4\u03b5\u03b6\u03b9\u03ba\u03ac -LocaleNames/el/no=\u039d\u03bf\u03c1\u03b2\u03b7\u03b3\u03b9\u03ba\u03ac -LocaleNames/el/pl=\u03a0\u03bf\u03bb\u03c9\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/pt=\u03a0\u03bf\u03c1\u03c4\u03bf\u03b3\u03b1\u03bb\u03b9\u03ba\u03ac -LocaleNames/el/ro=\u03a1\u03bf\u03c5\u03bc\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/ru=\u03a1\u03c9\u03c3\u03b9\u03ba\u03ac -LocaleNames/el/sk=\u03a3\u03bb\u03bf\u03b2\u03b1\u03ba\u03b9\u03ba\u03ac -LocaleNames/el/sl=\u03a3\u03bb\u03bf\u03b2\u03b5\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/sq=\u0391\u03bb\u03b2\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/sr=\u03a3\u03b5\u03c1\u03b2\u03b9\u03ba\u03ac -LocaleNames/el/sv=\u03a3\u03bf\u03c5\u03b7\u03b4\u03b9\u03ba\u03ac -LocaleNames/el/th=\u03a4\u03b1\u03ca\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac -LocaleNames/el/tr=\u03a4\u03bf\u03c5\u03c1\u03ba\u03b9\u03ba\u03ac -LocaleNames/el/uk=\u039f\u03c5\u03ba\u03c1\u03b1\u03bd\u03b9\u03ba\u03ac -LocaleNames/el/vi=\u0392\u03b9\u03b5\u03c4\u03bd\u03b1\u03bc\u03b9\u03ba\u03ac -LocaleNames/el/yi=\u0393\u03af\u03bd\u03c4\u03b9\u03c2 -LocaleNames/el/zh=\u039a\u03b9\u03bd\u03b5\u03b6\u03b9\u03ba\u03ac -LocaleNames/el/AD=\u0391\u03bd\u03b4\u03cc\u03c1\u03b1 -LocaleNames/el/AE=\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03b1 \u0391\u03c1\u03b1\u03b2\u03b9\u03ba\u03ac \u0395\u03bc\u03b9\u03c1\u03ac\u03c4\u03b1 -LocaleNames/el/AF=\u0391\u03c6\u03b3\u03b1\u03bd\u03b9\u03c3\u03c4\u03ac\u03bd -LocaleNames/el/AG=\u0391\u03bd\u03c4\u03af\u03b3\u03ba\u03bf\u03c5\u03b1 \u03ba\u03b1\u03b9 \u039c\u03c0\u03b1\u03c1\u03bc\u03c0\u03bf\u03cd\u03bd\u03c4\u03b1 -LocaleNames/el/AI=\u0391\u03bd\u03b3\u03ba\u03bf\u03c5\u03af\u03bb\u03b1 -LocaleNames/el/AL=\u0391\u03bb\u03b2\u03b1\u03bd\u03af\u03b1 -LocaleNames/el/AM=\u0391\u03c1\u03bc\u03b5\u03bd\u03af\u03b1 -LocaleNames/el/AO=\u0391\u03b3\u03ba\u03cc\u03bb\u03b1 -LocaleNames/el/AQ=\u0391\u03bd\u03c4\u03b1\u03c1\u03ba\u03c4\u03b9\u03ba\u03ae -LocaleNames/el/AR=\u0391\u03c1\u03b3\u03b5\u03bd\u03c4\u03b9\u03bd\u03ae -LocaleNames/el/AS=\u0391\u03bc\u03b5\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ae \u03a3\u03b1\u03bc\u03cc\u03b1 -LocaleNames/el/AT=\u0391\u03c5\u03c3\u03c4\u03c1\u03af\u03b1 -LocaleNames/el/AU=\u0391\u03c5\u03c3\u03c4\u03c1\u03b1\u03bb\u03af\u03b1 -LocaleNames/el/AW=\u0391\u03c1\u03bf\u03cd\u03bc\u03c0\u03b1 -LocaleNames/el/AX=\u039d\u03ae\u03c3\u03bf\u03b9 \u038c\u03bb\u03b1\u03bd\u03c4 -LocaleNames/el/AZ=\u0391\u03b6\u03b5\u03c1\u03bc\u03c0\u03b1\u03ca\u03c4\u03b6\u03ac\u03bd -LocaleNames/el/BA=\u0392\u03bf\u03c3\u03bd\u03af\u03b1 - \u0395\u03c1\u03b6\u03b5\u03b3\u03bf\u03b2\u03af\u03bd\u03b7 -LocaleNames/el/BB=\u039c\u03c0\u03b1\u03c1\u03bc\u03c0\u03ad\u03b9\u03bd\u03c4\u03bf\u03c2 -LocaleNames/el/BD=\u039c\u03c0\u03b1\u03bd\u03b3\u03ba\u03bb\u03b1\u03bd\u03c4\u03ad\u03c2 -LocaleNames/el/BE=\u0392\u03ad\u03bb\u03b3\u03b9\u03bf -LocaleNames/el/BF=\u039c\u03c0\u03bf\u03c5\u03c1\u03ba\u03af\u03bd\u03b1 \u03a6\u03ac\u03c3\u03bf -LocaleNames/el/BG=\u0392\u03bf\u03c5\u03bb\u03b3\u03b1\u03c1\u03af\u03b1 -LocaleNames/el/BH=\u039c\u03c0\u03b1\u03c7\u03c1\u03ad\u03b9\u03bd -LocaleNames/el/BI=\u039c\u03c0\u03bf\u03c5\u03c1\u03bf\u03cd\u03bd\u03c4\u03b9 -LocaleNames/el/BJ=\u039c\u03c0\u03b5\u03bd\u03af\u03bd -LocaleNames/el/BM=\u0392\u03b5\u03c1\u03bc\u03bf\u03cd\u03b4\u03b5\u03c2 -LocaleNames/el/BN=\u039c\u03c0\u03c1\u03bf\u03c5\u03bd\u03ad\u03b9 -LocaleNames/el/BO=\u0392\u03bf\u03bb\u03b9\u03b2\u03af\u03b1 -LocaleNames/el/BR=\u0392\u03c1\u03b1\u03b6\u03b9\u03bb\u03af\u03b1 -LocaleNames/el/BS=\u039c\u03c0\u03b1\u03c7\u03ac\u03bc\u03b5\u03c2 -LocaleNames/el/BT=\u039c\u03c0\u03bf\u03c5\u03c4\u03ac\u03bd -LocaleNames/el/BV=\u039d\u03ae\u03c3\u03bf\u03c2 \u039c\u03c0\u03bf\u03c5\u03b2\u03ad -LocaleNames/el/BW=\u039c\u03c0\u03bf\u03c4\u03c3\u03bf\u03c5\u03ac\u03bd\u03b1 -LocaleNames/el/BY=\u039b\u03b5\u03c5\u03ba\u03bf\u03c1\u03c9\u03c3\u03af\u03b1 -LocaleNames/el/BZ=\u039c\u03c0\u03b5\u03bb\u03af\u03b6 -LocaleNames/el/CA=\u039a\u03b1\u03bd\u03b1\u03b4\u03ac\u03c2 -LocaleNames/el/CC=\u039d\u03ae\u03c3\u03bf\u03b9 \u039a\u03cc\u03ba\u03bf\u03c2 (\u039a\u03af\u03bb\u03b9\u03bd\u03b3\u03ba) -LocaleNames/el/CD=\u039a\u03bf\u03bd\u03b3\u03ba\u03cc - \u039a\u03b9\u03bd\u03c3\u03ac\u03c3\u03b1 -LocaleNames/el/CF=\u039a\u03b5\u03bd\u03c4\u03c1\u03bf\u03b1\u03c6\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ae \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1 -LocaleNames/el/CG=\u039a\u03bf\u03bd\u03b3\u03ba\u03cc - \u039c\u03c0\u03c1\u03b1\u03b6\u03b1\u03b2\u03af\u03bb -LocaleNames/el/CH=\u0395\u03bb\u03b2\u03b5\u03c4\u03af\u03b1 -LocaleNames/el/CI=\u0391\u03ba\u03c4\u03ae \u0395\u03bb\u03b5\u03c6\u03b1\u03bd\u03c4\u03bf\u03c3\u03c4\u03bf\u03cd -LocaleNames/el/CK=\u039d\u03ae\u03c3\u03bf\u03b9 \u039a\u03bf\u03c5\u03ba -LocaleNames/el/CL=\u03a7\u03b9\u03bb\u03ae -LocaleNames/el/CM=\u039a\u03b1\u03bc\u03b5\u03c1\u03bf\u03cd\u03bd -LocaleNames/el/CN=\u039a\u03af\u03bd\u03b1 -LocaleNames/el/CO=\u039a\u03bf\u03bb\u03bf\u03bc\u03b2\u03af\u03b1 -LocaleNames/el/CR=\u039a\u03cc\u03c3\u03c4\u03b1 \u03a1\u03af\u03ba\u03b1 -LocaleNames/el/CU=\u039a\u03bf\u03cd\u03b2\u03b1 -LocaleNames/el/CV=\u03a0\u03c1\u03ac\u03c3\u03b9\u03bd\u03bf \u0391\u03ba\u03c1\u03c9\u03c4\u03ae\u03c1\u03b9\u03bf -LocaleNames/el/CX=\u039d\u03ae\u03c3\u03bf\u03c2 \u03c4\u03c9\u03bd \u03a7\u03c1\u03b9\u03c3\u03c4\u03bf\u03c5\u03b3\u03ad\u03bd\u03bd\u03c9\u03bd -LocaleNames/el/CY=\u039a\u03cd\u03c0\u03c1\u03bf\u03c2 -LocaleNames/el/CZ=\u03a4\u03c3\u03b5\u03c7\u03af\u03b1 -LocaleNames/el/DE=\u0393\u03b5\u03c1\u03bc\u03b1\u03bd\u03af\u03b1 -LocaleNames/el/DJ=\u03a4\u03b6\u03b9\u03bc\u03c0\u03bf\u03c5\u03c4\u03af -LocaleNames/el/DK=\u0394\u03b1\u03bd\u03af\u03b1 -LocaleNames/el/DM=\u039d\u03c4\u03bf\u03bc\u03af\u03bd\u03b9\u03ba\u03b1 -LocaleNames/el/DO=\u0394\u03bf\u03bc\u03b9\u03bd\u03b9\u03ba\u03b1\u03bd\u03ae \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1 -LocaleNames/el/DZ=\u0391\u03bb\u03b3\u03b5\u03c1\u03af\u03b1 -LocaleNames/el/EC=\u0399\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03cc\u03c2 -LocaleNames/el/EE=\u0395\u03c3\u03b8\u03bf\u03bd\u03af\u03b1 -LocaleNames/el/EG=\u0391\u03af\u03b3\u03c5\u03c0\u03c4\u03bf\u03c2 -LocaleNames/el/EH=\u0394\u03c5\u03c4\u03b9\u03ba\u03ae \u03a3\u03b1\u03c7\u03ac\u03c1\u03b1 -LocaleNames/el/ER=\u0395\u03c1\u03c5\u03b8\u03c1\u03b1\u03af\u03b1 -LocaleNames/el/ES=\u0399\u03c3\u03c0\u03b1\u03bd\u03af\u03b1 -LocaleNames/el/ET=\u0391\u03b9\u03b8\u03b9\u03bf\u03c0\u03af\u03b1 -LocaleNames/el/FI=\u03a6\u03b9\u03bd\u03bb\u03b1\u03bd\u03b4\u03af\u03b1 -LocaleNames/el/FJ=\u03a6\u03af\u03c4\u03b6\u03b9 -LocaleNames/el/FK=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a6\u03cc\u03ba\u03bb\u03b1\u03bd\u03c4 -LocaleNames/el/FM=\u039c\u03b9\u03ba\u03c1\u03bf\u03bd\u03b7\u03c3\u03af\u03b1 -LocaleNames/el/FO=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a6\u03b5\u03c1\u03cc\u03b5\u03c2 -LocaleNames/el/FR=\u0393\u03b1\u03bb\u03bb\u03af\u03b1 -LocaleNames/el/GA=\u0393\u03ba\u03b1\u03bc\u03c0\u03cc\u03bd -LocaleNames/el/GB=\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03bf \u0392\u03b1\u03c3\u03af\u03bb\u03b5\u03b9\u03bf -LocaleNames/el/GD=\u0393\u03c1\u03b5\u03bd\u03ac\u03b4\u03b1 -LocaleNames/el/GE=\u0393\u03b5\u03c9\u03c1\u03b3\u03af\u03b1 -LocaleNames/el/GF=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ae \u0393\u03bf\u03c5\u03b9\u03ac\u03bd\u03b1 -LocaleNames/el/GH=\u0393\u03ba\u03ac\u03bd\u03b1 -LocaleNames/el/GI=\u0393\u03b9\u03b2\u03c1\u03b1\u03bb\u03c4\u03ac\u03c1 -LocaleNames/el/GL=\u0393\u03c1\u03bf\u03b9\u03bb\u03b1\u03bd\u03b4\u03af\u03b1 -LocaleNames/el/GM=\u0393\u03ba\u03ac\u03bc\u03c0\u03b9\u03b1 -LocaleNames/el/GN=\u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1 -LocaleNames/el/GP=\u0393\u03bf\u03c5\u03b1\u03b4\u03b5\u03bb\u03bf\u03cd\u03c0\u03b7 -LocaleNames/el/GQ=\u0399\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03ae \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1 -LocaleNames/el/GS=\u039d\u03ae\u03c3\u03bf\u03b9 \u039d\u03cc\u03c4\u03b9\u03b1 \u0393\u03b5\u03c9\u03c1\u03b3\u03af\u03b1 \u03ba\u03b1\u03b9 \u039d\u03cc\u03c4\u03b9\u03b5\u03c2 \u03a3\u03ac\u03bd\u03c4\u03bf\u03c5\u03b9\u03c4\u03c2 -LocaleNames/el/GT=\u0393\u03bf\u03c5\u03b1\u03c4\u03b5\u03bc\u03ac\u03bb\u03b1 -LocaleNames/el/GU=\u0393\u03ba\u03bf\u03c5\u03ac\u03bc -LocaleNames/el/GW=\u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1 \u039c\u03c0\u03b9\u03c3\u03ac\u03bf\u03c5 -LocaleNames/el/GY=\u0393\u03bf\u03c5\u03b9\u03ac\u03bd\u03b1 -LocaleNames/el/HK=\u03a7\u03bf\u03bd\u03b3\u03ba \u039a\u03bf\u03bd\u03b3\u03ba \u0395\u0394\u03a0 \u039a\u03af\u03bd\u03b1\u03c2 -LocaleNames/el/HM=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a7\u03b5\u03c1\u03bd\u03c4 \u03ba\u03b1\u03b9 \u039c\u03b1\u03ba\u03bd\u03c4\u03cc\u03bd\u03b1\u03bb\u03bd\u03c4 -LocaleNames/el/HN=\u039f\u03bd\u03b4\u03bf\u03cd\u03c1\u03b1 -LocaleNames/el/HR=\u039a\u03c1\u03bf\u03b1\u03c4\u03af\u03b1 -LocaleNames/el/HT=\u0391\u03ca\u03c4\u03ae -LocaleNames/el/HU=\u039f\u03c5\u03b3\u03b3\u03b1\u03c1\u03af\u03b1 -LocaleNames/el/ID=\u0399\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03af\u03b1 -LocaleNames/el/IE=\u0399\u03c1\u03bb\u03b1\u03bd\u03b4\u03af\u03b1 -LocaleNames/el/IL=\u0399\u03c3\u03c1\u03b1\u03ae\u03bb -LocaleNames/el/IN=\u0399\u03bd\u03b4\u03af\u03b1 -LocaleNames/el/IO=\u0392\u03c1\u03b5\u03c4\u03b1\u03bd\u03b9\u03ba\u03ac \u0395\u03b4\u03ac\u03c6\u03b7 \u0399\u03bd\u03b4\u03b9\u03ba\u03bf\u03cd \u03a9\u03ba\u03b5\u03b1\u03bd\u03bf\u03cd -LocaleNames/el/IQ=\u0399\u03c1\u03ac\u03ba -LocaleNames/el/IR=\u0399\u03c1\u03ac\u03bd -LocaleNames/el/IS=\u0399\u03c3\u03bb\u03b1\u03bd\u03b4\u03af\u03b1 -LocaleNames/el/IT=\u0399\u03c4\u03b1\u03bb\u03af\u03b1 -LocaleNames/el/JM=\u03a4\u03b6\u03b1\u03bc\u03ac\u03b9\u03ba\u03b1 -LocaleNames/el/JO=\u0399\u03bf\u03c1\u03b4\u03b1\u03bd\u03af\u03b1 -LocaleNames/el/JP=\u0399\u03b1\u03c0\u03c9\u03bd\u03af\u03b1 -LocaleNames/el/KE=\u039a\u03ad\u03bd\u03c5\u03b1 -LocaleNames/el/KG=\u039a\u03b9\u03c1\u03b3\u03b9\u03c3\u03c4\u03ac\u03bd -LocaleNames/el/KH=\u039a\u03b1\u03bc\u03c0\u03cc\u03c4\u03b6\u03b7 -LocaleNames/el/KI=\u039a\u03b9\u03c1\u03b9\u03bc\u03c0\u03ac\u03c4\u03b9 -LocaleNames/el/KM=\u039a\u03bf\u03bc\u03cc\u03c1\u03b5\u03c2 -LocaleNames/el/KN=\u03a3\u03b5\u03bd \u039a\u03b9\u03c4\u03c2 \u03ba\u03b1\u03b9 \u039d\u03ad\u03b2\u03b9\u03c2 -LocaleNames/el/KP=\u0392\u03cc\u03c1\u03b5\u03b9\u03b1 \u039a\u03bf\u03c1\u03ad\u03b1 -LocaleNames/el/KR=\u039d\u03cc\u03c4\u03b9\u03b1 \u039a\u03bf\u03c1\u03ad\u03b1 -LocaleNames/el/KW=\u039a\u03bf\u03c5\u03b2\u03ad\u03b9\u03c4 -LocaleNames/el/KY=\u039d\u03ae\u03c3\u03bf\u03b9 \u039a\u03ad\u03b9\u03bc\u03b1\u03bd -LocaleNames/el/KZ=\u039a\u03b1\u03b6\u03b1\u03ba\u03c3\u03c4\u03ac\u03bd -LocaleNames/el/LA=\u039b\u03ac\u03bf\u03c2 -LocaleNames/el/LB=\u039b\u03af\u03b2\u03b1\u03bd\u03bf\u03c2 -LocaleNames/el/LC=\u0391\u03b3\u03af\u03b1 \u039b\u03bf\u03c5\u03ba\u03af\u03b1 -LocaleNames/el/LI=\u039b\u03b9\u03c7\u03c4\u03b5\u03bd\u03c3\u03c4\u03ac\u03b9\u03bd -LocaleNames/el/LK=\u03a3\u03c1\u03b9 \u039b\u03ac\u03bd\u03ba\u03b1 -LocaleNames/el/LR=\u039b\u03b9\u03b2\u03b5\u03c1\u03af\u03b1 -LocaleNames/el/LS=\u039b\u03b5\u03c3\u03cc\u03c4\u03bf -LocaleNames/el/LT=\u039b\u03b9\u03b8\u03bf\u03c5\u03b1\u03bd\u03af\u03b1 -LocaleNames/el/LU=\u039b\u03bf\u03c5\u03be\u03b5\u03bc\u03b2\u03bf\u03cd\u03c1\u03b3\u03bf -LocaleNames/el/LV=\u039b\u03b5\u03c4\u03bf\u03bd\u03af\u03b1 -LocaleNames/el/LY=\u039b\u03b9\u03b2\u03cd\u03b7 -LocaleNames/el/MA=\u039c\u03b1\u03c1\u03cc\u03ba\u03bf -LocaleNames/el/MC=\u039c\u03bf\u03bd\u03b1\u03ba\u03cc -LocaleNames/el/MD=\u039c\u03bf\u03bb\u03b4\u03b1\u03b2\u03af\u03b1 -LocaleNames/el/MG=\u039c\u03b1\u03b4\u03b1\u03b3\u03b1\u03c3\u03ba\u03ac\u03c1\u03b7 -LocaleNames/el/MH=\u039d\u03ae\u03c3\u03bf\u03b9 \u039c\u03ac\u03c1\u03c3\u03b1\u03bb -LocaleNames/el/MK=\u0392\u03cc\u03c1\u03b5\u03b9\u03b1 \u039c\u03b1\u03ba\u03b5\u03b4\u03bf\u03bd\u03af\u03b1 -LocaleNames/el/ML=\u039c\u03ac\u03bb\u03b9 -LocaleNames/el/MM=\u039c\u03b9\u03b1\u03bd\u03bc\u03ac\u03c1 (\u0392\u03b9\u03c1\u03bc\u03b1\u03bd\u03af\u03b1) -LocaleNames/el/MN=\u039c\u03bf\u03b3\u03b3\u03bf\u03bb\u03af\u03b1 -LocaleNames/el/MO=\u039c\u03b1\u03ba\u03ac\u03bf \u0395\u0394\u03a0 \u039a\u03af\u03bd\u03b1\u03c2 -LocaleNames/el/MP=\u039d\u03ae\u03c3\u03bf\u03b9 \u0392\u03cc\u03c1\u03b5\u03b9\u03b5\u03c2 \u039c\u03b1\u03c1\u03b9\u03ac\u03bd\u03b5\u03c2 -LocaleNames/el/MQ=\u039c\u03b1\u03c1\u03c4\u03b9\u03bd\u03af\u03ba\u03b1 -LocaleNames/el/MR=\u039c\u03b1\u03c5\u03c1\u03b9\u03c4\u03b1\u03bd\u03af\u03b1 -LocaleNames/el/MS=\u039c\u03bf\u03bd\u03c3\u03b5\u03c1\u03ac\u03c4 -LocaleNames/el/MT=\u039c\u03ac\u03bb\u03c4\u03b1 -LocaleNames/el/MU=\u039c\u03b1\u03c5\u03c1\u03af\u03ba\u03b9\u03bf\u03c2 -LocaleNames/el/MV=\u039c\u03b1\u03bb\u03b4\u03af\u03b2\u03b5\u03c2 -LocaleNames/el/MW=\u039c\u03b1\u03bb\u03ac\u03bf\u03c5\u03b9 -LocaleNames/el/MX=\u039c\u03b5\u03be\u03b9\u03ba\u03cc -LocaleNames/el/MY=\u039c\u03b1\u03bb\u03b1\u03b9\u03c3\u03af\u03b1 -LocaleNames/el/MZ=\u039c\u03bf\u03b6\u03b1\u03bc\u03b2\u03af\u03ba\u03b7 -LocaleNames/el/NA=\u039d\u03b1\u03bc\u03af\u03bc\u03c0\u03b9\u03b1 -LocaleNames/el/NC=\u039d\u03ad\u03b1 \u039a\u03b1\u03bb\u03b7\u03b4\u03bf\u03bd\u03af\u03b1 -LocaleNames/el/NE=\u039d\u03af\u03b3\u03b7\u03c1\u03b1\u03c2 -LocaleNames/el/NF=\u039d\u03ae\u03c3\u03bf\u03c2 \u039d\u03cc\u03c1\u03c6\u03bf\u03bb\u03ba -LocaleNames/el/NG=\u039d\u03b9\u03b3\u03b7\u03c1\u03af\u03b1 -LocaleNames/el/NI=\u039d\u03b9\u03ba\u03b1\u03c1\u03ac\u03b3\u03bf\u03c5\u03b1 -LocaleNames/el/NL=\u039a\u03ac\u03c4\u03c9 \u03a7\u03ce\u03c1\u03b5\u03c2 -LocaleNames/el/NO=\u039d\u03bf\u03c1\u03b2\u03b7\u03b3\u03af\u03b1 -LocaleNames/el/NP=\u039d\u03b5\u03c0\u03ac\u03bb -LocaleNames/el/NR=\u039d\u03b1\u03bf\u03c5\u03c1\u03bf\u03cd -LocaleNames/el/NU=\u039d\u03b9\u03bf\u03cd\u03b5 -LocaleNames/el/NZ=\u039d\u03ad\u03b1 \u0396\u03b7\u03bb\u03b1\u03bd\u03b4\u03af\u03b1 -LocaleNames/el/OM=\u039f\u03bc\u03ac\u03bd -LocaleNames/el/PA=\u03a0\u03b1\u03bd\u03b1\u03bc\u03ac\u03c2 -LocaleNames/el/PE=\u03a0\u03b5\u03c1\u03bf\u03cd -LocaleNames/el/PF=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ae \u03a0\u03bf\u03bb\u03c5\u03bd\u03b7\u03c3\u03af\u03b1 -LocaleNames/el/PG=\u03a0\u03b1\u03c0\u03bf\u03cd\u03b1 \u039d\u03ad\u03b1 \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1 -LocaleNames/el/PH=\u03a6\u03b9\u03bb\u03b9\u03c0\u03c0\u03af\u03bd\u03b5\u03c2 -LocaleNames/el/PK=\u03a0\u03b1\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd -LocaleNames/el/PL=\u03a0\u03bf\u03bb\u03c9\u03bd\u03af\u03b1 -LocaleNames/el/PM=\u03a3\u03b5\u03bd \u03a0\u03b9\u03b5\u03c1 \u03ba\u03b1\u03b9 \u039c\u03b9\u03ba\u03b5\u03bb\u03cc\u03bd -LocaleNames/el/PN=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a0\u03af\u03c4\u03ba\u03b5\u03c1\u03bd -LocaleNames/el/PR=\u03a0\u03bf\u03c5\u03ad\u03c1\u03c4\u03bf \u03a1\u03af\u03ba\u03bf -LocaleNames/el/PS=\u03a0\u03b1\u03bb\u03b1\u03b9\u03c3\u03c4\u03b9\u03bd\u03b9\u03b1\u03ba\u03ac \u0395\u03b4\u03ac\u03c6\u03b7 -LocaleNames/el/PT=\u03a0\u03bf\u03c1\u03c4\u03bf\u03b3\u03b1\u03bb\u03af\u03b1 -LocaleNames/el/PW=\u03a0\u03b1\u03bb\u03ac\u03bf\u03c5 -LocaleNames/el/PY=\u03a0\u03b1\u03c1\u03b1\u03b3\u03bf\u03c5\u03ac\u03b7 -LocaleNames/el/QA=\u039a\u03b1\u03c4\u03ac\u03c1 -LocaleNames/el/RE=\u03a1\u03b5\u03ca\u03bd\u03b9\u03cc\u03bd -LocaleNames/el/RO=\u03a1\u03bf\u03c5\u03bc\u03b1\u03bd\u03af\u03b1 -LocaleNames/el/RU=\u03a1\u03c9\u03c3\u03af\u03b1 -LocaleNames/el/RW=\u03a1\u03bf\u03c5\u03ac\u03bd\u03c4\u03b1 -LocaleNames/el/SA=\u03a3\u03b1\u03bf\u03c5\u03b4\u03b9\u03ba\u03ae \u0391\u03c1\u03b1\u03b2\u03af\u03b1 -LocaleNames/el/SB=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a3\u03bf\u03bb\u03bf\u03bc\u03ce\u03bd\u03c4\u03bf\u03c2 -LocaleNames/el/SC=\u03a3\u03b5\u03cb\u03c7\u03ad\u03bb\u03bb\u03b5\u03c2 -LocaleNames/el/SD=\u03a3\u03bf\u03c5\u03b4\u03ac\u03bd -LocaleNames/el/SE=\u03a3\u03bf\u03c5\u03b7\u03b4\u03af\u03b1 -LocaleNames/el/SG=\u03a3\u03b9\u03b3\u03ba\u03b1\u03c0\u03bf\u03cd\u03c1\u03b7 -LocaleNames/el/SH=\u0391\u03b3\u03af\u03b1 \u0395\u03bb\u03ad\u03bd\u03b7 -LocaleNames/el/SI=\u03a3\u03bb\u03bf\u03b2\u03b5\u03bd\u03af\u03b1 -LocaleNames/el/SJ=\u03a3\u03b2\u03ac\u03bb\u03bc\u03c0\u03b1\u03c1\u03bd\u03c4 \u03ba\u03b1\u03b9 \u0393\u03b9\u03b1\u03bd \u039c\u03b1\u03b3\u03b9\u03ad\u03bd -LocaleNames/el/SK=\u03a3\u03bb\u03bf\u03b2\u03b1\u03ba\u03af\u03b1 -LocaleNames/el/SL=\u03a3\u03b9\u03ad\u03c1\u03b1 \u039b\u03b5\u03cc\u03bd\u03b5 -LocaleNames/el/SM=\u0386\u03b3\u03b9\u03bf\u03c2 \u039c\u03b1\u03c1\u03af\u03bd\u03bf\u03c2 -LocaleNames/el/SN=\u03a3\u03b5\u03bd\u03b5\u03b3\u03ac\u03bb\u03b7 -LocaleNames/el/SO=\u03a3\u03bf\u03bc\u03b1\u03bb\u03af\u03b1 -LocaleNames/el/SR=\u03a3\u03bf\u03c5\u03c1\u03b9\u03bd\u03ac\u03bc -LocaleNames/el/ST=\u03a3\u03ac\u03bf \u03a4\u03bf\u03bc\u03ad \u03ba\u03b1\u03b9 \u03a0\u03c1\u03af\u03bd\u03c3\u03b9\u03c0\u03b5 -LocaleNames/el/SV=\u0395\u03bb \u03a3\u03b1\u03bb\u03b2\u03b1\u03b4\u03cc\u03c1 -LocaleNames/el/SY=\u03a3\u03c5\u03c1\u03af\u03b1 -LocaleNames/el/SZ=\u0395\u03c3\u03bf\u03c5\u03b1\u03c4\u03af\u03bd\u03b9 -LocaleNames/el/TC=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a4\u03b5\u03c1\u03ba\u03c2 \u03ba\u03b1\u03b9 \u039a\u03ac\u03b9\u03ba\u03bf\u03c2 -LocaleNames/el/TD=\u03a4\u03c3\u03b1\u03bd\u03c4 -LocaleNames/el/TF=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ac \u039d\u03cc\u03c4\u03b9\u03b1 \u0395\u03b4\u03ac\u03c6\u03b7 -LocaleNames/el/TG=\u03a4\u03cc\u03b3\u03ba\u03bf -LocaleNames/el/TH=\u03a4\u03b1\u03ca\u03bb\u03ac\u03bd\u03b4\u03b7 -LocaleNames/el/TJ=\u03a4\u03b1\u03c4\u03b6\u03b9\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd -LocaleNames/el/TK=\u03a4\u03bf\u03ba\u03b5\u03bb\u03ac\u03bf\u03c5 -LocaleNames/el/TL=\u03a4\u03b9\u03bc\u03cc\u03c1-\u039b\u03ad\u03c3\u03c4\u03b5 -LocaleNames/el/TM=\u03a4\u03bf\u03c5\u03c1\u03ba\u03bc\u03b5\u03bd\u03b9\u03c3\u03c4\u03ac\u03bd -LocaleNames/el/TN=\u03a4\u03c5\u03bd\u03b7\u03c3\u03af\u03b1 -LocaleNames/el/TO=\u03a4\u03cc\u03bd\u03b3\u03ba\u03b1 -LocaleNames/el/TR=\u03a4\u03bf\u03c5\u03c1\u03ba\u03af\u03b1 -LocaleNames/el/TT=\u03a4\u03c1\u03b9\u03bd\u03b9\u03bd\u03c4\u03ac\u03bd\u03c4 \u03ba\u03b1\u03b9 \u03a4\u03bf\u03bc\u03c0\u03ac\u03b3\u03ba\u03bf -LocaleNames/el/TV=\u03a4\u03bf\u03c5\u03b2\u03b1\u03bb\u03bf\u03cd -LocaleNames/el/TW=\u03a4\u03b1\u03ca\u03b2\u03ac\u03bd -LocaleNames/el/TZ=\u03a4\u03b1\u03bd\u03b6\u03b1\u03bd\u03af\u03b1 -LocaleNames/el/UA=\u039f\u03c5\u03ba\u03c1\u03b1\u03bd\u03af\u03b1 -LocaleNames/el/UG=\u039f\u03c5\u03b3\u03ba\u03ac\u03bd\u03c4\u03b1 -LocaleNames/el/UM=\u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b5\u03c2 \u039d\u03b7\u03c3\u03af\u03b4\u03b5\u03c2 \u0397\u03a0\u0391 -LocaleNames/el/US=\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03b5\u03c2 \u03a0\u03bf\u03bb\u03b9\u03c4\u03b5\u03af\u03b5\u03c2 -LocaleNames/el/UY=\u039f\u03c5\u03c1\u03bf\u03c5\u03b3\u03bf\u03c5\u03ac\u03b7 -LocaleNames/el/UZ=\u039f\u03c5\u03b6\u03bc\u03c0\u03b5\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd -LocaleNames/el/VA=\u0392\u03b1\u03c4\u03b9\u03ba\u03b1\u03bd\u03cc -LocaleNames/el/VC=\u0386\u03b3\u03b9\u03bf\u03c2 \u0392\u03b9\u03ba\u03ad\u03bd\u03c4\u03b9\u03bf\u03c2 \u03ba\u03b1\u03b9 \u0393\u03c1\u03b5\u03bd\u03b1\u03b4\u03af\u03bd\u03b5\u03c2 -LocaleNames/el/VE=\u0392\u03b5\u03bd\u03b5\u03b6\u03bf\u03c5\u03ad\u03bb\u03b1 -LocaleNames/el/VG=\u0392\u03c1\u03b5\u03c4\u03b1\u03bd\u03b9\u03ba\u03ad\u03c2 \u03a0\u03b1\u03c1\u03b8\u03ad\u03bd\u03b5\u03c2 \u039d\u03ae\u03c3\u03bf\u03b9 -LocaleNames/el/VI=\u0391\u03bc\u03b5\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ad\u03c2 \u03a0\u03b1\u03c1\u03b8\u03ad\u03bd\u03b5\u03c2 \u039d\u03ae\u03c3\u03bf\u03b9 -LocaleNames/el/VN=\u0392\u03b9\u03b5\u03c4\u03bd\u03ac\u03bc -LocaleNames/el/VU=\u0392\u03b1\u03bd\u03bf\u03c5\u03ac\u03c4\u03bf\u03c5 -LocaleNames/el/WF=\u0393\u03bf\u03c5\u03ac\u03bb\u03b9\u03c2 \u03ba\u03b1\u03b9 \u03a6\u03bf\u03c5\u03c4\u03bf\u03cd\u03bd\u03b1 -LocaleNames/el/WS=\u03a3\u03b1\u03bc\u03cc\u03b1 -LocaleNames/el/YE=\u03a5\u03b5\u03bc\u03ad\u03bd\u03b7 -LocaleNames/el/YT=\u039c\u03b1\u03b3\u03b9\u03cc\u03c4 -LocaleNames/el/ZA=\u039d\u03cc\u03c4\u03b9\u03b1 \u0391\u03c6\u03c1\u03b9\u03ba\u03ae -LocaleNames/el/ZM=\u0396\u03ac\u03bc\u03c0\u03b9\u03b1 -LocaleNames/el/ZW=\u0396\u03b9\u03bc\u03c0\u03ac\u03bc\u03c0\u03bf\u03c5\u03b5 +LocaleNames/pt_PT/IR=Irão +LocaleNames/pt_PT/ZW=Zimbabué + +LocaleNames/el/ar=Αραβικά +LocaleNames/el/be=Λευκορωσικά +LocaleNames/el/bg=Βουλγαρικά +LocaleNames/el/bn=Βεγγαλικά +LocaleNames/el/bo=Θιβετιανά +LocaleNames/el/bs=Βοσνιακά +LocaleNames/el/ca=Καταλανικά +LocaleNames/el/co=Κορσικανικά +LocaleNames/el/cs=Τσεχικά +LocaleNames/el/cy=Ουαλικά +LocaleNames/el/da=Δανικά +LocaleNames/el/de=Γερμανικά +LocaleNames/el/el=Ελληνικά +LocaleNames/el/en=Αγγλικά +LocaleNames/el/es=Ισπανικά +LocaleNames/el/et=Εσθονικά +LocaleNames/el/eu=Βασκικά +LocaleNames/el/fa=Περσικά +LocaleNames/el/fi=Φινλανδικά +LocaleNames/el/fr=Γαλλικά +LocaleNames/el/ga=Ιρλανδικά +LocaleNames/el/gd=Σκωτικά Κελτικά +LocaleNames/el/he=Εβραϊκά +LocaleNames/el/hi=Χίντι +LocaleNames/el/hr=Κροατικά +LocaleNames/el/hu=Ουγγρικά +LocaleNames/el/hy=Αρμενικά +LocaleNames/el/id=Ινδονησιακά +LocaleNames/el/is=Ισλανδικά +LocaleNames/el/it=Ιταλικά +LocaleNames/el/ja=Ιαπωνικά +LocaleNames/el/ka=Γεωργιανά +LocaleNames/el/ko=Κορεατικά +LocaleNames/el/la=Λατινικά +LocaleNames/el/lt=Λιθουανικά +LocaleNames/el/lv=Λετονικά +LocaleNames/el/mk=Σλαβομακεδονικά +LocaleNames/el/mn=Μογγολικά +LocaleNames/el/mt=Μαλτεζικά +LocaleNames/el/no=Νορβηγικά +LocaleNames/el/pl=Πολωνικά +LocaleNames/el/pt=Πορτογαλικά +LocaleNames/el/ro=Ρουμανικά +LocaleNames/el/ru=Ρωσικά +LocaleNames/el/sk=Σλοβακικά +LocaleNames/el/sl=Σλοβενικά +LocaleNames/el/sq=Αλβανικά +LocaleNames/el/sr=Σερβικά +LocaleNames/el/sv=Σουηδικά +LocaleNames/el/th=Ταϊλανδικά +LocaleNames/el/tr=Τουρκικά +LocaleNames/el/uk=Ουκρανικά +LocaleNames/el/vi=Βιετναμικά +LocaleNames/el/yi=Γίντις +LocaleNames/el/zh=Κινεζικά +LocaleNames/el/AD=Ανδόρα +LocaleNames/el/AE=Ηνωμένα Αραβικά Εμιράτα +LocaleNames/el/AF=Αφγανιστάν +LocaleNames/el/AG=Αντίγκουα και Μπαρμπούντα +LocaleNames/el/AI=Ανγκουίλα +LocaleNames/el/AL=Αλβανία +LocaleNames/el/AM=Αρμενία +LocaleNames/el/AO=Αγκόλα +LocaleNames/el/AQ=Ανταρκτική +LocaleNames/el/AR=Αργεντινή +LocaleNames/el/AS=Αμερικανική Σαμόα +LocaleNames/el/AT=Αυστρία +LocaleNames/el/AU=Αυστραλία +LocaleNames/el/AW=Αρούμπα +LocaleNames/el/AX=Νήσοι Όλαντ +LocaleNames/el/AZ=Αζερμπαϊτζάν +LocaleNames/el/BA=Βοσνία - Ερζεγοβίνη +LocaleNames/el/BB=Μπαρμπέιντος +LocaleNames/el/BD=Μπανγκλαντές +LocaleNames/el/BE=Βέλγιο +LocaleNames/el/BF=Μπουρκίνα Φάσο +LocaleNames/el/BG=Βουλγαρία +LocaleNames/el/BH=Μπαχρέιν +LocaleNames/el/BI=Μπουρούντι +LocaleNames/el/BJ=Μπενίν +LocaleNames/el/BM=Βερμούδες +LocaleNames/el/BN=Μπρουνέι +LocaleNames/el/BO=Βολιβία +LocaleNames/el/BR=Βραζιλία +LocaleNames/el/BS=Μπαχάμες +LocaleNames/el/BT=Μπουτάν +LocaleNames/el/BV=Νήσος Μπουβέ +LocaleNames/el/BW=Μποτσουάνα +LocaleNames/el/BY=Λευκορωσία +LocaleNames/el/BZ=Μπελίζ +LocaleNames/el/CA=Καναδάς +LocaleNames/el/CC=Νήσοι Κόκος (Κίλινγκ) +LocaleNames/el/CD=Κονγκό - Κινσάσα +LocaleNames/el/CF=Κεντροαφρικανική Δημοκρατία +LocaleNames/el/CG=Κονγκό - Μπραζαβίλ +LocaleNames/el/CH=Ελβετία +LocaleNames/el/CI=Ακτή Ελεφαντοστού +LocaleNames/el/CK=Νήσοι Κουκ +LocaleNames/el/CL=Χιλή +LocaleNames/el/CM=Καμερούν +LocaleNames/el/CN=Κίνα +LocaleNames/el/CO=Κολομβία +LocaleNames/el/CR=Κόστα Ρίκα +LocaleNames/el/CU=Κούβα +LocaleNames/el/CV=Πράσινο Ακρωτήριο +LocaleNames/el/CX=Νήσος των Χριστουγέννων +LocaleNames/el/CY=Κύπρος +LocaleNames/el/CZ=Τσεχία +LocaleNames/el/DE=Γερμανία +LocaleNames/el/DJ=Τζιμπουτί +LocaleNames/el/DK=Δανία +LocaleNames/el/DM=Ντομίνικα +LocaleNames/el/DO=Δομινικανή Δημοκρατία +LocaleNames/el/DZ=Αλγερία +LocaleNames/el/EC=Ισημερινός +LocaleNames/el/EE=Εσθονία +LocaleNames/el/EG=Αίγυπτος +LocaleNames/el/EH=Δυτική Σαχάρα +LocaleNames/el/ER=Ερυθραία +LocaleNames/el/ES=Ισπανία +LocaleNames/el/ET=Αιθιοπία +LocaleNames/el/FI=Φινλανδία +LocaleNames/el/FJ=Φίτζι +LocaleNames/el/FK=Νήσοι Φόκλαντ +LocaleNames/el/FM=Μικρονησία +LocaleNames/el/FO=Νήσοι Φερόες +LocaleNames/el/FR=Γαλλία +LocaleNames/el/GA=Γκαμπόν +LocaleNames/el/GB=Ηνωμένο Βασίλειο +LocaleNames/el/GD=Γρενάδα +LocaleNames/el/GE=Γεωργία +LocaleNames/el/GF=Γαλλική Γουιάνα +LocaleNames/el/GH=Γκάνα +LocaleNames/el/GI=Γιβραλτάρ +LocaleNames/el/GL=Γροιλανδία +LocaleNames/el/GM=Γκάμπια +LocaleNames/el/GN=Γουινέα +LocaleNames/el/GP=Γουαδελούπη +LocaleNames/el/GQ=Ισημερινή Γουινέα +LocaleNames/el/GS=Νήσοι Νότια Γεωργία και Νότιες Σάντουιτς +LocaleNames/el/GT=Γουατεμάλα +LocaleNames/el/GU=Γκουάμ +LocaleNames/el/GW=Γουινέα Μπισάου +LocaleNames/el/GY=Γουιάνα +LocaleNames/el/HK=Χονγκ Κονγκ ΕΔΠ Κίνας +LocaleNames/el/HM=Νήσοι Χερντ και Μακντόναλντ +LocaleNames/el/HN=Ονδούρα +LocaleNames/el/HR=Κροατία +LocaleNames/el/HT=Αϊτή +LocaleNames/el/HU=Ουγγαρία +LocaleNames/el/ID=Ινδονησία +LocaleNames/el/IE=Ιρλανδία +LocaleNames/el/IL=Ισραήλ +LocaleNames/el/IN=Ινδία +LocaleNames/el/IO=Βρετανικά Εδάφη Ινδικού Ωκεανού +LocaleNames/el/IQ=Ιράκ +LocaleNames/el/IR=Ιράν +LocaleNames/el/IS=Ισλανδία +LocaleNames/el/IT=Ιταλία +LocaleNames/el/JM=Τζαμάικα +LocaleNames/el/JO=Ιορδανία +LocaleNames/el/JP=Ιαπωνία +LocaleNames/el/KE=Κένυα +LocaleNames/el/KG=Κιργιστάν +LocaleNames/el/KH=Καμπότζη +LocaleNames/el/KI=Κιριμπάτι +LocaleNames/el/KM=Κομόρες +LocaleNames/el/KN=Σεν Κιτς και Νέβις +LocaleNames/el/KP=Βόρεια Κορέα +LocaleNames/el/KR=Νότια Κορέα +LocaleNames/el/KW=Κουβέιτ +LocaleNames/el/KY=Νήσοι Κέιμαν +LocaleNames/el/KZ=Καζακστάν +LocaleNames/el/LA=Λάος +LocaleNames/el/LB=Λίβανος +LocaleNames/el/LC=Αγία Λουκία +LocaleNames/el/LI=Λιχτενστάιν +LocaleNames/el/LK=Σρι Λάνκα +LocaleNames/el/LR=Λιβερία +LocaleNames/el/LS=Λεσότο +LocaleNames/el/LT=Λιθουανία +LocaleNames/el/LU=Λουξεμβούργο +LocaleNames/el/LV=Λετονία +LocaleNames/el/LY=Λιβύη +LocaleNames/el/MA=Μαρόκο +LocaleNames/el/MC=Μονακό +LocaleNames/el/MD=Μολδαβία +LocaleNames/el/MG=Μαδαγασκάρη +LocaleNames/el/MH=Νήσοι Μάρσαλ +LocaleNames/el/MK=Βόρεια Μακεδονία +LocaleNames/el/ML=Μάλι +LocaleNames/el/MM=Μιανμάρ (Βιρμανία) +LocaleNames/el/MN=Μογγολία +LocaleNames/el/MO=Μακάο ΕΔΠ Κίνας +LocaleNames/el/MP=Νήσοι Βόρειες Μαριάνες +LocaleNames/el/MQ=Μαρτινίκα +LocaleNames/el/MR=Μαυριτανία +LocaleNames/el/MS=Μονσεράτ +LocaleNames/el/MT=Μάλτα +LocaleNames/el/MU=Μαυρίκιος +LocaleNames/el/MV=Μαλδίβες +LocaleNames/el/MW=Μαλάουι +LocaleNames/el/MX=Μεξικό +LocaleNames/el/MY=Μαλαισία +LocaleNames/el/MZ=Μοζαμβίκη +LocaleNames/el/NA=Ναμίμπια +LocaleNames/el/NC=Νέα Καληδονία +LocaleNames/el/NE=Νίγηρας +LocaleNames/el/NF=Νήσος Νόρφολκ +LocaleNames/el/NG=Νιγηρία +LocaleNames/el/NI=Νικαράγουα +LocaleNames/el/NL=Κάτω Χώρες +LocaleNames/el/NO=Νορβηγία +LocaleNames/el/NP=Νεπάλ +LocaleNames/el/NR=Ναουρού +LocaleNames/el/NU=Νιούε +LocaleNames/el/NZ=Νέα Ζηλανδία +LocaleNames/el/OM=Ομάν +LocaleNames/el/PA=Παναμάς +LocaleNames/el/PE=Περού +LocaleNames/el/PF=Γαλλική Πολυνησία +LocaleNames/el/PG=Παπούα Νέα Γουινέα +LocaleNames/el/PH=Φιλιππίνες +LocaleNames/el/PK=Πακιστάν +LocaleNames/el/PL=Πολωνία +LocaleNames/el/PM=Σεν Πιερ και Μικελόν +LocaleNames/el/PN=Νήσοι Πίτκερν +LocaleNames/el/PR=Πουέρτο Ρίκο +LocaleNames/el/PS=Παλαιστινιακά Εδάφη +LocaleNames/el/PT=Πορτογαλία +LocaleNames/el/PW=Παλάου +LocaleNames/el/PY=Παραγουάη +LocaleNames/el/QA=Κατάρ +LocaleNames/el/RE=Ρεϊνιόν +LocaleNames/el/RO=Ρουμανία +LocaleNames/el/RU=Ρωσία +LocaleNames/el/RW=Ρουάντα +LocaleNames/el/SA=Σαουδική Αραβία +LocaleNames/el/SB=Νήσοι Σολομώντος +LocaleNames/el/SC=Σεϋχέλλες +LocaleNames/el/SD=Σουδάν +LocaleNames/el/SE=Σουηδία +LocaleNames/el/SG=Σιγκαπούρη +LocaleNames/el/SH=Αγία Ελένη +LocaleNames/el/SI=Σλοβενία +LocaleNames/el/SJ=Σβάλμπαρντ και Γιαν Μαγιέν +LocaleNames/el/SK=Σλοβακία +LocaleNames/el/SL=Σιέρα Λεόνε +LocaleNames/el/SM=Άγιος Μαρίνος +LocaleNames/el/SN=Σενεγάλη +LocaleNames/el/SO=Σομαλία +LocaleNames/el/SR=Σουρινάμ +LocaleNames/el/ST=Σάο Τομέ και Πρίνσιπε +LocaleNames/el/SV=Ελ Σαλβαδόρ +LocaleNames/el/SY=Συρία +LocaleNames/el/SZ=Εσουατίνι +LocaleNames/el/TC=Νήσοι Τερκς και Κάικος +LocaleNames/el/TD=Τσαντ +LocaleNames/el/TF=Γαλλικά Νότια Εδάφη +LocaleNames/el/TG=Τόγκο +LocaleNames/el/TH=Ταϊλάνδη +LocaleNames/el/TJ=Τατζικιστάν +LocaleNames/el/TK=Τοκελάου +LocaleNames/el/TL=Τιμόρ-Λέστε +LocaleNames/el/TM=Τουρκμενιστάν +LocaleNames/el/TN=Τυνησία +LocaleNames/el/TO=Τόνγκα +LocaleNames/el/TR=Τουρκία +LocaleNames/el/TT=Τρινιντάντ και Τομπάγκο +LocaleNames/el/TV=Τουβαλού +LocaleNames/el/TW=Ταϊβάν +LocaleNames/el/TZ=Τανζανία +LocaleNames/el/UA=Ουκρανία +LocaleNames/el/UG=Ουγκάντα +LocaleNames/el/UM=Απομακρυσμένες Νησίδες ΗΠΑ +LocaleNames/el/US=Ηνωμένες Πολιτείες +LocaleNames/el/UY=Ουρουγουάη +LocaleNames/el/UZ=Ουζμπεκιστάν +LocaleNames/el/VA=Βατικανό +LocaleNames/el/VC=Άγιος Βικέντιος και Γρεναδίνες +LocaleNames/el/VE=Βενεζουέλα +LocaleNames/el/VG=Βρετανικές Παρθένες Νήσοι +LocaleNames/el/VI=Αμερικανικές Παρθένες Νήσοι +LocaleNames/el/VN=Βιετνάμ +LocaleNames/el/VU=Βανουάτου +LocaleNames/el/WF=Γουάλις και Φουτούνα +LocaleNames/el/WS=Σαμόα +LocaleNames/el/YE=Υεμένη +LocaleNames/el/YT=Μαγιότ +LocaleNames/el/ZA=Νότια Αφρική +LocaleNames/el/ZM=Ζάμπια +LocaleNames/el/ZW=Ζιμπάμπουε LocaleNames/en_MT/fy=Western Frisian LocaleNames/en_MT/gl=Galician LocaleNames/en_MT/ps=Pashto -LocaleNames/en_MT/AX=\u00c5land Islands +LocaleNames/en_MT/AX=Åland Islands LocaleNames/en_MT/CD=Congo - Kinshasa LocaleNames/en_MT/CG=Congo - Brazzaville LocaleNames/en_MT/HK=Hong Kong SAR China @@ -4713,7 +4713,7 @@ LocaleNames/en_MT/MO=Macao SAR China LocaleNames/en_PH/fy=Western Frisian LocaleNames/en_PH/gl=Galician LocaleNames/en_PH/ps=Pashto -LocaleNames/en_PH/AX=\u00c5land Islands +LocaleNames/en_PH/AX=Åland Islands LocaleNames/en_PH/CD=Congo - Kinshasa LocaleNames/en_PH/CG=Congo - Brazzaville LocaleNames/en_PH/HK=Hong Kong SAR China @@ -4722,7 +4722,7 @@ LocaleNames/en_PH/MO=Macao SAR China LocaleNames/en_SG/fy=Western Frisian LocaleNames/en_SG/gl=Galician LocaleNames/en_SG/ps=Pashto -LocaleNames/en_SG/AX=\u00c5land Islands +LocaleNames/en_SG/AX=Åland Islands LocaleNames/en_SG/CD=Congo - Kinshasa LocaleNames/en_SG/CG=Congo - Brazzaville LocaleNames/en_SG/HK=Hong Kong SAR China @@ -4730,53 +4730,53 @@ LocaleNames/en_SG/MO=Macao SAR China LocaleNames/es_US/ab=abjasio LocaleNames/es_US/dz=dzongkha LocaleNames/es_US/fj=fiyiano -LocaleNames/es_US/si=cingal\u00e9s -LocaleNames/es_US/ti=tigri\u00f1a -LocaleNames/es_US/vo=volap\u00fck -LocaleNames/es_US/AX=Islas \u00c5land -LocaleNames/es_US/BH=Bar\u00e9in -LocaleNames/es_US/KG=Kirguist\u00e1n -LocaleNames/mt/ab=Abka\u017cjan +LocaleNames/es_US/si=cingalés +LocaleNames/es_US/ti=tigriña +LocaleNames/es_US/vo=volapük +LocaleNames/es_US/AX=Islas Åland +LocaleNames/es_US/BH=Baréin +LocaleNames/es_US/KG=Kirguistán +LocaleNames/mt/ab=Abkażjan LocaleNames/mt/af=Afrikans LocaleNames/mt/am=Amhariku -LocaleNames/mt/ar=G\u0127arbi +LocaleNames/mt/ar=Għarbi LocaleNames/mt/av=Avarik LocaleNames/mt/ay=Aymara -LocaleNames/mt/az=A\u017cerbaj\u0121ani +LocaleNames/mt/az=Ażerbajġani LocaleNames/mt/ba=Bashkir LocaleNames/mt/be=Belarussu LocaleNames/mt/bg=Bulgaru LocaleNames/mt/bo=Tibetjan LocaleNames/mt/br=Breton -LocaleNames/mt/bs=Bo\u017cnijaku +LocaleNames/mt/bs=Bożnijaku LocaleNames/mt/ca=Katalan LocaleNames/mt/ce=Chechen LocaleNames/mt/ch=Chamorro LocaleNames/mt/co=Korsiku LocaleNames/mt/cr=Cree -LocaleNames/mt/cs=\u010aek +LocaleNames/mt/cs=Ċek LocaleNames/mt/cu=Slaviku tal-Knisja LocaleNames/mt/cv=Chuvash LocaleNames/mt/cy=Welsh -LocaleNames/mt/da=Dani\u017c -LocaleNames/mt/de=\u0120ermani\u017c +LocaleNames/mt/da=Daniż +LocaleNames/mt/de=Ġermaniż LocaleNames/mt/dv=Divehi LocaleNames/mt/dz=Dzongkha LocaleNames/mt/el=Grieg -LocaleNames/mt/en=Ingli\u017c +LocaleNames/mt/en=Ingliż LocaleNames/mt/es=Spanjol LocaleNames/mt/et=Estonjan LocaleNames/mt/eu=Bask LocaleNames/mt/fa=Persjan LocaleNames/mt/ff=Fulah -LocaleNames/mt/fi=Finlandi\u017c -LocaleNames/mt/fj=Fi\u0121jan +LocaleNames/mt/fi=Finlandiż +LocaleNames/mt/fj=Fiġjan LocaleNames/mt/fo=Faroese -LocaleNames/mt/fr=Fran\u010bi\u017c +LocaleNames/mt/fr=Franċiż LocaleNames/mt/fy=Frisian tal-Punent -LocaleNames/mt/ga=Irlandi\u017c -LocaleNames/mt/gd=Galliku Sko\u010b\u010bi\u017c -LocaleNames/mt/gl=Gali\u010bjan +LocaleNames/mt/ga=Irlandiż +LocaleNames/mt/gd=Galliku Skoċċiż +LocaleNames/mt/gl=Galiċjan LocaleNames/mt/gn=Guarani LocaleNames/mt/gu=Gujarati LocaleNames/mt/gv=Manx @@ -4785,59 +4785,59 @@ LocaleNames/mt/he=Ebrajk LocaleNames/mt/hi=Hindi LocaleNames/mt/ho=Hiri Motu LocaleNames/mt/hr=Kroat -LocaleNames/mt/hu=Ungeri\u017c +LocaleNames/mt/hu=Ungeriż LocaleNames/mt/hy=Armen LocaleNames/mt/hz=Herero -LocaleNames/mt/id=Indone\u017cjan +LocaleNames/mt/id=Indoneżjan LocaleNames/mt/ik=Inupjak -LocaleNames/mt/is=I\u017clandi\u017c +LocaleNames/mt/is=Iżlandiż LocaleNames/mt/it=Taljan LocaleNames/mt/iu=Inuktitut -LocaleNames/mt/ja=\u0120appuni\u017c -LocaleNames/mt/jv=\u0120avani\u017c -LocaleNames/mt/ka=\u0120or\u0121jan +LocaleNames/mt/ja=Ġappuniż +LocaleNames/mt/jv=Ġavaniż +LocaleNames/mt/ka=Ġorġjan LocaleNames/mt/ki=Kikuju LocaleNames/mt/kj=Kuanyama -LocaleNames/mt/kk=Ka\u017cak +LocaleNames/mt/kk=Każak LocaleNames/mt/kl=Kalallisut LocaleNames/mt/km=Khmer LocaleNames/mt/ko=Korean LocaleNames/mt/ks=Kashmiri LocaleNames/mt/ku=Kurd LocaleNames/mt/kw=Korniku -LocaleNames/mt/ky=Kirgi\u017c -LocaleNames/mt/lb=Lussemburgi\u017c +LocaleNames/mt/ky=Kirgiż +LocaleNames/mt/lb=Lussemburgiż LocaleNames/mt/ln=Lingaljan LocaleNames/mt/lt=Litwan LocaleNames/mt/lv=Latvjan LocaleNames/mt/mg=Malagasy -LocaleNames/mt/mh=Marshalljani\u017c -LocaleNames/mt/mk=Ma\u010bedonjan +LocaleNames/mt/mh=Marshalljaniż +LocaleNames/mt/mk=Maċedonjan LocaleNames/mt/ml=Malayalam LocaleNames/mt/mn=Mongoljan LocaleNames/mt/mr=Marathi LocaleNames/mt/ms=Malay LocaleNames/mt/mt=Malti -LocaleNames/mt/my=Burmi\u017c +LocaleNames/mt/my=Burmiż LocaleNames/mt/na=Naurujan -LocaleNames/mt/nb=Bokmal Norve\u0121i\u017c +LocaleNames/mt/nb=Bokmal Norveġiż LocaleNames/mt/nd=Ndebeli tat-Tramuntana -LocaleNames/mt/ne=Nepali\u017c -LocaleNames/mt/nl=Olandi\u017c -LocaleNames/mt/nn=Ninorsk Norve\u0121i\u017c -LocaleNames/mt/no=Norve\u0121i\u017c +LocaleNames/mt/ne=Nepaliż +LocaleNames/mt/nl=Olandiż +LocaleNames/mt/nn=Ninorsk Norveġiż +LocaleNames/mt/no=Norveġiż LocaleNames/mt/nr=Ndebele tan-Nofsinhar LocaleNames/mt/nv=Navajo LocaleNames/mt/ny=Nyanja -LocaleNames/mt/oc=O\u010b\u010bitan -LocaleNames/mt/oj=O\u0121ibwa +LocaleNames/mt/oc=Oċċitan +LocaleNames/mt/oj=Oġibwa LocaleNames/mt/om=Oromo LocaleNames/mt/or=Odia LocaleNames/mt/os=Ossettiku LocaleNames/mt/pa=Punjabi LocaleNames/mt/pl=Pollakk LocaleNames/mt/ps=Pashto -LocaleNames/mt/pt=Portugi\u017c +LocaleNames/mt/pt=Portugiż LocaleNames/mt/qu=Quechua LocaleNames/mt/rm=Romanz LocaleNames/mt/ro=Rumen @@ -4851,127 +4851,127 @@ LocaleNames/mt/sk=Slovakk LocaleNames/mt/sl=Sloven LocaleNames/mt/sm=Samoan LocaleNames/mt/sn=Shona -LocaleNames/mt/sq=Albani\u017c +LocaleNames/mt/sq=Albaniż LocaleNames/mt/sr=Serb LocaleNames/mt/st=Soto tan-Nofsinhar -LocaleNames/mt/su=Sundani\u017c -LocaleNames/mt/sv=\u017bvedi\u017c +LocaleNames/mt/su=Sundaniż +LocaleNames/mt/sv=Żvediż LocaleNames/mt/sw=Swahili -LocaleNames/mt/tg=Ta\u0121ik -LocaleNames/mt/th=Tajlandi\u017c +LocaleNames/mt/tg=Taġik +LocaleNames/mt/th=Tajlandiż LocaleNames/mt/ti=Tigrinya LocaleNames/mt/tk=Turkmeni LocaleNames/mt/tn=Tswana LocaleNames/mt/to=Tongan LocaleNames/mt/tr=Tork -LocaleNames/mt/ty=Ta\u0127itjan +LocaleNames/mt/ty=Taħitjan LocaleNames/mt/ug=Uyghur LocaleNames/mt/uk=Ukren LocaleNames/mt/uz=Uzbek -LocaleNames/mt/vi=Vjetnami\u017c +LocaleNames/mt/vi=Vjetnamiż LocaleNames/mt/vo=Volapuk LocaleNames/mt/xh=Xhosa LocaleNames/mt/yi=Yiddish LocaleNames/mt/yo=Yoruba LocaleNames/mt/za=Zhuang -LocaleNames/mt/zh=\u010aini\u017c +LocaleNames/mt/zh=Ċiniż LocaleNames/mt/zu=Zulu -LocaleNames/mt/AE=l-Emirati G\u0127arab Mag\u0127quda +LocaleNames/mt/AE=l-Emirati Għarab Magħquda LocaleNames/mt/AF=l-Afganistan LocaleNames/mt/AI=Anguilla LocaleNames/mt/AL=l-Albanija LocaleNames/mt/AM=l-Armenja LocaleNames/mt/AQ=l-Antartika -LocaleNames/mt/AR=l-Ar\u0121entina +LocaleNames/mt/AR=l-Arġentina LocaleNames/mt/AS=is-Samoa Amerikana LocaleNames/mt/AT=l-Awstrija LocaleNames/mt/AU=l-Awstralja -LocaleNames/mt/AZ=l-A\u017cerbaj\u0121an -LocaleNames/mt/BA=il-Bo\u017cnija-\u0126erzegovina +LocaleNames/mt/AZ=l-Ażerbajġan +LocaleNames/mt/BA=il-Bożnija-Ħerzegovina LocaleNames/mt/BD=il-Bangladesh -LocaleNames/mt/BE=il-Bel\u0121ju +LocaleNames/mt/BE=il-Belġju LocaleNames/mt/BG=il-Bulgarija LocaleNames/mt/BH=il-Bahrain LocaleNames/mt/BN=il-Brunei LocaleNames/mt/BO=il-Bolivja -LocaleNames/mt/BR=Il-Bra\u017cil +LocaleNames/mt/BR=Il-Brażil LocaleNames/mt/BS=il-Bahamas LocaleNames/mt/BT=il-Bhutan LocaleNames/mt/BY=il-Belarussja LocaleNames/mt/BZ=il-Belize LocaleNames/mt/CA=il-Kanada -LocaleNames/mt/CC=G\u017cejjer Cocos (Keeling) +LocaleNames/mt/CC=Gżejjer Cocos (Keeling) LocaleNames/mt/CD=ir-Repubblika Demokratika tal-Kongo -LocaleNames/mt/CF=ir-Repubblika \u010aentru-Afrikana +LocaleNames/mt/CF=ir-Repubblika Ċentru-Afrikana LocaleNames/mt/CG=il-Kongo - Brazzaville -LocaleNames/mt/CH=l-I\u017cvizzera +LocaleNames/mt/CH=l-Iżvizzera LocaleNames/mt/CI=il-Kosta tal-Avorju -LocaleNames/mt/CL=i\u010b-\u010aili +LocaleNames/mt/CL=iċ-Ċili LocaleNames/mt/CM=il-Kamerun -LocaleNames/mt/CN=i\u010b-\u010aina +LocaleNames/mt/CN=iċ-Ċina LocaleNames/mt/CO=il-Kolombja LocaleNames/mt/CR=il-Costa Rica LocaleNames/mt/CU=Kuba LocaleNames/mt/CV=Cape Verde -LocaleNames/mt/CY=\u010aipru -LocaleNames/mt/CZ=ir-Repubblika \u010aeka -LocaleNames/mt/DE=il-\u0120ermanja +LocaleNames/mt/CY=Ċipru +LocaleNames/mt/CZ=ir-Repubblika Ċeka +LocaleNames/mt/DE=il-Ġermanja LocaleNames/mt/DJ=il-Djibouti LocaleNames/mt/DK=id-Danimarka LocaleNames/mt/DM=Dominica LocaleNames/mt/DO=ir-Repubblika Dominicana -LocaleNames/mt/DZ=l-Al\u0121erija +LocaleNames/mt/DZ=l-Alġerija LocaleNames/mt/EC=l-Ekwador LocaleNames/mt/EE=l-Estonja -LocaleNames/mt/EG=l-E\u0121ittu -LocaleNames/mt/EH=is-Sa\u0127ara tal-Punent +LocaleNames/mt/EG=l-Eġittu +LocaleNames/mt/EH=is-Saħara tal-Punent LocaleNames/mt/ER=l-Eritrea LocaleNames/mt/ES=Spanja LocaleNames/mt/ET=l-Etjopja LocaleNames/mt/FI=il-Finlandja -LocaleNames/mt/FJ=Fi\u0121i -LocaleNames/mt/FM=il-Mikrone\u017cja -LocaleNames/mt/FO=il-G\u017cejjer Faeroe +LocaleNames/mt/FJ=Fiġi +LocaleNames/mt/FM=il-Mikroneżja +LocaleNames/mt/FO=il-Gżejjer Faeroe LocaleNames/mt/FR=Franza LocaleNames/mt/GB=ir-Renju Unit LocaleNames/mt/GE=il-Georgia -LocaleNames/mt/GF=il-Guyana Fran\u010bi\u017ca +LocaleNames/mt/GF=il-Guyana Franċiża LocaleNames/mt/GH=il-Ghana LocaleNames/mt/GL=Greenland LocaleNames/mt/GM=il-Gambja LocaleNames/mt/GN=il-Guinea LocaleNames/mt/GP=Guadeloupe LocaleNames/mt/GQ=il-Guinea Ekwatorjali -LocaleNames/mt/GR=il-Gre\u010bja -LocaleNames/mt/GS=il-Georgia tan-Nofsinhar u l-G\u017cejjer Sandwich tan-Nofsinhar +LocaleNames/mt/GR=il-Greċja +LocaleNames/mt/GS=il-Georgia tan-Nofsinhar u l-Gżejjer Sandwich tan-Nofsinhar LocaleNames/mt/GT=il-Gwatemala LocaleNames/mt/GU=Guam LocaleNames/mt/GW=il-Guinea-Bissau LocaleNames/mt/GY=il-Guyana -LocaleNames/mt/HK=ir-Re\u0121jun Amministrattiv Spe\u010bjali ta\u2019 Hong Kong tar-Repubblika tal-Poplu ta\u010b-\u010aina -LocaleNames/mt/HM=il-G\u017cejjer Heard u l-G\u017cejjer McDonald +LocaleNames/mt/HK=ir-Reġjun Amministrattiv Speċjali ta’ Hong Kong tar-Repubblika tal-Poplu taċ-Ċina +LocaleNames/mt/HM=il-Gżejjer Heard u l-Gżejjer McDonald LocaleNames/mt/HN=il-Honduras LocaleNames/mt/HR=il-Kroazja LocaleNames/mt/HT=il-Haiti LocaleNames/mt/HU=l-Ungerija -LocaleNames/mt/ID=l-Indone\u017cja +LocaleNames/mt/ID=l-Indoneżja LocaleNames/mt/IE=l-Irlanda -LocaleNames/mt/IL=I\u017crael +LocaleNames/mt/IL=Iżrael LocaleNames/mt/IN=l-Indja -LocaleNames/mt/IS=l-I\u017clanda +LocaleNames/mt/IS=l-Iżlanda LocaleNames/mt/IT=l-Italja -LocaleNames/mt/JM=il-\u0120amajka -LocaleNames/mt/JO=il-\u0120ordan -LocaleNames/mt/JP=il-\u0120appun +LocaleNames/mt/JM=il-Ġamajka +LocaleNames/mt/JO=il-Ġordan +LocaleNames/mt/JP=il-Ġappun LocaleNames/mt/KE=il-Kenja -LocaleNames/mt/KG=il-Kirgi\u017cistan +LocaleNames/mt/KG=il-Kirgiżistan LocaleNames/mt/KH=il-Kambodja LocaleNames/mt/KM=Comoros LocaleNames/mt/KN=Saint Kitts u Nevis -LocaleNames/mt/KP=il-Korea ta\u2019 Fuq -LocaleNames/mt/KR=il-Korea t\u2019Isfel +LocaleNames/mt/KP=il-Korea ta’ Fuq +LocaleNames/mt/KR=il-Korea t’Isfel LocaleNames/mt/KW=il-Kuwajt -LocaleNames/mt/KZ=il-Ka\u017cakistan +LocaleNames/mt/KZ=il-Każakistan LocaleNames/mt/LB=il-Libanu LocaleNames/mt/LC=Saint Lucia LocaleNames/mt/LR=il-Liberja @@ -4984,12 +4984,12 @@ LocaleNames/mt/MA=il-Marokk LocaleNames/mt/MC=Monaco LocaleNames/mt/MD=il-Moldova LocaleNames/mt/MG=Madagascar -LocaleNames/mt/MH=G\u017cejjer Marshall -LocaleNames/mt/MK=il-Ma\u010bedonja ta\u2019 Fuq +LocaleNames/mt/MH=Gżejjer Marshall +LocaleNames/mt/MK=il-Maċedonja ta’ Fuq LocaleNames/mt/MM=il-Myanmar/Burma LocaleNames/mt/MN=il-Mongolja -LocaleNames/mt/MO=ir-Re\u0121jun Amministrattiv Spe\u010bjali tal-Macao tar-Repubblika tal-Poplu ta\u010b-\u010aina -LocaleNames/mt/MP=\u0120\u017cejjer Mariana tat-Tramuntana +LocaleNames/mt/MO=ir-Reġjun Amministrattiv Speċjali tal-Macao tar-Repubblika tal-Poplu taċ-Ċina +LocaleNames/mt/MP=Ġżejjer Mariana tat-Tramuntana LocaleNames/mt/MQ=Martinique LocaleNames/mt/MR=il-Mauritania LocaleNames/mt/MU=Mauritius @@ -4997,12 +4997,12 @@ LocaleNames/mt/MX=il-Messiku LocaleNames/mt/MY=il-Malasja LocaleNames/mt/MZ=il-Mozambique LocaleNames/mt/NA=in-Namibja -LocaleNames/mt/NE=in-Ni\u0121er -LocaleNames/mt/NG=in-Ni\u0121erja +LocaleNames/mt/NE=in-Niġer +LocaleNames/mt/NG=in-Niġerja LocaleNames/mt/NI=in-Nikaragwa LocaleNames/mt/NL=in-Netherlands -LocaleNames/mt/NO=in-Norve\u0121ja -LocaleNames/mt/PF=Poline\u017cja Fran\u010bi\u017ca +LocaleNames/mt/NO=in-Norveġja +LocaleNames/mt/PF=Polineżja Franċiża LocaleNames/mt/PG=Papua New Guinea LocaleNames/mt/PH=il-Filippini LocaleNames/mt/PL=il-Polonja @@ -5010,28 +5010,28 @@ LocaleNames/mt/PM=Saint Pierre u Miquelon LocaleNames/mt/PS=it-Territorji Palestinjani LocaleNames/mt/PT=il-Portugall LocaleNames/mt/PY=il-Paragwaj -LocaleNames/mt/RE=R\u00e9union +LocaleNames/mt/RE=Réunion LocaleNames/mt/RO=ir-Rumanija LocaleNames/mt/RU=ir-Russja LocaleNames/mt/SA=l-Arabja Sawdija -LocaleNames/mt/SE=l-I\u017cvezja +LocaleNames/mt/SE=l-Iżvezja LocaleNames/mt/SG=Singapore LocaleNames/mt/SI=is-Slovenja LocaleNames/mt/SJ=Svalbard u Jan Mayen LocaleNames/mt/SK=is-Slovakkja LocaleNames/mt/SO=is-Somalja LocaleNames/mt/SR=is-Suriname -LocaleNames/mt/ST=S\u00e3o Tom\u00e9 u Pr\u00edncipe +LocaleNames/mt/ST=São Tomé u Príncipe LocaleNames/mt/SY=is-Sirja LocaleNames/mt/SZ=l-Eswatini -LocaleNames/mt/TC=il-G\u017cejjer Turks u Caicos -LocaleNames/mt/TD=i\u010b-Chad -LocaleNames/mt/TF=It-Territorji Fran\u010bi\u017ci tan-Nofsinhar +LocaleNames/mt/TC=il-Gżejjer Turks u Caicos +LocaleNames/mt/TD=iċ-Chad +LocaleNames/mt/TF=It-Territorji Franċiżi tan-Nofsinhar LocaleNames/mt/TH=it-Tajlandja -LocaleNames/mt/TJ=it-Ta\u0121ikistan +LocaleNames/mt/TJ=it-Taġikistan LocaleNames/mt/TK=it-Tokelau LocaleNames/mt/TL=Timor Leste -LocaleNames/mt/TN=it-Tune\u017cija +LocaleNames/mt/TN=it-Tuneżija LocaleNames/mt/TR=it-Turkija LocaleNames/mt/TT=Trinidad u Tobago LocaleNames/mt/TW=it-Tajwan @@ -5039,7 +5039,7 @@ LocaleNames/mt/TZ=it-Tanzanija LocaleNames/mt/UA=l-Ukrajna LocaleNames/mt/US=l-Istati Uniti LocaleNames/mt/UY=l-Urugwaj -LocaleNames/mt/UZ=l-U\u017cbekistan +LocaleNames/mt/UZ=l-Użbekistan LocaleNames/mt/VA=l-Istat tal-Belt tal-Vatikan LocaleNames/mt/VC=Saint Vincent u l-Grenadini LocaleNames/mt/VE=il-Venezwela @@ -5048,50 +5048,50 @@ LocaleNames/mt/VU=Vanuatu LocaleNames/mt/WF=Wallis u Futuna LocaleNames/mt/YE=il-Jemen LocaleNames/mt/YT=Mayotte -LocaleNames/mt/ZA=l-Afrika t\u2019Isfel -LocaleNames/mt/ZM=i\u017c-\u017bambja -LocaleNames/mt/ZW=i\u017c-\u017bimbabwe -LocaleNames/sr/ZA=\u0408\u0443\u0436\u043d\u043e\u0430\u0444\u0440\u0438\u0447\u043a\u0430 \u0420\u0435\u043f\u0443\u0431\u043b\u0438\u043a\u0430 -LocaleNames/zh_SG/bo=\u85cf\u8bed -LocaleNames/zh_SG/gd=\u82cf\u683c\u5170\u76d6\u5c14\u8bed -LocaleNames/zh_SG/ho=\u5e0c\u91cc\u83ab\u56fe\u8bed -LocaleNames/zh_SG/ia=\u56fd\u9645\u8bed -LocaleNames/zh_SG/ie=\u56fd\u9645\u6587\u5b57\uff08E\uff09 -LocaleNames/zh_SG/iu=\u56e0\u7ebd\u7279\u8bed -LocaleNames/zh_SG/kj=\u5bbd\u4e9a\u739b\u8bed -LocaleNames/zh_SG/kn=\u5361\u7eb3\u8fbe\u8bed -LocaleNames/zh_SG/lv=\u62c9\u8131\u7ef4\u4e9a\u8bed -LocaleNames/zh_SG/ny=\u9f50\u5207\u74e6\u8bed -LocaleNames/zh_SG/oc=\u5965\u514b\u8bed -LocaleNames/zh_SG/om=\u5965\u7f57\u83ab\u8bed -LocaleNames/zh_SG/rm=\u7f57\u66fc\u4ec0\u8bed -LocaleNames/zh_SG/sd=\u4fe1\u5fb7\u8bed -LocaleNames/zh_SG/se=\u5317\u65b9\u8428\u7c73\u8bed -LocaleNames/zh_SG/sn=\u7ecd\u7eb3\u8bed -LocaleNames/zh_SG/ss=\u65af\u74e6\u8482\u8bed -LocaleNames/zh_SG/su=\u5dfd\u4ed6\u8bed -LocaleNames/zh_SG/tl=\u4ed6\u52a0\u7984\u8bed -LocaleNames/zh_SG/tn=\u8328\u74e6\u7eb3\u8bed -LocaleNames/zh_SG/ts=\u806a\u52a0\u8bed -LocaleNames/zh_SG/tt=\u9791\u977c\u8bed -LocaleNames/zh_SG/tw=\u5951\u7ef4\u8bed -LocaleNames/zh_SG/wa=\u74e6\u9686\u8bed -LocaleNames/zh_SG/wo=\u6c83\u6d1b\u592b\u8bed -LocaleNames/zh_SG/xh=\u79d1\u8428\u8bed -LocaleNames/zh_SG/za=\u58ee\u8bed -LocaleNames/zh_SG/BA=\u6ce2\u65af\u5c3c\u4e9a\u548c\u9ed1\u585e\u54e5\u7ef4\u90a3 -LocaleNames/zh_SG/CC=\u79d1\u79d1\u65af\uff08\u57fa\u6797\uff09\u7fa4\u5c9b -LocaleNames/zh_SG/CD=\u521a\u679c\uff08\u91d1\uff09 -LocaleNames/zh_SG/CG=\u521a\u679c\uff08\u5e03\uff09 -LocaleNames/zh_SG/DM=\u591a\u7c73\u5c3c\u514b -LocaleNames/zh_SG/KG=\u5409\u5c14\u5409\u65af\u65af\u5766 -LocaleNames/zh_SG/KP=\u671d\u9c9c -LocaleNames/zh_SG/MQ=\u9a6c\u63d0\u5c3c\u514b -LocaleNames/zh_SG/MQ=\u9a6c\u63d0\u5c3c\u514b -LocaleNames/zh_SG/NC=\u65b0\u5580\u91cc\u591a\u5c3c\u4e9a -LocaleNames/zh_SG/TF=\u6cd5\u5c5e\u5357\u90e8\u9886\u5730 -FormatData/es_US/AmPmMarkers/0=a.\u00a0m. -FormatData/es_US/AmPmMarkers/1=p.\u00a0m. +LocaleNames/mt/ZA=l-Afrika t’Isfel +LocaleNames/mt/ZM=iż-Żambja +LocaleNames/mt/ZW=iż-Żimbabwe +LocaleNames/sr/ZA=Јужноафричка Република +LocaleNames/zh_SG/bo=藏语 +LocaleNames/zh_SG/gd=苏格兰盖尔语 +LocaleNames/zh_SG/ho=希里莫图语 +LocaleNames/zh_SG/ia=国际语 +LocaleNames/zh_SG/ie=国际文字(E) +LocaleNames/zh_SG/iu=因纽特语 +LocaleNames/zh_SG/kj=宽亚玛语 +LocaleNames/zh_SG/kn=卡纳达语 +LocaleNames/zh_SG/lv=拉脱维亚语 +LocaleNames/zh_SG/ny=齐切瓦语 +LocaleNames/zh_SG/oc=奥克语 +LocaleNames/zh_SG/om=奥罗莫语 +LocaleNames/zh_SG/rm=罗曼什语 +LocaleNames/zh_SG/sd=信德语 +LocaleNames/zh_SG/se=北方萨米语 +LocaleNames/zh_SG/sn=绍纳语 +LocaleNames/zh_SG/ss=斯瓦蒂语 +LocaleNames/zh_SG/su=巽他语 +LocaleNames/zh_SG/tl=他加禄语 +LocaleNames/zh_SG/tn=茨瓦纳语 +LocaleNames/zh_SG/ts=聪加语 +LocaleNames/zh_SG/tt=鞑靼语 +LocaleNames/zh_SG/tw=契维语 +LocaleNames/zh_SG/wa=瓦隆语 +LocaleNames/zh_SG/wo=沃洛夫语 +LocaleNames/zh_SG/xh=科萨语 +LocaleNames/zh_SG/za=壮语 +LocaleNames/zh_SG/BA=波斯尼亚和黑塞哥维那 +LocaleNames/zh_SG/CC=科科斯(基林)群岛 +LocaleNames/zh_SG/CD=刚果(金) +LocaleNames/zh_SG/CG=刚果(布) +LocaleNames/zh_SG/DM=多米尼克 +LocaleNames/zh_SG/KG=吉尔吉斯斯坦 +LocaleNames/zh_SG/KP=朝鲜 +LocaleNames/zh_SG/MQ=马提尼克 +LocaleNames/zh_SG/MQ=马提尼克 +LocaleNames/zh_SG/NC=新喀里多尼亚 +LocaleNames/zh_SG/TF=法属南部领地 +FormatData/es_US/AmPmMarkers/0=a. m. +FormatData/es_US/AmPmMarkers/1=p. m. FormatData/es_US/latn.NumberElements/0=. FormatData/es_US/latn.NumberElements/1=, FormatData/es_US/latn.NumberElements/2=; @@ -5100,18 +5100,18 @@ FormatData/es_US/latn.NumberElements/4=0 FormatData/es_US/latn.NumberElements/5=# FormatData/es_US/latn.NumberElements/6=- FormatData/es_US/latn.NumberElements/7=E -FormatData/es_US/latn.NumberElements/8=\u2030 -FormatData/es_US/latn.NumberElements/9=\u221e +FormatData/es_US/latn.NumberElements/8=‰ +FormatData/es_US/latn.NumberElements/9=∞ FormatData/es_US/latn.NumberElements/10=NaN FormatData/mt/AmPmMarkers/0=AM FormatData/mt/AmPmMarkers/1=PM -FormatData/mt/DatePatterns/0=EEEE, d 'ta'\u2019 MMMM y +FormatData/mt/DatePatterns/0=EEEE, d 'ta'’ MMMM y # bug# 6498742 # make sure that the default en data is used for en_SG : CLDR1.4.1 demoted these data -FormatData/en_SG/TimePatterns/0=h:mm:ss\u202fa zzzz -FormatData/en_SG/TimePatterns/1=h:mm:ss\u202fa z -FormatData/en_SG/TimePatterns/2=h:mm:ss\u202fa -FormatData/en_SG/TimePatterns/3=h:mm\u202fa +FormatData/en_SG/TimePatterns/0=h:mm:ss a zzzz +FormatData/en_SG/TimePatterns/1=h:mm:ss a z +FormatData/en_SG/TimePatterns/2=h:mm:ss a +FormatData/en_SG/TimePatterns/3=h:mm a FormatData/en_SG/DatePatterns/0=EEEE, d MMMM y FormatData/en_SG/DatePatterns/1=d MMMM y FormatData/en_SG/DatePatterns/2=d MMM y @@ -5120,10 +5120,10 @@ FormatData/en_SG/DateTimePatterns/0={1}, {0} # Use approved data FormatData/ms/Eras/0=S.M. FormatData/ms/Eras/1=TM -FormatData/sr_BA/MonthNames/5=\u0458\u0443\u043d -FormatData/sr_BA/MonthNames/6=\u0458\u0443\u043b -FormatData/sr_BA/DayNames/3=\u0441\u0440\u0435\u0434\u0430 -FormatData/sr_BA/DayAbbreviations/3=\u0441\u0440\u0435 +FormatData/sr_BA/MonthNames/5=јун +FormatData/sr_BA/MonthNames/6=јул +FormatData/sr_BA/DayNames/3=среда +FormatData/sr_BA/DayAbbreviations/3=сре FormatData/sr_BA/TimePatterns/0=HH:mm:ss zzzz FormatData/sr_BA/TimePatterns/1=HH:mm:ss z FormatData/sr_BA/TimePatterns/2=HH:mm:ss @@ -5135,31 +5135,31 @@ FormatData/sr_BA/DatePatterns/3=d.M.yy. FormatData/sr_BA/DateTimePatterns/0={1} {0} LocaleNames/pt_BR/ce=checheno LocaleNames/pt_BR/ik=inupiaque -LocaleNames/pt_BR/jv=javan\u00eas +LocaleNames/pt_BR/jv=javanês LocaleNames/pt_BR/nd=ndebele do norte LocaleNames/pt_BR/nr=ndebele do sul LocaleNames/pt_BR/st=soto do sul LocaleNames/pt_BR/AX=Ilhas Aland -LocaleNames/pt_BR/BA=B\u00f3snia e Herzegovina +LocaleNames/pt_BR/BA=Bósnia e Herzegovina LocaleNames/pt_BR/BH=Barein LocaleNames/pt_BR/KP=Coreia do Norte -LocaleNames/pt_BR/MK=Maced\u00f4nia do Norte -LocaleNames/pt_BR/ZW=Zimb\u00e1bue +LocaleNames/pt_BR/MK=Macedônia do Norte +LocaleNames/pt_BR/ZW=Zimbábue LocaleNames/pt_PT/ee=ewe -LocaleNames/pt_PT/fo=fero\u00eas +LocaleNames/pt_PT/fo=feroês LocaleNames/pt_PT/gl=galego -LocaleNames/pt_PT/ha=ha\u00fa\u00e7a -LocaleNames/pt_PT/hy=arm\u00e9nio +LocaleNames/pt_PT/ha=haúça +LocaleNames/pt_PT/hy=arménio LocaleNames/pt_PT/ig=igbo LocaleNames/pt_PT/ki=quicuio -LocaleNames/pt_PT/kl=groneland\u00eas +LocaleNames/pt_PT/kl=gronelandês LocaleNames/pt_PT/km=khmer -LocaleNames/pt_PT/mh=marshal\u00eas -LocaleNames/pt_PT/mk=maced\u00f3nio +LocaleNames/pt_PT/mh=marshalês +LocaleNames/pt_PT/mk=macedónio LocaleNames/pt_PT/nr=ndebele do sul -LocaleNames/pt_PT/os=oss\u00e9tico +LocaleNames/pt_PT/os=ossético LocaleNames/pt_PT/st=sesoto -LocaleNames/pt_PT/ta=t\u00e2mil +LocaleNames/pt_PT/ta=tâmil LocaleNames/pt_PT/AI=Anguila LocaleNames/pt_PT/AX=Alanda @@ -5177,7 +5177,7 @@ FormatData/nl/Eras/1=n.Chr. LocaleNames/da/da=dansk # bug 6485516 -LocaleNames/fr/GF=Guyane fran\u00e7aise +LocaleNames/fr/GF=Guyane française # bug 6486607 LocaleNames/fr/GY=Guyana @@ -5191,9 +5191,9 @@ FormatData/fr_FR/DateTimePatternChars=GyMdkHmsSEDFwWahKzZ FormatData/fr_LU/DateTimePatternChars=GyMdkHmsSEDFwWahKzZ # bug 6547501 -FormatData/fr/latn.NumberPatterns/2=#,##0\u00a0% +FormatData/fr/latn.NumberPatterns/2=#,##0 % # following two lines are also for bug 4494727 -FormatData/fr_CA/latn.NumberPatterns/2=#,##0\u00a0% +FormatData/fr_CA/latn.NumberPatterns/2=#,##0 % FormatData/fr_CH/latn.NumberPatterns/2=#,##0% # bug 4494727 @@ -5207,27 +5207,27 @@ LocaleNames/de/ME=Montenegro LocaleNames/de/RS=Serbien LocaleNames/es/ME=Montenegro LocaleNames/es/RS=Serbia -LocaleNames/fr/ME=Mont\u00e9n\u00e9gro +LocaleNames/fr/ME=Monténégro LocaleNames/fr/RS=Serbie LocaleNames/it/ME=Montenegro LocaleNames/it/RS=Serbia -LocaleNames/ja/ME=\u30e2\u30f3\u30c6\u30cd\u30b0\u30ed -LocaleNames/ja/RS=\u30bb\u30eb\u30d3\u30a2 -LocaleNames/ko/ME=\ubaac\ud14c\ub124\uadf8\ub85c -LocaleNames/ko/RS=\uc138\ub974\ube44\uc544 +LocaleNames/ja/ME=モンテネグロ +LocaleNames/ja/RS=セルビア +LocaleNames/ko/ME=몬테네그로 +LocaleNames/ko/RS=세르비아 LocaleNames/sv/ME=Montenegro LocaleNames/sv/RS=Serbien -LocaleNames/zh/ME=\u9ed1\u5c71 -LocaleNames/zh/RS=\u585e\u5c14\u7ef4\u4e9a -LocaleNames/zh_TW/ME=\u8499\u7279\u5167\u54e5\u7f85 -LocaleNames/zh_TW/RS=\u585e\u723e\u7dad\u4e9e +LocaleNames/zh/ME=黑山 +LocaleNames/zh/RS=塞尔维亚 +LocaleNames/zh_TW/ME=蒙特內哥羅 +LocaleNames/zh_TW/RS=塞爾維亞 # bug 6531591 -CurrencyNames/ar_SD/SDD=\u062f.\u0633.\u200f -CurrencyNames/ar_SD/SDG=\u062c.\u0633. +CurrencyNames/ar_SD/SDD=د.س.‏ +CurrencyNames/ar_SD/SDG=ج.س. # bug 6531593 -FormatData/is_IS/latn.NumberPatterns/1=#,##0.00\u00a0\u00a4 +FormatData/is_IS/latn.NumberPatterns/1=#,##0.00 ¤ # bug 6509039 FormatData/sv/AmPmMarkers/0=fm @@ -5241,7 +5241,7 @@ FormatData/fi/AmPmMarkers/0=ap. FormatData/fi/AmPmMarkers/1=ip. # bug 6507067 -TimeZoneNames/zh_TW/Asia\/Taipei/1=\u53f0\u5317\u6a19\u6e96\u6642\u9593 +TimeZoneNames/zh_TW/Asia\/Taipei/1=台北標準時間 TimeZoneNames/zh_TW/Asia\/Taipei/2= # bug 6645271 @@ -5249,10 +5249,10 @@ FormatData/hr_HR/DatePatterns/2=d. MMM y. FormatData/hr_HR/DatePatterns/3=dd. MM. y. # bug 6873931 -CurrencyNames/tr_TR/TRY=\u20ba +CurrencyNames/tr_TR/TRY=₺ #bug 6450945 -FormatData/ro/DayNames/6=s\u00e2mb\u0103t\u0103 +FormatData/ro/DayNames/6=sâmbătă #bug 6645268 LocaleNames/fi/fr=ranska @@ -5261,14 +5261,14 @@ LocaleNames/fi_FI/fr=ranska LocaleNames/fi_FI/FR=Ranska # bug 6646611, 6914413 -FormatData/be_BY/MonthNames/10=\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434\u0430 -FormatData/be_BY/MonthAbbreviations/10=\u043b\u0456\u0441 +FormatData/be_BY/MonthNames/10=лістапада +FormatData/be_BY/MonthAbbreviations/10=ліс # bug 6645405 -FormatData/hu_HU/latn.NumberPatterns/1=#,##0.00\u00a0\u00a4 +FormatData/hu_HU/latn.NumberPatterns/1=#,##0.00 ¤ # bug 6650730 -FormatData/lt/latn.NumberElements/1=\u00a0 +FormatData/lt/latn.NumberElements/1=  FormatData/lt/DatePatterns/2=y-MM-dd # bug 6573250 @@ -5277,7 +5277,7 @@ CurrencyNames/en_CA/USD=US$ # bug 6870908 FormatData/et/MonthNames/0=jaanuar FormatData/et/MonthNames/1=veebruar -FormatData/et/MonthNames/2=m\u00e4rts +FormatData/et/MonthNames/2=märts FormatData/et/MonthNames/3=aprill FormatData/et/MonthNames/4=mai FormatData/et/MonthNames/5=juuni @@ -5289,7 +5289,7 @@ FormatData/et/MonthNames/10=november FormatData/et/MonthNames/11=detsember FormatData/et/MonthAbbreviations/0=jaan FormatData/et/MonthAbbreviations/1=veebr -FormatData/et/MonthAbbreviations/2=m\u00e4rts +FormatData/et/MonthAbbreviations/2=märts FormatData/et/MonthAbbreviations/3=apr FormatData/et/MonthAbbreviations/4=mai FormatData/et/MonthAbbreviations/5=juuni @@ -5305,39 +5305,39 @@ LocaleNames/es/aa=afar LocaleNames/es/av=avar LocaleNames/es/az=azerbaiyano LocaleNames/es/ba=baskir -LocaleNames/es/bn=bengal\u00ed -LocaleNames/es/cu=eslavo eclesi\u00e1stico +LocaleNames/es/bn=bengalí +LocaleNames/es/cu=eslavo eclesiástico LocaleNames/es/dz=dzongkha LocaleNames/es/eu=euskera LocaleNames/es/fa=persa LocaleNames/es/ff=fula LocaleNames/es/fj=fiyiano -LocaleNames/es/fo=fero\u00e9s -LocaleNames/es/fy=fris\u00f3n occidental -LocaleNames/es/gu=guyarat\u00ed -LocaleNames/es/gv=man\u00e9s +LocaleNames/es/fo=feroés +LocaleNames/es/fy=frisón occidental +LocaleNames/es/gu=guyaratí +LocaleNames/es/gv=manés LocaleNames/es/hi=hindi LocaleNames/es/ho=hiri motu LocaleNames/es/ie=interlingue LocaleNames/es/ig=igbo -LocaleNames/es/ii=yi de Sichu\u00e1n +LocaleNames/es/ii=yi de Sichuán LocaleNames/es/ik=inupiaq LocaleNames/es/kg=kongo LocaleNames/es/ki=kikuyu LocaleNames/es/kj=kuanyama LocaleNames/es/kk=kazajo LocaleNames/es/km=jemer -LocaleNames/es/kn=canar\u00e9s +LocaleNames/es/kn=canarés LocaleNames/es/ks=cachemir LocaleNames/es/ku=kurdo -LocaleNames/es/ky=kirgu\u00eds +LocaleNames/es/ky=kirguís LocaleNames/es/lu=luba-katanga -LocaleNames/es/mr=marat\u00ed +LocaleNames/es/mr=maratí LocaleNames/es/nb=noruego bokmal LocaleNames/es/nd=ndebele septentrional LocaleNames/es/nn=noruego nynorsk LocaleNames/es/nr=ndebele meridional -LocaleNames/es/os=os\u00e9tico +LocaleNames/es/os=osético LocaleNames/es/rm=romanche LocaleNames/es/rn=kirundi LocaleNames/es/rw=kinyarwanda @@ -5347,10 +5347,10 @@ LocaleNames/es/sl=esloveno LocaleNames/es/sn=shona LocaleNames/es/ss=suazi LocaleNames/es/st=sotho meridional -LocaleNames/es/su=sundan\u00e9s +LocaleNames/es/su=sundanés LocaleNames/es/sw=suajili LocaleNames/es/tg=tayiko -LocaleNames/es/ti=tigri\u00f1a +LocaleNames/es/ti=tigriña LocaleNames/es/tn=setsuana LocaleNames/es/to=tongano LocaleNames/es/tw=twi @@ -5358,7 +5358,7 @@ LocaleNames/es/ty=tahitiano LocaleNames/es/ug=uigur LocaleNames/es/uk=ucraniano LocaleNames/es/uz=uzbeko -LocaleNames/es/vo=volap\u00fck +LocaleNames/es/vo=volapük LocaleNames/es/za=zhuang # bug 6716626 - language @@ -5407,13 +5407,13 @@ LocaleNames/nl/fa=Perzisch LocaleNames/nl/ff=Fulah LocaleNames/nl/fi=Fins LocaleNames/nl/fj=Fijisch -LocaleNames/nl/fo=Faer\u00f6ers +LocaleNames/nl/fo=Faeröers LocaleNames/nl/fr=Frans LocaleNames/nl/fy=Fries LocaleNames/nl/ga=Iers LocaleNames/nl/gd=Schots-Gaelisch LocaleNames/nl/gl=Galicisch -LocaleNames/nl/gn=Guaran\u00ed +LocaleNames/nl/gn=Guaraní LocaleNames/nl/gu=Gujarati LocaleNames/nl/gv=Manx LocaleNames/nl/ha=Hausa @@ -5421,7 +5421,7 @@ LocaleNames/nl/he=Hebreeuws LocaleNames/nl/hi=Hindi LocaleNames/nl/ho=Hiri Motu LocaleNames/nl/hr=Kroatisch -LocaleNames/nl/ht=Ha\u00eftiaans Creools +LocaleNames/nl/ht=Haïtiaans Creools LocaleNames/nl/hu=Hongaars LocaleNames/nl/hy=Armeens LocaleNames/nl/hz=Herero @@ -5472,7 +5472,7 @@ LocaleNames/nl/ms=Maleis LocaleNames/nl/mt=Maltees LocaleNames/nl/my=Birmaans LocaleNames/nl/na=Nauruaans -LocaleNames/nl/nb=Noors - Bokm\u00e5l +LocaleNames/nl/nb=Noors - Bokmål LocaleNames/nl/nd=Noord-Ndebele LocaleNames/nl/ne=Nepalees LocaleNames/nl/ng=Ndonga @@ -5531,12 +5531,12 @@ LocaleNames/nl/tt=Tataars LocaleNames/nl/tw=Twi LocaleNames/nl/ty=Tahitiaans LocaleNames/nl/ug=Oeigoers -LocaleNames/nl/uk=Oekra\u00efens +LocaleNames/nl/uk=Oekraïens LocaleNames/nl/ur=Urdu LocaleNames/nl/uz=Oezbeeks LocaleNames/nl/ve=Venda LocaleNames/nl/vi=Vietnamees -LocaleNames/nl/vo=Volap\u00fck +LocaleNames/nl/vo=Volapük LocaleNames/nl/wa=Waals LocaleNames/nl/wo=Wolof LocaleNames/nl/xh=Xhosa @@ -5552,21 +5552,21 @@ LocaleNames/nl/AE=Verenigde Arabische Emiraten LocaleNames/nl/AF=Afghanistan LocaleNames/nl/AG=Antigua en Barbuda LocaleNames/nl/AI=Anguilla -LocaleNames/nl/AL=Albani\u00eb -LocaleNames/nl/AM=Armeni\u00eb +LocaleNames/nl/AL=Albanië +LocaleNames/nl/AM=Armenië LocaleNames/nl/AO=Angola LocaleNames/nl/AQ=Antarctica -LocaleNames/nl/AR=Argentini\u00eb +LocaleNames/nl/AR=Argentinië LocaleNames/nl/AS=Amerikaans-Samoa LocaleNames/nl/AT=Oostenrijk -LocaleNames/nl/AU=Australi\u00eb +LocaleNames/nl/AU=Australië LocaleNames/nl/AW=Aruba -LocaleNames/nl/AX=\u00c5land +LocaleNames/nl/AX=Åland LocaleNames/nl/AZ=Azerbeidzjan -LocaleNames/nl/BA=Bosni\u00eb en Herzegovina +LocaleNames/nl/BA=Bosnië en Herzegovina LocaleNames/nl/BB=Barbados LocaleNames/nl/BD=Bangladesh -LocaleNames/nl/BE=Belgi\u00eb +LocaleNames/nl/BE=België LocaleNames/nl/BF=Burkina Faso LocaleNames/nl/BG=Bulgarije LocaleNames/nl/BH=Bahrein @@ -5575,8 +5575,8 @@ LocaleNames/nl/BJ=Benin LocaleNames/nl/BM=Bermuda LocaleNames/nl/BN=Brunei LocaleNames/nl/BO=Bolivia -LocaleNames/nl/BR=Brazili\u00eb -LocaleNames/nl/BS=Bahama\u2019s +LocaleNames/nl/BR=Brazilië +LocaleNames/nl/BS=Bahama’s LocaleNames/nl/BT=Bhutan LocaleNames/nl/BV=Bouveteiland LocaleNames/nl/BW=Botswana @@ -5596,10 +5596,10 @@ LocaleNames/nl/CN=China LocaleNames/nl/CO=Colombia LocaleNames/nl/CR=Costa Rica LocaleNames/nl/CU=Cuba -LocaleNames/nl/CV=Kaapverdi\u00eb +LocaleNames/nl/CV=Kaapverdië LocaleNames/nl/CX=Christmaseiland LocaleNames/nl/CY=Cyprus -LocaleNames/nl/CZ=Tsjechi\u00eb +LocaleNames/nl/CZ=Tsjechië LocaleNames/nl/DE=Duitsland LocaleNames/nl/DJ=Djibouti LocaleNames/nl/DK=Denemarken @@ -5612,17 +5612,17 @@ LocaleNames/nl/EG=Egypte LocaleNames/nl/EH=Westelijke Sahara LocaleNames/nl/ER=Eritrea LocaleNames/nl/ES=Spanje -LocaleNames/nl/ET=Ethiopi\u00eb +LocaleNames/nl/ET=Ethiopië LocaleNames/nl/FI=Finland LocaleNames/nl/FJ=Fiji LocaleNames/nl/FK=Falklandeilanden LocaleNames/nl/FM=Micronesia -LocaleNames/nl/FO=Faer\u00f6er +LocaleNames/nl/FO=Faeröer LocaleNames/nl/FR=Frankrijk LocaleNames/nl/GA=Gabon LocaleNames/nl/GB=Verenigd Koninkrijk LocaleNames/nl/GD=Grenada -LocaleNames/nl/GE=Georgi\u00eb +LocaleNames/nl/GE=Georgië LocaleNames/nl/GF=Frans-Guyana LocaleNames/nl/GH=Ghana LocaleNames/nl/GI=Gibraltar @@ -5640,23 +5640,23 @@ LocaleNames/nl/GY=Guyana LocaleNames/nl/HK=Hongkong SAR van China LocaleNames/nl/HM=Heard en McDonaldeilanden LocaleNames/nl/HN=Honduras -LocaleNames/nl/HR=Kroati\u00eb -LocaleNames/nl/HT=Ha\u00efti +LocaleNames/nl/HR=Kroatië +LocaleNames/nl/HT=Haïti LocaleNames/nl/HU=Hongarije -LocaleNames/nl/ID=Indonesi\u00eb +LocaleNames/nl/ID=Indonesië LocaleNames/nl/IE=Ierland -LocaleNames/nl/IL=Isra\u00ebl +LocaleNames/nl/IL=Israël LocaleNames/nl/IN=India LocaleNames/nl/IO=Brits Indische Oceaanterritorium LocaleNames/nl/IQ=Irak LocaleNames/nl/IR=Iran LocaleNames/nl/IS=IJsland -LocaleNames/nl/IT=Itali\u00eb +LocaleNames/nl/IT=Italië LocaleNames/nl/JM=Jamaica -LocaleNames/nl/JO=Jordani\u00eb +LocaleNames/nl/JO=Jordanië LocaleNames/nl/JP=Japan LocaleNames/nl/KE=Kenia -LocaleNames/nl/KG=Kirgizi\u00eb +LocaleNames/nl/KG=Kirgizië LocaleNames/nl/KH=Cambodja LocaleNames/nl/KI=Kiribati LocaleNames/nl/KM=Comoren @@ -5676,31 +5676,31 @@ LocaleNames/nl/LS=Lesotho LocaleNames/nl/LT=Litouwen LocaleNames/nl/LU=Luxemburg LocaleNames/nl/LV=Letland -LocaleNames/nl/LY=Libi\u00eb +LocaleNames/nl/LY=Libië LocaleNames/nl/MA=Marokko LocaleNames/nl/MC=Monaco -LocaleNames/nl/MD=Moldavi\u00eb +LocaleNames/nl/MD=Moldavië LocaleNames/nl/ME=Montenegro LocaleNames/nl/MG=Madagaskar LocaleNames/nl/MH=Marshalleilanden -LocaleNames/nl/MK=Noord-Macedoni\u00eb +LocaleNames/nl/MK=Noord-Macedonië LocaleNames/nl/ML=Mali LocaleNames/nl/MM=Myanmar (Birma) -LocaleNames/nl/MN=Mongoli\u00eb +LocaleNames/nl/MN=Mongolië LocaleNames/nl/MO=Macau SAR van China LocaleNames/nl/MP=Noordelijke Marianen LocaleNames/nl/MQ=Martinique -LocaleNames/nl/MR=Mauritani\u00eb +LocaleNames/nl/MR=Mauritanië LocaleNames/nl/MS=Montserrat LocaleNames/nl/MT=Malta LocaleNames/nl/MU=Mauritius LocaleNames/nl/MV=Maldiven LocaleNames/nl/MW=Malawi LocaleNames/nl/MX=Mexico -LocaleNames/nl/MY=Maleisi\u00eb +LocaleNames/nl/MY=Maleisië LocaleNames/nl/MZ=Mozambique -LocaleNames/nl/NA=Namibi\u00eb -LocaleNames/nl/NC=Nieuw-Caledoni\u00eb +LocaleNames/nl/NA=Namibië +LocaleNames/nl/NC=Nieuw-Caledonië LocaleNames/nl/NE=Niger LocaleNames/nl/NF=Norfolk LocaleNames/nl/NG=Nigeria @@ -5714,7 +5714,7 @@ LocaleNames/nl/NZ=Nieuw-Zeeland LocaleNames/nl/OM=Oman LocaleNames/nl/PA=Panama LocaleNames/nl/PE=Peru -LocaleNames/nl/PF=Frans-Polynesi\u00eb +LocaleNames/nl/PF=Frans-Polynesië LocaleNames/nl/PG=Papoea-Nieuw-Guinea LocaleNames/nl/PH=Filipijnen LocaleNames/nl/PK=Pakistan @@ -5727,29 +5727,29 @@ LocaleNames/nl/PT=Portugal LocaleNames/nl/PW=Palau LocaleNames/nl/PY=Paraguay LocaleNames/nl/QA=Qatar -LocaleNames/nl/RE=R\u00e9union -LocaleNames/nl/RO=Roemeni\u00eb -LocaleNames/nl/RS=Servi\u00eb +LocaleNames/nl/RE=Réunion +LocaleNames/nl/RO=Roemenië +LocaleNames/nl/RS=Servië LocaleNames/nl/RU=Rusland LocaleNames/nl/RW=Rwanda -LocaleNames/nl/SA=Saoedi-Arabi\u00eb +LocaleNames/nl/SA=Saoedi-Arabië LocaleNames/nl/SB=Salomonseilanden LocaleNames/nl/SC=Seychellen LocaleNames/nl/SD=Soedan LocaleNames/nl/SE=Zweden LocaleNames/nl/SG=Singapore LocaleNames/nl/SH=Sint-Helena -LocaleNames/nl/SI=Sloveni\u00eb +LocaleNames/nl/SI=Slovenië LocaleNames/nl/SJ=Spitsbergen en Jan Mayen LocaleNames/nl/SK=Slowakije LocaleNames/nl/SL=Sierra Leone LocaleNames/nl/SM=San Marino LocaleNames/nl/SN=Senegal -LocaleNames/nl/SO=Somali\u00eb +LocaleNames/nl/SO=Somalië LocaleNames/nl/SR=Suriname -LocaleNames/nl/ST=Sao Tom\u00e9 en Principe +LocaleNames/nl/ST=Sao Tomé en Principe LocaleNames/nl/SV=El Salvador -LocaleNames/nl/SY=Syri\u00eb +LocaleNames/nl/SY=Syrië LocaleNames/nl/SZ=Eswatini LocaleNames/nl/TC=Turks- en Caicoseilanden LocaleNames/nl/TD=Tsjaad @@ -5760,14 +5760,14 @@ LocaleNames/nl/TJ=Tadzjikistan LocaleNames/nl/TK=Tokelau LocaleNames/nl/TL=Oost-Timor LocaleNames/nl/TM=Turkmenistan -LocaleNames/nl/TN=Tunesi\u00eb +LocaleNames/nl/TN=Tunesië LocaleNames/nl/TO=Tonga LocaleNames/nl/TR=Turkije LocaleNames/nl/TT=Trinidad en Tobago LocaleNames/nl/TV=Tuvalu LocaleNames/nl/TW=Taiwan LocaleNames/nl/TZ=Tanzania -LocaleNames/nl/UA=Oekra\u00efne +LocaleNames/nl/UA=Oekraïne LocaleNames/nl/UG=Oeganda LocaleNames/nl/UM=Kleine afgelegen eilanden van de Verenigde Staten LocaleNames/nl/US=Verenigde Staten @@ -5801,18 +5801,18 @@ FormatData/sr-Latn-RS/MonthNames/8=septembar FormatData/sr-Latn/DayNames/1=ponedeljak FormatData/sr-Latn-BA/DayNames/2=utorak FormatData/sr-Latn-ME/DayNames/3=srijeda -FormatData/sr-Latn-RS/DayNames/4=\u010detvrtak +FormatData/sr-Latn-RS/DayNames/4=četvrtak # FormatData/sr-Latn/DayAbbreviations/1=pon FormatData/sr-Latn-BA/DayAbbreviations/2=uto FormatData/sr-Latn-ME/DayAbbreviations/3=srijeda -FormatData/sr-Latn-RS/DayAbbreviations/4=\u010det +FormatData/sr-Latn-RS/DayAbbreviations/4=čet # -CurrencyNames/sr-Latn/EUR=\u20ac -CurrencyNames/sr-Latn-BA/EUR=\u20ac +CurrencyNames/sr-Latn/EUR=€ +CurrencyNames/sr-Latn-BA/EUR=€ CurrencyNames/sr-Latn-BA/BAM=KM -CurrencyNames/sr-Latn-ME/EUR=\u20ac -CurrencyNames/sr-Latn-RS/EUR=\u20ac +CurrencyNames/sr-Latn-ME/EUR=€ +CurrencyNames/sr-Latn-RS/EUR=€ # FormatData/sr-Latn/TimePatterns/1=HH:mm:ss z FormatData/sr-Latn-BA/TimePatterns/2=HH:mm:ss @@ -5821,81 +5821,81 @@ FormatData/sr-Latn-RS/DatePatterns/1=d. MMMM y. # bug 7019267 CurrencyNames/pt/adp=Peseta de Andorra -CurrencyNames/pt/aed=Dirham dos Emirados \u00c1rabes Unidos -CurrencyNames/pt/afa=Afegane (1927\u20132002) -CurrencyNames/pt/afn=Afegane afeg\u00e3o -CurrencyNames/pt/all=Lek alban\u00eas -CurrencyNames/pt/amd=Dram arm\u00eanio +CurrencyNames/pt/aed=Dirham dos Emirados Árabes Unidos +CurrencyNames/pt/afa=Afegane (1927–2002) +CurrencyNames/pt/afn=Afegane afegão +CurrencyNames/pt/all=Lek albanês +CurrencyNames/pt/amd=Dram armênio CurrencyNames/pt/ang=Florim das Antilhas Holandesas CurrencyNames/pt/aoa=Kwanza angolano CurrencyNames/pt/ars=Peso argentino -CurrencyNames/pt/ats=Xelim austr\u00edaco -CurrencyNames/pt/aud=D\u00f3lar australiano +CurrencyNames/pt/ats=Xelim austríaco +CurrencyNames/pt/aud=Dólar australiano CurrencyNames/pt/awg=Florim arubano -CurrencyNames/pt/azm=Manat azerbaijano (1993\u20132006) +CurrencyNames/pt/azm=Manat azerbaijano (1993–2006) CurrencyNames/pt/azn=Manat azeri -CurrencyNames/pt/bam=Marco convers\u00edvel da B\u00f3snia e Herzegovina -CurrencyNames/pt/bbd=D\u00f3lar barbadense +CurrencyNames/pt/bam=Marco conversível da Bósnia e Herzegovina +CurrencyNames/pt/bbd=Dólar barbadense CurrencyNames/pt/bdt=Taka bengali CurrencyNames/pt/bef=Franco belga -CurrencyNames/pt/bgl=Lev forte b\u00falgaro -CurrencyNames/pt/bgn=Lev b\u00falgaro +CurrencyNames/pt/bgl=Lev forte búlgaro +CurrencyNames/pt/bgn=Lev búlgaro CurrencyNames/pt/bhd=Dinar bareinita CurrencyNames/pt/bif=Franco burundiano -CurrencyNames/pt/bmd=D\u00f3lar bermudense -CurrencyNames/pt/bnd=D\u00f3lar bruneano +CurrencyNames/pt/bmd=Dólar bermudense +CurrencyNames/pt/bnd=Dólar bruneano CurrencyNames/pt/bov=Mvdol boliviano CurrencyNames/pt/brl=Real brasileiro -CurrencyNames/pt/bsd=D\u00f3lar bahamense -CurrencyNames/pt/btn=Ngultrum butan\u00eas +CurrencyNames/pt/bsd=Dólar bahamense +CurrencyNames/pt/btn=Ngultrum butanês CurrencyNames/pt/bwp=Pula botsuanesa -CurrencyNames/pt/byb=Rublo novo bielo-russo (1994\u20131999) -CurrencyNames/pt/byr=Rublo bielorrusso (2000\u20132016) -CurrencyNames/pt/bzd=D\u00f3lar belizenho -CurrencyNames/pt/cad=D\u00f3lar canadense -CurrencyNames/pt/cdf=Franco congol\u00eas -CurrencyNames/pt/chf=Franco su\u00ed\u00e7o +CurrencyNames/pt/byb=Rublo novo bielo-russo (1994–1999) +CurrencyNames/pt/byr=Rublo bielorrusso (2000–2016) +CurrencyNames/pt/bzd=Dólar belizenho +CurrencyNames/pt/cad=Dólar canadense +CurrencyNames/pt/cdf=Franco congolês +CurrencyNames/pt/chf=Franco suíço CurrencyNames/pt/clf=Unidades de Fomento chilenas CurrencyNames/pt/clp=Peso chileno -CurrencyNames/pt/cny=Yuan chin\u00eas +CurrencyNames/pt/cny=Yuan chinês CurrencyNames/pt/cop=Peso colombiano -CurrencyNames/pt/crc=Col\u00f3n costarriquenho -CurrencyNames/pt/csd=Dinar s\u00e9rvio (2002\u20132006) +CurrencyNames/pt/crc=Colón costarriquenho +CurrencyNames/pt/csd=Dinar sérvio (2002–2006) CurrencyNames/pt/cup=Peso cubano CurrencyNames/pt/cve=Escudo cabo-verdiano CurrencyNames/pt/cyp=Libra cipriota CurrencyNames/pt/czk=Coroa tcheca -CurrencyNames/pt/dem=Marco alem\u00e3o +CurrencyNames/pt/dem=Marco alemão CurrencyNames/pt/djf=Franco djiboutiano CurrencyNames/pt/dkk=Coroa dinamarquesa CurrencyNames/pt/dop=Peso dominicano CurrencyNames/pt/dzd=Dinar argelino CurrencyNames/pt/eek=Coroa estoniana -CurrencyNames/pt/egp=Libra eg\u00edpcia +CurrencyNames/pt/egp=Libra egípcia CurrencyNames/pt/ern=Nakfa da Eritreia CurrencyNames/pt/esp=Peseta espanhola -CurrencyNames/pt/etb=Birr et\u00edope +CurrencyNames/pt/etb=Birr etíope CurrencyNames/pt/fim=Marca finlandesa -CurrencyNames/pt/fjd=D\u00f3lar fijiano +CurrencyNames/pt/fjd=Dólar fijiano CurrencyNames/pt/fkp=Libra malvinense -CurrencyNames/pt/frf=Franco franc\u00eas +CurrencyNames/pt/frf=Franco francês CurrencyNames/pt/gbp=Libra esterlina CurrencyNames/pt/gel=Lari georgiano -CurrencyNames/pt/ghc=Cedi de Gana (1979\u20132007) -CurrencyNames/pt/ghs=Cedi gan\u00eas +CurrencyNames/pt/ghc=Cedi de Gana (1979–2007) +CurrencyNames/pt/ghs=Cedi ganês CurrencyNames/pt/gip=Libra de Gibraltar CurrencyNames/pt/gmd=Dalasi gambiano CurrencyNames/pt/gnf=Franco guineano CurrencyNames/pt/grd=Dracma grego CurrencyNames/pt/gtq=Quetzal guatemalteco -CurrencyNames/pt/gwp=Peso da Guin\u00e9-Bissau -CurrencyNames/pt/gyd=D\u00f3lar guianense -CurrencyNames/pt/hkd=D\u00f3lar de Hong Kong +CurrencyNames/pt/gwp=Peso da Guiné-Bissau +CurrencyNames/pt/gyd=Dólar guianense +CurrencyNames/pt/hkd=Dólar de Hong Kong CurrencyNames/pt/hnl=Lempira hondurenha CurrencyNames/pt/hrk=Kuna croata CurrencyNames/pt/htg=Gourde haitiano -CurrencyNames/pt/huf=Florim h\u00fangaro -CurrencyNames/pt/idr=Rupia indon\u00e9sia +CurrencyNames/pt/huf=Florim húngaro +CurrencyNames/pt/idr=Rupia indonésia CurrencyNames/pt/iep=Libra irlandesa CurrencyNames/pt/ils=Novo shekel israelense CurrencyNames/pt/inr=Rupia indiana @@ -5903,9 +5903,9 @@ CurrencyNames/pt/iqd=Dinar iraquiano CurrencyNames/pt/irr=Rial iraniano CurrencyNames/pt/isk=Coroa islandesa CurrencyNames/pt/itl=Lira italiana -CurrencyNames/pt/jmd=D\u00f3lar jamaicano +CurrencyNames/pt/jmd=Dólar jamaicano CurrencyNames/pt/jod=Dinar jordaniano -CurrencyNames/pt/jpy=Iene japon\u00eas +CurrencyNames/pt/jpy=Iene japonês CurrencyNames/pt/kes=Xelim queniano CurrencyNames/pt/kgs=Som quirguiz CurrencyNames/pt/khr=Riel cambojano @@ -5913,26 +5913,26 @@ CurrencyNames/pt/kmf=Franco comoriano CurrencyNames/pt/kpw=Won norte-coreano CurrencyNames/pt/krw=Won sul-coreano CurrencyNames/pt/kwd=Dinar kuwaitiano -CurrencyNames/pt/kyd=D\u00f3lar das Ilhas Cayman +CurrencyNames/pt/kyd=Dólar das Ilhas Cayman CurrencyNames/pt/kzt=Tenge cazaque CurrencyNames/pt/lak=Kip laosiano CurrencyNames/pt/lbp=Libra libanesa CurrencyNames/pt/lkr=Rupia cingalesa -CurrencyNames/pt/lrd=D\u00f3lar liberiano +CurrencyNames/pt/lrd=Dólar liberiano CurrencyNames/pt/lsl=Loti lesotiano CurrencyNames/pt/ltl=Litas lituano -CurrencyNames/pt/luf=Franco luxemburgu\u00eas -CurrencyNames/pt/lvl=Lats let\u00e3o -CurrencyNames/pt/lyd=Dinar l\u00edbio +CurrencyNames/pt/luf=Franco luxemburguês +CurrencyNames/pt/lvl=Lats letão +CurrencyNames/pt/lyd=Dinar líbio CurrencyNames/pt/mad=Dirham marroquino -CurrencyNames/pt/mdl=Leu mold\u00e1vio +CurrencyNames/pt/mdl=Leu moldávio CurrencyNames/pt/mga=Ariary malgaxe CurrencyNames/pt/mgf=Franco de Madagascar -CurrencyNames/pt/mkd=Dinar maced\u00f4nio +CurrencyNames/pt/mkd=Dinar macedônio CurrencyNames/pt/mmk=Quiate mianmarense CurrencyNames/pt/mnt=Tugrik mongol CurrencyNames/pt/mop=Pataca macaense -CurrencyNames/pt/mro=Ouguiya mauritana (1973\u20132017) +CurrencyNames/pt/mro=Ouguiya mauritana (1973–2017) CurrencyNames/pt/mtl=Lira maltesa CurrencyNames/pt/mur=Rupia mauriciana CurrencyNames/pt/mvr=Rupia maldivana @@ -5940,69 +5940,69 @@ CurrencyNames/pt/mwk=Kwacha malauiana CurrencyNames/pt/mxn=Peso mexicano CurrencyNames/pt/mxv=Unidade Mexicana de Investimento (UDI) CurrencyNames/pt/myr=Ringgit malaio -CurrencyNames/pt/mzm=Metical de Mo\u00e7ambique (1980\u20132006) -CurrencyNames/pt/mzn=Metical mo\u00e7ambicano -CurrencyNames/pt/nad=D\u00f3lar namibiano +CurrencyNames/pt/mzm=Metical de Moçambique (1980–2006) +CurrencyNames/pt/mzn=Metical moçambicano +CurrencyNames/pt/nad=Dólar namibiano CurrencyNames/pt/ngn=Naira nigeriana -CurrencyNames/pt/nio=C\u00f3rdoba nicaraguense -CurrencyNames/pt/nlg=Florim holand\u00eas +CurrencyNames/pt/nio=Córdoba nicaraguense +CurrencyNames/pt/nlg=Florim holandês CurrencyNames/pt/nok=Coroa norueguesa CurrencyNames/pt/npr=Rupia nepalesa -CurrencyNames/pt/nzd=D\u00f3lar neozeland\u00eas +CurrencyNames/pt/nzd=Dólar neozelandês CurrencyNames/pt/omr=Rial omanense CurrencyNames/pt/pab=Balboa panamenho CurrencyNames/pt/pen=Novo sol peruano -CurrencyNames/pt/pgk=Kina papu\u00e1sia +CurrencyNames/pt/pgk=Kina papuásia CurrencyNames/pt/php=Peso filipino CurrencyNames/pt/pkr=Rupia paquistanesa -CurrencyNames/pt/pln=Zloty polon\u00eas -CurrencyNames/pt/pte=Escudo portugu\u00eas +CurrencyNames/pt/pln=Zloty polonês +CurrencyNames/pt/pte=Escudo português CurrencyNames/pt/pyg=Guarani paraguaio CurrencyNames/pt/qar=Rial catariano -CurrencyNames/pt/rol=Leu romeno (1952\u20132006) +CurrencyNames/pt/rol=Leu romeno (1952–2006) CurrencyNames/pt/ron=Leu romeno -CurrencyNames/pt/rsd=Dinar s\u00e9rvio +CurrencyNames/pt/rsd=Dinar sérvio CurrencyNames/pt/rub=Rublo russo -CurrencyNames/pt/rur=Rublo russo (1991\u20131998) -CurrencyNames/pt/rwf=Franco ruand\u00eas +CurrencyNames/pt/rur=Rublo russo (1991–1998) +CurrencyNames/pt/rwf=Franco ruandês CurrencyNames/pt/sar=Riyal saudita -CurrencyNames/pt/sbd=D\u00f3lar das Ilhas Salom\u00e3o +CurrencyNames/pt/sbd=Dólar das Ilhas Salomão CurrencyNames/pt/scr=Rupia seichelense -CurrencyNames/pt/sdd=Dinar sudan\u00eas (1992\u20132007) +CurrencyNames/pt/sdd=Dinar sudanês (1992–2007) CurrencyNames/pt/sdg=Libra sudanesa CurrencyNames/pt/sek=Coroa sueca -CurrencyNames/pt/sgd=D\u00f3lar singapuriano +CurrencyNames/pt/sgd=Dólar singapuriano CurrencyNames/pt/shp=Libra de Santa Helena CurrencyNames/pt/sit=Tolar Bons esloveno CurrencyNames/pt/skk=Coroa eslovaca CurrencyNames/pt/sll=Leone de Serra Leoa CurrencyNames/pt/sos=Xelim somali -CurrencyNames/pt/srd=D\u00f3lar surinam\u00eas +CurrencyNames/pt/srd=Dólar surinamês CurrencyNames/pt/srg=Florim do Suriname -CurrencyNames/pt/std=Dobra de S\u00e3o Tom\u00e9 e Pr\u00edncipe (1977\u20132017) +CurrencyNames/pt/std=Dobra de São Tomé e Príncipe (1977–2017) CurrencyNames/pt/svc=Colom salvadorenho -CurrencyNames/pt/syp=Libra s\u00edria +CurrencyNames/pt/syp=Libra síria CurrencyNames/pt/szl=Lilangeni suazi -CurrencyNames/pt/thb=Baht tailand\u00eas +CurrencyNames/pt/thb=Baht tailandês CurrencyNames/pt/tjs=Somoni tadjique -CurrencyNames/pt/tmm=Manat do Turcomenist\u00e3o (1993\u20132009) +CurrencyNames/pt/tmm=Manat do Turcomenistão (1993–2009) CurrencyNames/pt/tnd=Dinar tunisiano -CurrencyNames/pt/top=Pa\u02bbanga tonganesa +CurrencyNames/pt/top=Paʻanga tonganesa CurrencyNames/pt/tpe=Escudo timorense -CurrencyNames/pt/trl=Lira turca (1922\u20132005) +CurrencyNames/pt/trl=Lira turca (1922–2005) CurrencyNames/pt/try=Lira turca -CurrencyNames/pt/ttd=D\u00f3lar de Trinidad e Tobago -CurrencyNames/pt/twd=Novo d\u00f3lar taiwan\u00eas +CurrencyNames/pt/ttd=Dólar de Trinidad e Tobago +CurrencyNames/pt/twd=Novo dólar taiwanês CurrencyNames/pt/tzs=Xelim tanzaniano CurrencyNames/pt/uah=Hryvnia ucraniano CurrencyNames/pt/ugx=Xelim ugandense -CurrencyNames/pt/usd=D\u00f3lar americano -CurrencyNames/pt/usn=D\u00f3lar norte-americano (Dia seguinte) -CurrencyNames/pt/uss=D\u00f3lar norte-americano (Mesmo dia) +CurrencyNames/pt/usd=Dólar americano +CurrencyNames/pt/usn=Dólar norte-americano (Dia seguinte) +CurrencyNames/pt/uss=Dólar norte-americano (Mesmo dia) CurrencyNames/pt/uyu=Peso uruguaio CurrencyNames/pt/uzs=Som uzbeque -CurrencyNames/pt/veb=Bol\u00edvar venezuelano (1871\u20132008) -CurrencyNames/pt/vef=Bol\u00edvar venezuelano (2008\u20132018) +CurrencyNames/pt/veb=Bolívar venezuelano (1871–2008) +CurrencyNames/pt/vef=Bolívar venezuelano (2008–2018) CurrencyNames/pt/vnd=Dong vietnamita CurrencyNames/pt/vuv=Vatu de Vanuatu CurrencyNames/pt/wst=Tala samoano @@ -6010,35 +6010,35 @@ CurrencyNames/pt/xaf=Franco CFA de BEAC CurrencyNames/pt/xag=Prata CurrencyNames/pt/xau=Ouro CurrencyNames/pt/xba=Unidade Composta Europeia -CurrencyNames/pt/xbb=Unidade Monet\u00e1ria Europeia +CurrencyNames/pt/xbb=Unidade Monetária Europeia CurrencyNames/pt/xbc=Unidade de Conta Europeia (XBC) CurrencyNames/pt/xbd=Unidade de Conta Europeia (XBD) -CurrencyNames/pt/xcd=D\u00f3lar do Caribe Oriental +CurrencyNames/pt/xcd=Dólar do Caribe Oriental CurrencyNames/pt/xdr=Direitos Especiais de Giro -CurrencyNames/pt/xfo=Franco-ouro franc\u00eas -CurrencyNames/pt/xfu=Franco UIC franc\u00eas +CurrencyNames/pt/xfo=Franco-ouro francês +CurrencyNames/pt/xfu=Franco UIC francês CurrencyNames/pt/xof=Franco CFA de BCEAO -CurrencyNames/pt/xpd=Pal\u00e1dio +CurrencyNames/pt/xpd=Paládio CurrencyNames/pt/xpf=Franco CFP CurrencyNames/pt/xpt=Platina -CurrencyNames/pt/xts=C\u00f3digo de Moeda de Teste +CurrencyNames/pt/xts=Código de Moeda de Teste CurrencyNames/pt/xxx=Moeda desconhecida CurrencyNames/pt/yer=Rial iemenita -CurrencyNames/pt/yum=Dinar noviy iugoslavo (1994\u20132002) +CurrencyNames/pt/yum=Dinar noviy iugoslavo (1994–2002) CurrencyNames/pt/zar=Rand sul-africano -CurrencyNames/pt/zmk=Cuacha zambiano (1968\u20132012) -CurrencyNames/pt/zwd=D\u00f3lar do Zimb\u00e1bue (1980\u20132008) +CurrencyNames/pt/zmk=Cuacha zambiano (1968–2012) +CurrencyNames/pt/zwd=Dólar do Zimbábue (1980–2008) # bug 7025837 -CurrencyNames/sr-Latn-BA/bam=Bosanskohercegova\u010dka konvertibilna marka +CurrencyNames/sr-Latn-BA/bam=Bosanskohercegovačka konvertibilna marka CurrencyNames/sr-Latn-BA/eur=Evro CurrencyNames/sr-Latn-ME/eur=Evro CurrencyNames/sr-Latn-RS/rsd=srpski dinar # bug 7020583 -CurrencyNames/de/azm=Aserbaidschan-Manat (1993\u20132006) +CurrencyNames/de/azm=Aserbaidschan-Manat (1993–2006) CurrencyNames/de/azn=Aserbaidschan-Manat -CurrencyNames/de/csd=Serbischer Dinar (2002\u20132006) +CurrencyNames/de/csd=Serbischer Dinar (2002–2006) CurrencyNames/de/cyp=Zypern-Pfund CurrencyNames/de/esp=Spanische Peseta CurrencyNames/de/fjd=Fidschi-Dollar @@ -6053,11 +6053,11 @@ CurrencyNames/de/jmd=Jamaika-Dollar CurrencyNames/de/kes=Kenia-Schilling CurrencyNames/de/mgf=Madagaskar-Franc CurrencyNames/de/mur=Mauritius-Rupie -CurrencyNames/de/mzm=Mosambikanischer Metical (1980\u20132006) +CurrencyNames/de/mzm=Mosambikanischer Metical (1980–2006) CurrencyNames/de/mzn=Mosambikanischer Metical CurrencyNames/de/nad=Namibia-Dollar CurrencyNames/de/nzd=Neuseeland-Dollar -CurrencyNames/de/ron=Rum\u00e4nischer Leu +CurrencyNames/de/ron=Rumänischer Leu CurrencyNames/de/rsd=Serbischer Dinar CurrencyNames/de/rwf=Ruanda-Franc CurrencyNames/de/sbd=Salomonen-Dollar @@ -6067,226 +6067,226 @@ CurrencyNames/de/sgd=Singapur-Dollar CurrencyNames/de/sos=Somalia-Schilling CurrencyNames/de/srd=Suriname-Dollar CurrencyNames/de/tpe=Timor-Escudo -CurrencyNames/de/trl=T\u00fcrkische Lira (1922\u20132005) -CurrencyNames/de/try=T\u00fcrkische Lira +CurrencyNames/de/trl=Türkische Lira (1922–2005) +CurrencyNames/de/try=Türkische Lira CurrencyNames/de/ttd=Trinidad-und-Tobago-Dollar CurrencyNames/de/twd=Neuer Taiwan-Dollar CurrencyNames/de/tzs=Tansania-Schilling CurrencyNames/de/ugx=Uganda-Schilling CurrencyNames/de/usd=US-Dollar -CurrencyNames/de/vef=Venezolanischer Bol\u00edvar (2008\u20132018) +CurrencyNames/de/vef=Venezolanischer Bolívar (2008–2018) CurrencyNames/de/xag=Unze Silber CurrencyNames/de/xau=Unze Gold -CurrencyNames/de/xbb=Europ\u00e4ische W\u00e4hrungseinheit (XBB) +CurrencyNames/de/xbb=Europäische Währungseinheit (XBB) CurrencyNames/de/xpd=Unze Palladium CurrencyNames/de/xpt=Unze Platin -CurrencyNames/de/xts=Testw\u00e4hrung -CurrencyNames/de/xxx=Unbekannte W\u00e4hrung +CurrencyNames/de/xts=Testwährung +CurrencyNames/de/xxx=Unbekannte Währung CurrencyNames/de/yer=Jemen-Rial -CurrencyNames/de/zar=S\u00fcdafrikanischer Rand -CurrencyNames/de/zwd=Simbabwe-Dollar (1980\u20132008) +CurrencyNames/de/zar=Südafrikanischer Rand +CurrencyNames/de/zwd=Simbabwe-Dollar (1980–2008) -CurrencyNames/es/aed=d\u00edrham de los Emiratos \u00c1rabes Unidos -CurrencyNames/es/azm=manat azer\u00ed (1993\u20132006) +CurrencyNames/es/aed=dírham de los Emiratos Árabes Unidos +CurrencyNames/es/azm=manat azerí (1993–2006) CurrencyNames/es/azn=manat azerbaiyano CurrencyNames/es/csd=antiguo dinar serbio -CurrencyNames/es/ghc=cedi ghan\u00e9s (1979\u20132007) +CurrencyNames/es/ghc=cedi ghanés (1979–2007) CurrencyNames/es/ghs=cedi -CurrencyNames/es/mzm=antiguo metical mozambique\u00f1o +CurrencyNames/es/mzm=antiguo metical mozambiqueño CurrencyNames/es/mzn=metical CurrencyNames/es/rsd=dinar serbio CurrencyNames/es/sdg=libra sudanesa -CurrencyNames/es/trl=lira turca (1922\u20132005) -CurrencyNames/es/vef=bol\u00edvar venezolano (2008\u20132018) +CurrencyNames/es/trl=lira turca (1922–2005) +CurrencyNames/es/vef=bolívar venezolano (2008–2018) -CurrencyNames/fr/afa=afghani (1927\u20132002) +CurrencyNames/fr/afa=afghani (1927–2002) CurrencyNames/fr/all=lek albanais CurrencyNames/fr/ang=florin antillais CurrencyNames/fr/awg=florin arubais -CurrencyNames/fr/azm=manat az\u00e9ri (1993\u20132006) -CurrencyNames/fr/azn=manat az\u00e9ri +CurrencyNames/fr/azm=manat azéri (1993–2006) +CurrencyNames/fr/azn=manat azéri CurrencyNames/fr/bam=mark convertible bosniaque CurrencyNames/fr/bbd=dollar barbadien CurrencyNames/fr/bdt=taka bangladeshi -CurrencyNames/fr/bgl=lev bulgare (1962\u20131999) +CurrencyNames/fr/bgl=lev bulgare (1962–1999) CurrencyNames/fr/bgn=lev bulgare -CurrencyNames/fr/bhd=dinar bahre\u00efni +CurrencyNames/fr/bhd=dinar bahreïni CurrencyNames/fr/bif=franc burundais CurrencyNames/fr/bmd=dollar bermudien -CurrencyNames/fr/bnd=dollar brun\u00e9ien +CurrencyNames/fr/bnd=dollar brunéien CurrencyNames/fr/bov=mvdol bolivien -CurrencyNames/fr/brl=r\u00e9al br\u00e9silien -CurrencyNames/fr/bsd=dollar baham\u00e9en +CurrencyNames/fr/brl=réal brésilien +CurrencyNames/fr/bsd=dollar bahaméen CurrencyNames/fr/btn=ngultrum bouthanais CurrencyNames/fr/bwp=pula botswanais -CurrencyNames/fr/bzd=dollar b\u00e9liz\u00e9en +CurrencyNames/fr/bzd=dollar bélizéen CurrencyNames/fr/cny=yuan renminbi chinois -CurrencyNames/fr/crc=col\u00f3n costaricain -CurrencyNames/fr/csd=dinar serbo-mont\u00e9n\u00e9grin +CurrencyNames/fr/crc=colón costaricain +CurrencyNames/fr/csd=dinar serbo-monténégrin CurrencyNames/fr/cve=escudo capverdien CurrencyNames/fr/cyp=livre chypriote CurrencyNames/fr/dem=mark allemand CurrencyNames/fr/djf=franc djiboutien -CurrencyNames/fr/ern=nafka \u00e9rythr\u00e9en -CurrencyNames/fr/etb=birr \u00e9thiopien +CurrencyNames/fr/ern=nafka érythréen +CurrencyNames/fr/etb=birr éthiopien CurrencyNames/fr/fjd=dollar fidjien -CurrencyNames/fr/fkp=livre des \u00eeles Malouines -CurrencyNames/fr/gel=lari g\u00e9orgien -CurrencyNames/fr/ghs=c\u00e9di ghan\u00e9en +CurrencyNames/fr/fkp=livre des îles Malouines +CurrencyNames/fr/gel=lari géorgien +CurrencyNames/fr/ghs=cédi ghanéen CurrencyNames/fr/gmd=dalasi gambien CurrencyNames/fr/grd=drachme grecque -CurrencyNames/fr/gtq=quetzal guat\u00e9malt\u00e8que -CurrencyNames/fr/gwp=peso bissau-guin\u00e9en +CurrencyNames/fr/gtq=quetzal guatémaltèque +CurrencyNames/fr/gwp=peso bissau-guinéen CurrencyNames/fr/hnl=lempira hondurien CurrencyNames/fr/hrk=kuna croate -CurrencyNames/fr/htg=gourde ha\u00eftienne +CurrencyNames/fr/htg=gourde haïtienne CurrencyNames/fr/huf=forint hongrois -CurrencyNames/fr/idr=roupie indon\u00e9sienne -CurrencyNames/fr/ils=nouveau shekel isra\u00e9lien +CurrencyNames/fr/idr=roupie indonésienne +CurrencyNames/fr/ils=nouveau shekel israélien CurrencyNames/fr/iqd=dinar irakien CurrencyNames/fr/jpy=yen japonais -CurrencyNames/fr/kes=shilling k\u00e9nyan +CurrencyNames/fr/kes=shilling kényan CurrencyNames/fr/kgs=som kirghize CurrencyNames/fr/khr=riel cambodgien CurrencyNames/fr/kmf=franc comorien -CurrencyNames/fr/kwd=dinar kowe\u00eftien +CurrencyNames/fr/kwd=dinar koweïtien CurrencyNames/fr/kzt=tenge kazakh CurrencyNames/fr/lak=kip laotien CurrencyNames/fr/lkr=roupie srilankaise CurrencyNames/fr/lsl=loti lesothan CurrencyNames/fr/mga=ariary malgache -CurrencyNames/fr/mkd=denar mac\u00e9donien +CurrencyNames/fr/mkd=denar macédonien CurrencyNames/fr/mmk=kyat myanmarais CurrencyNames/fr/mnt=tugrik mongol CurrencyNames/fr/mop=pataca macanaise -CurrencyNames/fr/mro=ouguiya mauritanien (1973\u20132017) +CurrencyNames/fr/mro=ouguiya mauritanien (1973–2017) CurrencyNames/fr/mvr=rufiyaa maldivien CurrencyNames/fr/mwk=kwacha malawite CurrencyNames/fr/myr=ringgit malais CurrencyNames/fr/mzn=metical mozambicain -CurrencyNames/fr/ngn=naira nig\u00e9rian -CurrencyNames/fr/nio=c\u00f3rdoba oro nicaraguayen -CurrencyNames/fr/npr=roupie n\u00e9palaise -CurrencyNames/fr/pab=balboa panam\u00e9en -CurrencyNames/fr/pgk=kina papouan-n\u00e9o-guin\u00e9en +CurrencyNames/fr/ngn=naira nigérian +CurrencyNames/fr/nio=córdoba oro nicaraguayen +CurrencyNames/fr/npr=roupie népalaise +CurrencyNames/fr/pab=balboa panaméen +CurrencyNames/fr/pgk=kina papouan-néo-guinéen CurrencyNames/fr/pkr=roupie pakistanaise CurrencyNames/fr/pln=zloty polonais -CurrencyNames/fr/pyg=guaran\u00ed paraguayen +CurrencyNames/fr/pyg=guaraní paraguayen CurrencyNames/fr/qar=riyal qatari CurrencyNames/fr/ron=leu roumain CurrencyNames/fr/rsd=dinar serbe CurrencyNames/fr/rub=rouble russe -CurrencyNames/fr/rur=rouble russe (1991\u20131998) -CurrencyNames/fr/sbd=dollar des \u00eeles Salomon +CurrencyNames/fr/rur=rouble russe (1991–1998) +CurrencyNames/fr/sbd=dollar des îles Salomon CurrencyNames/fr/sdg=livre soudanaise -CurrencyNames/fr/sit=tolar slov\u00e8ne -CurrencyNames/fr/sll=leone sierra-l\u00e9onais +CurrencyNames/fr/sit=tolar slovène +CurrencyNames/fr/sll=leone sierra-léonais CurrencyNames/fr/sos=shilling somalien CurrencyNames/fr/srg=florin surinamais -CurrencyNames/fr/std=dobra santom\u00e9en (1977\u20132017) -CurrencyNames/fr/svc=col\u00f3n salvadorien +CurrencyNames/fr/std=dobra santoméen (1977–2017) +CurrencyNames/fr/svc=colón salvadorien CurrencyNames/fr/szl=lilangeni swazi -CurrencyNames/fr/thb=baht tha\u00eflandais +CurrencyNames/fr/thb=baht thaïlandais CurrencyNames/fr/tjs=somoni tadjik -CurrencyNames/fr/tmm=manat turkm\u00e8ne -CurrencyNames/fr/top=pa\u2019anga tongan +CurrencyNames/fr/tmm=manat turkmène +CurrencyNames/fr/top=pa’anga tongan CurrencyNames/fr/tpe=escudo timorais -CurrencyNames/fr/ttd=dollar de Trinit\u00e9-et-Tobago -CurrencyNames/fr/twd=nouveau dollar ta\u00efwanais +CurrencyNames/fr/ttd=dollar de Trinité-et-Tobago +CurrencyNames/fr/twd=nouveau dollar taïwanais CurrencyNames/fr/tzs=shilling tanzanien CurrencyNames/fr/uah=hryvnia ukrainienne CurrencyNames/fr/uzs=sum ouzbek -CurrencyNames/fr/vef=bolivar v\u00e9n\u00e9zu\u00e9lien (2008\u20132018) -CurrencyNames/fr/vnd=d\u00f4ng vietnamien +CurrencyNames/fr/vef=bolivar vénézuélien (2008–2018) +CurrencyNames/fr/vnd=dông vietnamien CurrencyNames/fr/vuv=vatu vanuatuan CurrencyNames/fr/wst=tala samoan CurrencyNames/fr/xts=(devise de test) CurrencyNames/fr/xxx=devise inconnue ou non valide -CurrencyNames/fr/yer=riyal y\u00e9m\u00e9nite +CurrencyNames/fr/yer=riyal yéménite CurrencyNames/fr/zar=rand sud-africain -CurrencyNames/fr/zmk=kwacha zambien (1968\u20132012) -CurrencyNames/fr/zwd=dollar zimbabw\u00e9en +CurrencyNames/fr/zmk=kwacha zambien (1968–2012) +CurrencyNames/fr/zwd=dollar zimbabwéen -CurrencyNames/it/azm=manat azero (1993\u20132006) +CurrencyNames/it/azm=manat azero (1993–2006) CurrencyNames/it/ghs=cedi ghanese CurrencyNames/it/iep=sterlina irlandese CurrencyNames/it/mzn=metical mozambicano CurrencyNames/it/rsd=dinaro serbo CurrencyNames/it/sdg=sterlina sudanese CurrencyNames/it/srd=dollaro del Suriname -CurrencyNames/it/vef=bol\u00edvar venezuelano (2008\u20132018) +CurrencyNames/it/vef=bolívar venezuelano (2008–2018) CurrencyNames/it/xag=argento CurrencyNames/it/xpd=palladio -CurrencyNames/ja/azm=\u30a2\u30bc\u30eb\u30d0\u30a4\u30b8\u30e3\u30f3 \u30de\u30ca\u30c8 (1993\u20132006) -CurrencyNames/ja/azn=\u30a2\u30bc\u30eb\u30d0\u30a4\u30b8\u30e3\u30f3 \u30de\u30ca\u30c8 -CurrencyNames/ja/ghc=\u30ac\u30fc\u30ca \u30bb\u30c7\u30a3 (1979\u20132007) -CurrencyNames/ja/ghs=\u30ac\u30fc\u30ca \u30bb\u30c7\u30a3 -CurrencyNames/ja/mzn=\u30e2\u30b6\u30f3\u30d3\u30fc\u30af \u30e1\u30c6\u30a3\u30ab\u30eb -CurrencyNames/ja/rol=\u30eb\u30fc\u30de\u30cb\u30a2 \u30ec\u30a4 (1952\u20132006) -CurrencyNames/ja/ron=\u30eb\u30fc\u30de\u30cb\u30a2 \u30ec\u30a4 -CurrencyNames/ja/rsd=\u30c7\u30a3\u30ca\u30fc\u30eb (\u30bb\u30eb\u30d3\u30a2) -CurrencyNames/ja/sdg=\u30b9\u30fc\u30c0\u30f3 \u30dd\u30f3\u30c9 -CurrencyNames/ja/srd=\u30b9\u30ea\u30ca\u30e0 \u30c9\u30eb -CurrencyNames/ja/vef=\u30d9\u30cd\u30ba\u30a8\u30e9 \u30dc\u30ea\u30d0\u30eb (2008\u20132018) -CurrencyNames/ja/xag=\u9280 -CurrencyNames/ja/xpd=\u30d1\u30e9\u30b8\u30a6\u30e0 -CurrencyNames/ja/xpt=\u30d7\u30e9\u30c1\u30ca -CurrencyNames/ja/xts=\u30c6\u30b9\u30c8\u7528\u901a\u8ca8\u30b3\u30fc\u30c9 -CurrencyNames/ja/xxx=\u4e0d\u660e\u307e\u305f\u306f\u7121\u52b9\u306a\u901a\u8ca8 -CurrencyNames/ja/zmk=\u30b6\u30f3\u30d3\u30a2 \u30af\u30ef\u30c1\u30e3 (1968\u20132012) - -CurrencyNames/ko/aed=\uc544\ub78d\uc5d0\ubbf8\ub9ac\ud2b8 \ub514\ub974\ud568 -CurrencyNames/ko/ang=\ub124\ub35c\ub780\ub4dc\ub839 \uc548\ud2f8\ub808\uc2a4 \uae38\ub354 -CurrencyNames/ko/azm=\uc544\uc81c\ub974\ubc14\uc774\uc820 \ub9c8\ub098\ud2b8(1993\u20132006) -CurrencyNames/ko/azn=\uc544\uc81c\ub974\ubc14\uc774\uc794 \ub9c8\ub098\ud2b8 -CurrencyNames/ko/bov=\ubcfc\ub9ac\ube44\uc544\ub178 Mvdol(\uae30\uae08) -CurrencyNames/ko/chf=\uc2a4\uc704\uc2a4 \ud504\ub791 -CurrencyNames/ko/clf=\uce60\ub808 (UF) -CurrencyNames/ko/csd=\uace0 \uc138\ub974\ube44\uc544 \ub514\ub098\ub974 -CurrencyNames/ko/ghc=\uac00\ub098 \uc2dc\ub514 (1979\u20132007) -CurrencyNames/ko/ghs=\uac00\ub098 \uc138\ub514 -CurrencyNames/ko/mxv=\uba55\uc2dc\ucf54 (UDI) -CurrencyNames/ko/myr=\ub9d0\ub808\uc774\uc2dc\uc544 \ub9c1\uae43 -CurrencyNames/ko/mzm=\uace0 \ubaa8\uc7a0\ube44\ud06c \uba54\ud2f0\uce7c -CurrencyNames/ko/mzn=\ubaa8\uc7a0\ube44\ud06c \uba54\ud2f0\uce7c -CurrencyNames/ko/ron=\ub8e8\ub9c8\ub2c8\uc544 \ub808\uc6b0 -CurrencyNames/ko/rsd=\uc138\ub974\ube44\uc544 \ub514\ub098\ub974 -CurrencyNames/ko/sdg=\uc218\ub2e8 \ud30c\uc6b4\ub4dc -CurrencyNames/ko/srd=\uc218\ub9ac\ub0a8 \ub2ec\ub7ec -CurrencyNames/ko/top=\ud1b5\uac00 \ud30c\uc559\uac00 -CurrencyNames/ko/trl=\ud130\ud0a4 \ub9ac\ub77c(1922~2005) -CurrencyNames/ko/try=\ud130\ud0a4 \ub9ac\ub77c -CurrencyNames/ko/usn=\ubbf8\uad6d \ub2ec\ub7ec(\ub2e4\uc74c\ub0a0) -CurrencyNames/ko/uss=\ubbf8\uad6d \ub2ec\ub7ec(\ub2f9\uc77c) -CurrencyNames/ko/vef=\ubca0\ub124\uc218\uc5d8\ub77c \ubcfc\ub9ac\ubc14\ub974 (2008\u20132018) -CurrencyNames/ko/xaf=\uc911\uc559\uc544\ud504\ub9ac\uce74 CFA \ud504\ub791 -CurrencyNames/ko/xag=\uc740\ud654 -CurrencyNames/ko/xba=\uc720\ub974\ucf54 (\uc720\ub7fd \ud68c\uacc4 \ub2e8\uc704) -CurrencyNames/ko/xbb=\uc720\ub7fd \ud1b5\ud654 \ub3d9\ub9f9 -CurrencyNames/ko/xbc=\uc720\ub7fd \uacc4\uc0b0 \ub2e8\uc704 (XBC) -CurrencyNames/ko/xbd=\uc720\ub7fd \uacc4\uc0b0 \ub2e8\uc704 (XBD) -CurrencyNames/ko/xof=\uc11c\uc544\ud504\ub9ac\uce74 CFA \ud504\ub791 -CurrencyNames/ko/xpd=\ud314\ub77c\ub4d0 -CurrencyNames/ko/xpf=CFP \ud504\ub791 -CurrencyNames/ko/xpt=\ubc31\uae08 -CurrencyNames/ko/xts=\ud14c\uc2a4\ud2b8 \ud1b5\ud654 \ucf54\ub4dc -CurrencyNames/ko/xxx=\uc54c \uc218 \uc5c6\ub294 \ud1b5\ud654 \ub2e8\uc704 -CurrencyNames/ko/zwd=\uc9d0\ubc14\ube0c\uc6e8 \ub2ec\ub7ec +CurrencyNames/ja/azm=アゼルバイジャン マナト (1993–2006) +CurrencyNames/ja/azn=アゼルバイジャン マナト +CurrencyNames/ja/ghc=ガーナ セディ (1979–2007) +CurrencyNames/ja/ghs=ガーナ セディ +CurrencyNames/ja/mzn=モザンビーク メティカル +CurrencyNames/ja/rol=ルーマニア レイ (1952–2006) +CurrencyNames/ja/ron=ルーマニア レイ +CurrencyNames/ja/rsd=ディナール (セルビア) +CurrencyNames/ja/sdg=スーダン ポンド +CurrencyNames/ja/srd=スリナム ドル +CurrencyNames/ja/vef=ベネズエラ ボリバル (2008–2018) +CurrencyNames/ja/xag=銀 +CurrencyNames/ja/xpd=パラジウム +CurrencyNames/ja/xpt=プラチナ +CurrencyNames/ja/xts=テスト用通貨コード +CurrencyNames/ja/xxx=不明または無効な通貨 +CurrencyNames/ja/zmk=ザンビア クワチャ (1968–2012) + +CurrencyNames/ko/aed=아랍에미리트 디르함 +CurrencyNames/ko/ang=네덜란드령 안틸레스 길더 +CurrencyNames/ko/azm=아제르바이젠 마나트(1993–2006) +CurrencyNames/ko/azn=아제르바이잔 마나트 +CurrencyNames/ko/bov=볼리비아노 Mvdol(기금) +CurrencyNames/ko/chf=스위스 프랑 +CurrencyNames/ko/clf=칠레 (UF) +CurrencyNames/ko/csd=고 세르비아 디나르 +CurrencyNames/ko/ghc=가나 시디 (1979–2007) +CurrencyNames/ko/ghs=가나 세디 +CurrencyNames/ko/mxv=멕시코 (UDI) +CurrencyNames/ko/myr=말레이시아 링깃 +CurrencyNames/ko/mzm=고 모잠비크 메티칼 +CurrencyNames/ko/mzn=모잠비크 메티칼 +CurrencyNames/ko/ron=루마니아 레우 +CurrencyNames/ko/rsd=세르비아 디나르 +CurrencyNames/ko/sdg=수단 파운드 +CurrencyNames/ko/srd=수리남 달러 +CurrencyNames/ko/top=통가 파앙가 +CurrencyNames/ko/trl=터키 리라(1922~2005) +CurrencyNames/ko/try=터키 리라 +CurrencyNames/ko/usn=미국 달러(다음날) +CurrencyNames/ko/uss=미국 달러(당일) +CurrencyNames/ko/vef=베네수엘라 볼리바르 (2008–2018) +CurrencyNames/ko/xaf=중앙아프리카 CFA 프랑 +CurrencyNames/ko/xag=은화 +CurrencyNames/ko/xba=유르코 (유럽 회계 단위) +CurrencyNames/ko/xbb=유럽 통화 동맹 +CurrencyNames/ko/xbc=유럽 계산 단위 (XBC) +CurrencyNames/ko/xbd=유럽 계산 단위 (XBD) +CurrencyNames/ko/xof=서아프리카 CFA 프랑 +CurrencyNames/ko/xpd=팔라듐 +CurrencyNames/ko/xpf=CFP 프랑 +CurrencyNames/ko/xpt=백금 +CurrencyNames/ko/xts=테스트 통화 코드 +CurrencyNames/ko/xxx=알 수 없는 통화 단위 +CurrencyNames/ko/zwd=짐바브웨 달러 CurrencyNames/sv/adp=andorransk peseta CurrencyNames/sv/aed=emiratisk dirham -CurrencyNames/sv/afa=afghani (1927\u20132002) +CurrencyNames/sv/afa=afghani (1927–2002) CurrencyNames/sv/afn=afghansk afghani CurrencyNames/sv/all=albansk lek CurrencyNames/sv/amd=armenisk dram CurrencyNames/sv/ang=antillergulden CurrencyNames/sv/aoa=angolansk kwanza CurrencyNames/sv/ars=argentinsk peso -CurrencyNames/sv/ats=\u00f6sterrikisk schilling +CurrencyNames/sv/ats=österrikisk schilling CurrencyNames/sv/aud=australisk dollar CurrencyNames/sv/awg=arubansk florin -CurrencyNames/sv/azm=azerbajdzjansk manat (1993\u20132006) +CurrencyNames/sv/azm=azerbajdzjansk manat (1993–2006) CurrencyNames/sv/azn=azerbajdzjansk manat CurrencyNames/sv/bam=bosnisk-hercegovinsk mark (konvertibel) CurrencyNames/sv/bbd=barbadisk dollar @@ -6302,8 +6302,8 @@ CurrencyNames/sv/brl=brasiliansk real CurrencyNames/sv/bsd=bahamansk dollar CurrencyNames/sv/btn=bhutanesisk ngultrum CurrencyNames/sv/bwp=botswansk pula -CurrencyNames/sv/byb=vitrysk ny rubel (1994\u20131999) -CurrencyNames/sv/byr=vitrysk rubel (2000\u20132016) +CurrencyNames/sv/byb=vitrysk ny rubel (1994–1999) +CurrencyNames/sv/byr=vitrysk rubel (2000–2016) CurrencyNames/sv/bzd=belizisk dollar CurrencyNames/sv/cad=kanadensisk dollar CurrencyNames/sv/cdf=kongolesisk franc @@ -6312,8 +6312,8 @@ CurrencyNames/sv/clf=chilensk unidad de fomento CurrencyNames/sv/clp=chilensk peso CurrencyNames/sv/cny=kinesisk yuan CurrencyNames/sv/cop=colombiansk peso -CurrencyNames/sv/crc=costarikansk col\u00f3n -CurrencyNames/sv/csd=serbisk dinar (2002\u20132006) +CurrencyNames/sv/crc=costarikansk colón +CurrencyNames/sv/csd=serbisk dinar (2002–2006) CurrencyNames/sv/cup=kubansk peso CurrencyNames/sv/cve=kapverdisk escudo CurrencyNames/sv/cyp=cypriotiskt pund @@ -6334,7 +6334,7 @@ CurrencyNames/sv/fjd=Fijidollar CurrencyNames/sv/frf=fransk franc CurrencyNames/sv/gbp=brittiskt pund CurrencyNames/sv/gel=georgisk lari -CurrencyNames/sv/ghc=ghanansk cedi (1979\u20132007) +CurrencyNames/sv/ghc=ghanansk cedi (1979–2007) CurrencyNames/sv/ghs=ghanansk cedi CurrencyNames/sv/gip=gibraltiskt pund CurrencyNames/sv/gmd=gambisk dalasi @@ -6347,12 +6347,12 @@ CurrencyNames/sv/hrk=kroatisk kuna CurrencyNames/sv/htg=haitisk gourde CurrencyNames/sv/huf=ungersk forint CurrencyNames/sv/idr=indonesisk rupie -CurrencyNames/sv/iep=irl\u00e4ndskt pund +CurrencyNames/sv/iep=irländskt pund CurrencyNames/sv/ils=israelisk ny shekel CurrencyNames/sv/inr=indisk rupie CurrencyNames/sv/iqd=irakisk dinar CurrencyNames/sv/irr=iransk rial -CurrencyNames/sv/isk=isl\u00e4ndsk krona +CurrencyNames/sv/isk=isländsk krona CurrencyNames/sv/itl=italiensk lire CurrencyNames/sv/jmd=jamaicansk dollar CurrencyNames/sv/jod=jordansk dinar @@ -6380,9 +6380,9 @@ CurrencyNames/sv/mga=madagaskisk ariary CurrencyNames/sv/mgf=madagaskisk franc CurrencyNames/sv/mkd=makedonisk denar CurrencyNames/sv/mmk=myanmarisk kyat -CurrencyNames/sv/mnt=mongolisk t\u00f6gr\u00f6g +CurrencyNames/sv/mnt=mongolisk tögrög CurrencyNames/sv/mop=makanesisk pataca -CurrencyNames/sv/mro=mauretansk ouguiya (1973\u20132017) +CurrencyNames/sv/mro=mauretansk ouguiya (1973–2017) CurrencyNames/sv/mtl=maltesisk lire CurrencyNames/sv/mur=mauritisk rupie CurrencyNames/sv/mvr=maldivisk rufiyaa @@ -6390,15 +6390,15 @@ CurrencyNames/sv/mwk=malawisk kwacha CurrencyNames/sv/mxn=mexikansk peso CurrencyNames/sv/mxv=mexikansk unidad de inversion CurrencyNames/sv/myr=malaysisk ringgit -CurrencyNames/sv/mzm=gammal mo\u00e7ambikisk metical -CurrencyNames/sv/mzn=mo\u00e7ambikisk metical +CurrencyNames/sv/mzm=gammal moçambikisk metical +CurrencyNames/sv/mzn=moçambikisk metical CurrencyNames/sv/nad=namibisk dollar CurrencyNames/sv/ngn=nigeriansk naira -CurrencyNames/sv/nio=nicaraguansk c\u00f3rdoba -CurrencyNames/sv/nlg=nederl\u00e4ndsk gulden +CurrencyNames/sv/nio=nicaraguansk córdoba +CurrencyNames/sv/nlg=nederländsk gulden CurrencyNames/sv/nok=norsk krona CurrencyNames/sv/npr=nepalesisk rupie -CurrencyNames/sv/nzd=nyzeel\u00e4ndsk dollar +CurrencyNames/sv/nzd=nyzeeländsk dollar CurrencyNames/sv/omr=omansk rial CurrencyNames/sv/pab=panamansk balboa CurrencyNames/sv/pen=peruansk sol @@ -6409,15 +6409,15 @@ CurrencyNames/sv/pln=polsk zloty CurrencyNames/sv/pte=portugisisk escudo CurrencyNames/sv/pyg=paraguayansk guarani CurrencyNames/sv/qar=qatarisk rial -CurrencyNames/sv/rol=rum\u00e4nsk leu (1952\u20132005) -CurrencyNames/sv/ron=rum\u00e4nsk leu +CurrencyNames/sv/rol=rumänsk leu (1952–2005) +CurrencyNames/sv/ron=rumänsk leu CurrencyNames/sv/rsd=serbisk dinar CurrencyNames/sv/rub=rysk rubel -CurrencyNames/sv/rur=rysk rubel (1991\u20131998) +CurrencyNames/sv/rur=rysk rubel (1991–1998) CurrencyNames/sv/rwf=rwandisk franc CurrencyNames/sv/sar=saudisk riyal CurrencyNames/sv/scr=seychellisk rupie -CurrencyNames/sv/sdd=sudansk dinar (1992\u20132007) +CurrencyNames/sv/sdd=sudansk dinar (1992–2007) CurrencyNames/sv/sdg=sudanesiskt pund CurrencyNames/sv/sek=svensk krona CurrencyNames/sv/sgd=singaporiansk dollar @@ -6427,16 +6427,16 @@ CurrencyNames/sv/sll=sierraleonsk leone CurrencyNames/sv/sos=somalisk shilling CurrencyNames/sv/srd=surinamesisk dollar CurrencyNames/sv/srg=surinamesisk gulden -CurrencyNames/sv/svc=salvadoransk col\u00f3n +CurrencyNames/sv/svc=salvadoransk colón CurrencyNames/sv/syp=syriskt pund -CurrencyNames/sv/szl=swazil\u00e4ndsk lilangeni -CurrencyNames/sv/thb=thail\u00e4ndsk baht +CurrencyNames/sv/szl=swaziländsk lilangeni +CurrencyNames/sv/thb=thailändsk baht CurrencyNames/sv/tjs=tadzjikisk somoni -CurrencyNames/sv/tmm=turkmenistansk manat (1993\u20132009) +CurrencyNames/sv/tmm=turkmenistansk manat (1993–2009) CurrencyNames/sv/tnd=tunisisk dinar -CurrencyNames/sv/top=tongansk pa\u02bbanga -CurrencyNames/sv/tpe=\u00f6sttimoresisk escudo -CurrencyNames/sv/trl=turkisk lire (1922\u20132005) +CurrencyNames/sv/top=tongansk paʻanga +CurrencyNames/sv/tpe=östtimoresisk escudo +CurrencyNames/sv/trl=turkisk lire (1922–2005) CurrencyNames/sv/try=turkisk lira CurrencyNames/sv/ttd=Trinidaddollar CurrencyNames/sv/twd=taiwanesisk dollar @@ -6445,94 +6445,94 @@ CurrencyNames/sv/uah=ukrainsk hryvnia CurrencyNames/sv/ugx=ugandisk shilling CurrencyNames/sv/uyu=uruguayansk peso CurrencyNames/sv/uzs=uzbekisk sum -CurrencyNames/sv/veb=venezuelansk bolivar (1871\u20132008) -CurrencyNames/sv/vef=venezuelansk bol\u00edvar (2008\u20132018) +CurrencyNames/sv/veb=venezuelansk bolivar (1871–2008) +CurrencyNames/sv/vef=venezuelansk bolívar (2008–2018) CurrencyNames/sv/vnd=vietnamesisk dong CurrencyNames/sv/vuv=vanuatisk vatu -CurrencyNames/sv/wst=v\u00e4stsamoansk tala +CurrencyNames/sv/wst=västsamoansk tala CurrencyNames/sv/xag=silver CurrencyNames/sv/xau=guld CurrencyNames/sv/xba=europeisk kompositenhet -CurrencyNames/sv/xbb=europeisk monet\u00e4r enhet +CurrencyNames/sv/xbb=europeisk monetär enhet CurrencyNames/sv/xbc=europeisk kontoenhet (XBC) CurrencyNames/sv/xbd=europeisk kontoenhet (XBD) -CurrencyNames/sv/xcd=\u00f6stkaribisk dollar -CurrencyNames/sv/xdr=IMF s\u00e4rskild dragningsr\u00e4tt +CurrencyNames/sv/xcd=östkaribisk dollar +CurrencyNames/sv/xdr=IMF särskild dragningsrätt CurrencyNames/sv/xfo=fransk guldfranc CurrencyNames/sv/xpd=palladium CurrencyNames/sv/xpt=platina CurrencyNames/sv/xts=testvalutaenhet -CurrencyNames/sv/xxx=ok\u00e4nd valuta +CurrencyNames/sv/xxx=okänd valuta CurrencyNames/sv/yer=jemenitisk rial -CurrencyNames/sv/yum=jugoslavisk dinar (1994\u20132002) +CurrencyNames/sv/yum=jugoslavisk dinar (1994–2002) CurrencyNames/sv/zar=sydafrikansk rand -CurrencyNames/sv/zmk=zambisk kwacha (1968\u20132012) +CurrencyNames/sv/zmk=zambisk kwacha (1968–2012) CurrencyNames/sv/zwd=Zimbabwe-dollar -CurrencyNames/zh_CN/ang=\u8377\u5c5e\u5b89\u7684\u5217\u65af\u76fe -CurrencyNames/zh_CN/azm=\u963f\u585e\u62dc\u7586\u9a6c\u7eb3\u7279 (1993\u20132006) -CurrencyNames/zh_CN/azn=\u963f\u585e\u62dc\u7586\u9a6c\u7eb3\u7279 -CurrencyNames/zh_CN/csd=\u65e7\u585e\u5c14\u7ef4\u4e9a\u7b2c\u7eb3\u5c14 -CurrencyNames/zh_CN/ghs=\u52a0\u7eb3\u585e\u5730 -CurrencyNames/zh_CN/mzm=\u65e7\u83ab\u6851\u6bd4\u514b\u7f8e\u63d0\u5361 -CurrencyNames/zh_CN/mzn=\u83ab\u6851\u6bd4\u514b\u7f8e\u63d0\u5361 -CurrencyNames/zh_CN/ron=\u7f57\u9a6c\u5c3c\u4e9a\u5217\u4f0a -CurrencyNames/zh_CN/rsd=\u585e\u5c14\u7ef4\u4e9a\u7b2c\u7eb3\u5c14 -CurrencyNames/zh_CN/shp=\u5723\u8d6b\u52d2\u62ff\u7fa4\u5c9b\u78c5 -CurrencyNames/zh_CN/twd=\u65b0\u53f0\u5e01 -CurrencyNames/zh_CN/vef=\u59d4\u5185\u745e\u62c9\u73bb\u5229\u74e6\u5c14 (2008\u20132018) -CurrencyNames/zh_CN/xxx=\u672a\u77e5\u8d27\u5e01 - -CurrencyNames/zh_TW/afa=\u963f\u5bcc\u6c57\u5c3c (1927\u20132002) -CurrencyNames/zh_TW/ang=\u8377\u5c6c\u5b89\u5730\u5217\u65af\u76fe -CurrencyNames/zh_TW/azm=\u4e9e\u585e\u62dc\u7136\u99ac\u7d0d\u7279 (1993\u20132006) -CurrencyNames/zh_TW/azn=\u4e9e\u585e\u62dc\u7136\u99ac\u7d0d\u7279 -CurrencyNames/zh_TW/bwp=\u6ce2\u672d\u90a3\u666e\u62c9 -CurrencyNames/zh_TW/bzd=\u8c9d\u91cc\u65af\u5143 -CurrencyNames/zh_TW/csd=\u820a\u585e\u723e\u7dad\u4e9e\u7b2c\u7d0d\u723e -CurrencyNames/zh_TW/cyp=\u8cfd\u666e\u52d2\u65af\u938a -CurrencyNames/zh_TW/ghc=\u8fe6\u7d0d\u8cfd\u5730 (1979\u20132007) -CurrencyNames/zh_TW/ghs=\u8fe6\u7d0d\u585e\u5730 -CurrencyNames/zh_TW/gwp=\u5e7e\u5167\u4e9e\u6bd4\u7d22\u62ab\u7d22 -CurrencyNames/zh_TW/huf=\u5308\u7259\u5229\u798f\u6797 -CurrencyNames/zh_TW/idr=\u5370\u5c3c\u76fe -CurrencyNames/zh_TW/inr=\u5370\u5ea6\u76e7\u6bd4 -CurrencyNames/zh_TW/kpw=\u5317\u97d3\u5143 -CurrencyNames/zh_TW/krw=\u97d3\u5143 -CurrencyNames/zh_TW/lak=\u5bee\u570b\u57fa\u666e -CurrencyNames/zh_TW/mad=\u6469\u6d1b\u54e5\u8fea\u62c9\u59c6 -CurrencyNames/zh_TW/mxn=\u58a8\u897f\u54e5\u62ab\u7d22 -CurrencyNames/zh_TW/mxv=\u58a8\u897f\u54e5\u8f49\u63db\u55ae\u4f4d (UDI) -CurrencyNames/zh_TW/myr=\u99ac\u4f86\u897f\u4e9e\u4ee4\u5409 -CurrencyNames/zh_TW/mzn=\u83ab\u4e09\u6bd4\u514b\u6885\u8482\u5361\u723e -CurrencyNames/zh_TW/nio=\u5c3c\u52a0\u62c9\u74dc\u91d1\u79d1\u591a\u5df4 -CurrencyNames/zh_TW/rol=\u820a\u7f85\u99ac\u5c3c\u4e9e\u5217\u4f0a -CurrencyNames/zh_TW/ron=\u7f85\u99ac\u5c3c\u4e9e\u5217\u4f0a -CurrencyNames/zh_TW/rsd=\u585e\u723e\u7dad\u4e9e\u6234\u7d0d -CurrencyNames/zh_TW/scr=\u585e\u5e2d\u723e\u76e7\u6bd4 -CurrencyNames/zh_TW/sdg=\u8607\u4e39\u938a -CurrencyNames/zh_TW/shp=\u8056\u8d6b\u52d2\u62ff\u938a -CurrencyNames/zh_TW/srd=\u8607\u5229\u5357\u5143 -CurrencyNames/zh_TW/srg=\u8607\u5229\u5357\u57fa\u723e -CurrencyNames/zh_TW/svc=\u85a9\u723e\u74e6\u591a\u79d1\u90ce -CurrencyNames/zh_TW/szl=\u53f2\u74e6\u6fdf\u862d\u91cc\u6717\u5409\u5c3c -CurrencyNames/zh_TW/tpe=\u5e1d\u6c76\u57c3\u65af\u5eab\u591a -CurrencyNames/zh_TW/ttd=\u5343\u91cc\u9054\u53ca\u6258\u5df4\u54e5\u5143 -CurrencyNames/zh_TW/tzs=\u5766\u5c1a\u5c3c\u4e9e\u5148\u4ee4 -CurrencyNames/zh_TW/uzs=\u70cf\u8332\u5225\u514b\u7d22\u59c6 -CurrencyNames/zh_TW/veb=\u59d4\u5167\u745e\u62c9\u73bb\u5229\u74e6 (1871\u20132008) -CurrencyNames/zh_TW/vef=\u59d4\u5167\u745e\u62c9\u73bb\u5229\u74e6 (2008\u20132018) -CurrencyNames/zh_TW/xaf=\u6cd5\u90ce (CFA\u2013BEAC) -CurrencyNames/zh_TW/xag=\u767d\u9280 -CurrencyNames/zh_TW/xof=\u6cd5\u90ce (CFA\u2013BCEAO) -CurrencyNames/zh_TW/xpd=\u5e15\u62c9\u72c4\u6602 -CurrencyNames/zh_TW/xpt=\u767d\u91d1 -CurrencyNames/zh_TW/xts=\u6e2c\u8a66\u7528\u8ca8\u5e63\u4ee3\u78bc -CurrencyNames/zh_TW/xxx=\u672a\u77e5\u8ca8\u5e63 -CurrencyNames/zh_TW/yer=\u8449\u9580\u91cc\u4e9e\u723e +CurrencyNames/zh_CN/ang=荷属安的列斯盾 +CurrencyNames/zh_CN/azm=阿塞拜疆马纳特 (1993–2006) +CurrencyNames/zh_CN/azn=阿塞拜疆马纳特 +CurrencyNames/zh_CN/csd=旧塞尔维亚第纳尔 +CurrencyNames/zh_CN/ghs=加纳塞地 +CurrencyNames/zh_CN/mzm=旧莫桑比克美提卡 +CurrencyNames/zh_CN/mzn=莫桑比克美提卡 +CurrencyNames/zh_CN/ron=罗马尼亚列伊 +CurrencyNames/zh_CN/rsd=塞尔维亚第纳尔 +CurrencyNames/zh_CN/shp=圣赫勒拿群岛磅 +CurrencyNames/zh_CN/twd=新台币 +CurrencyNames/zh_CN/vef=委内瑞拉玻利瓦尔 (2008–2018) +CurrencyNames/zh_CN/xxx=未知货币 + +CurrencyNames/zh_TW/afa=阿富汗尼 (1927–2002) +CurrencyNames/zh_TW/ang=荷屬安地列斯盾 +CurrencyNames/zh_TW/azm=亞塞拜然馬納特 (1993–2006) +CurrencyNames/zh_TW/azn=亞塞拜然馬納特 +CurrencyNames/zh_TW/bwp=波札那普拉 +CurrencyNames/zh_TW/bzd=貝里斯元 +CurrencyNames/zh_TW/csd=舊塞爾維亞第納爾 +CurrencyNames/zh_TW/cyp=賽普勒斯鎊 +CurrencyNames/zh_TW/ghc=迦納賽地 (1979–2007) +CurrencyNames/zh_TW/ghs=迦納塞地 +CurrencyNames/zh_TW/gwp=幾內亞比索披索 +CurrencyNames/zh_TW/huf=匈牙利福林 +CurrencyNames/zh_TW/idr=印尼盾 +CurrencyNames/zh_TW/inr=印度盧比 +CurrencyNames/zh_TW/kpw=北韓元 +CurrencyNames/zh_TW/krw=韓元 +CurrencyNames/zh_TW/lak=寮國基普 +CurrencyNames/zh_TW/mad=摩洛哥迪拉姆 +CurrencyNames/zh_TW/mxn=墨西哥披索 +CurrencyNames/zh_TW/mxv=墨西哥轉換單位 (UDI) +CurrencyNames/zh_TW/myr=馬來西亞令吉 +CurrencyNames/zh_TW/mzn=莫三比克梅蒂卡爾 +CurrencyNames/zh_TW/nio=尼加拉瓜金科多巴 +CurrencyNames/zh_TW/rol=舊羅馬尼亞列伊 +CurrencyNames/zh_TW/ron=羅馬尼亞列伊 +CurrencyNames/zh_TW/rsd=塞爾維亞戴納 +CurrencyNames/zh_TW/scr=塞席爾盧比 +CurrencyNames/zh_TW/sdg=蘇丹鎊 +CurrencyNames/zh_TW/shp=聖赫勒拿鎊 +CurrencyNames/zh_TW/srd=蘇利南元 +CurrencyNames/zh_TW/srg=蘇利南基爾 +CurrencyNames/zh_TW/svc=薩爾瓦多科郎 +CurrencyNames/zh_TW/szl=史瓦濟蘭里朗吉尼 +CurrencyNames/zh_TW/tpe=帝汶埃斯庫多 +CurrencyNames/zh_TW/ttd=千里達及托巴哥元 +CurrencyNames/zh_TW/tzs=坦尚尼亞先令 +CurrencyNames/zh_TW/uzs=烏茲別克索姆 +CurrencyNames/zh_TW/veb=委內瑞拉玻利瓦 (1871–2008) +CurrencyNames/zh_TW/vef=委內瑞拉玻利瓦 (2008–2018) +CurrencyNames/zh_TW/xaf=法郎 (CFA–BEAC) +CurrencyNames/zh_TW/xag=白銀 +CurrencyNames/zh_TW/xof=法郎 (CFA–BCEAO) +CurrencyNames/zh_TW/xpd=帕拉狄昂 +CurrencyNames/zh_TW/xpt=白金 +CurrencyNames/zh_TW/xts=測試用貨幣代碼 +CurrencyNames/zh_TW/xxx=未知貨幣 +CurrencyNames/zh_TW/yer=葉門里亞爾 # bug 7036905 -CurrencyNames/de/afa=Afghanische Afghani (1927\u20132002) +CurrencyNames/de/afa=Afghanische Afghani (1927–2002) CurrencyNames/de/afn=Afghanischer Afghani CurrencyNames/de/bob=Bolivianischer Boliviano CurrencyNames/de/dem=Deutsche Mark @@ -6548,49 +6548,49 @@ CurrencyNames/de/zwl=Simbabwe-Dollar (2009) CurrencyNames/es/cuc=peso cubano convertible CurrencyNames/es/tmt=manat turcomano -CurrencyNames/es/zwl=d\u00f3lar zimbabuense +CurrencyNames/es/zwl=dólar zimbabuense CurrencyNames/es_CU/CUP=$ CurrencyNames/es_CU/CUC=CUC CurrencyNames/et_EE/eek=Eesti kroon -CurrencyNames/et_EE/EUR=\u20ac +CurrencyNames/et_EE/EUR=€ CurrencyNames/et_EE/eur=euro CurrencyNames/fr/cuc=peso cubain convertible -CurrencyNames/fr/tmt=nouveau manat turkm\u00e8ne +CurrencyNames/fr/tmt=nouveau manat turkmène -CurrencyNames/ja/cuc=\u30ad\u30e5\u30fc\u30d0 \u514c\u63db\u30da\u30bd -CurrencyNames/ja/tmt=\u30c8\u30eb\u30af\u30e1\u30cb\u30b9\u30bf\u30f3 \u30de\u30ca\u30c8 -CurrencyNames/ja/zwl=\u30b8\u30f3\u30d0\u30d6\u30a8 \u30c9\u30eb (2009) +CurrencyNames/ja/cuc=キューバ 兌換ペソ +CurrencyNames/ja/tmt=トルクメニスタン マナト +CurrencyNames/ja/zwl=ジンバブエ ドル (2009) -CurrencyNames/ko/cuc=\ucfe0\ubc14 \ud0dc\ud658 \ud398\uc18c +CurrencyNames/ko/cuc=쿠바 태환 페소 -CurrencyNames/pt/bob=Boliviano da Bol\u00edvia -CurrencyNames/pt/cuc=Peso cubano convers\u00edvel +CurrencyNames/pt/bob=Boliviano da Bolívia +CurrencyNames/pt/cuc=Peso cubano conversível CurrencyNames/pt/tmt=Manat turcomeno -CurrencyNames/pt/zwl=D\u00f3lar do Zimb\u00e1bue (2009) -CurrencyNames/pt/zwr=D\u00f3lar do Zimb\u00e1bue (2008) +CurrencyNames/pt/zwl=Dólar do Zimbábue (2009) +CurrencyNames/pt/zwr=Dólar do Zimbábue (2008) -CurrencyNames/sk_SK/skk=slovensk\u00e1 koruna -CurrencyNames/sk_SK/EUR=\u20ac +CurrencyNames/sk_SK/skk=slovenská koruna +CurrencyNames/sk_SK/EUR=€ -CurrencyNames/zh_CN/cuc=\u53e4\u5df4\u53ef\u5151\u6362\u6bd4\u7d22 -CurrencyNames/zh_CN/tmt=\u571f\u5e93\u66fc\u65af\u5766\u9a6c\u7eb3\u7279 -CurrencyNames/zh_CN/zwl=\u6d25\u5df4\u5e03\u97e6\u5143 (2009) +CurrencyNames/zh_CN/cuc=古巴可兑换比索 +CurrencyNames/zh_CN/tmt=土库曼斯坦马纳特 +CurrencyNames/zh_CN/zwl=津巴布韦元 (2009) -CurrencyNames/zh_TW/cuc=\u53e4\u5df4\u53ef\u8f49\u63db\u62ab\u7d22 -CurrencyNames/zh_TW/tmt=\u571f\u5eab\u66fc\u99ac\u7d0d\u7279 -CurrencyNames/zh_TW/zwl=\u8f9b\u5df4\u5a01\u5143 (2009) +CurrencyNames/zh_TW/cuc=古巴可轉換披索 +CurrencyNames/zh_TW/tmt=土庫曼馬納特 +CurrencyNames/zh_TW/zwl=辛巴威元 (2009) # bug 7003124 -FormatData/bg/TimePatterns/0=H:mm:ss '\u0447'. zzzz -FormatData/bg/TimePatterns/2=H:mm:ss '\u0447'. -FormatData/bg/TimePatterns/3=H:mm '\u0447'. -FormatData/bg/DatePatterns/0=EEEE, d MMMM y\u202f'\u0433'. -FormatData/bg/DatePatterns/1=d MMMM y\u202f'\u0433'. -FormatData/bg/DatePatterns/2=d.MM.y\u202f'\u0433'. -FormatData/bg/DatePatterns/3=d.MM.yy\u202f'\u0433'. +FormatData/bg/TimePatterns/0=H:mm:ss 'ч'. zzzz +FormatData/bg/TimePatterns/2=H:mm:ss 'ч'. +FormatData/bg/TimePatterns/3=H:mm 'ч'. +FormatData/bg/DatePatterns/0=EEEE, d MMMM y 'г'. +FormatData/bg/DatePatterns/1=d MMMM y 'г'. +FormatData/bg/DatePatterns/2=d.MM.y 'г'. +FormatData/bg/DatePatterns/3=d.MM.yy 'г'. # bug 7085757 LocaleNames/en/SS=South Sudan @@ -6625,46 +6625,46 @@ FormatData//japanese.narrow.Eras/2=T FormatData//japanese.narrow.Eras/3=S FormatData//japanese.narrow.Eras/4=H -FormatData/ar/DayNarrows/0=\u062d -FormatData/ar/DayNarrows/1=\u0646 -FormatData/ar/DayNarrows/2=\u062b -FormatData/ar/DayNarrows/3=\u0631 -FormatData/ar/DayNarrows/4=\u062e -FormatData/ar/DayNarrows/5=\u062c -FormatData/ar/DayNarrows/6=\u0633 - -FormatData/be/standalone.MonthNarrows/0=\u0441 -FormatData/be/standalone.MonthNarrows/1=\u043b -FormatData/be/standalone.MonthNarrows/2=\u0441 -FormatData/be/standalone.MonthNarrows/3=\u043a -FormatData/be/standalone.MonthNarrows/4=\u043c -FormatData/be/standalone.MonthNarrows/5=\u0447 -FormatData/be/standalone.MonthNarrows/6=\u043b -FormatData/be/standalone.MonthNarrows/7=\u0436 -FormatData/be/standalone.MonthNarrows/8=\u0432 -FormatData/be/standalone.MonthNarrows/9=\u043a -FormatData/be/standalone.MonthNarrows/10=\u043b -FormatData/be/standalone.MonthNarrows/11=\u0441 +FormatData/ar/DayNarrows/0=ح +FormatData/ar/DayNarrows/1=ن +FormatData/ar/DayNarrows/2=ث +FormatData/ar/DayNarrows/3=ر +FormatData/ar/DayNarrows/4=خ +FormatData/ar/DayNarrows/5=ج +FormatData/ar/DayNarrows/6=س + +FormatData/be/standalone.MonthNarrows/0=с +FormatData/be/standalone.MonthNarrows/1=л +FormatData/be/standalone.MonthNarrows/2=с +FormatData/be/standalone.MonthNarrows/3=к +FormatData/be/standalone.MonthNarrows/4=м +FormatData/be/standalone.MonthNarrows/5=ч +FormatData/be/standalone.MonthNarrows/6=л +FormatData/be/standalone.MonthNarrows/7=ж +FormatData/be/standalone.MonthNarrows/8=в +FormatData/be/standalone.MonthNarrows/9=к +FormatData/be/standalone.MonthNarrows/10=л +FormatData/be/standalone.MonthNarrows/11=с FormatData/be/standalone.MonthNarrows/12= -FormatData/be/DayNarrows/0=\u043d -FormatData/be/DayNarrows/1=\u043f -FormatData/be/DayNarrows/2=\u0430 -FormatData/be/DayNarrows/3=\u0441 -FormatData/be/DayNarrows/4=\u0447 -FormatData/be/DayNarrows/5=\u043f -FormatData/be/DayNarrows/6=\u0441 - -FormatData/bg/DayNarrows/0=\u043d -FormatData/bg/DayNarrows/1=\u043f -FormatData/bg/DayNarrows/2=\u0432 -FormatData/bg/DayNarrows/3=\u0441 -FormatData/bg/DayNarrows/4=\u0447 -FormatData/bg/DayNarrows/5=\u043f -FormatData/bg/DayNarrows/6=\u0441 +FormatData/be/DayNarrows/0=н +FormatData/be/DayNarrows/1=п +FormatData/be/DayNarrows/2=а +FormatData/be/DayNarrows/3=с +FormatData/be/DayNarrows/4=ч +FormatData/be/DayNarrows/5=п +FormatData/be/DayNarrows/6=с + +FormatData/bg/DayNarrows/0=н +FormatData/bg/DayNarrows/1=п +FormatData/bg/DayNarrows/2=в +FormatData/bg/DayNarrows/3=с +FormatData/bg/DayNarrows/4=ч +FormatData/bg/DayNarrows/5=п +FormatData/bg/DayNarrows/6=с FormatData/ca/standalone.MonthNarrows/0=GN FormatData/ca/standalone.MonthNarrows/1=FB -FormatData/ca/standalone.MonthNarrows/2=M\u00c7 +FormatData/ca/standalone.MonthNarrows/2=MÇ FormatData/ca/standalone.MonthNarrows/3=AB FormatData/ca/standalone.MonthNarrows/4=MG FormatData/ca/standalone.MonthNarrows/5=JN @@ -6693,9 +6693,9 @@ FormatData/ca/standalone.DayNarrows/6=ds FormatData/cs/DayNarrows/0=N FormatData/cs/DayNarrows/1=P -FormatData/cs/DayNarrows/2=\u00da +FormatData/cs/DayNarrows/2=Ú FormatData/cs/DayNarrows/3=S -FormatData/cs/DayNarrows/4=\u010c +FormatData/cs/DayNarrows/4=Č FormatData/cs/DayNarrows/5=P FormatData/cs/DayNarrows/6=S @@ -6715,13 +6715,13 @@ FormatData/de/DayNarrows/4=D FormatData/de/DayNarrows/5=F FormatData/de/DayNarrows/6=S -FormatData/el/DayNarrows/0=\u039a -FormatData/el/DayNarrows/1=\u0394 -FormatData/el/DayNarrows/2=\u03a4 -FormatData/el/DayNarrows/3=\u03a4 -FormatData/el/DayNarrows/4=\u03a0 -FormatData/el/DayNarrows/5=\u03a0 -FormatData/el/DayNarrows/6=\u03a3 +FormatData/el/DayNarrows/0=Κ +FormatData/el/DayNarrows/1=Δ +FormatData/el/DayNarrows/2=Τ +FormatData/el/DayNarrows/3=Τ +FormatData/el/DayNarrows/4=Π +FormatData/el/DayNarrows/5=Π +FormatData/el/DayNarrows/6=Σ FormatData/es/DayNarrows/0=D FormatData/es/DayNarrows/1=L @@ -6777,13 +6777,13 @@ FormatData/fr/DayNarrows/4=J FormatData/fr/DayNarrows/5=V FormatData/fr/DayNarrows/6=S -FormatData/hi_IN/DayNarrows/0=\u0930 -FormatData/hi_IN/DayNarrows/1=\u0938\u094b -FormatData/hi_IN/DayNarrows/2=\u092e\u0902 -FormatData/hi_IN/DayNarrows/3=\u092c\u0941 -FormatData/hi_IN/DayNarrows/4=\u0917\u0941 -FormatData/hi_IN/DayNarrows/5=\u0936\u0941 -FormatData/hi_IN/DayNarrows/6=\u0936 +FormatData/hi_IN/DayNarrows/0=र +FormatData/hi_IN/DayNarrows/1=सो +FormatData/hi_IN/DayNarrows/2=मं +FormatData/hi_IN/DayNarrows/3=बु +FormatData/hi_IN/DayNarrows/4=गु +FormatData/hi_IN/DayNarrows/5=शु +FormatData/hi_IN/DayNarrows/6=श FormatData/hr/standalone.MonthNarrows/0=1. FormatData/hr/standalone.MonthNarrows/1=2. @@ -6802,14 +6802,14 @@ FormatData/hr/DayNarrows/0=N FormatData/hr/DayNarrows/1=P FormatData/hr/DayNarrows/2=U FormatData/hr/DayNarrows/3=S -FormatData/hr/DayNarrows/4=\u010c +FormatData/hr/DayNarrows/4=Č FormatData/hr/DayNarrows/5=P FormatData/hr/DayNarrows/6=S FormatData/hr/standalone.DayNarrows/0=n FormatData/hr/standalone.DayNarrows/1=p FormatData/hr/standalone.DayNarrows/2=u FormatData/hr/standalone.DayNarrows/3=s -FormatData/hr/standalone.DayNarrows/4=\u010d +FormatData/hr/standalone.DayNarrows/4=č FormatData/hr/standalone.DayNarrows/5=p FormatData/hr/standalone.DayNarrows/6=s @@ -6828,7 +6828,7 @@ FormatData/is/standalone.MonthNarrows/3=A FormatData/is/standalone.MonthNarrows/4=M FormatData/is/standalone.MonthNarrows/5=J FormatData/is/standalone.MonthNarrows/6=J -FormatData/is/standalone.MonthNarrows/7=\u00c1 +FormatData/is/standalone.MonthNarrows/7=Á FormatData/is/standalone.MonthNarrows/8=S FormatData/is/standalone.MonthNarrows/9=O FormatData/is/standalone.MonthNarrows/10=N @@ -6836,14 +6836,14 @@ FormatData/is/standalone.MonthNarrows/11=D FormatData/is/standalone.MonthNarrows/12= FormatData/is/DayNarrows/0=S FormatData/is/DayNarrows/1=M -FormatData/is/DayNarrows/2=\u00de +FormatData/is/DayNarrows/2=Þ FormatData/is/DayNarrows/3=M FormatData/is/DayNarrows/4=F FormatData/is/DayNarrows/5=F FormatData/is/DayNarrows/6=L FormatData/is/standalone.DayNarrows/0=S FormatData/is/standalone.DayNarrows/1=M -FormatData/is/standalone.DayNarrows/2=\u00de +FormatData/is/standalone.DayNarrows/2=Þ FormatData/is/standalone.DayNarrows/3=M FormatData/is/standalone.DayNarrows/4=F FormatData/is/standalone.DayNarrows/5=F @@ -6857,36 +6857,36 @@ FormatData/it/DayNarrows/4=G FormatData/it/DayNarrows/5=V FormatData/it/DayNarrows/6=S -FormatData/iw/DayNarrows/0=\u05d0\u05f3 -FormatData/iw/DayNarrows/1=\u05d1\u05f3 -FormatData/iw/DayNarrows/2=\u05d2\u05f3 -FormatData/iw/DayNarrows/3=\u05d3\u05f3 -FormatData/iw/DayNarrows/4=\u05d4\u05f3 -FormatData/iw/DayNarrows/5=\u05d5\u05f3 -FormatData/iw/DayNarrows/6=\u05e9\u05f3 -FormatData/iw/standalone.DayNarrows/0=\u05d0\u05f3 -FormatData/iw/standalone.DayNarrows/1=\u05d1\u05f3 -FormatData/iw/standalone.DayNarrows/2=\u05d2\u05f3 -FormatData/iw/standalone.DayNarrows/3=\u05d3\u05f3 -FormatData/iw/standalone.DayNarrows/4=\u05d4\u05f3 -FormatData/iw/standalone.DayNarrows/5=\u05d5\u05f3 -FormatData/iw/standalone.DayNarrows/6=\u05e9\u05f3 - -FormatData/ja/DayNarrows/0=\u65e5 -FormatData/ja/DayNarrows/1=\u6708 -FormatData/ja/DayNarrows/2=\u706b -FormatData/ja/DayNarrows/3=\u6c34 -FormatData/ja/DayNarrows/4=\u6728 -FormatData/ja/DayNarrows/5=\u91d1 -FormatData/ja/DayNarrows/6=\u571f - -FormatData/ko/DayNarrows/0=\uc77c -FormatData/ko/DayNarrows/1=\uc6d4 -FormatData/ko/DayNarrows/2=\ud654 -FormatData/ko/DayNarrows/3=\uc218 -FormatData/ko/DayNarrows/4=\ubaa9 -FormatData/ko/DayNarrows/5=\uae08 -FormatData/ko/DayNarrows/6=\ud1a0 +FormatData/iw/DayNarrows/0=א׳ +FormatData/iw/DayNarrows/1=ב׳ +FormatData/iw/DayNarrows/2=ג׳ +FormatData/iw/DayNarrows/3=ד׳ +FormatData/iw/DayNarrows/4=ה׳ +FormatData/iw/DayNarrows/5=ו׳ +FormatData/iw/DayNarrows/6=ש׳ +FormatData/iw/standalone.DayNarrows/0=א׳ +FormatData/iw/standalone.DayNarrows/1=ב׳ +FormatData/iw/standalone.DayNarrows/2=ג׳ +FormatData/iw/standalone.DayNarrows/3=ד׳ +FormatData/iw/standalone.DayNarrows/4=ה׳ +FormatData/iw/standalone.DayNarrows/5=ו׳ +FormatData/iw/standalone.DayNarrows/6=ש׳ + +FormatData/ja/DayNarrows/0=日 +FormatData/ja/DayNarrows/1=月 +FormatData/ja/DayNarrows/2=火 +FormatData/ja/DayNarrows/3=水 +FormatData/ja/DayNarrows/4=木 +FormatData/ja/DayNarrows/5=金 +FormatData/ja/DayNarrows/6=土 + +FormatData/ko/DayNarrows/0=일 +FormatData/ko/DayNarrows/1=월 +FormatData/ko/DayNarrows/2=화 +FormatData/ko/DayNarrows/3=수 +FormatData/ko/DayNarrows/4=목 +FormatData/ko/DayNarrows/5=금 +FormatData/ko/DayNarrows/6=토 FormatData/lt/standalone.MonthNarrows/0=S FormatData/lt/standalone.MonthNarrows/1=V @@ -6908,14 +6908,14 @@ FormatData/lt/DayNarrows/2=A FormatData/lt/DayNarrows/3=T FormatData/lt/DayNarrows/4=K FormatData/lt/DayNarrows/5=P -FormatData/lt/DayNarrows/6=\u0160 +FormatData/lt/DayNarrows/6=Š FormatData/lt/standalone.DayNarrows/0=S FormatData/lt/standalone.DayNarrows/1=P FormatData/lt/standalone.DayNarrows/2=A FormatData/lt/standalone.DayNarrows/3=T FormatData/lt/standalone.DayNarrows/4=K FormatData/lt/standalone.DayNarrows/5=P -FormatData/lt/standalone.DayNarrows/6=\u0160 +FormatData/lt/standalone.DayNarrows/6=Š FormatData/lv/DayNarrows/0=S FormatData/lv/DayNarrows/1=P @@ -6925,13 +6925,13 @@ FormatData/lv/DayNarrows/4=C FormatData/lv/DayNarrows/5=P FormatData/lv/DayNarrows/6=S -FormatData/mk/DayNarrows/0=\u043d -FormatData/mk/DayNarrows/1=\u043f -FormatData/mk/DayNarrows/2=\u0432 -FormatData/mk/DayNarrows/3=\u0441 -FormatData/mk/DayNarrows/4=\u0447 -FormatData/mk/DayNarrows/5=\u043f -FormatData/mk/DayNarrows/6=\u0441 +FormatData/mk/DayNarrows/0=н +FormatData/mk/DayNarrows/1=п +FormatData/mk/DayNarrows/2=в +FormatData/mk/DayNarrows/3=с +FormatData/mk/DayNarrows/4=ч +FormatData/mk/DayNarrows/5=п +FormatData/mk/DayNarrows/6=с FormatData/ms/standalone.MonthNarrows/0=J FormatData/ms/standalone.MonthNarrows/1=F @@ -6961,12 +6961,12 @@ FormatData/ms/standalone.DayNarrows/4=K FormatData/ms/standalone.DayNarrows/5=J FormatData/ms/standalone.DayNarrows/6=S -FormatData/mt/DayNarrows/0=\u0126d +FormatData/mt/DayNarrows/0=Ħd FormatData/mt/DayNarrows/1=T FormatData/mt/DayNarrows/2=Tl FormatData/mt/DayNarrows/3=Er -FormatData/mt/DayNarrows/4=\u0126m -FormatData/mt/DayNarrows/5=\u0120m +FormatData/mt/DayNarrows/4=Ħm +FormatData/mt/DayNarrows/5=Ġm FormatData/mt/DayNarrows/6=Sb FormatData/nl/DayNarrows/0=Z @@ -6980,7 +6980,7 @@ FormatData/nl/DayNarrows/6=Z FormatData/pl/DayNarrows/0=n FormatData/pl/DayNarrows/1=p FormatData/pl/DayNarrows/2=w -FormatData/pl/DayNarrows/3=\u015b +FormatData/pl/DayNarrows/3=ś FormatData/pl/DayNarrows/4=c FormatData/pl/DayNarrows/5=p FormatData/pl/DayNarrows/6=s @@ -7022,28 +7022,28 @@ FormatData/ro/standalone.DayNarrows/4=J FormatData/ro/standalone.DayNarrows/5=V FormatData/ro/standalone.DayNarrows/6=S -FormatData/ru/DayNarrows/0=\u0412 -FormatData/ru/DayNarrows/1=\u041f -FormatData/ru/DayNarrows/2=\u0412 -FormatData/ru/DayNarrows/3=\u0421 -FormatData/ru/DayNarrows/4=\u0427 -FormatData/ru/DayNarrows/5=\u041f +FormatData/ru/DayNarrows/0=В +FormatData/ru/DayNarrows/1=П +FormatData/ru/DayNarrows/2=В +FormatData/ru/DayNarrows/3=С +FormatData/ru/DayNarrows/4=Ч +FormatData/ru/DayNarrows/5=П # Note: "sat" is an contributed item in CLDR. -FormatData/ru/DayNarrows/6=\u0421 +FormatData/ru/DayNarrows/6=С -FormatData/ru/standalone.DayNarrows/0=\u0412 -FormatData/ru/standalone.DayNarrows/1=\u041f -FormatData/ru/standalone.DayNarrows/2=\u0412 -FormatData/ru/standalone.DayNarrows/3=\u0421 -FormatData/ru/standalone.DayNarrows/4=\u0427 -FormatData/ru/standalone.DayNarrows/5=\u041f -FormatData/ru/standalone.DayNarrows/6=\u0421 +FormatData/ru/standalone.DayNarrows/0=В +FormatData/ru/standalone.DayNarrows/1=П +FormatData/ru/standalone.DayNarrows/2=В +FormatData/ru/standalone.DayNarrows/3=С +FormatData/ru/standalone.DayNarrows/4=Ч +FormatData/ru/standalone.DayNarrows/5=П +FormatData/ru/standalone.DayNarrows/6=С FormatData/sk/DayNarrows/0=n FormatData/sk/DayNarrows/1=p FormatData/sk/DayNarrows/2=u FormatData/sk/DayNarrows/3=s -FormatData/sk/DayNarrows/4=\u0161 +FormatData/sk/DayNarrows/4=š FormatData/sk/DayNarrows/5=p FormatData/sk/DayNarrows/6=s @@ -7051,7 +7051,7 @@ FormatData/sl/DayNarrows/0=n FormatData/sl/DayNarrows/1=p FormatData/sl/DayNarrows/2=t FormatData/sl/DayNarrows/3=s -FormatData/sl/DayNarrows/4=\u010d +FormatData/sl/DayNarrows/4=č FormatData/sl/DayNarrows/5=p FormatData/sl/DayNarrows/6=s @@ -7063,15 +7063,15 @@ FormatData/sq/DayNarrows/4=e FormatData/sq/DayNarrows/5=p FormatData/sq/DayNarrows/6=sh -FormatData/sr/DayNarrows/0=\u043d -FormatData/sr/DayNarrows/1=\u043f -FormatData/sr/DayNarrows/2=\u0443 -FormatData/sr/DayNarrows/3=\u0441 -FormatData/sr/DayNarrows/4=\u0447 -FormatData/sr/DayNarrows/5=\u043f -FormatData/sr/DayNarrows/6=\u0441 -FormatData/sr/narrow.Eras/0=\u043f.\u043d.\u0435. -FormatData/sr/narrow.Eras/1=\u043d.\u0435. +FormatData/sr/DayNarrows/0=н +FormatData/sr/DayNarrows/1=п +FormatData/sr/DayNarrows/2=у +FormatData/sr/DayNarrows/3=с +FormatData/sr/DayNarrows/4=ч +FormatData/sr/DayNarrows/5=п +FormatData/sr/DayNarrows/6=с +FormatData/sr/narrow.Eras/0=п.н.е. +FormatData/sr/narrow.Eras/1=н.е. FormatData/sv/standalone.MonthNarrows/0=J FormatData/sv/standalone.MonthNarrows/1=F @@ -7105,31 +7105,31 @@ FormatData/sv/narrow.Eras/1=e.Kr. FormatData/sv/narrow.AmPmMarkers/0=fm FormatData/sv/narrow.AmPmMarkers/1=em -FormatData/th/standalone.MonthNarrows/0=\u0e21.\u0e04. -FormatData/th/standalone.MonthNarrows/1=\u0e01.\u0e1e. -FormatData/th/standalone.MonthNarrows/2=\u0e21\u0e35.\u0e04. -FormatData/th/standalone.MonthNarrows/3=\u0e40\u0e21.\u0e22. -FormatData/th/standalone.MonthNarrows/4=\u0e1e.\u0e04. -FormatData/th/standalone.MonthNarrows/5=\u0e21\u0e34.\u0e22. -FormatData/th/standalone.MonthNarrows/6=\u0e01.\u0e04. -FormatData/th/standalone.MonthNarrows/7=\u0e2a.\u0e04. -FormatData/th/standalone.MonthNarrows/8=\u0e01.\u0e22. -FormatData/th/standalone.MonthNarrows/9=\u0e15.\u0e04. -FormatData/th/standalone.MonthNarrows/10=\u0e1e.\u0e22. -FormatData/th/standalone.MonthNarrows/11=\u0e18.\u0e04. +FormatData/th/standalone.MonthNarrows/0=ม.ค. +FormatData/th/standalone.MonthNarrows/1=ก.พ. +FormatData/th/standalone.MonthNarrows/2=มี.ค. +FormatData/th/standalone.MonthNarrows/3=เม.ย. +FormatData/th/standalone.MonthNarrows/4=พ.ค. +FormatData/th/standalone.MonthNarrows/5=มิ.ย. +FormatData/th/standalone.MonthNarrows/6=ก.ค. +FormatData/th/standalone.MonthNarrows/7=ส.ค. +FormatData/th/standalone.MonthNarrows/8=ก.ย. +FormatData/th/standalone.MonthNarrows/9=ต.ค. +FormatData/th/standalone.MonthNarrows/10=พ.ย. +FormatData/th/standalone.MonthNarrows/11=ธ.ค. FormatData/th/standalone.MonthNarrows/12= -FormatData/th/DayNarrows/0=\u0e2d\u0e32 -FormatData/th/DayNarrows/1=\u0e08 -FormatData/th/DayNarrows/2=\u0e2d -FormatData/th/DayNarrows/3=\u0e1e -FormatData/th/DayNarrows/4=\u0e1e\u0e24 -FormatData/th/DayNarrows/5=\u0e28 -FormatData/th/DayNarrows/6=\u0e2a -FormatData/th/narrow.Eras/0=\u0e01\u0e48\u0e2d\u0e19 \u0e04.\u0e28. -FormatData/th/narrow.Eras/1=\u0e04.\u0e28. +FormatData/th/DayNarrows/0=อา +FormatData/th/DayNarrows/1=จ +FormatData/th/DayNarrows/2=อ +FormatData/th/DayNarrows/3=พ +FormatData/th/DayNarrows/4=พฤ +FormatData/th/DayNarrows/5=ศ +FormatData/th/DayNarrows/6=ส +FormatData/th/narrow.Eras/0=ก่อน ค.ศ. +FormatData/th/narrow.Eras/1=ค.ศ. FormatData/tr/standalone.MonthNarrows/0=O -FormatData/tr/standalone.MonthNarrows/1=\u015e +FormatData/tr/standalone.MonthNarrows/1=Ş FormatData/tr/standalone.MonthNarrows/2=M FormatData/tr/standalone.MonthNarrows/3=N FormatData/tr/standalone.MonthNarrows/4=M @@ -7144,18 +7144,18 @@ FormatData/tr/standalone.MonthNarrows/12= FormatData/tr/DayNarrows/0=P FormatData/tr/DayNarrows/1=P FormatData/tr/DayNarrows/2=S -FormatData/tr/DayNarrows/3=\u00c7 +FormatData/tr/DayNarrows/3=Ç FormatData/tr/DayNarrows/4=P FormatData/tr/DayNarrows/5=C FormatData/tr/DayNarrows/6=C -FormatData/uk/DayNarrows/0=\u041d -FormatData/uk/DayNarrows/1=\u041f -FormatData/uk/DayNarrows/2=\u0412 -FormatData/uk/DayNarrows/3=\u0421 -FormatData/uk/DayNarrows/4=\u0427 -FormatData/uk/DayNarrows/5=\u041f -FormatData/uk/DayNarrows/6=\u0421 +FormatData/uk/DayNarrows/0=Н +FormatData/uk/DayNarrows/1=П +FormatData/uk/DayNarrows/2=В +FormatData/uk/DayNarrows/3=С +FormatData/uk/DayNarrows/4=Ч +FormatData/uk/DayNarrows/5=П +FormatData/uk/DayNarrows/6=С FormatData/vi/DayNarrows/0=CN FormatData/vi/DayNarrows/1=T2 @@ -7178,13 +7178,13 @@ FormatData/zh/standalone.MonthNarrows/9=10 FormatData/zh/standalone.MonthNarrows/10=11 FormatData/zh/standalone.MonthNarrows/11=12 FormatData/zh/standalone.MonthNarrows/12= -FormatData/zh/DayNarrows/0=\u65e5 -FormatData/zh/DayNarrows/1=\u4e00 -FormatData/zh/DayNarrows/2=\u4e8c -FormatData/zh/DayNarrows/3=\u4e09 -FormatData/zh/DayNarrows/4=\u56db -FormatData/zh/DayNarrows/5=\u4e94 -FormatData/zh/DayNarrows/6=\u516d +FormatData/zh/DayNarrows/0=日 +FormatData/zh/DayNarrows/1=一 +FormatData/zh/DayNarrows/2=二 +FormatData/zh/DayNarrows/3=三 +FormatData/zh/DayNarrows/4=四 +FormatData/zh/DayNarrows/5=五 +FormatData/zh/DayNarrows/6=六 # bug 7114053 LocaleNames/sq/sq=shqip @@ -7208,16 +7208,16 @@ FormatData/pt/MonthAbbreviations/10=nov. FormatData/pt/MonthAbbreviations/11=dez. # bug 8021121 -CurrencyNames/lv_LV/EUR=\u20ac +CurrencyNames/lv_LV/EUR=€ # bug # 6192407 -LocaleNames/ko/PT=\ud3ec\ub974\ud22c\uac08 +LocaleNames/ko/PT=포르투갈 # bug 6931564 LocaleNames/sv/ZA=Sydafrika # bug 8027695 -FormatData/sv_SE/latn.NumberPatterns/2=#,##0\u00a0% +FormatData/sv_SE/latn.NumberPatterns/2=#,##0 % # bug 8017142 FormatData/es_CL/TimePatterns/0=HH:mm:ss zzzz @@ -7234,7 +7234,7 @@ FormatData/es_DO/DatePatterns/2=d MMM y FormatData/es_DO/DatePatterns/3=d/M/yy # bug 8055222 -CurrencyNames/lt_LT/EUR=\u20ac +CurrencyNames/lt_LT/EUR=€ # bug 8042126 + missing MonthNarrows data FormatData//MonthNarrows/0=1 @@ -7250,18 +7250,18 @@ FormatData//MonthNarrows/9=10 FormatData//MonthNarrows/10=11 FormatData//MonthNarrows/11=12 FormatData//MonthNarrows/12= -FormatData/bg/MonthNarrows/0=\u044f -FormatData/bg/MonthNarrows/1=\u0444 -FormatData/bg/MonthNarrows/2=\u043c -FormatData/bg/MonthNarrows/3=\u0430 -FormatData/bg/MonthNarrows/4=\u043c -FormatData/bg/MonthNarrows/5=\u044e -FormatData/bg/MonthNarrows/6=\u044e -FormatData/bg/MonthNarrows/7=\u0430 -FormatData/bg/MonthNarrows/8=\u0441 -FormatData/bg/MonthNarrows/9=\u043e -FormatData/bg/MonthNarrows/10=\u043d -FormatData/bg/MonthNarrows/11=\u0434 +FormatData/bg/MonthNarrows/0=я +FormatData/bg/MonthNarrows/1=ф +FormatData/bg/MonthNarrows/2=м +FormatData/bg/MonthNarrows/3=а +FormatData/bg/MonthNarrows/4=м +FormatData/bg/MonthNarrows/5=ю +FormatData/bg/MonthNarrows/6=ю +FormatData/bg/MonthNarrows/7=а +FormatData/bg/MonthNarrows/8=с +FormatData/bg/MonthNarrows/9=о +FormatData/bg/MonthNarrows/10=н +FormatData/bg/MonthNarrows/11=д FormatData/bg/MonthNarrows/12= FormatData/zh_TW/MonthNarrows/0=1 FormatData/zh_TW/MonthNarrows/1=2 @@ -7289,31 +7289,31 @@ FormatData/it/MonthNarrows/9=O FormatData/it/MonthNarrows/10=N FormatData/it/MonthNarrows/11=D FormatData/it/MonthNarrows/12= -FormatData/ko/MonthNarrows/0=1\uc6d4 -FormatData/ko/MonthNarrows/1=2\uc6d4 -FormatData/ko/MonthNarrows/2=3\uc6d4 -FormatData/ko/MonthNarrows/3=4\uc6d4 -FormatData/ko/MonthNarrows/4=5\uc6d4 -FormatData/ko/MonthNarrows/5=6\uc6d4 -FormatData/ko/MonthNarrows/6=7\uc6d4 -FormatData/ko/MonthNarrows/7=8\uc6d4 -FormatData/ko/MonthNarrows/8=9\uc6d4 -FormatData/ko/MonthNarrows/9=10\uc6d4 -FormatData/ko/MonthNarrows/10=11\uc6d4 -FormatData/ko/MonthNarrows/11=12\uc6d4 +FormatData/ko/MonthNarrows/0=1월 +FormatData/ko/MonthNarrows/1=2월 +FormatData/ko/MonthNarrows/2=3월 +FormatData/ko/MonthNarrows/3=4월 +FormatData/ko/MonthNarrows/4=5월 +FormatData/ko/MonthNarrows/5=6월 +FormatData/ko/MonthNarrows/6=7월 +FormatData/ko/MonthNarrows/7=8월 +FormatData/ko/MonthNarrows/8=9월 +FormatData/ko/MonthNarrows/9=10월 +FormatData/ko/MonthNarrows/10=11월 +FormatData/ko/MonthNarrows/11=12월 FormatData/ko/MonthNarrows/12= -FormatData/uk/MonthNarrows/0=\u0441 -FormatData/uk/MonthNarrows/1=\u043b -FormatData/uk/MonthNarrows/2=\u0431 -FormatData/uk/MonthNarrows/3=\u043a -FormatData/uk/MonthNarrows/4=\u0442 -FormatData/uk/MonthNarrows/5=\u0447 -FormatData/uk/MonthNarrows/6=\u043b -FormatData/uk/MonthNarrows/7=\u0441 -FormatData/uk/MonthNarrows/8=\u0432 -FormatData/uk/MonthNarrows/9=\u0436 -FormatData/uk/MonthNarrows/10=\u043b -FormatData/uk/MonthNarrows/11=\u0433 +FormatData/uk/MonthNarrows/0=с +FormatData/uk/MonthNarrows/1=л +FormatData/uk/MonthNarrows/2=б +FormatData/uk/MonthNarrows/3=к +FormatData/uk/MonthNarrows/4=т +FormatData/uk/MonthNarrows/5=ч +FormatData/uk/MonthNarrows/6=л +FormatData/uk/MonthNarrows/7=с +FormatData/uk/MonthNarrows/8=в +FormatData/uk/MonthNarrows/9=ж +FormatData/uk/MonthNarrows/10=л +FormatData/uk/MonthNarrows/11=г FormatData/uk/MonthNarrows/12= FormatData/lv/MonthNarrows/0=J FormatData/lv/MonthNarrows/1=F @@ -7354,18 +7354,18 @@ FormatData/sk/MonthNarrows/9=o FormatData/sk/MonthNarrows/10=n FormatData/sk/MonthNarrows/11=d FormatData/sk/MonthNarrows/12= -FormatData/hi_IN/MonthNarrows/0=\u091c -FormatData/hi_IN/MonthNarrows/1=\u092b\u093c -FormatData/hi_IN/MonthNarrows/2=\u092e\u093e -FormatData/hi_IN/MonthNarrows/3=\u0905 -FormatData/hi_IN/MonthNarrows/4=\u092e -FormatData/hi_IN/MonthNarrows/5=\u091c\u0942 -FormatData/hi_IN/MonthNarrows/6=\u091c\u0941 -FormatData/hi_IN/MonthNarrows/7=\u0905 -FormatData/hi_IN/MonthNarrows/8=\u0938\u093f -FormatData/hi_IN/MonthNarrows/9=\u0905 -FormatData/hi_IN/MonthNarrows/10=\u0928 -FormatData/hi_IN/MonthNarrows/11=\u0926\u093f +FormatData/hi_IN/MonthNarrows/0=ज +FormatData/hi_IN/MonthNarrows/1=फ़ +FormatData/hi_IN/MonthNarrows/2=मा +FormatData/hi_IN/MonthNarrows/3=अ +FormatData/hi_IN/MonthNarrows/4=म +FormatData/hi_IN/MonthNarrows/5=जू +FormatData/hi_IN/MonthNarrows/6=जु +FormatData/hi_IN/MonthNarrows/7=अ +FormatData/hi_IN/MonthNarrows/8=सि +FormatData/hi_IN/MonthNarrows/9=अ +FormatData/hi_IN/MonthNarrows/10=न +FormatData/hi_IN/MonthNarrows/11=दि FormatData/hi_IN/MonthNarrows/12= FormatData/ga/MonthNarrows/0=E FormatData/ga/MonthNarrows/1=F @@ -7419,23 +7419,23 @@ FormatData/cs/MonthNarrows/9=10 FormatData/cs/MonthNarrows/10=11 FormatData/cs/MonthNarrows/11=12 FormatData/cs/MonthNarrows/12= -FormatData/el/MonthNarrows/0=\u0399 -FormatData/el/MonthNarrows/1=\u03a6 -FormatData/el/MonthNarrows/2=\u039c -FormatData/el/MonthNarrows/3=\u0391 -FormatData/el/MonthNarrows/4=\u039c -FormatData/el/MonthNarrows/5=\u0399 -FormatData/el/MonthNarrows/6=\u0399 -FormatData/el/MonthNarrows/7=\u0391 -FormatData/el/MonthNarrows/8=\u03a3 -FormatData/el/MonthNarrows/9=\u039f -FormatData/el/MonthNarrows/10=\u039d -FormatData/el/MonthNarrows/11=\u0394 +FormatData/el/MonthNarrows/0=Ι +FormatData/el/MonthNarrows/1=Φ +FormatData/el/MonthNarrows/2=Μ +FormatData/el/MonthNarrows/3=Α +FormatData/el/MonthNarrows/4=Μ +FormatData/el/MonthNarrows/5=Ι +FormatData/el/MonthNarrows/6=Ι +FormatData/el/MonthNarrows/7=Α +FormatData/el/MonthNarrows/8=Σ +FormatData/el/MonthNarrows/9=Ο +FormatData/el/MonthNarrows/10=Ν +FormatData/el/MonthNarrows/11=Δ FormatData/el/MonthNarrows/12= FormatData/hu/MonthNarrows/0=J FormatData/hu/MonthNarrows/1=F FormatData/hu/MonthNarrows/2=M -FormatData/hu/MonthNarrows/3=\u00c1 +FormatData/hu/MonthNarrows/3=Á FormatData/hu/MonthNarrows/4=M FormatData/hu/MonthNarrows/5=J FormatData/hu/MonthNarrows/6=J @@ -7459,7 +7459,7 @@ FormatData/es/MonthNarrows/10=N FormatData/es/MonthNarrows/11=D FormatData/es/MonthNarrows/12= FormatData/tr/MonthNarrows/0=O -FormatData/tr/MonthNarrows/1=\u015e +FormatData/tr/MonthNarrows/1=Ş FormatData/tr/MonthNarrows/2=M FormatData/tr/MonthNarrows/3=N FormatData/tr/MonthNarrows/4=M @@ -7530,7 +7530,7 @@ FormatData/is/MonthNarrows/3=A FormatData/is/MonthNarrows/4=M FormatData/is/MonthNarrows/5=J FormatData/is/MonthNarrows/6=J -FormatData/is/MonthNarrows/7=\u00c1 +FormatData/is/MonthNarrows/7=Á FormatData/is/MonthNarrows/8=S FormatData/is/MonthNarrows/9=O FormatData/is/MonthNarrows/10=N @@ -7564,7 +7564,7 @@ FormatData/en/MonthNarrows/11=D FormatData/en/MonthNarrows/12= FormatData/ca/MonthNarrows/0=GN FormatData/ca/MonthNarrows/1=FB -FormatData/ca/MonthNarrows/2=M\u00c7 +FormatData/ca/MonthNarrows/2=MÇ FormatData/ca/MonthNarrows/3=AB FormatData/ca/MonthNarrows/4=MG FormatData/ca/MonthNarrows/5=JN @@ -7601,18 +7601,18 @@ FormatData/fi/MonthNarrows/9=L FormatData/fi/MonthNarrows/10=M FormatData/fi/MonthNarrows/11=J FormatData/fi/MonthNarrows/12= -FormatData/mk/MonthNarrows/0=\u0458 -FormatData/mk/MonthNarrows/1=\u0444 -FormatData/mk/MonthNarrows/2=\u043c -FormatData/mk/MonthNarrows/3=\u0430 -FormatData/mk/MonthNarrows/4=\u043c -FormatData/mk/MonthNarrows/5=\u0458 -FormatData/mk/MonthNarrows/6=\u0458 -FormatData/mk/MonthNarrows/7=\u0430 -FormatData/mk/MonthNarrows/8=\u0441 -FormatData/mk/MonthNarrows/9=\u043e -FormatData/mk/MonthNarrows/10=\u043d -FormatData/mk/MonthNarrows/11=\u0434 +FormatData/mk/MonthNarrows/0=ј +FormatData/mk/MonthNarrows/1=ф +FormatData/mk/MonthNarrows/2=м +FormatData/mk/MonthNarrows/3=а +FormatData/mk/MonthNarrows/4=м +FormatData/mk/MonthNarrows/5=ј +FormatData/mk/MonthNarrows/6=ј +FormatData/mk/MonthNarrows/7=а +FormatData/mk/MonthNarrows/8=с +FormatData/mk/MonthNarrows/9=о +FormatData/mk/MonthNarrows/10=н +FormatData/mk/MonthNarrows/11=д FormatData/mk/MonthNarrows/12= FormatData/sr-Latn/MonthNarrows/0=j FormatData/sr-Latn/MonthNarrows/1=f @@ -7627,44 +7627,44 @@ FormatData/sr-Latn/MonthNarrows/9=o FormatData/sr-Latn/MonthNarrows/10=n FormatData/sr-Latn/MonthNarrows/11=d FormatData/sr-Latn/MonthNarrows/12= -FormatData/th/MonthNarrows/0=\u0e21.\u0e04. -FormatData/th/MonthNarrows/1=\u0e01.\u0e1e. -FormatData/th/MonthNarrows/2=\u0e21\u0e35.\u0e04. -FormatData/th/MonthNarrows/3=\u0e40\u0e21.\u0e22. -FormatData/th/MonthNarrows/4=\u0e1e.\u0e04. -FormatData/th/MonthNarrows/5=\u0e21\u0e34.\u0e22. -FormatData/th/MonthNarrows/6=\u0e01.\u0e04. -FormatData/th/MonthNarrows/7=\u0e2a.\u0e04. -FormatData/th/MonthNarrows/8=\u0e01.\u0e22. -FormatData/th/MonthNarrows/9=\u0e15.\u0e04. -FormatData/th/MonthNarrows/10=\u0e1e.\u0e22. -FormatData/th/MonthNarrows/11=\u0e18.\u0e04. +FormatData/th/MonthNarrows/0=ม.ค. +FormatData/th/MonthNarrows/1=ก.พ. +FormatData/th/MonthNarrows/2=มี.ค. +FormatData/th/MonthNarrows/3=เม.ย. +FormatData/th/MonthNarrows/4=พ.ค. +FormatData/th/MonthNarrows/5=มิ.ย. +FormatData/th/MonthNarrows/6=ก.ค. +FormatData/th/MonthNarrows/7=ส.ค. +FormatData/th/MonthNarrows/8=ก.ย. +FormatData/th/MonthNarrows/9=ต.ค. +FormatData/th/MonthNarrows/10=พ.ย. +FormatData/th/MonthNarrows/11=ธ.ค. FormatData/th/MonthNarrows/12= -FormatData/ar/MonthNarrows/0=\u064a -FormatData/ar/MonthNarrows/1=\u0641 -FormatData/ar/MonthNarrows/2=\u0645 -FormatData/ar/MonthNarrows/3=\u0623 -FormatData/ar/MonthNarrows/4=\u0648 -FormatData/ar/MonthNarrows/5=\u0646 -FormatData/ar/MonthNarrows/6=\u0644 -FormatData/ar/MonthNarrows/7=\u063a -FormatData/ar/MonthNarrows/8=\u0633 -FormatData/ar/MonthNarrows/9=\u0643 -FormatData/ar/MonthNarrows/10=\u0628 -FormatData/ar/MonthNarrows/11=\u062f +FormatData/ar/MonthNarrows/0=ي +FormatData/ar/MonthNarrows/1=ف +FormatData/ar/MonthNarrows/2=م +FormatData/ar/MonthNarrows/3=أ +FormatData/ar/MonthNarrows/4=و +FormatData/ar/MonthNarrows/5=ن +FormatData/ar/MonthNarrows/6=ل +FormatData/ar/MonthNarrows/7=غ +FormatData/ar/MonthNarrows/8=س +FormatData/ar/MonthNarrows/9=ك +FormatData/ar/MonthNarrows/10=ب +FormatData/ar/MonthNarrows/11=د FormatData/ar/MonthNarrows/12= -FormatData/ru/MonthNarrows/0=\u042f -FormatData/ru/MonthNarrows/1=\u0424 -FormatData/ru/MonthNarrows/2=\u041c -FormatData/ru/MonthNarrows/3=\u0410 -FormatData/ru/MonthNarrows/4=\u041c -FormatData/ru/MonthNarrows/5=\u0418 -FormatData/ru/MonthNarrows/6=\u0418 -FormatData/ru/MonthNarrows/7=\u0410 -FormatData/ru/MonthNarrows/8=\u0421 -FormatData/ru/MonthNarrows/9=\u041e -FormatData/ru/MonthNarrows/10=\u041d -FormatData/ru/MonthNarrows/11=\u0414 +FormatData/ru/MonthNarrows/0=Я +FormatData/ru/MonthNarrows/1=Ф +FormatData/ru/MonthNarrows/2=М +FormatData/ru/MonthNarrows/3=А +FormatData/ru/MonthNarrows/4=М +FormatData/ru/MonthNarrows/5=И +FormatData/ru/MonthNarrows/6=И +FormatData/ru/MonthNarrows/7=А +FormatData/ru/MonthNarrows/8=С +FormatData/ru/MonthNarrows/9=О +FormatData/ru/MonthNarrows/10=Н +FormatData/ru/MonthNarrows/11=Д FormatData/ru/MonthNarrows/12= FormatData/ms/MonthNarrows/0=J FormatData/ms/MonthNarrows/1=F @@ -7705,25 +7705,25 @@ FormatData/vi/MonthNarrows/9=10 FormatData/vi/MonthNarrows/10=11 FormatData/vi/MonthNarrows/11=12 FormatData/vi/MonthNarrows/12= -FormatData/sr/MonthNarrows/0=\u0458 -FormatData/sr/MonthNarrows/1=\u0444 -FormatData/sr/MonthNarrows/2=\u043c -FormatData/sr/MonthNarrows/3=\u0430 -FormatData/sr/MonthNarrows/4=\u043c -FormatData/sr/MonthNarrows/5=\u0458 -FormatData/sr/MonthNarrows/6=\u0458 -FormatData/sr/MonthNarrows/7=\u0430 -FormatData/sr/MonthNarrows/8=\u0441 -FormatData/sr/MonthNarrows/9=\u043e -FormatData/sr/MonthNarrows/10=\u043d -FormatData/sr/MonthNarrows/11=\u0434 +FormatData/sr/MonthNarrows/0=ј +FormatData/sr/MonthNarrows/1=ф +FormatData/sr/MonthNarrows/2=м +FormatData/sr/MonthNarrows/3=а +FormatData/sr/MonthNarrows/4=м +FormatData/sr/MonthNarrows/5=ј +FormatData/sr/MonthNarrows/6=ј +FormatData/sr/MonthNarrows/7=а +FormatData/sr/MonthNarrows/8=с +FormatData/sr/MonthNarrows/9=о +FormatData/sr/MonthNarrows/10=н +FormatData/sr/MonthNarrows/11=д FormatData/sr/MonthNarrows/12= FormatData/mt/MonthNarrows/0=J FormatData/mt/MonthNarrows/1=F FormatData/mt/MonthNarrows/2=M FormatData/mt/MonthNarrows/3=A FormatData/mt/MonthNarrows/4=M -FormatData/mt/MonthNarrows/5=\u0120 +FormatData/mt/MonthNarrows/5=Ġ FormatData/mt/MonthNarrows/6=L FormatData/mt/MonthNarrows/7=A FormatData/mt/MonthNarrows/8=S @@ -7817,33 +7817,33 @@ FormatData/fi/DatePatterns/2=d.M.y FormatData/fi/DatePatterns/3=d.M.y # bug #8075173 -FormatData/de/standalone.MonthAbbreviations/2=M\u00e4r +FormatData/de/standalone.MonthAbbreviations/2=Mär # bug #8178872 FormatData/pt_PT/latn.NumberElements/0=, -FormatData/pt_PT/latn.NumberElements/1=\u00a0 +FormatData/pt_PT/latn.NumberElements/1=  FormatData/pt_AO/latn.NumberElements/0=, -FormatData/pt_AO/latn.NumberElements/1=\u00a0 +FormatData/pt_AO/latn.NumberElements/1=  FormatData/pt_CH/latn.NumberElements/0=, -FormatData/pt_CH/latn.NumberElements/1=\u00a0 +FormatData/pt_CH/latn.NumberElements/1=  FormatData/pt_CV/latn.NumberElements/0=, -FormatData/pt_CV/latn.NumberElements/1=\u00a0 +FormatData/pt_CV/latn.NumberElements/1=  FormatData/pt_GQ/latn.NumberElements/0=, -FormatData/pt_GQ/latn.NumberElements/1=\u00a0 +FormatData/pt_GQ/latn.NumberElements/1=  FormatData/pt_MO/latn.NumberElements/0=, -FormatData/pt_MO/latn.NumberElements/1=\u00a0 +FormatData/pt_MO/latn.NumberElements/1=  FormatData/pt_LU/latn.NumberElements/0=, -FormatData/pt_LU/latn.NumberElements/1=\u00a0 +FormatData/pt_LU/latn.NumberElements/1=  FormatData/pt_MZ/latn.NumberElements/0=, -FormatData/pt_MZ/latn.NumberElements/1=\u00a0 +FormatData/pt_MZ/latn.NumberElements/1=  FormatData/pt_ST/latn.NumberElements/0=, -FormatData/pt_ST/latn.NumberElements/1=\u00a0 +FormatData/pt_ST/latn.NumberElements/1=  FormatData/pt_TL/latn.NumberElements/0=, -FormatData/pt_TL/latn.NumberElements/1=\u00a0 +FormatData/pt_TL/latn.NumberElements/1=  FormatData/kea/latn.NumberElements/0=, -FormatData/kea/latn.NumberElements/1=\u00a0 +FormatData/kea/latn.NumberElements/1=  FormatData/kea_CV/latn.NumberElements/0=, -FormatData/kea_CV/latn.NumberElements/1=\u00a0 +FormatData/kea_CV/latn.NumberElements/1=  # bug #8202537 FormatData/ccp_IN/cakm.NumberElements/4=0 @@ -7862,11 +7862,11 @@ FormatData/fr_CH/latn.NumberElements/11=. # bug # 8295564 FormatData/nb/latn.NumberElements/0=, -FormatData/nb/latn.NumberElements/1=\u00a0 +FormatData/nb/latn.NumberElements/1=  FormatData/no/latn.NumberElements/0=, -FormatData/no/latn.NumberElements/1=\u00a0 +FormatData/no/latn.NumberElements/1=  FormatData/nn/latn.NumberElements/0=, -FormatData/nn/latn.NumberElements/1=\u00a0 +FormatData/nn/latn.NumberElements/1=  # CalendarData consolidated to root CalendarData//firstDayOfWeek=1: AG AS BD BR BS BT BW BZ CA CO DM DO ET GT GU HK HN ID IL IN JM JP KE KH KR LA MH MM MO MT MX MZ NI NP PA PE PH PK PR PT PY SA SG SV TH TT TW UM US VE VI WS YE ZA ZW;2: 001 AD AI AL AM AN AR AT AU AX AZ BA BE BG BM BN BY CH CL CM CN CR CY CZ DE DK EC EE ES FI FJ FO FR GB GE GF GP GR HR HU IE IS IT KG KZ LB LI LK LT LU LV MC MD ME MK MN MQ MY NL NO NZ PL RE RO RS RU SE SI SK SM TJ TM TR UA UY UZ VA VN XK;6: MV;7: AE AF BH DJ DZ EG IQ IR JO KW LY OM QA SD SY @@ -7877,4 +7877,4 @@ TimeZoneNames/en/America\/Ojinaga/1=Central Standard Time TimeZoneNames/en/America\/Chihuahua/1=Central Standard Time # bug 8303472 -LocaleNames/en/TR=T\u00fcrkiye +LocaleNames/en/TR=Türkiye diff --git a/test/jdk/sun/text/resources/LocaleDataTest.java b/test/jdk/sun/text/resources/LocaleDataTest.java index 2d76ca9e2eac..dde834729bb3 100644 --- a/test/jdk/sun/text/resources/LocaleDataTest.java +++ b/test/jdk/sun/text/resources/LocaleDataTest.java @@ -41,7 +41,7 @@ * 8187946 8195478 8181157 8179071 8193552 8202026 8204269 8202537 8208746 * 8209775 8221432 8227127 8230284 8231273 8233579 8234288 8250665 8255086 * 8251317 8274658 8283277 8283805 8265315 8287868 8295564 8284840 8296715 - * 8301206 8303472 + * 8301206 8303472 8357882 * @summary Verify locale data * @modules java.base/sun.util.resources * @modules jdk.localedata @@ -92,9 +92,8 @@ * pairs delimited by newline characters, with the keys separated from the values * by = signs. The keys are similar in syntax to a Unix pathname, with keys at * successive levels of containment in the resource-data hierarchy separated by - * slashes. The file is in ISO 8859-1 encoding, with control characters and - * non-ASCII characters denoted with backslash-u escape sequences. The program also allows - * blank lines and comment lines to be interspersed with the data. Comment lines + * slashes. The file is in UTF-8 encoding. The program also allows blank lines + * and comment lines to be interspersed with the data. Comment lines * begin with '#'. * * A data file for this test would look something like this:
          @@ -103,8 +102,8 @@
            *        LocaleNames//US=United States
            *        LocaleNames//FR=France
            *        FormatData/fr_FR/MonthNames/0=janvier
          - *        FormatData/fr_FR/MonthNames/1=f\u00e9vrier
          - *        LocaleNames/fr_FR/US=\u00c9tats-Unis
          + *        FormatData/fr_FR/MonthNames/1=février
          + *        LocaleNames/fr_FR/US=États-Unis
            *        LocaleNames/fr_FR/FR=France
          * * Second field which designates locale is in the form of: @@ -148,7 +147,7 @@ * date/time format of SimpleDateFormat by making sure that the full date and time * patterns include sufficient data. The test of this is not whether changes were * made to the locale data; it's whether using this data gives round-trip integrity. - * Likewise, changing the currency patterns to use \u00a4 instead of local currency + * Likewise, changing the currency patterns to use ¤ instead of local currency * symbols isn't something that can be tested by this test; instead, you want to * actually format currency values and make sure the proper currency symbol was used. * @@ -164,14 +163,10 @@ import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; -import java.io.FilterReader; -import java.io.FilterWriter; -import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; -import java.io.Reader; -import java.io.Writer; +import java.nio.charset.StandardCharsets; import java.util.Locale; import java.util.MissingResourceException; import java.util.ResourceBundle; @@ -208,19 +203,17 @@ else if (args[i].equals("-cldr")) { } else if (args[i].equals("-s") && in == null) - in = new BufferedReader(new EscapeReader(new InputStreamReader(System.in, - "ISO8859_1"))); + in = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8)); else if (!args[i].startsWith("-") && in == null) - in = new BufferedReader(new EscapeReader(new InputStreamReader(new - FileInputStream(args[i]), "ISO8859_1"))); + in = new BufferedReader(new InputStreamReader(new + FileInputStream(args[i]), StandardCharsets.UTF_8)); } if (in == null) { File localeData = new File(System.getProperty("test.src", "."), DEFAULT_DATAFILE + cldrSuffix); - in = new BufferedReader(new EscapeReader(new InputStreamReader(new - FileInputStream(localeData), "ISO8859_1"))); + in = new BufferedReader(new InputStreamReader(new + FileInputStream(localeData), StandardCharsets.UTF_8)); } - out = new PrintWriter(new EscapeWriter(new OutputStreamWriter(System.out, - "ISO8859_1")), true); + out = new PrintWriter(new OutputStreamWriter(System.out, StandardCharsets.UTF_8)); // perform the actual test int errorCount = doTest(in, out, writeNewFile); @@ -403,97 +396,3 @@ else if (resource instanceof String[][]) { return true; } } - -class EscapeReader extends FilterReader { - public EscapeReader(Reader in) { - super(in); - } - - public int read() throws IOException { - if (buffer != null) { - String b = buffer.toString(); - int result = b.charAt(0); - if (b.length() > 1) - buffer = new StringBuffer(b.substring(1)); - else - buffer = null; - return result; - } - else { - int result = super.read(); - if (result != '\\') - return result; - else { - buffer = new StringBuffer(); - result = super.read(); - buffer.append((char)result); - if (result == 'u') { - for (int i = 0; i < 4; i++) { - result = super.read(); - if (result == -1) - break; - buffer.append((char)result); - } - String number = buffer.toString().substring(1); - result = Integer.parseInt(number, 16); - buffer = null; - return result; - } - return '\\'; - } - } - } - - public int read(char[] cbuf, int start, int len) throws IOException { - int p = start; - int end = start + len; - int c = 0; - while (c != -1 && p < end) { - c = read(); - if (c != -1) - cbuf[p++] = (char)c; - } - if (c == -1 && p == start) - return -1; - else - return p - start; - } - - private StringBuffer buffer = null; -} - -class EscapeWriter extends FilterWriter { - public EscapeWriter(Writer out) { - super(out); - } - - public void write(int c) throws IOException { - if ((c >= ' ' && c <= '\u007e') || c == '\r' || c == '\n') - super.write(c); - else { - super.write('\\'); - super.write('u'); - String number = Integer.toHexString(c); - if (number.length() < 4) - number = zeros.substring(0, 4 - number.length()) + number; - super.write(number.charAt(0)); - super.write(number.charAt(1)); - super.write(number.charAt(2)); - super.write(number.charAt(3)); - } - } - - public void write(char[] cbuf, int off, int len) throws IOException { - int end = off + len; - while (off < end) - write(cbuf[off++]); - } - - public void write(String str, int off, int len) throws IOException { - int end = off + len; - while (off < end) - write(str.charAt(off++)); - } - - private static String zeros = "0000"; -} From 27e0b36a559ba62482221a94ab4760792c1a4855 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Wed, 5 Nov 2025 09:38:08 +0000 Subject: [PATCH 272/323] 8367021: Regression in LocaleDataTest refactoring Reviewed-by: rrich, phh Backport-of: 48831c65b5535fef706b64a4eb23ba28b1567ead --- test/jdk/sun/text/resources/LocaleDataTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/jdk/sun/text/resources/LocaleDataTest.java b/test/jdk/sun/text/resources/LocaleDataTest.java index dde834729bb3..b09bdaf91472 100644 --- a/test/jdk/sun/text/resources/LocaleDataTest.java +++ b/test/jdk/sun/text/resources/LocaleDataTest.java @@ -41,7 +41,7 @@ * 8187946 8195478 8181157 8179071 8193552 8202026 8204269 8202537 8208746 * 8209775 8221432 8227127 8230284 8231273 8233579 8234288 8250665 8255086 * 8251317 8274658 8283277 8283805 8265315 8287868 8295564 8284840 8296715 - * 8301206 8303472 8357882 + * 8301206 8303472 8357882 8367021 * @summary Verify locale data * @modules java.base/sun.util.resources * @modules jdk.localedata @@ -213,7 +213,7 @@ else if (!args[i].startsWith("-") && in == null) in = new BufferedReader(new InputStreamReader(new FileInputStream(localeData), StandardCharsets.UTF_8)); } - out = new PrintWriter(new OutputStreamWriter(System.out, StandardCharsets.UTF_8)); + out = new PrintWriter(new OutputStreamWriter(System.out, StandardCharsets.UTF_8), true); // perform the actual test int errorCount = doTest(in, out, writeNewFile); From f5d59e99c956046df80ddcad912c99cdb99b28ef Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Wed, 5 Nov 2025 09:43:13 +0000 Subject: [PATCH 273/323] 8357172: Extend try block in nsk/jdi tests to capture exceptions thrown by Debuggee.classByName() Backport-of: 14e41ab055955ffd7cf9e8129cc3269b4e3807b7 --- .../invokeMethod/invokemethod009.java | 22 ++++----- .../invokeMethod/invokemethod010.java | 39 ++++++--------- .../invokeMethod/invokemethod014.java | 26 +++++----- .../ClassType/newInstance/newinstance009.java | 43 +++++++--------- .../invokeMethod/invokemethod002.java | 18 +++---- .../invokeMethod/invokemethod003.java | 32 ++++++------ .../invokeMethod/invokemethod004.java | 37 ++++++-------- .../invokeMethod/invokemethod005.java | 24 ++++----- .../invokeMethod/invokemethod006.java | 24 ++++----- .../invokeMethod/invokemethod007.java | 24 ++++----- .../invokeMethod/invokemethod008.java | 28 +++++------ .../invokeMethod/invokemethod009.java | 28 +++++------ .../invokeMethod/invokemethod014.java | 30 ++++++------ .../ObjectReference/setValue/setvalue002.java | 36 ++++++-------- .../ObjectReference/setValue/setvalue003.java | 37 ++++++-------- .../ObjectReference/setValue/setvalue004.java | 37 ++++++-------- .../ObjectReference/setValue/setvalue005.java | 39 ++++++--------- .../setValue/setvalue005/setvalue005.java | 24 ++++----- .../ownedMonitors/ownedmonitors002.java | 49 ++++++++----------- .../popFrames/popframes006.java | 24 ++++----- .../popFrames/popframes007.java | 42 ++++++++-------- .../nsk/jdi/ThreadReference/stop/stop002.java | 23 ++++----- 22 files changed, 316 insertions(+), 370 deletions(-) diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ClassType/invokeMethod/invokemethod009.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ClassType/invokeMethod/invokemethod009.java index c5e1be8f4a35..fe96c69ace62 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ClassType/invokeMethod/invokemethod009.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ClassType/invokeMethod/invokemethod009.java @@ -112,19 +112,19 @@ private int runIt(String args[], PrintStream out) { return quitDebuggee(); } - // debuggee main class - ReferenceType rType = debuggee.classByName(DEBUGGEE_CLASS); - - thrRef = debuggee.threadByFieldName(rType, "testThread", DEBUGGEE_THRNAME); - if (thrRef == null) { - log.complain("TEST FAILURE: Method Debugee.threadByFieldName() returned null for debuggee thread " - + DEBUGGEE_THRNAME); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); - } + try { + // debuggee main class + ReferenceType rType = debuggee.classByName(DEBUGGEE_CLASS); + + thrRef = debuggee.threadByFieldName(rType, "testThread", DEBUGGEE_THRNAME); + if (thrRef == null) { + log.complain("TEST FAILURE: Method Debugee.threadByFieldName() returned null for debuggee thread " + + DEBUGGEE_THRNAME); + tot_res = Consts.TEST_FAILED; + return quitDebuggee(); + } // Check the tested assersion - try { suspendAtBP(rType, DEBUGGEE_STOPATLINE); ClassType clsType = (ClassType) rType; diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ClassType/invokeMethod/invokemethod010.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ClassType/invokeMethod/invokemethod010.java index 65621fb712c6..f813a4471922 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ClassType/invokeMethod/invokemethod010.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ClassType/invokeMethod/invokemethod010.java @@ -111,36 +111,29 @@ private int runIt(String args[], PrintStream out) { return quitDebuggee(); } - // debuggee main class - ReferenceType rType = debuggee.classByName(DEBUGGEE_CLASS); + try { + // debuggee main class + ReferenceType rType = debuggee.classByName(DEBUGGEE_CLASS); - thrRef = debuggee.threadByFieldName(rType, "testThread", DEBUGGEE_THRNAME); - if (thrRef == null) { - log.complain("TEST FAILURE: method Debugee.threadByFieldName() returned null for debuggee thread " - + DEBUGGEE_THRNAME); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); - } - thrRef.suspend(); - while(!thrRef.isSuspended()) { - num++; - if (num > ATTEMPTS) { - log.complain("TEST FAILED: unable to suspend debuggee thread"); + thrRef = debuggee.threadByFieldName(rType, "testThread", DEBUGGEE_THRNAME); + if (thrRef == null) { + log.complain("TEST FAILURE: method Debugee.threadByFieldName() returned null for debuggee thread " + + DEBUGGEE_THRNAME); tot_res = Consts.TEST_FAILED; return quitDebuggee(); } - log.display("Waiting for debuggee thread suspension ..."); - try { + thrRef.suspend(); + while(!thrRef.isSuspended()) { + num++; + if (num > ATTEMPTS) { + log.complain("TEST FAILED: unable to suspend debuggee thread"); + tot_res = Consts.TEST_FAILED; + return quitDebuggee(); + } + log.display("Waiting for debuggee thread suspension ..."); Thread.currentThread().sleep(TIMEOUT_DELTA); - } catch(InterruptedException ie) { - ie.printStackTrace(); - log.complain("TEST FAILED: caught: " + ie); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); } - } - try { // debuggee main class ClassType clsType = (ClassType) rType; diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ClassType/invokeMethod/invokemethod014.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ClassType/invokeMethod/invokemethod014.java index c1b5a2a64ab9..900a453a2daf 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ClassType/invokeMethod/invokemethod014.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ClassType/invokeMethod/invokemethod014.java @@ -113,20 +113,20 @@ private int runIt(String args[], PrintStream out) { return quitDebuggee(); } - // debuggee main class - ReferenceType rType = debuggee.classByName(DEBUGGEE_CLASS); - ClassType clsType = (ClassType) rType; - - ThreadReference thrRef = - debuggee.threadByFieldName(rType, "testThread", DEBUGGEE_THRNAME); - if (thrRef == null) { - log.complain("TEST FAILURE: method Debugee.threadByFieldName() returned null for debuggee thread " - + DEBUGGEE_THRNAME); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); - } - try { + // debuggee main class + ReferenceType rType = debuggee.classByName(DEBUGGEE_CLASS); + ClassType clsType = (ClassType) rType; + + ThreadReference thrRef = + debuggee.threadByFieldName(rType, "testThread", DEBUGGEE_THRNAME); + if (thrRef == null) { + log.complain("TEST FAILURE: method Debugee.threadByFieldName() returned null for debuggee thread " + + DEBUGGEE_THRNAME); + tot_res = Consts.TEST_FAILED; + return quitDebuggee(); + } + suspendAtBP(rType, DEBUGGEE_STOPATLINE); for (int i=0; i ATTEMPTS) { - log.complain("TEST FAILED: unable to suspend debuggee thread"); + try { + // debuggee main class + ReferenceType rType = debuggee.classByName(DEBUGGEE_CLASS); + ClassType clsType = (ClassType) rType; + + ThreadReference thrRef = debuggee.threadByFieldName(rType, "thread", DEBUGGEE_THRNAME); + if (thrRef == null) { + log.complain("TEST FAILURE: method Debugee.threadByFieldName() returned null for debuggee thread " + + DEBUGGEE_THRNAME); tot_res = Consts.TEST_FAILED; return quitDebuggee(); } - log.display("Waiting for debuggee thread suspension ..."); - try { + thrRef.suspend(); + while(!thrRef.isSuspended()) { + num++; + if (num > ATTEMPTS) { + log.complain("TEST FAILED: unable to suspend debuggee thread"); + tot_res = Consts.TEST_FAILED; + return quitDebuggee(); + } + log.display("Waiting for debuggee thread suspension ..."); Thread.currentThread().sleep(DELAY); - } catch(InterruptedException ie) { - ie.printStackTrace(); - log.complain("TEST FAILED: caught: " + ie); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); } - } - try { List methList = rType.methodsByName(""); if (methList.isEmpty()) { log.complain("TEST FAILURE: the expected constructor " diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod002.java index 7c43d0b2fa5f..44189cb3c3b4 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod002.java @@ -124,18 +124,18 @@ private int runIt(String args[], PrintStream out) { return quitDebuggee(); } - rType[0] = debuggee.classByName(DEBUGGEE_CLASS); // debuggee main class + try { + rType[0] = debuggee.classByName(DEBUGGEE_CLASS); // debuggee main class - thrRef = debuggee.threadByFieldName(rType[0], "testThread", DEBUGGEE_THRNAME); - if (thrRef == null) { - log.complain("TEST FAILURE: Method Debugee.threadByFieldName() returned null for debuggee thread " - + DEBUGGEE_THRNAME); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); - } + thrRef = debuggee.threadByFieldName(rType[0], "testThread", DEBUGGEE_THRNAME); + if (thrRef == null) { + log.complain("TEST FAILURE: Method Debugee.threadByFieldName() returned null for debuggee thread " + + DEBUGGEE_THRNAME); + tot_res = Consts.TEST_FAILED; + return quitDebuggee(); + } // Check the tested assersion - try { suspendAtBP(rType[0], DEBUGGEE_STOPATLINE); findObjRef(DEBUGGEE_LOCALVAR); rType[1] = objRef[1].referenceType(); // debuggee dummy class diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod003.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod003.java index a348f9ff78c6..537be5cde656 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod003.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod003.java @@ -135,24 +135,24 @@ private int runIt(String args[], PrintStream out) { return quitDebuggee(); } - ReferenceType[] rType = new ReferenceType[3]; - // debuggee main class - rType[0] = debuggee.classByName(DEBUGGEE_CLASS); - // debuggee dummy interface - rType[1] = debuggee.classByName(DEBUGGEE_INTERFACE); - // debuggee dummy abstract class - rType[2] = debuggee.classByName(DEBUGGEE_ABSTRACTCLASS); - - thrRef = debuggee.threadByFieldName(rType[0], "testThread", DEBUGGEE_THRNAME); - if (thrRef == null) { - log.complain("TEST FAILURE: Method Debugee.threadByFieldName() returned null for debuggee thread " - + DEBUGGEE_THRNAME); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); - } + try { + ReferenceType[] rType = new ReferenceType[3]; + // debuggee main class + rType[0] = debuggee.classByName(DEBUGGEE_CLASS); + // debuggee dummy interface + rType[1] = debuggee.classByName(DEBUGGEE_INTERFACE); + // debuggee dummy abstract class + rType[2] = debuggee.classByName(DEBUGGEE_ABSTRACTCLASS); + + thrRef = debuggee.threadByFieldName(rType[0], "testThread", DEBUGGEE_THRNAME); + if (thrRef == null) { + log.complain("TEST FAILURE: Method Debugee.threadByFieldName() returned null for debuggee thread " + + DEBUGGEE_THRNAME); + tot_res = Consts.TEST_FAILED; + return quitDebuggee(); + } // Check the tested assersion - try { suspendAtBP(rType[0], DEBUGGEE_STOPATLINE); ObjectReference objRef = findObjRef(DEBUGGEE_LOCALVAR); diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod004.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod004.java index 3b26eb2a0109..61a78285a6b9 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod004.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod004.java @@ -111,36 +111,29 @@ private int runIt(String args[], PrintStream out) { return quitDebuggee(); } - ReferenceType debuggeeClass = debuggee.classByName(DEBUGGEE_CLASS); // debuggee main class + try { + ReferenceType debuggeeClass = debuggee.classByName(DEBUGGEE_CLASS); // debuggee main class - thrRef = debuggee.threadByFieldName(debuggeeClass, "testThread", DEBUGGEE_THRNAME); - if (thrRef == null) { - log.complain("TEST FAILURE: method Debugee.threadByFieldName() returned null for debuggee thread " - + DEBUGGEE_THRNAME); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); - } - thrRef.suspend(); - while(!thrRef.isSuspended()) { - num++; - if (num > ATTEMPTS) { - log.complain("TEST FAILED: unable to suspend debuggee thread"); + thrRef = debuggee.threadByFieldName(debuggeeClass, "testThread", DEBUGGEE_THRNAME); + if (thrRef == null) { + log.complain("TEST FAILURE: method Debugee.threadByFieldName() returned null for debuggee thread " + + DEBUGGEE_THRNAME); tot_res = Consts.TEST_FAILED; return quitDebuggee(); } - log.display("Waiting for debuggee thread suspension ..."); - try { + thrRef.suspend(); + while(!thrRef.isSuspended()) { + num++; + if (num > ATTEMPTS) { + log.complain("TEST FAILED: unable to suspend debuggee thread"); + tot_res = Consts.TEST_FAILED; + return quitDebuggee(); + } + log.display("Waiting for debuggee thread suspension ..."); Thread.currentThread().sleep(1000); - } catch(InterruptedException ie) { - ie.printStackTrace(); - log.complain("TEST FAILED: caught: " + ie); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); } - } // Check the tested assersion - try { ObjectReference objRef = findObjRef(DEBUGGEE_LOCALVAR); ReferenceType rType = objRef.referenceType(); // debuggee dummy class diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod005.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod005.java index fcc13dc3b108..a6f7806753d9 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod005.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod005.java @@ -113,20 +113,20 @@ private int runIt(String args[], PrintStream out) { return quitDebuggee(); } - ReferenceType[] rType = new ReferenceType[2]; - // debuggee main class - rType[0] = debuggee.classByName(DEBUGGEE_CLASS); - - thrRef = debuggee.threadByFieldName(rType[0], "testThread", DEBUGGEE_THRNAME); - if (thrRef == null) { - log.complain("TEST FAILURE: Method Debugee.threadByFieldName() returned null for debuggee thread " - + DEBUGGEE_THRNAME); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); - } + try { + ReferenceType[] rType = new ReferenceType[2]; + // debuggee main class + rType[0] = debuggee.classByName(DEBUGGEE_CLASS); + + thrRef = debuggee.threadByFieldName(rType[0], "testThread", DEBUGGEE_THRNAME); + if (thrRef == null) { + log.complain("TEST FAILURE: Method Debugee.threadByFieldName() returned null for debuggee thread " + + DEBUGGEE_THRNAME); + tot_res = Consts.TEST_FAILED; + return quitDebuggee(); + } // Check the tested assersion - try { suspendAtBP(rType[0], DEBUGGEE_STOPATLINE); ObjectReference objRef = findObjRef(DEBUGGEE_LOCALVAR); rType[1] = objRef.referenceType(); // debuggee dummy class diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod006.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod006.java index 0583cf62b530..d914b8bacfc4 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod006.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod006.java @@ -111,20 +111,20 @@ private int runIt(String args[], PrintStream out) { return quitDebuggee(); } - ReferenceType[] rType = new ReferenceType[2]; - // debuggee main class - rType[0] = debuggee.classByName(DEBUGGEE_CLASS); - - thrRef = debuggee.threadByFieldName(rType[0], "testThread", DEBUGGEE_THRNAME); - if (thrRef == null) { - log.complain("TEST FAILURE: Method Debugee.threadByFieldName() returned null for debuggee thread " - + DEBUGGEE_THRNAME); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); - } + try { + ReferenceType[] rType = new ReferenceType[2]; + // debuggee main class + rType[0] = debuggee.classByName(DEBUGGEE_CLASS); + + thrRef = debuggee.threadByFieldName(rType[0], "testThread", DEBUGGEE_THRNAME); + if (thrRef == null) { + log.complain("TEST FAILURE: Method Debugee.threadByFieldName() returned null for debuggee thread " + + DEBUGGEE_THRNAME); + tot_res = Consts.TEST_FAILED; + return quitDebuggee(); + } // Check the tested assersion - try { suspendAtBP(rType[0], DEBUGGEE_STOPATLINE); ObjectReference objRef = findObjRef(DEBUGGEE_LOCALVAR); rType[1] = objRef.referenceType(); // debuggee dummy class diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod007.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod007.java index fa5c9ec3e175..9dc343d69a94 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod007.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod007.java @@ -127,20 +127,20 @@ private int runIt(String args[], PrintStream out) { return quitDebuggee(); } - ReferenceType[] rType = new ReferenceType[2]; - // debuggee main class - rType[0] = debuggee.classByName(DEBUGGEE_CLASS); - - thrRef = debuggee.threadByFieldName(rType[0], "testThread", DEBUGGEE_THRNAME); - if (thrRef == null) { - log.complain("TEST FAILURE: Method Debugee.threadByFieldName() returned null for debuggee thread " - + DEBUGGEE_THRNAME); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); - } + try { + ReferenceType[] rType = new ReferenceType[2]; + // debuggee main class + rType[0] = debuggee.classByName(DEBUGGEE_CLASS); + + thrRef = debuggee.threadByFieldName(rType[0], "testThread", DEBUGGEE_THRNAME); + if (thrRef == null) { + log.complain("TEST FAILURE: Method Debugee.threadByFieldName() returned null for debuggee thread " + + DEBUGGEE_THRNAME); + tot_res = Consts.TEST_FAILED; + return quitDebuggee(); + } // Check the tested assersion - try { suspendAtBP(rType[0], DEBUGGEE_STOPATLINE); ObjectReference objRef = findObjRef(DEBUGGEE_LOCALVAR); rType[1] = objRef.referenceType(); // debuggee dummy class diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod008.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod008.java index c0426229e5b5..7572c5adefe9 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod008.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod008.java @@ -120,22 +120,22 @@ private int runIt(String args[], PrintStream out) { return quitDebuggee(); } - ReferenceType[] rType = new ReferenceType[3]; - // reference types of debuggee main & dummy classes - rType[0] = debuggee.classByName(DEBUGGEE_CLASSES[0]); - rType[1] = debuggee.classByName(DEBUGGEE_CLASSES[1]); - rType[2] = debuggee.classByName(DEBUGGEE_CLASSES[2]); - - thrRef = debuggee.threadByFieldName(rType[0], "testThread", DEBUGGEE_THRNAME); - if (thrRef == null) { - log.complain("TEST FAILURE: Method Debugee.threadByFieldName() returned null for debuggee thread " - + DEBUGGEE_THRNAME); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); - } + try { + ReferenceType[] rType = new ReferenceType[3]; + // reference types of debuggee main & dummy classes + rType[0] = debuggee.classByName(DEBUGGEE_CLASSES[0]); + rType[1] = debuggee.classByName(DEBUGGEE_CLASSES[1]); + rType[2] = debuggee.classByName(DEBUGGEE_CLASSES[2]); + + thrRef = debuggee.threadByFieldName(rType[0], "testThread", DEBUGGEE_THRNAME); + if (thrRef == null) { + log.complain("TEST FAILURE: Method Debugee.threadByFieldName() returned null for debuggee thread " + + DEBUGGEE_THRNAME); + tot_res = Consts.TEST_FAILED; + return quitDebuggee(); + } // Check the tested assersion - try { suspendAtBP(rType[0], DEBUGGEE_STOPATLINE); ObjectReference objRef = findObjRef(DEBUGGEE_LOCALVAR); diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod009.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod009.java index ce3545ac228e..72ea170440e4 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod009.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod009.java @@ -120,22 +120,22 @@ private int runIt(String args[], PrintStream out) { return quitDebuggee(); } - ReferenceType[] rType = new ReferenceType[3]; - // reference types of debuggee main & dummy classes - rType[0] = debuggee.classByName(DEBUGGEE_CLASSES[0]); - rType[1] = debuggee.classByName(DEBUGGEE_CLASSES[1]); - rType[2] = debuggee.classByName(DEBUGGEE_CLASSES[2]); - - thrRef = debuggee.threadByFieldName(rType[0], "testThread", DEBUGGEE_THRNAME); - if (thrRef == null) { - log.complain("TEST FAILURE: Method Debugee.threadByFieldName() returned null for debuggee thread " - + DEBUGGEE_THRNAME); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); - } + try { + ReferenceType[] rType = new ReferenceType[3]; + // reference types of debuggee main & dummy classes + rType[0] = debuggee.classByName(DEBUGGEE_CLASSES[0]); + rType[1] = debuggee.classByName(DEBUGGEE_CLASSES[1]); + rType[2] = debuggee.classByName(DEBUGGEE_CLASSES[2]); + + thrRef = debuggee.threadByFieldName(rType[0], "testThread", DEBUGGEE_THRNAME); + if (thrRef == null) { + log.complain("TEST FAILURE: Method Debugee.threadByFieldName() returned null for debuggee thread " + + DEBUGGEE_THRNAME); + tot_res = Consts.TEST_FAILED; + return quitDebuggee(); + } // Check the tested assersion - try { suspendAtBP(rType[0], DEBUGGEE_STOPATLINE); ObjectReference objRef = findObjRef(DEBUGGEE_LOCALVAR); LinkedList argList = new LinkedList(); diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod014.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod014.java index 3005ed87a647..0950b4064dbc 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod014.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/invokeMethod/invokemethod014.java @@ -143,23 +143,23 @@ private int runIt(String args[], PrintStream out) { return quitDebuggee(); } - ReferenceType[] rType = new ReferenceType[3]; - // debuggee main & dummy classes - rType[0] = debuggee.classByName(DEBUGGEE_CLASSES[0]); - rType[1] = debuggee.classByName(DEBUGGEE_CLASSES[1]); - rType[2] = debuggee.classByName(DEBUGGEE_CLASSES[2]); - - ThreadReference thrRef = - debuggee.threadByFieldName(rType[0], "testThread", DEBUGGEE_THRNAME); - if (thrRef == null) { - log.complain("TEST FAILURE: method Debugee.threadByFieldName() returned null for debuggee thread " - + DEBUGGEE_THRNAME); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); - } + try { + ReferenceType[] rType = new ReferenceType[3]; + // debuggee main & dummy classes + rType[0] = debuggee.classByName(DEBUGGEE_CLASSES[0]); + rType[1] = debuggee.classByName(DEBUGGEE_CLASSES[1]); + rType[2] = debuggee.classByName(DEBUGGEE_CLASSES[2]); + + ThreadReference thrRef = + debuggee.threadByFieldName(rType[0], "testThread", DEBUGGEE_THRNAME); + if (thrRef == null) { + log.complain("TEST FAILURE: method Debugee.threadByFieldName() returned null for debuggee thread " + + DEBUGGEE_THRNAME); + tot_res = Consts.TEST_FAILED; + return quitDebuggee(); + } // Check the tested assersion - try { suspendAtBP(rType[0], DEBUGGEE_STOPATLINE); objRef = findObjRef(thrRef, DEBUGGEE_LOCALVAR); diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/setValue/setvalue002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/setValue/setvalue002.java index 1c4803cffef2..b9c5a99a4eaa 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/setValue/setvalue002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/setValue/setvalue002.java @@ -109,35 +109,29 @@ private int runIt(String args[], PrintStream out) { return quitDebuggee(); } - ReferenceType debuggeeClass = debuggee.classByName(DEBUGGEE_CLASS); // debuggee main class + try { + ReferenceType debuggeeClass = debuggee.classByName(DEBUGGEE_CLASS); // debuggee main class - thrRef = debuggee.threadByFieldName(debuggeeClass, "testThread", DEBUGGEE_THRNAME); - if (thrRef == null) { - log.complain("TEST FAILURE: Method Debugee.threadByFieldName() returned null for debuggee's thread " - + DEBUGGEE_THRNAME); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); - } - thrRef.suspend(); - while(!thrRef.isSuspended()) { - num++; - if (num > ATTEMPTS) { - log.complain("TEST FAILED: Unable to suspend debuggee's thread"); + thrRef = debuggee.threadByFieldName(debuggeeClass, "testThread", DEBUGGEE_THRNAME); + if (thrRef == null) { + log.complain("TEST FAILURE: Method Debugee.threadByFieldName() returned null for debuggee's thread " + + DEBUGGEE_THRNAME); tot_res = Consts.TEST_FAILED; return quitDebuggee(); } - log.display("Waiting for debuggee's thread suspension ..."); - try { + thrRef.suspend(); + while (!thrRef.isSuspended()) { + num++; + if (num > ATTEMPTS) { + log.complain("TEST FAILED: Unable to suspend debuggee's thread"); + tot_res = Consts.TEST_FAILED; + return quitDebuggee(); + } + log.display("Waiting for debuggee's thread suspension ..."); Thread.currentThread().sleep(1000); - } catch(InterruptedException ie) { - log.complain("TEST FAILED: caught: " + ie); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); } - } // Check the tested assersion - try { findObjRefs(DEBUGGEE_LOCALVAR); rType[0] = objRef[0].referenceType(); rType[1] = objRef[1].referenceType(); diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/setValue/setvalue003.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/setValue/setvalue003.java index 4fbe110ca962..8bb08f43c2e2 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/setValue/setvalue003.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/setValue/setvalue003.java @@ -142,36 +142,29 @@ private int runIt(String args[], PrintStream out) { return quitDebuggee(); } - ReferenceType debuggeeClass = debuggee.classByName(DEBUGGEE_CLASS); // debuggee main class + try { + ReferenceType debuggeeClass = debuggee.classByName(DEBUGGEE_CLASS); // debuggee main class - thrRef = debuggee.threadByFieldName(debuggeeClass, "testThread", DEBUGGEE_THRNAME); - if (thrRef == null) { - log.complain("TEST FAILURE: Method Debugee.threadByFieldName() returned null for debuggee's thread " - + DEBUGGEE_THRNAME); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); - } - thrRef.suspend(); - while(!thrRef.isSuspended()) { - num++; - if (num > ATTEMPTS) { - log.complain("TEST FAILED: Unable to suspend debuggee's thread"); + thrRef = debuggee.threadByFieldName(debuggeeClass, "testThread", DEBUGGEE_THRNAME); + if (thrRef == null) { + log.complain("TEST FAILURE: Method Debugee.threadByFieldName() returned null for debuggee's thread " + + DEBUGGEE_THRNAME); tot_res = Consts.TEST_FAILED; return quitDebuggee(); } - log.display("Waiting for debuggee's thread suspension ..."); - try { + thrRef.suspend(); + while (!thrRef.isSuspended()) { + num++; + if (num > ATTEMPTS) { + log.complain("TEST FAILED: Unable to suspend debuggee's thread"); + tot_res = Consts.TEST_FAILED; + return quitDebuggee(); + } + log.display("Waiting for debuggee's thread suspension ..."); Thread.sleep(1000); - } catch(InterruptedException ie) { - ie.printStackTrace(); - log.complain("TEST FAILED: caught: " + ie); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); - } } // Check the tested assertion - try { objRef = findObjRef(DEBUGGEE_LOCALVAR); rType = objRef.referenceType(); diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/setValue/setvalue004.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/setValue/setvalue004.java index 0eed84859eb1..1928e965e328 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/setValue/setvalue004.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/setValue/setvalue004.java @@ -122,36 +122,29 @@ private int runIt(String args[], PrintStream out) { return quitDebuggee(); } - ReferenceType debuggeeClass = debuggee.classByName(DEBUGGEE_CLASS); // debuggee main class + try { + ReferenceType debuggeeClass = debuggee.classByName(DEBUGGEE_CLASS); // debuggee main class - thrRef = debuggee.threadByFieldName(debuggeeClass, "testThread", DEBUGGEE_THRNAME); - if (thrRef == null) { - log.complain("TEST FAILURE: Method Debugee.threadByFieldName() returned null for debuggee's thread " - + DEBUGGEE_THRNAME); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); - } - thrRef.suspend(); - while(!thrRef.isSuspended()) { - num++; - if (num > ATTEMPTS) { - log.complain("TEST FAILED: Unable to suspend debuggee's thread"); + thrRef = debuggee.threadByFieldName(debuggeeClass, "testThread", DEBUGGEE_THRNAME); + if (thrRef == null) { + log.complain("TEST FAILURE: Method Debugee.threadByFieldName() returned null for debuggee's thread " + + DEBUGGEE_THRNAME); tot_res = Consts.TEST_FAILED; return quitDebuggee(); } - log.display("Waiting for debuggee's thread suspension ..."); - try { + thrRef.suspend(); + while(!thrRef.isSuspended()) { + num++; + if (num > ATTEMPTS) { + log.complain("TEST FAILED: Unable to suspend debuggee's thread"); + tot_res = Consts.TEST_FAILED; + return quitDebuggee(); + } + log.display("Waiting for debuggee's thread suspension ..."); Thread.currentThread().sleep(1000); - } catch(InterruptedException ie) { - ie.printStackTrace(); - log.complain("TEST FAILED: caught: " + ie); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); } - } // Check the tested assersion - try { objRef = findObjRef(DEBUGGEE_LOCALVAR); rType = objRef.referenceType(); diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/setValue/setvalue005.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/setValue/setvalue005.java index b77ea99979d1..25e1f0c37b6b 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/setValue/setvalue005.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ObjectReference/setValue/setvalue005.java @@ -109,37 +109,30 @@ private int runIt(String args[], PrintStream out) { return quitDebuggee(); } - ReferenceType debuggeeClass = debuggee.classByName(DEBUGGEE_CLASS); // debuggee main class + try { + ReferenceType debuggeeClass = debuggee.classByName(DEBUGGEE_CLASS); // debuggee main class - thrRef = debuggee.threadByFieldName(debuggeeClass, "testThread", DEBUGGEE_THRNAME); - if (thrRef == null) { - log.complain("TEST FAILURE: Method Debugee.threadByFieldName() returned null for debuggee thread " - + DEBUGGEE_THRNAME); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); - } - thrRef.suspend(); - while(!thrRef.isSuspended()) { - num++; - if (num > ATTEMPTS) { - log.complain("TEST FAILED: Unable to suspend debuggee thread after " - + ATTEMPTS + " attempts"); + thrRef = debuggee.threadByFieldName(debuggeeClass, "testThread", DEBUGGEE_THRNAME); + if (thrRef == null) { + log.complain("TEST FAILURE: Method Debugee.threadByFieldName() returned null for debuggee thread " + + DEBUGGEE_THRNAME); tot_res = Consts.TEST_FAILED; return quitDebuggee(); } - log.display("Waiting for debuggee thread suspension ..."); - try { + thrRef.suspend(); + while(!thrRef.isSuspended()) { + num++; + if (num > ATTEMPTS) { + log.complain("TEST FAILED: Unable to suspend debuggee thread after " + + ATTEMPTS + " attempts"); + tot_res = Consts.TEST_FAILED; + return quitDebuggee(); + } + log.display("Waiting for debuggee thread suspension ..."); Thread.currentThread().sleep(1000); - } catch(InterruptedException ie) { - ie.printStackTrace(); - log.complain("TEST FAILED: caught: " + ie); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); } - } // Check the tested assersion - try { objRef = findObjRef(DEBUGGEE_LOCALVAR); rType = objRef.referenceType(); diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/StackFrame/setValue/setvalue005/setvalue005.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/StackFrame/setValue/setvalue005/setvalue005.java index 3b8a49ac5d1a..dd071f2e0878 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/StackFrame/setValue/setvalue005/setvalue005.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/StackFrame/setValue/setvalue005/setvalue005.java @@ -156,19 +156,19 @@ private int runIt(String args[], PrintStream out) { return quitDebuggee(); } - // debuggee main class - ReferenceType rType = debuggee.classByName(DEBUGGEE_CLASS); - - ThreadReference thrRef = - debuggee.threadByFieldName(rType, "mainThread", DEBUGGEE_THRDNAME); - if (thrRef == null) { - log.complain("TEST FAILURE: method Debugee.threadByFieldName() returned null for debuggee thread " - + DEBUGGEE_THRDNAME); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); - } - try { + // debuggee main class + ReferenceType rType = debuggee.classByName(DEBUGGEE_CLASS); + + ThreadReference thrRef = + debuggee.threadByFieldName(rType, "mainThread", DEBUGGEE_THRDNAME); + if (thrRef == null) { + log.complain("TEST FAILURE: method Debugee.threadByFieldName() returned null for debuggee thread " + + DEBUGGEE_THRDNAME); + tot_res = Consts.TEST_FAILED; + return quitDebuggee(); + } + suspendAtBP(rType, DEBUGGEE_STOPATLINE); // find a stack frame which belongs to the "setvalue005tMainThr" thread diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/ownedMonitors/ownedmonitors002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/ownedMonitors/ownedmonitors002.java index 068670202c5f..a77c153ab5d7 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/ownedMonitors/ownedmonitors002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/ownedMonitors/ownedmonitors002.java @@ -91,41 +91,34 @@ private int runIt(String args[], PrintStream out) { return quitDebuggee(); } - // debuggee main class - ReferenceType rType = debuggee.classByName(DEBUGGEE_CLASS); - - ThreadReference thrRef = - debuggee.threadByFieldName(rType, "testThread", DEBUGGEE_THRNAME); - if (thrRef == null) { - log.complain("TEST FAILURE: method Debugee.threadByFieldName() returned null for debuggee thread " - + DEBUGGEE_THRNAME); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); - } - - int num = 0; - thrRef.suspend(); - while(!thrRef.isSuspended()) { - num++; - if (num > ATTEMPTS) { - log.complain("TEST FAILURE: Unable to suspend debuggee thread after " - + ATTEMPTS + " attempts"); + try { + // debuggee main class + ReferenceType rType = debuggee.classByName(DEBUGGEE_CLASS); + + ThreadReference thrRef = + debuggee.threadByFieldName(rType, "testThread", DEBUGGEE_THRNAME); + if (thrRef == null) { + log.complain("TEST FAILURE: method Debugee.threadByFieldName() returned null for debuggee thread " + + DEBUGGEE_THRNAME); tot_res = Consts.TEST_FAILED; return quitDebuggee(); } - log.display("Waiting for debuggee thread suspension ..."); - try { + + int num = 0; + thrRef.suspend(); + while(!thrRef.isSuspended()) { + num++; + if (num > ATTEMPTS) { + log.complain("TEST FAILURE: Unable to suspend debuggee thread after " + + ATTEMPTS + " attempts"); + tot_res = Consts.TEST_FAILED; + return quitDebuggee(); + } + log.display("Waiting for debuggee thread suspension ..."); Thread.currentThread().sleep(DELAY); - } catch(InterruptedException ie) { - ie.printStackTrace(); - log.complain("TEST FAILURE: caught: " + ie); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); } - } // Check the tested assersion - try { List mons = thrRef.ownedMonitors(); if (vm.canGetOwnedMonitorInfo()) { log.display("CHECK PASSED: got a List of monitors owned by the thread," diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes006.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes006.java index ed60d3abe53a..fe0543fe11f0 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes006.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes006.java @@ -106,20 +106,20 @@ private int runIt(String args[], PrintStream out) { return quitDebuggee(); } - // debuggee main class - ReferenceType rType = debuggee.classByName(DEBUGGEE_CLASS); - - ThreadReference thrRef = - debuggee.threadByFieldName(rType, "testThread", DEBUGGEE_THRNAME); - if (thrRef == null) { - log.complain("TEST FAILURE: method Debugee.threadByFieldName() returned null for debuggee thread " - + DEBUGGEE_THRNAME); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); - } - Field doExit = null; try { + // debuggee main class + ReferenceType rType = debuggee.classByName(DEBUGGEE_CLASS); + + ThreadReference thrRef = + debuggee.threadByFieldName(rType, "testThread", DEBUGGEE_THRNAME); + if (thrRef == null) { + log.complain("TEST FAILURE: method Debugee.threadByFieldName() returned null for debuggee thread " + + DEBUGGEE_THRNAME); + tot_res = Consts.TEST_FAILED; + return quitDebuggee(); + } + suspendAtBP(rType, DEBUGGEE_STOPATLINE); // debuggee field used to indicate that popping has been done diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes007.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes007.java index 350b89ef4b6e..df086449befc 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes007.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/popFrames/popframes007.java @@ -106,29 +106,29 @@ private int runIt(String args[], PrintStream out) { return quitDebuggee(); } - // debuggee main class - ReferenceType rType = debuggee.classByName(DEBUGGEE_CLASS); - - ThreadReference mainThread = - debuggee.threadByFieldName(rType, "mainThread", DEBUGGEE_MAIN_THREAD_NAME); - if (mainThread == null) { - log.complain("TEST FAILURE: method Debugee.threadByFieldName() returned null for debuggee thread " - + DEBUGGEE_MAIN_THREAD_NAME); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); - } - - ThreadReference auxThread = - debuggee.threadByFieldName(rType, "auxThr", DEBUGGEE_AUX_THREAD_NAME); - if (auxThread == null) { - log.complain("TEST FAILURE: method Debugee.threadByFieldName() returned null for debuggee thread " - + DEBUGGEE_AUX_THREAD_NAME); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); - } - Field doExit = null; try { + // debuggee main class + ReferenceType rType = debuggee.classByName(DEBUGGEE_CLASS); + + ThreadReference mainThread = + debuggee.threadByFieldName(rType, "mainThread", DEBUGGEE_MAIN_THREAD_NAME); + if (mainThread == null) { + log.complain("TEST FAILURE: method Debugee.threadByFieldName() returned null for debuggee thread " + + DEBUGGEE_MAIN_THREAD_NAME); + tot_res = Consts.TEST_FAILED; + return quitDebuggee(); + } + + ThreadReference auxThread = + debuggee.threadByFieldName(rType, "auxThr", DEBUGGEE_AUX_THREAD_NAME); + if (auxThread == null) { + log.complain("TEST FAILURE: method Debugee.threadByFieldName() returned null for debuggee thread " + + DEBUGGEE_AUX_THREAD_NAME); + tot_res = Consts.TEST_FAILED; + return quitDebuggee(); + } + suspendAtBP(rType, DEBUGGEE_STOPATLINE); // debuggee field used to indicate that popping has been done diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/stop/stop002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/stop/stop002.java index fcf38c5c5ab8..02a87d9c42b4 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/stop/stop002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/stop/stop002.java @@ -115,22 +115,23 @@ private int runIt(String args[], PrintStream out) { return quitDebuggee(); } - // debuggee main class - mainClass = debuggee.classByName(DEBUGGEE_CLASS); - - ThreadReference thrRef = debuggee.threadByFieldName(mainClass, "testThread", DEBUGGEE_THRNAME); - if (thrRef == null) { - log.complain("TEST FAILURE: method Debugee.threadByFieldName() returned null for debuggee thread " - + DEBUGGEE_THRNAME); - tot_res = Consts.TEST_FAILED; - return quitDebuggee(); - } - Field stopLoop1 = null; Field stopLoop2 = null; ObjectReference objRef = null; ObjectReference throwableRef = null; + try { + // debuggee main class + mainClass = debuggee.classByName(DEBUGGEE_CLASS); + + ThreadReference thrRef = debuggee.threadByFieldName(mainClass, "testThread", DEBUGGEE_THRNAME); + if (thrRef == null) { + log.complain("TEST FAILURE: method Debugee.threadByFieldName() returned null for debuggee thread " + + DEBUGGEE_THRNAME); + tot_res = Consts.TEST_FAILED; + return quitDebuggee(); + } + suspendAtBP(mainClass, DEBUGGEE_STOPATLINE); objRef = findObjRef(thrRef, DEBUGGEE_NON_THROWABLE_VAR); throwableRef = findObjRef(thrRef, DEBUGGEE_THROWABLE_VAR); From 4b9935ea544bb69c819aa86b33e5ac8c6462f567 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Wed, 5 Nov 2025 09:45:43 +0000 Subject: [PATCH 274/323] 8358679: [asan] vmTestbase/nsk/jvmti tests show memory issues Backport-of: 2300a212dd135f1f01604c5c2915653a3f3bd869 --- .../RawMonitorEnter/rawmonenter003/TestDescription.java | 5 ++++- .../jvmti/RawMonitorExit/rawmonexit003/TestDescription.java | 5 ++++- .../RawMonitorNotify/rawmnntfy003/TestDescription.java | 5 ++++- .../rawmnntfyall003/TestDescription.java | 5 ++++- .../jvmti/RawMonitorWait/rawmnwait003/TestDescription.java | 5 ++++- .../nsk/jvmti/scenarios/events/EM07/em07t002/em07t002.cpp | 6 +----- 6 files changed, 21 insertions(+), 10 deletions(-) diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RawMonitorEnter/rawmonenter003/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RawMonitorEnter/rawmonenter003/TestDescription.java index 3120d355679d..e743efe83cb2 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RawMonitorEnter/rawmonenter003/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RawMonitorEnter/rawmonenter003/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, 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 @@ -37,6 +37,9 @@ * 4431533: TEST_BUG: destroyed raw monitor can be occasionally valid * Ported from JVMDI. * + * @comment The test intentionally passes a bad argument to the function to verify error checking, + which causes a false positive from the ASAN lib + * @requires !vm.asan * @library /vmTestbase * /test/lib * @run main/othervm/native -agentlib:rawmonenter003 nsk.jvmti.RawMonitorEnter.rawmonenter003 diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RawMonitorExit/rawmonexit003/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RawMonitorExit/rawmonexit003/TestDescription.java index d7feb7652933..5d0753e95f20 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RawMonitorExit/rawmonexit003/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RawMonitorExit/rawmonexit003/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, 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 @@ -37,6 +37,9 @@ * 4431533: TEST_BUG: destroyed raw monitor can be occasionally valid * Ported from JVMDI. * + * @comment The test intentionally passes a bad argument to the function to verify error checking, + which causes a false positive from the ASAN lib + * @requires !vm.asan * @library /vmTestbase * /test/lib * @run main/othervm/native -agentlib:rawmonexit003 nsk.jvmti.RawMonitorExit.rawmonexit003 diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RawMonitorNotify/rawmnntfy003/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RawMonitorNotify/rawmnntfy003/TestDescription.java index a95d3da890f8..d83f338a49f4 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RawMonitorNotify/rawmnntfy003/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RawMonitorNotify/rawmnntfy003/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, 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 @@ -37,6 +37,9 @@ * 4431533: TEST_BUG: destroyed raw monitor can be occasionally valid * Ported from JVMDI. * + * @comment The test intentionally passes a bad argument to the function to verify error checking, + which causes a false positive from the ASAN lib + * @requires !vm.asan * @library /vmTestbase * /test/lib * @run main/othervm/native -agentlib:rawmnntfy003 nsk.jvmti.RawMonitorNotify.rawmnntfy003 diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RawMonitorNotifyAll/rawmnntfyall003/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RawMonitorNotifyAll/rawmnntfyall003/TestDescription.java index 2f706b0c2995..8c5fd95ea864 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RawMonitorNotifyAll/rawmnntfyall003/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RawMonitorNotifyAll/rawmnntfyall003/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, 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 @@ -37,6 +37,9 @@ * 4431533: TEST_BUG: destroyed raw monitor can be occasionally valid * Ported from JVMDI. * + * @comment The test intentionally passes a bad argument to the function to verify error checking, + which causes a false positive from the ASAN lib + * @requires !vm.asan * @library /vmTestbase * /test/lib * @run main/othervm/native -agentlib:rawmnntfyall003 nsk.jvmti.RawMonitorNotifyAll.rawmnntfyall003 diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RawMonitorWait/rawmnwait003/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RawMonitorWait/rawmnwait003/TestDescription.java index 8291f168ada1..aab0b8d9e21e 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RawMonitorWait/rawmnwait003/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RawMonitorWait/rawmnwait003/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, 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 @@ -37,6 +37,9 @@ * 4431533: TEST_BUG: destroyed raw monitor can be occasionally valid * Ported from JVMDI. * + * @comment The test intentionally passes a bad argument to the function to verify error checking, + which causes a false positive from the ASAN lib + * @requires !vm.asan * @library /vmTestbase * /test/lib * @run main/othervm/native -agentlib:rawmnwait003 nsk.jvmti.RawMonitorWait.rawmnwait003 diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM07/em07t002/em07t002.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM07/em07t002/em07t002.cpp index 86d5f5de9f74..9a402a17edad 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM07/em07t002/em07t002.cpp +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM07/em07t002/em07t002.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2025, 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 @@ -237,10 +237,6 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* agentJNI, void* arg) { } jvmti->RawMonitorExit(syncLock); - - if (!NSK_JVMTI_VERIFY(jvmti->DestroyRawMonitor(syncLock))) - nsk_jvmti_setFailStatus(); - } /* ============================================================================= */ From e25a2f65650453adae017d1f1d3e5d9349472060 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Wed, 5 Nov 2025 09:47:59 +0000 Subject: [PATCH 275/323] 8369319: java/net/httpclient/CancelRequestTest.java fails intermittently Backport-of: 21e63914e687cb122fad0e88924c59eb16c3ba61 --- test/jdk/java/net/httpclient/CancelRequestTest.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/test/jdk/java/net/httpclient/CancelRequestTest.java b/test/jdk/java/net/httpclient/CancelRequestTest.java index 7851b1124983..e2ffe905d388 100644 --- a/test/jdk/java/net/httpclient/CancelRequestTest.java +++ b/test/jdk/java/net/httpclient/CancelRequestTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, 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,8 +273,12 @@ HttpClient newHttpClient(boolean share) { // rewrap in "Request Cancelled" when the multi exchange was aborted... private static boolean isCancelled(Throwable t) { while (t instanceof ExecutionException) t = t.getCause(); - if (t instanceof CancellationException) return true; - if (t instanceof IOException) return String.valueOf(t).contains("Request cancelled"); + Throwable cause = t; + while (cause != null) { + if (cause instanceof CancellationException) return true; + if (cause instanceof IOException && String.valueOf(cause).contains("Request cancelled")) return true; + cause = cause.getCause(); + } out.println("Not a cancellation exception: " + t); t.printStackTrace(out); return false; From fddd9f96057ff0abd3f777eea7060a232d922a67 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Wed, 5 Nov 2025 18:34:35 +0000 Subject: [PATCH 276/323] 8352687: Opensource few JInternalFrame and JTextField tests Backport-of: f955a8cbd2d1233af7f7e4b4e4bfcdbb5a8cacae --- .../swing/JInternalFrame/bug4190516.java | 75 +++++++++++ .../swing/JInternalFrame/bug4242045.java | 123 ++++++++++++++++++ .../javax/swing/JTextField/bug4232716.java | 81 ++++++++++++ .../javax/swing/JTextField/bug5027332.java | 70 ++++++++++ 4 files changed, 349 insertions(+) create mode 100644 test/jdk/javax/swing/JInternalFrame/bug4190516.java create mode 100644 test/jdk/javax/swing/JInternalFrame/bug4242045.java create mode 100644 test/jdk/javax/swing/JTextField/bug4232716.java create mode 100644 test/jdk/javax/swing/JTextField/bug5027332.java diff --git a/test/jdk/javax/swing/JInternalFrame/bug4190516.java b/test/jdk/javax/swing/JInternalFrame/bug4190516.java new file mode 100644 index 000000000000..e9a44e4b0c6f --- /dev/null +++ b/test/jdk/javax/swing/JInternalFrame/bug4190516.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2000, 2025, 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 4190516 + * @summary JInternalFrame should be maximized when Desktop resized + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4190516 + */ + +import javax.swing.JDesktopPane; +import javax.swing.JFrame; +import javax.swing.JInternalFrame; +import javax.swing.SwingUtilities; + +public class bug4190516 { + + private static final String INSTRUCTIONS = """ + Try to resize frame "bug4190516 Frame". + If the internal frame remains maximized + inside this frame then test passes, else test fails."""; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .title("bug4190516 Instructions") + .instructions(INSTRUCTIONS) + .columns(25) + .testUI(bug4190516::createTestUI) + .build() + .awaitAndCheck(); + } + + private static JFrame createTestUI() { + JFrame fr = new JFrame("bug4190516 Frame"); + JDesktopPane jdp = new JDesktopPane(); + fr.getContentPane().add(jdp); + + JInternalFrame jif = new JInternalFrame("Title", true, true, true, true); + jdp.add(jif); + jif.setSize(150, 150); + jif.setVisible(true); + + fr.setSize(300, 200); + try { + jif.setMaximum(true); + } catch (Exception e) { + throw new RuntimeException(e); + } + + SwingUtilities.updateComponentTreeUI(fr); + return fr; + } +} diff --git a/test/jdk/javax/swing/JInternalFrame/bug4242045.java b/test/jdk/javax/swing/JInternalFrame/bug4242045.java new file mode 100644 index 000000000000..5f812da1da50 --- /dev/null +++ b/test/jdk/javax/swing/JInternalFrame/bug4242045.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2000, 2025, 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 4242045 + * @requires (os.family == "windows") + * @summary JInternalFrame titlepane icons should be restored after attribute change + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4242045 + */ + +import java.awt.BorderLayout; +import java.awt.event.ActionEvent; + +import javax.swing.JButton; +import javax.swing.JDesktopPane; +import javax.swing.JFrame; +import javax.swing.JInternalFrame; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +public class bug4242045 { + + private static JFrame frame; + + private static final String INSTRUCTIONS = """ + Add and remove iconify/maximize/close buttons using the buttons + "Iconifiable", "Maximizable", "Closable" under different LookAndFeels. + If they appears and disappears correctly then test passes. If any + button does not appear or disappear as expected or appear with incorrect + placement then test fails."""; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .title("bug4242045 Instructions") + .instructions(INSTRUCTIONS) + .columns(35) + .testUI(bug4242045::createTestUI) + .build() + .awaitAndCheck(); + } + + private static void setLF(ActionEvent e) { + try { + UIManager.setLookAndFeel(((JButton)e.getSource()).getActionCommand()); + SwingUtilities.updateComponentTreeUI(frame); + } catch (ClassNotFoundException | InstantiationException + | UnsupportedLookAndFeelException + | IllegalAccessException ex) { + throw new RuntimeException(ex); + } + } + + private static JFrame createTestUI() { + + frame = new JFrame("bug4242045"); + JDesktopPane jdp = new JDesktopPane(); + JInternalFrame jif = new JInternalFrame("Test", true); + frame.add(jdp); + + jdp.add(jif); + jif.setSize(150, 150); + jif.setVisible(true); + + JPanel p = new JPanel(); + + JButton metal = new JButton("Metal"); + metal.setActionCommand("javax.swing.plaf.metal.MetalLookAndFeel"); + metal.addActionListener((ActionEvent e) -> setLF(e)); + p.add(metal); + + JButton windows = new JButton("Windows"); + windows.setActionCommand("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); + windows.addActionListener((ActionEvent e) -> setLF(e)); + p.add(windows); + + JButton motif = new JButton("Motif"); + motif.setActionCommand("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); + motif.addActionListener((ActionEvent e) -> setLF(e)); + p.add(motif); + + JButton clo = new JButton("Closable"); + clo.addActionListener(e -> jif.setClosable(!jif.isClosable())); + p.add(clo); + + JButton ico = new JButton("Iconifiable"); + ico.addActionListener(e -> jif.setIconifiable(!jif.isIconifiable())); + p.add(ico); + + JButton max = new JButton("Maximizable"); + max.addActionListener(e -> jif.setMaximizable(!jif.isMaximizable())); + p.add(max); + + frame.add(p, BorderLayout.SOUTH); + frame.setSize(650, 250); + return frame; + } + +} diff --git a/test/jdk/javax/swing/JTextField/bug4232716.java b/test/jdk/javax/swing/JTextField/bug4232716.java new file mode 100644 index 000000000000..b4fc902f6239 --- /dev/null +++ b/test/jdk/javax/swing/JTextField/bug4232716.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 1999, 2025, 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 4232716 + * @key headful + * @summary Tests if creates a maximized JTextField + * @run main bug4232716 + */ + +import java.awt.Component; +import java.awt.Container; +import java.awt.Robot; +import javax.swing.JEditorPane; +import javax.swing.JFrame; +import javax.swing.JTextField; +import javax.swing.SwingUtilities; + +public class bug4232716 { + + private static JFrame frame; + private static JEditorPane e; + + public static void main(String[] args) throws Exception { + Robot robot = new Robot(); + try { + SwingUtilities.invokeAndWait(() -> { + frame = new JFrame("bug4232716"); + String html =" Test " + + "
          " + + "
          "; + e = new JEditorPane("text/html", html); + e.setEditable(false); + frame.add(e); + frame.setSize(400, 300); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + }); + robot.waitForIdle(); + robot.delay(1000); + + Container c = (Container)e.getComponent(0); + Component swingComponent = c.getComponent(0); + System.out.println(swingComponent); + if (swingComponent instanceof JTextField tf) { + System.out.println(tf.getWidth()); + System.out.println(frame.getWidth()); + if (swingComponent.getWidth() > (frame.getWidth() * 0.75)) { + throw new RuntimeException("textfield width almost same as frame width"); + } + } + } finally { + SwingUtilities.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + } +} diff --git a/test/jdk/javax/swing/JTextField/bug5027332.java b/test/jdk/javax/swing/JTextField/bug5027332.java new file mode 100644 index 000000000000..2d9cd777d9b5 --- /dev/null +++ b/test/jdk/javax/swing/JTextField/bug5027332.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2004, 2025, 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 5027332 + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @summary Tests that textfield caret is placed slightly off textfield borders + * @run main/manual bug5027332 + */ + +import java.awt.BorderLayout; + +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.UIManager; + +public class bug5027332 { + + private static final String INSTRUCTIONS = """ + Click into the text field so that caret appears inside. + The caret should be placed slightly off text field borders, + so that it can be easily distinguished from the border. + Test fails if the caret touches the border."""; + + public static void main(String[] args) throws Exception { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + + PassFailJFrame.builder() + .title("bug5027332 Instructions") + .instructions(INSTRUCTIONS) + .rows(6) + .columns(35) + .testUI(bug5027332::createTestUI) + .build() + .awaitAndCheck(); + } + + private static JFrame createTestUI() { + JFrame frame = new JFrame("bug5027332"); + JTextField t = new JTextField(10); + JPanel p = new JPanel(); + p.add(t, BorderLayout.CENTER); + frame.setContentPane(p); + frame.pack(); + return frame; + } +} From f073d731443086206c5bbe5e2a6c9f5c203ef5c6 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Wed, 5 Nov 2025 18:35:07 +0000 Subject: [PATCH 277/323] 8352905: Open some JComboBox bugs 1 Backport-of: a55ccd267cdfbb7a52c0647fa3b2f93b36b1805f --- .../jdk/javax/swing/JComboBox/bug4166593.java | 98 ++++++++++++ .../jdk/javax/swing/JComboBox/bug4180054.java | 112 +++++++++++++ .../jdk/javax/swing/JComboBox/bug4530952.java | 147 ++++++++++++++++++ .../jdk/javax/swing/JComboBox/bug4530953.java | 98 ++++++++++++ 4 files changed, 455 insertions(+) create mode 100644 test/jdk/javax/swing/JComboBox/bug4166593.java create mode 100644 test/jdk/javax/swing/JComboBox/bug4180054.java create mode 100644 test/jdk/javax/swing/JComboBox/bug4530952.java create mode 100644 test/jdk/javax/swing/JComboBox/bug4530953.java diff --git a/test/jdk/javax/swing/JComboBox/bug4166593.java b/test/jdk/javax/swing/JComboBox/bug4166593.java new file mode 100644 index 000000000000..850aab2261f9 --- /dev/null +++ b/test/jdk/javax/swing/JComboBox/bug4166593.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 1998, 2025, 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.awt.Robot; +import java.awt.event.ActionListener; +import javax.swing.JComboBox; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; + +/* + * @test + * @bug 4166593 + * @summary Tests that JComboBox fires action events every time the user does an action + * @key headful + * @run main bug4166593 + */ + +public class bug4166593 { + static JFrame frame; + static JComboBox comboBox; + static volatile int numberOfActionEvents = 0; + + public static void main(String[] args) throws Exception { + try { + Robot robot = new Robot(); + SwingUtilities.invokeAndWait(() -> createTestUI()); + robot.waitForIdle(); + robot.delay(250); + + // change selected index 3 times + SwingUtilities.invokeAndWait(() -> { + comboBox.setSelectedIndex(1); + comboBox.setSelectedIndex(3); + comboBox.setSelectedIndex(2); + }); + robot.waitForIdle(); + robot.delay(250); + + if (numberOfActionEvents != 3) { + throw new RuntimeException("Unexpected number of Action Events!\n" + + "Expected: 3\nActual: " + numberOfActionEvents); + } + } finally { + SwingUtilities.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + } + + public static void createTestUI() { + comboBox = new JComboBox(new Object[]{ + "Bob", "Fred", "Hank", "Joe", "Mildred", "Agatha", "Buffy" + }); + JPanel panel = new JPanel(); + JLabel label = new JLabel("0"); + frame = new JFrame("bug4166593"); + comboBox.setEditable(true); + + ActionListener actionCounter = e -> { + ++numberOfActionEvents; + label.setText(Integer.toString(numberOfActionEvents)); + }; + + comboBox.addActionListener(actionCounter); + + panel.add(comboBox); + panel.add(label); + + frame.add(panel); + frame.pack(); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } +} diff --git a/test/jdk/javax/swing/JComboBox/bug4180054.java b/test/jdk/javax/swing/JComboBox/bug4180054.java new file mode 100644 index 000000000000..cee68dfcb9ce --- /dev/null +++ b/test/jdk/javax/swing/JComboBox/bug4180054.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 1998, 2025, 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.awt.Robot; +import javax.swing.DefaultComboBoxModel; +import javax.swing.JComboBox; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; +import javax.swing.event.ListDataEvent; +import javax.swing.event.ListDataListener; + +/* + * @test + * @bug 4180054 + * @summary Tests that DefaultComboBoxModel doesn't fire a "contents changed" unnecessarily + * @key headful + * @run main bug4180054 + */ + +public class bug4180054 { + static JFrame frame; + static JComboBox comboBox; + static volatile int numberOfContentsChangedEvents = 0; + + public static void main(String[] args) throws Exception { + try { + Robot robot = new Robot(); + SwingUtilities.invokeAndWait(() -> createTestUI()); + robot.waitForIdle(); + robot.delay(250); + + // change selected index 3 times + SwingUtilities.invokeAndWait(() -> { + comboBox.setSelectedIndex(1); + comboBox.setSelectedIndex(3); + comboBox.setSelectedIndex(2); + comboBox.setSelectedIndex(2); + }); + robot.waitForIdle(); + robot.delay(250); + + if (numberOfContentsChangedEvents != 3) { + throw new RuntimeException("Unexpected number of Contents Changed Events!\n" + + "Expected: 3\nActual: " + numberOfContentsChangedEvents); + } + } finally { + SwingUtilities.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + } + + public static void createTestUI() { + frame = new JFrame("bug4180054"); + JPanel panel = new JPanel(); + JLabel label = new JLabel("0"); + + DefaultComboBoxModel model = new DefaultComboBoxModel(); + for (int i = 0; i < 100; ++i) { + model.addElement(Integer.toString(i)); + } + comboBox = new JComboBox(model); + comboBox.setEditable(true); + + ListDataListener contentsCounter = new ListDataListener() { + public void contentsChanged(ListDataEvent e) { + ++numberOfContentsChangedEvents; + label.setText(Integer.toString(numberOfContentsChangedEvents)); + } + + public void intervalAdded(ListDataEvent e) { + } + + public void intervalRemoved(ListDataEvent e) { + } + }; + + comboBox.getModel().addListDataListener(contentsCounter); + + panel.add(comboBox); + panel.add(label); + + frame.add(panel); + frame.pack(); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } +} diff --git a/test/jdk/javax/swing/JComboBox/bug4530952.java b/test/jdk/javax/swing/JComboBox/bug4530952.java new file mode 100644 index 000000000000..cf960d64c9a9 --- /dev/null +++ b/test/jdk/javax/swing/JComboBox/bug4530952.java @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2001, 2025, 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.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Point; +import java.awt.Robot; +import java.awt.event.ActionListener; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JFrame; +import javax.swing.JTextField; +import javax.swing.SwingUtilities; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + +/* + * @test + * @bug 4530952 + * @summary Tests that double mouse clicks invoke Event + * @key headful + * @run main bug4530952 + */ + +public class bug4530952 { + static JFrame frame; + static JButton btnAction; + static JComboBox cmbAction; + static volatile Point loc; + static volatile Dimension btnSize; + + private static volatile boolean flag; + + public static void main(String[] args) throws Exception { + try { + Robot robot = new Robot(); + SwingUtilities.invokeAndWait(() -> createTestUI()); + robot.waitForIdle(); + robot.delay(1000); + + // enter some text in combo box + robot.keyPress(KeyEvent.VK_A); + robot.keyRelease(KeyEvent.VK_A); + robot.keyPress(KeyEvent.VK_A); + robot.keyRelease(KeyEvent.VK_A); + robot.waitForIdle(); + robot.delay(250); + + // find and click action button + SwingUtilities.invokeAndWait(() -> { + loc = btnAction.getLocationOnScreen(); + btnSize = btnAction.getSize(); + }); + robot.waitForIdle(); + robot.delay(250); + + robot.mouseMove(loc.x + btnSize.width / 2, + loc.y + btnSize.height / 2); + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + robot.waitForIdle(); + robot.delay(1000); + + if (!flag) { + throw new RuntimeException("Failed: button action was not fired"); + } + } finally { + SwingUtilities.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + } + + public static void createTestUI() { + frame = new JFrame("bug4530952"); + frame.setLayout(new FlowLayout()); + + btnAction = new JButton("Action"); + cmbAction = new JComboBox(); + + flag = false; + + ActionListener al = e -> flag = true; + DocumentListener dl = new DocumentListener() { + @Override + public void changedUpdate(DocumentEvent evt) { + resetButtons(); + } + + @Override + public void insertUpdate(DocumentEvent evt) { + resetButtons(); + } + + @Override + public void removeUpdate(DocumentEvent evt) { + resetButtons(); + } + }; + + // Add an editable combo box + cmbAction.setEditable(true); + frame.add(cmbAction); + + btnAction.setEnabled(false); + frame.add(btnAction); + + btnAction.addActionListener(al); + ((JTextField) cmbAction.getEditor().getEditorComponent()). + getDocument().addDocumentListener(dl); + frame.pack(); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } + + public static void resetButtons() { + int length = ((JTextField) cmbAction.getEditor().getEditorComponent()). + getDocument().getLength(); + btnAction.setEnabled(length > 0); + } +} diff --git a/test/jdk/javax/swing/JComboBox/bug4530953.java b/test/jdk/javax/swing/JComboBox/bug4530953.java new file mode 100644 index 000000000000..a9f0c70b9bc2 --- /dev/null +++ b/test/jdk/javax/swing/JComboBox/bug4530953.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2001, 2025, 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.awt.FlowLayout; +import java.awt.Robot; +import java.awt.event.KeyEvent; +import javax.swing.JComboBox; +import javax.swing.JFrame; +import javax.swing.SwingUtilities; + +/* + * @test + * @bug 4530953 + * @summary Tests that highlighted Item appears after automatically scrolling to the item + * @key headful + * @run main bug4530953 + */ + +public class bug4530953 { + static JFrame frame; + static JComboBox combo; + static String[] data = {"Apple", "Orange", "Cherry"}; + + public static void main(String[] args) throws Exception { + try { + Robot robot = new Robot(); + SwingUtilities.invokeAndWait(() -> createTestUI()); + robot.waitForIdle(); + robot.delay(250); + + // enter some text in combo box editor + robot.keyPress(KeyEvent.VK_A); + robot.keyRelease(KeyEvent.VK_A); + robot.keyPress(KeyEvent.VK_A); + robot.keyRelease(KeyEvent.VK_A); + robot.keyPress(KeyEvent.VK_ENTER); + robot.keyRelease(KeyEvent.VK_ENTER); + robot.waitForIdle(); + robot.delay(250); + + // select orange in combo box + robot.keyPress(KeyEvent.VK_DOWN); + robot.keyRelease(KeyEvent.VK_DOWN); + robot.keyPress(KeyEvent.VK_DOWN); + robot.keyRelease(KeyEvent.VK_DOWN); + robot.keyPress(KeyEvent.VK_DOWN); + robot.keyRelease(KeyEvent.VK_DOWN); + robot.keyPress(KeyEvent.VK_ENTER); + robot.keyRelease(KeyEvent.VK_ENTER); + robot.waitForIdle(); + robot.delay(250); + + String currSelection = (String) combo.getEditor().getItem(); + if (!currSelection.equals("Orange")) { + throw new RuntimeException("Unexpected Selection.\n" + + "Expected: Orange\nActual: " + currSelection); + } + } finally { + SwingUtilities.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + } + + public static void createTestUI() { + frame = new JFrame("bug4530953"); + combo = new JComboBox(data); + combo.setEditable(true); + combo.setSelectedIndex(1); + frame.setLayout(new FlowLayout()); + frame.add(combo); + frame.pack(); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } +} From 7b0eff80e6e84c9fd9fe77f00d6e27aa70a28bb0 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Thu, 6 Nov 2025 19:13:59 +0000 Subject: [PATCH 278/323] 8352686: Opensource JInternalFrame tests - series3 Backport-of: 27c8d9d635eaa0aac722c1b1eba8591fd291c077 --- .../swing/JInternalFrame/bug4151444.java | 84 ++++++++++++ .../swing/JInternalFrame/bug4215380.java | 109 +++++++++++++++ .../swing/JInternalFrame/bug4321312.java | 126 ++++++++++++++++++ .../swing/JInternalFrame/bug4322726.java | 109 +++++++++++++++ 4 files changed, 428 insertions(+) create mode 100644 test/jdk/javax/swing/JInternalFrame/bug4151444.java create mode 100644 test/jdk/javax/swing/JInternalFrame/bug4215380.java create mode 100644 test/jdk/javax/swing/JInternalFrame/bug4321312.java create mode 100644 test/jdk/javax/swing/JInternalFrame/bug4322726.java diff --git a/test/jdk/javax/swing/JInternalFrame/bug4151444.java b/test/jdk/javax/swing/JInternalFrame/bug4151444.java new file mode 100644 index 000000000000..26b64142e28d --- /dev/null +++ b/test/jdk/javax/swing/JInternalFrame/bug4151444.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2003, 2025, 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 4151444 + * @summary The maximize button acts like the restore button + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4151444 +*/ + +import javax.swing.JDesktopPane; +import javax.swing.JFrame; +import javax.swing.JInternalFrame; +import javax.swing.JLayeredPane; +import javax.swing.UIManager; + + +public class bug4151444 { + + private static JFrame frame; + private static JInternalFrame interFrame; + + private static final String INSTRUCTIONS = """ + - maximize the internal frame + - then minimize the internal frame + - then maximize the internal frame again + - Check whether internal frame is maximized + - Test will fail automatically even if "Pass" is pressed + if internal frame is not maximized."""; + + public static void main(String[] args) throws Exception { + + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + + PassFailJFrame pfj = PassFailJFrame.builder() + .title("bug4151444 Instructions") + .instructions(INSTRUCTIONS) + .columns(45) + .testUI(bug4151444::createTestUI) + .build(); + try { + pfj.awaitAndCheck(); + } finally { + if (!interFrame.isMaximum()) { + throw new RuntimeException ("Test failed. The maximize button acts like the restore button"); + } + } + } + + private static JFrame createTestUI() { + JFrame frame = new JFrame("bug4151444 frame"); + JDesktopPane desktop = new JDesktopPane(); + frame.setContentPane(desktop); + interFrame = new JInternalFrame( + "Internal frame", true, true, true, true); + desktop.add(interFrame, JLayeredPane.DEFAULT_LAYER); + interFrame.setBounds(0, 0, 200, 100); + interFrame.setVisible(true); + frame.setSize(300, 200); + return frame; + } +} diff --git a/test/jdk/javax/swing/JInternalFrame/bug4215380.java b/test/jdk/javax/swing/JInternalFrame/bug4215380.java new file mode 100644 index 000000000000..f9cd18dfb752 --- /dev/null +++ b/test/jdk/javax/swing/JInternalFrame/bug4215380.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2000, 2025, 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 4215380 + * @summary Internal Frame should get focus + * @key headful + * @run main bug4215380 + */ + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.event.InputEvent; +import java.awt.Point; +import java.awt.Robot; + +import javax.swing.JButton; +import javax.swing.JDesktopPane; +import javax.swing.JFrame; +import javax.swing.JInternalFrame; +import javax.swing.JLayeredPane; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; + +public class bug4215380 { + + private static String button; + private static JButton b; + private static JFrame frame; + private static JInternalFrame jif; + private static volatile Point loc; + private static volatile Dimension size; + + public static void main(String[] args) throws Exception { + Robot robot = new Robot(); + try { + SwingUtilities.invokeAndWait(() -> { + frame = new JFrame("bug4215380"); + JDesktopPane desktop = new JDesktopPane(); + frame.add(desktop, BorderLayout.CENTER); + + jif = iFrame(1); + desktop.add(jif, JLayeredPane.DEFAULT_LAYER); + desktop.add(iFrame(2), JLayeredPane.DEFAULT_LAYER); + frame.setSize(200, 200); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + }); + robot.waitForIdle(); + robot.delay(1000); + SwingUtilities.invokeAndWait(() -> { + loc = b.getLocationOnScreen(); + size = b.getSize(); + }); + robot.mouseMove(loc.x + size.width / 2, loc.y + size.height / 2); + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + robot.waitForIdle(); + robot.delay(500); + if (!(jif.isSelected()) && !button.equals("Frame 1")) { + throw new RuntimeException("Internal frame \"Frame 1\" should be selected..."); + } + } finally { + SwingUtilities.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + } + + private static JInternalFrame iFrame(int i) { + JInternalFrame frame = new JInternalFrame("Frame " + i); + JPanel panel = new JPanel(); + JButton bt = new JButton("Button " + i); + if (i == 1) { + b = bt; + } + bt.addActionListener(e -> button = ((JButton)e.getSource()).getText()); + + panel.add(bt); + + frame.getContentPane().add(panel); + frame.setBounds(10, i * 80 - 70, 120, 90); + frame.setVisible(true); + return frame; + } +} diff --git a/test/jdk/javax/swing/JInternalFrame/bug4321312.java b/test/jdk/javax/swing/JInternalFrame/bug4321312.java new file mode 100644 index 000000000000..1b527acf7458 --- /dev/null +++ b/test/jdk/javax/swing/JInternalFrame/bug4321312.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2000, 2025, 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 4321312 + * @summary Verifies no Exception thrown from BasicInternalFrameUI$BorderListener + * @key headful + * @run main bug4321312 + */ + +import java.awt.Dimension; +import java.awt.event.InputEvent; +import java.awt.event.MouseEvent; +import java.awt.Point; +import java.awt.Robot; + +import javax.swing.JDesktopPane; +import javax.swing.JFrame; +import javax.swing.JInternalFrame; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +public class bug4321312 { + + private static JFrame frame; + private static MyInternalFrame jif; + private static volatile Point loc; + private static volatile Dimension size; + + static boolean fails; + static Exception exc; + + private static synchronized boolean isFails() { + return fails; + } + + private static synchronized void setFails(Exception e) { + fails = true; + exc = e; + } + + public static void main(String[] args) throws Exception { + Robot robot = new Robot(); + try { + SwingUtilities.invokeAndWait(() -> { + try { + UIManager.setLookAndFeel( + "com.sun.java.swing.plaf.motif.MotifLookAndFeel"); + } catch (ClassNotFoundException | InstantiationException + | UnsupportedLookAndFeelException + | IllegalAccessException e) { + throw new RuntimeException(e); + } + + frame = new JFrame("bug4321312"); + JDesktopPane jdp = new JDesktopPane(); + frame.add(jdp); + + jif = new MyInternalFrame("Internal Frame", true); + jdp.add(jif); + jif.setSize(150, 150); + jif.setVisible(true); + + frame.setSize(200, 200); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + }); + robot.waitForIdle(); + robot.delay(1000); + SwingUtilities.invokeAndWait(() -> { + loc = jif.getLocationOnScreen(); + size = jif.getSize(); + }); + robot.mouseMove(loc.x + size.width / 2, loc.y + size.height / 2); + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + robot.waitForIdle(); + robot.delay(200); + if (isFails()) { + throw new RuntimeException(exc); + } + } finally { + SwingUtilities.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + } + + static class MyInternalFrame extends JInternalFrame { + MyInternalFrame(String str, boolean b) { + super(str, b); + } + + protected void processMouseEvent(MouseEvent e) { + try { + super.processMouseEvent(e); + } catch (Exception exc) { + setFails(exc); + } + } + } +} diff --git a/test/jdk/javax/swing/JInternalFrame/bug4322726.java b/test/jdk/javax/swing/JInternalFrame/bug4322726.java new file mode 100644 index 000000000000..861f9357fba6 --- /dev/null +++ b/test/jdk/javax/swing/JInternalFrame/bug4322726.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2000, 2025, 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 4322726 + * @summary Tests that JInternalFrame throws ArrayIndexOutOfBoundsException when Control-F4 pressed + * @key headful + * @run main bug4322726 + */ + +import java.awt.event.KeyEvent; +import java.awt.Robot; + +import javax.swing.JDesktopPane; +import javax.swing.JFrame; +import javax.swing.JInternalFrame; +import javax.swing.KeyStroke; +import javax.swing.SwingUtilities; +import java.beans.PropertyVetoException; + +public class bug4322726 { + + private static JFrame frame; + private static JInternalFrame internalFrame; + private static volatile boolean failed; + + public static void main(String[] args) throws Exception { + Robot robot = new Robot(); + try { + SwingUtilities.invokeAndWait(() -> { + frame = new JFrame("bug4322726"); + frame.setSize(600, 400); + TestDesktopPane desktopPane = new TestDesktopPane(); + frame.setContentPane(desktopPane); + internalFrame = new JInternalFrame(); + internalFrame.setClosable(true); + internalFrame.setMaximizable(true); + internalFrame.setIconifiable(true); + internalFrame.setResizable(true); + internalFrame.setTitle("Internal Frame"); + internalFrame.setSize(300, 200); + internalFrame.setVisible(true); + desktopPane.add(internalFrame); + + frame.setSize(400, 400); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + }); + robot.waitForIdle(); + robot.delay(1000); + SwingUtilities.invokeAndWait(() -> { + try { + internalFrame.setSelected(true); + } catch (PropertyVetoException e) { + throw new RuntimeException("PropertyVetoException thrown"); + } + }); + robot.waitForIdle(); + robot.delay(200); + robot.keyPress(KeyEvent.VK_CONTROL); + robot.keyPress(KeyEvent.VK_F4); + robot.keyRelease(KeyEvent.VK_F4); + robot.keyRelease(KeyEvent.VK_CONTROL); + robot.waitForIdle(); + robot.delay(200); + if (failed) { + throw new RuntimeException("Failed: index is out of bounds"); + } + } finally { + SwingUtilities.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + } + + static class TestDesktopPane extends JDesktopPane { + protected boolean processKeyBinding(KeyStroke ks, KeyEvent e, int condition, boolean pressed) { + try { + return super.processKeyBinding(ks, e, condition, pressed); + } catch (ArrayIndexOutOfBoundsException ex) { + failed = true; + } + return failed; + } + } +} From 23f7ce0d61bfbee81bca50b163f3965c5fa2f661 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Fri, 7 Nov 2025 04:31:25 +0000 Subject: [PATCH 279/323] 8328299: Convert DnDFileGroupDescriptor.html applet test to main Backport-of: 75195aab497a2d23548128e03f6887283dcaa7e1 --- test/jdk/ProblemList.txt | 1 - .../DnDFileGroupDescriptor.html | 43 --- .../DnDFileGroupDescriptor.java | 248 +++++------------- 3 files changed, 70 insertions(+), 222 deletions(-) delete mode 100644 test/jdk/java/awt/dnd/DnDFileGroupDescriptor/DnDFileGroupDescriptor.html diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index b2aceda1a5dc..97d8c9a823f3 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -816,7 +816,6 @@ java/awt/event/MouseEvent/SpuriousExitEnter/SpuriousExitEnter_2.java 7131438,802 java/awt/Modal/WsDisabledStyle/CloseBlocker/CloseBlocker.java 7187741 linux-all,macosx-all java/awt/xembed/server/TestXEmbedServerJava.java 8001150,8004031 generic-all java/awt/Modal/PrintDialogsTest/PrintDialogsTest.java 8068378 generic-all -java/awt/dnd/DnDFileGroupDescriptor/DnDFileGroupDescriptor.html 8080185 macosx-all,linux-all java/awt/image/VolatileImage/VolatileImageConfigurationTest.java 8171069 macosx-all,linux-all java/awt/Modal/InvisibleParentTest/InvisibleParentTest.java 8172245 linux-all java/awt/Frame/FrameStateTest/FrameStateTest.java 8203920 macosx-all,linux-all diff --git a/test/jdk/java/awt/dnd/DnDFileGroupDescriptor/DnDFileGroupDescriptor.html b/test/jdk/java/awt/dnd/DnDFileGroupDescriptor/DnDFileGroupDescriptor.html deleted file mode 100644 index 72a65bbe39fd..000000000000 --- a/test/jdk/java/awt/dnd/DnDFileGroupDescriptor/DnDFileGroupDescriptor.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - DnDToWordpadTest - - - -

          DnDFileGroupDescriptor
          Bug ID: 6242241

          - -

          See the dialog box (usually in upper left corner) for instructions

          - - - - diff --git a/test/jdk/java/awt/dnd/DnDFileGroupDescriptor/DnDFileGroupDescriptor.java b/test/jdk/java/awt/dnd/DnDFileGroupDescriptor/DnDFileGroupDescriptor.java index 06d4dc43b558..51129f264082 100644 --- a/test/jdk/java/awt/dnd/DnDFileGroupDescriptor/DnDFileGroupDescriptor.java +++ b/test/jdk/java/awt/dnd/DnDFileGroupDescriptor/DnDFileGroupDescriptor.java @@ -1,188 +1,80 @@ - /* - * Copyright (c) 2009, 2013, 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 6242241 - @summary Tests basic DnD functionality in an applet - @requires (os.family == "windows") - @author Your Name: Alexey Utkin area=dnd - @run applet/manual=yesno DnDFileGroupDescriptor.html -*/ - -import java.applet.Applet; -import java.awt.*; - -public class DnDFileGroupDescriptor extends Applet { - public void init() { - setLayout(new BorderLayout()); + * Copyright (c) 2009, 2024, 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.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Frame; +import java.awt.Panel; - String[] instructions = { - "The applet window contains a red field.", - "1. Start MS Outlook program. Find and open ", - " the mail form with attachments.", - "2. Select attachments from the mail and drag into a red field of applet.", - " When the mouse enters the field during the drag, the application ", - " should change the cursor form to OLE-copy and field color to yellow.", - "3. Release the mouse button (drop attachments) over the field.", - "", - "File paths in temporary folder should appear.", - "", - "You should be able to repeat this operation multiple times.", - "Please, select \"Pass\" just in case of success or \"Fail\" for another." - }; - Sysout.createDialogWithInstructions( instructions ); +/* + * @test + * @bug 6242241 + * @summary Tests TransferFlavor that supports DnD of MS Outlook attachments. + * @requires (os.family == "windows") + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual DnDFileGroupDescriptor + */ + +public class DnDFileGroupDescriptor { + private static final String INSTRUCTIONS = """ + When the test starts, a RED panel appears. + 1. Start MS Outlook program. Find and open the mail form with attachments. + + 2. Select attachments from the mail and drag into a red field of applet. + When the mouse enters the field during the process of drag, the application + should change the cursor form to OLE-copy and field color to yellow. + + 3. Release the mouse button (drop attachments) over the field. + File paths in temporary folder should appear. + You should be able to repeat this operation multiple times. + + If the above is the case then press PASS, else FAIL. + """; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .title("Test Instructions") + .instructions(INSTRUCTIONS) + .rows((int) INSTRUCTIONS.lines().count() + 2) + .columns(40) + .testUI(DnDFileGroupDescriptor::createUI) + .build() + .awaitAndCheck(); } - public void start() { - Panel mainPanel; - Component dropTarget; - - mainPanel = new Panel(); + private static Frame createUI() { + Frame frame = new Frame("Test MS Outlook Mail Attachments DnD"); + Panel mainPanel = new Panel(); mainPanel.setLayout(new BorderLayout()); - mainPanel.setBackground(Color.blue); - dropTarget = new DnDTarget(Color.red, Color.yellow); - + Component dropTarget = new DnDTarget(Color.RED, Color.YELLOW); mainPanel.add(dropTarget, "Center"); - add(mainPanel); - setSize(200,200); + frame.add(mainPanel); + frame.setSize(400, 200); + frame.setAlwaysOnTop(true); + return frame; } } - -/**************************************************** - Standard Test Machinery - DO NOT modify anything below -- it's a standard - chunk of code whose purpose is to make user - interaction uniform, and thereby make it simpler - to read and understand someone else's test. - ****************************************************/ - -class Sysout - { - private static TestDialog dialog; - - public static void createDialogWithInstructions( String[] instructions ) - { - dialog = new TestDialog( new Frame(), "Instructions" ); - dialog.printInstructions( instructions ); - dialog.show(); - println( "Any messages for the tester will display here." ); - } - - public static void createDialog( ) - { - dialog = new TestDialog( new Frame(), "Instructions" ); - String[] defInstr = { "Instructions will appear here. ", "" } ; - dialog.printInstructions( defInstr ); - dialog.show(); - println( "Any messages for the tester will display here." ); - } - - - public static void printInstructions( String[] instructions ) - { - dialog.printInstructions( instructions ); - } - - - public static void println( String messageIn ) - { - dialog.displayMessage( messageIn ); - } - - }// Sysout class - -class TestDialog extends Dialog - { - - TextArea instructionsText; - TextArea messageText; - int maxStringLength = 80; - - //DO NOT call this directly, go through Sysout - public TestDialog( Frame frame, String name ) - { - super( frame, name ); - int scrollBoth = TextArea.SCROLLBARS_BOTH; - instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth ); - add( "North", instructionsText ); - - messageText = new TextArea( "", 5, maxStringLength, scrollBoth ); - add("South", messageText); - - pack(); - - show(); - }// TestDialog() - - //DO NOT call this directly, go through Sysout - public void printInstructions( String[] instructions ) - { - //Clear out any current instructions - instructionsText.setText( "" ); - - //Go down array of instruction strings - - String printStr, remainingStr; - for( int i=0; i < instructions.length; i++ ) - { - //chop up each into pieces maxSringLength long - remainingStr = instructions[ i ]; - while( remainingStr.length() > 0 ) - { - //if longer than max then chop off first max chars to print - if( remainingStr.length() >= maxStringLength ) - { - //Try to chop on a word boundary - int posOfSpace = remainingStr. - lastIndexOf( ' ', maxStringLength - 1 ); - - if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1; - - printStr = remainingStr.substring( 0, posOfSpace + 1 ); - remainingStr = remainingStr.substring( posOfSpace + 1 ); - } - //else just print - else - { - printStr = remainingStr; - remainingStr = ""; - } - - instructionsText.append( printStr + "\n" ); - - }// while - - }// for - - }//printInstructions() - - //DO NOT call this directly, go through Sysout - public void displayMessage( String messageIn ) - { - messageText.append( messageIn + "\n" ); - } - - }// TestDialog class From f4bd37f33ccf93f3162dde38cf604a6796d2ec6b Mon Sep 17 00:00:00 2001 From: Roland Mesde Date: Fri, 7 Nov 2025 16:13:45 +0000 Subject: [PATCH 280/323] 8316422: TestIntegerUnsignedDivMod.java triggers "invalid layout" assert in FrameValues::validate Backport-of: 5e1b771a19962042a0020a9148e94e14d63025ee --- src/hotspot/share/c1/c1_GraphBuilder.cpp | 28 ++++---- src/hotspot/share/c1/c1_LIRGenerator.cpp | 16 ++++- src/hotspot/share/c1/c1_LinearScan.cpp | 16 ++--- src/hotspot/share/c1/c1_ValueStack.cpp | 50 ++++++++++---- src/hotspot/share/c1/c1_ValueStack.hpp | 33 ++++++--- .../exceptions/TestDeoptExceptionState.java | 68 +++++++++++++++++++ 6 files changed, 166 insertions(+), 45 deletions(-) create mode 100644 test/hotspot/jtreg/compiler/exceptions/TestDeoptExceptionState.java diff --git a/src/hotspot/share/c1/c1_GraphBuilder.cpp b/src/hotspot/share/c1/c1_GraphBuilder.cpp index 2f7b2d52737d..f58e69d9cfa0 100644 --- a/src/hotspot/share/c1/c1_GraphBuilder.cpp +++ b/src/hotspot/share/c1/c1_GraphBuilder.cpp @@ -2521,6 +2521,8 @@ XHandlers* GraphBuilder::handle_exception(Instruction* instruction) { // xhandler start with an empty expression stack if (cur_state->stack_size() != 0) { + // locals are preserved + // stack will be truncated cur_state = cur_state->copy(ValueStack::ExceptionState, cur_state->bci()); } if (instruction->exception_state() == nullptr) { @@ -2570,15 +2572,19 @@ XHandlers* GraphBuilder::handle_exception(Instruction* instruction) { // This scope and all callees do not handle exceptions, so the local // variables of this scope are not needed. However, the scope itself is // required for a correct exception stack trace -> clear out the locals. - if (_compilation->env()->should_retain_local_variables()) { - cur_state = cur_state->copy(ValueStack::ExceptionState, cur_state->bci()); - } else { - cur_state = cur_state->copy(ValueStack::EmptyExceptionState, cur_state->bci()); - } + // Stack and locals are invalidated but not truncated in caller state. if (prev_state != nullptr) { + assert(instruction->exception_state() != nullptr, "missed set?"); + ValueStack::Kind exc_kind = ValueStack::empty_exception_kind(true /* caller */); + cur_state = cur_state->copy(exc_kind, cur_state->bci()); + // reset caller exception state prev_state->set_caller_state(cur_state); - } - if (instruction->exception_state() == nullptr) { + } else { + assert(instruction->exception_state() == nullptr, "already set"); + // set instruction exception state + // truncate stack + ValueStack::Kind exc_kind = ValueStack::empty_exception_kind(); + cur_state = cur_state->copy(exc_kind, cur_state->bci()); instruction->set_exception_state(cur_state); } } @@ -3491,11 +3497,9 @@ ValueStack* GraphBuilder::copy_state_exhandling_with_bci(int bci) { ValueStack* GraphBuilder::copy_state_for_exception_with_bci(int bci) { ValueStack* s = copy_state_exhandling_with_bci(bci); if (s == nullptr) { - if (_compilation->env()->should_retain_local_variables()) { - s = state()->copy(ValueStack::ExceptionState, bci); - } else { - s = state()->copy(ValueStack::EmptyExceptionState, bci); - } + // no handler, no need to retain locals + ValueStack::Kind exc_kind = ValueStack::empty_exception_kind(); + s = state()->copy(exc_kind, bci); } return s; } diff --git a/src/hotspot/share/c1/c1_LIRGenerator.cpp b/src/hotspot/share/c1/c1_LIRGenerator.cpp index 5dbb6d6574e2..dda69ef237c0 100644 --- a/src/hotspot/share/c1/c1_LIRGenerator.cpp +++ b/src/hotspot/share/c1/c1_LIRGenerator.cpp @@ -402,8 +402,20 @@ CodeEmitInfo* LIRGenerator::state_for(Instruction* x, ValueStack* state, bool ig ValueStack* s = state; for_each_state(s) { - if (s->kind() == ValueStack::EmptyExceptionState) { - assert(s->stack_size() == 0 && s->locals_size() == 0 && (s->locks_size() == 0 || s->locks_size() == 1), "state must be empty"); + if (s->kind() == ValueStack::EmptyExceptionState || + s->kind() == ValueStack::CallerEmptyExceptionState) + { +#ifdef ASSERT + int index; + Value value; + for_each_stack_value(s, index, value) { + fatal("state must be empty"); + } + for_each_local_value(s, index, value) { + fatal("state must be empty"); + } +#endif + assert(s->locks_size() == 0 || s->locks_size() == 1, "state must be empty"); continue; } diff --git a/src/hotspot/share/c1/c1_LinearScan.cpp b/src/hotspot/share/c1/c1_LinearScan.cpp index 0634d970c26f..7e46f9d56034 100644 --- a/src/hotspot/share/c1/c1_LinearScan.cpp +++ b/src/hotspot/share/c1/c1_LinearScan.cpp @@ -2921,16 +2921,10 @@ IRScopeDebugInfo* LinearScan::compute_debug_info_for_scope(int op_id, IRScope* c assert(locals->length() == pos, "must match"); } - assert(locals->length() == cur_scope->method()->max_locals(), "wrong number of locals"); - assert(locals->length() == cur_state->locals_size(), "wrong number of locals"); - } else if (cur_scope->method()->max_locals() > 0) { - assert(cur_state->kind() == ValueStack::EmptyExceptionState, "should be"); - nof_locals = cur_scope->method()->max_locals(); - locals = new GrowableArray(nof_locals); - for(int i = 0; i < nof_locals; i++) { - locals->append(_illegal_value); - } + assert(locals->length() == nof_locals, "wrong number of locals"); } + assert(nof_locals == cur_scope->method()->max_locals(), "wrong number of locals"); + assert(nof_locals == cur_state->locals_size(), "wrong number of locals"); // describe expression stack int nof_stack = cur_state->stack_size(); @@ -2939,8 +2933,8 @@ IRScopeDebugInfo* LinearScan::compute_debug_info_for_scope(int op_id, IRScope* c int pos = 0; while (pos < nof_stack) { - Value expression = cur_state->stack_at_inc(pos); - append_scope_value(op_id, expression, expressions); + Value expression = cur_state->stack_at(pos); + pos += append_scope_value(op_id, expression, expressions); assert(expressions->length() == pos, "must match"); } diff --git a/src/hotspot/share/c1/c1_ValueStack.cpp b/src/hotspot/share/c1/c1_ValueStack.cpp index 58dc947764a7..e7bf714a3674 100644 --- a/src/hotspot/share/c1/c1_ValueStack.cpp +++ b/src/hotspot/share/c1/c1_ValueStack.cpp @@ -51,12 +51,32 @@ ValueStack::ValueStack(ValueStack* copy_from, Kind kind, int bci) , _stack(copy_from->stack_size_for_copy(kind)) , _locks(copy_from->locks_size() == 0 ? nullptr : new Values(copy_from->locks_size())) { - assert(kind != EmptyExceptionState || !Compilation::current()->env()->should_retain_local_variables(), "need locals"); - if (kind != EmptyExceptionState) { + switch (kind) { + case EmptyExceptionState: + case CallerEmptyExceptionState: + assert(!Compilation::current()->env()->should_retain_local_variables(), "need locals"); + // set to all nulls, like clear_locals() + for (int i = 0; i < copy_from->locals_size(); ++i) { + _locals.append(nullptr); + } + break; + default: _locals.appendAll(©_from->_locals); } - if (kind != ExceptionState && kind != EmptyExceptionState) { + switch (kind) { + case ExceptionState: + case EmptyExceptionState: + assert(stack_size() == 0, "fix stack_size_for_copy"); + break; + case CallerExceptionState: + case CallerEmptyExceptionState: + // set to all nulls + for (int i = 0; i < copy_from->stack_size(); ++i) { + _stack.append(nullptr); + } + break; + default: _stack.appendAll(©_from->_stack); } @@ -68,10 +88,7 @@ ValueStack::ValueStack(ValueStack* copy_from, Kind kind, int bci) } int ValueStack::locals_size_for_copy(Kind kind) const { - if (kind != EmptyExceptionState) { - return locals_size(); - } - return 0; + return locals_size(); } int ValueStack::stack_size_for_copy(Kind kind) const { @@ -221,10 +238,15 @@ void ValueStack::print() { } else { InstructionPrinter ip; for (int i = 0; i < stack_size();) { + tty->print("stack %d ", i); Value t = stack_at_inc(i); - tty->print("%2d ", i); - tty->print("%c%d ", t->type()->tchar(), t->id()); - ip.print_instr(t); + if (t == nullptr) { + tty->print("null"); + } else { + tty->print("%2d ", i); + tty->print("%c%d ", t->type()->tchar(), t->id()); + ip.print_instr(t); + } tty->cr(); } } @@ -284,7 +306,9 @@ void ValueStack::verify() { int i; for (i = 0; i < stack_size(); i++) { Value v = _stack.at(i); - if (v == nullptr) { + if (kind() == empty_exception_kind(true /* caller */)) { + assert(v == nullptr, "should be empty"); + } else if (v == nullptr) { assert(_stack.at(i - 1)->type()->is_double_word(), "only hi-words are null on stack"); } else if (v->type()->is_double_word()) { assert(_stack.at(i + 1) == nullptr, "hi-word must be null"); @@ -293,7 +317,9 @@ void ValueStack::verify() { for (i = 0; i < locals_size(); i++) { Value v = _locals.at(i); - if (v != nullptr && v->type()->is_double_word()) { + if (kind() == EmptyExceptionState) { + assert(v == nullptr, "should be empty"); + } else if (v != nullptr && v->type()->is_double_word()) { assert(_locals.at(i + 1) == nullptr, "hi-word must be null"); } } diff --git a/src/hotspot/share/c1/c1_ValueStack.hpp b/src/hotspot/share/c1/c1_ValueStack.hpp index b1622b79622b..74d5c2e3f3c6 100644 --- a/src/hotspot/share/c1/c1_ValueStack.hpp +++ b/src/hotspot/share/c1/c1_ValueStack.hpp @@ -34,8 +34,18 @@ class ValueStack: public CompilationResourceObj { CallerState, // Caller state when inlining StateBefore, // Before before execution of instruction StateAfter, // After execution of instruction - ExceptionState, // Exception handling of instruction - EmptyExceptionState, // Exception handling of instructions not covered by an xhandler + // Exception states for an instruction. + // Dead stack items or locals may be invalidated or cleared/removed. + // Locals are retained if needed for JVMTI. + // "empty" exception states are used when there is no handler, + // and invalidate the locals. + // "leaf" exception states clear the stack. + // "caller" exception states are used for the parent/caller, + // and invalidate the stack. + ExceptionState, // Exception state for leaf with handler, stack cleared + EmptyExceptionState, // Exception state for leaf w/o handler, stack cleared, locals invalidated + CallerExceptionState, // Exception state for parent with handler, stack invalidated + CallerEmptyExceptionState, // Exception state for parent w/o handler, stack+locals invalidated BlockBeginState // State of BlockBegin instruction with phi functions of this block }; @@ -75,10 +85,16 @@ class ValueStack: public CompilationResourceObj { ValueStack* copy(Kind new_kind, int new_bci) { return new ValueStack(this, new_kind, new_bci); } ValueStack* copy_for_parsing() { return new ValueStack(this, Parsing, -99); } + // Used when no exception handler is found + static Kind empty_exception_kind(bool caller = false) { + return Compilation::current()->env()->should_retain_local_variables() ? + (caller ? CallerExceptionState : ExceptionState) : // retain locals + (caller ? CallerEmptyExceptionState : EmptyExceptionState); // clear locals + } + void set_caller_state(ValueStack* s) { - assert(kind() == EmptyExceptionState || - (Compilation::current()->env()->should_retain_local_variables() && kind() == ExceptionState), - "only EmptyExceptionStates can be modified"); + assert(kind() == empty_exception_kind(false) || kind() == empty_exception_kind(true), + "only empty exception states can be modified"); _caller_state = s; } @@ -133,14 +149,14 @@ class ValueStack: public CompilationResourceObj { // stack access Value stack_at(int i) const { Value x = _stack.at(i); - assert(!x->type()->is_double_word() || + assert(x == nullptr || !x->type()->is_double_word() || _stack.at(i + 1) == nullptr, "hi-word of doubleword value must be null"); return x; } Value stack_at_inc(int& i) const { Value x = stack_at(i); - i += x->type()->size(); + i += ((x == nullptr) ? 1 : x->type()->size()); return x; } @@ -260,7 +276,8 @@ class ValueStack: public CompilationResourceObj { int temp_var = state->stack_size(); \ for (index = 0; \ index < temp_var && (value = state->stack_at(index), true); \ - index += value->type()->size()) + index += (value == nullptr ? 1 : value->type()->size())) \ + if (value != nullptr) #define for_each_lock_value(state, index, value) \ diff --git a/test/hotspot/jtreg/compiler/exceptions/TestDeoptExceptionState.java b/test/hotspot/jtreg/compiler/exceptions/TestDeoptExceptionState.java new file mode 100644 index 000000000000..3e8d450e2997 --- /dev/null +++ b/test/hotspot/jtreg/compiler/exceptions/TestDeoptExceptionState.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2023, 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 8316422 +* @summary Test exception state used for deoptimization. +* @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+VerifyStack -XX:+DeoptimizeALot +* -Xcomp -XX:TieredStopAtLevel=1 -XX:CompileOnly=compiler.exceptions.TestDeoptExceptionState::test +* compiler.exceptions.TestDeoptExceptionState +*/ + +package compiler.exceptions; + +public class TestDeoptExceptionState { + private static int res = 0; + + public static void main(String args[]) { + int x = 42; + int y = 1 + test(); + System.out.println("Foo " + x + " " + y); + } + + public static int test() { + int x = 42; + int y = 1 + test1(); + return x + y; + } + + public static int test1() { + for (int i = 0; i < 100; i++) { + try { + divZero(); + } catch (ArithmeticException ea) { + // Expected + } + } + return 1; + } + + public static void divZero() { + res += div(0, 0); + } + + public static long div(long dividend, long divisor) { + return dividend / divisor; + } +} From 4e095fdf88e53b9308bf687cb3c843214b621502 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 10 Nov 2025 13:49:21 +0000 Subject: [PATCH 281/323] 8315990: Amend problemlisted tests to proper position Reviewed-by: rrich Backport-of: 8b4f9a88e606c4c6722061ce9946ce17340ff1df --- test/jdk/ProblemList.txt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index 97d8c9a823f3..c8fd5cc7feb5 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -128,6 +128,7 @@ java/awt/FileDialog/FileDialogIconTest/FileDialogIconTest.java 8160558 windows-a java/awt/event/MouseWheelEvent/InfiniteRecursion/InfiniteRecursion.java 8060176 windows-all,macosx-all java/awt/event/MouseWheelEvent/InfiniteRecursion/InfiniteRecursion_1.java 8060176 windows-all,macosx-all java/awt/dnd/URIListBetweenJVMsTest/URIListBetweenJVMsTest.java 8171510 macosx-all +java/awt/dnd/MissingDragExitEventTest/MissingDragExitEventTest.java 8288839 windows-x64 java/awt/dnd/DragExitBeforeDropTest.java 8242805 macosx-all java/awt/dnd/DragThresholdTest.java 8076299 macosx-all java/awt/dnd/CustomDragCursorTest.java 8242805 macosx-all @@ -150,6 +151,7 @@ java/awt/event/InputEvent/EventWhenTest/EventWhenTest.java 8168646 generic-all java/awt/List/KeyEventsTest/KeyEventsTest.java 8201307 linux-all java/awt/Paint/ListRepaint.java 8201307 linux-all java/awt/Mixing/AWT_Mixing/HierarchyBoundsListenerMixingTest.java 8049405 macosx-all +java/awt/Mixing/AWT_Mixing/OpaqueOverlapping.java 8294264 windows-x64 java/awt/Mixing/AWT_Mixing/OpaqueOverlappingChoice.java 8048171 generic-all java/awt/Mixing/AWT_Mixing/JMenuBarOverlapping.java 8159451 linux-all,windows-all,macosx-all java/awt/Mixing/AWT_Mixing/JSplitPaneOverlapping.java 6986109 generic-all @@ -503,6 +505,10 @@ java/awt/image/multiresolution/MultiresolutionIconTest.java 8291979 linux-x64,wi java/awt/event/SequencedEvent/MultipleContextsFunctionalTest.java 8305061 macosx-x64 sun/java2d/DirectX/OnScreenRenderingResizeTest/OnScreenRenderingResizeTest.java 8301177 linux-x64 +# Several tests which fail on some hidpi systems/macosx12-aarch64 system +java/awt/Window/8159168/SetShapeTest.java 8274106 macosx-aarch64 +java/awt/image/multiresolution/MultiResolutionJOptionPaneIconTest.java 8274106 macosx-aarch64 + ############################################################################ # jdk_beans @@ -695,16 +701,11 @@ javax/swing/JEditorPane/6917744/bug6917744.java 8213124 macosx-all javax/swing/JRadioButton/4314194/bug4314194.java 8298153 linux-all # Several tests which fail on some hidpi systems/macosx12-aarch64 system -java/awt/Window/8159168/SetShapeTest.java 8274106 macosx-aarch64 -java/awt/image/multiresolution/MultiResolutionJOptionPaneIconTest.java 8274106 macosx-aarch64 javax/swing/JFrame/8175301/ScaledFrameBackgroundTest.java 8274106 macosx-aarch64 -java/awt/Mouse/EnterExitEvents/DragWindowTest.java 8298823 macosx-all -java/awt/Mixing/AWT_Mixing/OpaqueOverlapping.java 8294264 windows-x64 java/awt/Mixing/AWT_Mixing/ViewportOverlapping.java 8253184,8295813 windows-x64 javax/swing/JColorChooser/Test6827032.java 8224968 windows-x64 -java/awt/dnd/MissingDragExitEventTest/MissingDragExitEventTest.java 8288839 windows-x64 sanity/client/SwingSet/src/ToolTipDemoTest.java 8293001 linux-all sanity/client/SwingSet/src/ButtonDemoScreenshotTest.java 8265770 macosx-all From 7992d75e44aa756a8e27e185785107effeb1197b Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 10 Nov 2025 13:51:14 +0000 Subject: [PATCH 282/323] 8311906: Improve robustness of String constructors with mutable array inputs 8321180: Condition for non-latin1 string size too large exception is off by one 8322018: Test java/lang/String/CompactString/MaxSizeUTF16String.java fails with -Xcomp 8321514: UTF16 string gets constructed incorrectly from codepoints if CompactStrings is not enabled 8325590: Regression in round-tripping UTF-16 strings after JDK-8311906 Reviewed-by: rschmelter Backport-of: 155abc576a0212932825485380d4e2a9c7dd2fdc --- .../cpu/aarch64/macroAssembler_aarch64.cpp | 8 +- src/hotspot/cpu/ppc/ppc.ad | 12 +- .../cpu/riscv/c2_MacroAssembler_riscv.cpp | 10 +- src/hotspot/cpu/s390/s390.ad | 2 +- src/hotspot/cpu/x86/macroAssembler_x86.cpp | 139 +++--- .../java/lang/AbstractStringBuilder.java | 20 +- .../share/classes/java/lang/String.java | 110 ++--- .../share/classes/java/lang/StringLatin1.java | 6 +- .../share/classes/java/lang/StringUTF16.java | 295 +++++++++--- .../TestStringConstructionIntrinsics.java | 253 ++++++++++ .../patches/java.base/java/lang/Helper.java | 10 + test/jdk/java/lang/String/Chars.java | 63 ++- .../CompactString/MaxSizeUTF16String.java | 121 +++++ .../lang/String/StringRacyConstructor.java | 437 ++++++++++++++++++ .../java/nio/file/Files/ReadWriteString.java | 41 +- .../bench/java/lang/StringConstructor.java | 154 ++++-- 16 files changed, 1420 insertions(+), 261 deletions(-) create mode 100644 test/hotspot/jtreg/compiler/intrinsics/string/TestStringConstructionIntrinsics.java create mode 100644 test/jdk/java/lang/String/CompactString/MaxSizeUTF16String.java create mode 100644 test/jdk/java/lang/String/StringRacyConstructor.java diff --git a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp index 8ec1af1bd7a3..2f2c0389ab42 100644 --- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp @@ -5913,7 +5913,7 @@ void MacroAssembler::fill_words(Register base, Register cnt, Register value) // - sun/nio/cs/ISO_8859_1$Encoder.implEncodeISOArray // return the number of characters copied. // - java/lang/StringUTF16.compress -// return zero (0) if copy fails, otherwise 'len'. +// return index of non-latin1 character if copy fails, otherwise 'len'. // // This version always returns the number of characters copied, and does not // clobber the 'len' register. A successful copy will complete with the post- @@ -6130,15 +6130,15 @@ address MacroAssembler::byte_array_inflate(Register src, Register dst, Register } // Compress char[] array to byte[]. +// Intrinsic for java.lang.StringUTF16.compress(char[] src, int srcOff, byte[] dst, int dstOff, int len) +// Return the array length if every element in array can be encoded, +// otherwise, the index of first non-latin1 (> 0xff) character. void MacroAssembler::char_array_compress(Register src, Register dst, Register len, Register res, FloatRegister tmp0, FloatRegister tmp1, FloatRegister tmp2, FloatRegister tmp3, FloatRegister tmp4, FloatRegister tmp5) { encode_iso_array(src, dst, len, res, false, tmp0, tmp1, tmp2, tmp3, tmp4, tmp5); - // Adjust result: res == len ? len : 0 - cmp(len, res); - csel(res, res, zr, EQ); } // java.math.round(double a) diff --git a/src/hotspot/cpu/ppc/ppc.ad b/src/hotspot/cpu/ppc/ppc.ad index bc7dba082dae..f8f435c3522c 100644 --- a/src/hotspot/cpu/ppc/ppc.ad +++ b/src/hotspot/cpu/ppc/ppc.ad @@ -12799,16 +12799,8 @@ instruct string_compress(rarg1RegP src, rarg2RegP dst, iRegIsrc len, iRegIdst re ins_cost(300); format %{ "String Compress $src,$dst,$len -> $result \t// KILL $tmp1, $tmp2, $tmp3, $tmp4, $tmp5" %} ins_encode %{ - Label Lskip, Ldone; - __ li($result$$Register, 0); - __ string_compress_16($src$$Register, $dst$$Register, $len$$Register, $tmp1$$Register, - $tmp2$$Register, $tmp3$$Register, $tmp4$$Register, $tmp5$$Register, Ldone); - __ rldicl_($tmp1$$Register, $len$$Register, 0, 64-3); // Remaining characters. - __ beq(CCR0, Lskip); - __ string_compress($src$$Register, $dst$$Register, $tmp1$$Register, $tmp2$$Register, Ldone); - __ bind(Lskip); - __ mr($result$$Register, $len$$Register); - __ bind(Ldone); + __ encode_iso_array($src$$Register, $dst$$Register, $len$$Register, $tmp1$$Register, $tmp2$$Register, + $tmp3$$Register, $tmp4$$Register, $tmp5$$Register, $result$$Register, false); %} ins_pipe(pipe_class_default); %} diff --git a/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp b/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp index a83be3b8f754..a234c4888e13 100644 --- a/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp +++ b/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp @@ -1768,14 +1768,12 @@ void C2_MacroAssembler::byte_array_inflate_v(Register src, Register dst, Registe } // Compress char[] array to byte[]. -// result: the array length if every element in array can be encoded; 0, otherwise. +// Intrinsic for java.lang.StringUTF16.compress(char[] src, int srcOff, byte[] dst, int dstOff, int len) +// result: the array length if every element in array can be encoded, +// otherwise, the index of first non-latin1 (> 0xff) character. void C2_MacroAssembler::char_array_compress_v(Register src, Register dst, Register len, Register result, Register tmp) { - Label done; encode_iso_array_v(src, dst, len, result, tmp, false); - beqz(len, done); - mv(result, zr); - bind(done); } // Intrinsic for @@ -1783,7 +1781,7 @@ void C2_MacroAssembler::char_array_compress_v(Register src, Register dst, Regist // - sun/nio/cs/ISO_8859_1$Encoder.implEncodeISOArray // return the number of characters copied. // - java/lang/StringUTF16.compress -// return zero (0) if copy fails, otherwise 'len'. +// return index of non-latin1 character if copy fails, otherwise 'len'. // // This version always returns the number of characters copied. A successful // copy will complete with the post-condition: 'res' == 'len', while an diff --git a/src/hotspot/cpu/s390/s390.ad b/src/hotspot/cpu/s390/s390.ad index 89c2d5380927..e45609bce34a 100644 --- a/src/hotspot/cpu/s390/s390.ad +++ b/src/hotspot/cpu/s390/s390.ad @@ -10177,7 +10177,7 @@ instruct string_compress(iRegP src, iRegP dst, iRegI result, iRegI len, iRegI tm format %{ "String Compress $src->$dst($len) -> $result" %} ins_encode %{ __ string_compress($result$$Register, $src$$Register, $dst$$Register, $len$$Register, - $tmp$$Register, false, false); + $tmp$$Register, true, false); %} ins_pipe(pipe_class_dummy); %} diff --git a/src/hotspot/cpu/x86/macroAssembler_x86.cpp b/src/hotspot/cpu/x86/macroAssembler_x86.cpp index 31096d07ca2c..6575b4352324 100644 --- a/src/hotspot/cpu/x86/macroAssembler_x86.cpp +++ b/src/hotspot/cpu/x86/macroAssembler_x86.cpp @@ -8837,15 +8837,19 @@ void MacroAssembler::crc32c_ipl_alg2_alt2(Register in_out, Register in1, Registe #undef BLOCK_COMMENT // Compress char[] array to byte[]. -// ..\jdk\src\java.base\share\classes\java\lang\StringUTF16.java +// Intrinsic for java.lang.StringUTF16.compress(char[] src, int srcOff, byte[] dst, int dstOff, int len) +// Return the array length if every element in array can be encoded, +// otherwise, the index of first non-latin1 (> 0xff) character. // @IntrinsicCandidate -// private static int compress(char[] src, int srcOff, byte[] dst, int dstOff, int len) { +// public static int compress(char[] src, int srcOff, byte[] dst, int dstOff, int len) { // for (int i = 0; i < len; i++) { -// int c = src[srcOff++]; -// if (c >>> 8 != 0) { -// return 0; +// char c = src[srcOff]; +// if (c > 0xff) { +// return i; // return index of non-latin1 char // } -// dst[dstOff++] = (byte)c; +// dst[dstOff] = (byte)c; +// srcOff++; +// dstOff++; // } // return len; // } @@ -8853,7 +8857,7 @@ void MacroAssembler::char_array_compress(Register src, Register dst, Register le XMMRegister tmp1Reg, XMMRegister tmp2Reg, XMMRegister tmp3Reg, XMMRegister tmp4Reg, Register tmp5, Register result, KRegister mask1, KRegister mask2) { - Label copy_chars_loop, return_length, return_zero, done; + Label copy_chars_loop, done, reset_sp, copy_tail; // rsi: src // rdi: dst @@ -8868,28 +8872,28 @@ void MacroAssembler::char_array_compress(Register src, Register dst, Register le assert(len != result, ""); // save length for return - push(len); + movl(result, len); if ((AVX3Threshold == 0) && (UseAVX > 2) && // AVX512 VM_Version::supports_avx512vlbw() && VM_Version::supports_bmi2()) { - Label copy_32_loop, copy_loop_tail, below_threshold; + Label copy_32_loop, copy_loop_tail, below_threshold, reset_for_copy_tail; // alignment Label post_alignment; - // if length of the string is less than 16, handle it in an old fashioned way + // if length of the string is less than 32, handle it the old fashioned way testl(len, -32); jcc(Assembler::zero, below_threshold); // First check whether a character is compressible ( <= 0xFF). // Create mask to test for Unicode chars inside zmm vector - movl(result, 0x00FF); - evpbroadcastw(tmp2Reg, result, Assembler::AVX_512bit); + movl(tmp5, 0x00FF); + evpbroadcastw(tmp2Reg, tmp5, Assembler::AVX_512bit); testl(len, -64); - jcc(Assembler::zero, post_alignment); + jccb(Assembler::zero, post_alignment); movl(tmp5, dst); andl(tmp5, (32 - 1)); @@ -8898,18 +8902,19 @@ void MacroAssembler::char_array_compress(Register src, Register dst, Register le // bail out when there is nothing to be done testl(tmp5, 0xFFFFFFFF); - jcc(Assembler::zero, post_alignment); + jccb(Assembler::zero, post_alignment); // ~(~0 << len), where len is the # of remaining elements to process - movl(result, 0xFFFFFFFF); - shlxl(result, result, tmp5); - notl(result); - kmovdl(mask2, result); + movl(len, 0xFFFFFFFF); + shlxl(len, len, tmp5); + notl(len); + kmovdl(mask2, len); + movl(len, result); evmovdquw(tmp1Reg, mask2, Address(src, 0), /*merge*/ false, Assembler::AVX_512bit); evpcmpw(mask1, mask2, tmp1Reg, tmp2Reg, Assembler::le, /*signed*/ false, Assembler::AVX_512bit); ktestd(mask1, mask2); - jcc(Assembler::carryClear, return_zero); + jcc(Assembler::carryClear, copy_tail); evpmovwb(Address(dst, 0), mask2, tmp1Reg, Assembler::AVX_512bit); @@ -8924,7 +8929,7 @@ void MacroAssembler::char_array_compress(Register src, Register dst, Register le movl(tmp5, len); andl(tmp5, (32 - 1)); // tail count (in chars) andl(len, ~(32 - 1)); // vector count (in chars) - jcc(Assembler::zero, copy_loop_tail); + jccb(Assembler::zero, copy_loop_tail); lea(src, Address(src, len, Address::times_2)); lea(dst, Address(dst, len, Address::times_1)); @@ -8934,55 +8939,60 @@ void MacroAssembler::char_array_compress(Register src, Register dst, Register le evmovdquw(tmp1Reg, Address(src, len, Address::times_2), Assembler::AVX_512bit); evpcmpuw(mask1, tmp1Reg, tmp2Reg, Assembler::le, Assembler::AVX_512bit); kortestdl(mask1, mask1); - jcc(Assembler::carryClear, return_zero); + jccb(Assembler::carryClear, reset_for_copy_tail); // All elements in current processed chunk are valid candidates for // compression. Write a truncated byte elements to the memory. evpmovwb(Address(dst, len, Address::times_1), tmp1Reg, Assembler::AVX_512bit); addptr(len, 32); - jcc(Assembler::notZero, copy_32_loop); + jccb(Assembler::notZero, copy_32_loop); bind(copy_loop_tail); // bail out when there is nothing to be done testl(tmp5, 0xFFFFFFFF); - jcc(Assembler::zero, return_length); + jcc(Assembler::zero, done); movl(len, tmp5); // ~(~0 << len), where len is the # of remaining elements to process - movl(result, 0xFFFFFFFF); - shlxl(result, result, len); - notl(result); + movl(tmp5, 0xFFFFFFFF); + shlxl(tmp5, tmp5, len); + notl(tmp5); - kmovdl(mask2, result); + kmovdl(mask2, tmp5); evmovdquw(tmp1Reg, mask2, Address(src, 0), /*merge*/ false, Assembler::AVX_512bit); evpcmpw(mask1, mask2, tmp1Reg, tmp2Reg, Assembler::le, /*signed*/ false, Assembler::AVX_512bit); ktestd(mask1, mask2); - jcc(Assembler::carryClear, return_zero); + jcc(Assembler::carryClear, copy_tail); evpmovwb(Address(dst, 0), mask2, tmp1Reg, Assembler::AVX_512bit); - jmp(return_length); + jmp(done); + + bind(reset_for_copy_tail); + lea(src, Address(src, tmp5, Address::times_2)); + lea(dst, Address(dst, tmp5, Address::times_1)); + subptr(len, tmp5); + jmp(copy_chars_loop); bind(below_threshold); } if (UseSSE42Intrinsics) { - Label copy_32_loop, copy_16, copy_tail; + Label copy_32_loop, copy_16, copy_tail_sse, reset_for_copy_tail; - movl(result, len); + // vectored compression + testl(len, 0xfffffff8); + jcc(Assembler::zero, copy_tail); movl(tmp5, 0xff00ff00); // create mask to test for Unicode chars in vectors + movdl(tmp1Reg, tmp5); + pshufd(tmp1Reg, tmp1Reg, 0); // store Unicode mask in tmp1Reg - // vectored compression - andl(len, 0xfffffff0); // vector count (in chars) - andl(result, 0x0000000f); // tail count (in chars) - testl(len, len); - jcc(Assembler::zero, copy_16); + andl(len, 0xfffffff0); + jccb(Assembler::zero, copy_16); // compress 16 chars per iter - movdl(tmp1Reg, tmp5); - pshufd(tmp1Reg, tmp1Reg, 0); // store Unicode mask in tmp1Reg pxor(tmp4Reg, tmp4Reg); lea(src, Address(src, len, Address::times_2)); @@ -8995,59 +9005,60 @@ void MacroAssembler::char_array_compress(Register src, Register dst, Register le movdqu(tmp3Reg, Address(src, len, Address::times_2, 16)); // load next 8 characters por(tmp4Reg, tmp3Reg); ptest(tmp4Reg, tmp1Reg); // check for Unicode chars in next vector - jcc(Assembler::notZero, return_zero); + jccb(Assembler::notZero, reset_for_copy_tail); packuswb(tmp2Reg, tmp3Reg); // only ASCII chars; compress each to 1 byte movdqu(Address(dst, len, Address::times_1), tmp2Reg); addptr(len, 16); - jcc(Assembler::notZero, copy_32_loop); + jccb(Assembler::notZero, copy_32_loop); // compress next vector of 8 chars (if any) bind(copy_16); - movl(len, result); - andl(len, 0xfffffff8); // vector count (in chars) - andl(result, 0x00000007); // tail count (in chars) - testl(len, len); - jccb(Assembler::zero, copy_tail); + // len = 0 + testl(result, 0x00000008); // check if there's a block of 8 chars to compress + jccb(Assembler::zero, copy_tail_sse); - movdl(tmp1Reg, tmp5); - pshufd(tmp1Reg, tmp1Reg, 0); // store Unicode mask in tmp1Reg pxor(tmp3Reg, tmp3Reg); movdqu(tmp2Reg, Address(src, 0)); ptest(tmp2Reg, tmp1Reg); // check for Unicode chars in vector - jccb(Assembler::notZero, return_zero); + jccb(Assembler::notZero, reset_for_copy_tail); packuswb(tmp2Reg, tmp3Reg); // only LATIN1 chars; compress each to 1 byte movq(Address(dst, 0), tmp2Reg); addptr(src, 16); addptr(dst, 8); + jmpb(copy_tail_sse); - bind(copy_tail); + bind(reset_for_copy_tail); + movl(tmp5, result); + andl(tmp5, 0x0000000f); + lea(src, Address(src, tmp5, Address::times_2)); + lea(dst, Address(dst, tmp5, Address::times_1)); + subptr(len, tmp5); + jmpb(copy_chars_loop); + + bind(copy_tail_sse); movl(len, result); + andl(len, 0x00000007); // tail count (in chars) } // compress 1 char per iter + bind(copy_tail); testl(len, len); - jccb(Assembler::zero, return_length); + jccb(Assembler::zero, done); lea(src, Address(src, len, Address::times_2)); lea(dst, Address(dst, len, Address::times_1)); negptr(len); bind(copy_chars_loop); - load_unsigned_short(result, Address(src, len, Address::times_2)); - testl(result, 0xff00); // check if Unicode char - jccb(Assembler::notZero, return_zero); - movb(Address(dst, len, Address::times_1), result); // ASCII char; compress to 1 byte + load_unsigned_short(tmp5, Address(src, len, Address::times_2)); + testl(tmp5, 0xff00); // check if Unicode char + jccb(Assembler::notZero, reset_sp); + movb(Address(dst, len, Address::times_1), tmp5); // ASCII char; compress to 1 byte increment(len); - jcc(Assembler::notZero, copy_chars_loop); + jccb(Assembler::notZero, copy_chars_loop); - // if compression succeeded, return length - bind(return_length); - pop(result); - jmpb(done); - - // if compression failed, return 0 - bind(return_zero); - xorl(result, result); - addptr(rsp, wordSize); + // add len then return (len will be zero if compress succeeded, otherwise negative) + bind(reset_sp); + addl(result, len); bind(done); } diff --git a/src/java.base/share/classes/java/lang/AbstractStringBuilder.java b/src/java.base/share/classes/java/lang/AbstractStringBuilder.java index 902a7c61ebd3..e472ba945501 100644 --- a/src/java.base/share/classes/java/lang/AbstractStringBuilder.java +++ b/src/java.base/share/classes/java/lang/AbstractStringBuilder.java @@ -1675,11 +1675,10 @@ void getBytes(byte[] dst, int dstBegin, byte coder) { /* for readObject() */ void initBytes(char[] value, int off, int len) { if (String.COMPACT_STRINGS) { - this.value = StringUTF16.compress(value, off, len); - if (this.value != null) { - this.coder = LATIN1; - return; - } + byte[] val = StringUTF16.compress(value, off, len); + this.coder = StringUTF16.coderFromArrayLen(val, len); + this.value = val; + return; } this.coder = UTF16; this.value = StringUTF16.toBytes(value, off, len); @@ -1720,6 +1719,9 @@ private final void putCharsAt(int index, CharSequence s, int off, int end) { val[j++] = (byte)c; } else { inflate(); + // store c to make sure it has a UTF16 char + StringUTF16.putChar(this.value, j++, c); + i++; StringUTF16.putCharsSB(this.value, j, s, i, end); return; } @@ -1807,6 +1809,10 @@ private final void appendChars(CharSequence s, int off, int end) { } else { count = j; inflate(); + // Store c to make sure sb has a UTF16 char + StringUTF16.putChar(this.value, j++, c); + count = j; + i++; StringUTF16.putCharsSB(this.value, j, s, i, end); count += end - i; return; @@ -1918,6 +1924,10 @@ public AbstractStringBuilder repeat(int codePoint, int count) { *

          * If {@code cs} is {@code null}, then the four characters * {@code "null"} are repeated into this sequence. + *

          + * The contents are unspecified if the {@code CharSequence} + * is modified during the method call or an exception is thrown + * when accessing the {@code CharSequence}. * * @param cs a {@code CharSequence} * @param count number of times to copy diff --git a/src/java.base/share/classes/java/lang/String.java b/src/java.base/share/classes/java/lang/String.java index cd8995e18e44..5216c9903b99 100644 --- a/src/java.base/share/classes/java/lang/String.java +++ b/src/java.base/share/classes/java/lang/String.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 2024, 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 @@ -344,12 +344,10 @@ public String(int[] codePoints, int offset, int count) { return; } if (COMPACT_STRINGS) { - byte[] val = StringLatin1.toBytes(codePoints, offset, count); - if (val != null) { - this.coder = LATIN1; - this.value = val; - return; - } + byte[] val = StringUTF16.compress(codePoints, offset, count); + this.coder = StringUTF16.coderFromArrayLen(val, count); + this.value = val; + return; } this.coder = UTF16; this.value = StringUTF16.toBytes(codePoints, offset, count); @@ -541,47 +539,43 @@ private String(Charset charset, byte[] bytes, int offset, int length) { this.coder = LATIN1; return; } - int sl = offset + length; - byte[] dst = new byte[length]; - if (dp > 0) { - System.arraycopy(bytes, offset, dst, 0, dp); - offset += dp; - } - while (offset < sl) { - int b1 = bytes[offset++]; + // Decode with a stable copy, to be the result if the decoded length is the same + byte[] latin1 = Arrays.copyOfRange(bytes, offset, offset + length); + int sp = dp; // first dp bytes are already in the copy + while (sp < length) { + int b1 = latin1[sp++]; if (b1 >= 0) { - dst[dp++] = (byte)b1; + latin1[dp++] = (byte)b1; continue; } - if ((b1 & 0xfe) == 0xc2 && offset < sl) { // b1 either 0xc2 or 0xc3 - int b2 = bytes[offset]; + if ((b1 & 0xfe) == 0xc2 && sp < length) { // b1 either 0xc2 or 0xc3 + int b2 = latin1[sp]; if (b2 < -64) { // continuation bytes are always negative values in the range -128 to -65 - dst[dp++] = (byte)decode2(b1, b2); - offset++; + latin1[dp++] = (byte)decode2(b1, b2); + sp++; continue; } } // anything not a latin1, including the REPL // we have to go with the utf16 - offset--; + sp--; break; } - if (offset == sl) { - if (dp != dst.length) { - dst = Arrays.copyOf(dst, dp); + if (sp == length) { + if (dp != latin1.length) { + latin1 = Arrays.copyOf(latin1, dp); } - this.value = dst; + this.value = latin1; this.coder = LATIN1; return; } - byte[] buf = StringUTF16.newBytesFor(length); - StringLatin1.inflate(dst, 0, buf, 0, dp); - dst = buf; - dp = decodeUTF8_UTF16(bytes, offset, sl, dst, dp, true); + byte[] utf16 = StringUTF16.newBytesFor(length); + StringLatin1.inflate(latin1, 0, utf16, 0, dp); + dp = decodeUTF8_UTF16(latin1, sp, length, utf16, dp, true); if (dp != length) { - dst = Arrays.copyOf(dst, dp << 1); + utf16 = Arrays.copyOf(utf16, dp << 1); } - this.value = dst; + this.value = utf16; this.coder = UTF16; } else { // !COMPACT_STRINGS byte[] dst = StringUTF16.newBytesFor(length); @@ -653,12 +647,10 @@ private String(Charset charset, byte[] bytes, int offset, int length) { char[] ca = new char[en]; int clen = ad.decode(bytes, offset, length, ca); if (COMPACT_STRINGS) { - byte[] bs = StringUTF16.compress(ca, 0, clen); - if (bs != null) { - value = bs; - coder = LATIN1; - return; - } + byte[] val = StringUTF16.compress(ca, 0, clen);; + this.coder = StringUTF16.coderFromArrayLen(val, clen); + this.value = val; + return; } coder = UTF16; value = StringUTF16.toBytes(ca, 0, clen); @@ -684,12 +676,10 @@ private String(Charset charset, byte[] bytes, int offset, int length) { throw new Error(x); } if (COMPACT_STRINGS) { - byte[] bs = StringUTF16.compress(ca, 0, caLen); - if (bs != null) { - value = bs; - coder = LATIN1; - return; - } + byte[] val = StringUTF16.compress(ca, 0, caLen); + this.coder = StringUTF16.coderFromArrayLen(val, caLen); + this.value = val; + return; } coder = UTF16; value = StringUTF16.toBytes(ca, 0, caLen); @@ -827,10 +817,9 @@ private static String newStringNoRepl1(byte[] src, Charset cs) { throw new IllegalArgumentException(x); } if (COMPACT_STRINGS) { - byte[] bs = StringUTF16.compress(ca, 0, caLen); - if (bs != null) { - return new String(bs, LATIN1); - } + byte[] val = StringUTF16.compress(ca, 0, caLen); + byte coder = StringUTF16.coderFromArrayLen(val, caLen); + return new String(val, coder); } return new String(StringUTF16.toBytes(ca, 0, caLen), UTF16); } @@ -4750,15 +4739,18 @@ void getBytes(byte[] dst, int srcPos, int dstBegin, byte coder, int length) { } /* - * Package private constructor. Trailing Void argument is there for + * Private constructor. Trailing Void argument is there for * disambiguating it against other (public) constructors. * * Stores the char[] value into a byte[] that each byte represents * the8 low-order bits of the corresponding character, if the char[] * contains only latin1 character. Or a byte[] that stores all * characters in their byte sequences defined by the {@code StringUTF16}. + * + *

          The contents of the string are unspecified if the character array + * is modified during string construction. */ - String(char[] value, int off, int len, Void sig) { + private String(char[] value, int off, int len, Void sig) { if (len == 0) { this.value = "".value; this.coder = "".coder; @@ -4766,11 +4758,9 @@ void getBytes(byte[] dst, int srcPos, int dstBegin, byte coder, int length) { } if (COMPACT_STRINGS) { byte[] val = StringUTF16.compress(value, off, len); - if (val != null) { - this.value = val; - this.coder = LATIN1; - return; - } + this.coder = StringUTF16.coderFromArrayLen(val, len); + this.value = val; + return; } this.coder = UTF16; this.value = StringUTF16.toBytes(value, off, len); @@ -4779,6 +4769,9 @@ void getBytes(byte[] dst, int srcPos, int dstBegin, byte coder, int length) { /* * Package private constructor. Trailing Void argument is there for * disambiguating it against other (public) constructors. + * + *

          The contents of the string are unspecified if the {@code StringBuilder} + * is modified during string construction. */ String(AbstractStringBuilder asb, Void sig) { byte[] val = asb.getValue(); @@ -4789,12 +4782,9 @@ void getBytes(byte[] dst, int srcPos, int dstBegin, byte coder, int length) { } else { // only try to compress val if some characters were deleted. if (COMPACT_STRINGS && asb.maybeLatin1) { - byte[] buf = StringUTF16.compress(val, 0, length); - if (buf != null) { - this.coder = LATIN1; - this.value = buf; - return; - } + this.value = StringUTF16.compress(val, 0, length); + this.coder = StringUTF16.coderFromArrayLen(this.value, length); + return; } this.coder = UTF16; this.value = Arrays.copyOfRange(val, 0, length << 1); diff --git a/src/java.base/share/classes/java/lang/StringLatin1.java b/src/java.base/share/classes/java/lang/StringLatin1.java index 7c12e5711b39..7f901e4717c4 100644 --- a/src/java.base/share/classes/java/lang/StringLatin1.java +++ b/src/java.base/share/classes/java/lang/StringLatin1.java @@ -47,8 +47,12 @@ public static char charAt(byte[] value, int index) { return (char)(value[index] & 0xff); } + public static boolean canEncode(char cp) { + return cp <= 0xff; + } + public static boolean canEncode(int cp) { - return cp >>> 8 == 0; + return cp >=0 && cp <= 0xff; } public static int length(byte[] value) { diff --git a/src/java.base/share/classes/java/lang/StringUTF16.java b/src/java.base/share/classes/java/lang/StringUTF16.java index 73d858639909..314ddae13400 100644 --- a/src/java.base/share/classes/java/lang/StringUTF16.java +++ b/src/java.base/share/classes/java/lang/StringUTF16.java @@ -33,7 +33,6 @@ import java.util.stream.Stream; import java.util.stream.StreamSupport; import jdk.internal.util.ArraysSupport; -import jdk.internal.vm.annotation.DontInline; import jdk.internal.vm.annotation.ForceInline; import jdk.internal.vm.annotation.IntrinsicCandidate; @@ -42,15 +41,23 @@ final class StringUTF16 { + // Return a new byte array for a UTF16-coded string for len chars + // Throw an exception if out of range public static byte[] newBytesFor(int len) { + return new byte[newBytesLength(len)]; + } + + // Check the size of a UTF16-coded string + // Throw an exception if out of range + public static int newBytesLength(int len) { if (len < 0) { throw new NegativeArraySizeException(); } - if (len > MAX_LENGTH) { + if (len >= MAX_LENGTH) { throw new OutOfMemoryError("UTF16 String size is " + len + ", should be less than " + MAX_LENGTH); } - return new byte[len << 1]; + return len << 1; } @IntrinsicCandidate @@ -147,6 +154,13 @@ public static char[] toChars(byte[] value) { return dst; } + /** + * {@return an encoded byte[] for the UTF16 characters in char[]} + * No checking is done on the characters, some may or may not be latin1. + * @param value a char array + * @param off an offset + * @param len a length + */ @IntrinsicCandidate public static byte[] toBytes(char[] value, int off, int len) { byte[] val = newBytesFor(len); @@ -157,20 +171,209 @@ public static byte[] toBytes(char[] value, int off, int len) { return val; } - public static byte[] compress(char[] val, int off, int len) { - byte[] ret = new byte[len]; - if (compress(val, off, ret, 0, len) == len) { - return ret; + // Clever way to get the coder from a byte array returned from compress + // that maybe either latin1 or UTF16-coded + // Equivalent to (len == val.length) ? LATIN1 : UTF16 + @ForceInline + static byte coderFromArrayLen(byte[] value, int len) { + return (byte) ((len - value.length) >>> Integer.SIZE - 1); + } + + /** + * {@return Compress the char array (containing UTF16) into a compact strings byte array} + * If all the chars are LATIN1, it returns an array with len == count, + * otherwise, it contains UTF16 characters. + *

          + * A UTF16 array is returned *only* if at least 1 non-latin1 character is present. + * This must be true even if the input array is modified while this method is executing. + * This is assured by copying the characters while checking for latin1. + * If all characters are latin1, a byte array with length equals count is returned, + * indicating all latin1 chars. The scan may be implemented as an intrinsic, + * which returns the index of the first non-latin1 character. + * When the first non-latin1 character is found, it switches to creating a new + * buffer; the saved prefix of latin1 characters is copied to the new buffer; + * and the remaining input characters are copied to the buffer. + * The index of the known non-latin1 character is checked, if it is latin1, + * the input has been changed. In this case, a second attempt is made to compress to + * latin1 from the copy made in the first pass to the originally allocated latin1 buffer. + * If it succeeds the return value is latin1, otherwise, the utf16 value is returned. + * In this unusual case, the result is correct for the snapshot of the value. + * The resulting string contents are unspecified if the input array is modified during this + * operation, but it is ensured that at least 1 non-latin1 character is present in + * the non-latin1 buffer. + * + * @param val a char array + * @param off starting offset + * @param count count of chars to be compressed, {@code count} > 0 + */ + @ForceInline + public static byte[] compress(final char[] val, final int off, final int count) { + byte[] latin1 = new byte[count]; + int ndx = compress(val, off, latin1, 0, count); + if (ndx != count) { + // Switch to UTF16 + byte[] utf16 = toBytes(val, off, count); + // If the original character that was found to be non-latin1 is latin1 in the copy + // try to make a latin1 string from the copy + if (getChar(utf16, ndx) > 0xff + || compress(utf16, 0, latin1, 0, count) != count) { + return utf16; + } } - return null; + return latin1; // latin1 success + } + + /** + * {@return Compress the internal byte array (containing UTF16) into a compact strings byte array} + * If all the chars are LATIN1, it returns an array with len == count, + * otherwise, it contains UTF16 characters. + *

          + * Refer to the description of the algorithm in {@link #compress(char[], int, int)}. + * + * @param val a byte array with UTF16 coding + * @param off starting offset + * @param count count of chars to be compressed, {@code count} > 0 + */ + public static byte[] compress(final byte[] val, final int off, final int count) { + byte[] latin1 = new byte[count]; + int ndx = compress(val, off, latin1, 0, count); + if (ndx != count) {// Switch to UTF16 + byte[] utf16 = Arrays.copyOfRange(val, off << 1, newBytesLength(off + count)); + // If the original character that was found to be non-latin1 is latin1 in the copy + // try to make a latin1 string from the copy + if (getChar(utf16, ndx) > 0xff + || compress(utf16, 0, latin1, 0, count) != count) { + return utf16; + } + } + return latin1; // latin1 success } - public static byte[] compress(byte[] val, int off, int len) { - byte[] ret = new byte[len]; - if (compress(val, off, ret, 0, len) == len) { - return ret; + /** + * {@return compress the code points into a compact strings byte array} + * If all the chars are LATIN1, returns an array with len == count. + * If not, a new byte array is allocated and code points converted to UTF16. + * The algorithm is similar to that of {@link #compress(char[], int, int)}. + *

          + * The resulting encoding is attempted in several steps: + *

            + *
          • If no non-latin1 characters are found, the encoding is latin1
          • + *
          • If an estimate of the number of characters needed to represent the codepoints is + * equal to the string length, they are all BMP with at least 1 UTF16 character + * and are copied to the result.
          • + *
          • The extractCodePoints method is called to carefully expand surrogates.
          • + *
          + * + * @param val an int array of code points + * @param off starting offset + * @param count length of code points to be compressed, length > 0 + */ + public static byte[] compress(final int[] val, int off, final int count) { + // Optimistically copy all latin1 code points to the destination + byte[] latin1 = new byte[count]; + final int end = off + count; + for (int ndx = 0; ndx < count; ndx++, off++) { + int cp = val[off]; + if (cp >= 0 && cp <= 0xff) { + latin1[ndx] = (byte)cp; + } else { + // Pass 1: Compute precise size of char[]; see extractCodePoints for caveat + int estSize = ndx + computeCodePointSize(val, off, end); + + // Pass 2: Switch to UTF16 + // cp = val[ndx] is at least one code point known to be UTF16 + byte[] utf16 = newBytesFor(estSize); + if (ndx > 0) { + StringLatin1.inflate(latin1, 0, utf16, 0, ndx); // inflate latin1 bytes + } + + if (estSize == count) { + // Based on the computed size, all remaining code points are BMP and + // can be copied without checking again + putChar(utf16, ndx, cp); // ensure utf16 has a UTF16 char + off++; + for (int i = ndx + 1; i < count; i++, off++) { + putChar(utf16, i, val[off]); + } + } else { + // Some codepoint is a surrogate pair + utf16 = extractCodepoints(val, off, end, utf16, ndx); + + // The original character that was found to be UTF16 is not UTF16 in the copy + // Try to make a latin1 string from the copy + if (getChar(utf16, ndx) <= 0xff && + compress(utf16, 0, latin1, 0, count) == count) { + return latin1; // latin1 success + } + } + return utf16; + } } - return null; + return latin1; // Latin1 success + } + + // Extract code points into chars in the byte array + // + // Guard against possible races with the input array changing between the previous + // computation of the required output size and storing the bmp or surrogates. + // If a BMP code point is changed to a supplementary code point it would require 2 chars + // in the output. Changing a supplementary char to BMP would reduce the size. + // If the utf16 destination is not large enough, it is resized to fit the + // remaining codepoints assuming they occupy 2 characters. + // The destination may be copied to return exactly the final length. + // The additional allocations and compression only occur if the input array is modified. + private static byte[] extractCodepoints(int[] val, int off, int end, byte[] dst, int dstOff) { + while (off < end) { + // Compute a minimum estimate on the number of characters can be put into the dst + // given the current codepoint and the number of remaining codepoints + int codePoint = val[off]; // read each codepoint from val only once + int dstLimit = dstOff + + Character.charCount(codePoint) + + (end - off - 1); + if (dstLimit > (dst.length >> 1)) { + // Resize to hold the remaining codepoints assuming they are all surrogates. + // By resizing to the maximum that might be needed, only a single resize will occur. + // dstLimit includes only a single char per codepoint, pad with an additional for each. + int maxRemaining = dstLimit + (end - off - 1); + dst = Arrays.copyOf(dst, newBytesLength(maxRemaining)); + } + // Efficiently copy as many codepoints as fit within the current estimated limit + // The dst at least enough space for the current codepoint. + while (true) { + if (Character.isBmpCodePoint(codePoint)) { + putChar(dst, dstOff++, codePoint); + } else { + putChar(dst, dstOff++, Character.highSurrogate(codePoint)); + putChar(dst, dstOff++, Character.lowSurrogate(codePoint)); + } + off++; + if (dstOff + 2 > dstLimit) + break; // no space for another surrogate; recompute limit + codePoint = val[off]; + } + } + if (dstOff != (dst.length >> 1)) { + // Truncate to actual length; should only occur if a codepoint was racily + // changed from a surrogate to a BMP character. + return Arrays.copyOf(dst, newBytesLength(dstOff)); + } + return dst; + } + + // Compute the number of chars needed to represent the code points from off to end-1 + private static int computeCodePointSize(int[] val, int off, int end) { + int n = end - off; + while (off < end) { + int codePoint = val[off++]; + if (Character.isBmpCodePoint(codePoint)) { + continue; + } else if (Character.isValidCodePoint(codePoint)) { + n++; + } else { + throw new IllegalArgumentException(Integer.toString(codePoint)); + } + } + return n; } // compressedCopy char[] -> byte[] @@ -178,9 +381,8 @@ public static byte[] compress(byte[] val, int off, int len) { public static int compress(char[] src, int srcOff, byte[] dst, int dstOff, int len) { for (int i = 0; i < len; i++) { char c = src[srcOff]; - if (c > 0xFF) { - len = 0; - break; + if (c > 0xff) { + return i; // return index of non-latin1 char } dst[dstOff] = (byte)c; srcOff++; @@ -196,9 +398,8 @@ public static int compress(byte[] src, int srcOff, byte[] dst, int dstOff, int l checkBoundsOffCount(srcOff, len, src); for (int i = 0; i < len; i++) { char c = getChar(src, srcOff); - if (c > 0xFF) { - len = 0; - break; + if (c > 0xff) { + return i; // return index of non-latin1 char } dst[dstOff] = (byte)c; srcOff++; @@ -207,31 +408,14 @@ public static int compress(byte[] src, int srcOff, byte[] dst, int dstOff, int l return len; } + // Create the UTF16 buffer for !COMPACT_STRINGS public static byte[] toBytes(int[] val, int index, int len) { final int end = index + len; - // Pass 1: Compute precise size of char[] - int n = len; - for (int i = index; i < end; i++) { - int cp = val[i]; - if (Character.isBmpCodePoint(cp)) - continue; - else if (Character.isValidCodePoint(cp)) - n++; - else throw new IllegalArgumentException(Integer.toString(cp)); - } - // Pass 2: Allocate and fill in pair + int n = computeCodePointSize(val, index, end); + byte[] buf = newBytesFor(n); - for (int i = index, j = 0; i < end; i++, j++) { - int cp = val[i]; - if (Character.isBmpCodePoint(cp)) { - putChar(buf, j, cp); - } else { - putChar(buf, j++, Character.highSurrogate(cp)); - putChar(buf, j, Character.lowSurrogate(cp)); - } - } - return buf; - } + return extractCodepoints(val, index, end, buf, 0); + } public static byte[] toBytes(char c) { byte[] result = new byte[2]; @@ -652,10 +836,9 @@ public static String replace(byte[] value, char oldChar, char newChar) { if (String.COMPACT_STRINGS && !StringLatin1.canEncode(oldChar) && StringLatin1.canEncode(newChar)) { - byte[] val = compress(buf, 0, len); - if (val != null) { - return new String(val, LATIN1); - } + byte[] res = StringUTF16.compress(buf, 0, len); + byte coder = StringUTF16.coderFromArrayLen(res, len); + return new String(res, coder); } return new String(buf, UTF16); } @@ -770,10 +953,9 @@ public static String replace(byte[] value, int valLen, boolean valLat1, if (String.COMPACT_STRINGS && replLat1 && !targLat1) { // combination 6 - byte[] lat1Result = compress(result, 0, resultLen); - if (lat1Result != null) { - return new String(lat1Result, LATIN1); - } + byte[] res = StringUTF16.compress(result, 0, resultLen); + byte coder = StringUTF16.coderFromArrayLen(res, resultLen); + return new String(res, coder); // combination 6 } return new String(result, UTF16); } @@ -837,7 +1019,7 @@ public static String toLowerCase(String str, byte[] value, Locale locale) { bits |= cp; putChar(result, i, cp); } - if (bits > 0xFF) { + if (bits < 0 || bits > 0xff) { return new String(result, UTF16); } else { return newString(result, 0, len); @@ -938,7 +1120,7 @@ public static String toUpperCase(String str, byte[] value, Locale locale) { bits |= cp; putChar(result, i, cp); } - if (bits > 0xFF) { + if (bits < 0 || bits > 0xff) { return new String(result, UTF16); } else { return newString(result, 0, len); @@ -1167,10 +1349,9 @@ public static String newString(byte[] val, int index, int len) { return ""; } if (String.COMPACT_STRINGS) { - byte[] buf = compress(val, index, len); - if (buf != null) { - return new String(buf, LATIN1); - } + byte[] res = StringUTF16.compress(val, index, len); + byte coder = StringUTF16.coderFromArrayLen(res, len); + return new String(res, coder); } int last = index + len; return new String(Arrays.copyOfRange(val, index << 1, last << 1), UTF16); @@ -1501,8 +1682,8 @@ public static int lastIndexOfLatin1(byte[] src, int srcCount, private static native boolean isBigEndian(); - static final int HI_BYTE_SHIFT; - static final int LO_BYTE_SHIFT; + private static final int HI_BYTE_SHIFT; + private static final int LO_BYTE_SHIFT; static { if (isBigEndian()) { HI_BYTE_SHIFT = 8; diff --git a/test/hotspot/jtreg/compiler/intrinsics/string/TestStringConstructionIntrinsics.java b/test/hotspot/jtreg/compiler/intrinsics/string/TestStringConstructionIntrinsics.java new file mode 100644 index 000000000000..8bec9822462d --- /dev/null +++ b/test/hotspot/jtreg/compiler/intrinsics/string/TestStringConstructionIntrinsics.java @@ -0,0 +1,253 @@ +/* + * Copyright (c) 2023, 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 8311906 + * @summary Validates String constructor intrinsics using varied input data. + * @key randomness + * @library /compiler/patches /test/lib + * @build java.base/java.lang.Helper + * @run main/othervm/timeout=1200 -Xbatch -XX:CompileThreshold=100 compiler.intrinsics.string.TestStringConstructionIntrinsics + */ +/* + * @test + * @bug 8311906 + * @summary Validates String constructor intrinsic for AVX3 works with and without + * AVX3Threshold=0 + * @key randomness + * @library /compiler/patches /test/lib + * @build java.base/java.lang.Helper + * @requires vm.cpu.features ~= ".*avx512.*" + * @run main/othervm/timeout=1200 -Xbatch -XX:CompileThreshold=100 -XX:UseAVX=3 compiler.intrinsics.string.TestStringConstructionIntrinsics + * @run main/othervm/timeout=1200 -Xbatch -XX:CompileThreshold=100 -XX:UseAVX=3 -XX:+UnlockDiagnosticVMOptions -XX:AVX3Threshold=0 compiler.intrinsics.string.TestStringConstructionIntrinsics + */ + +package compiler.intrinsics.string; + +import java.lang.Helper; +import java.util.Random; + +import jdk.test.lib.Utils; + +public class TestStringConstructionIntrinsics { + + private static byte[] bytes = new byte[2 * (4096 + 32)]; + + private static char[] chars = new char[4096 + 32]; + + // Used a scratch buffer, sized to accommodate inflated + private static byte[] dst = new byte[bytes.length * 2]; + + private static final Random RANDOM = Utils.getRandomInstance(); + + /** + * Completely initialize the bytes test array. The lowest index that will be + * non-latin1 is marked by nlOffset + */ + public static void initializeBytes(int off, int len, int nonLatin1, int nlOffset) { + int maxLen = bytes.length >> 1; + assert (len + off < maxLen); + // insert "canary" (non-latin1) values before offset + for (int i = 0; i < off; i++) { + Helper.putCharSB(bytes, i, ((i + 15) & 0x7F) | 0x180); + } + // fill the array segment + for (int i = off; i < len + off; i++) { + Helper.putCharSB(bytes, i, ((i - off + 15) & 0xFF)); + } + if (nonLatin1 != 0) { + // modify a number disparate indexes to be non-latin1 + for (int i = 0; i < nonLatin1; i++) { + int idx = off + RANDOM.nextInt(len - nlOffset) + nlOffset; + Helper.putCharSB(bytes, i, ((i + 15) & 0x7F) | 0x180); + } + } + // insert "canary" non-latin1 values after array segment + for (int i = len + off; i < maxLen; i++) { + Helper.putCharSB(bytes, i, ((i + 15) & 0x7F) | 0x180); + } + } + + /** + * Completely initialize the char test array. The lowest index that will be + * non-latin1 is marked by nlOffset + */ + public static void initializeChars(int off, int len, int nonLatin1, int nlOffset) { + assert (len + off <= chars.length); + // insert "canary" non-latin1 values before offset + for (int i = 0; i < off; ++i) { + chars[i] = (char) (((i + 15) & 0x7F) | 0x180); + } + // fill the array segment + for (int i = off; i < len + off; ++i) { + chars[i] = (char) (((i - off + 15) & 0xFF)); + } + if (nonLatin1 != 0) { + // modify a number disparate chars inside + // segment to be non-latin1. + for (int i = 0; i < nonLatin1; i++) { + int idx = off + RANDOM.nextInt(len - nlOffset) + nlOffset; + chars[idx] = (char) (0x180 | chars[idx]); + } + } + // insert "canary" non-latin1 values after array segment + for (int i = len + off; i < chars.length; ++i) { + chars[i] = (char) (((i + 15) & 0x7F) | 0x180); + } + } + + /** + * Test different array segment sizes, offsets, and number of non-latin1 + * chars. + */ + public static void testConstructBytes() throws Exception { + for (int off = 0; off < 16; off++) { // starting offset of array segment + // Test all array segment sizes 1-63 + for (int len = 1; len < 64; len++) { + testConstructBytes(off, len, 0, 0); + testConstructBytes(off, len, 1, 0); + testConstructBytes(off, len, RANDOM.nextInt(30) + 2, 0); + } + // Test a random selection of sizes between 64 and 4099, inclusive + for (int i = 0; i < 20; i++) { + int len = 64 + RANDOM.nextInt(4100 - 64); + testConstructBytes(off, len, 0, 0); + testConstructBytes(off, len, 1, 0); + testConstructBytes(off, len, RANDOM.nextInt(len) + 2, 0); + } + for (int len : new int[] { 128, 2048 }) { + // test with negatives only in a 1-63 byte tail + int tail = RANDOM.nextInt(63) + 1; + int ng = RANDOM.nextInt(tail) + 1; + testConstructBytes(off, len + tail, ng, len); + } + } + } + + private static void testConstructBytes(int off, int len, int ng, int ngOffset) throws Exception { + assert (len + off < bytes.length); + initializeBytes(off, len, ng, ngOffset); + byte[] dst = new byte[bytes.length]; + + int calculated = Helper.compress(bytes, off, dst, 0, len); + int expected = compress(bytes, off, dst, 0, len); + if (calculated != expected) { + if (expected != len && ng >= 0 && calculated >= 0 && calculated < expected) { + // allow intrinsics to return early with a lower value, + // but only if we're not expecting the full length (no + // negative bytes) + return; + } + throw new Exception("Failed testConstructBytes: " + "offset: " + off + " " + + "length: " + len + " " + "return: " + calculated + " expected: " + expected + " negatives: " + + ng + " offset: " + ngOffset); + } + } + + private static int compress(byte[] src, int srcOff, byte[] dst, int dstOff, int len) { + for (int i = 0; i < len; i++) { + char c = Helper.charAt(src, srcOff); + if (c > 0xff) { + return i; // return index of non-latin1 char + } + dst[dstOff] = (byte)c; + srcOff++; + dstOff++; + } + return len; + } + + /** + * Test different array segment sizes, offsets, and number of non-latin1 + * chars. + */ + public static void testConstructChars() throws Exception { + for (int off = 0; off < 16; off++) { // starting offset of array segment + // Test all array segment sizes 1-63 + for (int len = 1; len < 64; len++) { + testConstructChars(off, len, 0, 0); + testConstructChars(off, len, 1, 0); + testConstructChars(off, len, RANDOM.nextInt(30) + 2, 0); + } + // Test a random selection of sizes between 64 and 4099, inclusive + for (int i = 0; i < 20; i++) { + int len = 64 + RANDOM.nextInt(4100 - 64); + testConstructChars(off, len, 0, 0); + testConstructChars(off, len, 1, 0); + testConstructChars(off, len, RANDOM.nextInt(len) + 2, 0); + } + for (int len : new int[] { 128, 2048 }) { + // test with negatives only in a 1-63 byte tail + int tail = RANDOM.nextInt(63) + 1; + int ng = RANDOM.nextInt(tail) + 1; + testConstructChars(off, len + tail, ng, len); + } + } + } + + private static void testConstructChars(int off, int len, int nonLatin1, int nlOffset) throws Exception { + assert (len + off < bytes.length); + initializeChars(off, len, nonLatin1, nlOffset); + + int calculated = Helper.compress(chars, off, dst, 0, len); + int expected = compress(chars, off, dst, 0, len); + if (calculated != expected) { + if (expected != len && nonLatin1 >= 0 && calculated >= 0 && calculated < expected) { + // allow intrinsics to return early with a lower value, + // but only if we're not expecting the full length (no + // negative bytes) + return; + } + throw new Exception("Failed testConstructChars: " + "offset: " + off + " " + + "length: " + len + " " + "return: " + calculated + " expected: " + expected + " non-latin1: " + + nonLatin1 + " offset: " + nlOffset); + } + } + + private static int compress(char[] src, int srcOff, byte[] dst, int dstOff, int len) { + for (int i = 0; i < len; i++) { + char c = src[srcOff]; + if (c > 0xff) { + return i; // return index of non-latin1 char + } + dst[dstOff] = (byte)c; + srcOff++; + dstOff++; + } + return len; + } + + public void run() throws Exception { + // iterate to eventually get intrinsic inlined + for (int j = 0; j < 200; ++j) { + testConstructBytes(); + testConstructChars(); + } + } + + public static void main(String[] args) throws Exception { + (new TestStringConstructionIntrinsics()).run(); + System.out.println("string construction intrinsics validated"); + } +} diff --git a/test/hotspot/jtreg/compiler/patches/java.base/java/lang/Helper.java b/test/hotspot/jtreg/compiler/patches/java.base/java/lang/Helper.java index 49cb89b6f7fd..a24d7b98ada5 100644 --- a/test/hotspot/jtreg/compiler/patches/java.base/java/lang/Helper.java +++ b/test/hotspot/jtreg/compiler/patches/java.base/java/lang/Helper.java @@ -44,6 +44,11 @@ public static byte[] compressByte(byte[] src, int srcOff, int dstSize, int dstOf return dst; } + @jdk.internal.vm.annotation.ForceInline + public static int compress(byte[] src, int srcOff, byte[] dst, int dstOff, int len) { + return StringUTF16.compress(src, srcOff, dst, dstOff, len); + } + @jdk.internal.vm.annotation.ForceInline public static byte[] compressChar(char[] src, int srcOff, int dstSize, int dstOff, int len) { byte[] dst = new byte[dstSize]; @@ -51,6 +56,11 @@ public static byte[] compressChar(char[] src, int srcOff, int dstSize, int dstOf return dst; } + @jdk.internal.vm.annotation.ForceInline + public static int compress(char[] src, int srcOff, byte[] dst, int dstOff, int len) { + return StringUTF16.compress(src, srcOff, dst, dstOff, len); + } + @jdk.internal.vm.annotation.ForceInline public static byte[] inflateByte(byte[] src, int srcOff, int dstSize, int dstOff, int len) { byte[] dst = new byte[dstSize]; diff --git a/test/jdk/java/lang/String/Chars.java b/test/jdk/java/lang/String/Chars.java index ab6771b8e0b0..035a7a9de27f 100644 --- a/test/jdk/java/lang/String/Chars.java +++ b/test/jdk/java/lang/String/Chars.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2023, 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 @@ -22,10 +22,12 @@ */ /* - @test - @bug 8054307 - @summary test chars() and codePoints() -*/ + * @test + * @bug 8054307 8311906 8321514 + * @summary test String chars() and codePoints() + * @run main/othervm -XX:+CompactStrings Chars + * @run main/othervm -XX:-CompactStrings Chars + */ import java.util.Arrays; import java.util.Random; @@ -44,6 +46,8 @@ public static void main(String[] args) { cc[j] = (char)(ccExp[j] = cpExp[j] = r.nextInt(0x80)); } testChars(cc, ccExp); + testCharsSubrange(cc, ccExp); + testIntsSubrange(ccExp); testCPs(cc, cpExp); // bmp without surrogates @@ -51,6 +55,7 @@ public static void main(String[] args) { cc[j] = (char)(ccExp[j] = cpExp[j] = r.nextInt(0x8000)); } testChars(cc, ccExp); + testCharsSubrange(cc, ccExp); testCPs(cc, cpExp); // bmp with surrogates @@ -69,6 +74,8 @@ public static void main(String[] args) { } cpExp = Arrays.copyOf(cpExp, k); testChars(cc, ccExp); + testCharsSubrange(cc, ccExp); + testIntsSubrange(ccExp); testCPs(cc, cpExp); } } @@ -76,14 +83,56 @@ public static void main(String[] args) { static void testChars(char[] cc, int[] expected) { String str = new String(cc); if (!Arrays.equals(expected, str.chars().toArray())) { - throw new RuntimeException("chars/codePoints() failed!"); + throw new RuntimeException("testChars failed!"); + } + } + + static void testCharsSubrange(char[] cc, int[] expected) { + int[] offsets = { 7, 31 }; // offsets to test + int LENGTH = 13; + for (int i = 0; i < offsets.length; i++) { + int offset = Math.max(0, offsets[i]); // confine to the input array + int count = Math.min(LENGTH, cc.length - offset); + String str = new String(cc, offset, count); + int[] actual = str.chars().toArray(); + int errOffset = Arrays.mismatch(actual, 0, actual.length, + expected, offset, offset + count); + if (errOffset >= 0) { + System.err.printf("expected[%d] (%d) != actual[%d] (%d)%n", + offset + errOffset, expected[offset + errOffset], + errOffset, actual[errOffset]); + System.err.println("expected: " + Arrays.toString(expected)); + System.err.println("actual: " + Arrays.toString(actual)); + throw new RuntimeException("testCharsSubrange failed!"); + } + } + } + + static void testIntsSubrange(int[] expected) { + int[] offsets = { 7, 31 }; // offsets to test + int LENGTH = 13; + for (int i = 0; i < offsets.length; i++) { + int offset = Math.max(0, offsets[i]); // confine to the input array + int count = Math.min(LENGTH, expected.length - offset); + String str = new String(expected, offset, count); + int[] actual = str.chars().toArray(); + int errOffset = Arrays.mismatch(actual, 0, actual.length, + expected, offset, offset + count); + if (errOffset >= 0) { + System.err.printf("expected[%d] (%d) != actual[%d] (%d)%n", + offset + errOffset, expected[offset + errOffset], + errOffset, actual[errOffset]); + System.err.println("expected: " + Arrays.toString(expected)); + System.err.println("actual: " + Arrays.toString(actual)); + throw new RuntimeException("testIntsSubrange failed!"); + } } } static void testCPs(char[] cc, int[] expected) { String str = new String(cc); if (!Arrays.equals(expected, str.codePoints().toArray())) { - throw new RuntimeException("chars/codePoints() failed!"); + throw new RuntimeException("testCPs failed!"); } } } diff --git a/test/jdk/java/lang/String/CompactString/MaxSizeUTF16String.java b/test/jdk/java/lang/String/CompactString/MaxSizeUTF16String.java new file mode 100644 index 000000000000..530171e0b646 --- /dev/null +++ b/test/jdk/java/lang/String/CompactString/MaxSizeUTF16String.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2023, 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 org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +import java.nio.charset.StandardCharsets; + +/* + * @test + * @bug 8077559 8321180 + * @summary Tests Compact String for maximum size strings + * @requires os.maxMemory >= 8g & vm.bits == 64 + * @requires vm.flagless + * @run junit/othervm -XX:+CompactStrings -Xmx8g MaxSizeUTF16String + * @run junit/othervm -XX:-CompactStrings -Xmx8g MaxSizeUTF16String + * @run junit/othervm -Xcomp -Xmx8g MaxSizeUTF16String + */ + +public class MaxSizeUTF16String { + + private final static int MAX_UTF16_STRING_LENGTH = Integer.MAX_VALUE / 2; + + private final static String EXPECTED_OOME_MESSAGE = "UTF16 String size is"; + private final static String EXPECTED_VM_LIMIT_MESSAGE = "Requested array size exceeds VM limit"; + private final static String UNEXPECTED_JAVA_HEAP_SPACE = "Java heap space"; + + // Create a large UTF-8 byte array with a single non-latin1 character + private static byte[] generateUTF8Data(int byteSize) { + byte[] nonAscii = "\u0100".getBytes(StandardCharsets.UTF_8); + byte[] arr = new byte[byteSize]; + System.arraycopy(nonAscii, 0, arr, 0, nonAscii.length); // non-latin1 at start + return arr; + } + + // Create a large char array with a single non-latin1 character + private static char[] generateCharData(int size) { + char[] nonAscii = "\u0100".toCharArray(); + char[] arr = new char[size]; + System.arraycopy(nonAscii, 0, arr, 0, nonAscii.length); // non-latin1 at start + return arr; + } + + @Test + public void testMaxUTF8() { + // Overly large UTF-8 data with 1 non-latin1 char + final byte[] large_utf8_bytes = generateUTF8Data(MAX_UTF16_STRING_LENGTH + 1); + int[] sizes = new int[] { + MAX_UTF16_STRING_LENGTH + 1, + MAX_UTF16_STRING_LENGTH, + MAX_UTF16_STRING_LENGTH - 1}; + for (int size : sizes) { + System.err.println("Checking max UTF16 string len: " + size); + try { + // Use only part of the UTF-8 byte array + new String(large_utf8_bytes, 0, size, StandardCharsets.UTF_8); + if (size >= MAX_UTF16_STRING_LENGTH) { + fail("Expected OutOfMemoryError with message prefix: " + EXPECTED_OOME_MESSAGE); + } + } catch (OutOfMemoryError ex) { + if (ex.getMessage().equals(UNEXPECTED_JAVA_HEAP_SPACE)) { + // Insufficient heap size + throw ex; + } + if (!ex.getMessage().startsWith(EXPECTED_OOME_MESSAGE) && + !ex.getMessage().startsWith(EXPECTED_VM_LIMIT_MESSAGE)) { + fail("Failed: Not the OutOfMemoryError expected", ex); + } + } + } + } + + @Test + public void testMaxCharArray() { + // Overly large UTF-8 data with 1 non-latin1 char + final char[] large_char_array = generateCharData(MAX_UTF16_STRING_LENGTH + 1); + int[] sizes = new int[]{ + MAX_UTF16_STRING_LENGTH + 1, + MAX_UTF16_STRING_LENGTH, + MAX_UTF16_STRING_LENGTH - 1}; + for (int size : sizes) { + System.err.println("Checking max UTF16 string len: " + size); + try { + // Large char array with 1 non-latin1 char + new String(large_char_array, 0, size); + if (size >= MAX_UTF16_STRING_LENGTH) { + fail("Expected OutOfMemoryError with message prefix: " + EXPECTED_OOME_MESSAGE); + } + } catch (OutOfMemoryError ex) { + if (ex.getMessage().equals(UNEXPECTED_JAVA_HEAP_SPACE)) { + // Insufficient heap size + throw ex; + } + if (!ex.getMessage().startsWith(EXPECTED_OOME_MESSAGE) && + !ex.getMessage().startsWith(EXPECTED_VM_LIMIT_MESSAGE)) { + throw new RuntimeException("Wrong exception message: " + ex.getMessage(), ex); + } + } + } + } +} diff --git a/test/jdk/java/lang/String/StringRacyConstructor.java b/test/jdk/java/lang/String/StringRacyConstructor.java new file mode 100644 index 000000000000..bfec99da75ea --- /dev/null +++ b/test/jdk/java/lang/String/StringRacyConstructor.java @@ -0,0 +1,437 @@ +/* + * Copyright (c) 2023, 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 test.java.lang.String; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.ConcurrentModificationException; +import java.util.List; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIf; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +/* + * @test + * @bug 8311906 + * @modules java.base/java.lang:open + * @summary check String's racy constructors + * @run junit/othervm -XX:+CompactStrings test.java.lang.String.StringRacyConstructor + * @run junit/othervm -XX:-CompactStrings test.java.lang.String.StringRacyConstructor + */ + +public class StringRacyConstructor { + private static final byte LATIN1 = 0; + private static final byte UTF16 = 1; + + private static final Field STRING_CODER_FIELD; + private static final Field SB_CODER_FIELD; + private static final boolean COMPACT_STRINGS; + + static { + try { + STRING_CODER_FIELD = String.class.getDeclaredField("coder"); + STRING_CODER_FIELD.setAccessible(true); + SB_CODER_FIELD = Class.forName("java.lang.AbstractStringBuilder").getDeclaredField("coder"); + SB_CODER_FIELD.setAccessible(true); + COMPACT_STRINGS = isCompactStrings(); + } catch (NoSuchFieldException ex ) { + throw new ExceptionInInitializerError(ex); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + /* {@return true iff CompactStrings are enabled} + */ + public static boolean isCompactStrings() { + try { + Field compactStringField = String.class.getDeclaredField("COMPACT_STRINGS"); + compactStringField.setAccessible(true); + return compactStringField.getBoolean(null); + } catch (NoSuchFieldException ex) { + throw new ExceptionInInitializerError(ex); + } catch (IllegalAccessException iae) { + throw new AssertionError(iae); + } + } + + // Return the coder for the String + private static int coder(String s) { + try { + return STRING_CODER_FIELD.getByte(s); + } catch (IllegalAccessException iae) { + throw new AssertionError(iae); + } + } + + // Return the coder for the StringBuilder + private static int sbCoder(StringBuilder sb) { + try { + return SB_CODER_FIELD.getByte(sb); + } catch (IllegalAccessException iae) { + throw new AssertionError(iae); + } + } + + // Return a summary of the internals of the String + // The coder and indicate if the coder matches the string contents + private static String inspectString(String s) { + try { + char[] chars = s.toCharArray(); + String r = new String(chars); + + boolean invalidCoder = coder(s) != coder(r); + String coder = STRING_CODER_FIELD.getByte(s) == 0 ? "isLatin1" : "utf16"; + return (invalidCoder ? "INVALID CODER" : "" ) + " \"" + s + "\", coder: " + coder; + } catch (IllegalAccessException ex ) { + return "EXCEPTION: " + ex.getMessage(); + } + } + + /** + * {@return true if the coder matches the presence/lack of UTF16 characters} + * If it returns false, the coder and the contents have failed the precondition for string. + * @param orig a string + */ + private static boolean validCoder(String orig) { + if (!COMPACT_STRINGS) { + assertEquals(UTF16, coder(orig), "Non-COMPACT STRINGS coder must be UTF16"); + } + int accum = 0; + for (int i = 0; i < orig.length(); i++) + accum |= orig.charAt(i); + byte expectedCoder = (accum < 256) ? LATIN1 : UTF16; + return expectedCoder == coder(orig); + } + + // Check a StringBuilder for consistency of coder and latin1 vs UTF16 + private static boolean validCoder(StringBuilder orig) { + int accum = 0; + for (int i = 0; i < orig.length(); i++) + accum |= orig.charAt(i); + byte expectedCoder = (accum < 256) ? LATIN1 : UTF16; + return expectedCoder == sbCoder(orig); + } + + @Test + @EnabledIf("test.java.lang.String.StringRacyConstructor#isCompactStrings") + public void checkStringRange() { + char[] chars = {'a', 'b', 'c', 0xff21, 0xff22, 0xff23}; + String orig = new String(chars); + char[] xx = orig.toCharArray(); + String stringFromChars = new String(xx); + assertEquals(orig, stringFromChars, "mixed chars"); + assertTrue(validCoder(stringFromChars), "invalid coder" + + ", invalid coder: " + inspectString(stringFromChars)); + } + + private static List strings() { + return List.of("01234", " "); + } + + @ParameterizedTest + @MethodSource("strings") + @EnabledIf("test.java.lang.String.StringRacyConstructor#isCompactStrings") + public void racyString(String orig) { + String racyString = racyStringConstruction(orig); + // The contents are indeterminate due to the race + assertTrue(validCoder(racyString), orig + " string invalid" + + ", racyString: " + inspectString(racyString)); + } + + @ParameterizedTest + @MethodSource("strings") + @EnabledIf("test.java.lang.String.StringRacyConstructor#isCompactStrings") + public void racyCodePoint(String orig) { + String iffyString = racyStringConstructionCodepoints(orig); + // The contents are indeterminate due to the race + assertTrue(validCoder(iffyString), "invalid coder in non-deterministic string" + + ", orig:" + inspectString(orig) + + ", iffyString: " + inspectString(iffyString)); + } + + @ParameterizedTest + @MethodSource("strings") + @EnabledIf("test.java.lang.String.StringRacyConstructor#isCompactStrings") + public void racyCodePointSurrogates(String orig) { + String iffyString = racyStringConstructionCodepointsSurrogates(orig); + // The contents are indeterminate due to the race + if (!orig.equals(iffyString)) + System.err.println("orig: " + orig + ", iffy: " + iffyString + Arrays.toString(iffyString.codePoints().toArray())); + assertTrue(validCoder(iffyString), "invalid coder in non-deterministic string" + + ", orig:" + inspectString(orig) + + ", iffyString: " + inspectString(iffyString)); + } + + // Test the private methods of StringUTF16 that compress and copy COMPRESSED_STRING + // encoded byte arrays. + @Test + public void verifyUTF16CopyBytes() + throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class stringUTF16 = Class.forName("java.lang.StringUTF16"); + Method mCompressChars = stringUTF16.getDeclaredMethod("compress", + char[].class, int.class, byte[].class, int.class, int.class); + mCompressChars.setAccessible(true); + + // First warmup the intrinsic and check 1 case + char[] chars = {'a', 'b', 'c', 0xff21, 0xff22, 0xff23}; + byte[] bytes = new byte[chars.length]; + int printWarningCount = 0; + + for (int i = 0; i < 1_000_000; i++) { // repeat to get C2 to kick in + // Copy only latin1 chars from UTF-16 converted prefix (3 chars -> 3 bytes) + int intResult = (int) mCompressChars.invoke(null, chars, 0, bytes, 0, chars.length); + if (intResult == 0) { + if (printWarningCount == 0) { + printWarningCount = 1; + System.err.println("Intrinsic for StringUTF16.compress returned 0, may not have been updated."); + } + } else { + assertEquals(3, intResult, "return length not-equal, iteration: " + i); + } + } + + // Exhaustively check compress returning the correct index of the non-latin1 char. + final int SIZE = 48; + final byte FILL_BYTE = 'R'; + chars = new char[SIZE]; + bytes = new byte[chars.length]; + for (int i = 0; i < SIZE; i++) { // Every starting index + for (int j = i; j < SIZE; j++) { // Every location of non-latin1 + Arrays.fill(chars, 'A'); + Arrays.fill(bytes, FILL_BYTE); + chars[j] = 0xFF21; + int intResult = (int) mCompressChars.invoke(null, chars, i, bytes, 0, chars.length - i); + assertEquals(j - i, intResult, "compress found wrong index"); + assertEquals(FILL_BYTE, bytes[j], "extra character stored"); + } + } + + } + + // Check that a concatenated "hello" has a valid coder + @Test + @EnabledIf("test.java.lang.String.StringRacyConstructor#isCompactStrings") + public void checkConcatAndIntern() { + var helloWorld = "hello world"; + String helloToo = racyStringConstruction("hell".concat("o")); + String o = helloToo.intern(); + var hello = "hello"; + assertTrue(validCoder(helloToo), "startsWith: " + + ", hell: " + inspectString(helloToo) + + ", o: " + inspectString(o) + + ", hello: " + inspectString(hello) + + ", hello world: " + inspectString(helloWorld)); + } + + // Check that an empty string with racy construction has a valid coder + @Test + @EnabledIf("test.java.lang.String.StringRacyConstructor#isCompactStrings") + public void racyEmptyString() { + var space = racyStringConstruction(" "); + var trimmed = space.trim(); + assertTrue(validCoder(trimmed), "empty string invalid coder" + + ", trimmed: " + inspectString(trimmed)); + } + + // Check that an exception in a user implemented CharSequence doesn't result in + // an invalid coder when appended to a StringBuilder + @Test + @EnabledIf("test.java.lang.String.StringRacyConstructor#isCompactStrings") + void charSequenceException() { + ThrowingCharSequence bs = new ThrowingCharSequence("A\u2030\uFFFD"); + var sb = new StringBuilder(); + try { + sb.append(bs); + fail("An IllegalArgumentException should have been thrown"); + } catch (IllegalArgumentException ex) { + // ignore expected + } + assertTrue(validCoder(sb), "invalid coder in StringBuilder"); + } + + /** + * Given a latin-1 String, attempt to create a copy that is + * incorrectly encoded as UTF-16. + */ + public static String racyStringConstruction(String original) throws ConcurrentModificationException { + if (original.chars().max().getAsInt() >= 256) { + throw new IllegalArgumentException( + "Only work with latin-1 Strings"); + } + + char[] chars = original.toCharArray(); + + // In another thread, flip the first character back + // and forth between being latin-1 or not + Thread thread = new Thread(() -> { + while (!Thread.interrupted()) { + chars[0] ^= 256; + } + }); + thread.start(); + + // at the same time call the String constructor, + // until we hit the race condition + int i = 0; + while (true) { + i++; + String s = new String(chars); + if ((s.charAt(0) < 256 && !original.equals(s)) || i > 1_000_000) { + thread.interrupt(); + try { + thread.join(); + } catch (InterruptedException ie) { + // ignore interrupt + } + return s; + } + } + } + + /** + * Given a latin-1 String, creates a copy that is + * incorrectly encoded as UTF-16 using the APIs for Codepoints. + */ + public static String racyStringConstructionCodepoints(String original) throws ConcurrentModificationException { + if (original.chars().max().getAsInt() >= 256) { + throw new IllegalArgumentException( + "Can only work with latin-1 Strings"); + } + + int len = original.length(); + int[] codePoints = new int[len]; + for (int i = 0; i < len; i++) { + codePoints[i] = original.charAt(i); + } + + // In another thread, flip the first character back + // and forth between being latin-1 or not + Thread thread = new Thread(() -> { + while (!Thread.interrupted()) { + codePoints[0] ^= 256; + } + }); + thread.start(); + + // at the same time call the String constructor, + // until we hit the race condition + int i = 0; + while (true) { + i++; + String s = new String(codePoints, 0, len); + if ((s.charAt(0) < 256 && !original.equals(s)) || i > 1_000_000) { + thread.interrupt(); + try { + thread.join(); + } catch (InterruptedException ie) { + // ignore interrupt + } + return s; + } + } + } + + /** + * Returns a string created from a codepoint array that has been racily + * modified to contain high and low surrogates. The string is a different length + * than the original due to the surrogate encoding. + */ + public static String racyStringConstructionCodepointsSurrogates(String original) throws ConcurrentModificationException { + if (original.chars().max().getAsInt() >= 256) { + throw new IllegalArgumentException( + "Can only work with latin-1 Strings"); + } + + int len = original.length(); + int[] codePoints = new int[len]; + for (int i = 0; i < len; i++) { + codePoints[i] = original.charAt(i); + } + + // In another thread, flip the first character back + // and forth between being latin-1 or as a surrogate pair. + Thread thread = new Thread(() -> { + while (!Thread.interrupted()) { + codePoints[0] ^= 0x10000; + } + }); + thread.start(); + + // at the same time call the String constructor, + // until we hit the race condition + int i = 0; + while (true) { + i++; + String s = new String(codePoints, 0, len); + if ((s.length() != original.length()) || i > 1_000_000) { + thread.interrupt(); + try { + thread.join(); + } catch (InterruptedException ie) { + // ignore interrupt + } + return s; + } + } + } + + // A CharSequence that returns characters from a string and throws IllegalArgumentException + // when the character requested is 0xFFFD (the replacement character) + // The string contents determine when the exception is thrown. + static class ThrowingCharSequence implements CharSequence { + private final String aString; + + ThrowingCharSequence(String aString) { + this.aString = aString; + } + + @Override + public int length() { + return aString.length(); + } + + @Override + public char charAt(int index) { + char ch = aString.charAt(index); + if (ch == 0xFFFD) { + throw new IllegalArgumentException("Replacement character at index " + index); + } + return ch; + } + + @Override + // Not used; returns the entire string + public CharSequence subSequence(int start, int end) { + return this; + } + } +} diff --git a/test/jdk/java/nio/file/Files/ReadWriteString.java b/test/jdk/java/nio/file/Files/ReadWriteString.java index 885cbb771dc2..538cc870fa83 100644 --- a/test/jdk/java/nio/file/Files/ReadWriteString.java +++ b/test/jdk/java/nio/file/Files/ReadWriteString.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, 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 @@ -29,8 +29,10 @@ import java.nio.charset.UnmappableCharacterException; import static java.nio.charset.StandardCharsets.ISO_8859_1; import static java.nio.charset.StandardCharsets.US_ASCII; -import static java.nio.charset.StandardCharsets.UTF_16; import static java.nio.charset.StandardCharsets.UTF_8; +import static java.nio.charset.StandardCharsets.UTF_16; +import static java.nio.charset.StandardCharsets.UTF_16BE; +import static java.nio.charset.StandardCharsets.UTF_16LE; import java.nio.file.Files; import java.nio.file.OpenOption; import java.nio.file.Path; @@ -40,15 +42,15 @@ import java.util.Arrays; import java.util.Random; import java.util.concurrent.Callable; +import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; -import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; /* @test - * @bug 8201276 8205058 8209576 8287541 8288589 + * @bug 8201276 8205058 8209576 8287541 8288589 8325590 * @build ReadWriteString PassThroughFileSystem * @run testng ReadWriteString * @summary Unit test for methods for Files readString and write methods. @@ -61,10 +63,15 @@ public class ReadWriteString { // data for text files final String TEXT_UNICODE = "\u201CHello\u201D"; final String TEXT_ASCII = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n abcdefghijklmnopqrstuvwxyz\n 1234567890\n"; + final static String TEXT_PERSON_CART_WHEELING = "\ud83e\udd38"; private static final String JA_STRING = "\u65e5\u672c\u8a9e\u6587\u5b57\u5217"; private static final Charset WINDOWS_1252 = Charset.forName("windows-1252"); private static final Charset WINDOWS_31J = Charset.forName("windows-31j"); + private static final Charset UTF_32 = Charset.forName("utf-32"); + private static final Charset UTF_32BE = Charset.forName("utf-32be"); + private static final Charset UTF_32LE = Charset.forName("utf-32le"); + static byte[] data = getData(); static byte[] getData() { @@ -154,7 +161,16 @@ public Object[][] getReadString() { {testFiles[1], TEXT_ASCII, US_ASCII, US_ASCII}, {testFiles[1], TEXT_ASCII, US_ASCII, UTF_8}, {testFiles[1], TEXT_UNICODE, UTF_8, null}, - {testFiles[1], TEXT_UNICODE, UTF_8, UTF_8} + {testFiles[1], TEXT_UNICODE, UTF_8, UTF_8}, + {testFiles[1], TEXT_ASCII, US_ASCII, ISO_8859_1}, + {testFiles[1], TEXT_PERSON_CART_WHEELING, UTF_16, UTF_16}, + {testFiles[1], TEXT_PERSON_CART_WHEELING, UTF_16BE, UTF_16BE}, + {testFiles[1], TEXT_PERSON_CART_WHEELING, UTF_16LE, UTF_16LE}, + {testFiles[1], TEXT_PERSON_CART_WHEELING, UTF_32, UTF_32}, + {testFiles[1], TEXT_PERSON_CART_WHEELING, UTF_32BE, UTF_32BE}, + {testFiles[1], TEXT_PERSON_CART_WHEELING, UTF_32LE, UTF_32LE}, + {testFiles[1], TEXT_PERSON_CART_WHEELING, WINDOWS_1252, WINDOWS_1252}, + {testFiles[1], TEXT_PERSON_CART_WHEELING, WINDOWS_31J, WINDOWS_31J} }; } @@ -304,6 +320,21 @@ public void testMalformedReadBytes(byte[] data, Charset csRead, Class c) { try { c.call(); diff --git a/test/micro/org/openjdk/bench/java/lang/StringConstructor.java b/test/micro/org/openjdk/bench/java/lang/StringConstructor.java index 1509d6b798f0..e9ed0022edaf 100644 --- a/test/micro/org/openjdk/bench/java/lang/StringConstructor.java +++ b/test/micro/org/openjdk/bench/java/lang/StringConstructor.java @@ -21,11 +21,13 @@ * questions. */ -package micro.org.openjdk.bench.java.lang; +package org.openjdk.bench.java.lang; import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.Blackhole; import java.nio.charset.StandardCharsets; +import java.util.Arrays; import java.util.concurrent.TimeUnit; @State(Scope.Thread) @@ -36,45 +38,115 @@ @Fork(3) public class StringConstructor { - @Param({"7", "64"}) - public int size; - - // Offset to use for ranged newStrings - @Param("1") - public int offset; - private byte[] array; - - @Setup - public void setup() { - if (offset > size) { - offset = size; - } - array = "a".repeat(size).getBytes(StandardCharsets.UTF_8); - } - - @Benchmark - public String newStringFromArray() { - return new String(array); - } - - @Benchmark - public String newStringFromArrayWithCharset() { - return new String(array, StandardCharsets.UTF_8); - } - - @Benchmark - public String newStringFromArrayWithCharsetName() throws Exception { - return new String(array, StandardCharsets.UTF_8.name()); - } - - @Benchmark - public String newStringFromRangedArray() { - return new String(array, offset, array.length - offset); - } - - @Benchmark - public String newStringFromRangedArrayWithCharset() { - return new String(array, offset, array.length - offset, StandardCharsets.UTF_8); - } + private static final char INTEROBANG = 0x2030; + // Fixed offset to use for ranged newStrings + public final int offset = 1; + + @Param({"7", "64"}) + public int size; + + private byte[] array; + private char[] chars; + private char[] charsMixedBegin; + private char[] charsMixedSmall; + private char[] charsMixedEnd; + private int[] codePointsLatin1; + private int[] codePointsMixedBegin; + private int[] codePointsMixedSmall; + + private static int[] intCopyOfChars(char[] chars, int newLength) { + int[] res = new int[newLength]; + for (int i = 0; i < Math.min(chars.length, newLength); i++) + res[i] = chars[i]; + return res; + } + + @Setup + public void setup() { + String s = "a".repeat(size); + array = s.getBytes(StandardCharsets.UTF_8); + chars = s.toCharArray(); + charsMixedBegin = Arrays.copyOf(chars, array.length); + charsMixedBegin[0] = INTEROBANG; + charsMixedSmall = Arrays.copyOf(chars, array.length); + charsMixedSmall[Math.min(charsMixedSmall.length - 1, 7)] = INTEROBANG; + charsMixedEnd = new char[size + 7]; + Arrays.fill(charsMixedEnd, 'a'); + charsMixedEnd[charsMixedEnd.length - 1] = INTEROBANG; + + codePointsLatin1 = intCopyOfChars(chars, array.length); + codePointsMixedBegin = intCopyOfChars(chars, array.length); + codePointsMixedBegin[0] = INTEROBANG; + codePointsMixedSmall = intCopyOfChars(chars, array.length); + codePointsMixedSmall[Math.min(codePointsMixedSmall.length - 1, 7)] = INTEROBANG; + } + + @Benchmark + public String newStringFromBytes() { + return new String(array); + } + + @Benchmark + public String newStringFromBytesRanged() { + return new String(array, offset, array.length - offset); + } + + @Benchmark + public String newStringFromBytesRangedWithCharsetUTF8() { + return new String(array, offset, array.length - offset, StandardCharsets.UTF_8); + } + + @Benchmark + public String newStringFromBytesWithCharsetUTF8() { + return new String(array, StandardCharsets.UTF_8); + } + + @Benchmark + public String newStringFromBytesWithCharsetNameUTF8() throws Exception { + return new String(array, StandardCharsets.UTF_8.name()); + } + + @Benchmark + public String newStringFromCharsLatin1() { + return new String(chars); + } + + @Benchmark + public String newStringFromCharsMixedBegin() { + return new String(charsMixedBegin); + } + + @Benchmark + public String newStringFromCharsMixedSmall() { + return new String(charsMixedSmall); + } + + @Benchmark + public String newStringFromCharsMixedEnd() { + return new String(charsMixedEnd); + } + + @Benchmark + @CompilerControl(CompilerControl.Mode.DONT_INLINE) + public void newStringFromCharsMixedAll(Blackhole bh) { + bh.consume(new String(charsMixedBegin)); + bh.consume(new String(charsMixedSmall)); + bh.consume(new String(chars)); + } + + @Benchmark + public String newStringFromCodePointRangedLatin1() { + return new String(codePointsLatin1, 0, codePointsLatin1.length); + } + + @Benchmark + public String newStringFromCodePointRangedMixedBegin() { + return new String(codePointsMixedBegin, 0, codePointsMixedBegin.length); + } + + @Benchmark + public String newStringFromCodePointRangedMixedSmall() { + return new String(codePointsMixedSmall, 0, codePointsMixedSmall.length); + } } From cd7dfa21c912b56490d01509e8267d381986a723 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 10 Nov 2025 13:53:17 +0000 Subject: [PATCH 283/323] 8341443: [macos] AppContentTest and SigningOptionsTest failed due to "codesign" does not fails with "--app-content" on macOS 15 Reviewed-by: rrich Backport-of: 85e0e6452d167db2fadd60543f875a6375339604 --- .../tools/jpackage/share/AppContentTest.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/test/jdk/tools/jpackage/share/AppContentTest.java b/test/jdk/tools/jpackage/share/AppContentTest.java index 4014edc842ac..b5486e212bf1 100644 --- a/test/jdk/tools/jpackage/share/AppContentTest.java +++ b/test/jdk/tools/jpackage/share/AppContentTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, 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 @@ -34,6 +34,7 @@ import java.util.Collection; import java.util.List; +import jdk.internal.util.OSVersion; /** * Tests generation of packages with input folder containing empty folders. @@ -79,6 +80,17 @@ public AppContentTest(String... testPathArgs) { @Test public void test() throws Exception { + // On macOS signing may or may not work for modified app bundles. + // It works on macOS 15 and up, but fails on macOS below 15. + final int expectedJPackageExitCode; + final boolean isMacOS15 = (OSVersion.current().compareTo( + new OSVersion(15, 0, 0)) > 0); + if (testPathArgs.contains(TEST_BAD) || (TKit.isOSX() && !isMacOS15)) { + expectedJPackageExitCode = 1; + } else { + expectedJPackageExitCode = 0; + } + new PackageTest().configureHelloApp() .addInitializer(cmd -> { for (String arg : testPathArgs) { @@ -97,9 +109,7 @@ public void test() throws Exception { } }) - // On macOS we always signing app image and signing will fail, since - // test produces invalid app bundle. - .setExpectedExitCode(testPathArgs.contains(TEST_BAD) || TKit.isOSX() ? 1 : 0) + .setExpectedExitCode(expectedJPackageExitCode) .run(); } } From 5c14b9587d4093c035419e3c0059ddf97666f2e5 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 10 Nov 2025 14:11:24 +0000 Subject: [PATCH 284/323] 8342576: [macos] AppContentTest still fails after JDK-8341443 for same reason on older macOS versions Backport-of: ceaa71e73100072b73e8bb8ec57259510e92f1c5 --- .../helpers/jdk/jpackage/test/TKit.java | 4 +- .../tools/jpackage/share/AppContentTest.java | 115 +++++++++++++----- 2 files changed, 90 insertions(+), 29 deletions(-) diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java index d9b97165ccec..bd35a5abd204 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java @@ -316,7 +316,9 @@ private static Path createUniqueFileName(String defaultName) { if (!path.toFile().exists()) { return path; } - nameComponents[0] = String.format("%s.%d", baseName, i); + // Don't use period (.) as a separator. OSX codesign fails to sign folders + // with subfolders with names like "input.0". + nameComponents[0] = String.format("%s-%d", baseName, i); } throw new IllegalStateException(String.format( "Failed to create unique file name from [%s] basename after %d attempts", diff --git a/test/jdk/tools/jpackage/share/AppContentTest.java b/test/jdk/tools/jpackage/share/AppContentTest.java index b5486e212bf1..e056070a5fca 100644 --- a/test/jdk/tools/jpackage/share/AppContentTest.java +++ b/test/jdk/tools/jpackage/share/AppContentTest.java @@ -21,23 +21,25 @@ * questions. */ -import java.nio.file.Path; +import java.io.IOException; import java.nio.file.Files; -import jdk.jpackage.internal.ApplicationLayout; +import java.nio.file.Path; import jdk.jpackage.test.PackageTest; -import jdk.jpackage.test.PackageType; import jdk.jpackage.test.TKit; import jdk.jpackage.test.Annotations.Test; -import jdk.jpackage.test.Annotations.Parameter; import jdk.jpackage.test.Annotations.Parameters; import java.util.Arrays; import java.util.Collection; import java.util.List; +import static java.util.stream.Collectors.joining; +import java.util.stream.Stream; +import jdk.jpackage.internal.IOUtils; +import jdk.jpackage.test.Functional.ThrowingFunction; +import jdk.jpackage.test.JPackageCommand; -import jdk.internal.util.OSVersion; /** - * Tests generation of packages with input folder containing empty folders. + * Tests generation of packages with additional content in app image. */ /* @@ -52,14 +54,18 @@ */ public class AppContentTest { - private static final String TEST_JAVA = TKit.TEST_SRC_ROOT.resolve( - "apps/PrintEnv.java").toString(); - private static final String TEST_DUKE = TKit.TEST_SRC_ROOT.resolve( - "apps/dukeplug.png").toString(); - private static final String TEST_DIR = TKit.TEST_SRC_ROOT.resolve( - "apps").toString(); - private static final String TEST_BAD = TKit.TEST_SRC_ROOT.resolve( - "non-existant").toString(); + private static final String TEST_JAVA = "apps/PrintEnv.java"; + private static final String TEST_DUKE = "apps/dukeplug.png"; + private static final String TEST_DIR = "apps"; + private static final String TEST_BAD = "non-existant"; + + // On OSX `--app-content` paths will be copied into the "Contents" folder + // of the output app image. + // "codesign" imposes restrictions on the directory structure of "Contents" folder. + // In particular, random files should be placed in "Contents/Resources" folder + // otherwise "codesign" will fail to sign. + // Need to prepare arguments for `--app-content` accordingly. + private final static boolean copyInResources = TKit.isOSX(); private final List testPathArgs; @@ -79,37 +85,90 @@ public AppContentTest(String... testPathArgs) { @Test public void test() throws Exception { - - // On macOS signing may or may not work for modified app bundles. - // It works on macOS 15 and up, but fails on macOS below 15. final int expectedJPackageExitCode; - final boolean isMacOS15 = (OSVersion.current().compareTo( - new OSVersion(15, 0, 0)) > 0); - if (testPathArgs.contains(TEST_BAD) || (TKit.isOSX() && !isMacOS15)) { + if (testPathArgs.contains(TEST_BAD)) { expectedJPackageExitCode = 1; } else { expectedJPackageExitCode = 0; } + var appContentInitializer = new AppContentInitializer(testPathArgs); + new PackageTest().configureHelloApp() - .addInitializer(cmd -> { - for (String arg : testPathArgs) { - cmd.addArguments("--app-content", arg); - } - }) + .addRunOnceInitializer(appContentInitializer::initAppContent) + .addInitializer(appContentInitializer::applyTo) .addInstallVerifier(cmd -> { - ApplicationLayout appLayout = cmd.appLayout(); - Path contentDir = appLayout.contentDirectory(); + Path baseDir = getAppContentRoot(cmd); for (String arg : testPathArgs) { List paths = Arrays.asList(arg.split(",")); for (String p : paths) { Path name = Path.of(p).getFileName(); - TKit.assertPathExists(contentDir.resolve(name), true); + TKit.assertPathExists(baseDir.resolve(name), true); } } }) .setExpectedExitCode(expectedJPackageExitCode) .run(); + } + + private static Path getAppContentRoot(JPackageCommand cmd) { + Path contentDir = cmd.appLayout().contentDirectory(); + if (copyInResources) { + return contentDir.resolve("Resources"); + } else { + return contentDir; } + } + + private static final class AppContentInitializer { + AppContentInitializer(List appContentArgs) { + appContentPathGroups = appContentArgs.stream().map(arg -> { + return Stream.of(arg.split(",")).map(Path::of).toList(); + }).toList(); + } + + void initAppContent() { + jpackageArgs = appContentPathGroups.stream() + .map(AppContentInitializer::initAppContentPaths) + .mapMulti((appContentPaths, consumer) -> { + consumer.accept("--app-content"); + consumer.accept( + appContentPaths.stream().map(Path::toString).collect( + joining(","))); + }).toList(); + } + + void applyTo(JPackageCommand cmd) { + cmd.addArguments(jpackageArgs); + } + + private static Path copyAppContentPath(Path appContentPath) throws IOException { + var appContentArg = TKit.createTempDirectory("app-content").resolve("Resources"); + var srcPath = TKit.TEST_SRC_ROOT.resolve(appContentPath); + var dstPath = appContentArg.resolve(srcPath.getFileName()); + Files.createDirectories(dstPath.getParent()); + IOUtils.copyRecursive(srcPath, dstPath); + return appContentArg; + } + + private static List initAppContentPaths(List appContentPaths) { + if (copyInResources) { + return appContentPaths.stream().map(appContentPath -> { + if (appContentPath.endsWith(TEST_BAD)) { + return appContentPath; + } else { + return ThrowingFunction.toFunction( + AppContentInitializer::copyAppContentPath).apply( + appContentPath); + } + }).toList(); + } else { + return appContentPaths.stream().map(TKit.TEST_SRC_ROOT::resolve).toList(); + } + } + + private List jpackageArgs; + private final List> appContentPathGroups; + } } From 8d5a6d90e59f6543b805410154fc4528f50e991d Mon Sep 17 00:00:00 2001 From: David Briemann Date: Mon, 10 Nov 2025 14:32:43 +0000 Subject: [PATCH 285/323] 8361599: [PPC64] enable missing tests via jtreg requires Backport-of: 83feb7a2388e33835b2071cfe0e51ba8b43e241f --- test/hotspot/jtreg/compiler/c2/TestBit.java | 4 ++-- .../jtreg/gc/shenandoah/compiler/TestLinkToNativeRBP.java | 4 ++-- .../AsyncGetCallTrace/MyPackage/ASGCTBaseTest.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/hotspot/jtreg/compiler/c2/TestBit.java b/test/hotspot/jtreg/compiler/c2/TestBit.java index a3c9421a3f91..b1186a85cae1 100644 --- a/test/hotspot/jtreg/compiler/c2/TestBit.java +++ b/test/hotspot/jtreg/compiler/c2/TestBit.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, 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 @@ -33,7 +33,7 @@ * @library /test/lib / * * @requires vm.flagless - * @requires os.arch=="aarch64" | os.arch=="amd64" | os.arch == "ppc64le" | os.arch == "riscv64" + * @requires os.arch=="aarch64" | os.arch=="amd64" | os.arch == "ppc64" | os.arch == "ppc64le" | os.arch == "riscv64" * @requires vm.debug == true & vm.compiler2.enabled * * @run driver compiler.c2.TestBit diff --git a/test/hotspot/jtreg/gc/shenandoah/compiler/TestLinkToNativeRBP.java b/test/hotspot/jtreg/gc/shenandoah/compiler/TestLinkToNativeRBP.java index a0dff95a23f2..e9bd47a8f55a 100644 --- a/test/hotspot/jtreg/gc/shenandoah/compiler/TestLinkToNativeRBP.java +++ b/test/hotspot/jtreg/gc/shenandoah/compiler/TestLinkToNativeRBP.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022, Red Hat, Inc. All rights reserved. + * Copyright (c) 2021, 2025, Red Hat, Inc. 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 @@ -28,7 +28,7 @@ * @summary guarantee(loc != NULL) failed: missing saved register with native invoke * * @requires vm.flavor == "server" - * @requires ((os.arch == "amd64" | os.arch == "x86_64") & sun.arch.data.model == "64") | os.arch == "aarch64" | os.arch == "ppc64le" + * @requires ((os.arch == "amd64" | os.arch == "x86_64") & sun.arch.data.model == "64") | os.arch == "aarch64" | os.arch == "ppc64" | os.arch == "ppc64le" * @requires vm.gc.Shenandoah * * @run main/othervm --enable-native-access=ALL-UNNAMED -XX:+UnlockDiagnosticVMOptions diff --git a/test/hotspot/jtreg/serviceability/AsyncGetCallTrace/MyPackage/ASGCTBaseTest.java b/test/hotspot/jtreg/serviceability/AsyncGetCallTrace/MyPackage/ASGCTBaseTest.java index 5c41565db8d9..e22c1b593949 100644 --- a/test/hotspot/jtreg/serviceability/AsyncGetCallTrace/MyPackage/ASGCTBaseTest.java +++ b/test/hotspot/jtreg/serviceability/AsyncGetCallTrace/MyPackage/ASGCTBaseTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2019, Google and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -29,7 +29,7 @@ * @summary Verifies that AsyncGetCallTrace is call-able and provides sane information. * @compile ASGCTBaseTest.java * @requires os.family == "linux" - * @requires os.arch=="x86" | os.arch=="i386" | os.arch=="amd64" | os.arch=="x86_64" | os.arch=="arm" | os.arch=="aarch64" | os.arch=="ppc64" | os.arch=="s390" | os.arch=="riscv64" + * @requires os.arch=="x86" | os.arch=="i386" | os.arch=="amd64" | os.arch=="x86_64" | os.arch=="arm" | os.arch=="aarch64" | os.arch=="ppc64" | os.arch=="ppc64le" | os.arch=="s390" | os.arch=="riscv64" * @requires vm.jvmti * @run main/othervm/native -agentlib:AsyncGetCallTraceTest MyPackage.ASGCTBaseTest */ From 14c9f82dbc424800b203b8d1b38e24bf2d6390ae Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Tue, 11 Nov 2025 22:51:39 +0000 Subject: [PATCH 286/323] 8327757: Convert javax/swing/JSlider/6524424/bug6524424.java applet to main Backport-of: ac5b6cb2d42bdb8fb1a110ad33411b50cff4ea61 --- .../swing/JSlider/6524424/bug6524424.html | 34 ---------- .../JSlider/{6524424 => }/bug6524424.java | 67 ++++++++++++------- 2 files changed, 43 insertions(+), 58 deletions(-) delete mode 100644 test/jdk/javax/swing/JSlider/6524424/bug6524424.html rename test/jdk/javax/swing/JSlider/{6524424 => }/bug6524424.java (61%) diff --git a/test/jdk/javax/swing/JSlider/6524424/bug6524424.html b/test/jdk/javax/swing/JSlider/6524424/bug6524424.html deleted file mode 100644 index 11a57b6b7fbb..000000000000 --- a/test/jdk/javax/swing/JSlider/6524424/bug6524424.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - -To test fix follow the next steps: -1. Select a slider (do the next steps for every slider) -2. Check that the next keyboard buttons work correctly: - Up, Down, Left, Right, Page Up, Page Down -3. Press left mouse button on a free space of the slider and check - that thumb moves correctly - - diff --git a/test/jdk/javax/swing/JSlider/6524424/bug6524424.java b/test/jdk/javax/swing/JSlider/bug6524424.java similarity index 61% rename from test/jdk/javax/swing/JSlider/6524424/bug6524424.java rename to test/jdk/javax/swing/JSlider/bug6524424.java index 3cb8b69d260c..3ceff68b32b1 100644 --- a/test/jdk/javax/swing/JSlider/6524424/bug6524424.java +++ b/test/jdk/javax/swing/JSlider/bug6524424.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2024, 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 @@ -21,46 +21,65 @@ * questions. */ -/* @test +/* + * @test * @bug 6524424 * @requires (os.family == "windows") - * @summary JSlider Clicking In Tracks Behavior Inconsistent For Different Tick Spacings - * @author Pavel Porvatov + * @summary JSlider clicking in tracks behavior inconsistent for different tick spacings * @modules java.desktop/com.sun.java.swing.plaf.windows - * @run applet/manual=done bug6524424.html + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug6524424 */ -import java.awt.*; -import javax.swing.*; +import java.awt.Component; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JSlider; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; import com.sun.java.swing.plaf.windows.WindowsLookAndFeel; -public class bug6524424 extends JApplet { - public static void main(String[] args) { +public class bug6524424 { + private static final String INSTRUCTIONS = """ + 1. Select a slider (do the next steps for every slider) + 2. Check that the next keyboard buttons work correctly: + Up, Down, Left, Right, Page Up, Page Down + 3. Press left mouse button on a free space of the slider + check if thumb moves correctly + press Pass else press Fail."""; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .title("Slider Behavior Instructions") + .instructions(INSTRUCTIONS) + .rows(7) + .columns(30) + .testUI(bug6524424::createTestUI) + .build() + .awaitAndCheck(); + } + + private static JFrame createTestUI() { try { UIManager.setLookAndFeel(new WindowsLookAndFeel()); - } catch (UnsupportedLookAndFeelException e) { - e.printStackTrace(); - - return; + } catch (UnsupportedLookAndFeelException ex) { + PassFailJFrame.forceFail(ex.toString()); + return null; } TestPanel panel = new TestPanel(); - JFrame frame = new JFrame(); + JFrame frame = new JFrame("bug6524424"); frame.setContentPane(panel); - frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.pack(); - frame.setLocationRelativeTo(null); - - frame.setVisible(true); - } - - public void init() { - TestPanel panel = new TestPanel(); - - setContentPane(panel); + return frame; } private static class TestPanel extends JPanel { From ee7f157da130355999a2df2907645f6fc7e9e852 Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Tue, 11 Nov 2025 22:52:05 +0000 Subject: [PATCH 287/323] 8327856: Convert applet test SpanishDiacriticsTest.java to a main program Backport-of: 22f10e045b3decdb51a3cc7644c47f911aec753d --- .../InputMethods/SpanishDiacriticsTest.java | 92 +++++++++++++++++++ .../SpanishDiacriticsTest.html | 40 -------- .../SpanishDiacriticsTest.java | 57 ------------ 3 files changed, 92 insertions(+), 97 deletions(-) create mode 100644 test/jdk/java/awt/InputMethods/SpanishDiacriticsTest.java delete mode 100644 test/jdk/java/awt/InputMethods/SpanishDiacriticsTest/SpanishDiacriticsTest.html delete mode 100644 test/jdk/java/awt/InputMethods/SpanishDiacriticsTest/SpanishDiacriticsTest.java diff --git a/test/jdk/java/awt/InputMethods/SpanishDiacriticsTest.java b/test/jdk/java/awt/InputMethods/SpanishDiacriticsTest.java new file mode 100644 index 000000000000..0468f222774b --- /dev/null +++ b/test/jdk/java/awt/InputMethods/SpanishDiacriticsTest.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2016, 2024, 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 8169355 + * @summary Check if Spanish diacritical signs could be typed for TextField + * @requires (os.family == "windows") + * @library /java/awt/regtesthelpers + * @run main/manual SpanishDiacriticsTest +*/ + + +import java.util.concurrent.locks.LockSupport; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import javax.swing.JFrame; +import javax.swing.JTextField; +import javax.swing.SwingUtilities; +import javax.swing.WindowConstants; + +public class SpanishDiacriticsTest { + + static final String INSTRUCTIONS = """ + This test requires the following keyboard layout to be installed: + Windows OS: Spanish (United States) with 'Latin American' keyboard layout. + If using a US layout, the results should still be as described but + you have not tested the real bug. + + 1. A frame with a text field should be displayed. + 2. Set focus to the text field and switch to Spanish + with 'Latin American' keyboard layout. + 3. Type the following: ' ' o - i.e. single quote two times, then o. + If your keyboard has a US physical layout the [ key can be used + to type the single quote when in 'Latin American' keyboard mode. + 4. Type these characters at a normal speed but do NOT be concerned + that they take several seconds to display. That is an + expected behaviour for this test. + + If the text field displays the same three characters you typed: ''o + (i.e. two single quotes followed by o without an acute) + then press Pass; otherwise press Fail. + """; + + public static void main(String[] args) throws Exception { + + PassFailJFrame.builder() + .title("Spanish Diacritics") + .instructions(INSTRUCTIONS) + .rows(20) + .columns(50) + .testUI(SpanishDiacriticsTest::createTestUI) + .build() + .awaitAndCheck(); + } + + static JFrame createTestUI() { + JFrame frame = new JFrame("Spanish Diacritics Test Frame"); + JTextField textField = new JTextField(20); + textField.addKeyListener(new KeyAdapter() { + @Override + public void keyTyped(KeyEvent e) { + LockSupport.parkNanos(1_000_000_000L); + } + }); + frame.add(textField); + frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + frame.pack(); + return frame; + } +} + diff --git a/test/jdk/java/awt/InputMethods/SpanishDiacriticsTest/SpanishDiacriticsTest.html b/test/jdk/java/awt/InputMethods/SpanishDiacriticsTest/SpanishDiacriticsTest.html deleted file mode 100644 index af6cd0c76102..000000000000 --- a/test/jdk/java/awt/InputMethods/SpanishDiacriticsTest/SpanishDiacriticsTest.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - SpanishDiacriticsTest - - - - -Test run requires the following keyboard layout to be installed: -Windows OS: Spanish (United States) with 'Latin American' keyboard layout - -1. A frame with a text field should be displayed at upper left corner -2. Set focus to the text field and switch to Spanish with 'Latin American' keyboard layout -3. Type the following: ' ' o - i.e. single quote two times (using [ key on US keyboard) then o character. - -If you the text field displays ''o, (i.e. o should be without acute) then the test is passed; otherwise failed. - - diff --git a/test/jdk/java/awt/InputMethods/SpanishDiacriticsTest/SpanishDiacriticsTest.java b/test/jdk/java/awt/InputMethods/SpanishDiacriticsTest/SpanishDiacriticsTest.java deleted file mode 100644 index 78877061e602..000000000000 --- a/test/jdk/java/awt/InputMethods/SpanishDiacriticsTest/SpanishDiacriticsTest.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * 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 8169355 - * @summary Check if Spanish diacritical signs could be typed for TextField - * @author Dmitry Markov - * @run applet/manual=yesno SpanishDiacriticsTest.html -*/ - -import javax.swing.*; -import java.applet.Applet; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.util.concurrent.locks.LockSupport; - -public class SpanishDiacriticsTest extends Applet { - @Override - public void init() { - SwingUtilities.invokeLater(() -> { - JFrame frame = new JFrame(); - JTextField textField = new JTextField(20); - textField.addKeyListener(new KeyAdapter() { - @Override - public void keyTyped(KeyEvent e) { - LockSupport.parkNanos(1_000_000_000L); - } - }); - frame.add(textField); - frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); - frame.pack(); - frame.setVisible(true); - }); - } -} - From f44d22bc84af67b73a08b0b235fd6c10e70be80f Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Wed, 12 Nov 2025 12:28:38 +0000 Subject: [PATCH 288/323] 8347300: Don't exclude the "PATH" var from the environment when running app launchers in jpackage tests Reviewed-by: mbaesken Backport-of: d69463e4bcbddd346b9486059c5ad3a1cb555632 --- .../helpers/jdk/jpackage/test/CfgFile.java | 115 +++++++++++++----- .../helpers/jdk/jpackage/test/Executor.java | 19 +-- .../helpers/jdk/jpackage/test/HelloApp.java | 20 ++- .../jdk/jpackage/test/JPackageCommand.java | 34 ++++-- .../test/LauncherAsServiceVerifier.java | 8 +- .../jdk/jpackage/test/WindowsHelper.java | 95 ++++++++++++++- .../jpackage/share/AppLauncherEnvTest.java | 6 +- test/jdk/tools/jpackage/share/BasicTest.java | 2 +- .../jpackage/windows/WinChildProcessTest.java | 20 +-- 9 files changed, 247 insertions(+), 72 deletions(-) diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/CfgFile.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/CfgFile.java index ba2485516a94..9df28b3915e6 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/CfgFile.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/CfgFile.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, 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 @@ -25,61 +25,108 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Stream; public final class CfgFile { - public String getValue(String section, String key) { - Objects.requireNonNull(section); - Objects.requireNonNull(key); + public String getValue(String sectionName, String key) { + var section = getSection(sectionName); + TKit.assertTrue(section != null, String.format( + "Check section [%s] is found in [%s] cfg file", sectionName, id)); - Map entries = data.get(section); - TKit.assertTrue(entries != null, String.format( - "Check section [%s] is found in [%s] cfg file", section, id)); - - String value = entries.get(key); + String value = section.getValue(key); TKit.assertNotNull(value, String.format( "Check key [%s] is found in [%s] section of [%s] cfg file", key, - section, id)); + sectionName, id)); return value; } - public String getValueUnchecked(String section, String key) { - Objects.requireNonNull(section); - Objects.requireNonNull(key); + public String getValueUnchecked(String sectionName, String key) { + var section = getSection(sectionName); + if (section != null) { + return section.getValue(key); + } else { + return null; + } + } + + public void addValue(String sectionName, String key, String value) { + var section = getSection(sectionName); + if (section == null) { + section = new Section(sectionName, new ArrayList<>()); + data.add(section); + } + section.data.add(Map.entry(key, value)); + } + + public CfgFile() { + this(new ArrayList<>(), "*"); + } - return Optional.ofNullable(data.get(section)).map(v -> v.get(key)).orElse( - null); + public static CfgFile combine(CfgFile base, CfgFile mods) { + var cfgFile = new CfgFile(new ArrayList<>(), "*"); + for (var src : List.of(base, mods)) { + for (var section : src.data) { + for (var kvp : section.data) { + cfgFile.addValue(section.name, kvp.getKey(), kvp.getValue()); + } + } + } + return cfgFile; } - private CfgFile(Map> data, String id) { + private CfgFile(List
          data, String id) { this.data = data; this.id = id; } - public static CfgFile readFromFile(Path path) throws IOException { + public void save(Path path) { + var lines = data.stream().flatMap(section -> { + return Stream.concat( + Stream.of(String.format("[%s]", section.name)), + section.data.stream().map(kvp -> { + return String.format("%s=%s", kvp.getKey(), kvp.getValue()); + })); + }); + TKit.createTextFile(path, lines); + } + + private Section getSection(String name) { + Objects.requireNonNull(name); + for (var section : data.reversed()) { + if (name.equals(section.name)) { + return section; + } + } + return null; + } + + public static CfgFile load(Path path) throws IOException { TKit.trace(String.format("Read [%s] jpackage cfg file", path)); final Pattern sectionBeginRegex = Pattern.compile( "\\s*\\[([^]]*)\\]\\s*"); final Pattern keyRegex = Pattern.compile( "\\s*([^=]*)=(.*)" ); - Map> result = new HashMap<>(); + List
          sections = new ArrayList<>(); String currentSectionName = null; - Map currentSection = new HashMap<>(); + List> currentSection = new ArrayList<>(); for (String line : Files.readAllLines(path)) { Matcher matcher = sectionBeginRegex.matcher(line); if (matcher.find()) { if (currentSectionName != null) { - result.put(currentSectionName, Collections.unmodifiableMap( - new HashMap<>(currentSection))); + sections.add(new Section(currentSectionName, + Collections.unmodifiableList(new ArrayList<>( + currentSection)))); } currentSectionName = matcher.group(1); currentSection.clear(); @@ -88,19 +135,31 @@ public static CfgFile readFromFile(Path path) throws IOException { matcher = keyRegex.matcher(line); if (matcher.find()) { - currentSection.put(matcher.group(1), matcher.group(2)); - continue; + currentSection.add(Map.entry(matcher.group(1), matcher.group(2))); } } if (!currentSection.isEmpty()) { - result.put(Optional.ofNullable(currentSectionName).orElse(""), - Collections.unmodifiableMap(currentSection)); + sections.add(new Section( + Optional.ofNullable(currentSectionName).orElse(""), + Collections.unmodifiableList(currentSection))); } - return new CfgFile(Collections.unmodifiableMap(result), path.toString()); + return new CfgFile(sections, path.toString()); + } + + private static record Section(String name, List> data) { + String getValue(String key) { + Objects.requireNonNull(key); + for (var kvp : data.reversed()) { + if (key.equals(kvp.getKey())) { + return kvp.getValue(); + } + } + return null; + } } - private final Map> data; + private final List
          data; private final String id; } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/Executor.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/Executor.java index e94cbc79aac4..c1c51f1ef555 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/Executor.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/Executor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, 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 @@ -54,7 +54,6 @@ public static Executor of(String... cmdline) { public Executor() { saveOutputType = new HashSet<>(Set.of(SaveOutputType.NONE)); - removePath = false; winEnglishOutput = false; } @@ -91,8 +90,8 @@ public Executor setExecutable(JavaTool v) { return setExecutable(v.getPath()); } - public Executor setRemovePath(boolean value) { - removePath = value; + public Executor removeEnvVar(String envVarName) { + removeEnvVars.add(Objects.requireNonNull(envVarName)); return this; } @@ -370,10 +369,12 @@ private Result runExecutable() throws IOException, InterruptedException { builder.directory(directory.toFile()); sb.append(String.format("; in directory [%s]", directory)); } - if (removePath) { - // run this with cleared Path in Environment - TKit.trace("Clearing PATH in environment"); - builder.environment().remove("PATH"); + if (!removeEnvVars.isEmpty()) { + final var envComm = Comm.compare(builder.environment().keySet(), removeEnvVars); + builder.environment().keySet().removeAll(envComm.common()); + envComm.common().forEach(envVar -> { + TKit.trace(String.format("Clearing %s in environment", envVar)); + }); } trace("Execute " + sb.toString() + "..."); @@ -512,7 +513,7 @@ private static void trace(String msg) { private Path executable; private Set saveOutputType; private Path directory; - private boolean removePath; + private Set removeEnvVars = new HashSet<>(); private boolean winEnglishOutput; private String winTmpDir = null; diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/HelloApp.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/HelloApp.java index bc722e7acd92..a004dd421c1d 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/HelloApp.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/HelloApp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, 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 @@ -464,13 +464,14 @@ private Executor getExecutor(String...args) { } final List launcherArgs = List.of(args); - return new Executor() + final var executor = new Executor() .setDirectory(outputFile.getParent()) .saveOutput(saveOutput) .dumpOutput() - .setRemovePath(removePath) .setExecutable(executablePath) - .addArguments(launcherArgs); + .addArguments(List.of(args)); + + return configureEnvironment(executor); } private boolean launcherNoExit; @@ -487,6 +488,14 @@ public static AppOutputVerifier assertApp(Path helloAppLauncher) { return new AppOutputVerifier(helloAppLauncher); } + public static Executor configureEnvironment(Executor executor) { + if (CLEAR_JAVA_ENV_VARS) { + executor.removeEnvVar("JAVA_TOOL_OPTIONS"); + executor.removeEnvVar("_JAVA_OPTIONS"); + } + return executor; + } + static final String OUTPUT_FILENAME = "appOutput.txt"; private final JavaAppDesc appDesc; @@ -496,4 +505,7 @@ public static AppOutputVerifier assertApp(Path helloAppLauncher) { private static final String CLASS_NAME = HELLO_JAVA.getFileName().toString().split( "\\.", 2)[0]; + + private static final boolean CLEAR_JAVA_ENV_VARS = Optional.ofNullable( + TKit.getConfigProperty("clear-app-launcher-java-env-vars")).map(Boolean::parseBoolean).orElse(false); } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java index 28bdc483afd5..acc46a46e541 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java @@ -622,8 +622,18 @@ public Path appLauncherCfgPath(String launcherName) { } public boolean isFakeRuntime(String msg) { - Path runtimeDir = appRuntimeDirectory(); + if (isFakeRuntime()) { + // Fake runtime + Path runtimeDir = appRuntimeDirectory(); + TKit.trace(String.format( + "%s because application runtime directory [%s] is incomplete", + msg, runtimeDir)); + return true; + } + return false; + } + private boolean isFakeRuntime() { final Collection criticalRuntimeFiles; if (TKit.isWindows()) { criticalRuntimeFiles = WindowsHelper.CRITICAL_RUNTIME_FILES; @@ -635,16 +645,9 @@ public boolean isFakeRuntime(String msg) { throw TKit.throwUnknownPlatformError(); } - if (!criticalRuntimeFiles.stream().anyMatch(v -> { - return runtimeDir.resolve(v).toFile().exists(); - })) { - // Fake runtime - TKit.trace(String.format( - "%s because application runtime directory [%s] is incomplete", - msg, runtimeDir)); - return true; - } - return false; + Path runtimeDir = appRuntimeDirectory(); + return !criticalRuntimeFiles.stream().map(runtimeDir::resolve).allMatch( + Files::exists); } public boolean canRunLauncher(String msg) { @@ -709,6 +712,13 @@ public JPackageCommand ignoreDefaultRuntime(boolean v) { return this; } + public JPackageCommand ignoreFakeRuntime() { + if (isFakeRuntime()) { + ignoreDefaultRuntime(true); + } + return this; + } + public JPackageCommand ignoreDefaultVerbose(boolean v) { verifyMutable(); ignoreDefaultVerbose = v; @@ -1000,7 +1010,7 @@ public CfgFile readLauncherCfgFile(String launcherName) { if (isRuntime()) { return null; } - return ThrowingFunction.toFunction(CfgFile::readFromFile).apply( + return ThrowingFunction.toFunction(CfgFile::load).apply( appLauncherCfgPath(launcherName)); } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherAsServiceVerifier.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherAsServiceVerifier.java index a695a3b693d5..6220eb8fc0d3 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherAsServiceVerifier.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherAsServiceVerifier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, 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 @@ -41,7 +41,7 @@ public final class LauncherAsServiceVerifier { - public final static class Builder { + public static final class Builder { public Builder setExpectedValue(String v) { expectedValue = v; @@ -204,7 +204,7 @@ private boolean canVerifyInstall(JPackageCommand cmd) throws IOException { if (cmd.isPackageUnpacked(msg) || cmd.isFakeRuntime(msg)) { return false; } - var cfgFile = CfgFile.readFromFile(cmd.appLauncherCfgPath(launcherName)); + var cfgFile = CfgFile.load(cmd.appLauncherCfgPath(launcherName)); if (!expectedValue.equals(cfgFile.getValueUnchecked("ArgOptions", "arguments"))) { TKit.trace(String.format( @@ -338,6 +338,6 @@ private Path appOutputFilePathVerify(JPackageCommand cmd) { private final String launcherName; private final Path appOutputFileName; - final static Set SUPPORTED_PACKAGES = Stream.of(LINUX, WINDOWS, + static final Set SUPPORTED_PACKAGES = Stream.of(LINUX, WINDOWS, Set.of(MAC_PKG)).flatMap(x -> x.stream()).collect(Collectors.toSet()); } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/WindowsHelper.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/WindowsHelper.java index ebf4494aa791..6b6846f325c0 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/WindowsHelper.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/WindowsHelper.java @@ -28,9 +28,12 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.function.BiConsumer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; import jdk.jpackage.test.Functional.ThrowingRunnable; @@ -188,6 +191,90 @@ public static String getExecutableDesciption(Path pathToExeFile) { "Failed to get file description of [%s]", pathToExeFile)); } + public static void killProcess(long pid) { + Executor.of("taskkill", "/F", "/PID", Long.toString(pid)).dumpOutput(true).execute(); + } + + public static void killAppLauncherProcess(JPackageCommand cmd, + String launcherName, int expectedCount) { + var pids = findAppLauncherPIDs(cmd, launcherName); + try { + TKit.assertEquals(expectedCount, pids.length, String.format( + "Check [%d] %s app launcher processes found running", + expectedCount, Optional.ofNullable(launcherName).map( + str -> "[" + str + "]").orElse("
          "))); + } finally { + if (pids.length != 0) { + killProcess(pids[0]); + } + } + } + + private static long[] findAppLauncherPIDs(JPackageCommand cmd, String launcherName) { + // Get the list of PIDs and PPIDs of app launcher processes. + // wmic process where (name = "foo.exe") get ProcessID,ParentProcessID + List output = Executor.of("wmic", "process", "where", "(name", + "=", + "\"" + cmd.appLauncherPath(launcherName).getFileName().toString() + "\"", + ")", "get", "ProcessID,ParentProcessID").dumpOutput(true). + saveOutput().executeAndGetOutput(); + + if ("No Instance(s) Available.".equals(output.getFirst().trim())) { + return new long[0]; + } + + String[] headers = Stream.of(output.getFirst().split("\\s+", 2)).map( + String::trim).map(String::toLowerCase).toArray(String[]::new); + Pattern pattern; + if (headers[0].equals("parentprocessid") && headers[1].equals( + "processid")) { + pattern = Pattern.compile("^(?\\d+)\\s+(?\\d+)\\s+$"); + } else if (headers[1].equals("parentprocessid") && headers[0].equals( + "processid")) { + pattern = Pattern.compile("^(?\\d+)\\s+(?\\d+)\\s+$"); + } else { + throw new RuntimeException( + "Unrecognizable output of \'wmic process\' command"); + } + + List processes = output.stream().skip(1).map(line -> { + Matcher m = pattern.matcher(line); + long[] pids = null; + if (m.matches()) { + pids = new long[]{Long.parseLong(m.group("pid")), Long. + parseLong(m.group("ppid"))}; + } + return pids; + }).filter(Objects::nonNull).toList(); + + switch (processes.size()) { + case 2 -> { + final long parentPID; + final long childPID; + if (processes.get(0)[0] == processes.get(1)[1]) { + parentPID = processes.get(0)[0]; + childPID = processes.get(1)[0]; + } else if (processes.get(1)[0] == processes.get(0)[1]) { + parentPID = processes.get(1)[0]; + childPID = processes.get(0)[0]; + } else { + TKit.assertUnexpected("App launcher processes unrelated"); + return null; // Unreachable + } + return new long[]{parentPID, childPID}; + } + case 1 -> { + return new long[]{processes.get(0)[0]}; + } + default -> { + TKit.assertUnexpected(String.format( + "Unexpected number of running processes [%d]", + processes.size())); + return null; // Unreachable + } + } + } + private static boolean isUserLocalInstall(JPackageCommand cmd) { return cmd.hasArgument("--win-per-user-install"); } @@ -418,15 +505,15 @@ private static String queryRegistryValueCache(String keyPath, "bin\\server\\jvm.dll")); // jtreg resets %ProgramFiles% environment variable by some reason. - private final static Path PROGRAM_FILES = Path.of(Optional.ofNullable( + private static final Path PROGRAM_FILES = Path.of(Optional.ofNullable( System.getenv("ProgramFiles")).orElse("C:\\Program Files")); - private final static Path USER_LOCAL = Path.of(System.getProperty( + private static final Path USER_LOCAL = Path.of(System.getProperty( "user.home"), "AppData", "Local"); - private final static String SYSTEM_SHELL_FOLDERS_REGKEY = "HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"; - private final static String USER_SHELL_FOLDERS_REGKEY = "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"; + private static final String SYSTEM_SHELL_FOLDERS_REGKEY = "HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"; + private static final String USER_SHELL_FOLDERS_REGKEY = "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"; private static final Map REGISTRY_VALUES = new HashMap<>(); } diff --git a/test/jdk/tools/jpackage/share/AppLauncherEnvTest.java b/test/jdk/tools/jpackage/share/AppLauncherEnvTest.java index a16ff9c18f96..52016e6f4ab6 100644 --- a/test/jdk/tools/jpackage/share/AppLauncherEnvTest.java +++ b/test/jdk/tools/jpackage/share/AppLauncherEnvTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, 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 @@ -30,6 +30,7 @@ import jdk.jpackage.test.JPackageCommand; import jdk.jpackage.test.Annotations.Test; import jdk.jpackage.test.Executor; +import static jdk.jpackage.test.HelloApp.configureEnvironment; import jdk.jpackage.test.TKit; /** @@ -53,6 +54,7 @@ public static void test() throws Exception { JPackageCommand cmd = JPackageCommand .helloAppImage(TEST_APP_JAVA + "*Hello") + .ignoreFakeRuntime() .addArguments("--java-options", "-D" + testAddDirProp + "=$APPDIR"); @@ -62,7 +64,7 @@ public static void test() throws Exception { final int attempts = 3; final int waitBetweenAttemptsSeconds = 5; - List output = new Executor() + List output = configureEnvironment(new Executor()) .saveOutput() .setExecutable(cmd.appLauncherPath().toAbsolutePath()) .addArguments("--print-env-var=" + envVarName) diff --git a/test/jdk/tools/jpackage/share/BasicTest.java b/test/jdk/tools/jpackage/share/BasicTest.java index 15c8836e7acc..0b967373dc9c 100644 --- a/test/jdk/tools/jpackage/share/BasicTest.java +++ b/test/jdk/tools/jpackage/share/BasicTest.java @@ -72,7 +72,7 @@ public void testJpackageProps() { .saveConsoleOutput(true) .addArguments("--app-version", appVersion, "--arguments", "jpackage.app-version jpackage.app-path") - .ignoreDefaultRuntime(true); + .ignoreFakeRuntime(); cmd.executeAndAssertImageCreated(); Path launcherPath = cmd.appLauncherPath(); diff --git a/test/jdk/tools/jpackage/windows/WinChildProcessTest.java b/test/jdk/tools/jpackage/windows/WinChildProcessTest.java index 8bab8eac5fb7..5b0ff9b1f01b 100644 --- a/test/jdk/tools/jpackage/windows/WinChildProcessTest.java +++ b/test/jdk/tools/jpackage/windows/WinChildProcessTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, 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 @@ -27,7 +27,6 @@ * when System.exit(0) is invoked along with terminating java program. * @library /test/jdk/tools/jpackage/helpers * @requires os.family == "windows" - * @build WinChildProcessTest * @build jdk.jpackage.test.* * @build WinChildProcessTest * @run main/othervm -Xmx512m jdk.jpackage.test.Main @@ -41,27 +40,30 @@ import java.nio.file.Path; import jdk.jpackage.test.JPackageCommand; +import static jdk.jpackage.test.HelloApp.configureEnvironment; import jdk.jpackage.test.Annotations.Test; import jdk.jpackage.test.Executor; import jdk.jpackage.test.TKit; +import static jdk.jpackage.test.WindowsHelper.killProcess; public class WinChildProcessTest { private static final Path TEST_APP_JAVA = TKit.TEST_SRC_ROOT .resolve("apps/ChildProcessAppLauncher.java"); @Test - public static void test() throws Throwable { + public static void test() { long childPid = 0; try { JPackageCommand cmd = JPackageCommand - .helloAppImage(TEST_APP_JAVA + "*Hello"); + .helloAppImage(TEST_APP_JAVA + "*Hello") + .ignoreFakeRuntime(); // Create the image of the third party application launcher cmd.executeAndAssertImageCreated(); // Start the third party application launcher and dump and save the // output of the application - List output = new Executor().saveOutput().dumpOutput() + List output = configureEnvironment(new Executor()).saveOutput().dumpOutput() .setExecutable(cmd.appLauncherPath().toAbsolutePath()) .execute(0).getOutput(); String pidStr = output.get(0); @@ -76,10 +78,12 @@ public static void test() throws Throwable { Optional processHandle = ProcessHandle.of(childPid); boolean isAlive = processHandle.isPresent() && processHandle.get().isAlive(); - TKit.assertTrue(isAlive, "Check is child process is alive"); + TKit.assertTrue(isAlive, "Check child process is alive"); } finally { - // Kill only a specific child instance - Runtime.getRuntime().exec("taskkill /F /PID " + childPid); + if (childPid != 0) { + // Kill only a specific child instance + killProcess(childPid); + } } } } From 2fc9303554b4f18fd18eda26b1725e9adb6a3abe Mon Sep 17 00:00:00 2001 From: Elif Aslan Date: Wed, 12 Nov 2025 17:05:23 +0000 Subject: [PATCH 289/323] 8310915: Typo in aarch64.ad: "envcodings" Backport-of: 6f325db49365d3d06add5d194d4696a1428675fa --- src/hotspot/cpu/aarch64/aarch64.ad | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hotspot/cpu/aarch64/aarch64.ad b/src/hotspot/cpu/aarch64/aarch64.ad index c4270fbe40be..bb008e817424 100644 --- a/src/hotspot/cpu/aarch64/aarch64.ad +++ b/src/hotspot/cpu/aarch64/aarch64.ad @@ -3401,7 +3401,7 @@ encode %{ } %} - /// mov envcodings + // mov encodings enc_class aarch64_enc_movw_imm(iRegI dst, immI src) %{ C2_MacroAssembler _masm(&cbuf); From 43d1facd2aa1548bab166dd0a167711678c5e341 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Thu, 13 Nov 2025 17:02:38 +0000 Subject: [PATCH 290/323] 8333569: jpackage tests must run app launchers with retries on Linux only Reviewed-by: mbaesken Backport-of: aad6664bb6d2b311b3e0cb056afaa9b6534bdbbb --- .../helpers/jdk/jpackage/test/HelloApp.java | 33 ++++++++++--------- .../jpackage/share/AppLauncherEnvTest.java | 10 ++---- .../jpackage/windows/WinChildProcessTest.java | 8 ++--- 3 files changed, 24 insertions(+), 27 deletions(-) diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/HelloApp.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/HelloApp.java index a004dd421c1d..46aa2f1375f1 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/HelloApp.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/HelloApp.java @@ -351,16 +351,6 @@ public static final class AppOutputVerifier { this.outputFilePath = TKit.workDir().resolve(OUTPUT_FILENAME); this.params = new HashMap<>(); this.defaultLauncherArgs = new ArrayList<>(); - - if (TKit.isWindows()) { - // When running app launchers on Windows, clear users environment (JDK-8254920) - removePath(true); - } - } - - public AppOutputVerifier removePath(boolean v) { - removePath = v; - return this; } public AppOutputVerifier saveOutput(boolean v) { @@ -442,10 +432,7 @@ public Executor.Result execute(String... args) { if (launcherNoExit) { return getExecutor(args).executeWithoutExitCodeCheck(); } else { - final int attempts = 3; - final int waitBetweenAttemptsSeconds = 5; - return getExecutor(args).executeAndRepeatUntilExitCode(expectedExitCode, attempts, - waitBetweenAttemptsSeconds); + return HelloApp.execute(expectedExitCode, getExecutor(args)); } } @@ -475,7 +462,6 @@ private Executor getExecutor(String...args) { } private boolean launcherNoExit; - private boolean removePath; private boolean saveOutput; private final Path launcherPath; private Path outputFilePath; @@ -488,7 +474,22 @@ public static AppOutputVerifier assertApp(Path helloAppLauncher) { return new AppOutputVerifier(helloAppLauncher); } - public static Executor configureEnvironment(Executor executor) { + public static Executor.Result configureAndExecute(int expectedExitCode, Executor executor) { + return execute(expectedExitCode, configureEnvironment(executor)); + } + + private static Executor.Result execute(int expectedExitCode, Executor executor) { + if (TKit.isLinux()) { + final int attempts = 3; + final int waitBetweenAttemptsSeconds = 5; + return executor.executeAndRepeatUntilExitCode(expectedExitCode, attempts, + waitBetweenAttemptsSeconds); + } else { + return executor.execute(expectedExitCode); + } + } + + private static Executor configureEnvironment(Executor executor) { if (CLEAR_JAVA_ENV_VARS) { executor.removeEnvVar("JAVA_TOOL_OPTIONS"); executor.removeEnvVar("_JAVA_OPTIONS"); diff --git a/test/jdk/tools/jpackage/share/AppLauncherEnvTest.java b/test/jdk/tools/jpackage/share/AppLauncherEnvTest.java index 52016e6f4ab6..772370b0f8c0 100644 --- a/test/jdk/tools/jpackage/share/AppLauncherEnvTest.java +++ b/test/jdk/tools/jpackage/share/AppLauncherEnvTest.java @@ -30,7 +30,7 @@ import jdk.jpackage.test.JPackageCommand; import jdk.jpackage.test.Annotations.Test; import jdk.jpackage.test.Executor; -import static jdk.jpackage.test.HelloApp.configureEnvironment; +import static jdk.jpackage.test.HelloApp.configureAndExecute; import jdk.jpackage.test.TKit; /** @@ -62,16 +62,12 @@ public static void test() throws Exception { final String envVarName = envVarName(); - final int attempts = 3; - final int waitBetweenAttemptsSeconds = 5; - List output = configureEnvironment(new Executor()) + List output = configureAndExecute(0, new Executor() .saveOutput() .setExecutable(cmd.appLauncherPath().toAbsolutePath()) .addArguments("--print-env-var=" + envVarName) .addArguments("--print-sys-prop=" + testAddDirProp) - .addArguments("--print-sys-prop=" + "java.library.path") - .executeAndRepeatUntilExitCode(0, attempts, - waitBetweenAttemptsSeconds).getOutput(); + .addArguments("--print-sys-prop=" + "java.library.path")).getOutput(); BiFunction getValue = (idx, name) -> { return output.get(idx).substring((name + "=").length()); diff --git a/test/jdk/tools/jpackage/windows/WinChildProcessTest.java b/test/jdk/tools/jpackage/windows/WinChildProcessTest.java index 5b0ff9b1f01b..a83ef8373312 100644 --- a/test/jdk/tools/jpackage/windows/WinChildProcessTest.java +++ b/test/jdk/tools/jpackage/windows/WinChildProcessTest.java @@ -40,7 +40,7 @@ import java.nio.file.Path; import jdk.jpackage.test.JPackageCommand; -import static jdk.jpackage.test.HelloApp.configureEnvironment; +import static jdk.jpackage.test.HelloApp.configureAndExecute; import jdk.jpackage.test.Annotations.Test; import jdk.jpackage.test.Executor; import jdk.jpackage.test.TKit; @@ -63,9 +63,9 @@ public static void test() { // Start the third party application launcher and dump and save the // output of the application - List output = configureEnvironment(new Executor()).saveOutput().dumpOutput() - .setExecutable(cmd.appLauncherPath().toAbsolutePath()) - .execute(0).getOutput(); + List output = configureAndExecute(0, new Executor().saveOutput().dumpOutput() + .setExecutable(cmd.appLauncherPath().toAbsolutePath())) + .getOutput(); String pidStr = output.get(0); // parse child PID From 9f5155d9cccdc6d891b8334843d055d007ef2a42 Mon Sep 17 00:00:00 2001 From: Voznia Anton Date: Thu, 13 Nov 2025 21:13:43 +0000 Subject: [PATCH 291/323] 8351359: OperatingSystemMXBean: values from getCpuLoad and getProcessCpuLoad are stale after 24.8 days (Windows) Backport-of: 900b3ff7ee933520efe2438fb7c841a4e6a93d17 --- .../native/libmanagement_ext/OperatingSystemImpl.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/jdk.management/windows/native/libmanagement_ext/OperatingSystemImpl.c b/src/jdk.management/windows/native/libmanagement_ext/OperatingSystemImpl.c index 26d46ddaeac6..8b3e6c3ea0f5 100644 --- a/src/jdk.management/windows/native/libmanagement_ext/OperatingSystemImpl.c +++ b/src/jdk.management/windows/native/libmanagement_ext/OperatingSystemImpl.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2025, 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,8 @@ #include #pragma warning(pop) +#include + typedef unsigned __int32 juint; typedef unsigned __int64 julong; @@ -215,10 +217,10 @@ static PdhLookupPerfNameByIndexFunc PdhLookupPerfNameByIndex_i; */ typedef struct { HQUERY query; - uint64_t lastUpdate; // Last time query was updated (ticks) + uint64_t lastUpdate; // Last time query was updated (millis) } UpdateQueryS, *UpdateQueryP; -// Min time between query updates (ticks) +// Min time between query updates (millis) static const int MIN_UPDATE_INTERVAL = 500; /* @@ -993,7 +995,7 @@ bindPdhFunctionPointers(HMODULE h) { */ static int getPerformanceData(UpdateQueryP query, HCOUNTER c, PDH_FMT_COUNTERVALUE* value, DWORD format) { - clock_t now = clock(); + uint64_t now = GetTickCount64(); /* * Need to limit how often we update the query From 5794620e8bd79c1e15d421ea3cc826f0fa72d103 Mon Sep 17 00:00:00 2001 From: Elif Aslan Date: Fri, 14 Nov 2025 20:34:51 +0000 Subject: [PATCH 292/323] 8353661: Open source several swing tests batch5 Backport-of: 924638c471b0bf4a00a890ce6a3fd7e118cdd578 --- test/jdk/javax/swing/JSlider/bug4186062.java | 99 +++++++++++++ test/jdk/javax/swing/JSlider/bug4275631.java | 132 ++++++++++++++++++ test/jdk/javax/swing/JSlider/bug4382876.java | 110 +++++++++++++++ .../javax/swing/plaf/windows/bug4991587.java | 95 +++++++++++++ 4 files changed, 436 insertions(+) create mode 100644 test/jdk/javax/swing/JSlider/bug4186062.java create mode 100644 test/jdk/javax/swing/JSlider/bug4275631.java create mode 100644 test/jdk/javax/swing/JSlider/bug4382876.java create mode 100644 test/jdk/javax/swing/plaf/windows/bug4991587.java diff --git a/test/jdk/javax/swing/JSlider/bug4186062.java b/test/jdk/javax/swing/JSlider/bug4186062.java new file mode 100644 index 000000000000..1db2f1bba6c2 --- /dev/null +++ b/test/jdk/javax/swing/JSlider/bug4186062.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 1999, 2025, 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 4382876 + * @summary Tests if JSlider fires ChangeEvents when thumb is clicked and not moved + * @key headful + * @run main bug4186062 + */ + +import java.awt.Point; +import java.awt.Robot; +import java.awt.event.InputEvent; + +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JSlider; +import javax.swing.SwingUtilities; +import javax.swing.event.ChangeListener; + +public class bug4186062 { + private static JFrame f; + private static JSlider slider; + private static volatile Point loc; + private static volatile int labelNum; + + public static void main(String[] args) throws Exception { + try { + SwingUtilities.invokeAndWait(() -> { + f = new JFrame("JSlider Click Value Test"); + f.setSize(400, 200); + f.setLocationRelativeTo(null); + f.setVisible(true); + JPanel panel = new JPanel(); + slider = new JSlider(); + final JLabel label = new JLabel("0"); + labelNum = 0; + + ChangeListener listener = e -> { + labelNum++; + label.setText("" + labelNum); + }; + slider.addChangeListener(listener); + + panel.add(slider); + panel.add(label); + f.add(panel); + }); + + Robot r = new Robot(); + r.setAutoDelay(100); + r.waitForIdle(); + r.delay(1000); + + SwingUtilities.invokeAndWait(() -> { + loc = slider.getLocationOnScreen(); + loc.setLocation(loc.x + (slider.getWidth() / 2), + loc.y + (slider.getHeight() / 2)); + }); + + r.mouseMove(loc.x, loc.y); + r.mousePress(InputEvent.BUTTON1_DOWN_MASK); + r.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + + if (labelNum > 0) { + throw new RuntimeException(labelNum + " ChangeEvents fired. " + + "Test failed"); + } + } finally { + SwingUtilities.invokeAndWait(() -> { + if (f != null) { + f.dispose(); + } + }); + } + } +} diff --git a/test/jdk/javax/swing/JSlider/bug4275631.java b/test/jdk/javax/swing/JSlider/bug4275631.java new file mode 100644 index 000000000000..4d0aa5557213 --- /dev/null +++ b/test/jdk/javax/swing/JSlider/bug4275631.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2001, 2025, 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 4275631 + * @summary Tests if vertical JSlider is properly aligned in large container + * @key headful + * @run main bug4275631 + */ + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Point; +import java.awt.Robot; + +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JSlider; +import javax.swing.SwingUtilities; + +public class bug4275631 { + private static final int OFFSET = 1; + private static JFrame f; + private static JSlider slider1; + private static JSlider slider2; + private static volatile Point loc1; + private static volatile Point loc2; + + public static void main(String[] args) throws Exception { + try { + SwingUtilities.invokeAndWait(() -> { + f = new JFrame("JSlider Alignment Test"); + f.setSize(400, 200); + f.setLocationRelativeTo(null); + + // Create two sliders, verify the alignment on the slider to be + // used in the border layout + slider1 = new JSlider(JSlider.VERTICAL, 0, 99, 50); + slider1.setInverted(true); + slider1.setMajorTickSpacing(10); + slider1.setMinorTickSpacing(1); + slider1.setPaintTicks(true); + slider1.setPaintLabels(true); + slider2 = new JSlider(JSlider.VERTICAL, 0, 99, 50); + slider2.setInverted(true); + slider2.setMajorTickSpacing(10); + slider2.setMinorTickSpacing(1); + slider2.setPaintTicks(true); + slider2.setPaintLabels(true); + + // Try to center the natural way, using a border layout in the "Center" + JPanel borderPanel = new JPanel(); + borderPanel.setLayout(new BorderLayout()); + borderPanel.setBorder(BorderFactory.createTitledBorder("BorderLayout")); + borderPanel.add(slider1, BorderLayout.CENTER); + borderPanel.setPreferredSize(new Dimension(200, 200)); + + // Try to center using GridBagLayout, with glue on left + // and right to squeeze slider into place + JPanel gridBagPanel = new JPanel(new GridBagLayout()); + gridBagPanel.setBorder(BorderFactory.createTitledBorder("GridBagLayout")); + GridBagConstraints c = new GridBagConstraints(); + c.gridx = 1; + c.fill = GridBagConstraints.VERTICAL; + c.weighty = 1.0; + gridBagPanel.add(slider2, c); + c.gridx = 0; + c.fill = GridBagConstraints.BOTH; + c.weighty = 0.0; + gridBagPanel.add(Box.createHorizontalGlue(), c); + c.gridx = 2; + c.fill = GridBagConstraints.BOTH; + gridBagPanel.add(Box.createHorizontalGlue(), c); + gridBagPanel.setPreferredSize(new Dimension(200, 200)); + + f.add(borderPanel, BorderLayout.WEST); + f.add(gridBagPanel, BorderLayout.EAST); + f.setVisible(true); + }); + + Robot r = new Robot(); + r.setAutoDelay(100); + r.waitForIdle(); + r.delay(1000); + + SwingUtilities.invokeAndWait(() -> { + loc1 = slider1.getLocationOnScreen(); + loc1.setLocation(loc1.x + (slider1.getWidth() / 2), + loc1.y + (slider1.getHeight() / 2)); + + loc2 = slider2.getLocationOnScreen(); + loc2.setLocation(loc2.x + (slider2.getWidth() / 2), + loc2.y + (slider2.getHeight() / 2)); + }); + + if (loc1.y > loc2.y + OFFSET || loc1.y < loc2.y - OFFSET) { + throw new RuntimeException("JSlider position is not aligned!"); + } + } finally { + SwingUtilities.invokeAndWait(() -> { + if (f != null) { + f.dispose(); + } + }); + } + } +} diff --git a/test/jdk/javax/swing/JSlider/bug4382876.java b/test/jdk/javax/swing/JSlider/bug4382876.java new file mode 100644 index 000000000000..b9ec64aab216 --- /dev/null +++ b/test/jdk/javax/swing/JSlider/bug4382876.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2001, 2025, 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 4382876 + * @summary Tests how PgUp and PgDn keys work with JSlider + * @key headful + * @run main bug4382876 + */ + +import java.awt.BorderLayout; +import java.awt.ComponentOrientation; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsEnvironment; +import java.awt.Robot; +import java.awt.event.KeyEvent; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; + +import javax.imageio.ImageIO; +import javax.swing.JFrame; +import javax.swing.JSlider; +import javax.swing.SwingUtilities; + +public class bug4382876 { + private static Robot r; + private static JFrame f; + private static JSlider slider; + private static boolean upFail; + private static boolean downFail; + + public static void main(String[] args) throws Exception { + try { + SwingUtilities.invokeAndWait(() -> { + f = new JFrame("JSlider PageUp/Down Test"); + f.setSize(300, 200); + f.setLocationRelativeTo(null); + f.setVisible(true); + slider = new JSlider(-1000, -900, -1000); + slider.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); + slider.putClientProperty("JSlider.isFilled", Boolean.TRUE); + f.add(slider, BorderLayout.CENTER); + }); + + r = new Robot(); + r.setAutoDelay(100); + r.waitForIdle(); + r.delay(1000); + + r.keyPress(KeyEvent.VK_PAGE_UP); + SwingUtilities.invokeAndWait(() -> { + if (slider.getValue() < -1000) { + System.out.println("PAGE_UP VAL: " + slider.getValue()); + upFail = true; + } + }); + if (upFail) { + writeFailImage(); + throw new RuntimeException("Slider value did NOT change with PAGE_UP"); + } + r.keyPress(KeyEvent.VK_PAGE_DOWN); + SwingUtilities.invokeAndWait(() -> { + if (slider.getValue() > -1000) { + System.out.println("PAGE_DOWN VAL: " + slider.getValue()); + downFail = true; + } + }); + if (downFail) { + writeFailImage(); + throw new RuntimeException("Slider value did NOT change with PAGE_DOWN"); + } + } finally { + SwingUtilities.invokeAndWait(() -> { + if (f != null) { + f.dispose(); + } + }); + } + } + + private static void writeFailImage() throws IOException { + GraphicsConfiguration ge = GraphicsEnvironment + .getLocalGraphicsEnvironment().getDefaultScreenDevice() + .getDefaultConfiguration(); + BufferedImage failImage = r.createScreenCapture(ge.getBounds()); + ImageIO.write(failImage, "png", new File("failImage.png")); + } +} diff --git a/test/jdk/javax/swing/plaf/windows/bug4991587.java b/test/jdk/javax/swing/plaf/windows/bug4991587.java new file mode 100644 index 000000000000..e4e4fde2b862 --- /dev/null +++ b/test/jdk/javax/swing/plaf/windows/bug4991587.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2004, 2025, 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 4991587 + * @requires (os.family == "windows") + * @summary Tests that disabled JButton text is positioned properly in Windows L&F + * @modules java.desktop/com.sun.java.swing.plaf.windows + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4991587 + */ + +import java.awt.Color; +import java.awt.FlowLayout; +import java.awt.Graphics; +import java.awt.Rectangle; + +import javax.swing.AbstractButton; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.UIManager; + +import com.sun.java.swing.plaf.windows.WindowsButtonUI; + +public class bug4991587 { + static final String INSTRUCTIONS = """ + There are two buttons: enabled (left) and disabled (right). + Ensure that the disabled button text is painted entirely + inside the blue bounding rectangle, just like the enabled + button (use it as an example of how this should look like). + """; + + public static void main(String[] args) throws Exception { + UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); + PassFailJFrame.builder() + .title("bug4991587 Test Instructions") + .instructions(INSTRUCTIONS) + .columns(50) + .testUI(bug4991587::createUI) + .build() + .awaitAndCheck(); + } + + static JFrame createUI() { + JFrame f = new JFrame("Disabled JButton Text Test"); + f.setLayout(new FlowLayout()); + f.setSize(400, 100); + + JButton button1 = new JButton("\u0114 Enabled JButton"); + button1.setUI(new MyButtonUI()); + f.add(button1); + + JButton button2 = new JButton("\u0114 Disabled JButton"); + button2.setEnabled(false); + button2.setUI(new MyButtonUI()); + f.add(button2); + + return f; + } + + static class MyButtonUI extends WindowsButtonUI { + protected void paintText(Graphics g, AbstractButton b, + Rectangle textRect, String text) { + g.setColor(Color.blue); + g.drawRect(textRect.x, + textRect.y, + textRect.width + 1, // add 1 for the shadow, otherwise it + // will be painted over the textRect + textRect.height); + super.paintText(g, b, textRect, text); + } + } +} From fbd2ba998a3d20bf844d7e2dc55a3077f23d8886 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Tue, 18 Nov 2025 08:54:55 +0000 Subject: [PATCH 293/323] 8366229: runtime/Thread/TooSmallStackSize.java runs with all collectors Backport-of: 075ebb4ee592c10879799a68ba79f782ee49b60d --- test/hotspot/jtreg/runtime/Thread/TooSmallStackSize.java | 1 + 1 file changed, 1 insertion(+) diff --git a/test/hotspot/jtreg/runtime/Thread/TooSmallStackSize.java b/test/hotspot/jtreg/runtime/Thread/TooSmallStackSize.java index 09db906b1516..6fd1da6f2ae8 100644 --- a/test/hotspot/jtreg/runtime/Thread/TooSmallStackSize.java +++ b/test/hotspot/jtreg/runtime/Thread/TooSmallStackSize.java @@ -28,6 +28,7 @@ * VMThreadStackSize values should result in an error message that shows * the minimum stack size value for each thread type. * @library /test/lib + * @requires vm.flagless * @modules java.base/jdk.internal.misc * java.management * @run driver TooSmallStackSize From def3aae373659a6ff164566a8ab5ddeacf598388 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Tue, 18 Nov 2025 08:57:24 +0000 Subject: [PATCH 294/323] 8365790: Shutdown hook for application image does not work on Windows Reviewed-by: mbaesken Backport-of: 8b686d9ee4669d31b306d7a3337a0b57e95c9a4c --- .../native/applauncher/WinLauncher.cpp | 25 +++- .../windows/native/common/Executor.cpp | 6 +- .../windows/native/common/Executor.h | 13 +- .../tools/jpackage/apps/UseShutdownHook.java | 88 ++++++++++++ .../helpers/jdk/jpackage/test/CfgFile.java | 12 +- .../jdk/jpackage/test/PackageTest.java | 3 +- .../helpers/jdk/jpackage/test/TKit.java | 81 ++++++----- .../jpackage/resources/Win8365790Test.ps1 | 83 +++++++++++ .../jpackage/windows/Win8365790Test.java | 129 ++++++++++++++++++ 9 files changed, 397 insertions(+), 43 deletions(-) create mode 100644 test/jdk/tools/jpackage/apps/UseShutdownHook.java create mode 100644 test/jdk/tools/jpackage/resources/Win8365790Test.ps1 create mode 100644 test/jdk/tools/jpackage/windows/Win8365790Test.java diff --git a/src/jdk.jpackage/windows/native/applauncher/WinLauncher.cpp b/src/jdk.jpackage/windows/native/applauncher/WinLauncher.cpp index 119cbbd79c55..a6354dc6a7c5 100644 --- a/src/jdk.jpackage/windows/native/applauncher/WinLauncher.cpp +++ b/src/jdk.jpackage/windows/native/applauncher/WinLauncher.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, 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 @@ -226,6 +226,16 @@ class RunExecutorWithMsgLoop { }; +void enableConsoleCtrlHandler(bool enable) { + if (!SetConsoleCtrlHandler(NULL, enable ? FALSE : TRUE)) { + JP_THROW(SysError(tstrings::any() << "SetConsoleCtrlHandler(NULL, " + << (enable ? "FALSE" : "TRUE") + << ") failed", + SetConsoleCtrlHandler)); + } +} + + void launchApp() { // [RT-31061] otherwise UI can be left in back of other windows. ::AllowSetForegroundWindow(ASFW_ANY); @@ -279,6 +289,19 @@ void launchApp() { exec.arg(arg); }); + exec.afterProcessCreated([&](HANDLE pid) { + // + // Ignore Ctrl+C in the current process. + // This will prevent child process termination without allowing + // it to handle Ctrl+C events. + // + // Disable the default Ctrl+C handler *after* the child process + // has been created as it is inheritable and we want the child + // process to have the default handler. + // + enableConsoleCtrlHandler(false); + }); + DWORD exitCode = RunExecutorWithMsgLoop::apply(exec); exit(exitCode); diff --git a/src/jdk.jpackage/windows/native/common/Executor.cpp b/src/jdk.jpackage/windows/native/common/Executor.cpp index edb850afdbb2..dfb6b299e5dd 100644 --- a/src/jdk.jpackage/windows/native/common/Executor.cpp +++ b/src/jdk.jpackage/windows/native/common/Executor.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, 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 @@ -161,6 +161,10 @@ UniqueHandle Executor::startProcess(UniqueHandle* threadHandle) const { } } + if (afterProcessCreatedCallback) { + afterProcessCreatedCallback(processInfo.hProcess); + } + // Return process handle. return UniqueHandle(processInfo.hProcess); } diff --git a/src/jdk.jpackage/windows/native/common/Executor.h b/src/jdk.jpackage/windows/native/common/Executor.h index a6edcbd4f76b..09c9f85bac68 100644 --- a/src/jdk.jpackage/windows/native/common/Executor.h +++ b/src/jdk.jpackage/windows/native/common/Executor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, 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,6 +26,8 @@ #ifndef EXECUTOR_H #define EXECUTOR_H +#include + #include "tstrings.h" #include "UniqueHandle.h" @@ -97,6 +99,14 @@ class Executor { */ int execAndWaitForExit() const; + /** + * Call provided function after the process hass been created. + */ + Executor& afterProcessCreated(const std::function& v) { + afterProcessCreatedCallback = v; + return *this; + } + private: UniqueHandle startProcess(UniqueHandle* threadHandle=0) const; @@ -106,6 +116,7 @@ class Executor { HANDLE jobHandle; tstring_array argsArray; std::wstring appPath; + std::function afterProcessCreatedCallback; }; #endif // #ifndef EXECUTOR_H diff --git a/test/jdk/tools/jpackage/apps/UseShutdownHook.java b/test/jdk/tools/jpackage/apps/UseShutdownHook.java new file mode 100644 index 000000000000..c558ee85701d --- /dev/null +++ b/test/jdk/tools/jpackage/apps/UseShutdownHook.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2025, 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.io.IOException; +import java.io.UncheckedIOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +public class UseShutdownHook { + + public static void main(String[] args) throws InterruptedException { + trace("Started"); + + var outputFile = Path.of(args[0]); + trace(String.format("Write output in [%s] file", outputFile)); + + var shutdownTimeoutSeconds = Integer.parseInt(args[1]); + trace(String.format("Automatically shutdown the app in %ss", shutdownTimeoutSeconds)); + + Runtime.getRuntime().addShutdownHook(new Thread() { + @Override + public void run() { + output(outputFile, "shutdown hook executed"); + } + }); + + var startTime = System.currentTimeMillis(); + var lock = new Object(); + do { + synchronized (lock) { + lock.wait(shutdownTimeoutSeconds * 1000); + } + } while ((System.currentTimeMillis() - startTime) < (shutdownTimeoutSeconds * 1000)); + + output(outputFile, "exit"); + } + + private static void output(Path outputFilePath, String msg) { + + trace(String.format("Writing [%s] into [%s]", msg, outputFilePath)); + + try { + Files.createDirectories(outputFilePath.getParent()); + Files.writeString(outputFilePath, msg, StandardOpenOption.APPEND, StandardOpenOption.CREATE); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } + } + + private static void trace(String msg) { + Date time = new Date(System.currentTimeMillis()); + msg = String.format("UseShutdownHook [%s]: %s", SDF.format(time), msg); + System.out.println(msg); + try { + Files.write(traceFile, List.of(msg), StandardOpenOption.APPEND, StandardOpenOption.CREATE); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } + } + + private static final SimpleDateFormat SDF = new SimpleDateFormat("HH:mm:ss.SSS"); + + private static final Path traceFile = Path.of(System.getProperty("jpackage.test.trace-file")); +} diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/CfgFile.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/CfgFile.java index 9df28b3915e6..52e8ecf819bb 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/CfgFile.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/CfgFile.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, 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 @@ -59,13 +59,18 @@ public String getValueUnchecked(String sectionName, String key) { } } - public void addValue(String sectionName, String key, String value) { + public CfgFile addValue(String sectionName, String key, String value) { var section = getSection(sectionName); if (section == null) { section = new Section(sectionName, new ArrayList<>()); data.add(section); } section.data.add(Map.entry(key, value)); + return this; + } + + public CfgFile add(CfgFile other) { + return combine(this, other); } public CfgFile() { @@ -89,7 +94,7 @@ private CfgFile(List
          data, String id) { this.id = id; } - public void save(Path path) { + public CfgFile save(Path path) { var lines = data.stream().flatMap(section -> { return Stream.concat( Stream.of(String.format("[%s]", section.name)), @@ -98,6 +103,7 @@ public void save(Path path) { })); }); TKit.createTextFile(path, lines); + return this; } private Section getSection(String name) { diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PackageTest.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PackageTest.java index d89307458471..108b0051fa99 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PackageTest.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PackageTest.java @@ -26,6 +26,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.time.Duration; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -273,7 +274,7 @@ PackageTest addHelloAppFileAssociationsVerifier(FileAssociations fa) { Files.deleteIfExists(appOutput); List expectedArgs = testRun.openFiles(testFiles); - TKit.waitForFileCreated(appOutput, 7); + TKit.waitForFileCreated(appOutput, Duration.ofSeconds(7), Duration.ofSeconds(3)); // Wait a little bit after file has been created to // make sure there are no pending writes into it. diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java index bd35a5abd204..70a727d157b3 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java @@ -36,8 +36,9 @@ import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY; import java.nio.file.WatchEvent; import java.nio.file.WatchKey; -import java.nio.file.WatchService; import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.Instant; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -531,49 +532,57 @@ public static Path createRelativePathCopy(final Path file) { return file; } - static void waitForFileCreated(Path fileToWaitFor, - long timeoutSeconds) throws IOException { + public static void waitForFileCreated(Path fileToWaitFor, + Duration timeout, Duration afterCreatedTimeout) throws IOException { + waitForFileCreated(fileToWaitFor, timeout); + // Wait after the file has been created to ensure it is fully written. + ThrowingConsumer.toConsumer(Thread::sleep).accept(afterCreatedTimeout); + } + + private static void waitForFileCreated(Path fileToWaitFor, Duration timeout) throws IOException { trace(String.format("Wait for file [%s] to be available", fileToWaitFor.toAbsolutePath())); - WatchService ws = FileSystems.getDefault().newWatchService(); - - Path watchDirectory = fileToWaitFor.toAbsolutePath().getParent(); - watchDirectory.register(ws, ENTRY_CREATE, ENTRY_MODIFY); - - long waitUntil = System.currentTimeMillis() + timeoutSeconds * 1000; - for (;;) { - long timeout = waitUntil - System.currentTimeMillis(); - assertTrue(timeout > 0, String.format( - "Check timeout value %d is positive", timeout)); - - WatchKey key = ThrowingSupplier.toSupplier(() -> ws.poll(timeout, - TimeUnit.MILLISECONDS)).get(); - if (key == null) { - if (fileToWaitFor.toFile().exists()) { - trace(String.format( - "File [%s] is available after poll timeout expired", - fileToWaitFor)); - return; + try (var ws = FileSystems.getDefault().newWatchService()) { + + Path watchDirectory = fileToWaitFor.toAbsolutePath().getParent(); + watchDirectory.register(ws, ENTRY_CREATE, ENTRY_MODIFY); + + var waitUntil = Instant.now().plus(timeout); + for (;;) { + Instant n = Instant.now(); + Duration remainderTimeout = Duration.between(n, waitUntil); + assertTrue(remainderTimeout.isPositive(), String.format( + "Check timeout value %dms is positive", remainderTimeout.toMillis())); + + WatchKey key = ThrowingSupplier.toSupplier(() -> { + return ws.poll(remainderTimeout.toMillis(), TimeUnit.MILLISECONDS); + }).get(); + if (key == null) { + if (Files.exists(fileToWaitFor)) { + trace(String.format( + "File [%s] is available after poll timeout expired", + fileToWaitFor)); + return; + } + assertUnexpected(String.format("Timeout %dms expired", remainderTimeout.toMillis())); } - assertUnexpected(String.format("Timeout expired", timeout)); - } - for (WatchEvent event : key.pollEvents()) { - if (event.kind() == StandardWatchEventKinds.OVERFLOW) { - continue; - } - Path contextPath = (Path) event.context(); - if (Files.isSameFile(watchDirectory.resolve(contextPath), - fileToWaitFor)) { - trace(String.format("File [%s] is available", fileToWaitFor)); - return; + for (WatchEvent event : key.pollEvents()) { + if (event.kind() == StandardWatchEventKinds.OVERFLOW) { + continue; + } + Path contextPath = (Path) event.context(); + if (Files.exists(fileToWaitFor) && Files.isSameFile(watchDirectory.resolve(contextPath), fileToWaitFor)) { + trace(String.format("File [%s] is available", fileToWaitFor)); + return; + } } - } - if (!key.reset()) { - assertUnexpected("Watch key invalidated"); + if (!key.reset()) { + assertUnexpected("Watch key invalidated"); + } } } } diff --git a/test/jdk/tools/jpackage/resources/Win8365790Test.ps1 b/test/jdk/tools/jpackage/resources/Win8365790Test.ps1 new file mode 100644 index 000000000000..3a7d8c9a90ba --- /dev/null +++ b/test/jdk/tools/jpackage/resources/Win8365790Test.ps1 @@ -0,0 +1,83 @@ +# +# Copyright (c) 2025, 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. +# + +param ( + # Path to executable to start. + [Parameter(Mandatory=$true)] + [string]$Executable, + + # Timeout to wait after the executable has been started. + [Parameter(Mandatory=$true)] + [double]$TimeoutSeconds +) + +$type = @{ + TypeDefinition = @' +using System; +using System.Runtime.InteropServices; + +namespace Stuff { + + internal struct Details { + [DllImport("kernel32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + internal static extern bool GenerateConsoleCtrlEvent(uint dwCtrlEvent, uint dwProcessGroupId); + } + + public struct Facade { + public static void GenerateConsoleCtrlEvent() { + if (!Details.GenerateConsoleCtrlEvent(0, 0)) { + reportLastErrorAndExit("GenerateConsoleCtrlEvent"); + } + } + + internal static void reportLastErrorAndExit(String func) { + int errorCode = Marshal.GetLastWin32Error(); + Console.Error.WriteLine(func + " function failed with error code: " + errorCode); + Environment.Exit(100); + } + } +} +'@ +} +Add-Type @type + +Set-PSDebug -Trace 2 + +# Launch the target executable. +# `-NoNewWindow` parameter will attach the started process to the existing console. +$childProc = Start-Process -PassThru -NoNewWindow $Executable + +# Wait a bit to let the started process complete initialization. +Start-Sleep -Seconds $TimeoutSeconds + +# Call GenerateConsoleCtrlEvent to send a CTRL+C event to the launched executable. +# CTRL+C event will be sent to all processes attached to the console of the current process, +# i.e., it will be sent to this PowerShell process and to the started $Executable process because +# it was configured to attach to the existing console (the console of this PowerShell process). +[Stuff.Facade]::GenerateConsoleCtrlEvent() + +# Wait for child process termination +Wait-Process -InputObject $childProc + +Exit 0 diff --git a/test/jdk/tools/jpackage/windows/Win8365790Test.java b/test/jdk/tools/jpackage/windows/Win8365790Test.java new file mode 100644 index 000000000000..f0239de7eeb8 --- /dev/null +++ b/test/jdk/tools/jpackage/windows/Win8365790Test.java @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2025, 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 static jdk.jpackage.test.HelloApp.configureAndExecute; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.Duration; +import jdk.jpackage.test.AdditionalLauncher; +import jdk.jpackage.test.Annotations.Test; +import jdk.jpackage.test.CfgFile; +import jdk.jpackage.test.Executor; +import jdk.jpackage.test.JPackageCommand; +import jdk.jpackage.test.TKit; + +/** + * Test the child process has a chance to handle Ctrl+C signal. + */ + +/* + * @test + * @summary Test case for JDK-8365790 + * @library /test/jdk/tools/jpackage/helpers + * @build jdk.jpackage.test.* + * @build Win8365790Test + * @requires (os.family == "windows") + * @run main/othervm/timeout=100 -Xmx512m jdk.jpackage.test.Main + * --jpt-run=Win8365790Test + */ +public class Win8365790Test { + + @Test + public void test() throws InterruptedException, IOException { + + var outputDir = TKit.createTempDirectory("response-dir"); + + var mainOutputFile = outputDir.resolve("output.txt"); + var mainTraceFile = outputDir.resolve("trace.txt"); + + var probeOutputFile = outputDir.resolve("probe-output.txt"); + var probeTraceFile = outputDir.resolve("probe-trace.txt"); + + var cmd = JPackageCommand + .helloAppImage(TEST_APP_JAVA + "*UseShutdownHook") + .ignoreFakeRuntime() + .addArguments("--java-options", "-Djpackage.test.trace-file=" + mainTraceFile.toString()) + .addArguments("--arguments", mainOutputFile.toString()) + .addArguments("--arguments", Long.toString(Duration.ofSeconds(TETS_APP_AUTOCLOSE_TIMEOUT_SECONDS).getSeconds())); + + new AdditionalLauncher("probe") { + @Override + protected void verify(JPackageCommand cmd) { + } + }.addJavaOptions("-Djpackage.test.trace-file=" + probeTraceFile.toString()) + .addDefaultArguments(probeOutputFile.toString(), Long.toString(Duration.ofSeconds(TETS_APP_AUTOCLOSE_TIMEOUT_SECONDS).getSeconds())) + .applyTo(cmd); + + cmd.executeAndAssertImageCreated(); + + cmd.readLauncherCfgFile("probe") + .add(new CfgFile().addValue("Application", "win.norestart", Boolean.TRUE.toString())) + .save(cmd.appLauncherCfgPath("probe")); + + // Try Ctrl+C signal on a launcher with disabled restart functionality. + // It will create a single launcher process instead of the parent and the child processes. + // Ctrl+C always worked for launcher with disabled restart functionality. + var probeOutput = runLauncher(cmd, "probe", probeTraceFile, probeOutputFile); + + if (!probeOutput.equals("shutdown hook executed")) { + // Ctrl+C signal didn't make it. Test environment doesn't support Ctrl+C signal + // delivery from the prowershell process to a child process, don't run the main + // test. + TKit.throwSkippedException( + "The environment does NOT support Ctrl+C signal delivery from the prowershell process to a child process"); + } + + var mainOutput = runLauncher(cmd, null, mainTraceFile, mainOutputFile); + + TKit.assertEquals("shutdown hook executed", mainOutput, "Check shutdown hook executed"); + } + + private static String runLauncher(JPackageCommand cmd, String launcherName, Path traceFile, Path outputFile) throws IOException { + // Launch the specified launcher and send Ctrl+C signal to it. + Thread.ofVirtual().start(() -> { + configureAndExecute(0, Executor.of("powershell", "-NonInteractive", "-NoLogo", "-NoProfile", "-ExecutionPolicy", "Unrestricted") + .addArgument("-File").addArgument(TEST_PS1) + .addArguments("-TimeoutSeconds", Long.toString(Duration.ofSeconds(5).getSeconds())) + .addArgument("-Executable").addArgument(cmd.appLauncherPath(launcherName)) + .dumpOutput()); + }); + + TKit.waitForFileCreated(traceFile, Duration.ofSeconds(20), Duration.ofSeconds(2)); + + try { + TKit.waitForFileCreated(outputFile, Duration.ofSeconds(TETS_APP_AUTOCLOSE_TIMEOUT_SECONDS * 2), Duration.ofSeconds(2)); + } finally { + TKit.traceFileContents(traceFile, "Test app trace"); + } + + TKit.assertFileExists(outputFile); + return Files.readString(outputFile); + } + + private static final long TETS_APP_AUTOCLOSE_TIMEOUT_SECONDS = 30; + + private static final Path TEST_APP_JAVA = TKit.TEST_SRC_ROOT.resolve("apps/UseShutdownHook.java"); + private static final Path TEST_PS1 = TKit.TEST_SRC_ROOT.resolve(Path.of("resources/Win8365790Test.ps1")).normalize(); +} From 1e5dd98208096f4a3c8320c84563d7ef45bf0b95 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Tue, 18 Nov 2025 08:59:57 +0000 Subject: [PATCH 295/323] 8366844: Update and automate MouseDraggedOriginatedByScrollBarTest.java Backport-of: f1ee1b4a3d7c47b6f61b36b78504e3ec997a925a --- ...MouseDraggedOriginatedByScrollBarTest.java | 84 +++++++++++++------ 1 file changed, 57 insertions(+), 27 deletions(-) diff --git a/test/jdk/java/awt/List/MouseDraggedOriginatedByScrollBarTest.java b/test/jdk/java/awt/List/MouseDraggedOriginatedByScrollBarTest.java index 600d38fe3938..6858359d6b40 100644 --- a/test/jdk/java/awt/List/MouseDraggedOriginatedByScrollBarTest.java +++ b/test/jdk/java/awt/List/MouseDraggedOriginatedByScrollBarTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,41 +24,46 @@ /* * @test * @bug 6240151 + * @key headful * @summary XToolkit: Dragging the List scrollbar initiates DnD - * @library /java/awt/regtesthelpers - * @build PassFailJFrame - * @run main/manual MouseDraggedOriginatedByScrollBarTest + * @requires os.family == "linux" + * @run main MouseDraggedOriginatedByScrollBarTest */ +import java.awt.EventQueue; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.List; -import java.awt.event.MouseMotionAdapter; +import java.awt.Point; +import java.awt.Robot; +import java.awt.event.InputEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.awt.event.MouseMotionAdapter; public class MouseDraggedOriginatedByScrollBarTest { - - private static final String INSTRUCTIONS = """ - 1) Click and drag the scrollbar of the list. - 2) Keep dragging till the mouse pointer goes out the scrollbar. - 3) The test failed if you see messages about events. The test passed if you don't."""; + private static Frame frame; + private static volatile Point loc; + private static List list; + private static final int XOFFSET = 10; + private static final int YOFFSET = 20; public static void main(String[] args) throws Exception { - PassFailJFrame.builder() - .title("MouseDraggedOriginatedByScrollBarTest Instructions") - .instructions(INSTRUCTIONS) - .rows((int) INSTRUCTIONS.lines().count() + 2) - .columns(35) - .testUI(MouseDraggedOriginatedByScrollBarTest::createTestUI) - .logArea() - .build() - .awaitAndCheck(); + try { + EventQueue.invokeAndWait(() -> createUI()); + test(); + } finally { + EventQueue.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } } - private static Frame createTestUI() { - Frame frame = new Frame(); - List list = new List(4, false); + private static void createUI() { + frame = new Frame(); + list = new List(4, false); list.add("000"); list.add("111"); @@ -77,27 +82,52 @@ private static Frame createTestUI() { new MouseMotionAdapter(){ @Override public void mouseDragged(MouseEvent me){ - PassFailJFrame.log(me.toString()); + System.out.println(me); + throw new RuntimeException("Mouse dragged event detected."); } }); list.addMouseListener( new MouseAdapter() { public void mousePressed(MouseEvent me) { - PassFailJFrame.log(me.toString()); + System.out.println(me); + throw new RuntimeException("Mouse pressed event detected."); } public void mouseReleased(MouseEvent me) { - PassFailJFrame.log(me.toString()); + System.out.println(me); + throw new RuntimeException("Mouse released event detected."); } public void mouseClicked(MouseEvent me){ - PassFailJFrame.log(me.toString()); + System.out.println(me); + throw new RuntimeException("Mouse clicked event detected."); } }); frame.setLayout(new FlowLayout()); frame.pack(); - return frame; + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } + + private static void test() throws Exception { + Robot robot = new Robot(); + robot.waitForIdle(); + robot.delay(1000); + robot.setAutoWaitForIdle(true); + + EventQueue.invokeAndWait(() -> { + Point p = list.getLocationOnScreen(); + p.translate(list.getWidth() - XOFFSET, YOFFSET); + loc = p; + }); + robot.mouseMove(loc.x, loc.y); + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + for (int i = 0; i < 30; i++) { + robot.mouseMove(loc.x, loc.y + i); + } + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + robot.delay(100); } } From 9d5c7eab68b7905c80921393d37fd7bb06ff0dce Mon Sep 17 00:00:00 2001 From: Sergey Chernyshev Date: Tue, 30 Dec 2025 00:12:11 +0100 Subject: [PATCH 296/323] 8280482: Window transparency bug on Linux Backport-of: 0a3c6d6bd010231d02e92016037149e85fb1db3f --- .../MultiScreenCheckScreenIDTest.java | 148 ++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 test/jdk/java/awt/Multiscreen/MultiScreenCheckScreenIDTest.java diff --git a/test/jdk/java/awt/Multiscreen/MultiScreenCheckScreenIDTest.java b/test/jdk/java/awt/Multiscreen/MultiScreenCheckScreenIDTest.java new file mode 100644 index 000000000000..14717da57904 --- /dev/null +++ b/test/jdk/java/awt/Multiscreen/MultiScreenCheckScreenIDTest.java @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2023, 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.awt.AWTException; +import java.awt.Color; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.Window; + +import javax.swing.JWindow; +import javax.swing.SwingUtilities; + +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.List; + +/* + * @test + * @bug 8280482 + * @key headful + * @summary Test to check if window GC doesn't change within same screen. + * @run main MultiScreenCheckScreenIDTest + */ + +public class MultiScreenCheckScreenIDTest extends MouseAdapter { + private static final int COLS = 12; + private static final int ROWS = 8; + private static final Color BACKGROUND = new Color(0, 0, 255, 64); + private static GraphicsDevice[] screens; + static List windowList = new ArrayList<>(); + static Robot robot; + static JWindow window; + + + public static void main(final String[] args) throws Exception { + try { + createGUI(); + } finally { + for (Window win : windowList) { + win.dispose(); + } + if (window != null) { + window.dispose(); + } + } + System.out.println("Test Pass"); + } + + private static void createGUI() throws AWTException { + new MultiScreenCheckScreenIDTest().createWindowGrid(); + } + + private void createWindowGrid() throws AWTException { + screens = GraphicsEnvironment + .getLocalGraphicsEnvironment() + .getScreenDevices(); + + if (screens.length < 2) { + System.out.println("Testing aborted. Required min of 2 screens. " + + "Available : " + screens.length); + return; + } + robot = new Robot(); + + int screenNumber = 1; + for (GraphicsDevice screen : screens) { + Rectangle screenBounds = screen.getDefaultConfiguration().getBounds(); + + for (Rectangle r : gridOfRectangles(screenBounds, COLS, ROWS)) { + try { + SwingUtilities.invokeAndWait(() -> { + try { + window = createWindow(r); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + } catch (InterruptedException | InvocationTargetException e) { + e.printStackTrace(); + } + robot.delay(50); + robot.waitForIdle(); + if (window.getBounds().intersects(screenBounds)) { + if (!(window.getGraphicsConfiguration().getBounds(). + intersects(screenBounds))) { + throw new RuntimeException("Graphics configuration " + + "changed for screen :" + screenNumber); + } + } + windowList.add(window); + } + screenNumber++; + } + } + + private JWindow createWindow(Rectangle bounds) { + JWindow window = new JWindow(); + window.setBounds(bounds); + window.setBackground(BACKGROUND); + window.setAlwaysOnTop(true); + window.addMouseListener(this); + window.setVisible(true); + return window; + } + + @Override + public void mouseClicked(MouseEvent e) { + ((Window) e.getSource()).dispose(); + } + + private static List gridOfRectangles(Rectangle r, int cols, int rows) { + List l = new ArrayList<>(); + for (int row = 0; row < rows; row++) { + int y1 = r.y + (int) Math.round(r.height * (double) row / rows); + int y2 = r.y + (int) Math.round(r.height * (double) (row + 1) / rows); + for (int col = 0; col < cols; col++) { + int x1 = r.x + (int) Math.round(r.width * (double) col / cols); + int x2 = r.x + (int) Math.round(r.width * (double) (col + 1) / cols); + l.add(new Rectangle(x1, y1, x2 - x1, y2 - y1)); + } + } + return l; + } +} From f404fa8dc8fd6b9a28780a6fd174f1c7ddfbd664 Mon Sep 17 00:00:00 2001 From: SendaoYan Date: Fri, 21 Nov 2025 01:39:17 +0000 Subject: [PATCH 297/323] 8368668: Several vmTestbase/vm/gc/compact tests timed out on large memory machine Backport-of: 9093d3a04cd2b66425cefb44de2990cb5362a29f --- .../AllocateWithoutOomTest/AllocateWithoutOomTest.java | 4 ++-- .../Compact_InternedStrings_Strings/TestDescription.java | 4 ++-- .../vm/gc/compact/Compact_NonbranchyTree/TestDescription.java | 4 ++-- .../Compact_NonbranchyTree_ArrayOf/TestDescription.java | 4 ++-- .../Compact_NonbranchyTree_TwoFields/TestDescription.java | 4 ++-- .../vm/gc/compact/Compact_Strings/TestDescription.java | 4 ++-- .../Compact_Strings_InternedStrings/TestDescription.java | 4 ++-- .../gc/compact/Compact_Strings_TwoFields/TestDescription.java | 4 ++-- .../gc/compact/Humongous_NonbranchyTree/TestDescription.java | 4 ++-- .../vm/gc/compact/Humongous_Strings/TestDescription.java | 4 ++-- 10 files changed, 20 insertions(+), 20 deletions(-) diff --git a/test/hotspot/jtreg/vmTestbase/gc/gctests/AllocateWithoutOomTest/AllocateWithoutOomTest.java b/test/hotspot/jtreg/vmTestbase/gc/gctests/AllocateWithoutOomTest/AllocateWithoutOomTest.java index 51307bb996c3..a1bd7acedebb 100644 --- a/test/hotspot/jtreg/vmTestbase/gc/gctests/AllocateWithoutOomTest/AllocateWithoutOomTest.java +++ b/test/hotspot/jtreg/vmTestbase/gc/gctests/AllocateWithoutOomTest/AllocateWithoutOomTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2025, 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 @@ -37,7 +37,7 @@ * * @library /vmTestbase * /test/lib - * @run main/othervm + * @run main/othervm/timeout=480 * -XX:-UseGCOverheadLimit * gc.gctests.AllocateWithoutOomTest.AllocateWithoutOomTest */ diff --git a/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_InternedStrings_Strings/TestDescription.java b/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_InternedStrings_Strings/TestDescription.java index 4e11e51a8941..ad7db17e412b 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_InternedStrings_Strings/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_InternedStrings_Strings/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, 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 @@ -36,7 +36,7 @@ * * @library /vmTestbase * /test/lib - * @run main/othervm + * @run main/othervm/timeout=480 * -XX:-UseGCOverheadLimit * vm.gc.compact.Compact * -gp interned(randomString) diff --git a/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_NonbranchyTree/TestDescription.java b/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_NonbranchyTree/TestDescription.java index b058bb2c84d7..be4f9f673b77 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_NonbranchyTree/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_NonbranchyTree/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, 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 @@ -36,7 +36,7 @@ * * @library /vmTestbase * /test/lib - * @run main/othervm + * @run main/othervm/timeout=480 * -XX:-UseGCOverheadLimit * vm.gc.compact.Compact * -gp nonbranchyTree(high) diff --git a/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_NonbranchyTree_ArrayOf/TestDescription.java b/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_NonbranchyTree_ArrayOf/TestDescription.java index 3beeaa76a844..2ca21ae2ee6b 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_NonbranchyTree_ArrayOf/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_NonbranchyTree_ArrayOf/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, 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 @@ -36,7 +36,7 @@ * * @library /vmTestbase * /test/lib - * @run main/othervm + * @run main/othervm/timeout=480 * -XX:-UseGCOverheadLimit * vm.gc.compact.Compact * -gp nonbranchyTree(high) diff --git a/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_NonbranchyTree_TwoFields/TestDescription.java b/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_NonbranchyTree_TwoFields/TestDescription.java index c1421263a480..01dc687251bf 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_NonbranchyTree_TwoFields/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_NonbranchyTree_TwoFields/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, 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 @@ -36,7 +36,7 @@ * * @library /vmTestbase * /test/lib - * @run main/othervm + * @run main/othervm/timeout=480 * -XX:-UseGCOverheadLimit * vm.gc.compact.Compact * -gp nonbranchyTree(high) diff --git a/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_Strings/TestDescription.java b/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_Strings/TestDescription.java index 207822c666b2..9ba96b7e4939 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_Strings/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_Strings/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, 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 @@ -36,7 +36,7 @@ * * @library /vmTestbase * /test/lib - * @run main/othervm + * @run main/othervm/timeout=480 * -XX:-UseGCOverheadLimit * vm.gc.compact.Compact * -gp randomString diff --git a/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_Strings_InternedStrings/TestDescription.java b/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_Strings_InternedStrings/TestDescription.java index 705e47ea68ba..30dcfc7502ed 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_Strings_InternedStrings/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_Strings_InternedStrings/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, 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 @@ -36,7 +36,7 @@ * * @library /vmTestbase * /test/lib - * @run main/othervm + * @run main/othervm/timeout=480 * -XX:-UseGCOverheadLimit * vm.gc.compact.Compact * -gp randomString diff --git a/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_Strings_TwoFields/TestDescription.java b/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_Strings_TwoFields/TestDescription.java index 7d5ddc36fcb8..8a62d4b07eb4 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_Strings_TwoFields/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Compact_Strings_TwoFields/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, 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 @@ -36,7 +36,7 @@ * * @library /vmTestbase * /test/lib - * @run main/othervm + * @run main/othervm/timeout=480 * -XX:-UseGCOverheadLimit * vm.gc.compact.Compact * -gp randomString diff --git a/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Humongous_NonbranchyTree/TestDescription.java b/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Humongous_NonbranchyTree/TestDescription.java index 38c5b1e6baba..c9c117f0b0ec 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Humongous_NonbranchyTree/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Humongous_NonbranchyTree/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, 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 @@ -36,7 +36,7 @@ * * @library /vmTestbase * /test/lib - * @run main/othervm + * @run main/othervm/timeout=480 * -XX:-UseGCOverheadLimit * vm.gc.compact.Compact * -gp nonbranchyTree(high) diff --git a/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Humongous_Strings/TestDescription.java b/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Humongous_Strings/TestDescription.java index 88d11739141d..7d4b6ae3a21a 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Humongous_Strings/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Humongous_Strings/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, 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 @@ -36,7 +36,7 @@ * * @library /vmTestbase * /test/lib - * @run main/othervm + * @run main/othervm/timeout=480 * -XX:-UseGCOverheadLimit * vm.gc.compact.Compact * -gp randomString From 56345395b0aa380bf50142fff5feda691748ce0d Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 24 Nov 2025 11:50:41 +0000 Subject: [PATCH 298/323] 8370465: Right to Left Orientation Issues with MenuItem Component Backport-of: fc5df4ac8f11f25611bd4def5b655578af27c882 --- .../plaf/windows/WindowsIconFactory.java | 11 ++++++++-- .../swing/plaf/windows/WindowsMenuItemUI.java | 20 ++++++++++++++++--- .../swing/JMenuItem/RightLeftOrientation.java | 12 ++++++++++- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java index 81bd54484ef7..3fc04bb93b98 100644 --- a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java +++ b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java @@ -882,8 +882,15 @@ public void paintIcon(Component c, Graphics g, int x, int y) { } } if (icon != null) { - icon.paintIcon(c, g, x + VistaMenuItemCheckIconFactory.getIconWidth(), - y + OFFSET); + if (WindowsGraphicsUtils.isLeftToRight(c)) { + icon.paintIcon(c, g, + x + VistaMenuItemCheckIconFactory.getIconWidth(), + y + OFFSET); + } else { + icon.paintIcon(c, g, + x - VistaMenuItemCheckIconFactory.getIconWidth() + 2 * OFFSET, + y + OFFSET); + } } } private static WindowsMenuItemUIAccessor getAccessor( diff --git a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java index 7aa52eadfb8d..0fa284294e27 100644 --- a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java +++ b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java @@ -43,6 +43,7 @@ import javax.swing.JComponent; import javax.swing.JMenu; import javax.swing.JMenuItem; +import javax.swing.SwingConstants; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.UIResource; @@ -215,8 +216,17 @@ static void paintMenuItem(WindowsMenuItemUIAccessor accessor, Graphics g, if (lh.getCheckIcon() != null && lh.useCheckAndArrow()) { Rectangle rect = lr.getTextRect(); - - rect.x += lh.getAfterCheckIconGap(); + if (menuItem.getComponentOrientation().isLeftToRight()) { + if (menuItem.getHorizontalTextPosition() != SwingConstants.LEADING + && menuItem.getHorizontalTextPosition() != SwingConstants.LEFT) { + rect.x += lh.getAfterCheckIconGap(); + } + } else { + if (menuItem.getHorizontalTextPosition() != SwingConstants.LEADING + && menuItem.getHorizontalTextPosition() != SwingConstants.RIGHT) { + rect.x -= lh.getAfterCheckIconGap(); + } + } lr.setTextRect(rect); } @@ -232,7 +242,11 @@ static void paintMenuItem(WindowsMenuItemUIAccessor accessor, Graphics g, } if (lh.getCheckIcon() != null && lh.useCheckAndArrow()) { Rectangle rect = lr.getAccRect(); - rect.x += lh.getAfterCheckIconGap(); + if (menuItem.getComponentOrientation().isLeftToRight()) { + rect.x += lh.getAfterCheckIconGap(); + } else { + rect.x -= lh.getAfterCheckIconGap(); + } lr.setAccRect(rect); } SwingUtilities3.paintAccText(g, lh, lr, disabledForeground, diff --git a/test/jdk/javax/swing/JMenuItem/RightLeftOrientation.java b/test/jdk/javax/swing/JMenuItem/RightLeftOrientation.java index 7080f03ad2a6..247d8b52541b 100644 --- a/test/jdk/javax/swing/JMenuItem/RightLeftOrientation.java +++ b/test/jdk/javax/swing/JMenuItem/RightLeftOrientation.java @@ -45,7 +45,7 @@ /* * @test id=windows - * @bug 4211052 + * @bug 4211052 8370465 * @requires (os.family == "windows") * @summary Verifies if menu items lay out correctly when their * ComponentOrientation property is set to RIGHT_TO_LEFT. @@ -155,6 +155,16 @@ static void addMenuItems(JMenu menu, ComponentOrientation o) { menuItem.setHorizontalTextPosition(SwingConstants.LEADING); menu.add(menuItem); + menuItem = new JMenuItem("Text to the left", new MyMenuItemIcon()); + menuItem.setComponentOrientation(o); + menuItem.setHorizontalTextPosition(SwingConstants.LEFT); + menu.add(menuItem); + + menuItem = new JMenuItem("Text to the right", new MyMenuItemIcon()); + menuItem.setComponentOrientation(o); + menuItem.setHorizontalTextPosition(SwingConstants.RIGHT); + menu.add(menuItem); + menuItem = new JRadioButtonMenuItem("Radio Button Menu Item"); menuItem.setComponentOrientation(o); menuItem.setSelected(true); From c0918301e51969e27c9e735271d9ce03a7035208 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 24 Nov 2025 11:51:07 +0000 Subject: [PATCH 299/323] 8352682: Opensource JComponent tests Backport-of: 55afcb57a5d9dbc7bfad75e35df6b96932f6b074 --- .../javax/swing/JComponent/bug4235215.java | 64 +++++++++ .../javax/swing/JComponent/bug4247610.java | 128 ++++++++++++++++++ .../javax/swing/JComponent/bug4254995.java | 60 ++++++++ 3 files changed, 252 insertions(+) create mode 100644 test/jdk/javax/swing/JComponent/bug4235215.java create mode 100644 test/jdk/javax/swing/JComponent/bug4247610.java create mode 100644 test/jdk/javax/swing/JComponent/bug4254995.java diff --git a/test/jdk/javax/swing/JComponent/bug4235215.java b/test/jdk/javax/swing/JComponent/bug4235215.java new file mode 100644 index 000000000000..471f713ee467 --- /dev/null +++ b/test/jdk/javax/swing/JComponent/bug4235215.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 1999, 2025, 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 4235215 + * @summary Tests that Toolkit.getPrintJob() do not throw NPE + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4235215 + */ + +import java.awt.Toolkit; +import javax.swing.JButton; +import javax.swing.JFrame; + +public class bug4235215 { + + private static final String INSTRUCTIONS = """ + Press "Print Dialog" button. + If you see a print dialog, test passes. + Click "Cancel" button to close it."""; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .title("bug4235215 Instructions") + .instructions(INSTRUCTIONS) + .columns(35) + .testUI(bug4235215::createTestUI) + .build() + .awaitAndCheck(); + } + + private static JFrame createTestUI() { + JFrame frame = new JFrame("bug4235215"); + JButton button = new JButton("Print Dialog"); + button.addActionListener(ev -> { + Toolkit.getDefaultToolkit().getPrintJob(frame, "Test Printing", null); + }); + frame.add(button); + frame.pack(); + return frame; + } +} diff --git a/test/jdk/javax/swing/JComponent/bug4247610.java b/test/jdk/javax/swing/JComponent/bug4247610.java new file mode 100644 index 000000000000..e5470606f6e0 --- /dev/null +++ b/test/jdk/javax/swing/JComponent/bug4247610.java @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2000, 2025, 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 4247610 + * @summary Tests an unnecessary repaint issue + * @key headful + * @run main bug4247610 + */ + +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Graphics; +import java.awt.Point; +import java.awt.Robot; +import java.awt.event.InputEvent; +import javax.swing.JButton; +import javax.swing.JDesktopPane; +import javax.swing.JFrame; +import javax.swing.JInternalFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; + +import java.util.concurrent.atomic.AtomicInteger; +import java.util.Random; + +public class bug4247610 { + + private static JFrame frame; + private static JButton damager; + private static volatile Point loc; + private static volatile Dimension size; + private static volatile boolean traced; + private static volatile boolean failed; + + public static void main(String[] args) throws Exception { + Robot robot = new Robot(); + SwingUtilities.invokeAndWait(() -> { + frame = new JFrame("bug4247610"); + JDesktopPane pane = new JDesktopPane(); + + JInternalFrame jif = new JInternalFrame( + "Damager", true, true, true, true); + InternalFramePanel ifp = new InternalFramePanel(); + damager = new JButton("Damage!"); + ifp.add(damager); + jif.setContentPane(ifp); + jif.setBounds(0, 0, 300, 300); + jif.setVisible(true); + pane.add(jif); + + jif = new JInternalFrame("Damagee", true, true, true, true); + JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT)); + final JLabel damagee = new JLabel(""); + panel.add(damagee); + jif.setContentPane(panel); + jif.setBounds(60, 220, 300, 100); + jif.setVisible(true); + pane.add(jif); + + final Random random = new Random(); + + damager.addActionListener((e) -> { + System.out.println("trace paints enabled"); + traced = true; + damagee.setText(Integer.toString(random.nextInt())); + }); + frame.setContentPane(pane); + frame.setSize(500, 500); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + }); + robot.waitForIdle(); + robot.delay(1000); + SwingUtilities.invokeAndWait(() -> { + loc = damager.getLocationOnScreen(); + size = damager.getSize(); + }); + robot.mouseMove(loc.x + size.width / 2, loc.y + size.height / 2); + robot.waitForIdle(); + robot.delay(200); + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + if (failed) { + throw new RuntimeException("Failed: unnecessary repaint occured"); + } + } + + + static class InternalFramePanel extends JPanel { + final AtomicInteger repaintCounter = new AtomicInteger(0); + InternalFramePanel() { + super(new FlowLayout()); + setOpaque(true); + } + + public synchronized void paintComponent(Graphics g) { + super.paintComponent(g); + repaintCounter.incrementAndGet(); + System.out.println("repaintCounter " + repaintCounter.intValue()); + if (traced) { + failed = true; + } + } + } +} diff --git a/test/jdk/javax/swing/JComponent/bug4254995.java b/test/jdk/javax/swing/JComponent/bug4254995.java new file mode 100644 index 000000000000..8947558f128b --- /dev/null +++ b/test/jdk/javax/swing/JComponent/bug4254995.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 1999, 2025, 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 4254995 + * @summary Tests that html in renderer works correctly + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4254995 + */ + +import javax.swing.JFrame; +import javax.swing.JList; +import javax.swing.JScrollPane; + +public class bug4254995 { + + private static final String INSTRUCTIONS = """ + If you see a list containing digits from one to seven, test passes. + Otherwise it fails."""; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .title("bug4254995 Instructions") + .instructions(INSTRUCTIONS) + .columns(35) + .testUI(bug4254995::createTestUI) + .build() + .awaitAndCheck(); + } + + private static JFrame createTestUI() { + JFrame frame = new JFrame("bug4254995"); + String[] data = { "1", "2", "3", "4", "5", "6", "7" }; + frame.add(new JScrollPane(new JList(data))); + frame.pack(); + return frame; + } +} From c34ca2dba5238e58ca53fae183680f74d40e0c91 Mon Sep 17 00:00:00 2001 From: Roland Mesde Date: Mon, 24 Nov 2025 16:12:20 +0000 Subject: [PATCH 300/323] 8351110: ImageIO.write for JPEG can write corrupt JPEG for certain thumbnail dimensions Backport-of: 60f3d607412dfe289f33dd922dfc1c9ff766810f --- .../plugins/jpeg/JFIFMarkerSegment.java | 9 + .../imageio/plugins/jpeg/MarkerSegment.java | 5 +- .../plugins/jpeg/WriteJPEGThumbnailTest.java | 155 ++++++++++++++++++ 3 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 test/jdk/javax/imageio/plugins/jpeg/WriteJPEGThumbnailTest.java diff --git a/src/java.desktop/share/classes/com/sun/imageio/plugins/jpeg/JFIFMarkerSegment.java b/src/java.desktop/share/classes/com/sun/imageio/plugins/jpeg/JFIFMarkerSegment.java index 8b95d8adc65f..52f75055cfb7 100644 --- a/src/java.desktop/share/classes/com/sun/imageio/plugins/jpeg/JFIFMarkerSegment.java +++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/jpeg/JFIFMarkerSegment.java @@ -376,6 +376,15 @@ void write(ImageOutputStream ios, } thumbWidth = Math.min(thumbWidth, MAX_THUMB_WIDTH); thumbHeight = Math.min(thumbHeight, MAX_THUMB_HEIGHT); + + int maxArea = (0xffff - DATA_SIZE - LENGTH_SIZE) / thumb.getSampleModel().getNumBands(); + if (thumbWidth * thumbHeight > maxArea) { + writer.warningOccurred(JPEGImageWriter.WARNING_THUMB_CLIPPED); + double scale = Math.sqrt( ((double)maxArea) / (double)(thumbWidth * thumbHeight) ); + thumbWidth = (int) (scale * thumbWidth); + thumbHeight = (int) (scale * thumbHeight); + } + thumbData = thumb.getRaster().getPixels(0, 0, thumbWidth, thumbHeight, (int []) null); diff --git a/src/java.desktop/share/classes/com/sun/imageio/plugins/jpeg/MarkerSegment.java b/src/java.desktop/share/classes/com/sun/imageio/plugins/jpeg/MarkerSegment.java index a0b4b871a04d..f4ba27b0fcd4 100644 --- a/src/java.desktop/share/classes/com/sun/imageio/plugins/jpeg/MarkerSegment.java +++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/jpeg/MarkerSegment.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2025, 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 @@ -190,6 +190,9 @@ void write(ImageOutputStream ios) throws IOException { static void write2bytes(ImageOutputStream ios, int value) throws IOException { + if (value < 0 || value > 0xffff) { + throw new IIOException("Invalid 2-byte value: " + value); + } ios.write((value >> 8) & 0xff); ios.write(value & 0xff); diff --git a/test/jdk/javax/imageio/plugins/jpeg/WriteJPEGThumbnailTest.java b/test/jdk/javax/imageio/plugins/jpeg/WriteJPEGThumbnailTest.java new file mode 100644 index 000000000000..94ad1fd6e8d1 --- /dev/null +++ b/test/jdk/javax/imageio/plugins/jpeg/WriteJPEGThumbnailTest.java @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2025, 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 8351110 + * @summary Test verifies that when a JFIF thumbnail may exceed 65535 bytes + * we still write a valid JPEG file by clipping the thumbnail. + * @run main WriteJPEGThumbnailTest + */ + +import javax.imageio.IIOImage; +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import javax.imageio.ImageWriter; +import javax.imageio.stream.ImageInputStream; +import javax.imageio.stream.ImageOutputStream; +import java.awt.geom.AffineTransform; +import java.awt.image.BufferedImage; +import java.awt.Color; +import java.awt.Graphics2D; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Iterator; +import java.util.List; + +public class WriteJPEGThumbnailTest { + + private static void assertEquals(int expected, int observed) { + if (expected != observed) { + throw new Error("expected " + expected + ", but observed " + observed); + } + } + + public static void main(String[] args) throws Exception { + // this always passed. 21800 * 3 = 65400, which fits in a 65535-byte segment. + boolean b1 = new WriteJPEGThumbnailTest(100, 218).run(); + + // this failed prior to resolving 8351110. 21900 * 3 = 65700, which is too large + // for a JPEG segment. Now we clip the thumbnail to make it fit. (Previously + // we wrote a corrupt JPEG file.) + boolean b2 = new WriteJPEGThumbnailTest(100, 219).run(); + + if (!(b1 && b2)) { + System.err.println("Test failed"); + throw new Error("Test failed"); + } + } + + final int thumbWidth; + final int thumbHeight; + + public WriteJPEGThumbnailTest(int thumbWidth, int thumbHeight) { + this.thumbWidth = thumbWidth; + this.thumbHeight = thumbHeight; + } + + public boolean run() throws Exception { + System.out.println("Testing thumbnail " + thumbWidth + "x" + thumbHeight + "..."); + try { + ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); + BufferedImage thumbnail = writeImage(byteOut); + byte[] jpegData = byteOut.toByteArray(); + ImageReader reader = getJPEGImageReader(); + ImageInputStream stream = ImageIO.createImageInputStream(new ByteArrayInputStream(jpegData)); + reader.setInput(stream); + assertEquals(1, reader.getNumThumbnails(0)); + + // we may have a subset of our original thumbnail, that's OK + BufferedImage readThumbnail = reader.readThumbnail(0, 0); + for (int y = 0; y < readThumbnail.getHeight(); y++) { + for (int x = 0; x < readThumbnail.getWidth(); x++) { + int rgb1 = thumbnail.getRGB(x, y); + int rgb2 = readThumbnail.getRGB(x, y); + assertEquals(rgb1, rgb2); + } + } + System.out.println("\tTest passed"); + } catch (Throwable e) { + e.printStackTrace(); + return false; + } + return true; + } + + private BufferedImage writeImage(OutputStream out) throws IOException { + BufferedImage thumbnail = createImage(thumbWidth, thumbHeight); + BufferedImage bi = createImage(thumbnail.getWidth() * 10, thumbnail.getHeight() * 10); + + ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next(); + + try (ImageOutputStream outputStream = ImageIO.createImageOutputStream(out)) { + writer.setOutput(outputStream); + + // Write the main image + IIOImage img = new IIOImage(bi, List.of(thumbnail), null); + writer.write(null, img, null); + } finally { + writer.dispose(); + } + return thumbnail; + } + + private static BufferedImage createImage(int width, int height) { + BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + Graphics2D g = bi.createGraphics(); + double sx = ((double)width) / 1000.0; + double sy = ((double)height) / 1000.0; + g.transform(AffineTransform.getScaleInstance(sx, sy)); + g.setColor(Color.RED); + g.fillRect(0, 0, 100, 100); + g.setColor(Color.GREEN); + g.fillRect(900, 0, 900, 100); + g.setColor(Color.ORANGE); + g.fillRect(0, 900, 100, 100); + g.setColor(Color.MAGENTA); + g.fillRect(900, 900, 100, 100); + g.dispose(); + return bi; + } + + private static ImageReader getJPEGImageReader() { + Iterator readers = ImageIO.getImageReadersByFormatName("jpeg"); + ImageReader reader; + while (readers.hasNext()) { + reader = readers.next(); + if (reader.canReadRaster()) { + return reader; + } + } + return null; + } +} From 93a793395eb756d4c59882469f60ef0a77213424 Mon Sep 17 00:00:00 2001 From: Roland Mesde Date: Mon, 24 Nov 2025 16:25:16 +0000 Subject: [PATCH 301/323] 8366893: java/lang/Thread/virtual/stress/GetStackTraceALotWhenPinned.java timed out on macos-aarch64 Reviewed-by: phh Backport-of: 0dad3f1ae8d0c35c4b7a8188ad7854d01c7cd6b4 --- .../Thread/virtual/stress/GetStackTraceALotWhenPinned.java | 4 ++-- test/jdk/java/lang/Thread/virtual/stress/ParkALot.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/jdk/java/lang/Thread/virtual/stress/GetStackTraceALotWhenPinned.java b/test/jdk/java/lang/Thread/virtual/stress/GetStackTraceALotWhenPinned.java index b081d261529c..b526af0c7f51 100644 --- a/test/jdk/java/lang/Thread/virtual/stress/GetStackTraceALotWhenPinned.java +++ b/test/jdk/java/lang/Thread/virtual/stress/GetStackTraceALotWhenPinned.java @@ -56,8 +56,8 @@ public static void main(String[] args) throws Exception { int iterations; int value = Integer.parseInt(args[0]); - if (Platform.isOSX() && Platform.isX64()) { - // reduced iterations on macosx-x64 + if (Platform.isOSX()) { + // reduced iterations on macosx iterations = Math.max(value / 4, 1); } else { iterations = value; diff --git a/test/jdk/java/lang/Thread/virtual/stress/ParkALot.java b/test/jdk/java/lang/Thread/virtual/stress/ParkALot.java index 882e0b881bc2..a9dd16e25866 100644 --- a/test/jdk/java/lang/Thread/virtual/stress/ParkALot.java +++ b/test/jdk/java/lang/Thread/virtual/stress/ParkALot.java @@ -49,8 +49,8 @@ public class ParkALot { public static void main(String[] args) throws Exception { int iterations; int value = Integer.parseInt(args[0]); - if (Platform.isOSX() && Platform.isX64()) { - // reduced iterations on macosx-x64 + if (Platform.isOSX()) { + // reduced iterations on macosx iterations = Math.max(value / 4, 1); } else { iterations = value; From 3619a7c59104cb0247e1965be72a6b170d271a4d Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Wed, 26 Nov 2025 19:31:16 +0000 Subject: [PATCH 302/323] 8364258: ThreadGroup constant pool serialization is not normalized Reviewed-by: phh Backport-of: 1e2bf070f0cb9e852839347d1f5711c583091d85 --- .../checkpoint/types/jfrThreadGroup.cpp | 418 ------------------ .../types/jfrThreadGroupManager.cpp | 332 ++++++++++++++ ...eadGroup.hpp => jfrThreadGroupManager.hpp} | 41 +- .../jfr/recorder/checkpoint/types/jfrType.cpp | 19 +- .../jfr/recorder/checkpoint/types/jfrType.hpp | 7 +- .../checkpoint/types/jfrTypeManager.cpp | 4 +- .../share/jfr/recorder/jfrRecorder.cpp | 9 + .../share/jfr/recorder/jfrRecorder.hpp | 1 + .../share/jfr/support/jfrThreadLocal.cpp | 50 ++- .../share/jfr/support/jfrThreadLocal.hpp | 4 + src/hotspot/share/runtime/javaThread.cpp | 2 + 11 files changed, 420 insertions(+), 467 deletions(-) delete mode 100644 src/hotspot/share/jfr/recorder/checkpoint/types/jfrThreadGroup.cpp create mode 100644 src/hotspot/share/jfr/recorder/checkpoint/types/jfrThreadGroupManager.cpp rename src/hotspot/share/jfr/recorder/checkpoint/types/{jfrThreadGroup.hpp => jfrThreadGroupManager.hpp} (50%) diff --git a/src/hotspot/share/jfr/recorder/checkpoint/types/jfrThreadGroup.cpp b/src/hotspot/share/jfr/recorder/checkpoint/types/jfrThreadGroup.cpp deleted file mode 100644 index 615a092d778c..000000000000 --- a/src/hotspot/share/jfr/recorder/checkpoint/types/jfrThreadGroup.cpp +++ /dev/null @@ -1,418 +0,0 @@ -/* - * Copyright (c) 2016, 2023, 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. - * - */ - -#include "precompiled.hpp" -#include "jfr/recorder/checkpoint/jfrCheckpointWriter.hpp" -#include "jfr/recorder/checkpoint/types/jfrThreadGroup.hpp" -#include "jfr/utilities/jfrTypes.hpp" -#include "runtime/handles.inline.hpp" -#include "runtime/jniHandles.inline.hpp" -#include "runtime/safepoint.hpp" -#include "runtime/semaphore.hpp" -#include "utilities/growableArray.hpp" - -static const int initial_array_size = 30; - -class ThreadGroupExclusiveAccess : public StackObj { - private: - static Semaphore _mutex_semaphore; - public: - ThreadGroupExclusiveAccess() { _mutex_semaphore.wait(); } - ~ThreadGroupExclusiveAccess() { _mutex_semaphore.signal(); } -}; - -Semaphore ThreadGroupExclusiveAccess::_mutex_semaphore(1); -JfrThreadGroup* JfrThreadGroup::_instance = nullptr; - -class JfrThreadGroupPointers : public ResourceObj { - private: - const Handle _thread_group_handle; - jweak _thread_group_weak_ref; - public: - JfrThreadGroupPointers(Handle thread_group_handle, jweak thread_group_weak_ref); - Handle thread_group_handle() const; - jweak thread_group_weak_ref() const; - oopDesc* const thread_group_oop() const; - jweak transfer_weak_global_handle_ownership(); - void clear_weak_ref(); -}; - -JfrThreadGroupPointers::JfrThreadGroupPointers(Handle thread_group_handle, jweak thread_group_weak_ref) : - _thread_group_handle(thread_group_handle), - _thread_group_weak_ref(thread_group_weak_ref) {} - -Handle JfrThreadGroupPointers::thread_group_handle() const { - return _thread_group_handle; -} - -jweak JfrThreadGroupPointers::thread_group_weak_ref() const { - return _thread_group_weak_ref; -} - -oopDesc* const JfrThreadGroupPointers::thread_group_oop() const { - assert(_thread_group_weak_ref == nullptr || - JNIHandles::resolve_non_null(_thread_group_weak_ref) == _thread_group_handle(), "invariant"); - return _thread_group_handle(); -} - -jweak JfrThreadGroupPointers::transfer_weak_global_handle_ownership() { - jweak temp = _thread_group_weak_ref; - _thread_group_weak_ref = nullptr; - return temp; -} - -void JfrThreadGroupPointers::clear_weak_ref() { - if (nullptr != _thread_group_weak_ref) { - JNIHandles::destroy_weak_global(_thread_group_weak_ref); - } -} - -class JfrThreadGroupsHelper : public ResourceObj { - private: - static const int invalid_iterator_pos = -1; - GrowableArray* _thread_group_hierarchy; - int _current_iterator_pos; - - int populate_thread_group_hierarchy(const JavaThread* jt, Thread* current); - JfrThreadGroupPointers& at(int index); - - public: - JfrThreadGroupsHelper(const JavaThread* jt, Thread* current); - ~JfrThreadGroupsHelper(); - JfrThreadGroupPointers& next(); - bool is_valid() const; - bool has_next() const; -}; - -JfrThreadGroupsHelper::JfrThreadGroupsHelper(const JavaThread* jt, Thread* current) { - _thread_group_hierarchy = new GrowableArray(10); - _current_iterator_pos = populate_thread_group_hierarchy(jt, current) - 1; -} - -JfrThreadGroupsHelper::~JfrThreadGroupsHelper() { - assert(_current_iterator_pos == invalid_iterator_pos, "invariant"); - for (int i = 0; i < _thread_group_hierarchy->length(); ++i) { - _thread_group_hierarchy->at(i)->clear_weak_ref(); - } -} - -JfrThreadGroupPointers& JfrThreadGroupsHelper::at(int index) { - assert(_thread_group_hierarchy != nullptr, "invariant"); - assert(index > invalid_iterator_pos && index < _thread_group_hierarchy->length(), "invariant"); - return *(_thread_group_hierarchy->at(index)); -} - -bool JfrThreadGroupsHelper::has_next() const { - return _current_iterator_pos > invalid_iterator_pos; -} - -bool JfrThreadGroupsHelper::is_valid() const { - return (_thread_group_hierarchy != nullptr && _thread_group_hierarchy->length() > 0); -} - -JfrThreadGroupPointers& JfrThreadGroupsHelper::next() { - assert(is_valid(), "invariant"); - return at(_current_iterator_pos--); -} - -/* - * If not at a safepoint, we create global weak references for - * all reachable threadgroups for this thread. - * If we are at a safepoint, the caller is the VMThread during - * JFR checkpointing. It can use naked oops, because nothing - * will move before the list of threadgroups is cleared and - * mutator threads restarted. The threadgroup list is cleared - * later by the VMThread as one of the final steps in JFR checkpointing - * (not here). - */ -int JfrThreadGroupsHelper::populate_thread_group_hierarchy(const JavaThread* jt, Thread* current) { - assert(jt != nullptr && jt->is_Java_thread(), "invariant"); - assert(current != nullptr, "invariant"); - assert(_thread_group_hierarchy != nullptr, "invariant"); - - oop thread_oop = jt->threadObj(); - if (thread_oop == nullptr) { - return 0; - } - // immediate thread group - Handle thread_group_handle(current, java_lang_Thread::threadGroup(thread_oop)); - if (thread_group_handle == nullptr) { - return 0; - } - - const bool use_weak_handles = !SafepointSynchronize::is_at_safepoint(); - jweak thread_group_weak_ref = use_weak_handles ? JNIHandles::make_weak_global(thread_group_handle) : nullptr; - - JfrThreadGroupPointers* thread_group_pointers = new JfrThreadGroupPointers(thread_group_handle, thread_group_weak_ref); - _thread_group_hierarchy->append(thread_group_pointers); - // immediate parent thread group - oop parent_thread_group_obj = java_lang_ThreadGroup::parent(thread_group_handle()); - Handle parent_thread_group_handle(current, parent_thread_group_obj); - - // and check parents parents... - while (parent_thread_group_handle != nullptr) { - const jweak parent_group_weak_ref = use_weak_handles ? JNIHandles::make_weak_global(parent_thread_group_handle) : nullptr; - thread_group_pointers = new JfrThreadGroupPointers(parent_thread_group_handle, parent_group_weak_ref); - _thread_group_hierarchy->append(thread_group_pointers); - parent_thread_group_obj = java_lang_ThreadGroup::parent(parent_thread_group_handle()); - parent_thread_group_handle = Handle(current, parent_thread_group_obj); - } - return _thread_group_hierarchy->length(); -} - -static traceid next_id() { - static traceid _current_threadgroup_id = 1; // 1 is reserved for thread group "VirtualThreads" - return ++_current_threadgroup_id; -} - -class JfrThreadGroup::JfrThreadGroupEntry : public JfrCHeapObj { - friend class JfrThreadGroup; - private: - traceid _thread_group_id; - traceid _parent_group_id; - char* _thread_group_name; // utf8 format - // If an entry is created during a safepoint, the - // _thread_group_oop contains a direct oop to - // the java.lang.ThreadGroup object. - // If an entry is created on javathread exit time (not at safepoint), - // _thread_group_weak_ref contains a JNI weak global handle - // indirection to the java.lang.ThreadGroup object. - // Note: we cannot use a union here since CHECK_UNHANDLED_OOPS makes oop have - // a ctor which isn't allowed in a union by the SunStudio compiler - oop _thread_group_oop; - jweak _thread_group_weak_ref; - - JfrThreadGroupEntry(const char* tgstr, JfrThreadGroupPointers& ptrs); - ~JfrThreadGroupEntry(); - - traceid thread_group_id() const { return _thread_group_id; } - void set_thread_group_id(traceid tgid) { _thread_group_id = tgid; } - - const char* const thread_group_name() const { return _thread_group_name; } - void set_thread_group_name(const char* tgname); - - traceid parent_group_id() const { return _parent_group_id; } - void set_parent_group_id(traceid pgid) { _parent_group_id = pgid; } - - void set_thread_group(JfrThreadGroupPointers& ptrs); - bool is_equal(const JfrThreadGroupPointers& ptrs) const; - const oop thread_group() const; -}; - -JfrThreadGroup::JfrThreadGroupEntry::JfrThreadGroupEntry(const char* tgname, JfrThreadGroupPointers& ptrs) : - _thread_group_id(0), - _parent_group_id(0), - _thread_group_name(nullptr), - _thread_group_oop(nullptr), - _thread_group_weak_ref(nullptr) { - set_thread_group_name(tgname); - set_thread_group(ptrs); -} - -JfrThreadGroup::JfrThreadGroupEntry::~JfrThreadGroupEntry() { - if (_thread_group_name != nullptr) { - JfrCHeapObj::free(_thread_group_name, strlen(_thread_group_name) + 1); - } - if (_thread_group_weak_ref != nullptr) { - JNIHandles::destroy_weak_global(_thread_group_weak_ref); - } -} - -void JfrThreadGroup::JfrThreadGroupEntry::set_thread_group_name(const char* tgname) { - assert(_thread_group_name == nullptr, "invariant"); - if (tgname != nullptr) { - size_t len = strlen(tgname); - _thread_group_name = JfrCHeapObj::new_array(len + 1); - strncpy(_thread_group_name, tgname, len + 1); - } -} - -const oop JfrThreadGroup::JfrThreadGroupEntry::thread_group() const { - return _thread_group_weak_ref != nullptr ? JNIHandles::resolve(_thread_group_weak_ref) : _thread_group_oop; -} - -void JfrThreadGroup::JfrThreadGroupEntry::set_thread_group(JfrThreadGroupPointers& ptrs) { - _thread_group_weak_ref = ptrs.transfer_weak_global_handle_ownership(); - if (_thread_group_weak_ref == nullptr) { - _thread_group_oop = ptrs.thread_group_oop(); - assert(_thread_group_oop != nullptr, "invariant"); - } else { - _thread_group_oop = nullptr; - } -} - -JfrThreadGroup::JfrThreadGroup() : - _list(new (mtTracing) GrowableArray(initial_array_size, mtTracing)) {} - -JfrThreadGroup::~JfrThreadGroup() { - if (_list != nullptr) { - for (int i = 0; i < _list->length(); i++) { - JfrThreadGroupEntry* e = _list->at(i); - delete e; - } - delete _list; - } -} - -JfrThreadGroup* JfrThreadGroup::instance() { - return _instance; -} - -void JfrThreadGroup::set_instance(JfrThreadGroup* new_instance) { - _instance = new_instance; -} - -traceid JfrThreadGroup::thread_group_id(const JavaThread* jt, Thread* current) { - HandleMark hm(current); - JfrThreadGroupsHelper helper(jt, current); - return helper.is_valid() ? thread_group_id_internal(helper) : 0; -} - -traceid JfrThreadGroup::thread_group_id(JavaThread* const jt) { - return thread_group_id(jt, jt); -} - -traceid JfrThreadGroup::thread_group_id_internal(JfrThreadGroupsHelper& helper) { - ThreadGroupExclusiveAccess lock; - JfrThreadGroup* tg_instance = instance(); - if (tg_instance == nullptr) { - tg_instance = new JfrThreadGroup(); - if (tg_instance == nullptr) { - return 0; - } - set_instance(tg_instance); - } - - JfrThreadGroupEntry* tge = nullptr; - int parent_thread_group_id = 0; - while (helper.has_next()) { - JfrThreadGroupPointers& ptrs = helper.next(); - tge = tg_instance->find_entry(ptrs); - if (nullptr == tge) { - tge = tg_instance->new_entry(ptrs); - assert(tge != nullptr, "invariant"); - tge->set_parent_group_id(parent_thread_group_id); - } - parent_thread_group_id = tge->thread_group_id(); - } - // the last entry in the hierarchy is the immediate thread group - return tge->thread_group_id(); -} - -bool JfrThreadGroup::JfrThreadGroupEntry::is_equal(const JfrThreadGroupPointers& ptrs) const { - return ptrs.thread_group_oop() == thread_group(); -} - -JfrThreadGroup::JfrThreadGroupEntry* -JfrThreadGroup::find_entry(const JfrThreadGroupPointers& ptrs) const { - for (int index = 0; index < _list->length(); ++index) { - JfrThreadGroupEntry* curtge = _list->at(index); - if (curtge->is_equal(ptrs)) { - return curtge; - } - } - return (JfrThreadGroupEntry*) nullptr; -} - -// Assumes you already searched for the existence -// of a corresponding entry in find_entry(). -JfrThreadGroup::JfrThreadGroupEntry* -JfrThreadGroup::new_entry(JfrThreadGroupPointers& ptrs) { - JfrThreadGroupEntry* const tge = new JfrThreadGroupEntry(java_lang_ThreadGroup::name(ptrs.thread_group_oop()), ptrs); - add_entry(tge); - return tge; -} - -int JfrThreadGroup::add_entry(JfrThreadGroupEntry* tge) { - assert(tge != nullptr, "attempting to add a null entry!"); - assert(0 == tge->thread_group_id(), "id must be unassigned!"); - tge->set_thread_group_id(next_id()); - return _list->append(tge); -} - -void JfrThreadGroup::write_thread_group_entries(JfrCheckpointWriter& writer) const { - assert(_list != nullptr && !_list->is_empty(), "should not need be here!"); - const int number_of_tg_entries = _list->length(); - writer.write_count(number_of_tg_entries + 1); // + VirtualThread group - writer.write_key(1); // 1 is reserved for VirtualThread group - writer.write(0); // parent - const oop vgroup = java_lang_Thread_Constants::get_VTHREAD_GROUP(); - assert(vgroup != (oop)nullptr, "invariant"); - const char* const vgroup_name = java_lang_ThreadGroup::name(vgroup); - assert(vgroup_name != nullptr, "invariant"); - writer.write(vgroup_name); - for (int index = 0; index < number_of_tg_entries; ++index) { - const JfrThreadGroupEntry* const curtge = _list->at(index); - writer.write_key(curtge->thread_group_id()); - writer.write(curtge->parent_group_id()); - writer.write(curtge->thread_group_name()); - } -} - -void JfrThreadGroup::write_selective_thread_group(JfrCheckpointWriter* writer, traceid thread_group_id) const { - assert(writer != nullptr, "invariant"); - assert(_list != nullptr && !_list->is_empty(), "should not need be here!"); - assert(thread_group_id != 1, "should not need be here!"); - const int number_of_tg_entries = _list->length(); - - // save context - const JfrCheckpointContext ctx = writer->context(); - writer->write_type(TYPE_THREADGROUP); - const jlong count_offset = writer->reserve(sizeof(u4)); // Don't know how many yet - int number_of_entries_written = 0; - for (int index = number_of_tg_entries - 1; index >= 0; --index) { - const JfrThreadGroupEntry* const curtge = _list->at(index); - if (thread_group_id == curtge->thread_group_id()) { - writer->write_key(curtge->thread_group_id()); - writer->write(curtge->parent_group_id()); - writer->write(curtge->thread_group_name()); - ++number_of_entries_written; - thread_group_id = curtge->parent_group_id(); - } - } - if (number_of_entries_written == 0) { - // nothing to write, restore context - writer->set_context(ctx); - return; - } - assert(number_of_entries_written > 0, "invariant"); - writer->write_count(number_of_entries_written, count_offset); -} - -// Write out JfrThreadGroup instance and then delete it -void JfrThreadGroup::serialize(JfrCheckpointWriter& writer) { - ThreadGroupExclusiveAccess lock; - JfrThreadGroup* tg_instance = instance(); - assert(tg_instance != nullptr, "invariant"); - tg_instance->write_thread_group_entries(writer); -} - -// for writing a particular thread group -void JfrThreadGroup::serialize(JfrCheckpointWriter* writer, traceid thread_group_id) { - assert(writer != nullptr, "invariant"); - ThreadGroupExclusiveAccess lock; - JfrThreadGroup* const tg_instance = instance(); - assert(tg_instance != nullptr, "invariant"); - tg_instance->write_selective_thread_group(writer, thread_group_id); -} diff --git a/src/hotspot/share/jfr/recorder/checkpoint/types/jfrThreadGroupManager.cpp b/src/hotspot/share/jfr/recorder/checkpoint/types/jfrThreadGroupManager.cpp new file mode 100644 index 000000000000..4b8cf6ee59a6 --- /dev/null +++ b/src/hotspot/share/jfr/recorder/checkpoint/types/jfrThreadGroupManager.cpp @@ -0,0 +1,332 @@ +/* + * Copyright (c) 2016, 2025, 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. + * + */ + +#include "precompiled.hpp" +#include "jfr/jni/jfrJavaSupport.hpp" +#include "jfr/recorder/checkpoint/jfrCheckpointWriter.hpp" +#include "jfr/recorder/checkpoint/types/jfrThreadGroupManager.hpp" +#include "jfr/recorder/checkpoint/types/traceid/jfrTraceIdEpoch.hpp" +#include "jfr/utilities/jfrAllocation.hpp" +#include "jfr/utilities/jfrLinkedList.inline.hpp" +#include "memory/resourceArea.hpp" +#include "runtime/handles.inline.hpp" +#include "runtime/jniHandles.inline.hpp" +#include "runtime/safepoint.hpp" +#include "runtime/semaphore.hpp" +#include "runtime/thread.inline.hpp" +#include "utilities/growableArray.hpp" + +class ThreadGroupExclusiveAccess : public StackObj { + private: + static Semaphore _mutex_semaphore; + public: + ThreadGroupExclusiveAccess() { _mutex_semaphore.wait(); } + ~ThreadGroupExclusiveAccess() { _mutex_semaphore.signal(); } +}; + +Semaphore ThreadGroupExclusiveAccess::_mutex_semaphore(1); + +static traceid next_id() { + static traceid _tgid = 1; // 1 is reserved for thread group "VirtualThreads" + return ++_tgid; +} + +class JfrThreadGroup : public JfrCHeapObj { + template + friend class JfrLinkedList; + private: + mutable const JfrThreadGroup* _next; + const JfrThreadGroup* _parent; + traceid _tgid; + char* _tg_name; // utf8 format + jweak _tg_handle; + mutable u2 _generation; + + public: + JfrThreadGroup(Handle tg, const JfrThreadGroup* parent) : + _next(nullptr), _parent(parent), _tgid(next_id()), _tg_name(nullptr), + _tg_handle(JNIHandles::make_weak_global(tg)), _generation(0) { + const char* name = java_lang_ThreadGroup::name(tg()); + if (name != nullptr) { + const size_t len = strlen(name); + _tg_name = JfrCHeapObj::new_array(len + 1); + strncpy(_tg_name, name, len + 1); + } + } + + ~JfrThreadGroup() { + JNIHandles::destroy_weak_global(_tg_handle); + if (_tg_name != nullptr) { + JfrCHeapObj::free(_tg_name, strlen(_tg_name) + 1); + } + } + + const JfrThreadGroup* next() const { return _next; } + + traceid id() const { return _tgid; } + + const char* name() const { + return _tg_name; + } + + const JfrThreadGroup* parent() const { return _parent; } + + traceid parent_id() const { + return _parent != nullptr ? _parent->id() : 0; + } + + bool is_dead() const { + return JNIHandles::resolve(_tg_handle) == nullptr; + } + + bool operator==(oop tg) const { + assert(tg != nullptr, "invariant"); + return tg == JNIHandles::resolve(_tg_handle); + } + + bool should_write() const { + return !JfrTraceIdEpoch::is_current_epoch_generation(_generation); + } + + void set_written() const { + assert(should_write(), "invariant"); + _generation = JfrTraceIdEpoch::epoch_generation(); + } +}; + +typedef JfrLinkedList JfrThreadGroupList; + +static JfrThreadGroupList* _list = nullptr; + +static JfrThreadGroupList& list() { + assert(_list != nullptr, "invariant"); + return *_list; +} + +bool JfrThreadGroupManager::create() { + assert(_list == nullptr, "invariant"); + _list = new JfrThreadGroupList(); + return _list != nullptr; +} + +void JfrThreadGroupManager::destroy() { + delete _list; + _list = nullptr; +} + +static int populate(GrowableArray* hierarchy, const JavaThread* jt, Thread* current) { + assert(hierarchy != nullptr, "invariant"); + assert(jt != nullptr, "invariant"); + assert(current == Thread::current(), "invariant"); + + oop thread_oop = jt->threadObj(); + if (thread_oop == nullptr) { + return 0; + } + // Immediate thread group. + const Handle tg_handle(current, java_lang_Thread::threadGroup(thread_oop)); + if (tg_handle.is_null()) { + return 0; + } + hierarchy->append(tg_handle); + + // Thread group parent and then its parents... + Handle parent_tg_handle(current, java_lang_ThreadGroup::parent(tg_handle())); + + while (parent_tg_handle != nullptr) { + hierarchy->append(parent_tg_handle); + parent_tg_handle = Handle(current, java_lang_ThreadGroup::parent(parent_tg_handle())); + } + + return hierarchy->length(); +} + +class JfrThreadGroupLookup : public ResourceObj { + static const int invalid_iterator = -1; + private: + GrowableArray* _hierarchy; + mutable int _iterator; + + public: + JfrThreadGroupLookup(const JavaThread* jt, Thread* current) : + _hierarchy(new GrowableArray(16)), + _iterator(populate(_hierarchy, jt, current) - 1) {} + + bool has_next() const { + return _iterator > invalid_iterator; + } + + const Handle& next() const { + assert(has_next(), "invariant"); + return _hierarchy->at(_iterator--); + } +}; + +static const JfrThreadGroup* find_or_add(const Handle& tg_oop, const JfrThreadGroup* parent) { + assert(parent == nullptr || list().in_list(parent), "invariant"); + const JfrThreadGroup* tg = list().head(); + const JfrThreadGroup* result = nullptr; + while (tg != nullptr) { + if (*tg == tg_oop()) { + assert(tg->parent() == parent, "invariant"); + result = tg; + tg = nullptr; + continue; + } + tg = tg->next(); + } + if (result == nullptr) { + result = new JfrThreadGroup(tg_oop, parent); + list().add(result); + } + return result; +} + +static traceid find_tgid(const JfrThreadGroupLookup& lookup) { + const JfrThreadGroup* tg = nullptr; + const JfrThreadGroup* ptg = nullptr; + while (lookup.has_next()) { + tg = find_or_add(lookup.next(), ptg); + ptg = tg; + } + return tg != nullptr ? tg->id() : 0; +} + +static traceid find(const JfrThreadGroupLookup& lookup) { + ThreadGroupExclusiveAccess lock; + return find_tgid(lookup); +} + +traceid JfrThreadGroupManager::thread_group_id(JavaThread* jt) { + DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(jt);) + ResourceMark rm(jt); + HandleMark hm(jt); + const JfrThreadGroupLookup lookup(jt, jt); + return find(lookup); +} + +traceid JfrThreadGroupManager::thread_group_id(const JavaThread* jt, Thread* current) { + assert(jt != nullptr, "invariant"); + assert(current != nullptr, "invariant"); + assert(!current->is_Java_thread() || JavaThread::cast(current)->thread_state() == _thread_in_vm, "invariant"); + ResourceMark rm(current); + HandleMark hm(current); + const JfrThreadGroupLookup lookup(jt, current); + return find(lookup); +} + +static void write_virtual_thread_group(JfrCheckpointWriter& writer) { + writer.write_key(1); // 1 is reserved for VirtualThread group + writer.write(0); // parent + const oop vgroup = java_lang_Thread_Constants::get_VTHREAD_GROUP(); + assert(vgroup != (oop)nullptr, "invariant"); + const char* const vgroup_name = java_lang_ThreadGroup::name(vgroup); + assert(vgroup_name != nullptr, "invariant"); + writer.write(vgroup_name); +} + +static int write_thread_group(JfrCheckpointWriter& writer, const JfrThreadGroup* tg, bool to_blob = false) { + assert(tg != nullptr, "invariant"); + if (tg->should_write() || to_blob) { + writer.write_key(tg->id()); + writer.write(tg->parent_id()); + writer.write(tg->name()); + if (!to_blob) { + tg->set_written(); + } + return 1; + } + return 0; +} + +// For writing all live thread groups while removing and deleting dead thread groups. +void JfrThreadGroupManager::serialize(JfrCheckpointWriter& writer) { + DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(JavaThread::current());) + + const uint64_t count_offset = writer.reserve(sizeof(u4)); // Don't know how many yet + + // First write the pre-defined ThreadGroup for virtual threads. + write_virtual_thread_group(writer); + int number_of_groups_written = 1; + + const JfrThreadGroup* next = nullptr; + const JfrThreadGroup* prev = nullptr; + + { + ThreadGroupExclusiveAccess lock; + const JfrThreadGroup* tg = list().head(); + while (tg != nullptr) { + next = tg->next(); + if (tg->is_dead()) { + prev = list().excise(prev, tg); + assert(!list().in_list(tg), "invariant"); + delete tg; + tg = next; + continue; + } + number_of_groups_written += write_thread_group(writer, tg); + prev = tg; + tg = next; + } + } + + assert(number_of_groups_written > 0, "invariant"); + writer.write_count(number_of_groups_written, count_offset); +} + +// For writing a specific thread group and its ancestry. +void JfrThreadGroupManager::serialize(JfrCheckpointWriter& writer, traceid tgid, bool to_blob) { + DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(JavaThread::current());) + // save context + const JfrCheckpointContext ctx = writer.context(); + + writer.write_type(TYPE_THREADGROUP); + const uint64_t count_offset = writer.reserve(sizeof(u4)); // Don't know how many yet + + int number_of_groups_written = 0; + + { + ThreadGroupExclusiveAccess lock; + const JfrThreadGroup* tg = list().head(); + while (tg != nullptr) { + if (tgid == tg->id()) { + while (tg != nullptr) { + number_of_groups_written += write_thread_group(writer, tg, to_blob); + tg = tg->parent(); + } + break; + } + tg = tg->next(); + } + } + + if (number_of_groups_written == 0) { + // nothing to write, restore context + writer.set_context(ctx); + return; + } + + assert(number_of_groups_written > 0, "invariant"); + writer.write_count(number_of_groups_written, count_offset); +} diff --git a/src/hotspot/share/jfr/recorder/checkpoint/types/jfrThreadGroup.hpp b/src/hotspot/share/jfr/recorder/checkpoint/types/jfrThreadGroupManager.hpp similarity index 50% rename from src/hotspot/share/jfr/recorder/checkpoint/types/jfrThreadGroup.hpp rename to src/hotspot/share/jfr/recorder/checkpoint/types/jfrThreadGroupManager.hpp index 8226c6ebef29..0d8b831d7b0f 100644 --- a/src/hotspot/share/jfr/recorder/checkpoint/types/jfrThreadGroup.hpp +++ b/src/hotspot/share/jfr/recorder/checkpoint/types/jfrThreadGroupManager.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2025, 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 @@ -22,44 +22,27 @@ * */ -#ifndef SHARE_JFR_RECORDER_CHECKPOINT_TYPES_JFRTHREADGROUP_HPP -#define SHARE_JFR_RECORDER_CHECKPOINT_TYPES_JFRTHREADGROUP_HPP +#ifndef SHARE_JFR_RECORDER_CHECKPOINT_TYPES_JFRTHREADGROUPMANAGER_HPP +#define SHARE_JFR_RECORDER_CHECKPOINT_TYPES_JFRTHREADGROUPMANAGER_HPP -#include "jfr/utilities/jfrAllocation.hpp" #include "jfr/utilities/jfrTypes.hpp" -#include "jni.h" +#include "memory/allStatic.hpp" class JfrCheckpointWriter; -template -class GrowableArray; -class JfrThreadGroupsHelper; -class JfrThreadGroupPointers; -class JfrThreadGroup : public JfrCHeapObj { - friend class JfrCheckpointThreadClosure; - private: - static JfrThreadGroup* _instance; - class JfrThreadGroupEntry; - GrowableArray* _list; - - JfrThreadGroup(); - JfrThreadGroupEntry* find_entry(const JfrThreadGroupPointers& ptrs) const; - JfrThreadGroupEntry* new_entry(JfrThreadGroupPointers& ptrs); - int add_entry(JfrThreadGroupEntry* const tge); - - void write_thread_group_entries(JfrCheckpointWriter& writer) const; - void write_selective_thread_group(JfrCheckpointWriter* writer, traceid thread_group_id) const; +class JfrThreadGroupManager : public AllStatic { + friend class JfrRecorder; - static traceid thread_group_id_internal(JfrThreadGroupsHelper& helper); - static JfrThreadGroup* instance(); - static void set_instance(JfrThreadGroup* new_instance); + private: + static bool create(); + static void destroy(); public: - ~JfrThreadGroup(); static void serialize(JfrCheckpointWriter& w); - static void serialize(JfrCheckpointWriter* w, traceid thread_group_id); + static void serialize(JfrCheckpointWriter& w, traceid tgid, bool is_blob); + static traceid thread_group_id(JavaThread* thread); static traceid thread_group_id(const JavaThread* thread, Thread* current); }; -#endif // SHARE_JFR_RECORDER_CHECKPOINT_TYPES_JFRTHREADGROUP_HPP +#endif // SHARE_JFR_RECORDER_CHECKPOINT_TYPES_JFRTHREADGROUPMANAGER_HPP \ No newline at end of file diff --git a/src/hotspot/share/jfr/recorder/checkpoint/types/jfrType.cpp b/src/hotspot/share/jfr/recorder/checkpoint/types/jfrType.cpp index 78ef7f5b523c..3ff7f92b9710 100644 --- a/src/hotspot/share/jfr/recorder/checkpoint/types/jfrType.cpp +++ b/src/hotspot/share/jfr/recorder/checkpoint/types/jfrType.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2025, 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 @@ -35,7 +35,7 @@ #include "jfr/recorder/checkpoint/jfrCheckpointWriter.hpp" #include "jfr/recorder/checkpoint/types/jfrType.hpp" #include "jfr/recorder/jfrRecorder.hpp" -#include "jfr/recorder/checkpoint/types/jfrThreadGroup.hpp" +#include "jfr/recorder/checkpoint/types/jfrThreadGroupManager.hpp" #include "jfr/recorder/checkpoint/types/jfrThreadState.hpp" #include "jfr/support/jfrThreadLocal.hpp" #include "jfr/writers/jfrJavaEventWriter.hpp" @@ -107,7 +107,7 @@ void JfrCheckpointThreadClosure::do_thread(Thread* t) { } else { _writer.write(name); _writer.write(tid); - _writer.write(JfrThreadGroup::thread_group_id(JavaThread::cast(t), _curthread)); + _writer.write(JfrThreadGroupManager::thread_group_id(JavaThread::cast(t), _curthread)); } _writer.write(false); // isVirtual } @@ -116,7 +116,10 @@ void JfrThreadConstantSet::serialize(JfrCheckpointWriter& writer) { JfrCheckpointThreadClosure tc(writer); JfrJavaThreadIterator javathreads(false); // include not yet live threads (_thread_new) while (javathreads.has_next()) { - tc.do_thread(javathreads.next()); + JavaThread* const jt = javathreads.next(); + if (jt->jfr_thread_local()->should_write()) { + tc.do_thread(jt); + } } JfrNonJavaThreadIterator nonjavathreads; while (nonjavathreads.has_next()) { @@ -125,7 +128,7 @@ void JfrThreadConstantSet::serialize(JfrCheckpointWriter& writer) { } void JfrThreadGroupConstant::serialize(JfrCheckpointWriter& writer) { - JfrThreadGroup::serialize(writer); + JfrThreadGroupManager::serialize(writer); } static const char* flag_value_origin_to_string(JVMFlagOrigin origin) { @@ -304,11 +307,11 @@ void JfrThreadConstant::serialize(JfrCheckpointWriter& writer) { writer.write(JfrThreadId::jfr_id(_thread, _tid)); // java thread group - VirtualThread threadgroup reserved id 1 const traceid thread_group_id = is_vthread ? 1 : - JfrThreadGroup::thread_group_id(JavaThread::cast(_thread), Thread::current()); + JfrThreadGroupManager::thread_group_id(JavaThread::cast(_thread), Thread::current()); writer.write(thread_group_id); writer.write(is_vthread); // isVirtual - if (!is_vthread) { - JfrThreadGroup::serialize(&writer, thread_group_id); + if (thread_group_id > 1) { + JfrThreadGroupManager::serialize(writer, thread_group_id, _to_blob); } // VirtualThread threadgroup already serialized invariant. } diff --git a/src/hotspot/share/jfr/recorder/checkpoint/types/jfrType.hpp b/src/hotspot/share/jfr/recorder/checkpoint/types/jfrType.hpp index 680629aaa69e..ad032b71d9b0 100644 --- a/src/hotspot/share/jfr/recorder/checkpoint/types/jfrType.hpp +++ b/src/hotspot/share/jfr/recorder/checkpoint/types/jfrType.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2025, 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 @@ -109,11 +109,12 @@ class JfrThreadConstant : public JfrSerializer { oop _vthread; const char* _name; int _length; + const bool _to_blob; void write_name(JfrCheckpointWriter& writer); void write_os_name(JfrCheckpointWriter& writer, bool is_vthread); public: - JfrThreadConstant(Thread* t, traceid tid, oop vthread = nullptr) : - _thread(t), _tid(tid), _vthread(vthread), _name(nullptr), _length(-1) {} + JfrThreadConstant(Thread* t, traceid tid, bool to_blob, oop vthread = nullptr) : + _thread(t), _tid(tid), _vthread(vthread), _name(nullptr), _length(-1), _to_blob(to_blob) {} void serialize(JfrCheckpointWriter& writer); }; diff --git a/src/hotspot/share/jfr/recorder/checkpoint/types/jfrTypeManager.cpp b/src/hotspot/share/jfr/recorder/checkpoint/types/jfrTypeManager.cpp index 6f73fdece3c3..5b4e6f663701 100644 --- a/src/hotspot/share/jfr/recorder/checkpoint/types/jfrTypeManager.cpp +++ b/src/hotspot/share/jfr/recorder/checkpoint/types/jfrTypeManager.cpp @@ -110,7 +110,7 @@ JfrBlobHandle JfrTypeManager::create_thread_blob(JavaThread* jt, traceid tid /* // TYPE_THREAD and count is written unconditionally for blobs, also for vthreads. writer.write_type(TYPE_THREAD); writer.write_count(1); - JfrThreadConstant type_thread(jt, tid, vthread); + JfrThreadConstant type_thread(jt, tid, true, vthread); type_thread.serialize(writer); return writer.move(); } @@ -129,7 +129,7 @@ void JfrTypeManager::write_checkpoint(Thread* t, traceid tid /* 0 */, oop vthrea writer.write_type(TYPE_THREAD); writer.write_count(1); } - JfrThreadConstant type_thread(t, tid, vthread); + JfrThreadConstant type_thread(t, tid, false, vthread); type_thread.serialize(writer); } diff --git a/src/hotspot/share/jfr/recorder/jfrRecorder.cpp b/src/hotspot/share/jfr/recorder/jfrRecorder.cpp index 642805aacbbd..09455a3ea1fa 100644 --- a/src/hotspot/share/jfr/recorder/jfrRecorder.cpp +++ b/src/hotspot/share/jfr/recorder/jfrRecorder.cpp @@ -32,6 +32,7 @@ #include "jfr/periodic/sampling/jfrThreadSampler.hpp" #include "jfr/recorder/jfrRecorder.hpp" #include "jfr/recorder/checkpoint/jfrCheckpointManager.hpp" +#include "jfr/recorder/checkpoint/types/jfrThreadGroupManager.hpp" #include "jfr/recorder/repository/jfrRepository.hpp" #include "jfr/recorder/service/jfrEventThrottler.hpp" #include "jfr/recorder/service/jfrOptionSet.hpp" @@ -297,6 +298,9 @@ bool JfrRecorder::create_components() { if (!create_event_throttler()) { return false; } + if (!create_thread_group_manager()) { + return false; + } return true; } @@ -374,6 +378,10 @@ bool JfrRecorder::create_event_throttler() { return JfrEventThrottler::create(); } +bool JfrRecorder::create_thread_group_manager() { + return JfrThreadGroupManager::create(); +} + void JfrRecorder::destroy_components() { JfrJvmtiAgent::destroy(); if (_post_box != nullptr) { @@ -409,6 +417,7 @@ void JfrRecorder::destroy_components() { _thread_sampling = nullptr; } JfrEventThrottler::destroy(); + JfrThreadGroupManager::destroy(); } bool JfrRecorder::create_recorder_thread() { diff --git a/src/hotspot/share/jfr/recorder/jfrRecorder.hpp b/src/hotspot/share/jfr/recorder/jfrRecorder.hpp index 2dee2af7faba..c09643212e61 100644 --- a/src/hotspot/share/jfr/recorder/jfrRecorder.hpp +++ b/src/hotspot/share/jfr/recorder/jfrRecorder.hpp @@ -54,6 +54,7 @@ class JfrRecorder : public JfrCHeapObj { static bool create_stringpool(); static bool create_thread_sampling(); static bool create_event_throttler(); + static bool create_thread_group_manager(); static bool create_components(); static void destroy_components(); static void on_recorder_thread_exit(); diff --git a/src/hotspot/share/jfr/support/jfrThreadLocal.cpp b/src/hotspot/share/jfr/support/jfrThreadLocal.cpp index 175ec98da44f..2bf7e7657433 100644 --- a/src/hotspot/share/jfr/support/jfrThreadLocal.cpp +++ b/src/hotspot/share/jfr/support/jfrThreadLocal.cpp @@ -29,6 +29,7 @@ #include "jfr/periodic/jfrThreadCPULoadEvent.hpp" #include "jfr/recorder/checkpoint/jfrCheckpointManager.hpp" #include "jfr/recorder/checkpoint/types/traceid/jfrOopTraceId.inline.hpp" +#include "jfr/recorder/checkpoint/types/traceid/jfrTraceIdEpoch.hpp" #include "jfr/recorder/jfrRecorder.hpp" #include "jfr/recorder/service/jfrOptionSet.hpp" #include "jfr/recorder/stacktrace/jfrStackTraceRepository.hpp" @@ -73,6 +74,7 @@ JfrThreadLocal::JfrThreadLocal() : _entering_suspend_flag(0), _critical_section(0), _vthread_epoch(0), + _generation(0), _vthread_excluded(false), _jvm_thread_excluded(false), _vthread(false), @@ -116,15 +118,31 @@ static void send_java_thread_start_event(JavaThread* jt) { } void JfrThreadLocal::on_start(Thread* t) { - assign_thread_id(t, t->jfr_thread_local()); +JfrThreadLocal* const tl = t->jfr_thread_local(); + assert(tl != nullptr, "invariant"); + assign_thread_id(t, tl); if (JfrRecorder::is_recording()) { - JfrCheckpointManager::write_checkpoint(t); - if (t->is_Java_thread()) { - send_java_thread_start_event(JavaThread::cast(t)); + if (!t->is_Java_thread()) { + JfrCheckpointManager::write_checkpoint(t); + return; + } + JavaThread* const jt = JavaThread::cast(t); + if (jt->thread_state() != _thread_new) { + assert(jt->thread_state() == _thread_in_vm, "invariant"); + if (tl->should_write()) { + JfrCheckpointManager::write_checkpoint(t); + } + send_java_thread_start_event(jt); + if (tl->has_cached_stack_trace()) { + tl->clear_cached_stack_trace(); + } + return; } } - if (t->jfr_thread_local()->has_cached_stack_trace()) { - t->jfr_thread_local()->clear_cached_stack_trace(); + if (t->is_Java_thread() && JavaThread::cast(t)->thread_state() == _thread_in_vm) { + if (tl->has_cached_stack_trace()) { + tl->clear_cached_stack_trace(); + } } } @@ -211,7 +229,16 @@ void JfrThreadLocal::on_exit(Thread* t) { JfrThreadLocal * const tl = t->jfr_thread_local(); assert(!tl->is_dead(), "invariant"); if (JfrRecorder::is_recording()) { - JfrCheckpointManager::write_checkpoint(t); + if (!t->is_Java_thread()) { + JfrCheckpointManager::write_checkpoint(t); + } else { + JavaThread* const jt = JavaThread::cast(t); + assert(jt->thread_state() == _thread_in_vm, "invariant"); + if (tl->should_write()) { + JfrCheckpointManager::write_checkpoint(t); + } + send_java_thread_end_event(jt, JfrThreadLocal::jvm_thread_id(jt)); + } } if (t->is_Java_thread()) { JavaThread* const jt = JavaThread::cast(t); @@ -389,6 +416,15 @@ u2 JfrThreadLocal::vthread_epoch(const JavaThread* jt) { return Atomic::load(&jt->jfr_thread_local()->_vthread_epoch); } +bool JfrThreadLocal::should_write() const { + const u2 current_generation = JfrTraceIdEpoch::epoch_generation(); + if (Atomic::load(&_generation) != current_generation) { + Atomic::store(&_generation, current_generation); + return true; + } + return false; +} + traceid JfrThreadLocal::thread_id(const Thread* t) { assert(t != nullptr, "invariant"); if (is_impersonating(t)) { diff --git a/src/hotspot/share/jfr/support/jfrThreadLocal.hpp b/src/hotspot/share/jfr/support/jfrThreadLocal.hpp index da7d1f5e2efd..730470f79467 100644 --- a/src/hotspot/share/jfr/support/jfrThreadLocal.hpp +++ b/src/hotspot/share/jfr/support/jfrThreadLocal.hpp @@ -67,6 +67,7 @@ class JfrThreadLocal { volatile jint _entering_suspend_flag; mutable volatile int _critical_section; u2 _vthread_epoch; + mutable u2 _generation; bool _vthread_excluded; bool _jvm_thread_excluded; bool _vthread; @@ -272,6 +273,9 @@ class JfrThreadLocal { static bool is_excluded(const Thread* thread); static bool is_included(const Thread* thread); + // Serialization state. + bool should_write() const; + static Arena* dcmd_arena(JavaThread* jt); bool has_thread_blob() const; diff --git a/src/hotspot/share/runtime/javaThread.cpp b/src/hotspot/share/runtime/javaThread.cpp index 21bdafb8b5c9..95ab5a108533 100644 --- a/src/hotspot/share/runtime/javaThread.cpp +++ b/src/hotspot/share/runtime/javaThread.cpp @@ -682,6 +682,8 @@ void JavaThread::run() { assert(JavaThread::current() == this, "sanity check"); assert(!Thread::current()->owns_locks(), "sanity check"); + JFR_ONLY(Jfr::on_thread_start(this);) + DTRACE_THREAD_PROBE(start, this); // This operation might block. We call that after all safepoint checks for a new thread has From c9736389cda6192ddcf3867bc6e454d315916a29 Mon Sep 17 00:00:00 2001 From: Sergey Bylokhov Date: Wed, 26 Nov 2025 23:55:24 +0000 Subject: [PATCH 303/323] 8369032: Add test to ensure serialized ICC_Profile stores only necessary optional data Backport-of: ed153ee2c4614c814da92c23c4741eed68ce1a0c --- .../color/ICC_Profile/SerializedFormSize.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 test/jdk/java/awt/color/ICC_Profile/SerializedFormSize.java diff --git a/test/jdk/java/awt/color/ICC_Profile/SerializedFormSize.java b/test/jdk/java/awt/color/ICC_Profile/SerializedFormSize.java new file mode 100644 index 000000000000..bb8d7a0ab88e --- /dev/null +++ b/test/jdk/java/awt/color/ICC_Profile/SerializedFormSize.java @@ -0,0 +1,72 @@ +/* + * Copyright Amazon.com Inc. 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.awt.color.ColorSpace; +import java.awt.color.ICC_Profile; +import java.io.ByteArrayOutputStream; +import java.io.ObjectOutputStream; + +/** + * @test + * @bug 8369032 + * @summary Checks the size of the serialized ICC_Profile for standard and + * non-standard profiles. + */ +public final class SerializedFormSize { + + private static final ICC_Profile[] PROFILES = { + ICC_Profile.getInstance(ColorSpace.CS_sRGB), + ICC_Profile.getInstance(ColorSpace.CS_LINEAR_RGB), + ICC_Profile.getInstance(ColorSpace.CS_CIEXYZ), + ICC_Profile.getInstance(ColorSpace.CS_PYCC), + ICC_Profile.getInstance(ColorSpace.CS_GRAY) + }; + + public static void main(String[] args) throws Exception { + for (ICC_Profile profile : PROFILES) { + byte[] data = profile.getData(); + int dataSize = data.length; + int min = 3; // At least version, name and data fields + int max = 200; // Small enough to confirm no data saved + + // Standard profile: should serialize to a small size, no data + test(profile, min, max); + // Non-standard profile: includes full data, but only once + test(ICC_Profile.getInstance(data), dataSize, dataSize + max); + } + } + + private static void test(ICC_Profile p, int min, int max) throws Exception { + try (var bos = new ByteArrayOutputStream(); + var oos = new ObjectOutputStream(bos)) + { + oos.writeObject(p); + int size = bos.size(); + if (size < min || size > max) { + System.err.println("Expected: >= " + min + " and <= " + max); + System.err.println("Actual: " + size); + throw new RuntimeException("Wrong size"); + } + } + } +} From 7be77fd7d43bd9f1e571b27957850e711767c418 Mon Sep 17 00:00:00 2001 From: SendaoYan Date: Thu, 27 Nov 2025 01:58:10 +0000 Subject: [PATCH 304/323] 8343340: Swapping checking do not work for MetricsMemoryTester failcount Backport-of: 7e068cc8d572e61cf2f4203f66fe0175a541209d --- .../platform/docker/MetricsMemoryTester.java | 4 ++-- .../platform/docker/TestDockerMemoryMetrics.java | 16 ++++++++++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/test/jdk/jdk/internal/platform/docker/MetricsMemoryTester.java b/test/jdk/jdk/internal/platform/docker/MetricsMemoryTester.java index 8069965e8d87..c27a1c7480fb 100644 --- a/test/jdk/jdk/internal/platform/docker/MetricsMemoryTester.java +++ b/test/jdk/jdk/internal/platform/docker/MetricsMemoryTester.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, 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 @@ -70,7 +70,7 @@ private static void testMemoryFailCount() { // We need swap to execute this test or will SEGV if (memAndSwapLimit <= memLimit) { - System.out.println("No swap memory limits, test case skipped"); + System.out.println("No swap memory limits. Ignoring test!"); } else { long count = Metrics.systemMetrics().getMemoryFailCount(); diff --git a/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetrics.java b/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetrics.java index 7cbab5c3b868..2afb5ed93b1e 100644 --- a/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetrics.java +++ b/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetrics.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, 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 @@ -27,6 +27,7 @@ import jdk.test.lib.containers.docker.DockerRunOptions; import jdk.test.lib.containers.docker.DockerTestUtils; import jdk.test.lib.process.OutputAnalyzer; +import jtreg.SkippedException; /* * @test @@ -112,18 +113,22 @@ private static void testMemoryFailCount(String value) throws Exception { // Check whether swapping really works for this test // On some systems there is no swap space enabled. And running - // 'java -Xms{mem-limit} -Xmx{mem-limit} -version' would fail due to swap space size being 0. + // 'java -Xms{mem-limit} -Xmx{mem-limit} -XX:+AlwaysPreTouch -version' + // would fail due to swap space size being 0. Note that when swap is + // properly enabled on the system the container gets the same amount + // of swap as is configured for memory. Thus, 2x{mem-limit} is the actual + // memory and swap bound for this pre-test. DockerRunOptions preOpts = new DockerRunOptions(imageName, "/jdk/bin/java", "-version"); preOpts.addDockerOpts("--volume", Utils.TEST_CLASSES + ":/test-classes/") .addDockerOpts("--memory=" + value) + .addJavaOpts("-XX:+AlwaysPreTouch") .addJavaOpts("-Xms" + value) .addJavaOpts("-Xmx" + value); OutputAnalyzer oa = DockerTestUtils.dockerRunJava(preOpts); String output = oa.getOutput(); if (!output.contains("version")) { - System.out.println("Swapping doesn't work for this test."); - return; + throw new SkippedException("Swapping doesn't work for this test."); } DockerRunOptions opts = @@ -137,8 +142,7 @@ private static void testMemoryFailCount(String value) throws Exception { oa = DockerTestUtils.dockerRunJava(opts); output = oa.getOutput(); if (output.contains("Ignoring test")) { - System.out.println("Ignored by the tester"); - return; + throw new SkippedException("Ignored by the tester"); } oa.shouldHaveExitValue(0).shouldContain("TEST PASSED!!!"); } From ff0418d45d19aedc9f7b401b72135cd71bb707e3 Mon Sep 17 00:00:00 2001 From: Matthias Baesken Date: Fri, 28 Nov 2025 12:02:15 +0000 Subject: [PATCH 305/323] 8369563: Gtest dll_address_to_function_and_library_name has issues with stripped pdb files Backport-of: 98e1d2fab123befa78342ba53b76a560dddd6385 --- test/hotspot/gtest/runtime/test_os.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/test/hotspot/gtest/runtime/test_os.cpp b/test/hotspot/gtest/runtime/test_os.cpp index fb33cf9c4f93..551bba2b1344 100644 --- a/test/hotspot/gtest/runtime/test_os.cpp +++ b/test/hotspot/gtest/runtime/test_os.cpp @@ -808,7 +808,7 @@ TEST_VM(os, dll_address_to_function_and_library_name) { LOG("shorten_paths=%d, demangle=%d, strip_arguments=%d, provide_scratch_buffer=%d", shorten_paths, demangle, strip_arguments, provide_scratch_buffer); - // Should show os::min_page_size in libjvm + // Should show Threads::create_vm in libjvm addr = CAST_FROM_FN_PTR(address, Threads::create_vm); st.reset(); EXPECT_TRUE(os::print_function_and_library_name(&st, addr, @@ -816,8 +816,16 @@ TEST_VM(os, dll_address_to_function_and_library_name) { sizeof(tmp), shorten_paths, demangle, strip_arguments)); + +#ifdef _WINDOWS + // On Windows, if no full .pdb file is available, the output can be something like "0x... in ..." + if (strncmp(output, "0x", 2) != 0) { +#endif EXPECT_CONTAINS(output, "Threads"); EXPECT_CONTAINS(output, "create_vm"); +#ifdef _WINDOWS + } +#endif EXPECT_CONTAINS(output, "jvm"); // "jvm.dll" or "libjvm.so" or similar LOG("%s", output); From 488948278b158753721780e26b7f455903d43e97 Mon Sep 17 00:00:00 2001 From: Matthias Baesken Date: Fri, 28 Nov 2025 13:18:38 +0000 Subject: [PATCH 306/323] 8368960: Adjust java UL logging in the build Reviewed-by: mdoerr Backport-of: bd25db1fb8573fc908f7a8a96bca417b1d44689a --- make/autoconf/boot-jdk.m4 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/make/autoconf/boot-jdk.m4 b/make/autoconf/boot-jdk.m4 index 960a8ffce3a8..9ecb53d64afa 100644 --- a/make/autoconf/boot-jdk.m4 +++ b/make/autoconf/boot-jdk.m4 @@ -444,6 +444,9 @@ AC_DEFUN_ONCE([BOOTJDK_SETUP_BOOT_JDK_ARGUMENTS], # Force en-US environment UTIL_ADD_JVM_ARG_IF_OK([-Duser.language=en -Duser.country=US],boot_jdk_jvmargs,[$JAVA]) + UTIL_ADD_JVM_ARG_IF_OK([-Xlog:all=off:stdout],boot_jdk_jvmargs,[$JAVA]) + UTIL_ADD_JVM_ARG_IF_OK([-Xlog:all=warning:stderr],boot_jdk_jvmargs,[$JAVA]) + if test "x$BOOTJDK_USE_LOCAL_CDS" = xtrue; then # Use our own CDS archive UTIL_ADD_JVM_ARG_IF_OK([$boot_jdk_cds_args -Xshare:auto],boot_jdk_jvmargs,[$JAVA]) From 63c3261bbcde41c3a170fd492dce5147216043d4 Mon Sep 17 00:00:00 2001 From: SendaoYan Date: Mon, 1 Dec 2025 02:53:19 +0000 Subject: [PATCH 307/323] 8313770: jdk/internal/platform/docker/TestSystemMetrics.java fails on Ubuntu Backport-of: aec138886ec2dff765ed810059a1c7b9905c43ca --- .../test/lib/containers/cgroup/MetricsTesterCgroupV2.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/lib/jdk/test/lib/containers/cgroup/MetricsTesterCgroupV2.java b/test/lib/jdk/test/lib/containers/cgroup/MetricsTesterCgroupV2.java index a3723e2eda27..2a756102dede 100644 --- a/test/lib/jdk/test/lib/containers/cgroup/MetricsTesterCgroupV2.java +++ b/test/lib/jdk/test/lib/containers/cgroup/MetricsTesterCgroupV2.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2020, Red Hat Inc. + * Copyright (c) 2025, 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 @@ -447,13 +448,13 @@ private void testIOStat() { Metrics metrics = Metrics.systemMetrics(); long oldVal = metrics.getBlkIOServiceCount(); long newVal = getIoStatAccumulate(new String[] { "rios", "wios" }); - if (!CgroupMetricsTester.compareWithErrorMargin(oldVal, newVal)) { + if (newVal < oldVal) { fail("io.stat->rios/wios: ", oldVal, newVal); } oldVal = metrics.getBlkIOServiced(); newVal = getIoStatAccumulate(new String[] { "rbytes", "wbytes" }); - if (!CgroupMetricsTester.compareWithErrorMargin(oldVal, newVal)) { + if (newVal < oldVal) { fail("io.stat->rbytes/wbytes: ", oldVal, newVal); } } From 2134e7237b89d5ced7403beaa6d330631a42bafd Mon Sep 17 00:00:00 2001 From: SendaoYan Date: Mon, 1 Dec 2025 02:53:38 +0000 Subject: [PATCH 308/323] 8368982: Test sun/security/tools/jarsigner/EC.java completed and timed out Backport-of: b0721e28591f2ee19fd5cb6581747df0b1efed48 --- test/jdk/sun/security/tools/jarsigner/EC.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/jdk/sun/security/tools/jarsigner/EC.java b/test/jdk/sun/security/tools/jarsigner/EC.java index 848dc8bf843f..1b41c48e2346 100644 --- a/test/jdk/sun/security/tools/jarsigner/EC.java +++ b/test/jdk/sun/security/tools/jarsigner/EC.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2025, 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,6 +26,7 @@ * @bug 6870812 * @summary enhance security tools to use ECC algorithm * @library /test/lib + * @run main/timeout=300 EC */ import jdk.test.lib.SecurityTools; From 88811b5acdebd2dcee9cdc9807746990e3238a93 Mon Sep 17 00:00:00 2001 From: SendaoYan Date: Mon, 1 Dec 2025 02:55:30 +0000 Subject: [PATCH 309/323] 8341131: Some jdk/jfr/event/compiler tests shouldn't be executed with Xcomp Backport-of: 7312eea382eed048b6abdb6409c006fc8e8f45b4 --- test/jdk/jdk/jfr/event/compiler/TestCompilerCompile.java | 4 ++-- test/jdk/jdk/jfr/event/compiler/TestCompilerInlining.java | 2 +- test/jdk/jdk/jfr/event/compiler/TestDeoptimization.java | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/test/jdk/jdk/jfr/event/compiler/TestCompilerCompile.java b/test/jdk/jdk/jfr/event/compiler/TestCompilerCompile.java index 775d7789bee2..8e23ee140e27 100644 --- a/test/jdk/jdk/jfr/event/compiler/TestCompilerCompile.java +++ b/test/jdk/jdk/jfr/event/compiler/TestCompilerCompile.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2024, 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 @@ -41,7 +41,7 @@ * @test * @key jfr * @requires vm.hasJFR - * @requires vm.compMode!="Xint" + * @requires vm.compMode == "Xmixed" * @library /test/lib * @build jdk.test.whitebox.WhiteBox * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox diff --git a/test/jdk/jdk/jfr/event/compiler/TestCompilerInlining.java b/test/jdk/jdk/jfr/event/compiler/TestCompilerInlining.java index cea86e6e9970..ffe0bc16ac56 100644 --- a/test/jdk/jdk/jfr/event/compiler/TestCompilerInlining.java +++ b/test/jdk/jdk/jfr/event/compiler/TestCompilerInlining.java @@ -47,7 +47,7 @@ * @key jfr * @summary Verifies that corresponding JFR events are emitted in case of inlining. * @requires vm.hasJFR - * + * @requires vm.compMode == "Xmixed" * @requires vm.opt.Inline == true | vm.opt.Inline == null * @library /test/lib * @modules java.base/jdk.internal.org.objectweb.asm diff --git a/test/jdk/jdk/jfr/event/compiler/TestDeoptimization.java b/test/jdk/jdk/jfr/event/compiler/TestDeoptimization.java index 32c634fc59a9..47d0a09de9cf 100644 --- a/test/jdk/jdk/jfr/event/compiler/TestDeoptimization.java +++ b/test/jdk/jdk/jfr/event/compiler/TestDeoptimization.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, 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 @@ -51,7 +51,7 @@ public static void dummyMethod(boolean b) { * @key jfr * @summary sanity test for Deoptimization event, depends on Compilation event * @requires vm.hasJFR - * @requires vm.compMode != "Xint" + * @requires vm.compMode == "Xmixed" * @requires vm.flavor == "server" & (vm.opt.TieredStopAtLevel == 4 | vm.opt.TieredStopAtLevel == null) * @library /test/lib * @build jdk.test.whitebox.WhiteBox From bb207d0ca100f5559ca47c89d7590f6a8172e30d Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 1 Dec 2025 09:18:39 +0000 Subject: [PATCH 310/323] 8327980: Convert javax/swing/JToggleButton/4128979/bug4128979.java applet test to main Backport-of: 256d48b19694e86bb26d67ed56de8ac94a31f4ff --- .../JToggleButton/4128979/bug4128979.html | 41 -------- .../{4128979 => }/bug4128979.java | 96 ++++++++++--------- 2 files changed, 51 insertions(+), 86 deletions(-) delete mode 100644 test/jdk/javax/swing/JToggleButton/4128979/bug4128979.html rename test/jdk/javax/swing/JToggleButton/{4128979 => }/bug4128979.java (64%) diff --git a/test/jdk/javax/swing/JToggleButton/4128979/bug4128979.html b/test/jdk/javax/swing/JToggleButton/4128979/bug4128979.html deleted file mode 100644 index 699d33fc38d8..000000000000 --- a/test/jdk/javax/swing/JToggleButton/4128979/bug4128979.html +++ /dev/null @@ -1,41 +0,0 @@ - - - -This test requires Windows look and feel, just press Pass if you -run it not on Windows. - -When the test starts you'll see toggle buttons in three rows -two of which are toolbars. - -Make these buttons pressed, their background color must change -to halftones between the button background colors and the ToggleButton -highlight color (it is shown in the square below). - -If the background color does not change correctly for at least one button, -the test fails. - - - - - diff --git a/test/jdk/javax/swing/JToggleButton/4128979/bug4128979.java b/test/jdk/javax/swing/JToggleButton/bug4128979.java similarity index 64% rename from test/jdk/javax/swing/JToggleButton/4128979/bug4128979.java rename to test/jdk/javax/swing/JToggleButton/bug4128979.java index 76893c73c895..36625ef083d2 100644 --- a/test/jdk/javax/swing/JToggleButton/4128979/bug4128979.java +++ b/test/jdk/javax/swing/JToggleButton/bug4128979.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2024, 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 @@ -21,64 +21,67 @@ * questions. */ -/* @test - @bug 4128979 - @requires (os.family == "windows") - @summary Tests that background changes correctly in WinLF for JToggleButton when pressed - @key headful - @run applet/manual=yesno bug4128979.html -*/ +import java.awt.Color; +import java.awt.Component; +import java.awt.ComponentOrientation; +import java.awt.Container; +import java.awt.FlowLayout; +import java.awt.Graphics; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.Icon; -import javax.swing.JApplet; import javax.swing.JFrame; import javax.swing.JLabel; -import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JToggleButton; import javax.swing.JToolBar; import javax.swing.UIManager; -import javax.swing.UnsupportedLookAndFeelException; -import javax.swing.WindowConstants; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Component; -import java.awt.ComponentOrientation; -import java.awt.Container; -import java.awt.FlowLayout; -import java.awt.Graphics; -public class bug4128979 extends JApplet { +import jtreg.SkippedException; +import sun.awt.OSInfo; - public static void main(String[] args) { - JApplet applet = new bug4128979(); - applet.init(); - applet.start(); +/* @test + * @bug 4128979 + * @requires (os.family == "windows") + * @modules java.desktop/sun.awt + * @library /java/awt/regtesthelpers /test/lib + * @build PassFailJFrame jtreg.SkippedException + * @summary Tests that background changes correctly in WinLF for JToggleButton when pressed + * @run main/manual bug4128979 + */ - JFrame frame = new JFrame("Test window"); - frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); - frame.setLayout(new BorderLayout()); - frame.add(applet, BorderLayout.CENTER); - frame.setSize(600, 240); - frame.setVisible(true); - } +public class bug4128979 { + private static final String INSTRUCTIONS = """ + When the test starts, toggle buttons are visible in three rows + two of which are toolbars. - public void init() { - try { - UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel"); - } catch (UnsupportedLookAndFeelException e) { - JOptionPane.showMessageDialog(this, - "This test requires Windows look and feel, so just press Pass\n as "+ - " this look and feel is unsupported on this platform.", - "Unsupported LF", JOptionPane.ERROR_MESSAGE); - return; - } catch (Exception e) { - throw new RuntimeException("Couldn't set look and feel"); + Press these buttons, their background color must change + to half tones between the button background colors and the ToggleButton + highlight color (it is shown in the square below). + + If the background color does not change correctly for at least one button, + the test fails."""; + + public static void main(String[] args) throws Exception { + if (OSInfo.getOSType() != OSInfo.OSType.WINDOWS) { + throw new SkippedException("This test is for Windows only"); } + UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel"); + PassFailJFrame.builder() + .title("JToggleButton Instructions") + .instructions(INSTRUCTIONS) + .rows(15) + .columns(60) + .testUI(bug4128979::createAndShowUI) + .build() + .awaitAndCheck(); + } + + public static JFrame createAndShowUI() { + JFrame frame = new JFrame("JToggleButton's Background Color Test"); + frame.setLayout(new FlowLayout()); - setLayout(new FlowLayout()); JPanel p = new JPanel(); p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS)); @@ -113,8 +116,11 @@ public int getIconHeight() { return 50; } }); - add(p); - add(label); + + frame.getContentPane().add(p); + frame.getContentPane().add(label); + frame.setSize(600, 250); + return frame; } static void addButtons(Container c) { From b4b96c5a109007e17eb29d39de990152368ec15f Mon Sep 17 00:00:00 2001 From: Sergey Chernyshev Date: Tue, 30 Dec 2025 07:50:45 +0100 Subject: [PATCH 311/323] 8353175: Eliminate double iteration of stream in FieldDescriptor reinitialization Backport-of: f169fc5a99ee2b485e156c043134ab76b7e5ebd9 --- src/hotspot/share/oops/fieldStreams.hpp | 4 +- src/hotspot/share/oops/instanceKlass.cpp | 39 +++++++------------ src/hotspot/share/oops/instanceKlass.hpp | 1 + src/hotspot/share/prims/jvm.cpp | 2 +- src/hotspot/share/runtime/fieldDescriptor.cpp | 5 +-- src/hotspot/share/runtime/fieldDescriptor.hpp | 4 +- src/hotspot/share/runtime/reflectionUtils.hpp | 2 +- 7 files changed, 24 insertions(+), 33 deletions(-) diff --git a/src/hotspot/share/oops/fieldStreams.hpp b/src/hotspot/share/oops/fieldStreams.hpp index 54619f4d472b..9a98a2bd223a 100644 --- a/src/hotspot/share/oops/fieldStreams.hpp +++ b/src/hotspot/share/oops/fieldStreams.hpp @@ -120,7 +120,7 @@ class FieldStreamBase : public StackObj { // Convenient methods - FieldInfo to_FieldInfo() { + const FieldInfo& to_FieldInfo() const { return _fi_buf; } @@ -131,7 +131,7 @@ class FieldStreamBase : public StackObj { // bridge to a heavier API: fieldDescriptor& field_descriptor() const { fieldDescriptor& field = const_cast(_fd_buf); - field.reinitialize(field_holder(), _index); + field.reinitialize(field_holder(), to_FieldInfo()); return field; } }; diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp index 29dd49f1a78e..575374a01e09 100644 --- a/src/hotspot/share/oops/instanceKlass.cpp +++ b/src/hotspot/share/oops/instanceKlass.cpp @@ -1706,7 +1706,7 @@ bool InstanceKlass::find_local_field(Symbol* name, Symbol* sig, fieldDescriptor* Symbol* f_name = fs.name(); Symbol* f_sig = fs.signature(); if (f_name == name && f_sig == sig) { - fd->reinitialize(const_cast(this), fs.index()); + fd->reinitialize(const_cast(this), fs.to_FieldInfo()); return true; } } @@ -1775,7 +1775,7 @@ Klass* InstanceKlass::find_field(Symbol* name, Symbol* sig, bool is_static, fiel bool InstanceKlass::find_local_field_from_offset(int offset, bool is_static, fieldDescriptor* fd) const { for (JavaFieldStream fs(this); !fs.done(); fs.next()) { if (fs.offset() == offset) { - fd->reinitialize(const_cast(this), fs.index()); + fd->reinitialize(const_cast(this), fs.to_FieldInfo()); if (fd->is_static() == is_static) return true; } } @@ -1799,7 +1799,7 @@ bool InstanceKlass::find_local_field_by_name(Symbol* name, fieldDescriptor* fd) for (JavaFieldStream fs(this); !fs.done(); fs.next()) { Symbol* f_name = fs.name(); if (f_name == name) { - fd->reinitialize(const_cast(this), fs.index()); + fd->reinitialize(const_cast(this), fs.to_FieldInfo()); return true; } } @@ -1863,19 +1863,16 @@ void InstanceKlass::do_nonstatic_fields(FieldClosure* cl) { if (super != nullptr) { super->do_nonstatic_fields(cl); } - fieldDescriptor fd; - int length = java_fields_count(); - for (int i = 0; i < length; i += 1) { - fd.reinitialize(this, i); + for (JavaFieldStream fs(this); !fs.done(); fs.next()) { + fieldDescriptor& fd = fs.field_descriptor(); if (!fd.is_static()) { cl->do_field(&fd); } } } -// first in Pair is offset, second is index. -static int compare_fields_by_offset(Pair* a, Pair* b) { - return a->first - b->first; +static int compare_fields_by_offset(FieldInfo* a, FieldInfo* b) { + return a->offset() - b->offset(); } template @@ -1929,7 +1926,7 @@ void InstanceKlass::do_nonstatic_fields_dcevm(FieldClosure* cl) { for (int i = 0; i < length; i++) { InstanceKlass* ik = class_hiearchy.at(fields_sorted.at(i).third); - fd.reinitialize(ik, fields_sorted.at(i).second); + fd.reinitialize(ik, ik->field(fields_sorted.at(i).second)); assert(!fd.is_static(), "only nonstatic fields"); assert(fd.offset() == fields_sorted.at(i).first, "offset matches"); cl->do_field(&fd); @@ -1943,26 +1940,20 @@ void InstanceKlass::print_nonstatic_fields(FieldClosure* cl) { super->print_nonstatic_fields(cl); } ResourceMark rm; - fieldDescriptor fd; // In DebugInfo nonstatic fields are sorted by offset. - GrowableArray > fields_sorted; - int i = 0; + GrowableArray fields_sorted; for (AllFieldStream fs(this); !fs.done(); fs.next()) { if (!fs.access_flags().is_static()) { - fd = fs.field_descriptor(); - Pair f(fs.offset(), fs.index()); - fields_sorted.push(f); - i++; + fields_sorted.push(fs.to_FieldInfo()); } } - if (i > 0) { - int length = i; - assert(length == fields_sorted.length(), "duh"); - // _sort_Fn is defined in growableArray.hpp. + int length = fields_sorted.length(); + if (length > 0) { fields_sorted.sort(compare_fields_by_offset); + fieldDescriptor fd; for (int i = 0; i < length; i++) { - fd.reinitialize(this, fields_sorted.at(i).second); - assert(!fd.is_static() && fd.offset() == fields_sorted.at(i).first, "only nonstatic fields"); + fd.reinitialize(this, fields_sorted.at(i)); + assert(!fd.is_static() && fd.offset() == checked_cast(fields_sorted.at(i).offset()), "only nonstatic fields"); cl->do_field(&fd); } } diff --git a/src/hotspot/share/oops/instanceKlass.hpp b/src/hotspot/share/oops/instanceKlass.hpp index 395f8027f505..619d1bc7a59e 100644 --- a/src/hotspot/share/oops/instanceKlass.hpp +++ b/src/hotspot/share/oops/instanceKlass.hpp @@ -136,6 +136,7 @@ class InstanceKlass: public Klass { friend class ClassFileParser; friend class CompileReplay; friend class VM_EnhancedRedefineClasses; + friend class FieldStream; public: static const KlassKind Kind = InstanceKlassKind; diff --git a/src/hotspot/share/prims/jvm.cpp b/src/hotspot/share/prims/jvm.cpp index 6eeb8f4414fc..7d9f839b5c4b 100644 --- a/src/hotspot/share/prims/jvm.cpp +++ b/src/hotspot/share/prims/jvm.cpp @@ -1793,7 +1793,7 @@ JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, fieldDescriptor fd; for (JavaFieldStream fs(k); !fs.done(); fs.next()) { if (!publicOnly || fs.access_flags().is_public()) { - fd.reinitialize(k, fs.index()); + fd.reinitialize(k, fs.to_FieldInfo()); oop field = Reflection::new_field(&fd, CHECK_NULL); result->obj_at_put(out_idx, field); ++out_idx; diff --git a/src/hotspot/share/runtime/fieldDescriptor.cpp b/src/hotspot/share/runtime/fieldDescriptor.cpp index d326b79acfd7..2b4a91c0cc80 100644 --- a/src/hotspot/share/runtime/fieldDescriptor.cpp +++ b/src/hotspot/share/runtime/fieldDescriptor.cpp @@ -87,7 +87,7 @@ oop fieldDescriptor::string_initial_value(TRAPS) const { return constants()->uncached_string_at(initial_value_index(), THREAD); } -void fieldDescriptor::reinitialize(InstanceKlass* ik, int index) { +void fieldDescriptor::reinitialize(InstanceKlass* ik, const FieldInfo& fieldinfo) { if (_cp.is_null() || field_holder() != ik) { _cp = constantPoolHandle(Thread::current(), ik->constants()); // _cp should now reference ik's constant pool; i.e., ik is now field_holder. @@ -95,8 +95,7 @@ void fieldDescriptor::reinitialize(InstanceKlass* ik, int index) { // but that's ok because of constant pool merging. assert(field_holder() == ik || ik->is_scratch_class(), "must be already initialized to this class"); } - _fieldinfo= ik->field(index); - assert((int)_fieldinfo.index() == index, "just checking"); + _fieldinfo = fieldinfo; guarantee(_fieldinfo.name_index() != 0 && _fieldinfo.signature_index() != 0, "bad constant pool index for fieldDescriptor"); } diff --git a/src/hotspot/share/runtime/fieldDescriptor.hpp b/src/hotspot/share/runtime/fieldDescriptor.hpp index 1f7fdbe390a3..660033f31d53 100644 --- a/src/hotspot/share/runtime/fieldDescriptor.hpp +++ b/src/hotspot/share/runtime/fieldDescriptor.hpp @@ -46,7 +46,7 @@ class fieldDescriptor { public: fieldDescriptor() {} fieldDescriptor(InstanceKlass* ik, int index) { - reinitialize(ik, index); + reinitialize(ik, ik->field(index)); } inline Symbol* name() const; inline Symbol* signature() const; @@ -102,7 +102,7 @@ class fieldDescriptor { inline void set_has_initialized_final_update(const bool value); // Initialization - void reinitialize(InstanceKlass* ik, int index); + void reinitialize(InstanceKlass* ik, const FieldInfo& fieldinfo); // Print void print() const; diff --git a/src/hotspot/share/runtime/reflectionUtils.hpp b/src/hotspot/share/runtime/reflectionUtils.hpp index f3601c1baeba..0a28bb304758 100644 --- a/src/hotspot/share/runtime/reflectionUtils.hpp +++ b/src/hotspot/share/runtime/reflectionUtils.hpp @@ -153,7 +153,7 @@ class FieldStream : public KlassStream { // bridge to a heavier API: fieldDescriptor& field_descriptor() const { fieldDescriptor& field = const_cast(_fd_buf); - field.reinitialize(_klass, _index); + field.reinitialize(_klass, _klass->field(_index)); return field; } }; From 192f6c5bfecbf7f72a457506abfceda35798993a Mon Sep 17 00:00:00 2001 From: Andrew John Hughes Date: Thu, 18 Dec 2025 13:10:33 +0000 Subject: [PATCH 312/323] 8372534: Update Libpng to 1.6.51 Reviewed-by: mbaesken, sgehwolf Backport-of: cb7fb728d4805ed4e9d62ce31cee7c948f3d5746 --- .../java.desktop/lib/Awt2dLibraries.gmk | 2 +- src/java.desktop/share/legal/libpng.md | 12 +- .../native/libsplashscreen/libpng/CHANGES | 53 +++++++ .../native/libsplashscreen/libpng/README | 4 +- .../share/native/libsplashscreen/libpng/png.c | 28 ++-- .../share/native/libsplashscreen/libpng/png.h | 57 ++++--- .../native/libsplashscreen/libpng/pngconf.h | 47 +++--- .../native/libsplashscreen/libpng/pngdebug.h | 11 +- .../native/libsplashscreen/libpng/pngerror.c | 140 +----------------- .../native/libsplashscreen/libpng/pngget.c | 2 +- .../native/libsplashscreen/libpng/pnginfo.h | 51 ++----- .../libsplashscreen/libpng/pnglibconf.h | 2 +- .../native/libsplashscreen/libpng/pngmem.c | 2 +- .../native/libsplashscreen/libpng/pngpread.c | 10 +- .../native/libsplashscreen/libpng/pngpriv.h | 88 ++++++++--- .../native/libsplashscreen/libpng/pngread.c | 87 ++++++++++- .../native/libsplashscreen/libpng/pngrio.c | 4 +- .../native/libsplashscreen/libpng/pngrtran.c | 122 ++++++++++----- .../native/libsplashscreen/libpng/pngrutil.c | 14 +- .../native/libsplashscreen/libpng/pngset.c | 19 +-- .../native/libsplashscreen/libpng/pngstruct.h | 16 +- 21 files changed, 431 insertions(+), 340 deletions(-) diff --git a/make/modules/java.desktop/lib/Awt2dLibraries.gmk b/make/modules/java.desktop/lib/Awt2dLibraries.gmk index 1c54244a419f..778d4efe2879 100644 --- a/make/modules/java.desktop/lib/Awt2dLibraries.gmk +++ b/make/modules/java.desktop/lib/Awt2dLibraries.gmk @@ -1049,7 +1049,7 @@ ifeq ($(ENABLE_HEADLESS_ONLY), false) EXCLUDE_SRC_PATTERNS := $(LIBSPLASHSCREEN_EXCLUDE_SRC_PATTERNS), \ DISABLED_WARNINGS_gcc := $(LIBSPLASHSCREEN_DISABLED_WARNINGS_gcc), \ DISABLED_WARNINGS_clang := $(LIBSPLASHSCREEN_DISABLED_WARNINGS_clang), \ - DISABLED_WARNINGS_clang_png.c := $(LIBSPLASHSCREEN_DISABLED_WARNINGS_clang) unused-function, \ + DISABLED_WARNINGS_clang_png.c := $(LIBSPLASHSCREEN_DISABLED_WARNINGS_clang), \ DISABLED_WARNINGS_microsoft := $(LIBSPLASHSCREEN_DISABLED_WARNINGS_microsoft), \ EXCLUDE_FILES := $(LIBSPLASHSCREEN_EXCLUDE_FILES), \ EXCLUDES := $(LIBSPLASHSCREEN_EXCLUDES), \ diff --git a/src/java.desktop/share/legal/libpng.md b/src/java.desktop/share/legal/libpng.md index d43ccf2e8e49..8899491c6c0a 100644 --- a/src/java.desktop/share/legal/libpng.md +++ b/src/java.desktop/share/legal/libpng.md @@ -1,4 +1,4 @@ -## libpng v1.6.47 +## libpng v1.6.51 ### libpng License
          @@ -9,7 +9,7 @@ COPYRIGHT NOTICE, DISCLAIMER, and LICENSE
           PNG Reference Library License version 2
           ---------------------------------------
           
          -Copyright (c) 1995-2025 The PNG Reference Library Authors.
          +Copyright (C) 1995-2025 The PNG Reference Library Authors.
           Copyright (C) 2018-2025 Cosmin Truta
           Copyright (C) 1998-2018 Glenn Randers-Pehrson
           Copyright (C) 1996-1997 Andreas Dilger
          @@ -173,6 +173,7 @@ Authors, for copyright and licensing purposes.
            * Lucas Chollet
            * Magnus Holmgren
            * Mandar Sahastrabuddhe
          + * Manfred Schlaegl
            * Mans Rullgard
            * Matt Sarett
            * Mike Klein
          @@ -184,6 +185,7 @@ Authors, for copyright and licensing purposes.
            * Samuel Williams
            * Simon-Pierre Cadieux
            * Tim Wegner
          + * Tobias Stoeckmann
            * Tom Lane
            * Tom Tanner
            * Vadim Barkov
          @@ -193,8 +195,9 @@ Authors, for copyright and licensing purposes.
               - Zixu Wang (王子旭)
            * Arm Holdings
               - Richard Townsend
          - * Google Inc.
          + * Google LLC
               - Dan Field
          +    - Dragoș Tiselice
               - Leon Scroggins III
               - Matt Sarett
               - Mike Klein
          @@ -204,6 +207,8 @@ Authors, for copyright and licensing purposes.
               - GuXiWei (顾希伟)
               - JinBo (金波)
               - ZhangLixia (张利霞)
          + * Samsung Group
          +    - Filip Wasil
           
           The build projects, the build scripts, the test scripts, and other
           files in the "projects", "scripts" and "tests" directories, have
          @@ -214,3 +219,4 @@ of the tools-generated files that are distributed with libpng, have
           other copyright owners, and are released under other open source
           licenses.
           ```
          +
          diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/CHANGES b/src/java.desktop/share/native/libsplashscreen/libpng/CHANGES
          index 834b5e19277a..2478fd0fc083 100644
          --- a/src/java.desktop/share/native/libsplashscreen/libpng/CHANGES
          +++ b/src/java.desktop/share/native/libsplashscreen/libpng/CHANGES
          @@ -6251,6 +6251,59 @@ Version 1.6.47 [February 18, 2025]
               colorspace precedence rules, due to pre-existing colorspace checks.
               (Reported by Bob Friesenhahn; fixed by John Bowler)
           
          +Version 1.6.48 [April 30, 2025]
          +  Fixed the floating-point version of the mDCv setter `png_set_mDCv`.
          +    (Reported by Mohit Bakshi; fixed by John Bowler)
          +  Added #error directives to discourage the inclusion of private
          +    libpng implementation header files in PNG-supporting applications.
          +  Added the CMake build option `PNG_LIBCONF_HEADER`, to be used as an
          +    alternative to `DFA_XTRA`.
          +  Removed the Travis CI configuration files, with heartfelt thanks for
          +    their generous support of our project over the past five years!
          +
          +Version 1.6.49 [June 12, 2025]
          +  Added SIMD-optimized code for the RISC-V Vector Extension (RVV).
          +    (Contributed by Manfred Schlaegl, Dragos Tiselice and Filip Wasil)
          +  Added various fixes and improvements to the build scripts and to
          +    the sample code.
          +
          +Version 1.6.50 [July 1, 2025]
          +  Improved the detection of the RVV Extension on the RISC-V platform.
          +    (Contributed by Filip Wasil)
          +  Replaced inline ASM with C intrinsics in the RVV code.
          +    (Contributed by Filip Wasil)
          +  Fixed a decoder defect in which unknown chunks trailing IDAT, set
          +    to go through the unknown chunk handler, incorrectly triggered
          +    out-of-place IEND errors.
          +    (Contributed by John Bowler)
          +  Fixed the CMake file for cross-platform builds that require `libm`.
          +
          +Version 1.6.51 [November 21, 2025]
          +  Fixed CVE-2025-64505 (moderate severity):
          +    Heap buffer overflow in `png_do_quantize` via malformed palette index.
          +    (Reported by Samsung; analyzed by Fabio Gritti.)
          +  Fixed CVE-2025-64506 (moderate severity):
          +    Heap buffer over-read in `png_write_image_8bit` with 8-bit input and
          +    `convert_to_8bit` enabled.
          +    (Reported by Samsung and ;
          +    analyzed by Fabio Gritti.)
          +  Fixed CVE-2025-64720 (high severity):
          +    Buffer overflow in `png_image_read_composite` via incorrect palette
          +    premultiplication.
          +    (Reported by Samsung; analyzed by John Bowler.)
          +  Fixed CVE-2025-65018 (high severity):
          +    Heap buffer overflow in `png_combine_row` triggered via
          +    `png_image_finish_read`.
          +    (Reported by .)
          +  Fixed a memory leak in `png_set_quantize`.
          +    (Reported by Samsung; analyzed by Fabio Gritti.)
          +  Removed the experimental and incomplete ERROR_NUMBERS code.
          +    (Contributed by Tobias Stoeckmann.)
          +  Improved the RISC-V vector extension support; required RVV 1.0 or newer.
          +    (Contributed by Filip Wasil.)
          +  Added GitHub Actions workflows for automated testing.
          +  Performed various refactorings and cleanups.
          +
           Send comments/corrections/commendations to png-mng-implement at lists.sf.net.
           Subscription is required; visit
           https://lists.sourceforge.net/lists/listinfo/png-mng-implement
          diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/README b/src/java.desktop/share/native/libsplashscreen/libpng/README
          index 57952fb215ae..5ea329ee3dae 100644
          --- a/src/java.desktop/share/native/libsplashscreen/libpng/README
          +++ b/src/java.desktop/share/native/libsplashscreen/libpng/README
          @@ -1,4 +1,4 @@
          -README for libpng version 1.6.47
          +README for libpng version 1.6.51
           ================================
           
           See the note about version numbers near the top of `png.h`.
          @@ -147,6 +147,7 @@ Files included in this distribution
               loongarch/    =>  Optimized code for LoongArch LSX
               mips/         =>  Optimized code for MIPS MSA and MIPS MMI
               powerpc/      =>  Optimized code for PowerPC VSX
          +    riscv/        =>  Optimized code for the RISC-V platform
               ci/           =>  Scripts for continuous integration
               contrib/      =>  External contributions
                   arm-neon/     =>  Optimized code for the ARM-NEON platform
          @@ -162,6 +163,7 @@ Files included in this distribution
                                     programs demonstrating the use of pngusr.dfa
                   pngminus/     =>  Simple pnm2png and png2pnm programs
                   pngsuite/     =>  Test images
          +        riscv-rvv/    =>  Optimized code for the RISC-V Vector platform
                   testpngs/     =>  Test images
                   tools/        =>  Various tools
                   visupng/      =>  VisualPng, a Windows viewer for PNG images
          diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/png.c b/src/java.desktop/share/native/libsplashscreen/libpng/png.c
          index 7b6de2f8ec3a..7d85e7c8d5f9 100644
          --- a/src/java.desktop/share/native/libsplashscreen/libpng/png.c
          +++ b/src/java.desktop/share/native/libsplashscreen/libpng/png.c
          @@ -42,7 +42,7 @@
           #include "pngpriv.h"
           
           /* Generate a compiler error if there is an old png.h in the search path. */
          -typedef png_libpng_version_1_6_47 Your_png_h_is_not_version_1_6_47;
          +typedef png_libpng_version_1_6_51 Your_png_h_is_not_version_1_6_51;
           
           /* Sanity check the chunks definitions - PNG_KNOWN_CHUNKS from pngpriv.h and the
            * corresponding macro definitions.  This causes a compile time failure if
          @@ -137,10 +137,16 @@ png_zalloc,(voidpf png_ptr, uInt items, uInt size),PNG_ALLOCATED)
              if (png_ptr == NULL)
                 return NULL;
           
          -   if (items >= (~(png_alloc_size_t)0)/size)
          +   /* This check against overflow is vestigial, dating back from
          +    * the old times when png_zalloc used to be an exported function.
          +    * We're still keeping it here for now, as an extra-cautious
          +    * prevention against programming errors inside zlib, although it
          +    * should rather be a debug-time assertion instead.
          +    */
          +   if (size != 0 && items >= (~(png_alloc_size_t)0) / size)
              {
          -      png_warning (png_voidcast(png_structrp, png_ptr),
          -          "Potential overflow in png_zalloc()");
          +      png_warning(png_voidcast(png_structrp, png_ptr),
          +                  "Potential overflow in png_zalloc()");
                 return NULL;
              }
           
          @@ -267,10 +273,6 @@ png_user_version_check(png_structrp png_ptr, png_const_charp user_png_ver)
                 png_warning(png_ptr, m);
           #endif
           
          -#ifdef PNG_ERROR_NUMBERS_SUPPORTED
          -      png_ptr->flags = 0;
          -#endif
          -
                 return 0;
              }
           
          @@ -729,7 +731,7 @@ png_get_io_ptr(png_const_structrp png_ptr)
            * function of your own because "FILE *" isn't necessarily available.
            */
           void PNGAPI
          -png_init_io(png_structrp png_ptr, png_FILE_p fp)
          +png_init_io(png_structrp png_ptr, FILE *fp)
           {
              png_debug(1, "in png_init_io");
           
          @@ -844,7 +846,7 @@ png_get_copyright(png_const_structrp png_ptr)
              return PNG_STRING_COPYRIGHT
           #else
              return PNG_STRING_NEWLINE \
          -      "libpng version 1.6.47" PNG_STRING_NEWLINE \
          +      "libpng version 1.6.51" PNG_STRING_NEWLINE \
                 "Copyright (c) 2018-2025 Cosmin Truta" PNG_STRING_NEWLINE \
                 "Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson" \
                 PNG_STRING_NEWLINE \
          @@ -1520,7 +1522,7 @@ png_XYZ_from_xy(png_XYZ *XYZ, const png_xy *xy)
           }
           #endif /* COLORSPACE */
           
          -#ifdef PNG_iCCP_SUPPORTED
          +#ifdef PNG_READ_iCCP_SUPPORTED
           /* Error message generation */
           static char
           png_icc_tag_char(png_uint_32 byte)
          @@ -1596,9 +1598,7 @@ png_icc_profile_error(png_const_structrp png_ptr, png_const_charp name,
           
              return 0;
           }
          -#endif /* iCCP */
           
          -#ifdef PNG_READ_iCCP_SUPPORTED
           /* Encoded value of D50 as an ICC XYZNumber.  From the ICC 2010 spec the value
            * is XYZ(0.9642,1.0,0.8249), which scales to:
            *
          @@ -3998,7 +3998,7 @@ png_image_free_function(png_voidp argument)
           #  ifdef PNG_STDIO_SUPPORTED
                 if (cp->owned_file != 0)
                 {
          -         FILE *fp = png_voidcast(FILE*, cp->png_ptr->io_ptr);
          +         FILE *fp = png_voidcast(FILE *, cp->png_ptr->io_ptr);
                    cp->owned_file = 0;
           
                    /* Ignore errors here. */
          diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/png.h b/src/java.desktop/share/native/libsplashscreen/libpng/png.h
          index ede12c34fe60..d39ff73552c6 100644
          --- a/src/java.desktop/share/native/libsplashscreen/libpng/png.h
          +++ b/src/java.desktop/share/native/libsplashscreen/libpng/png.h
          @@ -29,7 +29,7 @@
            * However, the following notice accompanied the original version of this
            * file and, per its terms, should not be removed:
            *
          - * libpng version 1.6.47
          + * libpng version 1.6.51
            *
            * Copyright (c) 2018-2025 Cosmin Truta
            * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
          @@ -43,7 +43,7 @@
            *   libpng versions 0.89, June 1996, through 0.96, May 1997: Andreas Dilger
            *   libpng versions 0.97, January 1998, through 1.6.35, July 2018:
            *     Glenn Randers-Pehrson
          - *   libpng versions 1.6.36, December 2018, through 1.6.47, February 2025:
          + *   libpng versions 1.6.36, December 2018, through 1.6.51, November 2025:
            *     Cosmin Truta
            *   See also "Contributing Authors", below.
            */
          @@ -267,7 +267,7 @@
            *    ...
            *    1.5.30                  15    10530  15.so.15.30[.0]
            *    ...
          - *    1.6.47                  16    10647  16.so.16.47[.0]
          + *    1.6.51                  16    10651  16.so.16.51[.0]
            *
            *    Henceforth the source version will match the shared-library major and
            *    minor numbers; the shared-library major version number will be used for
          @@ -303,7 +303,7 @@
            */
           
           /* Version information for png.h - this should match the version in png.c */
          -#define PNG_LIBPNG_VER_STRING "1.6.47"
          +#define PNG_LIBPNG_VER_STRING "1.6.51"
           #define PNG_HEADER_VERSION_STRING " libpng version " PNG_LIBPNG_VER_STRING "\n"
           
           /* The versions of shared library builds should stay in sync, going forward */
          @@ -314,7 +314,7 @@
           /* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
           #define PNG_LIBPNG_VER_MAJOR   1
           #define PNG_LIBPNG_VER_MINOR   6
          -#define PNG_LIBPNG_VER_RELEASE 47
          +#define PNG_LIBPNG_VER_RELEASE 51
           
           /* This should be zero for a public release, or non-zero for a
            * development version.
          @@ -345,7 +345,7 @@
            * From version 1.0.1 it is:
            * XXYYZZ, where XX=major, YY=minor, ZZ=release
            */
          -#define PNG_LIBPNG_VER 10647 /* 1.6.47 */
          +#define PNG_LIBPNG_VER 10651 /* 1.6.51 */
           
           /* Library configuration: these options cannot be changed after
            * the library has been built.
          @@ -455,7 +455,7 @@ extern "C" {
           /* This triggers a compiler error in png.c, if png.c and png.h
            * do not agree upon the version number.
            */
          -typedef char* png_libpng_version_1_6_47;
          +typedef char* png_libpng_version_1_6_51;
           
           /* Basic control structions.  Read libpng-manual.txt or libpng.3 for more info.
            *
          @@ -1599,7 +1599,7 @@ PNG_EXPORT(226, void, png_set_text_compression_method, (png_structrp png_ptr,
           
           #ifdef PNG_STDIO_SUPPORTED
           /* Initialize the input/output for the PNG file to the default functions. */
          -PNG_EXPORT(74, void, png_init_io, (png_structrp png_ptr, png_FILE_p fp));
          +PNG_EXPORT(74, void, png_init_io, (png_structrp png_ptr, FILE *fp));
           #endif
           
           /* Replace the (error and abort), and warning functions with user
          @@ -3117,7 +3117,7 @@ PNG_EXPORT(234, int, png_image_begin_read_from_file, (png_imagep image,
               */
           
           PNG_EXPORT(235, int, png_image_begin_read_from_stdio, (png_imagep image,
          -   FILE* file));
          +   FILE *file));
              /* The PNG header is read from the stdio FILE object. */
           #endif /* STDIO */
           
          @@ -3192,7 +3192,7 @@ PNG_EXPORT(239, int, png_image_write_to_file, (png_imagep image,
           PNG_EXPORT(240, int, png_image_write_to_stdio, (png_imagep image, FILE *file,
              int convert_to_8_bit, const void *buffer, png_int_32 row_stride,
              const void *colormap));
          -   /* Write the image to the given (FILE*). */
          +   /* Write the image to the given FILE object. */
           #endif /* SIMPLIFIED_WRITE_STDIO */
           
           /* With all write APIs if image is in one of the linear formats with 16-bit
          @@ -3332,26 +3332,45 @@ PNG_EXPORT(245, int, png_image_write_to_memory, (png_imagep image, void *memory,
            *           selected at run time.
            */
           #ifdef PNG_SET_OPTION_SUPPORTED
          +
          +/* HARDWARE: ARM Neon SIMD instructions supported */
           #ifdef PNG_ARM_NEON_API_SUPPORTED
          -#  define PNG_ARM_NEON   0 /* HARDWARE: ARM Neon SIMD instructions supported */
          +#  define PNG_ARM_NEON 0
           #endif
          -#define PNG_MAXIMUM_INFLATE_WINDOW 2 /* SOFTWARE: force maximum window */
          -#define PNG_SKIP_sRGB_CHECK_PROFILE 4 /* SOFTWARE: Check ICC profile for sRGB */
          +
          +/* SOFTWARE: Force maximum window */
          +#define PNG_MAXIMUM_INFLATE_WINDOW 2
          +
          +/* SOFTWARE: Check ICC profile for sRGB */
          +#define PNG_SKIP_sRGB_CHECK_PROFILE 4
          +
          +/* HARDWARE: MIPS MSA SIMD instructions supported */
           #ifdef PNG_MIPS_MSA_API_SUPPORTED
          -#  define PNG_MIPS_MSA   6 /* HARDWARE: MIPS Msa SIMD instructions supported */
          +#  define PNG_MIPS_MSA 6
           #endif
          +
          +/* SOFTWARE: Disable Adler32 check on IDAT */
           #ifdef PNG_DISABLE_ADLER32_CHECK_SUPPORTED
          -#  define PNG_IGNORE_ADLER32 8 /* SOFTWARE: disable Adler32 check on IDAT */
          +#  define PNG_IGNORE_ADLER32 8
           #endif
          +
          +/* HARDWARE: PowerPC VSX SIMD instructions supported */
           #ifdef PNG_POWERPC_VSX_API_SUPPORTED
          -#  define PNG_POWERPC_VSX   10 /* HARDWARE: PowerPC VSX SIMD instructions
          -                                * supported */
          +#  define PNG_POWERPC_VSX 10
           #endif
          +
          +/* HARDWARE: MIPS MMI SIMD instructions supported */
           #ifdef PNG_MIPS_MMI_API_SUPPORTED
          -#  define PNG_MIPS_MMI   12 /* HARDWARE: MIPS MMI SIMD instructions supported */
          +#  define PNG_MIPS_MMI 12
          +#endif
          +
          +/* HARDWARE: RISC-V RVV SIMD instructions supported */
          +#ifdef PNG_RISCV_RVV_API_SUPPORTED
          +#  define PNG_RISCV_RVV 14
           #endif
           
          -#define PNG_OPTION_NEXT  14 /* Next option - numbers must be even */
          +/* Next option - numbers must be even */
          +#define PNG_OPTION_NEXT 16
           
           /* Return values: NOTE: there are four values and 'off' is *not* zero */
           #define PNG_OPTION_UNSET   0 /* Unset - defaults to off */
          diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/pngconf.h b/src/java.desktop/share/native/libsplashscreen/libpng/pngconf.h
          index 70bca6fa1c90..4bc5f7bb4680 100644
          --- a/src/java.desktop/share/native/libsplashscreen/libpng/pngconf.h
          +++ b/src/java.desktop/share/native/libsplashscreen/libpng/pngconf.h
          @@ -29,7 +29,7 @@
            * However, the following notice accompanied the original version of this
            * file and, per its terms, should not be removed:
            *
          - * libpng version 1.6.47
          + * libpng version 1.6.51
            *
            * Copyright (c) 2018-2025 Cosmin Truta
            * Copyright (c) 1998-2002,2004,2006-2016,2018 Glenn Randers-Pehrson
          @@ -248,25 +248,13 @@
             /* NOTE: PNGCBAPI always defaults to PNGCAPI. */
           
           #  if defined(PNGAPI) && !defined(PNG_USER_PRIVATEBUILD)
          -#     error "PNG_USER_PRIVATEBUILD must be defined if PNGAPI is changed"
          +#     error PNG_USER_PRIVATEBUILD must be defined if PNGAPI is changed
           #  endif
           
          -#  if (defined(_MSC_VER) && _MSC_VER < 800) ||\
          -      (defined(__BORLANDC__) && __BORLANDC__ < 0x500)
          -   /* older Borland and MSC
          -    * compilers used '__export' and required this to be after
          -    * the type.
          -    */
          -#    ifndef PNG_EXPORT_TYPE
          -#      define PNG_EXPORT_TYPE(type) type PNG_IMPEXP
          -#    endif
          -#    define PNG_DLL_EXPORT __export
          -#  else /* newer compiler */
          -#    define PNG_DLL_EXPORT __declspec(dllexport)
          -#    ifndef PNG_DLL_IMPORT
          -#      define PNG_DLL_IMPORT __declspec(dllimport)
          -#    endif
          -#  endif /* compiler */
          +#  define PNG_DLL_EXPORT __declspec(dllexport)
          +#  ifndef PNG_DLL_IMPORT
          +#    define PNG_DLL_IMPORT __declspec(dllimport)
          +#  endif
           
           #else /* !Windows */
           #  if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__)
          @@ -508,7 +496,7 @@
           #if CHAR_BIT == 8 && UCHAR_MAX == 255
              typedef unsigned char png_byte;
           #else
          -#  error "libpng requires 8-bit bytes"
          +#  error libpng requires 8-bit bytes
           #endif
           
           #if INT_MIN == -32768 && INT_MAX == 32767
          @@ -516,7 +504,7 @@
           #elif SHRT_MIN == -32768 && SHRT_MAX == 32767
              typedef short png_int_16;
           #else
          -#  error "libpng requires a signed 16-bit type"
          +#  error libpng requires a signed 16-bit integer type
           #endif
           
           #if UINT_MAX == 65535
          @@ -524,7 +512,7 @@
           #elif USHRT_MAX == 65535
              typedef unsigned short png_uint_16;
           #else
          -#  error "libpng requires an unsigned 16-bit type"
          +#  error libpng requires an unsigned 16-bit integer type
           #endif
           
           #if INT_MIN < -2147483646 && INT_MAX > 2147483646
          @@ -532,7 +520,7 @@
           #elif LONG_MIN < -2147483646 && LONG_MAX > 2147483646
              typedef long int png_int_32;
           #else
          -#  error "libpng requires a signed 32-bit (or more) type"
          +#  error libpng requires a signed 32-bit (or longer) integer type
           #endif
           
           #if UINT_MAX > 4294967294U
          @@ -540,7 +528,7 @@
           #elif ULONG_MAX > 4294967294U
              typedef unsigned long int png_uint_32;
           #else
          -#  error "libpng requires an unsigned 32-bit (or more) type"
          +#  error libpng requires an unsigned 32-bit (or longer) integer type
           #endif
           
           /* Prior to 1.6.0, it was possible to disable the use of size_t and ptrdiff_t.
          @@ -621,10 +609,6 @@ typedef const png_fixed_point * png_const_fixed_point_p;
           typedef size_t                * png_size_tp;
           typedef const size_t          * png_const_size_tp;
           
          -#ifdef PNG_STDIO_SUPPORTED
          -typedef FILE            * png_FILE_p;
          -#endif
          -
           #ifdef PNG_FLOATING_POINT_SUPPORTED
           typedef double       * png_doublep;
           typedef const double * png_const_doublep;
          @@ -646,6 +630,15 @@ typedef double          * * png_doublepp;
           /* Pointers to pointers to pointers; i.e., pointer to array */
           typedef char            * * * png_charppp;
           
          +#ifdef PNG_STDIO_SUPPORTED
          +/* With PNG_STDIO_SUPPORTED it was possible to use I/O streams that were
          + * not necessarily stdio FILE streams, to allow building Windows applications
          + * before Win32 and Windows CE applications before WinCE 3.0, but that kind
          + * of support has long been discontinued.
          + */
          +typedef FILE            * png_FILE_p; /* [Deprecated] */
          +#endif
          +
           #endif /* PNG_BUILDING_SYMBOL_TABLE */
           
           #endif /* PNGCONF_H */
          diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/pngdebug.h b/src/java.desktop/share/native/libsplashscreen/libpng/pngdebug.h
          index 8eb5400ea9a8..6ea2644dfcd8 100644
          --- a/src/java.desktop/share/native/libsplashscreen/libpng/pngdebug.h
          +++ b/src/java.desktop/share/native/libsplashscreen/libpng/pngdebug.h
          @@ -22,14 +22,14 @@
            * questions.
            */
           
          -/* pngdebug.h - Debugging macros for libpng, also used in pngtest.c
          +/* pngdebug.h - internal debugging macros for libpng
            *
            * This file is available under and governed by the GNU General Public
            * License version 2 only, as published by the Free Software Foundation.
            * However, the following notice accompanied the original version of this
            * file and, per its terms, should not be removed:
            *
          - * Copyright (c) 2018 Cosmin Truta
          + * Copyright (c) 2018-2025 Cosmin Truta
            * Copyright (c) 1998-2002,2004,2006-2013 Glenn Randers-Pehrson
            * Copyright (c) 1996-1997 Andreas Dilger
            * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
          @@ -39,6 +39,10 @@
            * and license in png.h
            */
           
          +#ifndef PNGPRIV_H
          +#  error This file must not be included by applications; please include 
          +#endif
          +
           /* Define PNG_DEBUG at compile time for debugging information.  Higher
            * numbers for PNG_DEBUG mean more debugging information.  This has
            * only been added since version 0.95 so it is not implemented throughout
          @@ -63,9 +67,6 @@
           #define PNGDEBUG_H
           /* These settings control the formatting of messages in png.c and pngerror.c */
           /* Moved to pngdebug.h at 1.5.0 */
          -#  ifndef PNG_LITERAL_SHARP
          -#    define PNG_LITERAL_SHARP 0x23
          -#  endif
           #  ifndef PNG_LITERAL_LEFT_SQUARE_BRACKET
           #    define PNG_LITERAL_LEFT_SQUARE_BRACKET 0x5b
           #  endif
          diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/pngerror.c b/src/java.desktop/share/native/libsplashscreen/libpng/pngerror.c
          index ea0103331d34..44c86ebfef99 100644
          --- a/src/java.desktop/share/native/libsplashscreen/libpng/pngerror.c
          +++ b/src/java.desktop/share/native/libsplashscreen/libpng/pngerror.c
          @@ -29,7 +29,7 @@
            * However, the following notice accompanied the original version of this
            * file and, per its terms, should not be removed:
            *
          - * Copyright (c) 2018-2024 Cosmin Truta
          + * Copyright (c) 2018-2025 Cosmin Truta
            * Copyright (c) 1998-2002,2004,2006-2017 Glenn Randers-Pehrson
            * Copyright (c) 1996-1997 Andreas Dilger
            * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
          @@ -68,46 +68,6 @@ PNG_FUNCTION(void,PNGAPI
           png_error,(png_const_structrp png_ptr, png_const_charp error_message),
               PNG_NORETURN)
           {
          -#ifdef PNG_ERROR_NUMBERS_SUPPORTED
          -   char msg[16];
          -   if (png_ptr != NULL)
          -   {
          -      if ((png_ptr->flags &
          -         (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) != 0)
          -      {
          -         if (*error_message == PNG_LITERAL_SHARP)
          -         {
          -            /* Strip "#nnnn " from beginning of error message. */
          -            int offset;
          -            for (offset = 1; offset<15; offset++)
          -               if (error_message[offset] == ' ')
          -                  break;
          -
          -            if ((png_ptr->flags & PNG_FLAG_STRIP_ERROR_TEXT) != 0)
          -            {
          -               int i;
          -               for (i = 0; i < offset - 1; i++)
          -                  msg[i] = error_message[i + 1];
          -               msg[i - 1] = '\0';
          -               error_message = msg;
          -            }
          -
          -            else
          -               error_message += offset;
          -         }
          -
          -         else
          -         {
          -            if ((png_ptr->flags & PNG_FLAG_STRIP_ERROR_TEXT) != 0)
          -            {
          -               msg[0] = '0';
          -               msg[1] = '\0';
          -               error_message = msg;
          -            }
          -         }
          -      }
          -   }
          -#endif
              if (png_ptr != NULL && png_ptr->error_fn != NULL)
                 (*(png_ptr->error_fn))(png_constcast(png_structrp,png_ptr),
                     error_message);
          @@ -245,21 +205,6 @@ void PNGAPI
           png_warning(png_const_structrp png_ptr, png_const_charp warning_message)
           {
              int offset = 0;
          -   if (png_ptr != NULL)
          -   {
          -#ifdef PNG_ERROR_NUMBERS_SUPPORTED
          -   if ((png_ptr->flags &
          -       (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) != 0)
          -#endif
          -      {
          -         if (*warning_message == PNG_LITERAL_SHARP)
          -         {
          -            for (offset = 1; offset < 15; offset++)
          -               if (warning_message[offset] == ' ')
          -                  break;
          -         }
          -      }
          -   }
              if (png_ptr != NULL && png_ptr->warning_fn != NULL)
                 (*(png_ptr->warning_fn))(png_constcast(png_structrp,png_ptr),
                     warning_message + offset);
          @@ -741,42 +686,9 @@ png_default_error,(png_const_structrp png_ptr, png_const_charp error_message),
               PNG_NORETURN)
           {
           #ifdef PNG_CONSOLE_IO_SUPPORTED
          -#ifdef PNG_ERROR_NUMBERS_SUPPORTED
          -   /* Check on NULL only added in 1.5.4 */
          -   if (error_message != NULL && *error_message == PNG_LITERAL_SHARP)
          -   {
          -      /* Strip "#nnnn " from beginning of error message. */
          -      int offset;
          -      char error_number[16];
          -      for (offset = 0; offset<15; offset++)
          -      {
          -         error_number[offset] = error_message[offset + 1];
          -         if (error_message[offset] == ' ')
          -            break;
          -      }
          -
          -      if ((offset > 1) && (offset < 15))
          -      {
          -         error_number[offset - 1] = '\0';
          -         fprintf(stderr, "libpng error no. %s: %s",
          -             error_number, error_message + offset + 1);
          -         fprintf(stderr, PNG_STRING_NEWLINE);
          -      }
          -
          -      else
          -      {
          -         fprintf(stderr, "libpng error: %s, offset=%d",
          -             error_message, offset);
          -         fprintf(stderr, PNG_STRING_NEWLINE);
          -      }
          -   }
          -   else
          -#endif
          -   {
          -      fprintf(stderr, "libpng error: %s", error_message ? error_message :
          -         "undefined");
          -      fprintf(stderr, PNG_STRING_NEWLINE);
          -   }
          +   fprintf(stderr, "libpng error: %s", error_message ? error_message :
          +      "undefined");
          +   fprintf(stderr, PNG_STRING_NEWLINE);
           #else
              PNG_UNUSED(error_message) /* Make compiler happy */
           #endif
          @@ -814,40 +726,8 @@ static void /* PRIVATE */
           png_default_warning(png_const_structrp png_ptr, png_const_charp warning_message)
           {
           #ifdef PNG_CONSOLE_IO_SUPPORTED
          -#  ifdef PNG_ERROR_NUMBERS_SUPPORTED
          -   if (*warning_message == PNG_LITERAL_SHARP)
          -   {
          -      int offset;
          -      char warning_number[16];
          -      for (offset = 0; offset < 15; offset++)
          -      {
          -         warning_number[offset] = warning_message[offset + 1];
          -         if (warning_message[offset] == ' ')
          -            break;
          -      }
          -
          -      if ((offset > 1) && (offset < 15))
          -      {
          -         warning_number[offset + 1] = '\0';
          -         fprintf(stderr, "libpng warning no. %s: %s",
          -             warning_number, warning_message + offset);
          -         fprintf(stderr, PNG_STRING_NEWLINE);
          -      }
          -
          -      else
          -      {
          -         fprintf(stderr, "libpng warning: %s",
          -             warning_message);
          -         fprintf(stderr, PNG_STRING_NEWLINE);
          -      }
          -   }
          -   else
          -#  endif
          -
          -   {
          -      fprintf(stderr, "libpng warning: %s", warning_message);
          -      fprintf(stderr, PNG_STRING_NEWLINE);
          -   }
          +   fprintf(stderr, "libpng warning: %s", warning_message);
          +   fprintf(stderr, PNG_STRING_NEWLINE);
           #else
              PNG_UNUSED(warning_message) /* Make compiler happy */
           #endif
          @@ -895,12 +775,8 @@ png_get_error_ptr(png_const_structrp png_ptr)
           void PNGAPI
           png_set_strip_error_numbers(png_structrp png_ptr, png_uint_32 strip_mode)
           {
          -   if (png_ptr != NULL)
          -   {
          -      png_ptr->flags &=
          -         ((~(PNG_FLAG_STRIP_ERROR_NUMBERS |
          -         PNG_FLAG_STRIP_ERROR_TEXT))&strip_mode);
          -   }
          +   PNG_UNUSED(png_ptr)
          +   PNG_UNUSED(strip_mode)
           }
           #endif
           
          diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/pngget.c b/src/java.desktop/share/native/libsplashscreen/libpng/pngget.c
          index d67adbae247a..ed2e7f886f5d 100644
          --- a/src/java.desktop/share/native/libsplashscreen/libpng/pngget.c
          +++ b/src/java.desktop/share/native/libsplashscreen/libpng/pngget.c
          @@ -29,7 +29,7 @@
            * However, the following notice accompanied the original version of this
            * file and, per its terms, should not be removed:
            *
          - * Copyright (c) 2018-2024 Cosmin Truta
          + * Copyright (c) 2018-2025 Cosmin Truta
            * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
            * Copyright (c) 1996-1997 Andreas Dilger
            * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
          diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/pnginfo.h b/src/java.desktop/share/native/libsplashscreen/libpng/pnginfo.h
          index bc6ed3d09c97..c79c6cc780f5 100644
          --- a/src/java.desktop/share/native/libsplashscreen/libpng/pnginfo.h
          +++ b/src/java.desktop/share/native/libsplashscreen/libpng/pnginfo.h
          @@ -22,14 +22,14 @@
            * questions.
            */
           
          -/* pnginfo.h - header file for PNG reference library
          +/* pnginfo.h - internal structures for libpng
            *
            * This file is available under and governed by the GNU General Public
            * License version 2 only, as published by the Free Software Foundation.
            * However, the following notice accompanied the original version of this
            * file and, per its terms, should not be removed:
            *
          - * Copyright (c) 2018 Cosmin Truta
          + * Copyright (c) 2018-2025 Cosmin Truta
            * Copyright (c) 1998-2002,2004,2006-2013,2018 Glenn Randers-Pehrson
            * Copyright (c) 1996-1997 Andreas Dilger
            * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
          @@ -39,43 +39,20 @@
            * and license in png.h
            */
           
          - /* png_info is a structure that holds the information in a PNG file so
          - * that the application can find out the characteristics of the image.
          - * If you are reading the file, this structure will tell you what is
          - * in the PNG file.  If you are writing the file, fill in the information
          - * you want to put into the PNG file, using png_set_*() functions, then
          - * call png_write_info().
          - *
          - * The names chosen should be very close to the PNG specification, so
          - * consult that document for information about the meaning of each field.
          - *
          - * With libpng < 0.95, it was only possible to directly set and read the
          - * the values in the png_info_struct, which meant that the contents and
          - * order of the values had to remain fixed.  With libpng 0.95 and later,
          - * however, there are now functions that abstract the contents of
          - * png_info_struct from the application, so this makes it easier to use
          - * libpng with dynamic libraries, and even makes it possible to use
          - * libraries that don't have all of the libpng ancillary chunk-handing
          - * functionality.  In libpng-1.5.0 this was moved into a separate private
          - * file that is not visible to applications.
          +#ifndef PNGPRIV_H
          +#  error This file must not be included by applications; please include 
          +#endif
          +
          +/* INTERNAL, PRIVATE definition of a PNG.
            *
          - * The following members may have allocated storage attached that should be
          - * cleaned up before the structure is discarded: palette, trans, text,
          - * pcal_purpose, pcal_units, pcal_params, hist, iccp_name, iccp_profile,
          - * splt_palettes, scal_unit, row_pointers, and unknowns.   By default, these
          - * are automatically freed when the info structure is deallocated, if they were
          - * allocated internally by libpng.  This behavior can be changed by means
          - * of the png_data_freer() function.
          + * png_info is a modifiable description of a PNG datastream.  The fields inside
          + * this structure are accessed through png_get_() functions and modified
          + * using png_set_() functions.
            *
          - * More allocation details: all the chunk-reading functions that
          - * change these members go through the corresponding png_set_*
          - * functions.  A function to clear these members is available: see
          - * png_free_data().  The png_set_* functions do not depend on being
          - * able to point info structure members to any of the storage they are
          - * passed (they make their own copies), EXCEPT that the png_set_text
          - * functions use the same storage passed to them in the text_ptr or
          - * itxt_ptr structure argument, and the png_set_rows and png_set_unknowns
          - * functions do not make their own copies.
          + * Some functions in libpng do directly access members of png_info.  However,
          + * this should be avoided.  png_struct objects contain members which hold
          + * caches, sometimes optimised, of the values from png_info objects, and
          + * png_info is not passed to the functions which read and write image data.
            */
           #ifndef PNGINFO_H
           #define PNGINFO_H
          diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/pnglibconf.h b/src/java.desktop/share/native/libsplashscreen/libpng/pnglibconf.h
          index 906f855db0e5..4cfae4747511 100644
          --- a/src/java.desktop/share/native/libsplashscreen/libpng/pnglibconf.h
          +++ b/src/java.desktop/share/native/libsplashscreen/libpng/pnglibconf.h
          @@ -31,7 +31,7 @@
            * However, the following notice accompanied the original version of this
            * file and, per its terms, should not be removed:
            */
          -/* libpng version 1.6.47 */
          +/* libpng version 1.6.51 */
           
           /* Copyright (c) 2018-2025 Cosmin Truta */
           /* Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson */
          diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/pngmem.c b/src/java.desktop/share/native/libsplashscreen/libpng/pngmem.c
          index ba9eb4df402b..12b71bcbc023 100644
          --- a/src/java.desktop/share/native/libsplashscreen/libpng/pngmem.c
          +++ b/src/java.desktop/share/native/libsplashscreen/libpng/pngmem.c
          @@ -29,7 +29,7 @@
            * However, the following notice accompanied the original version of this
            * file and, per its terms, should not be removed:
            *
          - * Copyright (c) 2018 Cosmin Truta
          + * Copyright (c) 2018-2025 Cosmin Truta
            * Copyright (c) 1998-2002,2004,2006-2014,2016 Glenn Randers-Pehrson
            * Copyright (c) 1996-1997 Andreas Dilger
            * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
          diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/pngpread.c b/src/java.desktop/share/native/libsplashscreen/libpng/pngpread.c
          index 86d0c7aaa644..3bfa913000fa 100644
          --- a/src/java.desktop/share/native/libsplashscreen/libpng/pngpread.c
          +++ b/src/java.desktop/share/native/libsplashscreen/libpng/pngpread.c
          @@ -29,7 +29,7 @@
            * However, the following notice accompanied the original version of this
            * file and, per its terms, should not be removed:
            *
          - * Copyright (c) 2018-2024 Cosmin Truta
          + * Copyright (c) 2018-2025 Cosmin Truta
            * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
            * Copyright (c) 1996-1997 Andreas Dilger
            * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
          @@ -258,6 +258,14 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr)
                    png_benign_error(png_ptr, "Too many IDATs found");
              }
           
          +   else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
          +   {
          +      /* These flags must be set consistently for all non-IDAT chunks,
          +       * including the unknown chunks.
          +       */
          +      png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT | PNG_AFTER_IDAT;
          +   }
          +
              if (chunk_name == png_IHDR)
              {
                 if (png_ptr->push_length != 13)
          diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/pngpriv.h b/src/java.desktop/share/native/libsplashscreen/libpng/pngpriv.h
          index 25bac4b9e69b..dcd005efb345 100644
          --- a/src/java.desktop/share/native/libsplashscreen/libpng/pngpriv.h
          +++ b/src/java.desktop/share/native/libsplashscreen/libpng/pngpriv.h
          @@ -29,7 +29,7 @@
            * However, the following notice accompanied the original version of this
            * file and, per its terms, should not be removed:
            *
          - * Copyright (c) 2018-2024 Cosmin Truta
          + * Copyright (c) 2018-2025 Cosmin Truta
            * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
            * Copyright (c) 1996-1997 Andreas Dilger
            * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
          @@ -48,8 +48,20 @@
            * they should be well aware of the issues that may arise from doing so.
            */
           
          +
          +/* pngpriv.h must be included first in each translation unit inside libpng.
          + * On the other hand, it must not be included at all, directly or indirectly,
          + * by any application code that uses the libpng API.
          + */
           #ifndef PNGPRIV_H
          -#define PNGPRIV_H
          +#  define PNGPRIV_H
          +#else
          +#  error Duplicate inclusion of pngpriv.h; please check the libpng source files
          +#endif
          +
          +#if defined(PNG_H) || defined(PNGCONF_H) || defined(PNGLCONF_H)
          +#  error This file must not be included by applications; please include 
          +#endif
           
           /* Feature Test Macros.  The following are defined here to ensure that correctly
            * implemented libraries reveal the APIs libpng needs to build and hide those
          @@ -86,7 +98,6 @@
            */
           #if defined(HAVE_CONFIG_H) && !defined(PNG_NO_CONFIG_H)
           #  include 
          -
              /* Pick up the definition of 'restrict' from config.h if it was read: */
           #  define PNG_RESTRICT restrict
           #endif
          @@ -96,9 +107,7 @@
            * are not internal definitions may be required.  This is handled below just
            * before png.h is included, but load the configuration now if it is available.
            */
          -#ifndef PNGLCONF_H
          -#  include "pnglibconf.h"
          -#endif
          +#include "pnglibconf.h"
           
           /* Local renames may change non-exported API functions from png.h */
           #if defined(PNG_PREFIX) && !defined(PNGPREFIX_H)
          @@ -163,6 +172,20 @@
           #  endif
           #endif
           
          +#ifndef PNG_RISCV_RVV_OPT
          +   /* RISCV_RVV optimizations are being controlled by the compiler settings,
          +    * typically the target compiler will define __riscv but the rvv extension
          +    * availability has to be explicitly stated. This is why if no
          +    * PNG_RISCV_RVV_OPT was defined then a runtime check will be executed.
          +    *
          +    * To enable RISCV_RVV optimizations unconditionally, and compile the
          +    * associated code, pass --enable-riscv-rvv=yes or --enable-riscv-rvv=on
          +    * to configure or put -DPNG_RISCV_RVV_OPT=2 in CPPFLAGS.
          +    */
          +
          +#  define PNG_RISCV_RVV_OPT 0
          +#endif
          +
           #if PNG_ARM_NEON_OPT > 0
              /* NEON optimizations are to be at least considered by libpng, so enable the
               * callbacks to do this.
          @@ -308,6 +331,16 @@
           #   define PNG_LOONGARCH_LSX_IMPLEMENTATION 0
           #endif
           
          +#if PNG_RISCV_RVV_OPT > 0 && __riscv_v >= 1000000
          +#  define PNG_FILTER_OPTIMIZATIONS png_init_filter_functions_rvv
          +#  ifndef PNG_RISCV_RVV_IMPLEMENTATION
          +      /* Use the intrinsics code by default. */
          +#     define PNG_RISCV_RVV_IMPLEMENTATION 1
          +#  endif
          +#else
          +#  define PNG_RISCV_RVV_IMPLEMENTATION 0
          +#endif /* PNG_RISCV_RVV_OPT > 0 && __riscv_v >= 1000000 */
          +
           /* Is this a build of a DLL where compilation of the object modules requires
            * different preprocessor settings to those required for a simple library?  If
            * so PNG_BUILD_DLL must be set.
          @@ -706,7 +739,7 @@
           /* #define PNG_FLAG_KEEP_UNKNOWN_CHUNKS      0x8000U */
           /* #define PNG_FLAG_KEEP_UNSAFE_CHUNKS      0x10000U */
           #define PNG_FLAG_LIBRARY_MISMATCH        0x20000U
          -#define PNG_FLAG_STRIP_ERROR_NUMBERS     0x40000U
          +                                  /*     0x40000U    unused */
           #define PNG_FLAG_STRIP_ERROR_TEXT        0x80000U
           #define PNG_FLAG_BENIGN_ERRORS_WARN     0x100000U /* Added to libpng-1.4.0 */
           #define PNG_FLAG_APP_WARNINGS_WARN      0x200000U /* Added to libpng-1.6.0 */
          @@ -1020,17 +1053,15 @@
            * must match that used in the build, or we must be using pnglibconf.h.prebuilt:
            */
           #if PNG_ZLIB_VERNUM != 0 && PNG_ZLIB_VERNUM != ZLIB_VERNUM
          -#  error ZLIB_VERNUM != PNG_ZLIB_VERNUM \
          -      "-I (include path) error: see the notes in pngpriv.h"
          -   /* This means that when pnglibconf.h was built the copy of zlib.h that it
          -    * used is not the same as the one being used here.  Because the build of
          -    * libpng makes decisions to use inflateInit2 and inflateReset2 based on the
          -    * zlib version number and because this affects handling of certain broken
          -    * PNG files the -I directives must match.
          +#  error The include path of  is incorrect
          +   /* When pnglibconf.h was built, the copy of zlib.h that it used was not the
          +    * same as the one being used here.  Considering how libpng makes decisions
          +    * to use the zlib API based on the zlib version number, the -I options must
          +    * match.
               *
          -    * The most likely explanation is that you passed a -I in CFLAGS. This will
          -    * not work; all the preprocessor directives and in particular all the -I
          -    * directives must be in CPPFLAGS.
          +    * A possible cause of this mismatch is that you passed an -I option in
          +    * CFLAGS, which is unlikely to work.  All the preprocessor options, and all
          +    * the -I options in particular, should be in CPPFLAGS.
               */
           #endif
           
          @@ -1544,6 +1575,23 @@ PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth4_lsx,(png_row_infop
               row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
           #endif
           
          +#if PNG_RISCV_RVV_IMPLEMENTATION == 1
          +PNG_INTERNAL_FUNCTION(void,png_read_filter_row_up_rvv,(png_row_infop
          +    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
          +PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub3_rvv,(png_row_infop
          +    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
          +PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub4_rvv,(png_row_infop
          +    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
          +PNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg3_rvv,(png_row_infop
          +    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
          +PNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg4_rvv,(png_row_infop
          +    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
          +PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth3_rvv,(png_row_infop
          +    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
          +PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth4_rvv,(png_row_infop
          +    row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
          +#endif
          +
           /* Choose the best filter to use and filter the row data */
           PNG_INTERNAL_FUNCTION(void,png_write_find_filter,(png_structrp png_ptr,
               png_row_infop row_info),PNG_EMPTY);
          @@ -2156,6 +2204,11 @@ PNG_INTERNAL_FUNCTION(void, png_init_filter_functions_lsx,
               (png_structp png_ptr, unsigned int bpp), PNG_EMPTY);
           #endif
           
          +#  if PNG_RISCV_RVV_IMPLEMENTATION == 1
          +PNG_INTERNAL_FUNCTION(void, png_init_filter_functions_rvv,
          +   (png_structp png_ptr, unsigned int bpp), PNG_EMPTY);
          +#endif
          +
           PNG_INTERNAL_FUNCTION(png_uint_32, png_check_keyword, (png_structrp png_ptr,
              png_const_charp key, png_bytep new_key), PNG_EMPTY);
           
          @@ -2191,4 +2244,3 @@ PNG_INTERNAL_FUNCTION(int,
           #endif
           
           #endif /* PNG_VERSION_INFO_ONLY */
          -#endif /* PNGPRIV_H */
          diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/pngread.c b/src/java.desktop/share/native/libsplashscreen/libpng/pngread.c
          index 8a6381e1b3e9..b53668a09ce0 100644
          --- a/src/java.desktop/share/native/libsplashscreen/libpng/pngread.c
          +++ b/src/java.desktop/share/native/libsplashscreen/libpng/pngread.c
          @@ -731,7 +731,12 @@ png_read_end(png_structrp png_ptr, png_inforp info_ptr)
                 png_uint_32 chunk_name = png_ptr->chunk_name;
           
                 if (chunk_name != png_IDAT)
          -         png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
          +      {
          +         /* These flags must be set consistently for all non-IDAT chunks,
          +          * including the unknown chunks.
          +          */
          +         png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT | PNG_AFTER_IDAT;
          +      }
           
                 if (chunk_name == png_IEND)
                    png_handle_chunk(png_ptr, info_ptr, length);
          @@ -838,7 +843,8 @@ png_read_destroy(png_structrp png_ptr)
           #endif
           
           #if defined(PNG_READ_EXPAND_SUPPORTED) && \
          -    defined(PNG_ARM_NEON_IMPLEMENTATION)
          +    (defined(PNG_ARM_NEON_IMPLEMENTATION) || \
          +     defined(PNG_RISCV_RVV_IMPLEMENTATION))
              png_free(png_ptr, png_ptr->riffled_palette);
              png_ptr->riffled_palette = NULL;
           #endif
          @@ -1357,7 +1363,7 @@ png_image_read_header(png_voidp argument)
           
           #ifdef PNG_STDIO_SUPPORTED
           int PNGAPI
          -png_image_begin_read_from_stdio(png_imagep image, FILE* file)
          +png_image_begin_read_from_stdio(png_imagep image, FILE *file)
           {
              if (image != NULL && image->version == PNG_IMAGE_VERSION)
              {
          @@ -3152,6 +3158,54 @@ png_image_read_colormapped(png_voidp argument)
              }
           }
           
          +/* Row reading for interlaced 16-to-8 bit depth conversion with local buffer. */
          +static int
          +png_image_read_direct_scaled(png_voidp argument)
          +{
          +   png_image_read_control *display = png_voidcast(png_image_read_control*,
          +       argument);
          +   png_imagep image = display->image;
          +   png_structrp png_ptr = image->opaque->png_ptr;
          +   png_bytep local_row = png_voidcast(png_bytep, display->local_row);
          +   png_bytep first_row = png_voidcast(png_bytep, display->first_row);
          +   ptrdiff_t row_bytes = display->row_bytes;
          +   int passes;
          +
          +   /* Handle interlacing. */
          +   switch (png_ptr->interlaced)
          +   {
          +      case PNG_INTERLACE_NONE:
          +         passes = 1;
          +         break;
          +
          +      case PNG_INTERLACE_ADAM7:
          +         passes = PNG_INTERLACE_ADAM7_PASSES;
          +         break;
          +
          +      default:
          +         png_error(png_ptr, "unknown interlace type");
          +   }
          +
          +   /* Read each pass using local_row as intermediate buffer. */
          +   while (--passes >= 0)
          +   {
          +      png_uint_32 y = image->height;
          +      png_bytep output_row = first_row;
          +
          +      for (; y > 0; --y)
          +      {
          +         /* Read into local_row (gets transformed 8-bit data). */
          +         png_read_row(png_ptr, local_row, NULL);
          +
          +         /* Copy from local_row to user buffer. */
          +         memcpy(output_row, local_row, (size_t)row_bytes);
          +         output_row += row_bytes;
          +      }
          +   }
          +
          +   return 1;
          +}
          +
           /* Just the row reading part of png_image_read. */
           static int
           png_image_read_composite(png_voidp argument)
          @@ -3570,6 +3624,7 @@ png_image_read_direct(png_voidp argument)
              int linear = (format & PNG_FORMAT_FLAG_LINEAR) != 0;
              int do_local_compose = 0;
              int do_local_background = 0; /* to avoid double gamma correction bug */
          +   int do_local_scale = 0; /* for interlaced 16-to-8 bit conversion */
              int passes = 0;
           
              /* Add transforms to ensure the correct output format is produced then check
          @@ -3703,8 +3758,16 @@ png_image_read_direct(png_voidp argument)
                       png_set_expand_16(png_ptr);
           
                    else /* 8-bit output */
          +         {
                       png_set_scale_16(png_ptr);
           
          +            /* For interlaced images, use local_row buffer to avoid overflow
          +             * in png_combine_row() which writes using IHDR bit-depth.
          +             */
          +            if (png_ptr->interlaced != 0)
          +               do_local_scale = 1;
          +         }
          +
                    change &= ~PNG_FORMAT_FLAG_LINEAR;
                 }
           
          @@ -3980,6 +4043,24 @@ png_image_read_direct(png_voidp argument)
                 return result;
              }
           
          +   else if (do_local_scale != 0)
          +   {
          +      /* For interlaced 16-to-8 conversion, use an intermediate row buffer
          +       * to avoid buffer overflows in png_combine_row. The local_row is sized
          +       * for the transformed (8-bit) output, preventing the overflow that would
          +       * occur if png_combine_row wrote 16-bit data directly to the user buffer.
          +       */
          +      int result;
          +      png_voidp row = png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr));
          +
          +      display->local_row = row;
          +      result = png_safe_execute(image, png_image_read_direct_scaled, display);
          +      display->local_row = NULL;
          +      png_free(png_ptr, row);
          +
          +      return result;
          +   }
          +
              else
              {
                 png_alloc_size_t row_bytes = (png_alloc_size_t)display->row_bytes;
          diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/pngrio.c b/src/java.desktop/share/native/libsplashscreen/libpng/pngrio.c
          index 961d010df427..50a424d0912b 100644
          --- a/src/java.desktop/share/native/libsplashscreen/libpng/pngrio.c
          +++ b/src/java.desktop/share/native/libsplashscreen/libpng/pngrio.c
          @@ -29,7 +29,7 @@
            * However, the following notice accompanied the original version of this
            * file and, per its terms, should not be removed:
            *
          - * Copyright (c) 2018 Cosmin Truta
          + * Copyright (c) 2018-2025 Cosmin Truta
            * Copyright (c) 1998-2002,2004,2006-2016,2018 Glenn Randers-Pehrson
            * Copyright (c) 1996-1997 Andreas Dilger
            * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
          @@ -85,7 +85,7 @@ png_default_read_data(png_structp png_ptr, png_bytep data, size_t length)
              /* fread() returns 0 on error, so it is OK to store this in a size_t
               * instead of an int, which is what fread() actually returns.
               */
          -   check = fread(data, 1, length, png_voidcast(png_FILE_p, png_ptr->io_ptr));
          +   check = fread(data, 1, length, png_voidcast(FILE *, png_ptr->io_ptr));
           
              if (check != length)
                 png_error(png_ptr, "Read Error");
          diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/pngrtran.c b/src/java.desktop/share/native/libsplashscreen/libpng/pngrtran.c
          index 4f31f8f07bc5..a19615f49fe7 100644
          --- a/src/java.desktop/share/native/libsplashscreen/libpng/pngrtran.c
          +++ b/src/java.desktop/share/native/libsplashscreen/libpng/pngrtran.c
          @@ -29,7 +29,7 @@
            * However, the following notice accompanied the original version of this
            * file and, per its terms, should not be removed:
            *
          - * Copyright (c) 2018-2024 Cosmin Truta
          + * Copyright (c) 2018-2025 Cosmin Truta
            * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
            * Copyright (c) 1996-1997 Andreas Dilger
            * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
          @@ -57,6 +57,12 @@
           #  endif
           #endif
           
          +#ifdef PNG_RISCV_RVV_IMPLEMENTATION
          +#  if PNG_RISCV_RVV_IMPLEMENTATION == 1
          +#    define PNG_RISCV_RVV_INTRINSICS_AVAILABLE
          +#  endif
          +#endif
          +
           #ifdef PNG_READ_SUPPORTED
           
           /* Set the action on getting a CRC error for an ancillary or critical chunk. */
          @@ -524,9 +530,19 @@ png_set_quantize(png_structrp png_ptr, png_colorp palette,
              {
                 int i;
           
          +      /* Initialize the array to index colors.
          +       *
          +       * Ensure quantize_index can fit 256 elements (PNG_MAX_PALETTE_LENGTH)
          +       * rather than num_palette elements. This is to prevent buffer overflows
          +       * caused by malformed PNG files with out-of-range palette indices.
          +       *
          +       * Be careful to avoid leaking memory. Applications are allowed to call
          +       * this function more than once per png_struct.
          +       */
          +      png_free(png_ptr, png_ptr->quantize_index);
                 png_ptr->quantize_index = (png_bytep)png_malloc(png_ptr,
          -          (png_alloc_size_t)num_palette);
          -      for (i = 0; i < num_palette; i++)
          +          PNG_MAX_PALETTE_LENGTH);
          +      for (i = 0; i < PNG_MAX_PALETTE_LENGTH; i++)
                    png_ptr->quantize_index[i] = (png_byte)i;
              }
           
          @@ -538,15 +554,14 @@ png_set_quantize(png_structrp png_ptr, png_colorp palette,
                     * Perhaps not the best solution, but good enough.
                     */
           
          -         int i;
          +         png_bytep quantize_sort;
          +         int i, j;
           
          -         /* Initialize an array to sort colors */
          -         png_ptr->quantize_sort = (png_bytep)png_malloc(png_ptr,
          +         /* Initialize the local array to sort colors. */
          +         quantize_sort = (png_bytep)png_malloc(png_ptr,
                        (png_alloc_size_t)num_palette);
          -
          -         /* Initialize the quantize_sort array */
                    for (i = 0; i < num_palette; i++)
          -            png_ptr->quantize_sort[i] = (png_byte)i;
          +            quantize_sort[i] = (png_byte)i;
           
                    /* Find the least used palette entries by starting a
                     * bubble sort, and running it until we have sorted
          @@ -558,19 +573,18 @@ png_set_quantize(png_structrp png_ptr, png_colorp palette,
                    for (i = num_palette - 1; i >= maximum_colors; i--)
                    {
                       int done; /* To stop early if the list is pre-sorted */
          -            int j;
           
                       done = 1;
                       for (j = 0; j < i; j++)
                       {
          -               if (histogram[png_ptr->quantize_sort[j]]
          -                   < histogram[png_ptr->quantize_sort[j + 1]])
          +               if (histogram[quantize_sort[j]]
          +                   < histogram[quantize_sort[j + 1]])
                          {
                             png_byte t;
           
          -                  t = png_ptr->quantize_sort[j];
          -                  png_ptr->quantize_sort[j] = png_ptr->quantize_sort[j + 1];
          -                  png_ptr->quantize_sort[j + 1] = t;
          +                  t = quantize_sort[j];
          +                  quantize_sort[j] = quantize_sort[j + 1];
          +                  quantize_sort[j + 1] = t;
                             done = 0;
                          }
                       }
          @@ -582,18 +596,18 @@ png_set_quantize(png_structrp png_ptr, png_colorp palette,
                    /* Swap the palette around, and set up a table, if necessary */
                    if (full_quantize != 0)
                    {
          -            int j = num_palette;
          +            j = num_palette;
           
                       /* Put all the useful colors within the max, but don't
                        * move the others.
                        */
                       for (i = 0; i < maximum_colors; i++)
                       {
          -               if ((int)png_ptr->quantize_sort[i] >= maximum_colors)
          +               if ((int)quantize_sort[i] >= maximum_colors)
                          {
                             do
                                j--;
          -                  while ((int)png_ptr->quantize_sort[j] >= maximum_colors);
          +                  while ((int)quantize_sort[j] >= maximum_colors);
           
                             palette[i] = palette[j];
                          }
          @@ -601,7 +615,7 @@ png_set_quantize(png_structrp png_ptr, png_colorp palette,
                    }
                    else
                    {
          -            int j = num_palette;
          +            j = num_palette;
           
                       /* Move all the used colors inside the max limit, and
                        * develop a translation table.
          @@ -609,13 +623,13 @@ png_set_quantize(png_structrp png_ptr, png_colorp palette,
                       for (i = 0; i < maximum_colors; i++)
                       {
                          /* Only move the colors we need to */
          -               if ((int)png_ptr->quantize_sort[i] >= maximum_colors)
          +               if ((int)quantize_sort[i] >= maximum_colors)
                          {
                             png_color tmp_color;
           
                             do
                                j--;
          -                  while ((int)png_ptr->quantize_sort[j] >= maximum_colors);
          +                  while ((int)quantize_sort[j] >= maximum_colors);
           
                             tmp_color = palette[j];
                             palette[j] = palette[i];
          @@ -653,8 +667,7 @@ png_set_quantize(png_structrp png_ptr, png_colorp palette,
                          }
                       }
                    }
          -         png_free(png_ptr, png_ptr->quantize_sort);
          -         png_ptr->quantize_sort = NULL;
          +         png_free(png_ptr, quantize_sort);
                 }
                 else
                 {
          @@ -1797,19 +1810,51 @@ png_init_read_transformations(png_structrp png_ptr)
                             }
                             else /* if (png_ptr->trans_alpha[i] != 0xff) */
                             {
          -                     png_byte v, w;
          -
          -                     v = png_ptr->gamma_to_1[palette[i].red];
          -                     png_composite(w, v, png_ptr->trans_alpha[i], back_1.red);
          -                     palette[i].red = png_ptr->gamma_from_1[w];
          -
          -                     v = png_ptr->gamma_to_1[palette[i].green];
          -                     png_composite(w, v, png_ptr->trans_alpha[i], back_1.green);
          -                     palette[i].green = png_ptr->gamma_from_1[w];
          -
          -                     v = png_ptr->gamma_to_1[palette[i].blue];
          -                     png_composite(w, v, png_ptr->trans_alpha[i], back_1.blue);
          -                     palette[i].blue = png_ptr->gamma_from_1[w];
          +                     if ((png_ptr->flags & PNG_FLAG_OPTIMIZE_ALPHA) != 0)
          +                     {
          +                        /* Premultiply only:
          +                         * component = round((component * alpha) / 255)
          +                         */
          +                        png_uint_32 component;
          +
          +                        component = png_ptr->gamma_to_1[palette[i].red];
          +                        component =
          +                            (component * png_ptr->trans_alpha[i] + 128) / 255;
          +                        palette[i].red = png_ptr->gamma_from_1[component];
          +
          +                        component = png_ptr->gamma_to_1[palette[i].green];
          +                        component =
          +                            (component * png_ptr->trans_alpha[i] + 128) / 255;
          +                        palette[i].green = png_ptr->gamma_from_1[component];
          +
          +                        component = png_ptr->gamma_to_1[palette[i].blue];
          +                        component =
          +                            (component * png_ptr->trans_alpha[i] + 128) / 255;
          +                        palette[i].blue = png_ptr->gamma_from_1[component];
          +                     }
          +                     else
          +                     {
          +                        /* Composite with background color:
          +                         * component =
          +                         *    alpha * component + (1 - alpha) * background
          +                         */
          +                        png_byte v, w;
          +
          +                        v = png_ptr->gamma_to_1[palette[i].red];
          +                        png_composite(w, v,
          +                            png_ptr->trans_alpha[i], back_1.red);
          +                        palette[i].red = png_ptr->gamma_from_1[w];
          +
          +                        v = png_ptr->gamma_to_1[palette[i].green];
          +                        png_composite(w, v,
          +                            png_ptr->trans_alpha[i], back_1.green);
          +                        palette[i].green = png_ptr->gamma_from_1[w];
          +
          +                        v = png_ptr->gamma_to_1[palette[i].blue];
          +                        png_composite(w, v,
          +                            png_ptr->trans_alpha[i], back_1.blue);
          +                        palette[i].blue = png_ptr->gamma_from_1[w];
          +                     }
                             }
                          }
                          else
          @@ -5032,13 +5077,8 @@ png_do_read_transformations(png_structrp png_ptr, png_row_infop row_info)
           
           #ifdef PNG_READ_QUANTIZE_SUPPORTED
              if ((png_ptr->transformations & PNG_QUANTIZE) != 0)
          -   {
                 png_do_quantize(row_info, png_ptr->row_buf + 1,
                     png_ptr->palette_lookup, png_ptr->quantize_index);
          -
          -      if (row_info->rowbytes == 0)
          -         png_error(png_ptr, "png_do_quantize returned rowbytes=0");
          -   }
           #endif /* READ_QUANTIZE */
           
           #ifdef PNG_READ_EXPAND_16_SUPPORTED
          diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/pngrutil.c b/src/java.desktop/share/native/libsplashscreen/libpng/pngrutil.c
          index 6cf466d182ab..07d53cb2c763 100644
          --- a/src/java.desktop/share/native/libsplashscreen/libpng/pngrutil.c
          +++ b/src/java.desktop/share/native/libsplashscreen/libpng/pngrutil.c
          @@ -29,7 +29,7 @@
            * However, the following notice accompanied the original version of this
            * file and, per its terms, should not be removed:
            *
          - * Copyright (c) 2018-2024 Cosmin Truta
          + * Copyright (c) 2018-2025 Cosmin Truta
            * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
            * Copyright (c) 1996-1997 Andreas Dilger
            * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
          @@ -2441,10 +2441,6 @@ png_handle_tEXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
              }
           #endif
           
          -   /* TODO: this doesn't work and shouldn't be necessary. */
          -   if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
          -      png_ptr->mode |= PNG_AFTER_IDAT;
          -
              buffer = png_read_buffer(png_ptr, length+1);
           
              if (buffer == NULL)
          @@ -2515,10 +2511,6 @@ png_handle_zTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
              }
           #endif
           
          -   /* TODO: should not be necessary. */
          -   if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
          -      png_ptr->mode |= PNG_AFTER_IDAT;
          -
              /* Note, "length" is sufficient here; we won't be adding
               * a null terminator later.  The limit check in png_handle_chunk should be
               * sufficient.
          @@ -2635,10 +2627,6 @@ png_handle_iTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
              }
           #endif
           
          -   /* TODO: should not be necessary. */
          -   if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
          -      png_ptr->mode |= PNG_AFTER_IDAT;
          -
              buffer = png_read_buffer(png_ptr, length+1);
           
              if (buffer == NULL)
          diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/pngset.c b/src/java.desktop/share/native/libsplashscreen/libpng/pngset.c
          index 1bfd292bd463..0b2844f18645 100644
          --- a/src/java.desktop/share/native/libsplashscreen/libpng/pngset.c
          +++ b/src/java.desktop/share/native/libsplashscreen/libpng/pngset.c
          @@ -329,17 +329,14 @@ png_set_mDCV(png_const_structrp png_ptr, png_inforp info_ptr,
               double maxDL, double minDL)
           {
              png_set_mDCV_fixed(png_ptr, info_ptr,
          -      /* The ITU approach is to scale by 50,000, not 100,000 so just divide
          -       * the input values by 2 and use png_fixed:
          -       */
          -      png_fixed(png_ptr, white_x / 2, "png_set_mDCV(white(x))"),
          -      png_fixed(png_ptr, white_y / 2, "png_set_mDCV(white(y))"),
          -      png_fixed(png_ptr, red_x / 2, "png_set_mDCV(red(x))"),
          -      png_fixed(png_ptr, red_y / 2, "png_set_mDCV(red(y))"),
          -      png_fixed(png_ptr, green_x / 2, "png_set_mDCV(green(x))"),
          -      png_fixed(png_ptr, green_y / 2, "png_set_mDCV(green(y))"),
          -      png_fixed(png_ptr, blue_x / 2, "png_set_mDCV(blue(x))"),
          -      png_fixed(png_ptr, blue_y / 2, "png_set_mDCV(blue(y))"),
          +      png_fixed(png_ptr, white_x, "png_set_mDCV(white(x))"),
          +      png_fixed(png_ptr, white_y, "png_set_mDCV(white(y))"),
          +      png_fixed(png_ptr, red_x, "png_set_mDCV(red(x))"),
          +      png_fixed(png_ptr, red_y, "png_set_mDCV(red(y))"),
          +      png_fixed(png_ptr, green_x, "png_set_mDCV(green(x))"),
          +      png_fixed(png_ptr, green_y, "png_set_mDCV(green(y))"),
          +      png_fixed(png_ptr, blue_x, "png_set_mDCV(blue(x))"),
          +      png_fixed(png_ptr, blue_y, "png_set_mDCV(blue(y))"),
                 png_fixed_ITU(png_ptr, maxDL, "png_set_mDCV(maxDL)"),
                 png_fixed_ITU(png_ptr, minDL, "png_set_mDCV(minDL)"));
           }
          diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/pngstruct.h b/src/java.desktop/share/native/libsplashscreen/libpng/pngstruct.h
          index d6c446564d12..8edb4bc393a6 100644
          --- a/src/java.desktop/share/native/libsplashscreen/libpng/pngstruct.h
          +++ b/src/java.desktop/share/native/libsplashscreen/libpng/pngstruct.h
          @@ -22,14 +22,14 @@
            * questions.
            */
           
          -/* pngstruct.h - header file for PNG reference library
          +/* pngstruct.h - internal structures for libpng
            *
            * This file is available under and governed by the GNU General Public
            * License version 2 only, as published by the Free Software Foundation.
            * However, the following notice accompanied the original version of this
            * file and, per its terms, should not be removed:
            *
          - * Copyright (c) 2018-2022 Cosmin Truta
          + * Copyright (c) 2018-2025 Cosmin Truta
            * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
            * Copyright (c) 1996-1997 Andreas Dilger
            * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
          @@ -39,11 +39,9 @@
            * and license in png.h
            */
           
          -/* The structure that holds the information to read and write PNG files.
          - * The only people who need to care about what is inside of this are the
          - * people who will be modifying the library for their own special needs.
          - * It should NOT be accessed directly by an application.
          - */
          +#ifndef PNGPRIV_H
          +#  error This file must not be included by applications; please include 
          +#endif
           
           #ifndef PNGSTRUCT_H
           #define PNGSTRUCT_H
          @@ -406,7 +404,8 @@ struct png_struct_def
           
           /* New member added in libpng-1.6.36 */
           #if defined(PNG_READ_EXPAND_SUPPORTED) && \
          -    defined(PNG_ARM_NEON_IMPLEMENTATION)
          +    (defined(PNG_ARM_NEON_IMPLEMENTATION) || \
          +     defined(PNG_RISCV_RVV_IMPLEMENTATION))
              png_bytep riffled_palette; /* buffer for accelerated palette expansion */
           #endif
           
          @@ -435,7 +434,6 @@ struct png_struct_def
           
           #ifdef PNG_READ_QUANTIZE_SUPPORTED
           /* The following three members were added at version 1.0.14 and 1.2.4 */
          -   png_bytep quantize_sort;          /* working sort array */
              png_bytep index_to_palette;       /* where the original index currently is
                                                   in the palette */
              png_bytep palette_to_index;       /* which original index points to this
          
          From 3287f807273573d80a5d2152f35b61bd5c7536f8 Mon Sep 17 00:00:00 2001
          From: Francisco Ferrari Bihurriet 
          Date: Thu, 8 Jan 2026 00:53:37 +0100
          Subject: [PATCH 313/323] 8265429: Improve GCM encryption
          
          Backport-of: 1315d641edc5fd7619fed0998cb130cfc8162804
          ---
           .../share/native/libj2pkcs11/p11_crypt.c      | 38 ++++++++++++-------
           1 file changed, 25 insertions(+), 13 deletions(-)
          
          diff --git a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_crypt.c b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_crypt.c
          index d969fabffd0c..052c70118600 100644
          --- a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_crypt.c
          +++ b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_crypt.c
          @@ -1,5 +1,5 @@
           /*
          - * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved.
          + * Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved.
            */
           
           /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
          @@ -184,9 +184,12 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1Encrypt
           
               if (directIn != 0) {
                 inBufP = (CK_BYTE_PTR) jlong_to_ptr(directIn);
          -    } else {
          +    } else if (jIn != NULL) {
                 inBufP = (*env)->GetPrimitiveArrayCritical(env, jIn, NULL);
          +      // may happen if out of memory
                 if (inBufP == NULL) { return 0; }
          +    } else {
          +      inBufP = NULL;
               }
           
               if (directOut != 0) {
          @@ -194,7 +197,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1Encrypt
               } else {
                 outBufP = (*env)->GetPrimitiveArrayCritical(env, jOut, NULL);
                 if (outBufP == NULL) {
          -        if (directIn == 0) {
          +        if (directIn == 0 && inBufP != NULL) {
                     (*env)->ReleasePrimitiveArrayCritical(env, jIn, inBufP, JNI_ABORT);
                   }
                   return 0;
          @@ -208,7 +211,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1Encrypt
                                               (CK_BYTE_PTR)(outBufP + jOutOfs),
                                               &ckEncryptedLen);
           
          -    if (directIn == 0) {
          +    if (directIn == 0 && inBufP != NULL) {
                   (*env)->ReleasePrimitiveArrayCritical(env, jIn, inBufP, JNI_ABORT);
               }
               if (directOut == 0) {
          @@ -251,9 +254,12 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1EncryptUpdate
           
               if (directIn != 0) {
                 inBufP = (CK_BYTE_PTR) jlong_to_ptr(directIn);
          -    } else {
          +    } else if (jIn != NULL) {
                 inBufP = (*env)->GetPrimitiveArrayCritical(env, jIn, NULL);
          +      // may happen if out of memory
                 if (inBufP == NULL) { return 0; }
          +    } else {
          +      inBufP = NULL;
               }
           
               if (directOut != 0) {
          @@ -261,7 +267,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1EncryptUpdate
               } else {
                 outBufP = (*env)->GetPrimitiveArrayCritical(env, jOut, NULL);
                 if (outBufP == NULL) {
          -        if (directIn == 0) {
          +        if (directIn == 0 && inBufP != NULL) {
                     (*env)->ReleasePrimitiveArrayCritical(env, jIn, inBufP, JNI_ABORT);
                   }
                   return 0;
          @@ -275,7 +281,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1EncryptUpdate
                                                     (CK_BYTE_PTR)(outBufP + jOutOfs),
                                                     &ckEncryptedPartLen);
           
          -    if (directIn == 0) {
          +    if (directIn == 0 && inBufP != NULL) {
                   (*env)->ReleasePrimitiveArrayCritical(env, jIn, inBufP, JNI_ABORT);
               }
               if (directOut == 0) {
          @@ -462,9 +468,12 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1Decrypt
           
               if (directIn != 0) {
                 inBufP = (CK_BYTE_PTR) jlong_to_ptr(directIn);
          -    } else {
          +    } else if (jIn != NULL) {
                 inBufP = (*env)->GetPrimitiveArrayCritical(env, jIn, NULL);
          +      // may happen if out of memory
                 if (inBufP == NULL) { return 0; }
          +    } else {
          +      inBufP = NULL;
               }
           
               if (directOut != 0) {
          @@ -472,7 +481,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1Decrypt
               } else {
                 outBufP = (*env)->GetPrimitiveArrayCritical(env, jOut, NULL);
                 if (outBufP == NULL) {
          -        if (directIn == 0) {
          +        if (directIn == 0 && inBufP != NULL) {
                     (*env)->ReleasePrimitiveArrayCritical(env, jIn, inBufP, JNI_ABORT);
                   }
                   return 0;
          @@ -485,7 +494,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1Decrypt
                                               (CK_BYTE_PTR)(outBufP + jOutOfs),
                                               &ckOutLen);
           
          -    if (directIn == 0) {
          +    if (directIn == 0 && inBufP != NULL) {
                   (*env)->ReleasePrimitiveArrayCritical(env, jIn, inBufP, JNI_ABORT);
               }
               if (directOut == 0) {
          @@ -528,9 +537,12 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1DecryptUpdate
           
               if (directIn != 0) {
                 inBufP = (CK_BYTE_PTR) jlong_to_ptr(directIn);
          -    } else {
          +    } else if (jIn != NULL) {
                 inBufP = (*env)->GetPrimitiveArrayCritical(env, jIn, NULL);
          +      // may happen if out of memory
                 if (inBufP == NULL) { return 0; }
          +    } else {
          +      inBufP = NULL;
               }
           
               if (directOut != 0) {
          @@ -538,7 +550,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1DecryptUpdate
               } else {
                 outBufP = (*env)->GetPrimitiveArrayCritical(env, jOut, NULL);
                 if (outBufP == NULL) {
          -        if (directIn == 0) {
          +        if (directIn == 0 && inBufP != NULL) {
                     (*env)->ReleasePrimitiveArrayCritical(env, jIn, inBufP, JNI_ABORT);
                   }
                   return 0;
          @@ -551,7 +563,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1DecryptUpdate
                                                     (CK_BYTE_PTR)(outBufP + jOutOfs),
                                                     &ckDecryptedPartLen);
           
          -    if (directIn == 0) {
          +    if (directIn == 0 && inBufP != NULL) {
                   (*env)->ReleasePrimitiveArrayCritical(env, jIn, inBufP, JNI_ABORT);
               }
               if (directOut == 0) {
          
          From 5a25cf943a54df7aed1f48f26b07db5d157c5583 Mon Sep 17 00:00:00 2001
          From: Francisco Ferrari Bihurriet 
          Date: Mon, 22 Dec 2025 20:51:50 -0300
          Subject: [PATCH 314/323] 8341496: Improve JMX connections
          
          Backport-of: 76c1173ff5780b18cdb9ba3a519ee83abf651a3a
          ---
           .../javax/rmi/ssl/SslRMIClientSocketFactory.java    | 13 ++++++++++++-
           .../jdk/javax/management/security/SecurityTest.java |  2 ++
           test/jdk/javax/rmi/ssl/SSLSocketParametersTest.java |  5 +++--
           .../bootstrap/JMXInterfaceBindingTest.java          |  2 ++
           .../jmxremote/bootstrap/RmiBootstrapTest.java       |  3 ++-
           .../jmxremote/bootstrap/RmiRegistrySslTest.java     |  1 +
           6 files changed, 22 insertions(+), 4 deletions(-)
          
          diff --git a/src/java.rmi/share/classes/javax/rmi/ssl/SslRMIClientSocketFactory.java b/src/java.rmi/share/classes/javax/rmi/ssl/SslRMIClientSocketFactory.java
          index ab6664b9d8fd..a4475c8bd1e5 100644
          --- a/src/java.rmi/share/classes/javax/rmi/ssl/SslRMIClientSocketFactory.java
          +++ b/src/java.rmi/share/classes/javax/rmi/ssl/SslRMIClientSocketFactory.java
          @@ -1,5 +1,5 @@
           /*
          - * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved.
          + * Copyright (c) 2003, 2025, 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
          @@ -31,6 +31,7 @@
           import java.rmi.server.RMIClientSocketFactory;
           import java.util.StringTokenizer;
           import javax.net.SocketFactory;
          +import javax.net.ssl.SSLParameters;
           import javax.net.ssl.SSLSocket;
           import javax.net.ssl.SSLSocketFactory;
           
          @@ -119,6 +120,16 @@ public Socket createSocket(String host, int port) throws IOException {
                   //
                   final SSLSocket sslSocket = (SSLSocket)
                       sslSocketFactory.createSocket(host, port);
          +
          +        if (Boolean.parseBoolean(
          +                System.getProperty("jdk.rmi.ssl.client.enableEndpointIdentification", "true"))) {
          +            SSLParameters params = sslSocket.getSSLParameters();
          +            if (params == null) {
          +                params = new SSLParameters();
          +            }
          +            params.setEndpointIdentificationAlgorithm("HTTPS");
          +            sslSocket.setSSLParameters(params);
          +        }
                   // Set the SSLSocket Enabled Cipher Suites
                   //
                   final String enabledCipherSuites =
          diff --git a/test/jdk/javax/management/security/SecurityTest.java b/test/jdk/javax/management/security/SecurityTest.java
          index 7212aea883fd..b46bbfa759fc 100644
          --- a/test/jdk/javax/management/security/SecurityTest.java
          +++ b/test/jdk/javax/management/security/SecurityTest.java
          @@ -402,6 +402,8 @@ private List buildCommandLine(String args[]) {
                   opts.add(JDKToolFinder.getJDKTool("java"));
                   opts.addAll(Arrays.asList(jdk.test.lib.Utils.getTestJavaOpts()));
           
          +        opts.add("-Djdk.rmi.ssl.client.enableEndpointIdentification=false");
          +
                   // We need to forward some properties to the client side
                   opts.add("-Dtest.src=" + System.getProperty("test.src"));
           
          diff --git a/test/jdk/javax/rmi/ssl/SSLSocketParametersTest.java b/test/jdk/javax/rmi/ssl/SSLSocketParametersTest.java
          index 6da328945875..4aeaf399eedc 100644
          --- a/test/jdk/javax/rmi/ssl/SSLSocketParametersTest.java
          +++ b/test/jdk/javax/rmi/ssl/SSLSocketParametersTest.java
          @@ -1,5 +1,5 @@
           /*
          - * Copyright (c) 2004, 2023, Oracle and/or its affiliates. All rights reserved.
          + * Copyright (c) 2004, 2025, 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
          @@ -134,6 +134,7 @@ public void runTest(int testNumber) throws Exception {
               }
           
               public static void main(String[] args) throws Exception {
          +        System.setProperty("jdk.rmi.ssl.client.enableEndpointIdentification", "false");
                   // Set keystore properties (server-side)
                   //
                   final String keystore = System.getProperty("test.src") +
          @@ -153,4 +154,4 @@ public static void main(String[] args) throws Exception {
                   SSLSocketParametersTest test = new SSLSocketParametersTest();
                   test.runTest(Integer.parseInt(args[0]));
               }
          -}
          \ No newline at end of file
          +}
          diff --git a/test/jdk/sun/management/jmxremote/bootstrap/JMXInterfaceBindingTest.java b/test/jdk/sun/management/jmxremote/bootstrap/JMXInterfaceBindingTest.java
          index 61359084297d..1f4707fab3b8 100644
          --- a/test/jdk/sun/management/jmxremote/bootstrap/JMXInterfaceBindingTest.java
          +++ b/test/jdk/sun/management/jmxremote/bootstrap/JMXInterfaceBindingTest.java
          @@ -1,5 +1,6 @@
           /*
            * Copyright (c) 2015, Red Hat Inc
          + * Copyright (c) 2025, 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
          @@ -205,6 +206,7 @@ private Process createTestProcess() {
                       // This is needed for testing on loopback
                       args.add("-Djava.rmi.server.hostname=" + address);
                       if (useSSL) {
          +                args.add("-Djdk.rmi.ssl.client.enableEndpointIdentification=false");
                           args.add("-Dcom.sun.management.jmxremote.registry.ssl=true");
                           args.add("-Djavax.net.ssl.keyStore=" + KEYSTORE_LOC);
                           args.add("-Djavax.net.ssl.trustStore=" + TRUSTSTORE_LOC);
          diff --git a/test/jdk/sun/management/jmxremote/bootstrap/RmiBootstrapTest.java b/test/jdk/sun/management/jmxremote/bootstrap/RmiBootstrapTest.java
          index 298431db90a1..b62d3f1bbd76 100644
          --- a/test/jdk/sun/management/jmxremote/bootstrap/RmiBootstrapTest.java
          +++ b/test/jdk/sun/management/jmxremote/bootstrap/RmiBootstrapTest.java
          @@ -1,5 +1,5 @@
           /*
          - * Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved.
          + * Copyright (c) 2003, 2025, 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
          @@ -169,6 +169,7 @@ public static void main(String args[]) throws Exception {
                   final List credentialFiles = prepareTestFiles(args[0]);
           
                   Security.setProperty("jdk.tls.disabledAlgorithms", "");
          +        System.setProperty("jdk.rmi.ssl.client.enableEndpointIdentification", "false");
           
                   try {
                       MAX_GET_FREE_PORT_TRIES = Integer.parseInt(System.getProperty("test.getfreeport.max.tries", "10"));
          diff --git a/test/jdk/sun/management/jmxremote/bootstrap/RmiRegistrySslTest.java b/test/jdk/sun/management/jmxremote/bootstrap/RmiRegistrySslTest.java
          index 1aa20937962d..b4ef5e224f8a 100644
          --- a/test/jdk/sun/management/jmxremote/bootstrap/RmiRegistrySslTest.java
          +++ b/test/jdk/sun/management/jmxremote/bootstrap/RmiRegistrySslTest.java
          @@ -179,6 +179,7 @@ private int doTest(String... args) throws Exception {
                       initTestEnvironment();
           
                       List command = new ArrayList<>();
          +            command.add("-Djdk.rmi.ssl.client.enableEndpointIdentification=false");
                       command.add("-Dtest.src=" + TEST_SRC);
                       command.add("-Dtest.rmi.port=" + port);
                       command.addAll(Arrays.asList(args));
          
          From e03f6fa7b6453130450811b15d22ca6b5b300855 Mon Sep 17 00:00:00 2001
          From: Dmitry Markov 
          Date: Fri, 26 Sep 2025 18:42:41 +0000
          Subject: [PATCH 315/323] 8359501: Enhance Handling of URIs
          
          Backport-of: 79283a4b99d7bfff32674b4a29a75f706c9a9ba3
          ---
           .../sun/lwawt/macosx/CDesktopPeer.java        |  57 ++++++--
           .../native/libawt_lwawt/awt/CDesktopPeer.m    | 134 ++++++++++++++----
           .../classes/sun/awt/windows/WDesktopPeer.java |  53 ++++++-
           .../native/libawt/windows/awt_Desktop.cpp     |  49 ++++++-
           test/jdk/java/awt/Desktop/BrowseTest.java     |  26 +++-
           .../EditAndPrintTest/EditAndPrintTest.java    |   2 +-
           6 files changed, 263 insertions(+), 58 deletions(-)
          
          diff --git a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CDesktopPeer.java b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CDesktopPeer.java
          index a4ec07672981..cc0e253f23b5 100644
          --- a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CDesktopPeer.java
          +++ b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CDesktopPeer.java
          @@ -1,5 +1,5 @@
           /*
          - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
          + * Copyright (c) 2011, 2025, 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
          @@ -34,7 +34,10 @@
           import java.io.File;
           import java.io.FileNotFoundException;
           import java.io.IOException;
          +import java.lang.annotation.Native;
           import java.net.URI;
          +import java.nio.file.Files;
          +import java.nio.file.Path;
           
           
           /**
          @@ -44,6 +47,12 @@
            */
           public final class CDesktopPeer implements DesktopPeer {
           
          +    @Native private static final int OPEN = 0;
          +    @Native private static final int BROWSE = 1;
          +    @Native private static final int EDIT = 2;
          +    @Native private static final int PRINT = 3;
          +    @Native private static final int MAIL = 4;
          +
               @Override
               public boolean isSupported(Action action) {
                   return true;
          @@ -51,27 +60,27 @@ public boolean isSupported(Action action) {
           
               @Override
               public void open(File file) throws IOException {
          -        this.lsOpenFile(file, false);
          +        this.lsOpenFile(file, OPEN);
               }
           
               @Override
               public void edit(File file) throws IOException {
          -        this.lsOpenFile(file, false);
          +        this.lsOpenFile(file, EDIT);
               }
           
               @Override
               public void print(File file) throws IOException {
          -        this.lsOpenFile(file, true);
          +        this.lsOpenFile(file, PRINT);
               }
           
               @Override
               public void mail(URI uri) throws IOException {
          -        this.lsOpen(uri);
          +        this.lsOpen(uri, MAIL);
               }
           
               @Override
               public void browse(URI uri) throws IOException {
          -        this.lsOpen(uri);
          +        this.lsOpen(uri, BROWSE);
               }
           
               @Override
          @@ -162,24 +171,44 @@ public boolean moveToTrash(File file) {
                   }
               }
           
          -    private void lsOpen(URI uri) throws IOException {
          -        int status = _lsOpenURI(uri.toString());
          +    private void lsOpen(URI uri, int action) throws IOException {
          +        int status = _lsOpenURI(uri.toString(), action);
           
                   if (status != 0 /* noErr */) {
          -            throw new IOException("Failed to mail or browse " + uri + ". Error code: " + status);
          +            String actionString = (action == MAIL) ? "mail" : "browse";
          +            throw new IOException("Failed to " + actionString + " " + uri
          +                                  + ". Error code: " + status);
                   }
               }
           
          -    private void lsOpenFile(File file, boolean print) throws IOException {
          -        int status = _lsOpenFile(file.getCanonicalPath(), print);
          +    private void lsOpenFile(File file, int action) throws IOException {
          +        int status = -1;
          +        Path tmpFile = null;
          +        String tmpTxtPath = null;
           
          +        try {
          +            if (action == EDIT) {
          +                tmpFile = Files.createTempFile("TmpFile", ".txt");
          +                tmpTxtPath = tmpFile.toAbsolutePath().toString();
          +            }
          +            status = _lsOpenFile(file.getCanonicalPath(), action, tmpTxtPath);
          +        } catch (Exception e) {
          +            throw new IOException("Failed to create tmp file: ", e);
          +        } finally {
          +            if (tmpFile != null) {
          +                Files.deleteIfExists(tmpFile);
          +            }
          +        }
                   if (status != 0 /* noErr */) {
          -            throw new IOException("Failed to open, edit or print " + file + ". Error code: " + status);
          +            String actionString = (action == OPEN) ? "open"
          +                                                   : (action == EDIT) ? "edit" : "print";
          +            throw new IOException("Failed to " + actionString + " " + file
          +                                  + ". Error code: " + status);
                   }
               }
           
          -    private static native int _lsOpenURI(String uri);
          +    private static native int _lsOpenURI(String uri, int action);
           
          -    private static native int _lsOpenFile(String path, boolean print);
          +    private static native int _lsOpenFile(String path, int action, String tmpTxtPath);
           
           }
          diff --git a/src/java.desktop/macosx/native/libawt_lwawt/awt/CDesktopPeer.m b/src/java.desktop/macosx/native/libawt_lwawt/awt/CDesktopPeer.m
          index 7555c7990c41..e1841c9398c6 100644
          --- a/src/java.desktop/macosx/native/libawt_lwawt/awt/CDesktopPeer.m
          +++ b/src/java.desktop/macosx/native/libawt_lwawt/awt/CDesktopPeer.m
          @@ -1,5 +1,5 @@
           /*
          - * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
          + * Copyright (c) 2011, 2025, 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
          @@ -27,27 +27,60 @@
           #import "JNIUtilities.h"
           #import 
           #import 
          +#import "sun_lwawt_macosx_CDesktopPeer.h"
           
           /*
            * Class:     sun_lwawt_macosx_CDesktopPeer
            * Method:    _lsOpenURI
          - * Signature: (Ljava/lang/String;)I;
          + * Signature: (Ljava/lang/String;I)I
            */
           JNIEXPORT jint JNICALL Java_sun_lwawt_macosx_CDesktopPeer__1lsOpenURI
          -(JNIEnv *env, jclass clz, jstring uri)
          +(JNIEnv *env, jclass clz, jstring uri, jint action)
           {
          -    OSStatus status = noErr;
          +    __block OSStatus status = noErr;
           JNI_COCOA_ENTER(env);
           
          -    // I would love to use NSWorkspace here, but it's not thread safe. Why? I don't know.
          -    // So we use LaunchServices directly.
          -
          -    NSURL *url = [NSURL URLWithString:JavaStringToNSString(env, uri)];
          -
          -    LSLaunchFlags flags = kLSLaunchDefaults;
          -
          -    LSApplicationParameters params = {0, flags, NULL, NULL, NULL, NULL, NULL};
          -    status = LSOpenURLsWithRole((CFArrayRef)[NSArray arrayWithObject:url], kLSRolesAll, NULL, ¶ms, NULL, 0);
          +    NSURL *urlToOpen = [NSURL URLWithString:JavaStringToNSString(env, uri)];
          +    NSURL *appURI = nil;
          +
          +    if (action == sun_lwawt_macosx_CDesktopPeer_BROWSE) {
          +        // To get the defaultBrowser
          +        NSURL *httpsURL = [NSURL URLWithString:@"https://"];
          +        NSWorkspace *workspace = [NSWorkspace sharedWorkspace];
          +        appURI = [workspace URLForApplicationToOpenURL:httpsURL];
          +    } else if (action == sun_lwawt_macosx_CDesktopPeer_MAIL) {
          +        // To get the default mailer
          +        NSURL *mailtoURL = [NSURL URLWithString:@"mailto://"];
          +        NSWorkspace *workspace = [NSWorkspace sharedWorkspace];
          +        appURI = [workspace URLForApplicationToOpenURL:mailtoURL];
          +    }
          +
          +    if (appURI == nil) {
          +        return -1;
          +    }
          +
          +    // Prepare NSOpenConfig object
          +    NSArray *urls = @[urlToOpen];
          +    NSWorkspaceOpenConfiguration *configuration = [NSWorkspaceOpenConfiguration configuration];
          +    configuration.activates = YES; // To bring app to foreground
          +    configuration.promptsUserIfNeeded = YES; // To allow macOS desktop prompts
          +
          +    // dispatch semaphores used to wait for the completion handler to update and return status
          +    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
          +    dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(NSEC_PER_SEC)); // 1 second timeout
          +
          +    // Asynchronous call to openURL
          +    [[NSWorkspace sharedWorkspace] openURLs:urls
          +                                    withApplicationAtURL:appURI
          +                                    configuration:configuration
          +                                    completionHandler:^(NSRunningApplication *app, NSError *error) {
          +        if (error) {
          +            status = (OSStatus) error.code;
          +        }
          +        dispatch_semaphore_signal(semaphore);
          +    }];
          +
          +    dispatch_semaphore_wait(semaphore, timeout);
           
           JNI_COCOA_EXIT(env);
               return status;
          @@ -56,32 +89,73 @@
           /*
            * Class:     sun_lwawt_macosx_CDesktopPeer
            * Method:    _lsOpenFile
          - * Signature: (Ljava/lang/String;Z)I;
          + * Signature: (Ljava/lang/String;I;Ljava/lang/String;)I;
            */
           JNIEXPORT jint JNICALL Java_sun_lwawt_macosx_CDesktopPeer__1lsOpenFile
          -(JNIEnv *env, jclass clz, jstring jpath, jboolean print)
          +(JNIEnv *env, jclass clz, jstring jpath, jint action, jstring jtmpTxtPath)
           {
          -    OSStatus status = noErr;
          +    __block OSStatus status = noErr;
           JNI_COCOA_ENTER(env);
           
          -    // I would love to use NSWorkspace here, but it's not thread safe. Why? I don't know.
          -    // So we use LaunchServices directly.
          -
               NSString *path  = NormalizedPathNSStringFromJavaString(env, jpath);
          -
          -    NSURL *url = [NSURL fileURLWithPath:(NSString *)path];
          +    NSURL *urlToOpen = [NSURL fileURLWithPath:(NSString *)path];
           
               // This byzantine workaround is necessary, or else directories won't open in Finder
          -    url = (NSURL *)CFURLCreateWithFileSystemPath(NULL, (CFStringRef)[url path], kCFURLPOSIXPathStyle, false);
          -
          -    LSLaunchFlags flags = kLSLaunchDefaults;
          -    if (print) flags |= kLSLaunchAndPrint;
          -
          -    LSApplicationParameters params = {0, flags, NULL, NULL, NULL, NULL, NULL};
          -    status = LSOpenURLsWithRole((CFArrayRef)[NSArray arrayWithObject:url], kLSRolesAll, NULL, ¶ms, NULL, 0);
          -    [url release];
          +    urlToOpen = (NSURL *)CFURLCreateWithFileSystemPath(NULL, (CFStringRef)[urlToOpen path],
          +                                                        kCFURLPOSIXPathStyle, false);
          +
          +    NSWorkspace *workspace = [NSWorkspace sharedWorkspace];
          +    NSURL *appURI = [workspace URLForApplicationToOpenURL:urlToOpen];
          +    NSURL *defaultTerminalApp = [workspace URLForApplicationToOpenURL:[NSURL URLWithString:@"file:///bin/sh"]];
          +
          +    // Prepare NSOpenConfig object
          +    NSArray *urls = @[urlToOpen];
          +    NSWorkspaceOpenConfiguration *configuration = [NSWorkspaceOpenConfiguration configuration];
          +    configuration.activates = YES; // To bring app to foreground
          +    configuration.promptsUserIfNeeded = YES;  // To allow macOS desktop prompts
          +
          +    // pre-checks for open/print/edit before calling openURLs API
          +    if (action == sun_lwawt_macosx_CDesktopPeer_OPEN
          +            || action == sun_lwawt_macosx_CDesktopPeer_PRINT) {
          +        if (appURI == nil
          +            || [[urlToOpen absoluteString] containsString:[appURI absoluteString]]
          +            || [[defaultTerminalApp absoluteString] containsString:[appURI absoluteString]]) {
          +            return -1;
          +        }
          +        // Additionally set forPrinting=TRUE for print
          +        if (action == sun_lwawt_macosx_CDesktopPeer_PRINT) {
          +            configuration.forPrinting = YES;
          +        }
          +    } else if (action == sun_lwawt_macosx_CDesktopPeer_EDIT) {
          +        if (appURI == nil
          +            || [[urlToOpen absoluteString] containsString:[appURI absoluteString]]) {
          +            return -1;
          +        }
          +        // for EDIT: if (defaultApp = TerminalApp) then set appURI = DefaultTextEditor
          +        if ([[defaultTerminalApp absoluteString] containsString:[appURI absoluteString]]) {
          +            NSString *path  = NormalizedPathNSStringFromJavaString(env, jtmpTxtPath);
          +            NSURL *tempFilePath = [NSURL fileURLWithPath:(NSString *)path];
          +            appURI = [workspace URLForApplicationToOpenURL:tempFilePath];
          +        }
          +    }
          +
          +    // dispatch semaphores used to wait for the completion handler to update and return status
          +    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
          +    dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(NSEC_PER_SEC)); // 1 second timeout
          +
          +    // Asynchronous call - openURLs:withApplicationAtURL
          +    [[NSWorkspace sharedWorkspace] openURLs:urls
          +                                   withApplicationAtURL:appURI
          +                                   configuration:configuration
          +                                   completionHandler:^(NSRunningApplication *app, NSError *error) {
          +        if (error) {
          +            status = (OSStatus) error.code;
          +        }
          +        dispatch_semaphore_signal(semaphore);
          +    }];
          +
          +    dispatch_semaphore_wait(semaphore, timeout);
           
           JNI_COCOA_EXIT(env);
               return status;
           }
          -
          diff --git a/src/java.desktop/windows/classes/sun/awt/windows/WDesktopPeer.java b/src/java.desktop/windows/classes/sun/awt/windows/WDesktopPeer.java
          index 788c1477265a..e5b628dd74bc 100644
          --- a/src/java.desktop/windows/classes/sun/awt/windows/WDesktopPeer.java
          +++ b/src/java.desktop/windows/classes/sun/awt/windows/WDesktopPeer.java
          @@ -1,5 +1,5 @@
           /*
          - * Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved.
          + * Copyright (c) 2005, 2025, 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
          @@ -38,6 +38,9 @@
           import java.io.IOException;
           import java.net.URI;
           
          +import java.util.ArrayList;
          +import java.util.Arrays;
          +import java.util.List;
           import javax.swing.event.EventListenerList;
           
           import sun.awt.shell.ShellFolder;
          @@ -50,9 +53,11 @@
            */
           final class WDesktopPeer implements DesktopPeer {
               /* Constants for the operation verbs */
          -    private static String ACTION_OPEN_VERB = "open";
          -    private static String ACTION_EDIT_VERB = "edit";
          -    private static String ACTION_PRINT_VERB = "print";
          +    private static final String ACTION_OPEN_VERB = "open";
          +    private static final String ACTION_EDIT_VERB = "edit";
          +    private static final String ACTION_PRINT_VERB = "print";
          +    private static final String ACTION_BROWSE_VERB = "browse";
          +    private static final String ACTION_MAIL_VERB = "mail";
           
               private static native void init();
           
          @@ -95,12 +100,12 @@ public void print(File file) throws IOException {
           
               @Override
               public void mail(URI uri) throws IOException {
          -        this.ShellExecute(uri, ACTION_OPEN_VERB);
          +        this.ShellExecute(uri, ACTION_MAIL_VERB);
               }
           
               @Override
               public void browse(URI uri) throws IOException {
          -        this.ShellExecute(uri, ACTION_OPEN_VERB);
          +        this.launchUriInBrowser(uri);
               }
           
               private void ShellExecute(File file, String verb) throws IOException {
          @@ -121,6 +126,42 @@ private void ShellExecute(URI uri, String verb) throws IOException {
                   }
               }
           
          +    private void launchUriInBrowser(URI uri) throws IOException {
          +        String defaultBrowser = getDefaultBrowser();
          +        if (defaultBrowser == null) {
          +            throw new IOException("Failed to get default browser");
          +        }
          +
          +        List cmdLineTokens = getCmdLineTokens(uri, defaultBrowser);
          +        try {
          +            ProcessBuilder pb = new ProcessBuilder(cmdLineTokens);
          +            pb.start();
          +        }  catch (Exception e) {
          +            throw new IOException("Error launching Browser: ", e);
          +        }
          +    }
          +
          +    private static List getCmdLineTokens(URI uri, String defaultBrowser) {
          +        if (defaultBrowser.contains("%1")) {
          +            defaultBrowser = defaultBrowser.replace("%1", uri.toString());
          +        } else {
          +            defaultBrowser = defaultBrowser + " " + uri.toString();
          +        }
          +
          +        List cmdLineTokens = new ArrayList<>();
          +        int firstIndex = defaultBrowser.indexOf("\"");
          +        int secondIndex = defaultBrowser.indexOf("\"", firstIndex + 1);
          +
          +        if (firstIndex == 0 && secondIndex != firstIndex) {
          +            cmdLineTokens.add(defaultBrowser.substring(firstIndex, secondIndex + 1));
          +            defaultBrowser = defaultBrowser.substring(secondIndex + 1).trim();
          +        }
          +        cmdLineTokens.addAll(Arrays.asList(defaultBrowser.split(" ")));
          +        return cmdLineTokens;
          +    }
          +
          +    private static native String getDefaultBrowser();
          +
               private static native String ShellExecute(String fileOrUri, String verb);
           
               private static final EventListenerList listenerList = new EventListenerList();
          diff --git a/src/java.desktop/windows/native/libawt/windows/awt_Desktop.cpp b/src/java.desktop/windows/native/libawt/windows/awt_Desktop.cpp
          index ba79523249c3..ebb43b2f0789 100644
          --- a/src/java.desktop/windows/native/libawt/windows/awt_Desktop.cpp
          +++ b/src/java.desktop/windows/native/libawt/windows/awt_Desktop.cpp
          @@ -1,5 +1,5 @@
           /*
          - * Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved.
          + * Copyright (c) 2005, 2025, 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
          @@ -30,6 +30,12 @@
           #include 
           #include 
           #include "awt_Toolkit.h"
          +#include 
          +#include   // for AssocQueryStringW
          +#include 
          +#include 
          +#include 
          +#include  // for SaferiIsExecutableFileType
           
           #define BUFFER_LIMIT   MAX_PATH+1
           
          @@ -78,14 +84,23 @@ JNIEXPORT jstring JNICALL Java_sun_awt_windows_WDesktopPeer_ShellExecute
               LPCWSTR fileOrUri_c = JNU_GetStringPlatformChars(env, fileOrUri_j, NULL);
               CHECK_NULL_RETURN(fileOrUri_c, NULL);
               LPCWSTR verb_c = JNU_GetStringPlatformChars(env, verb_j, NULL);
          +
               if (verb_c == NULL) {
                   JNU_ReleaseStringPlatformChars(env, fileOrUri_j, fileOrUri_c);
                   return NULL;
               }
          +    if (wcscmp(verb_c, L"open") == 0) {
          +        BOOL isExecutable = SaferiIsExecutableFileType(fileOrUri_c, FALSE);
          +        if (isExecutable) {
          +            return env->NewStringUTF("Unsupported URI content");
          +        }
          +    }
          +    // set action verb for mail() to open before calling ShellExecute
          +    LPCWSTR actionVerb = wcscmp(verb_c, L"mail") == 0 ? L"open" : verb_c;
           
               // 6457572: ShellExecute possibly changes FPU control word - saving it here
               unsigned oldcontrol87 = _control87(0, 0);
          -    HINSTANCE retval = ::ShellExecute(NULL, verb_c, fileOrUri_c, NULL, NULL,
          +    HINSTANCE retval = ::ShellExecute(NULL, actionVerb, fileOrUri_c, NULL, NULL,
                                                 SW_SHOWNORMAL);
               DWORD error = ::GetLastError();
               _control87(oldcontrol87, 0xffffffff);
          @@ -113,10 +128,38 @@ JNIEXPORT jstring JNICALL Java_sun_awt_windows_WDesktopPeer_ShellExecute
                       return errmsg;
                   }
               }
          -
               return NULL;
           }
           
          +/*
          + * Class:     sun_awt_windows_WDesktopPeer
          + * Method:    getDefaultBrowser
          + * Signature: ()Ljava/lang/String;
          + */
          +JNIEXPORT jstring JNICALL Java_sun_awt_windows_WDesktopPeer_getDefaultBrowser
          +(JNIEnv *env, jclass cls)
          +{
          +    LPCWSTR fileExtension = L"https";
          +    WCHAR defaultBrowser_c [MAX_PATH];
          +    DWORD cchBuffer = MAX_PATH;
          +
          +    // Use AssocQueryString to get the default browser
          +    HRESULT hr = AssocQueryStringW(
          +        ASSOCF_NONE,            // No special flags
          +        ASSOCSTR_COMMAND,       // Request the command string
          +        fileExtension,          // File extension
          +        NULL,                   // pszExtra (optional)
          +        defaultBrowser_c,       // Output buffer - result
          +        &cchBuffer              // Size of the output buffer
          +    );
          +
          +    if (FAILED(hr)) {
          +        return NULL;
          +    }
          +
          +    return JNU_NewStringPlatform(env, defaultBrowser_c);
          +}
          +
           /*
            * Class:     sun_awt_windows_WDesktopPeer
            * Method:    moveToTrash
          diff --git a/test/jdk/java/awt/Desktop/BrowseTest.java b/test/jdk/java/awt/Desktop/BrowseTest.java
          index 33de1ecdca74..28e08fe16c77 100644
          --- a/test/jdk/java/awt/Desktop/BrowseTest.java
          +++ b/test/jdk/java/awt/Desktop/BrowseTest.java
          @@ -40,10 +40,27 @@
           
           public class BrowseTest extends JPanel {
               static final String INSTRUCTIONS = """
          -            This test could launch default file manager to open user's home
          -            directory, and default web browser to show the URL of java vendor.
          -            After test execution close the native file manager and web browser
          +            Set your default browser as per the test platform.
          +            macOS - Safari
          +            windows - MS Edge
          +            linux - Firefox
          +
          +            This test checks 2 cases:
          +
          +            1) Directory URI:
          +               On macOS and windows, verify that a browser window opens and
          +               EITHER the browser OR native file manager shows the user's
          +               home directory.
          +
          +               On Linux verify that the user's home directory is shown by the
          +               default file manager.
          +
          +            2) Web URI:
          +               Verify that the Web URI (URL of java vendor) opens in the browser.
          +
          +            After test execution close the native file manager and any web browser
                       windows if they were launched by test.
          +
                       Also check output for any unexpected EXCEPTIONS,
                       if you see any failure messages press Fail otherwise press Pass.
                       """;
          @@ -53,7 +70,7 @@ public BrowseTest() {
           
                   URI dirURI = new File(System.getProperty("user.home")).toURI();
                   URI webURI = URI.create(System.getProperty("java.vendor.url", "http://www.java.com"));
          -        boolean failed = false;
          +        PassFailJFrame.log("Testing 1st case: Directory URI ...");
                   try {
                       PassFailJFrame.log("Try to browse " + dirURI + " ...");
                       desktop.browse(dirURI);
          @@ -62,6 +79,7 @@ public BrowseTest() {
                       PassFailJFrame.log("EXCEPTION: " + e.getMessage());
                   }
           
          +        PassFailJFrame.log("Testing 2nd case: Web URI ...");
                   try {
                       PassFailJFrame.log("Try to browse " + webURI + " ...");
                       desktop.browse(webURI);
          diff --git a/test/jdk/java/awt/Desktop/EditAndPrintTest/EditAndPrintTest.java b/test/jdk/java/awt/Desktop/EditAndPrintTest/EditAndPrintTest.java
          index b2d7ef28df12..77d86ceb42a4 100644
          --- a/test/jdk/java/awt/Desktop/EditAndPrintTest/EditAndPrintTest.java
          +++ b/test/jdk/java/awt/Desktop/EditAndPrintTest/EditAndPrintTest.java
          @@ -48,7 +48,7 @@ public class EditAndPrintTest extends JPanel {
                       This test tries to edit and print a directory, which will expectedly raise IOException.
                       Then this test would edit and print a .txt file, which should be successful.
                       After test execution close the editor if it was launched by test.
          -            If you see any EXCEPTION messages in the output press FAIL.
          +            If you see any EXCEPTION messages in case of .txt file in the output press FAIL.
                       """;
           
               static Desktop desktop;
          
          From 01475cae76519857dbee3eff079a740c47a8c10e Mon Sep 17 00:00:00 2001
          From: Renjith Kannath Pariyangad 
          Date: Fri, 22 Aug 2025 14:52:32 +0000
          Subject: [PATCH 316/323] 8362308: Enhance Bitmap operations
          
          Backport-of: d8ea3bcf8597c7277d6b4bbe23afd33cc41d48fa
          ---
           .../libmlib_image/mlib_ImageConvMxN_Fp.c      |  9 +++++++-
           .../libmlib_image/mlib_ImageConvMxN_ext.c     |  6 ++++-
           .../libmlib_image/mlib_ImageConv_16ext.c      | 23 ++++++++++++++++++-
           .../libmlib_image/mlib_ImageConv_16nw.c       |  7 +++++-
           .../libmlib_image/mlib_ImageConv_32nw.c       |  7 +++++-
           .../libmlib_image/mlib_ImageConv_8ext.c       | 23 ++++++++++++++++++-
           .../native/libmlib_image/mlib_ImageConv_8nw.c |  7 +++++-
           .../libmlib_image/mlib_ImageConv_u16ext.c     | 23 ++++++++++++++++++-
           .../libmlib_image/mlib_ImageConv_u16nw.c      |  7 +++++-
           .../libmlib_image/mlib_ImageLookUp_Bit.c      | 12 +++++++++-
           .../native/libmlib_image/mlib_ImageScanPoly.c | 11 ++++++++-
           11 files changed, 124 insertions(+), 11 deletions(-)
          
          diff --git a/src/java.desktop/share/native/libmlib_image/mlib_ImageConvMxN_Fp.c b/src/java.desktop/share/native/libmlib_image/mlib_ImageConvMxN_Fp.c
          index fa9a186d6d7b..bc2df9b0b1ae 100644
          --- a/src/java.desktop/share/native/libmlib_image/mlib_ImageConvMxN_Fp.c
          +++ b/src/java.desktop/share/native/libmlib_image/mlib_ImageConvMxN_Fp.c
          @@ -1,5 +1,5 @@
           /*
          - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved.
          + * Copyright (c) 2003, 2025, 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
          @@ -76,6 +76,7 @@
           #include "mlib_ImageCheck.h"
           #include "mlib_SysMath.h"
           #include "mlib_ImageConv.h"
          +#include "safe_math.h"
           
           /***************************************************************/
           static void mlib_ImageConvMxNMulAdd_F32(mlib_f32       *dst,
          @@ -272,6 +273,9 @@ mlib_status mlib_convMxNext_f32(mlib_image       *dst,
             mlib_s32 nch = mlib_ImageGetChannels(dst);
             mlib_s32 i, j, j1, k;
           
          +  if (!SAFE_TO_MULT(3, wid_e) || !SAFE_TO_ADD(3 * wid_e, m)) {
          +    return MLIB_FAILURE;
          +  }
             if (3 * wid_e + m > 1024) {
               dsa = mlib_malloc((3 * wid_e + m) * sizeof(mlib_d64));
           
          @@ -629,6 +633,9 @@ mlib_status mlib_convMxNext_d64(mlib_image       *dst,
             mlib_s32 nch = mlib_ImageGetChannels(dst);
             mlib_s32 i, j, j1, k;
           
          +  if (!SAFE_TO_MULT(3, wid_e) || !SAFE_TO_ADD(3 * wid_e, m)) {
          +    return MLIB_FAILURE;
          +  }
             if (3 * wid_e + m > 1024) {
               dsa = mlib_malloc((3 * wid_e + m) * sizeof(mlib_d64));
           
          diff --git a/src/java.desktop/share/native/libmlib_image/mlib_ImageConvMxN_ext.c b/src/java.desktop/share/native/libmlib_image/mlib_ImageConvMxN_ext.c
          index ee15935dcfed..5869b0a54af0 100644
          --- a/src/java.desktop/share/native/libmlib_image/mlib_ImageConvMxN_ext.c
          +++ b/src/java.desktop/share/native/libmlib_image/mlib_ImageConvMxN_ext.c
          @@ -1,5 +1,5 @@
           /*
          - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved.
          + * Copyright (c) 2003, 2025, 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
          @@ -82,6 +82,7 @@
           
           #include "mlib_image.h"
           #include "mlib_ImageConv.h"
          +#include "safe_math.h"
           
           /***************************************************************/
           static void mlib_ImageConvMxNMulAdd_S32(mlib_d64       *dst,
          @@ -229,6 +230,9 @@ mlib_status mlib_convMxNext_s32(mlib_image       *dst,
           
             /* internal buffer */
           
          +  if (!SAFE_TO_MULT(3, wid_e) || !SAFE_TO_ADD(3 * wid_e, m)) {
          +    return MLIB_FAILURE;
          +  }
             if (3 * wid_e + m > 1024) {
               dsa = mlib_malloc((3 * wid_e + m) * sizeof(mlib_d64));
           
          diff --git a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_16ext.c b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_16ext.c
          index 57486b1cae58..00469d257195 100644
          --- a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_16ext.c
          +++ b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_16ext.c
          @@ -1,5 +1,5 @@
           /*
          - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved.
          + * Copyright (c) 2003, 2025, 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
          @@ -33,6 +33,7 @@
           #include "mlib_image.h"
           #include "mlib_ImageConv.h"
           #include "mlib_c_ImageConv.h"
          +#include "safe_math.h"
           
           /*
            * This define switches between functions of different data types
          @@ -260,8 +261,14 @@ static mlib_status mlib_ImageConv1xN_ext(mlib_image       *dst,
             if (max_hsize > hgt) max_hsize = hgt;
           
             shgt = hgt + (n - 1);
          +  if (!SAFE_TO_ADD(max_hsize, (n - 1))) {
          +    return MLIB_FAILURE;
          +  }
             smax_hsize = max_hsize + (n - 1);
           
          +  if (!SAFE_TO_ADD(smax_hsize, 1) || !SAFE_TO_MULT(2, (smax_hsize + 1))) {
          +    return MLIB_FAILURE;
          +  }
             bsize = 2 * (smax_hsize + 1);
           
             if (bsize > BUFF_SIZE) {
          @@ -509,8 +516,16 @@ mlib_status CONV_FUNC_MxN
               FREE_AND_RETURN_STATUS;
             }
           
          +  if (!SAFE_TO_ADD(wid, (m - 1))) {
          +    status = MLIB_FAILURE;
          +    FREE_AND_RETURN_STATUS;
          +  }
             swid = wid + (m - 1);
           
          +  if (!SAFE_TO_MULT((n + 3), swid)) {
          +    status = MLIB_FAILURE;
          +    FREE_AND_RETURN_STATUS;
          +  }
             bsize = (n + 3)*swid;
           
             if ((bsize > BUFF_SIZE) || (n > MAX_N)) {
          @@ -919,8 +934,14 @@ mlib_status CONV_FUNC_MxN_I
             chan1 = nchannel;
             chan2 = chan1 + chan1;
           
          +  if (!SAFE_TO_ADD(wid, (m - 1))) {
          +    return MLIB_FAILURE;
          +  }
             swid = wid + (m - 1);
           
          +  if (!SAFE_TO_MULT((n + 2), swid)) {
          +    return MLIB_FAILURE;
          +  }
             bsize = (n + 2)*swid;
           
             if ((bsize > BUFF_SIZE) || (n > MAX_N)) {
          diff --git a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_16nw.c b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_16nw.c
          index 3b6985b78766..2e035d124534 100644
          --- a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_16nw.c
          +++ b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_16nw.c
          @@ -1,5 +1,5 @@
           /*
          - * Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
          + * Copyright (c) 2000, 2025, 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
          @@ -32,6 +32,7 @@
           
           #include "mlib_image.h"
           #include "mlib_c_ImageConv.h"
          +#include "safe_math.h"
           
           /*
             This define switches between functions of different data types
          @@ -466,6 +467,10 @@ mlib_status CONV_FUNC(MxN)(mlib_image       *dst,
               FREE_AND_RETURN_STATUS;
             }
           
          +  if (!SAFE_TO_MULT((n + 3), wid)) {
          +    status = MLIB_FAILURE;
          +    FREE_AND_RETURN_STATUS;
          +  }
             bsize = (n + 3)*wid;
           
             if ((bsize > BUFF_SIZE) || (n > MAX_N)) {
          diff --git a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_32nw.c b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_32nw.c
          index 380ed0448780..bb264d9dcd20 100644
          --- a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_32nw.c
          +++ b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_32nw.c
          @@ -1,5 +1,5 @@
           /*
          - * Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
          + * Copyright (c) 2000, 2025, 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
          @@ -33,6 +33,7 @@
           
           #include "mlib_image.h"
           #include "mlib_ImageConv.h"
          +#include "safe_math.h"
           
           /***************************************************************/
           #define CACHE_SIZE (64*1024)
          @@ -335,6 +336,10 @@ mlib_status CONV_FUNC(MxN)(mlib_image       *dst,
               FREE_AND_RETURN_STATUS;
             }
           
          +  if (!SAFE_TO_MULT((n + 2), wid)) {
          +    status = MLIB_FAILURE;
          +    FREE_AND_RETURN_STATUS;
          +  }
             bsize = (n + 2)*wid;
           
             if ((bsize > BUFF_SIZE) || (n > MAX_N)) {
          diff --git a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_8ext.c b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_8ext.c
          index c8b58e6f1388..136d5a2b814c 100644
          --- a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_8ext.c
          +++ b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_8ext.c
          @@ -1,5 +1,5 @@
           /*
          - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved.
          + * Copyright (c) 2003, 2025, 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
          @@ -33,6 +33,7 @@
           #include "mlib_image.h"
           #include "mlib_ImageConv.h"
           #include "mlib_c_ImageConv.h"
          +#include "safe_math.h"
           
           /*
            * This define switches between functions of different data types
          @@ -245,8 +246,14 @@ static mlib_status mlib_ImageConv1xN_ext(mlib_image       *dst,
             if (max_hsize > hgt) max_hsize = hgt;
           
             shgt = hgt + (n - 1);
          +  if (!SAFE_TO_ADD(max_hsize, (n - 1))) {
          +    return MLIB_FAILURE;
          +  }
             smax_hsize = max_hsize + (n - 1);
           
          +  if (!SAFE_TO_ADD(smax_hsize, 1) || !SAFE_TO_MULT(2, (smax_hsize + 1))) {
          +    return MLIB_FAILURE;
          +  }
             bsize = 2 * (smax_hsize + 1);
           
             if (bsize > BUFF_SIZE) {
          @@ -494,8 +501,16 @@ mlib_status CONV_FUNC_MxN
               FREE_AND_RETURN_STATUS;
             }
           
          +  if (!SAFE_TO_ADD(wid, (m - 1))) {
          +    status = MLIB_FAILURE;
          +    FREE_AND_RETURN_STATUS;
          +  }
             swid = wid + (m - 1);
           
          +  if (!SAFE_TO_MULT((n + 3), swid)) {
          +    status = MLIB_FAILURE;
          +    FREE_AND_RETURN_STATUS;
          +  }
             bsize = (n + 3)*swid;
           
             if ((bsize > BUFF_SIZE) || (n > MAX_N)) {
          @@ -904,8 +919,14 @@ mlib_status CONV_FUNC_MxN_I
             chan1 = nchannel;
             chan2 = chan1 + chan1;
           
          +  if (!SAFE_TO_ADD(wid, (m - 1))) {
          +    return MLIB_FAILURE;
          +  }
             swid = wid + (m - 1);
           
          +  if (!SAFE_TO_MULT((n + 2), swid)) {
          +    return MLIB_FAILURE;
          +  }
             bsize = (n + 2)*swid;
           
             if ((bsize > BUFF_SIZE) || (n > MAX_N)) {
          diff --git a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_8nw.c b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_8nw.c
          index f65fda45c58c..c144404b0f44 100644
          --- a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_8nw.c
          +++ b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_8nw.c
          @@ -1,5 +1,5 @@
           /*
          - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved.
          + * Copyright (c) 2003, 2025, 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
          @@ -33,6 +33,7 @@
           #include "mlib_image.h"
           #include "mlib_ImageConv.h"
           #include "mlib_c_ImageConv.h"
          +#include "safe_math.h"
           
           /*
             This define switches between functions of different data types
          @@ -467,6 +468,10 @@ mlib_status CONV_FUNC(MxN)(mlib_image       *dst,
               FREE_AND_RETURN_STATUS;
             }
           
          +  if (!SAFE_TO_MULT((n + 3), wid)) {
          +    status = MLIB_FAILURE;
          +    FREE_AND_RETURN_STATUS;
          +  }
             bsize = (n + 3)*wid;
           
             if ((bsize > BUFF_SIZE) || (n > MAX_N)) {
          diff --git a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_u16ext.c b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_u16ext.c
          index b2757979a841..81a06f2fc284 100644
          --- a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_u16ext.c
          +++ b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_u16ext.c
          @@ -1,5 +1,5 @@
           /*
          - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved.
          + * Copyright (c) 2003, 2025, 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
          @@ -33,6 +33,7 @@
           #include "mlib_image.h"
           #include "mlib_ImageConv.h"
           #include "mlib_c_ImageConv.h"
          +#include "safe_math.h"
           
           /*
            * This define switches between functions of different data types
          @@ -270,8 +271,14 @@ static mlib_status mlib_ImageConv1xN_ext(mlib_image       *dst,
             if (max_hsize > hgt) max_hsize = hgt;
           
             shgt = hgt + (n - 1);
          +  if (!SAFE_TO_ADD(max_hsize, (n - 1))) {
          +    return MLIB_FAILURE;
          +  }
             smax_hsize = max_hsize + (n - 1);
           
          +  if (!SAFE_TO_ADD(smax_hsize, 1) || !SAFE_TO_MULT(2, (smax_hsize + 1))) {
          +    return MLIB_FAILURE;
          +  }
             bsize = 2 * (smax_hsize + 1);
           
             if (bsize > BUFF_SIZE) {
          @@ -519,8 +526,16 @@ mlib_status CONV_FUNC_MxN
               FREE_AND_RETURN_STATUS;
             }
           
          +  if (!SAFE_TO_ADD(wid, (m - 1))) {
          +    status = MLIB_FAILURE;
          +    FREE_AND_RETURN_STATUS;
          +  }
             swid = wid + (m - 1);
           
          +  if (!SAFE_TO_MULT((n + 3), swid)) {
          +    status = MLIB_FAILURE;
          +    FREE_AND_RETURN_STATUS;
          +  }
             bsize = (n + 3)*swid;
           
             if ((bsize > BUFF_SIZE) || (n > MAX_N)) {
          @@ -927,8 +942,14 @@ mlib_status CONV_FUNC_MxN_I
             chan1 = nchannel;
             chan2 = chan1 + chan1;
           
          +  if (!SAFE_TO_ADD(wid, (m - 1))) {
          +    return MLIB_FAILURE;
          +  }
             swid = wid + (m - 1);
           
          +  if (!SAFE_TO_MULT((n + 2), swid)) {
          +    return MLIB_FAILURE;
          +  }
             bsize = (n + 2)*swid;
           
             if ((bsize > BUFF_SIZE) || (n > MAX_N)) {
          diff --git a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_u16nw.c b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_u16nw.c
          index a3234cf8959b..49412c7d7ef7 100644
          --- a/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_u16nw.c
          +++ b/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_u16nw.c
          @@ -1,5 +1,5 @@
           /*
          - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved.
          + * Copyright (c) 2003, 2025, 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
          @@ -32,6 +32,7 @@
           
           #include "mlib_image.h"
           #include "mlib_c_ImageConv.h"
          +#include "safe_math.h"
           
           /*
             This define switches between functions of different data types
          @@ -466,6 +467,10 @@ mlib_status CONV_FUNC(MxN)(mlib_image       *dst,
               FREE_AND_RETURN_STATUS;
             }
           
          +  if (!SAFE_TO_MULT((n + 3), wid)) {
          +    status = MLIB_FAILURE;
          +    FREE_AND_RETURN_STATUS;
          +  }
             bsize = (n + 3)*wid;
           
             if ((bsize > BUFF_SIZE) || (n > MAX_N)) {
          diff --git a/src/java.desktop/share/native/libmlib_image/mlib_ImageLookUp_Bit.c b/src/java.desktop/share/native/libmlib_image/mlib_ImageLookUp_Bit.c
          index 2e77c20aa572..cfd5e3e671e2 100644
          --- a/src/java.desktop/share/native/libmlib_image/mlib_ImageLookUp_Bit.c
          +++ b/src/java.desktop/share/native/libmlib_image/mlib_ImageLookUp_Bit.c
          @@ -1,5 +1,5 @@
           /*
          - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved.
          + * Copyright (c) 2003, 2025, 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 @@
           
           #include "mlib_image.h"
           #include "mlib_ImageLookUp.h"
          +#include "safe_math.h"
           
           /***************************************************************/
           #define MAX_WIDTH  512
          @@ -302,6 +303,9 @@ mlib_status mlib_ImageLookUp_Bit_U8_2(const mlib_u8 *src,
             mlib_u8  *buff = (mlib_u8*)buff_lcl, *buffs;
             mlib_u32 val0, val1;
           
          +  if (!SAFE_TO_MULT(xsize, 2)) {
          +    return MLIB_FAILURE;
          +  }
             size = xsize * 2;
           
             if (size > MAX_WIDTH) {
          @@ -440,6 +444,9 @@ mlib_status mlib_ImageLookUp_Bit_U8_3(const mlib_u8 *src,
             mlib_u8  *buff = (mlib_u8*)buff_lcl, *buffs;
             mlib_u32 l0, h0, v0, l1, h1, v1, l2, h2, v2;
           
          +  if (!SAFE_TO_MULT(3, xsize)) {
          +    return MLIB_FAILURE;
          +  }
             size = 3 * xsize;
           
             if (size > MAX_WIDTH) {
          @@ -583,6 +590,9 @@ mlib_status mlib_ImageLookUp_Bit_U8_4(const mlib_u8 *src,
             mlib_u8  *buff = (mlib_u8*)buff_lcl, *buffs;
             mlib_u32 l, h;
           
          +  if (!SAFE_TO_MULT(xsize, 4)) {
          +    return MLIB_FAILURE;
          +  }
             size = xsize * 4;
           
             if (size > MAX_WIDTH) {
          diff --git a/src/java.desktop/share/native/libmlib_image/mlib_ImageScanPoly.c b/src/java.desktop/share/native/libmlib_image/mlib_ImageScanPoly.c
          index a6f4cfdd36e4..72adc212af6d 100644
          --- a/src/java.desktop/share/native/libmlib_image/mlib_ImageScanPoly.c
          +++ b/src/java.desktop/share/native/libmlib_image/mlib_ImageScanPoly.c
          @@ -1,5 +1,5 @@
           /*
          - * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
          + * Copyright (c) 1997, 2025, 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
          @@ -101,6 +101,11 @@ mlib_status mlib_AffineEdges(mlib_affine_param *param,
               return MLIB_FAILURE;
             }
           
          +  int intSize = sizeof(mlib_s32);
          +  if (!SAFE_TO_MULT(dstHeight, intSize) ||
          +      !SAFE_TO_ADD(dstHeight * intSize, 7)) {
          +    return MLIB_FAILURE;
          +  }
             bsize0 = (dstHeight * sizeof(mlib_s32) + 7) & ~7;
           
             if (lineAddr == NULL) {
          @@ -109,6 +114,10 @@ mlib_status mlib_AffineEdges(mlib_affine_param *param,
           
             param->buff_malloc = NULL;
           
          +  if (!SAFE_TO_MULT(4, bsize0) || !SAFE_TO_ADD(4 * bsize0, bsize1)) {
          +    return MLIB_FAILURE;
          +  }
          +
             if ((4 * bsize0 + bsize1) > buff_size) {
               buff = param->buff_malloc = mlib_malloc(4 * bsize0 + bsize1);
           
          
          From 54a6b6bc1c7fc0f2b502c034a495ed2d7f9a9eb7 Mon Sep 17 00:00:00 2001
          From: Alexey Bakhtin 
          Date: Sun, 7 Dec 2025 16:55:58 -0800
          Subject: [PATCH 317/323] 8362632: Improve HttpServer Request handling
          
          ---
           .../com/sun/net/httpserver/Headers.java       | 37 +++++--------------
           .../sun/net/httpserver/ExchangeImpl.java      | 19 +++++++---
           .../classes/sun/net/httpserver/Utils.java     | 33 +++++++++++++++++
           3 files changed, 57 insertions(+), 32 deletions(-)
          
          diff --git a/src/jdk.httpserver/share/classes/com/sun/net/httpserver/Headers.java b/src/jdk.httpserver/share/classes/com/sun/net/httpserver/Headers.java
          index 84535027eb41..279203d1d5ba 100644
          --- a/src/jdk.httpserver/share/classes/com/sun/net/httpserver/Headers.java
          +++ b/src/jdk.httpserver/share/classes/com/sun/net/httpserver/Headers.java
          @@ -36,6 +36,7 @@
           import java.util.function.BiFunction;
           import java.util.stream.Collectors;
           import sun.net.httpserver.UnmodifiableHeaders;
          +import sun.net.httpserver.Utils;
           
           /**
            * HTTP request and response headers are represented by this class which
          @@ -176,8 +177,13 @@ public String getFirst(String key) {
           
               @Override
               public List put(String key, List value) {
          +        // checkHeader is called in this class to fail fast
          +        // It also must be called in sendResponseHeaders because
          +        // Headers instances internal state can be modified
          +        // external to these methods.
          +        Utils.checkHeader(key, false);
                   for (String v : value)
          -            checkValue(v);
          +            Utils.checkHeader(v, true);
                   return map.put(normalize(key), value);
               }
           
          @@ -189,7 +195,8 @@ public List put(String key, List value) {
                * @param value the value to add to the header
                */
               public void add(String key, String value) {
          -        checkValue(value);
          +        Utils.checkHeader(key, false);
          +        Utils.checkHeader(value, true);
                   String k = normalize(key);
                   List l = map.get(k);
                   if (l == null) {
          @@ -199,30 +206,6 @@ public void add(String key, String value) {
                   l.add(value);
               }
           
          -    private static void checkValue(String value) {
          -        int len = value.length();
          -        for (int i=0; i= len - 2) {
          -                    throw new IllegalArgumentException("Illegal CR found in header");
          -                }
          -                char c1 = value.charAt(i+1);
          -                char c2 = value.charAt(i+2);
          -                if (c1 != '\n') {
          -                    throw new IllegalArgumentException("Illegal char found after CR in header");
          -                }
          -                if (c2 != ' ' && c2 != '\t') {
          -                    throw new IllegalArgumentException("No whitespace found after CRLF in header");
          -                }
          -                i+=2;
          -            } else if (c == '\n') {
          -                throw new IllegalArgumentException("Illegal LF found in header");
          -            }
          -        }
          -    }
          -
               /**
                * Sets the given {@code value} as the sole header value for the given
                * {@code key}. If the mapping does not already exist, then it is created.
          @@ -264,7 +247,7 @@ public Set>> entrySet() {
               public void replaceAll(BiFunction, ? extends List> function) {
                   var f = function.andThen(values -> {
                       Objects.requireNonNull(values);
          -            values.forEach(Headers::checkValue);
          +            values.forEach(value -> Utils.checkHeader(value, true));
                       return values;
                   });
                   Map.super.replaceAll(f);
          diff --git a/src/jdk.httpserver/share/classes/sun/net/httpserver/ExchangeImpl.java b/src/jdk.httpserver/share/classes/sun/net/httpserver/ExchangeImpl.java
          index 770642fda117..48ecbc7f880b 100644
          --- a/src/jdk.httpserver/share/classes/sun/net/httpserver/ExchangeImpl.java
          +++ b/src/jdk.httpserver/share/classes/sun/net/httpserver/ExchangeImpl.java
          @@ -198,6 +198,8 @@ PlaceholderOutputStream getPlaceholderResponseBody () {
                   return uos_orig;
               }
           
          +    private static final byte[] CRLF = new byte[] {0x0D, 0x0A};
          +
               public void sendResponseHeaders (int rCode, long contentLen)
               throws IOException
               {
          @@ -206,10 +208,11 @@ public void sendResponseHeaders (int rCode, long contentLen)
                       throw new IOException ("headers already sent");
                   }
                   this.rcode = rCode;
          -        String statusLine = "HTTP/1.1 "+rCode+Code.msg(rCode)+"\r\n";
          +        String statusLine = "HTTP/1.1 "+rCode+Code.msg(rCode);
                   OutputStream tmpout = new BufferedOutputStream (ros);
                   PlaceholderOutputStream o = getPlaceholderResponseBody();
          -        tmpout.write (bytes(statusLine, 0), 0, statusLine.length());
          +        tmpout.write (bytes(statusLine, false, 0), 0, statusLine.length());
          +        tmpout.write (CRLF);
                   boolean noContentToSend = false; // assume there is content
                   boolean noContentLengthHeader = false; // must not send Content-length is set
                   rspHdrs.set("Date", FORMATTER.format(Instant.now()));
          @@ -296,11 +299,11 @@ void write (Headers map, OutputStream os) throws IOException {
                       List values = entry.getValue();
                       for (String val : values) {
                           int i = key.length();
          -                buf = bytes (key, 2);
          +                buf = bytes (key, true, 2);
                           buf[i++] = ':';
                           buf[i++] = ' ';
                           os.write (buf, 0, i);
          -                buf = bytes (val, 2);
          +                buf = bytes (val, false, 2);
                           i = val.length();
                           buf[i++] = '\r';
                           buf[i++] = '\n';
          @@ -318,8 +321,14 @@ void write (Headers map, OutputStream os) throws IOException {
                * Make sure that at least "extra" bytes are free at end
                * of rspbuf. Reallocate rspbuf if not big enough.
                * caller must check return value to see if rspbuf moved
          +     *
          +     * Header values are supposed to be limited to 7-bit ASCII
          +     * but 8-bit has to be allowed (for ISO_8859_1). For efficiency
          +     * we just down cast 16 bit Java chars to byte. We don't allow
          +     * any character that can't be encoded in 8 bits.
                */
          -    private byte[] bytes (String s, int extra) {
          +    private byte[] bytes (String s, boolean isKey, int extra) throws IOException {
          +        Utils.checkHeader(s, !isKey);
                   int slen = s.length();
                   if (slen+extra > rspbuf.length) {
                       int diff = slen + extra - rspbuf.length;
          diff --git a/src/jdk.httpserver/share/classes/sun/net/httpserver/Utils.java b/src/jdk.httpserver/share/classes/sun/net/httpserver/Utils.java
          index 43dadb84a909..41834172f27e 100644
          --- a/src/jdk.httpserver/share/classes/sun/net/httpserver/Utils.java
          +++ b/src/jdk.httpserver/share/classes/sun/net/httpserver/Utils.java
          @@ -88,4 +88,37 @@ public static boolean isQuotedStringContent(String token) {
                   }
                   return true;
               }
          +
          +    /* Throw IAE if illegal character found.  isValue is true if String is
          +     * a value. Otherwise it is header name
          +     */
          +    public static void checkHeader(String str, boolean isValue) {
          +        int len = str.length();
          +        for (int i=0; i= len - 2) {
          +                    throw new IllegalArgumentException("Illegal CR found in header");
          +                }
          +                char c1 = str.charAt(i+1);
          +                char c2 = str.charAt(i+2);
          +                if (c1 != '\n') {
          +                    throw new IllegalArgumentException("Illegal char found after CR in header");
          +                }
          +                if (c2 != ' ' && c2 != '\t') {
          +                    throw new IllegalArgumentException("No whitespace found after CRLF in header");
          +                }
          +                i+=2;
          +            } else if (c == '\n') {
          +                throw new IllegalArgumentException("Illegal LF found in header");
          +            } else if (c > 255) {
          +                throw new IllegalArgumentException("Illegal character found in header");
          +            }
          +        }
          +    }
          +
           }
          
          From 9e04fd521238a0969fc1720e237961df334fcbf2 Mon Sep 17 00:00:00 2001
          From: Renjith Kannath Pariyangad 
          Date: Fri, 22 Aug 2025 14:54:46 +0000
          Subject: [PATCH 318/323] 8364214: Enhance polygon data support
          
          Backport-of: bc74f4a552f4bec37ee3cd870bacef4a0b186c53
          ---
           .../share/classes/sun/java2d/SunGraphics2D.java           | 6 +++---
           .../share/classes/sun/java2d/pipe/SpanClipRenderer.java   | 8 ++++++--
           2 files changed, 9 insertions(+), 5 deletions(-)
          
          diff --git a/src/java.desktop/share/classes/sun/java2d/SunGraphics2D.java b/src/java.desktop/share/classes/sun/java2d/SunGraphics2D.java
          index 0e0f64564a54..7a6fcd607704 100644
          --- a/src/java.desktop/share/classes/sun/java2d/SunGraphics2D.java
          +++ b/src/java.desktop/share/classes/sun/java2d/SunGraphics2D.java
          @@ -1,5 +1,5 @@
           /*
          - * Copyright (c) 1996, 2024, Oracle and/or its affiliates. All rights reserved.
          + * Copyright (c) 1996, 2025, 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
          @@ -1899,9 +1899,9 @@ protected void validateCompClip() {
                   if (usrClip == null) {
                       clipState = CLIP_DEVICE;
                       clipRegion = devClip;
          -        } else if (usrClip instanceof Rectangle2D) {
          +        } else if (usrClip instanceof Rectangle2D clip) {
                       clipState = CLIP_RECTANGULAR;
          -            clipRegion = devClip.getIntersection((Rectangle2D) usrClip);
          +            clipRegion = devClip.getIntersection(clip);
                   } else {
                       PathIterator cpi = usrClip.getPathIterator(null);
                       int[] box = new int[4];
          diff --git a/src/java.desktop/share/classes/sun/java2d/pipe/SpanClipRenderer.java b/src/java.desktop/share/classes/sun/java2d/pipe/SpanClipRenderer.java
          index 62d1f119f334..69c4954cac45 100644
          --- a/src/java.desktop/share/classes/sun/java2d/pipe/SpanClipRenderer.java
          +++ b/src/java.desktop/share/classes/sun/java2d/pipe/SpanClipRenderer.java
          @@ -1,5 +1,5 @@
           /*
          - * Copyright (c) 1998, 2021, Oracle and/or its affiliates. All rights reserved.
          + * Copyright (c) 1998, 2025, 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
          @@ -27,6 +27,8 @@
           
           import java.awt.Rectangle;
           import java.awt.Shape;
          +
          +import sun.java2d.InvalidPipeException;
           import sun.java2d.SunGraphics2D;
           
           /**
          @@ -67,7 +69,9 @@ public SCRcontext(RegionIterator ri, Object outctx) {
               public Object startSequence(SunGraphics2D sg, Shape s, Rectangle devR,
                                           int[] abox) {
                   RegionIterator ri = sg.clipRegion.getIterator();
          -
          +        if (ri.region.isRectangular()) {
          +            throw new InvalidPipeException("Invalid clip data");
          +        }
                   return new SCRcontext(ri, outpipe.startSequence(sg, s, devR, abox));
               }
           
          
          From c70b87729407aa04a8306241876bda37c09be5f5 Mon Sep 17 00:00:00 2001
          From: Ravi Reddy 
          Date: Wed, 15 Oct 2025 12:26:04 +0000
          Subject: [PATCH 319/323] 8365058: Enhance CopyOnWriteArraySet
          
          Reviewed-by: jlu
          Backport-of: 5c7956fd9a56a00c8af2d3092ea5680843429b53
          ---
           .../util/concurrent/CopyOnWriteArraySet.java  | 41 +++++++++
           .../SerializationTest.java                    | 84 +++++++++++++++++++
           2 files changed, 125 insertions(+)
           create mode 100644 test/jdk/java/util/concurrent/CopyOnWriteArraySet/SerializationTest.java
          
          diff --git a/src/java.base/share/classes/java/util/concurrent/CopyOnWriteArraySet.java b/src/java.base/share/classes/java/util/concurrent/CopyOnWriteArraySet.java
          index ab48a44c97ac..c28089776380 100644
          --- a/src/java.base/share/classes/java/util/concurrent/CopyOnWriteArraySet.java
          +++ b/src/java.base/share/classes/java/util/concurrent/CopyOnWriteArraySet.java
          @@ -35,6 +35,13 @@
           
           package java.util.concurrent;
           
          +import jdk.internal.misc.Unsafe;
          +
          +import java.io.IOException;
          +import java.io.ObjectInputStream;
          +import java.io.ObjectStreamException;
          +import java.io.Serial;
          +import java.io.StreamCorruptedException;
           import java.util.AbstractSet;
           import java.util.Collection;
           import java.util.Iterator;
          @@ -444,4 +451,38 @@ public Spliterator spliterator() {
                   return Spliterators.spliterator
                       (al.getArray(), Spliterator.IMMUTABLE | Spliterator.DISTINCT);
               }
          +
          +    /**
          +     * De-serialization without data not supported for this class.
          +     */
          +    @Serial
          +    private void readObjectNoData() throws ObjectStreamException {
          +        throw new StreamCorruptedException("Deserialized CopyOnWriteArraySet requires data");
          +    }
          +
          +    /**
          +     * Reconstitutes the {@code CopyOnWriteArraySet} instance from a stream
          +     * (that is, deserializes it).
          +     * @throws StreamCorruptedException if the object read from the stream is invalid.
          +     */
          +    @Serial
          +    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
          +        CopyOnWriteArrayList newAl; // Set during the duplicate check
          +
          +        @SuppressWarnings("unchecked")
          +        CopyOnWriteArrayList inAl = (CopyOnWriteArrayList) in.readFields().get("al", null);
          +
          +        if (inAl == null
          +                || inAl.getClass() != CopyOnWriteArrayList.class
          +                || (newAl = new CopyOnWriteArrayList<>()).addAllAbsent(inAl) != inAl.size()) {
          +            throw new StreamCorruptedException("Content is invalid");
          +        }
          +
          +        final Unsafe U = Unsafe.getUnsafe();
          +        U.putReference(
          +                this,
          +                U.objectFieldOffset(CopyOnWriteArraySet.class, "al"),
          +                newAl
          +        );
          +    }
           }
          diff --git a/test/jdk/java/util/concurrent/CopyOnWriteArraySet/SerializationTest.java b/test/jdk/java/util/concurrent/CopyOnWriteArraySet/SerializationTest.java
          new file mode 100644
          index 000000000000..7700eda6cd6c
          --- /dev/null
          +++ b/test/jdk/java/util/concurrent/CopyOnWriteArraySet/SerializationTest.java
          @@ -0,0 +1,84 @@
          +/*
          + * Copyright (c) 2025, 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 8365058
          + * @summary Check basic correctness of de-serialization
          + * @run junit SerializationTest
          + */
          +
          +import org.junit.jupiter.params.ParameterizedTest;
          +import org.junit.jupiter.params.provider.MethodSource;
          +
          +import java.io.ByteArrayInputStream;
          +import java.io.ByteArrayOutputStream;
          +import java.io.ObjectInputStream;
          +import java.io.ObjectOutputStream;
          +import java.util.List;
          +import java.util.Set;
          +import java.util.concurrent.CopyOnWriteArraySet;
          +import java.util.stream.Stream;
          +
          +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
          +import static org.junit.jupiter.api.Assertions.assertEquals;
          +
          +public class SerializationTest {
          +
          +    // Ensure basic serialization round trip correctness
          +    @ParameterizedTest
          +    @MethodSource
          +    void roundTripTest(CopyOnWriteArraySet expected) {
          +        var bytes = ser(expected);
          +        var actual = deSer(bytes);
          +        assertEquals(CopyOnWriteArraySet.class, actual.getClass());
          +        assertEquals(expected, actual);
          +    }
          +
          +    private static Stream> roundTripTest() {
          +        return Stream.of(
          +                new CopyOnWriteArraySet<>(),
          +                new CopyOnWriteArraySet<>(List.of(1, 2, 3)),
          +                new CopyOnWriteArraySet<>(Set.of("Foo", "Bar", "Baz"))
          +        );
          +    }
          +
          +    private static byte[] ser(Object obj) {
          +        return assertDoesNotThrow(() -> {
          +            try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
          +                 ObjectOutputStream oos = new ObjectOutputStream(byteArrayOutputStream)) {
          +                oos.writeObject(obj);
          +                return byteArrayOutputStream.toByteArray();
          +            }
          +        }, "Unexpected error during serialization");
          +    }
          +
          +    private static Object deSer(byte[] bytes) {
          +        return assertDoesNotThrow(() -> {
          +            try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
          +                 ObjectInputStream ois = new ObjectInputStream(byteArrayInputStream)) {
          +                return ois.readObject();
          +            }
          +        }, "Unexpected error during de-serialization");
          +    }
          +}
          
          From d1aa0794fecd34337ba4e27b1810595e3ca8c1c2 Mon Sep 17 00:00:00 2001
          From: Alexey Ivanov 
          Date: Fri, 29 Aug 2025 16:17:42 +0000
          Subject: [PATCH 320/323] 8365271: Improve Swing supports
          
          Backport-of: 3a925dcd8a7628ea9ad9092a9019198fa7a6f00d
          ---
           .../classes/javax/swing/plaf/basic/BasicOptionPaneUI.java     | 4 ++--
           1 file changed, 2 insertions(+), 2 deletions(-)
          
          diff --git a/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicOptionPaneUI.java b/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicOptionPaneUI.java
          index 20596774a18e..f59b7336562b 100644
          --- a/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicOptionPaneUI.java
          +++ b/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicOptionPaneUI.java
          @@ -470,12 +470,12 @@ protected void addMessageComponents(Container container,
                               str = s.substring(index2 + "".length());
                               s = s.substring(index1, index2 + + "".length());
                           }
          -                JLabel label;
          -                label = new JLabel(s, JLabel.LEADING);
          +                JLabel label = new JLabel();
                           if (Boolean.TRUE.equals(
                               this.optionPane.getClientProperty("html.disable"))) {
                               label.putClientProperty("html.disable", true);
                           }
          +                label.setText(s);
                           label.setName("OptionPane.label");
                           configureMessageLabel(label);
                           addMessageComponents(container, cons, label, maxll, true);
          
          From 5361d25feca79724363b7da66bdb1700542db879 Mon Sep 17 00:00:00 2001
          From: Alexei Voitylov 
          Date: Wed, 24 Dec 2025 00:55:07 +0100
          Subject: [PATCH 321/323] 8365280: Enhance JOptionPane
          
          Backport-of: 8d9541f8c907d10159d524fc00fce85a2d99e51d
          ---
           .../swing/plaf/basic/BasicOptionPaneUI.java   | 103 +++++++-----------
           .../swing/JOptionPane/TestJOptionHTMLTag.java |  68 ------------
           2 files changed, 39 insertions(+), 132 deletions(-)
           delete mode 100644 test/jdk/javax/swing/JOptionPane/TestJOptionHTMLTag.java
          
          diff --git a/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicOptionPaneUI.java b/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicOptionPaneUI.java
          index f59b7336562b..e380fa289c8e 100644
          --- a/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicOptionPaneUI.java
          +++ b/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicOptionPaneUI.java
          @@ -456,79 +456,54 @@ protected void addMessageComponents(Container container,
                       } else if ((nl = s.indexOf('\n')) >= 0) {
                           nll = 1;
                       }
          -            if (s.contains("")) {
          -                /* line break in html text is done by 
          tag - * and not by /n so it's incorrect to address newline - * same as non-html text. - * Text between tags are extracted - * and rendered as JLabel text - */ - int index1 = s.indexOf(""); - int index2 = s.indexOf(""); - String str = ""; - if (index2 >= 0) { - str = s.substring(index2 + "".length()); - s = s.substring(index1, index2 + + "".length()); + if (nl >= 0) { + // break up newlines + if (nl == 0) { + JPanel breakPanel = new JPanel() { + public Dimension getPreferredSize() { + Font f = getFont(); + + if (f != null) { + return new Dimension(1, f.getSize() + 2); + } + return new Dimension(0, 0); + } + }; + breakPanel.setName("OptionPane.break"); + addMessageComponents(container, cons, breakPanel, maxll, + true); + } else { + addMessageComponents(container, cons, s.substring(0, nl), + maxll, false); + } + // Prevent recursion of more than + // 200 successive newlines in a message + // and indicate message is truncated via ellipsis + if (recursionCount++ > 200) { + recursionCount = 0; + addMessageComponents(container, cons, new String("..."), + maxll, false); + return; } + addMessageComponents(container, cons, s.substring(nl + nll), maxll, + false); + + } else if (len > maxll) { + Container c = Box.createVerticalBox(); + c.setName("OptionPane.verticalBox"); + burstStringInto(c, s, maxll); + addMessageComponents(container, cons, c, maxll, true); + + } else { JLabel label = new JLabel(); if (Boolean.TRUE.equals( - this.optionPane.getClientProperty("html.disable"))) { + optionPane.getClientProperty("html.disable"))) { label.putClientProperty("html.disable", true); } label.setText(s); label.setName("OptionPane.label"); configureMessageLabel(label); addMessageComponents(container, cons, label, maxll, true); - if (!str.isEmpty()) { - addMessageComponents(container, cons, str, maxll, false); - } - } else { - if (nl >= 0) { - // break up newlines - if (nl == 0) { - @SuppressWarnings("serial") // anonymous class - JPanel breakPanel = new JPanel() { - public Dimension getPreferredSize() { - Font f = getFont(); - - if (f != null) { - return new Dimension(1, f.getSize() + 2); - } - return new Dimension(0, 0); - } - }; - breakPanel.setName("OptionPane.break"); - addMessageComponents(container, cons, breakPanel, maxll, - true); - } else { - addMessageComponents(container, cons, s.substring(0, nl), - maxll, false); - } - // Prevent recursion of more than - // 200 successive newlines in a message - // and indicate message is truncated via ellipsis - if (recursionCount++ > 200) { - recursionCount = 0; - addMessageComponents(container, cons, new String("..."), - maxll, false); - return; - } - addMessageComponents(container, cons, s.substring(nl + nll), maxll, - false); - - } else if (len > maxll) { - Container c = Box.createVerticalBox(); - c.setName("OptionPane.verticalBox"); - burstStringInto(c, s, maxll); - addMessageComponents(container, cons, c, maxll, true); - - } else { - JLabel label; - label = new JLabel(s, JLabel.LEADING); - label.setName("OptionPane.label"); - configureMessageLabel(label); - addMessageComponents(container, cons, label, maxll, true); - } } } } diff --git a/test/jdk/javax/swing/JOptionPane/TestJOptionHTMLTag.java b/test/jdk/javax/swing/JOptionPane/TestJOptionHTMLTag.java deleted file mode 100644 index 94318492bd93..000000000000 --- a/test/jdk/javax/swing/JOptionPane/TestJOptionHTMLTag.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2022, 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 5074006 - * @key headful - * @library /java/awt/regtesthelpers - * @build PassFailJFrame - * @summary Swing JOptionPane shows tag as a string after newline - * @run main/manual TestJOptionHTMLTag -*/ - -import javax.swing.JDialog; -import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; - -public class TestJOptionHTMLTag { - static String instructions - = """ - INSTRUCTIONS: - A dialog will be shown. - If it does not contain string, press Pass else press Fail. - """; - static PassFailJFrame passFailJFrame; - - public static void main(String[] args) throws Exception { - - SwingUtilities.invokeAndWait(() -> { - try { - String message = "" + "This is a test\n" + ""; - JOptionPane optionPane = new JOptionPane(); - optionPane.setMessage(message); - optionPane.setMessageType(JOptionPane.INFORMATION_MESSAGE); - JDialog dialog = new JDialog(); - dialog.setContentPane(optionPane); - dialog.pack(); - dialog.setVisible(true); - - passFailJFrame = new PassFailJFrame(instructions); - PassFailJFrame.addTestWindow(dialog); - PassFailJFrame.positionTestWindow(dialog, PassFailJFrame.Position.HORIZONTAL); - } catch (Exception e) { - e.printStackTrace(); - } - }); - passFailJFrame.awaitAndCheck(); - } -} - From 19ab37417fe70bf5fe31a2ad59cd68e991be60d7 Mon Sep 17 00:00:00 2001 From: Alexey Bakhtin Date: Tue, 9 Dec 2025 15:47:35 -0800 Subject: [PATCH 322/323] 8368032: Enhance Certificate Checking Reviewed-by: ahgross, coffeys, rhalade, mullan, abarashev --- .../provider/certpath/URICertStore.java | 358 +++++++++++++++++- .../share/conf/security/java.security | 45 +++ .../x509/URICertStore/AIACertTimeout.java | 2 + .../x509/URICertStore/ExtensionsWithLDAP.java | 92 ++--- 4 files changed, 451 insertions(+), 46 deletions(-) diff --git a/src/java.base/share/classes/sun/security/provider/certpath/URICertStore.java b/src/java.base/share/classes/sun/security/provider/certpath/URICertStore.java index 44f11cb09855..b837eee2f978 100644 --- a/src/java.base/share/classes/sun/security/provider/certpath/URICertStore.java +++ b/src/java.base/share/classes/sun/security/provider/certpath/URICertStore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2025, 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 @@ -29,6 +29,7 @@ import java.io.IOException; import java.net.HttpURLConnection; import java.net.URI; +import java.net.URISyntaxException; import java.net.URLConnection; import java.security.InvalidAlgorithmParameterException; import java.security.NoSuchAlgorithmException; @@ -48,8 +49,11 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; +import java.util.Optional; +import java.util.Set; import sun.security.action.GetPropertyAction; import sun.security.x509.AccessDescription; @@ -57,6 +61,9 @@ import sun.security.x509.URIName; import sun.security.util.Cache; import sun.security.util.Debug; +import sun.security.util.SecurityProperties; + +import javax.security.auth.x500.X500Principal; /** * A CertStore that retrieves Certificates or @@ -182,6 +189,165 @@ private static int initializeTimeout(String prop, int def) { return timeoutVal; } + /** + * Enumeration for the allowed schemes we support when following a + * URI from an authorityInfoAccess extension on a certificate. + */ + private enum AllowedScheme { + HTTP(HttpFtpRuleMatcher.HTTP), + HTTPS(HttpFtpRuleMatcher.HTTPS), + LDAP(LdapRuleMatcher.LDAP), + LDAPS(LdapRuleMatcher.LDAPS), + FTP(HttpFtpRuleMatcher.FTP); + + final URIRuleMatcher ruleMatcher; + + AllowedScheme(URIRuleMatcher matcher) { + ruleMatcher = matcher; + } + + /** + * Return an {@code AllowedScheme} based on a case-insensitive match + * @param name the scheme name to be matched + * @return the {@code AllowedScheme} that corresponds to the + * {@code name} provided, or null if there is no match. + */ + static AllowedScheme nameOf(String name) { + if (name == null) { + return null; + } + + try { + return AllowedScheme.valueOf(name.toUpperCase(Locale.ROOT)); + } catch (IllegalArgumentException iaEx) { + return null; + } + } + } + + private static Set CA_ISS_URI_FILTERS = null; + private static final boolean CA_ISS_ALLOW_ANY; + + static { + boolean allowAny = false; + try { + if (Builder.USE_AIA) { + CA_ISS_URI_FILTERS = new LinkedHashSet<>(); + String aiaPropVal = SecurityProperties.privilegedGetOverridable( + "com.sun.security.allowedAIALocations"); + aiaPropVal = (aiaPropVal != null)?aiaPropVal.trim():""; + if (aiaPropVal.equalsIgnoreCase("any")) { + allowAny = true; + if (debug != null) { + debug.println("allowedAIALocations: Warning: " + + "Allow-All URI filtering enabled!"); + } + } else { + // Load all the valid rules from the Security property + if (!aiaPropVal.isEmpty()) { + String[] aiaUriStrs = aiaPropVal.trim().split("\\s+"); + addCaIssUriFilters(aiaUriStrs); + } + + if (CA_ISS_URI_FILTERS.isEmpty()) { + if (debug != null) { + debug.println("allowedAIALocations: Warning: " + + "No valid filters found. Deny-all URI " + + "filtering is active."); + } + } + } + } + } finally { + CA_ISS_ALLOW_ANY = allowAny; + } + } + + /** + * Populate the filter collection from the list of AIA CA issuer URIs + * found in the {@code com.sun.security.allowedAIALocations} security + * or system property. + * + * @param aiaUriStrs array containing String URI filters + */ + private static void addCaIssUriFilters(String[] aiaUriStrs) { + for (String aiaStr : aiaUriStrs) { + if (aiaStr != null && !aiaStr.isEmpty()) { + try { + AllowedScheme scheme; + URI aiaUri = new URI(aiaStr).normalize(); + // It must be absolute and non-opaque + if (!aiaUri.isAbsolute() || aiaUri.isOpaque()) { + if (debug != null) { + debug.println("allowedAIALocations: Skipping " + + "non-absolute or opaque URI " + aiaUri); + } + } else if (aiaUri.getHost() == null) { + // We do not allow rules with URIs that omit a hostname + // or address. + if (debug != null) { + debug.println("allowedAIALocations: Skipping " + + "URI rule with no hostname or address: " + + aiaUri); + } + } else if ((scheme = AllowedScheme.nameOf( + aiaUri.getScheme())) != null) { + // When it is an LDAP type, we can check the path + // portion (the DN) for proper structure and reject + // the rule early if it isn't correct. + if (scheme == AllowedScheme.LDAP || + scheme == AllowedScheme.LDAPS) { + try { + new X500Principal(aiaUri.getPath(). + replaceFirst("^/+", "")); + } catch (IllegalArgumentException iae) { + if (debug != null) { + debug.println("allowedAIALocations: " + + "Skipping LDAP rule: " + iae); + } + continue; + } + } + + // When a URI has a non-null query or fragment + // warn the user upon adding the rule that those + // components will be ignored + if (aiaUri.getQuery() != null) { + if (debug != null) { + debug.println("allowedAIALocations: " + + "Rule will ignore non-null query"); + } + } + if (aiaUri.getFragment() != null) { + if (debug != null) { + debug.println("allowedAIALocations: " + + "Rule will ignore non-null fragment"); + } + } + + CA_ISS_URI_FILTERS.add(aiaUri); + if (debug != null) { + debug.println("allowedAIALocations: Added " + + aiaUri + " to URI filters"); + } + } else { + if (debug != null) { + debug.println("allowedAIALocations: Disallowed " + + "filter URI scheme: " + + aiaUri.getScheme()); + } + } + } catch (URISyntaxException urise) { + if (debug != null) { + debug.println("allowedAIALocations: Skipping " + + "filter URI entry " + aiaStr + + ": parse failure at index " + urise.getIndex()); + } + } + } + } + } + /** * Creates a URICertStore. * @@ -244,6 +410,39 @@ static CertStore getInstance(AccessDescription ad) { return null; } URI uri = ((URIName) gn).getURI(); + + // Before performing any instantiation make sure that + // the URI passes any filtering rules. This processing should + // only occur if the com.sun.security.enableAIAcaIssuers is true + // and the "any" rule has not been specified. + if (Builder.USE_AIA && !CA_ISS_ALLOW_ANY) { + URI normAIAUri = uri.normalize(); + AllowedScheme scheme = AllowedScheme.nameOf(normAIAUri.getScheme()); + + if (scheme == null) { + if (debug != null) { + debug.println("allowedAIALocations: No matching ruleset " + + "for scheme " + normAIAUri.getScheme()); + } + return null; + } + + // Go through each of the filter rules and see if any will + // make a positive match against the caIssuer URI. If nothing + // matches then we won't instantiate a URICertStore. + if (CA_ISS_URI_FILTERS.stream().noneMatch(rule -> + scheme.ruleMatcher.matchRule(rule, normAIAUri))) { + if (debug != null) { + debug.println("allowedAIALocations: Warning - " + + "The caIssuer URI " + normAIAUri + + " in the AuthorityInfoAccess extension is denied " + + "access. Use the com.sun.security.allowedAIALocations" + + " security/system property to allow access."); + } + return null; + } + } + try { return URICertStore.getInstance(new URICertStoreParameters(uri)); } catch (Exception ex) { @@ -270,7 +469,7 @@ static CertStore getInstance(AccessDescription ad) { @Override @SuppressWarnings("unchecked") public synchronized Collection engineGetCertificates - (CertSelector selector) throws CertStoreException { + (CertSelector selector) throws CertStoreException { if (ldap) { // caching mechanism, see the class description for more info. @@ -462,4 +661,159 @@ protected UCS(CertStoreSpi spi, Provider p, String type, super(spi, p, type, params); } } + + /** + * URIRuleMatcher - abstract base class for the rule sets used for + * various URI schemes. + */ + static abstract class URIRuleMatcher { + protected final int wellKnownPort; + + protected URIRuleMatcher(int port) { + wellKnownPort = port; + } + + /** + * Attempt to match the scheme, host and port between a filter + * rule URI and a URI coming from an AIA extension. + * + * @param filterRule the filter rule to match against + * @param caIssuer the AIA URI being compared + * @return true if the scheme, host and port numbers match, false if + * any of the components do not match. If a port number is omitted in + * either the filter rule or AIA URI, the well-known port for that + * scheme is used in the comparison. + */ + boolean schemeHostPortCheck(URI filterRule, URI caIssuer) { + if (!filterRule.getScheme().equalsIgnoreCase( + caIssuer.getScheme())) { + return false; + } else if (!filterRule.getHost().equalsIgnoreCase( + caIssuer.getHost())) { + return false; + } else { + try { + // Check for port matching, taking into consideration + // default ports + int fPort = (filterRule.getPort() == -1) ? wellKnownPort : + filterRule.getPort(); + int caiPort = (caIssuer.getPort() == -1) ? wellKnownPort : + caIssuer.getPort(); + if (fPort != caiPort) { + return false; + } + } catch (IllegalArgumentException iae) { + return false; + } + } + return true; + } + + /** + * Attempt to match an AIA URI against a specific filter rule. The + * specific rules to apply are implementation dependent. + * + * @param filterRule the filter rule to match against + * @param caIssuer the AIA URI being compared + * @return true if all matching rules pass, false if any fail. + */ + abstract boolean matchRule(URI filterRule, URI caIssuer); + } + + static class HttpFtpRuleMatcher extends URIRuleMatcher { + static final HttpFtpRuleMatcher HTTP = new HttpFtpRuleMatcher(80); + static final HttpFtpRuleMatcher HTTPS = new HttpFtpRuleMatcher(443); + static final HttpFtpRuleMatcher FTP = new HttpFtpRuleMatcher(21); + + private HttpFtpRuleMatcher(int port) { + super(port); + } + + @Override + boolean matchRule(URI filterRule, URI caIssuer) { + // Check for scheme/host/port matching + if (!schemeHostPortCheck(filterRule, caIssuer)) { + return false; + } + + // Check the path component to make sure the filter is at + // least a root of the AIA caIssuer URI's path. It must be + // a case-sensitive match for all platforms. + if (!isRootOf(filterRule, caIssuer)) { + if (debug != null) { + debug.println("allowedAIALocations: Match failed: " + + "AIA URI is not within the rule's path hierarchy."); + } + return false; + } + return true; + } + + /** + * Performs a hierarchical containment check, ensuring that the + * base URI's path is a root component of the candidate path. The + * path comparison is case-sensitive. If the base path ends in a + * slash (/) then all candidate paths that begin with the base + * path are allowed. If it does not end in a slash, then it is + * assumed that the leaf node in the base path is a file component + * and both paths must match exactly. + * + * @param base the URI that contains the root path + * @param candidate the URI that contains the path being evaluated + * @return true if {@code candidate} is a child path of {@code base}, + * false otherwise. + */ + private static boolean isRootOf(URI base, URI candidate) { + // Note: The URIs have already been normalized at this point and + // HTTP URIs cannot have null paths. If it's an empty path + // then consider the path to be "/". + String basePath = Optional.of(base.getPath()). + filter(p -> !p.isEmpty()).orElse("/"); + String candPath = Optional.of(candidate.getPath()). + filter(p -> !p.isEmpty()).orElse("/"); + return (basePath.endsWith("/")) ? candPath.startsWith(basePath) : + candPath.equals(basePath); + } + } + + static class LdapRuleMatcher extends URIRuleMatcher { + static final LdapRuleMatcher LDAP = new LdapRuleMatcher(389); + static final LdapRuleMatcher LDAPS = new LdapRuleMatcher(636); + + private LdapRuleMatcher(int port) { + super(port); + } + + @Override + boolean matchRule(URI filterRule, URI caIssuer) { + // Check for scheme/host/port matching + if (!schemeHostPortCheck(filterRule, caIssuer)) { + return false; + } + + // Obtain the base DN component and compare + try { + X500Principal filterBaseDn = new X500Principal( + filterRule.getPath().replaceFirst("^/+", "")); + X500Principal caIssBaseDn = new X500Principal( + caIssuer.getPath().replaceFirst("^/+", "")); + if (!filterBaseDn.equals(caIssBaseDn)) { + if (debug != null) { + debug.println("allowedAIALocations: Match failed: " + + "Base DN mismatch (" + filterBaseDn + " vs " + + caIssBaseDn + ")"); + } + return false; + } + } catch (IllegalArgumentException iae) { + if (debug != null) { + debug.println("allowedAIALocations: Match failed on DN: " + + iae); + } + return false; + } + + return true; + } + } } diff --git a/src/java.base/share/conf/security/java.security b/src/java.base/share/conf/security/java.security index 6b0fd201b9b9..c701c178c428 100644 --- a/src/java.base/share/conf/security/java.security +++ b/src/java.base/share/conf/security/java.security @@ -1545,3 +1545,48 @@ jdk.tls.alpnCharset=ISO_8859_1 # # [1] https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-sfu/bde93b0e-f3c9-4ddf-9f44-e1453be7af5a #jdk.security.krb5.s4u2proxy.acceptNonForwardableServiceTicket=false + +# +# X.509 AuthorityInfoAccess caIssuer URI Filtering +# +# This property defines a whitespace-separated list of filters that +# are applied to URIs found in the authorityInfoAccess extension in +# X.509 certificates. Any caIssuers URIs in X.509 certificates are only +# followed when the com.sun.security.enableAIAcaIssuers System property is +# enabled and the filter allows the URI. By default this property imposes a +# deny-all ruleset. This property may be overridden by a System property +# of the same name. +# +# The filters must take the form of absolute, hierarchical URIs as defined by +# the java.net.URI class. Additionally, only the following protocols are +# allowed as filters: http, https, ldap and ftp. +# See RFC 5280, section 4.2.2.1 for details about the types of URIs allowed for +# the extension and their specific requirements. +# The filter matching rules are applied to each CA issuer URI as follows: +# 1. The scheme must match (case-insensitive). +# 2. A hostname or address must be specified in the filter URI. It must match +# the host or address in the caIssuers URI (case-insensitive). No name +# resolution is performed on hostnames to match IP addresses. +# 3. The port number must match. For filter and caIssuer URIs, when a port +# number is omitted, the well-known port for that scheme will be used in the +# comparison. +# 4. For hierarchical filesystem schemes (e.g. http[s], ftp): +# a. The normalized path portion of the filter URI is matched in a +# case-sensitive manner. If the final component of the path does not end +# in a slash (/), it is considered to be a file path component and must +# be an exact match of the caIssuer's URI file path component. If the +# final filter component ends in a slash, then it must either match or be +# a prefix of the caIssuer's URI path component (e.g. a filter path of +# /ab/cd/ will match a caIssuer path of /ab/cd/, /ab/cd/ef and +# /ab/cd/ef/ghi). +# b. Query strings will be ignored in filter rules and caIssuer URIs. +# c. Fragments will be ignored in filter rules and caIssuer URIs. +# 5. For ldap URIs: +# a. The base DN must be an exact match (case-insensitive). +# b. Any query string in the rule, if specified, is ignored. +# 6. A single value "any" (case-insensitive) will create an allow-all rule. +# +# As an example, here is a valid filter policy consisting of two rules: +# com.sun.security.allowedAIALocations=http://some.company.com/cacert \ +# ldap://ldap.company.com/dc=company,dc=com?caCertificate;binary +com.sun.security.allowedAIALocations= diff --git a/test/jdk/sun/security/x509/URICertStore/AIACertTimeout.java b/test/jdk/sun/security/x509/URICertStore/AIACertTimeout.java index cabb225bf1cc..5491d7b0d7af 100644 --- a/test/jdk/sun/security/x509/URICertStore/AIACertTimeout.java +++ b/test/jdk/sun/security/x509/URICertStore/AIACertTimeout.java @@ -47,6 +47,7 @@ import java.io.*; import java.math.BigInteger; import java.net.InetSocketAddress; +import java.security.Security; import java.security.cert.*; import java.security.KeyPair; import java.security.KeyPairGenerator; @@ -69,6 +70,7 @@ public class AIACertTimeout { private static X509Certificate eeCert; public static void main(String[] args) throws Exception { + Security.setProperty("com.sun.security.allowedAIALocations", "any"); int servTimeoutMsec = (args != null && args.length >= 1) ? Integer.parseInt(args[0]) : -1; boolean expectedPass = args != null && args.length >= 2 && diff --git a/test/jdk/sun/security/x509/URICertStore/ExtensionsWithLDAP.java b/test/jdk/sun/security/x509/URICertStore/ExtensionsWithLDAP.java index 3b598d78d9f5..c5f01464a5e8 100644 --- a/test/jdk/sun/security/x509/URICertStore/ExtensionsWithLDAP.java +++ b/test/jdk/sun/security/x509/URICertStore/ExtensionsWithLDAP.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2025, 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 @@ -38,6 +38,7 @@ import java.io.IOException; import java.net.InetSocketAddress; import java.net.Socket; +import java.security.Security; import java.security.cert.CertPath; import java.security.cert.CertPathValidator; import java.security.cert.CertPathValidatorException; @@ -47,7 +48,6 @@ import java.security.cert.TrustAnchor; import java.security.cert.X509Certificate; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -67,25 +67,27 @@ public class ExtensionsWithLDAP { * Not After : Jan 17 18:03:59 2043 GMT * Subject: CN=Root */ - private static final String CA_CERT = "" - + "-----BEGIN CERTIFICATE-----\n" - + "MIIC8TCCAdmgAwIBAgIJAJsSNtj5wdqqMA0GCSqGSIb3DQEBDQUAMA8xDTALBgNV\n" - + "BAMMBFJvb3QwHhcNMTUwOTAxMTgwMzU5WhcNNDMwMTE3MTgwMzU5WjAPMQ0wCwYD\n" - + "VQQDDARSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvj892vPm\n" - + "bB++x9QqqyBveP+ZqQ2B1stV7vh5JmDnOTevkZUOcemp3SXu/esNLSbpL+fARYXH\n" - + "V5ubnrfip6RbvcxPfVIIDJrRTLIIsU6W7M6/LJLbLkEVGy4ZV4IHkOw9W2O92rcv\n" - + "BkoqhzZnOTGR6uT3rRcKx4RevEKBKhZO+OPPf//lnckOybmYL7t7yQrajzHro76b\n" - + "QTXYjAUq/DKhglXfC7vF/JzlAvG2IunGmIfjGcnuDo/9X3Bxef/q5TxCS35fvb7t\n" - + "svC+g2QhTcBkQh4uNW2jSjlTIVp1uErCfP5aCjLaez5mqmb1hxPIlcvsNR23HwU6\n" - + "bQO7z7NBo9Do6QIDAQABo1AwTjAdBgNVHQ4EFgQUmLZNOBBkqdYoElyxklPYHmAb\n" - + "QXIwHwYDVR0jBBgwFoAUmLZNOBBkqdYoElyxklPYHmAbQXIwDAYDVR0TBAUwAwEB\n" - + "/zANBgkqhkiG9w0BAQ0FAAOCAQEAYV4fOhDi5q7+XNXCxO8Eil2frR9jqdP4LaQp\n" - + "3L0evW0gvPX68s2WmkPWzIu4TJcpdGFQqxyQFSXuKBXjthyiln77QItGTHWeafES\n" - + "q5ESrKdSaJZq1bTIrrReCIP74f+fY/F4Tnb3dCqzaljXfzpdbeRsIW6gF71xcOUQ\n" - + "nnPEjGVPLUegN+Wn/jQpeLxxIB7FmNXncdRUfMfZ43xVSKuMCy1UUYqJqTa/pXZj\n" - + "jCMeRPThRjRqHlJ69jStfWUQATbLyj9KN09rUaJxzmUSt61UqJi7sjcGySaCjAJc\n" - + "IcCdVmX/DmRLsdv8W36O3MgrvpT1zR3kaAlv2d8HppnBqcL3xg==\n" - + "-----END CERTIFICATE-----"; + private static final String CA_CERT = + """ + -----BEGIN CERTIFICATE----- + MIIC8TCCAdmgAwIBAgIJAJsSNtj5wdqqMA0GCSqGSIb3DQEBDQUAMA8xDTALBgNV + BAMMBFJvb3QwHhcNMTUwOTAxMTgwMzU5WhcNNDMwMTE3MTgwMzU5WjAPMQ0wCwYD + VQQDDARSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvj892vPm + bB++x9QqqyBveP+ZqQ2B1stV7vh5JmDnOTevkZUOcemp3SXu/esNLSbpL+fARYXH + V5ubnrfip6RbvcxPfVIIDJrRTLIIsU6W7M6/LJLbLkEVGy4ZV4IHkOw9W2O92rcv + BkoqhzZnOTGR6uT3rRcKx4RevEKBKhZO+OPPf//lnckOybmYL7t7yQrajzHro76b + QTXYjAUq/DKhglXfC7vF/JzlAvG2IunGmIfjGcnuDo/9X3Bxef/q5TxCS35fvb7t + svC+g2QhTcBkQh4uNW2jSjlTIVp1uErCfP5aCjLaez5mqmb1hxPIlcvsNR23HwU6 + bQO7z7NBo9Do6QIDAQABo1AwTjAdBgNVHQ4EFgQUmLZNOBBkqdYoElyxklPYHmAb + QXIwHwYDVR0jBBgwFoAUmLZNOBBkqdYoElyxklPYHmAbQXIwDAYDVR0TBAUwAwEB + /zANBgkqhkiG9w0BAQ0FAAOCAQEAYV4fOhDi5q7+XNXCxO8Eil2frR9jqdP4LaQp + 3L0evW0gvPX68s2WmkPWzIu4TJcpdGFQqxyQFSXuKBXjthyiln77QItGTHWeafES + q5ESrKdSaJZq1bTIrrReCIP74f+fY/F4Tnb3dCqzaljXfzpdbeRsIW6gF71xcOUQ + nnPEjGVPLUegN+Wn/jQpeLxxIB7FmNXncdRUfMfZ43xVSKuMCy1UUYqJqTa/pXZj + jCMeRPThRjRqHlJ69jStfWUQATbLyj9KN09rUaJxzmUSt61UqJi7sjcGySaCjAJc + IcCdVmX/DmRLsdv8W36O3MgrvpT1zR3kaAlv2d8HppnBqcL3xg== + -----END CERTIFICATE----- + """; /* * Certificate: @@ -106,39 +108,41 @@ public class ExtensionsWithLDAP { * Authority Information Access: * CA Issuers - URI:ldap://ldap.host.for.aia/dc=Root?cACertificate */ - private static final String EE_CERT = "" - + "-----BEGIN CERTIFICATE-----\n" - + "MIIDHTCCAgWgAwIBAgIBBzANBgkqhkiG9w0BAQ0FADAPMQ0wCwYDVQQDDARSb290\n" - + "MB4XDTE1MDkwMTE4MDM1OVoXDTQzMDExNzE4MDM1OVowDTELMAkGA1UEAwwCRUUw\n" - + "ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpyz97liuWPDYcLH9TX8Bi\n" - + "T78olCmAfmevvch6ncXUVuCzbdaKuKXwn4EVbDszsVJLoK5zdtP+X3iDhutj+IgK\n" - + "mLhuczF3M9VIcWr+JJUyTH4+3h/RT8cjCDZOmk9iXkb5ifruVsLqzb9g+Vp140Oz\n" - + "7leikne7KmclHvTfvFd0WDI7Gb9vo4f5rT717BXJ/n+M6pNk8DLpLiEu6eziYvXR\n" - + "v5x+t5Go3x0eCXdaxEQUf2j876Wfr2qHRJK7lDfFe1DDsMg/KpKGiILYZ+g2qtVM\n" - + "ZSxtp5BZEtfB5qV/IE5kWO+mCIAGpXSZIdbERR6pZUq8GLEe1T9e+sO6H24w2F19\n" - + "AgMBAAGjgYUwgYIwNAYDVR0fBC0wKzApoCegJYYjbGRhcDovL2xkYXAuaG9zdC5m\n" - + "b3IuY3JsZHAvbWFpbi5jcmwwSgYIKwYBBQUHAQEEPjA8MDoGCCsGAQUFBzAChi5s\n" - + "ZGFwOi8vbGRhcC5ob3N0LmZvci5haWEvZGM9Um9vdD9jQUNlcnRpZmljYXRlMA0G\n" - + "CSqGSIb3DQEBDQUAA4IBAQBWDfZHpuUx0yn5d3+BuztFqoks1MkGdk+USlH0TB1/\n" - + "gWWBd+4S4PCKlpSur0gj2rMW4fP5HQfNlHci8JV8/bG4KuKRAXW56dg1818Hl3pc\n" - + "iIrUSRn8uUjH3p9qb+Rb/u3mmVQRyJjN2t/zceNsO8/+Dd808OB9aEwGs8lMT0nn\n" - + "ZYaaAqYz1GIY/Ecyx1vfEZEQ1ljo6i/r70C3igbypBUShxSiGsleiVTLOGNA+MN1\n" - + "/a/Qh0bkaQyTGqK3bwvzzMeQVqWu2EWTBD/PmND5ExkpRICdv8LBVXfLnpoBr4lL\n" - + "hnxn9+e0Ah+t8dS5EKfn44w5bI5PCu2bqxs6RCTxNjcY\n" - + "-----END CERTIFICATE-----"; + private static final String EE_CERT = + """ + -----BEGIN CERTIFICATE----- + MIIDHTCCAgWgAwIBAgIBBzANBgkqhkiG9w0BAQ0FADAPMQ0wCwYDVQQDDARSb290 + MB4XDTE1MDkwMTE4MDM1OVoXDTQzMDExNzE4MDM1OVowDTELMAkGA1UEAwwCRUUw + ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpyz97liuWPDYcLH9TX8Bi + T78olCmAfmevvch6ncXUVuCzbdaKuKXwn4EVbDszsVJLoK5zdtP+X3iDhutj+IgK + mLhuczF3M9VIcWr+JJUyTH4+3h/RT8cjCDZOmk9iXkb5ifruVsLqzb9g+Vp140Oz + 7leikne7KmclHvTfvFd0WDI7Gb9vo4f5rT717BXJ/n+M6pNk8DLpLiEu6eziYvXR + v5x+t5Go3x0eCXdaxEQUf2j876Wfr2qHRJK7lDfFe1DDsMg/KpKGiILYZ+g2qtVM + ZSxtp5BZEtfB5qV/IE5kWO+mCIAGpXSZIdbERR6pZUq8GLEe1T9e+sO6H24w2F19 + AgMBAAGjgYUwgYIwNAYDVR0fBC0wKzApoCegJYYjbGRhcDovL2xkYXAuaG9zdC5m + b3IuY3JsZHAvbWFpbi5jcmwwSgYIKwYBBQUHAQEEPjA8MDoGCCsGAQUFBzAChi5s + ZGFwOi8vbGRhcC5ob3N0LmZvci5haWEvZGM9Um9vdD9jQUNlcnRpZmljYXRlMA0G + CSqGSIb3DQEBDQUAA4IBAQBWDfZHpuUx0yn5d3+BuztFqoks1MkGdk+USlH0TB1/ + gWWBd+4S4PCKlpSur0gj2rMW4fP5HQfNlHci8JV8/bG4KuKRAXW56dg1818Hl3pc + iIrUSRn8uUjH3p9qb+Rb/u3mmVQRyJjN2t/zceNsO8/+Dd808OB9aEwGs8lMT0nn + ZYaaAqYz1GIY/Ecyx1vfEZEQ1ljo6i/r70C3igbypBUShxSiGsleiVTLOGNA+MN1 + /a/Qh0bkaQyTGqK3bwvzzMeQVqWu2EWTBD/PmND5ExkpRICdv8LBVXfLnpoBr4lL + hnxn9+e0Ah+t8dS5EKfn44w5bI5PCu2bqxs6RCTxNjcY + -----END CERTIFICATE-----"""; public static void main(String[] args) throws Exception { String extension = args[0]; String targetHost = args[1]; - + Security.setProperty("com.sun.security.allowedAIALocations", + "ldap://" + targetHost + "/dc=Root"); X509Certificate trustedCert = loadCertificate(CA_CERT); X509Certificate eeCert = loadCertificate(EE_CERT); Set trustedCertsSet = new HashSet<>(); trustedCertsSet.add(new TrustAnchor(trustedCert, null)); - CertPath cp = (CertPath) CertificateFactory.getInstance("X509") - .generateCertPath(Arrays.asList(eeCert)); + CertPath cp = CertificateFactory.getInstance("X509") + .generateCertPath(List.of(eeCert)); // CertPath validator should try to parse CRLDP and AIA extensions, // and load CRLs/certs which they point to. From 403d089f5740f69f456bbebe1179619aa693ec9c Mon Sep 17 00:00:00 2001 From: Matthias Baesken Date: Wed, 14 Jan 2026 08:07:48 +0000 Subject: [PATCH 323/323] 8374209: [17u,21u] Backout JDK-8361748 due to JDK-8373727 Reviewed-by: mdoerr --- .../sun/awt/image/XbmImageDecoder.java | 205 ++++++++---------- .../awt/image/XBMDecoder/XBMDecoderTest.java | 77 ------- .../jdk/java/awt/image/XBMDecoder/invalid.xbm | 2 - .../java/awt/image/XBMDecoder/invalid_hex.xbm | 3 - .../java/awt/image/XBMDecoder/invalid_ht.xbm | 3 - test/jdk/java/awt/image/XBMDecoder/valid.xbm | 6 - .../java/awt/image/XBMDecoder/valid_hex.xbm | 4 - 7 files changed, 88 insertions(+), 212 deletions(-) delete mode 100644 test/jdk/java/awt/image/XBMDecoder/XBMDecoderTest.java delete mode 100644 test/jdk/java/awt/image/XBMDecoder/invalid.xbm delete mode 100644 test/jdk/java/awt/image/XBMDecoder/invalid_hex.xbm delete mode 100644 test/jdk/java/awt/image/XBMDecoder/invalid_ht.xbm delete mode 100644 test/jdk/java/awt/image/XBMDecoder/valid.xbm delete mode 100644 test/jdk/java/awt/image/XBMDecoder/valid_hex.xbm diff --git a/src/java.desktop/share/classes/sun/awt/image/XbmImageDecoder.java b/src/java.desktop/share/classes/sun/awt/image/XbmImageDecoder.java index cac9f8baab20..03b36b3b819a 100644 --- a/src/java.desktop/share/classes/sun/awt/image/XbmImageDecoder.java +++ b/src/java.desktop/share/classes/sun/awt/image/XbmImageDecoder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2018, 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 @@ -23,22 +23,13 @@ * questions. */ -/* +/*- * Reads xbitmap format images into a DIBitmap structure. */ package sun.awt.image; -import java.awt.image.ImageConsumer; -import java.awt.image.IndexColorModel; -import java.io.BufferedInputStream; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import static java.lang.Math.multiplyExact; +import java.io.*; +import java.awt.image.*; /** * Parse files of the form: @@ -59,8 +50,6 @@ public class XbmImageDecoder extends ImageDecoder { ImageConsumer.COMPLETESCANLINES | ImageConsumer.SINGLEPASS | ImageConsumer.SINGLEFRAME); - private static final int MAX_XBM_SIZE = 16384; - private static final int HEADER_SCAN_LIMIT = 100; public XbmImageDecoder(InputStreamImageSource src, InputStream is) { super(src, is); @@ -83,125 +72,107 @@ private static void error(String s1) throws ImageFormatException { * produce an image from the stream. */ public void produceImage() throws IOException, ImageFormatException { + char[] nm = new char[80]; + int c; + int i = 0; + int state = 0; int H = 0; int W = 0; int x = 0; int y = 0; - int n = 0; - int state = 0; + boolean start = true; byte[] raster = null; IndexColorModel model = null; - - String matchRegex = "(0[xX])?[0-9a-fA-F]+[\\s+]?[,|};]"; - String replaceRegex = "(0[xX])|,|[\\s+]|[};]"; - - String line; - int lineNum = 0; - - try (BufferedReader br = new BufferedReader(new InputStreamReader(input))) { - // loop to process XBM header - width, height and create raster - while (!aborted && (line = br.readLine()) != null - && lineNum <= HEADER_SCAN_LIMIT) { - lineNum++; - // process #define stmts - if (line.trim().startsWith("#define")) { - String[] token = line.split("\\s+"); - if (token.length != 3) { - error("Error while parsing define statement"); - } - try { - if (!token[2].isBlank() && state == 0) { - W = Integer.parseInt(token[2]); - state = 1; // after width is set - } else if (!token[2].isBlank() && state == 1) { - H = Integer.parseInt(token[2]); - state = 2; // after height is set - } - } catch (NumberFormatException nfe) { - // parseInt() can throw NFE - error("Error while parsing width or height."); + while (!aborted && (c = input.read()) != -1) { + if ('a' <= c && c <= 'z' || + 'A' <= c && c <= 'Z' || + '0' <= c && c <= '9' || c == '#' || c == '_') { + if (i < 78) + nm[i++] = (char) c; + } else if (i > 0) { + int nc = i; + i = 0; + if (start) { + if (nc != 7 || + nm[0] != '#' || + nm[1] != 'd' || + nm[2] != 'e' || + nm[3] != 'f' || + nm[4] != 'i' || + nm[5] != 'n' || + nm[6] != 'e') + { + error("Not an XBM file"); } + start = false; } - - if (state == 2) { - if (W <= 0 || H <= 0) { - error("Invalid values for width or height."); - } - if (multiplyExact(W, H) > MAX_XBM_SIZE) { - error("Large XBM file size." - + " Maximum allowed size: " + MAX_XBM_SIZE); + if (nm[nc - 1] == 'h') + state = 1; /* expecting width */ + else if (nm[nc - 1] == 't' && nc > 1 && nm[nc - 2] == 'h') + state = 2; /* expecting height */ + else if (nc > 2 && state < 0 && nm[0] == '0' && nm[1] == 'x') { + int n = 0; + for (int p = 2; p < nc; p++) { + c = nm[p]; + if ('0' <= c && c <= '9') + c = c - '0'; + else if ('A' <= c && c <= 'Z') + c = c - 'A' + 10; + else if ('a' <= c && c <= 'z') + c = c - 'a' + 10; + else + c = 0; + n = n * 16 + c; } - model = new IndexColorModel(8, 2, XbmColormap, - 0, false, 0); - setDimensions(W, H); - setColorModel(model); - setHints(XbmHints); - headerComplete(); - raster = new byte[W]; - state = 3; - break; - } - } - - if (state != 3) { - error("Width or Height of XBM file not defined"); - } - - // loop to process image data - while (!aborted && (line = br.readLine()) != null) { - lineNum++; - - if (line.contains("[]")) { - Matcher matcher = Pattern.compile(matchRegex).matcher(line); - while (matcher.find()) { - if (y >= H) { - error("Scan size of XBM file exceeds" - + " the defined width x height"); - } - - int startIndex = matcher.start(); - int endIndex = matcher.end(); - String hexByte = line.substring(startIndex, endIndex); - - if (!(hexByte.startsWith("0x") - || hexByte.startsWith("0X"))) { - error("Invalid hexadecimal number at Ln#:" + lineNum - + " Col#:" + (startIndex + 1)); + for (int mask = 1; mask <= 0x80; mask <<= 1) { + if (x < W) { + if ((n & mask) != 0) + raster[x] = 1; + else + raster[x] = 0; } - hexByte = hexByte.replaceAll(replaceRegex, ""); - if (hexByte.length() != 2) { - error("Invalid hexadecimal number at Ln#:" + lineNum - + " Col#:" + (startIndex + 1)); + x++; + } + if (x >= W) { + if (setPixels(0, y, W, 1, model, raster, 0, W) <= 0) { + return; } - - try { - n = Integer.parseInt(hexByte, 16); - } catch (NumberFormatException nfe) { - error("Error parsing hexadecimal at Ln#:" + lineNum - + " Col#:" + (startIndex + 1)); + x = 0; + if (y++ >= H) { + break; } - for (int mask = 1; mask <= 0x80; mask <<= 1) { - if (x < W) { - if ((n & mask) != 0) - raster[x] = 1; - else - raster[x] = 0; - } - x++; + } + } else { + int n = 0; + for (int p = 0; p < nc; p++) + if ('0' <= (c = nm[p]) && c <= '9') + n = n * 10 + c - '0'; + else { + n = -1; + break; } - - if (x >= W) { - int result = setPixels(0, y, W, 1, model, raster, 0, W); - if (result <= 0) { - error("Unexpected error occurred during setPixel()"); - } - x = 0; - y++; + if (n > 0 && state > 0) { + if (state == 1) + W = n; + else + H = n; + if (W == 0 || H == 0) + state = 0; + else { + model = new IndexColorModel(8, 2, XbmColormap, + 0, false, 0); + setDimensions(W, H); + setColorModel(model); + setHints(XbmHints); + headerComplete(); + raster = new byte[W]; + state = -1; } } } } - imageComplete(ImageConsumer.STATICIMAGEDONE, true); } + input.close(); + imageComplete(ImageConsumer.STATICIMAGEDONE, true); } } diff --git a/test/jdk/java/awt/image/XBMDecoder/XBMDecoderTest.java b/test/jdk/java/awt/image/XBMDecoder/XBMDecoderTest.java deleted file mode 100644 index 19bc6d95c392..000000000000 --- a/test/jdk/java/awt/image/XBMDecoder/XBMDecoderTest.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2025, 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 8361748 - * @summary Tests XBM image size limits and if XBMImageDecoder.produceImage() - * throws appropriate error when parsing invalid XBM image data. - * @run main XBMDecoderTest - */ - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.PrintStream; -import javax.swing.ImageIcon; - -public class XBMDecoderTest { - - public static void main(String[] args) throws Exception { - String dir = System.getProperty("test.src"); - PrintStream originalErr = System.err; - boolean validCase; - - File currentDir = new File(dir); - File[] files = currentDir.listFiles((File d, String s) - -> s.endsWith(".xbm")); - - for (File file : files) { - String fileName = file.getName(); - validCase = fileName.startsWith("valid"); - - System.out.println("--- Testing " + fileName + " ---"); - try (FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream errContent = new ByteArrayOutputStream()) { - System.setErr(new PrintStream(errContent)); - - ImageIcon icon = new ImageIcon(fis.readAllBytes()); - boolean isErrEmpty = errContent.toString().isEmpty(); - if (!isErrEmpty) { - System.out.println("Expected ImageFormatException occurred."); - System.out.print(errContent); - } - - if (validCase && !isErrEmpty) { - throw new RuntimeException("Test failed: Error stream not empty"); - } else if (!validCase && isErrEmpty) { - throw new RuntimeException("Test failed: ImageFormatException" - + " expected but not thrown"); - } - System.out.println("PASSED\n"); - } finally { - System.setErr(originalErr); - } - } - } -} diff --git a/test/jdk/java/awt/image/XBMDecoder/invalid.xbm b/test/jdk/java/awt/image/XBMDecoder/invalid.xbm deleted file mode 100644 index 8a8cfc276322..000000000000 --- a/test/jdk/java/awt/image/XBMDecoder/invalid.xbm +++ /dev/null @@ -1,2 +0,0 @@ -#define k_ht 3 -h` k[] = { 01x0, 42222222222236319330:: diff --git a/test/jdk/java/awt/image/XBMDecoder/invalid_hex.xbm b/test/jdk/java/awt/image/XBMDecoder/invalid_hex.xbm deleted file mode 100644 index c6f819582d0e..000000000000 --- a/test/jdk/java/awt/image/XBMDecoder/invalid_hex.xbm +++ /dev/null @@ -1,3 +0,0 @@ -#define k_wt 16 -#define k_ht 1 -k[] = { 0x10, 1234567890}; diff --git a/test/jdk/java/awt/image/XBMDecoder/invalid_ht.xbm b/test/jdk/java/awt/image/XBMDecoder/invalid_ht.xbm deleted file mode 100644 index 5244651a4cb4..000000000000 --- a/test/jdk/java/awt/image/XBMDecoder/invalid_ht.xbm +++ /dev/null @@ -1,3 +0,0 @@ -#define k_wt 16 -#define k_ht 0 -k[] = { 0x10, 0x12}; diff --git a/test/jdk/java/awt/image/XBMDecoder/valid.xbm b/test/jdk/java/awt/image/XBMDecoder/valid.xbm deleted file mode 100644 index 23b57b2c8116..000000000000 --- a/test/jdk/java/awt/image/XBMDecoder/valid.xbm +++ /dev/null @@ -1,6 +0,0 @@ -#define test_width 16 -#define test_height 3 -#define ht_x 1 -#define ht_y 2 -static unsigned char test_bits[] = { -0x13, 0x11, 0x15, 0x00, 0xAB, 0xcd }; diff --git a/test/jdk/java/awt/image/XBMDecoder/valid_hex.xbm b/test/jdk/java/awt/image/XBMDecoder/valid_hex.xbm deleted file mode 100644 index e365d8024472..000000000000 --- a/test/jdk/java/awt/image/XBMDecoder/valid_hex.xbm +++ /dev/null @@ -1,4 +0,0 @@ -#define test_width 16 -#define test_height 2 -static unsigned char test_bits[] = { 0x13, 0x11, - 0xAB, 0xff };