From 27948b069b1be0be6062b7baea211fd971d389e9 Mon Sep 17 00:00:00 2001
From: catch <6915-catch@users.noreply.drupalcode.org>
Date: Thu, 29 Aug 2024 12:26:29 +0900
Subject: [PATCH] Issue #3151086 by quietone, neclimdul, webchick, KapilV,
 alexpott, smustgrave: Replace use of whitelist/blacklist in the path_alias
 module

---
 .../tests/src/Functional/PathAliasTest.php    |   6 +-
 .../path_alias/path_alias.services.yml        |   9 +-
 core/modules/path_alias/src/AliasManager.php  |  40 ++++--
 .../path_alias/src/AliasManagerInterface.php  |   4 +-
 .../path_alias/src/AliasPrefixList.php        | 120 +++++++++++++++++
 .../src/AliasPrefixListInterface.php          |  15 +++
 .../modules/path_alias/src/AliasWhitelist.php | 121 +----------------
 .../src/AliasWhitelistInterface.php           |  14 +-
 .../path_alias/tests/src/Kernel/AliasTest.php | 124 +++++++++---------
 .../tests/src/Unit/AliasManagerTest.php       |  34 ++---
 .../StandardPerformanceTest.php               |   4 +-
 11 files changed, 270 insertions(+), 221 deletions(-)
 create mode 100644 core/modules/path_alias/src/AliasPrefixList.php
 create mode 100644 core/modules/path_alias/src/AliasPrefixListInterface.php

diff --git a/core/modules/path/tests/src/Functional/PathAliasTest.php b/core/modules/path/tests/src/Functional/PathAliasTest.php
index 861a5cf6d0ee..617e58722de9 100644
--- a/core/modules/path/tests/src/Functional/PathAliasTest.php
+++ b/core/modules/path/tests/src/Functional/PathAliasTest.php
@@ -65,9 +65,9 @@ public function testPathCache(): void {
     $this->submitForm($edit, 'Save');
 
     // Check the path alias whitelist cache.
-    $whitelist = \Drupal::cache('bootstrap')->get('path_alias_whitelist');
-    $this->assertTrue($whitelist->data['node']);
-    $this->assertFalse($whitelist->data['admin']);
+    $prefix_list = \Drupal::cache('bootstrap')->get('path_alias_prefix_list');
+    $this->assertTrue($prefix_list->data['node']);
+    $this->assertFalse($prefix_list->data['admin']);
 
     // Visit the system path for the node and confirm a cache entry is
     // created.
diff --git a/core/modules/path_alias/path_alias.services.yml b/core/modules/path_alias/path_alias.services.yml
index b24ce4971bd8..a8c7f2dfeee0 100644
--- a/core/modules/path_alias/path_alias.services.yml
+++ b/core/modules/path_alias/path_alias.services.yml
@@ -12,7 +12,7 @@ services:
     arguments: ['@path_alias.manager']
   path_alias.manager:
     class: Drupal\path_alias\AliasManager
-    arguments: ['@path_alias.repository', '@path_alias.whitelist', '@language_manager', '@cache.data', '@datetime.time']
+    arguments: ['@path_alias.repository', '@path_alias.prefix_list', '@language_manager', '@cache.data', '@datetime.time']
   Drupal\path_alias\AliasManagerInterface: '@path_alias.manager'
   path_alias.repository:
     class: Drupal\path_alias\AliasRepository
@@ -25,4 +25,11 @@ services:
     tags:
       - { name: needs_destruction }
     arguments: [path_alias_whitelist, '@cache.bootstrap', '@lock', '@state', '@path_alias.repository']
+    deprecated:  The "%service_id%" service is deprecated in drupal:11.1.0 and is removed from drupal:12.0.0. Use the 'router.prefix_list' service instead. See https://www.drupal.org/node/3467559
   Drupal\path_alias\AliasWhitelistInterface: '@path_alias.whitelist'
+  path_alias.prefix_list:
+    class: Drupal\path_alias\AliasPrefixList
+    tags:
+      - { name: needs_destruction }
+    arguments: [path_alias_prefix_list, '@cache.bootstrap', '@lock', '@state', '@path_alias.repository']
+  Drupal\path_alias\AliasPrefixListInterface: '@path_alias.prefix_list'
diff --git a/core/modules/path_alias/src/AliasManager.php b/core/modules/path_alias/src/AliasManager.php
index 9a72d2eaa4d6..f3b3d4fc5a55 100644
--- a/core/modules/path_alias/src/AliasManager.php
+++ b/core/modules/path_alias/src/AliasManager.php
@@ -66,7 +66,7 @@ class AliasManager implements AliasManagerInterface {
 
   public function __construct(
     protected AliasRepositoryInterface $pathAliasRepository,
-    protected AliasWhitelistInterface $whitelist,
+    protected AliasPrefixListInterface $pathPrefixes,
     protected LanguageManagerInterface $languageManager,
     protected CacheBackendInterface $cache,
     protected TimeInterface $time,
@@ -153,10 +153,10 @@ public function getAliasByPath($path, $langcode = NULL) {
     // alias matching the URL path.
     $langcode = $langcode ?: $this->languageManager->getCurrentLanguage(LanguageInterface::TYPE_URL)->getId();
 
-    // Check the path whitelist, if the top-level part before the first /
-    // is not in the list, then there is no need to do anything further,
-    // it is not in the database.
-    if ($path === '/' || !$this->whitelist->get(strtok(trim($path, '/'), '/'))) {
+    // Check the path prefix, if the top-level part before the first / is not in
+    // the list, then there is no need to do anything further, it is not in the
+    // database.
+    if ($path === '/' || !$this->pathPrefixes->get(strtok(trim($path, '/'), '/'))) {
       return $path;
     }
 
@@ -230,24 +230,40 @@ public function cacheClear($source = NULL) {
     $this->noAlias = [];
     $this->langcodePreloaded = [];
     $this->preloadedPathLookups = [];
-    $this->pathAliasWhitelistRebuild($source);
+    $this->pathAliasPrefixListRebuild($source);
   }
 
   /**
-   * Rebuild the path alias white list.
+   * Rebuild the path alias prefix list.
    *
    * @param string $path
    *   An optional path for which an alias is being inserted.
    */
-  protected function pathAliasWhitelistRebuild($path = NULL) {
-    // When paths are inserted, only rebuild the whitelist if the path has a top
-    // level component which is not already in the whitelist.
+  protected function pathAliasPrefixListRebuild($path = NULL) {
+    // When paths are inserted, only rebuild the prefix list if the path has a top
+    // level component which is not already in the prefix list.
     if (!empty($path)) {
-      if ($this->whitelist->get(strtok($path, '/'))) {
+      if ($this->pathPrefixes->get(strtok($path, '/'))) {
         return;
       }
     }
-    $this->whitelist->clear();
+    $this->pathPrefixes->clear();
+  }
+
+  /**
+   * Rebuild the path alias prefix list.
+   *
+   * @param string $path
+   *   An optional path for which an alias is being inserted.
+   *
+   * @deprecated in drupal:11.1.0 and is removed from drupal:12.0.0.
+   *  Use \Drupal\path_alias\AliasManager::pathAliasPrefixListRebuild instead.
+   *
+   * @see https://www.drupal.org/node/3467559
+   */
+  protected function pathAliasWhitelistRebuild($path = NULL) {
+    @trigger_error(__METHOD__ . '() is deprecated in drupal:11.1.0 and is removed from drupal:12.0.0. Use \Drupal\path_alias\AliasManager::pathAliasPrefixListRebuild() instead. See https://www.drupal.org/node/3467559', E_USER_DEPRECATED);
+    $this->pathAliasPrefixListRebuild($path);
   }
 
 }
diff --git a/core/modules/path_alias/src/AliasManagerInterface.php b/core/modules/path_alias/src/AliasManagerInterface.php
index 21a29dfa376a..207905625d39 100644
--- a/core/modules/path_alias/src/AliasManagerInterface.php
+++ b/core/modules/path_alias/src/AliasManagerInterface.php
@@ -42,11 +42,11 @@ public function getPathByAlias($alias, $langcode = NULL);
   public function getAliasByPath($path, $langcode = NULL);
 
   /**
-   * Clears the static caches in alias manager and rebuilds the whitelist.
+   * Clears the static caches in alias manager and rebuilds the prefix list.
    *
    * @param $source
    *   Source path of the alias that is being inserted/updated. If omitted, the
-   *   entire lookup static cache will be cleared and the whitelist will be
+   *   entire lookup static cache will be cleared and the prefix list will be
    *   rebuilt.
    */
   public function cacheClear($source = NULL);
diff --git a/core/modules/path_alias/src/AliasPrefixList.php b/core/modules/path_alias/src/AliasPrefixList.php
new file mode 100644
index 000000000000..58beef86fe5a
--- /dev/null
+++ b/core/modules/path_alias/src/AliasPrefixList.php
@@ -0,0 +1,120 @@
+<?php
+
+namespace Drupal\path_alias;
+
+use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\Cache\CacheCollector;
+use Drupal\Core\Lock\LockBackendInterface;
+use Drupal\Core\State\StateInterface;
+
+/**
+ * Cache a list of valid alias prefixes.
+ */
+class AliasPrefixList extends CacheCollector implements AliasPrefixListInterface {
+
+  /**
+   * The Key/Value Store to use for state.
+   *
+   * @var \Drupal\Core\State\StateInterface
+   */
+  protected $state;
+
+  /**
+   * The path alias repository.
+   *
+   * @var \Drupal\path_alias\AliasRepositoryInterface
+   */
+  protected $pathAliasRepository;
+
+  /**
+   * Constructs an AliasPrefixList object.
+   *
+   * @param string $cid
+   *   The cache id to use.
+   * @param \Drupal\Core\Cache\CacheBackendInterface $cache
+   *   The cache backend.
+   * @param \Drupal\Core\Lock\LockBackendInterface $lock
+   *   The lock backend.
+   * @param \Drupal\Core\State\StateInterface $state
+   *   The state keyvalue store.
+   * @param \Drupal\path_alias\AliasRepositoryInterface $alias_repository
+   *   The path alias repository.
+   */
+  public function __construct($cid, CacheBackendInterface $cache, LockBackendInterface $lock, StateInterface $state, AliasRepositoryInterface $alias_repository) {
+    parent::__construct($cid, $cache, $lock);
+    $this->state = $state;
+    $this->pathAliasRepository = $alias_repository;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function lazyLoadCache() {
+    parent::lazyLoadCache();
+
+    // On a cold start $this->storage will be empty and the prefix list will
+    // need to be rebuilt from scratch. The prefix list is initialized from the
+    // list of all valid path roots stored in the 'router.path_roots' state,
+    // with values initialized to NULL. During the request, each path requested
+    // that matches one of these keys will be looked up and the array value set
+    // to either TRUE or FALSE. This ensures that paths which do not exist in
+    // the router are not looked up, and that paths that do exist in the router
+    // are only looked up once.
+    if (empty($this->storage)) {
+      $this->loadMenuPathRoots();
+    }
+  }
+
+  /**
+   * Loads menu path roots to prepopulate cache.
+   */
+  protected function loadMenuPathRoots() {
+    if ($roots = $this->state->get('router.path_roots')) {
+      foreach ($roots as $root) {
+        $this->storage[$root] = NULL;
+        $this->persist($root);
+      }
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function get($offset) {
+    $this->lazyLoadCache();
+    // This may be called with paths that are not represented by menu router
+    // items such as paths that will be rewritten by hook_url_outbound_alter().
+    // Therefore internally TRUE is used to indicate valid paths. FALSE is
+    // used to indicate paths that have already been checked but are not
+    // valid, and NULL indicates paths that have not been checked yet.
+    if (isset($this->storage[$offset])) {
+      if ($this->storage[$offset]) {
+        return TRUE;
+      }
+    }
+    elseif (array_key_exists($offset, $this->storage)) {
+      return $this->resolveCacheMiss($offset);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function resolveCacheMiss($root) {
+    $exists = $this->pathAliasRepository->pathHasMatchingAlias('/' . $root);
+    $this->storage[$root] = $exists;
+    $this->persist($root);
+    if ($exists) {
+      return TRUE;
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function clear() {
+    parent::clear();
+    $this->loadMenuPathRoots();
+  }
+
+}
diff --git a/core/modules/path_alias/src/AliasPrefixListInterface.php b/core/modules/path_alias/src/AliasPrefixListInterface.php
new file mode 100644
index 000000000000..51528830a80c
--- /dev/null
+++ b/core/modules/path_alias/src/AliasPrefixListInterface.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Drupal\path_alias;
+
+use Drupal\Core\Cache\CacheCollectorInterface;
+
+/**
+ * Cache a list of valid alias prefixes.
+ *
+ * The list contains the first element of the router paths of all aliases. For
+ * example, if /node/12345 has an alias then "node" is added to the prefix list.
+ * This optimization allows skipping the lookup for every /user/{user} path if
+ * "user" is not in the list.
+ */
+interface AliasPrefixListInterface extends CacheCollectorInterface {}
diff --git a/core/modules/path_alias/src/AliasWhitelist.php b/core/modules/path_alias/src/AliasWhitelist.php
index 40bf13af1465..df68b35c4a25 100644
--- a/core/modules/path_alias/src/AliasWhitelist.php
+++ b/core/modules/path_alias/src/AliasWhitelist.php
@@ -2,119 +2,12 @@
 
 namespace Drupal\path_alias;
 
-use Drupal\Core\Cache\CacheBackendInterface;
-use Drupal\Core\Cache\CacheCollector;
-use Drupal\Core\Lock\LockBackendInterface;
-use Drupal\Core\State\StateInterface;
-
 /**
- * Extends CacheCollector to build the path alias whitelist over time.
+ * Cache a list of valid alias prefixes.
+ *
+ * @deprecated in drupal:11.1.0 and is removed from drupal:12.0.0. Use
+ * \Drupal\path_alias\AliasPrefixList instead.
+ *
+ * @see https://www.drupal.org/node/3467559
  */
-class AliasWhitelist extends CacheCollector implements AliasWhitelistInterface {
-
-  /**
-   * The Key/Value Store to use for state.
-   *
-   * @var \Drupal\Core\State\StateInterface
-   */
-  protected $state;
-
-  /**
-   * The path alias repository.
-   *
-   * @var \Drupal\path_alias\AliasRepositoryInterface
-   */
-  protected $pathAliasRepository;
-
-  /**
-   * Constructs an AliasWhitelist object.
-   *
-   * @param string $cid
-   *   The cache id to use.
-   * @param \Drupal\Core\Cache\CacheBackendInterface $cache
-   *   The cache backend.
-   * @param \Drupal\Core\Lock\LockBackendInterface $lock
-   *   The lock backend.
-   * @param \Drupal\Core\State\StateInterface $state
-   *   The state keyvalue store.
-   * @param \Drupal\path_alias\AliasRepositoryInterface $alias_repository
-   *   The path alias repository.
-   */
-  public function __construct($cid, CacheBackendInterface $cache, LockBackendInterface $lock, StateInterface $state, AliasRepositoryInterface $alias_repository) {
-    parent::__construct($cid, $cache, $lock);
-    $this->state = $state;
-    $this->pathAliasRepository = $alias_repository;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function lazyLoadCache() {
-    parent::lazyLoadCache();
-
-    // On a cold start $this->storage will be empty and the whitelist will
-    // need to be rebuilt from scratch. The whitelist is initialized from the
-    // list of all valid path roots stored in the 'router.path_roots' state,
-    // with values initialized to NULL. During the request, each path requested
-    // that matches one of these keys will be looked up and the array value set
-    // to either TRUE or FALSE. This ensures that paths which do not exist in
-    // the router are not looked up, and that paths that do exist in the router
-    // are only looked up once.
-    if (empty($this->storage)) {
-      $this->loadMenuPathRoots();
-    }
-  }
-
-  /**
-   * Loads menu path roots to prepopulate cache.
-   */
-  protected function loadMenuPathRoots() {
-    if ($roots = $this->state->get('router.path_roots')) {
-      foreach ($roots as $root) {
-        $this->storage[$root] = NULL;
-        $this->persist($root);
-      }
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function get($offset) {
-    $this->lazyLoadCache();
-    // This may be called with paths that are not represented by menu router
-    // items such as paths that will be rewritten by hook_url_outbound_alter().
-    // Therefore internally TRUE is used to indicate whitelisted paths. FALSE is
-    // used to indicate paths that have already been checked but are not
-    // whitelisted, and NULL indicates paths that have not been checked yet.
-    if (isset($this->storage[$offset])) {
-      if ($this->storage[$offset]) {
-        return TRUE;
-      }
-    }
-    elseif (array_key_exists($offset, $this->storage)) {
-      return $this->resolveCacheMiss($offset);
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function resolveCacheMiss($root) {
-    $exists = $this->pathAliasRepository->pathHasMatchingAlias('/' . $root);
-    $this->storage[$root] = $exists;
-    $this->persist($root);
-    if ($exists) {
-      return TRUE;
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function clear() {
-    parent::clear();
-    $this->loadMenuPathRoots();
-  }
-
-}
+class AliasWhitelist extends AliasPrefixList {}
diff --git a/core/modules/path_alias/src/AliasWhitelistInterface.php b/core/modules/path_alias/src/AliasWhitelistInterface.php
index dae0239d5d9e..ed4ff988680b 100644
--- a/core/modules/path_alias/src/AliasWhitelistInterface.php
+++ b/core/modules/path_alias/src/AliasWhitelistInterface.php
@@ -2,14 +2,12 @@
 
 namespace Drupal\path_alias;
 
-use Drupal\Core\Cache\CacheCollectorInterface;
-
 /**
- * Cache the alias whitelist.
+ * Cache a list of valid alias prefixes.
+ *
+ * @deprecated in drupal:11.1.0 and is removed from drupal:12.0.0.
+ * Use \Drupal\path_alias\AliasPrefixListInterface instead.
  *
- * The whitelist contains the first element of the router paths of all
- * aliases. For example, if /node/12345 has an alias then "node" is added to
- * the whitelist. This optimization allows skipping the lookup for every
- * /user/{user} path if "user" is not in the whitelist.
+ * @see https://www.drupal.org/node/3467559
  */
-interface AliasWhitelistInterface extends CacheCollectorInterface {}
+interface AliasWhitelistInterface extends AliasPrefixListInterface {}
diff --git a/core/modules/path_alias/tests/src/Kernel/AliasTest.php b/core/modules/path_alias/tests/src/Kernel/AliasTest.php
index 4cf3e2536cd9..cc115a0ca7a7 100644
--- a/core/modules/path_alias/tests/src/Kernel/AliasTest.php
+++ b/core/modules/path_alias/tests/src/Kernel/AliasTest.php
@@ -9,7 +9,7 @@
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\KernelTests\KernelTestBase;
 use Drupal\path_alias\AliasManager;
-use Drupal\path_alias\AliasWhitelist;
+use Drupal\path_alias\AliasPrefixList;
 use Drupal\Tests\Traits\Core\PathAliasTestTrait;
 
 /**
@@ -34,7 +34,7 @@ class AliasTest extends KernelTestBase {
   protected function setUp(): void {
     parent::setUp();
 
-    // The alias whitelist expects that the menu path roots are set by a
+    // The alias prefix list expects that the menu path roots are set by a
     // menu router rebuild.
     \Drupal::state()->set('router.path_roots', ['user', 'admin']);
 
@@ -358,114 +358,114 @@ public function testLookupPath(): void {
   }
 
   /**
-   * Tests the alias whitelist.
+   * Tests the alias prefix.
    */
-  public function testWhitelist(): void {
+  public function testPrefixList(): void {
     $memoryCounterBackend = new MemoryCounterBackend(\Drupal::service(TimeInterface::class));
 
     // Create AliasManager and Path object.
-    $whitelist = new AliasWhitelist('path_alias_whitelist', $memoryCounterBackend, $this->container->get('lock'), $this->container->get('state'), $this->container->get('path_alias.repository'));
-    $aliasManager = new AliasManager($this->container->get('path_alias.repository'), $whitelist, $this->container->get('language_manager'), $memoryCounterBackend, $this->container->get(TimeInterface::class));
+    $prefix_list = new AliasPrefixList('path_alias_prefix_list', $memoryCounterBackend, $this->container->get('lock'), $this->container->get('state'), $this->container->get('path_alias.repository'));
+    $aliasManager = new AliasManager($this->container->get('path_alias.repository'), $prefix_list, $this->container->get('language_manager'), $memoryCounterBackend, $this->container->get(TimeInterface::class));
 
     // No alias for user and admin yet, so should be NULL.
-    $this->assertNull($whitelist->get('user'));
-    $this->assertNull($whitelist->get('admin'));
+    $this->assertNull($prefix_list->get('user'));
+    $this->assertNull($prefix_list->get('admin'));
 
     // Non-existing path roots should be NULL too. Use a length of 7 to avoid
     // possible conflict with random aliases below.
-    $this->assertNull($whitelist->get($this->randomMachineName()));
+    $this->assertNull($prefix_list->get($this->randomMachineName()));
 
-    // Add an alias for user/1, user should get whitelisted now.
+    // Add an alias for user/1, user should get cached now.
     $this->createPathAlias('/user/1', '/' . $this->randomMachineName());
     $aliasManager->cacheClear();
-    $this->assertTrue($whitelist->get('user'));
-    $this->assertNull($whitelist->get('admin'));
-    $this->assertNull($whitelist->get($this->randomMachineName()));
+    $this->assertTrue($prefix_list->get('user'));
+    $this->assertNull($prefix_list->get('admin'));
+    $this->assertNull($prefix_list->get($this->randomMachineName()));
 
-    // Add an alias for admin, both should get whitelisted now.
+    // Add an alias for admin, both should get cached now.
     $this->createPathAlias('/admin/something', '/' . $this->randomMachineName());
     $aliasManager->cacheClear();
-    $this->assertTrue($whitelist->get('user'));
-    $this->assertTrue($whitelist->get('admin'));
-    $this->assertNull($whitelist->get($this->randomMachineName()));
+    $this->assertTrue($prefix_list->get('user'));
+    $this->assertTrue($prefix_list->get('admin'));
+    $this->assertNull($prefix_list->get($this->randomMachineName()));
 
-    // Remove the user alias again, whitelist entry should be removed.
+    // Remove the user alias again, prefix list entry should be removed.
     $path_alias_storage = $this->container->get('entity_type.manager')->getStorage('path_alias');
     $entities = $path_alias_storage->loadByProperties(['path' => '/user/1']);
     $path_alias_storage->delete($entities);
     $aliasManager->cacheClear();
-    $this->assertNull($whitelist->get('user'));
-    $this->assertTrue($whitelist->get('admin'));
-    $this->assertNull($whitelist->get($this->randomMachineName()));
+    $this->assertNull($prefix_list->get('user'));
+    $this->assertTrue($prefix_list->get('admin'));
+    $this->assertNull($prefix_list->get($this->randomMachineName()));
 
-    // Destruct the whitelist so that the caches are written.
-    $whitelist->destruct();
-    $this->assertEquals(1, $memoryCounterBackend->getCounter('set', 'path_alias_whitelist'));
+    // Destruct the prefix list so that the caches are written.
+    $prefix_list->destruct();
+    $this->assertEquals(1, $memoryCounterBackend->getCounter('set', 'path_alias_prefix_list'));
     $memoryCounterBackend->resetCounter();
 
-    // Re-initialize the whitelist using the same cache backend, should load
+    // Re-initialize the prefix list using the same cache backend, should load
     // from cache.
-    $whitelist = new AliasWhitelist('path_alias_whitelist', $memoryCounterBackend, $this->container->get('lock'), $this->container->get('state'), $this->container->get('path_alias.repository'));
-    $this->assertNull($whitelist->get('user'));
-    $this->assertTrue($whitelist->get('admin'));
-    $this->assertNull($whitelist->get($this->randomMachineName()));
-    $this->assertEquals(1, $memoryCounterBackend->getCounter('get', 'path_alias_whitelist'));
-    $this->assertEquals(0, $memoryCounterBackend->getCounter('set', 'path_alias_whitelist'));
-
-    // Destruct the whitelist, should not attempt to write the cache again.
-    $whitelist->destruct();
-    $this->assertEquals(1, $memoryCounterBackend->getCounter('get', 'path_alias_whitelist'));
-    $this->assertEquals(0, $memoryCounterBackend->getCounter('set', 'path_alias_whitelist'));
+    $prefix_list = new AliasPrefixList('path_alias_prefix_list', $memoryCounterBackend, $this->container->get('lock'), $this->container->get('state'), $this->container->get('path_alias.repository'));
+    $this->assertNull($prefix_list->get('user'));
+    $this->assertTrue($prefix_list->get('admin'));
+    $this->assertNull($prefix_list->get($this->randomMachineName()));
+    $this->assertEquals(1, $memoryCounterBackend->getCounter('get', 'path_alias_prefix_list'));
+    $this->assertEquals(0, $memoryCounterBackend->getCounter('set', 'path_alias_prefix_list'));
+
+    // Destruct the prefix list, should not attempt to write the cache again.
+    $prefix_list->destruct();
+    $this->assertEquals(1, $memoryCounterBackend->getCounter('get', 'path_alias_prefix_list'));
+    $this->assertEquals(0, $memoryCounterBackend->getCounter('set', 'path_alias_prefix_list'));
   }
 
   /**
-   * Tests situation where the whitelist cache is deleted mid-request.
+   * Tests situation where the prefix list  cache is deleted mid-request.
    */
-  public function testWhitelistCacheDeletionMidRequest(): void {
+  public function testPrefixListCacheDeletionMidRequest() {
     $memoryCounterBackend = new MemoryCounterBackend(\Drupal::service(TimeInterface::class));
 
     // Create AliasManager and Path object.
-    $whitelist = new AliasWhitelist('path_alias_whitelist', $memoryCounterBackend, $this->container->get('lock'), $this->container->get('state'), $this->container->get('path_alias.repository'));
+    $prefix_list = new AliasPrefixList('path_alias_prefix_list', $memoryCounterBackend, $this->container->get('lock'), $this->container->get('state'), $this->container->get('path_alias.repository'));
 
-    // Whitelist cache should not exist at all yet.
-    $this->assertFalse($memoryCounterBackend->get('path_alias_whitelist'));
+    // Prefix list cache should not exist at all yet.
+    $this->assertFalse($memoryCounterBackend->get('path_alias_prefix_list'));
 
     // Add some aliases for both menu routes we have.
     $this->createPathAlias('/admin/something', '/' . $this->randomMachineName());
     $this->createPathAlias('/user/something', '/' . $this->randomMachineName());
 
-    // Lookup admin path in whitelist. It will query the DB and figure out
-    // that it indeed has an alias, and add it to the internal whitelist and
+    // Lookup admin path in prefix list. It will query the DB and figure out
+    // that it indeed has an alias, and add it to the internal prefix list and
     // flag it to be persisted to cache.
-    $this->assertTrue($whitelist->get('admin'));
+    $this->assertTrue($prefix_list->get('admin'));
 
-    // Destruct the whitelist so it persists its cache.
-    $whitelist->destruct();
-    $this->assertEquals(1, $memoryCounterBackend->getCounter('set', 'path_alias_whitelist'));
+    // Destruct the prefix list so it persists its cache.
+    $prefix_list->destruct();
+    $this->assertEquals(1, $memoryCounterBackend->getCounter('set', 'path_alias_prefix_list'));
     // Cache data should have data for 'user' and 'admin', even though just
     // 'admin' was looked up. This is because the cache is primed with all
     // menu router base paths.
-    $this->assertEquals(['user' => FALSE, 'admin' => TRUE], $memoryCounterBackend->get('path_alias_whitelist')->data);
+    $this->assertEquals(['user' => FALSE, 'admin' => TRUE], $memoryCounterBackend->get('path_alias_prefix_list')->data);
     $memoryCounterBackend->resetCounter();
 
-    // Re-initialize the whitelist and lookup an alias for the 'user' path.
-    // Whitelist should load data from its cache, see that it hasn't done a
+    // Re-initialize the prefix list and lookup an alias for the 'user' path.
+    // Prefix list should load data from its cache, see that it hasn't done a
     // check for 'user' yet, perform the check, then mark the result to be
     // persisted to cache.
-    $whitelist = new AliasWhitelist('path_alias_whitelist', $memoryCounterBackend, $this->container->get('lock'), $this->container->get('state'), $this->container->get('path_alias.repository'));
-    $this->assertTrue($whitelist->get('user'));
+    $prefix_list = new AliasPrefixList('path_alias_prefix_list', $memoryCounterBackend, $this->container->get('lock'), $this->container->get('state'), $this->container->get('path_alias.repository'));
+    $this->assertTrue($prefix_list->get('user'));
 
-    // Delete the whitelist cache. This could happen from an outside process,
+    // Delete the prefix list cache. This could happen from an outside process,
     // like a code deployment that performs a cache rebuild.
-    $memoryCounterBackend->delete('path_alias_whitelist');
-
-    // Destruct whitelist so it attempts to save the whitelist data to cache.
-    // However it should recognize that the previous cache entry was deleted
-    // from underneath it and not save anything to cache, to protect from
-    // cache corruption.
-    $whitelist->destruct();
-    $this->assertEquals(0, $memoryCounterBackend->getCounter('set', 'path_alias_whitelist'));
-    $this->assertFalse($memoryCounterBackend->get('path_alias_whitelist'));
+    $memoryCounterBackend->delete('path_alias_prefix_list');
+
+    // Destruct prefix list so it attempts to save the prefix list data to
+    // cache. However it should recognize that the previous cache entry was
+    // deleted from underneath it and not save anything to cache, to protect
+    // from cache corruption.
+    $prefix_list->destruct();
+    $this->assertEquals(0, $memoryCounterBackend->getCounter('set', 'path_alias_prefix_list'));
+    $this->assertFalse($memoryCounterBackend->get('path_alias_prefix_list'));
     $memoryCounterBackend->resetCounter();
   }
 
diff --git a/core/modules/path_alias/tests/src/Unit/AliasManagerTest.php b/core/modules/path_alias/tests/src/Unit/AliasManagerTest.php
index f5e1be108d34..9c36199fc5e7 100644
--- a/core/modules/path_alias/tests/src/Unit/AliasManagerTest.php
+++ b/core/modules/path_alias/tests/src/Unit/AliasManagerTest.php
@@ -32,11 +32,11 @@ class AliasManagerTest extends UnitTestCase {
   protected $aliasRepository;
 
   /**
-   * Alias whitelist.
+   * Alias prefix list.
    *
-   * @var \Drupal\path_alias\AliasWhitelistInterface|\PHPUnit\Framework\MockObject\MockObject
+   * @var \Drupal\path_alias\AliasPrefixListInterface|\PHPUnit\Framework\MockObject\MockObject
    */
-  protected $aliasWhitelist;
+  protected $aliasPrefixList;
 
   /**
    * Language manager.
@@ -73,11 +73,11 @@ protected function setUp(): void {
     parent::setUp();
 
     $this->aliasRepository = $this->createMock(AliasRepositoryInterface::class);
-    $this->aliasWhitelist = $this->createMock('Drupal\path_alias\AliasWhitelistInterface');
+    $this->aliasPrefixList = $this->createMock('Drupal\path_alias\AliasPrefixListInterface');
     $this->languageManager = $this->createMock('Drupal\Core\Language\LanguageManagerInterface');
     $this->cache = $this->createMock('Drupal\Core\Cache\CacheBackendInterface');
 
-    $this->aliasManager = new AliasManager($this->aliasRepository, $this->aliasWhitelist, $this->languageManager, $this->cache, new Time());
+    $this->aliasManager = new AliasManager($this->aliasRepository, $this->aliasPrefixList, $this->languageManager, $this->cache, new Time());
 
   }
 
@@ -150,23 +150,23 @@ public function testGetPathByAliasLangcode(): void {
   }
 
   /**
-   * Tests the getAliasByPath method for a path that is not in the whitelist.
+   * Tests the getAliasByPath method for a path that is not in the prefix list.
    *
    * @covers ::getAliasByPath
    */
-  public function testGetAliasByPathWhitelist(): void {
+  public function testGetAliasByPathPrefixList() {
     $path_part1 = $this->randomMachineName();
     $path_part2 = $this->randomMachineName();
     $path = '/' . $path_part1 . '/' . $path_part2;
 
     $this->setUpCurrentLanguage();
 
-    $this->aliasWhitelist->expects($this->any())
+    $this->aliasPrefixList->expects($this->any())
       ->method('get')
       ->with($path_part1)
       ->willReturn(FALSE);
 
-    // The whitelist returns FALSE for that path part, so the storage should
+    // The prefix list returns FALSE for that path part, so the storage should
     // never be called.
     $this->aliasRepository->expects($this->never())
       ->method('lookupBySystemPath');
@@ -188,7 +188,7 @@ public function testGetAliasByPathNoMatch(): void {
 
     $this->aliasManager->setCacheKey($this->path);
 
-    $this->aliasWhitelist->expects($this->any())
+    $this->aliasPrefixList->expects($this->any())
       ->method('get')
       ->with($path_part1)
       ->willReturn(TRUE);
@@ -236,7 +236,7 @@ public function testGetAliasByPathMatch(): void {
 
     $this->aliasManager->setCacheKey($this->path);
 
-    $this->aliasWhitelist->expects($this->any())
+    $this->aliasPrefixList->expects($this->any())
       ->method('get')
       ->with($path_part1)
       ->willReturn(TRUE);
@@ -288,7 +288,7 @@ public function testGetAliasByPathCachedMatch(): void {
     // Simulate a request so that the preloaded paths are fetched.
     $this->aliasManager->setCacheKey($this->path);
 
-    $this->aliasWhitelist->expects($this->any())
+    $this->aliasPrefixList->expects($this->any())
       ->method('get')
       ->with($path_part1)
       ->willReturn(TRUE);
@@ -336,7 +336,7 @@ public function testGetAliasByPathCachedMissLanguage(): void {
     // Simulate a request so that the preloaded paths are fetched.
     $this->aliasManager->setCacheKey($this->path);
 
-    $this->aliasWhitelist->expects($this->any())
+    $this->aliasPrefixList->expects($this->any())
       ->method('get')
       ->with($path_part1)
       ->willReturn(TRUE);
@@ -385,7 +385,7 @@ public function testGetAliasByPathCachedMissNoAlias(): void {
     // Simulate a request so that the preloaded paths are fetched.
     $this->aliasManager->setCacheKey($this->path);
 
-    $this->aliasWhitelist->expects($this->any())
+    $this->aliasPrefixList->expects($this->any())
       ->method('get')
       ->with($path_part1)
       ->willReturn(TRUE);
@@ -433,7 +433,7 @@ public function testGetAliasByPathUncachedMissNoAlias(): void {
     // Simulate a request so that the preloaded paths are fetched.
     $this->aliasManager->setCacheKey($this->path);
 
-    $this->aliasWhitelist->expects($this->any())
+    $this->aliasPrefixList->expects($this->any())
       ->method('get')
       ->with($path_part1)
       ->willReturn(TRUE);
@@ -470,7 +470,7 @@ public function testCacheClear(): void {
       ->method('lookupBySystemPath')
       ->with($path, $language->getId())
       ->willReturn(['alias' => $alias]);
-    $this->aliasWhitelist->expects($this->any())
+    $this->aliasPrefixList->expects($this->any())
       ->method('get')
       ->willReturn(TRUE);
 
@@ -519,7 +519,7 @@ public function testGetAliasByPathUncachedMissWithAlias(): void {
     // Simulate a request so that the preloaded paths are fetched.
     $this->aliasManager->setCacheKey($this->path);
 
-    $this->aliasWhitelist->expects($this->any())
+    $this->aliasPrefixList->expects($this->any())
       ->method('get')
       ->with($path_part1)
       ->willReturn(TRUE);
diff --git a/core/profiles/standard/tests/src/FunctionalJavascript/StandardPerformanceTest.php b/core/profiles/standard/tests/src/FunctionalJavascript/StandardPerformanceTest.php
index 543540dbc84a..09c91e1ac867 100644
--- a/core/profiles/standard/tests/src/FunctionalJavascript/StandardPerformanceTest.php
+++ b/core/profiles/standard/tests/src/FunctionalJavascript/StandardPerformanceTest.php
@@ -120,8 +120,8 @@ protected function testAnonymous(): void {
       'DELETE FROM "semaphore"  WHERE ("name" = "theme_registry:runtime:stark:Drupal\Core\Utility\ThemeRegistry") AND ("value" = "LOCK_ID")',
       'INSERT INTO "semaphore" ("name", "value", "expire") VALUES ("library_info:stark:Drupal\Core\Cache\CacheCollector", "LOCK_ID", "EXPIRE")',
       'DELETE FROM "semaphore"  WHERE ("name" = "library_info:stark:Drupal\Core\Cache\CacheCollector") AND ("value" = "LOCK_ID")',
-      'INSERT INTO "semaphore" ("name", "value", "expire") VALUES ("path_alias_whitelist:Drupal\Core\Cache\CacheCollector", "LOCK_ID", "EXPIRE")',
-      'DELETE FROM "semaphore"  WHERE ("name" = "path_alias_whitelist:Drupal\Core\Cache\CacheCollector") AND ("value" = "LOCK_ID")',
+      'INSERT INTO "semaphore" ("name", "value", "expire") VALUES ("path_alias_prefix_list:Drupal\Core\Cache\CacheCollector", "LOCK_ID", "EXPIRE")',
+      'DELETE FROM "semaphore"  WHERE ("name" = "path_alias_prefix_list:Drupal\Core\Cache\CacheCollector") AND ("value" = "LOCK_ID")',
     ];
     $recorded_queries = $performance_data->getQueries();
     $this->assertSame($expected_queries, $recorded_queries);
-- 
GitLab