| // Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| // part of "core_patch.dart"; |
| |
| @pragma("wasm:import", "dart2wasm.isWindows") |
| external bool _isWindowsRaw(); |
| |
| @pragma("wasm:import", "dart2wasm.getCurrentUri") |
| external String? _currentUriRaw(); |
| |
| @patch |
| class Uri { |
| @patch |
| static Uri get base { |
| String? currentUri = _currentUriRaw(); |
| if (currentUri != null) { |
| return Uri.parse(currentUri); |
| } |
| throw UnsupportedError("'Uri.base' is not supported"); |
| } |
| } |
| |
| @patch |
| class _Uri { |
| @patch |
| static bool get _isWindows => _isWindowsCached; |
| |
| static final bool _isWindowsCached = _isWindowsRaw(); |
| |
| // Matches a String that _uriEncodes to itself regardless of the kind of |
| // component. This corresponds to [_unreservedTable], i.e. characters that |
| // are not encoded by any encoding table. |
| static final RegExp _needsNoEncoding = RegExp(r'^[\-\.0-9A-Z_a-z~]*$'); |
| |
| /** |
| * This is the internal implementation of JavaScript's encodeURI function. |
| * It encodes all characters in the string [text] except for those |
| * that appear in [canonicalTable], and returns the escaped string. |
| */ |
| @patch |
| static String _uriEncode(List<int> canonicalTable, String text, |
| Encoding encoding, bool spaceToPlus) { |
| if (identical(encoding, utf8) && _needsNoEncoding.hasMatch(text)) { |
| return text; |
| } |
| |
| // Encode the string into bytes then generate an ASCII only string |
| // by percent encoding selected bytes. |
| StringBuffer result = StringBuffer(''); |
| var bytes = encoding.encode(text); |
| for (int i = 0; i < bytes.length; i++) { |
| int byte = bytes[i]; |
| if (byte < 128 && |
| ((canonicalTable[byte >> 4] & (1 << (byte & 0x0f))) != 0)) { |
| result.writeCharCode(byte); |
| } else if (spaceToPlus && byte == _SPACE) { |
| result.write('+'); |
| } else { |
| const String hexDigits = '0123456789ABCDEF'; |
| result.write('%'); |
| result.write(hexDigits[(byte >> 4) & 0x0f]); |
| result.write(hexDigits[byte & 0x0f]); |
| } |
| } |
| return result.toString(); |
| } |
| } |