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, "&").replace(/</g, "<"); 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