Skip to main content

css_feature_data/
browser_support.rs

1use crate::{BrowserVersion, NamedBrowserVersion};
2
3#[derive(Debug, Copy, Clone, PartialEq)]
4pub struct BrowserSupport {
5	pub chrome: BrowserVersion,
6	pub chrome_android: BrowserVersion,
7	pub edge: BrowserVersion,
8	pub firefox: BrowserVersion,
9	pub firefox_android: BrowserVersion,
10	pub safari: BrowserVersion,
11	pub safari_ios: BrowserVersion,
12}
13
14impl BrowserSupport {
15	/// Reports whether `browser` supports the feature. A browser this data does not cover reports `false`.
16	pub fn supports(&self, browser: NamedBrowserVersion) -> bool {
17		let (version, since) = match browser {
18			NamedBrowserVersion::Chrome(version) => (version, self.chrome),
19			NamedBrowserVersion::ChromeAndroid(version) => (version, self.chrome_android),
20			NamedBrowserVersion::Edge(version) => (version, self.edge),
21			NamedBrowserVersion::Firefox(version) => (version, self.firefox),
22			NamedBrowserVersion::FirefoxAndroid(version) => (version, self.firefox_android),
23			NamedBrowserVersion::Safari(version) => (version, self.safari),
24			NamedBrowserVersion::SafariIos(version) => (version, self.safari_ios),
25			_ => return false,
26		};
27		since != BrowserVersion(0, 0) && version >= since
28	}
29}
30
31#[cfg(test)]
32mod tests {
33	use super::*;
34
35	const NEVER: BrowserVersion = BrowserVersion(0, 0);
36
37	fn support() -> BrowserSupport {
38		BrowserSupport {
39			chrome: BrowserVersion(29, 0),
40			chrome_android: BrowserVersion(29, 0),
41			edge: BrowserVersion(12, 0),
42			firefox: BrowserVersion(28, 0),
43			firefox_android: BrowserVersion(28, 0),
44			safari: BrowserVersion(9, 1),
45			safari_ios: NEVER,
46		}
47	}
48
49	#[test]
50	fn supports_from_the_first_version() {
51		assert!(support().supports(NamedBrowserVersion::Chrome(BrowserVersion(29, 0))));
52		assert!(support().supports(NamedBrowserVersion::Safari(BrowserVersion(10, 0))));
53		assert!(!support().supports(NamedBrowserVersion::Safari(BrowserVersion(9, 0))));
54	}
55
56	#[test]
57	fn never_supported_stays_unsupported() {
58		assert!(!support().supports(NamedBrowserVersion::SafariIos(BrowserVersion(18, 0))));
59	}
60
61	#[test]
62	fn uncovered_browsers_are_unsupported() {
63		assert!(!support().supports(NamedBrowserVersion::Opera(BrowserVersion(120, 0))));
64	}
65}