<!DOCTYPE html>
<title>Layout Instability: source attribution with redundant enclosure</title>
<link rel="help" href="https://wicg.github.io/layout-instability/" />
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-adapter.js"></script>
<script src="resources/util.js"></script>
<style>
body { margin: 0; }
#shifter {
position: relative; background: #def;
width: 300px; height: 200px;
}
#inner {
position: relative; background: #f97;
width: 100px; height: 100px;
}
#absfollow {
position: absolute; background: #ffd; opacity: 50%;
width: 350px; height: 200px; left: 0; top: 160px;
}
.stateB { top: 160px; }
.stateB #inner { left: 100px; }
.stateC ~ #absfollow { top: 0; }
</style>
<div id="shifter" class="stateA">
<div id="inner"></div>
</div>
<div id="absfollow"></div>
<script>
promise_test(async () => {
const watcher = new ScoreWatcher;
let shifter = document.querySelector("#shifter");
let absfollow = document.querySelector("#absfollow");
// Wait for the initial render to complete.
await waitForAnimationFrames(2);
shifter.className = "stateB";
await watcher.promise;
// Shift of #inner ignored as redundant, fully enclosed by #shifter.
cls_expect(watcher, {sources: [{
node: shifter,
previousRect: [0, 0, 300, 200],
currentRect: [0, 160, 300, 200]
}]});
shifter.className = "stateC";
await watcher.promise;
// Shift of #shifter ignored as redundant, fully enclosed by #absfollow.
cls_expect(watcher, {sources: [{
node: absfollow,
previousRect: [0, 160, 350, 200],
currentRect: [0, 0, 350, 200]
}]});
}, "Sources with redundant enclosure.");
</script>