You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ay...@apache.org on 2007/10/05 22:45:40 UTC
svn commit: r582382 - in /harmony/enhanced/classlib/trunk/modules/awt/src:
main/java/common/java/awt/ test/api/java/common/java/awt/
Author: ayza
Date: Fri Oct 5 13:45:39 2007
New Revision: 582382
URL: http://svn.apache.org/viewvc?rev=582382&view=rev
Log:
Fix for dead loop issues described in HARMONY-4887 and HARMONY-4803 was committed
Modified:
harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Button.java
harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Checkbox.java
harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Choice.java
harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Component.java
harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Container.java
harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Label.java
harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/TextComponent.java
harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/ButtonRTest.java
harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/CheckboxTest.java
harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/ChoiceTest.java
harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/ComponentRTest.java
harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/LabelTest.java
harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/TextComponentTest.java
harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/TextFieldTest.java
harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/Tools.java
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Button.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Button.java?rev=582382&r1=582381&r2=582382&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Button.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Button.java Fri Oct 5 13:45:39 2007
@@ -166,11 +166,16 @@
public void setLabel(String label) {
toolkit.lockAWT();
try {
- this.label = label;
- if (isDisplayable()) {
- invalidate();
- if (isShowing()) {
- repaint();
+ if (!(this.label == label ||
+ (label != null && label.equals(this.label)))) {
+ // set new label only if it differs from the old one
+ // to avoid dead loop in repaint()
+ this.label = label;
+ if (isDisplayable()) {
+ invalidate();
+ if (isShowing()) {
+ repaint();
+ }
}
}
} finally {
@@ -296,8 +301,10 @@
@Override
void setEnabledImpl(boolean value) {
- super.setEnabledImpl(value);
- repaint();
+ if (isEnabled() != value) { // to avoid dead loop in repaint()
+ super.setEnabledImpl(value);
+ repaint();
+ }
}
void generateEvent(long timestamp, int modifiers) {
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Checkbox.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Checkbox.java?rev=582382&r1=582381&r2=582382&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Checkbox.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Checkbox.java Fri Oct 5 13:45:39 2007
@@ -351,8 +351,10 @@
}
void setChecked(boolean checked) {
- this.checked = checked;
- repaint();
+ if (checked != this.checked) { // avoid dead loop in repaint()
+ this.checked = checked;
+ repaint();
+ }
}
@SuppressWarnings("unchecked")
@@ -437,8 +439,10 @@
@Override
void setEnabledImpl(boolean value) {
- super.setEnabledImpl(value);
- repaint();
+ if (value != isEnabled()) { // avoid dead loop in repaint()
+ super.setEnabledImpl(value);
+ repaint();
+ }
}
@Override
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Choice.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Choice.java?rev=582382&r1=582381&r2=582382&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Choice.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Choice.java Fri Oct 5 13:45:39 2007
@@ -479,12 +479,15 @@
public void select(int pos) {
toolkit.lockAWT();
try {
- if (pos >= items.size() || pos < 0) {
- // awt.106=specified position is greater than the number of items
- throw new IllegalArgumentException(Messages.getString("awt.106")); //$NON-NLS-1$
+ if (selectedIndex != pos) { // to avoid dead loop in repaint()
+ if (pos >= items.size() || pos < 0) {
+ // awt.106=specified position is greater than the number of items
+ throw new IllegalArgumentException(
+ Messages.getString("awt.106")); //$NON-NLS-1$
+ }
+ selectedIndex = pos;
+ repaint();
}
- selectedIndex = pos;
- repaint();
} finally {
toolkit.unlockAWT();
}
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Component.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Component.java?rev=582382&r1=582381&r2=582382&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Component.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Component.java Fri Oct 5 13:45:39 2007
@@ -2985,10 +2985,13 @@
}
void setFontImpl(Font f) {
- font = f;
- invalidate();
- if (isShowing()) {
- repaint();
+ if (!(f == font ||
+ (f != null && f.equals(font)))) {// to avoid dead loop in repaint()
+ font = f;
+ invalidate();
+ if (isShowing()) {
+ repaint();
+ }
}
}
@@ -3009,6 +3012,7 @@
public void setForeground(Color c) {
Color oldFgColor;
+
toolkit.lockAWT();
try {
oldFgColor = foreColor;
@@ -3016,21 +3020,34 @@
} finally {
toolkit.unlockAWT();
}
- firePropertyChange("foreground", oldFgColor, foreColor); //$NON-NLS-1$
- repaint();
+
+ // Update only if new color differs from the old one.
+ // It is needed to avoid dead loops in repaint().
+ if (!(oldFgColor == c ||
+ (c != null && c.equals(oldFgColor)))) {
+ firePropertyChange("foreground", oldFgColor, c); //$NON-NLS-1$
+ repaint();
+ }
}
public void setBackground(Color c) {
- Color oldBkColor;
+ Color oldBgColor;
+
toolkit.lockAWT();
try {
- oldBkColor = backColor;
+ oldBgColor = backColor;
backColor = c;
} finally {
toolkit.unlockAWT();
}
- firePropertyChange("background", oldBkColor, backColor); //$NON-NLS-1$
- repaint();
+
+ // update only if new color differs from the old one
+ // to avoid dead loop in repaint()
+ if (!(c == oldBgColor ||
+ (c != null && c.equals(oldBgColor)))) {
+ firePropertyChange("background", oldBgColor, c); //$NON-NLS-1$
+ repaint();
+ }
}
public void setIgnoreRepaint(boolean value) {
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Container.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Container.java?rev=582382&r1=582381&r2=582382&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Container.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Container.java Fri Oct 5 13:45:39 2007
@@ -1321,8 +1321,8 @@
* Determine if comp contains point pos. Comp must be showing and top-most
* component in Z-order.
*
- * @param x
- * @param y
+ * @param comp component to look for
+ * @param pos point to look component at
*
* @return
*/
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Label.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Label.java?rev=582382&r1=582381&r2=582382&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Label.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/Label.java Fri Oct 5 13:45:39 2007
@@ -250,8 +250,10 @@
@Override
void setEnabledImpl(boolean value) {
- super.setEnabledImpl(value);
- repaint();
+ if (value != isEnabled()) { // to avoid dead loop in repaint()
+ super.setEnabledImpl(value);
+ repaint();
+ }
}
@Override
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/TextComponent.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/TextComponent.java?rev=582382&r1=582381&r2=582382&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/TextComponent.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/TextComponent.java Fri Oct 5 13:45:39 2007
@@ -774,8 +774,10 @@
public void setEditable(boolean b) {
toolkit.lockAWT();
try {
- editable = b;
- repaint(); // background color changes
+ if (editable != b) { // to avoid dead loop in repaint()
+ editable = b;
+ repaint(); // background color changes
+ }
} finally {
toolkit.unlockAWT();
}
@@ -1094,9 +1096,11 @@
@Override
void setEnabledImpl(boolean value) {
- super.setEnabledImpl(value);
- if (isShowing()) {
- repaint();
+ if (value != isEnabled()) { // to avoid dead loop in repaint()
+ super.setEnabledImpl(value);
+ if (isShowing()) {
+ repaint();
+ }
}
}
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/ButtonRTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/ButtonRTest.java?rev=582382&r1=582381&r2=582382&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/ButtonRTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/ButtonRTest.java Fri Oct 5 13:45:39 2007
@@ -28,7 +28,7 @@
import junit.framework.TestCase;
public class ButtonRTest extends TestCase {
-
+
public void testShowAndPack() {
Frame frm = new Frame("Test");
Button btnClose = new Button("MyClose");
@@ -89,6 +89,19 @@
testHarmony2305();
}
+ public void testDeadLoop4887() {
+ final int count[] = new int[1];
+ Button b = new Button() {
+ public void paint(Graphics g) {
+ count[0]++;
+ setEnabled(true);
+ setLabel("button1");
+ }
+ };
+
+ Tools.checkDeadLoop(b, count);
+ }
+
static class AL implements ActionListener {
ActionEvent e;
@@ -96,4 +109,5 @@
this.e = e;
}
}
+
}
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/CheckboxTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/CheckboxTest.java?rev=582382&r1=582381&r2=582382&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/CheckboxTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/CheckboxTest.java Fri Oct 5 13:45:39 2007
@@ -208,4 +208,18 @@
checkbox.removeItemListener(listener);
assertEquals(0, checkbox.getListeners(cls).length);
}
+
+ public void testDeadLoop4887() {
+ final int count[] = new int[1];
+ Component c = new Checkbox() {
+ public void paint(Graphics g) {
+ count[0]++;
+ setState(true);
+ setEnabled(true);
+ }
+ };
+
+ Tools.checkDeadLoop(c, count);
+ }
+
}
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/ChoiceTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/ChoiceTest.java?rev=582382&r1=582381&r2=582382&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/ChoiceTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/ChoiceTest.java Fri Oct 5 13:45:39 2007
@@ -365,4 +365,18 @@
assertTrue(eventProcessed);
}
+ public void testDeadLoop4887() {
+ final int count[] = new int[1];
+ Component c = new Choice() {
+ public void paint(Graphics g) {
+ count[0]++;
+ if (getItemCount() == 0) {
+ add("item");
+ }
+ select(0);
+ }
+ };
+
+ Tools.checkDeadLoop(c, count);
+ }
}
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/ComponentRTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/ComponentRTest.java?rev=582382&r1=582381&r2=582382&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/ComponentRTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/ComponentRTest.java Fri Oct 5 13:45:39 2007
@@ -78,6 +78,20 @@
// Regression test for HARMONY-2456
new Button().transferFocusUpCycle();
}
+
+ public void testDeadLoop4887() {
+ final int count[] = new int[1];
+ Component c = new Panel() {
+ public void paint(Graphics g) {
+ count[0]++;
+ setBackground(new Color(255, 255, 255));
+ setForeground(Color.BLACK);
+ setFont(new Font("Serif", Font.PLAIN, 10));
+ }
+ };
+
+ Tools.checkDeadLoop(c, count);
+ }
public static void main(String[] args) {
junit.textui.TestRunner.run(ComponentRTest.class);
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/LabelTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/LabelTest.java?rev=582382&r1=582381&r2=582382&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/LabelTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/LabelTest.java Fri Oct 5 13:45:39 2007
@@ -112,4 +112,16 @@
assertEquals(text, label.getText());
}
+ public void testDeadLoop4887() {
+ final int count[] = new int[1];
+ Component c = new Label() {
+ public void paint(Graphics g) {
+ count[0]++;
+ setEnabled(true);
+ }
+ };
+
+ Tools.checkDeadLoop(c, count);
+ }
+
}
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/TextComponentTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/TextComponentTest.java?rev=582382&r1=582381&r2=582382&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/TextComponentTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/TextComponentTest.java Fri Oct 5 13:45:39 2007
@@ -409,4 +409,16 @@
assertTrue("text event processed", eventProcessed);
}
+ public void testDeadLoop4887() {
+ final int count[] = new int[1];
+ Component c = new TextArea() {
+ public void paint(Graphics g) {
+ count[0]++;
+ setEditable(true);
+ setEnabled(true);
+ }
+ };
+
+ Tools.checkDeadLoop(c, count);
+ }
}
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/TextFieldTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/TextFieldTest.java?rev=582382&r1=582381&r2=582382&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/TextFieldTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/TextFieldTest.java Fri Oct 5 13:45:39 2007
@@ -431,5 +431,17 @@
null, 0, 0));
assertTrue(eventProcessed);
}
+
+ public void testDeadLoop4887() {
+ final int count[] = new int[1];
+ Component c = new TextField() {
+ public void paint(Graphics g) {
+ count[0]++;
+ setEchoChar(' ');
+ }
+ };
+
+ Tools.checkDeadLoop(c, count);
+ }
}
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/Tools.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/Tools.java?rev=582382&r1=582381&r2=582382&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/Tools.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/Tools.java Fri Oct 5 13:45:39 2007
@@ -60,6 +60,27 @@
return name.replace('.', '/') + '/';
}
+ public static void checkDeadLoop(Component c, int[] count) {
+ final int DEAD_LOOP_TIMEOUT = 1000;
+ final int VALID_NUMBER_OF_PAINT_CALLS = 5;
+
+ Frame f = new Frame();
+
+ f.add(c);
+ f.setSize(300,200);
+ f.setVisible(true);
+
+ try {
+ Thread.sleep(DEAD_LOOP_TIMEOUT);
+ } catch (Exception e) {}
+
+ f.dispose();
+
+ Assert.assertTrue("paint() called " + count[0] +
+ " times, a dead loop occurred",
+ count[0] <= VALID_NUMBER_OF_PAINT_CALLS);
+ }
+
public static class Shape {
static int pointCount[] = {
@@ -674,4 +695,5 @@
}
}
+
}