1356b8defb51adf939e0e8c114c189d95d923f754Steve Block/* 2356b8defb51adf939e0e8c114c189d95d923f754Steve BlockCopyright (c) 2001-2005 World Wide Web Consortium, 3356b8defb51adf939e0e8c114c189d95d923f754Steve Block(Massachusetts Institute of Technology, European Research Consortium 4356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfor Informatics and Mathematics, Keio University). All 5356b8defb51adf939e0e8c114c189d95d923f754Steve BlockRights Reserved. This work is distributed under the W3C(r) Software License [1] in the 6356b8defb51adf939e0e8c114c189d95d923f754Steve Blockhope that it will be useful, but WITHOUT ANY WARRANTY; without even 7356b8defb51adf939e0e8c114c189d95d923f754Steve Blockthe implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 8356b8defb51adf939e0e8c114c189d95d923f754Steve Block 9356b8defb51adf939e0e8c114c189d95d923f754Steve Block[1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 10356b8defb51adf939e0e8c114c189d95d923f754Steve Block*/ 11356b8defb51adf939e0e8c114c189d95d923f754Steve Block 12356b8defb51adf939e0e8c114c189d95d923f754Steve Block 13356b8defb51adf939e0e8c114c189d95d923f754Steve Block function assertSize(descr, expected, actual) { 14356b8defb51adf939e0e8c114c189d95d923f754Steve Block var actualSize; 15356b8defb51adf939e0e8c114c189d95d923f754Steve Block assertNotNull(descr, actual); 16356b8defb51adf939e0e8c114c189d95d923f754Steve Block actualSize = actual.length; 17356b8defb51adf939e0e8c114c189d95d923f754Steve Block assertEquals(descr, expected, actualSize); 18356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 19356b8defb51adf939e0e8c114c189d95d923f754Steve Block 20356b8defb51adf939e0e8c114c189d95d923f754Steve Block function assertEqualsAutoCase(context, descr, expected, actual) { 21356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (builder.contentType == "text/html") { 22356b8defb51adf939e0e8c114c189d95d923f754Steve Block if(context == "attribute") { 23356b8defb51adf939e0e8c114c189d95d923f754Steve Block assertEquals(descr, expected.toLowerCase(), actual.toLowerCase()); 24356b8defb51adf939e0e8c114c189d95d923f754Steve Block } else { 25356b8defb51adf939e0e8c114c189d95d923f754Steve Block assertEquals(descr, expected.toUpperCase(), actual); 26356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 27356b8defb51adf939e0e8c114c189d95d923f754Steve Block } else { 28356b8defb51adf939e0e8c114c189d95d923f754Steve Block assertEquals(descr, expected, actual); 29356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 30356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 31356b8defb51adf939e0e8c114c189d95d923f754Steve Block 32356b8defb51adf939e0e8c114c189d95d923f754Steve Block 33356b8defb51adf939e0e8c114c189d95d923f754Steve Block function assertEqualsCollectionAutoCase(context, descr, expected, actual) { 34356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 35356b8defb51adf939e0e8c114c189d95d923f754Steve Block // if they aren't the same size, they aren't equal 36356b8defb51adf939e0e8c114c189d95d923f754Steve Block assertEquals(descr, expected.length, actual.length); 37356b8defb51adf939e0e8c114c189d95d923f754Steve Block 38356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 39356b8defb51adf939e0e8c114c189d95d923f754Steve Block // if there length is the same, then every entry in the expected list 40356b8defb51adf939e0e8c114c189d95d923f754Steve Block // must appear once and only once in the actual list 41356b8defb51adf939e0e8c114c189d95d923f754Steve Block var expectedLen = expected.length; 42356b8defb51adf939e0e8c114c189d95d923f754Steve Block var expectedValue; 43356b8defb51adf939e0e8c114c189d95d923f754Steve Block var actualLen = actual.length; 44356b8defb51adf939e0e8c114c189d95d923f754Steve Block var i; 45356b8defb51adf939e0e8c114c189d95d923f754Steve Block var j; 46356b8defb51adf939e0e8c114c189d95d923f754Steve Block var matches; 47356b8defb51adf939e0e8c114c189d95d923f754Steve Block for(i = 0; i < expectedLen; i++) { 48356b8defb51adf939e0e8c114c189d95d923f754Steve Block matches = 0; 49356b8defb51adf939e0e8c114c189d95d923f754Steve Block expectedValue = expected[i]; 50356b8defb51adf939e0e8c114c189d95d923f754Steve Block for(j = 0; j < actualLen; j++) { 51356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (builder.contentType == "text/html") { 52356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (context == "attribute") { 53356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (expectedValue.toLowerCase() == actual[j].toLowerCase()) { 54356b8defb51adf939e0e8c114c189d95d923f754Steve Block matches++; 55356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 56356b8defb51adf939e0e8c114c189d95d923f754Steve Block } else { 57356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (expectedValue.toUpperCase() == actual[j]) { 58356b8defb51adf939e0e8c114c189d95d923f754Steve Block matches++; 59356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 60356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 61356b8defb51adf939e0e8c114c189d95d923f754Steve Block } else { 62356b8defb51adf939e0e8c114c189d95d923f754Steve Block if(expectedValue == actual[j]) { 63356b8defb51adf939e0e8c114c189d95d923f754Steve Block matches++; 64356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 65356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 66356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 67356b8defb51adf939e0e8c114c189d95d923f754Steve Block if(matches == 0) { 68356b8defb51adf939e0e8c114c189d95d923f754Steve Block assert(descr + ": No match found for " + expectedValue,false); 69356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 70356b8defb51adf939e0e8c114c189d95d923f754Steve Block if(matches > 1) { 71356b8defb51adf939e0e8c114c189d95d923f754Steve Block assert(descr + ": Multiple matches found for " + expectedValue, false); 72356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 73356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 74356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 75356b8defb51adf939e0e8c114c189d95d923f754Steve Block 76356b8defb51adf939e0e8c114c189d95d923f754Steve Block function assertEqualsCollection(descr, expected, actual) { 77356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 78356b8defb51adf939e0e8c114c189d95d923f754Steve Block // if they aren't the same size, they aren't equal 79356b8defb51adf939e0e8c114c189d95d923f754Steve Block assertEquals(descr, expected.length, actual.length); 80356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 81356b8defb51adf939e0e8c114c189d95d923f754Steve Block // if there length is the same, then every entry in the expected list 82356b8defb51adf939e0e8c114c189d95d923f754Steve Block // must appear once and only once in the actual list 83356b8defb51adf939e0e8c114c189d95d923f754Steve Block var expectedLen = expected.length; 84356b8defb51adf939e0e8c114c189d95d923f754Steve Block var expectedValue; 85356b8defb51adf939e0e8c114c189d95d923f754Steve Block var actualLen = actual.length; 86356b8defb51adf939e0e8c114c189d95d923f754Steve Block var i; 87356b8defb51adf939e0e8c114c189d95d923f754Steve Block var j; 88356b8defb51adf939e0e8c114c189d95d923f754Steve Block var matches; 89356b8defb51adf939e0e8c114c189d95d923f754Steve Block for(i = 0; i < expectedLen; i++) { 90356b8defb51adf939e0e8c114c189d95d923f754Steve Block matches = 0; 91356b8defb51adf939e0e8c114c189d95d923f754Steve Block expectedValue = expected[i]; 92356b8defb51adf939e0e8c114c189d95d923f754Steve Block for(j = 0; j < actualLen; j++) { 93356b8defb51adf939e0e8c114c189d95d923f754Steve Block if(expectedValue == actual[j]) { 94356b8defb51adf939e0e8c114c189d95d923f754Steve Block matches++; 95356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 96356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 97356b8defb51adf939e0e8c114c189d95d923f754Steve Block if(matches == 0) { 98356b8defb51adf939e0e8c114c189d95d923f754Steve Block assert(descr + ": No match found for " + expectedValue,false); 99356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 100356b8defb51adf939e0e8c114c189d95d923f754Steve Block if(matches > 1) { 101356b8defb51adf939e0e8c114c189d95d923f754Steve Block assert(descr + ": Multiple matches found for " + expectedValue, false); 102356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 103356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 104356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 105356b8defb51adf939e0e8c114c189d95d923f754Steve Block 106356b8defb51adf939e0e8c114c189d95d923f754Steve Block 107356b8defb51adf939e0e8c114c189d95d923f754Steve Block function assertEqualsListAutoCase(context, descr, expected, actual) { 108356b8defb51adf939e0e8c114c189d95d923f754Steve Block var minLength = expected.length; 109356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (actual.length < minLength) { 110356b8defb51adf939e0e8c114c189d95d923f754Steve Block minLength = actual.length; 111356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 112356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 113356b8defb51adf939e0e8c114c189d95d923f754Steve Block for(var i = 0; i < minLength; i++) { 114356b8defb51adf939e0e8c114c189d95d923f754Steve Block assertEqualsAutoCase(context, descr, expected[i], actual[i]); 115356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 116356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 117356b8defb51adf939e0e8c114c189d95d923f754Steve Block // if they aren't the same size, they aren't equal 118356b8defb51adf939e0e8c114c189d95d923f754Steve Block assertEquals(descr, expected.length, actual.length); 119356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 120356b8defb51adf939e0e8c114c189d95d923f754Steve Block 121356b8defb51adf939e0e8c114c189d95d923f754Steve Block 122356b8defb51adf939e0e8c114c189d95d923f754Steve Block function assertEqualsList(descr, expected, actual) { 123356b8defb51adf939e0e8c114c189d95d923f754Steve Block var minLength = expected.length; 124356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (actual.length < minLength) { 125356b8defb51adf939e0e8c114c189d95d923f754Steve Block minLength = actual.length; 126356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 127356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 128356b8defb51adf939e0e8c114c189d95d923f754Steve Block for(var i = 0; i < minLength; i++) { 129356b8defb51adf939e0e8c114c189d95d923f754Steve Block if(expected[i] != actual[i]) { 130356b8defb51adf939e0e8c114c189d95d923f754Steve Block assertEquals(descr, expected[i], actual[i]); 131356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 132356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 133356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 134356b8defb51adf939e0e8c114c189d95d923f754Steve Block // if they aren't the same size, they aren't equal 135356b8defb51adf939e0e8c114c189d95d923f754Steve Block assertEquals(descr, expected.length, actual.length); 136356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 137356b8defb51adf939e0e8c114c189d95d923f754Steve Block 138356b8defb51adf939e0e8c114c189d95d923f754Steve Block function assertInstanceOf(descr, type, obj) { 139356b8defb51adf939e0e8c114c189d95d923f754Steve Block if(type == "Attr") { 140356b8defb51adf939e0e8c114c189d95d923f754Steve Block assertEquals(descr,2,obj.nodeType); 141356b8defb51adf939e0e8c114c189d95d923f754Steve Block var specd = obj.specified; 142356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 143356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 144356b8defb51adf939e0e8c114c189d95d923f754Steve Block 145356b8defb51adf939e0e8c114c189d95d923f754Steve Block function assertSame(descr, expected, actual) { 146356b8defb51adf939e0e8c114c189d95d923f754Steve Block if(expected != actual) { 147356b8defb51adf939e0e8c114c189d95d923f754Steve Block assertEquals(descr, expected.nodeType, actual.nodeType); 148356b8defb51adf939e0e8c114c189d95d923f754Steve Block assertEquals(descr, expected.nodeValue, actual.nodeValue); 149356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 150356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 151356b8defb51adf939e0e8c114c189d95d923f754Steve Block 152356b8defb51adf939e0e8c114c189d95d923f754Steve Block function assertURIEquals(assertID, scheme, path, host, file, name, query, fragment, isAbsolute, actual) { 153356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 154356b8defb51adf939e0e8c114c189d95d923f754Steve Block // URI must be non-null 155356b8defb51adf939e0e8c114c189d95d923f754Steve Block assertNotNull(assertID, actual); 156356b8defb51adf939e0e8c114c189d95d923f754Steve Block 157356b8defb51adf939e0e8c114c189d95d923f754Steve Block var uri = actual; 158356b8defb51adf939e0e8c114c189d95d923f754Steve Block 159356b8defb51adf939e0e8c114c189d95d923f754Steve Block var lastPound = actual.lastIndexOf("#"); 160356b8defb51adf939e0e8c114c189d95d923f754Steve Block var actualFragment = ""; 161356b8defb51adf939e0e8c114c189d95d923f754Steve Block if(lastPound != -1) { 162356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 163356b8defb51adf939e0e8c114c189d95d923f754Steve Block // substring before pound 164356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 165356b8defb51adf939e0e8c114c189d95d923f754Steve Block uri = actual.substring(0,lastPound); 166356b8defb51adf939e0e8c114c189d95d923f754Steve Block actualFragment = actual.substring(lastPound+1); 167356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 168356b8defb51adf939e0e8c114c189d95d923f754Steve Block if(fragment != null) assertEquals(assertID,fragment, actualFragment); 169356b8defb51adf939e0e8c114c189d95d923f754Steve Block 170356b8defb51adf939e0e8c114c189d95d923f754Steve Block var lastQuestion = uri.lastIndexOf("?"); 171356b8defb51adf939e0e8c114c189d95d923f754Steve Block var actualQuery = ""; 172356b8defb51adf939e0e8c114c189d95d923f754Steve Block if(lastQuestion != -1) { 173356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 174356b8defb51adf939e0e8c114c189d95d923f754Steve Block // substring before pound 175356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 176356b8defb51adf939e0e8c114c189d95d923f754Steve Block uri = actual.substring(0,lastQuestion); 177356b8defb51adf939e0e8c114c189d95d923f754Steve Block actualQuery = actual.substring(lastQuestion+1); 178356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 179356b8defb51adf939e0e8c114c189d95d923f754Steve Block if(query != null) assertEquals(assertID, query, actualQuery); 180356b8defb51adf939e0e8c114c189d95d923f754Steve Block 181356b8defb51adf939e0e8c114c189d95d923f754Steve Block var firstColon = uri.indexOf(":"); 182356b8defb51adf939e0e8c114c189d95d923f754Steve Block var firstSlash = uri.indexOf("/"); 183356b8defb51adf939e0e8c114c189d95d923f754Steve Block var actualPath = uri; 184356b8defb51adf939e0e8c114c189d95d923f754Steve Block var actualScheme = ""; 185356b8defb51adf939e0e8c114c189d95d923f754Steve Block if(firstColon != -1 && firstColon < firstSlash) { 186356b8defb51adf939e0e8c114c189d95d923f754Steve Block actualScheme = uri.substring(0,firstColon); 187356b8defb51adf939e0e8c114c189d95d923f754Steve Block actualPath = uri.substring(firstColon + 1); 188356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 189356b8defb51adf939e0e8c114c189d95d923f754Steve Block 190356b8defb51adf939e0e8c114c189d95d923f754Steve Block if(scheme != null) { 191356b8defb51adf939e0e8c114c189d95d923f754Steve Block assertEquals(assertID, scheme, actualScheme); 192356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 193356b8defb51adf939e0e8c114c189d95d923f754Steve Block 194356b8defb51adf939e0e8c114c189d95d923f754Steve Block if(path != null) { 195356b8defb51adf939e0e8c114c189d95d923f754Steve Block assertEquals(assertID, path, actualPath); 196356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 197356b8defb51adf939e0e8c114c189d95d923f754Steve Block 198356b8defb51adf939e0e8c114c189d95d923f754Steve Block if(host != null) { 199356b8defb51adf939e0e8c114c189d95d923f754Steve Block var actualHost = ""; 200356b8defb51adf939e0e8c114c189d95d923f754Steve Block if(actualPath.substring(0,2) == "//") { 201356b8defb51adf939e0e8c114c189d95d923f754Steve Block var termSlash = actualPath.substring(2).indexOf("/") + 2; 202356b8defb51adf939e0e8c114c189d95d923f754Steve Block actualHost = actualPath.substring(0,termSlash); 203356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 204356b8defb51adf939e0e8c114c189d95d923f754Steve Block assertEquals(assertID, host, actualHost); 205356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 206356b8defb51adf939e0e8c114c189d95d923f754Steve Block 207356b8defb51adf939e0e8c114c189d95d923f754Steve Block if(file != null || name != null) { 208356b8defb51adf939e0e8c114c189d95d923f754Steve Block var actualFile = actualPath; 209356b8defb51adf939e0e8c114c189d95d923f754Steve Block var finalSlash = actualPath.lastIndexOf("/"); 210356b8defb51adf939e0e8c114c189d95d923f754Steve Block if(finalSlash != -1) { 211356b8defb51adf939e0e8c114c189d95d923f754Steve Block actualFile = actualPath.substring(finalSlash+1); 212356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 213356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (file != null) { 214356b8defb51adf939e0e8c114c189d95d923f754Steve Block assertEquals(assertID, file, actualFile); 215356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 216356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (name != null) { 217356b8defb51adf939e0e8c114c189d95d923f754Steve Block var actualName = actualFile; 218356b8defb51adf939e0e8c114c189d95d923f754Steve Block var finalDot = actualFile.lastIndexOf("."); 219356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (finalDot != -1) { 220356b8defb51adf939e0e8c114c189d95d923f754Steve Block actualName = actualName.substring(0, finalDot); 221356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 222356b8defb51adf939e0e8c114c189d95d923f754Steve Block assertEquals(assertID, name, actualName); 223356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 224356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 225356b8defb51adf939e0e8c114c189d95d923f754Steve Block 226356b8defb51adf939e0e8c114c189d95d923f754Steve Block if(isAbsolute != null) { 227356b8defb51adf939e0e8c114c189d95d923f754Steve Block assertEquals(assertID, isAbsolute, actualPath.substring(0,1) == "/"); 228356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 229356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 230356b8defb51adf939e0e8c114c189d95d923f754Steve Block 231356b8defb51adf939e0e8c114c189d95d923f754Steve Block 232356b8defb51adf939e0e8c114c189d95d923f754Steve Block// size() used by assertSize element 233356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction size(collection) 234356b8defb51adf939e0e8c114c189d95d923f754Steve Block{ 235356b8defb51adf939e0e8c114c189d95d923f754Steve Block return collection.length; 236356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 237356b8defb51adf939e0e8c114c189d95d923f754Steve Block 238356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction same(expected, actual) 239356b8defb51adf939e0e8c114c189d95d923f754Steve Block{ 240356b8defb51adf939e0e8c114c189d95d923f754Steve Block return expected === actual; 241356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 242356b8defb51adf939e0e8c114c189d95d923f754Steve Block 243356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction equalsAutoCase(context, expected, actual) { 244356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (builder.contentType == "text/html") { 245356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (context == "attribute") { 246356b8defb51adf939e0e8c114c189d95d923f754Steve Block return expected.toLowerCase() == actual; 247356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 248356b8defb51adf939e0e8c114c189d95d923f754Steve Block return expected.toUpperCase() == actual; 249356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 250356b8defb51adf939e0e8c114c189d95d923f754Steve Block return expected == actual; 251356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 252356b8defb51adf939e0e8c114c189d95d923f754Steve Block 253356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction createTempURI(scheme) { 254356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (scheme == "http") { 255356b8defb51adf939e0e8c114c189d95d923f754Steve Block return "http://localhost:8080/webdav/tmp" + Math.floor(Math.random() * 100000) + ".xml"; 256356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 257356b8defb51adf939e0e8c114c189d95d923f754Steve Block return "file:///tmp/domts" + Math.floor(Math.random() * 100000) + ".xml"; 258356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 259356b8defb51adf939e0e8c114c189d95d923f754Steve Block 260356b8defb51adf939e0e8c114c189d95d923f754Steve Block 261356b8defb51adf939e0e8c114c189d95d923f754Steve Block 262356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction EventMonitor() { 263356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.atEvents = new Array(); 264356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.bubbledEvents = new Array(); 265356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.capturedEvents = new Array(); 266356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.allEvents = new Array(); 267356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 268356b8defb51adf939e0e8c114c189d95d923f754Steve Block 269356b8defb51adf939e0e8c114c189d95d923f754Steve BlockEventMonitor.prototype.handleEvent = function(evt) { 270356b8defb51adf939e0e8c114c189d95d923f754Steve Block switch(evt.eventPhase) { 271356b8defb51adf939e0e8c114c189d95d923f754Steve Block case 1: 272356b8defb51adf939e0e8c114c189d95d923f754Steve Block monitor.capturedEvents[monitor.capturedEvents.length] = evt; 273356b8defb51adf939e0e8c114c189d95d923f754Steve Block break; 274356b8defb51adf939e0e8c114c189d95d923f754Steve Block 275356b8defb51adf939e0e8c114c189d95d923f754Steve Block case 2: 276356b8defb51adf939e0e8c114c189d95d923f754Steve Block monitor.atEvents[monitor.atEvents.length] = evt; 277356b8defb51adf939e0e8c114c189d95d923f754Steve Block break; 278356b8defb51adf939e0e8c114c189d95d923f754Steve Block 279356b8defb51adf939e0e8c114c189d95d923f754Steve Block case 3: 280356b8defb51adf939e0e8c114c189d95d923f754Steve Block monitor.bubbledEvents[monitor.bubbledEvents.length] = evt; 281356b8defb51adf939e0e8c114c189d95d923f754Steve Block break; 282356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 283356b8defb51adf939e0e8c114c189d95d923f754Steve Block monitor.allEvents[monitor.allEvents.length] = evt; 284356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 285356b8defb51adf939e0e8c114c189d95d923f754Steve Block 286356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction DOMErrorImpl(err) { 287356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.severity = err.severity; 288356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.message = err.message; 289356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.type = err.type; 290356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.relatedException = err.relatedException; 291356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.relatedData = err.relatedData; 292356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.location = err.location; 293356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 294356b8defb51adf939e0e8c114c189d95d923f754Steve Block 295356b8defb51adf939e0e8c114c189d95d923f754Steve Block 296356b8defb51adf939e0e8c114c189d95d923f754Steve Block 297356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction DOMErrorMonitor() { 298356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.allErrors = new Array(); 299356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 300356b8defb51adf939e0e8c114c189d95d923f754Steve Block 301356b8defb51adf939e0e8c114c189d95d923f754Steve BlockDOMErrorMonitor.prototype.handleError = function(err) { 302356b8defb51adf939e0e8c114c189d95d923f754Steve Block errorMonitor.allErrors[errorMonitor.allErrors.length] = new DOMErrorImpl(err); 303356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 304356b8defb51adf939e0e8c114c189d95d923f754Steve Block 305356b8defb51adf939e0e8c114c189d95d923f754Steve BlockDOMErrorMonitor.prototype.assertLowerSeverity = function(id, severity) { 306356b8defb51adf939e0e8c114c189d95d923f754Steve Block var i; 307356b8defb51adf939e0e8c114c189d95d923f754Steve Block for (i = 0; i < this.allErrors.length; i++) { 308356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (this.allErrors[i].severity >= severity) { 309356b8defb51adf939e0e8c114c189d95d923f754Steve Block assertEquals(id, severity - 1, this.allErrors[i].severity); 310356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 311356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 312356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 313356b8defb51adf939e0e8c114c189d95d923f754Steve Block 314356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction UserDataNotification(operation, key, data, src, dst) { 315356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.operation = operation; 316356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.key = key; 317356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.data = data; 318356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.src = src; 319356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.dst = dst; 320356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 321356b8defb51adf939e0e8c114c189d95d923f754Steve Block 322356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction UserDataMonitor() { 323356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.allNotifications = new Array(); 324356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 325356b8defb51adf939e0e8c114c189d95d923f754Steve Block 326356b8defb51adf939e0e8c114c189d95d923f754Steve BlockUserDataMonitor.prototype.handle = function(operation, key, data, src, dst) { 327356b8defb51adf939e0e8c114c189d95d923f754Steve Block userDataMonitor.allNotifications[userDataMonitor.allNotifications.length] = 328356b8defb51adf939e0e8c114c189d95d923f754Steve Block new UserDataNotification(operation, key, data, src, dst); 329356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 330356b8defb51adf939e0e8c114c189d95d923f754Steve Block 331356b8defb51adf939e0e8c114c189d95d923f754Steve Block 332356b8defb51adf939e0e8c114c189d95d923f754Steve Block 333356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction HTMLBuilder() { 334356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.contentType = "text/html"; 335356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.supportedContentTypes = [ "text/html" ]; 336356b8defb51adf939e0e8c114c189d95d923f754Steve Block 337356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.supportsAsyncChange = false; 338356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.async = false; 339356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.fixedAttributeNames = [ 340356b8defb51adf939e0e8c114c189d95d923f754Steve Block "validating", "expandEntityReferences", "coalescing", 341356b8defb51adf939e0e8c114c189d95d923f754Steve Block "signed", "hasNullString", "ignoringElementContentWhitespace", "namespaceAware", "ignoringComments", "schemaValidating"]; 342356b8defb51adf939e0e8c114c189d95d923f754Steve Block 343356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.fixedAttributeValues = [false, true, false, true, true , false, false, false, false ]; 344356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.configurableAttributeNames = [ ]; 345356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.configurableAttributeValues = [ ]; 346356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.initializationError = null; 347356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.initializationFatalError = null; 348356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.skipIncompatibleTests = true; 349356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.documentURLs = new Array(); 350356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.documentVarnames = new Array(); 351356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 352356b8defb51adf939e0e8c114c189d95d923f754Steve Block 353356b8defb51adf939e0e8c114c189d95d923f754Steve BlockHTMLBuilder.prototype.hasFeature = function(feature, version) { 354356b8defb51adf939e0e8c114c189d95d923f754Steve Block return document.implementation.hasFeature(feature, version); 355356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 356356b8defb51adf939e0e8c114c189d95d923f754Steve Block 357356b8defb51adf939e0e8c114c189d95d923f754Steve BlockHTMLBuilder.prototype.getImplementation = function() { 358356b8defb51adf939e0e8c114c189d95d923f754Steve Block return document.implementation; 359356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 360356b8defb51adf939e0e8c114c189d95d923f754Steve Block 361356b8defb51adf939e0e8c114c189d95d923f754Steve BlockHTMLBuilder.prototype.preload = function(frame, varname, url) { 362356b8defb51adf939e0e8c114c189d95d923f754Steve Block var i; 363356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.documentVarnames[this.documentVarnames.length] = varname; 364356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.documentURLs[this.documentURLs.length] = url; 365356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (this.documentURLs.length > 1) { 366356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 367356b8defb51adf939e0e8c114c189d95d923f754Steve Block // if all the urls are not the same 368356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 369356b8defb51adf939e0e8c114c189d95d923f754Steve Block for (i = 1; i < this.documentURLs.length; i++) { 370356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (this.documentURLs[i] != this.documentURLs[0]) { 371356b8defb51adf939e0e8c114c189d95d923f754Steve Block throw "Tests with multiple loads of different documents are not currently supported"; 372356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 373356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 374356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 375356b8defb51adf939e0e8c114c189d95d923f754Steve Block return 1; 376356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 377356b8defb51adf939e0e8c114c189d95d923f754Steve Block 378356b8defb51adf939e0e8c114c189d95d923f754Steve BlockHTMLBuilder.prototype.cloneNode = function(srcNode, doc) { 379356b8defb51adf939e0e8c114c189d95d923f754Steve Block var clone = null; 380356b8defb51adf939e0e8c114c189d95d923f754Steve Block switch(srcNode.nodeType) { 381356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 382356b8defb51adf939e0e8c114c189d95d923f754Steve Block // element 383356b8defb51adf939e0e8c114c189d95d923f754Steve Block case 1: 384356b8defb51adf939e0e8c114c189d95d923f754Steve Block clone = doc.createElement(srcNode.nodeName.toLowerCase()); 385356b8defb51adf939e0e8c114c189d95d923f754Steve Block var attrs = srcNode.attributes; 386356b8defb51adf939e0e8c114c189d95d923f754Steve Block for(var i = 0; i < attrs.length; i++) { 387356b8defb51adf939e0e8c114c189d95d923f754Steve Block var srcAttr = attrs.item(i); 388356b8defb51adf939e0e8c114c189d95d923f754Steve Block clone.setAttribute(srcAttr.nodeName, srcAttr.nodeValue); 389356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 390356b8defb51adf939e0e8c114c189d95d923f754Steve Block var srcChild = srcNode.firstChild; 391356b8defb51adf939e0e8c114c189d95d923f754Steve Block while(srcChild != null) { 392356b8defb51adf939e0e8c114c189d95d923f754Steve Block var cloneChild = this.cloneNode(srcChild, doc); 393356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (cloneChild != null) { 394356b8defb51adf939e0e8c114c189d95d923f754Steve Block clone.appendChild(cloneChild); 395356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 396356b8defb51adf939e0e8c114c189d95d923f754Steve Block srcChild = srcChild.nextSibling; 397356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 398356b8defb51adf939e0e8c114c189d95d923f754Steve Block break; 399356b8defb51adf939e0e8c114c189d95d923f754Steve Block 400356b8defb51adf939e0e8c114c189d95d923f754Steve Block case 3: 401356b8defb51adf939e0e8c114c189d95d923f754Steve Block clone = doc.createTextNode(srcNode.nodeValue); 402356b8defb51adf939e0e8c114c189d95d923f754Steve Block break; 403356b8defb51adf939e0e8c114c189d95d923f754Steve Block 404356b8defb51adf939e0e8c114c189d95d923f754Steve Block case 4: 405356b8defb51adf939e0e8c114c189d95d923f754Steve Block clone = doc.createCDATASection(srcNode.nodeValue); 406356b8defb51adf939e0e8c114c189d95d923f754Steve Block break; 407356b8defb51adf939e0e8c114c189d95d923f754Steve Block 408356b8defb51adf939e0e8c114c189d95d923f754Steve Block case 7: 409356b8defb51adf939e0e8c114c189d95d923f754Steve Block clone = doc.createProcessingInstruction(srcNode.nodeValue); 410356b8defb51adf939e0e8c114c189d95d923f754Steve Block break; 411356b8defb51adf939e0e8c114c189d95d923f754Steve Block 412356b8defb51adf939e0e8c114c189d95d923f754Steve Block case 8: 413356b8defb51adf939e0e8c114c189d95d923f754Steve Block clone = doc.createComment(srcNode.nodeValue); 414356b8defb51adf939e0e8c114c189d95d923f754Steve Block break; 415356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 416356b8defb51adf939e0e8c114c189d95d923f754Steve Block return clone; 417356b8defb51adf939e0e8c114c189d95d923f754Steve Block 418356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 419356b8defb51adf939e0e8c114c189d95d923f754Steve Block 420356b8defb51adf939e0e8c114c189d95d923f754Steve Block 421356b8defb51adf939e0e8c114c189d95d923f754Steve BlockHTMLBuilder.prototype.load = function(frame, varname, url) { 422356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (this.documentVarnames[0] == varname) { 423356b8defb51adf939e0e8c114c189d95d923f754Steve Block return document; 424356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 425356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 426356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 427356b8defb51adf939e0e8c114c189d95d923f754Steve Block // not a perfect way to do this 428356b8defb51adf939e0e8c114c189d95d923f754Steve Block // Document.cloneNode is implementation dependent but exists in L1 429356b8defb51adf939e0e8c114c189d95d923f754Steve Block // and implemented in IE. The alternative brute force copy 430356b8defb51adf939e0e8c114c189d95d923f754Steve Block // only works in L2 or higher implementations and can't copy 431356b8defb51adf939e0e8c114c189d95d923f754Steve Block // entity and notation definitions, etc. 432356b8defb51adf939e0e8c114c189d95d923f754Steve Block var clone = null; 433356b8defb51adf939e0e8c114c189d95d923f754Steve Block try { 434356b8defb51adf939e0e8c114c189d95d923f754Steve Block clone = document.cloneNode(true); 435356b8defb51adf939e0e8c114c189d95d923f754Steve Block } catch(ex) { 436356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 437356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (clone == null) { 438356b8defb51adf939e0e8c114c189d95d923f754Steve Block clone = document.implementation.createDocument( 439356b8defb51adf939e0e8c114c189d95d923f754Steve Block document.documentElement.namespaceURI, 440356b8defb51adf939e0e8c114c189d95d923f754Steve Block document.documentElement.nodeName, 441356b8defb51adf939e0e8c114c189d95d923f754Steve Block null); 442356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 443356b8defb51adf939e0e8c114c189d95d923f754Steve Block // Work-around since 444356b8defb51adf939e0e8c114c189d95d923f754Steve Block // Safari does not create document element 445356b8defb51adf939e0e8c114c189d95d923f754Steve Block // create document. 446356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (clone.documentElement == null) { 447356b8defb51adf939e0e8c114c189d95d923f754Steve Block clone.appendChild(clone.createElement(document.documentElement.nodeName)); 448356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 449356b8defb51adf939e0e8c114c189d95d923f754Steve Block var attrs = document.documentElement.attributes; 450356b8defb51adf939e0e8c114c189d95d923f754Steve Block for(var i = 0; i < attrs.length; i++) { 451356b8defb51adf939e0e8c114c189d95d923f754Steve Block var srcAttr = attrs.item(i); 452356b8defb51adf939e0e8c114c189d95d923f754Steve Block clone.documentElement.setAttribute(srcAttr.nodeName, srcAttr.nodeValue); 453356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 454356b8defb51adf939e0e8c114c189d95d923f754Steve Block 455356b8defb51adf939e0e8c114c189d95d923f754Steve Block var srcNode = document.firstChild; 456356b8defb51adf939e0e8c114c189d95d923f754Steve Block while(srcNode != null && srcNode.nodeType != 1) { 457356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (srcNode.nodeType != 10) { 458356b8defb51adf939e0e8c114c189d95d923f754Steve Block var cloneNode = this.cloneNode(srcNode, clone); 459356b8defb51adf939e0e8c114c189d95d923f754Steve Block clone.insertBefore(cloneNode, clone.documentElement); 460356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 461356b8defb51adf939e0e8c114c189d95d923f754Steve Block srcNode = srcNode.nextSibling; 462356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 463356b8defb51adf939e0e8c114c189d95d923f754Steve Block srcNode = document.documentElement.nextSibling; 464356b8defb51adf939e0e8c114c189d95d923f754Steve Block while(srcNode != null) { 465356b8defb51adf939e0e8c114c189d95d923f754Steve Block var cloneNode = this.cloneNode(srcNode, clone); 466356b8defb51adf939e0e8c114c189d95d923f754Steve Block clone.appendChild(cloneNode); 467356b8defb51adf939e0e8c114c189d95d923f754Steve Block srcNode = srcNode.nextSibling; 468356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 469356b8defb51adf939e0e8c114c189d95d923f754Steve Block srcNode = document.documentElement.firstChild; 470356b8defb51adf939e0e8c114c189d95d923f754Steve Block while(srcNode != null) { 471356b8defb51adf939e0e8c114c189d95d923f754Steve Block var cloneNode = this.cloneNode(srcNode, clone); 472356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (cloneNode != null) { 473356b8defb51adf939e0e8c114c189d95d923f754Steve Block clone.documentElement.appendChild(cloneNode); 474356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 475356b8defb51adf939e0e8c114c189d95d923f754Steve Block srcNode = srcNode.nextSibling; 476356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 477356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 478356b8defb51adf939e0e8c114c189d95d923f754Steve Block return clone; 479356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 480356b8defb51adf939e0e8c114c189d95d923f754Steve Block 481356b8defb51adf939e0e8c114c189d95d923f754Steve BlockHTMLBuilder.prototype.getImplementationAttribute = function(attr) { 482356b8defb51adf939e0e8c114c189d95d923f754Steve Block for (var i = 0; i < this.fixedAttributeNames.length; i++) { 483356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (this.fixedAttributeNames[i] == attr) { 484356b8defb51adf939e0e8c114c189d95d923f754Steve Block return this.fixedAttributeValues[i]; 485356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 486356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 487356b8defb51adf939e0e8c114c189d95d923f754Steve Block throw "Unrecognized implementation attribute: " + attr; 488356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 489356b8defb51adf939e0e8c114c189d95d923f754Steve Block 490356b8defb51adf939e0e8c114c189d95d923f754Steve Block 491356b8defb51adf939e0e8c114c189d95d923f754Steve BlockHTMLBuilder.prototype.setImplementationAttribute = function(attribute, value) { 492356b8defb51adf939e0e8c114c189d95d923f754Steve Block var supported = this.getImplementationAttribute(attribute); 493356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (supported != value) { 494356b8defb51adf939e0e8c114c189d95d923f754Steve Block this.initializationError = "HTML loader does not support " + attribute + "=" + value; 495356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 496356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 497356b8defb51adf939e0e8c114c189d95d923f754Steve Block 498356b8defb51adf939e0e8c114c189d95d923f754Steve BlockHTMLBuilder.prototype.canSetImplementationAttribute = function(attribute, value) { 499356b8defb51adf939e0e8c114c189d95d923f754Steve Block var supported = this.getImplementationAttribute(attribute); 500356b8defb51adf939e0e8c114c189d95d923f754Steve Block return (supported == value); 501356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 502356b8defb51adf939e0e8c114c189d95d923f754Steve Block 503356b8defb51adf939e0e8c114c189d95d923f754Steve Block 504356b8defb51adf939e0e8c114c189d95d923f754Steve Block 505356b8defb51adf939e0e8c114c189d95d923f754Steve Block 506356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction createConfiguredBuilder() { 507356b8defb51adf939e0e8c114c189d95d923f754Steve Block return new HTMLBuilder(); 508356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 509356b8defb51adf939e0e8c114c189d95d923f754Steve Block 510356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction catchInitializationError(buildr, ex) { 511356b8defb51adf939e0e8c114c189d95d923f754Steve Block buildr.initializationError = ex; 512356b8defb51adf939e0e8c114c189d95d923f754Steve Block buildr.initializationFatalError = ex; 513356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 514356b8defb51adf939e0e8c114c189d95d923f754Steve Block 515356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction toLowerArray(src) { 516356b8defb51adf939e0e8c114c189d95d923f754Steve Block var newArray = new Array(); 517356b8defb51adf939e0e8c114c189d95d923f754Steve Block var i; 518356b8defb51adf939e0e8c114c189d95d923f754Steve Block for (i = 0; i < src.length; i++) { 519356b8defb51adf939e0e8c114c189d95d923f754Steve Block newArray[i] = src[i].toLowerCase(); 520356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 521356b8defb51adf939e0e8c114c189d95d923f754Steve Block return newArray; 522356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 523356b8defb51adf939e0e8c114c189d95d923f754Steve Block 524356b8defb51adf939e0e8c114c189d95d923f754Steve Block 525356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction checkFeature(feature, version) 526356b8defb51adf939e0e8c114c189d95d923f754Steve Block{ 527356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (!builder.hasFeature(feature, version)) 528356b8defb51adf939e0e8c114c189d95d923f754Steve Block { 529356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 530356b8defb51adf939e0e8c114c189d95d923f754Steve Block // don't throw exception so that users can select to ignore the precondition 531356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 532356b8defb51adf939e0e8c114c189d95d923f754Steve Block builder.initializationError = "builder does not support feature " + feature + " version " + version; 533356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 534356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 535356b8defb51adf939e0e8c114c189d95d923f754Steve Block 536356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction setResult(resultType, message) { 537356b8defb51adf939e0e8c114c189d95d923f754Steve Block var testName = getTargetURI(); 538356b8defb51adf939e0e8c114c189d95d923f754Steve Block document.open(); 539356b8defb51adf939e0e8c114c189d95d923f754Steve Block document.writeln("<html><head>"); 540356b8defb51adf939e0e8c114c189d95d923f754Steve Block document.writeln("<meta HTTP-EQUIV='Content-Type' CONTENT='text/html; CHARSET=utf-8'>"); 541356b8defb51adf939e0e8c114c189d95d923f754Steve Block document.write("<title>"); 542356b8defb51adf939e0e8c114c189d95d923f754Steve Block document.write(testName + ":" + resultType); 543356b8defb51adf939e0e8c114c189d95d923f754Steve Block document.write("</title></head><body><table width='100%' border='1' style='color:"); 544356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (resultType == null) { 545356b8defb51adf939e0e8c114c189d95d923f754Steve Block document.writeln("green'><tr><td>Test:</td><td>" + testName + "</td></tr><tr><td>Status:</td><td>Success</td></tr>"); 546356b8defb51adf939e0e8c114c189d95d923f754Steve Block } else { 547356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (resultType == "skip") { 548356b8defb51adf939e0e8c114c189d95d923f754Steve Block document.writeln("blue'><tr><td>Test:</td><td>" + testName + "</td></tr><tr><td>Status:</td><td>Skipped</td></tr>"); 549356b8defb51adf939e0e8c114c189d95d923f754Steve Block } else { 550356b8defb51adf939e0e8c114c189d95d923f754Steve Block document.writeln("red'><tr><td>Test:</td><td>" + testName + "</td><td></tr><tr><td>Status:</td><td>" + resultType + "</td></tr>"); 551356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 552356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 553356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (message != null) { 554356b8defb51adf939e0e8c114c189d95d923f754Steve Block document.writeln("<tr><td>Detail:</td><td>" + message + "</td></tr>"); 555356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 556356b8defb51adf939e0e8c114c189d95d923f754Steve Block document.write("</table></body></html>"); 557356b8defb51adf939e0e8c114c189d95d923f754Steve Block document.close(); 558356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (parent != window) { 559356b8defb51adf939e0e8c114c189d95d923f754Steve Block parent.setResult(testName, resultType, message); 560356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 561356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 562356b8defb51adf939e0e8c114c189d95d923f754Steve Block 563356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction checkInitialization(buildr, testname) { 564356b8defb51adf939e0e8c114c189d95d923f754Steve Block return buildr.initializationError; 565356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 566356b8defb51adf939e0e8c114c189d95d923f754Steve Block 567356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction preload(docRef, varname, href) { 568356b8defb51adf939e0e8c114c189d95d923f754Steve Block return builder.preload(docRef, varname, href); 569356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 570356b8defb51adf939e0e8c114c189d95d923f754Steve Block 571356b8defb51adf939e0e8c114c189d95d923f754Steve Block 572356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction load(docRef, varname, href) { 573356b8defb51adf939e0e8c114c189d95d923f754Steve Block return builder.load(docRef, varname, href); 574356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 575356b8defb51adf939e0e8c114c189d95d923f754Steve Block 576356b8defb51adf939e0e8c114c189d95d923f754Steve Block 577356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction getImplementationAttribute(attr) { 578356b8defb51adf939e0e8c114c189d95d923f754Steve Block return builder.getImplementationAttribute(attr); 579356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 580356b8defb51adf939e0e8c114c189d95d923f754Steve Block 581356b8defb51adf939e0e8c114c189d95d923f754Steve Block 582356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction setImplementationAttribute(attribute, value) { 583356b8defb51adf939e0e8c114c189d95d923f754Steve Block builder.setImplementationAttribute(attribute, value); 584356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 585356b8defb51adf939e0e8c114c189d95d923f754Steve Block 586356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction createXPathEvaluator(doc) { 587356b8defb51adf939e0e8c114c189d95d923f754Steve Block try { 588356b8defb51adf939e0e8c114c189d95d923f754Steve Block return doc.getFeature("XPath", null); 589356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 590356b8defb51adf939e0e8c114c189d95d923f754Steve Block catch(ex) { 591356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 592356b8defb51adf939e0e8c114c189d95d923f754Steve Block return doc; 593356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 594356b8defb51adf939e0e8c114c189d95d923f754Steve Block 595356b8defb51adf939e0e8c114c189d95d923f754Steve Block 596356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction getImplementation() { 597356b8defb51adf939e0e8c114c189d95d923f754Steve Block return builder.getImplementation(); 598356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 599356b8defb51adf939e0e8c114c189d95d923f754Steve Block 600356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction assertEquals(id, expected, actual) { 601356b8defb51adf939e0e8c114c189d95d923f754Steve Block var myActual; 602356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (expected != actual) { 603356b8defb51adf939e0e8c114c189d95d923f754Steve Block myActual = actual; 604356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (actual == null) { 605356b8defb51adf939e0e8c114c189d95d923f754Steve Block myActual = "null"; 606356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 607356b8defb51adf939e0e8c114c189d95d923f754Steve Block throw "failure:" + id + ": assertEquals failed, actual " + myActual + ", expected " + expected + "."; 608356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 609356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 610356b8defb51adf939e0e8c114c189d95d923f754Steve Block 611356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction assertNull(id, actual) { 612356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (actual != null) { 613356b8defb51adf939e0e8c114c189d95d923f754Steve Block throw "failure:" + id + ": assertNull failed, actual " + actual; 614356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 615356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 616356b8defb51adf939e0e8c114c189d95d923f754Steve Block 617356b8defb51adf939e0e8c114c189d95d923f754Steve Block 618356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction assertTrue(id, actual) { 619356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (!actual) { 620356b8defb51adf939e0e8c114c189d95d923f754Steve Block throw "failure:" + id + ": assertTrue failed"; 621356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 622356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 623356b8defb51adf939e0e8c114c189d95d923f754Steve Block 624356b8defb51adf939e0e8c114c189d95d923f754Steve Block 625356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction assertFalse(id, actual) { 626356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (actual) { 627356b8defb51adf939e0e8c114c189d95d923f754Steve Block throw "failure:" + id + ": assertTrue failed"; 628356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 629356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 630356b8defb51adf939e0e8c114c189d95d923f754Steve Block 631356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction assertNotNull(id, actual) { 632356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (actual == null) { 633356b8defb51adf939e0e8c114c189d95d923f754Steve Block throw "failure:" + id + ": assertNotNull failed"; 634356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 635356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 636356b8defb51adf939e0e8c114c189d95d923f754Steve Block 637356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction fail(id) { 638356b8defb51adf939e0e8c114c189d95d923f754Steve Block throw "failure:" + id + ": fail"; 639356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 640356b8defb51adf939e0e8c114c189d95d923f754Steve Block 641356b8defb51adf939e0e8c114c189d95d923f754Steve Block 642356b8defb51adf939e0e8c114c189d95d923f754Steve Block 643356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction getSuffix(contentType) { 644356b8defb51adf939e0e8c114c189d95d923f754Steve Block switch(contentType) { 645356b8defb51adf939e0e8c114c189d95d923f754Steve Block case "text/xml": 646356b8defb51adf939e0e8c114c189d95d923f754Steve Block return ".xml"; 647356b8defb51adf939e0e8c114c189d95d923f754Steve Block 648356b8defb51adf939e0e8c114c189d95d923f754Steve Block case "application/xhtml+xml": 649356b8defb51adf939e0e8c114c189d95d923f754Steve Block return ".xhtml"; 650356b8defb51adf939e0e8c114c189d95d923f754Steve Block 651356b8defb51adf939e0e8c114c189d95d923f754Steve Block case "image/svg+xml": 652356b8defb51adf939e0e8c114c189d95d923f754Steve Block return ".svg"; 653356b8defb51adf939e0e8c114c189d95d923f754Steve Block 654356b8defb51adf939e0e8c114c189d95d923f754Steve Block case "text/mathml": 655356b8defb51adf939e0e8c114c189d95d923f754Steve Block return ".mml"; 656356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 657356b8defb51adf939e0e8c114c189d95d923f754Steve Block return ".html"; 658356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 659356b8defb51adf939e0e8c114c189d95d923f754Steve Block 660356b8defb51adf939e0e8c114c189d95d923f754Steve Block 661356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction getResourceURI(name, scheme, contentType) { 662356b8defb51adf939e0e8c114c189d95d923f754Steve Block var base = document.documentURI; 663356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (base == null) { 664356b8defb51adf939e0e8c114c189d95d923f754Steve Block base = ""; 665356b8defb51adf939e0e8c114c189d95d923f754Steve Block } else { 666356b8defb51adf939e0e8c114c189d95d923f754Steve Block base = base.substring(0, base.lastIndexOf('/') + 1) + "files/"; 667356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 668356b8defb51adf939e0e8c114c189d95d923f754Steve Block return base + name + getSuffix(contentType); 669356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 670356b8defb51adf939e0e8c114c189d95d923f754Steve Block 671356b8defb51adf939e0e8c114c189d95d923f754Steve Block 672356b8defb51adf939e0e8c114c189d95d923f754Steve Block 673356b8defb51adf939e0e8c114c189d95d923f754Steve Blockfunction startTest() { 674356b8defb51adf939e0e8c114c189d95d923f754Steve Block 675356b8defb51adf939e0e8c114c189d95d923f754Steve Block// 676356b8defb51adf939e0e8c114c189d95d923f754Steve Block// WebKit modification: 18-August-2005 677356b8defb51adf939e0e8c114c189d95d923f754Steve Block// 678356b8defb51adf939e0e8c114c189d95d923f754Steve Block// Inform the test controller that this test has a text-format result and so should 679356b8defb51adf939e0e8c114c189d95d923f754Steve Block// be dumped as text, and also that the dump should not occur automatically. 680356b8defb51adf939e0e8c114c189d95d923f754Steve Block// 681356b8defb51adf939e0e8c114c189d95d923f754Steve Blockif (window.layoutTestController) { 682356b8defb51adf939e0e8c114c189d95d923f754Steve Block layoutTestController.dumpAsText(); 683356b8defb51adf939e0e8c114c189d95d923f754Steve Block layoutTestController.waitUntilDone(); 684356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 685356b8defb51adf939e0e8c114c189d95d923f754Steve Block// 686356b8defb51adf939e0e8c114c189d95d923f754Steve Block// End WebKit modification 687356b8defb51adf939e0e8c114c189d95d923f754Steve Block// 688356b8defb51adf939e0e8c114c189d95d923f754Steve Block 689356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 690356b8defb51adf939e0e8c114c189d95d923f754Steve Block // invoke test setup 691356b8defb51adf939e0e8c114c189d95d923f754Steve Block // 692356b8defb51adf939e0e8c114c189d95d923f754Steve Block setUpPage(); 693356b8defb51adf939e0e8c114c189d95d923f754Steve Block 694356b8defb51adf939e0e8c114c189d95d923f754Steve Block try { 695356b8defb51adf939e0e8c114c189d95d923f754Steve Block runTest(); 696356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (builder.initializationError == null) { 697356b8defb51adf939e0e8c114c189d95d923f754Steve Block setResult(null, null); 698356b8defb51adf939e0e8c114c189d95d923f754Steve Block } else { 699356b8defb51adf939e0e8c114c189d95d923f754Steve Block setResult("skip", builder.initializationError); 700356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 701356b8defb51adf939e0e8c114c189d95d923f754Steve Block } catch(ex) { 702356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (typeof(ex.substring) != 'undefined' && ex.substring(0, 8) == "failure:") { 703356b8defb51adf939e0e8c114c189d95d923f754Steve Block setResult("failure", ex.substring(8)); 704356b8defb51adf939e0e8c114c189d95d923f754Steve Block } else { 705356b8defb51adf939e0e8c114c189d95d923f754Steve Block setResult("error", ex); 706356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 707356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 708356b8defb51adf939e0e8c114c189d95d923f754Steve Block 709356b8defb51adf939e0e8c114c189d95d923f754Steve Block// 710356b8defb51adf939e0e8c114c189d95d923f754Steve Block// WebKit modification: 18-August-2005 711356b8defb51adf939e0e8c114c189d95d923f754Steve Block// 712356b8defb51adf939e0e8c114c189d95d923f754Steve Block// Inform the test controller that this test is complete, so it's time to dump. 713356b8defb51adf939e0e8c114c189d95d923f754Steve Block// 714356b8defb51adf939e0e8c114c189d95d923f754Steve Block if (window.layoutTestController) { 715356b8defb51adf939e0e8c114c189d95d923f754Steve Block layoutTestController.notifyDone(); 716356b8defb51adf939e0e8c114c189d95d923f754Steve Block } 717356b8defb51adf939e0e8c114c189d95d923f754Steve Block// 718356b8defb51adf939e0e8c114c189d95d923f754Steve Block// End WebKit modification 719356b8defb51adf939e0e8c114c189d95d923f754Steve Block// 720356b8defb51adf939e0e8c114c189d95d923f754Steve Block 721356b8defb51adf939e0e8c114c189d95d923f754Steve Block} 722