1c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block/*
2c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve BlockCopyright (c) 2001-2005 World Wide Web Consortium,
3c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block(Massachusetts Institute of Technology, European Research Consortium
4c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfor Informatics and Mathematics, Keio University). All
5c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve BlockRights Reserved. This work is distributed under the W3C(r) Software License [1] in the
6c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockhope that it will be useful, but WITHOUT ANY WARRANTY; without even
7c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockthe implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
8c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
9c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block[1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
10c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block*/
11c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
12c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  function assertSize(descr, expected, actual) {
13c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var actualSize;
14c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    assertNotNull(descr, actual);
15c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    actualSize = actual.length;
16c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    assertEquals(descr, expected, actualSize);
17c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  }
18c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
19c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  function assertEqualsAutoCase(context, descr, expected, actual) {
20c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  	if (builder.contentType == "text/html") {
21c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  	    if(context == "attribute") {
22c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  	    	assertEquals(descr, expected.toLowerCase(), actual.toLowerCase());
23c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  	    } else {
24c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  	        assertEquals(descr, expected.toUpperCase(), actual);
25c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  	    }
26c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  	} else {
27c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  		assertEquals(descr, expected, actual);
28c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  	}
29c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  }
30c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
31c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
32c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  function assertEqualsCollectionAutoCase(context, descr, expected, actual) {
33c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    //
34c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    //  if they aren't the same size, they aren't equal
35c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    assertEquals(descr, expected.length, actual.length);
36c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
37c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    //
38c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    //  if there length is the same, then every entry in the expected list
39c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    //     must appear once and only once in the actual list
40c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var expectedLen = expected.length;
41c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var expectedValue;
42c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var actualLen = actual.length;
43c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var i;
44c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var j;
45c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var matches;
46c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    for(i = 0; i < expectedLen; i++) {
47c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        matches = 0;
48c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        expectedValue = expected[i];
49c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        for(j = 0; j < actualLen; j++) {
50c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        	if (builder.contentType == "text/html") {
51c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        		if (context == "attribute") {
52c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        			if (expectedValue.toLowerCase() == actual[j].toLowerCase()) {
53c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        				matches++;
54c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        			}
55c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        		} else {
56c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        			if (expectedValue.toUpperCase() == actual[j]) {
57c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        				matches++;
58c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        			}
59c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        		}
60c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        	} else {
61c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block            	if(expectedValue == actual[j]) {
62c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block                	matches++;
63c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block                }
64c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block            }
65c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        }
66c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        if(matches == 0) {
67c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block            assert(descr + ": No match found for " + expectedValue,false);
68c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        }
69c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        if(matches > 1) {
70c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block            assert(descr + ": Multiple matches found for " + expectedValue, false);
71c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        }
72c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    }
73c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  }
74c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
75c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  function assertEqualsCollection(descr, expected, actual) {
76c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    //
77c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    //  if they aren't the same size, they aren't equal
78c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    assertEquals(descr, expected.length, actual.length);
79c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    //
80c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    //  if there length is the same, then every entry in the expected list
81c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    //     must appear once and only once in the actual list
82c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var expectedLen = expected.length;
83c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var expectedValue;
84c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var actualLen = actual.length;
85c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var i;
86c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var j;
87c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var matches;
88c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    for(i = 0; i < expectedLen; i++) {
89c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        matches = 0;
90c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        expectedValue = expected[i];
91c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        for(j = 0; j < actualLen; j++) {
92c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block            if(expectedValue == actual[j]) {
93c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block                matches++;
94c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block            }
95c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        }
96c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        if(matches == 0) {
97c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block            assert(descr + ": No match found for " + expectedValue,false);
98c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        }
99c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        if(matches > 1) {
100c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block            assert(descr + ": Multiple matches found for " + expectedValue, false);
101c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        }
102c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    }
103c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  }
104c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
105c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
106c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  function assertEqualsListAutoCase(context, descr, expected, actual) {
107c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	var minLength = expected.length;
108c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	if (actual.length < minLength) {
109c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	    minLength = actual.length;
110c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	}
111c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    //
112c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    for(var i = 0; i < minLength; i++) {
113c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block		assertEqualsAutoCase(context, descr, expected[i], actual[i]);
114c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    }
115c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    //
116c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    //  if they aren't the same size, they aren't equal
117c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    assertEquals(descr, expected.length, actual.length);
118c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  }
119c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
120c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
121c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  function assertEqualsList(descr, expected, actual) {
122c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	var minLength = expected.length;
123c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	if (actual.length < minLength) {
124c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	    minLength = actual.length;
125c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	}
126c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    //
127c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    for(var i = 0; i < minLength; i++) {
128c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        if(expected[i] != actual[i]) {
129c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block			assertEquals(descr, expected[i], actual[i]);
130c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        }
131c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    }
132c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    //
133c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    //  if they aren't the same size, they aren't equal
134c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    assertEquals(descr, expected.length, actual.length);
135c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  }
136c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
137c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  function assertInstanceOf(descr, type, obj) {
138c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    if(type == "Attr") {
139c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        assertEquals(descr,2,obj.nodeType);
140c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        var specd = obj.specified;
141c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    }
142c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  }
143c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
144c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  function assertSame(descr, expected, actual) {
145c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    if(expected != actual) {
146c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        assertEquals(descr, expected.nodeType, actual.nodeType);
147c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        assertEquals(descr, expected.nodeValue, actual.nodeValue);
148c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    }
149c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  }
150c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
151c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  function assertURIEquals(assertID, scheme, path, host, file, name, query, fragment, isAbsolute, actual) {
152c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    //
153c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    //  URI must be non-null
154c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    assertNotNull(assertID, actual);
155c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
156c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var uri = actual;
157c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
158c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var lastPound = actual.lastIndexOf("#");
159c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var actualFragment = "";
160c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    if(lastPound != -1) {
161c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        //
162c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        //   substring before pound
163c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        //
164c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        uri = actual.substring(0,lastPound);
165c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        actualFragment = actual.substring(lastPound+1);
166c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    }
167c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    if(fragment != null) assertEquals(assertID,fragment, actualFragment);
168c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
169c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var lastQuestion = uri.lastIndexOf("?");
170c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var actualQuery = "";
171c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    if(lastQuestion != -1) {
172c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        //
173c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        //   substring before pound
174c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        //
175c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        uri = actual.substring(0,lastQuestion);
176c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        actualQuery = actual.substring(lastQuestion+1);
177c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    }
178c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    if(query != null) assertEquals(assertID, query, actualQuery);
179c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
180c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var firstColon = uri.indexOf(":");
181c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var firstSlash = uri.indexOf("/");
182c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var actualPath = uri;
183c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var actualScheme = "";
184c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    if(firstColon != -1 && firstColon < firstSlash) {
185c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        actualScheme = uri.substring(0,firstColon);
186c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        actualPath = uri.substring(firstColon + 1);
187c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    }
188c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
189c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    if(scheme != null) {
190c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        assertEquals(assertID, scheme, actualScheme);
191c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    }
192c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
193c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    if(path != null) {
194c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        assertEquals(assertID, path, actualPath);
195c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    }
196c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
197c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    if(host != null) {
198c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        var actualHost = "";
199c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        if(actualPath.substring(0,2) == "//") {
200c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block            var termSlash = actualPath.substring(2).indexOf("/") + 2;
201c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block            actualHost = actualPath.substring(0,termSlash);
202c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        }
203c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        assertEquals(assertID, host, actualHost);
204c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    }
205c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
206c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    if(file != null || name != null) {
207c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        var actualFile = actualPath;
208c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        var finalSlash = actualPath.lastIndexOf("/");
209c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        if(finalSlash != -1) {
210c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block            actualFile = actualPath.substring(finalSlash+1);
211c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        }
212c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        if (file != null) {
213c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block            assertEquals(assertID, file, actualFile);
214c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        }
215c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        if (name != null) {
216c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block            var actualName = actualFile;
217c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block            var finalDot = actualFile.lastIndexOf(".");
218c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block            if (finalDot != -1) {
219c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block                actualName = actualName.substring(0, finalDot);
220c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block            }
221c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block            assertEquals(assertID, name, actualName);
222c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        }
223c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    }
224c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
225c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    if(isAbsolute != null) {
226c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        assertEquals(assertID, isAbsolute, actualPath.substring(0,1) == "/");
227c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    }
228c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  }
229c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
230c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
231c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block// size() used by assertSize element
232c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction size(collection)
233c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block{
234c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  return collection.length;
235c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
236c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
237c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction same(expected, actual)
238c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block{
239c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  return expected === actual;
240c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
241c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
242c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction equalsAutoCase(context, expected, actual) {
243c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	if (builder.contentType == "text/html") {
244c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block		if (context == "attribute") {
245c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block			return expected.toLowerCase() == actual;
246c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block		}
247c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block		return expected.toUpperCase() == actual;
248c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	}
249c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	return expected == actual;
250c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
251c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
252c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction toLowerArray(src) {
253c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   var newArray = new Array();
254c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   var i;
255c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   for (i = 0; i < src.length; i++) {
256c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      newArray[i] = src[i].toLowerCase();
257c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   }
258c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   return newArray;
259c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
260c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
261c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction createTempURI(scheme) {
262c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   if (scheme == "http") {
263c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   	  return "http://localhost:8080/webdav/tmp" + Math.floor(Math.random() * 100000) + ".xml";
264c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   }
265c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   return "file:///tmp/domts" + Math.floor(Math.random() * 100000) + ".xml";
266c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
267c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
268c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
269c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
270c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction EventMonitor() {
271c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  this.atEvents = new Array();
272c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  this.bubbledEvents = new Array();
273c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  this.capturedEvents = new Array();
274c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  this.allEvents = new Array();
275c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
276c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
277c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve BlockEventMonitor.prototype.handleEvent = function(evt) {
278c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    switch(evt.eventPhase) {
279c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block       case 1:
280c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block       monitor.capturedEvents[monitor.capturedEvents.length] = evt;
281c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block       break;
282c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
283c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block       case 2:
284c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block       monitor.atEvents[monitor.atEvents.length] = evt;
285c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block       break;
286c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
287c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block       case 3:
288c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block       monitor.bubbledEvents[monitor.bubbledEvents.length] = evt;
289c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block       break;
290c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    }
291c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    monitor.allEvents[monitor.allEvents.length] = evt;
292c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
293c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
294c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction DOMErrorImpl(err) {
295c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  this.severity = err.severity;
296c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  this.message = err.message;
297c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  this.type = err.type;
298c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  this.relatedException = err.relatedException;
299c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  this.relatedData = err.relatedData;
300c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  this.location = err.location;
301c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
302c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
303c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
304c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
305c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction DOMErrorMonitor() {
306c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  this.allErrors = new Array();
307c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
308c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
309c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve BlockDOMErrorMonitor.prototype.handleError = function(err) {
310c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    errorMonitor.allErrors[errorMonitor.allErrors.length] = new DOMErrorImpl(err);
311c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
312c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
313c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve BlockDOMErrorMonitor.prototype.assertLowerSeverity = function(id, severity) {
314c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var i;
315c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    for (i = 0; i < this.allErrors.length; i++) {
316c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        if (this.allErrors[i].severity >= severity) {
317c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block           assertEquals(id, severity - 1, this.allErrors[i].severity);
318c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        }
319c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    }
320c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
321c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
322c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction UserDataNotification(operation, key, data, src, dst) {
323c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    this.operation = operation;
324c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    this.key = key;
325c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    this.data = data;
326c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    this.src = src;
327c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    this.dst = dst;
328c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
329c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
330c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction UserDataMonitor() {
331c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	this.allNotifications = new Array();
332c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
333c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
334c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve BlockUserDataMonitor.prototype.handle = function(operation, key, data, src, dst) {
335c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    userDataMonitor.allNotifications[userDataMonitor.allNotifications.length] =
336c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block         new UserDataNotification(operation, key, data, src, dst);
337c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
338c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
339c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
340c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
341c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction HTMLBuilder() {
342c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    this.contentType = "application/xhtml+xml";
343c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    this.supportedContentTypes = [ "application/xhtml+xml" ];
344c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
345c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    this.supportsAsyncChange = false;
346c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    this.async = false;
347c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    this.fixedAttributeNames = [
348c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        "validating",  "expandEntityReferences", "coalescing",
349c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        "signed", "hasNullString", "ignoringElementContentWhitespace", "namespaceAware", "ignoringComments", "schemaValidating"];
350c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
351c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    this.fixedAttributeValues = [false,  true, false, true, true , false, true, false, false ];
352c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    this.configurableAttributeNames = [ ];
353c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    this.configurableAttributeValues = [ ];
354c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    this.initializationError = null;
355c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    this.initializationFatalError = null;
356c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    this.skipIncompatibleTests = true;
357c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    this.documentURLs = new Array();
358c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    this.documentVarnames = new Array();
359c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
360c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
361c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve BlockHTMLBuilder.prototype.hasFeature = function(feature, version) {
362c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    return document.implementation.hasFeature(feature, version);
363c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
364c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
365c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve BlockHTMLBuilder.prototype.getImplementation = function() {
366c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  return document.implementation;
367c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
368c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
369c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve BlockHTMLBuilder.prototype.preload = function(frame, varname, url) {
370c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  var i;
371c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  this.documentVarnames[this.documentVarnames.length] = varname;
372c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  this.documentURLs[this.documentURLs.length] = url;
373c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  if (this.documentURLs.length > 1) {
374c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block     //
375c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block     //   if all the urls are not the same
376c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block     //
377c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block     for (i = 1; i < this.documentURLs.length; i++) {
378c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block         if (this.documentURLs[i] != this.documentURLs[0]) {
379c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block             throw "Tests with multiple loads of different documents are not currently supported";
380c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block         }
381c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block     }
382c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  }
383c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  return 1;
384c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
385c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
386c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve BlockHTMLBuilder.prototype.cloneNode = function(srcNode, doc) {
387c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   var clone = null;
388c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   switch(srcNode.nodeType) {
389c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      //
390c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      //  element
391c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      case 1:
392c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      clone = doc.createElementNS(srcNode.namespaceURI, srcNode.nodeName);
393c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      var attrs = srcNode.attributes;
394c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      for(var i = 0; i < attrs.length; i++) {
395c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block          var srcAttr = attrs.item(i);
396c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block          clone.setAttributeNS(srcAttr.namespaceURI, srcAttr.nodeName, srcAttr.nodeValue);
397c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      }
398c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      var srcChild = srcNode.firstChild;
399c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      while(srcChild != null) {
400c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block         var cloneChild = this.cloneNode(srcChild, doc);
401c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block         if (cloneChild != null) {
402c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block             clone.appendChild(cloneChild);
403c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block         }
404c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block         srcChild = srcChild.nextSibling;
405c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      }
406c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      break;
407c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
408c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      case 3:
409c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      clone = doc.createTextNode(srcNode.nodeValue);
410c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      break;
411c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
412c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      case 4:
413c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      clone = doc.createCDATASection(srcNode.nodeValue);
414c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      break;
415c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
416c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      case 5:
417c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      clone = doc.createEntityReference(srcNode.nodeName);
418c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      break;
419c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
420c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      case 7:
421c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      clone = doc.createProcessingInstruction(srcNode.target, srcNode.data);
422c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      break;
423c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
424c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      case 8:
425c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      clone = doc.createComment(srcNode.nodeValue);
426c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      break;
427c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   }
428c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   return clone;
429c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
430c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
431c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
432c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
433c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve BlockHTMLBuilder.prototype.load = function(frame, varname, url) {
434c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  if (this.documentVarnames[0] == varname) {
435c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  	return document;
436c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  }
437c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  //
438c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  //
439c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  //  not a perfect way to do this
440c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  //    Document.cloneNode is implementation dependent but exists in L1
441c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  //       and implemented in IE.  The alternative brute force copy
442c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  //       only works in L2 or higher implementations and can't copy
443c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  //       entity and notation definitions, etc.
444c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  var clone = null;
445c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  try {
446c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      clone = document.cloneNode(true);
447c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  } catch(ex) {
448c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  }
449c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  if (clone == null) {
450c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      clone = document.implementation.createDocument(
451c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block          document.documentElement.namespaceURI,
452c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block          document.documentElement.nodeName,
453c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block          null);
454c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      //
455c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      //   Work-around since
456c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      //   Safari does not create document element
457c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      //      create document.
458c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      if (clone.documentElement == null) {
459c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block           clone.appendChild(clone.createElementNS(
460c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block              document.documentElement.namespaceURI,
461c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block              document.documentElement.nodeName));
462c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      }
463c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      var attrs = document.documentElement.attributes;
464c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      for(var i = 0; i < attrs.length; i++) {
465c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block          var srcAttr = attrs.item(i);
466c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block          clone.documentElement.setAttributeNS(
467c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block             srcAttr.namespaceURI, srcAttr.nodeName, srcAttr.nodeValue);
468c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      }
469c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
470c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      var srcNode = document.firstChild;
471c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      while(srcNode != null && srcNode.nodeType != 1) {
472c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block          if (srcNode.nodeType != 10) {
473c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block          	 var cloneNode = this.cloneNode(srcNode, clone);
474c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block             clone.insertBefore(cloneNode, clone.documentElement);
475c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block           }
476c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block           srcNode = srcNode.nextSibling;
477c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      }
478c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      srcNode = document.documentElement.nextSibling;
479c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      while(srcNode != null) {
480c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block          var cloneNode = this.cloneNode(srcNode, clone);
481c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block          clone.appendChild(cloneNode);
482c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block          srcNode = srcNode.nextSibling;
483c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      }
484c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      srcNode = document.documentElement.firstChild;
485c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      while(srcNode != null) {
486c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block          var cloneNode = this.cloneNode(srcNode, clone);
487c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block          if (cloneNode != null) {
488c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block             clone.documentElement.appendChild(cloneNode);
489c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block          }
490c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block          srcNode = srcNode.nextSibling;
491c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      }
492c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  }
493c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  return clone;
494c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
495c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
496c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve BlockHTMLBuilder.prototype.getImplementationAttribute = function(attr) {
497c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    for (var i = 0; i < this.fixedAttributeNames.length; i++) {
498c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        if (this.fixedAttributeNames[i] == attr) {
499c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block            return this.fixedAttributeValues[i];
500c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        }
501c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    }
502c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    throw "Unrecognized implementation attribute: " + attr;
503c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
504c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
505c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
506c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve BlockHTMLBuilder.prototype.setImplementationAttribute = function(attribute, value) {
507c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var supported = this.getImplementationAttribute(attribute);
508c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    if (supported != value) {
509c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        this.initializationError = "HTML loader does not support " + attribute + "=" + value;
510c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    }
511c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
512c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
513c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve BlockHTMLBuilder.prototype.canSetImplementationAttribute = function(attribute, value) {
514c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var supported = this.getImplementationAttribute(attribute);
515c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    return (supported == value);
516c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
517c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
518c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
519c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
520c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
521c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction createConfiguredBuilder() {
522c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    return new HTMLBuilder();
523c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
524c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
525c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction catchInitializationError(buildr, ex) {
526c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   buildr.initializationError = ex;
527c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   buildr.initializationFatalError = ex;
528c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
529c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
530c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
531c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction checkFeature(feature, version)
532c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block{
533c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  if (!builder.hasFeature(feature, version))
534c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  {
535c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    //
536c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    //   don't throw exception so that users can select to ignore the precondition
537c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    //
538c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    builder.initializationError = "builder does not support feature " + feature + " version " + version;
539c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block  }
540c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
541c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
542c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction setResult(resultType, message) {
543c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   var testName = getTargetURI();
544c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   document.title = testName + ":" + resultType;
545c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   var xhtmlNS = "http://www.w3.org/1999/xhtml";
546c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   var newBody = document.createElementNS(xhtmlNS, "body");
547c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   var newTable = document.createElementNS(xhtmlNS, "table");
548c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   newTable.width = "100%";
549c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   newTable.border = "1";
550c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   newBody.appendChild(newTable);
551c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   var testRow = newTable.insertRow(-1);
552c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   var testDiv1 = testRow.insertCell(-1);
553c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   testDiv1.appendChild(document.createTextNode("Test"));
554c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   var testDiv2 = testRow.insertCell(-1);
555c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   testDiv2.appendChild(document.createTextNode(testName));
556c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   var statusRow = newTable.insertRow(-1);
557c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   var statusDiv1 = statusRow.insertCell(-1);
558c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   statusDiv1.appendChild(document.createTextNode("Status"));
559c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   var statusDiv2 = statusRow.insertCell(-1);
560c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   var style = "color:green";
561c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   if (resultType == null) {
562c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   		statusDiv2.appendChild(document.createTextNode("Success"));
563c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   } else {
564c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   		statusDiv2.appendChild(document.createTextNode(resultType));
565c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   		if (resultType == "skip") {
566c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   		    style = "color:blue";
567c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   		} else {
568c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   		    style = "color:red";
569c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   		}
570c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   }
571c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   newTable.setAttributeNS(null, "style", style);
572c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   if (message != null) {
573c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      var messageRow = newTable.insertRow(-1);
574c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   	  var messageDiv1 = messageRow.insertCell(-1);
575c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      messageDiv1.appendChild(document.createTextNode("Message"));
576c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      var messageDiv2 = messageRow.insertCell(-1);
577c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block      messageDiv2.appendChild(document.createTextNode((message instanceof Error) ? ("Line " + message.line + ": " + message.name) : message));
578c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   }
579c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   var oldBody = document.getElementsByTagName("body")[0];
580c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   oldBody.parentNode.replaceChild(newBody, oldBody);
581c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   if (parent != window && typeof(parent.setResult) != 'undefined') {
582c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block       parent.setResult(testName, resultType, message);
583c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   }
584c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
585c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
586c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction checkInitialization(buildr, testname) {
587c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   return buildr.initializationError;
588c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
589c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
590c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction preload(docRef, varname, href) {
591c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   return builder.preload(docRef, varname, href);
592c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
593c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
594c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
595c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction load(docRef, varname, href) {
596c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   return builder.load(docRef, varname, href);
597c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
598c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
599c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
600c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction getImplementationAttribute(attr) {
601c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    return builder.getImplementationAttribute(attr);
602c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
603c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
604c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
605c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction setImplementationAttribute(attribute, value) {
606c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    builder.setImplementationAttribute(attribute, value);
607c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
608c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
609c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction createXPathEvaluator(doc) {
610c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    try {
611c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        return doc.getFeature("XPath", null);
612c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    }
613c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    catch(ex) {
614c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    }
615c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    return doc;
616c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
617c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
618c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
619c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction getImplementation() {
620c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    return builder.getImplementation();
621c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
622c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
623c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction assertEquals(id, expected, actual) {
624c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   var myActual;
625c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   if (expected != actual) {
626c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block       myActual = actual;
627c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block       if (actual == null) {
628c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block          myActual = "null";
629c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block       }
630c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block       throw "failure:" + id + ": assertEquals failed, actual " + myActual + ", expected " + expected + ".";
631c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   }
632c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
633c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
634c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction assertNull(id, actual) {
635c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   if (actual != null) {
636c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block       throw "failure:" + id + ": assertNull failed, actual " + actual;
637c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   }
638c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
639c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
640c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
641c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction assertTrue(id, actual) {
642c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   if (!actual) {
643c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block       throw "failure:" + id + ": assertTrue failed";
644c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   }
645c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
646c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
647c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
648c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction assertFalse(id, actual) {
649c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   if (actual) {
650c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block       throw "failure:" + id +  ": assertTrue failed";
651c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   }
652c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
653c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
654c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction assertNotNull(id, actual) {
655c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   if (actual == null) {
656c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block       throw "failure:" + id + ": assertNotNull failed";
657c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block   }
658c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
659c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
660c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction fail(id) {
661c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    throw "failure:" + id +  ": fail";
662c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
663c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
664c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
665c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
666c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction getSuffix(contentType) {
667c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    switch(contentType) {
668c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        case "text/html":
669c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        return ".html";
670c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
671c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        case "text/xml":
672c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        return ".xml";
673c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
674c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        case "image/svg+xml":
675c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        return ".svg";
676c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
677c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        case "text/mathml":
678c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        return ".mml";
679c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    }
680c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    return ".xhtml";
681c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
682c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
683c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
684c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction getResourceURI(name, scheme, contentType) {
685c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    var base = document.documentURI;
686c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    if (base == null) {
687c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block       base = "";
688c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    } else {
689c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	   base = base.substring(0, base.lastIndexOf('/') + 1) + "files/";
690c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    }
691c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    return base + name + getSuffix(contentType);
692c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
693c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
694c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
695c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
696c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockfunction startTest() {
697c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
698c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block//
699c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block//  WebKit modification: 18-August-2005
700c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block//
701c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block//  Inform the test controller that this test has a text-format result and so should
702c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block//  be dumped as text, and also that the dump should not occur automatically.
703c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block//
704c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Blockif (window.layoutTestController) {
705c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    layoutTestController.dumpAsText();
706c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    layoutTestController.waitUntilDone();
707c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
708c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block//
709c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block//  End WebKit modification
710c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block//
711c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
712c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	//
713c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	//   invoke test setup
714c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	//
715c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	setUpPage();
716c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	try {
717c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	    runTest();
718c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	    if (builder.initializationError == null) {
719c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	       setResult(null, null);
720c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	    } else {
721c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	       setResult("skip", builder.initializationError);
722c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	    }
723c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	} catch(ex) {
724c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block	    if (typeof(ex.substring) != 'undefined' && ex.substring(0, 8) == "failure:") {
725c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block            setResult("failure", ex.substring(8));
726c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        } else {
727c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block            setResult("error", ex);
728c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        }
729c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    }
730c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
731c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block//
732c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block//  WebKit modification: 18-August-2005
733c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block//
734c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block//  Inform the test controller that this test is complete, so it's time to dump.
735c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block//
736c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    if (window.layoutTestController) {
737c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block        layoutTestController.notifyDone();
738c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block    }
739c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block//
740c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block//  End WebKit modification
741c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block//
742c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block
743c95a81d8cfc937ef06eedc21d60cce1aa1a92463Steve Block}
744