From a0fa605da1b9dd1b17c6795673b6d003882fe384 Mon Sep 17 00:00:00 2001 From: Henri Sara Date: Wed, 7 Apr 2010 10:06:48 +0000 Subject: [PATCH] #4491 browser minor version detection and related CSS classes svn changeset:12345/svn branch:6.3 --- .../terminal/gwt/client/BrowserInfo.java | 17 +++++-- .../terminal/gwt/client/VBrowserDetails.java | 45 ++++++++++++++----- .../tests/server/BrowserUserAgentParser.java | 26 +++++++++-- 3 files changed, 69 insertions(+), 19 deletions(-) diff --git a/src/com/vaadin/terminal/gwt/client/BrowserInfo.java b/src/com/vaadin/terminal/gwt/client/BrowserInfo.java index cb4e307cee..81a71234f7 100644 --- a/src/com/vaadin/terminal/gwt/client/BrowserInfo.java +++ b/src/com/vaadin/terminal/gwt/client/BrowserInfo.java @@ -63,10 +63,10 @@ public class BrowserInfo { /** * Returns a string representing the browser in use, for use in CSS - * classnames. The classnames will be space separated abbrevitaions, + * classnames. The classnames will be space separated abbreviations, * optionally with a version appended. * - * Abbreviaions: Firefox: ff Internet Explorer: ie Safari: sa Opera: op + * Abbreviations: Firefox: ff Internet Explorer: ie Safari: sa Opera: op * * Browsers that CSS-wise behave like each other will get the same * abbreviation (this usually depends on the rendering engine). @@ -74,8 +74,9 @@ public class BrowserInfo { * This is quite simple at the moment, more heuristics will be added when * needed. * - * Examples: Internet Explorer 6: ".v-ie .v-ie6", Firefox 3.0.4: - * ".v-ff .v-ff3", Opera 9.60: ".v-op .v-op96" + * Examples: Internet Explorer 6: ".v-ie .v-ie6 .v-ie60", Firefox 3.0.4: + * ".v-ff .v-ff3 .v-ff30", Opera 9.60: ".v-op .v-op9 .v-op960", Opera 10.10: + * ".v-op .v-op10 .v-op1010" * * @return */ @@ -85,9 +86,11 @@ public class BrowserInfo { if (cssClass == null) { String b = ""; String v = ""; + String vv = ""; if (browserDetails.isFirefox()) { b = "ff"; v = b + browserDetails.getBrowserMajorVersion(); + vv = v + browserDetails.getBrowserMinorVersion(); } else if (browserDetails.isChrome()) { // TODO update when Chrome is more stable b = "sa"; @@ -95,14 +98,20 @@ public class BrowserInfo { } else if (browserDetails.isSafari()) { b = "sa"; v = b + browserDetails.getBrowserMajorVersion(); + vv = v + browserDetails.getBrowserMinorVersion(); } else if (browserDetails.isIE()) { b = "ie"; v = b + browserDetails.getBrowserMajorVersion(); + vv = v + browserDetails.getBrowserMinorVersion(); } else if (browserDetails.isOpera()) { b = "op"; v = b + browserDetails.getBrowserMajorVersion(); + vv = v + browserDetails.getBrowserMinorVersion(); } cssClass = prefix + b + " " + prefix + v; + if (!"".equals(vv)) { + cssClass = cssClass + " " + prefix + vv; + } } return cssClass; diff --git a/src/com/vaadin/terminal/gwt/client/VBrowserDetails.java b/src/com/vaadin/terminal/gwt/client/VBrowserDetails.java index e7bafa5a8c..ea2a709830 100644 --- a/src/com/vaadin/terminal/gwt/client/VBrowserDetails.java +++ b/src/com/vaadin/terminal/gwt/client/VBrowserDetails.java @@ -27,6 +27,7 @@ public class VBrowserDetails implements Serializable { private float browserEngineVersion = -1; private int browserMajorVersion = -1; + private int browserMinorVersion = -1; /** * Create an instance based on the given user agent. @@ -68,20 +69,16 @@ public class VBrowserDetails implements Serializable { .indexOf("msie ") + 5); ieVersionString = ieVersionString.substring(0, ieVersionString .indexOf(";")); - // FIXME parseInt - browserMajorVersion = (int) Float.parseFloat(ieVersionString); + parseVersionString(ieVersionString); } else if (isFirefox) { int i = userAgent.indexOf(" firefox/") + 9; - browserMajorVersion = Integer.parseInt(userAgent - .substring(i, i + 1)); + parseVersionString(userAgent.substring(i, i + 5)); } else if (isChrome) { int i = userAgent.indexOf(" chrome/") + 8; - browserMajorVersion = Integer.parseInt(userAgent - .substring(i, i + 1)); + parseVersionString(userAgent.substring(i, i + 5)); } else if (isSafari) { int i = userAgent.indexOf(" version/") + 9; - browserMajorVersion = Integer.parseInt(userAgent - .substring(i, i + 1)); + parseVersionString(userAgent.substring(i, i + 5)); } else if (isOpera) { int i = userAgent.indexOf(" version/"); if (i != -1) { @@ -90,13 +87,26 @@ public class VBrowserDetails implements Serializable { } else { i = userAgent.indexOf("opera/") + 6; } - - browserMajorVersion = Integer.parseInt(userAgent - .substring(i, i + 2).replace(".", "")); + parseVersionString(userAgent.substring(i, i + 5)); } } + private void parseVersionString(String versionString) { + int idx = versionString.indexOf('.'); + int idx2 = versionString.indexOf('.', idx + 1); + if (idx2 < 0) { + idx2 = versionString.length(); + } + browserMajorVersion = Integer.parseInt(versionString.substring(0, idx)); + try { + browserMinorVersion = Integer.parseInt(versionString.substring( + idx + 1, idx2).replaceAll("[^0-9].*", "")); + } catch (NumberFormatException e) { + // leave the minor version unmodified (-1 = unknown) + } + } + /** * Tests if the browser is Firefox. * @@ -193,6 +203,17 @@ public class VBrowserDetails implements Serializable { return browserMajorVersion; } + /** + * Returns the browser minor version e.g., 5 for Firefox 3.5. + * + * @see #getBrowserMajorVersion() + * + * @return The minor version of the browser, or -1 if not known/parsed. + */ + public final int getBrowserMinorVersion() { + return browserMinorVersion; + } + /** * Marks that IE8 is used in compatibility mode. This forces the browser * version to 7 even if it otherwise was detected as 8. @@ -201,7 +222,7 @@ public class VBrowserDetails implements Serializable { public void setIE8InCompatibilityMode() { if (isIE && browserMajorVersion == 8) { browserMajorVersion = 7; + browserMinorVersion = 0; } } - } diff --git a/tests/src/com/vaadin/tests/server/BrowserUserAgentParser.java b/tests/src/com/vaadin/tests/server/BrowserUserAgentParser.java index 63b0783c92..5e89c7de33 100644 --- a/tests/src/com/vaadin/tests/server/BrowserUserAgentParser.java +++ b/tests/src/com/vaadin/tests/server/BrowserUserAgentParser.java @@ -16,7 +16,7 @@ public class BrowserUserAgentParser extends TestCase { private static final String IE8_IN_IE7_MODE = "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)"; // "Version/" was added in 10.00 - private static final String OPERA960 = "Opera/9.64(Windows NT 5.1; U; en) Presto/2.1.1"; + private static final String OPERA964 = "Opera/9.64(Windows NT 5.1; U; en) Presto/2.1.1"; private static final String OPERA1010 = "Opera/9.80 (Windows NT 5.1; U; en) Presto/2.2.15 Version/10.10"; private static final String OPERA1050 = "Opera/9.80 (Windows NT 5.1; U; en) Presto/2.5.22 Version/10.50"; @@ -31,6 +31,7 @@ public class BrowserUserAgentParser extends TestCase { assertWebKit(bd); assertSafari(bd); assertBrowserMajorVersion(bd, 3); + assertBrowserMinorVersion(bd, 2); assertEngineVersion(bd, 525.0f); } @@ -39,6 +40,7 @@ public class BrowserUserAgentParser extends TestCase { assertWebKit(bd); assertSafari(bd); assertBrowserMajorVersion(bd, 4); + assertBrowserMinorVersion(bd, 0); assertEngineVersion(bd, 531f); } @@ -47,6 +49,7 @@ public class BrowserUserAgentParser extends TestCase { assertWebKit(bd); assertChrome(bd); assertBrowserMajorVersion(bd, 3); + assertBrowserMinorVersion(bd, 0); assertEngineVersion(bd, 532.0f); } @@ -55,6 +58,7 @@ public class BrowserUserAgentParser extends TestCase { assertWebKit(bd); assertChrome(bd); assertBrowserMajorVersion(bd, 4); + assertBrowserMinorVersion(bd, 0); assertEngineVersion(bd, 532f); } @@ -63,6 +67,7 @@ public class BrowserUserAgentParser extends TestCase { assertGecko(bd); assertFirefox(bd); assertBrowserMajorVersion(bd, 3); + assertBrowserMinorVersion(bd, 0); assertEngineVersion(bd, 1.9f); } @@ -71,6 +76,7 @@ public class BrowserUserAgentParser extends TestCase { assertGecko(bd); assertFirefox(bd); assertBrowserMajorVersion(bd, 3); + assertBrowserMinorVersion(bd, 5); assertEngineVersion(bd, 1.9f); } @@ -79,14 +85,16 @@ public class BrowserUserAgentParser extends TestCase { assertGecko(bd); assertFirefox(bd); assertBrowserMajorVersion(bd, 3); + assertBrowserMinorVersion(bd, 6); assertEngineVersion(bd, 1.9f); } - public void testOpera960() { - VBrowserDetails bd = new VBrowserDetails(OPERA960); + public void testOpera964() { + VBrowserDetails bd = new VBrowserDetails(OPERA964); assertPresto(bd); assertOpera(bd); assertBrowserMajorVersion(bd, 9); + assertBrowserMinorVersion(bd, 64); } public void testOpera1010() { @@ -94,6 +102,7 @@ public class BrowserUserAgentParser extends TestCase { assertPresto(bd); assertOpera(bd); assertBrowserMajorVersion(bd, 10); + assertBrowserMinorVersion(bd, 10); } public void testOpera1050() { @@ -101,6 +110,7 @@ public class BrowserUserAgentParser extends TestCase { assertPresto(bd); assertOpera(bd); assertBrowserMajorVersion(bd, 10); + assertBrowserMinorVersion(bd, 50); } public void testIE6() { @@ -108,6 +118,7 @@ public class BrowserUserAgentParser extends TestCase { // assertTrident(bd); assertIE(bd); assertBrowserMajorVersion(bd, 6); + assertBrowserMinorVersion(bd, 0); } public void testIE7() { @@ -115,6 +126,7 @@ public class BrowserUserAgentParser extends TestCase { // assertTrident(bd); assertIE(bd); assertBrowserMajorVersion(bd, 7); + assertBrowserMinorVersion(bd, 0); } public void testIE8() { @@ -122,6 +134,7 @@ public class BrowserUserAgentParser extends TestCase { // assertTrident(bd); assertIE(bd); assertBrowserMajorVersion(bd, 8); + assertBrowserMinorVersion(bd, 0); } public void testIE8CompatibilityMode() { @@ -131,6 +144,7 @@ public class BrowserUserAgentParser extends TestCase { // assertTrident(bd); assertIE(bd); assertBrowserMajorVersion(bd, 7); + assertBrowserMinorVersion(bd, 0); } /* @@ -149,6 +163,12 @@ public class BrowserUserAgentParser extends TestCase { } + private void assertBrowserMinorVersion(VBrowserDetails browserDetails, + int version) { + assertEquals(version, browserDetails.getBrowserMinorVersion()); + + } + private void assertGecko(VBrowserDetails browserDetails) { // Engine assertTrue(browserDetails.isGecko()); -- 2.39.5