Fixes a bug in ListDataProvider where the old list can push changes to the display even after a new list has been set.
Review at http://gwt-code-reviews.appspot.com/764802
Review by: rice@google.com
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@8638 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/view/client/ListDataProvider.java b/user/src/com/google/gwt/view/client/ListDataProvider.java
index c8bfee8..6409c46 100644
--- a/user/src/com/google/gwt/view/client/ListDataProvider.java
+++ b/user/src/com/google/gwt/view/client/ListDataProvider.java
@@ -15,8 +15,8 @@
*/
package com.google.gwt.view.client;
-import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.DeferredCommand;
+import com.google.gwt.core.client.Scheduler;
+import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import java.util.ArrayList;
import java.util.Collection;
@@ -153,7 +153,7 @@
* so that we don't spam the displays. This also allows users to clear and
* replace all of the data without forcing the display back to page 0.
*/
- private Command flushCommand = new Command() {
+ private ScheduledCommand flushCommand = new ScheduledCommand() {
public void execute() {
flushPending = false;
if (flushCancelled) {
@@ -394,7 +394,7 @@
flushCancelled = false;
if (!flushPending) {
flushPending = true;
- DeferredCommand.addCommand(flushCommand);
+ Scheduler.get().scheduleFinally(flushCommand);
}
}
@@ -407,6 +407,11 @@
flushCancelled = true;
}
+ // Early exit if this list has been replaced in the data provider.
+ if (listWrapper != this) {
+ return;
+ }
+
int newSize = list.size();
if (curSize != newSize) {
curSize = newSize;
diff --git a/user/test/com/google/gwt/view/client/ListDataProviderTest.java b/user/test/com/google/gwt/view/client/ListDataProviderTest.java
index 86a5ed9..cc6b377 100644
--- a/user/test/com/google/gwt/view/client/ListDataProviderTest.java
+++ b/user/test/com/google/gwt/view/client/ListDataProviderTest.java
@@ -15,6 +15,9 @@
*/
package com.google.gwt.view.client;
+import com.google.gwt.core.client.Scheduler;
+import com.google.gwt.core.client.Scheduler.ScheduledCommand;
+
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -431,13 +434,15 @@
public void testSetList() {
ListDataProvider<String> provider = createListDataProvider(10);
- MockHasData<String> display = new MockHasData<String>();
+ final MockHasData<String> display = new MockHasData<String>();
display.setVisibleRange(0, 15);
provider.addDataDisplay(display);
provider.flush();
display.clearLastRowDataAndRange();
- assertEquals("test 0", provider.getList().get(0));
+ List<String> oldList = provider.getList();
+ assertEquals("test 0", oldList.get(0));
+ // Replace the list.
List<String> replace = new ArrayList<String>();
replace.add("helloworld");
provider.setList(replace);
@@ -445,6 +450,17 @@
assertEquals(1, display.getRowCount());
assertEquals(replace, display.getLastRowData());
assertEquals(new Range(0, 1), display.getLastRowDataRange());
+ display.clearLastRowDataAndRange();
+
+ // Verify that the old list doesn't trigger updates in the display.
+ oldList.set(0, "newValue");
+ delayTestFinish(2000);
+ Scheduler.get().scheduleDeferred(new ScheduledCommand() {
+ public void execute() {
+ assertNull(display.getLastRowData());
+ finishTest();
+ }
+ });
}
public void testSetListEmpty() {