90 lines
2.4 KiB
JavaScript
90 lines
2.4 KiB
JavaScript
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];
|
|
}
|