Add HTMLPanel.wrap(Element).
http://gwt-code-reviews.appspot.com/1360801/show

Issue: 3511
Author: tbroyer
Review by: jlabanca


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9735 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/client/ui/HTMLPanel.java b/user/src/com/google/gwt/user/client/ui/HTMLPanel.java
index 814381a..2240ac7 100644
--- a/user/src/com/google/gwt/user/client/ui/HTMLPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/HTMLPanel.java
@@ -42,6 +42,28 @@
   }
 
   /**
+   * Creates an HTML panel that wraps an existing element.
+   * 
+   * This element must already be attached to the document. If the element is
+   * removed from the document, you must call
+   * {@link RootPanel#detachNow(Widget)}.
+   * 
+   * @param element the element to be wrapped
+   */
+  public static HTMLPanel wrap(Element element) {
+    // Assert that the element is attached.
+    assert Document.get().getBody().isOrHasChild(element);
+
+    HTMLPanel html = new HTMLPanel(element);
+
+    // Mark it attached and remember it for cleanup.
+    html.onAttach();
+    RootPanel.detachOnWindowClose(html);
+
+    return html;
+  }
+
+  /**
    * Creates an HTML panel with the specified HTML contents inside a DIV
    * element. Any element within this HTML that has a specified id can contain a
    * child widget.
@@ -100,7 +122,16 @@
     setElement(scratchDiv.getFirstChildElement());
     getElement().removeFromParent();
   }
-  
+
+  /**
+   * Construct a new {@link HTMLPanel} with the specified element.
+   *  
+   * @param elem the element at the root of the panel
+   */
+  private HTMLPanel(Element elem) {
+    setElement(elem);
+  }
+
   /**
    * Adds a child widget to the panel.
    * 
diff --git a/user/test/com/google/gwt/user/client/ui/ElementWrappingTest.java b/user/test/com/google/gwt/user/client/ui/ElementWrappingTest.java
index 27a8b50..683834b 100644
--- a/user/test/com/google/gwt/user/client/ui/ElementWrappingTest.java
+++ b/user/test/com/google/gwt/user/client/ui/ElementWrappingTest.java
@@ -151,6 +151,18 @@
   }
 
   /**
+   * Tests {@link HTMLPanel#wrap(Element)}.
+   */
+  public void testHTMLPanel() {
+    ensureDiv().setInnerHTML("<div id='foo'>my<div id='bar'>HTML</div></div>");
+    Element bar = Document.get().getElementById("bar");
+    HTMLPanel html = HTMLPanel.wrap(Document.get().getElementById("foo"));
+
+    assertExistsAndAttached(html);
+    assertTrue(html.getElement().isOrHasChild(bar));
+  }  
+
+  /**
    * Tests {@link Image#wrap(Element)}.
    */
   public void testImage() {