Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
910bc930
D
dragonwell8_jdk
项目概览
openanolis
/
dragonwell8_jdk
通知
4
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_jdk
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
910bc930
编写于
5月 04, 2018
作者:
D
dkumar
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8202478: Backout JDK-8152974
Reviewed-by: prr, serb
上级
cf54fa00
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
5 addition
and
172 deletion
+5
-172
src/share/classes/java/awt/SequencedEvent.java
src/share/classes/java/awt/SequencedEvent.java
+5
-1
test/java/awt/event/SequencedEvent/SequencedEventTest.java
test/java/awt/event/SequencedEvent/SequencedEventTest.java
+0
-171
未找到文件。
src/share/classes/java/awt/SequencedEvent.java
浏览文件 @
910bc930
...
...
@@ -104,7 +104,11 @@ class SequencedEvent extends AWTEvent implements ActiveEvent {
if
(
EventQueue
.
isDispatchThread
())
{
EventDispatchThread
edt
=
(
EventDispatchThread
)
Thread
.
currentThread
();
edt
.
pumpEvents
(
ID
,
()
->
!
SequencedEvent
.
this
.
isFirstOrDisposed
());
edt
.
pumpEvents
(
SentEvent
.
ID
,
new
Conditional
()
{
public
boolean
evaluate
()
{
return
!
SequencedEvent
.
this
.
isFirstOrDisposed
();
}
});
}
else
{
while
(!
isFirstOrDisposed
())
{
synchronized
(
SequencedEvent
.
class
)
{
...
...
test/java/awt/event/SequencedEvent/SequencedEventTest.java
已删除
100644 → 0
浏览文件 @
cf54fa00
/*
* Copyright (c) 2018, 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.
*
* 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.
*/
/*
* @test
* @bug 8152974
* @summary AWT hang occurrs when sequenced events arrive out of sequence
* @run main SequencedEventTest
*/
import
sun.awt.AppContext
;
import
sun.awt.SunToolkit
;
import
java.awt.Robot
;
import
java.awt.Point
;
import
java.awt.Dimension
;
import
java.awt.FlowLayout
;
import
java.awt.AWTEvent
;
import
java.awt.Toolkit
;
import
java.awt.event.ActionEvent
;
import
java.awt.event.ActionListener
;
import
java.awt.event.InputEvent
;
import
java.lang.reflect.Constructor
;
import
java.util.concurrent.CountDownLatch
;
import
javax.swing.JFrame
;
import
javax.swing.JButton
;
import
javax.swing.SwingUtilities
;
import
javax.swing.JTextArea
;
public
class
SequencedEventTest
extends
JFrame
implements
ActionListener
{
private
JButton
spamMeButton
;
private
static
Robot
robot
;
private
static
SequencedEventTest
window
;
private
static
AppContext
context
;
public
static
void
main
(
String
[]
args
)
throws
Exception
{
SwingUtilities
.
invokeAndWait
(()
->
{
window
=
new
SequencedEventTest
();
window
.
setVisible
(
true
);
});
robot
=
new
Robot
();
robot
.
waitForIdle
();
Point
pt
=
window
.
spamMeButton
.
getLocationOnScreen
();
Dimension
d
=
window
.
spamMeButton
.
getSize
();
robot
.
mouseMove
(
pt
.
x
+
d
.
width
/
2
,
pt
.
y
+
d
.
height
/
2
);
robot
.
waitForIdle
();
robot
.
mousePress
(
InputEvent
.
BUTTON1_DOWN_MASK
);
robot
.
mouseRelease
(
InputEvent
.
BUTTON1_DOWN_MASK
);
/*
*Cannot have robot.waitForIdle() here since it will block the test forever,
* in the case of failure and the test will timeout.
*/
try
{
/*
* Wait for 2 seconds, and then see if all the sequenced events are dispatched.
*/
Thread
.
sleep
(
2000
);
AWTEvent
ev
=
Toolkit
.
getDefaultToolkit
().
getSystemEventQueue
().
peekEvent
(
java
.
awt
.
event
.
FocusEvent
.
FOCUS_LAST
+
1
);
if
(
ev
!=
null
)
throw
new
RuntimeException
(
"Test case failed!"
);
}
catch
(
InterruptedException
e
)
{
throw
new
RuntimeException
(
"Test case failed."
+
e
.
getMessage
());
}
/*
* In the case of failure, the cleanup job cannot be executed, since it
* will block the test.
*/
System
.
out
.
println
(
"Test case succeeded."
);
context
.
dispose
();
SwingUtilities
.
invokeAndWait
(()
->
window
.
dispose
());
}
public
SequencedEventTest
()
{
super
(
"Test Window"
);
setLayout
(
new
FlowLayout
());
JTextArea
textBlock
=
new
JTextArea
(
"Lorem ipsum dolor sit amet..."
);
add
(
textBlock
);
spamMeButton
=
new
JButton
(
"Press me!"
);
spamMeButton
.
addActionListener
(
this
);
add
(
spamMeButton
);
setDefaultCloseOperation
(
JFrame
.
EXIT_ON_CLOSE
);
pack
();
}
@Override
public
void
actionPerformed
(
ActionEvent
e
)
{
if
(
e
.
getSource
()
==
spamMeButton
)
{
AWTEvent
eventOne
=
getSequencedEvent
();
AWTEvent
eventFour
=
getSequencedEvent
();
ThreadGroup
tg
=
new
ThreadGroup
(
"TestThreadGroup"
);
CountDownLatch
latch
=
new
CountDownLatch
(
1
);
Thread
t
=
new
Thread
(
tg
,
()
->
{
context
=
SunToolkit
.
createNewAppContext
();
AWTEvent
eventTwo
=
getSequencedEvent
();
AWTEvent
eventThree
=
getSequencedEvent
();
Toolkit
.
getDefaultToolkit
().
getSystemEventQueue
().
postEvent
(
eventThree
);
Toolkit
.
getDefaultToolkit
().
getSystemEventQueue
().
postEvent
(
new
ActionEvent
(
this
,
0
,
null
));
Toolkit
.
getDefaultToolkit
().
getSystemEventQueue
().
postEvent
(
new
ActionEvent
(
this
,
1
,
null
));
Toolkit
.
getDefaultToolkit
().
getSystemEventQueue
().
postEvent
(
eventTwo
);
latch
.
countDown
();
});
t
.
start
();
try
{
latch
.
await
();
}
catch
(
InterruptedException
ex
)
{
throw
new
RuntimeException
(
"Test case failed."
);
}
Toolkit
.
getDefaultToolkit
().
getSystemEventQueue
().
postEvent
(
eventFour
);
Toolkit
.
getDefaultToolkit
().
getSystemEventQueue
().
postEvent
(
new
ActionEvent
(
this
,
2
,
null
));
Toolkit
.
getDefaultToolkit
().
getSystemEventQueue
().
postEvent
(
new
ActionEvent
(
this
,
3
,
null
));
Toolkit
.
getDefaultToolkit
().
getSystemEventQueue
().
postEvent
(
eventOne
);
try
{
t
.
join
();
}
catch
(
InterruptedException
ex
)
{
throw
new
RuntimeException
(
"Test case failed."
);
}
}
}
private
AWTEvent
getSequencedEvent
()
{
AWTEvent
wrapMe
=
new
AWTEvent
(
this
,
AWTEvent
.
RESERVED_ID_MAX
)
{};
try
{
/*
* SequencedEvent is a package private class, which cannot be instantiated
* by importing. So use reflection to create an instance.
*/
Class
<?
extends
AWTEvent
>
seqClass
=
(
Class
<?
extends
AWTEvent
>)
Class
.
forName
(
"java.awt.SequencedEvent"
);
Constructor
<?
extends
AWTEvent
>
seqConst
=
seqClass
.
getConstructor
(
AWTEvent
.
class
);
seqConst
.
setAccessible
(
true
);;
return
seqConst
.
newInstance
(
wrapMe
);
}
catch
(
Throwable
err
)
{
throw
new
RuntimeException
(
"Unable to instantiate SequencedEvent"
,
err
);
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录