Public (by t.broyer@gmail.com):
Description:
http://code.google.com/p/google-web-toolkit/issues/detail?id=4916

Remove old workaround code from DOMImplSafari for something that's been
fixed in Safari for a while makes it hard to work with optgroups in
select elements.

Reviewed by rjrjr@google.com
http://gwt-code-reviews.appspot.com/1313801/show


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9640 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/dom/client/DOMImplSafari.java b/user/src/com/google/gwt/dom/client/DOMImplSafari.java
index e9a4285..71b325e 100644
--- a/user/src/com/google/gwt/dom/client/DOMImplSafari.java
+++ b/user/src/com/google/gwt/dom/client/DOMImplSafari.java
@@ -276,36 +276,6 @@
     return false;
   }-*/;
 
-  /*
-   * The 'options' array cannot be used due to a bug in the version of WebKit
-   * that ships with GWT (http://bugs.webkit.org/show_bug.cgi?id=10472). The
-   * 'children' array, which is common for all DOM elements in Safari, does not
-   * suffer from the same problem. Ideally, the 'children' array should be used
-   * in all of the traversal methods in the DOM classes. Unfortunately, due to a
-   * bug in Safari 2 (http://bugs.webkit.org/show_bug.cgi?id=3330), this will
-   * not work. However, this bug does not cause problems in the case of <SELECT>
-   * elements, because their descendent elements are only one level deep.
-   */
-  @Override
-  public void selectClear(SelectElement select) {
-    select.setInnerText("");
-  }
-
-  @Override
-  public native int selectGetLength(SelectElement select) /*-{
-    return select.children.length;
-  }-*/;
-
-  @Override
-  public native NodeList<OptionElement> selectGetOptions(SelectElement select) /*-{
-    return select.children;
-  }-*/;
-
-  @Override
-  public native void selectRemoveOption(SelectElement select, int index) /*-{
-    select.removeChild(select.children[index]);
-  }-*/;
-
   @Override
   public void setScrollLeft(Document doc, int left) {
     // Safari always applies document scrolling to the body element, even in
diff --git a/user/test/com/google/gwt/dom/client/SelectTests.java b/user/test/com/google/gwt/dom/client/SelectTests.java
index 5223f65..2084dbc 100644
--- a/user/test/com/google/gwt/dom/client/SelectTests.java
+++ b/user/test/com/google/gwt/dom/client/SelectTests.java
@@ -15,6 +15,8 @@
  */
 package com.google.gwt.dom.client;
 
+import com.google.gwt.junit.DoNotRunWith;
+import com.google.gwt.junit.Platform;
 import com.google.gwt.junit.client.GWTTestCase;
 
 /**
@@ -127,4 +129,45 @@
     assertTrue(opt1.isSelected());
     assertTrue(opt2.isSelected());
   }
+  
+  /**
+   * optgroups
+   * 
+   * @see <a href="http://code.google.com/p/google-web-toolkit/issues/detail?id=4916">Issue 4916</a>
+   */
+  @DoNotRunWith(Platform.HtmlUnitBug)
+  public void testOptGroups() {
+    Document doc = Document.get();
+    SelectElement select = doc.createSelectElement();
+    doc.getBody().appendChild(select);
+
+    OptionElement opt0 = doc.createOptionElement();
+    OptionElement opt1 = doc.createOptionElement();
+    OptionElement opt2 = doc.createOptionElement();
+    OptGroupElement group1 = doc.createOptGroupElement();
+    opt0.setText("foo");
+    opt1.setText("bar");
+    opt2.setText("baz");
+    opt0.setValue("0");
+    opt1.setValue("1");
+    opt2.setValue("2");
+    group1.setLabel("group1");
+
+    select.appendChild(opt0);
+    select.appendChild(group1);
+    group1.appendChild(opt1);
+    select.appendChild(opt2);
+
+    assertEquals("3 options expected", 3, select.getOptions().getLength());
+    assertEquals("[0] == opt0", opt0, select.getOptions().getItem(0));
+    assertEquals("[1] == opt1", opt1, select.getOptions().getItem(1));
+    assertEquals("[2] == opt2", opt2, select.getOptions().getItem(2));
+
+    select.remove(1);
+    assertNull("null parent expected when removed", opt1.getParentElement());
+
+    select.add(opt1, opt0);
+    assertEquals("[0] == opt1", opt1, select.getOptions().getItem(0));
+    assertEquals("[1] == opt0", opt0, select.getOptions().getItem(1));
+    }
 }