Bug 592656 part 1 - Use the current parser-inserted script as the insertion point key. r=jonas, a=blocking2.0-final.

--HG--
extra : rebase_source : 92320d48b27c984e25c72be6dafbaef9d6133038
This commit is contained in:
Henri Sivonen 2010-09-06 10:41:26 +03:00
Родитель 28c0811c89
Коммит 01fa16e8c5
6 изменённых файлов: 55 добавлений и 7 удалений

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

@ -729,6 +729,8 @@ nsScriptLoader::ProcessRequest(nsScriptLoadRequest* aRequest)
nsCOMPtr<nsIDocument> doc;
nsCOMPtr<nsINode> scriptElem = do_QueryInterface(aRequest->mElement);
// If there's no script text, we try to get it from the element
if (aRequest->mIsInline) {
// XXX This is inefficient - GetText makes multiple
@ -740,14 +742,18 @@ nsScriptLoader::ProcessRequest(nsScriptLoadRequest* aRequest)
else {
script = &aRequest->mScriptText;
nsCOMPtr<nsIContent> eltAsContent = do_QueryInterface(aRequest->mElement);
NS_ASSERTION(eltAsContent, "Script should QI to nsIContent.");
doc = eltAsContent->GetOwnerDoc();
doc = scriptElem->GetOwnerDoc();
}
nsCOMPtr<nsIScriptElement> oldParserInsertedScript;
PRUint32 parserCreated = aRequest->mElement->GetParserCreated();
if (parserCreated) {
oldParserInsertedScript = mCurrentParserInsertedScript;
mCurrentParserInsertedScript = aRequest->mElement;
}
FireScriptAvailable(NS_OK, aRequest);
nsCOMPtr<nsINode> scriptElem = do_QueryInterface(aRequest->mElement);
PRBool runScript = PR_TRUE;
nsContentUtils::DispatchTrustedEvent(scriptElem->GetOwnerDoc(),
scriptElem,
@ -756,15 +762,15 @@ nsScriptLoader::ProcessRequest(nsScriptLoadRequest* aRequest)
nsresult rv = NS_OK;
if (runScript) {
aRequest->mElement->BeginEvaluating();
if (doc) {
doc->BeginEvaluatingExternalScript();
}
aRequest->mElement->BeginEvaluating();
rv = EvaluateScript(aRequest, *script);
aRequest->mElement->EndEvaluating();
if (doc) {
doc->EndEvaluatingExternalScript();
}
aRequest->mElement->EndEvaluating();
nsContentUtils::DispatchTrustedEvent(scriptElem->GetOwnerDoc(),
scriptElem,
@ -774,6 +780,10 @@ nsScriptLoader::ProcessRequest(nsScriptLoadRequest* aRequest)
FireScriptEvaluated(rv, aRequest);
if (parserCreated) {
mCurrentParserInsertedScript = oldParserInsertedScript;
}
return rv;
}

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

@ -126,6 +126,11 @@ public:
return mCurrentScript;
}
nsIScriptElement* GetCurrentParserInsertedScript()
{
return mCurrentParserInsertedScript;
}
/**
* Whether the loader is enabled or not.
* When disabled, processing of new script elements is disabled.
@ -322,6 +327,7 @@ private:
nsTArray<PreloadInfo> mPreloads;
nsCOMPtr<nsIScriptElement> mCurrentScript;
nsCOMPtr<nsIScriptElement> mCurrentParserInsertedScript;
// XXXbz do we want to cycle-collect these or something? Not sure.
nsTArray< nsRefPtr<nsScriptLoader> > mPendingChildLoaders;
PRUint32 mBlockerCount;

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

@ -2890,7 +2890,7 @@ nsHTMLDocument::GenerateParserKey(void)
// The script loader provides us with the currently executing script element,
// which is guaranteed to be unique per script.
if (nsHtml5Module::sEnabled) {
nsIScriptElement* script = mScriptLoader->GetCurrentScript();
nsIScriptElement* script = mScriptLoader->GetCurrentParserInsertedScript();
if (script && mParser && mParser->IsScriptCreated()) {
nsCOMPtr<nsIParser> creatorParser = script->GetCreatorParser();
if (creatorParser != mParser) {

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

@ -0,0 +1,9 @@
<!DOCTYPE html>
<html>
<head>
<title>document.write() from script-inserted inline scripts and script@onload</title>
</head>
<body>
1 2 3 4 5 6 7 8 13 14 15
</body>
</html>

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

@ -0,0 +1,22 @@
<!DOCTYPE html>
<html>
<head>
<title>document.write() from script-inserted inline scripts and script@onload</title>
</head>
<body>
1
<script>
function write(num) {
document.write(num + " ");
}
write(2);
document.write("\u003Cscript src='data:text/javascript,write(3)'>\u003C/script> 4 \u003Cscript>write(5)\u003C/script>");
var s = document.createElement("script");
s.textContent = "write(6)";
document.body.appendChild(s);
write(7);
document.write("\u003Cscript src='data:text/javascript,write(8)' onload='scriptload()'>\u003C/script> 13 \u003Cscript>write(14)\u003C/script>");
write(15);
</script>
</body>
</html>

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

@ -2,3 +2,4 @@
== bug577418-1.html bug577418-1-ref.html
== bug582788-1.html bug582788-1-ref.html
== bug582940-1.html bug582940-1-ref.html
== bug592656-1.html bug592656-1-ref.html