summaryrefslogtreecommitdiff
path: root/modules/simpletest
diff options
context:
space:
mode:
authorDries Buytaert <dries@buytaert.net>2010-04-11 19:00:27 +0000
committerDries Buytaert <dries@buytaert.net>2010-04-11 19:00:27 +0000
commit33f0b0830baa8d584c8cce180fa2d8a0b94e39fd (patch)
tree00d6c31612eb275ac148abf678ff2a474e4fa44f /modules/simpletest
parent98a3f2266d516a39c2731499af2840b0a2d500ef (diff)
downloadbrdo-33f0b0830baa8d584c8cce180fa2d8a0b94e39fd.tar.gz
brdo-33f0b0830baa8d584c8cce180fa2d8a0b94e39fd.tar.bz2
- Patch #426056 by effulgentsia, Berdir, sun, boombatower, tstoeckler: fixed server-side enforcement of #disabled is inconsistent.
Diffstat (limited to 'modules/simpletest')
-rw-r--r--modules/simpletest/tests/form.test53
-rw-r--r--modules/simpletest/tests/form_test.module13
2 files changed, 55 insertions, 11 deletions
diff --git a/modules/simpletest/tests/form.test b/modules/simpletest/tests/form.test
index 87374dd00..7ecfde9ac 100644
--- a/modules/simpletest/tests/form.test
+++ b/modules/simpletest/tests/form.test
@@ -156,23 +156,54 @@ class FormsTestCase extends DrupalWebTestCase {
* @see _form_test_disabled_elements()
*/
function testDisabledElements() {
- // Submit the form, and fetch the default values.
- $this->drupalPost('form-test/disabled-elements', array(), t('Submit'));
- $returned_values = drupal_json_decode($this->content);
-
- // Get the default value from the form.
+ // Get the raw form in its original state.
$form_state = array();
$form = _form_test_disabled_elements(array(), $form_state);
+ // Build a submission that tries to hijack the form by submitting input for
+ // elements that are disabled.
+ $edit = array();
foreach (element_children($form) as $key) {
- if (isset($form[$key]['#default_value'])) {
- $expected_value = $form[$key]['#default_value'];
+ if (isset($form[$key]['#test_hijack_value'])) {
+ if (is_array($form[$key]['#test_hijack_value'])) {
+ foreach ($form[$key]['#test_hijack_value'] as $subkey => $value) {
+ $edit[$key . '[' . $subkey . ']'] = $value;
+ }
+ }
+ else {
+ $edit[$key] = $form[$key]['#test_hijack_value'];
+ }
+ }
+ }
- if ($key == 'checkboxes_multiple') {
- // Checkboxes values are not filtered out.
- $returned_values[$key] = array_filter($returned_values[$key]);
+ // Submit the form with no input, as the browser does for disabled elements,
+ // and fetch the $form_state['values'] that is passed to the submit handler.
+ $this->drupalPost('form-test/disabled-elements', array(), t('Submit'));
+ $returned_values['normal'] = drupal_json_decode($this->content);
+
+ // Do the same with input, as could happen if JavaScript un-disables an
+ // element. drupalPost() emulates a browser by not submitting input for
+ // disabled elements, so we need to un-disable those elements first.
+ $this->drupalGet('form-test/disabled-elements');
+ foreach ($this->xpath('//*[@disabled]') as $element) {
+ unset($element['disabled']);
+ }
+ $this->drupalPost(NULL, $edit, t('Submit'));
+ $returned_values['hijacked'] = drupal_json_decode($this->content);
+
+ // Ensure that the returned values match the form's default values in both
+ // cases.
+ foreach ($returned_values as $type => $values) {
+ foreach (element_children($form) as $key) {
+ if (isset($form[$key]['#default_value'])) {
+ $expected_value = $form[$key]['#default_value'];
+
+ if ($key == 'checkboxes_multiple') {
+ // Checkboxes values are not filtered out.
+ $values[$key] = array_filter($values[$key]);
+ }
+ $this->assertIdentical($expected_value, $values[$key], t('Default value for %type: expected %expected, returned %returned.', array('%type' => $key, '%expected' => var_export($expected_value, TRUE), '%returned' => var_export($values[$key], TRUE))));
}
- $this->assertIdentical($expected_value, $returned_values[$key], t('Default value for %type: expected %expected, returned %returned.', array('%type' => $key, '%expected' => var_export($expected_value, TRUE), '%returned' => var_export($returned_values[$key], TRUE))));
}
}
}
diff --git a/modules/simpletest/tests/form_test.module b/modules/simpletest/tests/form_test.module
index 11a76534e..e035eb721 100644
--- a/modules/simpletest/tests/form_test.module
+++ b/modules/simpletest/tests/form_test.module
@@ -706,6 +706,7 @@ function _form_test_disabled_elements($form, &$form_state) {
'#type' => $type,
'#title' => $type,
'#default_value' => $type,
+ '#test_hijack_value' => 'HIJACK',
'#disabled' => TRUE,
);
}
@@ -721,6 +722,9 @@ function _form_test_disabled_elements($form, &$form_state) {
),
'#multiple' => TRUE,
'#default_value' => array('test_2' => 'test_2'),
+ // The keys of #test_hijack_value need to match the #name of the control.
+ // @see FormsTestCase::testDisabledElements()
+ '#test_hijack_value' => $type == 'select' ? array('' => 'test_1') : array('test_1' => 'test_1'),
'#disabled' => TRUE,
);
}
@@ -736,6 +740,7 @@ function _form_test_disabled_elements($form, &$form_state) {
),
'#multiple' => FALSE,
'#default_value' => 'test_2',
+ '#test_hijack_value' => 'test_1',
'#disabled' => TRUE,
);
}
@@ -747,6 +752,7 @@ function _form_test_disabled_elements($form, &$form_state) {
'#title' => $type . ' (unchecked)',
'#return_value' => 1,
'#default_value' => 0,
+ '#test_hijack_value' => 1,
'#disabled' => TRUE,
);
$form[$type . '_checked'] = array(
@@ -754,6 +760,7 @@ function _form_test_disabled_elements($form, &$form_state) {
'#title' => $type . ' (checked)',
'#return_value' => 1,
'#default_value' => 1,
+ '#test_hijack_value' => NULL,
'#disabled' => TRUE,
);
}
@@ -763,6 +770,7 @@ function _form_test_disabled_elements($form, &$form_state) {
'#type' => 'weight',
'#title' => 'weight',
'#default_value' => 10,
+ '#test_hijack_value' => 5,
'#disabled' => TRUE,
);
@@ -776,6 +784,11 @@ function _form_test_disabled_elements($form, &$form_state) {
'month' => 11,
'year' => 1978,
),
+ '#test_hijack_value' => array(
+ 'day' => 20,
+ 'month' => 12,
+ 'year' => 1979,
+ ),
);
$form['submit'] = array(