| <!DOCTYPE html> | |
| <meta charset="utf-8"> | |
| <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1"> | |
| <title>scrollIntoView still scrolls the viewport programmatically when overflow-x or overflow-y: clip is applied to the viewport.</title> | |
| <link rel="help" href="https://drafts.csswg.org/css-overflow-3/#overflow-propagation"> | |
| <link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-scrollintoview"> | |
| <meta name="assert" content="When overflow-x or overflow-y: clip is applied to the viewport, it is interpreted as hidden, so scrollIntoView can still scroll the viewport programmatically in that axis."> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <style> | |
| #log { position: fixed; } | |
| html, body { margin: 0; } | |
| body { | |
| position: relative; | |
| width: 10000px; | |
| height: 10000px; | |
| } | |
| .target { | |
| position: absolute; | |
| width: 100px; | |
| height: 100px; | |
| } | |
| #target-x { | |
| left: 5000px; | |
| top: 0; | |
| } | |
| #target-y { | |
| left: 0; | |
| top: 5000px; | |
| } | |
| </style> | |
| <div id="log"></div> | |
| <div id="target-x" class="target"></div> | |
| <div id="target-y" class="target"></div> | |
| <script> | |
| const targetX = document.getElementById("target-x"); | |
| const targetY = document.getElementById("target-y"); | |
| function reset() { | |
| document.documentElement.style.overflowX = "visible"; | |
| document.documentElement.style.overflowY = "visible"; | |
| document.scrollingElement.scrollLeft = 0; | |
| document.scrollingElement.scrollTop = 0; | |
| assert_equals(window.scrollX, 0, "Precondition: window.scrollX"); | |
| assert_equals(window.scrollY, 0, "Precondition: window.scrollY"); | |
| } | |
| test(() => { | |
| reset(); | |
| // Use clip + visible so this specifically exercises the viewport rule, | |
| // not the general overflow-x/overflow-y compute-to-hidden rule. | |
| document.documentElement.style.overflowX = "clip"; | |
| document.documentElement.style.overflowY = "visible"; | |
| targetX.scrollIntoView({block: "nearest", inline: "start", behavior: 'instant'}); | |
| assert_greater_than(window.scrollX, 0, "scrollIntoView should scroll the viewport horizontally"); | |
| assert_equals(window.scrollY, 0, "scrollIntoView should not scroll the viewport vertically"); | |
| }, "scrollIntoView scrolls the viewport when overflow-x: clip is applied to the root element"); | |
| test(() => { | |
| reset(); | |
| // Use visible + clip so this specifically exercises the viewport rule, | |
| // not the general overflow-x/overflow-y compute-to-hidden rule. | |
| document.documentElement.style.overflowX = "visible"; | |
| document.documentElement.style.overflowY = "clip"; | |
| targetY.scrollIntoView({block: "start", inline: "nearest", behavior: 'instant'}); | |
| assert_equals(window.scrollX, 0, "scrollIntoView should not scroll the viewport horizontally"); | |
| assert_greater_than(window.scrollY, 0, "scrollIntoView should scroll the viewport vertically"); | |
| }, "scrollIntoView scrolls the viewport when overflow-y: clip is applied to the root element"); | |
| </script> |