Bug 524447 - Make the HTML5 parser tokenize on document.close(). (Spec svn r4241.) r=bnewman.

--HG--
extra : rebase_source : 5c67523de012c36e4327a37e3b1b29b43b745f0d
This commit is contained in:
Henri Sivonen 2009-10-27 09:44:17 +02:00
Родитель a712081a1d
Коммит d1c2785f51
3 изменённых файлов: 20 добавлений и 12 удалений

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

@ -211,7 +211,7 @@ nsHtml5Parser::ContinueInterruptedParsing()
nsRefPtr<nsHtml5StreamParser> streamKungFuDeathGrip(mStreamParser);
nsRefPtr<nsHtml5TreeOpExecutor> treeOpKungFuDeathGrip(mExecutor);
CancelParsingEvents(); // If the executor caused us to continue, ignore event
ParseUntilScript();
ParseUntilBlocked();
return NS_OK;
}
@ -301,8 +301,9 @@ nsHtml5Parser::Parse(const nsAString& aSourceBuffer,
NS_ASSERTION(!mStreamParser,
"Had stream parser but got document.close().");
mDocumentClosed = PR_TRUE;
// TODO: Try to tokenize: http://www.w3.org/Bugs/Public/show_bug.cgi?id=7917
MaybePostContinueEvent();
if (!mBlocked) {
ParseUntilBlocked();
}
return NS_OK;
}
@ -576,9 +577,9 @@ nsHtml5Parser::HandleParserContinueEvent(nsHtml5ParserContinueEvent* ev)
}
void
nsHtml5Parser::ParseUntilScript()
nsHtml5Parser::ParseUntilBlocked()
{
NS_PRECONDITION(!mFragmentMode, "ParseUntilScript called in fragment mode.");
NS_PRECONDITION(!mFragmentMode, "ParseUntilBlocked called in fragment mode.");
if (mBlocked) {
return;

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

@ -323,9 +323,9 @@ class nsHtml5Parser : public nsIParser,
private:
/**
* Parse until pending data is exhausted or a script end tag is seen
* Parse until pending data is exhausted or a script blocks the parser
*/
void ParseUntilScript();
void ParseUntilBlocked();
// State variables

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

@ -356,12 +356,19 @@ nsHtml5TreeOpExecutor::Flush()
// The charset switch was unsuccessful.
return (static_cast<nsHtml5Parser*> (mParser.get()))->ContinueAfterFailedCharsetSwitch();
}
} else if (mScriptElement) {
NS_ASSERTION(!mCallDidBuildModel, "Had a script element and DidBuildModel call");
RunScript();
} else if (mCallDidBuildModel) {
mCallDidBuildModel = PR_FALSE;
// If we have a script element here, it must be malformed
#ifdef DEBUG
nsCOMPtr<nsIScriptElement> sele = do_QueryInterface(mScriptElement);
if (sele) {
NS_ASSERTION(sele->IsMalformed(), "Script wasn't marked as malformed.");
}
#endif
mScriptElement = nsnull;
DidBuildModel(PR_FALSE);
} else if (mScriptElement) {
RunScript();
}
}