Skip to content
Permalink
Browse files
8249183: JVM crash in "AwtFrame::WmSize" method
Backport-of: 4e3d9e3
  • Loading branch information
Yuri Nesterenko committed Nov 27, 2020
1 parent 5af784b commit 80be64a4664afeb27893dc41ff5985f0f4967093
@@ -32,6 +32,7 @@
import java.awt.Container;
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
@@ -58,6 +59,7 @@
import sun.awt.AppContext;
import sun.awt.DisplayChangedListener;
import sun.awt.SunToolkit;
import sun.awt.TimedWindowEvent;
import sun.awt.Win32GraphicsConfig;
import sun.awt.Win32GraphicsDevice;
import sun.awt.Win32GraphicsEnvironment;
@@ -387,6 +389,40 @@ void preprocessPostEvent(AWTEvent event) {
}
}

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);
}
@@ -99,7 +99,6 @@ jfieldID AwtFrame::handleID;

jfieldID AwtFrame::undecoratedID;
jmethodID AwtFrame::getExtendedStateMID;
jmethodID AwtFrame::setExtendedStateMID;

jmethodID AwtFrame::activateEmbeddingTopLevelMID;
jfieldID AwtFrame::isEmbeddedInIEID;
@@ -813,13 +812,6 @@ AwtFrame::Show()
}
}

void
AwtFrame::SendWindowStateEvent(int oldState, int newState)
{
SendWindowEvent(java_awt_event_WindowEvent_WINDOW_STATE_CHANGED,
NULL, oldState, newState);
}

void
AwtFrame::ClearMaximizedBounds()
{
@@ -973,24 +965,7 @@ MsgRouting AwtFrame::WmSize(UINT type, int w, int h)

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
@@ -1696,10 +1671,6 @@ Java_sun_awt_windows_WFramePeer_initIDs(JNIEnv *env, jclass cls)
{
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);

@@ -54,7 +54,6 @@ class AwtFrame : public AwtWindow {
/* 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 @@ class AwtFrame : public AwtWindow {
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())); }
@@ -184,6 +184,7 @@ jfieldID AwtWindow::sysYID;
jfieldID AwtWindow::sysWID;
jfieldID AwtWindow::sysHID;
jfieldID AwtWindow::windowTypeID;
jmethodID AwtWindow::notifyWindowStateChangedMID;

jmethodID AwtWindow::getWarningStringMID;
jmethodID AwtWindow::calculateSecurityWarningPositionMID;
@@ -1641,6 +1642,16 @@ void AwtWindow::SendWindowEvent(jint id, HWND opposite,
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.
@@ -3344,6 +3355,11 @@ Java_sun_awt_windows_WWindowPeer_initIDs(JNIEnv *env, jclass cls)
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;
}

@@ -57,14 +57,17 @@ class AwtWindow : public AwtCanvas {
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;
static jfieldID sysWID;
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 @@ class AwtWindow : public AwtCanvas {
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();

1 comment on commit 80be64a

@openjdk-notifier

This comment has been minimized.

Copy link

@openjdk-notifier openjdk-notifier bot commented on 80be64a Nov 27, 2020

Please sign in to comment.