Fixes CheckBox.replaceInputElement() to not reverse the order of the input &
label elements. This was causing RadioButtons to have their elements reversed
when setName() was called.
Patch by: jgw
Review by: jlabanca (desk check)


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@4820 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/client/ui/CheckBox.java b/user/src/com/google/gwt/user/client/ui/CheckBox.java
index 40386ff..934d970 100644
--- a/user/src/com/google/gwt/user/client/ui/CheckBox.java
+++ b/user/src/com/google/gwt/user/client/ui/CheckBox.java
@@ -387,8 +387,7 @@
     // Clear out the old input element
     setEventListener(asOld(inputElem), null);
 
-    getElement().removeChild(inputElem);
-    getElement().insertBefore(newInputElem, null);
+    getElement().replaceChild(newInputElem, inputElem);
 
     // Sink events on the new element
     Event.sinkEvents(elem, Event.getEventsSunk(inputElem));
diff --git a/user/test/com/google/gwt/user/client/ui/RadioButtonTest.java b/user/test/com/google/gwt/user/client/ui/RadioButtonTest.java
index 9f75759..566c50e 100644
--- a/user/test/com/google/gwt/user/client/ui/RadioButtonTest.java
+++ b/user/test/com/google/gwt/user/client/ui/RadioButtonTest.java
@@ -110,4 +110,22 @@
     assertFalse(r2.getValue());
     assertTrue(r3.getValue());
   }
+
+  /**
+   * Ensures that the element order doesn't get reversed when the radio's
+   * name is changed.
+   */
+  public void testOrderAfterSetName() {
+    RadioButton radio = new RadioButton("oldName");
+    assertEquals("oldName", radio.getName());
+
+    radio.setName("newName");
+    assertEquals("newName", radio.getName());
+
+    Element parent = radio.getElement();
+    Element firstChild = parent.getFirstChildElement().cast();
+    Element secondChild = firstChild.getNextSiblingElement().cast();
+    assertEquals("input", firstChild.getTagName().toLowerCase());
+    assertEquals("label", secondChild.getTagName().toLowerCase());
+  }
 }