From b8c09bea472a4ca8e007b3d96d2abb6fff90a6b8 Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Mon, 7 May 2018 21:11:35 +0100
Subject: [PATCH] Issue #2594669 by Wim Leers, borisson_, catch, dawehner:
 LibraryDependencyResolver::getMinimalRepresentativeSubset() accepts a set as
 the input but doesn't complain if it's not actually a set

---
 core/lib/Drupal/Core/Asset/LibraryDependencyResolver.php  | 2 ++
 core/modules/system/system.module                         | 4 ++--
 .../Tests/Core/Asset/LibraryDependencyResolverTest.php    | 8 ++++++++
 3 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/core/lib/Drupal/Core/Asset/LibraryDependencyResolver.php b/core/lib/Drupal/Core/Asset/LibraryDependencyResolver.php
index 95fca186614f..b84b8fac9ef7 100644
--- a/core/lib/Drupal/Core/Asset/LibraryDependencyResolver.php
+++ b/core/lib/Drupal/Core/Asset/LibraryDependencyResolver.php
@@ -65,6 +65,8 @@ protected function doGetDependencies(array $libraries_with_unresolved_dependenci
    * {@inheritdoc}
    */
   public function getMinimalRepresentativeSubset(array $libraries) {
+    assert(count($libraries) === count(array_unique($libraries)), '$libraries can\'t contain duplicate items.');
+
     $minimal = [];
 
     // Determine each library's dependencies.
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index d08e1016c816..15138a10e574 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -766,10 +766,10 @@ function system_js_settings_alter(&$settings, AttachedAssetsInterface $assets) {
     }
     // Provide the page with information about the individual asset libraries
     // used, information not otherwise available when aggregation is enabled.
-    $minimal_libraries = $library_dependency_resolver->getMinimalRepresentativeSubset(array_merge(
+    $minimal_libraries = $library_dependency_resolver->getMinimalRepresentativeSubset(array_unique(array_merge(
       $assets->getLibraries(),
       $assets->getAlreadyLoadedLibraries()
-    ));
+    )));
     sort($minimal_libraries);
     $settings['ajaxPageState']['libraries'] = implode(',', $minimal_libraries);
   }
diff --git a/core/tests/Drupal/Tests/Core/Asset/LibraryDependencyResolverTest.php b/core/tests/Drupal/Tests/Core/Asset/LibraryDependencyResolverTest.php
index 40e18210800b..6e499d9eaaea 100644
--- a/core/tests/Drupal/Tests/Core/Asset/LibraryDependencyResolverTest.php
+++ b/core/tests/Drupal/Tests/Core/Asset/LibraryDependencyResolverTest.php
@@ -169,4 +169,12 @@ public function testGetMinimalRepresentativeSubset(array $libraries, array $expe
     $this->assertEquals($expected, $this->libraryDependencyResolver->getMinimalRepresentativeSubset($libraries));
   }
 
+  /**
+   * @covers ::getMinimalRepresentativeSubset
+   */
+  public function testGetMinimalRepresentativeSubsetInvalidInput() {
+    $this->setExpectedException(\AssertionError::class, '$libraries can\'t contain duplicate items.');
+    $this->libraryDependencyResolver->getMinimalRepresentativeSubset(['test/no_deps_a', 'test/no_deps_a']);
+  }
+
 }
-- 
GitLab