Browse Source

Fixes browser detection for IE11 (#12638)

Change-Id: I1f71477368ce42eac3679f7f2f9e87fe8e02e4de
tags/7.1.7
Artur Signell 10 years ago
parent
commit
0248b8f7ba

+ 28
- 0
client/tests/src/com/vaadin/client/TestVBrowserDetailsUserAgentParser.java View 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) {

+ 32
- 6
shared/src/com/vaadin/shared/VBrowserDetails.java View 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.
*

Loading…
Cancel
Save