summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/css/mediaqueries/media-query-matches-in-iframe.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/css/mediaqueries/media-query-matches-in-iframe.html')
-rw-r--r--testing/web-platform/tests/css/mediaqueries/media-query-matches-in-iframe.html104
1 files changed, 104 insertions, 0 deletions
diff --git a/testing/web-platform/tests/css/mediaqueries/media-query-matches-in-iframe.html b/testing/web-platform/tests/css/mediaqueries/media-query-matches-in-iframe.html
new file mode 100644
index 0000000000..5828936732
--- /dev/null
+++ b/testing/web-platform/tests/css/mediaqueries/media-query-matches-in-iframe.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html>
+<html>
+<body>
+<link rel="help" href="https://drafts.csswg.org/mediaqueries-4/#mf-dimensions">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+
+async function createFrameAndUpdateLayout(test) {
+ const iframe = await new Promise((resolve) => {
+ const iframe = document.createElement('iframe');
+ iframe.style.width = '100px';
+ iframe.style.height = '100px';
+ iframe.onload = () => resolve(iframe);
+ document.body.appendChild(iframe);
+ test.add_cleanup(() => iframe.remove());
+ });
+ iframe.contentDocument.body.innerHTML = '<span>some content</span>';
+ window.preventOptimization1 = iframe.getBoundingClientRect();
+ window.preventOptimization2 = iframe.contentDocument.querySelector('span').getBoundingClientRect();
+ return iframe;
+}
+
+for (const query of ['(max-width: 150px)', '(width: 100px)', '(orientation: portrait)', '(aspect-ratio: 1/1)', '(max-aspect-ratio: 4/3)']) {
+ promise_test(async function () {
+ const iframe = await createFrameAndUpdateLayout(this);
+ const mediaQuery = iframe.contentWindow.matchMedia(query);
+ assert_true(mediaQuery.matches);
+ iframe.style.width = '200px';
+ assert_false(mediaQuery.matches);
+ }, `matchMedia('${query}').matches should update immediately`);
+}
+
+for (const query of ['(height: 100px)', '(max-height: 150px)', '(min-aspect-ratio: 3/4)']) {
+ promise_test(async function () {
+ const iframe = await createFrameAndUpdateLayout(this);
+ const mediaQuery = iframe.contentWindow.matchMedia(query);
+ assert_true(mediaQuery.matches);
+ iframe.style.height = '200px';
+ assert_false(mediaQuery.matches);
+ }, `matchMedia('${query}').matches should update immediately`);
+}
+
+for (const query of ['(min-height: 150px)', '(aspect-ratio: 1/2)']) {
+ promise_test(async function () {
+ const iframe = await createFrameAndUpdateLayout(this);
+ const mediaQuery = iframe.contentWindow.matchMedia(query);
+ assert_false(mediaQuery.matches);
+ iframe.style.height = '200px';
+ assert_true(mediaQuery.matches);
+ }, `matchMedia('${query}').matches should update immediately`);
+}
+
+for (const query of ['(min-width: 150px)', '(min-aspect-ratio: 4/3)']) {
+ promise_test(async function () {
+ const iframe = await createFrameAndUpdateLayout(this);
+ const mediaQuery = iframe.contentWindow.matchMedia(query);
+ assert_false(mediaQuery.matches);
+ iframe.style.width = '200px';
+ assert_true(mediaQuery.matches);
+ }, `matchMedia('${query}').matches should update immediately`);
+}
+
+for (const query of ['(max-width: 150px)', '(width: 100px)', '(orientation: portrait)', '(aspect-ratio: 1/1)', '(max-aspect-ratio: 4/3)']) {
+ promise_test(async function () {
+ const iframe = await createFrameAndUpdateLayout(this);
+ const mediaQuery = iframe.contentWindow.matchMedia(query);
+ let changes = 0;
+ mediaQuery.addEventListener('change', () => ++changes);
+ assert_true(mediaQuery.matches);
+ assert_equals(changes, 0);
+ iframe.style.width = '200px';
+ assert_false(mediaQuery.matches);
+ assert_equals(changes, 0);
+ await new Promise(requestAnimationFrame);
+ assert_false(mediaQuery.matches);
+ assert_equals(changes, 1);
+ }, `matchMedia('${query}') should not receive a change event until update the rendering step of HTML5 event loop`);
+}
+
+for (const query of ['(max-width: 150px)', '(width: 100px)', '(orientation: portrait)', '(aspect-ratio: 1/1)', '(max-aspect-ratio: 4/3)']) {
+ promise_test(async function () {
+ const iframe = await createFrameAndUpdateLayout(this);
+ const mediaQuery = iframe.contentWindow.matchMedia(query);
+ const events = [];
+ iframe.contentWindow.addEventListener('resize', () => {
+ assert_array_equals(events, []);
+ events.push('resize');
+ });
+ mediaQuery.addEventListener('change', () => events.push('change'));
+ assert_true(mediaQuery.matches);
+ assert_array_equals(events, []);
+ iframe.style.width = '200px';
+ assert_false(mediaQuery.matches);
+ assert_array_equals(events, []);
+ await new Promise(requestAnimationFrame);
+ assert_false(mediaQuery.matches);
+ assert_array_equals(events, ['resize', 'change']);
+ }, `matchMedia('${query}') should receive a change event after resize event on the window but before a requestAnimationFrame callback is called`);
+}
+
+</script>
+</body>
+</html>