svn changeset:23625/svn branch:6.8tags/7.0.0.alpha3
@@ -31,6 +31,9 @@ public class BrowserInfo { | |||
private static final String OS_LINUX = "lin"; | |||
private static final String OS_MACOSX = "mac"; | |||
private static final String MOS_ANDROID = "android"; | |||
private static final String MOS_IOS = "ios"; | |||
private static BrowserInfo instance; | |||
private static String cssClass = null; | |||
@@ -66,11 +69,11 @@ public class BrowserInfo { | |||
browserDetails.setIEMode(documentMode); | |||
} | |||
} | |||
if (browserDetails.isChrome()) { | |||
touchDevice = detectChromeTouchDevice(); | |||
touchDevice = detectChromeTouchDevice(); | |||
} else { | |||
touchDevice = detectTouchDevice(); | |||
touchDevice = detectTouchDevice(); | |||
} | |||
} | |||
@@ -78,7 +81,7 @@ public class BrowserInfo { | |||
/*-{ | |||
try { document.createEvent("TouchEvent");return true;} catch(e){return false;}; | |||
}-*/; | |||
private native boolean detectChromeTouchDevice() | |||
/*-{ | |||
return ("ontouchstart" in window); | |||
@@ -169,6 +172,11 @@ public class BrowserInfo { | |||
if (osClass != null) { | |||
cssClass = cssClass + " " + prefix + osClass; | |||
} | |||
String mosClass = getMobileOperatingSystemClass(); | |||
if (mosClass != null) { | |||
cssClass = cssClass + " " + prefix + mosClass; | |||
} | |||
} | |||
return cssClass; | |||
@@ -186,6 +194,16 @@ public class BrowserInfo { | |||
return null; | |||
} | |||
private String getMobileOperatingSystemClass() { | |||
if (isAndroid()) { | |||
return MOS_ANDROID; | |||
} else if (browserDetails.isIOS()) { | |||
return MOS_IOS; | |||
} | |||
// Unknown MOS | |||
return null; | |||
} | |||
public boolean isIE() { | |||
return browserDetails.isIE(); | |||
} | |||
@@ -409,4 +427,44 @@ public class BrowserInfo { | |||
return touchDevice; | |||
} | |||
/** | |||
* Checks if the browser is run on iOS | |||
* | |||
* @return true if the browser is run on iOS, false otherwise | |||
*/ | |||
public boolean isIOS() { | |||
return browserDetails.isIOS(); | |||
} | |||
/** | |||
* Checks if the browser is run on Android | |||
* | |||
* @return true if the browser is run on Android, false otherwise | |||
*/ | |||
public boolean isAndroid() { | |||
return browserDetails.isAndroid(); | |||
} | |||
/** | |||
* Checks if the browser is capable of handling scrolling natively or if a | |||
* touch scroll helper is needed for scrolling. | |||
* | |||
* @return true if browser needs a touch scroll helper, false if the browser | |||
* can handle scrolling natively | |||
*/ | |||
public boolean requiresTouchScrollDelegate() { | |||
if (!isTouchDevice()) { | |||
return false; | |||
} | |||
if (isAndroid() && isWebkit() && getWebkitVersion() < 534) { | |||
return true; | |||
} | |||
// if (isIOS() && isWebkit() && getWebkitVersion() < ???) { | |||
// return true; | |||
// } | |||
return false; | |||
} | |||
} |
@@ -28,9 +28,16 @@ public class VBrowserDetails implements Serializable { | |||
private boolean isOpera = false; | |||
private boolean isIE = false; | |||
private boolean isWindows = false; | |||
private boolean isMacOSX = false; | |||
private boolean isLinux = false; | |||
private OperatingSystem os = OperatingSystem.UNKNOWN; | |||
private MobileSystem ms = MobileSystem.UNKNOWN; | |||
public enum OperatingSystem { | |||
UNKNOWN, WINDOWS, MACOSX, LINUX; | |||
} | |||
public enum MobileSystem { | |||
UNKNOWN, IOS, ANDROID; | |||
} | |||
private float browserEngineVersion = -1; | |||
private int browserMajorVersion = -1; | |||
@@ -115,13 +122,21 @@ public class VBrowserDetails implements Serializable { | |||
// Operating system | |||
if (userAgent.contains("windows ")) { | |||
isWindows = true; | |||
os = OperatingSystem.WINDOWS; | |||
} else if (userAgent.contains("linux")) { | |||
isLinux = true; | |||
os = OperatingSystem.LINUX; | |||
if (userAgent.contains("android")) { | |||
ms = MobileSystem.ANDROID; | |||
} | |||
} else if (userAgent.contains("macintosh") | |||
|| userAgent.contains("mac osx") | |||
|| userAgent.contains("mac os x")) { | |||
isMacOSX = true; | |||
os = OperatingSystem.MACOSX; | |||
if (userAgent.contains("ipad") || userAgent.contains("ipod") | |||
|| userAgent.contains("iphone")) { | |||
ms = MobileSystem.IOS; | |||
} | |||
} | |||
} | |||
@@ -281,7 +296,7 @@ public class VBrowserDetails implements Serializable { | |||
* @return true if run on Windows, false otherwise | |||
*/ | |||
public boolean isWindows() { | |||
return isWindows; | |||
return os == OperatingSystem.WINDOWS; | |||
} | |||
/** | |||
@@ -290,7 +305,7 @@ public class VBrowserDetails implements Serializable { | |||
* @return true if run on Mac OSX, false otherwise | |||
*/ | |||
public boolean isMacOSX() { | |||
return isMacOSX; | |||
return os == OperatingSystem.MACOSX; | |||
} | |||
/** | |||
@@ -299,7 +314,25 @@ public class VBrowserDetails implements Serializable { | |||
* @return true if run on Linux, false otherwise | |||
*/ | |||
public boolean isLinux() { | |||
return isLinux; | |||
return os == OperatingSystem.LINUX; | |||
} | |||
/** | |||
* Tests if the browser is run on Android. | |||
* | |||
* @return true if run on Android, false otherwise | |||
*/ | |||
public boolean isAndroid() { | |||
return ms == MobileSystem.ANDROID; | |||
} | |||
/** | |||
* Tests if the browser is run in iOS. | |||
* | |||
* @return true if run in iOS, false otherwise | |||
*/ | |||
public boolean isIOS() { | |||
return ms == MobileSystem.IOS; | |||
} | |||
} |
@@ -2,8 +2,6 @@ package com.vaadin.terminal.gwt.client; | |||
import junit.framework.TestCase; | |||
import com.vaadin.terminal.gwt.client.VBrowserDetails; | |||
public class TestVBrowserDetailsUserAgentParser extends TestCase { | |||
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"; | |||
@@ -37,6 +35,9 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase { | |||
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"; | |||
private static final String IPHONE_IOS_5_1 = "Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B179 Safari/7534.48.3"; | |||
private static final String IPAD_IOS_4_3_1 = "Mozilla/5.0 (iPad; U; CPU OS 4_3_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8G4 Safari/6533.18.5"; | |||
public void testSafari3() { | |||
VBrowserDetails bd = new VBrowserDetails(SAFARI3_WINDOWS); | |||
assertWebKit(bd); | |||
@@ -57,6 +58,28 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase { | |||
assertMacOSX(bd); | |||
} | |||
public void testIPhoneIOS5() { | |||
VBrowserDetails bd = new VBrowserDetails(IPHONE_IOS_5_1); | |||
assertWebKit(bd); | |||
assertSafari(bd); | |||
assertBrowserMajorVersion(bd, 5); | |||
assertBrowserMinorVersion(bd, 1); | |||
assertEngineVersion(bd, 534f); | |||
assertMacOSX(bd); | |||
assertIOS(bd); | |||
} | |||
public void testIPadIOS4() { | |||
VBrowserDetails bd = new VBrowserDetails(IPAD_IOS_4_3_1); | |||
assertWebKit(bd); | |||
assertSafari(bd); | |||
assertBrowserMajorVersion(bd, 5); | |||
assertBrowserMinorVersion(bd, 0); | |||
assertEngineVersion(bd, 533f); | |||
assertMacOSX(bd); | |||
assertIOS(bd); | |||
} | |||
public void testChrome3() { | |||
VBrowserDetails bd = new VBrowserDetails(CHROME3_MAC); | |||
assertWebKit(bd); | |||
@@ -352,18 +375,30 @@ public class TestVBrowserDetailsUserAgentParser extends TestCase { | |||
assertFalse(browserDetails.isLinux()); | |||
assertFalse(browserDetails.isWindows()); | |||
assertTrue(browserDetails.isMacOSX()); | |||
assertFalse(browserDetails.isAndroid()); | |||
} | |||
private void assertIOS(VBrowserDetails browserDetails) { | |||
assertFalse(browserDetails.isLinux()); | |||
assertFalse(browserDetails.isWindows()); | |||
assertTrue(browserDetails.isMacOSX()); | |||
assertTrue(browserDetails.isIOS()); | |||
assertFalse(browserDetails.isAndroid()); | |||
} | |||
private void assertWindows(VBrowserDetails browserDetails) { | |||
assertFalse(browserDetails.isLinux()); | |||
assertTrue(browserDetails.isWindows()); | |||
assertFalse(browserDetails.isMacOSX()); | |||
assertFalse(browserDetails.isIOS()); | |||
assertFalse(browserDetails.isAndroid()); | |||
} | |||
private void assertLinux(VBrowserDetails browserDetails) { | |||
assertTrue(browserDetails.isLinux()); | |||
assertFalse(browserDetails.isWindows()); | |||
assertFalse(browserDetails.isMacOSX()); | |||
assertFalse(browserDetails.isIOS()); | |||
} | |||
} |