private static final String PHANTOMJS_211_MAC = "Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1";
private static final String CHROME_57_ON_IOS_10_3_1 = "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/57.0.2987.137 Mobile/14E304 Safari/602.1";
+ private static final String CHROME_40_ON_CHROMEOS = "Mozilla/5.0 (X11; CrOS x86_64 6457.31.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.38 Safari/537.36";
+
@Test
public void testSafari3() {
VBrowserDetails bd = new VBrowserDetails(SAFARI3_WINDOWS);
assertWindows(bd);
}
+ @Test
+ public void testChromeChromeOS() {
+ VBrowserDetails bd = new VBrowserDetails(CHROME_40_ON_CHROMEOS);
+ assertWebKit(bd);
+ assertChrome(bd);
+ assertBrowserMajorVersion(bd, 40);
+ assertBrowserMinorVersion(bd, 0);
+ assertEngineVersion(bd, 537f);
+ assertChromeOS(bd);
+ }
+
@Test
public void testChromeIOS() {
VBrowserDetails bd = new VBrowserDetails(CHROME_57_ON_IOS_10_3_1);
assertFalse(browserDetails.isWindows());
assertTrue(browserDetails.isMacOSX());
assertFalse(browserDetails.isAndroid());
+ assertFalse(browserDetails.isChromeOS());
}
private void assertAndroid(VBrowserDetails browserDetails, int majorVersion,
assertFalse(browserDetails.isMacOSX());
assertFalse(browserDetails.isIOS());
assertTrue(browserDetails.isAndroid());
+ assertFalse(browserDetails.isChromeOS());
assertOSMajorVersion(browserDetails, majorVersion);
assertOSMinorVersion(browserDetails, minorVersion);
assertFalse(browserDetails.isMacOSX());
assertTrue(browserDetails.isIOS());
assertFalse(browserDetails.isAndroid());
+ assertFalse(browserDetails.isChromeOS());
assertOSMajorVersion(browserDetails, majorVersion);
assertOSMinorVersion(browserDetails, minorVersion);
assertFalse(browserDetails.isMacOSX());
assertFalse(browserDetails.isIOS());
assertFalse(browserDetails.isAndroid());
+ assertFalse(browserDetails.isChromeOS());
Assert.assertEquals(isWindowsPhone, browserDetails.isWindowsPhone());
}
assertFalse(browserDetails.isMacOSX());
assertFalse(browserDetails.isIOS());
assertFalse(browserDetails.isAndroid());
+ assertFalse(browserDetails.isChromeOS());
+ }
+
+ private void assertChromeOS(VBrowserDetails browserDetails) {
+ assertFalse(browserDetails.isLinux());
+ assertFalse(browserDetails.isWindows());
+ assertFalse(browserDetails.isMacOSX());
+ assertFalse(browserDetails.isIOS());
+ assertFalse(browserDetails.isAndroid());
+ assertTrue(browserDetails.isChromeOS());
}
}
private boolean isWindowsPhone;
private boolean isIPad;
private boolean isIPhone;
+ private boolean isChromeOS;
private OperatingSystem os = OperatingSystem.UNKNOWN;
public enum OperatingSystem {
- UNKNOWN, WINDOWS, MACOSX, LINUX, IOS, ANDROID;
+ UNKNOWN, WINDOWS, MACOSX, LINUX, IOS, ANDROID, CHROMEOS;
}
private float browserEngineVersion = -1;
} else {
os = OperatingSystem.MACOSX;
}
+ } else if (userAgent.contains("; cros ")){
+ os = OperatingSystem.CHROMEOS;
+ isChromeOS = true;
+ parseChromeOSVersion(userAgent);
}
}
+ // (X11; CrOS armv7l 6946.63.0)
+ private void parseChromeOSVersion(String userAgent) {
+ int start = userAgent.indexOf("; cros ");
+ if (start == -1) {
+ return;
+ }
+ int end = userAgent.indexOf(')', start);
+ if (end == -1) {
+ return;
+ }
+ int cur = end;
+ while (cur >= start && userAgent.charAt(cur) != ' ') {
+ cur--;
+ }
+ if (cur == start) {
+ return;
+ }
+ String osVersionString = userAgent.substring(cur + 1, end);
+ String[] parts = osVersionString.split("\\.");
+ parseChromeOsVersion(parts);
+ }
+
+ private void parseChromeOsVersion(String[] parts) {
+ osMajorVersion = -1;
+ osMinorVersion = -1;
+
+ if (parts.length > 2) {
+ try {
+ osMajorVersion = Integer.parseInt(parts[1]);
+ } catch (Exception e) {
+ }
+ try {
+ osMinorVersion = Integer.parseInt(parts[0]);
+ } catch (Exception e) {
+ }
+ }
+ }
+
private void parseAndroidVersion(String userAgent) {
// Android 5.1;
if (!userAgent.contains("android")) {
return isIPad;
}
+ /**
+ * Tests if the browser is run on Chrome OS (e.g. a Chromebook).
+ *
+ * @return true if run on Chrome OS, false otherwise
+ */
+ public boolean isChromeOS() {
+ return isChromeOS;
+ }
+
/**
* Returns the major version of the operating system. Currently only
* supported for mobile devices (iOS/Android)