]> source.dussan.org Git - vaadin-framework.git/commitdiff
Add support for detecting ChromeOS operating system (#9698)
authorFlamenco <Flamenco@users.noreply.github.com>
Thu, 27 Jul 2017 10:24:43 +0000 (06:24 -0400)
committerHenri Sara <henri.sara@gmail.com>
Thu, 27 Jul 2017 10:24:43 +0000 (13:24 +0300)
client/src/test/java/com/vaadin/client/VBrowserDetailsUserAgentParserTest.java
server/src/main/java/com/vaadin/server/WebBrowser.java
shared/src/main/java/com/vaadin/shared/VBrowserDetails.java

index bc4b7d15243074aaa684e91612440775454ee5d0..2594b3d09d40b52c11cad4e0abede5772527691f 100644 (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());
     }
 
 }
index 82f5e2df79709686aa1e7a73c3b4c3eb6eef136e..b454da030c50e0f68d41bbfe7b727165fef408df 100644 (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
index fdf9b5f723f50f966fe0cc8b21cee23154ad00b0..17a7cafff28da85322e65f5dd3d1e2ca8d783b1e 100644 (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)