Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(359)

Unified Diff: sdk/lib/core/uri.dart

Issue 2664453003: Add Uri.isScheme test function. (Closed)
Patch Set: Address comment. Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « CHANGELOG.md ('k') | tests/corelib/uri_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sdk/lib/core/uri.dart
diff --git a/sdk/lib/core/uri.dart b/sdk/lib/core/uri.dart
index e9a716fb34fcf6d1ca9a5098cf028a437a6c0c32..7e335b9ff9e8c0895193bad8f66931cb45e87fb6 100644
--- a/sdk/lib/core/uri.dart
+++ b/sdk/lib/core/uri.dart
@@ -512,6 +512,21 @@ abstract class Uri {
*/
String get origin;
+ /// Whether the scheme of this [Uri] is [scheme].
+ ///
+ /// The [scheme] should be the same as the one returned by [Uri.scheme],
+ /// but doesn't have to be case-normalized to lower-case characters.
+ ///
+ /// Example:
+ /// ```dart
+ /// var uri = Uri.parse("http://example.com/");
+ /// print(uri.isScheme("HTTP")); // Prints true.
+ /// ```
+ ///
+ /// A `null` or empty [scheme] string matches a URI with no scheme
+ /// (one where [hasScheme] returns false).
+ bool isScheme(String scheme);
+
/**
* Returns the file path from a file URI.
*
@@ -1532,6 +1547,44 @@ class _Uri implements Uri {
String get fragment => _fragment ?? "";
+ bool isScheme(String scheme) {
+ String thisScheme = this.scheme;
+ if (scheme == null) return thisScheme.isEmpty;
+ if (scheme.length != thisScheme.length) return false;
+ return _compareScheme(scheme, thisScheme);
+ }
+
+ /// Compares scheme characters in [scheme] and at the start of [uri].
+ ///
+ /// Returns `true` if [scheme] represents the same scheme as the start of
+ /// [uri]. That means having the same characters, but possibly different case
+ /// for letters.
+ ///
+ /// This function doesn't check that the characters are valid URI scheme
+ /// characters. The [uri] is assumed to be valid, so if [scheme] matches
+ /// it, it has to be valid too.
+ ///
+ /// The length should be tested before calling this function,
+ /// so the scheme part of [uri] is known to have the same length as [scheme].
+ static bool _compareScheme(String scheme, String uri) {
+ for (int i = 0; i < scheme.length; i++) {
+ int schemeChar = scheme.codeUnitAt(i);
+ int uriChar = uri.codeUnitAt(i);
+ int delta = schemeChar ^ uriChar;
+ if (delta != 0) {
+ if (delta == 0x20) {
+ // Might be a case difference.
+ int lowerChar = uriChar | delta;
+ if (0x61 /*a*/ <= lowerChar && lowerChar <= 0x7a /*z*/) {
+ continue;
+ }
+ }
+ return false;
+ }
+ }
+ return true;
+ }
+
// Report a parse failure.
static void _fail(String uri, int index, String message) {
throw new FormatException(message, uri, index);
@@ -4071,6 +4124,7 @@ class _SimpleUri implements Uri {
bool get _isHttp => _schemeEnd == 4 && _uri.startsWith("http");
bool get _isHttps => _schemeEnd == 5 && _uri.startsWith("https");
bool get _isPackage => _schemeEnd == 7 && _uri.startsWith("package");
+ /// Like [isScheme] but expects argument to be case normalized.
bool _isScheme(String scheme) =>
_schemeEnd == scheme.length && _uri.startsWith(scheme);
@@ -4079,6 +4133,12 @@ class _SimpleUri implements Uri {
bool get isAbsolute => hasScheme && !hasFragment;
+ bool isScheme(String scheme) {
+ if (scheme == null || scheme.isEmpty) return _schemeEnd < 0;
+ if (scheme.length != _schemeEnd) return false;
+ return _Uri._compareScheme(scheme, _uri);
+ }
+
String get scheme {
if (_schemeEnd <= 0) return "";
if (_schemeCache != null) return _schemeCache;
« no previous file with comments | « CHANGELOG.md ('k') | tests/corelib/uri_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698