aboutsummaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorLeif Åstrand <leif@vaadin.com>2013-05-31 15:16:16 +0300
committerVaadin Code Review <review@vaadin.com>2013-06-03 10:12:01 +0000
commit03830aeb46d93d675fa01c35ce3700e30a4a9c7d (patch)
tree23a357793fab72add836fade9fad2f04a7feda55 /server
parent0d046d61c0c76073624feef7780256cb61561ce4 (diff)
downloadvaadin-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.java111
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");
}