Mercurial > hg > release > icedtea6-1.10
changeset 2525:e296d9a4e90b
merge
author | Denis Lila <dlila@redhat.com> |
---|---|
date | Wed, 15 Jun 2011 13:46:13 -0400 |
parents | 8adcdb76aa7c (current diff) 5b3c3dc896d9 (diff) |
children | 63ba95f1fccc |
files | ChangeLog Makefile.am NEWS |
diffstat | 7 files changed, 1768 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Tue Jun 14 10:09:27 2011 -0400 +++ b/ChangeLog Wed Jun 15 13:46:13 2011 -0400 @@ -1,3 +1,18 @@ +2011-06-15 Denis Lila <dlila@redhat.com> + + * Makefile.am: Apply patches. + * NEWS: Update with backports. + * patches/openjdk/6578583-modality-broken-vista.patch: + * patches/openjdk/6610244-modal-fatal-error-windows.patch: + * patches/openjdk/6769607-modal-hangs.patch: + New patches. The last fixes PR677. The other two are + necessary for the last to fully apply. + * patches/openjdk/6693253-security_warning.patch: + Replsace the awt_Dialog.cpp hunk with the corresponding hunk + from the OpenJDK7 changeset of which this patch is a backport. + Without this change, this patch doesn't apply unless the + previous 3 are removed. + 2011-06-14 Denis Lila <dlila@redhat.com> * Makefile.am: Add patch.
--- a/Makefile.am Tue Jun 14 10:09:27 2011 -0400 +++ b/Makefile.am Wed Jun 15 13:46:13 2011 -0400 @@ -203,6 +203,8 @@ ICEDTEA_PATCHES = \ $(SECURITY_PATCHES) \ + patches/openjdk/6578583-modality-broken-vista.patch \ + patches/openjdk/6610244-modal-fatal-error-windows.patch \ patches/stdc-limit-macros.patch \ patches/openjdk/4993545-nativeinlightfixer.patch \ patches/openjdk/6637796-set_bounds.patch \ @@ -214,6 +216,7 @@ patches/openjdk/6797195-hw_lw_mixing.patch \ patches/openjdk/6725214-direct3d-01.patch \ patches/openjdk/6633275-shaped_translucent_windows.patch \ + patches/openjdk/6769607-modal-hangs.patch \ patches/openjdk/6791612-opengl-jni-fix.patch \ patches/openjdk/6755274-glgetstring-crash.patch \ patches/openjdk/6984543-onscreen_rendering_resize_test.patch \
--- a/NEWS Tue Jun 14 10:09:27 2011 -0400 +++ b/NEWS Wed Jun 15 13:46:13 2011 -0400 @@ -13,6 +13,9 @@ * Backports: - S7037283, RH712211: Null Pointer Exception in SwingUtilities2. + - S6769607, PR677: Modal frame hangs for a while. + - S6578583: Modality is broken in windows vista home premium from jdk1.7 b02 onwards. + - S6610244: modal dialog closes with fatal error if -Xcheck:jni is set New in release 1.10.2 (2011-06-07):
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/patches/openjdk/6578583-modality-broken-vista.patch Wed Jun 15 13:46:13 2011 -0400 @@ -0,0 +1,1446 @@ +# HG changeset patch +# User dcherepanov +# Date 1205521233 -10800 +# Node ID 15ba7093f8e64e1facdfc48b8929edc6a4fbb0d3 +# Parent 92e3f57c933b45c678abcbccaa47de059dfe926a +6578583: Regression: Modality is broken in windows vista home premium from jdk1.7 b02 onwards. +Summary: WS_DISABLED style should be used to fix some modality bugs +Reviewed-by: art, son + +diff -r 92e3f57c933b -r 15ba7093f8e6 src/windows/native/sun/windows/awt_Component.cpp +--- openjdk.orig/jdk/src/windows/native/sun/windows/awt_Component.cpp Fri Mar 14 20:40:09 2008 +0300 ++++ openjdk/jdk/src/windows/native/sun/windows/awt_Component.cpp Fri Mar 14 22:00:33 2008 +0300 +@@ -5425,7 +5425,13 @@ + void AwtComponent::Enable(BOOL bEnable) + { + sm_suppressFocusAndActivation = TRUE; ++ ++ if (bEnable && IsTopLevel()) { ++ // we should not enable blocked toplevels ++ bEnable = !::IsWindow(AwtWindow::GetModalBlocker(GetHWnd())); ++ } + ::EnableWindow(GetHWnd(), bEnable); ++ + sm_suppressFocusAndActivation = FALSE; + CriticalSection::Lock l(GetLock()); + VerifyState(); +diff -r 92e3f57c933b -r 15ba7093f8e6 src/windows/native/sun/windows/awt_Dialog.cpp +--- openjdk.orig/jdk/src/windows/native/sun/windows/awt_Dialog.cpp Fri Mar 14 20:40:09 2008 +0300 ++++ openjdk/jdk/src/windows/native/sun/windows/awt_Dialog.cpp Fri Mar 14 22:00:33 2008 +0300 +@@ -273,6 +273,10 @@ + { + HWND blocker = AwtWindow::GetModalBlocker(AwtComponent::GetTopLevelParentForWindow(hWnd)); + HWND topMostBlocker = blocker; ++ HWND prevForegroundWindow = ::GetForegroundWindow(); ++ if (::IsWindow(blocker)) { ++ ::BringWindowToTop(hWnd); ++ } + while (::IsWindow(blocker)) { + topMostBlocker = blocker; + ::BringWindowToTop(blocker); +@@ -282,7 +286,7 @@ + // no beep/flash if the mouse was clicked in the taskbar menu + // or the dialog is currently inactive + if ((::WindowFromPoint(mhs->pt) == hWnd) && +- (::GetForegroundWindow() == topMostBlocker)) ++ (prevForegroundWindow == topMostBlocker)) + { + ::MessageBeep(MB_OK); + // some heuristics: 3 times x 64 milliseconds +@@ -292,6 +296,7 @@ + ::BringWindowToTop(topMostBlocker); + ::SetForegroundWindow(topMostBlocker); + } ++ return 1; + } + } + } +diff -r 92e3f57c933b -r 15ba7093f8e6 src/windows/native/sun/windows/awt_Window.cpp +--- openjdk.orig/jdk/src/windows/native/sun/windows/awt_Window.cpp Fri Mar 14 20:40:09 2008 +0300 ++++ openjdk/jdk/src/windows/native/sun/windows/awt_Window.cpp Fri Mar 14 22:00:33 2008 +0300 +@@ -180,7 +180,6 @@ + } + + ::RemoveProp(GetHWnd(), ModalBlockerProp); +- ::RemoveProp(GetHWnd(), ModalSaveWSEXProp); + + if (m_grabbedWindow == this) { + Ungrab(); +@@ -1455,20 +1454,17 @@ + if (!::IsWindow(window)) { + return; + } +- DWORD exStyle = ::GetWindowLong(window, GWL_EXSTYLE); ++ + if (::IsWindow(blocker)) { +- // save WS_EX_NOACTIVATE and WS_EX_APPWINDOW styles +- DWORD saveStyle = exStyle & (AWT_WS_EX_NOACTIVATE | WS_EX_APPWINDOW); +- ::SetProp(window, ModalSaveWSEXProp, reinterpret_cast<HANDLE>(saveStyle)); +- ::SetWindowLong(window, GWL_EXSTYLE, (exStyle | AWT_WS_EX_NOACTIVATE) & ~WS_EX_APPWINDOW); + ::SetProp(window, ModalBlockerProp, reinterpret_cast<HANDLE>(blocker)); ++ ::EnableWindow(window, FALSE); + } else { +- // restore WS_EX_NOACTIVATE and WS_EX_APPWINDOW styles +- DWORD saveStyle = reinterpret_cast<DWORD>(::GetProp(window, ModalSaveWSEXProp)); +- ::SetWindowLong(window, GWL_EXSTYLE, +- (exStyle & ~(AWT_WS_EX_NOACTIVATE | WS_EX_APPWINDOW)) | saveStyle); +- ::RemoveProp(window, ModalSaveWSEXProp); + ::RemoveProp(window, ModalBlockerProp); ++ AwtComponent *comp = AwtComponent::GetComponent(window); ++ // we don't expect to be called with non-java HWNDs ++ DASSERT(comp && comp->IsTopLevel()); ++ // we should not unblock disabled toplevels ++ ::EnableWindow(window, comp->isEnabled()); + } + } + +diff -r 92e3f57c933b -r 15ba7093f8e6 src/windows/native/sun/windows/awt_Window.h +--- openjdk.orig/jdk/src/windows/native/sun/windows/awt_Window.h Fri Mar 14 20:40:09 2008 +0300 ++++ openjdk/jdk/src/windows/native/sun/windows/awt_Window.h Fri Mar 14 22:00:33 2008 +0300 +@@ -33,7 +33,6 @@ + + // property name tagging windows disabled by modality + static LPCTSTR ModalBlockerProp = TEXT("SunAwtModalBlockerProp"); +-static LPCTSTR ModalSaveWSEXProp = TEXT("SunAwtModalSaveWSEXProp"); + static LPCTSTR ModalDialogPeerProp = TEXT("SunAwtModalDialogPeerProp"); + + #ifndef WH_MOUSE_LL +diff -r 92e3f57c933b -r 15ba7093f8e6 test/java/awt/Modal/WsDisabledStyle/CloseBlocker/CloseBlocker.java +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ openjdk/jdk/test/java/awt/Modal/WsDisabledStyle/CloseBlocker/CloseBlocker.java Fri Mar 14 22:00:33 2008 +0300 +@@ -0,0 +1,466 @@ ++/* ++ * Copyright 2007 Sun Microsystems, 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 ++ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, ++ * CA 95054 USA or visit www.sun.com if you need additional information or ++ * have any questions. ++ */ ++ ++/* ++ @test %I% %E% ++ @bug 4080029 ++ @summary Modal Dialog block input to all frame windows not just its parent. ++ @author dmitry.cherepanov: area=awt.modal ++ @run main/manual CloseBlocker ++*/ ++ ++/** ++ * ManualMainTest.java ++ * ++ * summary: The test opens and closes blocker dialog, the test verifies ++ * that active window is correct when the dialog is closed. ++ */ ++ ++import java.awt.*; ++import java.awt.event.*; ++ ++public class CloseBlocker ++{ ++ ++ private static void init() ++ { ++ //*** Create instructions for the user here *** ++ ++ String[] instructions = ++ { ++ " the test will be run 6 times, to start next test just close all ", ++ " windows of previous; the instructions are the same for all tests: ", ++ " 1) there are two frames (one the frames has 'show modal' button), ", ++ " 2) press the button to show a dialog, ", ++ " 3) close the dialog (an alternative scenario - activate another", ++ " native window before closing the dialog), ", ++ " 4) the frame with button should become next active window, ", ++ " if it's true, then the test passed, otherwise, it failed. ", ++ " Press 'pass' button only after all of the 6 tests are completed, ", ++ " the number of the currently executed test is displayed on the ", ++ " output window. " ++ }; ++ Sysout.createDialog( ); ++ Sysout.printInstructions( instructions ); ++ ++ test(true, true, false); ++ test(true, true, true); ++ test(false, true, false); // 3rd parameter has no affect for ownerless ++ ++ test(true, false, false); ++ test(true, false, true); ++ test(false, false, false); // 3rd parameter has no affect for ownerless ++ ++ }//End init() ++ ++ private static final Object obj = new Object(); ++ private static int counter = 0; ++ ++ /* ++ * The ownerless parameter indicates whether the blocker dialog ++ * has owner. The usual parameter indicates whether the blocker ++ * dialog is a Java dialog (non-native dialog like file dialog). ++ */ ++ private static void test(final boolean ownerless, final boolean usual, final boolean initiallyOwnerIsActive) { ++ ++ Sysout.print(" * test #" + (++counter) + " is running ... "); ++ ++ final Frame active = new Frame(); ++ final Frame nonactive = new Frame(); ++ Button button = new Button("show modal"); ++ button.addActionListener(new ActionListener() { ++ public void actionPerformed(ActionEvent ae) { ++ Dialog dialog = null; ++ Frame parent = ownerless ? null : (initiallyOwnerIsActive? active : nonactive); ++ if (usual) { ++ dialog = new Dialog(parent, "Sample", true); ++ } else { ++ dialog = new FileDialog(parent, "Sample", FileDialog.LOAD); ++ } ++ dialog.addWindowListener(new WindowAdapter(){ ++ public void windowClosing(WindowEvent e){ ++ e.getWindow().dispose(); ++ } ++ }); ++ dialog.setBounds(200, 200, 200, 200); ++ dialog.setVisible(true); ++ } ++ }); ++ ++ active.add(button); ++ active.setBounds(200, 400, 200, 200); ++ WindowAdapter adapter = new WindowAdapter(){ ++ public void windowClosing(WindowEvent e){ ++ active.dispose(); ++ nonactive.dispose(); ++ synchronized(obj) { ++ obj.notify(); ++ } ++ } ++ }; ++ active.addWindowListener(adapter); ++ active.setVisible(true); ++ ++ nonactive.setBounds(400, 400, 200, 200); ++ nonactive.addWindowListener(adapter); ++ nonactive.setVisible(true); ++ ++ synchronized(obj) { ++ try{ ++ obj.wait(); ++ } catch(Exception e) { ++ throw new RuntimeException(e); ++ } ++ } ++ ++ Sysout.println(" completed. "); ++ ++ } ++ ++ /***************************************************** ++ * Standard Test Machinery Section ++ * DO NOT modify anything in this section -- it's a ++ * standard chunk of code which has all of the ++ * synchronisation necessary for the test harness. ++ * By keeping it the same in all tests, it is easier ++ * to read and understand someone else's test, as ++ * well as insuring that all tests behave correctly ++ * with the test harness. ++ * There is a section following this for test-defined ++ * classes ++ ******************************************************/ ++ private static boolean theTestPassed = false; ++ private static boolean testGeneratedInterrupt = false; ++ private static String failureMessage = ""; ++ ++ private static Thread mainThread = null; ++ ++ private static int sleepTime = 300000; ++ ++ public static void main( String args[] ) throws InterruptedException ++ { ++ mainThread = Thread.currentThread(); ++ try ++ { ++ init(); ++ } ++ catch( TestPassedException e ) ++ { ++ //The test passed, so just return from main and harness will ++ // interepret this return as a pass ++ return; ++ } ++ //At this point, neither test passed nor test failed has been ++ // called -- either would have thrown an exception and ended the ++ // test, so we know we have multiple threads. ++ ++ //Test involves other threads, so sleep and wait for them to ++ // called pass() or fail() ++ try ++ { ++ Thread.sleep( sleepTime ); ++ //Timed out, so fail the test ++ throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" ); ++ } ++ catch (InterruptedException e) ++ { ++ if( ! testGeneratedInterrupt ) throw e; ++ ++ //reset flag in case hit this code more than once for some reason (just safety) ++ testGeneratedInterrupt = false; ++ if ( theTestPassed == false ) ++ { ++ throw new RuntimeException( failureMessage ); ++ } ++ } ++ ++ }//main ++ ++ public static synchronized void setTimeoutTo( int seconds ) ++ { ++ sleepTime = seconds * 1000; ++ } ++ ++ public static synchronized void pass() ++ { ++ Sysout.println( "The test passed." ); ++ Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); ++ //first check if this is executing in main thread ++ if ( mainThread == Thread.currentThread() ) ++ { ++ //Still in the main thread, so set the flag just for kicks, ++ // and throw a test passed exception which will be caught ++ // and end the test. ++ theTestPassed = true; ++ throw new TestPassedException(); ++ } ++ //pass was called from a different thread, so set the flag and interrupt ++ // the main thead. ++ theTestPassed = true; ++ testGeneratedInterrupt = true; ++ mainThread.interrupt(); ++ }//pass() ++ ++ public static synchronized void fail() ++ { ++ //test writer didn't specify why test failed, so give generic ++ fail( "it just plain failed! :-)" ); ++ } ++ ++ public static synchronized void fail( String whyFailed ) ++ { ++ Sysout.println( "The test failed: " + whyFailed ); ++ Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); ++ //check if this called from main thread ++ if ( mainThread == Thread.currentThread() ) ++ { ++ //If main thread, fail now 'cause not sleeping ++ throw new RuntimeException( whyFailed ); ++ } ++ theTestPassed = false; ++ testGeneratedInterrupt = true; ++ failureMessage = whyFailed; ++ mainThread.interrupt(); ++ }//fail() ++ ++}// class ManualMainTest ++ ++//This exception is used to exit from any level of call nesting ++// when it's determined that the test has passed, and immediately ++// end the test. ++class TestPassedException extends RuntimeException ++{ ++} ++ ++//*********** End Standard Test Machinery Section ********** ++ ++ ++//************ Begin classes defined for the test **************** ++ ++// make listeners in a class defined here, and instantiate them in init() ++ ++/* Example of a class which may be written as part of a test ++class NewClass implements anInterface ++ { ++ static int newVar = 0; ++ ++ public void eventDispatched(AWTEvent e) ++ { ++ //Counting events to see if we get enough ++ eventCount++; ++ ++ if( eventCount == 20 ) ++ { ++ //got enough events, so pass ++ ++ ManualMainTest.pass(); ++ } ++ else if( tries == 20 ) ++ { ++ //tried too many times without getting enough events so fail ++ ++ ManualMainTest.fail(); ++ } ++ ++ }// eventDispatched() ++ ++ }// NewClass class ++ ++*/ ++ ++ ++//************** End classes defined for the test ******************* ++ ++ ++ ++ ++/**************************************************** ++ 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, true ); ++ } ++ ++ public static void print( String messageIn ) ++ { ++ dialog.displayMessage( messageIn, false ); ++ } ++ ++}// 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 implements ActionListener ++{ ++ ++ TextArea instructionsText; ++ TextArea messageText; ++ int maxStringLength = 80; ++ Panel buttonP = new Panel(); ++ Button passB = new Button( "pass" ); ++ Button failB = new Button( "fail" ); ++ ++ //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); ++ ++ passB = new Button( "pass" ); ++ passB.setActionCommand( "pass" ); ++ passB.addActionListener( this ); ++ buttonP.add( "East", passB ); ++ ++ failB = new Button( "fail" ); ++ failB.setActionCommand( "fail" ); ++ failB.addActionListener( this ); ++ buttonP.add( "West", failB ); ++ ++ add( "South", buttonP ); ++ 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, boolean nextLine ) ++ { ++ messageText.append( messageIn + (nextLine? "\n" : "") ); ++ System.out.println(messageIn); ++ } ++ ++ //catch presses of the passed and failed buttons. ++ //simply call the standard pass() or fail() static methods of ++ //ManualMainTest ++ public void actionPerformed( ActionEvent e ) ++ { ++ if( e.getActionCommand() == "pass" ) ++ { ++ CloseBlocker.pass(); ++ } ++ else ++ { ++ CloseBlocker.fail(); ++ } ++ } ++ ++}// TestDialog class +diff -r 92e3f57c933b -r 15ba7093f8e6 test/java/awt/Modal/WsDisabledStyle/OverBlocker/OverBlocker.java +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ openjdk/jdk/test/java/awt/Modal/WsDisabledStyle/OverBlocker/OverBlocker.java Fri Mar 14 22:00:33 2008 +0300 +@@ -0,0 +1,456 @@ ++/* ++ * Copyright 2007 Sun Microsystems, 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 ++ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, ++ * CA 95054 USA or visit www.sun.com if you need additional information or ++ * have any questions. ++ */ ++ ++/* ++ @test %I% %E% ++ @bug 4080029 ++ @summary Modal Dialog block input to all frame windows not just its parent. ++ @author dmitry.cherepanov: area=awt.modal ++ @run main/manual OverBlocker ++*/ ++ ++/** ++ * OverBlocker.java ++ * ++ * summary: The test verifies that if user tries to activate the blocked dialog ++ * then the blocker dialog appears over the other windows ++ */ ++ ++import java.awt.*; ++import java.awt.event.*; ++ ++public class OverBlocker ++{ ++ ++ private static void init() ++ { ++ //*** Create instructions for the user here *** ++ ++ String[] instructions = ++ { ++ " the test will be run 4 times, to start next test just close all ", ++ " windows of previous; the instructions are the same for all tests: ", ++ " 1) there is a frame with 'show modal' button, ", ++ " 2) press the button to show a dialog, ", ++ " 3) activate any non-Java application, move the app over the dialog, ", ++ " 4) click on the frame by mouse, ", ++ " 5) make sure that the dialog comes up from the application and ", ++ " now the dialog overlaps the app as well as the frame, ", ++ " if it's true, then the test passed, otherwise, it failed. ", ++ " Press 'pass' button only after all of the 4 tests are completed, ", ++ " the number of the currently executed test is displayed on the ", ++ " output window. " ++ }; ++ Sysout.createDialog( ); ++ Sysout.printInstructions( instructions ); ++ ++ test(false, true); ++ test(true, true); ++ test(true, false); ++ test(false, false); ++ ++ }//End init() ++ ++ private static final Object obj = new Object(); ++ private static int counter = 0; ++ ++ /* ++ * The ownerless parameter indicates whether the blocker dialog ++ * has owner. The usual parameter indicates whether the blocker ++ * dialog is a Java dialog (non-native dialog like file dialog). ++ */ ++ private static void test(final boolean ownerless, final boolean usual) { ++ ++ Sysout.print(" * test #" + (++counter) + " is running ... "); ++ ++ final Frame frame = new Frame(); ++ Button button = new Button("show modal"); ++ button.addActionListener(new ActionListener() { ++ public void actionPerformed(ActionEvent ae) { ++ Dialog dialog = null; ++ Frame parent = ownerless ? null : frame; ++ if (usual) { ++ dialog = new Dialog(parent, "Sample", true); ++ } else { ++ dialog = new FileDialog(parent, "Sample", FileDialog.LOAD); ++ } ++ dialog.addWindowListener(new WindowAdapter(){ ++ public void windowClosing(WindowEvent e){ ++ e.getWindow().dispose(); ++ } ++ }); ++ dialog.setBounds(200, 200, 200, 200); ++ dialog.setVisible(true); ++ } ++ }); ++ frame.add(button); ++ frame.setBounds(400, 400, 200, 200); ++ frame.addWindowListener(new WindowAdapter(){ ++ public void windowClosing(WindowEvent e){ ++ e.getWindow().dispose(); ++ synchronized(obj) { ++ obj.notify(); ++ } ++ } ++ }); ++ frame.setVisible(true); ++ ++ synchronized(obj) { ++ try{ ++ obj.wait(); ++ } catch(Exception e) { ++ throw new RuntimeException(e); ++ } ++ } ++ ++ Sysout.println(" completed. "); ++ ++ } ++ ++ /***************************************************** ++ * Standard Test Machinery Section ++ * DO NOT modify anything in this section -- it's a ++ * standard chunk of code which has all of the ++ * synchronisation necessary for the test harness. ++ * By keeping it the same in all tests, it is easier ++ * to read and understand someone else's test, as ++ * well as insuring that all tests behave correctly ++ * with the test harness. ++ * There is a section following this for test-defined ++ * classes ++ ******************************************************/ ++ private static boolean theTestPassed = false; ++ private static boolean testGeneratedInterrupt = false; ++ private static String failureMessage = ""; ++ ++ private static Thread mainThread = null; ++ ++ private static int sleepTime = 300000; ++ ++ public static void main( String args[] ) throws InterruptedException ++ { ++ mainThread = Thread.currentThread(); ++ try ++ { ++ init(); ++ } ++ catch( TestPassedException e ) ++ { ++ //The test passed, so just return from main and harness will ++ // interepret this return as a pass ++ return; ++ } ++ //At this point, neither test passed nor test failed has been ++ // called -- either would have thrown an exception and ended the ++ // test, so we know we have multiple threads. ++ ++ //Test involves other threads, so sleep and wait for them to ++ // called pass() or fail() ++ try ++ { ++ Thread.sleep( sleepTime ); ++ //Timed out, so fail the test ++ throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" ); ++ } ++ catch (InterruptedException e) ++ { ++ if( ! testGeneratedInterrupt ) throw e; ++ ++ //reset flag in case hit this code more than once for some reason (just safety) ++ testGeneratedInterrupt = false; ++ if ( theTestPassed == false ) ++ { ++ throw new RuntimeException( failureMessage ); ++ } ++ } ++ ++ }//main ++ ++ public static synchronized void setTimeoutTo( int seconds ) ++ { ++ sleepTime = seconds * 1000; ++ } ++ ++ public static synchronized void pass() ++ { ++ Sysout.println( "The test passed." ); ++ Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); ++ //first check if this is executing in main thread ++ if ( mainThread == Thread.currentThread() ) ++ { ++ //Still in the main thread, so set the flag just for kicks, ++ // and throw a test passed exception which will be caught ++ // and end the test. ++ theTestPassed = true; ++ throw new TestPassedException(); ++ } ++ //pass was called from a different thread, so set the flag and interrupt ++ // the main thead. ++ theTestPassed = true; ++ testGeneratedInterrupt = true; ++ mainThread.interrupt(); ++ }//pass() ++ ++ public static synchronized void fail() ++ { ++ //test writer didn't specify why test failed, so give generic ++ fail( "it just plain failed! :-)" ); ++ } ++ ++ public static synchronized void fail( String whyFailed ) ++ { ++ Sysout.println( "The test failed: " + whyFailed ); ++ Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); ++ //check if this called from main thread ++ if ( mainThread == Thread.currentThread() ) ++ { ++ //If main thread, fail now 'cause not sleeping ++ throw new RuntimeException( whyFailed ); ++ } ++ theTestPassed = false; ++ testGeneratedInterrupt = true; ++ failureMessage = whyFailed; ++ mainThread.interrupt(); ++ }//fail() ++ ++}// class ManualMainTest ++ ++//This exception is used to exit from any level of call nesting ++// when it's determined that the test has passed, and immediately ++// end the test. ++class TestPassedException extends RuntimeException ++{ ++} ++ ++//*********** End Standard Test Machinery Section ********** ++ ++ ++//************ Begin classes defined for the test **************** ++ ++// make listeners in a class defined here, and instantiate them in init() ++ ++/* Example of a class which may be written as part of a test ++class NewClass implements anInterface ++ { ++ static int newVar = 0; ++ ++ public void eventDispatched(AWTEvent e) ++ { ++ //Counting events to see if we get enough ++ eventCount++; ++ ++ if( eventCount == 20 ) ++ { ++ //got enough events, so pass ++ ++ ManualMainTest.pass(); ++ } ++ else if( tries == 20 ) ++ { ++ //tried too many times without getting enough events so fail ++ ++ ManualMainTest.fail(); ++ } ++ ++ }// eventDispatched() ++ ++ }// NewClass class ++ ++*/ ++ ++ ++//************** End classes defined for the test ******************* ++ ++ ++ ++ ++/**************************************************** ++ 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, true ); ++ } ++ ++ public static void print( String messageIn ) ++ { ++ dialog.displayMessage( messageIn, false ); ++ } ++ ++}// 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 implements ActionListener ++{ ++ ++ TextArea instructionsText; ++ TextArea messageText; ++ int maxStringLength = 80; ++ Panel buttonP = new Panel(); ++ Button passB = new Button( "pass" ); ++ Button failB = new Button( "fail" ); ++ ++ //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); ++ ++ passB = new Button( "pass" ); ++ passB.setActionCommand( "pass" ); ++ passB.addActionListener( this ); ++ buttonP.add( "East", passB ); ++ ++ failB = new Button( "fail" ); ++ failB.setActionCommand( "fail" ); ++ failB.addActionListener( this ); ++ buttonP.add( "West", failB ); ++ ++ add( "South", buttonP ); ++ 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, boolean nextLine ) ++ { ++ messageText.append( messageIn + (nextLine? "\n" : "") ); ++ System.out.println(messageIn); ++ } ++ ++ //catch presses of the passed and failed buttons. ++ //simply call the standard pass() or fail() static methods of ++ //ManualMainTest ++ public void actionPerformed( ActionEvent e ) ++ { ++ if( e.getActionCommand() == "pass" ) ++ { ++ OverBlocker.pass(); ++ } ++ else ++ { ++ OverBlocker.fail(); ++ } ++ } ++ ++}// TestDialog class +diff -r 92e3f57c933b -r 15ba7093f8e6 test/java/awt/Modal/WsDisabledStyle/Winkey/Winkey.java +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ openjdk/jdk/test/java/awt/Modal/WsDisabledStyle/Winkey/Winkey.java Fri Mar 14 22:00:33 2008 +0300 +@@ -0,0 +1,403 @@ ++/* ++ * Copyright 2007 Sun Microsystems, 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 ++ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, ++ * CA 95054 USA or visit www.sun.com if you need additional information or ++ * have any questions. ++ */ ++ ++/* ++ @test %I% %E% ++ @bug 6572263 6571808 ++ @summary PIT:FileDialog minimized to taskbar(through 'Show Desktop')selecting the fileDialog using windowList ++ @author dmitry.cherepanov: area=awt.modal ++ @run main/manual Winkey ++*/ ++ ++/** ++ * Winkey.java ++ * ++ * summary: the test verifies that pressing combination of Windows key ++ * and M key to minimize all windows doesn't break AWT modality ++ */ ++ ++import java.awt.*; ++import java.awt.event.*; ++ ++public class Winkey ++{ ++ ++ private static void init() ++ { ++ //*** Create instructions for the user here *** ++ ++ String[] instructions = ++ { ++ " 1. there is a frame with a 'show modal' button, ", ++ " 2. press the button to show a modal dialog, ", ++ " 3. the modal dialog will be shown over the frame, ", ++ " 4. please verify that all (5.1, 5.2.1, 5.2.2) the following tests pass: ", ++ " ", ++ " 5.1. press combination Windows Key and M key to minimize all windows, ", ++ " 5.2. press combination Windows Key and D key to show desktop, ", ++ " 5.2.1. restore the dialog by choosing this one in the ALT-TAB list, ", ++ " 5.2.2. restore the dialog by mouse click on taskbar (on java or any other item)", ++ " ", ++ " 6. make sure that the dialog and the frame are visible, ", ++ " the bounds of the windows should be the same as before, ", ++ " if it's true, then the test passed; otherwise, it failed. " ++ }; ++ Sysout.createDialog( ); ++ Sysout.printInstructions( instructions ); ++ ++ final Frame frame = new Frame(); ++ Button button = new Button("show modal"); ++ button.addActionListener(new ActionListener() { ++ public void actionPerformed(ActionEvent ae) { ++ FileDialog dialog = new FileDialog((Frame)null, "Sample", FileDialog.LOAD); ++ dialog.setVisible(true); ++ } ++ }); ++ frame.add(button); ++ frame.setBounds(400, 400, 200, 200); ++ frame.setVisible(true); ++ ++ }//End init() ++ ++ /***************************************************** ++ * Standard Test Machinery Section ++ * DO NOT modify anything in this section -- it's a ++ * standard chunk of code which has all of the ++ * synchronisation necessary for the test harness. ++ * By keeping it the same in all tests, it is easier ++ * to read and understand someone else's test, as ++ * well as insuring that all tests behave correctly ++ * with the test harness. ++ * There is a section following this for test-defined ++ * classes ++ ******************************************************/ ++ private static boolean theTestPassed = false; ++ private static boolean testGeneratedInterrupt = false; ++ private static String failureMessage = ""; ++ ++ private static Thread mainThread = null; ++ ++ private static int sleepTime = 300000; ++ ++ public static void main( String args[] ) throws InterruptedException ++ { ++ mainThread = Thread.currentThread(); ++ try ++ { ++ init(); ++ } ++ catch( TestPassedException e ) ++ { ++ //The test passed, so just return from main and harness will ++ // interepret this return as a pass ++ return; ++ } ++ //At this point, neither test passed nor test failed has been ++ // called -- either would have thrown an exception and ended the ++ // test, so we know we have multiple threads. ++ ++ //Test involves other threads, so sleep and wait for them to ++ // called pass() or fail() ++ try ++ { ++ Thread.sleep( sleepTime ); ++ //Timed out, so fail the test ++ throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" ); ++ } ++ catch (InterruptedException e) ++ { ++ if( ! testGeneratedInterrupt ) throw e; ++ ++ //reset flag in case hit this code more than once for some reason (just safety) ++ testGeneratedInterrupt = false; ++ if ( theTestPassed == false ) ++ { ++ throw new RuntimeException( failureMessage ); ++ } ++ } ++ ++ }//main ++ ++ public static synchronized void setTimeoutTo( int seconds ) ++ { ++ sleepTime = seconds * 1000; ++ } ++ ++ public static synchronized void pass() ++ { ++ Sysout.println( "The test passed." ); ++ Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); ++ //first check if this is executing in main thread ++ if ( mainThread == Thread.currentThread() ) ++ { ++ //Still in the main thread, so set the flag just for kicks, ++ // and throw a test passed exception which will be caught ++ // and end the test. ++ theTestPassed = true; ++ throw new TestPassedException(); ++ } ++ //pass was called from a different thread, so set the flag and interrupt ++ // the main thead. ++ theTestPassed = true; ++ testGeneratedInterrupt = true; ++ mainThread.interrupt(); ++ }//pass() ++ ++ public static synchronized void fail() ++ { ++ //test writer didn't specify why test failed, so give generic ++ fail( "it just plain failed! :-)" ); ++ } ++ ++ public static synchronized void fail( String whyFailed ) ++ { ++ Sysout.println( "The test failed: " + whyFailed ); ++ Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); ++ //check if this called from main thread ++ if ( mainThread == Thread.currentThread() ) ++ { ++ //If main thread, fail now 'cause not sleeping ++ throw new RuntimeException( whyFailed ); ++ } ++ theTestPassed = false; ++ testGeneratedInterrupt = true; ++ failureMessage = whyFailed; ++ mainThread.interrupt(); ++ }//fail() ++ ++}// class ManualMainTest ++ ++//This exception is used to exit from any level of call nesting ++// when it's determined that the test has passed, and immediately ++// end the test. ++class TestPassedException extends RuntimeException ++{ ++} ++ ++//*********** End Standard Test Machinery Section ********** ++ ++ ++//************ Begin classes defined for the test **************** ++ ++// make listeners in a class defined here, and instantiate them in init() ++ ++/* Example of a class which may be written as part of a test ++class NewClass implements anInterface ++ { ++ static int newVar = 0; ++ ++ public void eventDispatched(AWTEvent e) ++ { ++ //Counting events to see if we get enough ++ eventCount++; ++ ++ if( eventCount == 20 ) ++ { ++ //got enough events, so pass ++ ++ ManualMainTest.pass(); ++ } ++ else if( tries == 20 ) ++ { ++ //tried too many times without getting enough events so fail ++ ++ ManualMainTest.fail(); ++ } ++ ++ }// eventDispatched() ++ ++ }// NewClass class ++ ++*/ ++ ++ ++//************** End classes defined for the test ******************* ++ ++ ++ ++ ++/**************************************************** ++ 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 implements ActionListener ++{ ++ ++ TextArea instructionsText; ++ TextArea messageText; ++ int maxStringLength = 80; ++ Panel buttonP = new Panel(); ++ Button passB = new Button( "pass" ); ++ Button failB = new Button( "fail" ); ++ ++ //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); ++ ++ passB = new Button( "pass" ); ++ passB.setActionCommand( "pass" ); ++ passB.addActionListener( this ); ++ buttonP.add( "East", passB ); ++ ++ failB = new Button( "fail" ); ++ failB.setActionCommand( "fail" ); ++ failB.addActionListener( this ); ++ buttonP.add( "West", failB ); ++ ++ add( "South", buttonP ); ++ 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); ++ } ++ ++ //catch presses of the passed and failed buttons. ++ //simply call the standard pass() or fail() static methods of ++ //ManualMainTest ++ public void actionPerformed( ActionEvent e ) ++ { ++ if( e.getActionCommand() == "pass" ) ++ { ++ Winkey.pass(); ++ } ++ else ++ { ++ Winkey.fail(); ++ } ++ } ++ ++}// TestDialog class +exporting patch: +<fdopen>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/patches/openjdk/6610244-modal-fatal-error-windows.patch Wed Jun 15 13:46:13 2011 -0400 @@ -0,0 +1,125 @@ +# HG changeset patch +# User dav +# Date 1206447363 -10800 +# Node ID 58c90502785df64cd26e9f2d400429dcfcaa3b91 +# Parent de9e902b1f24bef3ec7248890caa1722983e68f5 +6610244: modal dialog closes with fatal error if -Xcheck:jni is set +Summary: obtain WWindowPeer class every time it is required +Reviewed-by: art + +diff -r de9e902b1f24 -r 58c90502785d src/windows/native/sun/windows/awt_Dialog.cpp +--- openjdk.orig/jdk/src/windows/native/sun/windows/awt_Dialog.cpp Mon Mar 24 18:24:15 2008 +0300 ++++ openjdk/jdk/src/windows/native/sun/windows/awt_Dialog.cpp Tue Mar 25 15:16:03 2008 +0300 +@@ -428,8 +428,12 @@ + { + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + +- jlongArray windows = (jlongArray)(env->CallStaticObjectMethod(AwtWindow::wwindowPeerCls, +- AwtWindow::getActiveWindowsMID)); ++ jclass wwindowPeerCls = env->FindClass("sun/awt/windows/WWindowPeer"); ++ jmethodID getActiveWindowsMID = env->GetStaticMethodID(wwindowPeerCls, ++ "getActiveWindowHandles", "()[J"); ++ DASSERT(getActiveWindowsMID != NULL); ++ jlongArray windows = (jlongArray)(env->CallStaticObjectMethod(wwindowPeerCls, ++ getActiveWindowsMID)); + if (windows == NULL) { + return; + } +diff -r de9e902b1f24 -r 58c90502785d src/windows/native/sun/windows/awt_Window.cpp +--- openjdk.orig/jdk/src/windows/native/sun/windows/awt_Window.cpp Mon Mar 24 18:24:15 2008 +0300 ++++ openjdk/jdk/src/windows/native/sun/windows/awt_Window.cpp Tue Mar 25 15:16:03 2008 +0300 +@@ -122,9 +122,6 @@ + jfieldID AwtWindow::locationByPlatformID; + jfieldID AwtWindow::autoRequestFocusID; + +-jclass AwtWindow::wwindowPeerCls; +-jmethodID AwtWindow::getActiveWindowsMID; +- + jfieldID AwtWindow::sysXID; + jfieldID AwtWindow::sysYID; + jfieldID AwtWindow::sysWID; +diff -r de9e902b1f24 -r 58c90502785d src/windows/native/sun/windows/awt_Window.h +--- openjdk.orig/jdk/src/windows/native/sun/windows/awt_Window.h Mon Mar 24 18:24:15 2008 +0300 ++++ openjdk/jdk/src/windows/native/sun/windows/awt_Window.h Tue Mar 25 15:16:03 2008 +0300 +@@ -57,11 +57,6 @@ + static jfieldID screenID; /* screen number passed over from WindowPeer */ + static jfieldID autoRequestFocusID; + +- /* WWindowPeer class */ +- static jclass wwindowPeerCls; +- /* long[] getActiveWindowHandles() method in WWindowPeer */ +- static jmethodID getActiveWindowsMID; +- + // The coordinates at the peer. + static jfieldID sysXID; + static jfieldID sysYID; +diff -r de9e902b1f24 -r 58c90502785d test/java/awt/Dialog/CrashXCheckJni/CrashXCheckJni.java +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ openjdk/jdk/test/java/awt/Dialog/CrashXCheckJni/CrashXCheckJni.java Tue Mar 25 15:16:03 2008 +0300 +@@ -0,0 +1,64 @@ ++/* ++ * Copyright 2008 Sun Microsystems, 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 ++ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, ++ * CA 95054 USA or visit www.sun.com if you need additional information or ++ * have any questions. ++ */ ++ ++/* ++ @test ++ @bug 6610244 ++ @library ../../regtesthelpers ++ @build Util Sysout AbstractTest ++ @summary modal dialog closes with fatal error if -Xcheck:jni is set ++ @author Andrei Dmitriev : area=awt.dialog ++ @run main/othervm -Xcheck:jni CrashXCheckJni ++*/ ++ ++import java.awt.*; ++import java.awt.event.*; ++import java.util.Timer; ++import java.util.TimerTask; ++import test.java.awt.regtesthelpers.Util; ++import test.java.awt.regtesthelpers.AbstractTest; ++import test.java.awt.regtesthelpers.Sysout; ++ ++public class CrashXCheckJni { ++ ++ public static void main(String []s) ++ { ++ final Dialog fd = new Dialog(new Frame(), true); ++ Timer t = new Timer(); ++ t.schedule(new TimerTask() { ++ ++ public void run() { ++ System.out.println("RUNNING TASK"); ++ fd.setVisible(false); ++ fd.dispose(); ++ System.out.println("FINISHING TASK"); ++ } ++ }, 3000L); ++ ++ fd.setVisible(true); ++ t.cancel(); ++ Util.waitForIdle(null); ++ ++ AbstractTest.pass(); ++ } ++} +exporting patch: +<fdopen>
--- a/patches/openjdk/6693253-security_warning.patch Tue Jun 14 10:09:27 2011 -0400 +++ b/patches/openjdk/6693253-security_warning.patch Wed Jun 15 13:46:13 2011 -0400 @@ -3280,19 +3280,18 @@ diff -Nru openjdk.orig/jdk/src/windows/native/sun/windows/awt_Dialog.cpp openjdk/jdk/src/windows/native/sun/windows/awt_Dialog.cpp --- openjdk.orig/jdk/src/windows/native/sun/windows/awt_Dialog.cpp 2011-01-20 23:54:44.000000000 +0000 +++ openjdk/jdk/src/windows/native/sun/windows/awt_Dialog.cpp 2011-02-17 15:50:10.732056235 +0000 -@@ -284,9 +284,7 @@ - if ((::WindowFromPoint(mhs->pt) == hWnd) && - (::GetForegroundWindow() == topMostBlocker)) - { -- ::MessageBeep(MB_OK); -- // some heuristics: 3 times x 64 milliseconds -- AwtWindow::FlashWindowEx(topMostBlocker, 3, 64, FLASHW_CAPTION); -+ AnimateModalBlocker(dialog); - } - if (topMostBlocker != AwtToolkit::GetInstance().GetHWnd()) { - ::BringWindowToTop(topMostBlocker); -@@ -299,6 +297,13 @@ - return CallNextHookEx(0, nCode, wParam, lParam); +@@ -310,15 +310,20 @@ + // no beep/flash if the mouse was clicked in the taskbar menu + // or the dialog is currently inactive + if (!isModalHook && !onTaskbar && (dialog == prevFGWindow)) { +- ::MessageBeep(MB_OK); +- // some heuristics: 3 times x 64 milliseconds +- AwtWindow::FlashWindowEx(dialog, 3, 64, FLASHW_CAPTION); ++ AnimateModalBlocker(dialog); + } + ::BringWindowToTop(dialog); + ::SetForegroundWindow(dialog); + } } +void AwtDialog::AnimateModalBlocker(HWND window)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/patches/openjdk/6769607-modal-hangs.patch Wed Jun 15 13:46:13 2011 -0400 @@ -0,0 +1,164 @@ +# HG changeset patch +# User dcherepanov +# Date 1234870023 -10800 +# Node ID 5453a374c1d5838bf924e27fcd790d4bd9cadb2a +# Parent 03276203c39cd11758db94645f9173e04ae47c3a +6769607: PIT : Modal frame hangs for a while for few seconds in 6u12 b01 pit build +Reviewed-by: art, anthony + +diff -r 03276203c39c -r 5453a374c1d5 src/share/classes/java/awt/Window.java +--- openjdk.orig/jdk/src/share/classes/java/awt/Window.java Tue Feb 17 10:42:12 2009 +0300 ++++ openjdk/jdk/src/share/classes/java/awt/Window.java Tue Feb 17 14:27:03 2009 +0300 +@@ -687,9 +687,9 @@ + } + if (peer == null) { + peer = getToolkit().createWindow(this); +- synchronized (allWindows) { +- allWindows.add(this); +- } ++ } ++ synchronized (allWindows) { ++ allWindows.add(this); + } + super.addNotify(); + } +diff -r 03276203c39c -r 5453a374c1d5 src/windows/native/sun/windows/awt_Dialog.cpp +--- openjdk.orig/jdk/src/windows/native/sun/windows/awt_Dialog.cpp Tue Feb 17 10:42:12 2009 +0300 ++++ openjdk/jdk/src/windows/native/sun/windows/awt_Dialog.cpp Tue Feb 17 14:27:03 2009 +0300 +@@ -230,25 +230,8 @@ + if (::IsIconic(hWnd)) { + ::ShowWindow(hWnd, SW_RESTORE); + } +- HWND topMostBlocker = blocker; +- HWND toolkitHWnd = AwtToolkit::GetInstance().GetHWnd(); +- while (::IsWindow(blocker)) { +- topMostBlocker = blocker; +- // fix for 6494032: restore the blocker if it was minimized +- // together with its parent frame; in such cases the check +- // ::IsIconic() for the blocker returns false, so we use +- // ::IsWindowVisible() instead +- if (!::IsWindowVisible(topMostBlocker) && +- (topMostBlocker != toolkitHWnd)) +- { +- ::ShowWindow(topMostBlocker, SW_SHOWNA); +- } +- ::BringWindowToTop(blocker); +- blocker = AwtWindow::GetModalBlocker(blocker); +- } +- if (topMostBlocker != toolkitHWnd) { +- ::SetForegroundWindow(topMostBlocker); +- } ++ PopupAllDialogs(blocker, TRUE, ::GetForegroundWindow(), FALSE); ++ // return 1 to prevent the system from allowing the operation + return 1; + } + return CallNextHookEx(0, code, wParam, lParam); +@@ -271,30 +254,11 @@ + (wParam == WM_NCRBUTTONDOWN)) + { + HWND blocker = AwtWindow::GetModalBlocker(AwtComponent::GetTopLevelParentForWindow(hWnd)); +- HWND topMostBlocker = blocker; +- HWND prevForegroundWindow = ::GetForegroundWindow(); + if (::IsWindow(blocker)) { +- ::BringWindowToTop(hWnd); +- } +- while (::IsWindow(blocker)) { +- topMostBlocker = blocker; +- ::BringWindowToTop(blocker); +- blocker = AwtWindow::GetModalBlocker(blocker); +- } +- if (::IsWindow(topMostBlocker)) { +- // no beep/flash if the mouse was clicked in the taskbar menu +- // or the dialog is currently inactive +- if ((::WindowFromPoint(mhs->pt) == hWnd) && +- (prevForegroundWindow == topMostBlocker)) +- { +- ::MessageBeep(MB_OK); +- // some heuristics: 3 times x 64 milliseconds +- AwtWindow::FlashWindowEx(topMostBlocker, 3, 64, FLASHW_CAPTION); +- } +- if (topMostBlocker != AwtToolkit::GetInstance().GetHWnd()) { +- ::BringWindowToTop(topMostBlocker); +- ::SetForegroundWindow(topMostBlocker); +- } ++ BOOL onTaskbar = !(::WindowFromPoint(mhs->pt) == hWnd); ++ PopupAllDialogs(hWnd, FALSE, ::GetForegroundWindow(), onTaskbar); ++ // return a nonzero value to prevent the system from passing ++ // the message to the target window procedure + return 1; + } + } +@@ -303,6 +267,58 @@ + return CallNextHookEx(0, nCode, wParam, lParam); + } + ++/* ++ * The function goes through the heirarchy of the blocker dialogs and ++ * popups all the dialogs. Note that the function starts from the top ++ * blocker dialog and goes down to the dialog which is the bottom dialog. ++ * Using another traversal may cause to the flickering issue as a bottom ++ * dialog will cover a top dialog for some period of time. ++ */ ++void AwtDialog::PopupAllDialogs(HWND dialog, BOOL isModalHook, HWND prevFGWindow, BOOL onTaskbar) ++{ ++ HWND blocker = AwtWindow::GetModalBlocker(dialog); ++ BOOL isBlocked = ::IsWindow(blocker); ++ if (isBlocked) { ++ PopupAllDialogs(blocker, isModalHook, prevFGWindow, onTaskbar); ++ } ++ PopupOneDialog(dialog, blocker, isModalHook, prevFGWindow, onTaskbar); ++} ++ ++/* ++ * The function popups the dialog, it distinguishes non-blocked dialogs ++ * and activates the dialogs (sets as foreground window). If the dialog is ++ * blocked, then it changes the Z-order of the dialog. ++ */ ++void AwtDialog::PopupOneDialog(HWND dialog, HWND blocker, BOOL isModalHook, HWND prevFGWindow, BOOL onTaskbar) ++{ ++ if (dialog == AwtToolkit::GetInstance().GetHWnd()) { ++ return; ++ } ++ ++ // fix for 6494032 ++ if (isModalHook && !::IsWindowVisible(dialog)) { ++ ::ShowWindow(dialog, SW_SHOWNA); ++ } ++ ++ BOOL isBlocked = ::IsWindow(blocker); ++ UINT flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE; ++ ++ if (isBlocked) { ++ ::SetWindowPos(dialog, blocker, 0, 0, 0, 0, flags); ++ } else { ++ ::SetWindowPos(dialog, HWND_TOP, 0, 0, 0, 0, flags); ++ // no beep/flash if the mouse was clicked in the taskbar menu ++ // or the dialog is currently inactive ++ if (!isModalHook && !onTaskbar && (dialog == prevFGWindow)) { ++ ::MessageBeep(MB_OK); ++ // some heuristics: 3 times x 64 milliseconds ++ AwtWindow::FlashWindowEx(dialog, 3, 64, FLASHW_CAPTION); ++ } ++ ::BringWindowToTop(dialog); ++ ::SetForegroundWindow(dialog); ++ } ++} ++ + LRESULT CALLBACK AwtDialog::MouseHookProc_NonTT(int nCode, + WPARAM wParam, LPARAM lParam) + { +diff -r 03276203c39c -r 5453a374c1d5 src/windows/native/sun/windows/awt_Dialog.h +--- openjdk.orig/jdk/src/windows/native/sun/windows/awt_Dialog.h Tue Feb 17 10:42:12 2009 +0300 ++++ openjdk/jdk/src/windows/native/sun/windows/awt_Dialog.h Tue Feb 17 14:27:03 2009 +0300 +@@ -113,6 +113,9 @@ + */ + static void ModalPerformActivation(HWND hWnd); + ++ static void PopupAllDialogs(HWND dialog, BOOL isModalHook, HWND prevFGWindow, BOOL onTaskbar); ++ static void PopupOneDialog(HWND dialog, HWND blocker, BOOL isModalHook, HWND prevFGWindow, BOOL onTaskbar); ++ + public: + + // WH_CBT hook procedure used in modality, prevents modal +exporting patch: +<fdopen>