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

Side by Side Diff: third_party/WebKit/Source/core/dom/ScriptLoader.cpp

Issue 2842923002: Support Inline module script (Closed)
Patch Set: Rebase Created 3 years, 7 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Dirk Mueller (mueller@kde.org) 4 * (C) 2001 Dirk Mueller (mueller@kde.org)
5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights 5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights
6 * reserved. 6 * reserved.
7 * Copyright (C) 2008 Nikolas Zimmermann <zimmermann@kde.org> 7 * Copyright (C) 2008 Nikolas Zimmermann <zimmermann@kde.org>
8 * 8 *
9 * This library is free software; you can redistribute it and/or 9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public 10 * modify it under the terms of the GNU Library General Public
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 if (!IsScriptForEventSupported()) 314 if (!IsScriptForEventSupported())
315 return false; 315 return false;
316 316
317 // 14. is handled below. 317 // 14. is handled below.
318 318
319 // 15. "Let CORS setting be the current state of the element's 319 // 15. "Let CORS setting be the current state of the element's
320 // crossorigin content attribute." 320 // crossorigin content attribute."
321 CrossOriginAttributeValue cross_origin = 321 CrossOriginAttributeValue cross_origin =
322 GetCrossOriginAttributeValue(element_->CrossOriginAttributeValue()); 322 GetCrossOriginAttributeValue(element_->CrossOriginAttributeValue());
323 323
324 // 16. is handled below. 324 // 16. "Let module script credentials mode be determined by switching
325 // on CORS setting:"
326 WebURLRequest::FetchCredentialsMode credentials_mode =
327 WebURLRequest::kFetchCredentialsModeOmit;
328 switch (cross_origin) {
329 case kCrossOriginAttributeNotSet:
330 credentials_mode = WebURLRequest::kFetchCredentialsModeOmit;
331 break;
332 case kCrossOriginAttributeAnonymous:
333 credentials_mode = WebURLRequest::kFetchCredentialsModeSameOrigin;
334 break;
335 case kCrossOriginAttributeUseCredentials:
336 credentials_mode = WebURLRequest::kFetchCredentialsModeInclude;
337 break;
338 }
325 339
326 // 17. "If the script element has a nonce attribute, 340 // 17. "If the script element has a nonce attribute,
327 // then let cryptographic nonce be that attribute's value. 341 // then let cryptographic nonce be that attribute's value.
328 // Otherwise, let cryptographic nonce be the empty string." 342 // Otherwise, let cryptographic nonce be the empty string."
329 String nonce; 343 String nonce;
330 if (element_->IsNonceableElement()) 344 if (element_->IsNonceableElement())
331 nonce = element_->nonce(); 345 nonce = element_->nonce();
332 346
333 // 18. is handled below. 347 // 18. is handled below.
334 348
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
383 // or if getting an encoding failed, let encoding 397 // or if getting an encoding failed, let encoding
384 // be the same as the encoding of the script element's node 398 // be the same as the encoding of the script element's node
385 // document." 399 // document."
386 // TODO(hiroshige): Should we handle failure in getting an encoding? 400 // TODO(hiroshige): Should we handle failure in getting an encoding?
387 String encoding; 401 String encoding;
388 if (!element_->CharsetAttributeValue().IsEmpty()) 402 if (!element_->CharsetAttributeValue().IsEmpty())
389 encoding = element_->CharsetAttributeValue(); 403 encoding = element_->CharsetAttributeValue();
390 else 404 else
391 encoding = element_document.characterSet(); 405 encoding = element_document.characterSet();
392 406
393 // Step 16 is skipped because "module script credentials" is not used
394 // for classic scripts.
395
396 // 18. "If the script element has an integrity attribute, 407 // 18. "If the script element has an integrity attribute,
397 // then let integrity metadata be that attribute's value. 408 // then let integrity metadata be that attribute's value.
398 // Otherwise, let integrity metadata be the empty string." 409 // Otherwise, let integrity metadata be the empty string."
399 String integrity_attr = element_->IntegrityAttributeValue(); 410 String integrity_attr = element_->IntegrityAttributeValue();
400 IntegrityMetadataSet integrity_metadata; 411 IntegrityMetadataSet integrity_metadata;
401 if (!integrity_attr.IsEmpty()) { 412 if (!integrity_attr.IsEmpty()) {
402 SubresourceIntegrity::ParseIntegrityAttribute( 413 SubresourceIntegrity::ParseIntegrityAttribute(
403 integrity_attr, integrity_metadata, &element_document); 414 integrity_attr, integrity_metadata, &element_document);
404 } 415 }
405 416
406 if (!FetchClassicScript(url, element_document.Fetcher(), nonce, 417 if (!FetchClassicScript(url, element_document.Fetcher(), nonce,
407 integrity_metadata, parser_state, cross_origin, 418 integrity_metadata, parser_state, cross_origin,
408 element_document.GetSecurityOrigin(), encoding)) { 419 element_document.GetSecurityOrigin(), encoding)) {
409 // TODO(hiroshige): Make this asynchronous. Currently we fire the error 420 // TODO(hiroshige): Make this asynchronous. Currently we fire the error
410 // event synchronously to keep the existing behavior. 421 // event synchronously to keep the existing behavior.
411 DispatchErrorEvent(); 422 DispatchErrorEvent();
412 return false; 423 return false;
413 } 424 }
414 425
415 DCHECK(resource_); 426 DCHECK(resource_);
416 DCHECK(!module_tree_client_); 427 DCHECK(!module_tree_client_);
417 } else { 428 } else {
418 // - "module": 429 // - "module":
419 430
420 // Steps 14 and 18 are skipped because they are not used in module 431 // Steps 14 and 18 are skipped because they are not used in module
421 // scripts. 432 // scripts.
422 433
423 // 16. "Let module script credentials mode be determined by switching
424 // on CORS setting:"
425 WebURLRequest::FetchCredentialsMode credentials_mode =
426 WebURLRequest::kFetchCredentialsModeOmit;
427 switch (cross_origin) {
428 case kCrossOriginAttributeNotSet:
429 credentials_mode = WebURLRequest::kFetchCredentialsModeOmit;
430 break;
431 case kCrossOriginAttributeAnonymous:
432 credentials_mode = WebURLRequest::kFetchCredentialsModeSameOrigin;
433 break;
434 case kCrossOriginAttributeUseCredentials:
435 credentials_mode = WebURLRequest::kFetchCredentialsModeInclude;
436 break;
437 }
438
439 DCHECK(RuntimeEnabledFeatures::moduleScriptsEnabled()); 434 DCHECK(RuntimeEnabledFeatures::moduleScriptsEnabled());
440 Modulator* modulator = Modulator::From( 435 Modulator* modulator = Modulator::From(
441 ToScriptStateForMainWorld(element_document.GetFrame())); 436 ToScriptStateForMainWorld(element_document.GetFrame()));
442 FetchModuleScriptTree(url, modulator, nonce, parser_state, 437 FetchModuleScriptTree(url, modulator, nonce, parser_state,
443 credentials_mode); 438 credentials_mode);
444 439
445 DCHECK(!resource_); 440 DCHECK(!resource_);
446 DCHECK(module_tree_client_); 441 DCHECK(module_tree_client_);
447 } 442 }
448 443
(...skipping 26 matching lines...) Expand all
475 // TODO(hiroshige): Make them merged or consistent. 470 // TODO(hiroshige): Make them merged or consistent.
476 471
477 // 22.2. "Switch on the script's type:" 472 // 22.2. "Switch on the script's type:"
478 switch (GetScriptType()) { 473 switch (GetScriptType()) {
479 // - "classic": 474 // - "classic":
480 case ScriptType::kClassic: 475 case ScriptType::kClassic:
481 // TODO(hiroshige): Clarify how Step 22.2 is implemented for "classic". 476 // TODO(hiroshige): Clarify how Step 22.2 is implemented for "classic".
482 break; 477 break;
483 478
484 // - "module": 479 // - "module":
485 case ScriptType::kModule: 480 case ScriptType::kModule: {
486 // TODO(hiroshige): Implement inline module scripts. 481 // 1. "Let base URL be the script element's node document's document
487 element_document.AddConsoleMessage(ConsoleMessage::Create( 482 // base URL."
488 kJSMessageSource, kErrorMessageLevel, 483 KURL base_url = element_document.BaseURL();
489 "Inline module script is not yet supported", 484
490 SourceLocation::Create(element_document.Url().GetString(), 485 // 2. "Let script be the result of creating a module script using
491 script_start_position.line_.OneBasedInt(), 486 // source text, settings, base URL, cryptographic nonce,
492 script_start_position.column_.OneBasedInt(), 487 // parser state, and module script credentials mode."
493 nullptr))); 488 Modulator* modulator = Modulator::From(
494 return false; 489 ToScriptStateForMainWorld(element_document.GetFrame()));
490 ModuleScript* module_script = ModuleScript::Create(
491 ScriptContent(), modulator, base_url, nonce, parser_state,
492 credentials_mode, kSharableCrossOrigin);
493
494 // 3. "If this returns null, set the script's script to null and abort
495 // these substeps; the script is ready."
496 if (!module_script)
497 return false;
498
499 // 4. "Fetch the descendants of script (using an empty ancestor list).
500 // When this asynchronously completes, set the script's script to
501 // the result. At that time, the script is ready."
502 DCHECK(!module_tree_client_);
503 module_tree_client_ = ModulePendingScriptTreeClient::Create();
504 modulator->FetchDescendantsForInlineScript(module_script,
505 module_tree_client_);
506 break;
507 }
495 } 508 }
496 } 509 }
497 510
498 // [Intervention] 511 // [Intervention]
499 // Since the asynchronous, low priority fetch for doc.written blocked 512 // Since the asynchronous, low priority fetch for doc.written blocked
500 // script is not for execution, return early from here. Watch for its 513 // script is not for execution, return early from here. Watch for its
501 // completion to be able to remove it from the memory cache. 514 // completion to be able to remove it from the memory cache.
502 if (GetScriptType() == ScriptType::kClassic && 515 if (GetScriptType() == ScriptType::kClassic &&
503 document_write_intervention_ == 516 document_write_intervention_ ==
504 DocumentWriteIntervention::kFetchDocWrittenScriptDeferIdle) { 517 DocumentWriteIntervention::kFetchDocWrittenScriptDeferIdle) {
(...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after
974 // then abort these steps at this point. The script is not executed. 987 // then abort these steps at this point. The script is not executed.
975 return DeprecatedEqualIgnoringCase(event_attribute, "onload") || 988 return DeprecatedEqualIgnoringCase(event_attribute, "onload") ||
976 DeprecatedEqualIgnoringCase(event_attribute, "onload()"); 989 DeprecatedEqualIgnoringCase(event_attribute, "onload()");
977 } 990 }
978 991
979 String ScriptLoader::ScriptContent() const { 992 String ScriptLoader::ScriptContent() const {
980 return element_->TextFromChildren(); 993 return element_->TextFromChildren();
981 } 994 }
982 995
983 } // namespace blink 996 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698