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