You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by "David Shepherdson (JIRA)" <ji...@apache.org> on 2008/07/06 09:12:38 UTC
[jira] Created: (WICKET-1732) FormTester's DropDownChoice
onSelectionChanged() behaviour doesn't reload page
FormTester's DropDownChoice onSelectionChanged() behaviour doesn't reload page
------------------------------------------------------------------------------
Key: WICKET-1732
URL: https://issues.apache.org/jira/browse/WICKET-1732
Project: Wicket
Issue Type: Bug
Components: wicket
Affects Versions: 1.3.3, 1.3.0-final
Reporter: David Shepherdson
Priority: Minor
When a DropDownChoice's onSelectionChanged() notification is sent from a browser, it causes the whole page to be reloaded/redisplayed (because the form is submitted). However, when the same notification is sent through the FormTester, it doesn't submit the form and therefore other components on the page may not be updated/redisplayed.
We're working around this by overriding FormTester's select() method so that it submits the form as follows:
@Override
public void select(String formComponentId, int index) {
super.select(formComponentId, index);
// Workaround for Wicket FormTester bug: selection changed notifications cause the page
// to be reloaded in a real browser, but they don't when using the Wicket tester.
FormComponent component = (FormComponent)getForm().get(formComponentId);
if (component instanceof DropDownChoice) {
try
{
Method wantOnSelectionChangedNotificationsMethod = DropDownChoice.class.getDeclaredMethod("wantOnSelectionChangedNotifications", new Class[0]);
wantOnSelectionChangedNotificationsMethod.setAccessible(true);
boolean wantOnSelectionChangedNotifications = ((Boolean)wantOnSelectionChangedNotificationsMethod.invoke(component, new Object[0])).booleanValue();
if (wantOnSelectionChangedNotifications) {
// Notification method call has already been made by super,
// but we want to trigger the page load, as would happen in a real browser.
// First, use reflection to get the form's hidden field id.
Method getHiddenFieldIdMethod = Form.class.getDeclaredMethod("getHiddenFieldId");
getHiddenFieldIdMethod.setAccessible(true);
String hiddenFieldId = (String) getHiddenFieldIdMethod.invoke(getForm());
// Now set the parameter in the form
// to cause it to call the callback when submitted.
m_wicketTester.getServletRequest().setParameter(
hiddenFieldId, component.urlFor(IOnChangeListener.INTERFACE).toString());
// And finally submit the form.
submit();
}
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
}
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
[jira] Commented: (WICKET-1732) FormTester's DropDownChoice
onSelectionChanged() behaviour doesn't reload page
Posted by "Peter Ertl (JIRA)" <ji...@apache.org>.
[ https://issues.apache.org/jira/browse/WICKET-1732?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12912735#action_12912735 ]
Peter Ertl commented on WICKET-1732:
------------------------------------
Is this issue still existant in 1.4 or 1.5? 1.3 is not maintained anymore.
> FormTester's DropDownChoice onSelectionChanged() behaviour doesn't reload page
> ------------------------------------------------------------------------------
>
> Key: WICKET-1732
> URL: https://issues.apache.org/jira/browse/WICKET-1732
> Project: Wicket
> Issue Type: Bug
> Components: wicket
> Affects Versions: 1.3.0-final, 1.3.3
> Reporter: David Shepherdson
> Priority: Minor
>
> When a DropDownChoice's onSelectionChanged() notification is sent from a browser, it causes the whole page to be reloaded/redisplayed (because the form is submitted). However, when the same notification is sent through the FormTester, it doesn't submit the form and therefore other components on the page may not be updated/redisplayed.
> We're working around this by overriding FormTester's select() method so that it submits the form as follows:
> @Override
> public void select(String formComponentId, int index) {
> super.select(formComponentId, index);
>
> // Workaround for Wicket FormTester bug: selection changed notifications cause the page
> // to be reloaded in a real browser, but they don't when using the Wicket tester.
> FormComponent component = (FormComponent)getForm().get(formComponentId);
> if (component instanceof DropDownChoice) {
> try
> {
> Method wantOnSelectionChangedNotificationsMethod = DropDownChoice.class.getDeclaredMethod("wantOnSelectionChangedNotifications", new Class[0]);
> wantOnSelectionChangedNotificationsMethod.setAccessible(true);
> boolean wantOnSelectionChangedNotifications = ((Boolean)wantOnSelectionChangedNotificationsMethod.invoke(component, new Object[0])).booleanValue();
> if (wantOnSelectionChangedNotifications) {
> // Notification method call has already been made by super,
> // but we want to trigger the page load, as would happen in a real browser.
>
> // First, use reflection to get the form's hidden field id.
> Method getHiddenFieldIdMethod = Form.class.getDeclaredMethod("getHiddenFieldId");
> getHiddenFieldIdMethod.setAccessible(true);
> String hiddenFieldId = (String) getHiddenFieldIdMethod.invoke(getForm());
>
> // Now set the parameter in the form
> // to cause it to call the callback when submitted.
> m_wicketTester.getServletRequest().setParameter(
> hiddenFieldId, component.urlFor(IOnChangeListener.INTERFACE).toString());
>
> // And finally submit the form.
> submit();
>
> }
> }
> catch (Exception e)
> {
> throw new RuntimeException(e);
> }
> }
> }
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.