| Index: DartApplicationLoader.cpp
|
| diff --git a/DartApplicationLoader.cpp b/DartApplicationLoader.cpp
|
| index 04dba16d4f282c72d18308765484d4e1136c3d2b..a41873731a60e384aa01bfa5bf578354835004a7 100644
|
| --- a/DartApplicationLoader.cpp
|
| +++ b/DartApplicationLoader.cpp
|
| @@ -86,47 +86,66 @@ void DartApplicationLoader::reportDartError(Dart_Handle error)
|
| Dart_Handle DartApplicationLoader::libraryTagHandlerCallback(Dart_LibraryTag tag, Dart_Handle library, Dart_Handle urlHandle)
|
| {
|
| ASSERT(Dart_CurrentIsolate());
|
| + ASSERT(Dart_IsLibrary(library));
|
| +
|
| + const String url = DartUtilities::toString(urlHandle);
|
| +
|
| + if (tag == Dart_kCanonicalizeUrl) {
|
| + // If a dart application calls spawnUri, the DartVM will call this
|
| + // libraryTagHandler to canonicalize the url.
|
| + // DartDOMData::current()->applicationLoader() may be 0 at this point.
|
| + return DartApplicationLoader::CanonicalizeUrl(library, urlHandle, url);
|
| + }
|
| +
|
| ASSERT(DartDOMData::current()->applicationLoader());
|
| - return DartDOMData::current()->applicationLoader()->libraryTagHandler(tag, library, urlHandle);
|
| + return DartDOMData::current()->applicationLoader()->libraryTagHandler(tag, library, urlHandle, url);
|
| }
|
|
|
| -Dart_Handle DartApplicationLoader::libraryTagHandler(Dart_LibraryTag tag, Dart_Handle library, Dart_Handle urlHandle)
|
| +Dart_Handle DartApplicationLoader::CanonicalizeUrl(Dart_Handle library, Dart_Handle urlHandle, String url)
|
| {
|
| - ASSERT(Dart_IsLibrary(library));
|
| -
|
| - const String url = DartUtilities::toString(urlHandle);
|
| + if (url.startsWith("dart:") || url.startsWith("package:"))
|
| + return urlHandle;
|
|
|
| Dart_Handle libraryURLHandle = Dart_LibraryUrl(library);
|
| ASSERT(!Dart_IsError(libraryURLHandle));
|
| String libraryURL = DartUtilities::toString(libraryURLHandle);
|
|
|
| - if (tag == Dart_kCanonicalizeUrl) {
|
| - if (url.startsWith("dart:") || url.startsWith("package:"))
|
| - return urlHandle;
|
| -
|
| - bool packageScheme = false;
|
| - if (libraryURL.startsWith("package:")) {
|
| - // KURL have problems concating package:foo/bar (without slashes right after colon)
|
| - // and relative urls. Therefore pretend to be a standard absolute URL.
|
| - packageScheme = true;
|
| - libraryURL = "http://" + libraryURL.substring(8);
|
| - }
|
| + bool packageScheme = false;
|
| +
|
| + const char* kPackagePrefix = "package:";
|
| + const int kPackagePrefixLength = strlen(kPackagePrefix);
|
|
|
| - const KURL canonical = KURL(KURL(KURL(), libraryURL), url);
|
| - String result = canonical.string();
|
| - if (packageScheme)
|
| - result = "package:" + result.substring(7);
|
| - return DartUtilities::stringToDartString(result);
|
| + 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);
|
| }
|
|
|
| + const KURL canonical = KURL(KURL(KURL(), libraryURL), url);
|
| + String result = canonical.string();
|
| + if (packageScheme)
|
| + result = kPackagePrefix + result.substring(kHttpPrefixLength);
|
| + return DartUtilities::stringToDartString(result);
|
| +}
|
| +
|
| +Dart_Handle DartApplicationLoader::libraryTagHandler(Dart_LibraryTag tag, Dart_Handle library, Dart_Handle urlHandle, String url)
|
| +{
|
| ASSERT(url != "dart:html");
|
|
|
| // Record the importer.
|
| if (tag == Dart_kImportTag)
|
| m_importedLibraries.add(url);
|
| - else if (tag == Dart_kSourceTag)
|
| + else if (tag == Dart_kSourceTag) {
|
| + Dart_Handle libraryURLHandle = Dart_LibraryUrl(library);
|
| + ASSERT(!Dart_IsError(libraryURLHandle));
|
| + String libraryURL = DartUtilities::toString(libraryURLHandle);
|
| +
|
| add(m_importersForSource, url, libraryURL);
|
| - else
|
| + } else
|
| ASSERT_NOT_REACHED();
|
|
|
| loadScriptResource(url);
|
|
|