]> source.dussan.org Git - vaadin-framework.git/commitdiff
Parse Trident versions to support IE in compatibility mode (#9887) 07/107/1
authorLeif Åstrand <leif@vaadin.com>
Wed, 10 Oct 2012 12:10:07 +0000 (15:10 +0300)
committerLeif Åstrand <leif@vaadin.com>
Wed, 10 Oct 2012 12:10:07 +0000 (15:10 +0300)
Change-Id: If4c12ed2ec4fca63bb68259f44904e014782792b

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

index 70c1b130fd5b4ffcc9e7ad6ec2afc1d2dfc8cbb4..b1d60f50b5eb54b6a2adcff452c31b6804f85a72 100644 (file)
@@ -22,7 +22,7 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
     private static final String IE8_WINDOWS = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2)";
     private static final String IE8_IN_IE7_MODE_WINDOWS = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2)";
 
-    private static final String IE9_BETA_IN_IE7_MODE_WINDOWS_7 = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C)";
+    private static final String IE9_IN_IE7_MODE_WINDOWS_7 = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C)";
     private static final String IE9_BETA_IN_IE8_MODE_WINDOWS_7 = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C)";
     private static final String IE9_BETA_WINDOWS_7 = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)";
 
@@ -279,7 +279,7 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
 
     public void testIE6() {
         VBrowserDetails bd = new VBrowserDetails(IE6_WINDOWS);
-        // assertTrident(bd);
+        assertEngineVersion(bd, -1);
         assertIE(bd);
         assertBrowserMajorVersion(bd, 6);
         assertBrowserMinorVersion(bd, 0);
@@ -288,7 +288,7 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
 
     public void testIE7() {
         VBrowserDetails bd = new VBrowserDetails(IE7_WINDOWS);
-        // assertTrident(bd);
+        assertEngineVersion(bd, -1);
         assertIE(bd);
         assertBrowserMajorVersion(bd, 7);
         assertBrowserMinorVersion(bd, 0);
@@ -297,7 +297,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);
         assertBrowserMinorVersion(bd, 0);
@@ -308,7 +308,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);
         assertBrowserMinorVersion(bd, 0);
@@ -318,7 +318,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);
         assertBrowserMinorVersion(bd, 0);
@@ -326,10 +326,10 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
     }
 
     public void testIE9InIE7CompatibilityMode() {
-        VBrowserDetails bd = new VBrowserDetails(IE9_BETA_IN_IE7_MODE_WINDOWS_7);
+        VBrowserDetails bd = new VBrowserDetails(IE9_IN_IE7_MODE_WINDOWS_7);
         // bd.setIE8InCompatibilityMode();
 
-        // assertTrident(bd);
+        assertEngineVersion(bd, 5);
         assertIE(bd);
         assertBrowserMajorVersion(bd, 7);
         assertBrowserMinorVersion(bd, 0);
@@ -341,7 +341,11 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase {
         VBrowserDetails bd = new VBrowserDetails(IE9_BETA_IN_IE8_MODE_WINDOWS_7);
         // bd.setIE8InCompatibilityMode();
 
-        // assertTrident(bd);
+        /*
+         * 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
+         */
+        assertEngineVersion(bd, 4);
         assertIE(bd);
         assertBrowserMajorVersion(bd, 8);
         assertBrowserMinorVersion(bd, 0);
index 9a0e4c2071bde347c42689a48a1558ec3a8653a3..f4da147667f341e84f6f418053e2ae6b507d5328 100644 (file)
@@ -239,10 +239,13 @@ public abstract class BootstrapHandler implements RequestHandler {
         head.appendElement("meta").attr("http-equiv", "Content-Type")
                 .attr("content", "text/html; charset=utf-8");
 
-        // Chrome frame in all versions of IE (only if Chrome frame is
-        // installed)
+        /*
+         * Enable Chrome Frame in all versions of IE if installed.
+         * 
+         * Claim IE10 support to avoid using compatibility mode.
+         */
         head.appendElement("meta").attr("http-equiv", "X-UA-Compatible")
-                .attr("content", "chrome=1");
+                .attr("content", "IE=10;chrome=1");
 
         String title = response.getUIProvider().getPageTitle(
                 new UICreateEvent(context.getRequest(), context.getUIClass()));
index 2143e884c071f4c372427ac6386cc9559d188067..46d29ac75c31d9943d09cb3b71dce5f06199b196 100644 (file)
@@ -95,6 +95,14 @@ public class VBrowserDetails implements Serializable {
                         .substring(userAgent.indexOf("webkit/") + 7);
                 tmp = tmp.replaceFirst("([0-9]+)[^0-9].+", "$1");
                 browserEngineVersion = Float.parseFloat(tmp);
+            } else if (isIE) {
+                int tridentPos = userAgent.indexOf("trident/");
+                if (tridentPos >= 0) {
+                    String tmp = userAgent.substring(tridentPos
+                            + "Trident/".length());
+                    tmp = tmp.replaceFirst("([0-9]+\\.[0-9]+).*", "$1");
+                    browserEngineVersion = Float.parseFloat(tmp);
+                }
             }
         } catch (Exception e) {
             // Browser engine version parsing failed
@@ -456,7 +464,9 @@ public class VBrowserDetails implements Serializable {
      *         supported or might work
      */
     public boolean isTooOldToFunctionProperly() {
-        if (isIE() && getBrowserMajorVersion() < 8) {
+        // Check Trident version to detect compatibility mode
+        if (isIE() && getBrowserMajorVersion() < 8
+                && getBrowserEngineVersion() < 4) {
             return true;
         }
         // Webkit 533 in Safari 4.1+, Android 2.2+, iOS 4+