Source code
Revision control
Copy as Markdown
Other Tools
function checkEquals(value, expected, valueCheckFn = (a, b) => a == b) {
if (!valueCheckFn(value, expected)) {
return `, got ${value}, expected ${expected}`;
}
return undefined;
}
function checkReflectedAttributeWithFrozenArrayValues(obj, values, valueCheck) {
if (!SimpleTest.isa(obj.reflectedHTMLAttribute, "Array")) {
return `, expected array`;
}
let failure = checkEquals(obj.reflectedHTMLAttribute.length, values.length);
if (!failure) {
for (let [i, v] of obj.reflectedHTMLAttribute.entries()) {
failure = checkEquals(values[i], v, valueCheck);
if (failure) {
break;
}
}
}
return failure;
}
function checkReflectedAttributeWithFrozenArray(
obj,
values,
suffix,
valueCheck
) {
let failure = checkReflectedAttributeWithFrozenArrayValues(
obj,
values,
valueCheck
);
ok(
!failure,
`Cached value on object for HTML reflected FrozenArray attribute should contain the right values ${suffix}${
failure || ""
}`
);
}
function testReflectedAttributeWithFrozenArray(win) {
let testObject = new win.TestReflectedHTMLAttribute();
ok(
testObject instanceof win.TestReflectedHTMLAttribute,
"Got a TestReflectedHTMLAttribute object"
);
is(
testObject.reflectedHTMLAttribute,
null,
"Initial value for HTML reflected FrozenArray attribute should be null"
);
let values = [win.document.head];
testObject.setReflectedHTMLAttributeValue(values);
checkReflectedAttributeWithFrozenArray(testObject, values, "after setting");
values = [win.document.body, win.document.body.firstElementChild];
testObject.setReflectedHTMLAttributeValue(values);
checkReflectedAttributeWithFrozenArray(testObject, values, "after resetting");
// Use a loop to ensure the JITs optimize the getter access.
let failure;
for (let i = 0; i < 10_000; i++) {
failure = checkReflectedAttributeWithFrozenArrayValues(testObject, values);
if (!failure) {
break;
}
if (i == 9_990) {
values = [win.document.head];
testObject.setReflectedHTMLAttributeValue(values);
}
}
ok(
!failure,
`Shouldn't use the cached value for HTML reflected FrozenArray attribute directly from JITted code${
failure || ""
}`
);
is(
testObject.reflectedHTMLAttribute,
testObject.reflectedHTMLAttribute,
"Getter for HTML reflected FrozenArray attribute should return the cached value"
);
return [testObject, values];
}