css_feature_data/
browser_support.rs1use 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 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}