Browse Source

fix: Check if injected CSS String is already in the list of injected styles (#12479)

* Check if injected CSS String is already in the list of injected styles

* Change to package for unit testing

* Unit test

* Add missing imports
tags/8.15.0
Tatu Lund 2 years ago
parent
commit
0195c63e0b
No account linked to committer's email address

+ 25
- 4
server/src/main/java/com/vaadin/server/Page.java View 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();
}
}

/**

+ 24
- 0
server/src/test/java/com/vaadin/server/PageTest.java View 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) {

Loading…
Cancel
Save