Fixed implementation of String.trim
Issue 1794
Patch by:ecc
Review by:robertvawter

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@1486 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/super/com/google/gwt/emul/java/lang/String.java b/user/super/com/google/gwt/emul/java/lang/String.java
index 97f59aa..bb6fcb6 100644
--- a/user/super/com/google/gwt/emul/java/lang/String.java
+++ b/user/super/com/google/gwt/emul/java/lang/String.java
@@ -457,6 +457,9 @@
   }-*/;
 
   public native String trim() /*-{
+    if(this.length == 0 || (this[0] > '\u0020' && this[this.length-1] > '\u0020')) {
+      return this;
+    }
     var r1 = this.replace(/^(\s*)/, '');
     var r2 = r1.replace(/\s*$/, '');
     return r2;
diff --git a/user/test/com/google/gwt/emultest/java/lang/StringTest.java b/user/test/com/google/gwt/emultest/java/lang/StringTest.java
index 770f601..7f11081 100644
--- a/user/test/com/google/gwt/emultest/java/lang/StringTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/StringTest.java
@@ -176,7 +176,7 @@
     String a = returnNull() + returnNull();
     assertEquals("nullnull", a);
   }
-  
+
   /** tests replace */
   public void testReplace() {
     assertEquals("axax".replace('x', 'a'), "aaaa");
@@ -252,10 +252,29 @@
 
   /** tests trim */
   public void testTrim() {
-    assertEquals("abc", "   \t abc \n  ".trim());
-    assertEquals("abc", "abc".trim());
-    assertEquals("", "".trim());
-    assertEquals("", "   \t ".trim());
+    trimRightAssertEquals("abc", "   \t abc \n  ");
+    trimRightAssertEquals("abc", "abc".trim());
+    trimRightAssertSame("abc", "abc");
+    String s = '\23' + "hi";
+    trimRightAssertSame(s, s);
+    trimRightAssertEquals("abc", " abc".trim());
+    trimRightAssertEquals("abc", "abc ".trim());
+    trimRightAssertEquals("", "".trim());
+    trimRightAssertEquals("", "   \t ".trim());
+  }
+
+  /**
+   * Helper method for testTrim to avoid compiler optimizations.
+   */
+  public void trimRightAssertSame(String left, String right) {
+    assertSame(left, right.trim());
+  }
+
+  /**
+   * Helper method for testTrim to avoid compiler optimizations.
+   */
+  public void trimRightAssertEquals(String left, String right) {
+    assertEquals(left, right.trim());
   }
 
   /** tests toUpperCase */
@@ -288,7 +307,7 @@
   private String returnNull() {
     return null;
   }
-  
+
   private String toS(char from) {
     return Character.toString(from);
   }