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();