From 0248b8f7ba0817cc1dbf8bae431544803602cb08 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Tue, 24 Sep 2013 11:36:18 +0300 Subject: [PATCH] Fixes browser detection for IE11 (#12638) Change-Id: I1f71477368ce42eac3679f7f2f9e87fe8e02e4de --- .../TestVBrowserDetailsUserAgentParser.java | 28 ++++++++++++++ .../com/vaadin/shared/VBrowserDetails.java | 38 ++++++++++++++++--- 2 files changed, 60 insertions(+), 6 deletions(-) diff --git a/client/tests/src/com/vaadin/client/TestVBrowserDetailsUserAgentParser.java b/client/tests/src/com/vaadin/client/TestVBrowserDetailsUserAgentParser.java index 7d5911f5a0..5b428574e2 100644 --- a/client/tests/src/com/vaadin/client/TestVBrowserDetailsUserAgentParser.java +++ b/client/tests/src/com/vaadin/client/TestVBrowserDetailsUserAgentParser.java @@ -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) { diff --git a/shared/src/com/vaadin/shared/VBrowserDetails.java b/shared/src/com/vaadin/shared/VBrowserDetails.java index f31f5f3c04..a745a212b0 100644 --- a/shared/src/com/vaadin/shared/VBrowserDetails.java +++ b/shared/src/com/vaadin/shared/VBrowserDetails.java @@ -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. * -- 2.39.5