18e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block/*
28e32145b4e03a65dfedc686a281d7a7f78d57a72Steve BlockCopyright (c) 2001-2005 World Wide Web Consortium,
38e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block(Massachusetts Institute of Technology, European Research Consortium
48e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfor Informatics and Mathematics, Keio University). All
58e32145b4e03a65dfedc686a281d7a7f78d57a72Steve BlockRights Reserved. This work is distributed under the W3C(r) Software License [1] in the
68e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockhope that it will be useful, but WITHOUT ANY WARRANTY; without even
78e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockthe implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
88e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
98e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block[1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
108e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block*/
118e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
128e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  function assertSize(descr, expected, actual) {
138e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var actualSize;
148e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    assertNotNull(descr, actual);
158e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    actualSize = actual.length;
168e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    assertEquals(descr, expected, actualSize);
178e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  }
188e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
198e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  function assertEqualsAutoCase(context, descr, expected, actual) {
208e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  	if (builder.contentType == "text/html") {
218e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  	    if(context == "attribute") {
228e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  	    	assertEquals(descr, expected.toLowerCase(), actual.toLowerCase());
238e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  	    } else {
248e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  	        assertEquals(descr, expected.toUpperCase(), actual);
258e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  	    }
268e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  	} else {
278e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  		assertEquals(descr, expected, actual);
288e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  	}
298e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  }
308e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
318e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
328e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  function assertEqualsCollectionAutoCase(context, descr, expected, actual) {
338e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    //
348e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    //  if they aren't the same size, they aren't equal
358e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    assertEquals(descr, expected.length, actual.length);
368e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
378e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    //
388e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    //  if there length is the same, then every entry in the expected list
398e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    //     must appear once and only once in the actual list
408e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var expectedLen = expected.length;
418e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var expectedValue;
428e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var actualLen = actual.length;
438e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var i;
448e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var j;
458e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var matches;
468e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    for(i = 0; i < expectedLen; i++) {
478e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        matches = 0;
488e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        expectedValue = expected[i];
498e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        for(j = 0; j < actualLen; j++) {
508e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        	if (builder.contentType == "text/html") {
518e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        		if (context == "attribute") {
528e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        			if (expectedValue.toLowerCase() == actual[j].toLowerCase()) {
538e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        				matches++;
548e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        			}
558e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        		} else {
568e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        			if (expectedValue.toUpperCase() == actual[j]) {
578e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        				matches++;
588e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        			}
598e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        		}
608e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        	} else {
618e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block            	if(expectedValue == actual[j]) {
628e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block                	matches++;
638e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block                }
648e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block            }
658e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        }
668e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        if(matches == 0) {
678e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block            assert(descr + ": No match found for " + expectedValue,false);
688e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        }
698e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        if(matches > 1) {
708e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block            assert(descr + ": Multiple matches found for " + expectedValue, false);
718e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        }
728e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    }
738e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  }
748e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
758e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  function assertEqualsCollection(descr, expected, actual) {
768e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    //
778e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    //  if they aren't the same size, they aren't equal
788e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    assertEquals(descr, expected.length, actual.length);
798e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    //
808e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    //  if there length is the same, then every entry in the expected list
818e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    //     must appear once and only once in the actual list
828e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var expectedLen = expected.length;
838e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var expectedValue;
848e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var actualLen = actual.length;
858e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var i;
868e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var j;
878e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var matches;
888e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    for(i = 0; i < expectedLen; i++) {
898e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        matches = 0;
908e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        expectedValue = expected[i];
918e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        for(j = 0; j < actualLen; j++) {
928e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block            if(expectedValue == actual[j]) {
938e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block                matches++;
948e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block            }
958e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        }
968e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        if(matches == 0) {
978e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block            assert(descr + ": No match found for " + expectedValue,false);
988e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        }
998e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        if(matches > 1) {
1008e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block            assert(descr + ": Multiple matches found for " + expectedValue, false);
1018e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        }
1028e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    }
1038e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  }
1048e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
1058e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
1068e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  function assertEqualsListAutoCase(context, descr, expected, actual) {
1078e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	var minLength = expected.length;
1088e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	if (actual.length < minLength) {
1098e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	    minLength = actual.length;
1108e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	}
1118e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    //
1128e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    for(var i = 0; i < minLength; i++) {
1138e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block		assertEqualsAutoCase(context, descr, expected[i], actual[i]);
1148e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    }
1158e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    //
1168e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    //  if they aren't the same size, they aren't equal
1178e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    assertEquals(descr, expected.length, actual.length);
1188e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  }
1198e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
1208e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
1218e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  function assertEqualsList(descr, expected, actual) {
1228e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	var minLength = expected.length;
1238e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	if (actual.length < minLength) {
1248e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	    minLength = actual.length;
1258e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	}
1268e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    //
1278e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    for(var i = 0; i < minLength; i++) {
1288e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        if(expected[i] != actual[i]) {
1298e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block			assertEquals(descr, expected[i], actual[i]);
1308e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        }
1318e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    }
1328e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    //
1338e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    //  if they aren't the same size, they aren't equal
1348e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    assertEquals(descr, expected.length, actual.length);
1358e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  }
1368e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
1378e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  function assertInstanceOf(descr, type, obj) {
1388e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    if(type == "Attr") {
1398e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        assertEquals(descr,2,obj.nodeType);
1408e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        var specd = obj.specified;
1418e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    }
1428e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  }
1438e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
1448e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  function assertSame(descr, expected, actual) {
1458e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    if(expected != actual) {
1468e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        assertEquals(descr, expected.nodeType, actual.nodeType);
1478e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        assertEquals(descr, expected.nodeValue, actual.nodeValue);
1488e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    }
1498e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  }
1508e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
1518e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  function assertURIEquals(assertID, scheme, path, host, file, name, query, fragment, isAbsolute, actual) {
1528e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    //
1538e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    //  URI must be non-null
1548e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    assertNotNull(assertID, actual);
1558e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
1568e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var uri = actual;
1578e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
1588e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var lastPound = actual.lastIndexOf("#");
1598e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var actualFragment = "";
1608e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    if(lastPound != -1) {
1618e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        //
1628e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        //   substring before pound
1638e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        //
1648e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        uri = actual.substring(0,lastPound);
1658e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        actualFragment = actual.substring(lastPound+1);
1668e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    }
1678e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    if(fragment != null) assertEquals(assertID,fragment, actualFragment);
1688e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
1698e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var lastQuestion = uri.lastIndexOf("?");
1708e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var actualQuery = "";
1718e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    if(lastQuestion != -1) {
1728e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        //
1738e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        //   substring before pound
1748e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        //
1758e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        uri = actual.substring(0,lastQuestion);
1768e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        actualQuery = actual.substring(lastQuestion+1);
1778e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    }
1788e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    if(query != null) assertEquals(assertID, query, actualQuery);
1798e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
1808e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var firstColon = uri.indexOf(":");
1818e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var firstSlash = uri.indexOf("/");
1828e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var actualPath = uri;
1838e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var actualScheme = "";
1848e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    if(firstColon != -1 && firstColon < firstSlash) {
1858e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        actualScheme = uri.substring(0,firstColon);
1868e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        actualPath = uri.substring(firstColon + 1);
1878e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    }
1888e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
1898e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    if(scheme != null) {
1908e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        assertEquals(assertID, scheme, actualScheme);
1918e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    }
1928e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
1938e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    if(path != null) {
1948e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        assertEquals(assertID, path, actualPath);
1958e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    }
1968e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
1978e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    if(host != null) {
1988e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        var actualHost = "";
1998e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        if(actualPath.substring(0,2) == "//") {
2008e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block            var termSlash = actualPath.substring(2).indexOf("/") + 2;
2018e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block            actualHost = actualPath.substring(0,termSlash);
2028e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        }
2038e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        assertEquals(assertID, host, actualHost);
2048e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    }
2058e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
2068e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    if(file != null || name != null) {
2078e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        var actualFile = actualPath;
2088e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        var finalSlash = actualPath.lastIndexOf("/");
2098e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        if(finalSlash != -1) {
2108e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block            actualFile = actualPath.substring(finalSlash+1);
2118e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        }
2128e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        if (file != null) {
2138e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block            assertEquals(assertID, file, actualFile);
2148e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        }
2158e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        if (name != null) {
2168e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block            var actualName = actualFile;
2178e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block            var finalDot = actualFile.lastIndexOf(".");
2188e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block            if (finalDot != -1) {
2198e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block                actualName = actualName.substring(0, finalDot);
2208e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block            }
2218e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block            assertEquals(assertID, name, actualName);
2228e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        }
2238e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    }
2248e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
2258e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    if(isAbsolute != null) {
2268e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        assertEquals(assertID, isAbsolute, actualPath.substring(0,1) == "/");
2278e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    }
2288e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  }
2298e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
2308e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
2318e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block// size() used by assertSize element
2328e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction size(collection)
2338e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block{
2348e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  return collection.length;
2358e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
2368e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
2378e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction same(expected, actual)
2388e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block{
2398e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  return expected === actual;
2408e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
2418e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
2428e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction equalsAutoCase(context, expected, actual) {
2438e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	if (builder.contentType == "text/html") {
2448e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block		if (context == "attribute") {
2458e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block			return expected.toLowerCase() == actual;
2468e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block		}
2478e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block		return expected.toUpperCase() == actual;
2488e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	}
2498e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	return expected == actual;
2508e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
2518e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
2528e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction toLowerArray(src) {
2538e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   var newArray = new Array();
2548e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   var i;
2558e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   for (i = 0; i < src.length; i++) {
2568e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      newArray[i] = src[i].toLowerCase();
2578e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   }
2588e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   return newArray;
2598e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
2608e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
2618e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction createTempURI(scheme) {
2628e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   if (scheme == "http") {
2638e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   	  return "http://localhost:8080/webdav/tmp" + Math.floor(Math.random() * 100000) + ".xml";
2648e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   }
2658e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   return "file:///tmp/domts" + Math.floor(Math.random() * 100000) + ".xml";
2668e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
2678e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
2688e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
2698e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
2708e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction EventMonitor() {
2718e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  this.atEvents = new Array();
2728e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  this.bubbledEvents = new Array();
2738e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  this.capturedEvents = new Array();
2748e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  this.allEvents = new Array();
2758e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
2768e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
2778e32145b4e03a65dfedc686a281d7a7f78d57a72Steve BlockEventMonitor.prototype.handleEvent = function(evt) {
2788e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    switch(evt.eventPhase) {
2798e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block       case 1:
2808e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block       monitor.capturedEvents[monitor.capturedEvents.length] = evt;
2818e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block       break;
2828e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
2838e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block       case 2:
2848e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block       monitor.atEvents[monitor.atEvents.length] = evt;
2858e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block       break;
2868e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
2878e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block       case 3:
2888e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block       monitor.bubbledEvents[monitor.bubbledEvents.length] = evt;
2898e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block       break;
2908e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    }
2918e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    monitor.allEvents[monitor.allEvents.length] = evt;
2928e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
2938e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
2948e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction DOMErrorImpl(err) {
2958e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  this.severity = err.severity;
2968e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  this.message = err.message;
2978e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  this.type = err.type;
2988e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  this.relatedException = err.relatedException;
2998e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  this.relatedData = err.relatedData;
3008e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  this.location = err.location;
3018e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
3028e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
3038e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
3048e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
3058e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction DOMErrorMonitor() {
3068e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  this.allErrors = new Array();
3078e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
3088e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
3098e32145b4e03a65dfedc686a281d7a7f78d57a72Steve BlockDOMErrorMonitor.prototype.handleError = function(err) {
3108e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    errorMonitor.allErrors[errorMonitor.allErrors.length] = new DOMErrorImpl(err);
3118e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
3128e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
3138e32145b4e03a65dfedc686a281d7a7f78d57a72Steve BlockDOMErrorMonitor.prototype.assertLowerSeverity = function(id, severity) {
3148e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var i;
3158e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    for (i = 0; i < this.allErrors.length; i++) {
3168e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        if (this.allErrors[i].severity >= severity) {
3178e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block           assertEquals(id, severity - 1, this.allErrors[i].severity);
3188e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        }
3198e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    }
3208e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
3218e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
3228e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction UserDataNotification(operation, key, data, src, dst) {
3238e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    this.operation = operation;
3248e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    this.key = key;
3258e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    this.data = data;
3268e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    this.src = src;
3278e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    this.dst = dst;
3288e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
3298e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
3308e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction UserDataMonitor() {
3318e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	this.allNotifications = new Array();
3328e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
3338e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
3348e32145b4e03a65dfedc686a281d7a7f78d57a72Steve BlockUserDataMonitor.prototype.handle = function(operation, key, data, src, dst) {
3358e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    userDataMonitor.allNotifications[userDataMonitor.allNotifications.length] =
3368e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block         new UserDataNotification(operation, key, data, src, dst);
3378e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
3388e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
3398e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
3408e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
3418e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction HTMLBuilder() {
3428e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    this.contentType = "application/xhtml+xml";
3438e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    this.supportedContentTypes = [ "application/xhtml+xml" ];
3448e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
3458e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    this.supportsAsyncChange = false;
3468e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    this.async = false;
3478e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    this.fixedAttributeNames = [
3488e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        "validating",  "expandEntityReferences", "coalescing",
3498e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        "signed", "hasNullString", "ignoringElementContentWhitespace", "namespaceAware", "ignoringComments", "schemaValidating"];
3508e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
3518e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    this.fixedAttributeValues = [false,  true, false, true, true , false, true, false, false ];
3528e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    this.configurableAttributeNames = [ ];
3538e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    this.configurableAttributeValues = [ ];
3548e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    this.initializationError = null;
3558e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    this.initializationFatalError = null;
3568e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    this.skipIncompatibleTests = true;
3578e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    this.documentURLs = new Array();
3588e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    this.documentVarnames = new Array();
3598e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
3608e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
3618e32145b4e03a65dfedc686a281d7a7f78d57a72Steve BlockHTMLBuilder.prototype.hasFeature = function(feature, version) {
3628e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    return document.implementation.hasFeature(feature, version);
3638e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
3648e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
3658e32145b4e03a65dfedc686a281d7a7f78d57a72Steve BlockHTMLBuilder.prototype.getImplementation = function() {
3668e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  return document.implementation;
3678e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
3688e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
3698e32145b4e03a65dfedc686a281d7a7f78d57a72Steve BlockHTMLBuilder.prototype.preload = function(frame, varname, url) {
3708e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  var i;
3718e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  this.documentVarnames[this.documentVarnames.length] = varname;
3728e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  this.documentURLs[this.documentURLs.length] = url;
3738e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  if (this.documentURLs.length > 1) {
3748e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block     //
3758e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block     //   if all the urls are not the same
3768e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block     //
3778e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block     for (i = 1; i < this.documentURLs.length; i++) {
3788e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block         if (this.documentURLs[i] != this.documentURLs[0]) {
3798e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block             throw "Tests with multiple loads of different documents are not currently supported";
3808e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block         }
3818e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block     }
3828e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  }
3838e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  return 1;
3848e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
3858e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
3868e32145b4e03a65dfedc686a281d7a7f78d57a72Steve BlockHTMLBuilder.prototype.cloneNode = function(srcNode, doc) {
3878e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   var clone = null;
3888e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   switch(srcNode.nodeType) {
3898e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      //
3908e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      //  element
3918e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      case 1:
3928e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      clone = doc.createElementNS(srcNode.namespaceURI, srcNode.nodeName);
3938e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      var attrs = srcNode.attributes;
3948e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      for(var i = 0; i < attrs.length; i++) {
3958e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block          var srcAttr = attrs.item(i);
3968e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block          clone.setAttributeNS(srcAttr.namespaceURI, srcAttr.nodeName, srcAttr.nodeValue);
3978e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      }
3988e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      var srcChild = srcNode.firstChild;
3998e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      while(srcChild != null) {
4008e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block         var cloneChild = this.cloneNode(srcChild, doc);
4018e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block         if (cloneChild != null) {
4028e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block             clone.appendChild(cloneChild);
4038e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block         }
4048e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block         srcChild = srcChild.nextSibling;
4058e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      }
4068e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      break;
4078e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
4088e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      case 3:
4098e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      clone = doc.createTextNode(srcNode.nodeValue);
4108e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      break;
4118e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
4128e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      case 4:
4138e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      clone = doc.createCDATASection(srcNode.nodeValue);
4148e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      break;
4158e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
4168e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      case 5:
4178e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      clone = doc.createEntityReference(srcNode.nodeName);
4188e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      break;
4198e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
4208e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      case 7:
4218e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      clone = doc.createProcessingInstruction(srcNode.target, srcNode.data);
4228e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      break;
4238e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
4248e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      case 8:
4258e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      clone = doc.createComment(srcNode.nodeValue);
4268e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      break;
4278e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   }
4288e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   return clone;
4298e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
4308e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
4318e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
4328e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
4338e32145b4e03a65dfedc686a281d7a7f78d57a72Steve BlockHTMLBuilder.prototype.load = function(frame, varname, url) {
4348e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  if (this.documentVarnames[0] == varname) {
4358e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  	return document;
4368e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  }
4378e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  //
4388e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  //
4398e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  //  not a perfect way to do this
4408e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  //    Document.cloneNode is implementation dependent but exists in L1
4418e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  //       and implemented in IE.  The alternative brute force copy
4428e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  //       only works in L2 or higher implementations and can't copy
4438e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  //       entity and notation definitions, etc.
4448e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  var clone = null;
4458e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  try {
4468e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      clone = document.cloneNode(true);
4478e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  } catch(ex) {
4488e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  }
4498e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  if (clone == null) {
4508e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      clone = document.implementation.createDocument(
4518e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block          document.documentElement.namespaceURI,
4528e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block          document.documentElement.nodeName,
4538e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block          null);
4548e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      //
4558e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      //   Work-around since
4568e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      //   Safari does not create document element
4578e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      //      create document.
4588e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      if (clone.documentElement == null) {
4598e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block           clone.appendChild(clone.createElementNS(
4608e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block              document.documentElement.namespaceURI,
4618e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block              document.documentElement.nodeName));
4628e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      }
4638e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      var attrs = document.documentElement.attributes;
4648e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      for(var i = 0; i < attrs.length; i++) {
4658e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block          var srcAttr = attrs.item(i);
4668e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block          clone.documentElement.setAttributeNS(
4678e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block             srcAttr.namespaceURI, srcAttr.nodeName, srcAttr.nodeValue);
4688e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      }
4698e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
4708e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      var srcNode = document.firstChild;
4718e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      while(srcNode != null && srcNode.nodeType != 1) {
4728e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block          if (srcNode.nodeType != 10) {
4738e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block          	 var cloneNode = this.cloneNode(srcNode, clone);
4748e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block             clone.insertBefore(cloneNode, clone.documentElement);
4758e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block           }
4768e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block           srcNode = srcNode.nextSibling;
4778e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      }
4788e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      srcNode = document.documentElement.nextSibling;
4798e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      while(srcNode != null) {
4808e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block          var cloneNode = this.cloneNode(srcNode, clone);
4818e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block          clone.appendChild(cloneNode);
4828e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block          srcNode = srcNode.nextSibling;
4838e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      }
4848e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      srcNode = document.documentElement.firstChild;
4858e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      while(srcNode != null) {
4868e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block          var cloneNode = this.cloneNode(srcNode, clone);
4878e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block          if (cloneNode != null) {
4888e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block             clone.documentElement.appendChild(cloneNode);
4898e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block          }
4908e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block          srcNode = srcNode.nextSibling;
4918e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      }
4928e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  }
4938e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  return clone;
4948e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
4958e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
4968e32145b4e03a65dfedc686a281d7a7f78d57a72Steve BlockHTMLBuilder.prototype.getImplementationAttribute = function(attr) {
4978e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    for (var i = 0; i < this.fixedAttributeNames.length; i++) {
4988e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        if (this.fixedAttributeNames[i] == attr) {
4998e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block            return this.fixedAttributeValues[i];
5008e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        }
5018e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    }
5028e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    throw "Unrecognized implementation attribute: " + attr;
5038e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
5048e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
5058e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
5068e32145b4e03a65dfedc686a281d7a7f78d57a72Steve BlockHTMLBuilder.prototype.setImplementationAttribute = function(attribute, value) {
5078e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var supported = this.getImplementationAttribute(attribute);
5088e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    if (supported != value) {
5098e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        this.initializationError = "HTML loader does not support " + attribute + "=" + value;
5108e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    }
5118e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
5128e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
5138e32145b4e03a65dfedc686a281d7a7f78d57a72Steve BlockHTMLBuilder.prototype.canSetImplementationAttribute = function(attribute, value) {
5148e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var supported = this.getImplementationAttribute(attribute);
5158e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    return (supported == value);
5168e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
5178e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
5188e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
5198e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
5208e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
5218e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction createConfiguredBuilder() {
5228e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    return new HTMLBuilder();
5238e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
5248e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
5258e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction catchInitializationError(buildr, ex) {
5268e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   buildr.initializationError = ex;
5278e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   buildr.initializationFatalError = ex;
5288e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
5298e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
5308e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
5318e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction checkFeature(feature, version)
5328e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block{
5338e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  if (!builder.hasFeature(feature, version))
5348e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  {
5358e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    //
5368e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    //   don't throw exception so that users can select to ignore the precondition
5378e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    //
5388e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    builder.initializationError = "builder does not support feature " + feature + " version " + version;
5398e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block  }
5408e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
5418e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
5428e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction setResult(resultType, message) {
5438e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   var testName = getTargetURI();
5448e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   document.title = testName + ":" + resultType;
5458e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   var xhtmlNS = "http://www.w3.org/1999/xhtml";
5468e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   var newBody = document.createElementNS(xhtmlNS, "body");
5478e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   var newTable = document.createElementNS(xhtmlNS, "table");
5488e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   newTable.width = "100%";
5498e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   newTable.border = "1";
5508e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   newBody.appendChild(newTable);
5518e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   var testRow = newTable.insertRow(-1);
5528e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   var testDiv1 = testRow.insertCell(-1);
5538e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   testDiv1.appendChild(document.createTextNode("Test"));
5548e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   var testDiv2 = testRow.insertCell(-1);
5558e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   testDiv2.appendChild(document.createTextNode(testName));
5568e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   var statusRow = newTable.insertRow(-1);
5578e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   var statusDiv1 = statusRow.insertCell(-1);
5588e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   statusDiv1.appendChild(document.createTextNode("Status"));
5598e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   var statusDiv2 = statusRow.insertCell(-1);
5608e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   var style = "color:green";
5618e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   if (resultType == null) {
5628e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   		statusDiv2.appendChild(document.createTextNode("Success"));
5638e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   } else {
5648e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   		statusDiv2.appendChild(document.createTextNode(resultType));
5658e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   		if (resultType == "skip") {
5668e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   		    style = "color:blue";
5678e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   		} else {
5688e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   		    style = "color:red";
5698e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   		}
5708e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   }
5718e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   newTable.setAttributeNS(null, "style", style);
5728e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   if (message != null) {
5738e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      var messageRow = newTable.insertRow(-1);
5748e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   	  var messageDiv1 = messageRow.insertCell(-1);
5758e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      messageDiv1.appendChild(document.createTextNode("Message"));
5768e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      var messageDiv2 = messageRow.insertCell(-1);
5778e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block      messageDiv2.appendChild(document.createTextNode(message));
5788e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   }
5798e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   var oldBody = document.getElementsByTagName("body")[0];
5808e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   oldBody.parentNode.replaceChild(newBody, oldBody);
5818e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   if (parent != window && typeof(parent.setResult) != 'undefined') {
5828e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block       parent.setResult(testName, resultType, message);
5838e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   }
5848e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
5858e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
5868e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction checkInitialization(buildr, testname) {
5878e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   return buildr.initializationError;
5888e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
5898e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
5908e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction preload(docRef, varname, href) {
5918e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   return builder.preload(docRef, varname, href);
5928e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
5938e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
5948e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
5958e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction load(docRef, varname, href) {
5968e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   return builder.load(docRef, varname, href);
5978e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
5988e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
5998e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6008e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction getImplementationAttribute(attr) {
6018e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    return builder.getImplementationAttribute(attr);
6028e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
6038e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6048e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6058e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction setImplementationAttribute(attribute, value) {
6068e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    builder.setImplementationAttribute(attribute, value);
6078e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
6088e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6098e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction createXPathEvaluator(doc) {
6108e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    try {
6118e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        return doc.getFeature("XPath", null);
6128e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    }
6138e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    catch(ex) {
6148e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    }
6158e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    return doc;
6168e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
6178e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6188e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6198e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction getImplementation() {
6208e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    return builder.getImplementation();
6218e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
6228e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6238e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction assertEquals(id, expected, actual) {
6248e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   var myActual;
6258e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   if (expected != actual) {
6268e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block       myActual = actual;
6278e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block       if (actual == null) {
6288e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block          myActual = "null";
6298e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block       }
6308e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block       throw "failure:" + id + ": assertEquals failed, actual " + myActual + ", expected " + expected + ".";
6318e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   }
6328e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
6338e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6348e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction assertNull(id, actual) {
6358e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   if (actual != null) {
6368e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block       throw "failure:" + id + ": assertNull failed, actual " + actual;
6378e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   }
6388e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
6398e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6408e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6418e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction assertTrue(id, actual) {
6428e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   if (!actual) {
6438e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block       throw "failure:" + id + ": assertTrue failed";
6448e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   }
6458e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
6468e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6478e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6488e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction assertFalse(id, actual) {
6498e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   if (actual) {
6508e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block       throw "failure:" + id +  ": assertTrue failed";
6518e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   }
6528e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
6538e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6548e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction assertNotNull(id, actual) {
6558e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   if (actual == null) {
6568e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block       throw "failure:" + id + ": assertNotNull failed";
6578e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block   }
6588e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
6598e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6608e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction fail(id) {
6618e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    throw "failure:" + id +  ": fail";
6628e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
6638e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6648e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6658e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6668e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction getSuffix(contentType) {
6678e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    switch(contentType) {
6688e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        case "text/html":
6698e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        return ".html";
6708e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6718e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        case "text/xml":
6728e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        return ".xml";
6738e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6748e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        case "image/svg+xml":
6758e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        return ".svg";
6768e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6778e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        case "text/mathml":
6788e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        return ".mml";
6798e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    }
6808e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    return ".xhtml";
6818e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
6828e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6838e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6848e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction getResourceURI(name, scheme, contentType) {
6858e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    var base = document.documentURI;
6868e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    if (base == null) {
6878e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block       base = "";
6888e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    } else {
6898e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	   base = base.substring(0, base.lastIndexOf('/') + 1) + "files/";
6908e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    }
6918e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    return base + name + getSuffix(contentType);
6928e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
6938e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6948e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6958e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6968e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockfunction startTest() {
6978e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
6988e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block//
6998e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block//  WebKit modification: 18-August-2005
7008e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block//
7018e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block//  Inform the test controller that this test has a text-format result and so should
7028e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block//  be dumped as text, and also that the dump should not occur automatically.
7038e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block//
7048e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Blockif (window.layoutTestController) {
7058e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    layoutTestController.dumpAsText();
7068e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    layoutTestController.waitUntilDone();
7078e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
7088e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block//
7098e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block//  End WebKit modification
7108e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block//
7118e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
7128e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	//
7138e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	//   invoke test setup
7148e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	//
7158e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	setUpPage();
7168e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	try {
7178e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	    runTest();
7188e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	    if (builder.initializationError == null) {
7198e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	       setResult(null, null);
7208e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	    } else {
7218e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	       setResult("skip", builder.initializationError);
7228e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	    }
7238e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	} catch(ex) {
7248e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block	    if (typeof(ex.substring) != 'undefined' && ex.substring(0, 8) == "failure:") {
7258e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block            setResult("failure", ex.substring(8));
7268e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        } else {
7278e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block            setResult("error", ex);
7288e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        }
7298e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    }
7308e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
7318e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block//
7328e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block//  WebKit modification: 18-August-2005
7338e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block//
7348e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block//  Inform the test controller that this test is complete, so it's time to dump.
7358e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block//
7368e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    if (window.layoutTestController) {
7378e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block        layoutTestController.notifyDone();
7388e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block    }
7398e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block//
7408e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block//  End WebKit modification
7418e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block//
7428e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block
7438e32145b4e03a65dfedc686a281d7a7f78d57a72Steve Block}
744