Cherry picking r9453 into release branch.


git-svn-id: https://google-web-toolkit.googlecode.com/svn/releases/2.1@9454 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/cellview/client/CellList.java b/user/src/com/google/gwt/user/cellview/client/CellList.java
index 2c557d5..c7100d1 100644
--- a/user/src/com/google/gwt/user/cellview/client/CellList.java
+++ b/user/src/com/google/gwt/user/cellview/client/CellList.java
@@ -340,7 +340,7 @@
   protected Element getKeyboardSelectedElement() {
     // Do not use getRowElement() because that will flush the presenter.
     int rowIndex = getKeyboardSelectedRow();
-    if (childContainer.getChildCount() > rowIndex) {
+    if (rowIndex >= 0 && childContainer.getChildCount() > rowIndex) {
       return childContainer.getChild(rowIndex).cast();
     }
     return null;
diff --git a/user/src/com/google/gwt/user/cellview/client/CellTable.java b/user/src/com/google/gwt/user/cellview/client/CellTable.java
index 0c5e6a6..7511d58 100644
--- a/user/src/com/google/gwt/user/cellview/client/CellTable.java
+++ b/user/src/com/google/gwt/user/cellview/client/CellTable.java
@@ -869,7 +869,7 @@
     // Do not use getRowElement() because that will flush the presenter.
     int rowIndex = getKeyboardSelectedRow();
     NodeList<TableRowElement> rows = tbody.getRows();
-    if (rowIndex < rows.getLength() && columns.size() > 0) {
+    if (rowIndex >= 0 && rowIndex < rows.getLength() && columns.size() > 0) {
       TableRowElement tr = rows.getItem(rowIndex);
       TableCellElement td = tr.getCells().getItem(keyboardSelectedColumn);
       return getCellParent(td);
diff --git a/user/test/com/google/gwt/user/cellview/client/AbstractHasDataTestBase.java b/user/test/com/google/gwt/user/cellview/client/AbstractHasDataTestBase.java
index d56a3f5..5f4bc4f 100644
--- a/user/test/com/google/gwt/user/cellview/client/AbstractHasDataTestBase.java
+++ b/user/test/com/google/gwt/user/cellview/client/AbstractHasDataTestBase.java
@@ -25,6 +25,7 @@
 import com.google.gwt.regexp.shared.MatchResult;
 import com.google.gwt.regexp.shared.RegExp;
 import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
+import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy;
 import com.google.gwt.user.client.Window;
 import com.google.gwt.view.client.ListDataProvider;
 import com.google.gwt.view.client.Range;
@@ -145,6 +146,21 @@
     assertEquals("test 12", items.get(2));
   }
 
+  /**
+   * Test that we don't get any errors when keyboard selection is disabled.
+   */
+  public void testKeyboardSelectionPolicyDisabled() {
+    AbstractHasData<String> display = createAbstractHasData(new TextCell());
+    display.setRowData(createData(0, 10));
+    display.getPresenter().flush();
+    display.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.DISABLED);
+
+    assertNull(display.getKeyboardSelectedElement());
+    display.resetFocusOnCell();
+    display.setAccessKey('a');
+    display.setTabIndex(1);
+  }
+
   public void testResetFocus() {
     IndexCell<String> cell = new IndexCell<String>();
     AbstractHasData<String> display = createAbstractHasData(cell);