Adds the module name to the generated ID of FormPanel's iframe to ensure that IDs are unique across modules.

Patch by: jlabanca
Review by: jgw



git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@7364 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/client/ui/FormPanel.java b/user/src/com/google/gwt/user/client/ui/FormPanel.java
index c3ae4c6..2ad6825 100644
--- a/user/src/com/google/gwt/user/client/ui/FormPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/FormPanel.java
@@ -394,7 +394,9 @@
     if (createIFrame) {
       assert ((getTarget() == null) || (getTarget().trim().length() == 0)) : "Cannot create target iframe if the form's target is already set.";
 
-      frameName = "FormPanel_" + (++formId);
+      // We use the module name as part of the unique ID to ensure that ids are
+      // unique across modules.
+      frameName = "FormPanel_" + GWT.getModuleName() + "_" + (++formId);
       setTarget(frameName);
 
       sinkEvents(Event.ONLOAD);
diff --git a/user/test/com/google/gwt/user/UISuite.java b/user/test/com/google/gwt/user/UISuite.java
index bed64f3..1092d15 100644
--- a/user/test/com/google/gwt/user/UISuite.java
+++ b/user/test/com/google/gwt/user/UISuite.java
@@ -49,6 +49,7 @@
 import com.google.gwt.user.client.ui.FlexTableTest;
 import com.google.gwt.user.client.ui.FlowPanelTest;
 import com.google.gwt.user.client.ui.FocusPanelTest;
+import com.google.gwt.user.client.ui.FormPanelTest;
 import com.google.gwt.user.client.ui.GridTest;
 import com.google.gwt.user.client.ui.HTMLPanelTest;
 import com.google.gwt.user.client.ui.HiddenTest;
@@ -133,8 +134,7 @@
     suite.addTestSuite(FlexTableTest.class);
     suite.addTestSuite(FlowPanelTest.class);
     suite.addTestSuite(FocusPanelTest.class);
-    // Old Mozilla complains about the cross-site forms in FormPanelTest.
-    // suite.addTestSuite(FormPanelTest.class);
+    suite.addTestSuite(FormPanelTest.class);
     suite.addTestSuite(GridTest.class);
     suite.addTestSuite(HiddenTest.class);
     suite.addTestSuite(HistoryTest.class);
diff --git a/user/test/com/google/gwt/user/client/ui/FormPanelTest.java b/user/test/com/google/gwt/user/client/ui/FormPanelTest.java
index e016b1d..c576969 100644
--- a/user/test/com/google/gwt/user/client/ui/FormPanelTest.java
+++ b/user/test/com/google/gwt/user/client/ui/FormPanelTest.java
@@ -20,6 +20,8 @@
 import com.google.gwt.dom.client.Element;
 import com.google.gwt.dom.client.InputElement;
 import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteEvent;
+import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteHandler;
 import com.google.gwt.user.client.ui.FormPanel.SubmitEvent;
 import com.google.gwt.user.client.ui.FormPanel.SubmitHandler;
 
@@ -29,6 +31,12 @@
  * @see com.google.gwt.user.server.ui.FormPanelTestServlet
  */
 public class FormPanelTest extends SimplePanelTestBase<FormPanel> {
+  
+  /**
+   * The maximum amount of time to wait for a test to finish.
+   */
+  private static final int TEST_DELAY = 15000;
+  
   public static boolean clicked = false;
 
   @Override
@@ -44,12 +52,13 @@
     form.setWidget(tb);
     form.setAction("http://www.google.com/search");
 
-    form.addFormHandler(new FormHandler() {
-      public void onSubmit(FormSubmitEvent event) {
-        event.setCancelled(true);
+    form.addSubmitHandler(new SubmitHandler() {
+      public void onSubmit(SubmitEvent event) {
+        event.cancel();
       }
-
-      public void onSubmitComplete(FormSubmitCompleteEvent event) {
+    });
+    form.addSubmitCompleteHandler(new SubmitCompleteHandler() {
+      public void onSubmitComplete(SubmitCompleteEvent event) {
         fail("Form was cancelled and should not have been submitted");
       }
     });
@@ -73,12 +82,9 @@
 
     RootPanel.get().add(form);
 
-    delayTestFinish(5000);
-    form.addFormHandler(new FormHandler() {
-      public void onSubmit(FormSubmitEvent event) {
-      }
-
-      public void onSubmitComplete(FormSubmitCompleteEvent event) {
+    delayTestFinish(TEST_DELAY);
+    form.addSubmitCompleteHandler(new SubmitCompleteHandler() {
+      public void onSubmitComplete(SubmitCompleteEvent event) {
         // The server just echoes the contents of the request. The following
         // string should have been present in it.
         assertTrue(event.getResults().indexOf(
@@ -108,13 +114,13 @@
     ptb.setName("ptb");
 
     CheckBox cb0 = new CheckBox(), cb1 = new CheckBox();
-    cb1.setChecked(true);
+    cb1.setValue(true);
     cb0.setName("cb0");
     cb1.setName("cb1");
 
     RadioButton rb0 = new RadioButton("foo");
     RadioButton rb1 = new RadioButton("foo");
-    rb0.setChecked(true);
+    rb0.setValue(true);
     rb0.setName("rb0");
     rb1.setName("rb1");
 
@@ -142,13 +148,10 @@
     form.setWidget(panel);
     RootPanel.get().add(form);
 
-    delayTestFinish(5000);
+    delayTestFinish(TEST_DELAY);
 
-    form.addFormHandler(new FormHandler() {
-      public void onSubmit(FormSubmitEvent event) {
-      }
-
-      public void onSubmitComplete(FormSubmitCompleteEvent event) {
+    form.addSubmitCompleteHandler(new SubmitCompleteHandler() {
+      public void onSubmitComplete(SubmitCompleteEvent event) {
         // The server just echoes the query string. This is what it should look
         // like.
         assertTrue(event.getResults().equals(
@@ -162,26 +165,27 @@
 
   public void testNamedTargetSubmitEvent() {
     // Create a form and frame in the document we can wrap.
-    String uid = Document.get().createUniqueId();
-    HTML formAndFrame = new HTML(
-        "<form id='"
-            + uid
-            + "' method='post' target='targetFrame' action='"
+    String iframeId = Document.get().createUniqueId();
+    String iframeName = Document.get().createUniqueId();
+    final Element container = Document.get().createDivElement();
+    container.setInnerHTML(
+        "<form method='post' target='" + iframeName + "' action='"
             + GWT.getModuleBaseURL()
             + "formHandler?sendHappyHtml'>"
             + "<input type='submit' id='submitBtn'></input></form>"
-            + "<iframe src='javascript:\'\'' id='targetMe' name='targetFrame'></iframe>");
-    RootPanel.get().add(formAndFrame);
+            + "<iframe src=\"javascript:\'\'\" id='" + iframeId + "' "
+            + "name='" + iframeName + "'></iframe>");
+    Document.get().getBody().appendChild(container);
 
     // Wrap the form and make sure its target frame is intact.
-    FormPanel form = FormPanel.wrap(Document.get().getElementById(uid));
-    assertEquals("targetFrame", form.getTarget());
+    FormPanel form = FormPanel.wrap(container.getFirstChildElement());
+    assertEquals(iframeName, form.getTarget());
 
     // Ensure that no synthesized iframe was created.
     assertNull(form.getSynthesizedIFrame());
 
     // Submit the form using the submit button and make sure the submit event fires.
-    delayTestFinish(5000);
+    delayTestFinish(TEST_DELAY);
     form.addSubmitHandler(new SubmitHandler() {
       public void onSubmit(SubmitEvent event) {
         finishTest();
@@ -218,12 +222,9 @@
     dlg.setWidget(form);
     dlg.show();
 
-    delayTestFinish(5000);
-    form.addFormHandler(new FormHandler() {
-      public void onSubmit(FormSubmitEvent event) {
-      }
-
-      public void onSubmitComplete(FormSubmitCompleteEvent event) {
+    delayTestFinish(TEST_DELAY);
+    form.addSubmitCompleteHandler(new SubmitCompleteHandler() {
+      public void onSubmitComplete(SubmitCompleteEvent event) {
         // Make sure we get our results back.
         assertTrue(event.getResults().equals("tb=text"));
         finishTest();
@@ -248,7 +249,8 @@
     RootPanel.get().add(form);
     RootPanel.get().add(frame);
 
-    delayTestFinish(10000);
+    delayTestFinish(TEST_DELAY);
+    form.submit();
     Timer t = new Timer() {
       @Override
       public void run() {
@@ -259,57 +261,57 @@
     };
 
     // Wait 5 seconds before checking the results.
-    t.schedule(5000);
-    form.submit();
+    t.schedule(TEST_DELAY - 2000);
   }
 
   public void testWrappedForm() {
     // Create a form and frame in the document we can wrap.
-    String uid = Document.get().createUniqueId();
-    HTML formAndFrame = new HTML(
-        "<form id='"
-            + uid
-            + "' method='post' target='targetFrame' action='"
+    final String iframeId = Document.get().createUniqueId();
+    final String iframeName = Document.get().createUniqueId();
+    final Element container = Document.get().createDivElement();
+    container.setInnerHTML(
+        "<form method='post' target='" + iframeName + "' action='"
             + GWT.getModuleBaseURL()
             + "formHandler?sendHappyHtml'>"
             + "<input type='hidden' name='foo' value='bar'></input></form>"
-            + "<iframe src='javascript:\'\'' id='targetMe' name='targetFrame'></iframe>");
-    RootPanel.get().add(formAndFrame);
+            + "<iframe src=\"javascript:\'\'\" id='" + iframeId + "' "
+            + "name='" + iframeName + "'></iframe>");
+    Document.get().getBody().appendChild(container);
 
     // Wrap the form and make sure its target frame is intact.
-    FormPanel form = FormPanel.wrap(Document.get().getElementById(uid));
-    assertEquals("targetFrame", form.getTarget());
+    FormPanel form = FormPanel.wrap(container.getFirstChildElement());
+    assertEquals(iframeName, form.getTarget());
 
     // Ensure that no synthesized iframe was created.
     assertNull(form.getSynthesizedIFrame());
 
     // Submit the form and make sure the target frame comes back with the right
     // stuff (give it 2.5 s to complete).
-    delayTestFinish(5000);
+    delayTestFinish(TEST_DELAY);
+    form.submit();
     new Timer() {
       @Override
       public void run() {
         // Get the targeted frame and make sure it contains the requested
         // 'happyElem'.
-        Frame frame = Frame.wrap(Document.get().getElementById("targetMe"));
+        Frame frame = Frame.wrap(Document.get().getElementById(iframeId));
         assertTrue(isHappyDivPresent(frame.getElement()));
         finishTest();
       }
-    }.schedule(2500);
-    form.submit();
+    }.schedule(TEST_DELAY - 2000);
   }
 
   public void testWrappedFormTargetAssertion() {
-    // Testing a hosted-mode-only assertion.
+    // Testing a dev-mode-only assertion.
     if (!GWT.isScript()) {
       // Create a form element with the target attribute already set.
-      String uid = Document.get().createUniqueId();
-      HTML form = new HTML("<form id='" + uid + "' target='foo'></form>");
-      RootPanel.get().add(form);
+      final Element container = Document.get().createDivElement();
+      container.setInnerHTML("<form target='foo'></form>");
+      Document.get().getBody().appendChild(container);
 
       try {
         // Attempt to wrap it, requesting that an iframe be created.
-        FormPanel.wrap(Document.get().getElementById(uid), true);
+        FormPanel.wrap(container.getFirstChildElement(), true);
         fail("Assertion expected wrapping a form with the target set");
       } catch (Throwable e) {
         // ok.
@@ -319,23 +321,21 @@
 
   public void testWrappedFormWithIFrame() {
     // Create a form and frame in the document we can wrap.
-    String uid = Document.get().createUniqueId();
-    HTML formAndFrame = new HTML("<form id='" + uid + "' method='get' "
+    final Element container = Document.get().createDivElement();
+    container.setInnerHTML(
+        "<form method='get' "
         + "encoding='application/x-www-form-urlencoded' action='"
         + GWT.getModuleBaseURL() + "formHandler'>"
         + "<input type='text' name='tb' value='text'></input></form>");
-    RootPanel.get().add(formAndFrame);
+    Document.get().getBody().appendChild(container);
 
     // Wrap the form, asking for an iframe to be created.
-    FormPanel form = FormPanel.wrap(Document.get().getElementById(uid), true);
+    FormPanel form = FormPanel.wrap(container.getFirstChildElement(), true);
 
     // Give the submit 5s to complete.
-    delayTestFinish(5000);
-    form.addFormHandler(new FormHandler() {
-      public void onSubmit(FormSubmitEvent event) {
-      }
-
-      public void onSubmitComplete(FormSubmitCompleteEvent event) {
+    delayTestFinish(TEST_DELAY);
+    form.addSubmitCompleteHandler(new SubmitCompleteHandler() {
+      public void onSubmitComplete(SubmitCompleteEvent event) {
         // Make sure we get our results back.
         assertTrue(event.getResults().equals("tb=text"));
         finishTest();