diff --git a/core/core.services.yml b/core/core.services.yml index 69e3ef2190a406160a6179877a048bb7b2f1f9b4..1449b3bbf22b5fe7e97fbd7e4005064f42b2f33c 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -286,7 +286,7 @@ services: - { name: persist } link_generator: class: Drupal\Core\Utility\LinkGenerator - arguments: ['@url_generator', '@module_handler', '@language_manager', '@path.alias_manager.cached'] + arguments: ['@url_generator', '@module_handler', '@language_manager'] calls: - [setRequest, ['@?request']] router.dynamic: diff --git a/core/includes/common.inc b/core/includes/common.inc index 36941822efea4ab481785826e255c191e442ac34..86fd220ac41cdeb7b92f7ee08beb4704c93f722d 100644 --- a/core/includes/common.inc +++ b/core/includes/common.inc @@ -1214,24 +1214,12 @@ function drupal_http_header_attributes(array $attributes = array()) { * internal to the site, $options['language'] is used to determine whether * the link is "active", or pointing to the current page (the language as * well as the path must match). This element is also used by url(). - * - 'set_active_class' (default FALSE): Whether l() should compare the $path, - * language and query options to the current URL to determine whether the - * link is "active". If so, an "active" class will be applied to the link. - * It is important to use this sparingly since it is usually unnecessary and - * requires extra processing. - * For anonymous users, the "active" class will be calculated on the server, - * because most sites serve each anonymous user the same cached page anyway. - * For authenticated users, the "active" class will be calculated on the - * client (through JavaScript), only data- attributes are added to links to - * prevent breaking the render cache. The JavaScript is added in - * system_page_build(). * - Additional $options elements used by the url() function. * * @return string * An HTML string containing a link to the given path. * * @see url() - * @see system_page_build() */ function l($text, $path, array $options = array()) { // Start building a structured representation of our link to be altered later. @@ -1247,7 +1235,6 @@ function l($text, $path, array $options = array()) { 'query' => array(), 'html' => FALSE, 'language' => NULL, - 'set_active_class' => FALSE, ); // Add a hreflang attribute if we know the language of this link's url and @@ -1256,21 +1243,35 @@ function l($text, $path, array $options = array()) { $variables['options']['attributes']['hreflang'] = $variables['options']['language']->id; } - // Set the "active" class if the 'set_active_class' option is not empty. - if (!empty($variables['options']['set_active_class'])) { - // Add a "data-drupal-link-query" attribute to let the drupal.active-link - // library know the query in a standardized manner. - if (!empty($variables['options']['query'])) { - $query = $variables['options']['query']; - ksort($query); - $variables['options']['attributes']['data-drupal-link-query'] = Json::encode($query); - } + // Because l() is called very often we statically cache values that require an + // extra function call. + static $drupal_static_fast; + if (!isset($drupal_static_fast['active'])) { + $drupal_static_fast['active'] = &drupal_static(__FUNCTION__); + } + $active = &$drupal_static_fast['active']; + if (!isset($active)) { + $active = array( + 'path' => current_path(), + 'front_page' => drupal_is_front_page(), + 'language' => language(Language::TYPE_URL)->id, + 'query' => \Drupal::service('request')->query->all(), + ); + } - // Add a "data-drupal-link-system-path" attribute to let the - // drupal.active-link library know the path in a standardized manner. - if (!isset($variables['options']['attributes']['data-drupal-link-system-path'])) { - $variables['options']['attributes']['data-drupal-link-system-path'] = \Drupal::service('path.alias_manager.cached')->getSystemPath($path); - } + // Determine whether this link is "active', meaning that it links to the + // current page. It is important that we stop checking "active" conditions if + // we know the link is not active. This helps ensure that l() remains fast. + // An active link's path is equal to the current path. + $variables['url_is_active'] = ($path == $active['path'] || ($path == '<front>' && $active['front_page'])) + // The language of an active link is equal to the current language. + && (empty($variables['options']['language']) || $variables['options']['language']->id == $active['language']) + // The query parameters of an active link are equal to the current parameters. + && ($variables['options']['query'] == $active['query']); + + // Add the "active" class if appropriate. + if ($variables['url_is_active']) { + $variables['options']['attributes']['class'][] = 'active'; } // Remove all HTML and PHP tags from a tooltip, calling expensive strip_tags() @@ -2148,7 +2149,6 @@ function drupal_add_js($data = NULL, $options = NULL) { // @todo Make this less hacky: http://drupal.org/node/1547376. $scriptPath = $GLOBALS['script_path']; $pathPrefix = ''; - $current_query = \Drupal::service('request')->query->all(); url('', array('script' => &$scriptPath, 'prefix' => &$pathPrefix)); $current_path = current_path(); $current_path_is_admin = FALSE; @@ -2156,20 +2156,13 @@ function drupal_add_js($data = NULL, $options = NULL) { if (!(defined('MAINTENANCE_MODE') && MAINTENANCE_MODE === 'update')) { $current_path_is_admin = path_is_admin($current_path); } - $path = array( + $javascript['settings']['data'][] = array( 'basePath' => base_path(), 'scriptPath' => $scriptPath, 'pathPrefix' => $pathPrefix, 'currentPath' => $current_path, 'currentPathIsAdmin' => $current_path_is_admin, - 'isFront' => drupal_is_front_page(), - 'currentLanguage' => \Drupal::languageManager()->getLanguage(Language::TYPE_URL)->id, ); - if (!empty($current_query)) { - ksort($current_query); - $path['currentQuery'] = (object) $current_query; - } - $javascript['settings']['data'][] = array('path' => $path); } // All JavaScript settings are placed in the header of the page with // the library weight so that inline scripts appear afterwards. diff --git a/core/includes/menu.inc b/core/includes/menu.inc index 208ef9bb5d4c23ec69769d6093ddf71a2f6fbfa5..856c424a1305b57acbfd560729959e6d41103fa2 100644 --- a/core/includes/menu.inc +++ b/core/includes/menu.inc @@ -1704,7 +1704,6 @@ function theme_menu_link(array $variables) { if ($element['#below']) { $sub_menu = drupal_render($element['#below']); } - $element['#localized_options']['set_active_class'] = TRUE; $output = l($element['#title'], $element['#href'], $element['#localized_options']); return '<li' . new Attribute($element['#attributes']) . '>' . $output . $sub_menu . "</li>\n"; } @@ -1740,8 +1739,6 @@ function theme_menu_local_task($variables) { $link['localized_options']['html'] = TRUE; $link_text = t('!local-task-title!active', array('!local-task-title' => $link['title'], '!active' => $active)); } - $link['localized_options']['set_active_class'] = TRUE; - if (!empty($link['href'])) { // @todo - remove this once all pages are converted to routes. $a_tag = l($link_text, $link['href'], $link['localized_options']); @@ -1773,7 +1770,6 @@ function theme_menu_local_action($variables) { ); $link['localized_options']['attributes']['class'][] = 'button'; $link['localized_options']['attributes']['class'][] = 'button-action'; - $link['localized_options']['set_active_class'] = TRUE; $output = '<li>'; // @todo Remove this check and the call to l() when all pages are converted to diff --git a/core/includes/theme.inc b/core/includes/theme.inc index 65349a310cf905d8558d8863dad27880c587f5c2..37f04f90a39dde36f74c6026f2b066e0707310c3 100644 --- a/core/includes/theme.inc +++ b/core/includes/theme.inc @@ -1188,18 +1188,6 @@ function template_preprocess_status_messages(&$variables) { * l() as its $options parameter. * - attributes: A keyed array of attributes for the UL containing the * list of links. - * - set_active_class: (optional) Whether theme_links() should compare the - * route_name + route_parameters or href (path), language and query options - * to the current URL for each of the links, to determine whether the link - * is "active". If so, an "active" class will be applied to the list item - * containing the link. It is important to use this sparingly since it is - * usually unnecessary and requires extra processing. - * For anonymous users, the "active" class will be calculated on the server, - * because most sites serve each anonymous user the same cached page anyway. - * For authenticated users, the "active" class will be calculated on the - * client (through JavaScript), only data- attributes are added to list - * items to prevent breaking the render cache. The JavaScript is added in - * system_page_build(). * - heading: (optional) A heading to precede the links. May be an * associative array or a string. If it's an array, it can have the * following elements: @@ -1215,19 +1203,6 @@ function template_preprocess_status_messages(&$variables) { * navigate to or skip the links. See * http://juicystudio.com/article/screen-readers-display-none.php and * http://www.w3.org/TR/WCAG-TECHS/H42.html for more information. - * - * theme_links() unfortunately duplicates the "active" class handling of l() and - * LinkGenerator::generate() because it needs to be able to set the "active" - * class not on the links themselves ("a" tags), but on the list items ("li" - * tags) that contain the links. This is necessary for CSS to be able to style - * list items differently when the link is active, since CSS does not yet allow - * one to style list items only if it contains a certain element with a certain - * class. I.e. we cannot yet convert this jQuery selector to a CSS selector: - * jQuery('li:has("a.active")') - * - * @see l() - * @see \Drupal\Core\Utility\LinkGenerator::generate() - * @see system_page_build() */ function theme_links($variables) { $links = $variables['links']; @@ -1261,7 +1236,8 @@ function theme_links($variables) { $num_links = count($links); $i = 0; - $active_route = \Drupal::linkGenerator()->getActive(); + $active = \Drupal::linkGenerator()->getActive(); + $language_url = \Drupal::languageManager()->getLanguage(Language::TYPE_URL); foreach ($links as $key => $link) { $i++; @@ -1273,16 +1249,16 @@ function theme_links($variables) { 'ajax' => NULL, ); - $li_attributes = array('class' => array()); + $class = array(); // Use the array key as class name. - $li_attributes['class'][] = drupal_html_class($key); + $class[] = drupal_html_class($key); // Add odd/even, first, and last classes. - $li_attributes['class'][] = ($i % 2 ? 'odd' : 'even'); + $class[] = ($i % 2 ? 'odd' : 'even'); if ($i == 1) { - $li_attributes['class'][] = 'first'; + $class[] = 'first'; } if ($i == $num_links) { - $li_attributes['class'][] = 'last'; + $class[] = 'last'; } $link_element = array( @@ -1295,36 +1271,32 @@ function theme_links($variables) { '#ajax' => $link['ajax'], ); - // Handle links and ensure that the active class is added on the LIs, but - // only if the 'set_active_class' option is not empty. - if (isset($link['href']) || isset($link['route_name'])) { - if (!empty($variables['set_active_class'])) { - if (!empty($link['language'])) { - $li_attributes['hreflang'] = $link['language']->id; - } - - // Add a "data-drupal-link-query" attribute to let the - // drupal.active-link library know the query in a standardized manner. - if (!empty($link['query'])) { - $query = $link['query']; - ksort($query); - $li_attributes['data-drupal-link-query'] = Json::encode($query); - } - - if (isset($link['route_name'])) { - $path = \Drupal::service('url_generator')->getPathFromRoute($link['route_name'], $link['route_parameters']); - } - else { - $path = $link['href']; - } + // Handle links and ensure that the active class is added on the LIs. + if (isset($link['route_name'])) { + $variables = array( + 'options' => array(), + ); + if (!empty($link['language'])) { + $variables['options']['language'] = $link['language']; + } - // Add a "data-drupal-link-system-path" attribute to let the - // drupal.active-link library know the path in a standardized manner. - $li_attributes['data-drupal-link-system-path'] = \Drupal::service('path.alias_manager.cached')->getSystemPath($path); + if (($link['route_name'] == $active['route_name']) + // The language of an active link is equal to the current language. + && (empty($variables['options']['language']) || ($variables['options']['language']->id == $active['language'])) + && ($link['route_parameters'] == $active['parameters'])) { + $class[] = 'active'; } $item = drupal_render($link_element); } + elseif (isset($link['href'])) { + $is_current_path = ($link['href'] == current_path() || ($link['href'] == '<front>' && drupal_is_front_page())); + $is_current_language = (empty($link['language']) || $link['language']->id == $language_url->id); + if ($is_current_path && $is_current_language) { + $class[] = 'active'; + } + $item = drupal_render($link_element); + } // Handle title-only text items. else { // Merge in default array properties into $link. @@ -1337,7 +1309,7 @@ function theme_links($variables) { } } - $output .= '<li' . new Attribute($li_attributes) . '>'; + $output .= '<li' . new Attribute(array('class' => $class)) . '>'; $output .= $item; $output .= '</li>'; } @@ -2271,8 +2243,7 @@ function template_preprocess_page(&$variables) { '#heading' => array( 'text' => t('Main menu'), 'class' => array('visually-hidden'), - ), - '#set_active_class' => TRUE, + ) ); } if (!empty($variables['secondary_menu'])) { @@ -2282,8 +2253,7 @@ function template_preprocess_page(&$variables) { '#heading' => array( 'text' => t('Secondary menu'), 'class' => array('visually-hidden'), - ), - '#set_active_class' => TRUE, + ) ); } @@ -2613,7 +2583,7 @@ function drupal_common_theme() { 'template' => 'status-messages', ), 'links' => array( - 'variables' => array('links' => array(), 'attributes' => array('class' => array('links')), 'heading' => array(), 'set_active_class' => FALSE), + 'variables' => array('links' => array(), 'attributes' => array('class' => array('links')), 'heading' => array()), ), 'dropbutton_wrapper' => array( 'variables' => array('children' => NULL), diff --git a/core/lib/Drupal/Core/Utility/LinkGenerator.php b/core/lib/Drupal/Core/Utility/LinkGenerator.php index ba2b06e19d4601846de3e57f3030c431affca656..3f6362064ed5689274de64901423301adb3232d9 100644 --- a/core/lib/Drupal/Core/Utility/LinkGenerator.php +++ b/core/lib/Drupal/Core/Utility/LinkGenerator.php @@ -7,15 +7,12 @@ namespace Drupal\Core\Utility; -use Drupal\Component\Utility\Json; use Drupal\Component\Utility\String; use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Language\Language; use Drupal\Core\Language\LanguageManager; -use Drupal\Core\Path\AliasManagerInterface; use Drupal\Core\Template\Attribute; use Drupal\Core\Routing\UrlGeneratorInterface; -use Drupal\Core\Session\AccountInterface; use Symfony\Cmf\Component\Routing\RouteObjectInterface; use Symfony\Component\HttpFoundation\Request; @@ -24,6 +21,13 @@ */ class LinkGenerator implements LinkGeneratorInterface { + /** + * Stores some information about the current request, like the language. + * + * @var array + */ + protected $active; + /** * The url generator. * @@ -45,13 +49,6 @@ class LinkGenerator implements LinkGeneratorInterface { */ protected $languageManager; - /** - * The path alias manager. - * - * @var \Drupal\Core\Path\AliasManagerInterface - */ - protected $aliasManager; - /** * Constructs a LinkGenerator instance. * @@ -61,14 +58,11 @@ class LinkGenerator implements LinkGeneratorInterface { * The module handler. * @param \Drupal\Core\Language\LanguageManager $language_manager * The language manager. - * @param \Drupal\Core\Path\AliasManagerInterface $alias_manager - * The path alias manager. */ - public function __construct(UrlGeneratorInterface $url_generator, ModuleHandlerInterface $module_handler, LanguageManager $language_manager, AliasManagerInterface $alias_manager) { + public function __construct(UrlGeneratorInterface $url_generator, ModuleHandlerInterface $module_handler, LanguageManager $language_manager) { $this->urlGenerator = $url_generator; $this->moduleHandler = $module_handler; $this->languageManager = $language_manager; - $this->aliasManager = $alias_manager; } /** @@ -99,15 +93,6 @@ public function getActive() { /** * {@inheritdoc} - * - * For anonymous users, the "active" class will be calculated on the server, - * because most sites serve each anonymous user the same cached page anyway. - * For authenticated users, the "active" class will be calculated on the - * client (through JavaScript), only data- attributes are added to links to - * prevent breaking the render cache. The JavaScript is added in - * system_page_build(). - * - * @see system_page_build() */ public function generate($text, $route_name, array $parameters = array(), array $options = array()) { // Start building a structured representation of our link to be altered later. @@ -125,31 +110,30 @@ public function generate($text, $route_name, array $parameters = array(), array 'query' => array(), 'html' => FALSE, 'language' => NULL, - 'set_active_class' => FALSE, ); - // Add a hreflang attribute if we know the language of this link's url and // hreflang has not already been set. if (!empty($variables['options']['language']) && !isset($variables['options']['attributes']['hreflang'])) { $variables['options']['attributes']['hreflang'] = $variables['options']['language']->id; } - // Set the "active" class if the 'set_active_class' option is not empty. - if (!empty($variables['options']['set_active_class'])) { - // Add a "data-drupal-link-query" attribute to let the - // drupal.active-link library know the query in a standardized manner. - if (!empty($variables['options']['query'])) { - $query = $variables['options']['query']; - ksort($query); - $variables['options']['attributes']['data-drupal-link-query'] = Json::encode($query); - } - - // Add a "data-drupal-link-system-path" attribute to let the - // drupal.active-link library know the path in a standardized manner. - if (!isset($variables['options']['attributes']['data-drupal-link-system-path'])) { - $path = $this->urlGenerator->getPathFromRoute($route_name, $parameters); - $variables['options']['attributes']['data-drupal-link-system-path'] = $this->aliasManager->getSystemPath($path); - } + // This is only needed for the active class. The generator also combines + // the parameters and $options['query'] and adds parameters that are not + // path slugs as query strings. + $full_parameters = $parameters + (array) $variables['options']['query']; + + // Determine whether this link is "active", meaning that it has the same + // URL path and query string as the current page. Note that this may be + // removed from l() in https://drupal.org/node/1979468 and would be removed + // or altered here also. + $variables['url_is_active'] = $route_name == $this->active['route_name'] + // The language of an active link is equal to the current language. + && (empty($variables['options']['language']) || $variables['options']['language']->id == $this->active['language']) + && $full_parameters == $this->active['parameters']; + + // Add the "active" class if appropriate. + if ($variables['url_is_active']) { + $variables['options']['attributes']['class'][] = 'active'; } // Remove all HTML and PHP tags from a tooltip, calling expensive strip_tags() diff --git a/core/lib/Drupal/Core/Utility/LinkGeneratorInterface.php b/core/lib/Drupal/Core/Utility/LinkGeneratorInterface.php index b8328737ded33f90779ef9e7f48615ff0a6d5705..8bc7eb6cc6f28e08ccda074ba8afa98efe314d29 100644 --- a/core/lib/Drupal/Core/Utility/LinkGeneratorInterface.php +++ b/core/lib/Drupal/Core/Utility/LinkGeneratorInterface.php @@ -36,8 +36,8 @@ interface LinkGeneratorInterface { * @param array $options * (optional) An associative array of additional options. Defaults to an * empty array. It may contain the following elements: - * - 'query': An array of query key/value-pairs (without any URL-encoding) - * to append to the URL. + * - 'query': An array of query key/value-pairs (without any URL-encoding) to + * append to the URL. * - absolute: Whether to force the output to be an absolute link (beginning * with http:). Useful for links that will be displayed outside the site, * such as in an RSS feed. Defaults to FALSE. @@ -55,11 +55,6 @@ interface LinkGeneratorInterface { * internal to the site, $options['language'] is used to determine whether * the link is "active", or pointing to the current page (the language as * well as the path must match). - * - 'set_active_class' (default FALSE): Whether this method should compare - * the $route_name, $parameters, language and query options to the current - * URL to determine whether the link is "active". If so, an "active" class - * will be applied to the link. It is important to use this sparingly - * since it is usually unnecessary and requires extra processing. * * @return string * An HTML string containing a link to the given route and parameters. diff --git a/core/misc/active-link.js b/core/misc/active-link.js deleted file mode 100644 index cb1caa6bcd1c254874234885a6773be15bc39f5e..0000000000000000000000000000000000000000 --- a/core/misc/active-link.js +++ /dev/null @@ -1,63 +0,0 @@ -/** - * @file - * Attaches behaviors for Drupal's active link marking. - */ - -(function (Drupal, drupalSettings) { - -"use strict"; - -/** - * Append active class. - * - * The link is only active if its path corresponds to the current path, the - * language of the linked path is equal to the current language, and if the - * query parameters of the link equal those of the current request, since the - * same request with different query parameters may yield a different page - * (e.g. pagers, exposed View filters). - * - * Does not discriminate based on element type, so allows you to set the active - * class on any element: a, li… - */ -Drupal.behaviors.l = { - attach: function queryL (context) { - // Start by finding all potentially active links. - var path = drupalSettings.path; - var queryString = JSON.stringify(path.currentQuery); - var querySelector = path.currentQuery ? "[data-drupal-link-query='" + queryString + "']" : ':not([data-drupal-link-query])'; - var originalSelectors = ['[data-drupal-link-system-path="' + path.currentPath + '"]']; - var selectors; - - // If this is the front page, we have to check for the <front> path as well. - if (path.isFront) { - originalSelectors.push('[data-drupal-link-system-path="<front>"]'); - } - - // Add language filtering. - selectors = [].concat( - // Links without any hreflang attributes (most of them). - originalSelectors.map(function (selector) { return selector + ':not([hreflang])';}), - // Links with hreflang equals to the current language. - originalSelectors.map(function (selector) { return selector + '[hreflang="' + path.currentLanguage + '"]';}) - ); - - // Add query string selector for pagers, exposed filters. - selectors = selectors.map(function (current) { return current + querySelector; }); - - // Query the DOM. - var activeLinks = context.querySelectorAll(selectors.join(',')); - for (var i = 0, il = activeLinks.length; i < il; i += 1) { - activeLinks[i].classList.add('active'); - } - }, - detach: function (context, settings, trigger) { - if (trigger === 'unload') { - var activeLinks = context.querySelectorAll('[data-drupal-link-system-path].active'); - for (var i = 0, il = activeLinks.length; i < il; i += 1) { - activeLinks[i].classList.remove('active'); - } - } - } -}; - -})(Drupal, drupalSettings); diff --git a/core/misc/ajax.js b/core/misc/ajax.js index 2d9011ecef4ad76f72af9feaafd8878aad58024a..6ecde951719b7d4d037f9d74fbc5616b3ecd0c84 100644 --- a/core/misc/ajax.js +++ b/core/misc/ajax.js @@ -597,7 +597,7 @@ Drupal.AjaxCommands.prototype = { case 'empty': case 'remove': settings = response.settings || ajax.settings || drupalSettings; - Drupal.detachBehaviors(wrapper.get(0), settings); + Drupal.detachBehaviors(wrapper, settings); } // Add the new content to the page. @@ -625,7 +625,7 @@ Drupal.AjaxCommands.prototype = { if (new_content.parents('html').length > 0) { // Apply any settings from the returned JSON if available. settings = response.settings || ajax.settings || drupalSettings; - Drupal.attachBehaviors(new_content.get(0), settings); + Drupal.attachBehaviors(new_content, settings); } }, diff --git a/core/misc/drupal.js b/core/misc/drupal.js index e994ec669b56bc824075140d819b6c30b784ada7..6c04130376db497089ed9a467e56f611fe77b239 100644 --- a/core/misc/drupal.js +++ b/core/misc/drupal.js @@ -267,7 +267,7 @@ Drupal.t = function (str, args, options) { * Returns the URL to a Drupal page. */ Drupal.url = function (path) { - return drupalSettings.path.basePath + drupalSettings.path.scriptPath + path; + return drupalSettings.basePath + drupalSettings.scriptPath + path; }; /** diff --git a/core/modules/image/lib/Drupal/image/Tests/ImageFieldDisplayTest.php b/core/modules/image/lib/Drupal/image/Tests/ImageFieldDisplayTest.php index c8f205f6dc007d874a7234659b75b16baa8606b5..aa54d897689190b18da86ae0c5efc9c544bec5f7 100644 --- a/core/modules/image/lib/Drupal/image/Tests/ImageFieldDisplayTest.php +++ b/core/modules/image/lib/Drupal/image/Tests/ImageFieldDisplayTest.php @@ -113,7 +113,7 @@ function _testImageFieldFormatters($scheme) { '#width' => 40, '#height' => 20, ); - $default_output = l($image, 'node/' . $nid, array('html' => TRUE)); + $default_output = l($image, 'node/' . $nid, array('html' => TRUE, 'attributes' => array('class' => 'active'))); $this->drupalGet('node/' . $nid); $this->assertRaw($default_output, 'Image linked to content formatter displaying correctly on full node view.'); diff --git a/core/modules/language/language.negotiation.inc b/core/modules/language/language.negotiation.inc index f59a94ee8f616657e47414e8795b8632a8733341..f87284d76f27c1fd82e5cce5da29fb28a6c6e68d 100644 --- a/core/modules/language/language.negotiation.inc +++ b/core/modules/language/language.negotiation.inc @@ -399,7 +399,6 @@ function language_switcher_url($type, $path) { 'title' => $language->name, 'language' => $language, 'attributes' => array('class' => array('language-link')), - 'set_active_class' => TRUE, ); } diff --git a/core/modules/language/lib/Drupal/language/Plugin/Block/LanguageBlock.php b/core/modules/language/lib/Drupal/language/Plugin/Block/LanguageBlock.php index d97d49f41a970551f9929f2ecf9f57648a770cef..f53c81b072adc0030723c42ed93ba305a5fcefca 100644 --- a/core/modules/language/lib/Drupal/language/Plugin/Block/LanguageBlock.php +++ b/core/modules/language/lib/Drupal/language/Plugin/Block/LanguageBlock.php @@ -47,7 +47,6 @@ public function build() { "language-switcher-{$links->method_id}", ), ), - '#set_active_class' => TRUE, ); } return $build; diff --git a/core/modules/language/lib/Drupal/language/Tests/LanguageSwitchingTest.php b/core/modules/language/lib/Drupal/language/Tests/LanguageSwitchingTest.php index 826fcf9d6757b75834e94dec45e3ffa8b8afcfdf..4613f4311721c769f85eb2e861fa3105d926c10d 100644 --- a/core/modules/language/lib/Drupal/language/Tests/LanguageSwitchingTest.php +++ b/core/modules/language/lib/Drupal/language/Tests/LanguageSwitchingTest.php @@ -55,70 +55,9 @@ function testLanguageBlock() { $edit = array('language_interface[enabled][language-url]' => '1'); $this->drupalPostForm('admin/config/regional/language/detection', $edit, t('Save settings')); - $this->doTestLanguageBlockAuthenticated($block->label()); - $this->doTestLanguageBlockAnonymous($block->label()); - } - - /** - * For authenticated users, the "active" class is set by JavaScript. - * - * @param string $block_label - * The label of the language switching block. - * - * @see testLanguageBlock() - */ - protected function doTestLanguageBlockAuthenticated($block_label) { - // Assert that the language switching block is displayed on the frontpage. - $this->drupalGet(''); - $this->assertText($block_label, 'Language switcher block found.'); - - // Assert that each list item and anchor element has the appropriate data- - // attributes. - list($language_switcher) = $this->xpath('//div[@id=:id]/div[contains(@class, "content")]', array(':id' => 'block-test-language-block')); - $list_items = array(); - $anchors = array(); - foreach ($language_switcher->ul->li as $list_item) { - $classes = explode(" ", (string) $list_item['class']); - list($langcode) = array_intersect($classes, array('en', 'fr')); - $list_items[] = array( - 'langcode_class' => $langcode, - 'data-drupal-link-system-path' => (string) $list_item['data-drupal-link-system-path'], - ); - $anchors[] = array( - 'hreflang' => (string) $list_item->a['hreflang'], - 'data-drupal-link-system-path' => (string) $list_item->a['data-drupal-link-system-path'], - ); - } - $expected_list_items = array( - 0 => array('langcode_class' => 'en', 'data-drupal-link-system-path' => 'user/2'), - 1 => array('langcode_class' => 'fr', 'data-drupal-link-system-path' => 'user/2'), - ); - $this->assertIdentical($list_items, $expected_list_items, 'The list items have the correct attributes that will allow the drupal.active-link library to mark them as active.'); - $expected_anchors = array( - 0 => array('hreflang' => 'en', 'data-drupal-link-system-path' => 'user/2'), - 1 => array('hreflang' => 'fr', 'data-drupal-link-system-path' => 'user/2'), - ); - $this->assertIdentical($anchors, $expected_anchors, 'The anchors have the correct attributes that will allow the drupal.active-link library to mark them as active.'); - $settings = $this->drupalGetSettings(); - $this->assertIdentical($settings['path']['currentPath'], 'user/2', 'drupalSettings.path.currentPath is set correctly to allow drupal.active-link to mark the correct links as active.'); - $this->assertIdentical($settings['path']['isFront'], FALSE, 'drupalSettings.path.isFront is set correctly to allow drupal.active-link to mark the correct links as active.'); - $this->assertIdentical($settings['path']['currentLanguage'], 'en', 'drupalSettings.path.currentLanguage is set correctly to allow drupal.active-link to mark the correct links as active.'); - } - - /** - * For anonymous users, the "active" class is set by PHP. - * - * @param string $block_label - * The label of the language switching block. - * - * @see testLanguageBlock() - */ - protected function doTestLanguageBlockAnonymous($block_label) { - $this->drupalLogout(); - // Assert that the language switching block is displayed on the frontpage. $this->drupalGet(''); - $this->assertText($block_label, 'Language switcher block found.'); + $this->assertText($block->label(), 'Language switcher block found.'); // Assert that only the current language is marked as active. list($language_switcher) = $this->xpath('//div[@id=:id]/div[contains(@class, "content")]', array(':id' => 'block-test-language-block')); @@ -165,80 +104,7 @@ function testLanguageLinkActiveClass() { $edit = array('language_interface[enabled][language-url]' => '1'); $this->drupalPostForm('admin/config/regional/language/detection', $edit, t('Save settings')); - $this->doTestLanguageLinkActiveClassAuthenticated(); - $this->doTestLanguageLinkActiveClassAnonymous(); - } - - /** - * For authenticated users, the "active" class is set by JavaScript. - * - * @see testLanguageLinkActiveClass() - */ - protected function doTestLanguageLinkActiveClassAuthenticated() { - $function_name = '#type link'; - $path = 'language_test/type-link-active-class'; - - // Test links generated by l() on an English page. - $current_language = 'English'; - $this->drupalGet($path); - - // Language code 'none' link should be active. - $langcode = 'none'; - $links = $this->xpath('//a[@id = :id and @data-drupal-link-system-path = :path]', array(':id' => 'no_lang_link', ':path' => $path)); - $this->assertTrue(isset($links[0]), t('A link generated by :function to the current :language page with langcode :langcode has the correct attributes that will allow the drupal.active-link library to mark it as active.', array(':function' => $function_name, ':language' => $current_language, ':langcode' => $langcode))); - - // Language code 'en' link should be active. - $langcode = 'en'; - $links = $this->xpath('//a[@id = :id and @hreflang = :lang and @data-drupal-link-system-path = :path]', array(':id' => 'en_link', ':lang' => 'en', ':path' => $path)); - $this->assertTrue(isset($links[0]), t('A link generated by :function to the current :language page with langcode :langcode has the correct attributes that will allow the drupal.active-link library to mark it as active.', array(':function' => $function_name, ':language' => $current_language, ':langcode' => $langcode))); - - // Language code 'fr' link should not be active. - $langcode = 'fr'; - $links = $this->xpath('//a[@id = :id and @hreflang = :lang and @data-drupal-link-system-path = :path]', array(':id' => 'fr_link', ':lang' => 'fr', ':path' => $path)); - $this->assertTrue(isset($links[0]), t('A link generated by :function to the current :language page with langcode :langcode has the correct attributes that will allow the drupal.active-link library to NOT mark it as active.', array(':function' => $function_name, ':language' => $current_language, ':langcode' => $langcode))); - - // Verify that drupalSettings contains the correct values. - $settings = $this->drupalGetSettings(); - $this->assertIdentical($settings['path']['currentPath'], $path, 'drupalSettings.path.currentPath is set correctly to allow drupal.active-link to mark the correct links as active.'); - $this->assertIdentical($settings['path']['isFront'], FALSE, 'drupalSettings.path.isFront is set correctly to allow drupal.active-link to mark the correct links as active.'); - $this->assertIdentical($settings['path']['currentLanguage'], 'en', 'drupalSettings.path.currentLanguage is set correctly to allow drupal.active-link to mark the correct links as active.'); - - // Test links generated by l() on a French page. - $current_language = 'French'; - $this->drupalGet('fr/language_test/type-link-active-class'); - - // Language code 'none' link should be active. - $langcode = 'none'; - $links = $this->xpath('//a[@id = :id and @data-drupal-link-system-path = :path]', array(':id' => 'no_lang_link', ':path' => $path)); - $this->assertTrue(isset($links[0]), t('A link generated by :function to the current :language page with langcode :langcode has the correct attributes that will allow the drupal.active-link library to mark it as active.', array(':function' => $function_name, ':language' => $current_language, ':langcode' => $langcode))); - - // Language code 'en' link should not be active. - $langcode = 'en'; - $links = $this->xpath('//a[@id = :id and @hreflang = :lang and @data-drupal-link-system-path = :path]', array(':id' => 'en_link', ':lang' => 'en', ':path' => $path)); - $this->assertTrue(isset($links[0]), t('A link generated by :function to the current :language page with langcode :langcode has the correct attributes that will allow the drupal.active-link library to NOT mark it as active.', array(':function' => $function_name, ':language' => $current_language, ':langcode' => $langcode))); - - // Language code 'fr' link should be active. - $langcode = 'fr'; - $links = $this->xpath('//a[@id = :id and @hreflang = :lang and @data-drupal-link-system-path = :path]', array(':id' => 'fr_link', ':lang' => 'fr', ':path' => $path)); - $this->assertTrue(isset($links[0]), t('A link generated by :function to the current :language page with langcode :langcode has the correct attributes that will allow the drupal.active-link library to mark it as active.', array(':function' => $function_name, ':language' => $current_language, ':langcode' => $langcode))); - - // Verify that drupalSettings contains the correct values. - $settings = $this->drupalGetSettings(); - $this->assertIdentical($settings['path']['currentPath'], $path, 'drupalSettings.path.currentPath is set correctly to allow drupal.active-link to mark the correct links as active.'); - $this->assertIdentical($settings['path']['isFront'], FALSE, 'drupalSettings.path.isFront is set correctly to allow drupal.active-link to mark the correct links as active.'); - $this->assertIdentical($settings['path']['currentLanguage'], 'fr', 'drupalSettings.path.currentLanguage is set correctly to allow drupal.active-link to mark the correct links as active.'); - } - - /** - * For anonymous users, the "active" class is set by PHP. - * - * @see testLanguageLinkActiveClass() - */ - protected function doTestLanguageLinkActiveClassAnonymous() { $function_name = '#type link'; - $path = 'language_test/type-link-active-class'; - - $this->drupalLogout(); // Test links generated by l() on an English page. $current_language = 'English'; diff --git a/core/modules/language/lib/Drupal/language/Tests/LanguageUILanguageNegotiationTest.php b/core/modules/language/lib/Drupal/language/Tests/LanguageUILanguageNegotiationTest.php index 19744c211ab0c399aa9cddca1b9a0a126eda4384..7c037b5f64187f9579ab1937192d51a0c590a455 100644 --- a/core/modules/language/lib/Drupal/language/Tests/LanguageUILanguageNegotiationTest.php +++ b/core/modules/language/lib/Drupal/language/Tests/LanguageUILanguageNegotiationTest.php @@ -411,11 +411,6 @@ function testUrlLanguageFallback() { // Enable the language switcher block. $this->drupalPlaceBlock('language_block:' . Language::TYPE_INTERFACE, array('id' => 'test_language_block')); - // Log out, because for anonymous users, the "active" class is set by PHP - // (which means we can easily test it here), whereas for authenticated users - // it is set by JavaScript. - $this->drupalLogout(); - // Access the front page without specifying any valid URL language prefix // and having as browser language preference a non-default language. $http_header = array("Accept-Language: $langcode_browser_fallback;q=1"); @@ -469,7 +464,7 @@ function testLanguageDomain() { $italian_url = url('admin', array('language' => $languages['it'], 'script' => '')); $url_scheme = $this->request->isSecure() ? 'https://' : 'http://'; $correct_link = $url_scheme . $link; - $this->assertEqual($italian_url, $correct_link, format_string('The url() function returns the right URL (@url) in accordance with the chosen language', array('@url' => $italian_url))); + $this->assertTrue($italian_url == $correct_link, format_string('The url() function returns the right URL (@url) in accordance with the chosen language', array('@url' => $italian_url))); // Test HTTPS via options. $this->settingsSet('mixed_mode_sessions', TRUE); diff --git a/core/modules/language/tests/language_test/lib/Drupal/language_test/Controller/LanguageTestController.php b/core/modules/language/tests/language_test/lib/Drupal/language_test/Controller/LanguageTestController.php index 781af064359ab1683d14bb1f1fb012821eee0d72..001fe39ec733378865b845904946b75afbaffaf5 100644 --- a/core/modules/language/tests/language_test/lib/Drupal/language_test/Controller/LanguageTestController.php +++ b/core/modules/language/tests/language_test/lib/Drupal/language_test/Controller/LanguageTestController.php @@ -58,7 +58,6 @@ public function typeLinkActiveClass() { 'attributes' => array( 'id' => 'no_lang_link', ), - 'set_active_class' => TRUE, ), ), 'fr' => array( @@ -70,7 +69,6 @@ public function typeLinkActiveClass() { 'attributes' => array( 'id' => 'fr_link', ), - 'set_active_class' => TRUE, ), ), 'en' => array( @@ -82,7 +80,6 @@ public function typeLinkActiveClass() { 'attributes' => array( 'id' => 'en_link', ), - 'set_active_class' => TRUE, ), ), ); diff --git a/core/modules/system/lib/Drupal/system/Controller/SystemController.php b/core/modules/system/lib/Drupal/system/Controller/SystemController.php index a51ae40d99f36563b5aa2d4046ba7922d4112a76..6145a11837f1d1b2b5bea9a6f62dc165380e550c 100644 --- a/core/modules/system/lib/Drupal/system/Controller/SystemController.php +++ b/core/modules/system/lib/Drupal/system/Controller/SystemController.php @@ -7,7 +7,6 @@ namespace Drupal\system\Controller; -use Drupal\Component\Utility\Json; use Drupal\Core\Controller\ControllerBase; use Drupal\Core\DependencyInjection\ContainerInjectionInterface; use Drupal\Core\Entity\Query\QueryFactory; @@ -162,69 +161,4 @@ public function themeSetDefault() { return system_theme_default(); } - /** - * #post_render_cache callback; sets the "active" class on relevant links. - * - * This is a PHP implementation of the drupal.active-link JavaScript library. - * - * @param array $element - * A renderable array with the following keys: - * - #markup - * - #attached - * @param array $context - * An array with the following keys: - * - path: the system path of the currently active page - * - front: whether the current page is the front page (which implies the - * current path might also be <front>) - * - language: the language code of the currently active page - * - query: the query string for the currently active page - * - * @return array - * The updated renderable array. - */ - public static function setLinkActiveClass(array $element, array $context) { - // If none of the HTML in the current page contains even just the current - // page's attribute, return early. - if (strpos($element['#markup'], 'data-drupal-link-system-path="' . $context['path'] . '"') === FALSE && (!$context['front'] || strpos($element['#markup'], 'data-drupal-link-system-path="<front>"') === FALSE)) { - return $element; - } - - // Build XPath query to find links that should get the "active" class. - $query = "//*["; - // An active link's path is equal to the current path. - $query .= "@data-drupal-link-system-path='" . $context['path'] . "'"; - if ($context['front']) { - $query .= " or @data-drupal-link-system-path='<front>'"; - } - // The language of an active link is equal to the current language. - if ($context['language']) { - $query .= " and (not(@hreflang) or @hreflang='" . $context['language'] . "')"; - } - // The query parameters of an active link are equal to the current - // parameters. - if ($context['query']) { - $query .= " and @data-drupal-link-query='" . Json::encode($context['query']) . "'"; - } - else { - $query .= " and not(@data-drupal-link-query)"; - } - $query .= "]"; - - // Set the "active" class on all matching HTML elements. - $dom = new \DOMDocument(); - @$dom->loadHTML($element['#markup']); - $xpath = new \DOMXPath($dom); - foreach ($xpath->query($query) as $node) { - $class = $node->getAttribute('class'); - if (strlen($class) > 0) { - $class .= ' '; - } - $class .= 'active'; - $node->setAttribute('class', $class); - } - $element['#markup'] = $dom->saveHTML(); - - return $element; - } - } diff --git a/core/modules/system/lib/Drupal/system/Tests/Batch/ProcessingTest.php b/core/modules/system/lib/Drupal/system/Tests/Batch/ProcessingTest.php index 8450b9c1344e2a0b47ac57ba93ce7167c31e32d7..11204fe6860ac077c496fb531da1329342472231 100644 --- a/core/modules/system/lib/Drupal/system/Tests/Batch/ProcessingTest.php +++ b/core/modules/system/lib/Drupal/system/Tests/Batch/ProcessingTest.php @@ -250,28 +250,28 @@ function _resultMessages($id) { switch ($id) { case 'batch_0': - $messages[] = 'results for batch 0<br>none'; + $messages[] = 'results for batch 0<br />none'; break; case 'batch_1': - $messages[] = 'results for batch 1<br>op 1: processed 10 elements'; + $messages[] = 'results for batch 1<br />op 1: processed 10 elements'; break; case 'batch_2': - $messages[] = 'results for batch 2<br>op 2: processed 10 elements'; + $messages[] = 'results for batch 2<br />op 2: processed 10 elements'; break; case 'batch_3': - $messages[] = 'results for batch 3<br>op 1: processed 10 elements<br>op 2: processed 10 elements'; + $messages[] = 'results for batch 3<br />op 1: processed 10 elements<br />op 2: processed 10 elements'; break; case 'batch_4': - $messages[] = 'results for batch 4<br>op 1: processed 10 elements'; + $messages[] = 'results for batch 4<br />op 1: processed 10 elements'; $messages = array_merge($messages, $this->_resultMessages('batch_2')); break; case 'batch_5': - $messages[] = 'results for batch 5<br>op 5: processed 10 elements'; + $messages[] = 'results for batch 5<br />op 5: processed 10 elements'; break; case 'chained': diff --git a/core/modules/system/lib/Drupal/system/Tests/Common/JavaScriptTest.php b/core/modules/system/lib/Drupal/system/Tests/Common/JavaScriptTest.php index 888a69942b2725adbf23498ac4c0668158f619d4..3f584aa6d0be956044714bd6ec04ef7c2ab98181 100644 --- a/core/modules/system/lib/Drupal/system/Tests/Common/JavaScriptTest.php +++ b/core/modules/system/lib/Drupal/system/Tests/Common/JavaScriptTest.php @@ -83,7 +83,7 @@ function testAddSetting() { drupal_add_library('system', 'drupalSettings'); $javascript = drupal_add_js(); $last_settings = reset($javascript['settings']['data']); - $this->assertTrue(array_key_exists('currentPath', $last_settings['path']), 'The current path JavaScript setting is set correctly.'); + $this->assertTrue(array_key_exists('currentPath', $last_settings), 'The current path JavaScript setting is set correctly.'); $javascript = drupal_add_js(array('drupal' => 'rocks', 'dries' => 280342800), 'setting'); $last_settings = end($javascript['settings']['data']); diff --git a/core/modules/system/lib/Drupal/system/Tests/Theme/FunctionsTest.php b/core/modules/system/lib/Drupal/system/Tests/Theme/FunctionsTest.php index 97335d25634f80b5c5eaa76e1113e1a4aabe423e..d1930c97c6ed9de1c703fe565fa194e751289d14 100644 --- a/core/modules/system/lib/Drupal/system/Tests/Theme/FunctionsTest.php +++ b/core/modules/system/lib/Drupal/system/Tests/Theme/FunctionsTest.php @@ -2,15 +2,12 @@ /** * @file - * Contains \Drupal\system\Tests\Theme\FunctionsTest. + * Definition of Drupal\system\Tests\Theme\FunctionsTest. */ namespace Drupal\system\Tests\Theme; -use Drupal\Core\Session\UserSession; use Drupal\simpletest\WebTestBase; -use Symfony\Cmf\Component\Routing\RouteObjectInterface; -use Symfony\Component\HttpFoundation\Request; /** * Tests for common theme functions. @@ -162,6 +159,12 @@ function testLinks() { $expected = ''; $this->assertThemeOutput('links', $variables, $expected, 'Empty %callback with heading generates no output.'); + // Set the current path to the front page path. + // Required to verify the "active" class in expected links below, and + // because the current path is different when running tests manually via + // simpletest.module ('batch') and via the testing framework (''). + _current_path(\Drupal::config('system.site')->get('page.front')); + // Verify that a list of links is properly rendered. $variables = array(); $variables['attributes'] = array('id' => 'somelinks'); @@ -188,7 +191,7 @@ function testLinks() { $expected_links .= '<ul id="somelinks">'; $expected_links .= '<li class="a-link odd first"><a href="' . url('a/link') . '">' . check_plain('A <link>') . '</a></li>'; $expected_links .= '<li class="plain-text even">' . check_plain('Plain "text"') . '</li>'; - $expected_links .= '<li class="front-page odd"><a href="' . url('<front>') . '">' . check_plain('Front page') . '</a></li>'; + $expected_links .= '<li class="front-page odd active"><a href="' . url('<front>') . '" class="active">' . check_plain('Front page') . '</a></li>'; $expected_links .= '<li class="router-test even last"><a href="' . \Drupal::urlGenerator()->generate('router_test.1') . '">' . check_plain('Test route') . '</a></li>'; $expected_links .= '</ul>'; @@ -221,24 +224,11 @@ function testLinks() { $expected_links .= '<ul id="somelinks">'; $expected_links .= '<li class="a-link odd first"><a href="' . url('a/link') . '" class="a/class">' . check_plain('A <link>') . '</a></li>'; $expected_links .= '<li class="plain-text even"><span class="a/class">' . check_plain('Plain "text"') . '</span></li>'; - $expected_links .= '<li class="front-page odd"><a href="' . url('<front>') . '">' . check_plain('Front page') . '</a></li>'; + $expected_links .= '<li class="front-page odd active"><a href="' . url('<front>') . '" class="active">' . check_plain('Front page') . '</a></li>'; $expected_links .= '<li class="router-test even last"><a href="' . \Drupal::urlGenerator()->generate('router_test.1') . '">' . check_plain('Test route') . '</a></li>'; $expected_links .= '</ul>'; $expected = $expected_heading . $expected_links; $this->assertThemeOutput('links', $variables, $expected); - - // Verify the data- attributes for setting the "active" class on links. - $this->container->set('current_user', new UserSession(array('uid' => 1))); - $variables['set_active_class'] = TRUE; - $expected_links = ''; - $expected_links .= '<ul id="somelinks">'; - $expected_links .= '<li class="a-link odd first" data-drupal-link-system-path="a/link"><a href="' . url('a/link') . '" class="a/class">' . check_plain('A <link>') . '</a></li>'; - $expected_links .= '<li class="plain-text even"><span class="a/class">' . check_plain('Plain "text"') . '</span></li>'; - $expected_links .= '<li class="front-page odd" data-drupal-link-system-path="<front>"><a href="' . url('<front>') . '">' . check_plain('Front page') . '</a></li>'; - $expected_links .= '<li class="router-test even last" data-drupal-link-system-path="router_test/test1"><a href="' . \Drupal::urlGenerator()->generate('router_test.1') . '">' . check_plain('Test route') . '</a></li>'; - $expected_links .= '</ul>'; - $expected = $expected_heading . $expected_links; - $this->assertThemeOutput('links', $variables, $expected); } /** diff --git a/core/modules/system/system.module b/core/modules/system/system.module index fac4c2150e5ed39c15a9118e8ac2a2a0acc01497..1a0be69dc11d422dc4205966c19e23c749f8186a 100644 --- a/core/modules/system/system.module +++ b/core/modules/system/system.module @@ -877,19 +877,6 @@ function system_library_info() { ), ); - // Drupal's active link marking. - $libraries['drupal.active-link'] = array( - 'title' => 'Drupal active link marking', - 'version' => \Drupal::VERSION, - 'js' => array( - 'core/misc/active-link.js' => array(), - ), - 'dependencies' => array( - array('system', 'drupal'), - array('system', 'drupalSettings'), - ), - ); - // Drupal's Ajax framework. $libraries['drupal.ajax'] = array( 'title' => 'Drupal AJAX', @@ -2102,7 +2089,6 @@ function system_filetransfer_info() { * Implements hook_page_build(). * * @see template_preprocess_maintenance_page() - * @see \Drupal\system\Controller\SystemController::setLinkActiveClass() */ function system_page_build(&$page) { // Ensure the same CSS is loaded in template_preprocess_maintenance_page(). @@ -2122,28 +2108,6 @@ function system_page_build(&$page) { 'weight' => CSS_COMPONENT - 10, ); } - - // Handle setting the "active" class on links by: - // - loading the active-link library if the current user is authenticated; - // - applying a post-render cache callback if the current user is anonymous. - // @see l() - // @see \Drupal\Core\Utility\LinkGenerator::generate() - // @see theme_links() - // @see \Drupal\system\Controller\SystemController::setLinkActiveClass - if (\Drupal::currentUser()->isAuthenticated()) { - $page['#attached']['library'][] = array('system', 'drupal.active-link'); - } - else { - $page['#post_render_cache']['\Drupal\system\Controller\SystemController::setLinkActiveClass'] = array( - // Collect the current state that determines whether a link is active. - array( - 'path' => current_path(), - 'front' => drupal_is_front_page(), - 'language' => language(\Drupal\Core\Language\Language::TYPE_URL)->id, - 'query' => \Drupal::service('request')->query->all(), - ) - ); - } } /** diff --git a/core/modules/system/tests/modules/batch_test/batch_test.callbacks.inc b/core/modules/system/tests/modules/batch_test/batch_test.callbacks.inc index ca1ea6f8c09fa0534c4773221eafc152b16a3826..6d9a9a60ac3d47b379f34cdd8d6a6ad9c05c06df 100644 --- a/core/modules/system/tests/modules/batch_test/batch_test.callbacks.inc +++ b/core/modules/system/tests/modules/batch_test/batch_test.callbacks.inc @@ -94,7 +94,7 @@ function _batch_test_finished_helper($batch_id, $success, $results, $operations) $messages[] = t('An error occurred while processing @op with arguments:<br />@args', array('@op' => $error_operation[0], '@args' => print_r($error_operation[1], TRUE))); } - drupal_set_message(implode('<br>', $messages)); + drupal_set_message(implode('<br />', $messages)); } /** diff --git a/core/modules/system/tests/modules/common_test/lib/Drupal/common_test/Controller/CommonTestController.php b/core/modules/system/tests/modules/common_test/lib/Drupal/common_test/Controller/CommonTestController.php index ffce7dc46912777e21dd6809145adcbcc330a704..12d287fbdc0d0ba4894dce5db0e4be17def9407c 100644 --- a/core/modules/system/tests/modules/common_test/lib/Drupal/common_test/Controller/CommonTestController.php +++ b/core/modules/system/tests/modules/common_test/lib/Drupal/common_test/Controller/CommonTestController.php @@ -35,9 +35,6 @@ public function typeLinkActiveClass() { '#type' => 'link', '#title' => t('Link with no query string'), '#href' => current_path(), - '#options' => array( - 'set_active_class' => TRUE, - ), ), 'with_query' => array( '#type' => 'link', @@ -48,7 +45,6 @@ public function typeLinkActiveClass() { 'foo' => 'bar', 'one' => 'two', ), - 'set_active_class' => TRUE, ), ), 'with_query_reversed' => array( @@ -60,7 +56,6 @@ public function typeLinkActiveClass() { 'one' => 'two', 'foo' => 'bar', ), - 'set_active_class' => TRUE, ), ), ); diff --git a/core/tests/Drupal/Tests/Core/Utility/LinkGeneratorTest.php b/core/tests/Drupal/Tests/Core/Utility/LinkGeneratorTest.php index eec43a63e62ae8133ecf0557d6f1118b522744a4..6b7334fa395ae85e9b9cb216387ca5d94eb3fbe8 100644 --- a/core/tests/Drupal/Tests/Core/Utility/LinkGeneratorTest.php +++ b/core/tests/Drupal/Tests/Core/Utility/LinkGeneratorTest.php @@ -43,19 +43,13 @@ class LinkGeneratorTest extends UnitTestCase { protected $moduleHandler; /** + * * The mocked language manager. * * @var \PHPUnit_Framework_MockObject_MockObject */ protected $languageManager; - /** - * The mocked path alias manager. - * - * @var \Drupal\Core\Path\AliasManagerInterface|\PHPUnit_Framework_MockObject_MockObject - */ - protected $aliasManager; - /** * Contains the LinkGenerator default options. */ @@ -63,7 +57,6 @@ class LinkGeneratorTest extends UnitTestCase { 'query' => array(), 'html' => FALSE, 'language' => NULL, - 'set_active_class' => FALSE, ); /** @@ -87,9 +80,8 @@ protected function setUp() { $this->urlGenerator = $this->getMock('\Drupal\Core\Routing\UrlGenerator', array(), array(), '', FALSE); $this->moduleHandler = $this->getMock('Drupal\Core\Extension\ModuleHandlerInterface'); $this->languageManager = $this->getMock('Drupal\Core\Language\LanguageManager'); - $this->aliasManager = $this->getMock('\Drupal\Core\Path\AliasManagerInterface'); - $this->linkGenerator = new LinkGenerator($this->urlGenerator, $this->moduleHandler, $this->languageManager, $this->aliasManager); + $this->linkGenerator = new LinkGenerator($this->urlGenerator, $this->moduleHandler, $this->languageManager); } /** @@ -320,31 +312,19 @@ public function testGenerateWithHtml() { * service. */ public function testGenerateActive() { - $this->urlGenerator->expects($this->exactly(8)) + $this->urlGenerator->expects($this->exactly(7)) ->method('generateFromRoute') ->will($this->returnValueMap(array( + array('test_route_1', array(), FALSE, '/test-route-1'), + array('test_route_1', array(), FALSE, '/test-route-1'), + array('test_route_1', array(), FALSE, '/test-route-1'), array('test_route_1', array(), FALSE, '/test-route-1'), array('test_route_3', array(), FALSE, '/test-route-3'), + array('test_route_3', array(), FALSE, '/test-route-3'), array('test_route_4', array('object' => '1'), FALSE, '/test-route-4/1'), ))); - $this->urlGenerator->expects($this->exactly(7)) - ->method('getPathFromRoute') - ->will($this->returnValueMap(array( - array('test_route_1', array(), 'test-route-1'), - array('test_route_3', array(), 'test-route-3'), - array('test_route_4', array('object' => '1'), 'test-route-4/1'), - ))); - - $this->aliasManager->expects($this->exactly(7)) - ->method('getSystemPath') - ->will($this->returnValueMap(array( - array('test-route-1', NULL, 'test-route-1'), - array('test-route-3', NULL, 'test-route-3'), - array('test-route-4/1', NULL, 'test-route-4/1'), - ))); - - $this->moduleHandler->expects($this->exactly(8)) + $this->moduleHandler->expects($this->exactly(7)) ->method('alter'); $this->setUpLanguageManager(); @@ -352,10 +332,10 @@ public function testGenerateActive() { // Render a link with a path different from the current path. $request = new Request(array(), array(), array('system_path' => 'test-route-2')); $this->linkGenerator->setRequest($request); - $result = $this->linkGenerator->generate('Test', 'test_route_1', array(), array('set_active_class' => TRUE)); - $this->assertTag(array( + $result = $this->linkGenerator->generate('Test', 'test_route_1'); + $this->assertNotTag(array( 'tag' => 'a', - 'attributes' => array('data-drupal-link-system-path' => 'test-route-1'), + 'attributes' => array('class' => 'active'), ), $result); // Render a link with the same path as the current path. @@ -365,31 +345,17 @@ public function testGenerateActive() { $raw_variables = new ParameterBag(); $request->attributes->set('_raw_variables', $raw_variables); $this->linkGenerator->setRequest($request); - $result = $this->linkGenerator->generate('Test', 'test_route_1', array(), array('set_active_class' => TRUE)); + $result = $this->linkGenerator->generate('Test', 'test_route_1'); $this->assertTag(array( 'tag' => 'a', - 'attributes' => array('data-drupal-link-system-path' => 'test-route-1'), - ), $result); - - // Render a link with the same path as the current path, but with the - // set_active_class option disabled. - $request = new Request(array(), array(), array('system_path' => 'test-route-1', RouteObjectInterface::ROUTE_NAME => 'test_route_1')); - // This attribute is expected to be set in a Drupal request by - // \Drupal\Core\ParamConverter\ParamConverterManager - $raw_variables = new ParameterBag(); - $request->attributes->set('_raw_variables', $raw_variables); - $this->linkGenerator->setRequest($request); - $result = $this->linkGenerator->generate('Test', 'test_route_1', array(), array('set_active_class' => FALSE)); - $this->assertNotTag(array( - 'tag' => 'a', - 'attributes' => array('data-drupal-link-system-path' => 'test-route-1'), + 'attributes' => array('class' => 'active'), ), $result); // Render a link with the same path and language as the current path. - $result = $this->linkGenerator->generate('Test', 'test_route_1', array(), array('set_active_class' => TRUE)); + $result = $this->linkGenerator->generate('Test', 'test_route_1'); $this->assertTag(array( 'tag' => 'a', - 'attributes' => array('data-drupal-link-system-path' => 'test-route-1'), + 'attributes' => array('class' => 'active'), ), $result); // Render a link with the same path but a different language than the current @@ -398,17 +364,11 @@ public function testGenerateActive() { 'Test', 'test_route_1', array(), - array( - 'language' => new Language(array('id' => 'de')), - 'set_active_class' => TRUE, - ) + array('language' => new Language(array('id' => 'de'))) ); - $this->assertTag(array( + $this->assertNotTag(array( 'tag' => 'a', - 'attributes' => array( - 'data-drupal-link-system-path' => 'test-route-1', - 'hreflang' => 'de', - ), + 'attributes' => array('class' => 'active'), ), $result); // Render a link with the same path and query parameter as the current path. @@ -420,17 +380,11 @@ public function testGenerateActive() { 'Test', 'test_route_3', array(), - array( - 'query' => array('value' => 'example_1'), - 'set_active_class' => TRUE, - ) - ); + array('query' => array('value' => 'example_1') + )); $this->assertTag(array( 'tag' => 'a', - 'attributes' => array( - 'data-drupal-link-system-path' => 'test-route-3', - 'data-drupal-link-query' => 'regexp:/.*value.*example_1.*/', - ), + 'attributes' => array('class' => 'active'), ), $result); // Render a link with the same path but a different query parameter than the @@ -439,19 +393,12 @@ public function testGenerateActive() { 'Test', 'test_route_3', array(), - array( - 'query' => array('value' => 'example_2'), - 'set_active_class' => TRUE, - ) + array('query' => array('value' => 'example_2')) ); - $this->assertTag(array( + $this->assertNotTag(array( 'tag' => 'a', - 'attributes' => array( - 'data-drupal-link-system-path' => 'test-route-3', - 'data-drupal-link-query' => 'regexp:/.*value.*example_2.*/', - ), + 'attributes' => array('class' => 'active'), ), $result); - // Render a link with the same path and query parameter as the current path. $request = new Request(array('value' => 'example_1'), array(), array('system_path' => 'test-route-4/1', RouteObjectInterface::ROUTE_NAME => 'test_route_4')); $raw_variables = new ParameterBag(array('object' => '1')); @@ -461,17 +408,11 @@ public function testGenerateActive() { 'Test', 'test_route_4', array('object' => '1'), - array( - 'query' => array('value' => 'example_1'), - 'set_active_class' => TRUE, - ) + array('query' => array('value' => 'example_1')) ); $this->assertTag(array( 'tag' => 'a', - 'attributes' => array( - 'data-drupal-link-system-path' => 'test-route-4/1', - 'data-drupal-link-query' => 'regexp:/.*value.*example_1.*/', - ), + 'attributes' => array('class' => 'active'), ), $result); }