]> source.dussan.org Git - vaadin-framework.git/commitdiff
fix: Check if injected CSS String is already in the list of injected styles (#12479)
authorTatu Lund <tatu@vaadin.com>
Tue, 16 Nov 2021 11:41:22 +0000 (13:41 +0200)
committerGitHub <noreply@github.com>
Tue, 16 Nov 2021 11:41:22 +0000 (13:41 +0200)
* Check if injected CSS String is already in the list of injected styles

* Change to package for unit testing

* Unit test

* Add missing imports

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) {