2008-11-04 Anders Carlsson <andersca@apple.com>
[webkit/qt.git] / LayoutTests / fast / dom / gc-9.html
blob0be1cae906342e8cd81c30885d171b1e8ed11c1c
1 <html>
2 <head>
3 <style>
4 body {
5 color: black;
6 padding: 0px 0px 0px 0px;
9 .hidden {
10 visibility: hidden;
12 </style>
13 <script>
14 function print(message, color)
16 var paragraph = document.createElement("div");
17 paragraph.appendChild(document.createTextNode(message));
18 paragraph.style.fontFamily = "monospace";
19 if (color)
20 paragraph.style.color = color;
21 document.getElementById("console").appendChild(paragraph);
24 function shouldBe(a, b)
26 var evalA = eval(a);
27 if (evalA == b)
28 print("PASS: " + a + " should be " + b + " and is.", "green");
29 else
30 print("FAIL: " + a + " should be " + b + " but instead is " + evalA + ".", "red");
33 function gc()
35 if (window.GCController)
36 return GCController.collect();
38 for (var i = 0; i < 10000; i++) { // > force garbage collection (FF requires about 9K allocations before a collect)
39 var s = new String("");
43 var event;
44 function parentEventListener(e)
46 print("DOM EVENT AFTER GARBAGE COLLECTION");
47 gc();
48 event = e;
49 shouldBe("event.myCustomProperty", 1);
50 event = null; // clear JS reference
53 function childEventListener(e)
55 print("DOM EVENT BEFORE GARBAGE COLLECTION");
56 e.myCustomProperty = 1;
57 event = e;
58 shouldBe("event.myCustomProperty", 1);
59 event = null; // clear JS reference
62 function testEvents()
64 var parent = document.createElement("p");
65 var child = document.createElement("p");
66 parent.appendChild(child);
67 document.body.appendChild(parent);
69 if (parent.addEventListener) {
70 child.addEventListener("click", childEventListener, false);
71 parent.addEventListener("click", parentEventListener, false);
72 } else {
73 child.attachEvent("onclick", childEventListener);
74 parent.attachEvent("onclick", parentEventListener);
77 if (document.createEvent) {
78 var event = document.createEvent("MouseEvents");
79 event.initEvent("click", true, true);
80 child.dispatchEvent(event);
81 } else {
82 child.fireEvent("onclick");
86 function test()
88 if (window.layoutTestController)
89 layoutTestController.dumpAsText();
91 generateProperties();
93 print("DOM OBJECTS BEFORE GARBAGE COLLECTION:");
94 testProperties(expectedResultsBeforeGC);
96 gc();
98 print("DOM OBJECTS AFTER GARBAGE COLLECTION:");
99 testProperties(expectedResultsAfterGC);
101 testEvents();
104 var objectsToTest = [
105 "document.implementation", // DOMImplementation
106 "document",
107 "document.body",
108 "document.body.attributes", // NamedNodeMap
109 "document.getElementsByTagName('body')", // NodeList
110 "document.getElementsByTagName('canvas')[0].getContext('2d')", // CanvasRenderingContext2D
111 "document.getElementsByTagName('canvas')[0].getContext('2d').createLinearGradient(0, 0, 0, 0)", // CanvasGradient
112 "document.getElementsByTagName('canvas')[0].getContext('2d').createPattern(new Image(), 'no-repeat')", // CanvasPattern
113 "document.getElementsByTagName('select')[0].options",
114 "document.all",
115 "document.body.childNodes",
117 "document.images",
118 "document.embeds",
119 "document.applets",
120 "document.links",
121 "document.forms",
122 "document.anchors",
123 "document.scripts",
125 "document.getElementsByTagName('form')[0].elements",
126 "document.getElementsByTagName('table')[0].rows",
127 "document.getElementsByTagName('table')[0].rows[0].cells",
128 "document.getElementsByTagName('table')[0].tBodies",
129 "document.getElementsByTagName('table')[0].tBodies[0].rows",
130 "document.body.children",
131 "document.getElementsByTagName('map')[0].areas",
133 "document.body.style",
134 "document.body.style.getPropertyCSSValue('color')",
135 "document.styleSheets",
136 "document.styleSheets[0]",
137 "document.styleSheets[0].cssRules",
138 "document.styleSheets[0].cssRules[0]",
140 "new XPathEvaluator()", // XPathEvaluator
141 "new XPathEvaluator().evaluate('/', document, null, 0, null)", // XPathResult
142 "document.createNSResolver(document)", // XPathNSResolver
143 "document.createExpression('/', document.createNSResolver(document))" // XPathExpression
145 // should not cache: NodeIterator, NodeFilter, TreeWalker, XMLHttpRequest
146 // add to test: DOMRect, MediaList, Counter, Range
150 var expectedResultsBeforeGC = [
155 undefined,
157 undefined,
158 undefined,
159 undefined,
160 undefined,
161 undefined,
162 undefined,
163 undefined,
164 undefined,
165 undefined,
166 undefined,
167 undefined,
168 undefined,
169 undefined,
170 undefined,
171 undefined,
172 undefined,
173 undefined,
174 undefined,
175 undefined,
180 undefined,
182 undefined,
183 undefined,
184 undefined,
185 undefined,
188 var expectedResultsAfterGC = [
189 undefined,
192 undefined,
193 undefined,
194 undefined,
195 undefined,
196 undefined,
197 undefined,
198 undefined,
199 undefined,
200 undefined,
201 undefined,
202 undefined,
203 undefined,
204 undefined,
205 undefined,
206 undefined,
207 undefined,
208 undefined,
209 undefined,
210 undefined,
211 undefined,
212 undefined,
213 undefined,
214 undefined,
215 undefined,
216 undefined,
217 undefined,
218 undefined,
219 undefined,
220 undefined,
221 undefined,
222 undefined,
223 undefined,
226 function generateProperties()
228 for (var i = 0; i < objectsToTest.length; i++) { // >
229 try {
230 eval(objectsToTest[i] + ".myCustomProperty = 1;");
231 } catch(e) {
232 print("NOT SUPPORTED: " + objectsToTest[i] + "[ " + e.message + " ]");
237 function testProperties(expectedResults)
239 for (var i = 0; i < objectsToTest.length; i++) { // >
240 try {
241 shouldBe(objectsToTest[i] + ".myCustomProperty", expectedResults[i]);
242 } catch(e) {
246 </script>
247 </head>
249 <body style="color: black" onload="test();">
250 <p>This page tests whether custom properties on DOM objects persist after garbage collection.</p>
251 <p>If the test passes, you'll see a series of 'PASS' messages below.</p>
252 <p>Because neither WinIE nor FF has reasonable or predictable behavior in this scenario, this
253 test just documents our behavior to ensure that we don't change it accidentally. It is not
254 a prescription for how things should behave.</p>
255 <hr>
257 <div id='console'></div>
259 <div class='hidden'>
260 <canvas></canvas>
261 <select></select>
262 <object name="object"></object>
263 <form></form>
264 <table><tbody><tr></tr></tbody></table>
265 <map></map>
266 </div>
268 </body>
269 </html>