зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
d5b122ab45
Коммит
b936fb1c03
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче