Fixing a bug in CellWidget where the cell isn't rendered if the initial value is null. We were checking that the value actually changed in setValue(), but this.value defaults to null. We no longer do an equality check when setting the value in the constructor.
Review at http://gwt-code-reviews.appspot.com/1655803
Review by: skybrian@google.com
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@10897 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/cellview/client/CellWidget.java b/user/src/com/google/gwt/user/cellview/client/CellWidget.java
index 00996df..0c5b44b 100644
--- a/user/src/com/google/gwt/user/cellview/client/CellWidget.java
+++ b/user/src/com/google/gwt/user/cellview/client/CellWidget.java
@@ -79,6 +79,7 @@
* The {@link ValueUpdater} used to trigger value update events.
*/
private final ValueUpdater<C> valueUpdater = new ValueUpdater<C>() {
+ @Override
public void update(C value) {
// no need to redraw, the Cell took care of it
setValue(value, true, false);
@@ -143,13 +144,22 @@
this.keyProvider = keyProvider;
setElement(elem);
CellBasedWidgetImpl.get().sinkEvents(this, cell.getConsumedEvents());
- setValue(initialValue);
+
+ /*
+ * Skip the equality check. If initialValue is null, it will be equal to
+ * this.value, but that doesn't mean that we don't want to render the
+ * initialValue.
+ */
+ this.value = initialValue;
+ redraw();
}
+ @Override
public HandlerRegistration addValueChangeHandler(ValueChangeHandler<C> handler) {
return addHandler(handler, ValueChangeEvent.getType());
}
+ @Override
public LeafValueEditor<C> asEditor() {
if (editor == null) {
editor = TakesValueEditor.of(this);
@@ -166,10 +176,12 @@
return cell;
}
+ @Override
public ProvidesKey<C> getKeyProvider() {
return keyProvider;
}
+ @Override
public C getValue() {
return value;
}
@@ -213,6 +225,7 @@
* existing value.
* </p>
*/
+ @Override
public void setValue(C value) {
setValue(value, false, true);
}
@@ -224,6 +237,7 @@
* existing value.
* </p>
*/
+ @Override
public void setValue(C value, boolean fireEvents) {
setValue(value, fireEvents, true);
}
diff --git a/user/test/com/google/gwt/user/cellview/client/CellWidgetTest.java b/user/test/com/google/gwt/user/cellview/client/CellWidgetTest.java
index 5b400f8..38b721d 100644
--- a/user/test/com/google/gwt/user/cellview/client/CellWidgetTest.java
+++ b/user/test/com/google/gwt/user/cellview/client/CellWidgetTest.java
@@ -42,6 +42,7 @@
private String lastEventValue;
private Object lastEventKey;
+ private String lastRenderedValue = "never_rendered";
public CustomCell() {
super("change");
@@ -57,6 +58,11 @@
lastEventValue = null;
}
+ public void assertLastRenderedValue(String expected) {
+ assertEquals(expected, lastRenderedValue);
+ lastRenderedValue = null;
+ }
+
@Override
public void onBrowserEvent(Context context, Element parent, String value, NativeEvent event,
ValueUpdater<String> valueUpdater) {
@@ -69,6 +75,7 @@
@Override
public void render(Context context, String value, SafeHtmlBuilder sb) {
+ lastRenderedValue = value;
if (value != null) {
sb.appendEscaped(value);
}
@@ -96,6 +103,7 @@
onValueChangeCalled = false;
}
+ @Override
public void onValueChange(ValueChangeEvent<C> event) {
assertFalse("ValueChangeEvent fired twice", onValueChangeCalled);
onValueChangeCalled = true;
@@ -108,6 +116,16 @@
return "com.google.gwt.user.cellview.CellView";
}
+ /**
+ * Tests that the cell widget will render correctly with an initial value of null.
+ */
+ public void testInitialValueNull() {
+ CustomCell cell = new CustomCell();
+ CellWidget<String> cw = new CellWidget<String>(cell);
+ assertNull(cw.getValue());
+ cell.assertLastRenderedValue(null);
+ }
+
public void testOnBrowserEvent() {
CustomCell cell = new CustomCell();
CellWidget<String> cw = new CellWidget<String>(cell, "test");
@@ -122,6 +140,7 @@
public void testOnBrowserEventWithKeyProvider() {
ProvidesKey<String> keyProvider = new ProvidesKey<String>() {
+ @Override
public Object getKey(String item) {
// Return the first character as the key.
return (item == null) ? null : item.substring(0, 1);
@@ -165,8 +184,10 @@
@Override
public void render(com.google.gwt.cell.client.Cell.Context context, String value,
SafeHtmlBuilder sb) {
- sb.appendHtmlConstant("<div>").appendEscaped(value).appendHtmlConstant("</div>");
- sb.appendHtmlConstant("<div>child2</div>");
+ if (value != null) {
+ sb.appendHtmlConstant("<div>").appendEscaped(value).appendHtmlConstant("</div>");
+ sb.appendHtmlConstant("<div>child2</div>");
+ }
}
};
CellWidget<String> cw = new CellWidget<String>(cell);
@@ -225,11 +246,13 @@
// Check the intial value.
assertEquals("initial", cw.getValue());
assertEquals("initial", cw.getElement().getInnerText());
+ cell.assertLastRenderedValue("initial");
// Set value without firing events.
cw.setValue("test0");
assertEquals("test0", cw.getValue());
assertEquals("test0", cw.getElement().getInnerText());
+ cell.assertLastRenderedValue("test0");
handler.assertOnValueChangeNotCalled();
// Set value to the existing value, shouldn't fire events.
@@ -240,6 +263,7 @@
cw.setValue("test1", true);
assertEquals("test1", cw.getValue());
assertEquals("test1", cw.getElement().getInnerText());
+ cell.assertLastRenderedValue("test1");
handler.assertLastValue("test1");
// Set value, fire events, but do not redraw.