Add a check for special html characters to SafeHtmlUtils#fromString().

This speeds up the calls for inputs that don't contain any special 
html characters i.e. "Hello User!"
The slowdown for html strings is negligible because html tends to start 
with '<', a special character i.e. "<h1>Hello User!</h1>

Benchmarks performed: http://jsperf.com/html-entities-replace

Change-Id: Ieb831fcc8ba31353f791f33fda93c2df41db8949
Review-Link: https://gwt-review.googlesource.com/#/c/13413/
diff --git a/user/src/com/google/gwt/safehtml/shared/SafeHtmlUtils.java b/user/src/com/google/gwt/safehtml/shared/SafeHtmlUtils.java
index 7533a48..7e10bf4 100644
--- a/user/src/com/google/gwt/safehtml/shared/SafeHtmlUtils.java
+++ b/user/src/com/google/gwt/safehtml/shared/SafeHtmlUtils.java
@@ -29,6 +29,7 @@
    */
   public static final SafeHtml EMPTY_SAFE_HTML = new SafeHtmlString("");
 
+  private static final RegExp HTML_CHARS_RE = RegExp.compile("[&<>'\"]");
   private static final RegExp AMP_RE = RegExp.compile("&", "g");
   private static final RegExp GT_RE = RegExp.compile(">", "g");
   private static final RegExp LT_RE = RegExp.compile("<", "g");
@@ -104,7 +105,7 @@
 
   /**
    * HTML-escapes a character. HTML meta characters will be escaped as follows:
-   * 
+   *
    * <pre>
    * &amp; - &amp;amp;
    * &lt; - &amp;lt;
@@ -137,22 +138,30 @@
   /**
    * HTML-escapes a string.
    *
-   * Note: The following variants of this function were profiled on FF36,
-   * Chrome6, IE8:
+   * <p>Note: The following variants of this function were profiled on FF40,
+   * Chrome44, Safari 8 and IE11:
    * <ol>
-   * <li>For each case, check indexOf, then use s.replace(regex, string)</li>
-   * <li>For each case, check indexOf, then use s.replaceAll()</li>
-   * <li>Check if any metachar is present using a regex, then use #1</li>
-   * <li>For each case, use s.replace(regex, string)</li>
+   * <li>For each metachar, check indexOf, then use s.replace(regex, string)
+   * <li>For each metachar use s.replace(regex, string)
+   * <li>Manual replace each metachar by looping through characters in a loop.
+   * <li>Check if any metachar is present using a regex, then use #1.
+   * <li>Check if any metachar is present using a regex, then use #2.
+   * <li>Check if any metachar is present using a regex, then use #3.
    * </ol>
    *
-   * #1 was found to be the fastest, and is used below.
+   * <p>For all browsers #4 was found to be the fastest, and is used below.
+   *
+   * <p>The only out-lier was firefox with #6 being the optimal option, but #6
+   * performs considerably worse in all other browsers.
    *
    * @param s the string to be escaped
    * @return the input string, with all occurrences of HTML meta-characters
    *         replaced with their corresponding HTML Entity References
    */
   public static String htmlEscape(String s) {
+    if (!HTML_CHARS_RE.test(s)) {
+      return s;
+    }
     if (s.indexOf("&") != -1) {
       s = AMP_RE.replace(s, "&amp;");
     }