Switch CssResource to strict-by-default mode.
Patch by: bobv
Review by: rjrjr
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@6343 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 3c66d64..c392892 100644
--- a/user/src/com/google/gwt/resources/Resources.gwt.xml
+++ b/user/src/com/google/gwt/resources/Resources.gwt.xml
@@ -84,12 +84,6 @@
<define-configuration-property name="CssResource.mergeEnabled" is-multi-valued="false" />
<set-configuration-property name="CssResource.mergeEnabled" value="true" />
- <!-- This forces all CssResource accessor functions to have the @Strict -->
- <!-- annotation. This is intended primarily for application developers and -->
- <!-- the library test code. -->
- <define-configuration-property name="CssResource.strictAccessors" is-multi-valued="false" />
- <set-configuration-property name="CssResource.strictAccessors" value="false" />
-
<!-- This allows the developer to use shorter obfuscated class names. -->
<!-- Is is valid to extend this property to use a custom name. -->
<define-configuration-property name="CssResource.obfuscationPrefix" is-multi-valued="false" />
diff --git a/user/src/com/google/gwt/resources/client/CssResource.java b/user/src/com/google/gwt/resources/client/CssResource.java
index 5020448..a35af8f 100644
--- a/user/src/com/google/gwt/resources/client/CssResource.java
+++ b/user/src/com/google/gwt/resources/client/CssResource.java
@@ -50,8 +50,8 @@
* <li>{@code @eval NAME Java-expression; .myClass background: NAME;} Define a
* constant based on a Java expression.</li>
* <li>{@code @external class-name, class-name, ...;} Disable obfuscation for
- * specific class selectors and exclude those class selectors from
- * {@link Strict} requirements.</li>
+ * specific class selectors and exclude those class selectors from strictness
+ * requirements.</li>
* <li><code>{@literal @if} [!]property list of values {ruleBlock}</code> Include or
* exclude CSS rules based on the value of a deferred-binding property. Also
* {@code @elif} and {@code @else} follow the same pattern.<br/>
@@ -92,6 +92,51 @@
* </li>
* </ul>
*
+ * <p>
+ * Any class selectors that do not correspond with a String accessor method in
+ * the return type will trigger a compilation error. This ensures that the
+ * CssResource does not contribute any unobfuscated class selectors into the
+ * global CSS namespace. Strict mode can be disabled by annotating the
+ * ClientBundle method declaration with {@link NotStrict}, however this is only
+ * recommended for interacting with legacy CSS.
+ *
+ * <p>
+ * Given these interfaces:
+ *
+ * <pre>
+ * interface MyCss extends CssResource {
+ * String someClass();
+ * }
+ *
+ * interface MyBundle extends ClientBundle {
+ * {@literal @Source("my.css")}
+ * MyCss css();
+ * }
+ * </pre>
+ *
+ * the source CSS will fail to compile if it does not contain exactly the one
+ * class selector defined in the MyCss type.
+ * <p>
+ * The {@code @external} at-rule can be used in strict mode to indicate that
+ * certain class selectors are exempt from the strict semantics. Class selectors
+ * marked as external will not be obfuscated and are not required to have string
+ * accessor functions. Consider the following example in conjunction with the
+ * above <code>MyCss</code> interface:
+ *
+ * <pre>
+ * {@literal @external} .foo, .bar;
+ * .foo .someClass .bar { .... }
+ * </pre>
+ *
+ * The resulting CSS would look like:
+ *
+ * <pre>
+ * .foo .A1234 .bar { .... }
+ * </pre>
+ *
+ * If a <code>String foo()</code> method were defined in <code>MyCss</code>, it
+ * would return the string value "<code>foo</code>".
+ *
* @see <a href="http://code.google.com/p/google-web-toolkit/wiki/CssResource"
* >CssResource design doc</a>
*/
@@ -183,6 +228,14 @@
* method in the return type or an {@code @external} declaration should not
* trigger a compilation error. This annotation is not recommended for new
* code.
+ *
+ * <pre>
+ * interface Resources extends ClientBundle {
+ * {@literal @NotStrict}
+ * {@literal @Source}("legacy.css")
+ * CssResource css();
+ * }
+ * </pre>
*/
@Documented
@Target(ElementType.METHOD)
@@ -234,52 +287,11 @@
}
/**
- * The presence of this annotation on a CssResource accessor method indicates
- * that any class selectors that do not correspond with a String accessor
- * method in the return type should trigger a compilation error. In the
- * default case, any unobfuscatable class selectors will be emitted as-is.
- * This annotation ensures that the CssResource does not contribute any
- * unobfuscated class selectors into the global CSS namespace and is
- * recommended as the default behavior for CssResources.
- * <p>
- * Given these interfaces:
+ * This annotation is a no-op.
*
- * <pre>
- * interface MyCss extends CssResource {
- * String someClass();
- * }
- *
- * interface MyBundle extends ClientBundle {
- * {@literal @Source("my.css")}
- * {@literal @Strict}
- * MyCss css();
- * }
- * </pre>
- *
- * the source CSS will fail to compile if it does not contain exactly the one
- * class selector defined in the MyCss type.
- * <p>
- * The {@code @external} at-rule can be used in strict mode to indicate that
- * certain class selectors are exempt from the strict semantics. Class
- * selectors marked as external will not be obfuscated and are not required to
- * have string accessor functions. Consider the following example in
- * conjunction with the above <code>MyCss</code> interface:
- *
- * <pre>
- * {@literal @external} .foo, .bar;
- * .foo .someClass .bar { .... }
- * </pre>
- *
- * The resulting CSS would look like:
- *
- * <pre>
- * .foo .A1234 .bar { .... }
- * </pre>
- *
- * If a <code>String foo()</code> method were defined in <code>MyCss</code>,
- * it would return the string value "<code>foo</code>".
+ * @deprecated Strict mode is now the default behavior for CssResource
*/
- @Documented
+ @Deprecated
@Target(ElementType.METHOD)
public @interface Strict {
}
diff --git a/user/src/com/google/gwt/resources/css/ast/CssExternalSelectors.java b/user/src/com/google/gwt/resources/css/ast/CssExternalSelectors.java
index 22e1aed..c79491b 100644
--- a/user/src/com/google/gwt/resources/css/ast/CssExternalSelectors.java
+++ b/user/src/com/google/gwt/resources/css/ast/CssExternalSelectors.java
@@ -22,8 +22,6 @@
* An AST node that allows the developer to indicate that certain class
* selectors appearing in the stylesheet should be considered external and not
* subject to obfuscation requirements.
- *
- * @see CssResource.Strict
*/
public class CssExternalSelectors extends CssNode {
diff --git a/user/src/com/google/gwt/resources/rg/CssResourceGenerator.java b/user/src/com/google/gwt/resources/rg/CssResourceGenerator.java
index 85846d4..3922349 100644
--- a/user/src/com/google/gwt/resources/rg/CssResourceGenerator.java
+++ b/user/src/com/google/gwt/resources/rg/CssResourceGenerator.java
@@ -713,54 +713,27 @@
computeObfuscatedNames(logger, classPrefix, cssResourceSubtypes);
}
+ /**
+ * Check for the presence of the NotStrict annotation on the method. This will
+ * also perform some limited sanity-checking for the now-deprecated Strict
+ * annotation.
+ */
+ @SuppressWarnings("deprecation")
private boolean isStrict(TreeLogger logger, ResourceContext context,
JMethod method) {
Strict strictAnnotation = method.getAnnotation(Strict.class);
NotStrict nonStrictAnnotation = method.getAnnotation(NotStrict.class);
- boolean strict = false;
+ boolean strict = true;
if (strictAnnotation != null && nonStrictAnnotation != null) {
// Both annotations
logger.log(TreeLogger.WARN, "Contradictory annotations "
+ Strict.class.getName() + " and " + NotStrict.class.getName()
+ " applied to the CssResource accessor method; assuming strict");
- strict = true;
-
- } else if (strictAnnotation == null && nonStrictAnnotation == null) {
- // Neither annotation
-
- /*
- * Fall back to using the to-be-deprecated strictAccessor property.
- */
- try {
- PropertyOracle propertyOracle = context.getGeneratorContext().getPropertyOracle();
- ConfigurationProperty prop = propertyOracle.getConfigurationProperty("CssResource.strictAccessors");
- String propertyValue = prop.getValues().get(0);
- if (Boolean.valueOf(propertyValue)) {
- logger.log(TreeLogger.WARN,
- "CssResource.strictAccessors is true, but " + method.getName()
- + "() is missing the @Strict annotation.");
- strict = true;
- }
- } catch (BadPropertyValueException e) {
- // Ignore
- }
-
- if (!strict) {
- // This is a temporary warning during the transitional phase
- logger.log(TreeLogger.WARN, "Accessor does not specify "
- + Strict.class.getName() + " or " + NotStrict.class.getName()
- + ". The default behavior will change from non-strict "
- + "to strict in a future revision.");
- }
} else if (nonStrictAnnotation != null) {
// Only the non-strict annotation
strict = false;
-
- } else if (strictAnnotation != null) {
- // Only the strict annotation
- strict = true;
}
return strict;
diff --git a/user/src/com/google/gwt/uibinder/rebind/BundleWriter.java b/user/src/com/google/gwt/uibinder/rebind/BundleWriter.java
index b134c8b..80aff7f 100644
--- a/user/src/com/google/gwt/uibinder/rebind/BundleWriter.java
+++ b/user/src/com/google/gwt/uibinder/rebind/BundleWriter.java
@@ -20,7 +20,6 @@
import com.google.gwt.core.ext.typeinfo.TypeOracle;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.ImageResource;
-import com.google.gwt.resources.client.CssResource.Strict;
import com.google.gwt.resources.client.ImageResource.ImageOptions;
import com.google.gwt.resources.client.ImageResource.RepeatStyle;
import com.google.gwt.uibinder.rebind.model.ImplicitClientBundle;
@@ -38,7 +37,6 @@
private final TypeOracle oracle;
private final JClassType clientBundleType;
- private final JClassType strictAnnotationType;
private final JClassType imageOptionType;
private final JClassType imageResourceType;
private final JClassType repeatStyleType;
@@ -53,7 +51,6 @@
this.oracle = oracle;
clientBundleType = oracle.findType(ClientBundle.class.getName());
- strictAnnotationType = oracle.findType(Strict.class.getCanonicalName());
imageOptionType = oracle.findType(ImageOptions.class.getCanonicalName());
imageResourceType = oracle.findType(ImageResource.class.getCanonicalName());
repeatStyleType = oracle.findType(RepeatStyle.class.getCanonicalName());
@@ -79,7 +76,6 @@
writer.write("import %s;", imageResourceType.getQualifiedSourceName());
writer.write("import %s;", imageOptionType.getQualifiedSourceName());
writer.write("import %s;", clientBundleType.getQualifiedSourceName());
- writer.write("import %s;", strictAnnotationType.getQualifiedSourceName());
writer.newline();
// Open interface
@@ -89,7 +85,7 @@
// Write css methods
for (ImplicitCssResource css : bundleClass.getCssMethods()) {
- writer.write("@Strict @Source(\"%s\")", css.getSource());
+ writer.write("@Source(\"%s\")", css.getSource());
writer.write("%s %s();", css.getClassName(), css.getName());
writer.newline();
}
diff --git a/user/src/com/google/gwt/uibinder/sample/client/DomBasedUi.java b/user/src/com/google/gwt/uibinder/sample/client/DomBasedUi.java
index b57d160..1c687c1 100644
--- a/user/src/com/google/gwt/uibinder/sample/client/DomBasedUi.java
+++ b/user/src/com/google/gwt/uibinder/sample/client/DomBasedUi.java
@@ -21,7 +21,6 @@
import com.google.gwt.dom.client.StyleInjector;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.CssResource;
-import com.google.gwt.resources.client.CssResource.Strict;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
@@ -34,7 +33,6 @@
* Resources for this template.
*/
public interface Resources extends ClientBundle {
- @Strict
@Source("DomBasedUi.css")
Style style();
}
diff --git a/user/src/com/google/gwt/uibinder/sample/client/WidgetBasedUiExternalResources.java b/user/src/com/google/gwt/uibinder/sample/client/WidgetBasedUiExternalResources.java
index c142496..d06fc27 100644
--- a/user/src/com/google/gwt/uibinder/sample/client/WidgetBasedUiExternalResources.java
+++ b/user/src/com/google/gwt/uibinder/sample/client/WidgetBasedUiExternalResources.java
@@ -17,7 +17,6 @@
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.CssResource;
-import com.google.gwt.resources.client.CssResource.Strict;
/**
* Sample external resources used by {@link WidgetBasedUi}, to test
@@ -34,6 +33,5 @@
}
@Source("WidgetBasedUiExternal.css")
- @Strict
MyCss style();
}
diff --git a/user/test/com/google/gwt/resources/client/CSSResourceTest.java b/user/test/com/google/gwt/resources/client/CSSResourceTest.java
index 3bb69ec..bdf8ee9 100644
--- a/user/test/com/google/gwt/resources/client/CSSResourceTest.java
+++ b/user/test/com/google/gwt/resources/client/CSSResourceTest.java
@@ -21,7 +21,6 @@
import com.google.gwt.resources.client.CssResource.ImportedWithPrefix;
import com.google.gwt.resources.client.CssResource.NotStrict;
import com.google.gwt.resources.client.CssResource.Shared;
-import com.google.gwt.resources.client.CssResource.Strict;
/**
* Contains various full-stack tests of the CssResource system.
@@ -37,7 +36,6 @@
interface ConcatenatedResources extends ClientBundle {
@Source(value = {"concatenatedA.css", "concatenatedB.css"})
- @Strict
CssResource css();
}
@@ -112,11 +110,9 @@
Resources INSTANCE = GWT.create(Resources.class);
@Source("siblingTestA.css")
- @Strict
MyCssResourceA a();
@Source("siblingTestB.css")
- @Strict
MyCssResourceB b();
@Source("test.css")
@@ -127,16 +123,13 @@
DataResource dataMethod();
// Test default extensions
- @Strict
CssWithDefines deftest();
@Source("unrelatedDescendants.css")
@Import(value = {MyCssResourceA.class, MyCssResourceB.class})
- @Strict
HasDescendants descendants();
// Make sure an empty, no-op CssResource works
- @Strict
CssResource empty();
@Source("16x16.png")
@@ -157,11 +150,9 @@
interface SiblingResources extends ClientBundle {
@Source("siblingTestA.css")
- @Strict
MyCssResourceA a();
@Source("siblingTestB.css")
- @Strict
MyCssResourceB b();
}
diff --git a/user/test/com/google/gwt/uibinder/sample/client/UiBinderTest.java b/user/test/com/google/gwt/uibinder/sample/client/UiBinderTest.java
index 1f426ea..960cc9b 100644
--- a/user/test/com/google/gwt/uibinder/sample/client/UiBinderTest.java
+++ b/user/test/com/google/gwt/uibinder/sample/client/UiBinderTest.java
@@ -25,6 +25,7 @@
import com.google.gwt.junit.Platform;
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.resources.client.ClientBundle;
+import com.google.gwt.resources.client.CssResource.NotStrict;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.DisclosurePanel;
import com.google.gwt.user.client.ui.DockPanel;
@@ -238,7 +239,8 @@
interface Bundle extends ClientBundle {
@Source("WidgetBasedUi.css")
- public WidgetBasedUi.Style style();
+ @NotStrict
+ WidgetBasedUi.Style style();
}
public void testNoOverrideInheritedSharedCssClasses() {