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