Index: includes/common.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/common.inc,v retrieving revision 1.925 diff -u -r1.925 common.inc --- includes/common.inc 18 Jun 2009 21:19:01 -0000 1.925 +++ includes/common.inc 1 Jul 2009 17:47:45 -0000 @@ -2779,15 +2779,6 @@ 'scope' => 'header', 'weight' => JS_LIBRARY, ), - 'misc/jquery.js' => array( - 'data' => 'misc/jquery.js', - 'type' => 'file', - 'scope' => 'header', - 'weight' => JS_LIBRARY - 2, - 'cache' => TRUE, - 'defer' => FALSE, - 'preprocess' => TRUE, - ), 'misc/drupal.js' => array( 'data' => 'misc/drupal.js', 'type' => 'file', @@ -2798,6 +2789,8 @@ 'preprocess' => TRUE, ), ); + // jQuery itself is registered as a library. + drupal_add_library('system', 'jquery'); } switch ($options['type']) { @@ -2954,6 +2947,128 @@ } /** + * Adds multiple JavaScript or CSS files at the same time. + * + * A library defines a set of JavaScript and/or CSS files, optionally using + * settings, and optionally requiring another library. For example, a library + * can be a jQuery plugin, a JavaScript framework, or a CSS framework. This + * function allows modules to load a library defined/shipped by itself or a + * depending module; without having to add all files of the library separately. + * Each library is only loaded once. + * + * @param $module + * The name of the module that registered the library. + * @param $name + * The name of the library to add. + * @return + * TRUE when the library was successfully added or FALSE if the library or one + * of its dependencies could not be added. + * + * @see drupal_get_library() + * @see hook_library() + * @see hook_library_alter() + */ +function drupal_add_library($module, $name) { + $added = &drupal_static(__FUNCTION__, array()); + + $library = drupal_get_library($module, $name); + if (!$library) { + watchdog('system', 'Missing JavaScript/CSS library %library (%module module).', array('%library' => $name, '%module' => $module), WATCHDOG_WARNING); + return FALSE; + } + + if (!isset($added[$module][$name])) { + // drupal_get_library() statically caches libraries already, so we simply + // store a marker here. + $added[$module][$name] = TRUE; + + // Add dependent libraries (first), JavaScript, and stylesheets. + foreach (array('dependencies', 'js', 'css') as $type) { + if (isset($library[$type]) && is_array($library[$type])) { + foreach ($library[$type] as $data => $options) { + if (!is_array($options)) { + continue; + } + // Dependencies recursively invoke drupal_add_library(). $options form + // the arguments for drupal_add_library(). + if ($type == 'dependencies') { + if (isset($options[0], $options[1])) { + // Directly invoke drupal_add_library() to test its return value. + if (drupal_add_library($options[0], $options[1]) === FALSE) { + // If any dependent library could not be added, this library + // will break; stop here. + return FALSE; + } + } + } + else { + // For JS settings we need to transform $options['data'] into $data. + if (isset($options['type'], $options['data']) && $options['type'] == 'setting') { + $data = $options['data']; + unset($options['data']); + } + // All JavaScript contained within the libraries are given a default + // weight of JS_LIBRARY. + elseif (!isset($options['weight'])) { + $options['weight'] = JS_LIBRARY; + } + call_user_func('drupal_add_' . $type, $data, $options); + } + } + } + } + } + + return TRUE; +} + +/** + * Retrieves information for a JavaScript/CSS library. + * + * Library information is statically cached. Libraries are keyed by module for + * several reasons: + * - Libraries are not unique. Multiple modules might ship with the same library + * in a different version or variant. This registry cannot (and does not + * attempt to) prevent library conflicts. + * - Modules implementing and thereby depending on a library that is registered + * by another module can only rely on that module's library. + * - Two (or more) modules can still register the same library and use it + * without conflicts in case the libraries are loaded on certain pages only. + * + * @param $module + * The name of a module that registered a library. + * @param $library + * The name of a registered library. + * @return + * The definition of the requested library, if existent, or FALSE. + * + * @see drupal_add_library() + * @see hook_library() + * @see hook_library_alter() + */ +function drupal_get_library($module, $name) { + $libraries = &drupal_static(__FUNCTION__, array()); + + if (!isset($libraries[$module][$name])) { + $module_libraries = module_invoke($module, 'library'); + + if (isset($module_libraries[$name]) && is_array($module_libraries[$name])) { + $library = $module_libraries[$name]; + // Allow modules to alter registered libraries; pass function arguments + // to provide context. + drupal_alter('library', $library, $module, $name); + + $libraries[$module][$name] = $library; + } + else { + $libraries[$module][$name] = FALSE; + } + } + + return $libraries[$module][$name]; +} + +/** * Assist in adding the tableDrag JavaScript behavior to a themed table. * * Draggable tables should be used wherever an outline or list of sortable items Index: includes/form.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/form.inc,v retrieving revision 1.344 diff -u -r1.344 form.inc --- includes/form.inc 29 Jun 2009 17:27:58 -0000 1.344 +++ includes/form.inc 1 Jul 2009 17:47:45 -0000 @@ -2002,7 +2002,7 @@ // 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']['callback']) || isset($element['#ahah']['path'])) && isset($element['#ahah']['event']) && !isset($js_added[$element['#id']])) { - drupal_add_js('misc/jquery.form.js', array('weight' => JS_LIBRARY)); + drupal_add_library('system', 'form'); drupal_add_js('misc/ahah.js'); $ahah_binding = array( Index: modules/system/system.api.php =================================================================== RCS file: /cvs/drupal/drupal/modules/system/system.api.php,v retrieving revision 1.45 diff -u -r1.45 system.api.php --- modules/system/system.api.php 27 Jun 2009 10:19:31 -0000 1.45 +++ modules/system/system.api.php 1 Jul 2009 17:47:45 -0000 @@ -183,6 +183,115 @@ } /** + * Registers JavaScript/CSS libraries associated with a module. + * + * Modules implementing this return an array of arrays. The key to each + * sub-array is the machine readable name of the library. Each library may + * contain the following items: + * + * - 'title': The human readable name of the library. + * - 'website': The URL of the library's web site. + * - 'version': A string specifying the version of the library; intentionally + * not a float because a version like "1.2.3" is not a valid float. Use PHP's + * version_compare() to compare versions. + * - 'js': An array of JavaScript elements; each element's key is used as $data + * argument, each element's value is used as $options array for + * drupal_add_js(). To add library-specific (not module-specific) JavaScript + * settings, the key may be skipped, the value must specify + * 'type' => 'setting', and the actual settings must be contained in a 'data' + * element of the value. Note that only custom libraries are aware of Drupal's + * JavaScript settings; usually, settings should be added by adding an + * "add callback". + * - 'css': Like 'js', an array of CSS elements passed to drupal_add_css(). + * - 'dependencies': An array of libraries that are required for a library. Each + * element is an array containing the module and name of the registered + * library. Note that all dependencies for each dependent library will be + * added when this library is added. + * + * Registered information for a library should contain re-usable data only. + * Module- or implementation-specific data and integration logic should be added + * separately. + * + * @return + * An array defining libraries associated with a module. + * + * @see system_library() + * @see drupal_add_library() + * @see drupal_get_library() + */ +function hook_library() { + // Library One. + $libraries['library-1'] = array( + 'title' => 'Library One', + 'website' => 'http://example.com/library-1', + 'version' => '1.2', + 'js' => array( + drupal_get_path('module', 'my_module') . '/library-1.js' => array(), + ), + 'css' => array( + drupal_get_path('module', 'my_module') . '/library-2.css' => array( + 'type' => 'file', + 'media' => 'screen', + ), + ), + ); + // Library Two. + $libraries['library-2'] = array( + 'title' => 'Library Two', + 'website' => 'http://example.com/library-2', + 'version' => '3.1-beta1', + 'js' => array( + // JavaScript settings may use the 'data' key. + array( + 'type' => 'setting', + 'data' => array('library2' => TRUE), + ), + ), + 'dependencies' => array( + // Require jQuery UI core by System module. + array('system' => 'ui'), + // Require our other library. + array('my_module', 'library-1'), + // Require another library. + array('other_module', 'library-3'), + ), + ); + return $libraries; +} + +/** + * Alters the JavaScript/CSS library registry. + * + * Allows certain, contributed modules to update libraries to newer versions + * while ensuring backwards compatibility. In general, such manipulations should + * only be done by designated modules, since most modules that integrate with a + * certain library also depend on the API of a certain library version. + * + * @param $libraries + * The JavaScript/CSS library registry, keyed by module and libray name, and + * passed by reference. + * @param $module + * The name of a module that registered a library. + * @param $library + * The name of a registered library. + * + * @see hook_library() + */ +function hook_library_alter(&$library, $module, $name) { + // Update Farbtastic to version 2.0. + if ($module == 'system' && $name == 'farbtastic') { + // Verify existing version is older than the one we are updating to. + if (version_compare($library['version'], '2.0', '<')) { + // Update the existing Farbtastic to version 2.0. + $library['version'] = '2.0'; + $library['js'] = array( + drupal_get_path('module', 'farbtastic_update') . '/farbtastic-2.0.js' => array(), + ); + } + } +} + +/** * Perform alterations before a page is rendered. * * Use this hook when you want to add, remove, or alter elements at the page Index: modules/system/system.module =================================================================== RCS file: /cvs/drupal/drupal/modules/system/system.module,v retrieving revision 1.718 diff -u -r1.718 system.module --- modules/system/system.module 1 Jul 2009 13:44:53 -0000 1.718 +++ modules/system/system.module 1 Jul 2009 17:47:45 -0000 @@ -789,6 +789,358 @@ } /** + * Implementation of hook_library(). + */ +function system_library() { + // jQuery. + $libraries['jquery'] = array( + 'title' => 'jQuery', + 'website' => 'http://jquery.com', + 'version' => '1.3.2', + 'js' => array( + 'misc/jquery.js' => array('weight' => JS_LIBRARY - 20), + ), + ); + + // jQuery Form Plugin. + $libraries['form'] = array( + 'title' => 'jQuery Form Plugin', + 'website' => 'http://malsup.com/jquery/form/', + 'version' => '2.16', + 'js' => array( + 'misc/jquery.form.js' => array(), + ), + ); + + // Farbtastic. + $libraries['farbtastic'] = array( + 'title' => 'Farbtastic', + 'website' => 'http://code.google.com/p/farbtastic/', + 'version' => '1.2', + 'js' => array( + 'misc/farbtastic/farbtastic.js' => array(), + ), + 'css' => array( + 'misc/farbtastic/farbtastic.css' => array('preprocess' => FALSE), + ), + ); + + // Cookie. + $libraries['cookie'] = array( + 'title' => 'Cookie', + 'website' => 'http://plugins.jquery.com/project/cookie', + 'version' => '1.0', + 'js' => array( + 'misc/jquery.cookie.js' => array(), + ), + ); + + // jQuery UI. + $libraries['ui'] = array( + 'title' => 'jQuery UI: Core', + 'website' => 'http://jqueryui.com', + 'version' => '1.7.2', + 'js' => array( + 'misc/ui/ui.core.js' => array('weight' => JS_LIBRARY - 10), + ), + 'css' => array( + 'misc/ui/ui.core.css' => array(), + 'misc/ui/ui.theme.css' => array(), + ), + ); + $libraries['ui.accordion'] = array( + 'title' => 'jQuery UI: Accordion', + 'website' => 'http://jqueryui.com/demos/accordion/', + 'version' => '1.7.2', + 'js' => array( + 'misc/ui/ui.accordion.js' => array(), + ), + 'css' => array( + 'misc/ui/ui.accordion.css' => array(), + ), + 'dependencies' => array( + array('system', 'ui'), + ), + ); + $libraries['ui.datepicker'] = array( + 'title' => 'jQuery UI: Date Picker', + 'website' => 'http://jqueryui.com/demos/datepicker/', + 'version' => '1.7.2', + 'js' => array( + 'misc/ui/ui.datepicker.js' => array(), + ), + 'css' => array( + 'misc/ui/ui.datepicker.css' => array(), + ), + 'dependencies' => array( + array('system', 'ui'), + ), + ); + $libraries['ui.dialog'] = array( + 'title' => 'jQuery UI: Dialog', + 'website' => 'http://jqueryui.com/demos/dialog/', + 'version' => '1.7.2', + 'js' => array( + 'misc/ui/ui.dialog.js' => array(), + ), + 'css' => array( + 'misc/ui/ui.dialog.css' => array(), + ), + 'dependencies' => array( + array('system', 'ui'), + ), + ); + $libraries['ui.draggable'] = array( + 'title' => 'jQuery UI: Dialog', + 'website' => 'http://jqueryui.com/demos/draggable/', + 'version' => '1.7.2', + 'js' => array( + 'misc/ui/ui.draggable.js' => array(), + ), + 'dependencies' => array( + array('system', 'ui'), + ), + ); + $libraries['ui.droppable'] = array( + 'title' => 'jQuery UI: Droppable', + 'website' => 'http://jqueryui.com/demos/droppable/', + 'version' => '1.7.2', + 'js' => array( + 'misc/ui/ui.droppable.js' => array(), + ), + 'dependencies' => array( + array('system', 'ui'), + ), + ); + $libraries['ui.progressbar'] = array( + 'title' => 'jQuery UI: Progress Bar', + 'website' => 'http://jqueryui.com/demos/progressbar/', + 'version' => '1.7.2', + 'js' => array( + 'misc/ui/ui.progressbar.js' => array(), + ), + 'css' => array( + 'misc/ui/ui.progressbar.css' => array(), + ), + 'dependencies' => array( + array('system', 'ui'), + ), + ); + $libraries['ui.resizable'] = array( + 'title' => 'jQuery UI: Resizable', + 'website' => 'http://jqueryui.com/demos/resizable/', + 'version' => '1.7.2', + 'js' => array( + 'misc/ui/ui.resizable.js' => array(), + ), + 'css' => array( + 'misc/ui/ui.resizable.css' => array(), + ), + 'dependencies' => array( + array('system', 'ui'), + ), + ); + $libraries['ui.selectable'] = array( + 'title' => 'jQuery UI: Selectable', + 'website' => 'http://jqueryui.com/demos/selectable/', + 'version' => '1.7.2', + 'js' => array( + 'misc/ui/ui.selectable.js' => array(), + ), + 'css' => array( + 'misc/ui/ui.selectable.css' => array(), + ), + 'dependencies' => array( + array('system', 'ui'), + ), + ); + $libraries['ui.slider'] = array( + 'title' => 'jQuery UI: Slider', + 'website' => 'http://jqueryui.com/demos/slider/', + 'version' => '1.7.2', + 'js' => array( + 'misc/ui/ui.slider.js' => array(), + ), + 'css' => array( + 'misc/ui/ui.slider.css' => array(), + ), + 'dependencies' => array( + array('system', 'ui'), + ), + ); + $libraries['ui.sortable'] = array( + 'title' => 'jQuery UI: Sortable', + 'website' => 'http://jqueryui.com/demos/sortable/', + 'version' => '1.7.2', + 'js' => array( + 'misc/ui/ui.sortable.js' => array(), + ), + 'dependencies' => array( + array('system', 'ui'), + ), + ); + $libraries['ui.tabs'] = array( + 'title' => 'jQuery UI: Tabs', + 'website' => 'http://jqueryui.com/demos/tabs/', + 'version' => '1.7.2', + 'js' => array( + 'misc/ui/ui.tabs.js' => array(), + ), + 'css' => array( + 'misc/ui/ui.tabs.css' => array(), + ), + 'dependencies' => array( + array('system', 'ui'), + ), + ); + $libraries['effects'] = array( + 'title' => 'jQuery UI: Effects', + 'website' => 'http://jqueryui.com/demos/effect/', + 'version' => '1.7.2', + 'js' => array( + 'misc/ui/effects.core.js' => array('weight' => JS_LIBRARY - 9), + ), + 'dependencies' => array( + array('system', 'ui'), + ), + ); + $libraries['effects.blind'] = array( + 'title' => 'jQuery UI: Effects Blind', + 'website' => 'http://jqueryui.com/demos/effect/', + 'version' => '1.7.2', + 'js' => array( + 'misc/ui/effects.blind.js' => array(), + ), + 'dependencies' => array( + array('system', 'effects'), + ), + ); + $libraries['effects.bounce'] = array( + 'title' => 'jQuery UI: Effects Bounce', + 'website' => 'http://jqueryui.com/demos/effect/', + 'version' => '1.7.2', + 'js' => array( + 'misc/ui/effects.bounce.js' => array(), + ), + 'dependencies' => array( + array('system', 'effects'), + ), + ); + $libraries['effects.clip'] = array( + 'title' => 'jQuery UI: Effects Clip', + 'website' => 'http://jqueryui.com/demos/effect/', + 'version' => '1.7.2', + 'js' => array( + 'misc/ui/effects.clip.js' => array(), + ), + 'dependencies' => array( + array('system', 'effects'), + ), + ); + $libraries['effects.drop'] = array( + 'title' => 'jQuery UI: Effects Drop', + 'website' => 'http://jqueryui.com/demos/effect/', + 'version' => '1.7.2', + 'js' => array( + 'misc/ui/effects.drop.js' => array(), + ), + 'dependencies' => array( + array('system', 'effects'), + ), + ); + $libraries['effects.explode'] = array( + 'title' => 'jQuery UI: Effects Explode', + 'website' => 'http://jqueryui.com/demos/effect/', + 'version' => '1.7.2', + 'js' => array( + 'misc/ui/effects.explode.js' => array(), + ), + 'dependencies' => array( + array('system', 'effects'), + ), + ); + $libraries['effects.fold'] = array( + 'title' => 'jQuery UI: Effects Fold', + 'website' => 'http://jqueryui.com/demos/effect/', + 'version' => '1.7.2', + 'js' => array( + 'misc/ui/effects.fold.js' => array(), + ), + 'dependencies' => array( + array('system', 'effects'), + ), + ); + $libraries['effects.highlight'] = array( + 'title' => 'jQuery UI: Effects Fold', + 'website' => 'http://jqueryui.com/demos/effect/', + 'version' => '1.7.2', + 'js' => array( + 'misc/ui/effects.highlight.js' => array(), + ), + 'dependencies' => array( + array('system', 'effects'), + ), + ); + $libraries['effects.pulsate'] = array( + 'title' => 'jQuery UI: Effects Pulsate', + 'website' => 'http://jqueryui.com/demos/effect/', + 'version' => '1.7.2', + 'js' => array( + 'misc/ui/effects.pulsate.js' => array(), + ), + 'dependencies' => array( + array('system', 'effects'), + ), + ); + $libraries['effects.scale'] = array( + 'title' => 'jQuery UI: Effects Pulsate', + 'website' => 'http://jqueryui.com/demos/effect/', + 'version' => '1.7.2', + 'js' => array( + 'misc/ui/effects.scale.js' => array(), + ), + 'dependencies' => array( + array('system', 'effects'), + ), + ); + $libraries['effects.shake'] = array( + 'title' => 'jQuery UI: Effects Shake', + 'website' => 'http://jqueryui.com/demos/effect/', + 'version' => '1.7.2', + 'js' => array( + 'misc/ui/effects.scale.js' => array(), + ), + 'dependencies' => array( + array('system', 'effects'), + ), + ); + $libraries['effects.slide'] = array( + 'title' => 'jQuery UI: Effects Slide', + 'website' => 'http://jqueryui.com/demos/effect/', + 'version' => '1.7.2', + 'js' => array( + 'misc/ui/effects.slide.js' => array(), + ), + 'dependencies' => array( + array('system', 'effects'), + ), + ); + $libraries['effects.transfer'] = array( + 'title' => 'jQuery UI: Effects Transfer', + 'website' => 'http://jqueryui.com/demos/effect/', + 'version' => '1.7.2', + 'js' => array( + 'misc/ui/effects.transfer.js' => array(), + ), + 'dependencies' => array( + array('system', 'effects'), + ), + ); + + return $libraries; +} + +/** * Retrieve a blocked IP address from the database. * * @param $iid integer Index: modules/simpletest/tests/common.test =================================================================== RCS file: /cvs/drupal/drupal/modules/simpletest/tests/common.test,v retrieving revision 1.47 diff -u -r1.47 common.test --- modules/simpletest/tests/common.test 30 Jun 2009 09:39:19 -0000 1.47 +++ modules/simpletest/tests/common.test 1 Jul 2009 17:47:45 -0000 @@ -425,7 +425,7 @@ /** * Store configured value for JavaScript preprocessing. */ - var $preprocess_js = NULL; + protected $preprocess_js = NULL; public static function getInfo() { return array( @@ -437,14 +437,15 @@ function setUp() { // Enable Locale and SimpleTest in the test environment. - parent::setUp('locale', 'simpletest'); + parent::setUp('locale', 'simpletest', 'common_test'); // Disable preprocessing $this->preprocess_js = variable_get('preprocess_js', 0); variable_set('preprocess_js', 0); - // Reset drupal_add_js() before each test. + // Reset drupal_add_js() and drupal_add_library() statics before each test. drupal_static_reset('drupal_add_js'); + drupal_static_reset('drupal_add_library'); } function tearDown() { @@ -552,7 +553,7 @@ * Test rendering the JavaScript with a file's weight above jQuery's. */ function testRenderDifferentWeight() { - drupal_add_js('misc/collapse.js', array('weight' => JS_LIBRARY - 10)); + drupal_add_js('misc/collapse.js', array('weight' => JS_LIBRARY - 21)); $javascript = drupal_get_js(); $this->assertTrue(strpos($javascript, 'misc/collapse.js') < strpos($javascript, 'misc/jquery.js'), t('Rendering a JavaScript file above jQuery.')); } @@ -573,6 +574,44 @@ $javascript = drupal_get_js(); $this->assertTrue(strpos($javascript, 'simpletest.js') < strpos($javascript, 'misc/tableselect.js'), t('Altering JavaScript weight through the alter hook.')); } + + /** + * Adds a library to the page and tests for both its JavaScript and its CSS. + */ + function testLibraryRender() { + $result = drupal_add_library('system', 'farbtastic'); + $this->assertTrue($result !== FALSE, t('Library was added without errors.')); + $scripts = drupal_get_js(); + $styles = drupal_get_css(); + $this->assertTrue(strpos($scripts, 'misc/farbtastic/farbtastic.js'), t('JavaScript of library was added to the page.')); + $this->assertTrue(strpos($styles, 'misc/farbtastic/farbtastic.css'), t('Stylesheet of library was added to the page.')); + } + + /** + * Adds a JavaScript library to the page and alters it. + * + * @see common_test_library_alter() + */ + function testLibraryAlter() { + // Verify that common_test altered the title of Farbtastic. + $library = drupal_get_library('system', 'farbtastic'); + $this->assertEqual($library['title'], 'Farbtastic: Altered Library', t('Registered libraries were altered.')); + + // common_test_library_alter() also added a dependency on jQuery Form. + drupal_add_library('system', 'farbtastic'); + $scripts = drupal_get_js(); + $this->assertTrue(strpos($scripts, 'misc/jquery.form.js'), t('Altered library dependencies are added to the page.')); + } + + /** + * Tests that multiple modules can implement the same library. + * + * @see common_test_library() + */ + function testLibraryNameConflicts() { + $farbtastic = drupal_get_library('common_test', 'farbtastic'); + $this->assertEqual($farbtastic['title'], 'Custom Farbtastic Library', t('Alternative libraries can be added to the page.')); + } } /** Index: modules/color/color.module =================================================================== RCS file: /cvs/drupal/drupal/modules/color/color.module,v retrieving revision 1.59 diff -u -r1.59 color.module --- modules/color/color.module 27 May 2009 18:33:55 -0000 1.59 +++ modules/color/color.module 1 Jul 2009 17:47:45 -0000 @@ -169,8 +169,7 @@ $info = color_get_info($theme); // Add Farbtastic color picker. - drupal_add_css('misc/farbtastic/farbtastic.css', array('preprocess' => FALSE)); - drupal_add_js('misc/farbtastic/farbtastic.js', array('weight' => JS_LIBRARY)); + drupal_add_library('system', 'farbtastic'); // Add custom CSS and JS. drupal_add_css($base . '/color.css', array('preprocess' => FALSE)); Index: modules/simpletest/tests/common_test.info =================================================================== RCS file: modules/simpletest/tests/common_test.info diff -N modules/simpletest/tests/common_test.info --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/simpletest/tests/common_test.info 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,8 @@ +; $Id$ +name = "Common Test" +description = "Support module for core Drupal functionality tests." +core = 7.x +package = Testing +files[] = common_test.module +version = VERSION +hidden = TRUE Index: modules/simpletest/tests/common_test.module =================================================================== RCS file: modules/simpletest/tests/common_test.module diff -N modules/simpletest/tests/common_test.module --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/simpletest/tests/common_test.module 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,34 @@ + 'Custom Farbtastic Library', + 'website' => 'http://code.google.com/p/farbtastic/', + 'version' => '5.3', + 'js' => array( + 'misc/farbtastic/farbtastic.js' => array(), + ), + 'css' => array( + 'misc/farbtastic/farbtastic.css' => array(), + ), + ); + return $libraries; +}