Bug 1513959 - Make <input type=range> deal with "percentage inline-size implies zero min-content size" properly. r=dholbert

This commit is contained in:
Mats Palmgren 2018-12-18 01:09:02 +01:00
Родитель 29cb3d46ea
Коммит ecdcceaf6a
5 изменённых файлов: 618 добавлений и 0 удалений

Просмотреть файл

@ -741,6 +741,13 @@ LogicalSize nsRangeFrame::ComputeAutoSize(
}
nscoord nsRangeFrame::GetMinISize(gfxContext* aRenderingContext) {
auto pos = StylePosition();
auto wm = GetWritingMode();
if (pos->ISize(wm).HasPercent()) {
// https://drafts.csswg.org/css-sizing-3/#percentage-sizing
// https://drafts.csswg.org/css-sizing-3/#min-content-zero
return nsLayoutUtils::ResolveToLength<true>(pos->ISize(wm), nscoord(0));
}
return GetPrefISize(aRenderingContext);
}

Просмотреть файл

@ -0,0 +1,161 @@
<!DOCTYPE HTML>
<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/
-->
<html><head>
<meta charset="utf-8">
<title>Reference: INPUT type=range percent intrinsic inline-size</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1513959">
<style>
html,body {
color:black; background-color:white; font:16px/1 monospace;
}
input { margin: 2px; }
input.i {
min-width: 0;
background: lime;
}
input.mi {
min-width: 0;
max-width: 100%;
width: -moz-max-content;
width: max-content;
background: lime;
}
.n {
-webkit-appearance: none;
}
div {
display: inline-block;
border:1px solid;
}
.grid {
display: inline-grid;
grid: auto / min-content;
place-items: start;
}
.outerFlex {
display: flex;
width: 100px;
border: 1px solid black;
}
.innerFlex {
display: grid;
border: 1px solid pink;
}
.innerFlex > input {
min-width: 0;
justify-self: stretch;
background: yellow;
-moz-appearance: none;
-webkit-appearance: none;
}
</style></head><body>
<div style="width:30px"><div style="width:28px">
<input type="range" class="i" style="width:14px; margin-right:0">
</div></div>
<div style="width:200px"><div style="">
<input type="range" class="i" style="max-width:50%">
</div></div>
<div class="grid" style="grid-template-columns:4px">
<input type="range" class="i" style="width:2px;">
</div>
<div class="grid" style="grid-template-columns:30px">
<input type="range" class="i" style="width:15px">
</div>
<div class="grid" style="grid-template-columns:30px">
<input type="range" class="i" style="width:15px">
</div>
<div class="grid" style="grid-template-columns:30px">
<input type="range" class="i min-auto" style="width:15px">
</div>
<div style="width:30px"><div style="width:28px;">
<input type="range" class="i n" style="width:14px; margin-right:0">
</div></div>
<div class="grid" style="grid-template-columns:4px">
<input type="range" class="i n" style="width:2px;">
</div>
<div class="grid" style="grid-template-columns:30px">
<input type="range" class="i n" style="width:15px">
</div>
<div class="grid" style="grid-template-columns:30px">
<input type="range" class="i n" style="width:15px">
</div>
<div class="grid" style="grid-template-columns:30px">
<input type="range" class="i n min-auto" style="width:15px">
</div>
<br>
<br>
<div style="width:30px"><div>
<input type="range" class="mi">
</div></div>
<div class="grid">
<input type="range" class="mi">
</div>
<div class="grid" style="grid-template-columns:minmax(min-content,30px)">
<input type="range" class="mi">
</div>
<div class="grid" style="grid-template-columns:minmax(auto,30px)">
<input type="range" class="mi">
</div>
<div style="width:30px"><div>
<input type="range" class="mi n">
</div></div>
<div style="width:30px"><div style="width:-moz-max-content;width:max-content">
<input type="range" class="mi n" style="width:50%">
</div></div>
<div class="grid">
<input type="range" class="mi n">
</div>
<div class="grid" style="grid-template-columns:minmax(min-content,30px)">
<input type="range" class="mi n">
</div>
<div class="grid" style="grid-template-columns:minmax(auto,30px)">
<input type="range" class="mi n">
</div>
<div class="grid" style="width:30px; grid-template-columns:15px">
<input type="range" class="mi n min-auto">
</div>
<br>
<br>
<div class="outerFlex">
<div class="innerFlex">
<input type="range">
</div>
abc
</div>
</body></html>

Просмотреть файл

@ -0,0 +1,169 @@
<!DOCTYPE HTML>
<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/
-->
<html><head>
<meta charset="utf-8">
<title>Test: INPUT type=range percent intrinsic inline-size</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1513959">
<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#percentage-sizing">
<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#min-content-zero">
<link rel="match" href="range-percent-intrinsic-size-1-ref.html">
<style>
html,body {
color:black; background-color:white; font:16px/1 monospace;
}
input { margin: 2px; }
input.i {
width: 50%;
min-width: -moz-min-content;
min-width: min-content;
background: lime;
}
input.mi {
max-width: 50%;
min-width: -moz-min-content;
min-width: min-content;
background: lime;
}
input.i.min-auto, input.mi.min-auto {
min-width: auto;
}
.n {
-webkit-appearance: none;
}
div {
display: inline-block;
border:1px solid;
}
.grid {
display: inline-grid;
grid: auto / min-content;
place-items: start;
}
.outerFlex {
display: flex;
width: 100px;
border: 1px solid black;
}
.innerFlex {
display: flex;
border: 1px solid pink;
}
.innerFlex > input {
width: 50%;
flex: 1;
background: yellow;
-moz-appearance: none;
-webkit-appearance: none;
}
</style></head><body>
<div style="width:30px"><div>
<input type="range" class="i">
</div></div>
<div style="width:200px"><div>
<input type="range" class="i">
</div></div>
<div class="grid">
<input type="range" class="i">
</div>
<div class="grid" style="grid-template-columns:minmax(min-content,30px)">
<input type="range" class="i">
</div>
<div class="grid" style="grid-template-columns:minmax(auto,30px)">
<input type="range" class="i">
</div>
<div class="grid" style="grid-template-columns:minmax(auto,30px)">
<input type="range" class="i min-auto">
</div>
<div style="width:30px"><div>
<input type="range" class="i n">
</div></div>
<div class="grid">
<input type="range" class="i n">
</div>
<div class="grid" style="grid-template-columns:minmax(min-content,30px)">
<input type="range" class="i n">
</div>
<div class="grid" style="grid-template-columns:minmax(auto,30px)">
<input type="range" class="i n">
</div>
<div class="grid" style="grid-template-columns:minmax(auto,30px)">
<input type="range" class="i n min-auto">
</div>
<br>
<br>
<div style="width:30px"><div>
<input type="range" class="mi">
</div></div>
<div class="grid">
<input type="range" class="mi">
</div>
<div class="grid" style="grid-template-columns:minmax(min-content,30px)">
<input type="range" class="mi">
</div>
<div class="grid" style="grid-template-columns:minmax(auto,30px)">
<input type="range" class="mi">
</div>
<div style="width:30px"><div>
<input type="range" class="mi n">
</div></div>
<div style="width:30px"><div>
<input type="range" class="mi n min-auto">
</div></div>
<div class="grid">
<input type="range" class="mi n">
</div>
<div class="grid" style="grid-template-columns:minmax(min-content,30px)">
<input type="range" class="mi n">
</div>
<div class="grid" style="grid-template-columns:minmax(auto,30px)">
<input type="range" class="mi n">
</div>
<div class="grid" style="grid-template-columns:minmax(auto,30px)">
<input type="range" class="mi n min-auto">
</div>
<br>
<br>
<div class="outerFlex">
<div class="innerFlex">
<input type="range">
</div>
abc
</div>
</body></html>

Просмотреть файл

@ -0,0 +1,136 @@
<!DOCTYPE HTML>
<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/
-->
<html><head>
<meta charset="utf-8">
<title>Reference: INPUT type=range percent intrinsic block-size</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1513959">
<style>
html,body {
color:black; background-color:white; font:16px/1 monospace;
}
input { margin: 2px; }
input.b {
min-height: 0;
background: lime;
}
input.mb {
min-height: 0;
max-height: 100%;
background: lime;
}
.n {
-webkit-appearance: none;
}
div {
display: inline-block;
border:1px solid;
}
.grid {
display: inline-grid;
grid: auto / min-content;
place-items: start;
}
input[orient="vertical"] {
-webkit-appearance: slider-vertical;
-webkit-appearance: range;
}
</style></head><body>
<div style="height:30px"><div>
<input type="range" class="b" orient="vertical">
</div></div>
<div class="grid" style="grid: min-content / auto">
<input type="range" class="b" orient="vertical" style="height:50%; grid-area:1/1">
<input type="range" class="b" orient="vertical" style="visibility:hidden; grid-area:1/1">
</div>
<div class="grid" style="grid: min-content / auto">
<input type="range" class="b" orient="vertical" style="height:50%; grid-area:1/1">
<input type="range" class="b" orient="vertical" style="visibility:hidden; grid-area:1/1">
</div>
<div class="grid" style="grid: 30px / auto">
<input type="range" class="b" orient="vertical" style="height:15px">
</div>
<div class="grid" style="grid: 30px / auto">
<input type="range" class="b" orient="vertical" style="height:15px">
</div>
<div style="height:30px"><div>
<input type="range" class="b n" orient="vertical">
</div></div>
<div class="grid" style="grid: min-content / auto">
<input type="range" class="b" orient="vertical" style="height:50%; grid-area:1/1">
<input type="range" class="b" orient="vertical" style="visibility:hidden; grid-area:1/1">
</div>
<div class="grid" style="grid: min-content / auto">
<input type="range" class="b" orient="vertical" style="height:50%; grid-area:1/1">
<input type="range" class="b" orient="vertical" style="visibility:hidden; grid-area:1/1">
</div>
<div class="grid" style="grid: 30px / auto">
<input type="range" class="b" orient="vertical" style="height:15px">
</div>
<div class="grid" style="grid: 30px / auto">
<input type="range" class="b" orient="vertical" style="height:15px">
</div>
<br>
<br>
<div style="height:30px"><div>
<input type="range" class="mb" orient="vertical">
</div></div>
<div class="grid" style="grid: 4px / auto">
<input type="range" class="mb" orient="vertical" style="height:2px">
</div>
<div class="grid" style="grid: 30px / auto">
<input type="range" class="b" orient="vertical" style="height:15px">
</div>
<div class="grid" style="grid: 30px / auto">
<input type="range" class="b" orient="vertical" style="height:15px">
</div>
<div class="grid" style="grid: 30px / auto">
<input type="range" class="b" orient="vertical" style="height:15px">
</div>
<div style="height:30px"><div>
<input type="range" class="mb n" orient="vertical">
</div></div>
<div class="grid" style="grid: 4px / auto">
<input type="range" class="mb n" orient="vertical" style="height:2px">
</div>
<div class="grid" style="grid: 30px / auto">
<input type="range" class="b" orient="vertical" style="height:15px">
</div>
<div class="grid" style="grid: 30px / auto">
<input type="range" class="b" orient="vertical" style="height:15px">
</div>
<div class="grid" style="grid: 30px / auto">
<input type="range" class="b" orient="vertical" style="height:15px">
</div>
</body></html>

Просмотреть файл

@ -0,0 +1,145 @@
<!DOCTYPE HTML>
<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/
-->
<html><head>
<meta charset="utf-8">
<title>Test: INPUT type=range percent intrinsic block-size</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1513959">
<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#percentage-sizing">
<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#min-content-zero">
<link rel="match" href="range-percent-intrinsic-size-2-ref.html">
<style>
html,body {
color:black; background-color:white; font:16px/1 monospace;
}
input { margin: 2px; }
input.b {
height: 50%;
min-height: -moz-min-content;
min-height: min-content;
background: lime;
}
input.mb {
max-height: 50%;
min-height: -moz-min-content;
min-height: min-content;
background: lime;
}
input.b.min-auto, input.mb.min-auto, {
min-height: auto;
}
.n {
-webkit-appearance: none;
}
div {
display: inline-block;
border:1px solid;
}
.grid {
display: inline-grid;
grid: auto / min-content;
place-items: start;
}
input[orient="vertical"] {
-webkit-appearance: slider-vertical;
-webkit-appearance: range;
}
</style></head><body>
<div style="height:30px"><div>
<input type="range" class="b" orient="vertical">
</div></div>
<div class="grid" style="grid: min-content / auto">
<input type="range" class="b" orient="vertical">
</div>
<div class="grid" style="grid: minmax(min-content,30px) / auto">
<input type="range" class="b" orient="vertical">
</div>
<div class="grid" style="grid: minmax(auto,30px) / auto">
<input type="range" class="b" orient="vertical">
</div>
<div class="grid" style="grid: minmax(auto,30px) / auto">
<input type="range" class="b min-auto" orient="vertical">
</div>
<div style="height:30px"><div>
<input type="range" class="b n" orient="vertical">
</div></div>
<div class="grid" style="grid: min-content / auto">
<input type="range" class="b n" orient="vertical">
</div>
<div class="grid" style="grid: minmax(min-content,30px) / auto">
<input type="range" class="b n" orient="vertical">
</div>
<div class="grid" style="grid: minmax(auto,30px) / auto">
<input type="range" class="b n" orient="vertical">
</div>
<div class="grid" style="grid: minmax(auto,30px) / auto">
<input type="range" class="b n min-auto" orient="vertical">
</div>
<br>
<br>
<div style="height:30px"><div>
<input type="range" class="mb" orient="vertical">
</div></div>
<div class="grid" style="grid: min-content / auto">
<input type="range" class="mb" orient="vertical">
</div>
<div class="grid" style="grid: minmax(min-content,30px) / auto">
<input type="range" class="mb" orient="vertical">
</div>
<div class="grid" style="grid: minmax(auto,30px) / auto">
<input type="range" class="mb" orient="vertical">
</div>
<div class="grid" style="grid: minmax(auto,30px) / auto">
<input type="range" class="mb min-auto" orient="vertical">
</div>
<div style="height:30px"><div>
<input type="range" class="mb n" orient="vertical">
</div></div>
<div class="grid" style="grid: min-content / auto">
<input type="range" class="mb n" orient="vertical">
</div>
<div class="grid" style="grid: minmax(min-content,30px) / auto">
<input type="range" class="mb n" orient="vertical">
</div>
<div class="grid" style="grid: minmax(auto,30px) / auto">
<input type="range" class="mb n" orient="vertical">
</div>
<div class="grid" style="grid: minmax(auto,30px) / auto">
<input type="range" class="mb n min-auto" orient="vertical">
</div>
</body></html>