Index: install.php =================================================================== RCS file: /cvs/drupal/drupal/install.php,v retrieving revision 1.210 diff -u -p -r1.210 install.php --- install.php 18 Sep 2009 00:12:45 -0000 1.210 +++ install.php 18 Sep 2009 16:10:05 -0000 @@ -391,7 +391,7 @@ function install_run_task($task, &$insta // We need to pass $install_state by reference in order for forms to // modify it, since the form API will use it in call_user_func_array(), // which requires that referenced variables be passed explicitly. - 'args' => array(&$install_state), + 'build_info' => array('args' => array(&$install_state)), 'no_redirect' => TRUE, ); $form = drupal_build_form($function, $form_state); Index: includes/ajax.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/ajax.inc,v retrieving revision 1.8 diff -u -p -r1.8 ajax.inc --- includes/ajax.inc 5 Sep 2009 15:05:01 -0000 1.8 +++ includes/ajax.inc 18 Sep 2009 16:10:05 -0000 @@ -189,7 +189,6 @@ function ajax_get_form() { // The form needs to be processed; prepare for that by setting a few internal // variables. $form_state['input'] = $_POST; - $form_state['args'] = $form['#args']; $form_id = $form['#form_id']; return array($form, $form_state, $form_id, $form_build_id); Index: includes/form.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/form.inc,v retrieving revision 1.373 diff -u -p -r1.373 form.inc --- includes/form.inc 18 Sep 2009 00:12:45 -0000 1.373 +++ includes/form.inc 18 Sep 2009 16:10:05 -0000 @@ -72,7 +72,7 @@ function drupal_get_form($form_id) { $args = func_get_args(); // Remove $form_id from the arguments. array_shift($args); - $form_state['args'] = $args; + $form_state['build_info']['args'] = $args; return drupal_build_form($form_id, $form_state); } @@ -156,23 +156,22 @@ function drupal_build_form($form_id, &$f // object, we're hitting the form for the first time and we need // to build it from scratch. if (!isset($form)) { - $form = drupal_retrieve_form($form_id, $form_state); - $form_build_id = 'form-' . md5(uniqid(mt_rand(), TRUE)); - $form['#build_id'] = $form_build_id; - // Record the filepath of the include file containing the original form, // so the form builder callbacks can be loaded when the form is being // rebuilt on a different path (such as 'system/ajax'). // @see form_get_cache() - // @see drupal_retrieve_form() // menu_get_item() is not available at installation time. if (!defined('MAINTENANCE_MODE')) { $item = menu_get_item(); if (!empty($item['file'])) { - $form['#include_file'] = $item['file']; + $form_state['build_info']['file'] = $item['file']; } } + $form = drupal_retrieve_form($form_id, $form_state); + $form_build_id = 'form-' . md5(uniqid(mt_rand(), TRUE)); + $form['#build_id'] = $form_build_id; + // Fix the form method, if it is 'get' in $form_state, but not in $form. if ($form_state['method'] == 'get' && !isset($form['#method'])) { $form['#method'] = 'get'; @@ -212,7 +211,6 @@ function drupal_build_form($form_id, &$f // complete. We need to construct a fresh copy of the form, passing // in the latest $form_state in addition to any other variables passed // into drupal_get_form(). - if ((!empty($form_state['storage']) || $form_state['rebuild']) && $form_state['submitted'] && !form_get_errors()) { $form = drupal_rebuild_form($form_id, $form_state); } @@ -236,6 +234,7 @@ function form_state_defaults() { return array( 'rebuild' => FALSE, 'redirect' => NULL, + 'build_info' => array(), 'storage' => NULL, 'submitted' => FALSE, 'programmed' => FALSE, @@ -259,9 +258,6 @@ function form_state_defaults() { * $form_state['clicked_button']['#array_parents'] will help you to find which * part. * - * When getting a form from the cache, the $form_id must be shifted off from - * $form['#args'], so the resulting array can be given to $form_state['args']. - * * @param $form_id * The unique string identifying the desired form. If a function * with that name exists, it is called to build the form array. @@ -317,19 +313,19 @@ function drupal_rebuild_form($form_id, & function form_get_cache($form_build_id, &$form_state) { if ($cached = cache_get('form_' . $form_build_id, 'cache_form')) { $form = $cached->data; - // If the original form is contained in an optional include file, load the - // file and re-populate $form_state for subsequent rebuilds. - // @see drupal_build_form() - // @see drupal_retrieve_form() - if (!empty($form['#include_file']) && file_exists($form['#include_file'])) { - require_once DRUPAL_ROOT . '/' . $form['#include_file']; - $form_state['include_file'] = $form['#include_file']; - } global $user; if ((isset($form['#cache_token']) && drupal_valid_token($form['#cache_token'])) || (!isset($form['#cache_token']) && !$user->uid)) { if ($cached = cache_get('storage_' . $form_build_id, 'cache_form')) { - $form_state['storage'] = $cached->data; + // Re-populate $form_state for subsequent rebuilds. + $form_state['build_info'] = $cached->data['build_info']; + $form_state['storage'] = $cached->data['storage']; + + // If the original form is contained in an include file, load the file. + // @see drupal_build_form() + if (!empty($form_state['build_info']['file']) && file_exists($form_state['build_info']['file'])) { + require_once DRUPAL_ROOT . '/' . $form_state['build_info']['file']; + } } return $form; } @@ -347,8 +343,11 @@ function form_set_cache($form_build_id, $form['#cache_token'] = drupal_get_token(); } cache_set('form_' . $form_build_id, $form, 'cache_form', REQUEST_TIME + $expire); - if (!empty($form_state['storage'])) { - cache_set('storage_' . $form_build_id, $form_state['storage'], 'cache_form', REQUEST_TIME + $expire); + if (!empty($form_state['build_info']) || !empty($form_state['storage'])) { + cache_set('storage_' . $form_build_id, array( + 'build_info' => $form_state['build_info'], + 'storage' => $form_state['storage'], + ), 'cache_form', REQUEST_TIME + $expire); } } @@ -397,11 +396,11 @@ function form_set_cache($form_build_id, * @endcode */ function drupal_form_submit($form_id, &$form_state) { - if (!isset($form_state['args'])) { + if (!isset($form_state['build_info']['args'])) { $args = func_get_args(); array_shift($args); array_shift($args); - $form_state['args'] = $args; + $form_state['build_info']['args'] = $args; } $form = drupal_retrieve_form($form_id, $form_state); @@ -441,7 +440,7 @@ function drupal_retrieve_form($form_id, // We save two copies of the incoming arguments: one for modules to use // when mapping form ids to constructor functions, and another to pass to // the constructor function itself. - $args = $form_state['args']; + $args = $form_state['build_info']['args']; // We first check to see if there's a function named after the $form_id. // If there is, we simply pass the arguments on to it to get the form. @@ -489,15 +488,6 @@ function drupal_retrieve_form($form_id, // Otherwise, call the function named after the form id. $form = call_user_func_array(isset($callback) ? $callback : $form_id, $args); $form['#form_id'] = $form_id; - $form['#args'] = $form_state['args']; - - // Whenever this form is (re)built, restore the include file property from - // $form_state, if existent. - // @see drupal_build_form() - // @see form_get_cache() - if (!empty($form_state['include_file'])) { - $form['#include_file'] = $form_state['include_file']; - } return $form; } Index: modules/color/color.module =================================================================== RCS file: /cvs/drupal/drupal/modules/color/color.module,v retrieving revision 1.72 diff -u -p -r1.72 color.module --- modules/color/color.module 18 Sep 2009 00:12:45 -0000 1.72 +++ modules/color/color.module 18 Sep 2009 16:19:58 -0000 @@ -31,7 +31,7 @@ function color_theme() { * Implement hook_form_FORM_ID_alter(). */ function color_form_system_theme_settings_alter(&$form, &$form_state) { - if (isset($form_state['args'][0]) && ($theme = $form_state['args'][0]) && color_get_info($theme) && function_exists('gd_info')) { + if (isset($form_state['build_info']['args'][0]) && ($theme = $form_state['build_info']['args'][0]) && color_get_info($theme) && function_exists('gd_info')) { $form['color'] = array( '#type' => 'fieldset', '#title' => t('Color scheme'), Index: modules/openid/openid.module =================================================================== RCS file: /cvs/drupal/drupal/modules/openid/openid.module,v retrieving revision 1.59 diff -u -p -r1.59 openid.module --- modules/openid/openid.module 17 Sep 2009 03:16:16 -0000 1.59 +++ modules/openid/openid.module 18 Sep 2009 16:10:05 -0000 @@ -428,7 +428,7 @@ function openid_authentication($response } elseif (variable_get('user_register', 1)) { // Register new user - $form_state['args'] = array(); + $form_state['build_info']['args'] = array(); $form_state['redirect'] = NULL; $form_state['values']['name'] = (empty($response['openid.sreg.nickname'])) ? $identity : $response['openid.sreg.nickname']; $form_state['values']['mail'] = (empty($response['openid.sreg.email'])) ? '' : $response['openid.sreg.email']; Index: modules/openid/openid.pages.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/openid/openid.pages.inc,v retrieving revision 1.21 diff -u -p -r1.21 openid.pages.inc --- modules/openid/openid.pages.inc 18 Sep 2009 00:12:47 -0000 1.21 +++ modules/openid/openid.pages.inc 18 Sep 2009 16:10:06 -0000 @@ -104,12 +104,12 @@ function openid_user_delete_form($form, function openid_user_delete_form_submit($form, &$form_state) { $query = db_delete('authmap') - ->condition('uid', $form_state['args'][0]->uid) - ->condition('aid', $form_state['args'][1]) + ->condition('uid', $form_state['build_info']['args'][0]->uid) + ->condition('aid', $form_state['build_info']['args'][1]) ->condition('module', 'openid') ->execute(); if ($query) { drupal_set_message(t('OpenID deleted.')); } - $form_state['#redirect'] = 'user/' . $form_state['args'][0]->uid . '/openid'; + $form_state['redirect'] = 'user/' . $form_state['build_info']['args'][0]->uid . '/openid'; } Index: modules/simpletest/tests/form_test.module =================================================================== RCS file: /cvs/drupal/drupal/modules/simpletest/tests/form_test.module,v retrieving revision 1.9 diff -u -p -r1.9 form_test.module --- modules/simpletest/tests/form_test.module 18 Sep 2009 00:12:48 -0000 1.9 +++ modules/simpletest/tests/form_test.module 18 Sep 2009 16:20:47 -0000 @@ -368,7 +368,7 @@ function form_storage_test_form_submit($ */ function form_test_wrapper_callback($form_id) { $form_state = array( - 'args' => array(), + 'build_info' => array('args' => array()), 'wrapper_callback' => 'form_test_wrapper_callback_wrapper', ); return drupal_build_form($form_id, $form_state);