diff options
Diffstat (limited to 'testing/web-platform/tests/resize-observer/observe.html')
-rw-r--r-- | testing/web-platform/tests/resize-observer/observe.html | 1007 |
1 files changed, 1007 insertions, 0 deletions
diff --git a/testing/web-platform/tests/resize-observer/observe.html b/testing/web-platform/tests/resize-observer/observe.html new file mode 100644 index 0000000000..f6015bef78 --- /dev/null +++ b/testing/web-platform/tests/resize-observer/observe.html @@ -0,0 +1,1007 @@ +<!doctype html> +<title>ResizeObserver tests</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="./resources/resizeTestHelper.js"></script> +<body> +<div id="log"></div> + +<script> +'use strict'; + +function test0() { + let t = createAndAppendElement("div"); + t.style.width = "100px"; + + let helper = new ResizeTestHelper( + "test0: simple observation", + [ + { + setup: observer => { + observer.observe(t); + t.style.width = "5px"; + }, + notify: entries => { + assert_equals(entries.length, 1, "1 pending notification"); + assert_equals(entries[0].target, t, "target is t"); + assert_equals(entries[0].contentRect.width, 5, "target width"); + } + } + ]); + return helper.start(() => t.remove()); +} + +function test1() { + let t = createAndAppendElement("div"); + t.style.width = "100px"; + + let helper = new ResizeTestHelper( + "test1: multiple observation on same element trigger only one", + [ + { + setup: observer => { + observer.observe(t); + observer.observe(t); + t.style.width = "10px"; + }, + notify: entries => { + assert_equals(entries.length, 1, "1 pending notification"); + } + } + ]); + return helper.start(() => t.remove()); +} + +function test2() { + test(() => { + assert_throws_js(TypeError, _=> { + let ro = new ResizeObserver(() => {}); + ro.observe({}); + }); + }, + "test2: throw exception when observing non-element" + ); + return Promise.resolve(); +} + +function test3() { + let t1 = createAndAppendElement("div"); + let t2 = createAndAppendElement("div"); + t1.style.width = "100px"; + t2.style.width = "100px"; + + let helper = new ResizeTestHelper( + "test3: disconnect stops all notifications", [ + { + setup: observer => { + observer.observe(t1); + observer.observe(t2); + observer.disconnect(); + t1.style.width = "30px"; + }, + notify: entries => { + assert_unreached("no entries should be observed"); + }, + timeout: () => { + // expected + } + } + ]); + return helper.start(() => { + t1.remove(); + t2.remove(); + }); +} + +function test4() { + let t1 = createAndAppendElement("div"); + let t2 = createAndAppendElement("div"); + t1.style.width = "100px"; + t2.style.width = "100px"; + + let helper = new ResizeTestHelper( + "test4: unobserve target stops notifications, unobserve non-observed does nothing", [ + { + setup: observer => { + observer.observe(t1); + observer.observe(t2); + observer.unobserve(t1); + observer.unobserve(document.body); + t1.style.width = "40px"; + t2.style.width = "40px"; + }, + notify: entries => { + assert_equals(entries.length, 1, "only t2"); + assert_equals(entries[0].target, t2, "t2 was observed"); + } + } + ]); + return helper.start(() => { + t1.remove(); + t2.remove(); + }); +} + +function test5() { + const img = new Image(); + img.style.width = "15px"; + img.style.height = "15px"; + img.src = "resources/image.png"; + + return img.decode().then(() => { + return new Promise(resolve => { + requestAnimationFrame(() => { + document.body.appendChild(img); + resolve(); + }); + }); + }).then(() => { + let helper = new ResizeTestHelper("test5: observe img",[ + { + setup: observer => { + observer.observe(img); + }, + notify: entries => { + return true; + } + }, + { + setup: observer => { + img.style.width = "15.5px"; + }, + notify: entries => { + assert_equals(entries.length, 1); + assert_equals(entries[0].contentRect.width, 15.5); + } + } + ]); + return helper.start(() => img.remove()); + }, () => { + // dummy test for dumping the error message. + test(_ => { + assert_unreached("decode image failed"); + }, "test5: observe img"); + }); +} + +function test6() { + let iframe = createAndAppendElement("iframe"); + iframe.width = "300px"; + iframe.height = "100px"; + iframe.style.display = "block"; + + let resolvePromise; + let promise = new Promise((resolve) => { + resolvePromise = resolve; + }); + let test = async_test('test6: iframe notifications'); + let testRequested = false; + test.add_cleanup(() => iframe.remove()); + + window.addEventListener('message', event => { + switch(event.data) { + case 'readyToTest': + if (!testRequested) { + iframe.contentWindow.postMessage('startTest', '*'); + testRequested = true; + } + break; + case 'success': + case 'fail': + window.requestAnimationFrame(() => { + resolvePromise(); + test.step(() => { + assert_equals(event.data, 'success'); + test.done(); + }); + }); + break; + } + }, false); + + iframe.src = "./resources/iframe.html"; + return new Promise(function(resolve, reject) { + iframe.onload = () => resolve(); + iframe.onerror = () => reject(); + }).then(() => { + return promise; + }).catch(error => { + test.step(() => { + assert_unreached("loading iframe is error"); + }); + }); +} + +function test7() { + let harnessTest = async_test("test7: callback.this"); + let resolvePromise; + let ro = new ResizeObserver( function(entries, obs) { + let callbackThis = this; + harnessTest.step(() => { + assert_equals(callbackThis, ro, "callback.this is ResizeObserver"); + assert_equals(obs, ro, "2nd argument is ResizeObserver"); + ro.disconnect(); + // every reference to RO must be null before test completes + // to avoid triggering test leak-detection + ro = null; + callbackThis = null; + obs = null; + harnessTest.step_timeout( _ => { + harnessTest.done(); + resolvePromise(); + }, 0); + }); + } + ); + + let t = createAndAppendElement("div"); + t.style.width = "100px"; + harnessTest.add_cleanup(() => t.remove()); + + ro.observe(t); + + return new Promise( (resolve, reject) => { + resolvePromise = resolve; + }); +} + +function test8() { + let t = createAndAppendElement("div"); + t.style.width = "100px"; + t.style.height = "100px"; + + let helper = new ResizeTestHelper( + "test8: simple content-box observation", + [ + { + setup: observer => { + + observer.observe(t, { box: "content-box" }); + }, + notify: entries => { + assert_equals(entries.length, 1, "1 pending notification"); + assert_equals(entries[0].target, t, "target is t"); + assert_equals(entries[0].contentRect.width, 100, "target width"); + assert_equals(entries[0].contentRect.height, 100, "target height"); + assert_equals(entries[0].contentRect.top, 0, "target top padding"); + assert_equals(entries[0].contentRect.left, 0, "target left padding"); + assert_equals(entries[0].contentBoxSize[0].inlineSize, 100, + "target content-box inline size"); + assert_equals(entries[0].contentBoxSize[0].blockSize, 100, + "target content-box block size"); + assert_equals(entries[0].borderBoxSize[0].inlineSize, 100, + "target border-box inline size"); + assert_equals(entries[0].borderBoxSize[0].blockSize, 100, + "target border-box block size"); + return true; + } + }, + { + setup: observer => { + t.style.width = "90px"; + t.style.height = "90px"; + }, + notify: entries => { + assert_equals(entries.length, 1, "1 pending notification"); + assert_equals(entries[0].target, t, "target is t"); + assert_equals(entries[0].contentRect.width, 90, "target width"); + assert_equals(entries[0].contentRect.height, 90, "target height"); + assert_equals(entries[0].contentRect.top, 0, "target top padding"); + assert_equals(entries[0].contentRect.left, 0, "target left padding"); + assert_equals(entries[0].contentBoxSize[0].inlineSize, 90, + "target content-box inline size"); + assert_equals(entries[0].contentBoxSize[0].blockSize, 90, + "target content-box block size"); + assert_equals(entries[0].borderBoxSize[0].inlineSize, 90, + "target border-box inline size"); + assert_equals(entries[0].borderBoxSize[0].blockSize, 90, + "target border-box block size"); + return true; + } + }, + { + setup: observer => { + t.style.padding = "5px"; + }, + notify: entries => { + assert_unreached("the 'content-box' ResizeObserver shouldn't fire " + + "for restyles that don't affect the content-box size"); + }, + timeout: () => { + // expected + // Note: the border-box size is 100px x 100px right now. + } + } + ]); + return helper.start(() => t.remove()); +} + +function test9() { + let t = createAndAppendElement("div"); + t.style.width = "100px"; + t.style.height = "100px"; + + let helper = new ResizeTestHelper( + "test9: simple content-box observation but keep border-box size unchanged", + [ + { + setup: observer => { + observer.observe(t, { box: "content-box" }); + }, + notify: entries => { + assert_equals(entries.length, 1, "1 pending notification"); + assert_equals(entries[0].target, t, "target is t"); + assert_equals(entries[0].contentRect.width, 100, "target width"); + assert_equals(entries[0].contentRect.height, 100, "target height"); + assert_equals(entries[0].contentRect.top, 0, "target top padding"); + assert_equals(entries[0].contentRect.left, 0, "target left padding"); + assert_equals(entries[0].contentBoxSize[0].inlineSize, 100, + "target content-box inline size"); + assert_equals(entries[0].contentBoxSize[0].blockSize, 100, + "target content-box block size"); + assert_equals(entries[0].borderBoxSize[0].inlineSize, 100, + "target border-box inline size"); + assert_equals(entries[0].borderBoxSize[0].blockSize, 100, + "target border-box block size"); + return true; + } + }, + { + setup: observer => { + // Keep the border-box size the same, and change the content-box size. + t.style.width = "92px"; + t.style.height = "92px"; + t.style.padding = "4px"; + }, + notify: entries => { + assert_equals(entries.length, 1, "1 pending notification"); + assert_equals(entries[0].target, t, "target is t"); + assert_equals(entries[0].contentRect.width, 92, "target width"); + assert_equals(entries[0].contentRect.height, 92, "target height"); + assert_equals(entries[0].contentRect.top, 4, "target top padding"); + assert_equals(entries[0].contentRect.left, 4, "target left padding"); + assert_equals(entries[0].contentBoxSize[0].inlineSize, 92, + "target content-box inline size"); + assert_equals(entries[0].contentBoxSize[0].blockSize, 92, + "target content-box block size"); + assert_equals(entries[0].borderBoxSize[0].inlineSize, 100, + "target border-box inline size"); + assert_equals(entries[0].borderBoxSize[0].blockSize, 100, + "target border-box block size"); + } + } + ]); + return helper.start(() => t.remove()); +} + +function test10() { + let t = createAndAppendElement("div"); + t.style.width = "100px"; + t.style.height = "100px"; + + let helper = new ResizeTestHelper( + "test10: simple border-box observation", + [ + { + setup: observer => { + observer.observe(t, { box: "border-box" }); + }, + notify: entries => { + assert_equals(entries.length, 1, "1 pending notification"); + assert_equals(entries[0].target, t, "target is t"); + assert_equals(entries[0].contentRect.width, 100, "target width"); + assert_equals(entries[0].contentRect.height, 100, "target height"); + assert_equals(entries[0].contentRect.top, 0, "target top padding"); + assert_equals(entries[0].contentRect.left, 0, "target left padding"); + assert_equals(entries[0].contentBoxSize[0].inlineSize, 100, + "target content-box inline size"); + assert_equals(entries[0].contentBoxSize[0].blockSize, 100, + "target content-box block size"); + assert_equals(entries[0].borderBoxSize[0].inlineSize, 100, + "target border-box inline size"); + assert_equals(entries[0].borderBoxSize[0].blockSize, 100, + "target border-box block size"); + return true; + } + }, + { + setup: observer => { + t.style.padding = "4px"; + }, + notify: entries => { + assert_equals(entries.length, 1, "1 pending notification"); + assert_equals(entries[0].target, t, "target is t"); + assert_equals(entries[0].contentRect.width, 100, "target width"); + assert_equals(entries[0].contentRect.height, 100, "target height"); + assert_equals(entries[0].contentRect.top, 4, "target top padding"); + assert_equals(entries[0].contentRect.left, 4, "target left padding"); + assert_equals(entries[0].contentBoxSize[0].inlineSize, 100, + "target content-box inline size"); + assert_equals(entries[0].contentBoxSize[0].blockSize, 100, + "target content-box block size"); + assert_equals(entries[0].borderBoxSize[0].inlineSize, 108, + "target border-box inline size"); + assert_equals(entries[0].borderBoxSize[0].blockSize, 108, + "target border-box block size"); + } + }, + { + setup: observer => { + t.style.width = "104px"; + t.style.height = "104px"; + t.style.padding = "2px"; + }, + notify: entries => { + assert_unreached("the 'border-box' ResizeObserver shouldn't fire " + + "for restyles that don't affect the border-box size"); + }, + timeout: () => { + // expected: 104 + 2 * 2 = 108. The border-box size is the same. + } + } + ]); + return helper.start(() => t.remove()); +} + +function test11() { + let wrapper = createAndAppendElement("div"); + wrapper.style.width = "100px"; + wrapper.style.height = "100px"; + wrapper.style.writingMode = "vertical-rl"; + let t = createAndAppendElement("div", wrapper); + t.style.inlineSize = "50px"; + t.style.blockSize = "50px"; + + let helper = new ResizeTestHelper( + "test11: simple observation with vertical writing mode", + [ + { + setup: observer => { + observer.observe(t); + }, + notify: entries => { + assert_equals(entries.length, 1, "1 pending notification"); + assert_equals(entries[0].target, t, "target is t"); + assert_equals(entries[0].contentRect.width, 50, "target width"); + assert_equals(entries[0].contentRect.height, 50, "target height"); + assert_equals(entries[0].contentBoxSize[0].inlineSize, 50, + "target content-box inline size"); + assert_equals(entries[0].contentBoxSize[0].blockSize, 50, + "target content-box block size"); + assert_equals(entries[0].borderBoxSize[0].inlineSize, 50, + "target border-box inline size"); + assert_equals(entries[0].borderBoxSize[0].blockSize, 50, + "target border-box block size"); + return true; + } + }, + { + setup: observer => { + t.style.blockSize = "75px"; + }, + notify: entries => { + assert_equals(entries.length, 1, "1 pending notification"); + assert_equals(entries[0].target, t, "target is t"); + assert_equals(entries[0].contentRect.width, 75, "target width"); + assert_equals(entries[0].contentRect.height, 50, "target height"); + assert_equals(entries[0].contentBoxSize[0].inlineSize, 50, + "target content-box inline size"); + assert_equals(entries[0].contentBoxSize[0].blockSize, 75, + "target content-box block size"); + assert_equals(entries[0].borderBoxSize[0].inlineSize, 50, + "target border-box inline size"); + assert_equals(entries[0].borderBoxSize[0].blockSize, 75, + "target border-box block size"); + } + } + ]); + + return helper.start(() => { + t.remove(); + wrapper.remove(); + }); +} + +function test12() { + let t = createAndAppendElement("div"); + t.style.writingMode = "vertical-lr"; + t.style.inlineSize = "100px"; + t.style.blockSize = "50px"; + + let helper = new ResizeTestHelper( + "test12: no observation is fired after the change of writing mode when " + + "box's specified size comes from logical size properties.", + [ + { + setup: observer => { + observer.observe(t); + }, + notify: entries => { + assert_equals(entries.length, 1, "1 pending notification"); + assert_equals(entries[0].target, t, "target is t"); + assert_equals(entries[0].contentRect.width, 50, "target width"); + assert_equals(entries[0].contentRect.height, 100, "target height"); + assert_equals(entries[0].contentBoxSize[0].inlineSize, 100, + "target content-box inline size"); + assert_equals(entries[0].contentBoxSize[0].blockSize, 50, + "target content-box block size"); + return true; + } + }, + { + setup: observer => { + t.style.writingMode = "horizontal-tb"; + }, + notify: entries => { + assert_unreached("the logical size of content-box doesn't change"); + }, + timeout: () => { + // expected: We don't change the logical size of content-box. + } + } + ]); + + return helper.start(() => t.remove()); +} + +function test13() { + let t = createAndAppendElement("div"); + t.style.writingMode = "vertical-lr"; + t.style.height = "100px"; + t.style.width = "50px"; + + let helper = new ResizeTestHelper( + "test13: an observation is fired after the change of writing mode when " + + "box's specified size comes from physical size properties.", + [ + { + setup: observer => { + observer.observe(t); + }, + notify: entries => { + assert_equals(entries.length, 1, "1 pending notification"); + assert_equals(entries[0].target, t, "target is t"); + assert_equals(entries[0].contentRect.width, 50, "target width"); + assert_equals(entries[0].contentRect.height, 100, "target height"); + assert_equals(entries[0].contentBoxSize[0].inlineSize, 100, + "target content-box inline size"); + assert_equals(entries[0].contentBoxSize[0].blockSize, 50, + "target content-box block size"); + return true; + } + }, + { + setup: observer => { + t.style.writingMode = "horizontal-tb"; + }, + notify: entries => { + assert_equals(entries.length, 1, "1 pending notification"); + assert_equals(entries[0].target, t, "target is t"); + assert_equals(entries[0].contentRect.width, 50, "target width"); + assert_equals(entries[0].contentRect.height, 100, "target height"); + assert_equals(entries[0].contentBoxSize[0].inlineSize, 50, + "target content-box inline size"); + assert_equals(entries[0].contentBoxSize[0].blockSize, 100, + "target content-box block size"); + }, + } + ]); + + return helper.start(() => t.remove()); +} + +function test14() { + let t = createAndAppendElement("div"); + t.style.width = "100px"; + t.style.height = "100px"; + + let helper = new ResizeTestHelper( + "test14: observe the same target but using a different box should " + + "override the previous one", + [ + { + setup: observer => { + observer.observe(t, { box: "content-box" }); + observer.observe(t, { box: "border-box" }); + }, + notify: entries => { + assert_equals(entries.length, 1, "1 pending notification"); + assert_equals(entries[0].target, t, "target is t"); + assert_equals(entries[0].contentRect.width, 100, "target width"); + assert_equals(entries[0].contentRect.height, 100, "target height"); + assert_equals(entries[0].contentRect.top, 0, "target top padding"); + assert_equals(entries[0].contentRect.left, 0, "target left padding"); + assert_equals(entries[0].contentBoxSize[0].inlineSize, 100, + "target content-box inline size"); + assert_equals(entries[0].contentBoxSize[0].blockSize, 100, + "target content-box block size"); + assert_equals(entries[0].borderBoxSize[0].inlineSize, 100, + "target border-box inline size"); + assert_equals(entries[0].borderBoxSize[0].blockSize, 100, + "target border-box block size"); + return true; + } + }, + { + setup: observer => { + // Change border-box size. + t.style.padding = "4px"; + }, + notify: entries => { + assert_equals(entries.length, 1, "1 pending notification"); + assert_equals(entries[0].target, t, "target is t"); + assert_equals(entries[0].contentRect.width, 100, "target width"); + assert_equals(entries[0].contentRect.height, 100, "target height"); + assert_equals(entries[0].contentRect.top, 4, "target top padding"); + assert_equals(entries[0].contentRect.left, 4, "target left padding"); + assert_equals(entries[0].contentBoxSize[0].inlineSize, 100, + "target content-box inline size"); + assert_equals(entries[0].contentBoxSize[0].blockSize, 100, + "target content-box block size"); + assert_equals(entries[0].borderBoxSize[0].inlineSize, 108, + "target border-box inline size"); + assert_equals(entries[0].borderBoxSize[0].blockSize, 108, + "target border-box block size"); + } + }, + { + setup: observer => { + // Change only content-box size. + t.style.width = "104px"; + t.style.height = "104px"; + t.style.padding = "2px"; + }, + notify: entries => { + assert_unreached("the 'border-box' ResizeObserver shouldn't fire " + + "for restyles that don't affect the border-box size"); + }, + timeout: () => { + // expected: 104 + 2 * 2 = 108. The border-box size is the same. + } + } + ]); + return helper.start(() => t.remove()); +} + +function test15() { + let t = createAndAppendElement("div"); + t.style.height = "100px"; + t.style.width = "50px"; + + let helper = new ResizeTestHelper( + "test15: an observation is fired with box dimensions 0 when element's " + + "display property is set to inline", + [ + { + setup: observer => { + observer.observe(t); + }, + notify: entries => { + assert_equals(entries.length, 1, "1 pending notification"); + assert_equals(entries[0].target, t, "target is t"); + assert_equals(entries[0].contentRect.width, 50, "target width"); + assert_equals(entries[0].contentRect.height, 100, "target height"); + assert_equals(entries[0].contentBoxSize[0].inlineSize, 50, + "target content-box inline size"); + assert_equals(entries[0].contentBoxSize[0].blockSize, 100, + "target content-box block size"); + assert_equals(entries[0].borderBoxSize[0].inlineSize, 50, + "target content-box inline size"); + assert_equals(entries[0].borderBoxSize[0].blockSize, 100, + "target content-box block size"); + return true; + } + }, + { + setup: observer => { + t.style.display = "inline"; + }, + notify: entries => { + assert_equals(entries[0].contentRect.width, 0, "target width"); + assert_equals(entries[0].contentRect.height, 0, "target height"); + assert_equals(entries[0].contentBoxSize[0].inlineSize, 0, + "target content-box inline size"); + assert_equals(entries[0].contentBoxSize[0].blockSize, 0, + "target content-box block size"); + assert_equals(entries[0].borderBoxSize[0].inlineSize, 0, + "target border-box inline size"); + assert_equals(entries[0].borderBoxSize[0].blockSize, 0, + "target border-box block size"); + } + } + ]); + + return helper.start(() => t.remove()); +} + +function test16() { + let t = createAndAppendElement("span"); + + let helper = new ResizeTestHelper( + // See: https://drafts.csswg.org/resize-observer/#intro. + "test16: observations fire once with 0x0 size for non-replaced inline elements", + [ + { + setup: observer => { + observer.observe(t); + }, + notify: entries => { + assert_equals(entries.length, 1, "1 pending notification"); + assert_equals(entries[0].target, t, "target is t"); + assert_equals(entries[0].contentRect.width, 0, "target width"); + assert_equals(entries[0].contentRect.height, 0, "target height"); + assert_equals(entries[0].contentBoxSize[0].inlineSize, 0, + "target content-box inline size"); + assert_equals(entries[0].contentBoxSize[0].blockSize, 0, + "target content-box block size"); + assert_equals(entries[0].borderBoxSize[0].inlineSize, 0, + "target border-box inline size"); + assert_equals(entries[0].borderBoxSize[0].blockSize, 0, + "target border-box block size"); + } + } + ]); + + return helper.start(() => t.remove()); + +} + +function test17() { + // <div id="outer"> + // <div id="nested"> + // </div> + // </div> + + let outer = document.createElement('div'); + outer.style.width = "100px"; + outer.style.height = "100px"; + outer.style.padding = "10px"; + outer.style.border = "1px solid blue" + let nested = document.createElement('div'); + nested.style.width = "60px"; + nested.style.height = "50px"; + nested.style.padding = "5%"; + nested.style.boxSizing = "border-box"; + nested.style.border = "5px solid black"; + outer.appendChild(nested); + document.body.appendChild(outer); + + let helper = new ResizeTestHelper( + "test17: Box sizing snd Resize Observer notifications", + [ + { + setup: observer => { + observer.observe(nested, { box: "content-box" }); + }, + notify: entries => { + assert_equals(entries.length, 1, "1 pending notification"); + assert_equals(entries[0].target, nested, "target is nested"); + assert_equals(entries[0].contentRect.width, 40, "target width"); + assert_equals(entries[0].contentRect.height, 30, "target height"); + assert_equals(entries[0].contentRect.top, 5, "target top padding"); + assert_equals(entries[0].contentRect.left, 5, "target left padding"); + assert_equals(entries[0].contentBoxSize[0].inlineSize, 40, + "target content-box inline size"); + assert_equals(entries[0].contentBoxSize[0].blockSize, 30, + "target content-box block size"); + assert_equals(entries[0].borderBoxSize[0].inlineSize, 60, + "target border-box inline size"); + assert_equals(entries[0].borderBoxSize[0].blockSize, 50, + "target border-box block size"); + return true; + } + }, + { + // Changes to a parent's dimensions with a child's padding set as a percentage + // should fire observation if content-box is being observed + setup: observer => { + outer.style.height = "200px"; + outer.style.width = "200px"; + }, + notify: entries => { + assert_equals(entries.length, 1, "1 pending notification"); + assert_equals(entries[0].target, nested, "target is nested"); + assert_equals(entries[0].contentRect.width, 30, "target width"); + assert_equals(entries[0].contentRect.height, 20, "target height"); + assert_equals(entries[0].contentRect.top, 10, "target top padding"); + assert_equals(entries[0].contentRect.left, 10, "target left padding"); + assert_equals(entries[0].contentBoxSize[0].inlineSize, 30, + "target content-box inline size"); + assert_equals(entries[0].contentBoxSize[0].blockSize, 20, + "target content-box block size"); + assert_equals(entries[0].borderBoxSize[0].inlineSize, 60, + "target border-box inline size"); + assert_equals(entries[0].borderBoxSize[0].blockSize, 50, + "target border-box block size"); + return true; + } + }, + { + // Changes to a parent's dimensions with a child's padding set as a percentage + // should fire observation if content-box is being observed + setup: observer => { + nested.style.border = "1px solid black"; + }, + notify: entries => { + assert_equals(entries.length, 1, "1 pending notification"); + assert_equals(entries[0].target, nested, "target is nested"); + assert_equals(entries[0].contentRect.width, 38, "target width"); + assert_equals(entries[0].contentRect.height, 28, "target height"); + assert_equals(entries[0].contentRect.top, 10, "target top padding"); + assert_equals(entries[0].contentRect.left, 10, "target left padding"); + assert_equals(entries[0].contentBoxSize[0].inlineSize, 38, + "target content-box inline size"); + assert_equals(entries[0].contentBoxSize[0].blockSize, 28, + "target content-box block size"); + assert_equals(entries[0].borderBoxSize[0].inlineSize, 60, + "target border-box inline size"); + assert_equals(entries[0].borderBoxSize[0].blockSize, 50, + "target border-box block size"); + return true; + } + }, + { + setup: observer => { + observer.observe(nested, { box: "border-box" }); + }, + notify: entries => { + assert_equals(entries.length, 1, "1 pending notification"); + assert_equals(entries[0].target, nested, "target is nested"); + assert_equals(entries[0].contentRect.width, 38, "target width"); + assert_equals(entries[0].contentRect.height, 28, "target height"); + assert_equals(entries[0].contentRect.top, 10, "target top padding"); + assert_equals(entries[0].contentRect.left, 10, "target left padding"); + assert_equals(entries[0].contentBoxSize[0].inlineSize, 38, + "target content-box inline size"); + assert_equals(entries[0].contentBoxSize[0].blockSize, 28, + "target content-box block size"); + assert_equals(entries[0].borderBoxSize[0].inlineSize, 60, + "target border-box inline size"); + assert_equals(entries[0].borderBoxSize[0].blockSize, 50, + "target border-box block size"); + return true; + } + }, + { + // Changes to a parent's dimensions with a child's padding set as a percentage + // should not fire observation if border-box is being observed + setup: observer => { + outer.style.height = "100px"; + }, + notify: entries => { + assert_unreached("No observation should be fired when nested border box remains constant"); + }, + timeout: () => { + // expected + } + }, + + ]); + return helper.start(() => nested.remove()); +} + +function test18() { + let t = createAndAppendElement("div"); + t.style.height = "100px"; + t.style.width = "50px"; + + let helper = new ResizeTestHelper( + "test18: an observation is fired when device-pixel-content-box is being " + + "observed", + [ + { + setup: observer => { + observer.observe(t, {box: "device-pixel-content-box"}); + }, + notify: entries => { + assert_equals(entries.length, 1, "1 pending notification"); + assert_equals(entries[0].target, t, "target is t"); + assert_equals(entries[0].contentRect.width, 50, "target width"); + assert_equals(entries[0].contentRect.height, 100, "target height"); + assert_equals(entries[0].contentBoxSize[0].inlineSize, 50, + "target content-box inline size"); + assert_equals(entries[0].contentBoxSize[0].blockSize, 100, + "target content-box block size"); + assert_equals(entries[0].borderBoxSize[0].inlineSize, 50, + "target border-box inline size"); + assert_equals(entries[0].borderBoxSize[0].blockSize, 100, + "target border-box block size"); + assert_equals(entries[0].devicePixelContentBoxSize[0].inlineSize, 50, + "target device-pixel-content-box inline size"); + assert_equals(entries[0].devicePixelContentBoxSize[0].blockSize, 100, + "target device-pixel-content-box block size"); + } + }, + ]); + + return helper.start(() => t.remove()); +} + +function test19() { + // zoom is not a standard css property, so we should check it first. If the + // browser doesn't support it, we skip this test. + if (!CSS.supports("zoom", "3")) { + return Promise.resolve(); + } + + let t = createAndAppendElement("div"); + t.style.height = "100px"; + t.style.width = "50px"; + + let helper = new ResizeTestHelper( + "test19: an observation is fired when device-pixel-content-box is being " + + "observed and zoom change", + [ + { + setup: observer => { + observer.observe(t, {box: "device-pixel-content-box"}); + }, + notify: entries => { + // No need to test again (see test18), so skip this event loop. + return true; + } + }, + { + setup: observer => { + document.body.style.zoom = 3; + }, + notify: entries => { + assert_equals(entries.length, 1, "1 pending notification"); + assert_equals(entries[0].target, t, "target is t"); + assert_equals(entries[0].contentRect.width, 50, "target width"); + assert_equals(entries[0].contentRect.height, 100, "target height"); + assert_equals(entries[0].contentBoxSize[0].inlineSize, 50, + "target content-box inline size"); + assert_equals(entries[0].contentBoxSize[0].blockSize, 100, + "target content-box block size"); + assert_equals(entries[0].borderBoxSize[0].inlineSize, 50, + "target border-box inline size"); + assert_equals(entries[0].borderBoxSize[0].blockSize, 100, + "target border-box block size"); + assert_equals(entries[0].devicePixelContentBoxSize[0].inlineSize, 150, + "target device-pixel-content-box inline size"); + assert_equals(entries[0].devicePixelContentBoxSize[0].blockSize, 300, + "target device-pixel-content-box block size"); + return true; + } + }, + { + setup: observer => { + document.body.style.zoom = ''; + }, + notify: entries => {} + } + ]); + + return helper.start(() => t.remove()); +} + +let guard; +test(_ => { + assert_own_property(window, "ResizeObserver"); + guard = async_test('guard'); +}, "ResizeObserver implemented") + +test0() + .then(() => test1()) + .then(() => test2()) + .then(() => test3()) + .then(() => test4()) + .then(() => test5()) + .then(() => test6()) + .then(() => test7()) + .then(() => test8()) + .then(() => test9()) + .then(() => test10()) + .then(() => test11()) + .then(() => test12()) + .then(() => test13()) + .then(() => test14()) + .then(() => test15()) + .then(() => test16()) + .then(() => test17()) + .then(() => test18()) + .then(() => test19()) + .then(() => guard.done()); + +</script> |