From d135f66c1dda9223b1c15809a0db9b9f5ada2a86 Mon Sep 17 00:00:00 2001 From: serb Date: Tue, 27 Nov 2012 17:03:19 +0400 Subject: [PATCH] 8002308: [macosx] 7198229 should be applied to the user action only Reviewed-by: anthony, skovatch --- .../sun/lwawt/macosx/CPlatformWindow.java | 5 +- src/macosx/native/sun/awt/AWTWindow.m | 5 +- .../FrameSetSizeStressTest.java | 48 +++++++++++++++++++ 3 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 test/java/awt/Frame/FrameSetSizeStressTest/FrameSetSizeStressTest.java diff --git a/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java b/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java index 919f499ea..e6ab69635 100644 --- a/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java +++ b/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java @@ -869,7 +869,8 @@ public final class CPlatformWindow extends CFRetainedResource implements Platfor responder.handleWindowFocusEvent(gained, oppositePeer); } - private void deliverMoveResizeEvent(int x, int y, int width, int height) { + private void deliverMoveResizeEvent(int x, int y, int width, int height, + boolean byUser) { // when the content view enters the full-screen mode, the native // move/resize notifications contain a bounds smaller than // the whole screen and therefore we ignore the native notifications @@ -881,7 +882,7 @@ public final class CPlatformWindow extends CFRetainedResource implements Platfor final Rectangle oldB = nativeBounds; nativeBounds = new Rectangle(x, y, width, height); peer.notifyReshape(x, y, width, height); - if (!oldB.getSize().equals(nativeBounds.getSize()) ) { + if (byUser && !oldB.getSize().equals(nativeBounds.getSize())) { flushBuffers(); } //TODO validateSurface already called from notifyReshape diff --git a/src/macosx/native/sun/awt/AWTWindow.m b/src/macosx/native/sun/awt/AWTWindow.m index 7adbd360b..4b526ee81 100644 --- a/src/macosx/native/sun/awt/AWTWindow.m +++ b/src/macosx/native/sun/awt/AWTWindow.m @@ -449,12 +449,13 @@ AWT_ASSERT_APPKIT_THREAD; NSRect frame = ConvertNSScreenRect(env, [self.nsWindow frame]); - static JNF_MEMBER_CACHE(jm_deliverMoveResizeEvent, jc_CPlatformWindow, "deliverMoveResizeEvent", "(IIII)V"); + static JNF_MEMBER_CACHE(jm_deliverMoveResizeEvent, jc_CPlatformWindow, "deliverMoveResizeEvent", "(IIIIZ)V"); JNFCallVoidMethod(env, platformWindow, jm_deliverMoveResizeEvent, (jint)frame.origin.x, (jint)frame.origin.y, (jint)frame.size.width, - (jint)frame.size.height); + (jint)frame.size.height, + (jboolean)[self.nsWindow inLiveResize]); (*env)->DeleteLocalRef(env, platformWindow); } diff --git a/test/java/awt/Frame/FrameSetSizeStressTest/FrameSetSizeStressTest.java b/test/java/awt/Frame/FrameSetSizeStressTest/FrameSetSizeStressTest.java new file mode 100644 index 000000000..9a3b2f06f --- /dev/null +++ b/test/java/awt/Frame/FrameSetSizeStressTest/FrameSetSizeStressTest.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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; + +/* + @test + @bug 7177173 + @summary setBounds can cause StackOverflow in case of the considerable loading + @author Sergey Bylokhov +*/ +public final class FrameSetSizeStressTest { + + public static void main(final String[] args) { + final Frame frame = new Frame(); + frame.setSize(200, 200); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + for (int i = 0; i < 1000; ++i) { + frame.setSize(100, 100); + frame.setSize(200, 200); + frame.setSize(300, 300); + } + frame.dispose(); + } +} -- GitLab