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

Side by Side Diff: Source/bindings/dart/DartApplicationLoader.cpp

Issue 26490003: Reapply "Move isolate loading to a separate loader isolate." (Closed) Base URL: svn://svn.chromium.org/multivm/trunk/webkit
Patch Set: Initialize flag properly Created 7 years, 2 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/bindings/dart/DartApplicationLoader.h ('k') | Source/bindings/dart/DartAsyncLoader.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009, Google Inc. 1 // Copyright (c) 2009, Google Inc.
2 // All rights reserved. 2 // All rights reserved.
3 // 3 //
4 // Redistribution and use in source and binary forms, with or without 4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are 5 // modification, are permitted provided that the following conditions are
6 // met: 6 // met:
7 // 7 //
8 // * Redistributions of source code must retain the above copyright 8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer. 9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above 10 // * Redistributions in binary form must reproduce the above
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 53
54 static bool isSnapshottingEnabled() 54 static bool isSnapshottingEnabled()
55 { 55 {
56 return getenv("DART_SNAPSHOTTING_ENABLED"); 56 return getenv("DART_SNAPSHOTTING_ENABLED");
57 } 57 }
58 58
59 DartApplicationLoader::DartApplicationLoader( 59 DartApplicationLoader::DartApplicationLoader(
60 Dart_Isolate isolate, 60 Dart_Isolate isolate,
61 Document* document, 61 Document* document,
62 PassRefPtr<ErrorEventDispatcher> errorEventDispatcher, 62 PassRefPtr<ErrorEventDispatcher> errorEventDispatcher,
63 PassRefPtr<VoidCallback> applicationLoadedCallback, 63 PassRefPtr<DartAsyncLoader> asyncLoader,
64 bool domEnabled) 64 bool domEnabled)
65 : m_isolate(isolate) 65 : m_isolate(isolate)
66 , m_originDocument(document) 66 , m_originDocument(document)
67 , m_errorEventDispatcher(errorEventDispatcher) 67 , m_errorEventDispatcher(errorEventDispatcher)
68 , m_libraryUrl() 68 , m_libraryUrl()
69 , m_importedLibraries()
70 , m_importersForSource()
71 , m_mainScriptHasBeenLoaded(false)
72 , m_scriptHasError(false) 69 , m_scriptHasError(false)
73 , m_applicationLoadedCallback(applicationLoadedCallback)
74 , m_domEnabled(domEnabled) 70 , m_domEnabled(domEnabled)
71 , m_asyncLoader(asyncLoader)
75 { 72 {
76 ASSERT(m_originDocument); 73 ASSERT(m_originDocument);
77 } 74 }
78 75
79 static const unsigned dartTypeID = 0xDAADDAAD; 76 static const unsigned dartTypeID = 0xDAADDAAD;
80 77
81 void DartApplicationLoader::reportDartError(Dart_Handle error) 78 void DartApplicationLoader::reportDartError(Dart_Handle error)
82 { 79 {
83 m_scriptHasError = true; 80 m_scriptHasError = true;
84 DartUtilities::reportProblem(m_originDocument, error, m_libraryUrl); 81 DartUtilities::reportProblem(m_originDocument, error, m_libraryUrl);
85 } 82 }
86 83
87 Dart_Handle DartApplicationLoader::libraryTagHandlerCallback(Dart_LibraryTag tag , Dart_Handle library, Dart_Handle urlHandle) 84 Dart_Handle DartApplicationLoader::libraryTagHandlerCallback(Dart_LibraryTag tag , Dart_Handle library, Dart_Handle urlHandle)
88 { 85 {
89 ASSERT(Dart_CurrentIsolate()); 86 ASSERT(Dart_CurrentIsolate());
90 ASSERT(Dart_IsLibrary(library)); 87 ASSERT(Dart_IsLibrary(library));
91 88
92 const String url = DartUtilities::toString(urlHandle); 89 const String url = DartUtilities::toString(urlHandle);
93 90
94 if (tag == Dart_kCanonicalizeUrl) { 91 if (tag == Dart_kCanonicalizeUrl) {
95 // If a dart application calls spawnUri, the DartVM will call this 92 // If a dart application calls spawnUri, the DartVM will call this
96 // libraryTagHandler to canonicalize the url. 93 // libraryTagHandler to canonicalize the url.
97 // DartDOMData::current()->applicationLoader() may be 0 at this point. 94 // DartDOMData::current()->applicationLoader() may be 0 at this point.
98 return DartApplicationLoader::CanonicalizeUrl(library, urlHandle, url); 95 return DartUtilities::canonicalizeUrl(library, urlHandle, url);
99 } 96 }
100 97
101 ASSERT(DartDOMData::current()->applicationLoader()); 98 ASSERT(DartDOMData::current()->applicationLoader());
102 return DartDOMData::current()->applicationLoader()->libraryTagHandler(tag, l ibrary, urlHandle, url); 99 return DartDOMData::current()->applicationLoader()->libraryTagHandler(tag, l ibrary, urlHandle, url);
103 } 100 }
104 101
105 Dart_Handle DartApplicationLoader::CanonicalizeUrl(Dart_Handle library, Dart_Han dle urlHandle, String url) 102 Dart_Handle DartApplicationLoader::libraryTagHandler(Dart_LibraryTag tag, Dart_H andle library, Dart_Handle urlHandle, String url)
106 { 103 {
107 if (url.startsWith("dart:") || url.startsWith("package:")) 104 ASSERT(m_asyncLoader->contains(url));
108 return urlHandle; 105 const String& source = m_asyncLoader->get(url);
109 106
110 Dart_Handle libraryURLHandle = Dart_LibraryUrl(library); 107 Dart_Handle import;
111 ASSERT(!Dart_IsError(libraryURLHandle)); 108 if (tag == Dart_kImportTag) {
112 String libraryURL = DartUtilities::toString(libraryURLHandle); 109 import = Dart_LoadLibrary(DartUtilities::stringToDartString(url), DartUt ilities::convertSourceString(source));
113 110 } else if (tag == Dart_kSourceTag) {
114 bool packageScheme = false; 111 import = Dart_LoadSource(library, DartUtilities::stringToDartString(url) , DartUtilities::convertSourceString(source));
115 112 } else {
116 const char* kPackagePrefix = "package:"; 113 ASSERT_NOT_REACHED();
117 const int kPackagePrefixLength = strlen(kPackagePrefix); 114 DartUtilities::reportProblem(m_originDocument, "Invalid import tag");
118 115 return Dart_NewBoolean(false);
119 const char* kHttpPrefix = "http://";
120 const int kHttpPrefixLength = strlen(kHttpPrefix);
121
122 if (libraryURL.startsWith(kPackagePrefix)) {
123 // KURL has problems concating package:foo/bar (without slashes right af ter colon)
124 // and relative urls. Therefore pretend to be a standard absolute URL.
125 packageScheme = true;
126 libraryURL = kHttpPrefix + libraryURL.substring(kPackagePrefixLength);
127 } 116 }
128 117
129 const KURL canonical = KURL(KURL(KURL(), libraryURL), url); 118 if (Dart_IsError(import)) {
130 String result = canonical.string(); 119 reportDartError(import);
131 if (packageScheme) 120 return Dart_NewBoolean(false);
132 result = kPackagePrefix + result.substring(kHttpPrefixLength); 121 }
133 return DartUtilities::stringToDartString(result);
134 }
135 122
136 Dart_Handle DartApplicationLoader::libraryTagHandler(Dart_LibraryTag tag, Dart_H andle library, Dart_Handle urlHandle, String url)
137 {
138 ASSERT(url != "dart:html");
139
140 // Record the importer.
141 if (tag == Dart_kImportTag)
142 m_importedLibraries.add(url);
143 else if (tag == Dart_kSourceTag) {
144 Dart_Handle libraryURLHandle = Dart_LibraryUrl(library);
145 ASSERT(!Dart_IsError(libraryURLHandle));
146 String libraryURL = DartUtilities::toString(libraryURLHandle);
147
148 add(m_importersForSource, url, libraryURL);
149 } else
150 ASSERT_NOT_REACHED();
151
152 loadScriptResource(url);
153 return Dart_NewBoolean(true); 123 return Dart_NewBoolean(true);
154 } 124 }
155 125
156 void DartApplicationLoader::load(const String& url, const String& source, WTF::O rdinalNumber startLineNumber) 126 void DartApplicationLoader::load(const String& url, const String& source, int st artLineNumber)
157 { 127 {
158 DartIsolateScope isolateScope(m_isolate); 128 DartIsolateScope isolateScope(m_isolate);
159 DartApiScope dartApiScope; 129 DartApiScope dartApiScope;
160 if (m_importedLibraries.isEmpty() && m_importersForSource.isEmpty()) { 130 m_libraryUrl = url;
161 m_libraryUrl = url; 131 loadMainScript(url, source, startLineNumber);
162 loadMainScript(url, source, startLineNumber);
163 m_mainScriptHasBeenLoaded = true;
164 } else {
165 ASSERT(m_importedLibraries.contains(url) || m_importersForSource.contain s(url));
166 if (m_importedLibraries.contains(url)) {
167 loadLibrary(url, source);
168 m_importedLibraries.remove(url);
169 }
170 132
171 if (m_importersForSource.contains(url)) { 133 uint8_t* buffer;
172 loadSource(url, source); 134 intptr_t size;
173 m_importersForSource.remove(url); 135 Dart_Handle result = Dart_CreateScriptSnapshot(&buffer, &size);
174 } 136 if (Dart_IsError(result)) {
137 reportDartError(result);
138 // FIXME: exiting early might be not the best option if error is due to snapshot
139 // creation proper (and not due to compilation), even though it's unlike ly.
140 // Consider other options like Dart_CompileAll.
141 return;
175 } 142 }
176 143
177 if (m_importedLibraries.isEmpty() && m_importersForSource.isEmpty() && m_mai nScriptHasBeenLoaded) { 144 Vector<uint8_t>* snapshot = DartDOMData::current()->applicationSnapshot();
178 uint8_t* buffer; 145 ASSERT(snapshot->isEmpty());
179 intptr_t size; 146 snapshot->append(buffer, size);
180 Dart_Handle result = Dart_CreateScriptSnapshot(&buffer, &size);
181 if (Dart_IsError(result)) {
182 reportDartError(result);
183 // FIXME: exiting early might be not the best option if error is due to snapshot
184 // creation proper (and not due to compilation), even though it's un likely.
185 // Consider other options like Dart_CompileAll.
186 return;
187 }
188 147
189 Vector<uint8_t>* snapshot = DartDOMData::current()->applicationSnapshot( ); 148 if (isSnapshottingEnabled()) {
190 ASSERT(snapshot->isEmpty()); 149 ResourceFetcher* loader = m_originDocument->fetcher();
191 snapshot->append(buffer, size); 150 FetchRequest request(m_originDocument->completeURL(mainLibraryURL()), Fe tchInitiatorTypeNames::document);
151 ResourcePtr<ScriptResource> scriptResource = loader->requestScript(reque st);
152 if (scriptResource && !scriptResource->cachedMetadata(dartTypeID))
153 scriptResource->setCachedMetadata(dartTypeID, reinterpret_cast<const char*>(buffer), size);
154 }
192 155
193 if (isSnapshottingEnabled()) { 156 callEntryPoint();
194 ResourceFetcher* loader = m_originDocument->fetcher();
195 FetchRequest request(m_originDocument->completeURL(mainLibraryURL()) , FetchInitiatorTypeNames::document);
196 ResourcePtr<ScriptResource> scriptResource = loader->requestScript(r equest);
197 if (scriptResource && !scriptResource->cachedMetadata(dartTypeID))
198 scriptResource->setCachedMetadata(dartTypeID, reinterpret_cast<c onst char*>(buffer), size);
199 }
200
201 callEntryPoint();
202 }
203 }
204
205 static Dart_Handle convertSourceString(const String& source)
206 {
207 const CString utf8encoded = source.utf8();
208 return Dart_NewStringFromCString(utf8encoded.data());
209 } 157 }
210 158
211 void DartApplicationLoader::installLibraryTagHandlerForCurrentIsolate() 159 void DartApplicationLoader::installLibraryTagHandlerForCurrentIsolate()
212 { 160 {
213 Dart_Handle result = Dart_SetLibraryTagHandler(&libraryTagHandlerCallback); 161 Dart_Handle result = Dart_SetLibraryTagHandler(&libraryTagHandlerCallback);
214 ASSERT(!Dart_IsError(result)); 162 ASSERT(!Dart_IsError(result));
215 UNUSED_PARAM(result); 163 UNUSED_PARAM(result);
216 } 164 }
217 165
218 void DartApplicationLoader::loadMainScript(const String& url, const String& sour ce, WTF::OrdinalNumber startLineNumber) 166 void DartApplicationLoader::loadMainScript(const String& url, const String& sour ce, int lineOffset)
219 { 167 {
220 // Associate application loader with current isolate, so we can retrieve it 168 // Associate application loader with current isolate, so we can retrieve it
221 // in libraryTagHandlerCallback. 169 // in libraryTagHandlerCallback.
222 DartDOMData::current()->setApplicationLoader(this); 170 DartDOMData::current()->setApplicationLoader(this);
223 installLibraryTagHandlerForCurrentIsolate(); 171 installLibraryTagHandlerForCurrentIsolate();
224 172
225 // startLineNumber == OrdinalNumber::beforeFirst() if the script was not 173 // startLineNumber == OrdinalNumber::beforeFirst() if the script was not
226 // inserted by the parser (e.g. it was inserted by JavaScript or Dart code. 174 // inserted by the parser (e.g. it was inserted by JavaScript or Dart code.
227 // We should not pass the Dart VM a negative line number so we fall back to 175 // We should not pass the Dart VM a negative line number so we fall back to
228 // passing in line number zero for that case. 176 // passing in line number zero for that case.
229 intptr_t lineOffset = startLineNumber == OrdinalNumber::beforeFirst() ? 0 : startLineNumber.zeroBasedInt(); 177 if (lineOffset < 0)
178 lineOffset = 0;
230 179
231 Dart_Handle dartSource = convertSourceString(source); 180 Dart_Handle dartSource = DartUtilities::convertSourceString(source);
232 181
233 if (m_domEnabled) { 182 if (m_domEnabled) {
234 // The main page already should have an isolate. Load this script as a t op-level library. 183 // The main page already should have an isolate. Load this script as a t op-level library.
235 184
236 // FIXME(dartbug.com/13301): Hoist this out once we support multiple scr ipt tags per isolate. 185 // FIXME(dartbug.com/13301): Hoist this out once we support multiple scr ipt tags per isolate.
237 String scriptUrl = url + "$script"; 186 String scriptUrl = url + "$script";
238 Dart_Handle script = Dart_LoadScript(DartUtilities::stringToDartString(s criptUrl), Dart_NewStringFromCString(""), 0, 0); 187 Dart_Handle script = Dart_LoadScript(DartUtilities::stringToDartString(s criptUrl), Dart_NewStringFromCString(""), 0, 0);
239 if (Dart_IsError(script)) 188 if (Dart_IsError(script))
240 DartUtilities::reportProblem(m_originDocument, script, m_libraryUrl) ; 189 DartUtilities::reportProblem(m_originDocument, script, m_libraryUrl) ;
241 190
242 // FIXME(dartbug.com/13460): We need to record the lineOffset and column Offset. 191 // FIXME(dartbug.com/13460): We need to record the lineOffset and column Offset.
243 Dart_Handle library = Dart_LoadLibrary(DartUtilities::stringToDartString (url), dartSource); 192 Dart_Handle library = Dart_LoadLibrary(DartUtilities::stringToDartString (url), dartSource);
244 if (Dart_IsError(library)) 193 if (Dart_IsError(library))
245 DartUtilities::reportProblem(m_originDocument, library, m_libraryUrl ); 194 DartUtilities::reportProblem(m_originDocument, library, m_libraryUrl );
246 195
247 Dart_Handle result = Dart_LibraryImportLibrary(script, library, Dart_Nul l()); 196 Dart_Handle result = Dart_LibraryImportLibrary(script, library, Dart_Nul l());
248 if (Dart_IsError(result)) 197 if (Dart_IsError(result))
249 DartUtilities::reportProblem(m_originDocument, result, m_libraryUrl) ; 198 DartUtilities::reportProblem(m_originDocument, result, m_libraryUrl) ;
250 } else { 199 } else {
251 // This is a background isolate. Load as a top-level script. 200 // This is a background isolate. Load as a top-level script.
252 Dart_Handle script = Dart_LoadScript(DartUtilities::stringToDartString(u rl), dartSource, lineOffset, 0); 201 Dart_Handle script = Dart_LoadScript(DartUtilities::stringToDartString(u rl), dartSource, lineOffset, 0);
253 if (Dart_IsError(script)) 202 if (Dart_IsError(script))
254 DartUtilities::reportProblem(m_originDocument, script, m_libraryUrl) ; 203 DartUtilities::reportProblem(m_originDocument, script, m_libraryUrl) ;
255 } 204 }
256 } 205 }
257 206
258 void DartApplicationLoader::loadScriptFromSnapshot(const String& url, const uint 8_t* snapshot, intptr_t snapshotSize) 207 void DartApplicationLoader::loadScriptFromSnapshot(const String& url, const uint 8_t* snapshot, intptr_t snapshotSize)
259 { 208 {
260 Timeline timeline(m_originDocument->frame(), String("loadSnapshot@") + m_lib raryUrl); 209 Timeline timeline(m_originDocument->frame(), String("loadSnapshot@") + m_lib raryUrl);
261 ASSERT(m_importedLibraries.isEmpty());
262 ASSERT(m_importersForSource.isEmpty());
263 m_libraryUrl = url; 210 m_libraryUrl = url;
264 DartIsolateScope isolateScope(m_isolate); 211 DartIsolateScope isolateScope(m_isolate);
265 DartApiScope apiScope; 212 DartApiScope apiScope;
266 Dart_Handle result = Dart_LoadScriptFromSnapshot(snapshot, snapshotSize); 213 Dart_Handle result = Dart_LoadScriptFromSnapshot(snapshot, snapshotSize);
267 if (Dart_IsError(result)) { 214 if (Dart_IsError(result)) {
268 reportDartError(result); 215 reportDartError(result);
269 return; 216 return;
270 } 217 }
271 callEntryPoint(); 218 callEntryPoint();
272 } 219 }
273 220
274 void DartApplicationLoader::loadSource(const String& url, const String& source)
275 {
276 ASSERT(m_importersForSource.contains(url));
277 const UrlSet* importers = m_importersForSource.find(url)->value;
278 Dart_Handle dartUrl = DartUtilities::stringToDartString(url);
279 Dart_Handle dartSource = convertSourceString(source);
280 for (UrlSet::iterator iter = importers->begin(); iter != importers->end(); + +iter) {
281 Dart_Handle library = Dart_LookupLibrary(DartUtilities::stringToDartStri ng(*iter));
282 if (Dart_IsError(library)) {
283 reportDartError(library);
284 return;
285 }
286 Dart_Handle result = Dart_LoadSource(library, dartUrl, dartSource);
287 if (Dart_IsError(result)) {
288 reportDartError(result);
289 return;
290 }
291 }
292 }
293
294 void DartApplicationLoader::loadLibrary(const String& url, const String& source) 221 void DartApplicationLoader::loadLibrary(const String& url, const String& source)
295 { 222 {
296 ASSERT(m_importedLibraries.contains(url)); 223 Dart_Handle result = Dart_LoadLibrary(DartUtilities::stringToDartString(url) , DartUtilities::convertSourceString(source));
297 Dart_Handle result = Dart_LoadLibrary(DartUtilities::stringToDartString(url) , convertSourceString(source));
298 if (Dart_IsError(result)) 224 if (Dart_IsError(result))
299 reportDartError(result); 225 reportDartError(result);
300 } 226 }
301 227
302 void DartApplicationLoader::callEntryPoint() 228 void DartApplicationLoader::callEntryPoint()
303 { 229 {
304 RefPtr<DartApplicationLoader> guard(this);
305
306 Timeline timeline(m_originDocument->frame(), String("callEntryPoint@") + m_l ibraryUrl); 230 Timeline timeline(m_originDocument->frame(), String("callEntryPoint@") + m_l ibraryUrl);
307 ASSERT(m_originDocument->readyState() != "loading"); 231 ASSERT(m_originDocument->readyState() != "loading");
308 if (m_domEnabled) { 232 if (m_domEnabled) {
309 Timeline timeline(m_originDocument->frame(), String("notifyDebugServer@") + m_libraryUrl); 233 Timeline timeline(m_originDocument->frame(), String("notifyDebugServer@") + m_libraryUrl);
310 DartDebugServer::shared().isolateLoaded(); 234 DartDebugServer::shared().isolateLoaded();
311 } 235 }
236
237 // FIXME: Do we still need this?
312 if (m_scriptHasError) { 238 if (m_scriptHasError) {
313 // Errors have already been printed to console. 239 // Errors have already been printed to console.
314 return; 240 return;
315 } 241 }
316 242
317 if (m_applicationLoadedCallback)
318 m_applicationLoadedCallback->handleEvent();
319
320 if (m_domEnabled) { 243 if (m_domEnabled) {
321 V8Scope v8scope; 244 V8Scope v8scope;
322 Dart_Handle result = Dart_Invoke(topLevelLibrary(), Dart_NewStringFromCS tring("main"), 0, 0); 245 Dart_Handle result = Dart_Invoke(topLevelLibrary(), Dart_NewStringFromCS tring("main"), 0, 0);
323 if (Dart_IsError(result)) 246 if (Dart_IsError(result))
324 DartUtilities::reportProblem(m_originDocument, result, m_libraryUrl) ; 247 DartUtilities::reportProblem(m_originDocument, result, m_libraryUrl) ;
325 } 248 }
326 249
327 // Application loading is finished. Delete application loader for current is olate. 250 // Application loading is finished. Delete application loader for current is olate.
328 DartDOMData::current()->setApplicationLoader(0); 251 DartDOMData::current()->setApplicationLoader(0);
329 } 252 }
330 253
331 Dart_Handle DartApplicationLoader::topLevelLibrary() 254 Dart_Handle DartApplicationLoader::topLevelLibrary()
332 { 255 {
333 Dart_Handle library = Dart_LookupLibrary(DartUtilities::stringToDartString(m _libraryUrl)); 256 Dart_Handle library = Dart_LookupLibrary(DartUtilities::stringToDartString(m _libraryUrl));
334 ASSERT(!Dart_IsError(library)); 257 ASSERT(!Dart_IsError(library));
335 return library; 258 return library;
336 } 259 }
337 260
338 class ScriptLoadCallback : public ResourceClient {
339 public:
340 ScriptLoadCallback(String url, PassRefPtr<DartApplicationLoader> loader, Res ourcePtr<ScriptResource> scriptResource)
341 : m_url(url)
342 , m_loader(loader)
343 , m_scriptResource(scriptResource)
344 {
345 }
346
347 virtual void notifyFinished(Resource* cachedResource)
348 {
349 ASSERT(cachedResource->type() == Resource::Script);
350 ASSERT(cachedResource == m_scriptResource.get());
351 ASSERT(WTF::isMainThread());
352
353 if (cachedResource->errorOccurred())
354 m_loader->scriptLoadError(m_url);
355 else if (cachedResource->wasCanceled()) {
356 // FIXME: shall we let VM know, so it can inform application some of its
357 // resources cannot be loaded?
358 } else {
359 ScriptSourceCode sourceCode(m_scriptResource.get());
360 CachedMetadata* cachedMetadata = m_scriptResource->cachedMetadata(da rtTypeID);
361 if (cachedMetadata)
362 m_loader->loadScriptFromSnapshot(sourceCode.url(), reinterpret_c ast<const uint8_t*>(cachedMetadata->data()), static_cast<intptr_t>(cachedMetadat a->size()));
363 else {
364 // Use the original url associated with the Script so that
365 // redirects do not break the DartApplicationLoader.
366 // FIXME: is this the correct behavior? This functionality is
367 // very convenient when you want the source file to act as if
368 // it was from the original location but that isn't always
369 // what the user expects.
370 m_loader->load(m_url, sourceCode.source(), WTF::OrdinalNumber::f irst());
371 }
372 }
373
374 m_scriptResource->removeClient(this);
375 delete this;
376 }
377
378 private:
379 String m_url;
380 RefPtr<DartApplicationLoader> m_loader;
381 ResourcePtr<ScriptResource> m_scriptResource;
382 };
383
384 static String resolveUrl(String mainLibraryURL, const String& url)
385 {
386 if (!url.startsWith("package:") || url.startsWith("package://"))
387 return url;
388
389 String packageRoot;
390 String packageUrl;
391 if (const char* packageRootOverride = getenv("DART_PACKAGE_ROOT")) {
392 // Resolve with respect to the override. Append a
393 // slash to ensure that resolution is against this
394 // path and not its parent.
395 packageRoot = String(packageRootOverride) + "/";
396 // Strip the 'package:' prefix.
397 packageUrl = url.substring(8);
398 } else {
399 // Resolve with respect to the entry point's URL. Note, the
400 // trailing file name in the entry point URL (e.g.,
401 // 'rootpath/mainapp.dart') is stripped by the KURL
402 // constructor below.
403 packageRoot = mainLibraryURL;
404 packageUrl = String("packages/") + url.substring(8);
405 }
406 return KURL(KURL(KURL(), packageRoot), packageUrl).string();
407 }
408
409 void DartApplicationLoader::loadScriptResource(const String& url)
410 {
411 // Request loading of script dependencies.
412 FetchRequest request(m_originDocument->completeURL(resolveUrl(mainLibraryURL (), url)), FetchInitiatorTypeNames::document, "utf8");
413 // FIXME: what about charset for this script, maybe use charset of initial s cript tag?
414 ResourcePtr<ScriptResource> scriptResource = m_originDocument->fetcher()->re questScript(request);
415 if (scriptResource)
416 scriptResource->addClient(new ScriptLoadCallback(m_originDocument->compl eteURL(url), this, scriptResource));
417 else
418 scriptLoadError(url);
419 }
420
421 void DartApplicationLoader::scriptLoadError(String failedUrl) 261 void DartApplicationLoader::scriptLoadError(String failedUrl)
422 { 262 {
423 // FIXME: try to dig out line number, -1 for now. 263 // FIXME: try to dig out line number, -1 for now.
424 if (failedUrl.startsWith(String("dart:"))) { 264 if (failedUrl.startsWith(String("dart:"))) {
425 m_originDocument->logExceptionToConsole(String("The built-in library '") + failedUrl + String("' is not available on Dartium."), m_libraryUrl, -1, 0, 0) ; 265 m_originDocument->logExceptionToConsole(String("The built-in library '") + failedUrl + String("' is not available on Dartium."), m_libraryUrl, -1, 0, 0) ;
426 } else { 266 } else {
427 m_originDocument->logExceptionToConsole(String("Failed to load a file ") + failedUrl, m_libraryUrl, -1, 0, 0); 267 m_originDocument->logExceptionToConsole(String("Failed to load a file ") + failedUrl, m_libraryUrl, -1, 0, 0);
428 } 268 }
429 m_errorEventDispatcher->dispatchErrorEvent(); 269 m_errorEventDispatcher->dispatchErrorEvent();
430 } 270 }
431 271
432 void DartApplicationLoader::add(UrlMultiMap& map, const String& key, const Strin g& value)
433 {
434 // We should never have a self dependence.
435 ASSERT(key != value);
436 UrlMultiMap::iterator iter = map.find(key);
437 if (iter == map.end())
438 iter = map.add(key, new UrlSet()).iterator;
439 UrlSet* set = iter->value;
440 set->add(value);
441 } 272 }
442
443 }
OLDNEW
« no previous file with comments | « Source/bindings/dart/DartApplicationLoader.h ('k') | Source/bindings/dart/DartAsyncLoader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698