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() {