]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fixes browser detection for IE11 (#12638)
authorArtur Signell <artur@vaadin.com>
Tue, 24 Sep 2013 08:36:18 +0000 (11:36 +0300)
committerVaadin Code Review <review@vaadin.com>
Wed, 25 Sep 2013 09:59:50 +0000 (09:59 +0000)
Change-Id: I1f71477368ce42eac3679f7f2f9e87fe8e02e4de

client/tests/src/com/vaadin/client/TestVBrowserDetailsUserAgentParser.java
shared/src/com/vaadin/shared/VBrowserDetails.java

index 7d5911f5a0161136201ee63f5210769a7c2fbf3e..5b428574e2d9a46ccae700003a245fe5009adae6 100644 (file)
@@ -27,6 +27,7 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
     private static final String IE9_BETA_WINDOWS_7 = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)";
 
     private static final String IE10_WINDOWS_8 = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)";
+    private static final String IE11_WINDOWS_7 = "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; rv:11.0) like Gecko";
 
     // "Version/" was added in 10.00
     private static final String OPERA964_WINDOWS = "Opera/9.64(Windows NT 5.1; U; en) Presto/2.1.1";
@@ -314,6 +315,7 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
 
     public void testIE8() {
         VBrowserDetails bd = new VBrowserDetails(IE8_WINDOWS);
+        assertTrident(bd);
         assertEngineVersion(bd, 4);
         assertIE(bd);
         assertBrowserMajorVersion(bd, 8);
@@ -325,6 +327,7 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
         VBrowserDetails bd = new VBrowserDetails(IE8_IN_IE7_MODE_WINDOWS);
         bd.setIEMode(7);
 
+        assertTrident(bd);
         assertEngineVersion(bd, 4);
         assertIE(bd);
         assertBrowserMajorVersion(bd, 7);
@@ -335,6 +338,7 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
 
     public void testIE9() {
         VBrowserDetails bd = new VBrowserDetails(IE9_BETA_WINDOWS_7);
+        assertTrident(bd);
         assertEngineVersion(bd, 5);
         assertIE(bd);
         assertBrowserMajorVersion(bd, 9);
@@ -346,6 +350,7 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
         VBrowserDetails bd = new VBrowserDetails(IE9_IN_IE7_MODE_WINDOWS_7);
         // bd.setIE8InCompatibilityMode();
 
+        assertTrident(bd);
         assertEngineVersion(bd, 5);
         assertIE(bd);
         assertBrowserMajorVersion(bd, 7);
@@ -362,6 +367,7 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
          * Trident/4.0 in example user agent string based on beta even though it
          * should be Trident/5.0 in real (non-beta) user agent strings
          */
+        assertTrident(bd);
         assertEngineVersion(bd, 4);
         assertIE(bd);
         assertBrowserMajorVersion(bd, 8);
@@ -372,6 +378,7 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
 
     public void testIE10() {
         VBrowserDetails bd = new VBrowserDetails(IE10_WINDOWS_8);
+        assertTrident(bd);
         assertEngineVersion(bd, 6);
         assertIE(bd);
         assertBrowserMajorVersion(bd, 10);
@@ -379,6 +386,16 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
         assertWindows(bd);
     }
 
+    public void testIE11() {
+        VBrowserDetails bd = new VBrowserDetails(IE11_WINDOWS_7);
+        assertTrident(bd);
+        assertEngineVersion(bd, 7);
+        assertIE(bd);
+        assertBrowserMajorVersion(bd, 11);
+        assertBrowserMinorVersion(bd, 0);
+        assertWindows(bd);
+    }
+
     /*
      * Helper methods below
      */
@@ -406,6 +423,7 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
         assertTrue(browserDetails.isGecko());
         assertFalse(browserDetails.isWebKit());
         assertFalse(browserDetails.isPresto());
+        assertFalse(browserDetails.isTrident());
     }
 
     private void assertPresto(VBrowserDetails browserDetails) {
@@ -413,6 +431,15 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
         assertFalse(browserDetails.isGecko());
         assertFalse(browserDetails.isWebKit());
         assertTrue(browserDetails.isPresto());
+        assertFalse(browserDetails.isTrident());
+    }
+
+    private void assertTrident(VBrowserDetails browserDetails) {
+        // Engine
+        assertFalse(browserDetails.isGecko());
+        assertFalse(browserDetails.isWebKit());
+        assertFalse(browserDetails.isPresto());
+        assertTrue(browserDetails.isTrident());
     }
 
     private void assertWebKit(VBrowserDetails browserDetails) {
@@ -420,6 +447,7 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
         assertFalse(browserDetails.isGecko());
         assertTrue(browserDetails.isWebKit());
         assertFalse(browserDetails.isPresto());
+        assertFalse(browserDetails.isTrident());
     }
 
     private void assertFirefox(VBrowserDetails browserDetails) {
index f31f5f3c040ff0b8c3a61691af8c623997aac84f..a745a212b059d19b4e06c90f2671d5252e96dff8 100644 (file)
@@ -31,6 +31,7 @@ public class VBrowserDetails implements Serializable {
     private boolean isGecko = false;
     private boolean isWebKit = false;
     private boolean isPresto = false;
+    private boolean isTrident = false;
 
     private boolean isChromeFrameCapable = false;
     private boolean isChromeFrame = false;
@@ -65,9 +66,11 @@ public class VBrowserDetails implements Serializable {
 
         // browser engine name
         isGecko = userAgent.indexOf("gecko") != -1
-                && userAgent.indexOf("webkit") == -1;
+                && userAgent.indexOf("webkit") == -1
+                && userAgent.indexOf("trident/") == -1;
         isWebKit = userAgent.indexOf("applewebkit") != -1;
         isPresto = userAgent.indexOf(" presto/") != -1;
+        isTrident = userAgent.indexOf("trident/") != -1;
 
         // browser name
         isChrome = userAgent.indexOf(" chrome/") != -1;
@@ -75,6 +78,9 @@ public class VBrowserDetails implements Serializable {
         isOpera = userAgent.indexOf("opera") != -1;
         isIE = userAgent.indexOf("msie") != -1 && !isOpera
                 && (userAgent.indexOf("webtv") == -1);
+        // IE 11 no longer contains MSIE in the user agent
+        isIE = isIE || isTrident;
+
         isFirefox = userAgent.indexOf(" firefox/") != -1;
 
         // chromeframe
@@ -113,11 +119,21 @@ public class VBrowserDetails implements Serializable {
         // Browser version
         try {
             if (isIE) {
-                String ieVersionString = userAgent.substring(userAgent
-                        .indexOf("msie ") + 5);
-                ieVersionString = safeSubstring(ieVersionString, 0,
-                        ieVersionString.indexOf(";"));
-                parseVersionString(ieVersionString);
+                if (userAgent.indexOf("msie") == -1) {
+                    // IE 11+
+                    int rvPos = userAgent.indexOf("rv:");
+                    if (rvPos >= 0) {
+                        String tmp = userAgent.substring(rvPos + 3);
+                        tmp = tmp.replaceFirst("(\\.[0-9]+).+", "$1");
+                        parseVersionString(tmp);
+                    }
+                } else {
+                    String ieVersionString = userAgent.substring(userAgent
+                            .indexOf("msie ") + 5);
+                    ieVersionString = safeSubstring(ieVersionString, 0,
+                            ieVersionString.indexOf(";"));
+                    parseVersionString(ieVersionString);
+                }
             } else if (isFirefox) {
                 int i = userAgent.indexOf(" firefox/") + 9;
                 parseVersionString(safeSubstring(userAgent, i, i + 5));
@@ -287,6 +303,16 @@ public class VBrowserDetails implements Serializable {
         return isPresto;
     }
 
+    /**
+     * Tests if the browser is using the Trident engine
+     * 
+     * @since 7.1.7
+     * @return true if it is Trident, false otherwise
+     */
+    public boolean isTrident() {
+        return isTrident;
+    }
+
     /**
      * Tests if the browser is Safari.
      *