]> source.dussan.org Git - vaadin-framework.git/commitdiff
fix: Ensure that injected list of CSS styles doesn't contain duplicates. (#12481)
authorAnna Koskinen <Ansku@users.noreply.github.com>
Wed, 17 Nov 2021 14:50:37 +0000 (16:50 +0200)
committerGitHub <noreply@github.com>
Wed, 17 Nov 2021 14:50:37 +0000 (16:50 +0200)
(#12479)

Authored-by: Tatu Lund <tatu@vaadin.com>
server/src/main/java/com/vaadin/server/Page.java
server/src/test/java/com/vaadin/server/PageTest.java

index 976d86ff8e26b2bfcdfc055d754e9b9745522953..bec3696620a2bc1c77045797fe92ecfb00c1cb7c 100644 (file)
@@ -422,6 +422,23 @@ public class Page implements Serializable {
             target.addText(css);
             target.endTag("css-string");
         }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (obj == this) {
+                return true;
+            } else if (obj instanceof InjectedStyleString) {
+                InjectedStyleString that = (InjectedStyleString) obj;
+                return css.equals(that.css);
+            } else {
+                return false;
+            }
+        }
+
+        @Override
+        public int hashCode() {
+            return css.hashCode();
+        }
     }
 
     private static class InjectedStyleResource implements InjectedStyle {
@@ -466,9 +483,9 @@ public class Page implements Serializable {
      */
     public static class Styles implements Serializable {
 
-        private LinkedHashSet<InjectedStyle> injectedStyles = new LinkedHashSet<>();
+        LinkedHashSet<InjectedStyle> injectedStyles = new LinkedHashSet<>();
 
-        private LinkedHashSet<InjectedStyle> pendingInjections = new LinkedHashSet<>();
+        LinkedHashSet<InjectedStyle> pendingInjections = new LinkedHashSet<>();
 
         private final UI ui;
 
@@ -488,8 +505,12 @@ public class Page implements Serializable {
                         "Cannot inject null CSS string");
             }
 
-            pendingInjections.add(new InjectedStyleString(css));
-            ui.markAsDirty();
+            InjectedStyleString injectedStyleString = new InjectedStyleString(
+                    css);
+            if (!injectedStyles.contains(injectedStyleString)
+                    && pendingInjections.add(injectedStyleString)) {
+                ui.markAsDirty();
+            }
         }
 
         /**
index adb9e93227c5ea368f563d1b370413423adb84d3..5ac4c5be1438e5b90103ef639c4a3c275dd858c2 100644 (file)
@@ -1,7 +1,10 @@
 package com.vaadin.server;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 
+import java.io.Writer;
+
 import org.easymock.EasyMock;
 import org.junit.Test;
 
@@ -45,6 +48,27 @@ public class PageTest {
                 page.getState(false).hasResizeListeners);
     }
 
+    @Test
+    public void cssStringInjectedTwice() throws PaintException {
+        TestPage page = new TestPage(EasyMock.createMock(UI.class),
+                EasyMock.createMock(PageState.class));
+        JsonPaintTarget paintTarget = new JsonPaintTarget(
+                EasyMock.createMock(LegacyCommunicationManager.class),
+                EasyMock.createMock(Writer.class), true);
+
+        page.getStyles().add(".my-style { color: red; }");
+        assertEquals(page.getStyles().pendingInjections.size(), 1);
+        page.paintContent(paintTarget);
+        assertEquals(page.getStyles().pendingInjections.size(), 0);
+        assertEquals(page.getStyles().injectedStyles.size(), 1);
+
+        page.getStyles().add(".my-style { color: red; }");
+        assertEquals(page.getStyles().pendingInjections.size(), 0);
+        page.paintContent(paintTarget);
+        assertEquals(page.getStyles().pendingInjections.size(), 0);
+        assertEquals(page.getStyles().injectedStyles.size(), 1);
+    }
+
     private static class TestPage extends Page {
 
         public TestPage(UI uI, PageState state) {