summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--server/src/com/vaadin/server/Page.java111
-rw-r--r--uitest/src/com/vaadin/tests/themes/CSSInjectTest.html11
-rw-r--r--uitest/src/com/vaadin/tests/themes/CSSInjectTest.java24
3 files changed, 101 insertions, 45 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");
}
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 @@
<td></td>
<td>world-red</td>
</tr>
-
+<tr>
+ <td>click</td>
+ <td>vaadin=runcomvaadinteststhemesCSSInjectTest::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[4]/VButton[0]/domChild[0]/domChild[0]</td>
+ <td></td>
+</tr>
+<tr>
+ <td>screenCapture</td>
+ <td></td>
+ <td>world-still-red</td>
+</tr>
</tbody></table>
</body>
</html>
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(
"<span class='hello'>Hello</span> <span class='world'>world</span>",
@@ -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