6480547: REG: bug 4118621 which got Integrated in 1.1.8 fails in mustang from b25 onwards.
6808185: test/closed/java/awt/Menu/NullMenuLabelTest crashes
Reviewed-by: dcherepanov
--- a/jdk/src/windows/native/sun/windows/awt_MenuItem.cpp Tue Aug 24 12:54:46 2010 +0400
+++ b/jdk/src/windows/native/sun/windows/awt_MenuItem.cpp Tue Aug 31 15:05:09 2010 +0400
@@ -794,6 +794,11 @@
jobject jitem = GetTarget(env);
jstring label =
(jstring)(env)->GetObjectField(jitem, AwtMenuItem::labelID);
+ if (label == NULL) {
+ env->DeleteLocalRef(label);
+ env->DeleteLocalRef(jitem);
+ return FALSE; //separator must has '-' as label.
+ }
LPCWSTR labelW = JNU_GetStringPlatformChars(env, label, NULL);
BOOL isSeparator = (labelW && (wcscmp(labelW, L"-") == 0));
JNU_ReleaseStringPlatformChars(env, label, labelW);
--- a/jdk/src/windows/native/sun/windows/awt_TextComponent.h Tue Aug 24 12:54:46 2010 +0400
+++ b/jdk/src/windows/native/sun/windows/awt_TextComponent.h Tue Aug 31 15:05:09 2010 +0400
@@ -113,8 +113,6 @@
// Used to prevent untrusted code from synthesizing a WM_PASTE message
// by posting a <CTRL>-V KeyEvent
BOOL m_synthetic;
- virtual void EditSetSel(CHARRANGE &cr) = 0;
- virtual void EditGetSel(CHARRANGE &cr) = 0;
virtual LONG EditGetCharFromPos(POINT& pt) = 0;
private:
--- a/jdk/src/windows/native/sun/windows/awt_TextField.cpp Tue Aug 24 12:54:46 2010 +0400
+++ b/jdk/src/windows/native/sun/windows/awt_TextField.cpp Tue Aug 31 15:05:09 2010 +0400
@@ -41,7 +41,9 @@
* AwtTextField methods
*/
-AwtTextField::AwtTextField() {
+AwtTextField::AwtTextField()
+ : m_initialRescrollFlag( true )
+{
}
/* Create a new AwtTextField object and window. */
@@ -116,10 +118,6 @@
SendMessage(EM_SETSEL, cr.cpMin, cr.cpMax);
}
-void AwtTextField::EditGetSel(CHARRANGE &cr) {
- SendMessage(EM_SETSEL, reinterpret_cast<WPARAM>(&cr.cpMin), reinterpret_cast<LPARAM>(&cr.cpMax));
-}
-
LONG AwtTextField::EditGetCharFromPos(POINT& pt) {
return static_cast<LONG>(SendMessage(EM_CHARFROMPOS, 0, MAKELPARAM(pt.x, pt.y)));
}
@@ -153,11 +151,9 @@
* The workaround also allows us to implement synthetic focus mechanism.
*/
if (IsFocusingMouseMessage(msg)) {
- CHARRANGE cr;
LONG lCurPos = EditGetCharFromPos(msg->pt);
- EditGetSel(cr);
/*
* NOTE: Plain EDIT control always clears selection on mouse
* button press. We are clearing the current selection only if
@@ -174,6 +170,7 @@
SetStartSelectionPos(lCurPos);
SetEndSelectionPos(lCurPos);
}
+ CHARRANGE cr;
cr.cpMin = GetStartSelectionPos();
cr.cpMax = GetEndSelectionPos();
EditSetSel(cr);
@@ -310,6 +307,47 @@
delete secs;
}
+void AwtTextField::Reshape(int x, int y, int w, int h)
+{
+ AwtTextComponent::Reshape( x, y, w, h );
+
+ // Another option would be to call this
+ // after WM_SIZE notification is handled
+ initialRescroll();
+}
+
+
+// Windows' Edit control features:
+// (i) if text selection is set while control's width or height is 0,
+// text is scrolled oddly.
+// (ii) if control's size is changed, text seems never be automatically
+// rescrolled.
+//
+// This method is designed for the following scenario: AWT spawns Edit
+// control with 0x0 dimensions, then sets text selection, then resizes the
+// control (couple of times). This might cause text appear undesirably scrolled.
+// So we reset/set selection again to rescroll text. (see also CR 6480547)
+void AwtTextField::initialRescroll()
+{
+ if( ! m_initialRescrollFlag ) {
+ return;
+ }
+
+ ::RECT r;
+ BOOL ok = ::GetClientRect( GetHWnd(), &r );
+ if( ! ok || r.right==0 || r.bottom==0 ) {
+ return;
+ }
+
+ m_initialRescrollFlag = false;
+
+ DWORD start, end;
+ SendMessage( EM_GETSEL, (WPARAM)&start, (LPARAM)&end );
+ SendMessage( EM_SETSEL, (WPARAM)0, (LPARAM)0 );
+ SendMessage( EM_SETSEL, (WPARAM)start, (LPARAM)end );
+}
+
+
/************************************************************************
* WTextFieldPeer native methods
*/
--- a/jdk/src/windows/native/sun/windows/awt_TextField.h Tue Aug 24 12:54:46 2010 +0400
+++ b/jdk/src/windows/native/sun/windows/awt_TextField.h Tue Aug 31 15:05:09 2010 +0400
@@ -55,9 +55,14 @@
static void _SetEchoChar(void *param);
protected:
+ LONG EditGetCharFromPos(POINT& pt);
+ virtual void Reshape(int x, int y, int w, int h);
+
+private:
void EditSetSel(CHARRANGE &cr);
- void EditGetSel(CHARRANGE &cr);
- LONG EditGetCharFromPos(POINT& pt);
+ void initialRescroll();
+
+ bool m_initialRescrollFlag;
};
#endif /* AWT_TEXTFIELD_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Menu/NullMenuLabelTest/NullMenuLabelTest.java Tue Aug 31 15:05:09 2010 +0400
@@ -0,0 +1,26 @@
+/* @test 1.5 98/07/23
+ @bug 4064202 4253466
+ @summary Test for Win32 NPE when MenuItem with null label added.
+ @author fred.ecks
+ @run main/othervm NullMenuLabelTest
+*/
+
+import java.awt.*;
+
+public class NullMenuLabelTest {
+
+ public static void main(String[] args) {
+ Frame frame = new Frame("Test Frame");
+ frame.pack();
+ frame.setVisible(true);
+ MenuBar menuBar = new MenuBar();
+ frame.setMenuBar(menuBar);
+ Menu menu = new Menu(null);
+ menuBar.add(menu);
+ menu.add(new MenuItem(null));
+ // If we got this far, the test succeeded
+ frame.setVisible(false);
+ frame.dispose();
+ }
+
+} // class NullMenuLabelTest
--- a/jdk/test/java/awt/TextField/ScrollSelectionTest/ScrollSelectionTest.java Tue Aug 24 12:54:46 2010 +0400
+++ b/jdk/test/java/awt/TextField/ScrollSelectionTest/ScrollSelectionTest.java Tue Aug 31 15:05:09 2010 +0400
@@ -53,13 +53,14 @@
frame.add(tf);
tf.select(0, 20);
- String[] instructions =
- {
+ String[] instructions = {
"INSTRUCTIONS:",
"This is a test for a win32 specific problem",
- "If you see all the letters from 'a' to 'z' and",
- "letters from 'a' to 't' are selected then test passes"
- };
+ "If you see all the letters from 'a' to 'z' and",
+ "letters from 'a' to 't' are selected then test passes.",
+ "You may have to activate the frame to see the selection"
+ + " highlighted (e.g. by clicking on frame's title)."
+ };
Sysout.createDialogWithInstructions( instructions );
}// init()
--- a/jdk/test/java/awt/event/MouseEvent/SpuriousExitEnter/SpuriousExitEnter_3.java Tue Aug 24 12:54:46 2010 +0400
+++ b/jdk/test/java/awt/event/MouseEvent/SpuriousExitEnter/SpuriousExitEnter_3.java Tue Aug 31 15:05:09 2010 +0400
@@ -114,6 +114,7 @@
checkEvents(frameAdapter, 1, 1);
checkEvents(buttonAdapter, 0, 0);
w.setVisible(false);
+ Util.waitForIdle(r);
}
public static void main(String []s)