Heine

  • home
  • drupal
  • drupal core commits
  • about
Home › Drupal Core Commits

Commit 340636 by dries

- Patch #335035 by boombatower, Damien Tournoud, ksenzee, Berdir, Dave Reid, effulgentsia: Simpletest drupalPost() incorrectly submits input for disabled elements, causing unreliable testing of forms that contain them.

--- <a href="http://drupalcode.org/viewvc/drupal/drupal/includes/form.inc" title="http://drupalcode.org/viewvc/drupal/drupal/includes/form.inc" rel="nofollow">http://drupalcode.org/viewvc/drupal/drupal/includes/form.inc</a> 2010/03/11 22:46:32     1.440
+++ <a href="http://drupalcode.org/viewvc/drupal/drupal/includes/form.inc" title="http://drupalcode.org/viewvc/drupal/drupal/includes/form.inc" rel="nofollow">http://drupalcode.org/viewvc/drupal/drupal/includes/form.inc</a> 2010/03/12 14:38:37     1.441
@@ -1658,7 +1658,10 @@
     }
     return $value;
   }
-  elseif (!isset($input)) {
+  // If the checkboxes are enabled, and NULL input is submitted, it means
+  // they're intentionally unchecked, so we need to return an empty array to
+  // prevent the default value from being used.
+  elseif (!isset($input) && empty($element['#disabled'])) {
     return array();
   }
 }
@@ -1698,7 +1701,15 @@
 function form_type_select_value($element, $input = FALSE) {
   if ($input !== FALSE) {
     if (isset($element['#multiple']) && $element['#multiple']) {
-      return (is_array($input)) ? drupal_map_assoc($input) : array();
+      // If an enabled multi-select submits NULL, it means all items are
+      // unselected. A disabled multi-select always submits NULL, and the
+      // default value should be used.
+      if (empty($element['#disabled'])) {
+        return (is_array($input)) ? drupal_map_assoc($input) : array();
+      }
+      else {
+        return (isset($element['#default_value']) && is_array($element['#default_value'])) ? $element['#default_value'] : array();
+      }
     }
     else {
       return $input;
@@ -1719,7 +1730,7 @@
  *   for this element. Return nothing to use the default.
  */
 function form_type_textfield_value($element, $input = FALSE) {
-  if ($input !== FALSE) {
+  if ($input !== FALSE && $input !== NULL) {
     // Equate $input to the form value to ensure it's marked for
     // validation.
     return str_replace(array("\r", "\n"), '', $input);
@@ -2206,6 +2217,7 @@
           '#parents' => $element['#parents'],
           '#id' => drupal_html_id('edit-' . implode('-', $parents_for_id)),
           '#ajax' => isset($element['#ajax']) ? $element['#ajax'] : NULL,
+          '#disabled' => isset($element['#disabled']) ? $element['#disabled'] : NULL,
         );
       }
     }
@@ -2308,6 +2320,7 @@
           '#default_value' => isset($value[$key]) ? $key : NULL,
           '#attributes' => $element['#attributes'],
           '#ajax' => isset($element['#ajax']) ? $element['#ajax'] : NULL,
+          '#disabled' => isset($element['#disabled']) ? $element['#disabled'] : NULL,
         );
       }
     }
@@ -2459,6 +2472,7 @@
             '#default_value' => isset($value[$key]) ? $key : NULL,
             '#attributes' => $element['#attributes'],
             '#ajax' => isset($element['#ajax']) ? $element['#ajax'] : NULL,
+            '#disabled' => isset($element['#disabled']) ? $element['#disabled'] : NULL,
           );
         }
         else {
@@ -2474,6 +2488,7 @@
             '#parents' => $element['#parents'],
             '#id' => drupal_html_id('edit-' . implode('-', $parents_for_id)),
             '#ajax' => isset($element['#ajax']) ? $element['#ajax'] : NULL,
+            '#disabled' => isset($element['#disabled']) ? $element['#disabled'] : NULL,
           );
         }
       }

--- <a href="http://drupalcode.org/viewvc/drupal/drupal/modules/simpletest/drupal_web_test_case.php" title="http://drupalcode.org/viewvc/drupal/drupal/modules/simpletest/drupal_web_test_case.php" rel="nofollow">http://drupalcode.org/viewvc/drupal/drupal/modules/simpletest/drupal_web...</a>      2010/03/07 18:06:06     1.202
+++ <a href="http://drupalcode.org/viewvc/drupal/drupal/modules/simpletest/drupal_web_test_case.php" title="http://drupalcode.org/viewvc/drupal/drupal/modules/simpletest/drupal_web_test_case.php" rel="nofollow">http://drupalcode.org/viewvc/drupal/drupal/modules/simpletest/drupal_web...</a>      2010/03/12 14:38:37     1.203
@@ -1747,7 +1747,7 @@
    */
   protected function handleForm(&$post, &$edit, &$upload, $submit, $form) {
     // Retrieve the form elements.
-    $elements = $form->xpath('.//input|.//textarea|.//select');
+    $elements = $form->xpath('.//input[not(@disabled)]|.//textarea[not(@disabled)]|.//select[not(@disabled)]');
     $submit_matches = FALSE;
     foreach ($elements as $element) {
       // SimpleXML objects need string casting all the time.

--- <a href="http://drupalcode.org/viewvc/drupal/drupal/modules/simpletest/tests/form.test" title="http://drupalcode.org/viewvc/drupal/drupal/modules/simpletest/tests/form.test" rel="nofollow">http://drupalcode.org/viewvc/drupal/drupal/modules/simpletest/tests/form...</a>        2010/03/07 07:49:26     1.38
+++ <a href="http://drupalcode.org/viewvc/drupal/drupal/modules/simpletest/tests/form.test" title="http://drupalcode.org/viewvc/drupal/drupal/modules/simpletest/tests/form.test" rel="nofollow">http://drupalcode.org/viewvc/drupal/drupal/modules/simpletest/tests/form...</a>        2010/03/12 14:38:37     1.39
@@ -172,7 +172,7 @@
           // Checkboxes values are not filtered out.
           $returned_values[$key] = array_filter($returned_values[$key]);
         }
-        $this->assertEqual($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))));
+        $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))));
       }
     }
   }

--- <a href="http://drupalcode.org/viewvc/drupal/drupal/modules/translation/translation.test" title="http://drupalcode.org/viewvc/drupal/drupal/modules/translation/translation.test" rel="nofollow">http://drupalcode.org/viewvc/drupal/drupal/modules/translation/translati...</a>    2010/01/10 22:56:51     1.23
+++ <a href="http://drupalcode.org/viewvc/drupal/drupal/modules/translation/translation.test" title="http://drupalcode.org/viewvc/drupal/drupal/modules/translation/translation.test" rel="nofollow">http://drupalcode.org/viewvc/drupal/drupal/modules/translation/translati...</a>    2010/03/12 14:38:37     1.24
@@ -110,11 +110,14 @@
         $this->assertRaw(t('The language %language has been created and can now be used. More information is available on the <a href="@locale-help">help screen</a>.', array('%language' => $languages[$language_code]->name, '@locale-help' => url('admin/help/locale'))), t('Language has been created.'));
       }
     }
+    elseif ($this->xpath('//input[@type=\'checkbox\' and @name=\'enabled[' . $language_code . ']\' and @checked=\'checked\']')) {
+      // It's installed and enabled. No need to do anything.
+      $this->assertTrue(true, 'Language [' . $language_code . '] already installed and enabled.');
+    }
     else {
-      // Ensure that it is enabled.
+      // It's installed but not enabled. Enable it.
       $this->assertTrue(true, 'Language [' . $language_code . '] already installed.');
       $this->drupalPost(NULL, array('enabled[' . $language_code . ']' => TRUE), t('Save configuration'));
-
       $this->assertRaw(t('Configuration saved.'), t('Language successfully enabled.'));
     }
   }

No votes yet
  • Drupal Core
  • Download patch

Recent posts

  • Planet Drupal past and current
  • Help! - Cannot access a global variable.
  • Why is my module's update hook not listed on update.php's selection form?
  • How do I add a class to a link generated with l()
  • ZeroDayScan - Full path disclosure bug in Drupal 6.16 (0day)
more

Security reviews

  • Afraid custom code makes your site vulnerable?
  • You don't really trust that module you just downloaded from Drupal.org?

Sleep better after a security review.

Tags

Captcha CSRF Drupal embed Input Format modx OpenID Performance Planet Drupal rants Security Varnish
more tags
  • home
  • drupal
  • drupal core commits
  • about

Copyright © 2010 by Heine Deelstra. All rights reserved.