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