Merge remote-tracking branch 'core/8.x' into 8.x-file-config
						commit
						a8313cf422
					
				| 
						 | 
				
			
			@ -2504,7 +2504,8 @@ function drupal_valid_test_ua() {
 | 
			
		|||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return FALSE;
 | 
			
		||||
  $test_prefix = FALSE;
 | 
			
		||||
  return $test_prefix;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			@ -2709,6 +2710,41 @@ function language_list($only_enabled = FALSE) {
 | 
			
		|||
  return $only_enabled ? $languages['enabled'] : $languages['all'];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Loads a language object from the database.
 | 
			
		||||
 *
 | 
			
		||||
 * @param $langcode
 | 
			
		||||
 *   The language code.
 | 
			
		||||
 *
 | 
			
		||||
 * @return
 | 
			
		||||
 *   A fully-populated language object or FALSE.
 | 
			
		||||
 */
 | 
			
		||||
function language_load($langcode) {
 | 
			
		||||
  $languages = language_list();
 | 
			
		||||
  return isset($languages[$langcode]) ? $languages[$langcode] : FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Produced the printed name for a language for display.
 | 
			
		||||
 *
 | 
			
		||||
 * @param $langcode
 | 
			
		||||
 *   The language code.
 | 
			
		||||
 *
 | 
			
		||||
 * @return
 | 
			
		||||
 *   The printed name of the language.
 | 
			
		||||
 */
 | 
			
		||||
function language_name($langcode) {
 | 
			
		||||
  if ($langcode == LANGUAGE_NONE) {
 | 
			
		||||
    return t('None');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ($language = language_load($langcode)) {
 | 
			
		||||
    return $language->name;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return t('Unknown (@langcode)', array('@langcode' => $langcode));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Returns the default language used on the site.
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -2716,16 +2752,13 @@ function language_list($only_enabled = FALSE) {
 | 
			
		|||
 *   A language object.
 | 
			
		||||
 */
 | 
			
		||||
function language_default() {
 | 
			
		||||
  $default = variable_get(
 | 
			
		||||
    'language_default',
 | 
			
		||||
    (object) array(
 | 
			
		||||
  $default = variable_get('language_default', (object) array(
 | 
			
		||||
    'langcode' => 'en',
 | 
			
		||||
    'name' => 'English',
 | 
			
		||||
    'direction' => 0,
 | 
			
		||||
    'enabled' => 1,
 | 
			
		||||
    'weight' => 0,
 | 
			
		||||
    )
 | 
			
		||||
  );
 | 
			
		||||
  ));
 | 
			
		||||
  $default->default = TRUE;
 | 
			
		||||
  return $default;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5344,10 +5344,25 @@ function drupal_system_listing($mask, $directory, $key = 'name', $min_depth = 1)
 | 
			
		|||
  // themes as provided by a distribution. It is pristine in the same way that
 | 
			
		||||
  // the 'core/modules' directory is pristine for core; users should avoid
 | 
			
		||||
  // any modification by using the sites/all or sites/<domain> directories.
 | 
			
		||||
  $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.
 | 
			
		||||
  $searchdir[] = 'sites/all/' . $directory;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -213,11 +213,6 @@ function install_begin_request(&$install_state) {
 | 
			
		|||
  // Add any installation parameters passed in via the URL.
 | 
			
		||||
  $install_state['parameters'] += $_GET;
 | 
			
		||||
 | 
			
		||||
  // @todo: remove this testbot compatibility layer once the testbot is fixed.
 | 
			
		||||
  if (isset($_GET['locale'])) {
 | 
			
		||||
    $install_state['parameters']['langcode'] = $_GET['locale'];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Validate certain core settings that are used throughout the installation.
 | 
			
		||||
  if (!empty($install_state['parameters']['profile'])) {
 | 
			
		||||
    $install_state['parameters']['profile'] = preg_replace('/[^a-zA-Z_0-9]/', '', $install_state['parameters']['profile']);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,33 +9,33 @@
 | 
			
		|||
 * The language is determined using a URL language indicator:
 | 
			
		||||
 * path prefix or domain according to the configuration.
 | 
			
		||||
 */
 | 
			
		||||
const LOCALE_LANGUAGE_NEGOTIATION_URL = 'locale-url';
 | 
			
		||||
const LANGUAGE_NEGOTIATION_URL = 'locale-url';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The language is set based on the browser language settings.
 | 
			
		||||
 */
 | 
			
		||||
const LOCALE_LANGUAGE_NEGOTIATION_BROWSER = 'locale-browser';
 | 
			
		||||
const LANGUAGE_NEGOTIATION_BROWSER = 'locale-browser';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The language is determined using the current interface language.
 | 
			
		||||
 */
 | 
			
		||||
const LOCALE_LANGUAGE_NEGOTIATION_INTERFACE = 'locale-interface';
 | 
			
		||||
const LANGUAGE_NEGOTIATION_INTERFACE = 'locale-interface';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * If no URL language is available language is determined using an already
 | 
			
		||||
 * detected one.
 | 
			
		||||
 */
 | 
			
		||||
const LOCALE_LANGUAGE_NEGOTIATION_URL_FALLBACK = 'locale-url-fallback';
 | 
			
		||||
const LANGUAGE_NEGOTIATION_URL_FALLBACK = 'locale-url-fallback';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The language is set based on the user language settings.
 | 
			
		||||
 */
 | 
			
		||||
const LOCALE_LANGUAGE_NEGOTIATION_USER = 'locale-user';
 | 
			
		||||
const LANGUAGE_NEGOTIATION_USER = 'locale-user';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The language is set based on the request/session parameters.
 | 
			
		||||
 */
 | 
			
		||||
const LOCALE_LANGUAGE_NEGOTIATION_SESSION = 'locale-session';
 | 
			
		||||
const LANGUAGE_NEGOTIATION_SESSION = 'locale-session';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Regular expression pattern used to localize JavaScript strings.
 | 
			
		||||
| 
						 | 
				
			
			@ -88,13 +88,13 @@ const LOCALE_IMPORT_KEEP = 1;
 | 
			
		|||
 * URL language negotiation: use the path prefix as URL language
 | 
			
		||||
 * indicator.
 | 
			
		||||
 */
 | 
			
		||||
const LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX = 0;
 | 
			
		||||
const LANGUAGE_NEGOTIATION_URL_PREFIX = 0;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * URL language negotiation: use the domain as URL language
 | 
			
		||||
 * indicator.
 | 
			
		||||
 */
 | 
			
		||||
const LOCALE_LANGUAGE_NEGOTIATION_URL_DOMAIN = 1;
 | 
			
		||||
const LANGUAGE_NEGOTIATION_URL_DOMAIN = 1;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @defgroup locale-languages-negotiation Language negotiation options
 | 
			
		||||
| 
						 | 
				
			
			@ -264,12 +264,12 @@ function locale_language_from_session($languages) {
 | 
			
		|||
function locale_language_from_url($languages) {
 | 
			
		||||
  $language_url = FALSE;
 | 
			
		||||
 | 
			
		||||
  if (!language_negotiation_get_any(LOCALE_LANGUAGE_NEGOTIATION_URL)) {
 | 
			
		||||
  if (!language_negotiation_get_any(LANGUAGE_NEGOTIATION_URL)) {
 | 
			
		||||
    return $language_url;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  switch (variable_get('locale_language_negotiation_url_part', LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX)) {
 | 
			
		||||
    case LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX:
 | 
			
		||||
  switch (variable_get('locale_language_negotiation_url_part', LANGUAGE_NEGOTIATION_URL_PREFIX)) {
 | 
			
		||||
    case LANGUAGE_NEGOTIATION_URL_PREFIX:
 | 
			
		||||
      // $_GET['q'] might not be available at this time, because
 | 
			
		||||
      // path initialization runs after the language bootstrap phase.
 | 
			
		||||
      list($language, $_GET['q']) = language_url_split_prefix(isset($_GET['q']) ? $_GET['q'] : NULL, $languages);
 | 
			
		||||
| 
						 | 
				
			
			@ -278,7 +278,7 @@ function locale_language_from_url($languages) {
 | 
			
		|||
      }
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case LOCALE_LANGUAGE_NEGOTIATION_URL_DOMAIN:
 | 
			
		||||
    case LANGUAGE_NEGOTIATION_URL_DOMAIN:
 | 
			
		||||
      $domains = locale_language_negotiation_url_domains();
 | 
			
		||||
      foreach ($languages as $language) {
 | 
			
		||||
        // Skip check if the language doesn't have a domain.
 | 
			
		||||
| 
						 | 
				
			
			@ -333,7 +333,7 @@ function locale_language_from_url($languages) {
 | 
			
		|||
 */
 | 
			
		||||
function locale_language_url_fallback($language = NULL, $language_type = LANGUAGE_TYPE_INTERFACE) {
 | 
			
		||||
  $default = language_default();
 | 
			
		||||
  $prefix = (variable_get('locale_language_negotiation_url_part', LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX) == LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX);
 | 
			
		||||
  $prefix = (variable_get('locale_language_negotiation_url_part', LANGUAGE_NEGOTIATION_URL_PREFIX) == LANGUAGE_NEGOTIATION_URL_PREFIX);
 | 
			
		||||
 | 
			
		||||
  // If the default language is not configured to convey language information,
 | 
			
		||||
  // a missing URL language information indicates that URL language should be
 | 
			
		||||
| 
						 | 
				
			
			@ -433,17 +433,27 @@ function locale_language_url_rewrite_url(&$path, &$options) {
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  if (isset($options['language'])) {
 | 
			
		||||
    switch (variable_get('locale_language_negotiation_url_part', LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX)) {
 | 
			
		||||
      case LOCALE_LANGUAGE_NEGOTIATION_URL_DOMAIN:
 | 
			
		||||
    switch (variable_get('locale_language_negotiation_url_part', LANGUAGE_NEGOTIATION_URL_PREFIX)) {
 | 
			
		||||
      case LANGUAGE_NEGOTIATION_URL_DOMAIN:
 | 
			
		||||
        $domains = locale_language_negotiation_url_domains();
 | 
			
		||||
        if (!empty($domains[$options['language']->langcode])) {
 | 
			
		||||
          // Ask for an absolute URL with our modified base_url.
 | 
			
		||||
          global $is_https;
 | 
			
		||||
          $url_scheme = ($is_https) ? 'https://' : 'http://';
 | 
			
		||||
          $options['absolute'] = TRUE;
 | 
			
		||||
          $options['base_url'] = $domains[$options['language']->langcode];
 | 
			
		||||
          $options['base_url'] = $url_scheme . $domains[$options['language']->langcode];
 | 
			
		||||
          if (isset($options['https']) && variable_get('https', FALSE)) {
 | 
			
		||||
            if ($options['https'] === TRUE) {
 | 
			
		||||
              $options['base_url'] = str_replace('http://', 'https://', $options['base_url']);
 | 
			
		||||
            }
 | 
			
		||||
            elseif ($options['https'] === FALSE) {
 | 
			
		||||
              $options['base_url'] = str_replace('https://', 'http://', $options['base_url']);
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
      case LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX:
 | 
			
		||||
      case LANGUAGE_NEGOTIATION_URL_PREFIX:
 | 
			
		||||
        $prefixes = locale_language_negotiation_url_prefixes();
 | 
			
		||||
        if (!empty($prefixes[$options['language']->langcode])) {
 | 
			
		||||
          $options['prefix'] = $prefixes[$options['language']->langcode] . '/';
 | 
			
		||||
| 
						 | 
				
			
			@ -496,7 +506,7 @@ function locale_language_url_rewrite_session(&$path, &$options) {
 | 
			
		|||
      $languages = language_list(TRUE);
 | 
			
		||||
      $query_param = check_plain(variable_get('locale_language_negotiation_session_param', 'language'));
 | 
			
		||||
      $query_value = isset($_GET[$query_param]) ? check_plain($_GET[$query_param]) : NULL;
 | 
			
		||||
      $query_rewrite = isset($languages[$query_value]) && language_negotiation_get_any(LOCALE_LANGUAGE_NEGOTIATION_SESSION);
 | 
			
		||||
      $query_rewrite = isset($languages[$query_value]) && language_negotiation_get_any(LANGUAGE_NEGOTIATION_SESSION);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      $query_rewrite = FALSE;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2123,7 +2123,7 @@ function menu_contextual_links($module, $parent_path, $args) {
 | 
			
		|||
  $links = array();
 | 
			
		||||
  // Performance: In case a previous invocation for the same parent path did not
 | 
			
		||||
  // return any links, we immediately return here.
 | 
			
		||||
  if (isset($path_empty[$parent_path])) {
 | 
			
		||||
  if (isset($path_empty[$parent_path]) && strpos($parent_path, '%') !== FALSE) {
 | 
			
		||||
    return $links;
 | 
			
		||||
  }
 | 
			
		||||
  // Construct the item-specific parent path.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -178,6 +178,30 @@ function system_list($type) {
 | 
			
		|||
          $lists['filepaths'][] = array('type' => $record->type, 'name' => $record->name, 'filepath' => $record->filename);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      foreach ($lists['theme'] as $key => $theme) {
 | 
			
		||||
        if (!empty($theme->info['base theme'])) {
 | 
			
		||||
          // Make a list of the theme's base themes.
 | 
			
		||||
          $lists['theme'][$key]->base_themes = drupal_find_base_themes($lists['theme'], $key);
 | 
			
		||||
          // Don't proceed if there was a problem with the root base theme.
 | 
			
		||||
          if (!current($lists['theme'][$key]->base_themes)) {
 | 
			
		||||
            continue;
 | 
			
		||||
          }
 | 
			
		||||
          // Determine the root base theme.
 | 
			
		||||
          $base_key = key($lists['theme'][$key]->base_themes);
 | 
			
		||||
          // Add to the list of sub-themes for each of the theme's base themes.
 | 
			
		||||
          foreach (array_keys($lists['theme'][$key]->base_themes) as $base_theme) {
 | 
			
		||||
            $lists['theme'][$base_theme]->sub_themes[$key] = $lists['theme'][$key]->info['name'];
 | 
			
		||||
          }
 | 
			
		||||
          // Add the base theme's theme engine info.
 | 
			
		||||
          $lists['theme'][$key]->info['engine'] = $lists['theme'][$base_key]->info['engine'];
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
          // A plain theme is its own base theme.
 | 
			
		||||
          $base_key = $key;
 | 
			
		||||
        }
 | 
			
		||||
        // Set the theme engine prefix.
 | 
			
		||||
        $lists['theme'][$key]->prefix = ($lists['theme'][$key]->info['engine'] == 'theme') ? $base_key : $lists['theme'][$key]->info['engine'];
 | 
			
		||||
      }
 | 
			
		||||
      cache('bootstrap')->set('system_list', $lists);
 | 
			
		||||
    }
 | 
			
		||||
    // To avoid a separate database lookup for the filepath, prime the
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -630,7 +630,13 @@ function theme_pager_link($variables) {
 | 
			
		|||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return l($text, $_GET['q'], array('attributes' => $attributes, 'query' => $query));
 | 
			
		||||
  // @todo l() cannot be used here, since it adds an 'active' class based on the
 | 
			
		||||
  //   path only (which is always the current path for pager links). Apparently,
 | 
			
		||||
  //   none of the pager links is active at any time - but it should still be
 | 
			
		||||
  //   possible to use l() here.
 | 
			
		||||
  // @see http://drupal.org/node/1410574
 | 
			
		||||
  $attributes['href'] = url($_GET['q'], array('query' => $query));
 | 
			
		||||
  return '<a' . drupal_attributes($attributes) . '>' . check_plain($text) . '</a>';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -431,22 +431,28 @@ function path_load($conditions) {
 | 
			
		|||
 *   - langcode: (optional) The language code of the alias.
 | 
			
		||||
 */
 | 
			
		||||
function path_save(&$path) {
 | 
			
		||||
  $path += array('pid' => NULL, 'langcode' => LANGUAGE_NONE);
 | 
			
		||||
  $path += array('langcode' => LANGUAGE_NONE);
 | 
			
		||||
 | 
			
		||||
  // Insert or update the alias.
 | 
			
		||||
  $status = drupal_write_record('url_alias', $path, (!empty($path['pid']) ? 'pid' : array()));
 | 
			
		||||
  // Load the stored alias, if any.
 | 
			
		||||
  if (!empty($path['pid']) && !isset($path['original'])) {
 | 
			
		||||
    $path['original'] = path_load($path['pid']);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Verify that a record was written.
 | 
			
		||||
  if ($status) {
 | 
			
		||||
    if ($status === SAVED_NEW) {
 | 
			
		||||
  if (empty($path['pid'])) {
 | 
			
		||||
    drupal_write_record('url_alias', $path);
 | 
			
		||||
    module_invoke_all('path_insert', $path);
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    drupal_write_record('url_alias', $path, array('pid'));
 | 
			
		||||
    module_invoke_all('path_update', $path);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Clear internal properties.
 | 
			
		||||
  unset($path['original']);
 | 
			
		||||
 | 
			
		||||
  // Clear the static alias cache.
 | 
			
		||||
  drupal_clear_path_cache($path['source']);
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Delete a URL alias.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -723,7 +723,7 @@ function _theme_build_registry($theme, $base_theme, $theme_engine) {
 | 
			
		|||
 *   names of the themes and the values are objects having the following
 | 
			
		||||
 *   properties:
 | 
			
		||||
 *   - 'filename': The name of the .info file.
 | 
			
		||||
 *   - 'name': The name of the theme.
 | 
			
		||||
 *   - 'name': The machine name of the theme.
 | 
			
		||||
 *   - 'status': 1 for enabled, 0 for disabled themes.
 | 
			
		||||
 *   - 'info': The contents of the .info file.
 | 
			
		||||
 *   - 'stylesheets': A two dimensional array, using the first key for the
 | 
			
		||||
| 
						 | 
				
			
			@ -733,7 +733,10 @@ function _theme_build_registry($theme, $base_theme, $theme_engine) {
 | 
			
		|||
 *   - 'scripts': An associative array of JavaScripts, using the filename as key
 | 
			
		||||
 *     and the complete filepath as value.
 | 
			
		||||
 *   - 'engine': The name of the theme engine.
 | 
			
		||||
 *   - 'base theme': The name of the base theme.
 | 
			
		||||
 *   - 'base_theme': The name of the base theme.
 | 
			
		||||
 *   - 'base_themes': An ordered array of all the base themes. If the first item
 | 
			
		||||
 *     is NULL, a base theme is missing for this theme.
 | 
			
		||||
 *   - 'sub_themes': An unordered array of sub-themes of this theme.
 | 
			
		||||
 */
 | 
			
		||||
function list_themes($refresh = FALSE) {
 | 
			
		||||
  $list = &drupal_static(__FUNCTION__, array());
 | 
			
		||||
| 
						 | 
				
			
			@ -789,6 +792,47 @@ function list_themes($refresh = FALSE) {
 | 
			
		|||
  return $list;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Find all the base themes for the specified theme.
 | 
			
		||||
 *
 | 
			
		||||
 * Themes can inherit templates and function implementations from earlier themes.
 | 
			
		||||
 *
 | 
			
		||||
 * @param $themes
 | 
			
		||||
 *   An array of available themes.
 | 
			
		||||
 * @param $key
 | 
			
		||||
 *   The name of the theme whose base we are looking for.
 | 
			
		||||
 * @param $used_keys
 | 
			
		||||
 *   A recursion parameter preventing endless loops.
 | 
			
		||||
 * @return
 | 
			
		||||
 *   Returns an array of all of the theme's ancestors; the first element's value
 | 
			
		||||
 *   will be NULL if an error occurred.
 | 
			
		||||
 */
 | 
			
		||||
function drupal_find_base_themes($themes, $key, $used_keys = array()) {
 | 
			
		||||
  $base_key = $themes[$key]->info['base theme'];
 | 
			
		||||
  // Does the base theme exist?
 | 
			
		||||
  if (!isset($themes[$base_key])) {
 | 
			
		||||
    return array($base_key => NULL);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  $current_base_theme = array($base_key => $themes[$base_key]->info['name']);
 | 
			
		||||
 | 
			
		||||
  // Is the base theme itself a child of another theme?
 | 
			
		||||
  if (isset($themes[$base_key]->info['base theme'])) {
 | 
			
		||||
    // Do we already know the base themes of this theme?
 | 
			
		||||
    if (isset($themes[$base_key]->base_themes)) {
 | 
			
		||||
      return $themes[$base_key]->base_themes + $current_base_theme;
 | 
			
		||||
    }
 | 
			
		||||
    // Prevent loops.
 | 
			
		||||
    if (!empty($used_keys[$base_key])) {
 | 
			
		||||
      return array($base_key => NULL);
 | 
			
		||||
    }
 | 
			
		||||
    $used_keys[$base_key] = TRUE;
 | 
			
		||||
    return drupal_find_base_themes($themes, $base_key, $used_keys) + $current_base_theme;
 | 
			
		||||
  }
 | 
			
		||||
  // If we get here, then this is our parent theme.
 | 
			
		||||
  return $current_base_theme;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Generates themed output.
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -101,6 +101,12 @@ function update_prepare_d8_bootstrap() {
 | 
			
		|||
      ),
 | 
			
		||||
    );
 | 
			
		||||
    if ($has_required_schema) {
 | 
			
		||||
      // Bootstrap variables so we can update theme while preparing the update
 | 
			
		||||
      // process.
 | 
			
		||||
      drupal_bootstrap(DRUPAL_BOOTSTRAP_VARIABLES);
 | 
			
		||||
      // Update the dynamic include paths that might be used before running the
 | 
			
		||||
      // proper update functions.
 | 
			
		||||
      update_prepare_stored_includes();
 | 
			
		||||
      // Update the environment for the language bootstrap if needed.
 | 
			
		||||
      update_prepare_d8_language();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -127,6 +133,22 @@ function update_prepare_d8_bootstrap() {
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Fix stored include paths to match the "/core" migration.
 | 
			
		||||
 */
 | 
			
		||||
function update_prepare_stored_includes() {
 | 
			
		||||
  // Update language negotiation settings.
 | 
			
		||||
  foreach (language_types() as $language_type) {
 | 
			
		||||
    $negotiation = variable_get("language_negotiation_$language_type", array());
 | 
			
		||||
    foreach ($negotiation as $id => &$provider) {
 | 
			
		||||
      if (isset($negotiation[$id]['file']) && $negotiation[$id]['file'] == 'includes/locale.inc') {
 | 
			
		||||
        $negotiation[$id]['file'] = 'core/includes/locale.inc';
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    variable_set("language_negotiation_$language_type", $negotiation);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Prepare Drupal 8 language changes for the bootstrap if needed.
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			@ -161,17 +183,6 @@ function update_prepare_d8_language() {
 | 
			
		|||
    db_drop_field('languages', 'domain');
 | 
			
		||||
    db_drop_field('languages', 'native');
 | 
			
		||||
 | 
			
		||||
    // Rename language column to langcode and set it again as the primary key.
 | 
			
		||||
    db_drop_primary_key('languages');
 | 
			
		||||
    $langcode_spec = array(
 | 
			
		||||
      'type' => 'varchar',
 | 
			
		||||
      'length' => 12,
 | 
			
		||||
      'not null' => TRUE,
 | 
			
		||||
      'default' => '',
 | 
			
		||||
      'description' => "Language code, e.g. 'de' or 'en-US'.",
 | 
			
		||||
    );
 | 
			
		||||
    db_change_field('languages', 'language', 'langcode', $langcode_spec, array('primary key' => array('langcode')));
 | 
			
		||||
 | 
			
		||||
    // Rename the languages table to language.
 | 
			
		||||
    db_rename_table('languages', 'language');
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -181,6 +192,10 @@ function update_prepare_d8_language() {
 | 
			
		|||
    $modules = array('language');
 | 
			
		||||
    update_module_add_to_system($modules);
 | 
			
		||||
    update_module_enable($modules);
 | 
			
		||||
 | 
			
		||||
    // Rename 'language' column to 'langcode'.
 | 
			
		||||
    require_once DRUPAL_ROOT . '/core/modules/language/language.install';
 | 
			
		||||
    language_update_8000();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -330,7 +330,7 @@ class Updater {
 | 
			
		|||
          }
 | 
			
		||||
          catch (FileTransferException $e) {
 | 
			
		||||
            $message = t($e->getMessage(), $e->arguments);
 | 
			
		||||
            $throw_message = t('Unable to create %directory due to the following: %reason', array('%directory' => $install_location, '%reason' => $message));
 | 
			
		||||
            $throw_message = t('Unable to create %directory due to the following: %reason', array('%directory' => $directory, '%reason' => $message));
 | 
			
		||||
            throw new UpdaterException($throw_message);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -494,7 +494,7 @@ $(document).bind('state:disabled', function(e) {
 | 
			
		|||
    $(e.target)
 | 
			
		||||
      .attr('disabled', e.value)
 | 
			
		||||
      .filter('.form-element')
 | 
			
		||||
        .closest('.form-item, .form-submit, .form-wrapper')[e.value ? 'addClass' : 'removeClass']('form-disabled');
 | 
			
		||||
        .closest('.form-item, .form-submit, .form-wrapper').toggleClass('form-disabled', e.value);
 | 
			
		||||
 | 
			
		||||
    // Note: WebKit nightlies don't reflect that change correctly.
 | 
			
		||||
    // See https://bugs.webkit.org/show_bug.cgi?id=23789
 | 
			
		||||
| 
						 | 
				
			
			@ -514,7 +514,7 @@ $(document).bind('state:required', function(e) {
 | 
			
		|||
 | 
			
		||||
$(document).bind('state:visible', function(e) {
 | 
			
		||||
  if (e.trigger) {
 | 
			
		||||
    $(e.target).closest('.form-item, .form-submit, .form-wrapper')[e.value ? 'show' : 'hide']();
 | 
			
		||||
    $(e.target).closest('.form-item, .form-submit, .form-wrapper').toggle(e.value);
 | 
			
		||||
  }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -397,12 +397,12 @@ Drupal.tableDrag.prototype.makeDraggable = function (item) {
 | 
			
		|||
          if ($(item).is('.tabledrag-root')) {
 | 
			
		||||
            // Swap with the next group (necessarily a top-level one).
 | 
			
		||||
            var groupHeight = 0;
 | 
			
		||||
            nextGroup = new self.row(nextRow, 'keyboard', self.indentEnabled, self.maxDepth, false);
 | 
			
		||||
            var nextGroup = new self.row(nextRow, 'keyboard', self.indentEnabled, self.maxDepth, false);
 | 
			
		||||
            if (nextGroup) {
 | 
			
		||||
              $(nextGroup.group).each(function () {
 | 
			
		||||
                groupHeight += $(this).is(':hidden') ? 0 : this.offsetHeight;
 | 
			
		||||
              });
 | 
			
		||||
              nextGroupRow = $(nextGroup.group).filter(':last').get(0);
 | 
			
		||||
              var nextGroupRow = $(nextGroup.group).filter(':last').get(0);
 | 
			
		||||
              self.rowObject.swap('after', nextGroupRow);
 | 
			
		||||
              // No need to check for indentation, 0 is the only valid one.
 | 
			
		||||
              window.scrollBy(0, parseInt(groupHeight, 10));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 | 
			
		||||
Drupal.behaviors.tableSelect = {
 | 
			
		||||
  attach: function (context, settings) {
 | 
			
		||||
    $('table:has(th.select-all)', context).once('table-select', Drupal.tableSelect);
 | 
			
		||||
    // Select the inner-most table in case of nested tables.
 | 
			
		||||
    $('th.select-all', context).closest('table').once('table-select', Drupal.tableSelect);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -69,7 +70,7 @@ Drupal.tableSelectRange = function (from, to, state) {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    // Either add or remove the selected class based on the state of the target checkbox.
 | 
			
		||||
    $(i)[ state ? 'addClass' : 'removeClass' ]('selected');
 | 
			
		||||
    $(i).toggleClass('selected', state);
 | 
			
		||||
    $('input:checkbox', i).each(function () {
 | 
			
		||||
      this.checked = state;
 | 
			
		||||
    });
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,15 +25,6 @@
 | 
			
		|||
 * @ingroup themeable
 | 
			
		||||
 */
 | 
			
		||||
?>
 | 
			
		||||
<?php
 | 
			
		||||
  // Add table javascript.
 | 
			
		||||
  drupal_add_js('core/misc/tableheader.js');
 | 
			
		||||
  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);
 | 
			
		||||
    drupal_add_tabledrag('blocks', 'order', 'sibling', 'block-weight', 'block-weight-' . $region);
 | 
			
		||||
  }
 | 
			
		||||
?>
 | 
			
		||||
<table id="blocks" class="sticky-enabled">
 | 
			
		||||
  <thead>
 | 
			
		||||
    <tr>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,7 +20,6 @@ a.block-demo-backlink:link,
 | 
			
		|||
a.block-demo-backlink:visited {
 | 
			
		||||
  background-color: #B4D7F0;
 | 
			
		||||
  -moz-border-radius: 0 0 10px 10px;
 | 
			
		||||
  -webkit-border-radius: 0 0 10px 10px;
 | 
			
		||||
  border-radius: 0 0 10px 10px;
 | 
			
		||||
  color: #000;
 | 
			
		||||
  font-family: "Lucida Grande", Verdana, sans-serif;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -84,13 +84,22 @@ function block_admin_display_prepare_blocks($theme) {
 | 
			
		|||
 * @see block_admin_display_form_submit()
 | 
			
		||||
 */
 | 
			
		||||
function block_admin_display_form($form, &$form_state, $blocks, $theme, $block_regions = NULL) {
 | 
			
		||||
 | 
			
		||||
  $form['#attached']['css'] = array(drupal_get_path('module', 'block') . '/block.admin.css');
 | 
			
		||||
  $path = drupal_get_path('module', 'block');
 | 
			
		||||
  $form['#attached']['css'][] = $path . '/block.admin.css';
 | 
			
		||||
  $form['#attached']['js'][] = 'core/misc/tableheader.js';
 | 
			
		||||
  $form['#attached']['js'][] = $path . '/block.js';
 | 
			
		||||
 | 
			
		||||
  // Get a list of block regions if one was not provided.
 | 
			
		||||
  if (!isset($block_regions)) {
 | 
			
		||||
    $block_regions = system_region_list($theme, REGIONS_VISIBLE);
 | 
			
		||||
  }
 | 
			
		||||
  // Add a last region for disabled blocks.
 | 
			
		||||
  $block_regions_with_disabled = $block_regions + array(BLOCK_REGION_NONE => BLOCK_REGION_NONE);
 | 
			
		||||
 | 
			
		||||
  foreach ($block_regions_with_disabled as $region => $title) {
 | 
			
		||||
    $form['#attached']['drupal_add_tabledrag'][] = array('blocks', 'match', 'sibling', 'block-region-select', 'block-region-' . $region, NULL, FALSE);
 | 
			
		||||
    $form['#attached']['drupal_add_tabledrag'][] = array('blocks', 'order', 'sibling', 'block-weight', 'block-weight-' . $region);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Weights range from -delta to +delta, so delta should be at least half
 | 
			
		||||
  // of the amount of blocks present. This makes sure all blocks in the same
 | 
			
		||||
| 
						 | 
				
			
			@ -104,8 +113,7 @@ function block_admin_display_form($form, &$form_state, $blocks, $theme, $block_r
 | 
			
		|||
  );
 | 
			
		||||
  $form['block_regions'] = array(
 | 
			
		||||
    '#type' => 'value',
 | 
			
		||||
    // Add a last region for disabled blocks.
 | 
			
		||||
    '#value' => $block_regions + array(BLOCK_REGION_NONE => BLOCK_REGION_NONE),
 | 
			
		||||
    '#value' => $block_regions_with_disabled,
 | 
			
		||||
  );
 | 
			
		||||
  $form['blocks'] = array();
 | 
			
		||||
  $form['#tree'] = TRUE;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,10 @@
 | 
			
		|||
 | 
			
		||||
(function ($) {
 | 
			
		||||
 | 
			
		||||
Drupal.behaviors.bookFieldsetSummaries = {
 | 
			
		||||
  attach: function (context) {
 | 
			
		||||
    $('fieldset.book-form', context).drupalSetSummary(function (context) {
 | 
			
		||||
      var val = $('.form-item-book-bid select').val();
 | 
			
		||||
    $('fieldset.book-outline-form', context).drupalSetSummary(function (context) {
 | 
			
		||||
      var $select = $('.form-item-book-bid select');
 | 
			
		||||
      var val = $select.val();
 | 
			
		||||
 | 
			
		||||
      if (val === '0') {
 | 
			
		||||
        return Drupal.t('Not in book');
 | 
			
		||||
| 
						 | 
				
			
			@ -13,7 +13,7 @@ Drupal.behaviors.bookFieldsetSummaries = {
 | 
			
		|||
        return Drupal.t('New book');
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
        return Drupal.checkPlain($('.form-item-book-bid select :selected').text());
 | 
			
		||||
        return Drupal.checkPlain($select.find(':selected').text());
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,8 +9,6 @@ div.contextual-links-wrapper {
 | 
			
		|||
}
 | 
			
		||||
div.contextual-links-wrapper ul.contextual-links {
 | 
			
		||||
  -moz-border-radius: 0 4px 4px 4px;
 | 
			
		||||
  -webkit-border-top-left-radius: 0;
 | 
			
		||||
  -webkit-border-top-right-radius: 4px;
 | 
			
		||||
  border-radius: 0 4px 4px 4px;
 | 
			
		||||
  left: 0;
 | 
			
		||||
  right: auto;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,7 +40,6 @@ a.contextual-links-trigger {
 | 
			
		|||
  width: 28px;
 | 
			
		||||
  overflow: hidden;
 | 
			
		||||
  -moz-border-radius: 4px;
 | 
			
		||||
  -webkit-border-radius: 4px;
 | 
			
		||||
  border-radius: 4px;
 | 
			
		||||
}
 | 
			
		||||
a.contextual-links-trigger:hover,
 | 
			
		||||
| 
						 | 
				
			
			@ -54,8 +53,6 @@ div.contextual-links-active a.contextual-links-trigger {
 | 
			
		|||
  position: relative;
 | 
			
		||||
  z-index: 1;
 | 
			
		||||
  -moz-border-radius: 4px 4px 0 0;
 | 
			
		||||
  -webkit-border-bottom-left-radius: 0;
 | 
			
		||||
  -webkit-border-bottom-right-radius: 0;
 | 
			
		||||
  border-radius: 4px 4px 0 0;
 | 
			
		||||
}
 | 
			
		||||
div.contextual-links-wrapper ul.contextual-links {
 | 
			
		||||
| 
						 | 
				
			
			@ -70,10 +67,6 @@ div.contextual-links-wrapper ul.contextual-links {
 | 
			
		|||
  top: 18px;
 | 
			
		||||
  white-space: nowrap;
 | 
			
		||||
  -moz-border-radius: 4px 0 4px 4px; /* LTR */
 | 
			
		||||
  -webkit-border-bottom-left-radius: 4px;
 | 
			
		||||
  -webkit-border-bottom-right-radius: 4px;
 | 
			
		||||
  -webkit-border-top-right-radius: 0; /* LTR */
 | 
			
		||||
  -webkit-border-top-left-radius: 4px; /* LTR */
 | 
			
		||||
  border-radius: 4px 0 4px 4px; /* LTR */
 | 
			
		||||
}
 | 
			
		||||
.contextual-links-region:hover a.contextual-links-trigger,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,3 +3,4 @@ description = Provides contextual links to perform actions related to elements o
 | 
			
		|||
package = Core
 | 
			
		||||
version = VERSION
 | 
			
		||||
core = 8.x
 | 
			
		||||
files[] = contextual.test
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,47 @@
 | 
			
		|||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * Tests for contextual.module.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tests accessible links after inaccessible links on dynamic context.
 | 
			
		||||
 */
 | 
			
		||||
class ContextualDynamicContextTestCase extends DrupalWebTestCase {
 | 
			
		||||
  protected $profile = 'testing';
 | 
			
		||||
 | 
			
		||||
  public static function getInfo() {
 | 
			
		||||
    return array(
 | 
			
		||||
      'name' => 'Contextual links on node lists',
 | 
			
		||||
      'description' => 'Tests if contextual links are showing on the front page depending on permissions.',
 | 
			
		||||
      'group' => 'Contextual',
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  function setUp() {
 | 
			
		||||
    parent::setUp(array('contextual', 'node'));
 | 
			
		||||
    $this->drupalCreateContentType(array('type' => 'page', 'name' => 'Basic page'));
 | 
			
		||||
    $this->drupalCreateContentType(array('type' => 'article', 'name' => 'Article'));
 | 
			
		||||
    $web_user = $this->drupalCreateUser(array('access content', 'access contextual links', 'edit any article content'));
 | 
			
		||||
    $this->drupalLogin($web_user);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Tests contextual links on node lists with different permissions.
 | 
			
		||||
   */
 | 
			
		||||
  function testNodeLinks() {
 | 
			
		||||
    // Promote nodes to the front page. One article node the user can edit, one
 | 
			
		||||
    // page node he can not edit and another article node he can edit.
 | 
			
		||||
    $node1 = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1));
 | 
			
		||||
    $node2 = $this->drupalCreateNode(array('type' => 'page', 'promote' => 1));
 | 
			
		||||
    $node3 = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1));
 | 
			
		||||
 | 
			
		||||
    // Now, on the front page, all article nodes should have contextual edit
 | 
			
		||||
    // links. The page node in between should not.
 | 
			
		||||
    $this->drupalGet('node');
 | 
			
		||||
    $this->assertRaw('node/' . $node1->nid . '/edit', 'Edit link for oldest article node showing.');
 | 
			
		||||
    $this->assertNoRaw('node/' . $node2->nid . '/edit', 'No edit link for page nodes.');
 | 
			
		||||
    $this->assertRaw('node/' . $node3->nid . '/edit', 'Edit link for most recent article node showing.');
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -34,7 +34,6 @@
 | 
			
		|||
#dashboard .block-placeholder {
 | 
			
		||||
  background: #E2E1DC;
 | 
			
		||||
  -moz-border-radius: 4px;
 | 
			
		||||
  -webkit-border-radius: 4px;
 | 
			
		||||
  border-radius: 4px;
 | 
			
		||||
  float: left; /* LTR */
 | 
			
		||||
  margin: 3px 3px 3px 0; /* LTR */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -377,12 +377,12 @@ function number_field_widget_validate($element, &$form_state) {
 | 
			
		|||
    switch ($type) {
 | 
			
		||||
      case 'float':
 | 
			
		||||
      case 'decimal':
 | 
			
		||||
        $regexp = '@[^-0-9\\' . $field['settings']['decimal_separator'] . ']@';
 | 
			
		||||
        $regexp = '@([^-0-9\\' . $field['settings']['decimal_separator'] . '])|(.-)@';
 | 
			
		||||
        $message = t('Only numbers and the decimal separator (@separator) allowed in %field.', array('%field' => $instance['label'], '@separator' => $field['settings']['decimal_separator']));
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
      case 'integer':
 | 
			
		||||
        $regexp = '@[^-0-9]@';
 | 
			
		||||
        $regexp = '@([^-0-9])|(.-)@';
 | 
			
		||||
        $message = t('Only numbers are allowed in %field.', array('%field' => $instance['label']));
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -92,6 +92,28 @@ class NumberFieldTestCase extends DrupalWebTestCase {
 | 
			
		|||
        t('Correctly failed to save decimal value with more than one decimal point.')
 | 
			
		||||
      );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Try to create entries with minus sign not in the first position.
 | 
			
		||||
    $wrong_entries = array(
 | 
			
		||||
      '3-3',
 | 
			
		||||
      '4-',
 | 
			
		||||
      '1.3-',
 | 
			
		||||
      '1.2-4',
 | 
			
		||||
      '-10-10',
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    foreach ($wrong_entries as $wrong_entry) {
 | 
			
		||||
      $this->drupalGet('test-entity/add/test-bundle');
 | 
			
		||||
      $edit = array(
 | 
			
		||||
        "{$this->field['field_name']}[$langcode][0][value]" => $wrong_entry,
 | 
			
		||||
      );
 | 
			
		||||
      $this->drupalPost(NULL, $edit, t('Save'));
 | 
			
		||||
      $this->assertText(
 | 
			
		||||
        t('Only numbers and the decimal separator (@separator) allowed in ',
 | 
			
		||||
          array('@separator' => $this->field['settings']['decimal_separator'])),
 | 
			
		||||
        'Correctly failed to save decimal value with minus sign in the wrong position.'
 | 
			
		||||
      );
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -310,7 +310,7 @@ function image_file_download($uri) {
 | 
			
		|||
 */
 | 
			
		||||
function image_file_move($file, $source) {
 | 
			
		||||
  // Delete any image derivatives at the original image path.
 | 
			
		||||
  image_path_flush($file->uri);
 | 
			
		||||
  image_path_flush($source->uri);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -73,3 +73,31 @@ function language_schema() {
 | 
			
		|||
  );
 | 
			
		||||
  return $schema;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Rename {language}.language to {language}.langcode.
 | 
			
		||||
 *
 | 
			
		||||
 * @see update_prepare_d8_language()
 | 
			
		||||
 */
 | 
			
		||||
function language_update_8000() {
 | 
			
		||||
  // Rename language column to langcode and set it again as the primary key.
 | 
			
		||||
  if (db_field_exists('language', 'language')) {
 | 
			
		||||
    db_drop_primary_key('language');
 | 
			
		||||
    $langcode_spec = array(
 | 
			
		||||
      'type' => 'varchar',
 | 
			
		||||
      'length' => 12,
 | 
			
		||||
      'not null' => TRUE,
 | 
			
		||||
      'default' => '',
 | 
			
		||||
      'description' => "Language code, e.g. 'de' or 'en-US'.",
 | 
			
		||||
    );
 | 
			
		||||
    db_change_field('language', 'language', 'langcode', $langcode_spec, array('primary key' => array('langcode')));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Update the 'language_default' system variable, if configured.
 | 
			
		||||
  $language_default = variable_get('language_default');
 | 
			
		||||
  if (!empty($language_default) && isset($language_default->language)) {
 | 
			
		||||
    $language_default->langcode = $language_default->language;
 | 
			
		||||
    unset($language_default->language);
 | 
			
		||||
    variable_set('language_default', $language_default);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -100,20 +100,6 @@ function language_theme() {
 | 
			
		|||
  );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Loads a language object from the database.
 | 
			
		||||
 *
 | 
			
		||||
 * @param $langcode
 | 
			
		||||
 *   The language code.
 | 
			
		||||
 *
 | 
			
		||||
 * @return
 | 
			
		||||
 *   A fully-populated language object or FALSE.
 | 
			
		||||
 */
 | 
			
		||||
function language_load($langcode) {
 | 
			
		||||
  $languages = language_list();
 | 
			
		||||
  return isset($languages[$langcode]) ? $languages[$langcode] : FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * API function to add or update a language.
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -223,10 +223,10 @@ function locale_language_providers_url_form($form, &$form_state) {
 | 
			
		|||
    '#title' => t('Part of the URL that determines language'),
 | 
			
		||||
    '#type' => 'radios',
 | 
			
		||||
    '#options' => array(
 | 
			
		||||
      LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX => t('Path prefix'),
 | 
			
		||||
      LOCALE_LANGUAGE_NEGOTIATION_URL_DOMAIN => t('Domain'),
 | 
			
		||||
      LANGUAGE_NEGOTIATION_URL_PREFIX => t('Path prefix'),
 | 
			
		||||
      LANGUAGE_NEGOTIATION_URL_DOMAIN => t('Domain'),
 | 
			
		||||
    ),
 | 
			
		||||
    '#default_value' => variable_get('locale_language_negotiation_url_part', LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX),
 | 
			
		||||
    '#default_value' => variable_get('locale_language_negotiation_url_part', LANGUAGE_NEGOTIATION_URL_PREFIX),
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  $form['prefix'] = array(
 | 
			
		||||
| 
						 | 
				
			
			@ -237,7 +237,7 @@ function locale_language_providers_url_form($form, &$form_state) {
 | 
			
		|||
    '#states' => array(
 | 
			
		||||
      'visible' => array(
 | 
			
		||||
        ':input[name="locale_language_negotiation_url_part"]' => array(
 | 
			
		||||
          'value' => (string) LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX,
 | 
			
		||||
          'value' => (string) LANGUAGE_NEGOTIATION_URL_PREFIX,
 | 
			
		||||
        ),
 | 
			
		||||
      ),
 | 
			
		||||
    ),
 | 
			
		||||
| 
						 | 
				
			
			@ -250,7 +250,7 @@ function locale_language_providers_url_form($form, &$form_state) {
 | 
			
		|||
    '#states' => array(
 | 
			
		||||
      'visible' => array(
 | 
			
		||||
        ':input[name="locale_language_negotiation_url_part"]' => array(
 | 
			
		||||
          'value' => (string) LOCALE_LANGUAGE_NEGOTIATION_URL_DOMAIN,
 | 
			
		||||
          'value' => (string) LANGUAGE_NEGOTIATION_URL_DOMAIN,
 | 
			
		||||
        ),
 | 
			
		||||
      ),
 | 
			
		||||
    ),
 | 
			
		||||
| 
						 | 
				
			
			@ -303,7 +303,7 @@ function locale_language_providers_url_form_validate($form, &$form_state) {
 | 
			
		|||
    $value = $form_state['values']['prefix'][$langcode];
 | 
			
		||||
 | 
			
		||||
    if ($value === '') {
 | 
			
		||||
      if (!$language->default && $form_state['values']['locale_language_negotiation_url_part'] == LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX) {
 | 
			
		||||
      if (!$language->default && $form_state['values']['locale_language_negotiation_url_part'] == LANGUAGE_NEGOTIATION_URL_PREFIX) {
 | 
			
		||||
        // Validation error if the prefix is blank for a non-default language, and value is for selected negotiation type.
 | 
			
		||||
        form_error($form['prefix'][$langcode], t('The prefix may only be left blank for the default language.'));
 | 
			
		||||
      }
 | 
			
		||||
| 
						 | 
				
			
			@ -320,7 +320,7 @@ function locale_language_providers_url_form_validate($form, &$form_state) {
 | 
			
		|||
    $value = $form_state['values']['domain'][$langcode];
 | 
			
		||||
 | 
			
		||||
    if ($value === '') {
 | 
			
		||||
      if (!$language->default && $form_state['values']['locale_language_negotiation_url_part'] == LOCALE_LANGUAGE_NEGOTIATION_URL_DOMAIN) {
 | 
			
		||||
      if (!$language->default && $form_state['values']['locale_language_negotiation_url_part'] == LANGUAGE_NEGOTIATION_URL_DOMAIN) {
 | 
			
		||||
        // Validation error if the domain is blank for a non-default language, and value is for selected negotiation type.
 | 
			
		||||
        form_error($form['domain'][$langcode], t('The domain may only be left blank for the default language.'));
 | 
			
		||||
      }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,14 +17,14 @@ function locale_install() {
 | 
			
		|||
  // We cannot rely on language negotiation hooks here, because locale module is
 | 
			
		||||
  // not enabled yet. Therefore language_negotiation_set() cannot be used.
 | 
			
		||||
  $info = locale_language_negotiation_info();
 | 
			
		||||
  $provider = $info[LOCALE_LANGUAGE_NEGOTIATION_URL];
 | 
			
		||||
  $provider = $info[LANGUAGE_NEGOTIATION_URL];
 | 
			
		||||
  $provider_fields = array('callbacks', 'file', 'cache');
 | 
			
		||||
  $negotiation = array();
 | 
			
		||||
 | 
			
		||||
  // Store only the needed data.
 | 
			
		||||
  foreach ($provider_fields as $field) {
 | 
			
		||||
    if (isset($provider[$field])) {
 | 
			
		||||
      $negotiation[LOCALE_LANGUAGE_NEGOTIATION_URL][$field] = $provider[$field];
 | 
			
		||||
      $negotiation[LANGUAGE_NEGOTIATION_URL][$field] = $provider[$field];
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -297,7 +297,6 @@ function locale_form_alter(&$form, &$form_state, $form_id) {
 | 
			
		|||
function locale_form_node_form_alter(&$form, &$form_state) {
 | 
			
		||||
  if (isset($form['#node']->type) && locale_multilingual_node_type($form['#node']->type)) {
 | 
			
		||||
    $languages = language_list(TRUE);
 | 
			
		||||
    $language_options = array(LANGUAGE_NONE => t('Language neutral'));
 | 
			
		||||
    foreach ($languages as $langcode => $language) {
 | 
			
		||||
      $language_options[$langcode] = $language->name;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -306,6 +305,8 @@ function locale_form_node_form_alter(&$form, &$form_state) {
 | 
			
		|||
      '#title' => t('Language'),
 | 
			
		||||
      '#default_value' => (isset($form['#node']->language) ? $form['#node']->language : ''),
 | 
			
		||||
      '#options' => $language_options,
 | 
			
		||||
      '#empty_value' => LANGUAGE_NONE,
 | 
			
		||||
      '#empty_option' => t('- None -'),
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
  // Node type without language selector: assign the default for new nodes
 | 
			
		||||
| 
						 | 
				
			
			@ -449,10 +450,10 @@ function locale_language_types_info() {
 | 
			
		|||
    LANGUAGE_TYPE_CONTENT => array(
 | 
			
		||||
      'name' => t('Content'),
 | 
			
		||||
      'description' => t('Order of language detection methods for content. If a version of content is available in the detected language, it will be displayed.'),
 | 
			
		||||
      'fixed' => array(LOCALE_LANGUAGE_NEGOTIATION_INTERFACE),
 | 
			
		||||
      'fixed' => array(LANGUAGE_NEGOTIATION_INTERFACE),
 | 
			
		||||
    ),
 | 
			
		||||
    LANGUAGE_TYPE_URL => array(
 | 
			
		||||
      'fixed' => array(LOCALE_LANGUAGE_NEGOTIATION_URL, LOCALE_LANGUAGE_NEGOTIATION_URL_FALLBACK),
 | 
			
		||||
      'fixed' => array(LANGUAGE_NEGOTIATION_URL, LANGUAGE_NEGOTIATION_URL_FALLBACK),
 | 
			
		||||
    ),
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -465,7 +466,7 @@ function locale_language_negotiation_info() {
 | 
			
		|||
  $file = '/core/includes/locale.inc';
 | 
			
		||||
  $providers = array();
 | 
			
		||||
 | 
			
		||||
  $providers[LOCALE_LANGUAGE_NEGOTIATION_URL] = array(
 | 
			
		||||
  $providers[LANGUAGE_NEGOTIATION_URL] = array(
 | 
			
		||||
    'types' => array(LANGUAGE_TYPE_CONTENT, LANGUAGE_TYPE_INTERFACE, LANGUAGE_TYPE_URL),
 | 
			
		||||
    'callbacks' => array(
 | 
			
		||||
      'language' => 'locale_language_from_url',
 | 
			
		||||
| 
						 | 
				
			
			@ -479,7 +480,7 @@ function locale_language_negotiation_info() {
 | 
			
		|||
    'config' => 'admin/config/regional/language/configure/url',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  $providers[LOCALE_LANGUAGE_NEGOTIATION_SESSION] = array(
 | 
			
		||||
  $providers[LANGUAGE_NEGOTIATION_SESSION] = array(
 | 
			
		||||
    'callbacks' => array(
 | 
			
		||||
      'language' => 'locale_language_from_session',
 | 
			
		||||
      'switcher' => 'locale_language_switcher_session',
 | 
			
		||||
| 
						 | 
				
			
			@ -492,7 +493,7 @@ function locale_language_negotiation_info() {
 | 
			
		|||
    'config' => 'admin/config/regional/language/configure/session',
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  $providers[LOCALE_LANGUAGE_NEGOTIATION_USER] = array(
 | 
			
		||||
  $providers[LANGUAGE_NEGOTIATION_USER] = array(
 | 
			
		||||
    'callbacks' => array('language' => 'locale_language_from_user'),
 | 
			
		||||
    'file' => $file,
 | 
			
		||||
    'weight' => -4,
 | 
			
		||||
| 
						 | 
				
			
			@ -500,7 +501,7 @@ function locale_language_negotiation_info() {
 | 
			
		|||
    'description' => t("Follow the user's language preference."),
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  $providers[LOCALE_LANGUAGE_NEGOTIATION_BROWSER] = array(
 | 
			
		||||
  $providers[LANGUAGE_NEGOTIATION_BROWSER] = array(
 | 
			
		||||
    'callbacks' => array('language' => 'locale_language_from_browser'),
 | 
			
		||||
    'file' => $file,
 | 
			
		||||
    'weight' => -2,
 | 
			
		||||
| 
						 | 
				
			
			@ -509,7 +510,7 @@ function locale_language_negotiation_info() {
 | 
			
		|||
    'description' => t("Determine the language from the browser's language settings."),
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  $providers[LOCALE_LANGUAGE_NEGOTIATION_INTERFACE] = array(
 | 
			
		||||
  $providers[LANGUAGE_NEGOTIATION_INTERFACE] = array(
 | 
			
		||||
    'types' => array(LANGUAGE_TYPE_CONTENT),
 | 
			
		||||
    'callbacks' => array('language' => 'locale_language_from_interface'),
 | 
			
		||||
    'file' => $file,
 | 
			
		||||
| 
						 | 
				
			
			@ -518,7 +519,7 @@ function locale_language_negotiation_info() {
 | 
			
		|||
    'description' => t('Use the detected interface language.'),
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  $providers[LOCALE_LANGUAGE_NEGOTIATION_URL_FALLBACK] = array(
 | 
			
		||||
  $providers[LANGUAGE_NEGOTIATION_URL_FALLBACK] = array(
 | 
			
		||||
    'types' => array(LANGUAGE_TYPE_URL),
 | 
			
		||||
    'callbacks' => array('language' => 'locale_language_url_fallback'),
 | 
			
		||||
    'file' => $file,
 | 
			
		||||
| 
						 | 
				
			
			@ -768,15 +769,6 @@ function locale_get_plural($count, $langcode = NULL) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Returns a language name.
 | 
			
		||||
 */
 | 
			
		||||
function locale_language_name($langcode) {
 | 
			
		||||
  // Consider enabled languages only.
 | 
			
		||||
  $languages = language_list(TRUE);
 | 
			
		||||
  return ($langcode && isset($languages[$langcode])) ? $languages[$langcode]->name : t('All');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Implements hook_modules_installed().
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1134,7 +1134,7 @@ class LocaleUninstallFunctionalTest extends DrupalWebTestCase {
 | 
			
		|||
    variable_set('language_negotiation_' . LANGUAGE_TYPE_URL, locale_language_negotiation_info());
 | 
			
		||||
 | 
			
		||||
    // Change language providers settings.
 | 
			
		||||
    variable_set('locale_language_negotiation_url_part', LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX);
 | 
			
		||||
    variable_set('locale_language_negotiation_url_part', LANGUAGE_NEGOTIATION_URL_PREFIX);
 | 
			
		||||
    variable_set('locale_language_negotiation_session_param', TRUE);
 | 
			
		||||
 | 
			
		||||
    // Uninstall Locale.
 | 
			
		||||
| 
						 | 
				
			
			@ -2059,7 +2059,7 @@ class LocaleUILanguageNegotiationTest extends DrupalWebTestCase {
 | 
			
		|||
    $tests = array(
 | 
			
		||||
      // Default, browser preference should have no influence.
 | 
			
		||||
      array(
 | 
			
		||||
        'language_negotiation' => array(LOCALE_LANGUAGE_NEGOTIATION_URL, LANGUAGE_NEGOTIATION_DEFAULT),
 | 
			
		||||
        'language_negotiation' => array(LANGUAGE_NEGOTIATION_URL, LANGUAGE_NEGOTIATION_DEFAULT),
 | 
			
		||||
        'path' => 'admin/config',
 | 
			
		||||
        'expect' => $default_string,
 | 
			
		||||
        'expected_provider' => LANGUAGE_NEGOTIATION_DEFAULT,
 | 
			
		||||
| 
						 | 
				
			
			@ -2068,34 +2068,34 @@ class LocaleUILanguageNegotiationTest extends DrupalWebTestCase {
 | 
			
		|||
      ),
 | 
			
		||||
      // Language prefix.
 | 
			
		||||
      array(
 | 
			
		||||
        'language_negotiation' => array(LOCALE_LANGUAGE_NEGOTIATION_URL, LANGUAGE_NEGOTIATION_DEFAULT),
 | 
			
		||||
        'language_negotiation' => array(LANGUAGE_NEGOTIATION_URL, LANGUAGE_NEGOTIATION_DEFAULT),
 | 
			
		||||
        'path' => "$langcode/admin/config",
 | 
			
		||||
        'expect' => $language_string,
 | 
			
		||||
        'expected_provider' => LOCALE_LANGUAGE_NEGOTIATION_URL,
 | 
			
		||||
        'expected_provider' => LANGUAGE_NEGOTIATION_URL,
 | 
			
		||||
        'http_header' => $http_header_browser_fallback,
 | 
			
		||||
        'message' => 'URL (PATH) > DEFAULT: with language prefix, UI language is switched based on path prefix',
 | 
			
		||||
      ),
 | 
			
		||||
      // Default, go by browser preference.
 | 
			
		||||
      array(
 | 
			
		||||
        'language_negotiation' => array(LOCALE_LANGUAGE_NEGOTIATION_URL, LOCALE_LANGUAGE_NEGOTIATION_BROWSER),
 | 
			
		||||
        'language_negotiation' => array(LANGUAGE_NEGOTIATION_URL, LANGUAGE_NEGOTIATION_BROWSER),
 | 
			
		||||
        'path' => 'admin/config',
 | 
			
		||||
        'expect' => $language_browser_fallback_string,
 | 
			
		||||
        'expected_provider' => LOCALE_LANGUAGE_NEGOTIATION_BROWSER,
 | 
			
		||||
        'expected_provider' => LANGUAGE_NEGOTIATION_BROWSER,
 | 
			
		||||
        'http_header' => $http_header_browser_fallback,
 | 
			
		||||
        'message' => 'URL (PATH) > BROWSER: no language prefix, UI language is determined by browser language preference',
 | 
			
		||||
      ),
 | 
			
		||||
      // Prefix, switch to the language.
 | 
			
		||||
      array(
 | 
			
		||||
        'language_negotiation' => array(LOCALE_LANGUAGE_NEGOTIATION_URL, LOCALE_LANGUAGE_NEGOTIATION_BROWSER),
 | 
			
		||||
        'language_negotiation' => array(LANGUAGE_NEGOTIATION_URL, LANGUAGE_NEGOTIATION_BROWSER),
 | 
			
		||||
        'path' => "$langcode/admin/config",
 | 
			
		||||
        'expect' => $language_string,
 | 
			
		||||
        'expected_provider' => LOCALE_LANGUAGE_NEGOTIATION_URL,
 | 
			
		||||
        'expected_provider' => LANGUAGE_NEGOTIATION_URL,
 | 
			
		||||
        'http_header' => $http_header_browser_fallback,
 | 
			
		||||
        'message' => 'URL (PATH) > BROWSER: with langage prefix, UI language is based on path prefix',
 | 
			
		||||
      ),
 | 
			
		||||
      // Default, browser language preference is not one of site's lang.
 | 
			
		||||
      array(
 | 
			
		||||
        'language_negotiation' => array(LOCALE_LANGUAGE_NEGOTIATION_URL, LOCALE_LANGUAGE_NEGOTIATION_BROWSER, LANGUAGE_NEGOTIATION_DEFAULT),
 | 
			
		||||
        'language_negotiation' => array(LANGUAGE_NEGOTIATION_URL, LANGUAGE_NEGOTIATION_BROWSER, LANGUAGE_NEGOTIATION_DEFAULT),
 | 
			
		||||
        'path' => 'admin/config',
 | 
			
		||||
        'expect' => $default_string,
 | 
			
		||||
        'expected_provider' => LANGUAGE_NEGOTIATION_DEFAULT,
 | 
			
		||||
| 
						 | 
				
			
			@ -2122,8 +2122,8 @@ class LocaleUILanguageNegotiationTest extends DrupalWebTestCase {
 | 
			
		|||
    $tests = array(
 | 
			
		||||
      // Default domain, browser preference should have no influence.
 | 
			
		||||
      array(
 | 
			
		||||
        'language_negotiation' => array(LOCALE_LANGUAGE_NEGOTIATION_URL, LANGUAGE_NEGOTIATION_DEFAULT),
 | 
			
		||||
        'locale_language_negotiation_url_part' => LOCALE_LANGUAGE_NEGOTIATION_URL_DOMAIN,
 | 
			
		||||
        'language_negotiation' => array(LANGUAGE_NEGOTIATION_URL, LANGUAGE_NEGOTIATION_DEFAULT),
 | 
			
		||||
        'locale_language_negotiation_url_part' => LANGUAGE_NEGOTIATION_URL_DOMAIN,
 | 
			
		||||
        'path' => 'admin/config',
 | 
			
		||||
        'expect' => $default_string,
 | 
			
		||||
        'expected_provider' => LANGUAGE_NEGOTIATION_DEFAULT,
 | 
			
		||||
| 
						 | 
				
			
			@ -2133,12 +2133,12 @@ class LocaleUILanguageNegotiationTest extends DrupalWebTestCase {
 | 
			
		|||
      // Language domain specific URL, we set the $_SERVER['HTTP_HOST'] in
 | 
			
		||||
      // locale_test.module hook_boot() to simulate this.
 | 
			
		||||
      array(
 | 
			
		||||
        'language_negotiation' => array(LOCALE_LANGUAGE_NEGOTIATION_URL, LANGUAGE_NEGOTIATION_DEFAULT),
 | 
			
		||||
        'locale_language_negotiation_url_part' => LOCALE_LANGUAGE_NEGOTIATION_URL_DOMAIN,
 | 
			
		||||
        'language_negotiation' => array(LANGUAGE_NEGOTIATION_URL, LANGUAGE_NEGOTIATION_DEFAULT),
 | 
			
		||||
        'locale_language_negotiation_url_part' => LANGUAGE_NEGOTIATION_URL_DOMAIN,
 | 
			
		||||
        'locale_test_domain' => $language_domain,
 | 
			
		||||
        'path' => 'admin/config',
 | 
			
		||||
        'expect' => $language_string,
 | 
			
		||||
        'expected_provider' => LOCALE_LANGUAGE_NEGOTIATION_URL,
 | 
			
		||||
        'expected_provider' => LANGUAGE_NEGOTIATION_URL,
 | 
			
		||||
        'http_header' => $http_header_browser_fallback,
 | 
			
		||||
        'message' => 'URL (DOMAIN) > DEFAULT: domain example.cn should switch to Chinese',
 | 
			
		||||
      ),
 | 
			
		||||
| 
						 | 
				
			
			@ -2212,6 +2212,60 @@ class LocaleUILanguageNegotiationTest extends DrupalWebTestCase {
 | 
			
		|||
    $fields = $this->xpath('//div[@id="site-name"]//a[@rel="home" and @href=:url]//span', $args);
 | 
			
		||||
    $this->assertTrue($fields[0] == 'Drupal', t('URLs are rewritten using the browser language.'));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Test if the url function returns the right url when using different domains for different languages.
 | 
			
		||||
   */
 | 
			
		||||
  function testLanguageDomain() {
 | 
			
		||||
    // Add the Italian language.
 | 
			
		||||
    $langcode = 'it';
 | 
			
		||||
    $language = (object) array(
 | 
			
		||||
      'langcode' => $langcode,
 | 
			
		||||
    );
 | 
			
		||||
    language_save($language);
 | 
			
		||||
    $languages = language_list();
 | 
			
		||||
 | 
			
		||||
    // Enable browser and URL language detection.
 | 
			
		||||
    $edit = array(
 | 
			
		||||
      'language[enabled][locale-url]' => TRUE,
 | 
			
		||||
      'language[weight][locale-url]' => -10,
 | 
			
		||||
    );
 | 
			
		||||
    $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
 | 
			
		||||
 | 
			
		||||
    // Change the domain for the Italian language.
 | 
			
		||||
    $edit = array(
 | 
			
		||||
      'locale_language_negotiation_url_part' => 1,
 | 
			
		||||
      'domain[it]' => 'it.example.com',
 | 
			
		||||
    );
 | 
			
		||||
    $this->drupalPost('admin/config/regional/language/configure/url', $edit, t('Save configuration'));
 | 
			
		||||
 | 
			
		||||
    // Build the link we're going to test based on the clean url setting.
 | 
			
		||||
    $link = (!empty($GLOBALS['conf']['clean_url'])) ? 'it.example.com/admin' : 'it.example.com/?q=admin';
 | 
			
		||||
 | 
			
		||||
    global $is_https;
 | 
			
		||||
    // Test URL in another language: http://it.example.com/?q=admin.
 | 
			
		||||
    // Base path gives problems on the testbot, so $correct_link is hard-coded.
 | 
			
		||||
    // @see UrlAlterFunctionalTest::assertUrlOutboundAlter (path.test).
 | 
			
		||||
    $italian_url = url('admin', array('language' => $languages['it']));
 | 
			
		||||
    $url_scheme = ($is_https) ? 'https://' : 'http://';
 | 
			
		||||
    $correct_link = $url_scheme . $link;
 | 
			
		||||
    $this->assertTrue($italian_url == $correct_link, t('The url() function returns the right url (@url) in accordance with the chosen language', array('@url' => $italian_url)));
 | 
			
		||||
 | 
			
		||||
    // Test https via options.
 | 
			
		||||
    variable_set('https', TRUE);
 | 
			
		||||
    $italian_url = url('admin', array('https' => TRUE, 'language' => $languages['it']));
 | 
			
		||||
    $correct_link = 'https://' . $link;
 | 
			
		||||
    $this->assertTrue($italian_url == $correct_link, t('The url() function returns the right https url (via options) (@url) in accordance with the chosen language', array('@url' => $italian_url)));
 | 
			
		||||
    variable_set('https', FALSE);
 | 
			
		||||
 | 
			
		||||
    // Test https via current url scheme.
 | 
			
		||||
    $temp_https = $is_https;
 | 
			
		||||
    $is_https = TRUE;
 | 
			
		||||
    $italian_url = url('admin', array('language' => $languages['it']));
 | 
			
		||||
    $correct_link = 'https://' . $link;
 | 
			
		||||
    $this->assertTrue($italian_url == $correct_link, t('The url() function returns the right url (via current url scheme) (@url) in accordance with the chosen language', array('@url' => $italian_url)));
 | 
			
		||||
    $is_https = $temp_https;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			@ -2381,7 +2435,7 @@ class LocaleMultilingualFieldsFunctionalTest extends DrupalWebTestCase {
 | 
			
		|||
    $this->assertTrue($assert, t('Field language correctly changed.'));
 | 
			
		||||
 | 
			
		||||
    // Enable content language URL detection.
 | 
			
		||||
    language_negotiation_set(LANGUAGE_TYPE_CONTENT, array(LOCALE_LANGUAGE_NEGOTIATION_URL => 0));
 | 
			
		||||
    language_negotiation_set(LANGUAGE_TYPE_CONTENT, array(LANGUAGE_NEGOTIATION_URL => 0));
 | 
			
		||||
 | 
			
		||||
    // Test multilingual field language fallback logic.
 | 
			
		||||
    $this->drupalGet("it/node/$node->nid");
 | 
			
		||||
| 
						 | 
				
			
			@ -2628,7 +2682,7 @@ class LocaleLanguageNegotiationInfoFunctionalTest extends DrupalWebTestCase {
 | 
			
		|||
    // Enable some core and custom language providers. The test language type is
 | 
			
		||||
    // supposed to be configurable.
 | 
			
		||||
    $test_type = 'test_language_type';
 | 
			
		||||
    $provider = LOCALE_LANGUAGE_NEGOTIATION_INTERFACE;
 | 
			
		||||
    $provider = LANGUAGE_NEGOTIATION_INTERFACE;
 | 
			
		||||
    $test_provider = 'test_language_provider';
 | 
			
		||||
    $form_field = $type . '[enabled]['. $provider .']';
 | 
			
		||||
    $edit = array(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -85,7 +85,7 @@ function locale_test_language_negotiation_info() {
 | 
			
		|||
 */
 | 
			
		||||
function locale_test_language_negotiation_info_alter(array &$language_providers) {
 | 
			
		||||
  if (variable_get('locale_test_language_negotiation_info_alter', FALSE)) {
 | 
			
		||||
    unset($language_providers[LOCALE_LANGUAGE_NEGOTIATION_INTERFACE]);
 | 
			
		||||
    unset($language_providers[LANGUAGE_NEGOTIATION_INTERFACE]);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -107,14 +107,14 @@ function node_filters() {
 | 
			
		|||
  // Language filter if the site is multilingual.
 | 
			
		||||
  if (language_multilingual()) {
 | 
			
		||||
    $languages = language_list(TRUE);
 | 
			
		||||
    $language_options = array(LANGUAGE_NONE => t('Language neutral'));
 | 
			
		||||
    $language_options = array(LANGUAGE_NONE => t('- None -'));
 | 
			
		||||
    foreach ($languages as $langcode => $language) {
 | 
			
		||||
      $language_options[$langcode] = $language->name;
 | 
			
		||||
    }
 | 
			
		||||
    $filters['language'] = array(
 | 
			
		||||
      'title' => t('language'),
 | 
			
		||||
      'options' => array(
 | 
			
		||||
        '[any]' => t('any'),
 | 
			
		||||
        '[any]' => t('- Any -'),
 | 
			
		||||
      ) + $language_options,
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -173,7 +173,7 @@ function node_filter_form() {
 | 
			
		|||
      $value = $value->name;
 | 
			
		||||
    }
 | 
			
		||||
    elseif ($type == 'language') {
 | 
			
		||||
      $value = $value == LANGUAGE_NONE ? t('Language neutral') : module_invoke('locale', 'language_name', $value);
 | 
			
		||||
      $value = language_name($value);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      $value = $filters[$type]['options'][$value];
 | 
			
		||||
| 
						 | 
				
			
			@ -446,7 +446,7 @@ function node_admin_nodes() {
 | 
			
		|||
    'changed' => array('data' => t('Updated'), 'field' => 'n.changed', 'sort' => 'desc')
 | 
			
		||||
  );
 | 
			
		||||
  if ($multilanguage) {
 | 
			
		||||
    $header['language'] = array('data' => t('Language'), 'field' => 'n.language');
 | 
			
		||||
    $header['language_name'] = array('data' => t('Language'), 'field' => 'n.language');
 | 
			
		||||
  }
 | 
			
		||||
  $header['operations'] = array('data' => t('Operations'));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -498,12 +498,7 @@ function node_admin_nodes() {
 | 
			
		|||
      'changed' => format_date($node->changed, 'short'),
 | 
			
		||||
    );
 | 
			
		||||
    if ($multilanguage) {
 | 
			
		||||
      if ($node->language == LANGUAGE_NONE || isset($languages[$node->language])) {
 | 
			
		||||
        $options[$node->nid]['language'] = $node->language == LANGUAGE_NONE ? t('Language neutral') : $languages[$node->language]->name;
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
        $options[$node->nid]['language'] = t('Undefined language (@langcode)', array('@langcode' => $node->language));
 | 
			
		||||
      }
 | 
			
		||||
      $options[$node->nid]['language_name'] = language_name($node->language);
 | 
			
		||||
    }
 | 
			
		||||
    // Build a list of all the accessible operations for the current node.
 | 
			
		||||
    $operations = array();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,7 +19,6 @@ html {
 | 
			
		|||
#overlay-close:hover {
 | 
			
		||||
  background: transparent url(images/close-rtl.png) no-repeat;
 | 
			
		||||
  -moz-border-radius-topright: 0;
 | 
			
		||||
  -webkit-border-top-right-radius: 0;
 | 
			
		||||
  border-top-right-radius: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -65,7 +65,6 @@
 | 
			
		|||
#overlay-close:hover {
 | 
			
		||||
  background: transparent url(images/close.png) no-repeat; /* LTR */
 | 
			
		||||
  -moz-border-radius-topleft: 0; /* LTR */
 | 
			
		||||
  -webkit-border-top-left-radius: 0; /* LTR */
 | 
			
		||||
  border-top-left-radius: 0; /* LTR */
 | 
			
		||||
  display: block;
 | 
			
		||||
  height: 26px;
 | 
			
		||||
| 
						 | 
				
			
			@ -98,8 +97,6 @@
 | 
			
		|||
#overlay-tabs li a:hover {
 | 
			
		||||
  background-color: #a6a7a2;
 | 
			
		||||
  -moz-border-radius: 8px 8px 0 0;
 | 
			
		||||
  -webkit-border-top-left-radius: 8px;
 | 
			
		||||
  -webkit-border-top-right-radius: 8px;
 | 
			
		||||
  border-radius: 8px 8px 0 0;
 | 
			
		||||
  color: #000;
 | 
			
		||||
  display: inline-block;
 | 
			
		||||
| 
						 | 
				
			
			@ -142,8 +139,6 @@
 | 
			
		|||
  margin: -20px auto 20px;
 | 
			
		||||
  width: 80%;
 | 
			
		||||
  -moz-border-radius: 0 0 8px 8px;
 | 
			
		||||
  -webkit-border-bottom-left-radius: 8px;
 | 
			
		||||
  -webkit-border-bottom-right-radius: 8px;
 | 
			
		||||
  border-radius: 0 0 8px 8px;
 | 
			
		||||
}
 | 
			
		||||
.overlay-disable-message-focused {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,9 +14,10 @@
 | 
			
		|||
function path_admin_overview($keys = NULL) {
 | 
			
		||||
  // Add the filter form above the overview table.
 | 
			
		||||
  $build['path_admin_filter_form'] = drupal_get_form('path_admin_filter_form', $keys);
 | 
			
		||||
  // Enable language column if locale is enabled or if we have any alias with language
 | 
			
		||||
  // Enable language column if language.module is enabled or if we have any
 | 
			
		||||
  // alias with a language.
 | 
			
		||||
  $alias_exists = (bool) db_query_range('SELECT 1 FROM {url_alias} WHERE langcode <> :langcode', 0, 1, array(':langcode' => LANGUAGE_NONE))->fetchField();
 | 
			
		||||
  $multilanguage = (module_exists('locale') || $alias_exists);
 | 
			
		||||
  $multilanguage = (module_exists('language') || $alias_exists);
 | 
			
		||||
 | 
			
		||||
  $header = array();
 | 
			
		||||
  $header[] = array('data' => t('Alias'), 'field' => 'alias', 'sort' => 'asc');
 | 
			
		||||
| 
						 | 
				
			
			@ -44,7 +45,7 @@ function path_admin_overview($keys = NULL) {
 | 
			
		|||
    $row['data']['alias'] = l($data->alias, $data->source);
 | 
			
		||||
    $row['data']['source'] = l($data->source, $data->source, array('alias' => TRUE));
 | 
			
		||||
    if ($multilanguage) {
 | 
			
		||||
      $row['data']['langcode'] = module_invoke('locale', 'language_name', $data->langcode);
 | 
			
		||||
      $row['data']['language_name'] = language_name($data->langcode);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $operations = array();
 | 
			
		||||
| 
						 | 
				
			
			@ -130,10 +131,9 @@ function path_admin_form($form, &$form_state, $path = array('source' => '', 'ali
 | 
			
		|||
    '#required' => TRUE,
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  // A hidden value unless locale module is enabled.
 | 
			
		||||
  if (module_exists('locale')) {
 | 
			
		||||
  // A hidden value unless language.module is enabled.
 | 
			
		||||
  if (module_exists('language')) {
 | 
			
		||||
    $languages = language_list(TRUE);
 | 
			
		||||
    $language_options = array(LANGUAGE_NONE => t('All languages'));
 | 
			
		||||
    foreach ($languages as $langcode => $language) {
 | 
			
		||||
      $language_options[$langcode] = $language->name;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -142,9 +142,11 @@ function path_admin_form($form, &$form_state, $path = array('source' => '', 'ali
 | 
			
		|||
      '#type' => 'select',
 | 
			
		||||
      '#title' => t('Language'),
 | 
			
		||||
      '#options' => $language_options,
 | 
			
		||||
      '#empty_value' => LANGUAGE_NONE,
 | 
			
		||||
      '#empty_option' => t('- None -'),
 | 
			
		||||
      '#default_value' => $path['langcode'],
 | 
			
		||||
      '#weight' => -10,
 | 
			
		||||
      '#description' => t('A path alias set for a specific language will always be used when displaying this page in that language, and takes precedence over path aliases set for <em>All languages</em>.'),
 | 
			
		||||
      '#description' => t('A path alias set for a specific language will always be used when displaying this page in that language, and takes precedence over path aliases set as <em>- None -</em>.'),
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
| 
						 | 
				
			
			@ -194,7 +196,8 @@ function path_admin_form_validate($form, &$form_state) {
 | 
			
		|||
  $source = drupal_get_normal_path($source);
 | 
			
		||||
  $alias = $form_state['values']['alias'];
 | 
			
		||||
  $pid = isset($form_state['values']['pid']) ? $form_state['values']['pid'] : 0;
 | 
			
		||||
  // Language is only set if locale module is enabled, otherwise save for all languages.
 | 
			
		||||
  // Language is only set if language.module is enabled, otherwise save for all
 | 
			
		||||
  // languages.
 | 
			
		||||
  $langcode = isset($form_state['values']['langcode']) ? $form_state['values']['langcode'] : LANGUAGE_NONE;
 | 
			
		||||
 | 
			
		||||
  $has_alias = db_query("SELECT COUNT(alias) FROM {url_alias} WHERE pid <> :pid AND alias = :alias AND langcode = :langcode", array(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -800,3 +800,75 @@ class PollDeleteChoiceTestCase extends PollTestCase {
 | 
			
		|||
    $this->assertText('Third choice', t('Third choice remains.'));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tests poll translation logic.
 | 
			
		||||
 */
 | 
			
		||||
class PollTranslateTestCase extends PollTestCase {
 | 
			
		||||
  public static function getInfo() {
 | 
			
		||||
    return array(
 | 
			
		||||
      'name' => 'Poll translation',
 | 
			
		||||
      'description' => 'Test the poll translation logic.',
 | 
			
		||||
      'group' => 'Poll',
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  function setUp() {
 | 
			
		||||
    parent::setUp('poll', 'translation');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Tests poll creation and translation.
 | 
			
		||||
   *
 | 
			
		||||
   * Checks that the choice names get copied from the original poll and that
 | 
			
		||||
   * the vote count values are set to 0.
 | 
			
		||||
   */
 | 
			
		||||
  function testPollTranslate() {
 | 
			
		||||
    $admin_user = $this->drupalCreateUser(array('administer content types', 'administer languages', 'edit any poll content', 'create poll content', 'administer nodes', 'translate content'));
 | 
			
		||||
 | 
			
		||||
    // Set up a poll with two choices.
 | 
			
		||||
    $title = $this->randomName();
 | 
			
		||||
    $choices = array($this->randomName(), $this->randomName());
 | 
			
		||||
    $poll_nid = $this->pollCreate($title, $choices, FALSE);
 | 
			
		||||
    $this->assertTrue($poll_nid, t('Poll for translation logic test created.'));
 | 
			
		||||
 | 
			
		||||
    $this->drupalLogout();
 | 
			
		||||
    $this->drupalLogin($admin_user);
 | 
			
		||||
 | 
			
		||||
    // Enable a second language.
 | 
			
		||||
    $this->drupalGet('admin/config/regional/language');
 | 
			
		||||
    $edit = array();
 | 
			
		||||
    $edit['predefined_langcode'] = 'nl';
 | 
			
		||||
    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
 | 
			
		||||
    $this->assertRaw(t('The language %language has been created and can now be used.', array('%language' => 'Dutch')), t('Language Dutch has been created.'));
 | 
			
		||||
 | 
			
		||||
    // Set "Poll" content type to use multilingual support with translation.
 | 
			
		||||
    $this->drupalGet('admin/structure/types/manage/poll');
 | 
			
		||||
    $edit = array();
 | 
			
		||||
    $edit['language_content_type'] = 2;
 | 
			
		||||
    $this->drupalPost('admin/structure/types/manage/poll', $edit, t('Save content type'));
 | 
			
		||||
    $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Poll')), t('Poll content type has been updated.'));
 | 
			
		||||
 | 
			
		||||
    // Edit poll.
 | 
			
		||||
    $this->drupalGet("node/$poll_nid/edit");
 | 
			
		||||
    $edit = array();
 | 
			
		||||
    // Set the poll's first choice count to 200.
 | 
			
		||||
    $edit['choice[chid:1][chvotes]'] = 200;
 | 
			
		||||
    // Set the language to Dutch.
 | 
			
		||||
    $edit['language'] = 'nl';
 | 
			
		||||
    $this->drupalPost(NULL, $edit, t('Save'));
 | 
			
		||||
 | 
			
		||||
    // Translate the Dutch poll.
 | 
			
		||||
    $this->drupalGet('node/add/poll', array('query' => array('translation' => $poll_nid, 'target' => 'en')));
 | 
			
		||||
 | 
			
		||||
    $dutch_poll = node_load($poll_nid);
 | 
			
		||||
 | 
			
		||||
    // Check that the vote count values didn't get copied from the Dutch poll
 | 
			
		||||
    // and are set to 0.
 | 
			
		||||
    $this->assertFieldByName('choice[chid:1][chvotes]', '0', ('Found choice with vote count 0'));
 | 
			
		||||
    $this->assertFieldByName('choice[chid:2][chvotes]', '0', ('Found choice with vote count 0'));
 | 
			
		||||
    // Check that the choice names got copied from the Dutch poll.
 | 
			
		||||
    $this->assertFieldByName('choice[chid:1][chtext]', $dutch_poll->choice[1]['chtext'], t('Found choice with text @text', array('@text' => $dutch_poll->choice[1]['chtext'])));
 | 
			
		||||
    $this->assertFieldByName('choice[chid:2][chtext]', $dutch_poll->choice[2]['chtext'], t('Found choice with text @text', array('@text' => $dutch_poll->choice[2]['chtext'])));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,8 +31,6 @@
 | 
			
		|||
.add-or-remove-shortcuts a:focus span.text,
 | 
			
		||||
.add-or-remove-shortcuts a:hover span.text {
 | 
			
		||||
  -moz-border-radius: 5px 0 0 5px;
 | 
			
		||||
  -webkit-border-top-left-radius: 5px;
 | 
			
		||||
  -webkit-border-bottom-left-radius: 5px;
 | 
			
		||||
  border-radius: 5px 0 0 5px;
 | 
			
		||||
  padding-left: 6px;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,7 +52,7 @@ Drupal.behaviors.shortcutDrag = {
 | 
			
		|||
            // status to be disabled and mark it also as changed.
 | 
			
		||||
            var changedRowObject = new tableDrag.row(changedRow, 'mouse', self.indentEnabled, self.maxDepth, true);
 | 
			
		||||
            changedRowObject.markChanged();
 | 
			
		||||
            rowStatusChange(changedRowObject);
 | 
			
		||||
            tableDrag.rowStatusChange(changedRowObject);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        else if (total != visibleLength) {
 | 
			
		||||
| 
						 | 
				
			
			@ -71,18 +71,18 @@ Drupal.behaviors.shortcutDrag = {
 | 
			
		|||
 | 
			
		||||
      // Add a handler so when a row is dropped, update fields dropped into new regions.
 | 
			
		||||
      tableDrag.onDrop = function () {
 | 
			
		||||
        rowStatusChange(this.rowObject);
 | 
			
		||||
        tableDrag.rowStatusChange(this.rowObject);
 | 
			
		||||
        return true;
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      function rowStatusChange(rowObject) {
 | 
			
		||||
      tableDrag.rowStatusChange = function (rowObject) {
 | 
			
		||||
        // Use "status-message" row instead of "status" row because
 | 
			
		||||
        // "status-{status_name}-message" is less prone to regexp match errors.
 | 
			
		||||
        var statusRow = $(rowObject.element).prevAll('tr.shortcut-status').get(0);
 | 
			
		||||
        var statusName = statusRow.className.replace(/([^ ]+[ ]+)*shortcut-status-([^ ]+)([ ]+[^ ]+)*/, '$2');
 | 
			
		||||
        var statusField = $('select.shortcut-status-select', rowObject.element);
 | 
			
		||||
        statusField.val(statusName);
 | 
			
		||||
      }
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      tableDrag.restripeTable = function () {
 | 
			
		||||
        // :even and :odd are reversed because jQuery counts from 0 and
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,7 +23,6 @@
 | 
			
		|||
  padding: 0 5px 0 5px;
 | 
			
		||||
  margin-right: 5px; /* LTR */
 | 
			
		||||
  -moz-border-radius: 5px;
 | 
			
		||||
  -webkit-border-radius: 5px;
 | 
			
		||||
  border-radius: 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -45,7 +44,6 @@
 | 
			
		|||
  height: 30px;
 | 
			
		||||
  margin-right: 5px; /* LTR */
 | 
			
		||||
  -moz-border-radius: 5px;
 | 
			
		||||
  -webkit-border-radius: 5px;
 | 
			
		||||
  border-radius: 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -90,8 +88,6 @@
 | 
			
		|||
  padding-right: 6px; /* LTR */
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
  -moz-border-radius: 0 5px 5px 0; /* LTR */
 | 
			
		||||
  -webkit-border-top-right-radius: 5px; /* LTR */
 | 
			
		||||
  -webkit-border-bottom-right-radius: 5px; /* LTR */
 | 
			
		||||
  border-radius: 0 5px 5px 0; /* LTR */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1372,6 +1372,12 @@ class DrupalWebTestCase extends DrupalTestCase {
 | 
			
		|||
    variable_set('file_private_path', $private_files_directory);
 | 
			
		||||
    variable_set('file_temporary_path', $temp_files_directory);
 | 
			
		||||
 | 
			
		||||
    // Set the 'simpletest_parent_profile' variable to add the parent profile's
 | 
			
		||||
    // search path to the child site's search paths.
 | 
			
		||||
    // @see drupal_system_listing()
 | 
			
		||||
    // @todo This may need to be primed like 'install_profile' above.
 | 
			
		||||
    variable_set('simpletest_parent_profile', $this->originalProfile);
 | 
			
		||||
 | 
			
		||||
    // Include the testing profile.
 | 
			
		||||
    variable_set('install_profile', $this->profile);
 | 
			
		||||
    $profile_details = install_profile_info($this->profile, 'en');
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,7 @@ files[] = tests/lock.test
 | 
			
		|||
files[] = tests/mail.test
 | 
			
		||||
files[] = tests/menu.test
 | 
			
		||||
files[] = tests/module.test
 | 
			
		||||
files[] = tests/pager.test
 | 
			
		||||
files[] = tests/password.test
 | 
			
		||||
files[] = tests/path.test
 | 
			
		||||
files[] = tests/registry.test
 | 
			
		||||
| 
						 | 
				
			
			@ -40,3 +41,4 @@ files[] = tests/xmlrpc.test
 | 
			
		|||
files[] = tests/upgrade/upgrade.test
 | 
			
		||||
files[] = tests/upgrade/upgrade_bare.test
 | 
			
		||||
files[] = tests/upgrade/upgrade_filled.test
 | 
			
		||||
files[] = tests/upgrade/upgrade.language.test
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -616,3 +616,91 @@ class SimpleTestMissingCheckedRequirements extends DrupalWebTestCase {
 | 
			
		|||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Verifies that tests bundled with installation profile modules are found.
 | 
			
		||||
 */
 | 
			
		||||
class SimpleTestInstallationProfileModuleTestsTestCase extends DrupalWebTestCase {
 | 
			
		||||
  /**
 | 
			
		||||
   * Use the Testing profile.
 | 
			
		||||
   *
 | 
			
		||||
   * The Testing profile contains drupal_system_listing_compatible_test.test,
 | 
			
		||||
   * which attempts to:
 | 
			
		||||
   * - run tests using the Minimal profile (which does not contain the
 | 
			
		||||
   *   drupal_system_listing_compatible_test.module)
 | 
			
		||||
   * - but still install the drupal_system_listing_compatible_test.module
 | 
			
		||||
   *   contained in the Testing profile.
 | 
			
		||||
   *
 | 
			
		||||
   * @see DrupalSystemListingCompatibleTestCase
 | 
			
		||||
   */
 | 
			
		||||
  protected $profile = 'testing';
 | 
			
		||||
 | 
			
		||||
  public static function getInfo() {
 | 
			
		||||
    return array(
 | 
			
		||||
      'name' => 'Installation profile module tests',
 | 
			
		||||
      'description' => 'Verifies that tests bundled with installation profile modules are found.',
 | 
			
		||||
      'group' => 'SimpleTest',
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  function setUp() {
 | 
			
		||||
    parent::setUp(array('simpletest'));
 | 
			
		||||
 | 
			
		||||
    $this->admin_user = $this->drupalCreateUser(array('administer unit tests'));
 | 
			
		||||
    $this->drupalLogin($this->admin_user);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Tests existence of test case located in an installation profile module.
 | 
			
		||||
   */
 | 
			
		||||
  function testInstallationProfileTests() {
 | 
			
		||||
    $this->drupalGet('admin/config/development/testing');
 | 
			
		||||
    $this->assertText('Installation profile module tests helper');
 | 
			
		||||
    $edit = array(
 | 
			
		||||
      'DrupalSystemListingCompatibleTestCase' => TRUE,
 | 
			
		||||
    );
 | 
			
		||||
    $this->drupalPost(NULL, $edit, t('Run tests'));
 | 
			
		||||
    $this->assertText('DrupalSystemListingCompatibleTestCase test executed.');
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Verifies that tests in other installation profiles are not found.
 | 
			
		||||
 *
 | 
			
		||||
 * @see SimpleTestInstallationProfileModuleTestsTestCase
 | 
			
		||||
 */
 | 
			
		||||
class SimpleTestOtherInstallationProfileModuleTestsTestCase extends DrupalWebTestCase {
 | 
			
		||||
  /**
 | 
			
		||||
   * Use the Minimal profile.
 | 
			
		||||
   *
 | 
			
		||||
   * The Testing profile contains drupal_system_listing_compatible_test.test,
 | 
			
		||||
   * which should not be found.
 | 
			
		||||
   *
 | 
			
		||||
   * @see SimpleTestInstallationProfileModuleTestsTestCase
 | 
			
		||||
   * @see DrupalSystemListingCompatibleTestCase
 | 
			
		||||
   */
 | 
			
		||||
  protected $profile = 'minimal';
 | 
			
		||||
 | 
			
		||||
  public static function getInfo() {
 | 
			
		||||
    return array(
 | 
			
		||||
      'name' => 'Other Installation profiles',
 | 
			
		||||
      'description' => 'Verifies that tests in other installation profiles are not found.',
 | 
			
		||||
      'group' => 'SimpleTest',
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  function setUp() {
 | 
			
		||||
    parent::setUp(array('simpletest'));
 | 
			
		||||
 | 
			
		||||
    $this->admin_user = $this->drupalCreateUser(array('administer unit tests'));
 | 
			
		||||
    $this->drupalLogin($this->admin_user);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Tests that tests located in another installation profile do not appear.
 | 
			
		||||
   */
 | 
			
		||||
  function testOtherInstallationProfile() {
 | 
			
		||||
    $this->drupalGet('admin/config/development/testing');
 | 
			
		||||
    $this->assertNoText('Installation profile module tests helper');
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -462,3 +462,44 @@ class ImageToolkitGdTestCase extends DrupalWebTestCase {
 | 
			
		|||
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tests the file move function for managed files.
 | 
			
		||||
 */
 | 
			
		||||
class ImageFileMoveTest extends ImageToolkitTestCase {
 | 
			
		||||
  public static function getInfo() {
 | 
			
		||||
    return array(
 | 
			
		||||
      'name' => 'Image moving',
 | 
			
		||||
      'description' => 'Tests the file move function for managed files.',
 | 
			
		||||
      'group' => 'Image',
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Tests moving a randomly generated image.
 | 
			
		||||
   */
 | 
			
		||||
  function testNormal() {
 | 
			
		||||
    // Pick a file for testing.
 | 
			
		||||
    $file = current($this->drupalGetTestFiles('image'));
 | 
			
		||||
 | 
			
		||||
    // Create derivative image.
 | 
			
		||||
    $style = image_style_load(key(image_styles()));
 | 
			
		||||
    $derivative_uri = image_style_path($style['name'], $file->uri);
 | 
			
		||||
    image_style_create_derivative($style, $file->uri, $derivative_uri);
 | 
			
		||||
 | 
			
		||||
    // Check if derivative image exists.
 | 
			
		||||
    $this->assertTrue(file_exists($derivative_uri), 'Make sure derivative image is generated successfully.');
 | 
			
		||||
 | 
			
		||||
    // Clone the object so we don't have to worry about the function changing
 | 
			
		||||
    // our reference copy.
 | 
			
		||||
    $desired_filepath = 'public://' . $this->randomName();
 | 
			
		||||
    $result = file_move(clone $file, $desired_filepath, FILE_EXISTS_ERROR);
 | 
			
		||||
 | 
			
		||||
    // Check if image has been moved.
 | 
			
		||||
    $this->assertTrue(file_exists($result->uri), 'Make sure image is moved successfully.');
 | 
			
		||||
 | 
			
		||||
    // Check if derivative image has been flushed.
 | 
			
		||||
    $this->assertFalse(file_exists($derivative_uri), 'Make sure derivative image has been flushed.');
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -333,3 +333,49 @@ class PathLookupTest extends DrupalWebTestCase {
 | 
			
		|||
    $this->assertEqual(drupal_lookup_path('source', $path['alias']), $path['source'], t('Newer alias record is returned when comparing two LANGUAGE_NONE paths with the same alias.'));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tests the path_save() function.
 | 
			
		||||
 */
 | 
			
		||||
class PathSaveTest extends DrupalWebTestCase {
 | 
			
		||||
  public static function getInfo() {
 | 
			
		||||
    return array(
 | 
			
		||||
      'name' => t('Path save'),
 | 
			
		||||
      'description' => t('Tests that path_save() exposes the previous alias value.'),
 | 
			
		||||
      'group' => t('Path API'),
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  function setUp() {
 | 
			
		||||
    // Enable a helper module that implements hook_path_update().
 | 
			
		||||
    parent::setUp('path_test');
 | 
			
		||||
    path_test_reset();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Tests that path_save() makes the original path available to modules.
 | 
			
		||||
   */
 | 
			
		||||
  function testDrupalSaveOriginalPath() {
 | 
			
		||||
    $account = $this->drupalCreateUser();
 | 
			
		||||
    $uid = $account->uid;
 | 
			
		||||
    $name = $account->name;
 | 
			
		||||
 | 
			
		||||
    // Create a language-neutral alias.
 | 
			
		||||
    $path = array(
 | 
			
		||||
      'source' => "user/$uid",
 | 
			
		||||
      'alias' => 'foo',
 | 
			
		||||
    );
 | 
			
		||||
    $path_original = $path;
 | 
			
		||||
    path_save($path);
 | 
			
		||||
 | 
			
		||||
    // Alter the path.
 | 
			
		||||
    $path['alias'] = 'bar';
 | 
			
		||||
    path_save($path);
 | 
			
		||||
 | 
			
		||||
    // Test to see if the original alias is available to modules during
 | 
			
		||||
    // hook_path_update().
 | 
			
		||||
    $results = variable_get('path_test_results', array());
 | 
			
		||||
    $this->assertIdentical($results['hook_path_update']['original']['alias'], $path_original['alias'], t('Old path alias available to modules during hook_path_update.'));
 | 
			
		||||
    $this->assertIdentical($results['hook_path_update']['original']['source'], $path_original['source'], t('Old path alias available to modules during hook_path_update.'));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,6 @@
 | 
			
		|||
name = "Hook path tests"
 | 
			
		||||
description = "Support module for path hook testing."
 | 
			
		||||
package = Testing
 | 
			
		||||
version = VERSION
 | 
			
		||||
core = 8.x
 | 
			
		||||
hidden = TRUE
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,22 @@
 | 
			
		|||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * Helper module for the path tests.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Resets the path test results.
 | 
			
		||||
 */
 | 
			
		||||
function path_test_reset() {
 | 
			
		||||
  variable_set('path_test_results', array());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Implements hook_path_update().
 | 
			
		||||
 */
 | 
			
		||||
function path_test_path_update($path) {
 | 
			
		||||
  $results = variable_get('path_test_results', array());
 | 
			
		||||
  $results['hook_path_update'] = $path;
 | 
			
		||||
  variable_set('path_test_results', $results);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -117,6 +117,37 @@ class ThemeUnitTest extends DrupalWebTestCase {
 | 
			
		|||
    $this->drupalGet('theme-test/template-test');
 | 
			
		||||
    $this->assertText('Success: Template overridden.', t('Template overridden by defined \'template\' filename.'));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Test the list_themes() function.
 | 
			
		||||
   */
 | 
			
		||||
  function testListThemes() {
 | 
			
		||||
    $themes = list_themes();
 | 
			
		||||
    // Check if drupal_theme_access() retrieves enabled themes properly from list_themes().
 | 
			
		||||
    $this->assertTrue(drupal_theme_access('test_theme'), t('Enabled theme detected'));
 | 
			
		||||
    // Check if list_themes() returns disabled themes.
 | 
			
		||||
    $this->assertTrue(array_key_exists('test_basetheme', $themes), t('Disabled theme detected'));
 | 
			
		||||
    // Check for base theme and subtheme lists.
 | 
			
		||||
    $base_theme_list = array('test_basetheme' => 'Theme test base theme');
 | 
			
		||||
    $sub_theme_list = array('test_subtheme' => 'Theme test subtheme');
 | 
			
		||||
    $this->assertIdentical($themes['test_basetheme']->sub_themes, $sub_theme_list, t('Base theme\'s object includes list of subthemes.'));
 | 
			
		||||
    $this->assertIdentical($themes['test_subtheme']->base_themes, $base_theme_list, t('Subtheme\'s object includes list of base themes.'));
 | 
			
		||||
    // Check for theme engine in subtheme.
 | 
			
		||||
    $this->assertIdentical($themes['test_subtheme']->engine, 'phptemplate', t('Subtheme\'s object includes the theme engine.'));
 | 
			
		||||
    // Check for theme engine prefix.
 | 
			
		||||
    $this->assertIdentical($themes['test_basetheme']->prefix, 'phptemplate', t('Base theme\'s object includes the theme engine prefix.'));
 | 
			
		||||
    $this->assertIdentical($themes['test_subtheme']->prefix, 'phptemplate', t('Subtheme\'s object includes the theme engine prefix.'));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Test the theme_get_setting() function.
 | 
			
		||||
   */
 | 
			
		||||
  function testThemeGetSetting() {
 | 
			
		||||
    $GLOBALS['theme_key'] = 'test_theme';
 | 
			
		||||
    $this->assertIdentical(theme_get_setting('theme_test_setting'), 'default value', t('theme_get_setting() uses the default theme automatically.'));
 | 
			
		||||
    $this->assertNotEqual(theme_get_setting('subtheme_override', 'test_basetheme'), theme_get_setting('subtheme_override', 'test_subtheme'), t('Base theme\'s default settings values can be overridden by subtheme.'));
 | 
			
		||||
    $this->assertIdentical(theme_get_setting('basetheme_only', 'test_subtheme'), 'base theme value', t('Base theme\'s default settings values are inherited by subtheme.'));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,6 +19,8 @@ function theme_test_theme($existing, $type, $theme, $path) {
 | 
			
		|||
 */
 | 
			
		||||
function theme_test_system_theme_info() {
 | 
			
		||||
  $themes['test_theme'] = drupal_get_path('module', 'theme_test') . '/themes/test_theme/test_theme.info';
 | 
			
		||||
  $themes['test_basetheme'] = drupal_get_path('module', 'theme_test') . '/themes/test_basetheme/test_basetheme.info';
 | 
			
		||||
  $themes['test_subtheme'] = drupal_get_path('module', 'theme_test') . '/themes/test_subtheme/test_subtheme.info';
 | 
			
		||||
  return $themes;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
name = Theme test base theme
 | 
			
		||||
description = Test theme which acts as a base theme for other test subthemes.
 | 
			
		||||
core = 8.x
 | 
			
		||||
hidden = TRUE
 | 
			
		||||
 | 
			
		||||
settings[basetheme_only] = base theme value
 | 
			
		||||
settings[subtheme_override] = base theme value
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
name = Theme test subtheme
 | 
			
		||||
description = Test theme which uses test_basetheme as the base theme.
 | 
			
		||||
core = 8.x
 | 
			
		||||
base theme = test_basetheme
 | 
			
		||||
hidden = TRUE
 | 
			
		||||
 | 
			
		||||
settings[subtheme_override] = subtheme value
 | 
			
		||||
| 
						 | 
				
			
			@ -14,3 +14,5 @@ hidden = TRUE
 | 
			
		|||
; version from being loaded, and that errors aren't caused by the lack of this
 | 
			
		||||
; file within the theme folder.
 | 
			
		||||
stylesheets[all][] = system.base.css
 | 
			
		||||
 | 
			
		||||
settings[theme_test_setting] = default value
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											Binary file not shown.
										
									
								
							| 
						 | 
				
			
			@ -0,0 +1,522 @@
 | 
			
		|||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * Database additions for language tests. Used in upgrade.language.test.
 | 
			
		||||
 *
 | 
			
		||||
 * This dump only contains data and schema components relevant for language
 | 
			
		||||
 * functionality. The drupal-7.filled.database.php file is imported before
 | 
			
		||||
 * this dump, so the two form the database structure expected in tests
 | 
			
		||||
 * altogether.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
// Add blocks respective for language functionality.
 | 
			
		||||
db_insert('block')->fields(array(
 | 
			
		||||
  'module',
 | 
			
		||||
  'delta',
 | 
			
		||||
  'theme',
 | 
			
		||||
  'status',
 | 
			
		||||
  'weight',
 | 
			
		||||
  'region',
 | 
			
		||||
  'custom',
 | 
			
		||||
  'visibility',
 | 
			
		||||
  'pages',
 | 
			
		||||
  'title',
 | 
			
		||||
  'cache',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'module' => 'locale',
 | 
			
		||||
  'delta' => 'language',
 | 
			
		||||
  'theme' => 'bartik',
 | 
			
		||||
  'status' => '0',
 | 
			
		||||
  'weight' => '0',
 | 
			
		||||
  'region' => '-1',
 | 
			
		||||
  'custom' => '0',
 | 
			
		||||
  'visibility' => '0',
 | 
			
		||||
  'pages' => '',
 | 
			
		||||
  'title' => '',
 | 
			
		||||
  'cache' => '-1',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'module' => 'locale',
 | 
			
		||||
  'delta' => 'language',
 | 
			
		||||
  'theme' => 'seven',
 | 
			
		||||
  'status' => '0',
 | 
			
		||||
  'weight' => '0',
 | 
			
		||||
  'region' => '-1',
 | 
			
		||||
  'custom' => '0',
 | 
			
		||||
  'visibility' => '0',
 | 
			
		||||
  'pages' => '',
 | 
			
		||||
  'title' => '',
 | 
			
		||||
  'cache' => '-1',
 | 
			
		||||
))
 | 
			
		||||
->execute();
 | 
			
		||||
 | 
			
		||||
// Add language table from locale.install schema and prefill with some default
 | 
			
		||||
// languages for testing.
 | 
			
		||||
db_create_table('languages', array(
 | 
			
		||||
  'fields' => array(
 | 
			
		||||
    'language' => array(
 | 
			
		||||
      'type' => 'varchar',
 | 
			
		||||
      'length' => 12,
 | 
			
		||||
      'not null' => TRUE,
 | 
			
		||||
      'default' => '',
 | 
			
		||||
    ),
 | 
			
		||||
    'name' => array(
 | 
			
		||||
      'type' => 'varchar',
 | 
			
		||||
      'length' => 64,
 | 
			
		||||
      'not null' => TRUE,
 | 
			
		||||
      'default' => '',
 | 
			
		||||
    ),
 | 
			
		||||
    'native' => array(
 | 
			
		||||
      'type' => 'varchar',
 | 
			
		||||
      'length' => 64,
 | 
			
		||||
      'not null' => TRUE,
 | 
			
		||||
      'default' => '',
 | 
			
		||||
    ),
 | 
			
		||||
    'direction' => array(
 | 
			
		||||
      'type' => 'int',
 | 
			
		||||
      'not null' => TRUE,
 | 
			
		||||
      'default' => 0,
 | 
			
		||||
    ),
 | 
			
		||||
    'enabled' => array(
 | 
			
		||||
      'type' => 'int',
 | 
			
		||||
      'not null' => TRUE,
 | 
			
		||||
      'default' => 0,
 | 
			
		||||
    ),
 | 
			
		||||
    'plurals' => array(
 | 
			
		||||
      'type' => 'int',
 | 
			
		||||
      'not null' => TRUE,
 | 
			
		||||
      'default' => 0,
 | 
			
		||||
    ),
 | 
			
		||||
    'formula' => array(
 | 
			
		||||
      'type' => 'varchar',
 | 
			
		||||
      'length' => 128,
 | 
			
		||||
      'not null' => TRUE,
 | 
			
		||||
      'default' => '',
 | 
			
		||||
    ),
 | 
			
		||||
    'domain' => array(
 | 
			
		||||
      'type' => 'varchar',
 | 
			
		||||
      'length' => 128,
 | 
			
		||||
      'not null' => TRUE,
 | 
			
		||||
      'default' => '',
 | 
			
		||||
    ),
 | 
			
		||||
    'prefix' => array(
 | 
			
		||||
      'type' => 'varchar',
 | 
			
		||||
      'length' => 128,
 | 
			
		||||
      'not null' => TRUE,
 | 
			
		||||
      'default' => '',
 | 
			
		||||
    ),
 | 
			
		||||
    'weight' => array(
 | 
			
		||||
      'type' => 'int',
 | 
			
		||||
      'not null' => TRUE,
 | 
			
		||||
      'default' => 0,
 | 
			
		||||
    ),
 | 
			
		||||
    'javascript' => array(
 | 
			
		||||
      'type' => 'varchar',
 | 
			
		||||
      'length' => 64,
 | 
			
		||||
      'not null' => TRUE,
 | 
			
		||||
      'default' => '',
 | 
			
		||||
    ),
 | 
			
		||||
  ),
 | 
			
		||||
  'primary key' => array(
 | 
			
		||||
    'language',
 | 
			
		||||
  ),
 | 
			
		||||
  'indexes' => array(
 | 
			
		||||
    'list' => array(
 | 
			
		||||
      'weight',
 | 
			
		||||
      'name',
 | 
			
		||||
    ),
 | 
			
		||||
  ),
 | 
			
		||||
  'module' => 'locale',
 | 
			
		||||
  'name' => 'languages',
 | 
			
		||||
));
 | 
			
		||||
db_insert('languages')->fields(array(
 | 
			
		||||
  'language',
 | 
			
		||||
  'name',
 | 
			
		||||
  'native',
 | 
			
		||||
  'direction',
 | 
			
		||||
  'enabled',
 | 
			
		||||
  'plurals',
 | 
			
		||||
  'formula',
 | 
			
		||||
  'domain',
 | 
			
		||||
  'prefix',
 | 
			
		||||
  'weight',
 | 
			
		||||
  'javascript',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'language' => 'ca',
 | 
			
		||||
  'name' => 'Catalan',
 | 
			
		||||
  'native' => 'Català',
 | 
			
		||||
  'direction' => '0',
 | 
			
		||||
  'enabled' => '1',
 | 
			
		||||
  'plurals' => '2',
 | 
			
		||||
  'formula' => '($n>1)',
 | 
			
		||||
  'domain' => '',
 | 
			
		||||
  'prefix' => 'ca',
 | 
			
		||||
  'weight' => '0',
 | 
			
		||||
  'javascript' => '',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'language' => 'cv',
 | 
			
		||||
  'name' => 'Chuvash',
 | 
			
		||||
  'native' => 'Chuvash',
 | 
			
		||||
  'direction' => '0',
 | 
			
		||||
  'enabled' => '1',
 | 
			
		||||
  'plurals' => '0',
 | 
			
		||||
  'formula' => '',
 | 
			
		||||
  'domain' => '',
 | 
			
		||||
  'prefix' => 'cv',
 | 
			
		||||
  'weight' => '0',
 | 
			
		||||
  'javascript' => '',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'language' => 'en',
 | 
			
		||||
  'name' => 'English',
 | 
			
		||||
  'native' => 'English',
 | 
			
		||||
  'direction' => '0',
 | 
			
		||||
  'enabled' => '1',
 | 
			
		||||
  'plurals' => '0',
 | 
			
		||||
  'formula' => '',
 | 
			
		||||
  'domain' => '',
 | 
			
		||||
  'prefix' => '',
 | 
			
		||||
  'weight' => '0',
 | 
			
		||||
  'javascript' => '',
 | 
			
		||||
))
 | 
			
		||||
->execute();
 | 
			
		||||
 | 
			
		||||
// Add locales_source table from locale.install schema and fill with some
 | 
			
		||||
// sample data for testing.
 | 
			
		||||
db_create_table('locales_source', array(
 | 
			
		||||
  'fields' => array(
 | 
			
		||||
    'lid' => array(
 | 
			
		||||
      'type' => 'serial',
 | 
			
		||||
      'not null' => TRUE,
 | 
			
		||||
    ),
 | 
			
		||||
    'location' => array(
 | 
			
		||||
      'type' => 'text',
 | 
			
		||||
      'not null' => FALSE,
 | 
			
		||||
      'size' => 'big',
 | 
			
		||||
    ),
 | 
			
		||||
    'textgroup' => array(
 | 
			
		||||
      'type' => 'varchar',
 | 
			
		||||
      'length' => 255,
 | 
			
		||||
      'not null' => TRUE,
 | 
			
		||||
      'default' => 'default',
 | 
			
		||||
    ),
 | 
			
		||||
    'source' => array(
 | 
			
		||||
      'type' => 'text',
 | 
			
		||||
      'mysql_type' => 'blob',
 | 
			
		||||
      'not null' => TRUE,
 | 
			
		||||
    ),
 | 
			
		||||
    'context' => array(
 | 
			
		||||
      'type' => 'varchar',
 | 
			
		||||
      'length' => 255,
 | 
			
		||||
      'not null' => TRUE,
 | 
			
		||||
      'default' => '',
 | 
			
		||||
    ),
 | 
			
		||||
    'version' => array(
 | 
			
		||||
      'type' => 'varchar',
 | 
			
		||||
      'length' => 20,
 | 
			
		||||
      'not null' => TRUE,
 | 
			
		||||
      'default' => 'none',
 | 
			
		||||
    ),
 | 
			
		||||
  ),
 | 
			
		||||
  'primary key' => array(
 | 
			
		||||
    'lid',
 | 
			
		||||
  ),
 | 
			
		||||
  'indexes' => array(
 | 
			
		||||
    'source_context' => array(
 | 
			
		||||
      array(
 | 
			
		||||
        'source',
 | 
			
		||||
        30,
 | 
			
		||||
      ),
 | 
			
		||||
      'context',
 | 
			
		||||
    ),
 | 
			
		||||
  ),
 | 
			
		||||
  'module' => 'locale',
 | 
			
		||||
  'name' => 'locales_source',
 | 
			
		||||
));
 | 
			
		||||
db_insert('locales_source')->fields(array(
 | 
			
		||||
  'lid',
 | 
			
		||||
  'location',
 | 
			
		||||
  'textgroup',
 | 
			
		||||
  'source',
 | 
			
		||||
  'context',
 | 
			
		||||
  'version',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'lid' => '1',
 | 
			
		||||
  'location' => 'misc/drupal.js',
 | 
			
		||||
  'textgroup' => 'default',
 | 
			
		||||
  'source' => 'An AJAX HTTP error occurred.',
 | 
			
		||||
  'context' => '',
 | 
			
		||||
  'version' => 'none',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'lid' => '2',
 | 
			
		||||
  'location' => 'misc/drupal.js',
 | 
			
		||||
  'textgroup' => 'default',
 | 
			
		||||
  'source' => 'HTTP Result Code: !status',
 | 
			
		||||
  'context' => '',
 | 
			
		||||
  'version' => 'none',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'lid' => '3',
 | 
			
		||||
  'location' => 'misc/drupal.js',
 | 
			
		||||
  'textgroup' => 'default',
 | 
			
		||||
  'source' => 'An AJAX HTTP request terminated abnormally.',
 | 
			
		||||
  'context' => '',
 | 
			
		||||
  'version' => 'none',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'lid' => '4',
 | 
			
		||||
  'location' => 'misc/drupal.js',
 | 
			
		||||
  'textgroup' => 'default',
 | 
			
		||||
  'source' => 'Debugging information follows.',
 | 
			
		||||
  'context' => '',
 | 
			
		||||
  'version' => 'none',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'lid' => '5',
 | 
			
		||||
  'location' => 'misc/drupal.js',
 | 
			
		||||
  'textgroup' => 'default',
 | 
			
		||||
  'source' => 'Path: !uri',
 | 
			
		||||
  'context' => '',
 | 
			
		||||
  'version' => 'none',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'lid' => '6',
 | 
			
		||||
  'location' => 'misc/drupal.js',
 | 
			
		||||
  'textgroup' => 'default',
 | 
			
		||||
  'source' => 'StatusText: !statusText',
 | 
			
		||||
  'context' => '',
 | 
			
		||||
  'version' => 'none',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'lid' => '7',
 | 
			
		||||
  'location' => 'misc/drupal.js',
 | 
			
		||||
  'textgroup' => 'default',
 | 
			
		||||
  'source' => 'ResponseText: !responseText',
 | 
			
		||||
  'context' => '',
 | 
			
		||||
  'version' => 'none',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'lid' => '8',
 | 
			
		||||
  'location' => 'misc/drupal.js',
 | 
			
		||||
  'textgroup' => 'default',
 | 
			
		||||
  'source' => 'ReadyState: !readyState',
 | 
			
		||||
  'context' => '',
 | 
			
		||||
  'version' => 'none',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'lid' => '9',
 | 
			
		||||
  'location' => 'modules/overlay/overlay-parent.js',
 | 
			
		||||
  'textgroup' => 'default',
 | 
			
		||||
  'source' => '@title dialog',
 | 
			
		||||
  'context' => '',
 | 
			
		||||
  'version' => 'none',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'lid' => '10',
 | 
			
		||||
  'location' => 'modules/contextual/contextual.js',
 | 
			
		||||
  'textgroup' => 'default',
 | 
			
		||||
  'source' => 'Configure',
 | 
			
		||||
  'context' => '',
 | 
			
		||||
  'version' => 'none',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'lid' => '11',
 | 
			
		||||
  'location' => 'modules/toolbar/toolbar.js',
 | 
			
		||||
  'textgroup' => 'default',
 | 
			
		||||
  'source' => 'Show shortcuts',
 | 
			
		||||
  'context' => '',
 | 
			
		||||
  'version' => 'none',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'lid' => '12',
 | 
			
		||||
  'location' => 'modules/toolbar/toolbar.js',
 | 
			
		||||
  'textgroup' => 'default',
 | 
			
		||||
  'source' => 'Hide shortcuts',
 | 
			
		||||
  'context' => '',
 | 
			
		||||
  'version' => 'none',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'lid' => '13',
 | 
			
		||||
  'location' => 'modules/overlay/overlay-child.js',
 | 
			
		||||
  'textgroup' => 'default',
 | 
			
		||||
  'source' => 'Loading',
 | 
			
		||||
  'context' => '',
 | 
			
		||||
  'version' => 'none',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'lid' => '14',
 | 
			
		||||
  'location' => 'modules/overlay/overlay-child.js',
 | 
			
		||||
  'textgroup' => 'default',
 | 
			
		||||
  'source' => '(active tab)',
 | 
			
		||||
  'context' => '',
 | 
			
		||||
  'version' => 'none',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'lid' => '15',
 | 
			
		||||
  'location' => 'misc/tabledrag.js',
 | 
			
		||||
  'textgroup' => 'default',
 | 
			
		||||
  'source' => 'Re-order rows by numerical weight instead of dragging.',
 | 
			
		||||
  'context' => '',
 | 
			
		||||
  'version' => 'none',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'lid' => '16',
 | 
			
		||||
  'location' => 'misc/tabledrag.js',
 | 
			
		||||
  'textgroup' => 'default',
 | 
			
		||||
  'source' => 'Show row weights',
 | 
			
		||||
  'context' => '',
 | 
			
		||||
  'version' => 'none',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'lid' => '17',
 | 
			
		||||
  'location' => 'misc/tabledrag.js',
 | 
			
		||||
  'textgroup' => 'default',
 | 
			
		||||
  'source' => 'Hide row weights',
 | 
			
		||||
  'context' => '',
 | 
			
		||||
  'version' => 'none',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'lid' => '18',
 | 
			
		||||
  'location' => 'misc/tabledrag.js',
 | 
			
		||||
  'textgroup' => 'default',
 | 
			
		||||
  'source' => 'Drag to re-order',
 | 
			
		||||
  'context' => '',
 | 
			
		||||
  'version' => 'none',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'lid' => '19',
 | 
			
		||||
  'location' => 'misc/tabledrag.js',
 | 
			
		||||
  'textgroup' => 'default',
 | 
			
		||||
  'source' => 'Changes made in this table will not be saved until the form is submitted.',
 | 
			
		||||
  'context' => '',
 | 
			
		||||
  'version' => 'none',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'lid' => '20',
 | 
			
		||||
  'location' => 'misc/collapse.js',
 | 
			
		||||
  'textgroup' => 'default',
 | 
			
		||||
  'source' => 'Hide',
 | 
			
		||||
  'context' => '',
 | 
			
		||||
  'version' => 'none',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'lid' => '21',
 | 
			
		||||
  'location' => 'misc/collapse.js',
 | 
			
		||||
  'textgroup' => 'default',
 | 
			
		||||
  'source' => 'Show',
 | 
			
		||||
  'context' => '',
 | 
			
		||||
  'version' => 'none',
 | 
			
		||||
))
 | 
			
		||||
->execute();
 | 
			
		||||
 | 
			
		||||
// Add locales_target table from locale.install schema.
 | 
			
		||||
db_create_table('locales_target', array(
 | 
			
		||||
  'fields' => array(
 | 
			
		||||
    'lid' => array(
 | 
			
		||||
      'type' => 'int',
 | 
			
		||||
      'not null' => TRUE,
 | 
			
		||||
      'default' => 0,
 | 
			
		||||
    ),
 | 
			
		||||
    'translation' => array(
 | 
			
		||||
      'type' => 'text',
 | 
			
		||||
      'mysql_type' => 'blob',
 | 
			
		||||
      'not null' => TRUE,
 | 
			
		||||
    ),
 | 
			
		||||
    'language' => array(
 | 
			
		||||
      'type' => 'varchar',
 | 
			
		||||
      'length' => 12,
 | 
			
		||||
      'not null' => TRUE,
 | 
			
		||||
      'default' => '',
 | 
			
		||||
    ),
 | 
			
		||||
    'plid' => array(
 | 
			
		||||
      'type' => 'int',
 | 
			
		||||
      'not null' => TRUE,
 | 
			
		||||
      'default' => 0,
 | 
			
		||||
    ),
 | 
			
		||||
    'plural' => array(
 | 
			
		||||
      'type' => 'int',
 | 
			
		||||
      'not null' => TRUE,
 | 
			
		||||
      'default' => 0,
 | 
			
		||||
    ),
 | 
			
		||||
  ),
 | 
			
		||||
  'primary key' => array(
 | 
			
		||||
    'language',
 | 
			
		||||
    'lid',
 | 
			
		||||
    'plural',
 | 
			
		||||
  ),
 | 
			
		||||
  'foreign keys' => array(
 | 
			
		||||
    'locales_source' => array(
 | 
			
		||||
      'table' => 'locales_source',
 | 
			
		||||
      'columns' => array(
 | 
			
		||||
        'lid' => 'lid',
 | 
			
		||||
      ),
 | 
			
		||||
    ),
 | 
			
		||||
  ),
 | 
			
		||||
  'indexes' => array(
 | 
			
		||||
    'lid' => array(
 | 
			
		||||
      'lid',
 | 
			
		||||
    ),
 | 
			
		||||
    'plid' => array(
 | 
			
		||||
      'plid',
 | 
			
		||||
    ),
 | 
			
		||||
    'plural' => array(
 | 
			
		||||
      'plural',
 | 
			
		||||
    ),
 | 
			
		||||
  ),
 | 
			
		||||
  'module' => 'locale',
 | 
			
		||||
  'name' => 'locales_target',
 | 
			
		||||
));
 | 
			
		||||
 | 
			
		||||
// Set up variables needed for language support.
 | 
			
		||||
db_insert('variable')->fields(array(
 | 
			
		||||
  'name',
 | 
			
		||||
  'value',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'name' => 'javascript_parsed',
 | 
			
		||||
  'value' => 'a:16:{i:0;s:14:"misc/drupal.js";i:1;s:14:"misc/jquery.js";i:2;s:19:"misc/jquery.once.js";s:10:"refresh:ca";s:7:"waiting";i:3;s:29:"misc/ui/jquery.ui.core.min.js";i:4;s:21:"misc/jquery.ba-bbq.js";i:5;s:33:"modules/overlay/overlay-parent.js";i:6;s:32:"modules/contextual/contextual.js";i:7;s:21:"misc/jquery.cookie.js";i:8;s:26:"modules/toolbar/toolbar.js";i:9;s:32:"modules/overlay/overlay-child.js";i:10;s:19:"misc/tableheader.js";i:11;s:17:"misc/tabledrag.js";i:12;s:12:"misc/form.js";i:13;s:16:"misc/collapse.js";s:10:"refresh:cv";s:7:"waiting";}',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'name' => 'language_count',
 | 
			
		||||
  'value' => 'i:3;',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'name' => 'language_default',
 | 
			
		||||
  'value' => 'O:8:"stdClass":7:{s:8:"langcode";s:2:"ca";s:4:"name";s:7:"Catalan";s:9:"direction";i:0;s:7:"enabled";b:1;s:6:"weight";i:0;s:7:"default";b:1;s:6:"is_new";b:1;}',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'name' => 'language_negotiation_language',
 | 
			
		||||
  'value' => 'a:5:{s:10:"locale-url";a:2:{s:9:"callbacks";a:3:{s:8:"language";s:24:"locale_language_from_url";s:8:"switcher";s:28:"locale_language_switcher_url";s:11:"url_rewrite";s:31:"locale_language_url_rewrite_url";}s:4:"file";s:19:"includes/locale.inc";}s:14:"locale-session";a:2:{s:9:"callbacks";a:3:{s:8:"language";s:28:"locale_language_from_session";s:8:"switcher";s:32:"locale_language_switcher_session";s:11:"url_rewrite";s:35:"locale_language_url_rewrite_session";}s:4:"file";s:19:"includes/locale.inc";}s:11:"locale-user";a:2:{s:9:"callbacks";a:1:{s:8:"language";s:25:"locale_language_from_user";}s:4:"file";s:19:"includes/locale.inc";}s:14:"locale-browser";a:3:{s:9:"callbacks";a:1:{s:8:"language";s:28:"locale_language_from_browser";}s:4:"file";s:19:"includes/locale.inc";s:5:"cache";i:0;}s:16:"language-default";a:1:{s:9:"callbacks";a:1:{s:8:"language";s:21:"language_from_default";}}}',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'name' => 'language_negotiation_language_content',
 | 
			
		||||
  'value' => 'a:1:{s:16:"locale-interface";a:2:{s:9:"callbacks";a:1:{s:8:"language";s:30:"locale_language_from_interface";}s:4:"file";s:19:"includes/locale.inc";}}',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'name' => 'language_negotiation_language_url',
 | 
			
		||||
  'value' => 'a:2:{s:10:"locale-url";a:2:{s:9:"callbacks";a:3:{s:8:"language";s:24:"locale_language_from_url";s:8:"switcher";s:28:"locale_language_switcher_url";s:11:"url_rewrite";s:31:"locale_language_url_rewrite_url";}s:4:"file";s:19:"includes/locale.inc";}s:19:"locale-url-fallback";a:2:{s:9:"callbacks";a:1:{s:8:"language";s:28:"locale_language_url_fallback";}s:4:"file";s:19:"includes/locale.inc";}}',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'name' => 'language_types',
 | 
			
		||||
  'value' => 'a:3:{s:8:"language";b:1;s:16:"language_content";b:0;s:12:"language_url";b:0;}',
 | 
			
		||||
))
 | 
			
		||||
->values(array(
 | 
			
		||||
  'name' => 'locale_language_providers_weight_language',
 | 
			
		||||
  'value' => 'a:5:{s:10:"locale-url";s:2:"-8";s:14:"locale-session";s:2:"-6";s:11:"locale-user";s:2:"-4";s:14:"locale-browser";s:2:"-2";s:16:"language-default";s:2:"10";}',
 | 
			
		||||
))
 | 
			
		||||
->execute();
 | 
			
		||||
 | 
			
		||||
// Enable the locale module.
 | 
			
		||||
db_update('system')->fields(array(
 | 
			
		||||
  'status' => 1,
 | 
			
		||||
  'schema_version' => '7001',
 | 
			
		||||
))
 | 
			
		||||
->condition('type', 'module')
 | 
			
		||||
->condition('name', 'locale')
 | 
			
		||||
->execute();
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,44 @@
 | 
			
		|||
<?php
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * Upgrade tests for the Language module.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tests upgrading a filled database with language data.
 | 
			
		||||
 *
 | 
			
		||||
 * Loads a filled installation of Drupal 7 with language data and runs the
 | 
			
		||||
 * upgrade process on it.
 | 
			
		||||
 */
 | 
			
		||||
class LanguageUpgradePathTestCase extends UpgradePathTestCase {
 | 
			
		||||
  public static function getInfo() {
 | 
			
		||||
    return array(
 | 
			
		||||
      'name'  => 'Language upgrade test',
 | 
			
		||||
      'description'  => 'Upgrade tests with language data.',
 | 
			
		||||
      'group' => 'Upgrade path',
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public function setUp() {
 | 
			
		||||
    // Path to the database dump files.
 | 
			
		||||
    $this->databaseDumpFiles = array(
 | 
			
		||||
      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-7.filled.database.php.gz',
 | 
			
		||||
      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-7.language.database.php',
 | 
			
		||||
    );
 | 
			
		||||
    parent::setUp();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Tests a successful upgrade.
 | 
			
		||||
   */
 | 
			
		||||
  public function testLanguageUpgrade() {
 | 
			
		||||
    $this->assertTrue($this->performUpgrade(), t('The upgrade was completed successfully.'));
 | 
			
		||||
 | 
			
		||||
    // Ensure Catalan was properly upgraded to be the new default language.
 | 
			
		||||
    $this->assertTrue(language_default()->langcode == 'ca', t('Catalan is the default language'));
 | 
			
		||||
    $languages = language_list();
 | 
			
		||||
    foreach ($languages as $language) {
 | 
			
		||||
      $this->assertTrue($language->default == ($language->langcode == 'ca'), t('@language default property properly set', array('@language' => $language->name)));
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -243,9 +243,9 @@ abstract class UpgradePathTestCase extends DrupalWebTestCase {
 | 
			
		|||
   *   TRUE if the upgrade succeeded, FALSE otherwise.
 | 
			
		||||
   */
 | 
			
		||||
  protected function performUpgrade($register_errors = TRUE) {
 | 
			
		||||
    $update_url = $GLOBALS['base_url'] . '/core/update.php';
 | 
			
		||||
 | 
			
		||||
    // Load the first update screen.
 | 
			
		||||
    $update_url = $GLOBALS['base_url'] . '/core/update.php';
 | 
			
		||||
    $this->drupalGet($update_url, array('external' => TRUE));
 | 
			
		||||
    if (!$this->assertResponse(200)) {
 | 
			
		||||
      return FALSE;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -369,7 +369,7 @@ function system_theme_settings($form, &$form_state, $key = '') {
 | 
			
		|||
  // Default settings are defined in theme_get_setting() in includes/theme.inc
 | 
			
		||||
  if ($key) {
 | 
			
		||||
    $var = 'theme_' . $key . '_settings';
 | 
			
		||||
    $themes = system_rebuild_theme_data();
 | 
			
		||||
    $themes = list_themes();
 | 
			
		||||
    $features = $themes[$key]->info['features'];
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -790,7 +790,8 @@ function hook_menu_get_item_alter(&$router_item, $path, $original_map) {
 | 
			
		|||
 *       "default" task, which should display the same page as the parent item.
 | 
			
		||||
 *     If the "type" element is omitted, MENU_NORMAL_ITEM is assumed.
 | 
			
		||||
 *   - "options": An array of options to be passed to l() when generating a link
 | 
			
		||||
 *     from this menu item.
 | 
			
		||||
 *     from this menu item. Note that the "options" parameter has no effect on
 | 
			
		||||
 *     MENU_LOCAL_TASK, MENU_DEFAULT_LOCAL_TASK, and MENU_LOCAL_ACTION items.
 | 
			
		||||
 *
 | 
			
		||||
 * For a detailed usage example, see page_example.module.
 | 
			
		||||
 * For comprehensive documentation on the menu system, see
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2581,7 +2581,7 @@ function _system_rebuild_theme_data() {
 | 
			
		|||
  // Now that we've established all our master themes, go back and fill in data
 | 
			
		||||
  // for subthemes.
 | 
			
		||||
  foreach ($sub_themes as $key) {
 | 
			
		||||
    $themes[$key]->base_themes = system_find_base_themes($themes, $key);
 | 
			
		||||
    $themes[$key]->base_themes = drupal_find_base_themes($themes, $key);
 | 
			
		||||
    // Don't proceed if there was a problem with the root base theme.
 | 
			
		||||
    if (!current($themes[$key]->base_themes)) {
 | 
			
		||||
      continue;
 | 
			
		||||
| 
						 | 
				
			
			@ -2673,47 +2673,6 @@ function _system_default_theme_features() {
 | 
			
		|||
  );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Find all the base themes for the specified theme.
 | 
			
		||||
 *
 | 
			
		||||
 * Themes can inherit templates and function implementations from earlier themes.
 | 
			
		||||
 *
 | 
			
		||||
 * @param $themes
 | 
			
		||||
 *   An array of available themes.
 | 
			
		||||
 * @param $key
 | 
			
		||||
 *   The name of the theme whose base we are looking for.
 | 
			
		||||
 * @param $used_keys
 | 
			
		||||
 *   A recursion parameter preventing endless loops.
 | 
			
		||||
 * @return
 | 
			
		||||
 *   Returns an array of all of the theme's ancestors; the first element's value
 | 
			
		||||
 *   will be NULL if an error occurred.
 | 
			
		||||
 */
 | 
			
		||||
function system_find_base_themes($themes, $key, $used_keys = array()) {
 | 
			
		||||
  $base_key = $themes[$key]->info['base theme'];
 | 
			
		||||
  // Does the base theme exist?
 | 
			
		||||
  if (!isset($themes[$base_key])) {
 | 
			
		||||
    return array($base_key => NULL);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  $current_base_theme = array($base_key => $themes[$base_key]->info['name']);
 | 
			
		||||
 | 
			
		||||
  // Is the base theme itself a child of another theme?
 | 
			
		||||
  if (isset($themes[$base_key]->info['base theme'])) {
 | 
			
		||||
    // Do we already know the base themes of this theme?
 | 
			
		||||
    if (isset($themes[$base_key]->base_themes)) {
 | 
			
		||||
      return $themes[$base_key]->base_themes + $current_base_theme;
 | 
			
		||||
    }
 | 
			
		||||
    // Prevent loops.
 | 
			
		||||
    if (!empty($used_keys[$base_key])) {
 | 
			
		||||
      return array($base_key => NULL);
 | 
			
		||||
    }
 | 
			
		||||
    $used_keys[$base_key] = TRUE;
 | 
			
		||||
    return system_find_base_themes($themes, $base_key, $used_keys) + $current_base_theme;
 | 
			
		||||
  }
 | 
			
		||||
  // If we get here, then this is our parent theme.
 | 
			
		||||
  return $current_base_theme;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Get a list of available regions from a specified theme.
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2109,7 +2109,7 @@ class UpdateScriptFunctionalTest extends DrupalWebTestCase {
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  function setUp() {
 | 
			
		||||
    parent::setUp('update_script_test');
 | 
			
		||||
    parent::setUp(array('update_script_test', 'dblog'));
 | 
			
		||||
    $this->update_url = $GLOBALS['base_url'] . '/core/update.php';
 | 
			
		||||
    $this->update_user = $this->drupalCreateUser(array('administer software updates'));
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -2210,6 +2210,56 @@ class UpdateScriptFunctionalTest extends DrupalWebTestCase {
 | 
			
		|||
    $final_theme_data = db_query("SELECT * FROM {system} WHERE type = 'theme' ORDER BY name")->fetchAll();
 | 
			
		||||
    $this->assertEqual($original_theme_data, $final_theme_data, t('Visiting update.php does not alter the information about themes stored in the database.'));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Tests update.php when there are no updates to apply.
 | 
			
		||||
   */
 | 
			
		||||
  function testNoUpdateFunctionality() {
 | 
			
		||||
    // Click through update.php with 'administer software updates' permission.
 | 
			
		||||
    $this->drupalLogin($this->update_user);
 | 
			
		||||
    $this->drupalPost($this->update_url, array(), t('Continue'), array('external' => TRUE));
 | 
			
		||||
    $this->assertText(t('No pending updates.'));
 | 
			
		||||
    $this->assertNoLink('Administration pages');
 | 
			
		||||
    $this->clickLink('Front page');
 | 
			
		||||
    $this->assertResponse(200);
 | 
			
		||||
 | 
			
		||||
    // Click through update.php with 'access administration pages' permission.
 | 
			
		||||
    $admin_user = $this->drupalCreateUser(array('administer software updates', 'access administration pages'));
 | 
			
		||||
    $this->drupalLogin($admin_user);
 | 
			
		||||
    $this->drupalPost($this->update_url, array(), t('Continue'), array('external' => TRUE));
 | 
			
		||||
    $this->assertText(t('No pending updates.'));
 | 
			
		||||
    $this->clickLink('Administration pages');
 | 
			
		||||
    $this->assertResponse(200);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Tests update.php after performing a successful update.
 | 
			
		||||
   */
 | 
			
		||||
  function testSuccessfulUpdateFunctionality() {
 | 
			
		||||
    drupal_set_installed_schema_version('update_script_test', drupal_get_installed_schema_version('update_script_test') - 1);
 | 
			
		||||
    // Click through update.php with 'administer software updates' permission.
 | 
			
		||||
    $this->drupalLogin($this->update_user);
 | 
			
		||||
    $this->drupalPost($this->update_url, array(), t('Continue'), array('external' => TRUE));
 | 
			
		||||
    $this->drupalPost(NULL, array(), t('Apply pending updates'));
 | 
			
		||||
    $this->assertText('Updates were attempted.');
 | 
			
		||||
    $this->assertLink('site');
 | 
			
		||||
    $this->assertNoLink('Administration pages');
 | 
			
		||||
    $this->assertNoLink('logged');
 | 
			
		||||
    $this->clickLink('Front page');
 | 
			
		||||
    $this->assertResponse(200);
 | 
			
		||||
 | 
			
		||||
    drupal_set_installed_schema_version('update_script_test', drupal_get_installed_schema_version('update_script_test') - 1);
 | 
			
		||||
    // Click through update.php with 'access administration pages' and
 | 
			
		||||
    // 'access site reports' permissions.
 | 
			
		||||
    $admin_user = $this->drupalCreateUser(array('administer software updates', 'access administration pages', 'access site reports'));
 | 
			
		||||
    $this->drupalLogin($admin_user);
 | 
			
		||||
    $this->drupalPost($this->update_url, array(), t('Continue'), array('external' => TRUE));
 | 
			
		||||
    $this->drupalPost(NULL, array(), t('Apply pending updates'));
 | 
			
		||||
    $this->assertText('Updates were attempted.');
 | 
			
		||||
    $this->assertLink('logged');
 | 
			
		||||
    $this->clickLink('Administration pages');
 | 
			
		||||
    $this->assertResponse(200);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -231,7 +231,6 @@ th.checkbox {
 | 
			
		|||
  border-color: #666;
 | 
			
		||||
  margin: 0 0.2em;
 | 
			
		||||
  -moz-border-radius: 3px;
 | 
			
		||||
  -webkit-border-radius: 3px;
 | 
			
		||||
  border-radius: 3px;
 | 
			
		||||
}
 | 
			
		||||
.progress .filled {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -210,7 +210,7 @@ function taxonomy_field_extra_fields() {
 | 
			
		|||
 * @param $limit
 | 
			
		||||
 *   Integer. The maximum number of nodes to find.
 | 
			
		||||
 *   Set to FALSE for no limit.
 | 
			
		||||
 * @order
 | 
			
		||||
 * @param $order
 | 
			
		||||
 *   An array of fields and directions.
 | 
			
		||||
 *
 | 
			
		||||
 * @return
 | 
			
		||||
| 
						 | 
				
			
			@ -1483,6 +1483,10 @@ function taxonomy_field_formatter_info() {
 | 
			
		|||
      'label' => t('Plain text'),
 | 
			
		||||
      'field types' => array('taxonomy_term_reference'),
 | 
			
		||||
    ),
 | 
			
		||||
    'taxonomy_term_reference_rss_category' => array(
 | 
			
		||||
      'label' => t('RSS category'),
 | 
			
		||||
      'field types' => array('taxonomy_term_reference'),
 | 
			
		||||
    ),
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1525,6 +1529,18 @@ function taxonomy_field_formatter_view($entity_type, $entity, $field, $instance,
 | 
			
		|||
        );
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case 'taxonomy_term_reference_rss_category':
 | 
			
		||||
      foreach ($items as $delta => $item) {
 | 
			
		||||
        $entity->rss_elements[] = array(
 | 
			
		||||
          'key' => 'category',
 | 
			
		||||
          'value' => $item['tid'] != 'autocreate' ? $item['taxonomy_term']->name : $item['name'],
 | 
			
		||||
          'attributes' => array(
 | 
			
		||||
            'domain' => $item['tid'] != 'autocreate' ? url('taxonomy/term/' . $item['tid'], array('absolute' => TRUE)) : '',
 | 
			
		||||
          ),
 | 
			
		||||
        );
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return $element;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -108,7 +108,13 @@ function taxonomy_term_feed($term) {
 | 
			
		|||
 * @see taxonomy_field_widget_info()
 | 
			
		||||
 */
 | 
			
		||||
function taxonomy_autocomplete($field_name, $tags_typed = '') {
 | 
			
		||||
  $field = field_info_field($field_name);
 | 
			
		||||
  // Make sure the field exists and is a taxonomy field.
 | 
			
		||||
  if (!($field = field_info_field($field_name)) || $field['type'] !== 'taxonomy_term_reference') {
 | 
			
		||||
    // Error string. The JavaScript handler will realize this is not JSON and
 | 
			
		||||
    // will display it as debugging information.
 | 
			
		||||
    print t('Taxonomy field @field_name not found.', array('@field_name' => $field_name));
 | 
			
		||||
    exit;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // The user enters a comma-separated list of tags. We only autocomplete the last tag.
 | 
			
		||||
  $tags_typed = drupal_explode_tags($tags_typed);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -706,6 +706,14 @@ class TaxonomyTermTestCase extends TaxonomyWebTestCase {
 | 
			
		|||
    $input = substr($term_objects['term4']->name, 0, 3);
 | 
			
		||||
    $this->drupalGet('taxonomy/autocomplete/taxonomy_' . $this->vocabulary->machine_name . '/' . $input);
 | 
			
		||||
    $this->assertRaw('{"' . $term_objects['term4']->name . '":"' . $term_objects['term4']->name . '"}', t('Autocomplete returns term %term_name after typing the first 3 letters.', array('%term_name' => $term_objects['term4']->name)));
 | 
			
		||||
 | 
			
		||||
     // Test taxonomy autocomplete with a nonexistent field.
 | 
			
		||||
     $field_name = $this->randomName();
 | 
			
		||||
     $tag = $this->randomName();
 | 
			
		||||
     $message = t("Taxonomy field @field_name not found.", array('@field_name' => $field_name));
 | 
			
		||||
     $this->assertFalse(field_info_field($field_name), t('Field %field_name does not exist.', array('%field_name' => $field_name)));
 | 
			
		||||
     $this->drupalGet('taxonomy/autocomplete/' . $field_name . '/' . $tag);
 | 
			
		||||
     $this->assertRaw($message, t('Autocomplete returns correct error message when the taxonomy field does not exist.'));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
| 
						 | 
				
			
			@ -928,6 +936,99 @@ class TaxonomyTermTestCase extends TaxonomyWebTestCase {
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tests the rendering of term reference fields in RSS feeds.
 | 
			
		||||
 */
 | 
			
		||||
class TaxonomyRSSTestCase extends TaxonomyWebTestCase {
 | 
			
		||||
 | 
			
		||||
  public static function getInfo() {
 | 
			
		||||
    return array(
 | 
			
		||||
      'name' => 'Taxonomy RSS Content.',
 | 
			
		||||
      'description' => 'Ensure that data added as terms appears in RSS feeds if "RSS Category" format is selected.',
 | 
			
		||||
      'group' => 'Taxonomy',
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  function setUp() {
 | 
			
		||||
    parent::setUp('taxonomy');
 | 
			
		||||
    $this->admin_user = $this->drupalCreateUser(array('administer taxonomy', 'bypass node access', 'administer content types'));
 | 
			
		||||
    $this->drupalLogin($this->admin_user);
 | 
			
		||||
    $this->vocabulary = $this->createVocabulary();
 | 
			
		||||
 | 
			
		||||
    $field = array(
 | 
			
		||||
      'field_name' => 'taxonomy_' . $this->vocabulary->machine_name,
 | 
			
		||||
      'type' => 'taxonomy_term_reference',
 | 
			
		||||
      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
 | 
			
		||||
      'settings' => array(
 | 
			
		||||
        'allowed_values' => array(
 | 
			
		||||
          array(
 | 
			
		||||
            'vocabulary' => $this->vocabulary->machine_name,
 | 
			
		||||
            'parent' => 0,
 | 
			
		||||
          ),
 | 
			
		||||
        ),
 | 
			
		||||
      ),
 | 
			
		||||
    );
 | 
			
		||||
    field_create_field($field);
 | 
			
		||||
 | 
			
		||||
    $this->instance = array(
 | 
			
		||||
      'field_name' => 'taxonomy_' . $this->vocabulary->machine_name,
 | 
			
		||||
      'bundle' => 'article',
 | 
			
		||||
      'entity_type' => 'node',
 | 
			
		||||
      'widget' => array(
 | 
			
		||||
        'type' => 'options_select',
 | 
			
		||||
      ),
 | 
			
		||||
      'display' => array(
 | 
			
		||||
        'default' => array(
 | 
			
		||||
          'type' => 'taxonomy_term_reference_link',
 | 
			
		||||
        ),
 | 
			
		||||
      ),
 | 
			
		||||
    );
 | 
			
		||||
    field_create_instance($this->instance);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Tests that terms added to nodes are displayed in core RSS feed.
 | 
			
		||||
   *
 | 
			
		||||
   * Create a node and assert that taxonomy terms appear in rss.xml.
 | 
			
		||||
   */
 | 
			
		||||
  function testTaxonomyRSS() {
 | 
			
		||||
    // Create two taxonomy terms.
 | 
			
		||||
    $term1 = $this->createTerm($this->vocabulary);
 | 
			
		||||
 | 
			
		||||
    // RSS display must be added manually.
 | 
			
		||||
    $this->drupalGet("admin/structure/types/manage/article/display");
 | 
			
		||||
    $edit = array(
 | 
			
		||||
      "view_modes_custom[rss]" => '1',
 | 
			
		||||
    );
 | 
			
		||||
    $this->drupalPost(NULL, $edit, t('Save'));
 | 
			
		||||
 | 
			
		||||
    // Change the format to 'RSS category'.
 | 
			
		||||
    $this->drupalGet("admin/structure/types/manage/article/display/rss");
 | 
			
		||||
    $edit = array(
 | 
			
		||||
      "fields[taxonomy_" . $this->vocabulary->machine_name . "][type]" => 'taxonomy_term_reference_rss_category',
 | 
			
		||||
    );
 | 
			
		||||
    $this->drupalPost(NULL, $edit, t('Save'));
 | 
			
		||||
 | 
			
		||||
    // Post an article.
 | 
			
		||||
    $edit = array();
 | 
			
		||||
    $langcode = LANGUAGE_NONE;
 | 
			
		||||
    $edit["title"] = $this->randomName();
 | 
			
		||||
    $edit[$this->instance['field_name'] . '[' . $langcode .'][]'] = $term1->tid;
 | 
			
		||||
    $this->drupalPost('node/add/article', $edit, t('Save'));
 | 
			
		||||
 | 
			
		||||
    // Check that the term is displayed when the RSS feed is viewed.
 | 
			
		||||
    $this->drupalGet('rss.xml');
 | 
			
		||||
    $test_element = array(
 | 
			
		||||
      'key' => 'category',
 | 
			
		||||
      'value' => $term1->name,
 | 
			
		||||
      'attributes' => array(
 | 
			
		||||
        'domain' => url('taxonomy/term/' . $term1->tid, array('absolute' => TRUE)),
 | 
			
		||||
      ),
 | 
			
		||||
    );
 | 
			
		||||
    $this->assertRaw(format_xml_elements(array($test_element)), 'Term is displayed when viewing the rss feed.');
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tests the hook implementations that maintain the taxonomy index.
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -109,7 +109,6 @@ body.toolbar-drawer {
 | 
			
		|||
#toolbar div.toolbar-menu ul li a {
 | 
			
		||||
  padding: 0 10px;
 | 
			
		||||
  -moz-border-radius: 10px;
 | 
			
		||||
  -webkit-border-radius: 10px;
 | 
			
		||||
  border-radius: 10px;
 | 
			
		||||
}
 | 
			
		||||
#toolbar div.toolbar-menu ul li a:focus,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -139,7 +139,7 @@ function translation_form_node_form_alter(&$form, &$form_state) {
 | 
			
		|||
    // might need to distinguish between enabled and disabled languages, hence
 | 
			
		||||
    // we divide them in two option groups.
 | 
			
		||||
    if ($translator_widget) {
 | 
			
		||||
      $options = array($groups[1] => array(LANGUAGE_NONE => t('Language neutral')));
 | 
			
		||||
      $options = array($groups[1] => array(LANGUAGE_NONE => t('- None -')));
 | 
			
		||||
      foreach (array(1, 0) as $status) {
 | 
			
		||||
        $group = $groups[$status];
 | 
			
		||||
        foreach ($grouped_languages[$status] as $langcode => $language) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -58,10 +58,8 @@
 | 
			
		|||
  background: rgba(255, 255, 255, 0.7);
 | 
			
		||||
  text-shadow: 0 1px #eee;
 | 
			
		||||
  -moz-border-radius-topleft: 8px;
 | 
			
		||||
  -webkit-border-top-left-radius: 8px;
 | 
			
		||||
  border-top-left-radius: 8px;
 | 
			
		||||
  -moz-border-radius-topright: 8px;
 | 
			
		||||
  -webkit-border-top-right-radius: 8px;
 | 
			
		||||
  border-top-right-radius: 8px;
 | 
			
		||||
}
 | 
			
		||||
#preview-main-menu-links a:hover,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,7 +16,10 @@ blockquote:before {
 | 
			
		|||
blockquote:after {
 | 
			
		||||
  content: "\201C";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
tr td,
 | 
			
		||||
tr th {
 | 
			
		||||
  text-align: right;
 | 
			
		||||
}
 | 
			
		||||
/* ------------------ List Styles ------------------ */
 | 
			
		||||
 | 
			
		||||
.region-content ul,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -86,7 +86,6 @@ kbd {
 | 
			
		|||
  display: inline-block;
 | 
			
		||||
  padding: 0 6px;
 | 
			
		||||
  -moz-border-radius: 5px;
 | 
			
		||||
  -webkit-border-radius: 5px;
 | 
			
		||||
  border-radius: 5px;
 | 
			
		||||
}
 | 
			
		||||
pre {
 | 
			
		||||
| 
						 | 
				
			
			@ -279,10 +278,6 @@ ul.tips {
 | 
			
		|||
  padding: 1px 10px 2px 10px;
 | 
			
		||||
  text-decoration: none;
 | 
			
		||||
  -moz-border-radius: 0 0 10px 10px;
 | 
			
		||||
  -webkit-border-top-left-radius: 0;
 | 
			
		||||
  -webkit-border-top-right-radius: 0;
 | 
			
		||||
  -webkit-border-bottom-left-radius: 10px;
 | 
			
		||||
  -webkit-border-bottom-right-radius: 10px;
 | 
			
		||||
  border-radius: 0 0 10px 10px;
 | 
			
		||||
}
 | 
			
		||||
#skip-link a:hover,
 | 
			
		||||
| 
						 | 
				
			
			@ -480,8 +475,6 @@ h1#site-name {
 | 
			
		|||
  text-shadow: 0 1px #eee;
 | 
			
		||||
  -moz-border-radius-topleft: 8px;
 | 
			
		||||
  -moz-border-radius-topright: 8px;
 | 
			
		||||
  -webkit-border-top-left-radius: 8px;
 | 
			
		||||
  -webkit-border-top-right-radius: 8px;
 | 
			
		||||
  border-top-left-radius: 8px;
 | 
			
		||||
  border-top-right-radius: 8px;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -979,10 +972,8 @@ ul.links {
 | 
			
		|||
  margin: 0;
 | 
			
		||||
  text-shadow: 0 1px 0 #fff;
 | 
			
		||||
  -moz-border-radius-topleft: 6px;
 | 
			
		||||
  -webkit-border-top-left-radius: 6px;
 | 
			
		||||
  border-top-left-radius: 6px;
 | 
			
		||||
  -moz-border-radius-topright: 6px;
 | 
			
		||||
  -webkit-border-top-right-radius: 6px;
 | 
			
		||||
  border-top-right-radius: 6px;
 | 
			
		||||
}
 | 
			
		||||
.tabs ul.primary li.active a {
 | 
			
		||||
| 
						 | 
				
			
			@ -1009,7 +1000,6 @@ ul.links {
 | 
			
		|||
  background: #f2f2f2;
 | 
			
		||||
  border-bottom: none;
 | 
			
		||||
  -moz-border-radius: 5px;
 | 
			
		||||
  -webkit-border-radius: 5px;
 | 
			
		||||
  border-radius: 5px;
 | 
			
		||||
}
 | 
			
		||||
ul.action-links {
 | 
			
		||||
| 
						 | 
				
			
			@ -1094,7 +1084,6 @@ a.button {
 | 
			
		|||
  margin-right: 0.6em; /* LTR */
 | 
			
		||||
  padding: 4px 17px;
 | 
			
		||||
  -moz-border-radius: 20px;
 | 
			
		||||
  -webkit-border-radius: 15px;
 | 
			
		||||
  border-radius: 15px;
 | 
			
		||||
}
 | 
			
		||||
a.button:link,
 | 
			
		||||
| 
						 | 
				
			
			@ -1117,7 +1106,6 @@ fieldset {
 | 
			
		|||
  position: relative;
 | 
			
		||||
  top: 12px; /* Offsets the negative margin of legends */
 | 
			
		||||
  -moz-border-radius: 4px;
 | 
			
		||||
  -webkit-border-radius: 4px;
 | 
			
		||||
  border-radius: 4px;
 | 
			
		||||
}
 | 
			
		||||
.fieldset-wrapper {
 | 
			
		||||
| 
						 | 
				
			
			@ -1131,8 +1119,6 @@ fieldset {
 | 
			
		|||
  padding: 1em 0 0.2em;
 | 
			
		||||
  -moz-border-radius-topright: 0;
 | 
			
		||||
  -moz-border-radius-topleft: 0;
 | 
			
		||||
  -webkit-border-top-left-radius: 0;
 | 
			
		||||
  -webkit-border-top-right-radius: 0;
 | 
			
		||||
  border-top-left-radius: 0;
 | 
			
		||||
  border-top-right-radius: 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1152,7 +1138,6 @@ fieldset {
 | 
			
		|||
fieldset.collapsed {
 | 
			
		||||
  background: transparent;
 | 
			
		||||
  -moz-border-radius: 0;
 | 
			
		||||
  -webkit-border-radius: 0;
 | 
			
		||||
  border-radius: 0;
 | 
			
		||||
}
 | 
			
		||||
fieldset legend {
 | 
			
		||||
| 
						 | 
				
			
			@ -1172,15 +1157,12 @@ fieldset legend {
 | 
			
		|||
  top: -12px;
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  -moz-border-radius-topleft: 4px;
 | 
			
		||||
  -webkit-border-top-left-radius: 4px;
 | 
			
		||||
  border-top-left-radius: 4px;
 | 
			
		||||
  -moz-border-radius-topright: 4px;
 | 
			
		||||
  -webkit-border-top-right-radius: 4px;
 | 
			
		||||
  border-top-right-radius: 4px;
 | 
			
		||||
}
 | 
			
		||||
fieldset.collapsed legend {
 | 
			
		||||
  -moz-border-radius: 4px;
 | 
			
		||||
  -webkit-border-radius: 4px;
 | 
			
		||||
  border-radius: 4px;
 | 
			
		||||
}
 | 
			
		||||
fieldset legend a {
 | 
			
		||||
| 
						 | 
				
			
			@ -1251,27 +1233,22 @@ input.form-submit:focus {
 | 
			
		|||
.contact-form #edit-name {
 | 
			
		||||
  width: 75%;
 | 
			
		||||
  -moz-border-radius: 4px;
 | 
			
		||||
  -webkit-border-radius: 4px;
 | 
			
		||||
  border-radius: 4px;
 | 
			
		||||
}
 | 
			
		||||
.contact-form #edit-mail {
 | 
			
		||||
  width: 75%;
 | 
			
		||||
  -moz-border-radius: 4px;
 | 
			
		||||
  -webkit-border-radius: 4px;
 | 
			
		||||
  border-radius: 4px;
 | 
			
		||||
}
 | 
			
		||||
.contact-form #edit-subject {
 | 
			
		||||
  width: 75%;
 | 
			
		||||
  -moz-border-radius: 4px;
 | 
			
		||||
  -webkit-border-radius: 4px;
 | 
			
		||||
  border-radius: 4px;
 | 
			
		||||
}
 | 
			
		||||
.contact-form #edit-message {
 | 
			
		||||
  width: 76.3%;
 | 
			
		||||
  -moz-border-radius-topleft: 4px;
 | 
			
		||||
  -moz-border-radius-topright: 4px;
 | 
			
		||||
  -webkit-border-top-left-radius: 4px;
 | 
			
		||||
  -webkit-border-top-right-radius: 4px;
 | 
			
		||||
  border-top-left-radius: 4px;
 | 
			
		||||
  border-top-right-radius: 4px;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1279,8 +1256,6 @@ input.form-submit:focus {
 | 
			
		|||
  width: 76%;
 | 
			
		||||
  -moz-border-radius-bottomleft: 4px;
 | 
			
		||||
  -moz-border-radius-bottomright: 4px;
 | 
			
		||||
  -webkit-border-bottom-left-radius: 4px;
 | 
			
		||||
  -webkit-border-bottom-right-radius: 4px;
 | 
			
		||||
  border-bottom-left-radius: 4px;
 | 
			
		||||
  border-bottom-right-radius: 4px;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1323,7 +1298,6 @@ input.form-button-disabled:active,
 | 
			
		|||
.comment-form .form-select {
 | 
			
		||||
  margin: 0;
 | 
			
		||||
  -moz-border-radius: 4px;
 | 
			
		||||
  -webkit-border-radius: 4px;
 | 
			
		||||
  border-radius: 4px;
 | 
			
		||||
}
 | 
			
		||||
.comment-form .form-type-textarea label {
 | 
			
		||||
| 
						 | 
				
			
			@ -1368,8 +1342,6 @@ input.form-button-disabled:active,
 | 
			
		|||
.comment-form .form-textarea {
 | 
			
		||||
  -moz-border-radius-topleft: 4px;
 | 
			
		||||
  -moz-border-radius-topright: 4px;
 | 
			
		||||
  -webkit-border-top-left-radius: 4px;
 | 
			
		||||
  -webkit-border-top-right-radius: 4px;
 | 
			
		||||
  border-top-left-radius: 4px;
 | 
			
		||||
  border-top-right-radius: 4px;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -73,8 +73,12 @@ function bartik_process_page(&$variables) {
 | 
			
		|||
 * Implements hook_preprocess_maintenance_page().
 | 
			
		||||
 */
 | 
			
		||||
function bartik_preprocess_maintenance_page(&$variables) {
 | 
			
		||||
  // By default, site_name is set to Drupal if no db connection is available
 | 
			
		||||
  // or during site installation. Setting site_name to an empty string makes
 | 
			
		||||
  // the site and update pages look cleaner.
 | 
			
		||||
  // @see template_preprocess_maintenance_page
 | 
			
		||||
  if (!$variables['db_is_active']) {
 | 
			
		||||
    unset($variables['site_name']);
 | 
			
		||||
    $variables['site_name'] = '';
 | 
			
		||||
  }
 | 
			
		||||
  drupal_add_css(drupal_get_path('theme', 'bartik') . '/css/maintenance-page.css');
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -304,10 +304,8 @@
 | 
			
		|||
  line-height: 20px;
 | 
			
		||||
  border-bottom: solid 1px #ccc;
 | 
			
		||||
  -moz-border-radius-bottomleft: 0;
 | 
			
		||||
  -webkit-border-bottom-left-radius: 0;
 | 
			
		||||
  border-bottom-left-radius: 0;
 | 
			
		||||
  -moz-border-radius-bottomright: 0;
 | 
			
		||||
  -webkit-border-bottom-right-radius: 0;
 | 
			
		||||
  border-bottom-right-radius: 0;
 | 
			
		||||
}
 | 
			
		||||
.ui-tabs .ui-tabs-nav li {
 | 
			
		||||
| 
						 | 
				
			
			@ -319,7 +317,6 @@
 | 
			
		|||
  float: none;
 | 
			
		||||
  padding: 0 10px;
 | 
			
		||||
  -moz-border-radius: 10px;
 | 
			
		||||
  -webkit-border-radius: 10px;
 | 
			
		||||
  border-radius: 10px;
 | 
			
		||||
}
 | 
			
		||||
.ui-tabs .ui-tabs-nav li.ui-tabs-selected a {
 | 
			
		||||
| 
						 | 
				
			
			@ -366,7 +363,6 @@
 | 
			
		|||
  border-right-color: #D2D2D2;
 | 
			
		||||
  background: url(images/buttons.png) 0 0 repeat-x;
 | 
			
		||||
  -moz-border-radius: 20px;
 | 
			
		||||
  -webkit-border-radius: 20px;
 | 
			
		||||
  border-radius: 20px;
 | 
			
		||||
}
 | 
			
		||||
.ui-dialog .ui-dialog-buttonpane button:active {
 | 
			
		||||
| 
						 | 
				
			
			@ -398,7 +394,6 @@
 | 
			
		|||
  border-right-color: #D2D2D2;
 | 
			
		||||
  background: url(images/buttons.png) 0 0 repeat-x;
 | 
			
		||||
  -moz-border-radius: 4px;
 | 
			
		||||
  -webkit-border-radius: 4px;
 | 
			
		||||
  border-radius: 4px;
 | 
			
		||||
}
 | 
			
		||||
.ui-slider a.ui-state-active,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -166,10 +166,6 @@ pre {
 | 
			
		|||
  padding: 1px 10px 2px 10px; /* LTR */
 | 
			
		||||
  text-decoration: none;
 | 
			
		||||
  -moz-border-radius: 0 0 10px 10px;
 | 
			
		||||
  -webkit-border-top-left-radius: 0;
 | 
			
		||||
  -webkit-border-top-right-radius: 0;
 | 
			
		||||
  -webkit-border-bottom-left-radius: 10px;
 | 
			
		||||
  -webkit-border-bottom-right-radius: 10px;
 | 
			
		||||
  border-radius: 0 0 10px 10px;
 | 
			
		||||
}
 | 
			
		||||
#skip-link a:hover,
 | 
			
		||||
| 
						 | 
				
			
			@ -288,8 +284,6 @@ ul.primary li.active a {
 | 
			
		|||
  border-style: solid;
 | 
			
		||||
  border-color: #a6a7a2;
 | 
			
		||||
  -moz-border-radius: 8px 8px 0 0;
 | 
			
		||||
  -webkit-border-top-left-radius: 8px;
 | 
			
		||||
  -webkit-border-top-right-radius: 8px;
 | 
			
		||||
  border-radius: 8px 8px 0 0;
 | 
			
		||||
}
 | 
			
		||||
ul.primary li.active a,
 | 
			
		||||
| 
						 | 
				
			
			@ -331,7 +325,6 @@ ul.secondary li.active a,
 | 
			
		|||
ul.secondary li.active a.active {
 | 
			
		||||
  padding: 2px 10px;
 | 
			
		||||
  -moz-border-radius: 7px;
 | 
			
		||||
  -webkit-border-radius: 7px;
 | 
			
		||||
  border-radius: 7px;
 | 
			
		||||
}
 | 
			
		||||
ul.secondary li a:hover,
 | 
			
		||||
| 
						 | 
				
			
			@ -368,7 +361,6 @@ ul.secondary li.active a.active {
 | 
			
		|||
  width: 80px;
 | 
			
		||||
  overflow: hidden;
 | 
			
		||||
  -moz-border-radius: 5px;
 | 
			
		||||
  -webkit-border-radius: 5px;
 | 
			
		||||
  border-radius: 5px;
 | 
			
		||||
}
 | 
			
		||||
#secondary-links ul.links li a:hover {
 | 
			
		||||
| 
						 | 
				
			
			@ -663,7 +655,6 @@ a.button {
 | 
			
		|||
  border-right-color: #d2d2d2;
 | 
			
		||||
  background: url(images/buttons.png) 0 0 repeat-x;
 | 
			
		||||
  -moz-border-radius: 20px;
 | 
			
		||||
  -webkit-border-radius: 20px;
 | 
			
		||||
  border-radius: 20px;
 | 
			
		||||
}
 | 
			
		||||
a.button:link,
 | 
			
		||||
| 
						 | 
				
			
			@ -1003,6 +994,5 @@ div.add-or-remove-shortcuts {
 | 
			
		|||
  background-color: #59a0d8;
 | 
			
		||||
  color: #fff;
 | 
			
		||||
  -moz-border-radius: 8px;
 | 
			
		||||
  -webkit-border-radius: 8px;
 | 
			
		||||
  border-radius: 8px;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -148,7 +148,9 @@ function update_helpful_links() {
 | 
			
		|||
  // NOTE: we can't use l() here because the URL would point to
 | 
			
		||||
  // 'core/update.php?q=admin'.
 | 
			
		||||
  $links[] = '<a href="' . base_path() . '">Front page</a>';
 | 
			
		||||
  if (user_access('access administration pages')) {
 | 
			
		||||
    $links[] = '<a href="' . base_path() . '?q=admin">Administration pages</a>';
 | 
			
		||||
  }
 | 
			
		||||
  return $links;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -158,7 +160,7 @@ function update_results_page() {
 | 
			
		|||
 | 
			
		||||
  update_task_list();
 | 
			
		||||
  // Report end result.
 | 
			
		||||
  if (module_exists('dblog')) {
 | 
			
		||||
  if (module_exists('dblog') && user_access('access site reports')) {
 | 
			
		||||
    $log_message = ' All errors have been <a href="' . base_path() . '?q=admin/reports/dblog">logged</a>.';
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
| 
						 | 
				
			
			@ -166,7 +168,7 @@ function update_results_page() {
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  if ($_SESSION['update_success']) {
 | 
			
		||||
    $output = '<p>Updates were attempted. If you see no failures below, you may proceed happily to the <a href="' . base_path() . '?q=admin">administration pages</a>. Otherwise, you may need to update your database manually.' . $log_message . '</p>';
 | 
			
		||||
    $output = '<p>Updates were attempted. If you see no failures below, you may proceed happily back to your <a href="' . base_path() . '">site</a>. Otherwise, you may need to update your database manually.' . $log_message . '</p>';
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    list($module, $version) = array_pop(reset($_SESSION['updates_remaining']));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,3 +4,4 @@ package = Testing
 | 
			
		|||
version = VERSION
 | 
			
		||||
core = 8.x
 | 
			
		||||
hidden = TRUE
 | 
			
		||||
files[] = drupal_system_listing_compatible_test.test
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,37 @@
 | 
			
		|||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Helper to verify tests in installation profile modules.
 | 
			
		||||
 */
 | 
			
		||||
class DrupalSystemListingCompatibleTestCase extends DrupalWebTestCase {
 | 
			
		||||
  /**
 | 
			
		||||
   * Use the Minimal profile.
 | 
			
		||||
   *
 | 
			
		||||
   * This test needs to use a different installation profile than the test which
 | 
			
		||||
   * asserts that this test is found.
 | 
			
		||||
   *
 | 
			
		||||
   * @see SimpleTestInstallationProfileModuleTestsTestCase
 | 
			
		||||
   */
 | 
			
		||||
  protected $profile = 'minimal';
 | 
			
		||||
 | 
			
		||||
  public static function getInfo() {
 | 
			
		||||
    return array(
 | 
			
		||||
      'name' => 'Installation profile module tests helper',
 | 
			
		||||
      'description' => 'Verifies that tests in installation profile modules are found and may use another profile for running tests.',
 | 
			
		||||
      'group' => 'Installation profile',
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  function setUp() {
 | 
			
		||||
    // Attempt to install a module in Testing profile, while this test runs with
 | 
			
		||||
    // a different profile.
 | 
			
		||||
    parent::setUp(array('drupal_system_listing_compatible_test'));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Non-empty test* method required to executed the test case class.
 | 
			
		||||
   */
 | 
			
		||||
  function testDrupalSystemListing() {
 | 
			
		||||
    $this->pass(__CLASS__ . ' test executed.');
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -73,11 +73,13 @@
 | 
			
		|||
 * webserver.  For most other drivers, you must specify a
 | 
			
		||||
 * username, password, host, and database name.
 | 
			
		||||
 *
 | 
			
		||||
 * Some database engines support transactions.  In order to enable
 | 
			
		||||
 * transaction support for a given database, set the 'transactions' key
 | 
			
		||||
 * to TRUE.  To disable it, set it to FALSE.  Note that the default value
 | 
			
		||||
 * varies by driver.  For MySQL, the default is FALSE since MyISAM tables
 | 
			
		||||
 * do not support transactions.
 | 
			
		||||
 * Transaction support is enabled by default for all drivers that support it,
 | 
			
		||||
 * including MySQL. To explicitly disable it, set the 'transactions' key to
 | 
			
		||||
 * FALSE.
 | 
			
		||||
 * Note that some configurations of MySQL, such as the MyISAM engine, don't
 | 
			
		||||
 * support it and will proceed silently even if enabled. If you experience
 | 
			
		||||
 * transaction related crashes with such configuration, set the 'transactions'
 | 
			
		||||
 * key to FALSE.
 | 
			
		||||
 *
 | 
			
		||||
 * For each database, you may optionally specify multiple "target" databases.
 | 
			
		||||
 * A target database allows Drupal to try to send certain queries to a
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue