97 lines
2.2 KiB
HTML
97 lines
2.2 KiB
HTML
<p>
|
|
This page tests for a caching error when transitioning prototypes away from being dictionaries.
|
|
If the test passes, you'll see a series of PASS messages below.
|
|
</p>
|
|
|
|
<pre id="console"></pre>
|
|
|
|
<script>
|
|
if (window.testRunner)
|
|
testRunner.dumpAsText();
|
|
|
|
function log(s)
|
|
{
|
|
if (this.document)
|
|
document.getElementById("console").appendChild(document.createTextNode(s + "\n"));
|
|
else
|
|
print(s + "\n");
|
|
}
|
|
|
|
function shouldBe(aDescription, a, b)
|
|
{
|
|
if (a === b) {
|
|
log("PASS: " + aDescription + " should be " + b + " and is.");
|
|
} else {
|
|
log("FAIL: " + aDescription + " should be " + b + " but instead is " + a + ".");
|
|
}
|
|
}
|
|
|
|
// Prototype tests
|
|
(function () {
|
|
function getB(o)
|
|
{
|
|
return o.b;
|
|
}
|
|
|
|
var o = {
|
|
__proto__ : {
|
|
a: "a",
|
|
b: "b"
|
|
}
|
|
};
|
|
|
|
delete o.__proto__.a;
|
|
o.__proto__.c = "c"; // if o.__proto__ un-dictionaries itself, .c will overwrite the deleted .b slot.
|
|
for (var i = 0; i < 3; ++i)
|
|
shouldBe("getB(o)", getB(o), "b");
|
|
|
|
var o2 = {
|
|
__proto__ : {
|
|
a2: "a2",
|
|
b: "b"
|
|
}
|
|
};
|
|
|
|
delete o2.__proto__.a2;
|
|
o2.__proto__.c2 = "c2"; // if o2.__proto__ un-dictionaries itself, .c2 will overwrite the deleted .b slot.
|
|
for (var i = 0; i < 3; ++i)
|
|
shouldBe("getB(o2)", getB(o2), "b");
|
|
})();
|
|
|
|
// Prototype chain tests
|
|
(function () {
|
|
function getB(o)
|
|
{
|
|
return o.b;
|
|
}
|
|
|
|
var o = {
|
|
__proto__ : {
|
|
__proto__ : {
|
|
a: "a",
|
|
b: "b"
|
|
}
|
|
}
|
|
};
|
|
|
|
delete o.__proto__.__proto__.a;
|
|
o.__proto__.__proto__.c = "c"; // if o.__proto__.__proto__ un-dictionaries itself, .c will overwrite the deleted .b slot.
|
|
for (var i = 0; i < 3; ++i)
|
|
shouldBe("getB(o)", getB(o), "b");
|
|
|
|
var o2 = {
|
|
__proto__ : {
|
|
__proto__ : {
|
|
a2: "a",
|
|
b: "b"
|
|
}
|
|
}
|
|
};
|
|
|
|
delete o2.__proto__.__proto__.a2;
|
|
o2.__proto__.__proto__.c = "c"; // if o2.__proto__.__proto__ un-dictionaries itself, .c will overwrite the deleted .b slot.
|
|
for (var i = 0; i < 3; ++i)
|
|
shouldBe("getB(o2)", getB(o2), "b");
|
|
})();
|
|
</script>
|