* Check if injected CSS String is already in the list of injected styles * Change to package for unit testing * Unit test * Add missing importstags/8.15.0
@@ -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(); | |||
} | |||
} | |||
/** |
@@ -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) { |