6 padding:
0px
0px
0px
0px;
14 function print(message
, color
)
16 var paragraph
= document
.createElement("div");
17 paragraph
.appendChild(document
.createTextNode(message
));
18 paragraph
.style
.fontFamily
= "monospace";
20 paragraph
.style
.color
= color
;
21 document
.getElementById("console").appendChild(paragraph
);
24 function shouldBe(a
, b
)
28 print("PASS: " + a
+ " should be " + b
+ " and is.", "green");
30 print("FAIL: " + a
+ " should be " + b
+ " but instead is " + evalA
+ ".", "red");
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("");
44 function parentEventListener(e
)
46 print("DOM EVENT AFTER GARBAGE COLLECTION");
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;
58 shouldBe("event.myCustomProperty", 1);
59 event
= null; // clear JS reference
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);
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
);
82 child
.fireEvent("onclick");
88 if (window
.layoutTestController
)
89 layoutTestController
.dumpAsText();
93 print("DOM OBJECTS BEFORE GARBAGE COLLECTION:");
94 testProperties(expectedResultsBeforeGC
);
98 print("DOM OBJECTS AFTER GARBAGE COLLECTION:");
99 testProperties(expectedResultsAfterGC
);
104 var objectsToTest
= [
105 "document.implementation", // DOMImplementation
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",
115 "document.body.childNodes",
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
= [
188 var expectedResultsAfterGC
= [
226 function generateProperties()
228 for (var i
= 0; i
< objectsToTest
.length
; i
++) { // >
230 eval(objectsToTest
[i
] + ".myCustomProperty = 1;");
232 print("NOT SUPPORTED: " + objectsToTest
[i
] + "[ " + e
.message
+ " ]");
237 function testProperties(expectedResults
)
239 for (var i
= 0; i
< objectsToTest
.length
; i
++) { // >
241 shouldBe(objectsToTest
[i
] + ".myCustomProperty", expectedResults
[i
]);
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>
257 <div id='console'
></div>
262 <object name=
"object"></object>
264 <table><tbody><tr></tr></tbody></table>