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() {