Browse Source

Add support for detecting ChromeOS operating system (#9698)

tags/8.1.1
Flamenco 6 years ago
parent
commit
410965ddca

+ 27
- 0
client/src/test/java/com/vaadin/client/VBrowserDetailsUserAgentParserTest.java View File

@@ -57,6 +57,8 @@ public class VBrowserDetailsUserAgentParserTest {
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);
@@ -205,6 +207,17 @@ public class VBrowserDetailsUserAgentParserTest {
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);
@@ -570,6 +583,7 @@ public class VBrowserDetailsUserAgentParserTest {
assertFalse(browserDetails.isWindows());
assertTrue(browserDetails.isMacOSX());
assertFalse(browserDetails.isAndroid());
assertFalse(browserDetails.isChromeOS());
}

private void assertAndroid(VBrowserDetails browserDetails, int majorVersion,
@@ -579,6 +593,7 @@ public class VBrowserDetailsUserAgentParserTest {
assertFalse(browserDetails.isMacOSX());
assertFalse(browserDetails.isIOS());
assertTrue(browserDetails.isAndroid());
assertFalse(browserDetails.isChromeOS());

assertOSMajorVersion(browserDetails, majorVersion);
assertOSMinorVersion(browserDetails, minorVersion);
@@ -591,6 +606,7 @@ public class VBrowserDetailsUserAgentParserTest {
assertFalse(browserDetails.isMacOSX());
assertTrue(browserDetails.isIOS());
assertFalse(browserDetails.isAndroid());
assertFalse(browserDetails.isChromeOS());

assertOSMajorVersion(browserDetails, majorVersion);
assertOSMinorVersion(browserDetails, minorVersion);
@@ -617,6 +633,7 @@ public class VBrowserDetailsUserAgentParserTest {
assertFalse(browserDetails.isMacOSX());
assertFalse(browserDetails.isIOS());
assertFalse(browserDetails.isAndroid());
assertFalse(browserDetails.isChromeOS());
Assert.assertEquals(isWindowsPhone, browserDetails.isWindowsPhone());
}

@@ -626,6 +643,16 @@ public class VBrowserDetailsUserAgentParserTest {
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());
}

}

+ 10
- 0
server/src/main/java/com/vaadin/server/WebBrowser.java View File

@@ -329,6 +329,16 @@ public class WebBrowser implements Serializable {
return browserDetails.isIPad();
}

/**
* Tests if the browser is run on ChromeOS (e.g. a Chromebook).
*
* @return true if run on ChromeOS false if the user is not using ChromeOS or if no
* information on the browser is present
*/
public boolean isChromeOS() {
return browserDetails.isChromeOS();
}

/**
* Returns the browser-reported TimeZone offset in milliseconds from GMT.
* This includes possible daylight saving adjustments, to figure out which

+ 53
- 1
shared/src/main/java/com/vaadin/shared/VBrowserDetails.java View File

@@ -47,11 +47,12 @@ public class VBrowserDetails implements Serializable {
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;
@@ -217,9 +218,51 @@ public class VBrowserDetails implements Serializable {
} 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")) {
@@ -558,6 +601,15 @@ public class VBrowserDetails implements Serializable {
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)

Loading…
Cancel
Save