163796d97248956b9c06a7889b007b34bc8b486f4Steve Blockif (window.layoutTestController)
263796d97248956b9c06a7889b007b34bc8b486f4Steve Block    layoutTestController.dumpAsText();
363796d97248956b9c06a7889b007b34bc8b486f4Steve Block
463796d97248956b9c06a7889b007b34bc8b486f4Steve Blockfunction description(msg)
563796d97248956b9c06a7889b007b34bc8b486f4Steve Block{
663796d97248956b9c06a7889b007b34bc8b486f4Steve Block    // For MSIE 6 compatibility
763796d97248956b9c06a7889b007b34bc8b486f4Steve Block    var span = document.createElement("span");
863796d97248956b9c06a7889b007b34bc8b486f4Steve Block    span.innerHTML = '<p>' + msg + '</p><p>On success, you will see a series of "<span class="pass">PASS</span>" messages, followed by "<span class="pass">TEST COMPLETE</span>".</p>';
963796d97248956b9c06a7889b007b34bc8b486f4Steve Block    var description = document.getElementById("description");
1063796d97248956b9c06a7889b007b34bc8b486f4Steve Block    if (description.firstChild)
1163796d97248956b9c06a7889b007b34bc8b486f4Steve Block        description.replaceChild(span, description.firstChild);
1263796d97248956b9c06a7889b007b34bc8b486f4Steve Block    else
1363796d97248956b9c06a7889b007b34bc8b486f4Steve Block        description.appendChild(span);
1463796d97248956b9c06a7889b007b34bc8b486f4Steve Block}
1563796d97248956b9c06a7889b007b34bc8b486f4Steve Block
1663796d97248956b9c06a7889b007b34bc8b486f4Steve Blockfunction debug(msg)
1763796d97248956b9c06a7889b007b34bc8b486f4Steve Block{
1863796d97248956b9c06a7889b007b34bc8b486f4Steve Block    var span = document.createElement("span");
1963796d97248956b9c06a7889b007b34bc8b486f4Steve Block    document.getElementById("console").appendChild(span); // insert it first so XHTML knows the namespace
2063796d97248956b9c06a7889b007b34bc8b486f4Steve Block    span.innerHTML = msg + '<br />';
2163796d97248956b9c06a7889b007b34bc8b486f4Steve Block}
2263796d97248956b9c06a7889b007b34bc8b486f4Steve Block
2363796d97248956b9c06a7889b007b34bc8b486f4Steve Blockfunction escapeHTML(text)
2463796d97248956b9c06a7889b007b34bc8b486f4Steve Block{
2563796d97248956b9c06a7889b007b34bc8b486f4Steve Block    return text.replace(/&/g, "&amp;").replace(/</g, "&lt;");
2663796d97248956b9c06a7889b007b34bc8b486f4Steve Block}
2763796d97248956b9c06a7889b007b34bc8b486f4Steve Block
2863796d97248956b9c06a7889b007b34bc8b486f4Steve Blockfunction testPassed(msg)
2963796d97248956b9c06a7889b007b34bc8b486f4Steve Block{
3063796d97248956b9c06a7889b007b34bc8b486f4Steve Block    debug('<span><span class="pass">PASS</span> ' + escapeHTML(msg) + '</span>');
3163796d97248956b9c06a7889b007b34bc8b486f4Steve Block}
3263796d97248956b9c06a7889b007b34bc8b486f4Steve Block
3363796d97248956b9c06a7889b007b34bc8b486f4Steve Blockfunction testFailed(msg)
3463796d97248956b9c06a7889b007b34bc8b486f4Steve Block{
3563796d97248956b9c06a7889b007b34bc8b486f4Steve Block    debug('<span><span class="fail">FAIL</span> ' + escapeHTML(msg) + '</span>');
3663796d97248956b9c06a7889b007b34bc8b486f4Steve Block}
3763796d97248956b9c06a7889b007b34bc8b486f4Steve Block
3863796d97248956b9c06a7889b007b34bc8b486f4Steve Blockfunction areArraysEqual(_a, _b)
3963796d97248956b9c06a7889b007b34bc8b486f4Steve Block{
4063796d97248956b9c06a7889b007b34bc8b486f4Steve Block    if (_a.length !== _b.length)
4163796d97248956b9c06a7889b007b34bc8b486f4Steve Block        return false;
4263796d97248956b9c06a7889b007b34bc8b486f4Steve Block    for (var i = 0; i < _a.length; i++)
4363796d97248956b9c06a7889b007b34bc8b486f4Steve Block        if (_a[i] !== _b[i])
4463796d97248956b9c06a7889b007b34bc8b486f4Steve Block            return false;
4563796d97248956b9c06a7889b007b34bc8b486f4Steve Block    return true;
4663796d97248956b9c06a7889b007b34bc8b486f4Steve Block}
4763796d97248956b9c06a7889b007b34bc8b486f4Steve Block
4863796d97248956b9c06a7889b007b34bc8b486f4Steve Blockfunction isMinusZero(n)
4963796d97248956b9c06a7889b007b34bc8b486f4Steve Block{
5063796d97248956b9c06a7889b007b34bc8b486f4Steve Block    // the only way to tell 0 from -0 in JS is the fact that 1/-0 is
5163796d97248956b9c06a7889b007b34bc8b486f4Steve Block    // -Infinity instead of Infinity
5263796d97248956b9c06a7889b007b34bc8b486f4Steve Block    return n === 0 && 1/n < 0;
5363796d97248956b9c06a7889b007b34bc8b486f4Steve Block}
5463796d97248956b9c06a7889b007b34bc8b486f4Steve Block
5563796d97248956b9c06a7889b007b34bc8b486f4Steve Blockfunction isResultCorrect(_actual, _expected)
5663796d97248956b9c06a7889b007b34bc8b486f4Steve Block{
5763796d97248956b9c06a7889b007b34bc8b486f4Steve Block    if (_expected === 0)
5863796d97248956b9c06a7889b007b34bc8b486f4Steve Block        return _actual === _expected && (1/_actual) === (1/_expected);
5963796d97248956b9c06a7889b007b34bc8b486f4Steve Block    if (_actual === _expected)
6063796d97248956b9c06a7889b007b34bc8b486f4Steve Block        return true;
6163796d97248956b9c06a7889b007b34bc8b486f4Steve Block    if (typeof(_expected) == "number" && isNaN(_expected))
6263796d97248956b9c06a7889b007b34bc8b486f4Steve Block        return typeof(_actual) == "number" && isNaN(_actual);
6363796d97248956b9c06a7889b007b34bc8b486f4Steve Block    if (Object.prototype.toString.call(_expected) == Object.prototype.toString.call([]))
6463796d97248956b9c06a7889b007b34bc8b486f4Steve Block        return areArraysEqual(_actual, _expected);
6563796d97248956b9c06a7889b007b34bc8b486f4Steve Block    return false;
6663796d97248956b9c06a7889b007b34bc8b486f4Steve Block}
6763796d97248956b9c06a7889b007b34bc8b486f4Steve Block
6863796d97248956b9c06a7889b007b34bc8b486f4Steve Blockfunction stringify(v)
6963796d97248956b9c06a7889b007b34bc8b486f4Steve Block{
7063796d97248956b9c06a7889b007b34bc8b486f4Steve Block    if (v === 0 && 1/v < 0)
7163796d97248956b9c06a7889b007b34bc8b486f4Steve Block        return "-0";
7263796d97248956b9c06a7889b007b34bc8b486f4Steve Block    else return "" + v;
7363796d97248956b9c06a7889b007b34bc8b486f4Steve Block}
7463796d97248956b9c06a7889b007b34bc8b486f4Steve Block
7563796d97248956b9c06a7889b007b34bc8b486f4Steve Blockfunction shouldBe(_a, _b)
7663796d97248956b9c06a7889b007b34bc8b486f4Steve Block{
7763796d97248956b9c06a7889b007b34bc8b486f4Steve Block    if (typeof _a != "string" || typeof _b != "string")
7863796d97248956b9c06a7889b007b34bc8b486f4Steve Block        debug("WARN: shouldBe() expects string arguments");
7963796d97248956b9c06a7889b007b34bc8b486f4Steve Block    var exception;
8063796d97248956b9c06a7889b007b34bc8b486f4Steve Block    var _av;
8163796d97248956b9c06a7889b007b34bc8b486f4Steve Block    try {
8263796d97248956b9c06a7889b007b34bc8b486f4Steve Block        _av = eval(_a);
8363796d97248956b9c06a7889b007b34bc8b486f4Steve Block    } catch (e) {
8463796d97248956b9c06a7889b007b34bc8b486f4Steve Block        exception = e;
8563796d97248956b9c06a7889b007b34bc8b486f4Steve Block    }
8663796d97248956b9c06a7889b007b34bc8b486f4Steve Block    var _bv = eval(_b);
8763796d97248956b9c06a7889b007b34bc8b486f4Steve Block
8863796d97248956b9c06a7889b007b34bc8b486f4Steve Block    if (exception)
8963796d97248956b9c06a7889b007b34bc8b486f4Steve Block        testFailed(_a + " should be " + _bv + ". Threw exception " + exception);
9063796d97248956b9c06a7889b007b34bc8b486f4Steve Block    else if (isResultCorrect(_av, _bv))
9163796d97248956b9c06a7889b007b34bc8b486f4Steve Block        testPassed(_a + " is " + _b);
9263796d97248956b9c06a7889b007b34bc8b486f4Steve Block    else if (typeof(_av) == typeof(_bv))
9363796d97248956b9c06a7889b007b34bc8b486f4Steve Block        testFailed(_a + " should be " + _bv + ". Was " + stringify(_av) + ".");
9463796d97248956b9c06a7889b007b34bc8b486f4Steve Block    else
9563796d97248956b9c06a7889b007b34bc8b486f4Steve Block        testFailed(_a + " should be " + _bv + " (of type " + typeof _bv + "). Was " + _av + " (of type " + typeof _av + ").");
9663796d97248956b9c06a7889b007b34bc8b486f4Steve Block}
9763796d97248956b9c06a7889b007b34bc8b486f4Steve Block
9863796d97248956b9c06a7889b007b34bc8b486f4Steve Blockfunction shouldBeTrue(_a) { shouldBe(_a, "true"); }
9963796d97248956b9c06a7889b007b34bc8b486f4Steve Blockfunction shouldBeFalse(_a) { shouldBe(_a, "false"); }
10063796d97248956b9c06a7889b007b34bc8b486f4Steve Blockfunction shouldBeNaN(_a) { shouldBe(_a, "NaN"); }
10163796d97248956b9c06a7889b007b34bc8b486f4Steve Blockfunction shouldBeNull(_a) { shouldBe(_a, "null"); }
10263796d97248956b9c06a7889b007b34bc8b486f4Steve Block
10363796d97248956b9c06a7889b007b34bc8b486f4Steve Blockfunction shouldBeEqualToString(a, b)
10463796d97248956b9c06a7889b007b34bc8b486f4Steve Block{
10563796d97248956b9c06a7889b007b34bc8b486f4Steve Block    var unevaledString = '"' + b.replace(/"/g, "\"") + '"';
10663796d97248956b9c06a7889b007b34bc8b486f4Steve Block    shouldBe(a, unevaledString);
10763796d97248956b9c06a7889b007b34bc8b486f4Steve Block}
10863796d97248956b9c06a7889b007b34bc8b486f4Steve Block
10963796d97248956b9c06a7889b007b34bc8b486f4Steve Blockfunction shouldBeUndefined(_a)
11063796d97248956b9c06a7889b007b34bc8b486f4Steve Block{
11163796d97248956b9c06a7889b007b34bc8b486f4Steve Block    var exception;
11263796d97248956b9c06a7889b007b34bc8b486f4Steve Block    var _av;
11363796d97248956b9c06a7889b007b34bc8b486f4Steve Block    try {
11463796d97248956b9c06a7889b007b34bc8b486f4Steve Block        _av = eval(_a);
11563796d97248956b9c06a7889b007b34bc8b486f4Steve Block    } catch (e) {
11663796d97248956b9c06a7889b007b34bc8b486f4Steve Block        exception = e;
11763796d97248956b9c06a7889b007b34bc8b486f4Steve Block    }
11863796d97248956b9c06a7889b007b34bc8b486f4Steve Block
11963796d97248956b9c06a7889b007b34bc8b486f4Steve Block    if (exception)
12063796d97248956b9c06a7889b007b34bc8b486f4Steve Block        testFailed(_a + " should be undefined. Threw exception " + exception);
12163796d97248956b9c06a7889b007b34bc8b486f4Steve Block    else if (typeof _av == "undefined")
12263796d97248956b9c06a7889b007b34bc8b486f4Steve Block        testPassed(_a + " is undefined.");
12363796d97248956b9c06a7889b007b34bc8b486f4Steve Block    else
12463796d97248956b9c06a7889b007b34bc8b486f4Steve Block        testFailed(_a + " should be undefined. Was " + _av);
12563796d97248956b9c06a7889b007b34bc8b486f4Steve Block}
12663796d97248956b9c06a7889b007b34bc8b486f4Steve Block
12763796d97248956b9c06a7889b007b34bc8b486f4Steve Blockfunction shouldThrow(_a, _e)
12863796d97248956b9c06a7889b007b34bc8b486f4Steve Block{
12963796d97248956b9c06a7889b007b34bc8b486f4Steve Block    var exception;
13063796d97248956b9c06a7889b007b34bc8b486f4Steve Block    var _av;
13163796d97248956b9c06a7889b007b34bc8b486f4Steve Block    try {
13263796d97248956b9c06a7889b007b34bc8b486f4Steve Block        _av = eval(_a);
13363796d97248956b9c06a7889b007b34bc8b486f4Steve Block    } catch (e) {
13463796d97248956b9c06a7889b007b34bc8b486f4Steve Block        exception = e;
13563796d97248956b9c06a7889b007b34bc8b486f4Steve Block    }
13663796d97248956b9c06a7889b007b34bc8b486f4Steve Block
13763796d97248956b9c06a7889b007b34bc8b486f4Steve Block    var _ev;
13863796d97248956b9c06a7889b007b34bc8b486f4Steve Block    if (_e)
13963796d97248956b9c06a7889b007b34bc8b486f4Steve Block        _ev =  eval(_e);
14063796d97248956b9c06a7889b007b34bc8b486f4Steve Block
14163796d97248956b9c06a7889b007b34bc8b486f4Steve Block    if (exception) {
14263796d97248956b9c06a7889b007b34bc8b486f4Steve Block        if (typeof _e == "undefined" || exception == _ev)
14363796d97248956b9c06a7889b007b34bc8b486f4Steve Block            testPassed(_a + " threw exception " + exception + ".");
14463796d97248956b9c06a7889b007b34bc8b486f4Steve Block        else
14563796d97248956b9c06a7889b007b34bc8b486f4Steve Block            testFailed(_a + " should throw " + (typeof _e == "undefined" ? "an exception" : _ev) + ". Threw exception " + exception + ".");
14663796d97248956b9c06a7889b007b34bc8b486f4Steve Block    } else if (typeof _av == "undefined")
14763796d97248956b9c06a7889b007b34bc8b486f4Steve Block        testFailed(_a + " should throw " + (typeof _e == "undefined" ? "an exception" : _ev) + ". Was undefined.");
14863796d97248956b9c06a7889b007b34bc8b486f4Steve Block    else
14963796d97248956b9c06a7889b007b34bc8b486f4Steve Block        testFailed(_a + " should throw " + (typeof _e == "undefined" ? "an exception" : _ev) + ". Was " + _av + ".");
15063796d97248956b9c06a7889b007b34bc8b486f4Steve Block}
15163796d97248956b9c06a7889b007b34bc8b486f4Steve Block
15263796d97248956b9c06a7889b007b34bc8b486f4Steve Blockvar cookies = new Array();
15363796d97248956b9c06a7889b007b34bc8b486f4Steve Block
15463796d97248956b9c06a7889b007b34bc8b486f4Steve Block// This method sets the cookies using XMLHttpRequest.
15563796d97248956b9c06a7889b007b34bc8b486f4Steve Block// We do not set the cookie right away as it is forbidden by the XHR spec.
15663796d97248956b9c06a7889b007b34bc8b486f4Steve Block// FIXME: Add the possibility to set multiple cookies in a row.
15763796d97248956b9c06a7889b007b34bc8b486f4Steve Blockfunction setCookies(cookie)
15863796d97248956b9c06a7889b007b34bc8b486f4Steve Block{
15963796d97248956b9c06a7889b007b34bc8b486f4Steve Block    try {
16063796d97248956b9c06a7889b007b34bc8b486f4Steve Block        var xhr = new XMLHttpRequest();
16163796d97248956b9c06a7889b007b34bc8b486f4Steve Block        xhr.open("GET", "resources/setCookies.cgi", false);
16263796d97248956b9c06a7889b007b34bc8b486f4Steve Block        xhr.setRequestHeader("SET_COOKIE", cookie);
16363796d97248956b9c06a7889b007b34bc8b486f4Steve Block        xhr.send(null);
16463796d97248956b9c06a7889b007b34bc8b486f4Steve Block        if (xhr.status == 200) {
16563796d97248956b9c06a7889b007b34bc8b486f4Steve Block            // This is to clear them later.
16663796d97248956b9c06a7889b007b34bc8b486f4Steve Block            cookies.push(cookie);
16763796d97248956b9c06a7889b007b34bc8b486f4Steve Block            return true;
16863796d97248956b9c06a7889b007b34bc8b486f4Steve Block        } else
16963796d97248956b9c06a7889b007b34bc8b486f4Steve Block            return false;
17063796d97248956b9c06a7889b007b34bc8b486f4Steve Block    } catch (e) {
17163796d97248956b9c06a7889b007b34bc8b486f4Steve Block        return false;
17263796d97248956b9c06a7889b007b34bc8b486f4Steve Block    }
17363796d97248956b9c06a7889b007b34bc8b486f4Steve Block}
17463796d97248956b9c06a7889b007b34bc8b486f4Steve Block
17563796d97248956b9c06a7889b007b34bc8b486f4Steve Block// Normalize a cookie string
17663796d97248956b9c06a7889b007b34bc8b486f4Steve Blockfunction normalizeCookie(cookie)
17763796d97248956b9c06a7889b007b34bc8b486f4Steve Block{
17863796d97248956b9c06a7889b007b34bc8b486f4Steve Block    // Split the cookie string, sort it and then put it back together.
17963796d97248956b9c06a7889b007b34bc8b486f4Steve Block    return cookie.split('; ').sort().join('; ');
18063796d97248956b9c06a7889b007b34bc8b486f4Steve Block}
18163796d97248956b9c06a7889b007b34bc8b486f4Steve Block
18263796d97248956b9c06a7889b007b34bc8b486f4Steve Block// We get the cookies throught an XMLHttpRequest.
18363796d97248956b9c06a7889b007b34bc8b486f4Steve Blockfunction testCookies(result)
18463796d97248956b9c06a7889b007b34bc8b486f4Steve Block{
18563796d97248956b9c06a7889b007b34bc8b486f4Steve Block    var xhr = new XMLHttpRequest();
18663796d97248956b9c06a7889b007b34bc8b486f4Steve Block    xhr.open("GET", "resources/getCookies.cgi", false);
18763796d97248956b9c06a7889b007b34bc8b486f4Steve Block    xhr.send(null);
18863796d97248956b9c06a7889b007b34bc8b486f4Steve Block    var cookie = xhr.getResponseHeader("HTTP_COOKIE") == null ? '"null"' : xhr.getResponseHeader("HTTP_COOKIE");
18963796d97248956b9c06a7889b007b34bc8b486f4Steve Block
19063796d97248956b9c06a7889b007b34bc8b486f4Steve Block    // Normalize the cookie strings.
19163796d97248956b9c06a7889b007b34bc8b486f4Steve Block    result = normalizeCookie(result);
19263796d97248956b9c06a7889b007b34bc8b486f4Steve Block    cookie = normalizeCookie(cookie);
19363796d97248956b9c06a7889b007b34bc8b486f4Steve Block
19463796d97248956b9c06a7889b007b34bc8b486f4Steve Block    if (cookie === result)
19563796d97248956b9c06a7889b007b34bc8b486f4Steve Block        testPassed("cookie is '" + cookie + "'.");
19663796d97248956b9c06a7889b007b34bc8b486f4Steve Block    else
19763796d97248956b9c06a7889b007b34bc8b486f4Steve Block        testFailed("cookie was '" + cookie + "'. Expected '" + result + "'.");
19863796d97248956b9c06a7889b007b34bc8b486f4Steve Block}
19963796d97248956b9c06a7889b007b34bc8b486f4Steve Block
20063796d97248956b9c06a7889b007b34bc8b486f4Steve Blockfunction clearAllCookies()
20163796d97248956b9c06a7889b007b34bc8b486f4Steve Block{
20263796d97248956b9c06a7889b007b34bc8b486f4Steve Block    var cookieString;
20363796d97248956b9c06a7889b007b34bc8b486f4Steve Block    while (cookieString = document.cookie) {
20463796d97248956b9c06a7889b007b34bc8b486f4Steve Block        var cookieName = cookieString.substr(0, cookieString.indexOf("=") || cookieString.length());
20563796d97248956b9c06a7889b007b34bc8b486f4Steve Block        cookies.push(cookieName);
20663796d97248956b9c06a7889b007b34bc8b486f4Steve Block        clearCookies();
20763796d97248956b9c06a7889b007b34bc8b486f4Steve Block    }
20863796d97248956b9c06a7889b007b34bc8b486f4Steve Block}
20963796d97248956b9c06a7889b007b34bc8b486f4Steve Block
21063796d97248956b9c06a7889b007b34bc8b486f4Steve Blockfunction clearCookies()
21163796d97248956b9c06a7889b007b34bc8b486f4Steve Block{
21263796d97248956b9c06a7889b007b34bc8b486f4Steve Block    if (!cookies.length)
21363796d97248956b9c06a7889b007b34bc8b486f4Steve Block        return;
21463796d97248956b9c06a7889b007b34bc8b486f4Steve Block
21563796d97248956b9c06a7889b007b34bc8b486f4Steve Block    try {
21663796d97248956b9c06a7889b007b34bc8b486f4Steve Block        var xhr = new XMLHttpRequest();
21763796d97248956b9c06a7889b007b34bc8b486f4Steve Block        var cookie;
21863796d97248956b9c06a7889b007b34bc8b486f4Steve Block        // We need to clean one cookie at a time because to be cleared the
21963796d97248956b9c06a7889b007b34bc8b486f4Steve Block        // cookie must be exactly the same except for the "Max-Age"
22063796d97248956b9c06a7889b007b34bc8b486f4Steve Block        // and "Expires" fields.
22163796d97248956b9c06a7889b007b34bc8b486f4Steve Block        while (cookie = cookies.pop()) {
22263796d97248956b9c06a7889b007b34bc8b486f4Steve Block            xhr.open("GET", "resources/clearCookies.cgi", false);
22363796d97248956b9c06a7889b007b34bc8b486f4Steve Block            xhr.setRequestHeader("CLEAR_COOKIE", cookie);
22463796d97248956b9c06a7889b007b34bc8b486f4Steve Block            xhr.send(null);
22563796d97248956b9c06a7889b007b34bc8b486f4Steve Block        }
22663796d97248956b9c06a7889b007b34bc8b486f4Steve Block    } catch (e) {
22763796d97248956b9c06a7889b007b34bc8b486f4Steve Block        debug("Could not clear the cookies expect the following results to fail");
22863796d97248956b9c06a7889b007b34bc8b486f4Steve Block    }
22963796d97248956b9c06a7889b007b34bc8b486f4Steve Block}
23063796d97248956b9c06a7889b007b34bc8b486f4Steve Block
23163796d97248956b9c06a7889b007b34bc8b486f4Steve Block// This method check one cookie at a time.
23263796d97248956b9c06a7889b007b34bc8b486f4Steve Blockfunction cookiesShouldBe(cookiesToSet, result)
23363796d97248956b9c06a7889b007b34bc8b486f4Steve Block{
23463796d97248956b9c06a7889b007b34bc8b486f4Steve Block    if (!setCookies(cookiesToSet)) {
23563796d97248956b9c06a7889b007b34bc8b486f4Steve Block        testFailed("could not set cookie(s) " + cookiesToSet);
23663796d97248956b9c06a7889b007b34bc8b486f4Steve Block        return;
23763796d97248956b9c06a7889b007b34bc8b486f4Steve Block    }
23863796d97248956b9c06a7889b007b34bc8b486f4Steve Block    testCookies(result);
23963796d97248956b9c06a7889b007b34bc8b486f4Steve Block}
240