From 8c8af4f3246a894211a299cd978d1c8da0eb5234 Mon Sep 17 00:00:00 2001
From: Lee Rowlands <lee.rowlands@previousnext.com.au>
Date: Wed, 14 Feb 2024 17:37:27 +1000
Subject: [PATCH] Issue #2366129 by andypost, stefan.r, smustgrave, vacho:
 RegisterStreamWrappersPass and other have broken compiler pass for multiple
 tags

---
 .../Compiler/RegisterStreamWrappersPass.php       | 15 ++++++++++-----
 .../file/tests/file_test/file_test.services.yml   |  5 +++++
 .../StreamWrapper/DummyMultipleStreamWrapper.php  | 10 ++++++++++
 .../src/Kernel/Extension/ModuleHandlerTest.php    |  2 ++
 4 files changed, 27 insertions(+), 5 deletions(-)
 create mode 100644 core/modules/file/tests/file_test/src/StreamWrapper/DummyMultipleStreamWrapper.php

diff --git a/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterStreamWrappersPass.php b/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterStreamWrappersPass.php
index d666af62e929..cb67305b1b0f 100644
--- a/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterStreamWrappersPass.php
+++ b/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterStreamWrappersPass.php
@@ -23,12 +23,17 @@ public function process(ContainerBuilder $container) {
     $stream_wrapper_manager = $container->getDefinition('stream_wrapper_manager');
 
     $services = [];
-    foreach ($container->findTaggedServiceIds('stream_wrapper') as $id => $attributes) {
+    foreach ($container->findTaggedServiceIds('stream_wrapper') as $id => $tags) {
       $class = $container->getDefinition($id)->getClass();
-      $scheme = $attributes[0]['scheme'];
-
-      $stream_wrapper_manager->addMethodCall('addStreamWrapper', [$id, $class, $scheme]);
-
+      // Loop through all the tags for this stream wrapper as we may have
+      // multiple schemes.
+      foreach ($tags as $attributes) {
+        $stream_wrapper_manager->addMethodCall('addStreamWrapper', [
+          $id,
+          $class,
+          $attributes['scheme'],
+        ]);
+      }
       $services[$id] = new Reference($id);
     }
     $stream_wrapper_manager->addArgument(ServiceLocatorTagPass::register($container, $services));
diff --git a/core/modules/file/tests/file_test/file_test.services.yml b/core/modules/file/tests/file_test/file_test.services.yml
index 51b048997a23..e70db1ebd651 100644
--- a/core/modules/file/tests/file_test/file_test.services.yml
+++ b/core/modules/file/tests/file_test/file_test.services.yml
@@ -15,3 +15,8 @@ services:
     class: Drupal\file_test\StreamWrapper\DummyExternalReadOnlyWrapper
     tags:
       - { name: stream_wrapper, scheme: dummy-external-readonly }
+  stream_wrapper.dummy_multiple:
+    class: Drupal\file_test\StreamWrapper\DummyMultipleStreamWrapper
+    tags:
+      - { name: stream_wrapper, scheme: dummy1 }
+      - { name: stream_wrapper, scheme: dummy2 }
diff --git a/core/modules/file/tests/file_test/src/StreamWrapper/DummyMultipleStreamWrapper.php b/core/modules/file/tests/file_test/src/StreamWrapper/DummyMultipleStreamWrapper.php
new file mode 100644
index 000000000000..76ac49d97a5f
--- /dev/null
+++ b/core/modules/file/tests/file_test/src/StreamWrapper/DummyMultipleStreamWrapper.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace Drupal\file_test\StreamWrapper;
+
+/**
+ * Helper class for testing the stream wrapper registry.
+ *
+ * Dummy stream wrapper implementation (dummy1://, dummy2://).
+ */
+class DummyMultipleStreamWrapper extends DummyStreamWrapper {}
diff --git a/core/modules/system/tests/src/Kernel/Extension/ModuleHandlerTest.php b/core/modules/system/tests/src/Kernel/Extension/ModuleHandlerTest.php
index d9b213f45a72..09718581e4c3 100644
--- a/core/modules/system/tests/src/Kernel/Extension/ModuleHandlerTest.php
+++ b/core/modules/system/tests/src/Kernel/Extension/ModuleHandlerTest.php
@@ -324,6 +324,8 @@ public function testModuleStreamWrappers() {
     file_exists('dummy://');
     $stream_wrappers = \Drupal::service('stream_wrapper_manager')->getWrappers();
     $this->assertTrue(isset($stream_wrappers['dummy']));
+    $this->assertTrue(isset($stream_wrappers['dummy1']));
+    $this->assertTrue(isset($stream_wrappers['dummy2']));
   }
 
   /**
-- 
GitLab