Add @MimeType and @DoNotEmbed support to <ui:data.
Change-Id: Ie10be09bf9248de10c28c700db170dc56887b461
Review-Link: https://gwt-review.googlesource.com/#/c/9515/
(cherry picked from commit 0e1066b77b605846d58bdda907431b4eac7abdbc)
diff --git a/user/src/com/google/gwt/uibinder/rebind/BundleWriter.java b/user/src/com/google/gwt/uibinder/rebind/BundleWriter.java
index 02c09c2..aeff25f 100644
--- a/user/src/com/google/gwt/uibinder/rebind/BundleWriter.java
+++ b/user/src/com/google/gwt/uibinder/rebind/BundleWriter.java
@@ -21,6 +21,8 @@
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.CssResource.Import;
import com.google.gwt.resources.client.DataResource;
+import com.google.gwt.resources.client.DataResource.DoNotEmbed;
+import com.google.gwt.resources.client.DataResource.MimeType;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.resources.client.ImageResource.ImageOptions;
import com.google.gwt.resources.client.ImageResource.RepeatStyle;
@@ -45,6 +47,8 @@
private final JClassType clientBundleType;
private final JClassType dataResourceType;
+ private final JClassType doNotEmbedType;
+ private final JClassType dataMimeTypeType;
private final JClassType imageOptionType;
private final JClassType imageResourceType;
private final JClassType repeatStyleType;
@@ -61,6 +65,8 @@
clientBundleType = types.findType(ClientBundle.class.getName());
dataResourceType = types.findType(DataResource.class.getCanonicalName());
+ doNotEmbedType = types.findType(DoNotEmbed.class.getCanonicalName());
+ dataMimeTypeType = types.findType(MimeType.class.getCanonicalName());
imageOptionType = types.findType(ImageOptions.class.getCanonicalName());
imageResourceType = types.findType(ImageResource.class.getCanonicalName());
repeatStyleType = types.findType(RepeatStyle.class.getCanonicalName());
@@ -87,6 +93,8 @@
// Imports
writer.write("import %s;", clientBundleType.getQualifiedSourceName());
writer.write("import %s;", dataResourceType.getQualifiedSourceName());
+ writer.write("import %s;", doNotEmbedType.getQualifiedSourceName());
+ writer.write("import %s;", dataMimeTypeType.getQualifiedSourceName());
writer.write("import %s;", imageResourceType.getQualifiedSourceName());
writer.write("import %s;", imageOptionType.getQualifiedSourceName());
writer.write("import %s;", importAnnotationType.getQualifiedSourceName());
@@ -108,6 +116,15 @@
// Write data methods
for (ImplicitDataResource data : bundleClass.getDataMethods()) {
writer.write("@Source(\"%s\")", data.getSource());
+ writer.newline();
+ if (data.getDoNotEmbed() == Boolean.TRUE) {
+ writer.write("@DoNotEmbed");
+ writer.newline();
+ }
+ if (data.getMimeType() != null) {
+ writer.write("@MimeType(\"%s\")", data.getMimeType());
+ writer.newline();
+ }
writer.write("%s %s();", dataResourceType.getName(), data.getName());
writer.newline();
}
diff --git a/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java b/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
index b7e16ca..1aacda7 100644
--- a/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
+++ b/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
@@ -93,6 +93,8 @@
private static final String SOURCE_ATTRIBUTE = "src";
private static final String TYPE_ATTRIBUTE = "type";
private static final String GSS_ATTRIBUTE = "gss";
+ private static final String DO_NOT_EMBED_ATTRIBUTE = "doNotEmbed";
+ private static final String MIME_TYPE_ATTRIBUTE = "mimeType";
// TODO(rjrjr) Make all the ElementParsers receive their dependencies via
// constructor like this one does, and make this an ElementParser. I want
@@ -182,8 +184,12 @@
private void createData(XMLElement elem) throws UnableToCompleteException {
String name = elem.consumeRequiredRawAttribute(FIELD_ATTRIBUTE);
String source = elem.consumeRequiredRawAttribute(SOURCE_ATTRIBUTE);
- ImplicitDataResource dataMethod = bundleClass.createDataResource(name,
- source);
+ // doNotEmbed is optional on DataResource
+ Boolean doNotEmbed = elem.consumeBooleanConstantAttribute(DO_NOT_EMBED_ATTRIBUTE);
+ // mimeType is optional on DataResource
+ String mimeType = elem.consumeRawAttribute(MIME_TYPE_ATTRIBUTE);
+ ImplicitDataResource dataMethod = bundleClass.createDataResource(
+ name, source, mimeType, doNotEmbed);
FieldWriter field = fieldManager.registerField(dataResourceType,
dataMethod.getName());
field.setInitializer(String.format("%s.%s()",
diff --git a/user/src/com/google/gwt/uibinder/rebind/model/ImplicitClientBundle.java b/user/src/com/google/gwt/uibinder/rebind/model/ImplicitClientBundle.java
index e1afec8..9c98cf2 100644
--- a/user/src/com/google/gwt/uibinder/rebind/model/ImplicitClientBundle.java
+++ b/user/src/com/google/gwt/uibinder/rebind/model/ImplicitClientBundle.java
@@ -82,10 +82,14 @@
*
* @param name the method name and the ui:field name
* @param source path to the resource
+ * @param mimeType type of the resource
+ * @param doNotEmbed flag to prevent embedding the data resource
+ *
* @return the newly-created DataResource
*/
- public ImplicitDataResource createDataResource(String name, String source) {
- ImplicitDataResource data = new ImplicitDataResource(name, source);
+ public ImplicitDataResource createDataResource(
+ String name, String source, String mimeType, Boolean doNotEmbed) {
+ ImplicitDataResource data = new ImplicitDataResource(name, source, mimeType, doNotEmbed);
dataMethods.add(data);
return data;
}
diff --git a/user/src/com/google/gwt/uibinder/rebind/model/ImplicitDataResource.java b/user/src/com/google/gwt/uibinder/rebind/model/ImplicitDataResource.java
index 428ea8d..cce237e 100644
--- a/user/src/com/google/gwt/uibinder/rebind/model/ImplicitDataResource.java
+++ b/user/src/com/google/gwt/uibinder/rebind/model/ImplicitDataResource.java
@@ -20,11 +20,15 @@
*/
public class ImplicitDataResource {
private final String name;
+ private final String mimeType;
private final String source;
+ private final Boolean doNotEmbed;
- ImplicitDataResource(String name, String source) {
+ ImplicitDataResource(String name, String source, String mimeType, Boolean doNotEmbed) {
this.name = name;
this.source = source;
+ this.mimeType = mimeType;
+ this.doNotEmbed = doNotEmbed;
}
public String getName() {
@@ -34,4 +38,12 @@
public String getSource() {
return source;
}
+
+ public String getMimeType() {
+ return mimeType;
+ }
+
+ public Boolean getDoNotEmbed() {
+ return doNotEmbed;
+ }
}
diff --git a/user/src/com/google/gwt/uibinder/resources/UiBinder.xsd b/user/src/com/google/gwt/uibinder/resources/UiBinder.xsd
index 1e431e3..b7c2bf6 100644
--- a/user/src/com/google/gwt/uibinder/resources/UiBinder.xsd
+++ b/user/src/com/google/gwt/uibinder/resources/UiBinder.xsd
@@ -196,6 +196,14 @@
name="src"
type="xs:string"
use="required" />
+ <xs:attribute
+ name="doNotEmbed"
+ type="xs:boolean"
+ use="optional" />
+ <xs:attribute
+ name="mimeType"
+ type="xs:string"
+ use="optional" />
<xs:anyAttribute
processContents="lax" />
diff --git a/user/test/com/google/gwt/uibinder/test/client/UiBinderTest.java b/user/test/com/google/gwt/uibinder/test/client/UiBinderTest.java
index 9cf5732..c4f5fe4 100644
--- a/user/test/com/google/gwt/uibinder/test/client/UiBinderTest.java
+++ b/user/test/com/google/gwt/uibinder/test/client/UiBinderTest.java
@@ -666,6 +666,19 @@
assertEquals("P", widgetUi.flowPanelWithTag.getElement().getTagName());
}
+ public void testEmbeddedSvgMimeType() {
+ String url = widgetUi.embeddedSvgData.getSafeUri().asString();
+ if (url.startsWith("data:")) {
+ assertTrue(url.startsWith("data:image/svg+xml"));
+ }
+ }
+
+ public void testLinkedSvgNotEmbedded() {
+ String url = widgetUi.linkedSvgData.getSafeUri().asString();
+ assertFalse(url.startsWith("data:"));
+ assertTrue(url, url.endsWith(".svg"));
+ }
+
/**
* Assert that the expect strings are found in body, and in the order given.
* WARNING: both body and expected are normalized to lower case, to get around
diff --git a/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.java b/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.java
index 00cee8c..9d9ac3e 100644
--- a/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.java
+++ b/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.java
@@ -217,6 +217,8 @@
@UiField Label labelWithComputedText;
@UiField FlowPanel flowPanelWithTag;
@UiField Element myElementWithTagName;
+ @UiField DataResource embeddedSvgData;
+ @UiField DataResource linkedSvgData;
ValueChangeEvent<Double> doubleValueChangeEvent;
diff --git a/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.ui.xml b/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.ui.xml
index 4d91c61..2e30fee 100644
--- a/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.ui.xml
+++ b/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.ui.xml
@@ -142,6 +142,7 @@
cursor:cursor,pointer;
}
</ui:style>
+
<ui:data field='heartCursorResource' src='heart.cur'/>
<ui:style field='mySpritelyStyle'>
@@ -164,11 +165,15 @@
font-size: 1.5em;
}
</ui:style>
+
<ui:image field='prettyImage' />
<ui:image field='prettyTilingImage' src='prettyImage.png' flipRtl='true' repeatStyle='Both'/>
<ui:image field='right'/>
<ui:image field='down'/>
+<ui:data field="embeddedSvgData" src="background.svg" mimeType="image/svg+xml" />
+<ui:data field="linkedSvgData" src="background.svg" doNotEmbed="true" />
+
<gwt:DockPanel ui:field="root" width="100%" verticalAlignment="ALIGN_TOP">
<gwt:Dock direction='NORTH'>
<gwt:HTML ui:field='styleLess' styleName=''>
@@ -186,7 +191,7 @@
<gwt:Dock direction='WEST'>
<gwt:HTML ui:field='sideBarWidget' pixelSize="100, 150">
<div ui:field="sideBar"
- style='border: 4px solid gray; padding: 4px; margin: 4px;'
+ style='border: 4px solid gray; padding: 4px; margin: 4px;'
>This could<br/>
be a<br/>
side bar<br/>
diff --git a/user/test/com/google/gwt/uibinder/test/client/background.svg b/user/test/com/google/gwt/uibinder/test/client/background.svg
new file mode 100644
index 0000000..b61f202
--- /dev/null
+++ b/user/test/com/google/gwt/uibinder/test/client/background.svg
@@ -0,0 +1,3 @@
+<svg width="20" height="20" xmlns="http://www.w3.org/2000/svg">
+ <circle stroke="#000000" r="5" cy="10" cx="10" stroke-width="0" fill="#FF0000" />
+</svg>