Changeset 280924 in webkit


Ignore:
Timestamp:
Aug 11, 2021 12:44:55 PM (11 months ago)
Author:
Chris Dumez
Message:

Stop evaluating <script>s moved between Documents during fetching
https://bugs.webkit.org/show_bug.cgi?id=202714
<rdar://problem/56208425>

Reviewed by Geoffrey Garen.

LayoutTests/imported/w3c:

Rebaseline WPT tests now that more checks are passing. Note that these checks were already passing in both Firefox and Chrome.

  • web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/after-prepare-iframe-fetch-error-external-classic-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/after-prepare-iframe-fetch-error-external-module-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/after-prepare-iframe-parse-error-external-classic-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/after-prepare-iframe-parse-error-external-module-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/after-prepare-iframe-parse-error-inline-classic-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/after-prepare-iframe-success-external-classic-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/after-prepare-iframe-success-external-module-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/after-prepare-iframe-success-inline-classic-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/move-back-iframe-fetch-error-external-classic-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/move-back-iframe-fetch-error-external-module-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/move-back-iframe-parse-error-external-classic-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/move-back-iframe-parse-error-external-module-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/move-back-iframe-parse-error-inline-classic-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/move-back-iframe-success-external-classic-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/move-back-iframe-success-external-module-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/move-back-iframe-success-inline-classic-expected.txt:

Source/WebCore:

Stop evaluating <script>s moved between Documents during fetching:

Both Firefox and Chrome already behave this way.

No new tests, rebaselined existing tests.

  • dom/ScriptElement.cpp:

(WebCore::ScriptElement::prepareScript):
Set the element's preparation-time document to its node document, as per:

(WebCore::ScriptElement::executePendingScript):
If scriptElement's preparation-time document is not equal to scriptElement's node document, then return, as per:

  • dom/ScriptElement.h:
Location:
trunk
Files:
20 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r280913 r280924  
     12021-08-11  Chris Dumez  <cdumez@apple.com>
     2
     3        Stop evaluating <script>s moved between Documents during fetching
     4        https://bugs.webkit.org/show_bug.cgi?id=202714
     5        <rdar://problem/56208425>
     6
     7        Reviewed by Geoffrey Garen.
     8
     9        Rebaseline WPT tests now that more checks are passing. Note that these checks were already passing in both Firefox and Chrome.
     10
     11        * web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/after-prepare-iframe-fetch-error-external-classic-expected.txt:
     12        * web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/after-prepare-iframe-fetch-error-external-module-expected.txt:
     13        * web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/after-prepare-iframe-parse-error-external-classic-expected.txt:
     14        * web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/after-prepare-iframe-parse-error-external-module-expected.txt:
     15        * web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/after-prepare-iframe-parse-error-inline-classic-expected.txt:
     16        * web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/after-prepare-iframe-success-external-classic-expected.txt:
     17        * web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/after-prepare-iframe-success-external-module-expected.txt:
     18        * web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/after-prepare-iframe-success-inline-classic-expected.txt:
     19        * web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/move-back-iframe-fetch-error-external-classic-expected.txt:
     20        * web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/move-back-iframe-fetch-error-external-module-expected.txt:
     21        * web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/move-back-iframe-parse-error-external-classic-expected.txt:
     22        * web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/move-back-iframe-parse-error-external-module-expected.txt:
     23        * web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/move-back-iframe-parse-error-inline-classic-expected.txt:
     24        * web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/move-back-iframe-success-external-classic-expected.txt:
     25        * web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/move-back-iframe-success-external-module-expected.txt:
     26        * web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/move-back-iframe-success-inline-classic-expected.txt:
     27
    1282021-08-11  Chris Dumez  <cdumez@apple.com>
    229
  • trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/after-prepare-iframe-fetch-error-external-classic-expected.txt

    r267646 r280924  
     1CONSOLE MESSAGE: Not executing script because it moved between documents during fetching
    12
    23
     
    45PASS Eval: Move fetch-error external classic script to iframe after-prepare
    56PASS <script> load: Move fetch-error external classic script to iframe after-prepare
    6 FAIL <script> error: Move fetch-error external classic script to iframe after-prepare assert_unreached: Script error evennt fired unexpectedly Reached unreachable code
     7PASS <script> error: Move fetch-error external classic script to iframe after-prepare
    78PASS window error: Move fetch-error external classic script to iframe after-prepare
    89
  • trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/after-prepare-iframe-fetch-error-external-module-expected.txt

    r267646 r280924  
     1CONSOLE MESSAGE: Not executing script because it moved between documents during fetching
    12
    23
     
    45PASS Eval: Move fetch-error external module script to iframe after-prepare
    56PASS <script> load: Move fetch-error external module script to iframe after-prepare
    6 FAIL <script> error: Move fetch-error external module script to iframe after-prepare assert_unreached: Script error evennt fired unexpectedly Reached unreachable code
     7PASS <script> error: Move fetch-error external module script to iframe after-prepare
    78PASS window error: Move fetch-error external module script to iframe after-prepare
    89
  • trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/after-prepare-iframe-parse-error-external-classic-expected.txt

    r267646 r280924  
    1 CONSOLE MESSAGE: SyntaxError: Left side of assignment is not a reference.
     1CONSOLE MESSAGE: Not executing script because it moved between documents during fetching
    22
    33
    44PASS Sanity check around top-level Window
    55PASS Eval: Move parse-error external classic script to iframe after-prepare
    6 FAIL <script> load: Move parse-error external classic script to iframe after-prepare assert_unreached: Script load event fired unexpectedly Reached unreachable code
     6PASS <script> load: Move parse-error external classic script to iframe after-prepare
    77PASS <script> error: Move parse-error external classic script to iframe after-prepare
    8 FAIL window error: Move parse-error external classic script to iframe after-prepare assert_unreached: Window error event shouldn't fired on destination window Reached unreachable code
     8PASS window error: Move parse-error external classic script to iframe after-prepare
    99
  • trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/after-prepare-iframe-parse-error-external-module-expected.txt

    r267646 r280924  
    1 CONSOLE MESSAGE: SyntaxError: Left side of assignment is not a reference.
     1CONSOLE MESSAGE: Not executing script because it moved between documents during fetching
    22
    33
     
    55PASS Eval: Move parse-error external module script to iframe after-prepare
    66PASS <script> load: Move parse-error external module script to iframe after-prepare
    7 FAIL <script> error: Move parse-error external module script to iframe after-prepare assert_unreached: Script error evennt fired unexpectedly Reached unreachable code
     7PASS <script> error: Move parse-error external module script to iframe after-prepare
    88PASS window error: Move parse-error external module script to iframe after-prepare
    99
  • trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/after-prepare-iframe-parse-error-inline-classic-expected.txt

    r267646 r280924  
    1 CONSOLE MESSAGE: SyntaxError: Left side of assignment is not a reference.
     1CONSOLE MESSAGE: Not executing script because it moved between documents during fetching
    22
    33
    44PASS Sanity check around top-level Window
    55PASS Eval: Move parse-error inline classic script to iframe after-prepare
    6 FAIL <script> load: Move parse-error inline classic script to iframe after-prepare assert_unreached: Script load event fired unexpectedly Reached unreachable code
     6PASS <script> load: Move parse-error inline classic script to iframe after-prepare
    77PASS <script> error: Move parse-error inline classic script to iframe after-prepare
    8 FAIL window error: Move parse-error inline classic script to iframe after-prepare assert_unreached: Window error event shouldn't fired on destination window Reached unreachable code
     8PASS window error: Move parse-error inline classic script to iframe after-prepare
    99
  • trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/after-prepare-iframe-success-external-classic-expected.txt

    r267646 r280924  
    1 CONSOLE MESSAGE: exec
     1CONSOLE MESSAGE: Not executing script because it moved between documents during fetching
    22
    33
    44PASS Sanity check around top-level Window
    5 FAIL Eval: Move success external classic script to iframe after-prepare assert_false: The script must not have executed in destination window expected false got "executed"
    6 FAIL <script> load: Move success external classic script to iframe after-prepare assert_unreached: Script load event fired unexpectedly Reached unreachable code
     5PASS Eval: Move success external classic script to iframe after-prepare
     6PASS <script> load: Move success external classic script to iframe after-prepare
    77PASS <script> error: Move success external classic script to iframe after-prepare
    88PASS window error: Move success external classic script to iframe after-prepare
  • trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/after-prepare-iframe-success-external-module-expected.txt

    r267646 r280924  
    1 CONSOLE MESSAGE: TypeError: Requested module is not instantiated yet.
     1CONSOLE MESSAGE: Not executing script because it moved between documents during fetching
    22
    33
    44PASS Sanity check around top-level Window
    55PASS Eval: Move success external module script to iframe after-prepare
    6 FAIL <script> load: Move success external module script to iframe after-prepare assert_unreached: Script load event fired unexpectedly Reached unreachable code
     6PASS <script> load: Move success external module script to iframe after-prepare
    77PASS <script> error: Move success external module script to iframe after-prepare
    8 FAIL window error: Move success external module script to iframe after-prepare assert_unreached: Window error event shouldn't fired on destination window Reached unreachable code
     8PASS window error: Move success external module script to iframe after-prepare
    99
  • trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/after-prepare-iframe-success-inline-classic-expected.txt

    r267646 r280924  
     1CONSOLE MESSAGE: Not executing script because it moved between documents during fetching
    12
    23
    34PASS Sanity check around top-level Window
    4 FAIL Eval: Move success inline classic script to iframe after-prepare assert_false: The script must not have executed in destination window expected false got "executed"
    5 FAIL <script> load: Move success inline classic script to iframe after-prepare assert_unreached: Script load event fired unexpectedly Reached unreachable code
     5PASS Eval: Move success inline classic script to iframe after-prepare
     6PASS <script> load: Move success inline classic script to iframe after-prepare
    67PASS <script> error: Move success inline classic script to iframe after-prepare
    78PASS window error: Move success inline classic script to iframe after-prepare
  • trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/move-back-iframe-fetch-error-external-classic-expected.txt

    r267646 r280924  
     1CONSOLE MESSAGE: Not executing script because it moved between documents during fetching
    12
    23
     
    45PASS Eval: Move fetch-error external classic script to iframe move-back
    56PASS <script> load: Move fetch-error external classic script to iframe move-back
    6 FAIL <script> error: Move fetch-error external classic script to iframe move-back assert_unreached: Script error evennt fired unexpectedly Reached unreachable code
     7PASS <script> error: Move fetch-error external classic script to iframe move-back
    78PASS window error: Move fetch-error external classic script to iframe move-back
    89
  • trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/move-back-iframe-fetch-error-external-module-expected.txt

    r267646 r280924  
     1CONSOLE MESSAGE: Not executing script because it moved between documents during fetching
    12
    23
     
    45PASS Eval: Move fetch-error external module script to iframe move-back
    56PASS <script> load: Move fetch-error external module script to iframe move-back
    6 FAIL <script> error: Move fetch-error external module script to iframe move-back assert_unreached: Script error evennt fired unexpectedly Reached unreachable code
     7PASS <script> error: Move fetch-error external module script to iframe move-back
    78PASS window error: Move fetch-error external module script to iframe move-back
    89
  • trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/move-back-iframe-parse-error-external-classic-expected.txt

    r267646 r280924  
    1 CONSOLE MESSAGE: SyntaxError: Left side of assignment is not a reference.
     1CONSOLE MESSAGE: Not executing script because it moved between documents during fetching
    22
    33
    44PASS Sanity check around top-level Window
    55PASS Eval: Move parse-error external classic script to iframe move-back
    6 FAIL <script> load: Move parse-error external classic script to iframe move-back assert_unreached: Script load event fired unexpectedly Reached unreachable code
     6PASS <script> load: Move parse-error external classic script to iframe move-back
    77PASS <script> error: Move parse-error external classic script to iframe move-back
    8 FAIL window error: Move parse-error external classic script to iframe move-back assert_unreached: Window error event shouldn't fired on source window Reached unreachable code
     8PASS window error: Move parse-error external classic script to iframe move-back
    99
  • trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/move-back-iframe-parse-error-external-module-expected.txt

    r267646 r280924  
    1 CONSOLE MESSAGE: SyntaxError: Left side of assignment is not a reference.
     1CONSOLE MESSAGE: Not executing script because it moved between documents during fetching
    22
    33
     
    55PASS Eval: Move parse-error external module script to iframe move-back
    66PASS <script> load: Move parse-error external module script to iframe move-back
    7 FAIL <script> error: Move parse-error external module script to iframe move-back assert_unreached: Script error evennt fired unexpectedly Reached unreachable code
     7PASS <script> error: Move parse-error external module script to iframe move-back
    88PASS window error: Move parse-error external module script to iframe move-back
    99
  • trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/move-back-iframe-parse-error-inline-classic-expected.txt

    r267646 r280924  
    1 CONSOLE MESSAGE: SyntaxError: Left side of assignment is not a reference.
     1CONSOLE MESSAGE: Not executing script because it moved between documents during fetching
    22
    33
    44PASS Sanity check around top-level Window
    55PASS Eval: Move parse-error inline classic script to iframe move-back
    6 FAIL <script> load: Move parse-error inline classic script to iframe move-back assert_unreached: Script load event fired unexpectedly Reached unreachable code
     6PASS <script> load: Move parse-error inline classic script to iframe move-back
    77PASS <script> error: Move parse-error inline classic script to iframe move-back
    8 FAIL window error: Move parse-error inline classic script to iframe move-back assert_unreached: Window error event shouldn't fired on source window Reached unreachable code
     8PASS window error: Move parse-error inline classic script to iframe move-back
    99
  • trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/move-back-iframe-success-external-classic-expected.txt

    r267646 r280924  
    1 CONSOLE MESSAGE: exec
     1CONSOLE MESSAGE: Not executing script because it moved between documents during fetching
    22
    33
    44PASS Sanity check around top-level Window
    5 FAIL Eval: Move success external classic script to iframe move-back assert_false: The script must not have executed in source window expected false got "executed"
    6 FAIL <script> load: Move success external classic script to iframe move-back assert_unreached: Script load event fired unexpectedly Reached unreachable code
     5PASS Eval: Move success external classic script to iframe move-back
     6PASS <script> load: Move success external classic script to iframe move-back
    77PASS <script> error: Move success external classic script to iframe move-back
    88PASS window error: Move success external classic script to iframe move-back
  • trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/move-back-iframe-success-external-module-expected.txt

    r267646 r280924  
    1 CONSOLE MESSAGE: TypeError: Requested module is not instantiated yet.
     1CONSOLE MESSAGE: Not executing script because it moved between documents during fetching
    22
    33
    44PASS Sanity check around top-level Window
    55PASS Eval: Move success external module script to iframe move-back
    6 FAIL <script> load: Move success external module script to iframe move-back assert_unreached: Script load event fired unexpectedly Reached unreachable code
     6PASS <script> load: Move success external module script to iframe move-back
    77PASS <script> error: Move success external module script to iframe move-back
    8 FAIL window error: Move success external module script to iframe move-back assert_unreached: Window error event shouldn't fired on source window Reached unreachable code
     8PASS window error: Move success external module script to iframe move-back
    99
  • trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/scripting-1/the-script-element/moving-between-documents/move-back-iframe-success-inline-classic-expected.txt

    r267646 r280924  
     1CONSOLE MESSAGE: Not executing script because it moved between documents during fetching
    12
    23
    34PASS Sanity check around top-level Window
    4 FAIL Eval: Move success inline classic script to iframe move-back assert_false: The script must not have executed in source window expected false got "executed"
    5 FAIL <script> load: Move success inline classic script to iframe move-back assert_unreached: Script load event fired unexpectedly Reached unreachable code
     5PASS Eval: Move success inline classic script to iframe move-back
     6PASS <script> load: Move success inline classic script to iframe move-back
    67PASS <script> error: Move success inline classic script to iframe move-back
    78PASS window error: Move success inline classic script to iframe move-back
  • trunk/Source/WebCore/ChangeLog

    r280920 r280924  
     12021-08-11  Chris Dumez  <cdumez@apple.com>
     2
     3        Stop evaluating <script>s moved between Documents during fetching
     4        https://bugs.webkit.org/show_bug.cgi?id=202714
     5        <rdar://problem/56208425>
     6
     7        Reviewed by Geoffrey Garen.
     8
     9        Stop evaluating <script>s moved between Documents during fetching:
     10        - https://github.com/whatwg/html/issues/2469
     11        - https://github.com/whatwg/html/pull/2673
     12
     13        Both Firefox and Chrome already behave this way.
     14
     15        No new tests, rebaselined existing tests.
     16
     17        * dom/ScriptElement.cpp:
     18        (WebCore::ScriptElement::prepareScript):
     19        Set the element's preparation-time document to its node document, as per:
     20        - https://html.spec.whatwg.org/multipage/scripting.html#prepare-a-script (step 11)
     21
     22        (WebCore::ScriptElement::executePendingScript):
     23        If scriptElement's preparation-time document is not equal to scriptElement's node document, then return, as per:
     24        - https://html.spec.whatwg.org/multipage/scripting.html#execute-the-script-block (step 2)
     25
     26        * dom/ScriptElement.h:
     27
    1282021-08-11  Youenn Fablet  <youenn@apple.com>
    229
  • trunk/Source/WebCore/dom/ScriptElement.cpp

    r278669 r280924  
    217217        return false;
    218218
     219    m_preparationTimeDocumentIdentifier = document.identifier();
     220
    219221    if (!document.frame()->script().canExecuteScripts(AboutToExecuteScript))
    220222        return false;
     
    452454void ScriptElement::executePendingScript(PendingScript& pendingScript)
    453455{
     456    if (m_element.document().identifier() != m_preparationTimeDocumentIdentifier) {
     457        m_element.document().addConsoleMessage(MessageSource::Security, MessageLevel::Error, "Not executing script because it moved between documents during fetching"_s);
     458        return;
     459    }
     460
    454461    if (auto* loadableScript = pendingScript.loadableScript())
    455462        executeScriptAndDispatchEvent(*loadableScript);
  • trunk/Source/WebCore/dom/ScriptElement.h

    r278253 r280924  
    2323
    2424#include "ContainerNode.h"
     25#include "DocumentIdentifier.h"
    2526#include "LoadableScript.h"
    2627#include "ReferrerPolicy.h"
     
    137138    RefPtr<LoadableScript> m_loadableScript;
    138139
     140    // https://html.spec.whatwg.org/multipage/scripting.html#preparation-time-document
     141    DocumentIdentifier m_preparationTimeDocumentIdentifier;
     142
    139143    MonotonicTime m_creationTime;
    140144    RefPtr<UserGestureToken> m_userGestureToken;
Note: See TracChangeset for help on using the changeset viewer.