fix bug 371026 - reftest: double setTimeout from onload is not late enough for some tests

the fix is to provide a way for the testcase to indicate when it's finished loading.

Also move the reftest self-checks into their own manifest.

r=dbaron
This commit is contained in:
asqueella%gmail.com 2007-03-07 19:50:02 +00:00
Родитель dbfd44d4e3
Коммит be0b28d6a2
8 изменённых файлов: 91 добавлений и 10 удалений

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

@ -0,0 +1,7 @@
== data:text/html,<body> about:blank
== data:text/plain, about:blank
!= data:text/plain,HELLO about:blank
# these tests make sure async reftests work:
== test-async.xul test-async-ref.xul
== test-async.html test-async-ref.html

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

@ -0,0 +1,2 @@
<html>
<body style="background-color: green;">

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

@ -0,0 +1,3 @@
<?xml version="1.0"?>
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
style="background-color: green"/>

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

@ -0,0 +1,12 @@
<html class="reftest-wait">
<body style="background-color: red;"
onload="HandleLoad()">
<script>
function HandleLoad() {
setTimeout(function() {
document.body.style.backgroundColor = "green";
document.documentElement.className = "";
}, 100);
}
</script>
</body>

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

@ -0,0 +1,15 @@
<?xml version="1.0"?>
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
id="main"
class="reftest-wait"
style="background-color: red;"
onload="HandleLoad()">
<script>
function HandleLoad() {
setTimeout(function() {
document.documentElement.style.backgroundColor = "green";
document.documentElement.className = "";
}, 100);
}
</script>
</window>

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

@ -3,9 +3,7 @@
# failing test.
# verify the tests work
== data:text/html,<body> about:blank
== data:text/plain, about:blank
!= data:text/plain,HELLO about:blank
include reftest-sanity/reftest.list
# bugs/
include bugs/reftest.list

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

@ -146,7 +146,7 @@ avoided.
In general, the best way to achieve this is to make the test and the
reference identical in as many aspects as possible. For example:
Good test Markup:
Good test markup:
<div style="color:green"><table><tr><td><span>green
</span></td></tr></table></div>
@ -163,3 +163,24 @@ reference identical in as many aspects as possible. For example:
<!-- span doesn't change the positioning, so skip it -->
<div style="color:green"><table><tr><td>green
</td></tr></table></div>
Asynchronous Tests
==================
Normally reftest takes a snapshot of the given markup's rendering right
after the load event fires for content. If your test needs to postpone
the moment the snapshot is taken, it should make sure a class
'reftest-wait' is on the root element by the moment the load event
fires. The easiest way to do this is to put it in the markup, e.g.:
<html class="reftest-wait">
When your test is ready, you should remove this class from the root
element, for example using this code:
document.documentElement.className = "";
Note that in layout tests it is often enough to trigger layout using
document.body.offsetWidth // HTML example
When possible, you should use this technique instead of making your
test async.

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

@ -203,16 +203,39 @@ function OnDocumentLoad(event)
// Ignore load events for subframes.
return;
clearTimeout(gFailureTimeout);
// Since we can't use a bubbling-phase load listener from chrome,
// this is a capturing phase listener. So do setTimeout twice, the
// first to get us after the onload has fired in the content, and
// the second to get us after any setTimeout(foo, 0) in the content.
setTimeout(setTimeout, 0, DocumentLoaded, 0);
function shouldWait() {
return contentRootElement.className.split(/\s+/)
.indexOf("reftest-wait") != -1;
}
var contentRootElement = gBrowser.contentDocument.documentElement;
if (shouldWait()) {
// The testcase will let us know when the test snapshot should be made.
// Register a mutation listener to know when the 'reftest-wait' class
// gets removed.
contentRootElement.addEventListener(
"DOMAttrModified",
function(event) {
if (!shouldWait()) {
contentRootElement.removeEventListener(
"DOMAttrModified",
arguments.callee,
false);
setTimeout(DocumentLoaded, 0);
}
}, false);
} else {
// Since we can't use a bubbling-phase load listener from chrome,
// this is a capturing phase listener. So do setTimeout twice, the
// first to get us after the onload has fired in the content, and
// the second to get us after any setTimeout(foo, 0) in the content.
setTimeout(setTimeout, 0, DocumentLoaded, 0);
}
}
function DocumentLoaded()
{
clearTimeout(gFailureTimeout);
var key = IFrameToKey();
switch (gState) {
case 1: