| Index: dart/editor/tools/plugins/com.google.dart.tools.debug.core/src/com/google/dart/tools/debug/core/webkit/WebkitRemoteObject.java
 | 
| ===================================================================
 | 
| --- dart/editor/tools/plugins/com.google.dart.tools.debug.core/src/com/google/dart/tools/debug/core/webkit/WebkitRemoteObject.java	(revision 37109)
 | 
| +++ dart/editor/tools/plugins/com.google.dart.tools.debug.core/src/com/google/dart/tools/debug/core/webkit/WebkitRemoteObject.java	(working copy)
 | 
| @@ -17,6 +17,10 @@
 | 
|  import org.json.JSONException;
 | 
|  import org.json.JSONObject;
 | 
|  
 | 
| +import java.io.IOException;
 | 
| +import java.util.concurrent.CountDownLatch;
 | 
| +import java.util.concurrent.TimeUnit;
 | 
| +
 | 
|  /**
 | 
|   * A WIP scope object.
 | 
|   * 
 | 
| @@ -63,6 +67,8 @@
 | 
|  
 | 
|    private String value;
 | 
|  
 | 
| +  private int listLength = -1;
 | 
| +
 | 
|    @Override
 | 
|    public boolean equals(Object obj) {
 | 
|      if (obj instanceof WebkitRemoteObject) {
 | 
| @@ -99,30 +105,39 @@
 | 
|    /**
 | 
|     * Return the length of the list if this object is a list.
 | 
|     * 
 | 
| +   * @param webkitConnection
 | 
|     * @return
 | 
|     */
 | 
| -  public int getListLength() {
 | 
| -    // TODO(devoncarew): write a test to notify us when this convention changes
 | 
| +  public int getListLength(WebkitConnection connection) {
 | 
| +    if (listLength == -1) {
 | 
| +      final CountDownLatch latch = new CountDownLatch(1);
 | 
|  
 | 
| -    // Since there is no direct way to obtain the length of an array, use the description from
 | 
| -    // Dartium to derive the array length. value.getDescription() == "Array[x]"
 | 
| +      try {
 | 
| +        connection.getRuntime().callListLength(objectId, new WebkitCallback<Integer>() {
 | 
| +          @Override
 | 
| +          public void handleResult(WebkitResult<Integer> result) {
 | 
| +            if (result.isError()) {
 | 
| +              listLength = 0;
 | 
| +            } else {
 | 
| +              listLength = result.getResult().intValue();
 | 
| +            }
 | 
|  
 | 
| -    String str = getDescription();
 | 
| +            latch.countDown();
 | 
| +          }
 | 
| +        });
 | 
| +      } catch (IOException e) {
 | 
| +        listLength = 0;
 | 
| +        latch.countDown();
 | 
| +      }
 | 
|  
 | 
| -    int startIndex = str.indexOf('[');
 | 
| -    int endIndex = str.indexOf(']', startIndex);
 | 
| -
 | 
| -    if (startIndex != -1 && endIndex != -1) {
 | 
| -      String val = str.substring(startIndex + 1, endIndex);
 | 
| -
 | 
|        try {
 | 
| -        return Integer.parseInt(val);
 | 
| -      } catch (NumberFormatException nfe) {
 | 
| +        latch.await(3, TimeUnit.SECONDS);
 | 
| +      } catch (InterruptedException e) {
 | 
|  
 | 
|        }
 | 
|      }
 | 
|  
 | 
| -    return 0;
 | 
| +    return listLength;
 | 
|    }
 | 
|  
 | 
|    public String getObjectId() {
 | 
| @@ -186,7 +201,7 @@
 | 
|    }
 | 
|  
 | 
|    public boolean isList() {
 | 
| -    return "array".equals(subtype);
 | 
| +    return "object".equals(type) && "List".equals(className);
 | 
|    }
 | 
|  
 | 
|    public boolean isNode() {
 | 
| @@ -194,7 +209,7 @@
 | 
|    }
 | 
|  
 | 
|    public boolean isNull() {
 | 
| -    if (isObject() && "null".equals(subtype)) {
 | 
| +    if (isObject() && "null".equals(value)) {
 | 
|        return true;
 | 
|      } else {
 | 
|        return false;
 | 
| 
 |