? .DS_Store ? drupal_add_js.patch ? tmp.patch ? includes/.DS_Store ? includes/tests ? misc/.DS_Store ? modules/.DS_Store ? modules/simpletest/simpletest_js_select_all.patch ? modules/system/.DS_Store ? modules/user/.DS_Store ? modules/user/user.admin.js ? sites/.DS_Store ? sites/all/.DS_Store ? sites/all/modules ? sites/default/files ? sites/default/settings.php Index: install.php =================================================================== RCS file: /cvs/drupal/drupal/install.php,v retrieving revision 1.117 diff -u -p -r1.117 install.php --- install.php 14 Apr 2008 17:48:33 -0000 1.117 +++ install.php 26 Apr 2008 16:57:28 -0000 @@ -708,7 +708,7 @@ function install_tasks($profile, $task) // Add JavaScript validation. _user_password_dynamic_validation(); - drupal_add_js(drupal_get_path('module', 'system') . '/system.js', 'module'); + drupal_add_js(drupal_get_path('module', 'system') . '/system.js'); // We add these strings as settings because JavaScript translation does not // work on install time. drupal_add_js(array('copyFieldValue' => array('edit-site-mail' => array('edit-account-mail')), 'cleanURL' => array('success' => st('Your server has been successfully tested to support this feature.'), 'failure' => st('Your system configuration does not currently support this feature. The handbook page on Clean URLs has additional troubleshooting information.'), 'testing' => st('Testing clean URLs...'))), 'setting'); Index: includes/batch.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/batch.inc,v retrieving revision 1.15 diff -u -p -r1.15 batch.inc --- includes/batch.inc 14 Apr 2008 17:48:33 -0000 1.15 +++ includes/batch.inc 26 Apr 2008 16:57:28 -0000 @@ -73,7 +73,7 @@ function _batch_progress_page_js() { // and the initialization and error messages. $current_set = _batch_current_set(); drupal_set_title($current_set['title']); - drupal_add_js('misc/progress.js', 'core', 'header', FALSE, FALSE); + drupal_add_js('misc/progress.js', array('#defer' => TRUE, '#cache' => FALSE, '#weight' => -20)); $url = url($batch['url'], array('query' => array('id' => $batch['id']))); $js_setting = array( @@ -84,7 +84,7 @@ function _batch_progress_page_js() { ), ); drupal_add_js($js_setting, 'setting'); - drupal_add_js('misc/batch.js', 'core', 'header', FALSE, FALSE); + drupal_add_js('misc/progress.js', array('#defer' => FALSE, '#cache' => FALSE, '#weight' => -20)); $output = '
'; return $output; Index: includes/common.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/common.inc,v retrieving revision 1.764 diff -u -p -r1.764 common.inc --- includes/common.inc 14 Apr 2008 17:48:33 -0000 1.764 +++ includes/common.inc 26 Apr 2008 16:57:29 -0000 @@ -1890,7 +1890,7 @@ function drupal_clear_css_cache() { * reference to an existing file or as inline code. The following actions can be * performed using this function: * - * - Add a file ('core', 'module' and 'theme'): + * - Add a file ('file'): * Adds a reference to a JavaScript file to the page. JavaScript files * are placed in a certain order, from 'core' first, to 'module' and finally * 'theme' so that files, that are added later, can override previously added @@ -1907,92 +1907,137 @@ function drupal_clear_css_cache() { * will be accessible at Drupal.settings. * * @param $data - * (optional) If given, the value depends on the $type parameter: - * - 'core', 'module' or 'theme': Path to the file relative to base_path(). + * (optional) If given, the value depends on the $options parameter: + * - 'file': Path to the file relative to base_path(). * - 'inline': The JavaScript code that should be placed in the given scope. * - 'setting': An array with configuration options as associative array. The * array is directly placed in Drupal.settings. You might want to wrap your * actual configuration settings in another variable to prevent the pollution * of the Drupal.settings namespace. - * @param $type - * (optional) The type of JavaScript that should be added to the page. Allowed - * values are 'core', 'module', 'theme', 'inline' and 'setting'. You - * can, however, specify any value. It is treated as a reference to a JavaScript - * file. Defaults to 'module'. - * @param $scope - * (optional) The location in which you want to place the script. Possible - * values are 'header' and 'footer' by default. If your theme implements - * different locations, however, you can also use these. - * @param $defer - * (optional) If set to TRUE, the defer attribute is set on the \n"; + if (isset($data[$scope])) { + $output .= '\n"; + } break; case 'inline': foreach ($data as $info) { - $output .= '\n"; + $output .= '\n"; } break; default: // If JS preprocessing is off, we still need to output the scripts. // Additionally, go through any remaining scripts if JS preprocessing is on and output the non-cached ones. foreach ($data as $path => $info) { - if (!$info['preprocess'] || !$is_writable || !$preprocess_js) { - $no_preprocess[$type] .= '\n"; + if (!$info['#preprocess'] || !$is_writable || !$preprocess_js) { + $output .= '\n"; } else { $files[$path] = $info; @@ -2072,14 +2140,84 @@ function drupal_get_js($scope = 'header' if ($is_writable && $preprocess_js && count($files) > 0) { $filename = md5(serialize($files) . $query_string) . '.js'; $preprocess_file = drupal_build_js_cache($files, $filename); - $preprocessed .= '' . "\n"; + $output .= '' . "\n"; } + return $output; +} - // Keep the order of JS files consistent as some are preprocessed and others are not. - // Make sure any inline or JS setting variables appear last after libraries have loaded. - $output = $preprocessed . implode('', $no_preprocess) . $output; +/** + * Aggregate JS files, putting them in the files directory. + * + * @param $files + * An array of JS files to aggregate and compress into one file. + * @param $filename + * The name of the aggregate JS file. + * @return + * The name of the JS file. + */ +function drupal_build_js_cache($files, $filename) { + $contents = ''; - return $output; + // Create the js/ within the files folder. + $jspath = file_create_path('js'); + file_check_directory($jspath, FILE_CREATE_DIRECTORY); + + if (!file_exists($jspath . '/' . $filename)) { + // Build aggregate JS file. + foreach ($files as $path => $info) { + if ($info['#preprocess']) { + // Append a ';' after each JS file to prevent them from running together. + $contents .= file_get_contents($path) . ';'; + } + } + + // Create the JS file. + file_save_data($contents, $jspath . '/' . $filename, FILE_EXISTS_REPLACE); + } + + return $jspath . '/' . $filename; +} + +/** + * Delete all cached JS files. + */ +function drupal_clear_js_cache() { + file_scan_directory(file_create_path('js'), '.*', array('.', '..', 'CVS'), 'file_delete', TRUE); + variable_set('javascript_parsed', array()); +} + +/** + * Converts a PHP variable into its Javascript equivalent. We use + * HTML-safe strings, i.e. with <, > and & escaped. + * + * @param $var + * The variable to encode + * @return + * A string, which is a JavaScript-encoded version of $var. + * @see drupal_json + */ +function drupal_to_js($var) { + // json_encode() does not escape <, > and &, so we do it with str_replace() + return str_replace(array("<", ">", "&"), array('\x3c', '\x3e', '\x26'), json_encode($var)); +} + +/** + * Return data in JSON format. + * + * This function should be used for JavaScript callback functions returning + * data in JSON format. It sets the header for JavaScript output. + * + * @param $var + * (optional) If set, the variable will be converted to JSON and output. + * @see drupal_to_js + */ +function drupal_json($var = NULL) { + // We are returning JavaScript, so tell the browser. + drupal_set_header('Content-Type: text/javascript; charset=utf-8'); + + if (isset($var)) { + echo drupal_to_js($var); + } } /** @@ -2192,7 +2330,7 @@ function drupal_get_js($scope = 'header' function drupal_add_tabledrag($table_id, $action, $relationship, $group, $subgroup = NULL, $source = NULL, $hidden = TRUE, $limit = 0) { static $js_added = FALSE; if (!$js_added) { - drupal_add_js('misc/tabledrag.js', 'core'); + drupal_add_js('misc/tabledrag.js', array('#weight' => -20)); $js_added = TRUE; } @@ -2211,75 +2349,6 @@ function drupal_add_tabledrag($table_id, } /** - * Aggregate JS files, putting them in the files directory. - * - * @param $files - * An array of JS files to aggregate and compress into one file. - * @param $filename - * The name of the aggregate JS file. - * @return - * The name of the JS file. - */ -function drupal_build_js_cache($files, $filename) { - $contents = ''; - - // Create the js/ within the files folder. - $jspath = file_create_path('js'); - file_check_directory($jspath, FILE_CREATE_DIRECTORY); - - if (!file_exists($jspath . '/' . $filename)) { - // Build aggregate JS file. - foreach ($files as $path => $info) { - if ($info['preprocess']) { - // Append a ';' after each JS file to prevent them from running together. - $contents .= file_get_contents($path) . ';'; - } - } - - // Create the JS file. - file_save_data($contents, $jspath . '/' . $filename, FILE_EXISTS_REPLACE); - } - - return $jspath . '/' . $filename; -} - -/** - * Delete all cached JS files. - */ -function drupal_clear_js_cache() { - file_scan_directory(file_create_path('js'), '.*', array('.', '..', 'CVS'), 'file_delete', TRUE); - variable_set('javascript_parsed', array()); -} - -/** - * Converts a PHP variable into its Javascript equivalent. - * - * We use HTML-safe strings, i.e. with <, > and & escaped. - */ -function drupal_to_js($var) { - // json_encode() does not escape <, > and &, so we do it with str_replace() - return str_replace(array("<", ">", "&"), array('\x3c', '\x3e', '\x26'), json_encode($var)); -} - -/** - * Return data in JSON format. - * - * This function should be used for JavaScript callback functions returning - * data in JSON format. It sets the header for JavaScript output. - * - * @param $var - * (optional) If set, the variable will be converted to JSON and output. - */ -function drupal_json($var = NULL) { - // We are returning JavaScript, so tell the browser. - drupal_set_header('Content-Type: text/javascript; charset=utf-8'); - - if (isset($var)) { - echo drupal_to_js($var); - } -} - -/** * Wrapper around urlencode() which avoids Apache quirks. * * Should be used when placing arbitrary data in an URL. Note that Drupal paths Index: includes/form.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/form.inc,v retrieving revision 1.270 diff -u -p -r1.270 form.inc --- includes/form.inc 14 Apr 2008 17:51:38 -0000 1.270 +++ includes/form.inc 26 Apr 2008 16:57:29 -0000 @@ -1486,7 +1486,7 @@ function form_get_options($element, $key */ function theme_fieldset($element) { if ($element['#collapsible']) { - drupal_add_js('misc/collapse.js'); + drupal_add_js('misc/collapse.js', array('#weight' => -20)); if (!isset($element['#attributes']['class'])) { $element['#attributes']['class'] = ''; @@ -1784,8 +1784,8 @@ function form_expand_ahah($element) { // Adding the same javascript settings twice will cause a recursion error, // we avoid the problem by checking if the javascript has already been added. if (isset($element['#ahah']['path']) && isset($element['#ahah']['event']) && !isset($js_added[$element['#id']])) { - drupal_add_js('misc/jquery.form.js'); - drupal_add_js('misc/ahah.js'); + drupal_add_js('misc/jquery.form.js', array('#weight' => -20)); + drupal_add_js('misc/ahah.js', array('#weight' => -20)); $ahah_binding = array( 'url' => url($element['#ahah']['path']), @@ -1810,7 +1810,7 @@ function form_expand_ahah($element) { // Add progress.js if we're doing a bar display. if ($ahah_binding['progress']['type'] == 'bar') { - drupal_add_js('misc/progress.js'); + drupal_add_js('misc/progress.js', array('#weight' => -20)); } drupal_add_js(array('ahah' => array($element['#id'] => $ahah_binding)), 'setting'); @@ -1998,7 +1998,7 @@ function theme_textfield($element) { $output = ''; if ($element['#autocomplete_path']) { - drupal_add_js('misc/autocomplete.js'); + drupal_add_js('misc/autocomplete.js', array('#weight' => -20)); $class[] = 'form-autocomplete'; $extra = ''; } @@ -2050,16 +2050,14 @@ function theme_textarea($element) { // Add teaser behavior (must come before resizable) if (!empty($element['#teaser'])) { - drupal_add_js('misc/teaser.js'); - // Note: arrays are merged in drupal_get_js(). - drupal_add_js(array('teaserCheckbox' => array($element['#id'] => $element['#teaser_checkbox'])), 'setting'); - drupal_add_js(array('teaser' => array($element['#id'] => $element['#teaser'])), 'setting'); + drupal_add_js('misc/teaser.js', array('#weight' => -20)); + drupal_add_js(array('teaserCheckbox' => array($element['#id'] => $element['#teaser_checkbox']), 'teaser' => array($element['#id'] => $element['#teaser'])), 'setting'); $class[] = 'teaser'; } // Add resizable behavior if ($element['#resizable'] !== FALSE) { - drupal_add_js('misc/textarea.js'); + drupal_add_js('misc/textarea.js', array('#weight' => -20)); $class[] = 'resizable'; } Index: includes/theme.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/theme.inc,v retrieving revision 1.420 diff -u -p -r1.420 theme.inc --- includes/theme.inc 14 Apr 2008 17:48:33 -0000 1.420 +++ includes/theme.inc 26 Apr 2008 16:57:29 -0000 @@ -145,7 +145,7 @@ function _init_theme($theme, $base_theme // Add scripts used by this theme. foreach ($final_scripts as $script) { - drupal_add_js($script, 'theme'); + drupal_add_js($script, array('#weight' => 20)); } $theme_engine = NULL; @@ -1239,7 +1239,7 @@ function theme_table($header, $rows, $at // Add sticky headers, if applicable. if (count($header)) { - drupal_add_js('misc/tableheader.js'); + drupal_add_js('misc/tableheader.js', array('#weight' => -20)); // Add 'sticky-enabled' class to the table to identify it for JS. // This is needed to target tables constructed by this function. $attributes['class'] = empty($attributes['class']) ? 'sticky-enabled' : ($attributes['class'] . ' sticky-enabled'); @@ -1321,7 +1321,7 @@ function theme_table($header, $rows, $at * Returns a header cell for tables that have a select all functionality. */ function theme_table_select_header_cell() { - drupal_add_js('misc/tableselect.js'); + drupal_add_js('misc/tableselect.js', array('#weight' => -20)); return array('class' => 'select-all'); } Index: modules/block/block-admin-display-form.tpl.php =================================================================== RCS file: /cvs/drupal/drupal/modules/block/block-admin-display-form.tpl.php,v retrieving revision 1.5 diff -u -p -r1.5 block-admin-display-form.tpl.php --- modules/block/block-admin-display-form.tpl.php 16 Apr 2008 11:35:51 -0000 1.5 +++ modules/block/block-admin-display-form.tpl.php 26 Apr 2008 16:57:29 -0000 @@ -26,7 +26,7 @@ ?> -20)); drupal_add_js(drupal_get_path('module', 'block') . '/block.js'); foreach ($block_regions as $region => $title) { drupal_add_tabledrag('blocks', 'match', 'sibling', 'block-region-select', 'block-region-' . $region, NULL, FALSE); Index: modules/color/color.module =================================================================== RCS file: /cvs/drupal/drupal/modules/color/color.module,v retrieving revision 1.40 diff -u -p -r1.40 color.module --- modules/color/color.module 14 Apr 2008 17:48:36 -0000 1.40 +++ modules/color/color.module 26 Apr 2008 16:57:29 -0000 @@ -153,14 +153,12 @@ function color_scheme_form(&$form_state, // Add Farbtastic color picker drupal_add_css('misc/farbtastic/farbtastic.css', 'module', 'all', FALSE); - drupal_add_js('misc/farbtastic/farbtastic.js'); + drupal_add_js('misc/farbtastic/farbtastic.js', array('#weight' => -20)); // Add custom CSS/JS drupal_add_css($base . '/color.css', 'module', 'all', FALSE); drupal_add_js($base . '/color.js'); - drupal_add_js(array('color' => array( - 'reference' => color_get_palette($theme, true) - )), 'setting'); + drupal_add_js(array('color' => array('reference' => color_get_palette($theme, TRUE))), 'setting'); // See if we're using a predefined scheme $current = implode(',', variable_get('color_' . $theme . '_palette', array())); Index: modules/locale/locale.module =================================================================== RCS file: /cvs/drupal/drupal/modules/locale/locale.module,v retrieving revision 1.217 diff -u -p -r1.217 locale.module --- modules/locale/locale.module 23 Apr 2008 20:01:52 -0000 1.217 +++ modules/locale/locale.module 26 Apr 2008 16:57:29 -0000 @@ -507,24 +507,18 @@ function locale_update_js_files() { // The first three parameters are NULL in order to get an array with all // scopes. This is necessary to prevent recreation of JS translation files // when new files are added for example in the footer. - $javascript = drupal_add_js(NULL, NULL, NULL); + $javascript = drupal_add_js(); $files = $new_files = FALSE; - foreach ($javascript as $scope) { - foreach ($scope as $type => $data) { - if ($type != 'setting' && $type != 'inline') { - foreach ($data as $filepath => $info) { - $files = TRUE; - if (!in_array($filepath, $parsed)) { - // Don't parse our own translations files. - if (substr($filepath, 0, strlen($dir)) != $dir) { - locale_inc_callback('_locale_parse_js_file', $filepath); - watchdog('locale', 'Parsed JavaScript file %file.', array('%file' => $filepath)); - $parsed[] = $filepath; - $new_files = TRUE; - } - } - } + foreach ($javascript['files'] as $filepath => $info) { + $files = TRUE; + if (!in_array($filepath, $parsed)) { + // Don't parse our own translations files. + if (substr($filepath, 0, strlen($dir)) != $dir) { + locale_inc_callback('_locale_parse_js_file', $filepath); + watchdog('locale', 'Parsed JavaScript file %file.', array('%file' => $filepath)); + $parsed[] = $filepath; + $new_files = TRUE; } } } Index: modules/node/node.admin.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/node/node.admin.inc,v retrieving revision 1.22 diff -u -p -r1.22 node.admin.inc --- modules/node/node.admin.inc 14 Apr 2008 17:48:38 -0000 1.22 +++ modules/node/node.admin.inc 26 Apr 2008 16:57:30 -0000 @@ -259,7 +259,7 @@ function node_filter_form() { $form['filters']['buttons']['reset'] = array('#type' => 'submit', '#value' => t('Reset')); } - drupal_add_js('misc/form.js', 'core'); + drupal_add_js('misc/form.js', array('#weight' => -20)); return $form; } Index: modules/simpletest/simpletest.module =================================================================== RCS file: /cvs/drupal/drupal/modules/simpletest/simpletest.module,v retrieving revision 1.1 diff -u -p -r1.1 simpletest.module --- modules/simpletest/simpletest.module 20 Apr 2008 18:23:29 -0000 1.1 +++ modules/simpletest/simpletest.module 26 Apr 2008 16:57:30 -0000 @@ -69,7 +69,7 @@ function simpletest_load() { drupal_set_message(t('It is strongly suggested to run the tests with the first user!')); } $path = drupal_get_path('module', 'simpletest') .'/'; - foreach (array('simpletest.php', 'unit_tester.php', 'reporter.php', 'drupal_reporter.php', 'drupal_web_test_case.php', 'drupal_test_suite.php') as $file) { + foreach (array('simpletest.php', 'unit_tester.php', 'reporter.php', 'drupal_reporter.php', 'drupal_web_test_case.php', 'drupal_unit_test_case.php', 'drupal_test_suite.php') as $file) { require_once($path . $file); } } @@ -81,7 +81,7 @@ function simpletest_load() { function simpletest_entrypoint() { simpletest_load(); drupal_add_css(drupal_get_path('module', 'simpletest') .'/simpletest.css', 'module'); - drupal_add_js(drupal_get_path('module', 'simpletest') .'/simpletest.js', 'module'); + drupal_add_js(drupal_get_path('module', 'simpletest') .'/simpletest.js'); $output = drupal_get_form('simpletest_overview_form'); if (simpletest_running_output()) { Index: modules/system/system.test =================================================================== RCS file: /cvs/drupal/drupal/modules/system/system.test,v retrieving revision 1.1 diff -u -p -r1.1 system.test --- modules/system/system.test 20 Apr 2008 18:23:31 -0000 1.1 +++ modules/system/system.test 26 Apr 2008 16:57:30 -0000 @@ -126,3 +126,152 @@ class EnableDisableCoreTestCase extends } } } + +class CommonIncTest extends DrupalWebTestCase { + /** + * Implementation of getInfo(). + */ + function getInfo() { + return array( + 'name' => t('Common.inc tests'), + 'description' => t('Tests for common.inc'), + 'group' => t('Core'), + ); + } + + function test_drupal_add_js() { + $original_js = drupal_add_js(); + // Reset the JavaScript. + drupal_add_js(NULL, array('#reset' => TRUE)); + + // Default JavaScript array. + $default_js = array( + 'files' => array( + 'misc/jquery.js' => array( + '#weight' => -1000, + '#scope' => 'header', + '#cache' => TRUE, + '#defer' => FALSE, + '#preprocess' => TRUE, + ), + 'misc/drupal.js' => array( + '#weight' => -999, + '#scope' => 'header', + '#cache' => TRUE, + '#defer' => FALSE, + '#preprocess' => TRUE, + ), + ), + 'setting' => array( + 'header' => array( + 'basePath' => base_path(), + ), + ), + 'inline' => array(), + ); + // Second time - make sure it retains the defaults. + $this->assertEqual(drupal_add_js(), $default_js, t('Test drupal_add_js without parameters.')); + + // Try adding a duplicate file. + drupal_add_js('misc/jquery.js'); + $this->assertEqual(drupal_add_js(), $default_js, t('The duplicate file was only added once.')); + // Try the #reset parameter. + drupal_add_js('misc/'. $this->randomName(8) .'.js'); + drupal_add_js(NULL, array('#reset' => TRUE)); + $this->assertEqual(drupal_add_js(), $default_js, t('#reset actually reset the javascript.')); + + // Test the weight system with files. + $weights = array(1, 10, -10); + $files = array(); + foreach ($weights as $weight) { + $js_file = 'misc/' . $this->randomName(8) . '.js'; + $files[$js_file] = array( + '#weight' => $weight, + '#scope' => 'header', + '#defer' => FALSE, + '#cache' => TRUE, + '#preprocess' => TRUE, + '#delete' => FALSE, + '#data' => $js_file, + ); + } + $weight = 1; + foreach ($files as $file) { + drupal_add_js($file['#data'], array('#weight' => $file['#weight'])); + } + uasort($files, "element_sort"); + + // Make a copy of the default JS. + $new_js = $default_js; + $new_js['files'] += $files; + $this->assertEqual(drupal_add_js(), $new_js, t('The weights system works with files.')); + + // Test deleting with $options['#delete'] = TRUE. + $file = array_shift($files); + $new_js = $default_js; + $new_js['files'] += $files; + drupal_add_js($file['#data'], array('#delete' => TRUE)); + $this->assertEqual(drupal_add_js(), $new_js, t('The JavaScript was deleted from the array with #delete => TRUE.')); + + // Test deleting with $type = 'delete'. + $file = array_shift($files); + $new_js = $default_js; + $new_js['files'] += $files; + drupal_add_js($file['#data'], 'delete'); + $this->assertEqual(drupal_add_js(), $new_js, t('The JavaScript was deleted from the array with $type = \'delete\'.')); + + // Test resetting. Although I can't triger the if (empty($javascript)), I can trigger the $options['#reset']. + drupal_add_js(NULL, array('#reset' => TRUE)); + $this->assertEqual(drupal_add_js(), $default_js, t('The JavaScript was reset.')); + + drupal_add_js($new_js, array('#reset' => TRUE)); + $this->assertEqual(drupal_add_js(), $new_js, t('The JavaScript was reset to an array.')); + + // Test deleting without adding first. + drupal_add_js($this->randomName(), array('#delete' => TRUE)); + $this->assertEqual(drupal_add_js(), $new_js, t('A file that has not been added, but deleted, doesn\'t show up.')); + + // Test settings. + $settings = array(); + $settings[$this->randomName()] = $this->randomName(); + $settings[$this->randomName()] = array($this->randomName(), $this->randomName()); + $settings[$this->randomName()] = array('test' => $this->randomName(), 'test2' => $this->randomName()); + $new_js['setting']['header'] += $settings; + drupal_add_js($settings, 'setting'); + $this->assertEqual(drupal_add_js(), $new_js, t('The settings were added.')); + drupal_add_js($settings, 'setting'); + $this->assertEqual(drupal_add_js(), $new_js, t('Duplicate settings had no effect.')); + + // Test adding settings with #type => 'setting'. + $settings = array(); + $settings[$this->randomName()] = $this->randomName(); + $settings[$this->randomName()] = array($this->randomName(), $this->randomName()); + $settings[$this->randomName()] = array('test' => $this->randomName(), 'test2' => $this->randomName()); + $new_js['setting']['header'] += $settings; + drupal_add_js($settings, array('#type' => 'setting')); + $this->assertEqual(drupal_add_js(), $new_js, t('Added settings with #type => \'setting\'.')); + + // Test inline. + drupal_add_js("$(function() { $('#test').hide(); });", 'inline'); + $new_js['inline']["$(function() { $('#test').hide(); });"] = array( + '#weight' => 0, + '#scope' => 'header', + '#defer' => FALSE, + '#cache' => TRUE, + '#preprocess' => TRUE, + '#delete' => FALSE, + '#data' => "$(function() { $('#test').hide(); });", + ); + $this->assertEqual(drupal_add_js(), $new_js, t('Added inline JavaScript.')); + + // Test caching. + $file = $this->randomName(); + drupal_add_js($file, array('#cache' => FALSE)); + $new_js = drupal_add_js(); + $this->assertFalse($new_js['files'][$file]['#cache'], t('The setting to turn caching off went through.')); + $this->assertFalse($new_js['files'][$file]['#preprocess'], t('The setting to turn caching off, in turn turning preprocess off, went through.')); + + // Reset the JavaScript. + drupal_add_js($original_js, array('#reset' => TRUE)); + } +} Index: modules/user/user.admin.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/user/user.admin.inc,v retrieving revision 1.21 diff -u -p -r1.21 user.admin.inc --- modules/user/user.admin.inc 14 Apr 2008 17:48:43 -0000 1.21 +++ modules/user/user.admin.inc 26 Apr 2008 16:57:30 -0000 @@ -83,7 +83,7 @@ function user_filter_form() { ); } - drupal_add_js('misc/form.js', 'core'); + drupal_add_js('misc/form.js', array('#weight' => -20)); return $form; }