gecko-dev/layout/style/test/test_reframe_input.html
Emilio Cobos Álvarez a29afe9b5a Bug 1658302 - Don't reframe for changes to the placeholder attribute value. r=masayuki
We still reframe for additions / removals of the attribute because that
makes us create the placeholder <div>. We could avoid it if we created
it independently of the presence of the attribute but that seems like it
could regress perf for the case where there's no placeholder attribute,
which is probably common enough.

Differential Revision: https://phabricator.services.mozilla.com/D88724
2020-09-01 23:03:36 +00:00

49 lines
1.5 KiB
HTML

<!doctype html>
<meta charset="utf-8">
<title>Test for bug 1658302: We don't reframe for placeholder attribute value changes.</title>
<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez">
<script src="/tests/SimpleTest/SimpleTest.js"></script>
<input id="input">
<textarea id="textarea"></textarea>
<script>
SimpleTest.waitForExplicitFinish();
const utils = SpecialPowers.DOMWindowUtils;
function expectReframe(shouldHaveReframed, callback) {
document.documentElement.offsetTop;
const previousConstructCount = utils.framesConstructed;
const previousReflowCount = utils.framesReflowed;
callback();
document.documentElement.offsetTop;
isnot(previousReflowCount, utils.framesReflowed, "We should have reflowed");
(shouldHaveReframed ? isnot : is)(previousConstructCount,
utils.framesConstructed,
`We should ${shouldHaveReframed ? "" : "not"} have reframed`);
}
for (const control of document.querySelectorAll("input, textarea")) {
// Creating the placeholder attribute reframes right now.
//
// TODO: Could be avoided with some more work.
expectReframe(true, () => {
control.placeholder = "foo";
});
// Incrementally changing it should not reframe, just reflow.
expectReframe(false, () => {
control.placeholder = "bar";
});
// Removing the placeholder attribute reframes right now.
//
// TODO: Could maybe be avoided with some more work.
expectReframe(true, () => {
control.removeAttribute("placeholder");
});
}
SimpleTest.finish();
</script>