From f6d1c4adf5bd0589ac7cc36a248aa5ee1863e3fd Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Fri, 16 Apr 2010 12:46:07 +0000 Subject: [PATCH] Test case and fix for #4562 - Browser version parsing fails for some browsers svn changeset:12610/svn branch:6.3 --- .../terminal/gwt/client/VBrowserDetails.java | 78 +++++++++++-------- .../tests/server/BrowserUserAgentParser.java | 18 +++++ 2 files changed, 65 insertions(+), 31 deletions(-) diff --git a/src/com/vaadin/terminal/gwt/client/VBrowserDetails.java b/src/com/vaadin/terminal/gwt/client/VBrowserDetails.java index d9f585e44f..92b3dedf1f 100644 --- a/src/com/vaadin/terminal/gwt/client/VBrowserDetails.java +++ b/src/com/vaadin/terminal/gwt/client/VBrowserDetails.java @@ -57,41 +57,57 @@ public class VBrowserDetails implements Serializable { isFirefox = userAgent.indexOf(" firefox/") != -1; // Rendering engine version - if (isGecko) { - String tmp = userAgent.substring(userAgent.indexOf("rv:") + 3); - tmp = tmp.replaceFirst("(\\.[0-9]+).+", "$1"); - browserEngineVersion = Float.parseFloat(tmp); - } else if (isWebKit) { - String tmp = userAgent.substring(userAgent.indexOf("webkit/") + 7); - tmp = tmp.replaceFirst("([0-9]+)[^0-9].+", "$1"); - browserEngineVersion = Float.parseFloat(tmp); + try { + if (isGecko) { + int rvPos = userAgent.indexOf("rv:"); + if (rvPos >= 0) { + String tmp = userAgent.substring(rvPos + 3); + tmp = tmp.replaceFirst("(\\.[0-9]+).+", "$1"); + browserEngineVersion = Float.parseFloat(tmp); + } + } else if (isWebKit) { + String tmp = userAgent + .substring(userAgent.indexOf("webkit/") + 7); + tmp = tmp.replaceFirst("([0-9]+)[^0-9].+", "$1"); + browserEngineVersion = Float.parseFloat(tmp); + } + } catch (Exception e) { + // Browser engine version parsing failed + System.err.println("Browser engine version parsing failed for: " + + userAgent); } // Browser version - if (isIE) { - 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)); - } else if (isChrome) { - int i = userAgent.indexOf(" chrome/") + 8; - parseVersionString(safeSubstring(userAgent, i, i + 5)); - } else if (isSafari) { - int i = userAgent.indexOf(" version/") + 9; - parseVersionString(safeSubstring(userAgent, i, i + 5)); - } else if (isOpera) { - int i = userAgent.indexOf(" version/"); - if (i != -1) { - // Version present in Opera 10 and newer - i += 9; // " version/".length - } else { - i = userAgent.indexOf("opera/") + 6; + try { + if (isIE) { + 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)); + } else if (isChrome) { + int i = userAgent.indexOf(" chrome/") + 8; + parseVersionString(safeSubstring(userAgent, i, i + 5)); + } else if (isSafari) { + int i = userAgent.indexOf(" version/") + 9; + parseVersionString(safeSubstring(userAgent, i, i + 5)); + } else if (isOpera) { + int i = userAgent.indexOf(" version/"); + if (i != -1) { + // Version present in Opera 10 and newer + i += 9; // " version/".length + } else { + i = userAgent.indexOf("opera/") + 6; + } + parseVersionString(safeSubstring(userAgent, i, i + 5)); } - parseVersionString(safeSubstring(userAgent, i, i + 5)); + } catch (Exception e) { + // Browser version parsing failed + System.err.println("Browser version parsing failed for: " + + userAgent); } // Operating system diff --git a/tests/src/com/vaadin/tests/server/BrowserUserAgentParser.java b/tests/src/com/vaadin/tests/server/BrowserUserAgentParser.java index 168b99a19b..c1fa4e82f6 100644 --- a/tests/src/com/vaadin/tests/server/BrowserUserAgentParser.java +++ b/tests/src/com/vaadin/tests/server/BrowserUserAgentParser.java @@ -11,6 +11,8 @@ public class BrowserUserAgentParser extends TestCase { private static final String FIREFOX35_WINDOWS = "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 (.NET CLR 3.5.30729) FirePHP/0.4"; private static final String FIREFOX36_WINDOWS = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)"; private static final String FIREFOX36B_MAC = "UAString mozilla/5.0 (macintosh; u; intel mac os x 10.6; en-us; rv:1.9.2) gecko/20100115 firefox/3.6"; + private static final String FIREFOX_30B5_MAC = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9b5) Gecko/2008032619 Firefox/3.0b5"; + private static final String KONQUEROR_LINUX = "Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Exabot-Thumbnails)"; private static final String IE6_WINDOWS = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)"; private static final String IE7_WINDOWS = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"; @@ -106,6 +108,22 @@ public class BrowserUserAgentParser extends TestCase { assertWindows(bd); } + public void testFirefox30b5() { + VBrowserDetails bd = new VBrowserDetails(FIREFOX_30B5_MAC); + assertGecko(bd); + assertFirefox(bd); + assertBrowserMajorVersion(bd, 3); + assertBrowserMinorVersion(bd, 0); + assertEngineVersion(bd, 1.9f); + assertMacOSX(bd); + } + + public void testKonquerorLinux() { + // Just ensure detection does not crash + VBrowserDetails bd = new VBrowserDetails(KONQUEROR_LINUX); + assertLinux(bd); + } + public void testFirefox36b() { VBrowserDetails bd = new VBrowserDetails(FIREFOX36B_MAC); assertGecko(bd); -- 2.39.5