From 801f6ca130b5776cb032f6dbd5b4aad69b39e079 Mon Sep 17 00:00:00 2001
From: Nathaniel Catchpole <catch@35733.no-reply.drupal.org>
Date: Thu, 23 Feb 2017 11:16:52 +0000
Subject: [PATCH] Issue #2585821 by blazey, marvin_B8, sdstyles, benelori, GoZ,
 DuaelFr: ConfigurableLanguageManager language_switch_links alter use
 undefined path variable

---
 .../lib/Drupal/Core/Language/language.api.php | 10 ++--
 .../src/ConfigurableLanguageManager.php       |  2 +-
 .../tests/language_test/language_test.module  |  8 +++
 .../ConfigurableLanguageManagerTest.php       | 56 +++++++++++++++++++
 4 files changed, 70 insertions(+), 6 deletions(-)
 create mode 100644 core/modules/language/tests/src/Kernel/ConfigurableLanguageManagerTest.php

diff --git a/core/lib/Drupal/Core/Language/language.api.php b/core/lib/Drupal/Core/Language/language.api.php
index 1ac4b083555c..33c1ce69f8f2 100644
--- a/core/lib/Drupal/Core/Language/language.api.php
+++ b/core/lib/Drupal/Core/Language/language.api.php
@@ -162,14 +162,14 @@
  * translated link text before going through the link generator, which will
  * just handle the path aliases.
  *
- * @param $links
+ * @param array $links
  *   Nested array of links keyed by language code.
- * @param $type
+ * @param string $type
  *   The language type the links will switch.
- * @param $path
- *   The current path.
+ * @param \Drupal\Core\Url $url
+ *   The URL the switch links will be relative to.
  */
-function hook_language_switch_links_alter(array &$links, $type, $path) {
+function hook_language_switch_links_alter(array &$links, $type, \Drupal\Core\Url $url) {
   $language_interface = \Drupal::languageManager()->getCurrentLanguage();
 
   if ($type == LanguageInterface::TYPE_CONTENT && isset($links[$language_interface->getId()])) {
diff --git a/core/modules/language/src/ConfigurableLanguageManager.php b/core/modules/language/src/ConfigurableLanguageManager.php
index 238bd830c7ee..614cf7737cf2 100644
--- a/core/modules/language/src/ConfigurableLanguageManager.php
+++ b/core/modules/language/src/ConfigurableLanguageManager.php
@@ -414,7 +414,7 @@ public function getLanguageSwitchLinks($type, Url $url) {
 
           if (!empty($result)) {
             // Allow modules to provide translations for specific links.
-            $this->moduleHandler->alter('language_switch_links', $result, $type, $path);
+            $this->moduleHandler->alter('language_switch_links', $result, $type, $url);
             $links = (object) array('links' => $result, 'method_id' => $method_id);
             break;
           }
diff --git a/core/modules/language/tests/language_test/language_test.module b/core/modules/language/tests/language_test/language_test.module
index 2ca1ff5eafac..4803202f2610 100644
--- a/core/modules/language/tests/language_test/language_test.module
+++ b/core/modules/language/tests/language_test/language_test.module
@@ -6,6 +6,7 @@
  */
 
 use Drupal\Core\Language\LanguageInterface;
+use Drupal\Core\Url;
 use Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationUI;
 
 /**
@@ -99,3 +100,10 @@ function language_test_language_fallback_candidates_test_alter(array &$candidate
 function language_test_module_preinstall() {
   \Drupal::state()->set('language_test.language_count_preinstall', count(\Drupal::languageManager()->getLanguages()));
 }
+
+/**
+ * Implements hook_language_switch_links_alter().
+ */
+function language_test_language_switch_links_alter(array &$links, $type, Url $url) {
+  // I'll just sit here and wait to be called with the right arguments.
+}
diff --git a/core/modules/language/tests/src/Kernel/ConfigurableLanguageManagerTest.php b/core/modules/language/tests/src/Kernel/ConfigurableLanguageManagerTest.php
new file mode 100644
index 000000000000..dae3a585c837
--- /dev/null
+++ b/core/modules/language/tests/src/Kernel/ConfigurableLanguageManagerTest.php
@@ -0,0 +1,56 @@
+<?php
+
+namespace Drupal\Tests\language\Kernel;
+
+use Drupal\Core\Language\LanguageInterface;
+use Drupal\Core\Url;
+
+/**
+ * Tests the ConfigurableLanguage entity.
+ *
+ * @group language
+ * @coversDefaultClass \Drupal\language\ConfigurableLanguageManager
+ */
+class ConfigurableLanguageManagerTest extends LanguageTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = array('user');
+
+  /**
+   * The language negotiator.
+   *
+   * @var \Drupal\language\LanguageNegotiatorInterface
+   */
+  protected $languageNegotiator;
+
+  /**
+   * The language manager.
+   *
+   * @var \Drupal\language\ConfigurableLanguageManagerInterface
+   */
+  protected $languageManager;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->installSchema('system', ['sequence']);
+    $this->installEntitySchema('user');
+
+    $this->languageNegotiator = $this->container->get('language_negotiator');
+    $this->languageManager = $this->container->get('language_manager');
+  }
+
+  /**
+   * @covers ::getLanguageSwitchLinks
+   */
+  public function testLanguageSwitchLinks() {
+    $this->languageNegotiator->setCurrentUser($this->prophesize('Drupal\Core\Session\AccountInterface')->reveal());
+    $this->languageManager->getLanguageSwitchLinks(LanguageInterface::TYPE_INTERFACE, new Url('<current>'));
+  }
+
+}
-- 
GitLab