6607660: java.awt.Container.getMouseEventTargetImpl should be invoked while holding the TreeLock
Summary: The body of the method has been wrapped into the synchronized (getTreeLock()) { } block.
Reviewed-by: son, art
--- a/jdk/src/share/classes/java/awt/Container.java Tue Mar 18 13:53:08 2008 +0300
+++ b/jdk/src/share/classes/java/awt/Container.java Tue Mar 18 14:10:28 2008 +0300
@@ -2267,53 +2267,56 @@
EventTargetFilter filter,
boolean searchHeavyweightChildren,
boolean searchHeavyweightDescendants) {
- int ncomponents = this.ncomponents;
- Component component[] = this.component;
-
- for (int i = 0 ; i < ncomponents ; i++) {
- Component comp = component[i];
- if (comp != null && comp.visible &&
- ((!searchHeavyweightChildren &&
- comp.peer instanceof LightweightPeer) ||
- (searchHeavyweightChildren &&
- !(comp.peer instanceof LightweightPeer))) &&
- comp.contains(x - comp.x, y - comp.y)) {
-
- // found a component that intersects the point, see if there is
- // a deeper possibility.
- if (comp instanceof Container) {
- Container child = (Container) comp;
- Component deeper = child.getMouseEventTarget(x - child.x,
- y - child.y,
- includeSelf,
- filter,
- searchHeavyweightDescendants);
- if (deeper != null) {
- return deeper;
- }
- } else {
- if (filter.accept(comp)) {
- // there isn't a deeper target, but this component is a
- // target
- return comp;
+ synchronized (getTreeLock()) {
+ int ncomponents = this.ncomponents;
+ Component component[] = this.component;
+
+ for (int i = 0 ; i < ncomponents ; i++) {
+ Component comp = component[i];
+ if (comp != null && comp.visible &&
+ ((!searchHeavyweightChildren &&
+ comp.peer instanceof LightweightPeer) ||
+ (searchHeavyweightChildren &&
+ !(comp.peer instanceof LightweightPeer))) &&
+ comp.contains(x - comp.x, y - comp.y)) {
+
+ // found a component that intersects the point, see if there
+ // is a deeper possibility.
+ if (comp instanceof Container) {
+ Container child = (Container) comp;
+ Component deeper = child.getMouseEventTarget(
+ x - child.x,
+ y - child.y,
+ includeSelf,
+ filter,
+ searchHeavyweightDescendants);
+ if (deeper != null) {
+ return deeper;
+ }
+ } else {
+ if (filter.accept(comp)) {
+ // there isn't a deeper target, but this component
+ // is a target
+ return comp;
+ }
}
}
}
+
+ boolean isPeerOK;
+ boolean isMouseOverMe;
+
+ isPeerOK = (peer instanceof LightweightPeer) || includeSelf;
+ isMouseOverMe = contains(x,y);
+
+ // didn't find a child target, return this component if it's
+ // a possible target
+ if (isMouseOverMe && isPeerOK && filter.accept(this)) {
+ return this;
+ }
+ // no possible target
+ return null;
}
-
- boolean isPeerOK;
- boolean isMouseOverMe;
-
- isPeerOK = (peer instanceof LightweightPeer) || includeSelf;
- isMouseOverMe = contains(x,y);
-
- // didn't find a child target, return this component if it's a possible
- // target
- if (isMouseOverMe && isPeerOK && filter.accept(this)) {
- return this;
- }
- // no possible target
- return null;
}
static interface EventTargetFilter {