Changes Window.Location to use URL.decodeComponent instead of URL.decode;
adds a test to make sure the decoding is working properly. Fixes issue 2941.

review by: jgw


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@5322 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/client/Window.java b/user/src/com/google/gwt/user/client/Window.java
index 872ac69..7b6b25b 100644
--- a/user/src/com/google/gwt/user/client/Window.java
+++ b/user/src/com/google/gwt/user/client/Window.java
@@ -270,7 +270,7 @@
             values = new ArrayList<String>();
             out.put(kv[0], values);
           }
-          values.add(kv.length > 1 ? URL.decode(kv[1]) : "");
+          values.add(kv.length > 1 ? URL.decodeComponent(kv[1]) : "");
         }
       }
 
@@ -292,7 +292,7 @@
           for (String kvPair : qs.split("&")) {
             String[] kv = kvPair.split("=", 2);
             if (kv.length > 1) {
-              paramMap.put(kv[0], URL.decode(kv[1]));
+              paramMap.put(kv[0], URL.decodeComponent(kv[1]));
             } else {
               paramMap.put(kv[0], "");
             }
diff --git a/user/test/com/google/gwt/user/client/WindowTest.java b/user/test/com/google/gwt/user/client/WindowTest.java
index b0e0ea6..41f82fa 100644
--- a/user/test/com/google/gwt/user/client/WindowTest.java
+++ b/user/test/com/google/gwt/user/client/WindowTest.java
@@ -116,6 +116,11 @@
     assertEquals(map.get("d").get(0), "d=d");
     assertEquals(map.get("f").get(0), "2");
     assertEquals(map.get("f").get(1), "1");
+
+    // Values escaped with hex codes should work too.
+    map = Window.Location.buildListParamMap(
+    "?foo=bar%20baz%3aqux");
+    assertEquals(map.get("foo").get(0), "bar baz:qux");
   }
 
   /**