Bug 1854907 - Make document.write-related operations on the creator parser no-ops on scripts whose type does not allow document.write. r=smaug

Differential Revision: https://phabricator.services.mozilla.com/D189110
This commit is contained in:
Henri Sivonen 2023-09-28 12:21:39 +00:00
Родитель d5b122ab45
Коммит b936fb1c03
4 изменённых файлов: 250 добавлений и 0 удалений

Просмотреть файл

@ -7,6 +7,7 @@
#include "nsIScriptElement.h"
#include "js/loader/ScriptKind.h"
#include "mozilla/dom/Document.h"
#include "mozilla/dom/ReferrerPolicyBinding.h"
#include "nsIParser.h"
@ -14,11 +15,21 @@
using JS::loader::ScriptKind;
bool nsIScriptElement::IsClassicNonAsyncDefer() {
return mKind == ScriptKind::eClassic && !mAsync && !mDefer;
}
void nsIScriptElement::SetCreatorParser(nsIParser* aParser) {
mCreatorParser = do_GetWeakReference(aParser);
}
void nsIScriptElement::UnblockParser() {
if (!IsClassicNonAsyncDefer()) {
MOZ_ASSERT_UNREACHABLE(
"Tried to unblock parser for a script type that cannot block "
"the parser.");
return;
}
nsCOMPtr<nsIParser> parser = do_QueryReferent(mCreatorParser);
if (parser) {
parser->UnblockParser();
@ -26,6 +37,11 @@ void nsIScriptElement::UnblockParser() {
}
void nsIScriptElement::ContinueParserAsync() {
if (!IsClassicNonAsyncDefer()) {
MOZ_ASSERT_UNREACHABLE(
"Tried to continue after a script type that cannot block the parser.");
return;
}
nsCOMPtr<nsIParser> parser = do_QueryReferent(mCreatorParser);
if (parser) {
parser->ContinueInterruptedParsingAsync();
@ -33,6 +49,9 @@ void nsIScriptElement::ContinueParserAsync() {
}
void nsIScriptElement::BeginEvaluating() {
if (!IsClassicNonAsyncDefer()) {
return;
}
nsCOMPtr<nsIParser> parser = do_QueryReferent(mCreatorParser);
if (parser) {
parser->IncrementScriptNestingLevel();
@ -40,6 +59,9 @@ void nsIScriptElement::BeginEvaluating() {
}
void nsIScriptElement::EndEvaluating() {
if (!IsClassicNonAsyncDefer()) {
return;
}
nsCOMPtr<nsIParser> parser = do_QueryReferent(mCreatorParser);
if (parser) {
parser->DecrementScriptNestingLevel();

Просмотреть файл

@ -289,6 +289,8 @@ class nsIScriptElement : public nsIScriptLoaderObserver {
*/
void DetermineKindFromType(const mozilla::dom::Document* aOwnerDoc);
bool IsClassicNonAsyncDefer();
/**
* The start line number of the script.
*/

Просмотреть файл

@ -0,0 +1,225 @@
<!DOCTYPE html>
<meta charset="utf-8">
<script async src="data:text/javascript,document.write(1);"></script>
<script></script>
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a

Просмотреть файл

@ -65,3 +65,4 @@ load 1606499-1.html
load 1547895-1.html
skip-if(Android) skip-if(isDebugBuild) load 1747514.html # Bug 1780219
HTTP load 1810896-1.html
load 1854907-1.html