Add CssResource.ensureInjected(). Patch by: bobv Review by: rjrjr git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@6252 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/resources/Resources.gwt.xml b/user/src/com/google/gwt/resources/Resources.gwt.xml index 1db713a..3c66d64 100644 --- a/user/src/com/google/gwt/resources/Resources.gwt.xml +++ b/user/src/com/google/gwt/resources/Resources.gwt.xml
@@ -16,6 +16,8 @@ <module> <!-- Pull in the necessary base support, including user.agent detection --> <inherits name="com.google.gwt.core.Core" /> + <!-- Pull in StyleInjector for CssResource --> + <inherits name="com.google.gwt.dom.DOM" /> <!-- Used by ExternalTextResource --> <inherits name="com.google.gwt.http.HTTP" />
diff --git a/user/src/com/google/gwt/resources/client/CssResource.java b/user/src/com/google/gwt/resources/client/CssResource.java index 908c777..5020448 100644 --- a/user/src/com/google/gwt/resources/client/CssResource.java +++ b/user/src/com/google/gwt/resources/client/CssResource.java
@@ -285,6 +285,16 @@ } /** + * Calls + * {@link com.google.gwt.dom.client.StyleInjector#injectStylesheet(String)} to + * inject the contents of the CssResource into the DOM. Repeated calls to this + * method on an instance of a CssResources will have no effect. + * + * @return <code>true</code> if this method mutated the DOM. + */ + boolean ensureInjected(); + + /** * Provides the contents of the CssResource. */ String getText();
diff --git a/user/src/com/google/gwt/resources/rg/CssResourceGenerator.java b/user/src/com/google/gwt/resources/rg/CssResourceGenerator.java index db31336..85846d4 100644 --- a/user/src/com/google/gwt/resources/rg/CssResourceGenerator.java +++ b/user/src/com/google/gwt/resources/rg/CssResourceGenerator.java
@@ -30,6 +30,7 @@ import com.google.gwt.dev.util.DefaultTextOutput; import com.google.gwt.dev.util.Util; import com.google.gwt.dom.client.Element; +import com.google.gwt.dom.client.StyleInjector; import com.google.gwt.i18n.client.LocaleInfo; import com.google.gwt.resources.client.CssResource; import com.google.gwt.resources.client.CssResource.ClassName; @@ -405,6 +406,10 @@ } } + // Methods defined by CssResource interface + writeEnsureInjected(sw); + writeGetName(method, sw); + sw.println("public String getText() {"); sw.indent(); boolean strict = isStrict(logger, context, method); @@ -416,12 +421,6 @@ sw.outdent(); sw.println("}"); - sw.println("public String getName() {"); - sw.indent(); - sw.println("return \"" + method.getName() + "\";"); - sw.outdent(); - sw.println("}"); - /* * getOverridableMethods is used to handle CssResources extending * non-CssResource types. See the discussion in computeReplacementsForType. @@ -912,6 +911,28 @@ sw.println("}"); } + private void writeEnsureInjected(SourceWriter sw) { + sw.println("private boolean injected;"); + sw.println("public boolean ensureInjected() {"); + sw.indent(); + sw.println("if (!injected) {"); + sw.indentln("injected = true;"); + sw.indentln(StyleInjector.class.getName() + ".injectStylesheet(getText());"); + sw.indentln("return true;"); + sw.println("}"); + sw.println("return false;"); + sw.outdent(); + sw.println("}"); + } + + private void writeGetName(JMethod method, SourceWriter sw) { + sw.println("public String getName() {"); + sw.indent(); + sw.println("return \"" + method.getName() + "\";"); + sw.outdent(); + sw.println("}"); + } + /** * Write all of the user-defined methods in the CssResource subtype. */ @@ -927,7 +948,8 @@ for (JMethod toImplement : methods) { String name = toImplement.getName(); - if ("getName".equals(name) || "getText".equals(name)) { + if ("getName".equals(name) || "getText".equals(name) + || "ensureInjected".equals(name)) { continue; }
diff --git a/user/test/com/google/gwt/resources/client/CSSResourceTest.java b/user/test/com/google/gwt/resources/client/CSSResourceTest.java index b0c4664..3bb69ec 100644 --- a/user/test/com/google/gwt/resources/client/CSSResourceTest.java +++ b/user/test/com/google/gwt/resources/client/CSSResourceTest.java
@@ -135,6 +135,10 @@ @Strict HasDescendants descendants(); + // Make sure an empty, no-op CssResource works + @Strict + CssResource empty(); + @Source("16x16.png") ImageResource spriteMethod(); } @@ -292,6 +296,17 @@ assertFalse("10".equals(defines.overrideIntClass())); } + public void testEnsureInjected() { + Resources r = GWT.create(Resources.class); + assertTrue(r.empty().ensureInjected()); + + r = GWT.create(Resources.class); + assertFalse(r.empty().ensureInjected()); + + r = GWT.create(ChildResources.class); + assertTrue(r.empty().ensureInjected()); + } + public void testMultipleBundles() { Resources r1 = GWT.create(Resources.class); SiblingResources r2 = GWT.create(SiblingResources.class);
diff --git a/user/test/com/google/gwt/resources/client/empty.css b/user/test/com/google/gwt/resources/client/empty.css new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/user/test/com/google/gwt/resources/client/empty.css