diff --git a/spec/index.bs b/spec/index.bs index b103582..7e38b31 100644 --- a/spec/index.bs +++ b/spec/index.bs @@ -127,6 +127,8 @@ spec:ECMA-262; urlPrefix: https://tc39.github.io/ecma262/ type:dfn; text:current realm record; url: current-realm spec: HTML; urlPrefix: https://html.spec.whatwg.org/ type: dfn; text: prepare the script element; url: prepare-the-script-element + type: dfn; text: The text insertion mode; url: parsing-main-incdata + type: dfn; text: reentrant invocation of the parser; url: nestedParsing type: dfn; text: get the text steps; url: get-the-text-steps type: dfn; text: set the inner text steps; url: set-the-inner-text-steps type: dfn; text: src; url: attr-script-src @@ -1065,6 +1067,20 @@ Given a {{TrustedType}} type (|expectedType|), a [=realm/global object=] (|globa 1. Return a new instance of an interface with a type name |trustedTypeName|, with its associated data value set to |dataString|. +## Prepare the script text ## {#prepare-script-text} + +Given an {{HTMLScriptElement}} (|script|), this algorithm performs the following steps: + +1. If |script|'s [=script text=] value is not equal to its [=child text content=], + set |script|'s [=script text=] to the result of executing [$Get Trusted Type compliant string$], with the following arguments: + * {{TrustedScriptURL}} as |expectedType|, + * |script|'s {{Document}}'s [=relevant global object=] as |global|, + * |script|'s [=child text content=] attribute value, + * `HTMLScriptElement text` as |sink|, + * `'script'` as |sinkGroup|. + + If the algorithm threw an error, rethrow the error. + ## Get Trusted Types-compliant attribute value ## {#validate-attribute-mutation} To get Trusted Types-compliant attribute value on {{Attr}} |attribute| with {{Element}} |element| and {{TrustedType}} or a string |newValue|, perform the following steps: @@ -1155,17 +1171,12 @@ partial interface HTMLScriptElement { #### Slots with trusted values #### {#slots-with-trusted-values} -An {{HTMLScriptElement}} and {{SVGScriptElement}} have: - -: an associated boolean is trusted. -:: A boolean indicating whether a script element is considered trustworthy for execution. - Initially true. - -Note: This boolean is initially true so that parsed scripts are trusted. +This document modifies {{HTMLScriptElement}}s. Each script has: -: an associated boolean changed by trusted sink. -:: A boolean indicating whether a script element has been modified by a trusted sink. - Initially false. +: an associated string script text. +:: A string, containing the body of the script to execute that was set + through a compliant sink. Equivalent to script's + [=child text content=]. Initially an empty string. #### The {{HTMLScriptElement/innerText}} IDL attribute #### {#the-innerText-idl-attribute} @@ -1174,7 +1185,7 @@ The {{HTMLScriptElement/innerText}} setter steps are: 1. Let |value| be the result of calling [$Get Trusted Type compliant string$] with {{TrustedScript}}, [=this=]'s [=relevant global object=], the given value, `HTMLScriptElement innerText`, and `script`. -1. Set [=this=]'s [=HTMLScriptElement/changed by trusted sink=] to true. +1. Set [=this=]'s [=script text=] value to |value|. 1. Run [=set the inner text steps=] with [=this=] and |value|. The {{HTMLScriptElement/innerText}} getter steps are: @@ -1189,7 +1200,7 @@ empty string instead, and then do as described below: 1. Let |value| be the result of calling [$Get Trusted Type compliant string$] with {{TrustedScript}}, [=this=]'s [=relevant global object=], the given value, `HTMLScriptElement textContent`, and `script`. -1. Set [=this=]'s [=HTMLScriptElement/changed by trusted sink=] to true. +1. Set [=this=]'s [=script text=] value to |value|. 1. Run [=set text content=] with [=this=] and |value|. The {{HTMLScriptElement/textContent}} getter steps are: @@ -1203,7 +1214,7 @@ Update the {{HTMLScriptElement/text}} setter steps algorithm as follows. 1. Let |value| be the result of calling [$Get Trusted Type compliant string$] with {{TrustedScript}}, [=this=]'s [=relevant global object=], the given value, `HTMLScriptElement text`, and `script`. -1. Set [=this=]'s [=HTMLScriptElement/changed by trusted sink=] to true. +1. Set [=this=]'s [=script text=] value to the given value. 1. [=String replace all=] with the given value within [=this=]. @@ -1216,25 +1227,29 @@ The {{HTMLScriptElement/src}} setter steps are: `script`. 1. Set [=this=]'s [=src=] content attribute to |value|. -#### Script children changed steps #### {#script-children-changed-steps} +#### Setting slot values from parser #### {#setting-slot-values-from-parser} -This document modifies the [=children changed steps=] for {{HTMLScriptElement}} as follows: +This document modifies the HTML parser to set the [=script text=] value when the script is created. -1. Set [=this=]'s [=HTMLScriptElement/is trusted=] to false. +Modify the [=The text insertion mode=] algorithm as follows: -1. If [=this=]'s [=HTMLScriptElement/changed by trusted sink=] is true, set [=this=]'s [=HTMLScriptElement/is trusted=] to true. +
+
An end tag whose tag name is "script"
+
+

...

-1. Set [=this=]'s [=HTMLScriptElement/changed by trusted sink=] to false. +

Set script's [=script text=] value to its [=child text content=].

-Note: This relies on the children changed steps never being called by the parser. +

If the active speculative HTML parser is null, then prepare the script + element script. This might cause some script to execute, which might cause + new characters to be inserted into the tokenizer, and + might cause the tokenizer to output more tokens, resulting in a [=reentrant invocation of the parser=].

-Issue: Need to double check how [part of script element's spec](https://html.spec.whatwg.org/#prepare-the-script-element:~:text=When%20a%20script%20element%20el%20that%20is%20not%20parser%2Dinserted%20experiences) fits into this. These steps need to happen before prepare the script is called. +

...

+
+
-This document modifies the [=children changed steps=] for {{SVGScriptElement}} as follows: - -1. Set [=this=]'s [=SVGScriptElement/is trusted=] to false. - -Note: This relies on the children changed steps never being called by the parser. +Issue: The above algorithm doesn't account for the case when the script element's content is changed mid-parse. Implementors should ensure they protect against this case. See [https://github.com/w3c/trusted-types/issues/507](https://github.com/w3c/trusted-types/issues/507). #### Slot value verification #### {#slot-value-verification} @@ -1255,22 +1270,11 @@ The first few steps of the [=prepare the script element=] algorithm are modified

This is done so that if a parser-inserted script element fails to run when the parser tries to run it, but it is later executed after a script dynamically updates it, it will execute in an async fashion even if the async attribute isn't set.

- -
  • Let source text be el's child text content. - -

  • -

    If el's [=HTMLScriptElement/is trusted=] is false: -

      -
    1. Set source text to the result of executing [$Get Trusted Type compliant string$], with - {{TrustedScript}}, el's [=relevant global object=], source text, `'HTMLScriptElement text'`, - and `'script'`. -

      If that algorithm threw an error, then return. -

    +
  • Execute the [$Prepare the script text$] algorithm on el. If that algorithm threw an error, then return.

  • +
  • Let source text be el's child text content. [=script text=] value.

  • ... -Issue: There's no proper definition for the processing of SVG script elements. However, you should apply a similar change to the processing of {{SVGScriptElement}}s. - ## Integration with DOM ## {#integration-with-dom} Note: See [https://github.com/whatwg/dom/pull/1268](https://github.com/whatwg/dom/pull/1268) which upstreams this integration.