<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<body>
<script>
async_test(t => {
// Test that ResizeObserver and its callback function do not cause any crash.
// This test is considered as successful as long as the test doesn't crash.
// See also https://crbug.com/792604 and https://crbug.com/809784 .
let target_element = document.createElement('div');
document.body.appendChild(target_element);
// Run a bunch of ResizeObservers to expect high probability to cause a crash.
const num_of_observers = 100;
resize_observers = new Array(num_of_observers);
for (let i = 0; i < num_of_observers; ++i) {
resize_observers[i] = new ResizeObserver(entries => {
for (let i = 0; i < num_of_observers; ++i) {
if (resize_observers[i] === null) continue;
// An Element retains the callback functions that are observing the
// change on size of the Element. Make the Element not retain the
// callback functions.
resize_observers[i].unobserve(target_element);
// Make the test itself not retain the callback functions.
resize_observers[i] = null;
}
// Try to collect the callback functions.
gc();
on_observed();
});
resize_observers[i].observe(target_element);
}
let observation_count = 0;
// Wait for the test to finish resize observations for a while.
let test_done_timer = null;
const test_done_timer_delay = 100;
const on_observed = () => {
++observation_count;
if (test_done_timer !== null)
return;
test_done_timer = setTimeout(() => {
// https://wicg.github.io/ResizeObserver/#broadcast-resize-notifications-h
// 3.3.4. Broadcast active observations is a bit ambiguous about whether
// |unobserve| in the callback functions takes effect immediately or
// delayed. Assuming that it must take effect immediately, the expected
// number of observations is 1.
assert_equals(observation_count, 1);
target_element.remove();
t.done();
}, test_done_timer_delay);
};
target_element.style.width = "42px";
}, "Tries to break wrapper-tracing and to make it crash.");
</script>
</body>