From: Leif Åstrand Date: Fri, 31 May 2013 12:16:16 +0000 (+0300) Subject: Ignore style resource that has already been added (#11667) X-Git-Tag: 7.1.0~90^2~1 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=03830aeb46d93d675fa01c35ce3700e30a4a9c7d;p=vaadin-framework.git Ignore style resource that has already been added (#11667) Change-Id: I828166f69c3ad1ac7e24c00de640c8645d2f2153 --- diff --git a/server/src/com/vaadin/server/Page.java b/server/src/com/vaadin/server/Page.java index d4c16fe7f7..11553527e0 100644 --- a/server/src/com/vaadin/server/Page.java +++ b/server/src/com/vaadin/server/Page.java @@ -21,11 +21,10 @@ import java.lang.reflect.Method; import java.net.URI; import java.net.URISyntaxException; import java.util.EventObject; -import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; -import java.util.Map; import com.vaadin.event.EventRouter; import com.vaadin.shared.ui.BorderStyle; @@ -307,6 +306,61 @@ public class Page implements Serializable { } } + private static interface InjectedStyle { + public void paint(int id, PaintTarget target) throws PaintException; + } + + private static class InjectedStyleString implements InjectedStyle { + + private String css; + + public InjectedStyleString(String css) { + this.css = css; + } + + @Override + public void paint(int id, PaintTarget target) throws PaintException { + target.startTag("css-string"); + target.addAttribute("id", id); + target.addText(css); + target.endTag("css-string"); + } + } + + private static class InjectedStyleResource implements InjectedStyle { + + private final Resource resource; + + public InjectedStyleResource(Resource resource) { + this.resource = resource; + } + + @Override + public void paint(int id, PaintTarget target) throws PaintException { + target.startTag("css-resource"); + target.addAttribute("id", id); + target.addAttribute("url", resource); + target.endTag("css-resource"); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } else if (obj instanceof InjectedStyleResource) { + InjectedStyleResource that = (InjectedStyleResource) obj; + return resource.equals(that.resource); + } else { + return false; + } + } + + @Override + public int hashCode() { + return resource.hashCode(); + } + } + /** * Contains dynamically injected styles injected in the HTML document at * runtime. @@ -315,16 +369,9 @@ public class Page implements Serializable { */ public static class Styles implements Serializable { - private final Map stringInjections = new HashMap(); - - private final Map resourceInjections = new HashMap(); + private LinkedHashSet injectedStyles = new LinkedHashSet(); - // The combined injection counter between both string and resource - // injections. Used as the key for the injection maps - private int injectionCounter = 0; - - // Points to the next injection that has not yet been made into the Page - private int nextInjectionPosition = 0; + private LinkedHashSet pendingInjections = new LinkedHashSet(); private final UI ui; @@ -344,7 +391,7 @@ public class Page implements Serializable { "Cannot inject null CSS string"); } - stringInjections.put(injectionCounter++, css); + pendingInjections.add(new InjectedStyleString(css)); ui.markAsDirty(); } @@ -360,43 +407,33 @@ public class Page implements Serializable { "Cannot inject null resource"); } - resourceInjections.put(injectionCounter++, resource); - ui.markAsDirty(); + InjectedStyleResource injection = new InjectedStyleResource( + resource); + if (!injectedStyles.contains(injection) + && pendingInjections.add(injection)) { + ui.markAsDirty(); + } } private void paint(PaintTarget target) throws PaintException { // If full repaint repaint all injections if (target.isFullRepaint()) { - nextInjectionPosition = 0; + injectedStyles.addAll(pendingInjections); + pendingInjections = injectedStyles; + injectedStyles = new LinkedHashSet(); } - if (injectionCounter > nextInjectionPosition) { + if (!pendingInjections.isEmpty()) { target.startTag("css-injections"); - while (injectionCounter > nextInjectionPosition) { - - String stringInjection = stringInjections - .get(nextInjectionPosition); - if (stringInjection != null) { - target.startTag("css-string"); - target.addAttribute("id", nextInjectionPosition); - target.addText(stringInjection); - target.endTag("css-string"); - } - - Resource resourceInjection = resourceInjections - .get(nextInjectionPosition); - if (resourceInjection != null) { - target.startTag("css-resource"); - target.addAttribute("id", nextInjectionPosition); - target.addAttribute("url", resourceInjection); - target.endTag("css-resource"); - } - - nextInjectionPosition++; + for (InjectedStyle pending : pendingInjections) { + int id = injectedStyles.size(); + pending.paint(id, target); + injectedStyles.add(pending); } + pendingInjections.clear(); target.endTag("css-injections"); } diff --git a/uitest/src/com/vaadin/tests/themes/CSSInjectTest.html b/uitest/src/com/vaadin/tests/themes/CSSInjectTest.html index 05a0f256c2..0c70d6f711 100644 --- a/uitest/src/com/vaadin/tests/themes/CSSInjectTest.html +++ b/uitest/src/com/vaadin/tests/themes/CSSInjectTest.html @@ -51,7 +51,16 @@ world-red - + + click + vaadin=runcomvaadinteststhemesCSSInjectTest::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[4]/VButton[0]/domChild[0]/domChild[0] + + + + screenCapture + + world-still-red + diff --git a/uitest/src/com/vaadin/tests/themes/CSSInjectTest.java b/uitest/src/com/vaadin/tests/themes/CSSInjectTest.java index f4448bf326..738d8fc681 100644 --- a/uitest/src/com/vaadin/tests/themes/CSSInjectTest.java +++ b/uitest/src/com/vaadin/tests/themes/CSSInjectTest.java @@ -22,14 +22,16 @@ public class CSSInjectTest extends TestBase { final Styles stylesheet = Page.getCurrent().getStyles(); // Inject some resources initially - stylesheet.add(new StreamResource(new StreamResource.StreamSource() { + final StreamResource initialResource = new StreamResource( + new StreamResource.StreamSource() { - @Override - public InputStream getStream() { - return new ByteArrayInputStream( - ".hello, .world { color:silver; }".getBytes()); - } - }, "mystyles-" + System.currentTimeMillis() + ".css")); + @Override + public InputStream getStream() { + return new ByteArrayInputStream( + ".hello, .world { color:silver; }".getBytes()); + } + }, "mystyles-" + System.currentTimeMillis() + ".css"); + stylesheet.add(initialResource); Label hello = new Label( "Hello world", @@ -72,6 +74,14 @@ public class CSSInjectTest extends TestBase { } }); addComponent(injectRandom); + + addComponent(new Button("Inject initial again!", + new Button.ClickListener() { + @Override + public void buttonClick(ClickEvent event) { + stylesheet.add(initialResource); + } + })); } @Override