Fixes a bug in AbstractPager where clearing the display and resetting it causes an NPE.
Review at http://gwt-code-reviews.appspot.com/1500803
Review by: andycheng@google.com
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@10475 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/cellview/client/AbstractPager.java b/user/src/com/google/gwt/user/cellview/client/AbstractPager.java
index 1ea9866..bb2457b 100644
--- a/user/src/com/google/gwt/user/cellview/client/AbstractPager.java
+++ b/user/src/com/google/gwt/user/cellview/client/AbstractPager.java
@@ -27,6 +27,10 @@
*/
public abstract class AbstractPager extends Composite {
+ // Visible for testing.
+ HandlerRegistration rangeChangeHandler;
+ HandlerRegistration rowCountChangeHandler;
+
private HasRows display;
/**
@@ -39,9 +43,6 @@
*/
private int lastRowCount;
- private HandlerRegistration rangeChangeHandler;
- private HandlerRegistration rowCountChangeHandler;
-
/**
* Get the {@link HasRows} being paged.
*
@@ -109,29 +110,28 @@
}
if (rowCountChangeHandler != null) {
rowCountChangeHandler.removeHandler();
- rangeChangeHandler = null;
+ rowCountChangeHandler = null;
}
// Set the new display.
this.display = display;
if (display != null) {
- rangeChangeHandler = display.addRangeChangeHandler(
- new RangeChangeEvent.Handler() {
- public void onRangeChange(RangeChangeEvent event) {
- if (AbstractPager.this.display != null) {
- onRangeOrRowCountChanged();
- }
- }
- });
- rowCountChangeHandler = display.addRowCountChangeHandler(
- new RowCountChangeEvent.Handler() {
- public void onRowCountChange(RowCountChangeEvent event) {
- if (AbstractPager.this.display != null) {
- handleRowCountChange(
- event.getNewRowCount(), event.isNewRowCountExact());
- }
- }
- });
+ rangeChangeHandler = display.addRangeChangeHandler(new RangeChangeEvent.Handler() {
+ @Override
+ public void onRangeChange(RangeChangeEvent event) {
+ if (AbstractPager.this.display != null) {
+ onRangeOrRowCountChanged();
+ }
+ }
+ });
+ rowCountChangeHandler = display.addRowCountChangeHandler(new RowCountChangeEvent.Handler() {
+ @Override
+ public void onRowCountChange(RowCountChangeEvent event) {
+ if (AbstractPager.this.display != null) {
+ handleRowCountChange(event.getNewRowCount(), event.isNewRowCountExact());
+ }
+ }
+ });
// Initialize the pager.
onRangeOrRowCountChanged();
diff --git a/user/test/com/google/gwt/user/cellview/client/AbstractPagerTest.java b/user/test/com/google/gwt/user/cellview/client/AbstractPagerTest.java
index 7e93928..ef59c6b 100644
--- a/user/test/com/google/gwt/user/cellview/client/AbstractPagerTest.java
+++ b/user/test/com/google/gwt/user/cellview/client/AbstractPagerTest.java
@@ -19,6 +19,8 @@
import com.google.gwt.view.client.HasRows;
import com.google.gwt.view.client.MockHasData;
import com.google.gwt.view.client.Range;
+import com.google.gwt.view.client.RangeChangeEvent;
+import com.google.gwt.view.client.RowCountChangeEvent;
/**
* Tests for {@link AbstractPager}.
@@ -236,6 +238,45 @@
assertEquals(new Range(25, 20), display.getVisibleRange());
}
+ public void testSetDisplay() {
+ AbstractPager pager = createPager();
+ assertNull(pager.getDisplay());
+
+ // Set display to a value.
+ MockHasData<String> display0 = new MockHasData<String>();
+ pager.setDisplay(display0);
+ assertEquals(display0, pager.getDisplay());
+ assertEquals(1, display0.getHandlerCount(RangeChangeEvent.getType()));
+ assertEquals(1, display0.getHandlerCount(RowCountChangeEvent.getType()));
+ assertNotNull(pager.rangeChangeHandler);
+ assertNotNull(pager.rowCountChangeHandler);
+
+ /*
+ * Set display to null.
+ *
+ * Verify that the handlers are removed.
+ */
+ pager.setDisplay(null);
+ assertNull(pager.getDisplay());
+ assertEquals(0, display0.getHandlerCount(RangeChangeEvent.getType()));
+ assertEquals(0, display0.getHandlerCount(RowCountChangeEvent.getType()));
+ assertNull(pager.rangeChangeHandler);
+ assertNull(pager.rowCountChangeHandler);
+
+ /*
+ * Set display again.
+ *
+ * Verify that the handlers are re-added.
+ */
+ MockHasData<String> display1 = new MockHasData<String>();
+ pager.setDisplay(display1);
+ assertEquals(display1, pager.getDisplay());
+ assertEquals(1, display1.getHandlerCount(RangeChangeEvent.getType()));
+ assertEquals(1, display1.getHandlerCount(RowCountChangeEvent.getType()));
+ assertNotNull(pager.rangeChangeHandler);
+ assertNotNull(pager.rowCountChangeHandler);
+ }
+
public void testSetPage() {
AbstractPager pager = createPager();