Work around Firefox issue where hasOwnProperty(new String(key)) fails

Review by: jat



git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@7043 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/json/client/JSONObject.java b/user/src/com/google/gwt/json/client/JSONObject.java
index 77080a3..f191c0b 100644
--- a/user/src/com/google/gwt/json/client/JSONObject.java
+++ b/user/src/com/google/gwt/json/client/JSONObject.java
@@ -195,7 +195,9 @@
   private native void addAllKeys(Collection<String> s) /*-{
     var jsObject = this.@com.google.gwt.json.client.JSONObject::jsObject;
     for (var key in jsObject) {
-      s.@java.util.Collection::add(Ljava/lang/Object;)(key);
+      if (jsObject.hasOwnProperty(key)) {
+        s.@java.util.Collection::add(Ljava/lang/Object;)(key);
+      }
     }
   }-*/;
 
@@ -213,7 +215,9 @@
     var jsObject = this.@com.google.gwt.json.client.JSONObject::jsObject;
     var i = 0;
     for (var key in jsObject) {
-      result[i++] = key;
+      if (jsObject.hasOwnProperty(key)) {
+        result[i++] = key;
+      }
     }
     return result;
   }-*/;
@@ -222,15 +226,26 @@
     var jsObject = this.@com.google.gwt.json.client.JSONObject::jsObject;
     var size = 0;
     for (var key in jsObject) {
-      ++size;
+      if (jsObject.hasOwnProperty(key)) {
+        ++size;
+      }
     }
     return size;
   }-*/;
 
   private native JSONValue get0(String key) /*-{
-    var v = this.@com.google.gwt.json.client.JSONObject::jsObject[key];
+    var jsObject = this.@com.google.gwt.json.client.JSONObject::jsObject;
+    var v;
+    // In Firefox, jsObject.hasOwnProperty(key) fails when key is
+    // a String object rather than a primitive string.        
+    if (jsObject.hasOwnProperty(key)
+        || ((typeof key == 'object') && (key.constructor == String)
+        && jsObject.hasOwnProperty(key.toString()))) {
+      v = jsObject[key];
+    }
     var func = @com.google.gwt.json.client.JSONParser::typeMap[typeof v];
-    return func ? func(v) : @com.google.gwt.json.client.JSONParser::throwUnknownTypeException(Ljava/lang/String;)(typeof v);
+    var ret = func ? func(v) : @com.google.gwt.json.client.JSONParser::throwUnknownTypeException(Ljava/lang/String;)(typeof v);
+    return ret;
   }-*/;
 
   private native void put0(String key, JSONValue value) /*-{