Skip to content

Commit 7459f0f

Browse files
committed
Don't generate double position gradient syntax if not supported by targets
1 parent 3ec0ae2 commit 7459f0f

File tree

6 files changed

+136
-10
lines changed

6 files changed

+136
-10
lines changed

build-prefixes.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ const prefixes = require('autoprefixer/data/prefixes');
22
const browsers = require('caniuse-lite').agents;
33
const unpack = require('caniuse-lite').feature;
44
const features = require('caniuse-lite').features;
5+
const mdn = require('@mdn/browser-compat-data');
56
const fs = require('fs');
67

78
const BROWSER_MAPPING = {
@@ -17,6 +18,15 @@ const BROWSER_MAPPING = {
1718
op_mini: null,
1819
};
1920

21+
const MDN_BROWSER_MAPPING = {
22+
chrome_android: 'chrome',
23+
firefox_android: 'firefox',
24+
opera_android: 'opera',
25+
safari_ios: 'ios_saf',
26+
samsunginternet_android: 'samsung',
27+
webview_android: 'android'
28+
};
29+
2030
// Fix data, autoprefixer seems wrong.
2131
// See https://developer.mozilla.org/en-US/docs/Web/CSS/::file-selector-button
2232
prefixes['::file-selector-button'].browsers = [
@@ -165,6 +175,35 @@ for (let feature of cssFeatures) {
165175
compat[feature] = browserMap;
166176
}
167177

178+
let mdnFeatures = {
179+
doublePositionGradients: mdn.css.types.image.gradient['radial-gradient'].doubleposition.__compat.support
180+
};
181+
182+
for (let feature in mdnFeatures) {
183+
let browserMap = {};
184+
for (let name in mdnFeatures[feature]) {
185+
if (MDN_BROWSER_MAPPING[name] === null) {
186+
continue;
187+
}
188+
189+
let version = mdnFeatures[feature][name].version_added;
190+
if (!version) {
191+
continue;
192+
}
193+
194+
let v = parseVersion(version);
195+
if (v == null) {
196+
console.log('BAD VERSION', feature, name, version);
197+
continue;
198+
}
199+
200+
name = MDN_BROWSER_MAPPING[name] || name;
201+
browserMap[name] = v;
202+
}
203+
204+
compat[feature] = browserMap;
205+
}
206+
168207
let prefixMapping = {
169208
webkit: 'WebKit',
170209
moz: 'Moz',

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
"detect-libc": "^1.0.3"
3333
},
3434
"devDependencies": {
35+
"@mdn/browser-compat-data": "^4.0.12",
3536
"@napi-rs/cli": "1.0.4",
3637
"autoprefixer": "^10.4.0",
3738
"caniuse-lite": "^1.0.30001272",

src/compat.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ pub enum Feature {
2727
CssSel3,
2828
CssSelection,
2929
Dialog,
30+
DoublePositionGradients,
3031
FormValidation,
3132
Fullscreen,
3233
Shadowdomv1
@@ -1114,6 +1115,48 @@ impl Feature {
11141115
}
11151116
}
11161117
}
1118+
Feature::DoublePositionGradients => {
1119+
if let Some(version) = browsers.chrome {
1120+
if version >= 4653056 {
1121+
return true
1122+
}
1123+
}
1124+
if let Some(version) = browsers.edge {
1125+
if version >= 5177344 {
1126+
return true
1127+
}
1128+
}
1129+
if let Some(version) = browsers.firefox {
1130+
if version >= 4194304 {
1131+
return true
1132+
}
1133+
}
1134+
if let Some(version) = browsers.opera {
1135+
if version >= 3276800 {
1136+
return true
1137+
}
1138+
}
1139+
if let Some(version) = browsers.safari {
1140+
if version >= 786688 {
1141+
return true
1142+
}
1143+
}
1144+
if let Some(version) = browsers.ios_saf {
1145+
if version >= 786944 {
1146+
return true
1147+
}
1148+
}
1149+
if let Some(version) = browsers.samsung {
1150+
if version >= 655360 {
1151+
return true
1152+
}
1153+
}
1154+
if let Some(version) = browsers.android {
1155+
if version >= 4653056 {
1156+
return true
1157+
}
1158+
}
1159+
}
11171160
}
11181161
false
11191162
}

src/lib.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4005,6 +4005,40 @@ mod tests {
40054005
..Browsers::default()
40064006
}
40074007
);
4008+
4009+
prefix_test(
4010+
r#"
4011+
.foo {
4012+
background: linear-gradient(yellow, red 30% 40%, blue);
4013+
}
4014+
"#,
4015+
indoc! {r#"
4016+
.foo {
4017+
background: linear-gradient(#ff0, red 30%, red 40%, #00f);
4018+
}
4019+
"#},
4020+
Browsers {
4021+
chrome: Some(70 << 16),
4022+
..Browsers::default()
4023+
}
4024+
);
4025+
4026+
prefix_test(
4027+
r#"
4028+
.foo {
4029+
background: linear-gradient(yellow, red 30% 40%, blue);
4030+
}
4031+
"#,
4032+
indoc! {r#"
4033+
.foo {
4034+
background: linear-gradient(#ff0, red 30% 40%, #00f);
4035+
}
4036+
"#},
4037+
Browsers {
4038+
chrome: Some(71 << 16),
4039+
..Browsers::default()
4040+
}
4041+
);
40084042
}
40094043

40104044
#[test]

src/values/gradient.rs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use crate::properties::prefixes::{Feature, Browsers};
1010
use crate::traits::{Parse, ToCss};
1111
use crate::macros::enum_property;
1212
use crate::printer::Printer;
13+
use crate::compat;
1314

1415
/// https://www.w3.org/TR/css-images-3/#gradients
1516
#[derive(Debug, Clone, PartialEq)]
@@ -621,18 +622,21 @@ fn serialize_items<D: ToCss + std::cmp::PartialOrd<f32> + std::cmp::PartialEq<D>
621622
continue
622623
}
623624

625+
// Use double position stop if the last stop is the same color and all targets support it.
624626
if let Some(prev) = last {
625-
match (prev, item) {
626-
(
627-
GradientItem::ColorStop(ColorStop { position: Some(_), color: ca }),
628-
GradientItem::ColorStop(ColorStop { position: Some(p), color: cb })
629-
) if ca == cb => {
630-
dest.write_char(' ')?;
631-
p.to_css(dest)?;
632-
last = None;
633-
continue
627+
if dest.targets.is_none() || compat::Feature::DoublePositionGradients.is_compatible(dest.targets.unwrap()) {
628+
match (prev, item) {
629+
(
630+
GradientItem::ColorStop(ColorStop { position: Some(_), color: ca }),
631+
GradientItem::ColorStop(ColorStop { position: Some(p), color: cb })
632+
) if ca == cb => {
633+
dest.write_char(' ')?;
634+
p.to_css(dest)?;
635+
last = None;
636+
continue
637+
}
638+
_ => {}
634639
}
635-
_ => {}
636640
}
637641
}
638642

yarn.lock

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,11 @@
226226
resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c"
227227
integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==
228228

229+
"@mdn/browser-compat-data@^4.0.12":
230+
version "4.0.12"
231+
resolved "https://registry.yarnpkg.com/@mdn/browser-compat-data/-/browser-compat-data-4.0.12.tgz#ea5472755d8460b711c61b6ed8f47f92f782c6c0"
232+
integrity sha512-vUxvn5V8KLQAm9EmxOv9STqsZrEuJbY5rKoxOwM31cKN34qzBbGpy+yOl4OQh3eqXh7S5uIOyIleZS3rKsuf4g==
233+
229234
"@napi-rs/cli@1.0.4":
230235
version "1.0.4"
231236
resolved "https://registry.yarnpkg.com/@napi-rs/cli/-/cli-1.0.4.tgz#b2d987cd0da1791cfd74adca4e5637029bb2758f"

0 commit comments

Comments
 (0)