From 685d3ef1a18881b528a2a27227269aab36cfd0d8 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Fri, 9 Apr 2010 15:10:26 +0000 Subject: [PATCH] Fix for #4356 "Add operating system detection" and #4510 "Add css class names according to browser engine" svn changeset:12453/svn branch:6.3 --- .../terminal/gwt/client/BrowserInfo.java | 92 ++++++++++++---- .../terminal/gwt/client/VBrowserDetails.java | 58 ++++++++-- .../terminal/gwt/server/WebBrowser.java | 31 ++++++ .../tests/server/BrowserUserAgentParser.java | 104 +++++++++++++----- 4 files changed, 227 insertions(+), 58 deletions(-) diff --git a/src/com/vaadin/terminal/gwt/client/BrowserInfo.java b/src/com/vaadin/terminal/gwt/client/BrowserInfo.java index 81a71234f7..988396a793 100644 --- a/src/com/vaadin/terminal/gwt/client/BrowserInfo.java +++ b/src/com/vaadin/terminal/gwt/client/BrowserInfo.java @@ -15,6 +15,20 @@ import com.google.gwt.user.client.ui.RootPanel; */ public class BrowserInfo { + private static final String BROWSER_OPERA = "op"; + private static final String BROWSER_IE = "ie"; + private static final String BROWSER_FIREFOX = "ff"; + private static final String BROWSER_SAFARI = "sa"; + + public static final String ENGINE_GECKO = "gecko"; + public static final String ENGINE_WEBKIT = "webkit"; + public static final String ENGINE_PRESTO = "presto"; + public static final String ENGINE_TRIDENT = "trident"; + + private static final String OS_WINDOWS = "win"; + private static final String OS_LINUX = "lin"; + private static final String OS_MACOSX = "mac"; + private static BrowserInfo instance; private static String cssClass = null; @@ -84,39 +98,77 @@ public class BrowserInfo { String prefix = "v-"; if (cssClass == null) { - String b = ""; - String v = ""; - String vv = ""; + String browserIdentifier = ""; + String majorVersionClass = ""; + String minorVersionClass = ""; + String browserEngineClass = ""; + if (browserDetails.isFirefox()) { - b = "ff"; - v = b + browserDetails.getBrowserMajorVersion(); - vv = v + browserDetails.getBrowserMinorVersion(); + browserIdentifier = BROWSER_FIREFOX; + majorVersionClass = browserIdentifier + + browserDetails.getBrowserMajorVersion(); + minorVersionClass = majorVersionClass + + browserDetails.getBrowserMinorVersion(); + browserEngineClass = ENGINE_GECKO; } else if (browserDetails.isChrome()) { // TODO update when Chrome is more stable - b = "sa"; - v = "ch"; + browserIdentifier = BROWSER_SAFARI; + majorVersionClass = "ch"; + browserEngineClass = ENGINE_WEBKIT; } else if (browserDetails.isSafari()) { - b = "sa"; - v = b + browserDetails.getBrowserMajorVersion(); - vv = v + browserDetails.getBrowserMinorVersion(); + browserIdentifier = BROWSER_SAFARI; + majorVersionClass = browserIdentifier + + browserDetails.getBrowserMajorVersion(); + minorVersionClass = majorVersionClass + + browserDetails.getBrowserMinorVersion(); + browserEngineClass = ENGINE_WEBKIT; } else if (browserDetails.isIE()) { - b = "ie"; - v = b + browserDetails.getBrowserMajorVersion(); - vv = v + browserDetails.getBrowserMinorVersion(); + browserIdentifier = BROWSER_IE; + majorVersionClass = browserIdentifier + + browserDetails.getBrowserMajorVersion(); + minorVersionClass = majorVersionClass + + browserDetails.getBrowserMinorVersion(); + browserEngineClass = ENGINE_TRIDENT; } else if (browserDetails.isOpera()) { - b = "op"; - v = b + browserDetails.getBrowserMajorVersion(); - vv = v + browserDetails.getBrowserMinorVersion(); + browserIdentifier = BROWSER_OPERA; + majorVersionClass = browserIdentifier + + browserDetails.getBrowserMajorVersion(); + minorVersionClass = majorVersionClass + + browserDetails.getBrowserMinorVersion(); + browserEngineClass = ENGINE_PRESTO; + } + + cssClass = prefix + browserIdentifier; + if (!"".equals(majorVersionClass)) { + cssClass = cssClass + " " + prefix + majorVersionClass; } - cssClass = prefix + b + " " + prefix + v; - if (!"".equals(vv)) { - cssClass = cssClass + " " + prefix + vv; + if (!"".equals(minorVersionClass)) { + cssClass = cssClass + " " + prefix + minorVersionClass; + } + if (!"".equals(browserEngineClass)) { + cssClass = cssClass + " " + prefix + browserEngineClass; + } + String osClass = getOperatingSystemClass(); + if (osClass != null) { + cssClass = cssClass + " " + prefix + osClass; } } return cssClass; } + private String getOperatingSystemClass() { + if (browserDetails.isWindows()) { + return OS_WINDOWS; + } else if (browserDetails.isLinux()) { + return OS_LINUX; + } else if (browserDetails.isMacOSX()) { + return OS_MACOSX; + } + // Unknown OS + return null; + } + public boolean isIE() { return browserDetails.isIE(); } diff --git a/src/com/vaadin/terminal/gwt/client/VBrowserDetails.java b/src/com/vaadin/terminal/gwt/client/VBrowserDetails.java index 808a24c638..d9f585e44f 100644 --- a/src/com/vaadin/terminal/gwt/client/VBrowserDetails.java +++ b/src/com/vaadin/terminal/gwt/client/VBrowserDetails.java @@ -15,15 +15,19 @@ import com.vaadin.terminal.gwt.server.WebBrowser; */ public class VBrowserDetails implements Serializable { - private boolean isGecko; - private boolean isWebKit; - private boolean isPresto; + private boolean isGecko = false; + private boolean isWebKit = false; + private boolean isPresto = false; - private boolean isSafari; - private boolean isChrome; - private boolean isFirefox; - private boolean isOpera; - private boolean isIE; + private boolean isSafari = false; + private boolean isChrome = false; + private boolean isFirefox = false; + private boolean isOpera = false; + private boolean isIE = false; + + private boolean isWindows = false; + private boolean isMacOSX = false; + private boolean isLinux = false; private float browserEngineVersion = -1; private int browserMajorVersion = -1; @@ -90,6 +94,16 @@ public class VBrowserDetails implements Serializable { parseVersionString(safeSubstring(userAgent, i, i + 5)); } + // Operating system + if (userAgent.contains("windows ")) { + isWindows = true; + } else if (userAgent.contains("linux")) { + isLinux = true; + } else if (userAgent.contains("macintosh") + || userAgent.contains("mac osx") + || userAgent.contains("mac os x")) { + isMacOSX = true; + } } private void parseVersionString(String versionString) { @@ -240,4 +254,32 @@ public class VBrowserDetails implements Serializable { browserMinorVersion = 0; } } + + /** + * Tests if the browser is run on Windows. + * + * @return true if run on Windows, false otherwise + */ + public boolean isWindows() { + return isWindows; + } + + /** + * Tests if the browser is run on Mac OSX. + * + * @return true if run on Mac OSX, false otherwise + */ + public boolean isMacOSX() { + return isMacOSX; + } + + /** + * Tests if the browser is run on Linux. + * + * @return true if run on Linux, false otherwise + */ + public boolean isLinux() { + return isLinux; + } + } diff --git a/src/com/vaadin/terminal/gwt/server/WebBrowser.java b/src/com/vaadin/terminal/gwt/server/WebBrowser.java index 81d4a638a3..1d6881a836 100644 --- a/src/com/vaadin/terminal/gwt/server/WebBrowser.java +++ b/src/com/vaadin/terminal/gwt/server/WebBrowser.java @@ -225,4 +225,35 @@ public class WebBrowser implements Terminal { return browserDetails.getBrowserMinorVersion(); } + + /** + * Tests whether the user is using Linux. + * + * @return true if the user is using Linux, false if the user is not using + * Linux or if no information on the browser is present + */ + public boolean isLinux() { + return browserDetails.isLinux(); + } + + /** + * Tests whether the user is using Mac OS X. + * + * @return true if the user is using Mac OS X, false if the user is not + * using Mac OS X or if no information on the browser is present + */ + public boolean isMacOSX() { + return browserDetails.isMacOSX(); + } + + /** + * Tests whether the user is using Windows. + * + * @return true if the user is using Windows, false if the user is not using + * Windows or if no information on the browser is present + */ + public boolean isWindows() { + return browserDetails.isWindows(); + } + } diff --git a/tests/src/com/vaadin/tests/server/BrowserUserAgentParser.java b/tests/src/com/vaadin/tests/server/BrowserUserAgentParser.java index 1f851107e6..168b99a19b 100644 --- a/tests/src/com/vaadin/tests/server/BrowserUserAgentParser.java +++ b/tests/src/com/vaadin/tests/server/BrowserUserAgentParser.java @@ -6,155 +6,180 @@ import com.vaadin.terminal.gwt.client.VBrowserDetails; public class BrowserUserAgentParser extends TestCase { - private static final String FIREFOX30 = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6"; - private static final String FIREFOX35 = "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 = "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 = "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 FIREFOX30_WINDOWS = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6"; + private static final String FIREFOX30_LINUX = "Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.0.12) Gecko/2009070811 Ubuntu/9.04 (jaunty) Firefox/3.0.12"; + 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 IE6 = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)"; - private static final String IE7 = "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)"; - private static final String IE8 = "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 = "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 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)"; + 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)"; // "Version/" was added in 10.00 - 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"; + private static final String OPERA964_WINDOWS = "Opera/9.64(Windows NT 5.1; U; en) Presto/2.1.1"; + private static final String OPERA1010_WINDOWS = "Opera/9.80 (Windows NT 5.1; U; en) Presto/2.2.15 Version/10.10"; + private static final String OPERA1050_WINDOWS = "Opera/9.80 (Windows NT 5.1; U; en) Presto/2.5.22 Version/10.50"; - private static final String CHROME3 = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198 Safari/532.0"; - private static final String CHROME4 = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.89 Safari/532.5"; + private static final String CHROME3_MAC = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198 Safari/532.0"; + private static final String CHROME4_WINDOWS = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.89 Safari/532.5"; - private static final String SAFARI3 = "Mozilla/5.0 (Windows; U; Windows NT 5.1; cs-CZ) AppleWebKit/525.28.3 (KHTML, like Gecko) Version/3.2.3 Safari/525.29"; - private static final String SAFARI4 = "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; en-us) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7"; + private static final String SAFARI3_WINDOWS = "Mozilla/5.0 (Windows; U; Windows NT 5.1; cs-CZ) AppleWebKit/525.28.3 (KHTML, like Gecko) Version/3.2.3 Safari/525.29"; + private static final String SAFARI4_MAC = "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; en-us) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7"; public void testSafari3() { - VBrowserDetails bd = new VBrowserDetails(SAFARI3); + VBrowserDetails bd = new VBrowserDetails(SAFARI3_WINDOWS); assertWebKit(bd); assertSafari(bd); assertBrowserMajorVersion(bd, 3); assertBrowserMinorVersion(bd, 2); assertEngineVersion(bd, 525.0f); + assertWindows(bd); } public void testSafari4() { - VBrowserDetails bd = new VBrowserDetails(SAFARI4); + VBrowserDetails bd = new VBrowserDetails(SAFARI4_MAC); assertWebKit(bd); assertSafari(bd); assertBrowserMajorVersion(bd, 4); assertBrowserMinorVersion(bd, 0); assertEngineVersion(bd, 531f); + assertMacOSX(bd); } public void testChrome3() { - VBrowserDetails bd = new VBrowserDetails(CHROME3); + VBrowserDetails bd = new VBrowserDetails(CHROME3_MAC); assertWebKit(bd); assertChrome(bd); assertBrowserMajorVersion(bd, 3); assertBrowserMinorVersion(bd, 0); assertEngineVersion(bd, 532.0f); + assertMacOSX(bd); } public void testChrome4() { - VBrowserDetails bd = new VBrowserDetails(CHROME4); + VBrowserDetails bd = new VBrowserDetails(CHROME4_WINDOWS); assertWebKit(bd); assertChrome(bd); assertBrowserMajorVersion(bd, 4); assertBrowserMinorVersion(bd, 0); assertEngineVersion(bd, 532f); + assertWindows(bd); } public void testFirefox3() { - VBrowserDetails bd = new VBrowserDetails(FIREFOX30); + VBrowserDetails bd = new VBrowserDetails(FIREFOX30_WINDOWS); assertGecko(bd); assertFirefox(bd); assertBrowserMajorVersion(bd, 3); assertBrowserMinorVersion(bd, 0); assertEngineVersion(bd, 1.9f); + assertWindows(bd); + + bd = new VBrowserDetails(FIREFOX30_LINUX); + assertGecko(bd); + assertFirefox(bd); + assertBrowserMajorVersion(bd, 3); + assertBrowserMinorVersion(bd, 0); + assertEngineVersion(bd, 1.9f); + assertLinux(bd); } public void testFirefox35() { - VBrowserDetails bd = new VBrowserDetails(FIREFOX35); + VBrowserDetails bd = new VBrowserDetails(FIREFOX35_WINDOWS); assertGecko(bd); assertFirefox(bd); assertBrowserMajorVersion(bd, 3); assertBrowserMinorVersion(bd, 5); assertEngineVersion(bd, 1.9f); + assertWindows(bd); } public void testFirefox36() { - VBrowserDetails bd = new VBrowserDetails(FIREFOX36); + VBrowserDetails bd = new VBrowserDetails(FIREFOX36_WINDOWS); assertGecko(bd); assertFirefox(bd); assertBrowserMajorVersion(bd, 3); assertBrowserMinorVersion(bd, 6); assertEngineVersion(bd, 1.9f); + assertWindows(bd); } public void testFirefox36b() { - VBrowserDetails bd = new VBrowserDetails(FIREFOX36B); + VBrowserDetails bd = new VBrowserDetails(FIREFOX36B_MAC); assertGecko(bd); assertFirefox(bd); assertBrowserMajorVersion(bd, 3); assertBrowserMinorVersion(bd, 6); assertEngineVersion(bd, 1.9f); + assertMacOSX(bd); } public void testOpera964() { - VBrowserDetails bd = new VBrowserDetails(OPERA964); + VBrowserDetails bd = new VBrowserDetails(OPERA964_WINDOWS); assertPresto(bd); assertOpera(bd); assertBrowserMajorVersion(bd, 9); assertBrowserMinorVersion(bd, 64); + assertWindows(bd); } public void testOpera1010() { - VBrowserDetails bd = new VBrowserDetails(OPERA1010); + VBrowserDetails bd = new VBrowserDetails(OPERA1010_WINDOWS); assertPresto(bd); assertOpera(bd); assertBrowserMajorVersion(bd, 10); assertBrowserMinorVersion(bd, 10); + assertWindows(bd); } public void testOpera1050() { - VBrowserDetails bd = new VBrowserDetails(OPERA1050); + VBrowserDetails bd = new VBrowserDetails(OPERA1050_WINDOWS); assertPresto(bd); assertOpera(bd); assertBrowserMajorVersion(bd, 10); assertBrowserMinorVersion(bd, 50); + assertWindows(bd); } public void testIE6() { - VBrowserDetails bd = new VBrowserDetails(IE6); + VBrowserDetails bd = new VBrowserDetails(IE6_WINDOWS); // assertTrident(bd); assertIE(bd); assertBrowserMajorVersion(bd, 6); assertBrowserMinorVersion(bd, 0); + assertWindows(bd); } public void testIE7() { - VBrowserDetails bd = new VBrowserDetails(IE7); + VBrowserDetails bd = new VBrowserDetails(IE7_WINDOWS); // assertTrident(bd); assertIE(bd); assertBrowserMajorVersion(bd, 7); assertBrowserMinorVersion(bd, 0); + assertWindows(bd); } public void testIE8() { - VBrowserDetails bd = new VBrowserDetails(IE8); + VBrowserDetails bd = new VBrowserDetails(IE8_WINDOWS); // assertTrident(bd); assertIE(bd); assertBrowserMajorVersion(bd, 8); assertBrowserMinorVersion(bd, 0); + assertWindows(bd); } public void testIE8CompatibilityMode() { - VBrowserDetails bd = new VBrowserDetails(IE8_IN_IE7_MODE); + VBrowserDetails bd = new VBrowserDetails(IE8_IN_IE7_MODE_WINDOWS); bd.setIE8InCompatibilityMode(); // assertTrident(bd); assertIE(bd); assertBrowserMajorVersion(bd, 7); assertBrowserMinorVersion(bd, 0); + + assertWindows(bd); } /* @@ -244,4 +269,23 @@ public class BrowserUserAgentParser extends TestCase { assertFalse(browserDetails.isOpera()); assertTrue(browserDetails.isSafari()); } + + private void assertMacOSX(VBrowserDetails browserDetails) { + assertFalse(browserDetails.isLinux()); + assertFalse(browserDetails.isWindows()); + assertTrue(browserDetails.isMacOSX()); + } + + private void assertWindows(VBrowserDetails browserDetails) { + assertFalse(browserDetails.isLinux()); + assertTrue(browserDetails.isWindows()); + assertFalse(browserDetails.isMacOSX()); + } + + private void assertLinux(VBrowserDetails browserDetails) { + assertTrue(browserDetails.isLinux()); + assertFalse(browserDetails.isWindows()); + assertFalse(browserDetails.isMacOSX()); + } + } -- 2.39.5