diff --git a/src/parser.rs b/src/parser.rs index 2565c64..e5d32ee 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -35,7 +35,8 @@ lazy_static! { static ref RX_WILLCOM_PATTERN: Regex = Regex::new(r"(?:WILLCOM|DDIPOCKET);[^/]+/([^ /;()]+)").unwrap(); static ref RX_WINDOWS_VERSION_PATTERN: Regex = Regex::new(r"Windows ([ .a-zA-Z0-9]+)[;\\)]").unwrap(); static ref RX_WIN_PHONE: Regex = Regex::new(r"^Phone(?: OS)? ([.0-9]+)").unwrap(); - static ref RX_WEBVIEW_PATTERN: Regex = Regex::new(r"iP(hone;|ad;|od) .*like Mac OS X").unwrap(); + static ref RX_IOS_WEBVIEW_PATTERN: Regex = Regex::new(r"iP(hone;|ad;|od) .*like Mac OS X").unwrap(); + static ref RX_ANDROID_KK_WEBVIEW_PATTERN: Regex = Regex::new(r"Android 4\.4.*Version/([.0-9]+) Chrome/").unwrap(); static ref RX_WEBVIEW_VERSION_PATTERN: Regex = Regex::new(r"Version/([.0-9]+)").unwrap(); static ref RX_PPC_OS_VERSION: Regex = Regex::new(r"rv:(\d+\.\d+\.\d+)").unwrap(); static ref RX_FREEBSD_OS_VERSION: Regex = Regex::new(r"FreeBSD ([^;\)]+);").unwrap(); @@ -608,6 +609,10 @@ impl Parser { return true; } + if RX_WEBVIEW_VERSION_PATTERN.is_match(agent) { + return false; + } + if !self.populate_dataset(result, "Chrome") { return false; } @@ -703,7 +708,9 @@ impl Parser { return true; } - if !RX_WEBVIEW_PATTERN.is_match(agent) || agent.contains("Safari/") { + if (!RX_IOS_WEBVIEW_PATTERN.is_match(agent) || agent.contains("Safari/")) + && !RX_ANDROID_KK_WEBVIEW_PATTERN.is_match(agent) + { return false; } @@ -717,9 +724,10 @@ impl Parser { }; if !version.is_empty() { result.version = version; + return true; + } else { + return false; } - - true } fn challenge_docomo<'a>(&self, agent: &'a str, result: &mut WootheeResult<'a>) -> bool { diff --git a/tests/smartphone_android.rs b/tests/smartphone_android.rs index 3162fa1..445883c 100644 --- a/tests/smartphone_android.rs +++ b/tests/smartphone_android.rs @@ -110,6 +110,16 @@ mod tests { assert_eq!(result.version, "UNKNOWN"); } } + match parser.parse(r#"Mozilla/5.0 (Linux; Android 4.4.4; ko-kr; SAMSUNG SM-G710K/KTUBPK1 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Safari/537.36"#) { + None => panic!(r#"invalid parse. "Mozilla/5.0 (Linux; Android 4.4.4; ko-kr; SAMSUNG SM-G710K/KTUBPK1 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Safari/537.36""#), + Some(result) => { + assert_eq!(result.category, "smartphone"); + assert_eq!(result.name, "Webview"); + assert_eq!(result.os, "Android"); + assert_eq!(result.os_version, "4.4.4".to_string()); + assert_eq!(result.version, "1.5"); + } + } match parser.parse(r#"Mozilla/5.0 (Linux; Android 5.1.1; Nexus 5 Build/LMY48B; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.65 Mobile Safari/537.36"#) { None => panic!(r#"invalid parse. "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 5 Build/LMY48B; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.65 Mobile Safari/537.36""#), Some(result) => {