]> source.dussan.org Git - vaadin-framework.git/commitdiff
Test case and fix for #3931 - Provide methods for browser detection in WebBrowser
authorArtur Signell <artur.signell@itmill.com>
Tue, 16 Mar 2010 13:46:28 +0000 (13:46 +0000)
committerArtur Signell <artur.signell@itmill.com>
Tue, 16 Mar 2010 13:46:28 +0000 (13:46 +0000)
svn changeset:11911/svn branch:6.3

src/com/vaadin/terminal/gwt/client/BrowserInfo.java
src/com/vaadin/terminal/gwt/client/VBrowserDetails.java [new file with mode: 0644]
src/com/vaadin/terminal/gwt/server/WebBrowser.java
tests/src/com/vaadin/tests/server/BrowserUserAgentParser.java [new file with mode: 0644]

index fe5c6958ed654a2bdea2ba2a93e310e9223df5e7..f37186a6bb838f441bfc62e9d872d43aa6fdaf2f 100644 (file)
@@ -37,54 +37,30 @@ public class BrowserInfo {
         return instance;
     }
 
-    private boolean isGecko;
-    private boolean isAppleWebKit;
-    private boolean isSafari;
-    private boolean isOpera;
-    private boolean isIE;
-    private float version = -1;
+    private VBrowserDetails browserDetails;
 
     private BrowserInfo() {
         try {
-            String ua = getBrowserString().toLowerCase();
-            // browser engine name
-            isGecko = ua.indexOf("gecko") != -1 && ua.indexOf("webkit") == -1;
-            isAppleWebKit = ua.indexOf("applewebkit") != -1;
-
-            // browser name
-            isSafari = ua.indexOf("safari") != -1;
-            isOpera = ua.indexOf("opera") != -1;
-            isIE = ua.indexOf("msie") != -1 && !isOpera
-                    && (ua.indexOf("webtv") == -1);
-
-            if (isGecko) {
-                String tmp = ua.substring(ua.indexOf("rv:") + 3);
-                tmp = tmp.replaceFirst("(\\.[0-9]+).+", "$1");
-                version = Float.parseFloat(tmp);
+            browserDetails = new VBrowserDetails(getBrowserString());
+            if (browserDetails.isIE()
+                    && browserDetails.getBrowserMajorVersion() == 8
+                    && isIE8InIE7CompatibilityMode()) {
+                browserDetails.setIE8InCompatibilityMode();
             }
-            if (isAppleWebKit) {
-                String tmp = ua.substring(ua.indexOf("webkit/") + 7);
-                tmp = tmp.replaceFirst("([0-9]+)[^0-9].+", "$1");
-                version = Float.parseFloat(tmp);
 
-            }
-
-            if (isIE) {
-                String ieVersionString = ua.substring(ua.indexOf("msie ") + 5);
-                ieVersionString = ieVersionString.substring(0, ieVersionString
-                        .indexOf(";"));
-                version = Float.parseFloat(ieVersionString);
-
-                if (version == 8 && isIE8InIE7CompatibilityMode()) {
-                    version = 7;
-                }
-
-            }
         } catch (Exception e) {
             ClientExceptionHandler.displayError(e);
         }
     }
 
+    private native boolean isIE8InIE7CompatibilityMode()
+    /*-{
+        var mode = $wnd.document.documentMode;
+        if (!mode)
+            return false;
+        return (mode == 7);
+    }-*/;
+
     /**
      * Returns a string representing the browser in use, for use in CSS
      * classnames. The classnames will be space separated abbrevitaions,
@@ -107,36 +83,24 @@ public class BrowserInfo {
         String prefix = "v-";
 
         if (cssClass == null) {
-            String bs = getBrowserString().toLowerCase();
             String b = "";
             String v = "";
-            if (bs.indexOf(" firefox/") != -1) {
+            if (browserDetails.isFirefox()) {
                 b = "ff";
-                int i = bs.indexOf(" firefox/") + 9;
-                v = b + bs.substring(i, i + 1);
-            } else if (bs.indexOf(" chrome/") != -1) {
+                v = "b" + browserDetails.getBrowserMajorVersion();
+            } else if (browserDetails.isChrome()) {
                 // TODO update when Chrome is more stable
                 b = "sa";
                 v = "ch";
-            } else if (bs.indexOf(" safari") != -1) {
+            } else if (browserDetails.isSafari()) {
                 b = "sa";
-                int i = bs.indexOf(" version/") + 9;
-                v = b + bs.substring(i, i + 1);
-            } else if (bs.indexOf(" msie ") != -1) {
+                v = "b" + browserDetails.getBrowserMajorVersion();
+            } else if (browserDetails.isIE()) {
                 b = "ie";
-                int i = bs.indexOf(" msie ") + 6;
-                String ieVersion = bs.substring(i, i + 1);
-
-                if (ieVersion != null && ieVersion.equals("8")
-                        && isIE8InIE7CompatibilityMode()) {
-                    ieVersion = "7";
-                }
-
-                v = b + ieVersion;
-            } else if (bs.indexOf("opera/") != -1) {
+                v = b + browserDetails.getBrowserMajorVersion();
+            } else if (browserDetails.isOpera()) {
                 b = "op";
-                int i = bs.indexOf("opera/") + 6;
-                v = b + bs.substring(i, i + 3).replace(".", "");
+                v = b + browserDetails.getBrowserMajorVersion();
             }
             cssClass = prefix + b + " " + prefix + v;
         }
@@ -144,64 +108,84 @@ public class BrowserInfo {
         return cssClass;
     }
 
-    private native boolean isIE8InIE7CompatibilityMode()
-    /*-{
-        var mode = $wnd.document.documentMode;
-        if (!mode)
-            return false;
-        return (mode == 7);
-    }-*/;
-
     public boolean isIE() {
-        return isIE;
+        return browserDetails.isIE();
     }
 
     public boolean isSafari() {
-        return isSafari;
+        return browserDetails.isSafari();
     }
 
     public boolean isIE6() {
-        return isIE && version == 6;
+        return isIE() && browserDetails.getBrowserMajorVersion() == 6;
     }
 
     public boolean isIE7() {
-        return isIE && version == 7;
+        return isIE() && browserDetails.getBrowserMajorVersion() == 7;
     }
 
     public boolean isIE8() {
-        return isIE && version == 8;
+        return isIE() && browserDetails.getBrowserMajorVersion() == 8;
     }
 
     public boolean isGecko() {
-        return isGecko;
+        return browserDetails.isGecko();
     }
 
     public boolean isWebkit() {
-        return isAppleWebKit;
+        return browserDetails.isWebKit();
     }
 
     public boolean isFF2() {
-        return isGecko && version == 1.8;
+        // FIXME: Should use browserVersion
+        return browserDetails.isFirefox()
+                && browserDetails.getBrowserEngineVersion() == 1.8;
     }
 
     public boolean isFF3() {
-        return isGecko && version == 1.9;
+        // FIXME: Should use browserVersion
+        return browserDetails.isFirefox()
+                && browserDetails.getBrowserEngineVersion() == 1.9;
     }
 
+    /**
+     * Returns the Gecko version if the browser is Gecko based. The Gecko
+     * version for Firefox 2 is 1.8 and 1.9 for Firefox 3.
+     * 
+     * @return The Gecko version or -1 if the browser is not Gecko based
+     */
     public float getGeckoVersion() {
-        return (isGecko ? version : -1);
+        if (!browserDetails.isGecko()) {
+            return -1;
+        }
+
+        return browserDetails.getBrowserEngineVersion();
     }
 
+    /**
+     * Returns the WebKit version if the browser is WebKit based. The WebKit
+     * version returned is the major version e.g., 523.
+     * 
+     * @return The WebKit version or -1 if the browser is not WebKit based
+     */
     public float getWebkitVersion() {
-        return (isAppleWebKit ? version : -1);
+        if (!browserDetails.isWebKit()) {
+            return -1;
+        }
+
+        return browserDetails.getBrowserEngineVersion();
     }
 
     public float getIEVersion() {
-        return (isIE ? version : -1);
+        if (!browserDetails.isIE()) {
+            return -1;
+        }
+
+        return browserDetails.getBrowserMajorVersion();
     }
 
     public boolean isOpera() {
-        return isOpera;
+        return browserDetails.isOpera();
     }
 
     public native static String getBrowserString()
@@ -209,23 +193,6 @@ public class BrowserInfo {
         return $wnd.navigator.userAgent;
     }-*/;
 
-    public static void test() {
-        Console c = ApplicationConnection.getConsole();
-
-        c.log("getBrowserString() " + getBrowserString());
-        c.log("isIE() " + get().isIE());
-        c.log("isIE6() " + get().isIE6());
-        c.log("isIE7() " + get().isIE7());
-        c.log("isIE8() " + get().isIE8());
-        c.log("isFF2() " + get().isFF2());
-        c.log("isSafari() " + get().isSafari());
-        c.log("getGeckoVersion() " + get().getGeckoVersion());
-        c.log("getWebkitVersion() " + get().getWebkitVersion());
-        c.log("getIEVersion() " + get().getIEVersion());
-        c.log("isIE() " + get().isIE());
-        c.log("isIE() " + get().isIE());
-    }
-
     public native int getScreenWidth()
     /*-{ 
         return $wnd.screen.width;
diff --git a/src/com/vaadin/terminal/gwt/client/VBrowserDetails.java b/src/com/vaadin/terminal/gwt/client/VBrowserDetails.java
new file mode 100644 (file)
index 0000000..7a25e2f
--- /dev/null
@@ -0,0 +1,202 @@
+package com.vaadin.terminal.gwt.client;\r
+\r
+/**\r
+ * Class that parses the user agent string from the browser and provides\r
+ * information about the browser.\r
+ * \r
+ * @author IT Mill Ltd.\r
+ * @version @VERSION@\r
+ * @since 6.3\r
+ */\r
+public class VBrowserDetails {\r
+\r
+    private boolean isGecko;\r
+    private boolean isWebKit;\r
+    private boolean isPresto;\r
+\r
+    private boolean isSafari;\r
+    private boolean isChrome;\r
+    private boolean isFirefox;\r
+    private boolean isOpera;\r
+    private boolean isIE;\r
+\r
+    private float browserEngineVersion = -1;\r
+    private int browserMajorVersion = -1;\r
+\r
+    /**\r
+     * Create an instance based on the given user agent.\r
+     * \r
+     * @param userAgent\r
+     *            User agent as provided by the browser.\r
+     */\r
+    public VBrowserDetails(String userAgent) {\r
+        userAgent = userAgent.toLowerCase();\r
+\r
+        // browser engine name\r
+        isGecko = userAgent.indexOf("gecko") != -1\r
+                && userAgent.indexOf("webkit") == -1;\r
+        isWebKit = userAgent.indexOf("applewebkit") != -1;\r
+        isPresto = userAgent.indexOf(" presto/") != -1;\r
+\r
+        // browser name\r
+        isChrome = userAgent.indexOf(" chrome/") != -1;\r
+        isSafari = !isChrome && userAgent.indexOf("safari") != -1;\r
+        isOpera = userAgent.indexOf("opera") != -1;\r
+        isIE = userAgent.indexOf("msie") != -1 && !isOpera\r
+                && (userAgent.indexOf("webtv") == -1);\r
+        isFirefox = userAgent.indexOf(" firefox/") != -1;\r
+\r
+        // Rendering engine version\r
+        if (isGecko) {\r
+            String tmp = userAgent.substring(userAgent.indexOf("rv:") + 3);\r
+            tmp = tmp.replaceFirst("(\\.[0-9]+).+", "$1");\r
+            browserEngineVersion = Float.parseFloat(tmp);\r
+        } else if (isWebKit) {\r
+            String tmp = userAgent.substring(userAgent.indexOf("webkit/") + 7);\r
+            tmp = tmp.replaceFirst("([0-9]+)[^0-9].+", "$1");\r
+            browserEngineVersion = Float.parseFloat(tmp);\r
+        }\r
+\r
+        // Browser version\r
+        if (isIE) {\r
+            String ieVersionString = userAgent.substring(userAgent\r
+                    .indexOf("msie ") + 5);\r
+            ieVersionString = ieVersionString.substring(0, ieVersionString\r
+                    .indexOf(";"));\r
+            // FIXME parseInt\r
+            browserMajorVersion = (int) Float.parseFloat(ieVersionString);\r
+        } else if (isFirefox) {\r
+            int i = userAgent.indexOf(" firefox/") + 9;\r
+            browserMajorVersion = Integer.parseInt(userAgent\r
+                    .substring(i, i + 1));\r
+        } else if (isChrome) {\r
+            int i = userAgent.indexOf(" chrome/") + 8;\r
+            browserMajorVersion = Integer.parseInt(userAgent\r
+                    .substring(i, i + 1));\r
+        } else if (isSafari) {\r
+            int i = userAgent.indexOf(" version/") + 9;\r
+            browserMajorVersion = Integer.parseInt(userAgent\r
+                    .substring(i, i + 1));\r
+        } else if (isOpera) {\r
+            int i = userAgent.indexOf(" version/");\r
+            if (i != -1) {\r
+                // Version present in Opera 10 and newer\r
+                i += 9; // " version/".length\r
+            } else {\r
+                i = userAgent.indexOf("opera/") + 6;\r
+            }\r
+\r
+            browserMajorVersion = Integer.parseInt(userAgent\r
+                    .substring(i, i + 2).replace(".", ""));\r
+        }\r
+\r
+    }\r
+\r
+    /**\r
+     * Tests if the browser is Firefox.\r
+     * \r
+     * @return true if it is Firefox, false otherwise\r
+     */\r
+    public boolean isFirefox() {\r
+        return isFirefox;\r
+    }\r
+\r
+    /**\r
+     * Tests if the browser is using the Gecko engine\r
+     * \r
+     * @return true if it is Gecko, false otherwise\r
+     */\r
+    public boolean isGecko() {\r
+        return isGecko;\r
+    }\r
+\r
+    /**\r
+     * Tests if the browser is using the WebKit engine\r
+     * \r
+     * @return true if it is WebKit, false otherwise\r
+     */\r
+    public boolean isWebKit() {\r
+        return isWebKit;\r
+    }\r
+\r
+    /**\r
+     * Tests if the browser is using the Presto engine\r
+     * \r
+     * @return true if it is Presto, false otherwise\r
+     */\r
+    public boolean isPresto() {\r
+        return isPresto;\r
+    }\r
+\r
+    /**\r
+     * Tests if the browser is Safari.\r
+     * \r
+     * @return true if it is Safari, false otherwise\r
+     */\r
+    public boolean isSafari() {\r
+        return isSafari;\r
+    }\r
+\r
+    /**\r
+     * Tests if the browser is Chrome.\r
+     * \r
+     * @return true if it is Chrome, false otherwise\r
+     */\r
+    public boolean isChrome() {\r
+        return isChrome;\r
+    }\r
+\r
+    /**\r
+     * Tests if the browser is Opera.\r
+     * \r
+     * @return true if it is Opera, false otherwise\r
+     */\r
+    public boolean isOpera() {\r
+        return isOpera;\r
+    }\r
+\r
+    /**\r
+     * Tests if the browser is Internet Explorer.\r
+     * \r
+     * @return true if it is Internet Explorer, false otherwise\r
+     */\r
+    public boolean isIE() {\r
+        return isIE;\r
+    }\r
+\r
+    /**\r
+     * Returns the version of the browser engine. For WebKit this is an integer\r
+     * e.g., 532.0. For gecko it is a float e.g., 1.8 or 1.9.\r
+     * \r
+     * @return The version of the browser engine\r
+     */\r
+    public float getBrowserEngineVersion() {\r
+        return browserEngineVersion;\r
+    }\r
+\r
+    /**\r
+     * Returns the browser major version e.g., 3 for Firefox 3.5, 4 for Chrome\r
+     * 4, 8 for Internet Explorer 8.\r
+     * \r
+     * <pre>\r
+     * Note that Internet Explorer 8 in compatibility mode will return 7.\r
+     * </pre>\r
+     * \r
+     * @return The major version of the browser.\r
+     */\r
+    public final int getBrowserMajorVersion() {\r
+        return browserMajorVersion;\r
+    }\r
+\r
+    /**\r
+     * Marks that IE8 is used in compatibility mode. This forces the browser\r
+     * version to 7 even if it otherwise was detected as 8.\r
+     * \r
+     */\r
+    public void setIE8InCompatibilityMode() {\r
+        if (isIE && browserMajorVersion == 8) {\r
+            browserMajorVersion = 7;\r
+        }\r
+    }\r
+\r
+}\r
index 1fb4cbba749fc00c3e2b440029ac43c40490fb88..a9a392b5d820b1ef9928abe6537b393497e4180b 100644 (file)
@@ -7,8 +7,16 @@ package com.vaadin.terminal.gwt.server;
 import java.util.Locale;
 
 import com.vaadin.terminal.Terminal;
+import com.vaadin.terminal.gwt.client.VBrowserDetails;
 
-@SuppressWarnings("serial")
+/**
+ * Class that provides information about the web browser the user is using.
+ * Provides information such as browser name and version, screen resolution and
+ * IP address.
+ * 
+ * @author IT Mill Ltd.
+ * @version @VERSION@
+ */
 public class WebBrowser implements Terminal {
 
     private int screenHeight = 0;
@@ -18,26 +26,30 @@ public class WebBrowser implements Terminal {
     private String address;
     private boolean secureConnection;
 
+    private VBrowserDetails browserDetails;
+
     /**
      * There is no default-theme for this terminal type.
      * 
-     * @return Allways returns null.
+     * @return Always returns null.
      */
     public String getDefaultTheme() {
         return null;
     }
 
-    /**
-     * Get the height of the users display in pixels.
+    /*
+     * (non-Javadoc)
      * 
+     * @see com.vaadin.terminal.Terminal#getScreenHeight()
      */
     public int getScreenHeight() {
         return screenHeight;
     }
 
-    /**
-     * Get the width of the users display in pixels.
+    /*
+     * (non-Javadoc)
      * 
+     * @see com.vaadin.terminal.Terminal#getScreenWidth()
      */
     public int getScreenWidth() {
         return screenWidth;
@@ -46,7 +58,7 @@ public class WebBrowser implements Terminal {
     /**
      * Get the browser user-agent string.
      * 
-     * @return
+     * @return The raw browser userAgent string
      */
     public String getBrowserApplication() {
         return browserApplication;
@@ -54,7 +66,21 @@ public class WebBrowser implements Terminal {
 
     /**
      * For internal use by AbstractApplicationServlet/AbstractApplicationPortlet
-     * only.
+     * only. Updates all properties in the class according to the given
+     * information.
+     * 
+     * @param locale
+     *            The browser primary locale
+     * @param address
+     *            The browser ip address
+     * @param secureConnection
+     *            true if using an https connection
+     * @param agent
+     *            Raw userAgent string from the browser
+     * @param sw
+     *            Screen width
+     * @param sh
+     *            Screen height
      */
     void updateBrowserProperties(Locale locale, String address,
             boolean secureConnection, String agent, String sw, String sh) {
@@ -63,6 +89,7 @@ public class WebBrowser implements Terminal {
         this.secureConnection = secureConnection;
         if (agent != null) {
             browserApplication = agent;
+            browserDetails = new VBrowserDetails(agent);
         }
 
         if (sw != null) {
@@ -76,7 +103,7 @@ public class WebBrowser implements Terminal {
     }
 
     /**
-     * Get the IP-address of the web browser. If the application is running
+     * Gets the IP-address of the web browser. If the application is running
      * inside a portlet, this method will return null.
      * 
      * @return IP-address in 1.12.123.123 -format
@@ -95,4 +122,92 @@ public class WebBrowser implements Terminal {
         return secureConnection;
     }
 
+    /**
+     * Tests whether the user is using Firefox.
+     * 
+     * @return true if the user is using Firefox, false if the user is not using
+     *         Firefox or if no information on the browser is present
+     */
+    public boolean isFirefox() {
+        if (browserDetails == null) {
+            return false;
+        }
+
+        return browserDetails.isFirefox();
+    }
+
+    /**
+     * Tests whether the user is using Internet Explorer.
+     * 
+     * @return true if the user is using Internet Explorer, false if the user is
+     *         not using Internet Explorer or if no information on the browser
+     *         is present
+     */
+    public boolean isIE() {
+        if (browserDetails == null) {
+            return false;
+        }
+
+        return browserDetails.isIE();
+    }
+
+    /**
+     * Tests whether the user is using Safari.
+     * 
+     * @return true if the user is using Safari, false if the user is not using
+     *         Safari or if no information on the browser is present
+     */
+    public boolean isSafari() {
+        if (browserDetails == null) {
+            return false;
+        }
+
+        return browserDetails.isSafari();
+    }
+
+    /**
+     * Tests whether the user is using Opera.
+     * 
+     * @return true if the user is using Opera, false if the user is not using
+     *         Opera or if no information on the browser is present
+     */
+    public boolean isOpera() {
+        if (browserDetails == null) {
+            return false;
+        }
+
+        return browserDetails.isOpera();
+    }
+
+    /**
+     * Tests whether the user is using Chrome.
+     * 
+     * @return true if the user is using Chrome, false if the user is not using
+     *         Chrome or if no information on the browser is present
+     */
+    public boolean isChrome() {
+        if (browserDetails == null) {
+            return false;
+        }
+
+        return browserDetails.isChrome();
+    }
+
+    /**
+     * Gets the major version of the browser the user is using.
+     * 
+     * <p>
+     * Note that Internet Explorer in IE7 compatibility mode might return 8 in
+     * some cases even though it should return 7.
+     * </p>
+     * 
+     * @return The major version of the browser or -1 if not known.
+     */
+    public int getBrowserMajorVersion() {
+        if (browserDetails == null) {
+            return -1;
+        }
+
+        return browserDetails.getBrowserMajorVersion();
+    }
 }
diff --git a/tests/src/com/vaadin/tests/server/BrowserUserAgentParser.java b/tests/src/com/vaadin/tests/server/BrowserUserAgentParser.java
new file mode 100644 (file)
index 0000000..63b0783
--- /dev/null
@@ -0,0 +1,217 @@
+package com.vaadin.tests.server;\r
+\r
+import junit.framework.TestCase;\r
+\r
+import com.vaadin.terminal.gwt.client.VBrowserDetails;\r
+\r
+public class BrowserUserAgentParser extends TestCase {\r
+\r
+    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";\r
+    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";\r
+    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)";\r
+\r
+    private static final String IE6 = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)";\r
+    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)";\r
+    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)";\r
+    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)";\r
+\r
+    // "Version/" was added in 10.00\r
+    private static final String OPERA960 = "Opera/9.64(Windows NT 5.1; U; en) Presto/2.1.1";\r
+    private static final String OPERA1010 = "Opera/9.80 (Windows NT 5.1; U; en) Presto/2.2.15 Version/10.10";\r
+    private static final String OPERA1050 = "Opera/9.80 (Windows NT 5.1; U; en) Presto/2.5.22 Version/10.50";\r
+\r
+    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";\r
+    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";\r
+\r
+    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";\r
+    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";\r
+\r
+    public void testSafari3() {\r
+        VBrowserDetails bd = new VBrowserDetails(SAFARI3);\r
+        assertWebKit(bd);\r
+        assertSafari(bd);\r
+        assertBrowserMajorVersion(bd, 3);\r
+        assertEngineVersion(bd, 525.0f);\r
+    }\r
+\r
+    public void testSafari4() {\r
+        VBrowserDetails bd = new VBrowserDetails(SAFARI4);\r
+        assertWebKit(bd);\r
+        assertSafari(bd);\r
+        assertBrowserMajorVersion(bd, 4);\r
+        assertEngineVersion(bd, 531f);\r
+    }\r
+\r
+    public void testChrome3() {\r
+        VBrowserDetails bd = new VBrowserDetails(CHROME3);\r
+        assertWebKit(bd);\r
+        assertChrome(bd);\r
+        assertBrowserMajorVersion(bd, 3);\r
+        assertEngineVersion(bd, 532.0f);\r
+    }\r
+\r
+    public void testChrome4() {\r
+        VBrowserDetails bd = new VBrowserDetails(CHROME4);\r
+        assertWebKit(bd);\r
+        assertChrome(bd);\r
+        assertBrowserMajorVersion(bd, 4);\r
+        assertEngineVersion(bd, 532f);\r
+    }\r
+\r
+    public void testFirefox3() {\r
+        VBrowserDetails bd = new VBrowserDetails(FIREFOX30);\r
+        assertGecko(bd);\r
+        assertFirefox(bd);\r
+        assertBrowserMajorVersion(bd, 3);\r
+        assertEngineVersion(bd, 1.9f);\r
+    }\r
+\r
+    public void testFirefox35() {\r
+        VBrowserDetails bd = new VBrowserDetails(FIREFOX35);\r
+        assertGecko(bd);\r
+        assertFirefox(bd);\r
+        assertBrowserMajorVersion(bd, 3);\r
+        assertEngineVersion(bd, 1.9f);\r
+    }\r
+\r
+    public void testFirefox36() {\r
+        VBrowserDetails bd = new VBrowserDetails(FIREFOX36);\r
+        assertGecko(bd);\r
+        assertFirefox(bd);\r
+        assertBrowserMajorVersion(bd, 3);\r
+        assertEngineVersion(bd, 1.9f);\r
+    }\r
+\r
+    public void testOpera960() {\r
+        VBrowserDetails bd = new VBrowserDetails(OPERA960);\r
+        assertPresto(bd);\r
+        assertOpera(bd);\r
+        assertBrowserMajorVersion(bd, 9);\r
+    }\r
+\r
+    public void testOpera1010() {\r
+        VBrowserDetails bd = new VBrowserDetails(OPERA1010);\r
+        assertPresto(bd);\r
+        assertOpera(bd);\r
+        assertBrowserMajorVersion(bd, 10);\r
+    }\r
+\r
+    public void testOpera1050() {\r
+        VBrowserDetails bd = new VBrowserDetails(OPERA1050);\r
+        assertPresto(bd);\r
+        assertOpera(bd);\r
+        assertBrowserMajorVersion(bd, 10);\r
+    }\r
+\r
+    public void testIE6() {\r
+        VBrowserDetails bd = new VBrowserDetails(IE6);\r
+        // assertTrident(bd);\r
+        assertIE(bd);\r
+        assertBrowserMajorVersion(bd, 6);\r
+    }\r
+\r
+    public void testIE7() {\r
+        VBrowserDetails bd = new VBrowserDetails(IE7);\r
+        // assertTrident(bd);\r
+        assertIE(bd);\r
+        assertBrowserMajorVersion(bd, 7);\r
+    }\r
+\r
+    public void testIE8() {\r
+        VBrowserDetails bd = new VBrowserDetails(IE8);\r
+        // assertTrident(bd);\r
+        assertIE(bd);\r
+        assertBrowserMajorVersion(bd, 8);\r
+    }\r
+\r
+    public void testIE8CompatibilityMode() {\r
+        VBrowserDetails bd = new VBrowserDetails(IE8_IN_IE7_MODE);\r
+        bd.setIE8InCompatibilityMode();\r
+\r
+        // assertTrident(bd);\r
+        assertIE(bd);\r
+        assertBrowserMajorVersion(bd, 7);\r
+    }\r
+\r
+    /*\r
+     * Helper methods below\r
+     */\r
+\r
+    private void assertEngineVersion(VBrowserDetails browserDetails,\r
+            float version) {\r
+        assertEquals(version, browserDetails.getBrowserEngineVersion());\r
+\r
+    }\r
+\r
+    private void assertBrowserMajorVersion(VBrowserDetails browserDetails,\r
+            int version) {\r
+        assertEquals(version, browserDetails.getBrowserMajorVersion());\r
+\r
+    }\r
+\r
+    private void assertGecko(VBrowserDetails browserDetails) {\r
+        // Engine\r
+        assertTrue(browserDetails.isGecko());\r
+        assertFalse(browserDetails.isWebKit());\r
+        assertFalse(browserDetails.isPresto());\r
+    }\r
+\r
+    private void assertPresto(VBrowserDetails browserDetails) {\r
+        // Engine\r
+        assertFalse(browserDetails.isGecko());\r
+        assertFalse(browserDetails.isWebKit());\r
+        assertTrue(browserDetails.isPresto());\r
+    }\r
+\r
+    private void assertWebKit(VBrowserDetails browserDetails) {\r
+        // Engine\r
+        assertFalse(browserDetails.isGecko());\r
+        assertTrue(browserDetails.isWebKit());\r
+        assertFalse(browserDetails.isPresto());\r
+    }\r
+\r
+    private void assertFirefox(VBrowserDetails browserDetails) {\r
+        // Browser\r
+        assertTrue(browserDetails.isFirefox());\r
+        assertFalse(browserDetails.isChrome());\r
+        assertFalse(browserDetails.isIE());\r
+        assertFalse(browserDetails.isOpera());\r
+        assertFalse(browserDetails.isSafari());\r
+    }\r
+\r
+    private void assertChrome(VBrowserDetails browserDetails) {\r
+        // Browser\r
+        assertFalse(browserDetails.isFirefox());\r
+        assertTrue(browserDetails.isChrome());\r
+        assertFalse(browserDetails.isIE());\r
+        assertFalse(browserDetails.isOpera());\r
+        assertFalse(browserDetails.isSafari());\r
+    }\r
+\r
+    private void assertIE(VBrowserDetails browserDetails) {\r
+        // Browser\r
+        assertFalse(browserDetails.isFirefox());\r
+        assertFalse(browserDetails.isChrome());\r
+        assertTrue(browserDetails.isIE());\r
+        assertFalse(browserDetails.isOpera());\r
+        assertFalse(browserDetails.isSafari());\r
+    }\r
+\r
+    private void assertOpera(VBrowserDetails browserDetails) {\r
+        // Browser\r
+        assertFalse(browserDetails.isFirefox());\r
+        assertFalse(browserDetails.isChrome());\r
+        assertFalse(browserDetails.isIE());\r
+        assertTrue(browserDetails.isOpera());\r
+        assertFalse(browserDetails.isSafari());\r
+    }\r
+\r
+    private void assertSafari(VBrowserDetails browserDetails) {\r
+        // Browser\r
+        assertFalse(browserDetails.isFirefox());\r
+        assertFalse(browserDetails.isChrome());\r
+        assertFalse(browserDetails.isIE());\r
+        assertFalse(browserDetails.isOpera());\r
+        assertTrue(browserDetails.isSafari());\r
+    }\r
+}\r