Add a config property for gss in UiBinder.

Change-Id: Iaee5a40c1a5ee0a1b98b158ad35dee0740567778
diff --git a/user/src/com/google/gwt/resources/Resources.gwt.xml b/user/src/com/google/gwt/resources/Resources.gwt.xml
index 0a94bb5..e8ef2b6 100644
--- a/user/src/com/google/gwt/resources/Resources.gwt.xml
+++ b/user/src/com/google/gwt/resources/Resources.gwt.xml
@@ -96,4 +96,8 @@
   <!-- Can be set to: strict | lenient | off -->
   <define-configuration-property name="CssResource.conversionMode" is-multi-valued="false" />
   <set-configuration-property name="CssResource.conversionMode" value="strict" />
+
+  <!-- The default for GSS in UiBinder -->
+  <define-configuration-property name="CssResource.gssDefaultInUiBinder" is-multi-valued="false" />
+  <set-configuration-property name="CssResource.gssDefaultInUiBinder" value="false" />
 </module>
diff --git a/user/src/com/google/gwt/resources/rg/CssResourceGenerator.java b/user/src/com/google/gwt/resources/rg/CssResourceGenerator.java
index 704cf8e..bbdf3a2 100644
--- a/user/src/com/google/gwt/resources/rg/CssResourceGenerator.java
+++ b/user/src/com/google/gwt/resources/rg/CssResourceGenerator.java
@@ -70,6 +70,7 @@
 import com.google.gwt.resources.ext.ResourceContext;
 import com.google.gwt.resources.ext.ResourceGeneratorUtil;
 import com.google.gwt.resources.ext.SupportsGeneratorResultCaching;
+import com.google.gwt.resources.rg.GssResourceGenerator.GssOptions;
 import com.google.gwt.thirdparty.guava.common.base.Joiner;
 import com.google.gwt.user.rebind.SourceWriter;
 import com.google.gwt.user.rebind.StringSourceWriter;
@@ -142,7 +143,6 @@
   private static final String KEY_RESERVED_PREFIXES = "CssResource.reservedClassPrefixes";
   private static final String KEY_SHARED_METHODS = "sharedMethods";
   private static final String KEY_STYLE = "CssResource.style";
-  private static final String KEY_ENABLE_GSS = "CssResource.enableGss";
 
   /**
    * This character must not appear in {@link #BASE32_CHARS}.
@@ -465,9 +465,11 @@
       throws UnableToCompleteException {
 
     // if Gss is enabled, defer the call to the Gss generator.
-    if (checkIfGssEnabled(context, logger)) {
+    GssOptions gssOptions = GssResourceGenerator.getGssOptions(
+        context.getGeneratorContext().getPropertyOracle(), logger);
+    if (gssOptions.isEnabled()) {
       gssEnabled = true;
-      gssResourceGenerator = new GssResourceGenerator();
+      gssResourceGenerator = new GssResourceGenerator(gssOptions);
       gssResourceGenerator.init(logger, context);
       return;
     }
@@ -1224,22 +1226,4 @@
 
     writeSimpleGetter(toImplement, returnExpr, sw);
   }
-
-  private boolean checkIfGssEnabled(ResourceContext context, TreeLogger logger)
-      throws UnableToCompleteException {
-    try {
-      PropertyOracle propertyOracle =
-          context.getGeneratorContext().getPropertyOracle();
-
-      ConfigurationProperty enableGssProp =
-          propertyOracle.getConfigurationProperty(KEY_ENABLE_GSS);
-      String enableGss = enableGssProp.getValues().get(0);
-
-      return "true".equals(enableGss);
-
-    } catch (BadPropertyValueException ex) {
-      logger.log(Type.ERROR, "Unable to determine if GSS need to be used");
-      throw new UnableToCompleteException();
-    }
-  }
 }
diff --git a/user/src/com/google/gwt/resources/rg/GssResourceGenerator.java b/user/src/com/google/gwt/resources/rg/GssResourceGenerator.java
index 73520af..89d6b52 100644
--- a/user/src/com/google/gwt/resources/rg/GssResourceGenerator.java
+++ b/user/src/com/google/gwt/resources/rg/GssResourceGenerator.java
@@ -150,7 +150,42 @@
 public class GssResourceGenerator extends AbstractCssResourceGenerator implements
     SupportsGeneratorResultCaching {
 
-  private enum AutoConversionMode { STRICT, LENIENT, OFF }
+  /**
+   * GssOptions contains the values of all configuration properties that can be used with
+   * GssResource.
+   */
+  public static class GssOptions {
+    private final boolean enabled;
+    private final AutoConversionMode autoConversionMode;
+    private final boolean gssDefaultInUiBinder;
+
+    public GssOptions(boolean enabled, AutoConversionMode autoConversionMode, boolean gssDefaultInUiBinder) {
+      this.enabled = enabled;
+      this.autoConversionMode = autoConversionMode;
+      this.gssDefaultInUiBinder = gssDefaultInUiBinder;
+    }
+
+    public boolean isEnabled() {
+      return enabled;
+    }
+
+    public boolean isGssDefaultInUiBinder() {
+      return gssDefaultInUiBinder;
+    }
+
+    public boolean isAutoConversionOff() {
+      return autoConversionMode == AutoConversionMode.OFF;
+    }
+
+    public boolean isLenientConversion() {
+      return autoConversionMode == AutoConversionMode.LENIENT;
+    }
+  }
+
+  /**
+   * Different conversion modes from css to gss.
+   */
+  public enum AutoConversionMode { STRICT, LENIENT, OFF }
 
   /*
    * TODO(dankurka): This is a nasty hack to get the compiler to output all @def's
@@ -160,6 +195,9 @@
   private static PrintWriter printWriter;
   private static Set<String> writtenAtDefs = new HashSet<>();
 
+  private static final String KEY_ENABLE_GSS = "CssResource.enableGss";
+  private static final String KEY_GSS_DEFAULT_IN_UIBINDER = "CssResource.gssDefaultInUiBinder";
+
   static {
     String varFileName = System.getProperty("emitGssVarNameFile");
     shouldEmitVariables = varFileName != null;
@@ -176,6 +214,40 @@
     }
   }
 
+  public static GssOptions getGssOptions(PropertyOracle propertyOracle, TreeLogger logger) throws UnableToCompleteException {
+    boolean gssEnabled;
+    boolean gssDefaultInUiBinder;
+    AutoConversionMode conversionMode;
+
+    try {
+      ConfigurationProperty enableGssProp =
+          propertyOracle.getConfigurationProperty(KEY_ENABLE_GSS);
+      String enableGss = enableGssProp.getValues().get(0);
+      gssEnabled = Boolean.parseBoolean(enableGss);
+    } catch (BadPropertyValueException ex) {
+      logger.log(Type.ERROR, "Unable to determine if GSS need to be used");
+      throw new UnableToCompleteException();
+    }
+    try {
+      conversionMode = Enum.valueOf(AutoConversionMode.class, propertyOracle
+          .getConfigurationProperty(KEY_CONVERSION_MODE).getValues().get(0)
+          .toUpperCase(Locale.ROOT));
+    } catch (BadPropertyValueException ex) {
+      logger.log(Type.ERROR, "Unable to conversion mode for GSS");
+      throw new UnableToCompleteException();
+    }
+    try {
+      ConfigurationProperty uiBinderGssDefaultProp =
+          propertyOracle.getConfigurationProperty(KEY_GSS_DEFAULT_IN_UIBINDER);
+      String uiBinderGssDefaultValue = uiBinderGssDefaultProp.getValues().get(0);
+      gssDefaultInUiBinder =  Boolean.parseBoolean(uiBinderGssDefaultValue);
+    } catch (BadPropertyValueException ex) {
+      logger.log(Type.ERROR, "Unable to determine default for GSS in UiBinder");
+      throw new UnableToCompleteException();
+    }
+    return new GssOptions(gssEnabled, conversionMode, gssDefaultInUiBinder);
+  }
+
   private static synchronized void write(Set<String> variables) {
     for (String atDef : variables) {
       if (writtenAtDefs.add(atDef)) {
@@ -389,7 +461,11 @@
   private Set<String> allowedAtRules;
   private Map<JClassType, Map<String, String>> replacementsByClassAndMethod;
   private Map<JMethod, String> replacementsForSharedMethods;
-  private AutoConversionMode conversionMode;
+  private final GssOptions gssOptions;
+
+  public GssResourceGenerator(GssOptions gssOptions) {
+    this.gssOptions = gssOptions;
+  }
 
   @Override
   public String createAssignment(TreeLogger logger, ResourceContext context, JMethod method)
@@ -473,10 +549,6 @@
           .getConfigurationProperty(ALLOWED_FUNCTIONS);
       allowedNonStandardFunctions.addAll(allowedFunctionsProperty.getValues());
 
-      conversionMode = Enum.valueOf(AutoConversionMode.class, propertyOracle
-          .getConfigurationProperty(KEY_CONVERSION_MODE).getValues().get(0)
-          .toUpperCase(Locale.ROOT));
-
       ClientBundleRequirements requirements = context.getRequirements();
       requirements.addConfigurationProperty(KEY_STYLE);
       requirements.addConfigurationProperty(KEY_OBFUSCATION_PREFIX);
@@ -520,10 +592,6 @@
     replacementsForSharedMethods = context.getCachedData(KEY_SHARED_METHODS, Map.class);
   }
 
-  private boolean isLenientConversion() {
-    return conversionMode == AutoConversionMode.LENIENT;
-  }
-
   private String getObfuscationPrefix(PropertyOracle propertyOracle, ResourceContext context)
       throws BadPropertyValueException {
     String prefix = propertyOracle.getConfigurationProperty(KEY_OBFUSCATION_PREFIX)
@@ -750,7 +818,7 @@
         .runPass();
 
     new ValidateRuntimeConditionalNode(cssTree.getVisitController(), errorManager,
-        isLenientConversion()).runPass();
+        gssOptions.isLenientConversion()).runPass();
 
     // Don't continue if errors exist
     checkErrors();
@@ -866,7 +934,7 @@
     // assert that we only support either gss or css on one resource.
     boolean css = ensureEitherCssOrGss(resources, logger);
 
-    if (css && conversionMode == AutoConversionMode.OFF) {
+    if (css && gssOptions.isAutoConversionOff()) {
       // TODO(dankurka): add link explaining the situation in detail.
       logger.log(Type.ERROR,
           "Your ClientBundle is referencing css files instead of gss. "
@@ -992,8 +1060,8 @@
       ConfigurationPropertyMatcher configurationPropertyMatcher =
           new ConfigurationPropertyMatcher(context, logger);
 
-      Css2Gss converter = new Css2Gss(tempFile.toURI().toURL(), logger, isLenientConversion(),
-          configurationPropertyMatcher);
+      Css2Gss converter = new Css2Gss(tempFile.toURI().toURL(), logger,
+          gssOptions.isLenientConversion(), configurationPropertyMatcher);
 
       String gss = converter.toGss();
 
@@ -1005,7 +1073,7 @@
 
     } catch (Css2GssConversionException e) {
       String message = "An error occurs during the automatic conversion: " + e.getMessage();
-      if (!isLenientConversion()) {
+      if (!gssOptions.isLenientConversion()) {
         message += "\n You should try to change the faulty css to fix this error. If you are " +
             "unable to change the css, you can setup the automatic conversion to be lenient. Add " +
             "the following line to your gwt.xml file: " +
diff --git a/user/src/com/google/gwt/uibinder/rebind/UiBinderGenerator.java b/user/src/com/google/gwt/uibinder/rebind/UiBinderGenerator.java
index 590e10c..ccbc413 100644
--- a/user/src/com/google/gwt/uibinder/rebind/UiBinderGenerator.java
+++ b/user/src/com/google/gwt/uibinder/rebind/UiBinderGenerator.java
@@ -1,16 +1,14 @@
 /*
  * Copyright 2008 Google Inc.
  *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
  *
  * http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
 package com.google.gwt.uibinder.rebind;
@@ -28,6 +26,8 @@
 import com.google.gwt.dev.resource.Resource;
 import com.google.gwt.dev.resource.ResourceOracle;
 import com.google.gwt.dev.util.Util;
+import com.google.gwt.resources.rg.GssResourceGenerator;
+import com.google.gwt.resources.rg.GssResourceGenerator.GssOptions;
 import com.google.gwt.uibinder.client.UiTemplate;
 import com.google.gwt.uibinder.rebind.messages.MessagesWriter;
 import com.google.gwt.uibinder.rebind.model.ImplicitClientBundle;
@@ -42,7 +42,9 @@
 /**
  * Generator for implementations of {@link com.google.gwt.uibinder.client.UiBinder}.
  */
-@RunsLocal(requiresProperties = {"UiBinder.useSafeHtmlTemplates", "UiBinder.useLazyWidgetBuilders"})
+@RunsLocal(requiresProperties = {
+    "UiBinder.useSafeHtmlTemplates", "UiBinder.useLazyWidgetBuilders", "CssResource.enableGss",
+    "CssResource.conversionMode", "CssResource.gssDefaultInUiBinder"})
 public class UiBinderGenerator extends Generator {
 
   private static final String BINDER_URI = "urn:ui:com.google.gwt.uibinder";
@@ -56,11 +58,11 @@
   private static final String XSS_SAFE_CONFIG_PROPERTY = "UiBinder.useSafeHtmlTemplates";
 
   /**
-   * Given a UiBinder interface, return the path to its ui.xml file, suitable
-   * for any classloader to find it as a resource.
+   * Given a UiBinder interface, return the path to its ui.xml file, suitable for any classloader to
+   * find it as a resource.
    */
-  private static String deduceTemplateFile(MortalLogger logger,
-      JClassType interfaceType) throws UnableToCompleteException {
+  private static String deduceTemplateFile(MortalLogger logger, JClassType interfaceType)
+      throws UnableToCompleteException {
     String templateName = null;
     UiTemplate annotation = interfaceType.getAnnotation(UiTemplate.class);
     if (annotation == null) {
@@ -77,14 +79,12 @@
       }
 
       /*
-       * If the template file name (minus suffix) has no dots, make it relative
-       * to the binder's package, otherwise slashify the dots
+       * If the template file name (minus suffix) has no dots, make it relative to the binder's
+       * package, otherwise slashify the dots
        */
-      String unsuffixed = templateName.substring(0,
-          templateName.lastIndexOf(TEMPLATE_SUFFIX));
+      String unsuffixed = templateName.substring(0, templateName.lastIndexOf(TEMPLATE_SUFFIX));
       if (!unsuffixed.contains(".")) {
-        templateName = slashify(interfaceType.getPackage().getName()) + "/"
-            + templateName;
+        templateName = slashify(interfaceType.getPackage().getName()) + "/" + templateName;
       } else {
         templateName = slashify(unsuffixed) + TEMPLATE_SUFFIX;
       }
@@ -99,8 +99,8 @@
   private final UiBinderContext uiBinderCtx = new UiBinderContext();
 
   @Override
-  public String generate(TreeLogger logger, GeneratorContext genCtx,
-      String fqInterfaceName) throws UnableToCompleteException {
+  public String generate(TreeLogger logger, GeneratorContext genCtx, String fqInterfaceName)
+      throws UnableToCompleteException {
     TypeOracle oracle = genCtx.getTypeOracle();
 
     JClassType interfaceType;
@@ -121,8 +121,7 @@
     implName = designTime.getImplName(implName);
 
     String packageName = interfaceType.getPackage().getName();
-    PrintWriterManager writers = new PrintWriterManager(genCtx, logger,
-        packageName);
+    PrintWriterManager writers = new PrintWriterManager(genCtx, logger, packageName);
     PrintWriter printWriter = writers.tryToMakePrintWriterFor(implName);
 
     if (printWriter != null) {
@@ -132,8 +131,8 @@
     return packageName + "." + implName;
   }
 
-  private Boolean extractConfigProperty(MortalLogger logger,
-      PropertyOracle propertyOracle, String configProperty, boolean defaultValue) {
+  private Boolean extractConfigProperty(MortalLogger logger, PropertyOracle propertyOracle,
+      String configProperty, boolean defaultValue) {
     List<String> values;
     try {
       values = propertyOracle.getConfigurationProperty(configProperty).getValues();
@@ -156,21 +155,24 @@
       PrintWriter binderPrintWriter, TreeLogger treeLogger, TypeOracle oracle,
       ResourceOracle resourceOracle, PropertyOracle propertyOracle,
       PrintWriterManager writerManager, DesignTimeUtils designTime)
-  throws UnableToCompleteException {
+      throws UnableToCompleteException {
 
     MortalLogger logger = new MortalLogger(treeLogger);
     String templatePath = deduceTemplateFile(logger, interfaceType);
-    MessagesWriter messages = new MessagesWriter(oracle, BINDER_URI, logger,
-        templatePath, interfaceType.getPackage().getName(), implName);
+    MessagesWriter messages = new MessagesWriter(oracle, BINDER_URI, logger, templatePath,
+        interfaceType.getPackage().getName(), implName);
 
     boolean useLazyWidgetBuilders =
         useLazyWidgetBuilders(logger, propertyOracle) && !designTime.isDesignTime();
     FieldManager fieldManager = new FieldManager(oracle, logger, useLazyWidgetBuilders);
 
+    GssOptions gssOptions =
+        GssResourceGenerator.getGssOptions(propertyOracle, logger.getTreeLogger());
+
     UiBinderWriter uiBinderWriter = new UiBinderWriter(interfaceType, implName, templatePath,
         oracle, logger, fieldManager, messages, designTime, uiBinderCtx,
         useSafeHtmlTemplates(logger, propertyOracle), useLazyWidgetBuilders, BINDER_URI,
-        resourceOracle);
+        resourceOracle, gssOptions);
 
     Resource resource = getTemplateResource(logger, templatePath, resourceOracle);
 
@@ -203,14 +205,12 @@
       if (content == null) {
         content = Util.readStreamAsString(resource.openContents());
       }
-      doc = new W3cDomHelper(logger.getTreeLogger(), resourceOracle).documentFor(
-          content, resource.getPath());
+      doc = new W3cDomHelper(logger.getTreeLogger(), resourceOracle).documentFor(content,
+          resource.getPath());
     } catch (IOException iex) {
       logger.die("Error opening resource:" + resource.getLocation(), iex);
     } catch (SAXParseException e) {
-      logger.die(
-          "Error parsing XML (line " + e.getLineNumber() + "): "
-              + e.getMessage(), e);
+      logger.die("Error parsing XML (line " + e.getLineNumber() + "): " + e.getMessage(), e);
     }
     return doc;
   }
@@ -225,24 +225,23 @@
   }
 
   private Boolean useLazyWidgetBuilders(MortalLogger logger, PropertyOracle propertyOracle) {
-    Boolean rtn = extractConfigProperty(logger, propertyOracle, LAZY_WIDGET_BUILDERS_PROPERTY, true);
+    Boolean rtn =
+        extractConfigProperty(logger, propertyOracle, LAZY_WIDGET_BUILDERS_PROPERTY, true);
     if (!gaveLazyBuildersWarning && !rtn) {
-      logger.warn("Configuration property %s is false. Deprecated code generation is in play. " +
-                  "This property will soon become a no-op.",
-                  LAZY_WIDGET_BUILDERS_PROPERTY);
+      logger.warn("Configuration property %s is false. Deprecated code generation is in play. "
+          + "This property will soon become a no-op.", LAZY_WIDGET_BUILDERS_PROPERTY);
       gaveLazyBuildersWarning = true;
     }
     return rtn;
   }
 
   private Boolean useSafeHtmlTemplates(MortalLogger logger, PropertyOracle propertyOracle) {
-    Boolean rtn = extractConfigProperty(
-        logger, propertyOracle, XSS_SAFE_CONFIG_PROPERTY, true);
+    Boolean rtn = extractConfigProperty(logger, propertyOracle, XSS_SAFE_CONFIG_PROPERTY, true);
 
     if (!gaveSafeHtmlWarning && !rtn) {
       logger.warn("Configuration property %s is false! UiBinder SafeHtml integration is off, "
-          + "leaving your users more vulnerable to cross-site scripting attacks. This property " +
-          "will soon become a no-op, and SafeHtml integration will always be on.",
+          + "leaving your users more vulnerable to cross-site scripting attacks. This property "
+          + "will soon become a no-op, and SafeHtml integration will always be on.",
           XSS_SAFE_CONFIG_PROPERTY);
       gaveSafeHtmlWarning = true;
     }
diff --git a/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java b/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
index a09b8a5..4b01963 100644
--- a/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
+++ b/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
@@ -28,6 +28,7 @@
 import com.google.gwt.resources.client.DataResource;
 import com.google.gwt.resources.client.ImageResource;
 import com.google.gwt.resources.client.ImageResource.RepeatStyle;
+import com.google.gwt.resources.rg.GssResourceGenerator.GssOptions;
 import com.google.gwt.uibinder.elementparsers.BeanParser;
 import com.google.gwt.uibinder.elementparsers.SimpleInterpeter;
 import com.google.gwt.uibinder.rebind.messages.MessagesWriter;
@@ -114,10 +115,12 @@
   private final String binderUri;
   private final UiBinderContext uiBinderContext;
   private final ResourceOracle resourceOracle;
+  private GssOptions gssOptions;
 
   public UiBinderParser(UiBinderWriter writer, MessagesWriter messagesWriter,
       FieldManager fieldManager, TypeOracle oracle, ImplicitClientBundle bundleClass,
-      String binderUri, UiBinderContext uiBinderContext, ResourceOracle resourceOracle) {
+      String binderUri, UiBinderContext uiBinderContext, ResourceOracle resourceOracle,
+      GssOptions gssOptions) {
     this.writer = writer;
     this.oracle = oracle;
     this.messagesWriter = messagesWriter;
@@ -129,6 +132,7 @@
     this.dataResourceType = oracle.findType(DataResource.class.getCanonicalName());
     this.binderUri = binderUri;
     this.resourceOracle = resourceOracle;
+    this.gssOptions = gssOptions;
   }
 
   /**
@@ -136,6 +140,7 @@
    * the document.
    */
   public FieldWriter parse(XMLElement elem) throws UnableToCompleteException {
+
     if (!writer.isBinderElement(elem)) {
       writer.die(elem, "Bad prefix on <%s:%s>? The root element must be in "
           + "xml namespace \"%s\" (usually with prefix \"ui:\"), "
@@ -452,8 +457,7 @@
       importTypes.add(findCssResourceType(elem, type));
     }
 
-    Boolean gss = elem.consumeBooleanConstantAttribute(GSS_ATTRIBUTE);
-
+    boolean gss = determineGssForFile(elem.consumeBooleanConstantAttribute(GSS_ATTRIBUTE));
     ImplicitCssResource cssMethod = bundleClass.createCssResource(name, source,
         publicType, body, importTypes, gss, resourceOracle);
 
@@ -463,6 +467,29 @@
         cssMethod.getName()));
   }
 
+  private boolean determineGssForFile(Boolean attributeInUiBinderFile) throws UnableToCompleteException {
+    if (attributeInUiBinderFile == null) {
+      if (!gssOptions.isEnabled() && gssOptions.isGssDefaultInUiBinder()) {
+        writer.die("Invalid combination of configuration properties. "
+            + "CssResource.enableGss is false, but CssResource.uiBinderGssDefault is true");
+      }
+      return gssOptions.isGssDefaultInUiBinder();
+    }
+
+    if (Boolean.TRUE.equals(attributeInUiBinderFile)) {
+      if (!gssOptions.isEnabled()) {
+        writer.die("UiBinder file has attribute gss=\"true\", but GSS is disabled globally");
+      }
+      return true;
+    }
+
+    if (gssOptions.isEnabled() && gssOptions.isAutoConversionOff()) {
+      writer.die("UiBinder file has attribute gss=\"false\", "
+          + "but CssResource.conversionMode is \"off\"");
+    }
+    return false;
+  }
+
   private JClassType findCssResourceType(XMLElement elem, String typeName)
       throws UnableToCompleteException {
     JClassType publicType = oracle.findType(typeName);
diff --git a/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java b/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
index 8e05ae8..d986e64 100644
--- a/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
+++ b/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
@@ -30,6 +30,7 @@
 import com.google.gwt.event.dom.client.DomEvent;
 import com.google.gwt.event.dom.client.DomEvent.Type;
 import com.google.gwt.resources.client.ClientBundle;
+import com.google.gwt.resources.rg.GssResourceGenerator.GssOptions;
 import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
 import com.google.gwt.uibinder.attributeparsers.AttributeParsers;
 import com.google.gwt.uibinder.client.LazyDomElement;
@@ -360,11 +361,13 @@
 
   private final ResourceOracle resourceOracle;
 
+  private final GssOptions gssOptions;
+
   public UiBinderWriter(JClassType baseClass, String implClassName, String templatePath,
       TypeOracle oracle, MortalLogger logger, FieldManager fieldManager,
       MessagesWriter messagesWriter, DesignTimeUtils designTime, UiBinderContext uiBinderCtx,
       boolean useSafeHtmlTemplates, boolean useLazyWidgetBuilders, String binderUri,
-      ResourceOracle resourceOracle) throws UnableToCompleteException {
+      ResourceOracle resourceOracle, GssOptions gssOptions) throws UnableToCompleteException {
     this.baseClass = baseClass;
     this.implClassName = implClassName;
     this.oracle = oracle;
@@ -378,6 +381,7 @@
     this.useLazyWidgetBuilders = useLazyWidgetBuilders;
     this.binderUri = binderUri;
     this.resourceOracle = resourceOracle;
+    this.gssOptions = gssOptions;
 
     this.htmlTemplates = new HtmlTemplatesWriter(fieldManager, logger);
 
@@ -1363,7 +1367,7 @@
     // Allow GWT.create() to init the field, the default behavior
 
     FieldWriter rootField = new UiBinderParser(this, messages, fieldManager, oracle, bundleClass,
-            binderUri, uiBinderCtx, resourceOracle).parse(elem);
+            binderUri, uiBinderCtx, resourceOracle, gssOptions).parse(elem);
 
     fieldManager.validate();
 
diff --git a/user/src/com/google/gwt/uibinder/rebind/model/ImplicitCssResource.java b/user/src/com/google/gwt/uibinder/rebind/model/ImplicitCssResource.java
index a2f3abf..346c0a4 100644
--- a/user/src/com/google/gwt/uibinder/rebind/model/ImplicitCssResource.java
+++ b/user/src/com/google/gwt/uibinder/rebind/model/ImplicitCssResource.java
@@ -86,7 +86,7 @@
    */
   public ImplicitCssResource(String packageName, String className, String name,
       String[] source, JClassType extendedInterface, String body,
-      MortalLogger logger, Set<JClassType> importTypes, Boolean gss,
+      MortalLogger logger, Set<JClassType> importTypes, boolean gss,
       ResourceOracle resourceOracle) {
     this.packageName = packageName;
     this.className = className;
@@ -96,7 +96,7 @@
     this.logger = logger;
     this.imports = Collections.unmodifiableSet(importTypes);
     this.resourceOracle = resourceOracle;
-    this.gss = Boolean.TRUE.equals(gss);
+    this.gss = gss;
     sources = Arrays.asList(source);
   }
 
diff --git a/user/test/com/google/gwt/uibinder/elementparsers/ElementParserTester.java b/user/test/com/google/gwt/uibinder/elementparsers/ElementParserTester.java
index 15ce2ac..ca004a9 100644
--- a/user/test/com/google/gwt/uibinder/elementparsers/ElementParserTester.java
+++ b/user/test/com/google/gwt/uibinder/elementparsers/ElementParserTester.java
@@ -26,6 +26,8 @@
 import com.google.gwt.dev.javac.testing.impl.MockResourceOracle;
 import com.google.gwt.dev.resource.Resource;
 import com.google.gwt.dev.util.log.PrintWriterTreeLogger;
+import com.google.gwt.resources.rg.GssResourceGenerator.AutoConversionMode;
+import com.google.gwt.resources.rg.GssResourceGenerator.GssOptions;
 import com.google.gwt.uibinder.attributeparsers.AttributeParsers;
 import com.google.gwt.uibinder.rebind.DesignTimeUtilsStub;
 import com.google.gwt.uibinder.rebind.FieldManager;
@@ -110,8 +112,9 @@
     MessagesWriter messages = new MessagesWriter(types, BINDER_URI, logger,
         templatePath, baseType.getPackage().getName(), implName);
 
-    writer = new MockUiBinderWriter(baseType, implName, templatePath, types,
-        logger, fieldManager, messages, BINDER_URI, new MockResourceOracle());
+    writer = new MockUiBinderWriter(baseType, implName, templatePath, types, logger, fieldManager,
+        messages, BINDER_URI, new MockResourceOracle(),
+        new GssOptions(true, AutoConversionMode.OFF, true));
     fieldManager.registerField(types.findType(parsedTypeName), FIELD_NAME);
     parsedType = types.findType(parsedTypeName);
   }
diff --git a/user/test/com/google/gwt/uibinder/elementparsers/MockUiBinderWriter.java b/user/test/com/google/gwt/uibinder/elementparsers/MockUiBinderWriter.java
index c7b4af1..ccf91ab 100644
--- a/user/test/com/google/gwt/uibinder/elementparsers/MockUiBinderWriter.java
+++ b/user/test/com/google/gwt/uibinder/elementparsers/MockUiBinderWriter.java
@@ -19,6 +19,7 @@
 import com.google.gwt.core.ext.typeinfo.JClassType;
 import com.google.gwt.core.ext.typeinfo.TypeOracle;
 import com.google.gwt.dev.resource.ResourceOracle;
+import com.google.gwt.resources.rg.GssResourceGenerator.GssOptions;
 import com.google.gwt.uibinder.rebind.DesignTimeUtilsStub;
 import com.google.gwt.uibinder.rebind.FieldManager;
 import com.google.gwt.uibinder.rebind.FieldWriter;
@@ -36,10 +37,11 @@
 
   public MockUiBinderWriter(JClassType baseClass, String implClassName, String templatePath,
       TypeOracle oracle, MortalLogger logger, FieldManager fieldManager,
-      MessagesWriter messagesWriter, String binderUri, ResourceOracle resourceOracle)
-      throws UnableToCompleteException {
+      MessagesWriter messagesWriter, String binderUri, ResourceOracle resourceOracle,
+      GssOptions gssOptions) throws UnableToCompleteException {
     super(baseClass, implClassName, templatePath, oracle, logger, fieldManager, messagesWriter,
-        DesignTimeUtilsStub.EMPTY, new UiBinderContext(), true, false, binderUri, resourceOracle);
+        DesignTimeUtilsStub.EMPTY, new UiBinderContext(), true, false, binderUri, resourceOracle,
+        gssOptions);
   }
 
   @Override
diff --git a/user/test/com/google/gwt/uibinder/rebind/AbstractUiBinderWriterTest.java b/user/test/com/google/gwt/uibinder/rebind/AbstractUiBinderWriterTest.java
index bc825b0..205f2df 100644
--- a/user/test/com/google/gwt/uibinder/rebind/AbstractUiBinderWriterTest.java
+++ b/user/test/com/google/gwt/uibinder/rebind/AbstractUiBinderWriterTest.java
@@ -27,6 +27,8 @@
 import com.google.gwt.dev.resource.ResourceOracle;
 import com.google.gwt.dev.util.collect.HashSet;
 import com.google.gwt.dev.util.log.PrintWriterTreeLogger;
+import com.google.gwt.resources.rg.GssResourceGenerator.AutoConversionMode;
+import com.google.gwt.resources.rg.GssResourceGenerator.GssOptions;
 import com.google.gwt.uibinder.attributeparsers.AttributeParsers;
 import com.google.gwt.uibinder.rebind.messages.MessagesWriter;
 import com.google.gwt.uibinder.test.UiJavaResources;
@@ -189,10 +191,11 @@
         new MessagesWriter(types, BINDER_URI, logger, rendererClass.getPath(), "rendererPackage",
             "rendererClassName");
     ResourceOracle resourceOracle = new MockResourceOracle();
+    GssOptions gssOptions = new GssOptions(true, AutoConversionMode.OFF, true);
     writer = new UiBinderWriter(aClass, "foo", "", types, logger, fieldManager, messages,
-        DesignTimeUtilsStub.EMPTY, uiBinderCtx, true, true, BINDER_URI, resourceOracle);
+        DesignTimeUtilsStub.EMPTY, uiBinderCtx, true, true, BINDER_URI, resourceOracle, gssOptions);
     parser = new UiBinderParser(writer, messages, fieldManager, types, null, BINDER_URI,
-        new UiBinderContext(), resourceOracle);
+        new UiBinderContext(), resourceOracle, gssOptions);
     designTime.rememberPathForElements(doc);
   }
 }
\ No newline at end of file
diff --git a/user/test/com/google/gwt/uibinder/rebind/UiBinderParserUiWithTest.java b/user/test/com/google/gwt/uibinder/rebind/UiBinderParserUiWithTest.java
index 5359210..f269ea9 100644
--- a/user/test/com/google/gwt/uibinder/rebind/UiBinderParserUiWithTest.java
+++ b/user/test/com/google/gwt/uibinder/rebind/UiBinderParserUiWithTest.java
@@ -26,6 +26,8 @@
 import com.google.gwt.dev.resource.ResourceOracle;
 import com.google.gwt.dev.util.collect.HashSet;
 import com.google.gwt.dev.util.log.PrintWriterTreeLogger;
+import com.google.gwt.resources.rg.GssResourceGenerator.AutoConversionMode;
+import com.google.gwt.resources.rg.GssResourceGenerator.GssOptions;
 import com.google.gwt.uibinder.attributeparsers.AttributeParsers;
 import com.google.gwt.uibinder.test.UiJavaResources;
 
@@ -277,10 +279,12 @@
     elm = elemProvider.get(item);
     JClassType aClass = types.findType(baseClass);
     ResourceOracle resourceOracle = new MockResourceOracle();
+    GssOptions gssOptions = new GssOptions(true, AutoConversionMode.OFF, true);
     writer = new UiBinderWriter(aClass, "foo", "", types, logger, fieldManager, null,
-        DesignTimeUtilsStub.EMPTY, new UiBinderContext(), true, true, "", resourceOracle);
+        DesignTimeUtilsStub.EMPTY, new UiBinderContext(), true, true, "", resourceOracle,
+        gssOptions);
     parser = new UiBinderParser(writer, null, fieldManager, types, null, "", new UiBinderContext(),
-        resourceOracle);
+        resourceOracle, gssOptions);
     designTime.rememberPathForElements(doc);
     UiBinderParser.Resource.WITH.create(parser, elm);
   }