]> source.dussan.org Git - gwtquery.git/commitdiff
Throw a NullPointerException when casting null to Js objects. Fixes issue_122
authorManolo Carrasco <manolo@apache.org>
Mon, 13 Feb 2012 08:08:08 +0000 (08:08 +0000)
committerManolo Carrasco <manolo@apache.org>
Mon, 13 Feb 2012 08:08:08 +0000 (08:08 +0000)
gwtquery-core/src/main/java/com/google/gwt/query/client/Properties.java
gwtquery-core/src/main/java/com/google/gwt/query/client/js/JsCache.java
gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryCoreTestGwt.java

index 6842e311644dba0d84e60ebaf3071313cff668ea..8b2793ffbf986cc35b3db3bbf9177f31ec0e2dff 100644 (file)
@@ -15,6 +15,7 @@
  */\r
 package com.google.gwt.query.client;\r
 \r
+import com.google.gwt.core.client.GWT;\r
 import com.google.gwt.core.client.JavaScriptObject;\r
 import com.google.gwt.core.client.JsArrayMixed;\r
 import com.google.gwt.query.client.js.JsCache;\r
@@ -137,10 +138,6 @@ public class Properties extends JavaScriptObject {
   }\r
   \r
   public final String toJsonString() {\r
-    // In dev-mode a null object casted to JavascriptObject does not throw a NPE\r
-    // e.g: System.out.println(((Properties)null).toJsonString());\r
-    if (this == null) return "null";\r
-    \r
     String ret = "";\r
     for (String k : keys()){\r
       String ky = k.matches("\\d+") ? k : "\"" + k + "\"";\r
@@ -171,9 +168,6 @@ public class Properties extends JavaScriptObject {
   }\r
   \r
   public final String toQueryString() {\r
-    // In dev-mode a null object casted to JavascriptObject does not throw a NPE\r
-    if (this == null) return "null";\r
-    \r
     String ret = "";\r
     for (String k : keys()) {\r
       ret += ret.isEmpty() ? "" : "&";\r
@@ -206,4 +200,5 @@ public class Properties extends JavaScriptObject {
   public final boolean isEmpty(){\r
     return c().length() == 0;\r
   }\r
+\r
 }\r
index bf64308da48a62b20f7a45f37f7cb48624f5119d..ba7242a984d83d975b7432bad2d7e706bcfaba50 100644 (file)
@@ -15,6 +15,7 @@
  */
 package com.google.gwt.query.client.js;
 
+import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.core.client.JsArrayMixed;
 import com.google.gwt.core.client.JsArrayString;
@@ -36,6 +37,7 @@ public class JsCache extends JavaScriptObject {
   }-*/;
   
   public final void pushAll(JavaScriptObject prevElem) {
+    checkNull();
     JsCache c = prevElem.cast();
     for (int i = 0, ilen = c.length(); i < ilen; i++) {
       put(length(), c.get(i));
@@ -101,7 +103,7 @@ public class JsCache extends JavaScriptObject {
   
   public final <T extends JavaScriptObject> T getJavaScriptObject(Object name) {
     Object o = get(name); 
-    return (o instanceof JavaScriptObject) ? ((JavaScriptObject)o).<T>cast() : null;
+    return (o != null && o instanceof JavaScriptObject) ? ((JavaScriptObject)o).<T>cast() : null;
   }
 
   public final native boolean isEmpty() /*-{
@@ -128,6 +130,7 @@ public class JsCache extends JavaScriptObject {
   }-*/;
   
   public final int[] indexes() {
+    checkNull();
     JsArrayString a = keysImpl();
     int[] ret = new int[a.length()];
     for (int i = 0; i < a.length(); i++) {
@@ -141,6 +144,7 @@ public class JsCache extends JavaScriptObject {
   }
   
   public final String[] keys() {
+    checkNull();
     JsArrayString a = keysImpl();
     String[] ret = new String[a.length()];
     for (int i = 0; i < a.length(); i++) {
@@ -167,6 +171,13 @@ public class JsCache extends JavaScriptObject {
     return ret + "}";
   }
   
+  private void checkNull() {
+    // In dev-mode a null object casted to JavascriptObject does not throw a NPE
+    if (!GWT.isProdMode() && this == null) {
+      throw new NullPointerException();
+    }
+  }
+  
   private final native JsArrayString keysImpl() /*-{
     var key, keys=[];
     // Chrome in DevMode injects a property to JS objects
index 347adb1a783b2fedbebd26eb0128e44c38927da2..370e3a1a6d64d03f6010eae5caaeade49f44c2e3 100644 (file)
@@ -547,6 +547,13 @@ public class GQueryCoreTestGwt extends GWTTestCase {
     p = $$("({border:'1px solid black'})");
     assertEquals(1, p.keys().length);
     assertNotNull(p.getStr("border"));
+    
+    try {
+      // DevMode null casting return an object
+      ((Properties)null).toJsonString();
+      fail("Executing methods of a null object should throw a NullPointerException");
+    } catch (NullPointerException e) {
+    }
   }
 
   public void testRelativeMethods() {