| 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);
|
| }
|
|
|
|
|