Index: Source/bindings/dart/DartUtilities.cpp |
diff --git a/Source/bindings/dart/DartUtilities.cpp b/Source/bindings/dart/DartUtilities.cpp |
index 910a4b3672f30e866131a8b0c913b54df64c8292..85683e98c0a8250c91a902ac83c84d90eb6e9454 100644 |
--- a/Source/bindings/dart/DartUtilities.cpp |
+++ b/Source/bindings/dart/DartUtilities.cpp |
@@ -1094,32 +1094,32 @@ const uint8_t* DartUtilities::fullSnapshot(LocalFrame* frame) |
Dart_Handle DartUtilities::canonicalizeUrl(Dart_Handle library, Dart_Handle urlHandle, String url) |
{ |
- if (url.startsWith("dart:") || url.startsWith("package:")) |
+ DEFINE_STATIC_LOCAL(String, dartPrefix, ("dart:")); |
+ DEFINE_STATIC_LOCAL(String, packagePrefix, ("package:")); |
+ |
+ if (url.startsWith(dartPrefix) || url.startsWith(packagePrefix)) |
+ // Not a relative URL. |
return urlHandle; |
Dart_Handle libraryURLHandle = Dart_LibraryUrl(library); |
ASSERT(!Dart_IsError(libraryURLHandle)); |
String libraryURL = DartUtilities::toString(libraryURLHandle); |
- bool packageScheme = false; |
- |
- const char* kPackagePrefix = "package:"; |
- const int kPackagePrefixLength = strlen(kPackagePrefix); |
- |
- const char* kHttpPrefix = "http://"; |
- const int kHttpPrefixLength = strlen(kHttpPrefix); |
- |
- if (libraryURL.startsWith(kPackagePrefix)) { |
- // KURL has problems concating package:foo/bar (without slashes right after colon) |
- // and relative urls. Therefore pretend to be a standard absolute URL. |
- packageScheme = true; |
- libraryURL = kHttpPrefix + libraryURL.substring(kPackagePrefixLength); |
+ String result; |
+ if (libraryURL.startsWith(packagePrefix) && !libraryURL.startsWith("package://")) { |
+ // KURL expects a URL with an authority. If the library URL is |
+ // "package:<path>", we convert to "package://_/<path>" for resolution |
+ // and convert back. |
+ DEFINE_STATIC_LOCAL(String, resolvePrefix, ("package://_/")); |
+ |
+ libraryURL = resolvePrefix + libraryURL.substring(packagePrefix.length()); |
+ result = KURL(KURL(KURL(), libraryURL), url).string(); |
+ if (result.startsWith(resolvePrefix)) |
+ result = packagePrefix + result.substring(resolvePrefix.length()); |
+ } else { |
+ result = KURL(KURL(KURL(), libraryURL), url).string(); |
} |
- const KURL canonical = KURL(KURL(KURL(), libraryURL), url); |
- String result = canonical.string(); |
- if (packageScheme) |
- result = kPackagePrefix + result.substring(kHttpPrefixLength); |
return DartUtilities::stringToDartString(result); |
} |