Merge branch 'stable-3.9' into stable-3.10

* stable-3.9:
  Fix reloading of plugins registering dynamic items
  Update Material Icons
  Manage attach of ApiModule binding upon plugin reload
  Update git submodules
  Fix code comment position with Firefox

Release-Notes: skip
Change-Id: Ifc2176d84004af88777b5b0644efafbc8dff6ad9
diff --git a/java/com/google/gerrit/server/plugins/Plugin.java b/java/com/google/gerrit/server/plugins/Plugin.java
index b5ff041..3de7e27 100644
--- a/java/com/google/gerrit/server/plugins/Plugin.java
+++ b/java/com/google/gerrit/server/plugins/Plugin.java
@@ -78,7 +78,7 @@
 
   protected LifecycleManager manager;
 
-  private List<ReloadableRegistrationHandle<?>> reloadableHandles;
+  protected List<ReloadableRegistrationHandle<?>> reloadableHandles;
 
   public Plugin(
       String name, Path srcPath, PluginUser pluginUser, FileSnapshot snapshot, ApiType apiType) {
diff --git a/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java b/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java
index 7ecb6c6..10e5b59 100644
--- a/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java
+++ b/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java
@@ -363,6 +363,23 @@
       reattachItem(old, sysItems, newPlugin.getSysInjector(), newPlugin);
       reattachItem(old, sshItems, newPlugin.getSshInjector(), newPlugin);
       reattachItem(old, httpItems, newPlugin.getHttpInjector(), newPlugin);
+
+      apiInjector = Optional.ofNullable(newPlugin.getApiInjector()).orElse(apiInjector);
+
+      if (apiInjector != null) {
+        apiItems.putAll(dynamicItemsOf(apiInjector));
+        apiSets.putAll(dynamicSetsOf(apiInjector));
+        apiMaps.putAll(dynamicMapsOf(apiInjector));
+
+        ImmutableList<Injector> allPluginInjectors =
+            listOfInjectors(
+                newPlugin.getSysInjector(),
+                newPlugin.getSshInjector(),
+                newPlugin.getHttpInjector());
+        allPluginInjectors.forEach(i -> reattachItem(old, apiItems, i, newPlugin));
+        allPluginInjectors.forEach(i -> reattachSet(old, apiSets, i, newPlugin));
+        allPluginInjectors.forEach(i -> reattachMap(old, apiMaps, i, newPlugin));
+      }
     } finally {
       exit(oldContext);
     }
diff --git a/java/com/google/gerrit/server/plugins/ServerPlugin.java b/java/com/google/gerrit/server/plugins/ServerPlugin.java
index ba293ad..c7d62d1 100644
--- a/java/com/google/gerrit/server/plugins/ServerPlugin.java
+++ b/java/com/google/gerrit/server/plugins/ServerPlugin.java
@@ -58,7 +58,6 @@
   private Injector sshInjector;
   private Injector httpInjector;
   private LifecycleManager serverManager;
-  private List<ReloadableRegistrationHandle<?>> reloadableHandles;
 
   private Optional<Module> apiModule = Optional.empty();
 
diff --git a/lib/fonts/material-icons.woff2 b/lib/fonts/material-icons.woff2
index 11074da..4fd4a47 100644
--- a/lib/fonts/material-icons.woff2
+++ b/lib/fonts/material-icons.woff2
Binary files differ
diff --git a/polygerrit-ui/app/styles/material-icons.css b/polygerrit-ui/app/styles/material-icons.css
index 4c0313c..0cce879 100644
--- a/polygerrit-ui/app/styles/material-icons.css
+++ b/polygerrit-ui/app/styles/material-icons.css
@@ -1,8 +1,8 @@
 /**
- * This file has been produced by downloading this file on Sep 6, 2022:
+ * This file has been produced by downloading this file on June 11, 2024:
  * https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0..1,0
- * The corresponding ttf file was downloaded on Sep 6, 2022 from:
- * https://fonts.gstatic.com/s/materialsymbolsoutlined/v51/kJF4BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzBwG-RpA6RzaxHMPdY40KH8nGzv3fzfVJU22ZZLsYEpzC_1ver5Y0J1Llf.woff2
+ * The corresponding ttf file was downloaded on June 11, 2024 from:
+ * https://fonts.gstatic.com/s/materialsymbolsoutlined/v192/kJF4BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzBwG-RpA6RzaxHMPdY40KH8nGzv3fzfVJU22ZZLsYEpzC_1ver5Y0.woff2
  */
 @font-face {
   font-family: 'Material Symbols Outlined';