Files
sousa-gecko/testing/web-platform/tests/html/rendering/support/test-ua-stylesheet.js
T
Ian Kilpatrick b637e5cb56 Bug 2046590 [wpt PR 60536] - [forms] Make <select> use a UA-clip instead of a manual one., a=testonly
Automatic update from web-platform-tests
[forms] Make <select> use a UA-clip instead of a manual one.

This aligns with Firefox to implement the clip behaviour of the select
element in the UA-stylesheet. See:
https://searchfox.org/firefox-main/rev/f19dd05bb08e26d46137ce52924e35ff7a501dfe/layout/style/res/forms.css#211

This is currently unspecified, and there is an open issue on the HTML
spec here: https://github.com/whatwg/html/issues/10031

Behind the flag: SelectUsesUAClip

Additionally we need to specify overflow-clip-margin:content-box to
maintain our previous behaviour which differs slightly from Firefox.

Change-Id: Icdc61604603f5b15735958b1b95e408fb74e7b1b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7916526
Reviewed-by: David Baron <dbaron@chromium.org>
Commit-Queue: Ian Kilpatrick <ikilpatrick@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1644964}

--

wpt-commits: b65827009f87c89d569fa442ec403d34a2b54f88
wpt-pr: 60536
2026-06-16 11:35:03 +00:00

76 lines
2.4 KiB
JavaScript

function runUAStyleTests(props) {
const refs = document.getElementById('refs');
for (const el of document.querySelectorAll('#tests > *')) {
const clone = fakeClone(el);
refs.append(clone);
}
const testsContainer = document.getElementById('tests');
const testEls = document.querySelectorAll('#tests *');
const refEls = document.querySelectorAll('#refs *');
for (let i = 0; i < testEls.length; ++i) {
const testEl = testEls[i];
if (testEl.hasAttribute('data-skip')) {
continue;
}
const refEl = refEls[i];
const testStyle = getComputedStyle(testEl);
const refStyle = getComputedStyle(refEl);
for (const prop of props) {
// Don't test display for some elements.
// TODO(zcorpan): https://github.com/whatwg/html/issues/4093
// TODO(zcorpan): https://github.com/whatwg/html/issues/5063
if (prop === 'display' &&
(testEl.localName === 'optgroup' ||
testEl.localName === 'option' ||
testEl.localName === 'marquee')
) {
continue;
}
if (testEl.localName === 'select' &&
(prop === 'overflow' || prop === 'overflow-clip-margin')) {
// TODO: https://github.com/whatwg/html/issues/10031
continue;
}
test(() => {
assert_equals(testStyle.getPropertyValue(prop), refStyle.getPropertyValue(prop));
}, `${testNameContext(testEl)} - ${prop}`);
}
}
function fakeClone(el) {
const clone = document.createElementNS('urn:not-html', el.localName);
for (const att of el.attributes) {
clone.setAttributeNS(att.namespaceURI, att.name, att.value);
}
// deep clone
for (const child of el.children) {
clone.append(fakeClone(child));
}
return clone;
}
function testNameContext(el) {
const outerHTML = el.outerHTML;
const startTags = outerHTML.substring(0, outerHTML.indexOf('</')) || outerHTML;
let ancestors = [];
let current = el.parentNode;
while (current != testsContainer) {
ancestors.unshift(`<${current.localName}${contextAttrs(current.attributes)}>`);
current = current.parentNode;
}
return startTags + (ancestors.length ? ` (in ${ancestors.join('')})` : '');
}
function contextAttrs(attributes) {
let rv = "";
for (let i = 0; i < attributes.length; ++i) {
if (attributes[i].name === 'data-skip') {
continue;
}
rv += ` ${attributes[i].name}="${attributes[i].value}"`;
}
return rv;
}
}