diff options
author | Leif Åstrand <leif@vaadin.com> | 2013-05-31 15:16:16 +0300 |
---|---|---|
committer | Vaadin Code Review <review@vaadin.com> | 2013-06-03 10:12:01 +0000 |
commit | 03830aeb46d93d675fa01c35ce3700e30a4a9c7d (patch) | |
tree | 23a357793fab72add836fade9fad2f04a7feda55 /server | |
parent | 0d046d61c0c76073624feef7780256cb61561ce4 (diff) | |
download | vaadin-framework-03830aeb46d93d675fa01c35ce3700e30a4a9c7d.tar.gz vaadin-framework-03830aeb46d93d675fa01c35ce3700e30a4a9c7d.zip |
Ignore style resource that has already been added (#11667)
Change-Id: I828166f69c3ad1ac7e24c00de640c8645d2f2153
Diffstat (limited to 'server')
-rw-r--r-- | server/src/com/vaadin/server/Page.java | 111 |
1 files changed, 74 insertions, 37 deletions
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<Integer, String> stringInjections = new HashMap<Integer, String>(); - - private final Map<Integer, Resource> resourceInjections = new HashMap<Integer, Resource>(); + private LinkedHashSet<InjectedStyle> injectedStyles = new LinkedHashSet<InjectedStyle>(); - // 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<InjectedStyle> pendingInjections = new LinkedHashSet<InjectedStyle>(); 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<InjectedStyle>(); } - 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"); } |