Mercurial > hg > icedtea8-forest > jdk
changeset 14891:f910b9699402
8249183: JVM crash in "AwtFrame::WmSize" method
Reviewed-by: serb, aivanov
author | alitvinov |
---|---|
date | Mon, 31 Aug 2020 17:06:41 +0100 |
parents | 1a096444c130 |
children | 59e5a46d4e31 |
files | src/windows/classes/sun/awt/windows/WWindowPeer.java src/windows/native/sun/windows/awt_Frame.cpp src/windows/native/sun/windows/awt_Frame.h src/windows/native/sun/windows/awt_Window.cpp src/windows/native/sun/windows/awt_Window.h |
diffstat | 5 files changed, 60 insertions(+), 38 deletions(-) [+] |
line wrap: on
line diff
--- a/src/windows/classes/sun/awt/windows/WWindowPeer.java Tue Aug 23 20:45:35 2016 +0300 +++ b/src/windows/classes/sun/awt/windows/WWindowPeer.java Mon Aug 31 17:06:41 2020 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -345,6 +345,40 @@ } } + private void notifyWindowStateChanged(int oldState, int newState) { + int changed = oldState ^ newState; + if (changed == 0) { + return; + } + if (log.isLoggable(PlatformLogger.Level.FINE)) { + log.fine("Reporting state change %x -> %x", oldState, newState); + } + + if (target instanceof Frame) { + // Sync target with peer. + AWTAccessor.getFrameAccessor().setExtendedState((Frame) target, + newState); + } + + // Report (de)iconification to old clients. + if ((changed & Frame.ICONIFIED) > 0) { + if ((newState & Frame.ICONIFIED) > 0) { + postEvent(new TimedWindowEvent((Window) target, + WindowEvent.WINDOW_ICONIFIED, null, 0, 0, + System.currentTimeMillis())); + } else { + postEvent(new TimedWindowEvent((Window) target, + WindowEvent.WINDOW_DEICONIFIED, null, 0, 0, + System.currentTimeMillis())); + } + } + + // New (since 1.4) state change event. + postEvent(new TimedWindowEvent((Window) target, + WindowEvent.WINDOW_STATE_CHANGED, null, oldState, newState, + System.currentTimeMillis())); + } + synchronized void addWindowListener(WindowListener l) { windowListener = AWTEventMulticaster.add(windowListener, l); }
--- a/src/windows/native/sun/windows/awt_Frame.cpp Tue Aug 23 20:45:35 2016 +0300 +++ b/src/windows/native/sun/windows/awt_Frame.cpp Mon Aug 31 17:06:41 2020 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -99,7 +99,6 @@ jfieldID AwtFrame::undecoratedID; jmethodID AwtFrame::getExtendedStateMID; -jmethodID AwtFrame::setExtendedStateMID; jmethodID AwtFrame::activateEmbeddingTopLevelMID; jfieldID AwtFrame::isEmbeddedInIEID; @@ -811,13 +810,6 @@ } void -AwtFrame::SendWindowStateEvent(int oldState, int newState) -{ - SendWindowEvent(java_awt_event_WindowEvent_WINDOW_STATE_CHANGED, - NULL, oldState, newState); -} - -void AwtFrame::ClearMaximizedBounds() { m_maxBoundsSet = FALSE; @@ -955,24 +947,7 @@ jint changed = oldState ^ newState; if (changed != 0) { - DTRACE_PRINTLN2("AwtFrame::WmSize: reporting state change %x -> %x", - oldState, newState); - - // sync target with peer - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - env->CallVoidMethod(GetPeer(env), AwtFrame::setExtendedStateMID, newState); - - // report (de)iconification to old clients - if (changed & java_awt_Frame_ICONIFIED) { - if (newState & java_awt_Frame_ICONIFIED) { - SendWindowEvent(java_awt_event_WindowEvent_WINDOW_ICONIFIED); - } else { - SendWindowEvent(java_awt_event_WindowEvent_WINDOW_DEICONIFIED); - } - } - - // New (since 1.4) state change event - SendWindowStateEvent(oldState, newState); + NotifyWindowStateChanged(oldState, newState); } // If window is in iconic state, do not send COMPONENT_RESIZED event @@ -1679,10 +1654,6 @@ { TRY; - AwtFrame::setExtendedStateMID = env->GetMethodID(cls, "setExtendedState", "(I)V"); - DASSERT(AwtFrame::setExtendedStateMID); - CHECK_NULL(AwtFrame::setExtendedStateMID); - AwtFrame::getExtendedStateMID = env->GetMethodID(cls, "getExtendedState", "()I"); DASSERT(AwtFrame::getExtendedStateMID);
--- a/src/windows/native/sun/windows/awt_Frame.h Tue Aug 23 20:45:35 2016 +0300 +++ b/src/windows/native/sun/windows/awt_Frame.h Mon Aug 31 17:06:41 2020 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -54,7 +54,6 @@ /* sun.awt.windows.WEmbeddedFrame fields and method IDs */ static jfieldID handleID; - static jmethodID setExtendedStateMID; static jmethodID getExtendedStateMID; /* method id for WEmbeddedFrame.requestActivate() method */ @@ -88,8 +87,6 @@ INLINE BOOL isZoomed() { return m_zoomed; } INLINE void setZoomed(BOOL b) { m_zoomed = b; } - void SendWindowStateEvent(int oldState, int newState); - void Show(); INLINE void DrawMenuBar() { VERIFY(::DrawMenuBar(GetHWnd())); }
--- a/src/windows/native/sun/windows/awt_Window.cpp Tue Aug 23 20:45:35 2016 +0300 +++ b/src/windows/native/sun/windows/awt_Window.cpp Mon Aug 31 17:06:41 2020 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -168,6 +168,7 @@ jfieldID AwtWindow::sysWID; jfieldID AwtWindow::sysHID; jfieldID AwtWindow::windowTypeID; +jmethodID AwtWindow::notifyWindowStateChangedMID; jmethodID AwtWindow::getWarningStringMID; jmethodID AwtWindow::calculateSecurityWarningPositionMID; @@ -1614,6 +1615,16 @@ env->DeleteLocalRef(event); } +void AwtWindow::NotifyWindowStateChanged(jint oldState, jint newState) +{ + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + jobject peer = GetPeer(env); + if (peer != NULL) { + env->CallVoidMethod(peer, AwtWindow::notifyWindowStateChangedMID, + oldState, newState); + } +} + BOOL AwtWindow::AwtSetActiveWindow(BOOL isMouseEventCause, UINT hittest) { // We used to reject non mouse window activation if our app wasn't active. @@ -3211,6 +3222,11 @@ AwtWindow::windowTypeID = env->GetFieldID(cls, "windowType", "Ljava/awt/Window$Type;"); + AwtWindow::notifyWindowStateChangedMID = + env->GetMethodID(cls, "notifyWindowStateChanged", "(II)V"); + DASSERT(AwtWindow::notifyWindowStateChangedMID); + CHECK_NULL(AwtWindow::notifyWindowStateChangedMID); + CATCH_BAD_ALLOC; }
--- a/src/windows/native/sun/windows/awt_Window.h Tue Aug 23 20:45:35 2016 +0300 +++ b/src/windows/native/sun/windows/awt_Window.h Mon Aug 31 17:06:41 2020 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -57,6 +57,7 @@ static jfieldID securityWarningWidthID; static jfieldID securityWarningHeightID; + /* sun.awt.windows.WWindowPeer field and method IDs */ // The coordinates at the peer. static jfieldID sysXID; static jfieldID sysYID; @@ -64,7 +65,9 @@ static jfieldID sysHID; static jfieldID windowTypeID; + static jmethodID notifyWindowStateChangedMID; + /* java.awt.Window method IDs */ static jmethodID getWarningStringMID; static jmethodID calculateSecurityWarningPositionMID; static jmethodID windowTypeNameMID; @@ -149,6 +152,7 @@ void SendComponentEvent(jint eventId); void SendWindowEvent(jint id, HWND opposite = NULL, jint oldState = 0, jint newState = 0); + void NotifyWindowStateChanged(jint oldState, jint newState); BOOL IsFocusableWindow();