From 0c943629db3a6c3c28b1f616841666626996d2fb Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Tue, 16 Mar 2010 13:46:28 +0000 Subject: [PATCH] Test case and fix for #3931 - Provide methods for browser detection in WebBrowser svn changeset:11911/svn branch:6.3 --- .../terminal/gwt/client/BrowserInfo.java | 161 ++++++------- .../terminal/gwt/client/VBrowserDetails.java | 202 ++++++++++++++++ .../terminal/gwt/server/WebBrowser.java | 133 ++++++++++- .../tests/server/BrowserUserAgentParser.java | 217 ++++++++++++++++++ 4 files changed, 607 insertions(+), 106 deletions(-) create mode 100644 src/com/vaadin/terminal/gwt/client/VBrowserDetails.java create mode 100644 tests/src/com/vaadin/tests/server/BrowserUserAgentParser.java diff --git a/src/com/vaadin/terminal/gwt/client/BrowserInfo.java b/src/com/vaadin/terminal/gwt/client/BrowserInfo.java index fe5c6958ed..f37186a6bb 100644 --- a/src/com/vaadin/terminal/gwt/client/BrowserInfo.java +++ b/src/com/vaadin/terminal/gwt/client/BrowserInfo.java @@ -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 index 0000000000..7a25e2ff3b --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/VBrowserDetails.java @@ -0,0 +1,202 @@ +package com.vaadin.terminal.gwt.client; + +/** + * Class that parses the user agent string from the browser and provides + * information about the browser. + * + * @author IT Mill Ltd. + * @version @VERSION@ + * @since 6.3 + */ +public class VBrowserDetails { + + private boolean isGecko; + private boolean isWebKit; + private boolean isPresto; + + private boolean isSafari; + private boolean isChrome; + private boolean isFirefox; + private boolean isOpera; + private boolean isIE; + + private float browserEngineVersion = -1; + private int browserMajorVersion = -1; + + /** + * Create an instance based on the given user agent. + * + * @param userAgent + * User agent as provided by the browser. + */ + public VBrowserDetails(String userAgent) { + userAgent = userAgent.toLowerCase(); + + // browser engine name + isGecko = userAgent.indexOf("gecko") != -1 + && userAgent.indexOf("webkit") == -1; + isWebKit = userAgent.indexOf("applewebkit") != -1; + isPresto = userAgent.indexOf(" presto/") != -1; + + // browser name + isChrome = userAgent.indexOf(" chrome/") != -1; + isSafari = !isChrome && userAgent.indexOf("safari") != -1; + isOpera = userAgent.indexOf("opera") != -1; + isIE = userAgent.indexOf("msie") != -1 && !isOpera + && (userAgent.indexOf("webtv") == -1); + 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); + } + + // Browser version + if (isIE) { + String ieVersionString = userAgent.substring(userAgent + .indexOf("msie ") + 5); + ieVersionString = ieVersionString.substring(0, ieVersionString + .indexOf(";")); + // FIXME parseInt + browserMajorVersion = (int) Float.parseFloat(ieVersionString); + } else if (isFirefox) { + int i = userAgent.indexOf(" firefox/") + 9; + browserMajorVersion = Integer.parseInt(userAgent + .substring(i, i + 1)); + } else if (isChrome) { + int i = userAgent.indexOf(" chrome/") + 8; + browserMajorVersion = Integer.parseInt(userAgent + .substring(i, i + 1)); + } else if (isSafari) { + int i = userAgent.indexOf(" version/") + 9; + browserMajorVersion = Integer.parseInt(userAgent + .substring(i, i + 1)); + } 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; + } + + browserMajorVersion = Integer.parseInt(userAgent + .substring(i, i + 2).replace(".", "")); + } + + } + + /** + * Tests if the browser is Firefox. + * + * @return true if it is Firefox, false otherwise + */ + public boolean isFirefox() { + return isFirefox; + } + + /** + * Tests if the browser is using the Gecko engine + * + * @return true if it is Gecko, false otherwise + */ + public boolean isGecko() { + return isGecko; + } + + /** + * Tests if the browser is using the WebKit engine + * + * @return true if it is WebKit, false otherwise + */ + public boolean isWebKit() { + return isWebKit; + } + + /** + * Tests if the browser is using the Presto engine + * + * @return true if it is Presto, false otherwise + */ + public boolean isPresto() { + return isPresto; + } + + /** + * Tests if the browser is Safari. + * + * @return true if it is Safari, false otherwise + */ + public boolean isSafari() { + return isSafari; + } + + /** + * Tests if the browser is Chrome. + * + * @return true if it is Chrome, false otherwise + */ + public boolean isChrome() { + return isChrome; + } + + /** + * Tests if the browser is Opera. + * + * @return true if it is Opera, false otherwise + */ + public boolean isOpera() { + return isOpera; + } + + /** + * Tests if the browser is Internet Explorer. + * + * @return true if it is Internet Explorer, false otherwise + */ + public boolean isIE() { + return isIE; + } + + /** + * Returns the version of the browser engine. For WebKit this is an integer + * e.g., 532.0. For gecko it is a float e.g., 1.8 or 1.9. + * + * @return The version of the browser engine + */ + public float getBrowserEngineVersion() { + return browserEngineVersion; + } + + /** + * Returns the browser major version e.g., 3 for Firefox 3.5, 4 for Chrome + * 4, 8 for Internet Explorer 8. + * + *
+     * Note that Internet Explorer 8 in compatibility mode will return 7.
+     * 
+ * + * @return The major version of the browser. + */ + public final int getBrowserMajorVersion() { + return browserMajorVersion; + } + + /** + * Marks that IE8 is used in compatibility mode. This forces the browser + * version to 7 even if it otherwise was detected as 8. + * + */ + public void setIE8InCompatibilityMode() { + if (isIE && browserMajorVersion == 8) { + browserMajorVersion = 7; + } + } + +} diff --git a/src/com/vaadin/terminal/gwt/server/WebBrowser.java b/src/com/vaadin/terminal/gwt/server/WebBrowser.java index 1fb4cbba74..a9a392b5d8 100644 --- a/src/com/vaadin/terminal/gwt/server/WebBrowser.java +++ b/src/com/vaadin/terminal/gwt/server/WebBrowser.java @@ -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. + * + *

+ * Note that Internet Explorer in IE7 compatibility mode might return 8 in + * some cases even though it should return 7. + *

+ * + * @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 index 0000000000..63b0783c92 --- /dev/null +++ b/tests/src/com/vaadin/tests/server/BrowserUserAgentParser.java @@ -0,0 +1,217 @@ +package com.vaadin.tests.server; + +import junit.framework.TestCase; + +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 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)"; + + // "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 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 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 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"; + + public void testSafari3() { + VBrowserDetails bd = new VBrowserDetails(SAFARI3); + assertWebKit(bd); + assertSafari(bd); + assertBrowserMajorVersion(bd, 3); + assertEngineVersion(bd, 525.0f); + } + + public void testSafari4() { + VBrowserDetails bd = new VBrowserDetails(SAFARI4); + assertWebKit(bd); + assertSafari(bd); + assertBrowserMajorVersion(bd, 4); + assertEngineVersion(bd, 531f); + } + + public void testChrome3() { + VBrowserDetails bd = new VBrowserDetails(CHROME3); + assertWebKit(bd); + assertChrome(bd); + assertBrowserMajorVersion(bd, 3); + assertEngineVersion(bd, 532.0f); + } + + public void testChrome4() { + VBrowserDetails bd = new VBrowserDetails(CHROME4); + assertWebKit(bd); + assertChrome(bd); + assertBrowserMajorVersion(bd, 4); + assertEngineVersion(bd, 532f); + } + + public void testFirefox3() { + VBrowserDetails bd = new VBrowserDetails(FIREFOX30); + assertGecko(bd); + assertFirefox(bd); + assertBrowserMajorVersion(bd, 3); + assertEngineVersion(bd, 1.9f); + } + + public void testFirefox35() { + VBrowserDetails bd = new VBrowserDetails(FIREFOX35); + assertGecko(bd); + assertFirefox(bd); + assertBrowserMajorVersion(bd, 3); + assertEngineVersion(bd, 1.9f); + } + + public void testFirefox36() { + VBrowserDetails bd = new VBrowserDetails(FIREFOX36); + assertGecko(bd); + assertFirefox(bd); + assertBrowserMajorVersion(bd, 3); + assertEngineVersion(bd, 1.9f); + } + + public void testOpera960() { + VBrowserDetails bd = new VBrowserDetails(OPERA960); + assertPresto(bd); + assertOpera(bd); + assertBrowserMajorVersion(bd, 9); + } + + public void testOpera1010() { + VBrowserDetails bd = new VBrowserDetails(OPERA1010); + assertPresto(bd); + assertOpera(bd); + assertBrowserMajorVersion(bd, 10); + } + + public void testOpera1050() { + VBrowserDetails bd = new VBrowserDetails(OPERA1050); + assertPresto(bd); + assertOpera(bd); + assertBrowserMajorVersion(bd, 10); + } + + public void testIE6() { + VBrowserDetails bd = new VBrowserDetails(IE6); + // assertTrident(bd); + assertIE(bd); + assertBrowserMajorVersion(bd, 6); + } + + public void testIE7() { + VBrowserDetails bd = new VBrowserDetails(IE7); + // assertTrident(bd); + assertIE(bd); + assertBrowserMajorVersion(bd, 7); + } + + public void testIE8() { + VBrowserDetails bd = new VBrowserDetails(IE8); + // assertTrident(bd); + assertIE(bd); + assertBrowserMajorVersion(bd, 8); + } + + public void testIE8CompatibilityMode() { + VBrowserDetails bd = new VBrowserDetails(IE8_IN_IE7_MODE); + bd.setIE8InCompatibilityMode(); + + // assertTrident(bd); + assertIE(bd); + assertBrowserMajorVersion(bd, 7); + } + + /* + * Helper methods below + */ + + private void assertEngineVersion(VBrowserDetails browserDetails, + float version) { + assertEquals(version, browserDetails.getBrowserEngineVersion()); + + } + + private void assertBrowserMajorVersion(VBrowserDetails browserDetails, + int version) { + assertEquals(version, browserDetails.getBrowserMajorVersion()); + + } + + private void assertGecko(VBrowserDetails browserDetails) { + // Engine + assertTrue(browserDetails.isGecko()); + assertFalse(browserDetails.isWebKit()); + assertFalse(browserDetails.isPresto()); + } + + private void assertPresto(VBrowserDetails browserDetails) { + // Engine + assertFalse(browserDetails.isGecko()); + assertFalse(browserDetails.isWebKit()); + assertTrue(browserDetails.isPresto()); + } + + private void assertWebKit(VBrowserDetails browserDetails) { + // Engine + assertFalse(browserDetails.isGecko()); + assertTrue(browserDetails.isWebKit()); + assertFalse(browserDetails.isPresto()); + } + + private void assertFirefox(VBrowserDetails browserDetails) { + // Browser + assertTrue(browserDetails.isFirefox()); + assertFalse(browserDetails.isChrome()); + assertFalse(browserDetails.isIE()); + assertFalse(browserDetails.isOpera()); + assertFalse(browserDetails.isSafari()); + } + + private void assertChrome(VBrowserDetails browserDetails) { + // Browser + assertFalse(browserDetails.isFirefox()); + assertTrue(browserDetails.isChrome()); + assertFalse(browserDetails.isIE()); + assertFalse(browserDetails.isOpera()); + assertFalse(browserDetails.isSafari()); + } + + private void assertIE(VBrowserDetails browserDetails) { + // Browser + assertFalse(browserDetails.isFirefox()); + assertFalse(browserDetails.isChrome()); + assertTrue(browserDetails.isIE()); + assertFalse(browserDetails.isOpera()); + assertFalse(browserDetails.isSafari()); + } + + private void assertOpera(VBrowserDetails browserDetails) { + // Browser + assertFalse(browserDetails.isFirefox()); + assertFalse(browserDetails.isChrome()); + assertFalse(browserDetails.isIE()); + assertTrue(browserDetails.isOpera()); + assertFalse(browserDetails.isSafari()); + } + + private void assertSafari(VBrowserDetails browserDetails) { + // Browser + assertFalse(browserDetails.isFirefox()); + assertFalse(browserDetails.isChrome()); + assertFalse(browserDetails.isIE()); + assertFalse(browserDetails.isOpera()); + assertTrue(browserDetails.isSafari()); + } +} -- 2.39.5