Fix for issue where Image(Element element) does not initialize the initial ClippedState.
http://gwt-code-reviews.appspot.com/1370804/

Issue: 5998
Author: david.nouls
Review by: jlabanca


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9803 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/client/ui/Image.java b/user/src/com/google/gwt/user/client/ui/Image.java
index b057c2c..2c074d8 100644
--- a/user/src/com/google/gwt/user/client/ui/Image.java
+++ b/user/src/com/google/gwt/user/client/ui/Image.java
@@ -409,7 +409,6 @@
     assert Document.get().getBody().isOrHasChild(element);
 
     Image image = new Image(element);
-    image.changeState(new UnclippedState(element));
 
     // Mark it attached and remember it for cleanup.
     image.onAttach();
@@ -481,6 +480,7 @@
   protected Image(Element element) {
     ImageElement.as(element);
     setElement(element);
+    changeState(new UnclippedState(element));
   }
 
   public HandlerRegistration addClickHandler(ClickHandler handler) {
diff --git a/user/test/com/google/gwt/user/client/ui/ImageTest.java b/user/test/com/google/gwt/user/client/ui/ImageTest.java
index d32d411..7007839 100644
--- a/user/test/com/google/gwt/user/client/ui/ImageTest.java
+++ b/user/test/com/google/gwt/user/client/ui/ImageTest.java
@@ -18,6 +18,7 @@
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.dom.client.DivElement;
 import com.google.gwt.dom.client.Document;
+import com.google.gwt.dom.client.Element;
 import com.google.gwt.event.dom.client.ErrorEvent;
 import com.google.gwt.event.dom.client.ErrorHandler;
 import com.google.gwt.event.dom.client.LoadEvent;
@@ -50,6 +51,25 @@
     }
   }
 
+  private static class TestImage extends Image {
+    public TestImage(Element element) {
+      super(element);
+    }
+
+    public static TestImage wrap(Element element) {
+      // Assert that the element is attached.
+      assert Document.get().getBody().isOrHasChild(element);
+
+      TestImage image = new TestImage(element);
+
+      // Mark it attached and remember it for cleanup.
+      image.onAttach();
+      RootPanel.detachOnWindowClose(image);
+
+      return image;
+    }
+  }
+  
   private abstract static class TestLoadHandler implements LoadHandler {
     private boolean finished = false;
 
@@ -557,6 +577,23 @@
   }
 
   /**
+   * Tests that it is possible to make a subclass of Image that can be wrapped.
+   */
+  public void testWrapOfSubclass() {
+    String uid = Document.get().createUniqueId();
+    DivElement div = Document.get().createDivElement();
+    div.setInnerHTML("<img id='" + uid + "' src='counting-forward.png'>");
+    Document.get().getBody().appendChild(div);
+
+    final TestImage image = TestImage.wrap(Document.get().getElementById(uid));
+    assertNotNull(image);
+
+    // Cleanup.
+    Document.get().getBody().appendChild(div);
+    RootPanel.detachNow(image);
+  }
+
+  /**
    * Tests that wrapping an existing DOM element works if you call
    * setUrlAndVisibleRect() on it.
    */