зеркало из https://github.com/mozilla/gecko-dev.git
Bug 789856. Fire error events on <script> elements which completely fail to start the load. r=sicking
This commit is contained in:
Родитель
90c9f1e64d
Коммит
33d0bdd5f7
|
@ -17,8 +17,8 @@
|
||||||
#include "mozilla/CORSMode.h"
|
#include "mozilla/CORSMode.h"
|
||||||
|
|
||||||
#define NS_ISCRIPTELEMENT_IID \
|
#define NS_ISCRIPTELEMENT_IID \
|
||||||
{ 0x24ab3ff2, 0xd75e, 0x4be4, \
|
{ 0x491628bc, 0xce7c, 0x4db4, \
|
||||||
{ 0x8d, 0x50, 0xd6, 0x75, 0x31, 0x29, 0xab, 0x65 } }
|
{ 0x93, 0x3f, 0xce, 0x1b, 0x75, 0xee, 0x75, 0xce } }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Internal interface implemented by script elements
|
* Internal interface implemented by script elements
|
||||||
|
@ -235,6 +235,11 @@ public:
|
||||||
return mozilla::CORS_NONE;
|
return mozilla::CORS_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fire an error event
|
||||||
|
*/
|
||||||
|
virtual nsresult FireErrorEvent() = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
* Processes the script if it's in the document-tree and links to or
|
* Processes the script if it's in the document-tree and links to or
|
||||||
|
|
|
@ -25,19 +25,24 @@ nsScriptElement::ScriptAvailable(nsresult aResult,
|
||||||
int32_t aLineNo)
|
int32_t aLineNo)
|
||||||
{
|
{
|
||||||
if (!aIsInline && NS_FAILED(aResult)) {
|
if (!aIsInline && NS_FAILED(aResult)) {
|
||||||
nsCOMPtr<nsIContent> cont =
|
return FireErrorEvent();
|
||||||
do_QueryInterface((nsIScriptElement*) this);
|
|
||||||
|
|
||||||
return nsContentUtils::DispatchTrustedEvent(cont->OwnerDoc(),
|
|
||||||
cont,
|
|
||||||
NS_LITERAL_STRING("error"),
|
|
||||||
false /* bubbles */,
|
|
||||||
false /* cancelable */);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* virtual */ nsresult
|
||||||
|
nsScriptElement::FireErrorEvent()
|
||||||
|
{
|
||||||
|
nsCOMPtr<nsIContent> cont =
|
||||||
|
do_QueryInterface((nsIScriptElement*) this);
|
||||||
|
|
||||||
|
return nsContentUtils::DispatchTrustedEvent(cont->OwnerDoc(),
|
||||||
|
cont,
|
||||||
|
NS_LITERAL_STRING("error"),
|
||||||
|
false /* bubbles */,
|
||||||
|
false /* cancelable */);
|
||||||
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsScriptElement::ScriptEvaluated(nsresult aResult,
|
nsScriptElement::ScriptEvaluated(nsresult aResult,
|
||||||
nsIScriptElement *aElement,
|
nsIScriptElement *aElement,
|
||||||
|
|
|
@ -31,6 +31,8 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual nsresult FireErrorEvent();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Internal methods
|
// Internal methods
|
||||||
|
|
||||||
|
|
|
@ -482,6 +482,10 @@ nsScriptLoader::ProcessScriptElement(nsIScriptElement *aElement)
|
||||||
// external script
|
// external script
|
||||||
nsCOMPtr<nsIURI> scriptURI = aElement->GetScriptURI();
|
nsCOMPtr<nsIURI> scriptURI = aElement->GetScriptURI();
|
||||||
if (!scriptURI) {
|
if (!scriptURI) {
|
||||||
|
// Asynchronously report the failure to create a URI object
|
||||||
|
NS_DispatchToCurrentThread(
|
||||||
|
NS_NewRunnableMethod(aElement,
|
||||||
|
&nsIScriptElement::FireErrorEvent));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
CORSMode ourCORSMode = aElement->GetCORSMode();
|
CORSMode ourCORSMode = aElement->GetCORSMode();
|
||||||
|
@ -516,7 +520,13 @@ nsScriptLoader::ProcessScriptElement(nsIScriptElement *aElement)
|
||||||
request->mIsInline = false;
|
request->mIsInline = false;
|
||||||
request->mLoading = true;
|
request->mLoading = true;
|
||||||
rv = StartLoad(request, type);
|
rv = StartLoad(request, type);
|
||||||
NS_ENSURE_SUCCESS(rv, false);
|
if (NS_FAILED(rv)) {
|
||||||
|
// Asynchronously report the load failure
|
||||||
|
NS_DispatchToCurrentThread(
|
||||||
|
NS_NewRunnableMethod(aElement,
|
||||||
|
&nsIScriptElement::FireErrorEvent));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
request->mJSVersion = version;
|
request->mJSVersion = version;
|
||||||
|
|
|
@ -560,6 +560,7 @@ MOCHITEST_FILES_B = \
|
||||||
test_mixed_content_blocker.html \
|
test_mixed_content_blocker.html \
|
||||||
file_mixed_content_main.html \
|
file_mixed_content_main.html \
|
||||||
file_mixed_content_server.sjs \
|
file_mixed_content_server.sjs \
|
||||||
|
test_bug789856.html \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
MOCHITEST_CHROME_FILES = \
|
MOCHITEST_CHROME_FILES = \
|
||||||
|
|
|
@ -16,23 +16,35 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=606729
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<pre id="test">
|
<pre id="test">
|
||||||
|
<script>
|
||||||
|
SimpleTest.waitForExplicitFinish();
|
||||||
|
var events = 0;
|
||||||
|
var expectedEvents = 2;
|
||||||
|
function eventFired() {
|
||||||
|
++events;
|
||||||
|
if (events == expectedEvents) {
|
||||||
|
SimpleTest.finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
<script
|
<script
|
||||||
src="data:"
|
src="data:"
|
||||||
onerror="ok(false, 'Script with src=data: should not fire onerror.');"
|
onerror="ok(true, 'Script with src=data: should fire onerror.');
|
||||||
onload="ok(false, 'Script with src=data: should not fire onload.');"
|
eventFired();"
|
||||||
|
onload="ok(false, 'Script with src=data: should not fire onload.');
|
||||||
|
eventFired();"
|
||||||
>
|
>
|
||||||
ok(false, "Script with src=data: should not run textContent.");
|
ok(false, "Script with src=data: should not run textContent.");
|
||||||
</script>
|
</script>
|
||||||
<script
|
<script
|
||||||
src="bogus:"
|
src="bogus:"
|
||||||
onerror="ok(false, 'Script with src=bogus: should not fire onerror.');"
|
onerror="ok(true, 'Script with src=bogus: should fire onerror.');
|
||||||
onload="ok(false, 'Script with src=bogus: should not fire onload.');"
|
eventFired();"
|
||||||
|
onload="ok(false, 'Script with src=bogus: should not fire onload.');
|
||||||
|
eventFired();"
|
||||||
>
|
>
|
||||||
ok(false, "Script with src=bogus: should not run textContent.");
|
ok(false, "Script with src=bogus: should not run textContent.");
|
||||||
</script>
|
</script>
|
||||||
<script class="testbody" type="text/javascript">
|
|
||||||
ok(true, "Obligatory succeeding test assertion.");
|
|
||||||
</script>
|
|
||||||
</pre>
|
</pre>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<!--
|
||||||
|
https://bugzilla.mozilla.org/show_bug.cgi?id=789856
|
||||||
|
-->
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Test for Bug 789856</title>
|
||||||
|
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=789856">Mozilla Bug 789856</a>
|
||||||
|
<p id="display"></p>
|
||||||
|
<div id="content" style="display: none">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<pre id="test">
|
||||||
|
<script type="application/javascript">
|
||||||
|
|
||||||
|
/** Test for Bug 789856 **/
|
||||||
|
SimpleTest.waitForExplicitFinish();
|
||||||
|
|
||||||
|
var script = document.createElement("script");
|
||||||
|
script.onload = function() {
|
||||||
|
ok(false, "This script should not load");
|
||||||
|
SimpleTest.finish();
|
||||||
|
}
|
||||||
|
script.onerror = function() {
|
||||||
|
ok(true, "This script should fail to load");
|
||||||
|
SimpleTest.finish();
|
||||||
|
}
|
||||||
|
// If neither one fires, the test fails, as it should
|
||||||
|
|
||||||
|
// Use a URL the test is not allowed to load
|
||||||
|
script.src = "file:///tmp/"
|
||||||
|
document.body.appendChild(script);
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</pre>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -39,7 +39,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=371375
|
||||||
SimpleTest.waitForExplicitFinish();
|
SimpleTest.waitForExplicitFinish();
|
||||||
addLoadEvent(function() {
|
addLoadEvent(function() {
|
||||||
is(load1Called, false, "Load handler should not be called");
|
is(load1Called, false, "Load handler should not be called");
|
||||||
is(error1Called, false, "Error handler should not be called");
|
is(error1Called, true, "Error handler should be called");
|
||||||
is(load2Called, true, "Load handler for valid script should be called");
|
is(load2Called, true, "Load handler for valid script should be called");
|
||||||
is(error2Called, false,
|
is(error2Called, false,
|
||||||
"Error handler for valid script should not be called");
|
"Error handler for valid script should not be called");
|
||||||
|
|
Загрузка…
Ссылка в новой задаче