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

Unified Diff: DartApplicationLoader.cpp

Issue 18024004: Bugfix in DOM bindings: canonicalize URLs even if no ApplicationLoader is available (Closed) Base URL: http://src.chromium.org/multivm/trunk/webkit/Source/bindings/dart
Patch Set: Created 7 years, 5 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
« DartApplicationLoader.h ('K') | « DartApplicationLoader.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« DartApplicationLoader.h ('K') | « DartApplicationLoader.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698