[js_runtime] Clean up String.trim{Left,Right}

- Use the standardized JavaScript names `trimStart` and `trimEnd`.
- Remove IE11 polyfill.

Change-Id: I9a469b8bf076efd16ef06b88c7fa111784054bb7
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/323300
Reviewed-by: Nicholas Shahan <nshahan@google.com>
Commit-Queue: Stephen Adams <sra@google.com>
diff --git a/sdk/lib/_internal/js_dev_runtime/private/js_string.dart b/sdk/lib/_internal/js_dev_runtime/private/js_string.dart
index 2f9e026..e4af722 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/js_string.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/js_string.dart
@@ -275,15 +275,14 @@
     return index;
   }
 
-  // Dart2js can't use JavaScript trim directly,
-  // because JavaScript does not trim
-  // the NEXT LINE (NEL) character (0x85).
+  // Can't use JavaScript `trim()` directly, because it does not trim the NEXT
+  // LINE (NEL) character (U+0085).
   @notNull
   String trim() {
     const int NEL = 0x85;
 
-    // Start by doing JS trim. Then check if it leaves a NEL at
-    // either end of the string.
+    // Start by doing JS trim. Then check if it leaves a NEL at either end of
+    // the string.
     String result = JS('!', '#.trim()', this);
     final length = result.length;
     if (length == 0) return result;
@@ -305,63 +304,37 @@
     return JS<String>('!', r'#.substring(#, #)', result, startIndex, endIndex);
   }
 
-  // Dart2js can't use JavaScript trimLeft directly,
-  // because it is not in ES5, so not every browser implements it,
-  // and because those that do will not trim the NEXT LINE character (0x85).
+  // Can't use JavaScript `trimStart()` directly because it does not trim the
+  // NEXT LINE character (U+0085).
   @notNull
   String trimLeft() {
     const int NEL = 0x85;
 
-    // Start by doing JS trim. Then check if it leaves a NEL at
-    // the beginning of the string.
-    String result;
-    int startIndex = 0;
-    if (JS<bool>('!', 'typeof #.trimLeft != "undefined"', this)) {
-      result = JS<String>('!', '#.trimLeft()', this);
-      if (result.length == 0) return result;
-      int firstCode = result.codeUnitAt(0);
-      if (firstCode == NEL) {
-        startIndex = _skipLeadingWhitespace(result, 1);
-      }
-    } else {
-      result = this;
-      startIndex = _skipLeadingWhitespace(this, 0);
-    }
-    if (startIndex == 0) return result;
-    if (startIndex == result.length) return "";
-    return JS<String>('!', r'#.substring(#)', result, startIndex);
+    // Start by doing JS trim. Then check if it leaves a NEL at the beginning of
+    // the string.
+    String result = JS('!', '#.trimStart()', this);
+    if (result.length == 0) return result;
+    int firstCode = result.codeUnitAt(0);
+    if (firstCode != NEL) return result;
+    int startIndex = _skipLeadingWhitespace(result, 1);
+    return JS('!', r'#.substring(#)', result, startIndex);
   }
 
-  // Dart2js can't use JavaScript trimRight directly,
-  // because it is not in ES5 and because JavaScript does not trim
-  // the NEXT LINE character (0x85).
+  // Can't use JavaScript `trimEnd()` directly because it is does not trim the
+  // NEXT LINE character (U+0085).
   @notNull
   String trimRight() {
     const int NEL = 0x85;
 
-    // Start by doing JS trim. Then check if it leaves a NEL or BOM at
-    // the end of the string.
-    String result;
-    @notNull
-    int endIndex = 0;
-    // trimRight is implemented by Firefox and Chrome/Blink,
-    // so use it if it is there.
-    if (JS<bool>('!', 'typeof #.trimRight != "undefined"', this)) {
-      result = JS<String>('!', '#.trimRight()', this);
-      endIndex = result.length;
-      if (endIndex == 0) return result;
-      int lastCode = result.codeUnitAt(endIndex - 1);
-      if (lastCode == NEL) {
-        endIndex = _skipTrailingWhitespace(result, endIndex - 1);
-      }
-    } else {
-      result = this;
-      endIndex = _skipTrailingWhitespace(this, this.length);
-    }
-
-    if (endIndex == result.length) return result;
-    if (endIndex == 0) return "";
-    return JS<String>('!', r'#.substring(#, #)', result, 0, endIndex);
+    // Start by doing JS trim. Then check if it leaves a NEL at the end of the
+    // string.
+    String result = JS('!', '#.trimEnd()', this);
+    int endIndex = result.length;
+    if (endIndex == 0) return result;
+    int lastCode = result.codeUnitAt(endIndex - 1);
+    if (lastCode != NEL) return result;
+    endIndex = _skipTrailingWhitespace(result, endIndex - 1);
+    return JS('!', r'#.substring(#, #)', result, 0, endIndex);
   }
 
   @notNull
diff --git a/sdk/lib/_internal/js_runtime/lib/js_string.dart b/sdk/lib/_internal/js_runtime/lib/js_string.dart
index 0c09013..09c8b0f 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_string.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_string.dart
@@ -258,14 +258,13 @@
     return index;
   }
 
-  // Dart2js can't use JavaScript trim directly,
-  // because JavaScript does not trim
-  // the NEXT LINE (NEL) character (0x85).
+  // Can't use JavaScript `trim()` directly, because it does not trim the NEXT
+  // LINE (NEL) character (U+0085).
   String trim() {
     const int NEL = 0x85;
 
-    // Start by doing JS trim. Then check if it leaves a NEL at
-    // either end of the string.
+    // Start by doing JS trim. Then check if it leaves a NEL at either end of
+    // the string.
     String result = JS('String', '#.trim()', this);
     if (result.length == 0) return result;
     int firstCode = result.codeUnitAt(0);
@@ -286,59 +285,34 @@
     return JS('String', r'#.substring(#, #)', result, startIndex, endIndex);
   }
 
-  // Dart2js can't use JavaScript trimLeft directly,
-  // because it is not in ES5, so not every browser implements it,
-  // and because those that do will not trim the NEXT LINE character (0x85).
+  // Can't use JavaScript `trimStart()` directly because it does not trim the
+  // NEXT LINE character (U+0085).
   String trimLeft() {
     const int NEL = 0x85;
 
-    // Start by doing JS trim. Then check if it leaves a NEL at
-    // the beginning of the string.
-    String result;
-    int startIndex = 0;
-    if (JS('bool', 'typeof #.trimLeft != "undefined"', this)) {
-      result = JS('String', '#.trimLeft()', this);
-      if (result.length == 0) return result;
-      int firstCode = result.codeUnitAt(0);
-      if (firstCode == NEL) {
-        startIndex = _skipLeadingWhitespace(result, 1);
-      }
-    } else {
-      result = this;
-      startIndex = _skipLeadingWhitespace(this, 0);
-    }
-    if (startIndex == 0) return result;
-    if (startIndex == result.length) return "";
+    // Start by doing JS trim. Then check if it leaves a NEL at the beginning of
+    // the string.
+    String result = JS('String', '#.trimStart()', this);
+    if (result.length == 0) return result;
+    int firstCode = result.codeUnitAt(0);
+    if (firstCode != NEL) return result;
+    int startIndex = _skipLeadingWhitespace(result, 1);
     return JS('String', r'#.substring(#)', result, startIndex);
   }
 
-  // Dart2js can't use JavaScript trimRight directly,
-  // because it is not in ES5 and because JavaScript does not trim
-  // the NEXT LINE character (0x85).
+  // Can't use JavaScript `trimEnd()` directly because it is does not trim the
+  // NEXT LINE character (U+0085).
   String trimRight() {
     const int NEL = 0x85;
 
-    // Start by doing JS trim. Then check if it leaves a NEL or BOM at
-    // the end of the string.
-    String result;
-    int endIndex;
-    // trimRight is implemented by Firefox and Chrome/Blink,
-    // so use it if it is there.
-    if (JS('bool', 'typeof #.trimRight != "undefined"', this)) {
-      result = JS('String', '#.trimRight()', this);
-      endIndex = result.length;
-      if (endIndex == 0) return result;
-      int lastCode = result.codeUnitAt(endIndex - 1);
-      if (lastCode == NEL) {
-        endIndex = _skipTrailingWhitespace(result, endIndex - 1);
-      }
-    } else {
-      result = this;
-      endIndex = _skipTrailingWhitespace(this, this.length);
-    }
-
-    if (endIndex == result.length) return result;
-    if (endIndex == 0) return "";
+    // Start by doing JS trim. Then check if it leaves a NEL at the end of the
+    // string.
+    String result = JS('String', '#.trimEnd()', this);
+    int endIndex = result.length;
+    if (endIndex == 0) return result;
+    int lastCode = result.codeUnitAt(endIndex - 1);
+    if (lastCode != NEL) return result;
+    endIndex = _skipTrailingWhitespace(result, endIndex - 1);
     return JS('String', r'#.substring(#, #)', result, 0, endIndex);
   }