diff options
Diffstat (limited to 'includes/common.inc')
-rw-r--r-- | includes/common.inc | 66 |
1 files changed, 52 insertions, 14 deletions
diff --git a/includes/common.inc b/includes/common.inc index 43e211813..f3c936e95 100644 --- a/includes/common.inc +++ b/includes/common.inc @@ -532,8 +532,8 @@ function drupal_get_destination() { * Parses a system URL string into an associative array suitable for url(). * * This function should only be used for URLs that have been generated by the - * system, resp. url(). It should not be used for URLs that come from external - * sources, or URLs that link to external resources. + * system, such as via url(). It should not be used for URLs that come from + * external sources, or URLs that link to external resources. * * The returned array contains a 'path' that may be passed separately to url(). * For example: @@ -1734,7 +1734,8 @@ function format_plural($count, $singular, $plural, array $args = array(), array // Get the plural index through the gettext formula. $index = (function_exists('locale_get_plural')) ? locale_get_plural($count, isset($options['langcode']) ? $options['langcode'] : NULL) : -1; - // Backwards compatibility. + // If the index cannot be computed, use the plural as a fallback (which + // allows for most flexiblity with the replaceable @count value). if ($index < 0) { return t($plural, $args, $options); } @@ -2821,7 +2822,7 @@ function drupal_add_html_head_link($attributes, $header = FALSE) { * - 'group': A number identifying the group in which to add the stylesheet. * Available constants are: * - CSS_SYSTEM: Any system-layer CSS. - * - CSS_DEFAULT: Any module-layer CSS. + * - CSS_DEFAULT: (default) Any module-layer CSS. * - CSS_THEME: Any theme-layer CSS. * The group number serves as a weight: the markup for loading a stylesheet * within a lower weight group is output to the page before the markup for @@ -2969,6 +2970,18 @@ function drupal_get_css($css = NULL, $skip_alter = FALSE) { // Sort CSS items, so that they appear in the correct order. uasort($css, 'drupal_sort_css_js'); + // Provide the page with information about the individual CSS files used, + // information not otherwise available when CSS aggregation is enabled. The + // setting is attached later in this function, but is set here, so that CSS + // files removed below are still considered "used" and prevented from being + // added in a later AJAX request. + // Skip if no files were added to the page or jQuery.extend() will overwrite + // the Drupal.settings.ajaxPageState.css object with an empty array. + if (!empty($css)) { + // Cast the array to an object to be on the safe side even if not empty. + $setting['ajaxPageState']['css'] = (object) array_fill_keys(array_keys($css), 1); + } + // Remove the overridden CSS files. Later CSS files override former ones. $previous_item = array(); foreach ($css as $key => $item) { @@ -2989,10 +3002,9 @@ function drupal_get_css($css = NULL, $skip_alter = FALSE) { '#items' => $css, ); - // Provide the page with information about the individual CSS files used, - // information not otherwise available when CSS aggregation is enabled. - $setting['ajaxPageState']['css'] = array_fill_keys(array_keys($css), 1); - $styles['#attached']['js'][] = array('type' => 'setting', 'data' => $setting); + if (!empty($setting)) { + $styles['#attached']['js'][] = array('type' => 'setting', 'data' => $setting); + } return drupal_render($styles); } @@ -3443,7 +3455,13 @@ function drupal_build_css_cache($css) { $data = ''; $uri = ''; $map = variable_get('drupal_css_cache_files', array()); - $key = hash('sha256', serialize($css)); + // Create a new array so that only the file names are used to create the hash. + // This prevents new aggregates from being created unnecessarily. + $css_data = array(); + foreach ($css as $css_file) { + $css_data[] = $css_file['data']; + } + $key = hash('sha256', serialize($css_data)); if (isset($map[$key])) { $uri = $map[$key]; } @@ -4804,7 +4822,13 @@ function drupal_build_js_cache($files) { $contents = ''; $uri = ''; $map = variable_get('drupal_js_cache_files', array()); - $key = hash('sha256', serialize($files)); + // Create a new array so that only the file names are used to create the hash. + // This prevents new aggregates from being created unnecessarily. + $js_data = array(); + foreach ($files as $file) { + $js_data[] = $file['data']; + } + $key = hash('sha256', serialize($js_data)); if (isset($map[$key])) { $uri = $map[$key]; } @@ -5219,8 +5243,6 @@ function drupal_cron_cleanup() { function drupal_system_listing($mask, $directory, $key = 'name', $min_depth = 1) { $config = conf_path(); - $profile = drupal_get_profile(); - $searchdir = array($directory); $files = array(); @@ -5228,8 +5250,24 @@ function drupal_system_listing($mask, $directory, $key = 'name', $min_depth = 1) // themes as organized by a distribution. It is pristine in the same way // that /modules is pristine for core; users should avoid changing anything // there in favor of sites/all or sites/<domain> directories. - if (file_exists("profiles/$profile/$directory")) { - $searchdir[] = "profiles/$profile/$directory"; + $profiles = array(); + $profile = drupal_get_profile(); + // For SimpleTest to be able to test modules packaged together with a + // distribution we need to include the profile of the parent site (in which + // test runs are triggered). + if (drupal_valid_test_ua()) { + $testing_profile = variable_get('simpletest_parent_profile', FALSE); + if ($testing_profile && $testing_profile != $profile) { + $profiles[] = $testing_profile; + } + } + // In case both profile directories contain the same extension, the actual + // profile always has precedence. + $profiles[] = $profile; + foreach ($profiles as $profile) { + if (file_exists("profiles/$profile/$directory")) { + $searchdir[] = "profiles/$profile/$directory"; + } } // Always search sites/all/* as well as the global directories. |