Commit d7e3ad72 authored by Adam Vandolder's avatar Adam Vandolder
Browse files

Bug 1632975 - Run microtask checkpoint before processing script. r=smaug

parent f4b3c97a
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -263,6 +263,7 @@ skip-if = headless # Bug 1405867
[test_base.xhtml]
[test_bug1433073.html]
skip-if = (os == "android" || headless) # See
[test_bug1632975.html]
[test_bug1730284.html]
# https://bugzilla.mozilla.org/show_bug.cgi?id=1632196 and
# https://bugzilla.mozilla.org/show_bug.cgi?id=1632438.
+55 −0
Original line number Diff line number Diff line
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=1632975
-->
<head>
  <title>Test for Bug 1632975</title>
  <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<script class="testbody" type="text/javascript">
SimpleTest.waitForExplicitFinish();

function observeTest(mutationsList) {
  for (let mutation of mutationsList) {
    for (let node of mutation.addedNodes) {
      if (node.nodeName.toLowerCase() == "script") {
        node.setAttribute("type", "text/zpconsent")
      }
    }
  }
}

const observer = new MutationObserver(observeTest);
observer.observe(document.body, { childList: true, subtree: true });

let script2Ran = false;
let script3Ran = false;
script4Ran = false;

onload = () => {
  ok(!script2Ran, "script2 should not have run");
  ok(!script3Ran, "script3 should not have run");
  ok(!script4Ran, "script4 should not have run");
  SimpleTest.finish();
}
</script>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1632975">Mozilla Bug 1632975</a>
<p id="display"></p>
<div id="content" style="display: none">
  <script id="script2">
    script2Ran = true;
  </script>

  <script id="script3" type="disabled">
    script3Ran = true;
  </script>

  <script id="script4" src="data:text/javascript,script4Ran = true;"></script>
</div>
</body>
</html>
+4 −6
Original line number Diff line number Diff line
@@ -99,14 +99,12 @@ bool ScriptElement::MaybeProcessScript() {
    return false;
  }

  if (!HasScriptContent()) {
    // In the case of an empty, non-external classic script, there is nothing
    // to process. However, we must perform a microtask checkpoint afterwards,
    // as per https://html.spec.whatwg.org/#clean-up-after-running-script
    if (mKind == JS::loader::ScriptKind::eClassic && !mExternal) {
  nsContentUtils::AddScriptRunner(NS_NewRunnableFunction(
      "ScriptElement::MaybeProcessScript", []() { nsAutoMicroTask mt; }));
    }
  if (!HasScriptContent()) {
    // In the case of an empty, non-external classic script, we return early;
    // however, we must do so after performing a microtask checkpoint,
    // as per https://html.spec.whatwg.org/#clean-up-after-running-script
    return false;
  }

+0 −7
Original line number Diff line number Diff line
@@ -1186,13 +1186,6 @@ bool ScriptLoader::ProcessInlineScript(nsIScriptElement* aElement,
      }
    }

    {
      // We must perform a microtask checkpoint when inserting script elements
      // as specified by: https://html.spec.whatwg.org/#parsing-main-incdata
      // For the non-inline module cases this happens in ProcessRequest.
      mozilla::nsAutoMicroTask mt;
    }

    // This calls OnFetchComplete directly since there's no need to start
    // fetching an inline script.
    nsresult rv = modReq->OnFetchComplete(NS_OK);