Last active
March 21, 2018 12:29
-
-
Save Nimfadora/7ff1b62455decb0ed17b103dd55749ac to your computer and use it in GitHub Desktop.
Benchmark viewability support analysis
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.jenkov; | |
import com.google.common.collect.ImmutableList; | |
import com.google.common.collect.Range; | |
import org.apache.commons.lang3.StringUtils; | |
import org.openjdk.jmh.annotations.*; | |
import org.openjdk.jmh.infra.Blackhole; | |
import java.util.List; | |
import java.util.concurrent.TimeUnit; | |
import java.util.stream.Collectors; | |
import static com.jenkov.MyBenchmark.MyState.USER_AGENT_RULES; | |
import static java.util.Arrays.asList; | |
import static java.util.Collections.singletonList; | |
public class MyBenchmark { | |
@State(Scope.Benchmark) | |
public static class MyState { | |
public enum Browser { | |
CHROME, | |
FIREFOX, | |
SAFARI, | |
OPERA, | |
EXPLORER, | |
EDGE, | |
YANDEX, | |
MOBILE, // we don't need to separate mobile browsers for now | |
UNKNOWN, | |
} | |
public enum ViewabilitySupport { | |
/** | |
* Browser is detected, viewability is not supported. | |
*/ | |
NOT_SUPPORTED, | |
/** | |
* Browser is detected, viewability is supported. | |
*/ | |
SUPPORTED, | |
/** | |
* Browser is not detected, so we cannot check if viewability is supported. | |
*/ | |
UNKNOWN | |
} | |
public static final List<UserAgentRule> USER_AGENT_RULES = ImmutableList.<UserAgentRule>builder() | |
// Facebook app | |
.add(new UserAgentRule(asList("Android", "Version/", "FBAV/"), Browser.MOBILE)) | |
// YaBrowser for Mac OS Desktop | |
.add(new UserAgentRule(asList("Macintosh", "YaBrowser/"), Browser.YANDEX)) | |
// YaBrowser for Mac OS Mobile | |
.add(new UserAgentRule(asList("Mac OS X", "YaBrowser/"), Browser.YANDEX)) | |
// YaBrowser Mobile | |
.add(new UserAgentRule(asList("Android ", "YaBrowser/"), Browser.YANDEX)) | |
// YaBrowser | |
.add(new UserAgentRule(singletonList("YaBrowser/"), "YaBrowser/", 17, Integer.MAX_VALUE, Browser.YANDEX)) | |
// Opera for some ios mobile device | |
.add(new UserAgentRule(asList("Macintosh", "Opera Mobi"), Browser.OPERA)) | |
// Opera Mobile | |
.add(new UserAgentRule(asList("Android", "OPR/"), "OPR/", 38, Integer.MAX_VALUE, Browser.OPERA)) | |
.add(new UserAgentRule(asList("Android", "Opera Mobi/", "Version/"), "Version/", 38, Integer.MAX_VALUE, MyState.Browser.OPERA)) | |
.add(new UserAgentRule(asList("Android", "Opera Mobi/", "Opera "), "Opera ", 38, Integer.MAX_VALUE, MyState.Browser.OPERA)) | |
.add(new UserAgentRule(asList("Android", "Opera Tablet/", "Version/"), "Version/", 38, Integer.MAX_VALUE, MyState.Browser.OPERA)) | |
.add(new UserAgentRule(singletonList("Opera Mini"), Browser.OPERA)) | |
.add(new UserAgentRule(singletonList("Opera Mobi"), Browser.OPERA)) | |
.add(new UserAgentRule(singletonList("Opera Tablet"), Browser.OPERA)) | |
// Opera for Mac OS Desktop | |
.add(new UserAgentRule(asList("Macintosh", "OPR/"), Browser.OPERA)) | |
.add(new UserAgentRule(asList("Macintosh", "Opera"), Browser.OPERA)) | |
// Opera for Mac OS Mobile | |
.add(new UserAgentRule(asList("Mac OS X", "Opera"), Browser.OPERA)) | |
.add(new UserAgentRule(asList("Mac OS X", "OPR/"), Browser.OPERA)) | |
.add(new UserAgentRule(asList("Mac OS X", "OPiOS/"), Browser.OPERA)) | |
// Opera | |
.add(new UserAgentRule(asList("Opera", "Version/"), "Version/", 38, 80, Browser.OPERA)) | |
.add(new UserAgentRule(singletonList("Opera "), "Opera ", 38, 80, Browser.OPERA)) | |
.add(new UserAgentRule(singletonList("OPR/"), "OPR/", 38, 80, Browser.OPERA)) | |
.add(new UserAgentRule(singletonList("Opera"), Browser.OPERA)) | |
// Firefox for Mac OS Desktop | |
.add(new UserAgentRule(asList("Macintosh", "Firefox/"), Browser.FIREFOX)) | |
// Firefox for Mac OS Mobile | |
.add(new UserAgentRule(asList("Mac OS X", "FxiOS/"), Browser.FIREFOX)) | |
.add(new UserAgentRule(asList("Mac OS X", "Firefox/"), Browser.FIREFOX)) | |
.add(new UserAgentRule(asList("Mac OS X", "Fennec/"), Browser.FIREFOX)) | |
// Firefox Mobile | |
.add(new UserAgentRule(asList("Android", "Firefox/"), Browser.FIREFOX)) | |
.add(new UserAgentRule(asList("Mobile", "Firefox/"), Browser.FIREFOX)) | |
.add(new UserAgentRule(asList("Tablet", "Firefox/"), Browser.FIREFOX)) | |
.add(new UserAgentRule(singletonList("Fennec/"), Browser.FIREFOX)) | |
// Firefox | |
.add(new UserAgentRule(singletonList("Firefox/"), "Firefox/", 37, 80, Browser.FIREFOX)) | |
//Edge for Mac OS Desktop | |
.add(new UserAgentRule(asList("Macintosh", "Edge/"), Browser.EDGE)) | |
//Edge for Mac OS Mobile | |
.add(new UserAgentRule(asList("Mac OS X", "Edge/"), Browser.EDGE)) | |
.add(new UserAgentRule(singletonList("EdgiOS/"), Browser.EDGE)) | |
// Edge Mobile | |
.add(new UserAgentRule(asList("Windows Phone", "Edge/"), Browser.EDGE)) | |
.add(new UserAgentRule(singletonList("EdgA/"), Browser.EDGE)) | |
// Edge | |
.add(new UserAgentRule(singletonList("Edge/"), "Edge/", 15, 24, Browser.EDGE)) | |
//Android | |
.add(new UserAgentRule(asList("Android", "Version/", "Chrome/", "Mobile"), Browser.MOBILE)) | |
.add(new UserAgentRule(asList("Android", "Version/", "Safari"), Browser.MOBILE)) | |
// Chrome for Mac OS Desktop | |
.add(new UserAgentRule(asList("Macintosh", "Chrome/"), Browser.CHROME)) | |
// Chrome for Mac OS Mobile | |
.add(new UserAgentRule(asList("Mac OS X", "Chrome/"), Browser.CHROME)) | |
.add(new UserAgentRule(asList("Mac OS X", "CriOS/"), Browser.CHROME)) | |
// Chrome Mobile | |
.add(new UserAgentRule(asList("Android", "CrMo/", "Safari"), "CrMo/", 51, Integer.MAX_VALUE, Browser.CHROME)) | |
.add(new UserAgentRule(asList("Android", "Chrome/", "Safari"), "Chrome/", 51, Integer.MAX_VALUE, Browser.CHROME)) | |
.add(new UserAgentRule(asList("CrMo/", "Safari"), Browser.CHROME)) | |
// Chrome | |
.add(new UserAgentRule(singletonList("Chrome/"), "Chrome/", 51, Integer.MAX_VALUE, Browser.CHROME)) | |
// Safari | |
.add(new UserAgentRule(asList("Macintosh", "Version/"), Browser.SAFARI)) | |
.add(new UserAgentRule(asList("Macintosh", "Safari/"), Browser.SAFARI)) | |
.add(new UserAgentRule(asList("Mac OS X", "Version/"), Browser.SAFARI)) | |
.add(new UserAgentRule(asList("Safari/", "Version/"), Browser.SAFARI)) | |
// IE | |
.add(new UserAgentRule(asList("MSIE", "IEMobile"), Browser.EXPLORER)) | |
.add(new UserAgentRule(singletonList("IEMobile/"), Browser.EXPLORER)) | |
.add(new UserAgentRule(singletonList("; MSIE "), Browser.EXPLORER)) | |
.add(new UserAgentRule(asList("WOW64", "rv"), Browser.EXPLORER)) | |
.add(new UserAgentRule(asList("Trident", "rv"), Browser.EXPLORER)) | |
// Mobile | |
.add(new UserAgentRule(singletonList("Mobi"), Browser.MOBILE)) | |
.build(); | |
@Param({ | |
"Opera/9.60 (J2ME/MIDP; Opera Mini/4.2.14320/554; U; cs) Presto/2.2.0", | |
"Opera/8.01 (J2ME/MIDP; Opera Mini/3.1.9427/1724; nb; U; ssr)", | |
"Opera/8.01 (J2ME/MIDP; Opera Mini/1.1.3475/hifi/tmobile/cz; SonyEricsson W880i; cs; U; ssr)", | |
"Opera/10.61 (J2ME/MIDP; Opera Mini/5.1.21219/19.999; en-US; rv:1.9.3a5) WebKit/534.5 Presto/2.6.30", | |
"Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) OPiOS/8.0.0.78129 Mobile/11D201 Safari/9537.53", | |
"Opera/9.80 (iPhone; Opera Mini/14.0.0/62.178; U; en) Presto/2.12.423 Version/12.16", | |
"Opera/9.80 (iPhone; Opera Mini/5.0.0176/764; U; en) Presto/2.4.15", | |
"Opera/9.80 (S60; SymbOS; Opera Mobi/352; U; de) Presto/2.4.15 Version/10.00", | |
"Opera/9.80 (Windows Mobile; WCE; Opera Mobi/WMD-50430; U; en-GB) Presto/2.4.13 Version/10.00", | |
"SAMSUNG-GT-i8000/1.0 (Windows CE; Opera Mobi; U; en) Opera 9.5", | |
"HTC_HD2_T9193 Opera/9.7 (Windows NT 5.1; U; en) V1.49.841.1 (71528)", | |
"Opera/9.80 (S60; SymbOS; Opera Tablet/9174; U; en) Presto/2.7.81 Version/10.5", | |
"Opera/9.80 (Windows NT 6.1; Opera Tablet/15165; U; en) Presto/2.8.149 Version/11.1", | |
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2376.0 Safari/537.36 OPR/31.0.1857.0", | |
"Opera/5.11 (Windows 98; U) [en]", | |
"Opera/9.51 (Macintosh; Intel Mac OS X; U; en)", | |
"Opera/9.70 (Linux i686 ; U; en) Presto/2.2.1", | |
"Mozilla/5.0 (Linux; Android 4.2.2; Nexus 7 Build/JDQ39) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.123 Safari/537.22 OPR/14.0.1025.52315", | |
"Mozilla/5.0 (Linux; Android 2.3.4; MT11i Build/4.0.2.A.0.62) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.123 Mobile Safari/537.22 OPR/37.0.1025.52315", | |
"Opera/9.80 (Android; Linux; Opera Mobi/49; U; en) Presto/2.4.18 Version/10.00", | |
"Opera/9.80 (Android 2.2; Opera Mobi/-2118645896; U; pl) Presto/2.7.60 Version/37.5", | |
"Opera/9.80 (Android 2.2.2; Linux; Opera Tablet/ADR-1111101157; U; en) Presto/2.9.201 Version/11.50", | |
"Opera/9.80 (Windows NT 5.1; U; cs) Presto/2.2.15 Version/10.00", | |
"Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11", | |
"Opera/9.80 (Linux armv6l ; U; CE-HTML/1.0 NETTV/3.0.1;; en) Presto/2.6.33 Version/37.60", | |
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.29 Safari/537.36 OPR/92.0.1147.24 (Edition Next)", | |
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.29 Safari/537.36 OPR/37.0.1147.24 (Edition Next)", | |
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.12 Safari/537.36 OPR/14.0.1116.4", | |
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 80.24", | |
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 81.24", | |
"Mozilla/5.0 (Linux; Android 4.2.2; Nexus 7 Build/JDQ39) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.123 Safari/537.22 OPR/38.0.2220.41", | |
"Mozilla/5.0 (Linux; Android 2.3.4; MT11i Build/4.0.2.A.0.62) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.123 Mobile Safari/537.22 OPR/40.0.2220.41", | |
"Opera/9.80 (Android; Linux; Opera Mobi/49; U; en) Presto/2.4.18 Version/39.0.2220.41", | |
"Opera/9.80 (Android 2.2; Opera Mobi/-2118645896; U; pl) Presto/2.7.60 Version/45.0.2220.41", | |
"Opera/9.80 (Android 2.2.2; Linux; Opera Tablet/ADR-1111101157; U; en) Presto/2.9.201 Version/54.0.2220.41", | |
"Mozilla/5.0 (Android 2.2.2; Linux; Opera Mobi/ADR-1103311355; U; en; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 40.00", | |
"Opera/9.80 (Windows NT 5.1; U; cs) Presto/2.2.15 Version/39.00", | |
"Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/42.11", | |
"Opera/9.80 (Linux armv6l ; U; CE-HTML/1.0 NETTV/3.0.1;; en) Presto/2.6.33 Version/79.60", | |
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.29 Safari/537.36 OPR/38.0.1147.24 (Edition Next)", | |
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.12 Safari/537.36 OPR/40.0.1116.4", | |
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 39.24", | |
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b2pre) Gecko/20081015 Fennec/1.0a1", | |
"Mozilla/5.0 (X11; U; Linux armv7l; en-US; rv:1.9.2a1pre) Gecko/20090322 Fennec/1.0b2pre", | |
"Mozilla/5.0 (Android; Linux armv7l; rv:9.0) Gecko/20111216 Firefox/9.0 Fennec/9.0", | |
"Mozilla/5.0 (Mobile; rv:14.0) Gecko/14.0 Firefox/37.0", | |
"Mozilla/5.0 (Mobile; rv:17.0) Gecko/17.0 Firefox/38.0", | |
"Mozilla/5.0 (Tablet; rv:18.1) Gecko/18.1 Firefox/79.1", | |
"Mozilla/5.0 (Android; Mobile; rv:28.0) Gecko/28.0 Firefox/39.0", | |
"Mozilla/5.0 (Android; Tablet; rv:29.0) Gecko/29.0 Firefox/29.0", | |
"Mozilla/5.0 (Android 4.2.2; Tablet; rv:47.0) Gecko/47.0 Firefox/47.0", | |
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 GTB5", | |
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; ko; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2", | |
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:25.0) Gecko/20100101 Firefox/25.0", | |
"Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.12) Gecko/20080214 Firefox/80.0.0.12", | |
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100308 Ubuntu/10.04 (lucid) Firefox/36.6 GTB7.1", | |
"Mozilla/5.0 (Windows NT 6.1; rv:28.0) Gecko/20100101 Firefox/14.0", | |
"Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.12) Gecko/20080214 Firefox/79.0.0.12", | |
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100308 Ubuntu/10.04 (lucid) Firefox/37.6 GTB7.1", | |
"Mozilla/5.0 (Windows NT 6.1; rv:28.0) Gecko/20100101 Firefox/40.0", | |
"Mozilla/5.0 (Windows Phone 10.0; Android 6.0.1; Xbox; Xbox One) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Mobile Safari/537.36 Edge/16.16299", | |
"Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; HTC; 0PRB180) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/15.10586", | |
"Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/603.2.4 (KHTML, like Gecko) Mobile/14F89 Safari/603.2.4 EdgiOS/23.1.35.1", | |
"Mozilla/5.0 (Linux; Android 8.0; Pixel XL Build/OPP3.170518.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.0 Mobile Safari/537.36 EdgA/22.1.35.1", | |
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; Xbox; Xbox One) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2486.0 Safari/537.36 Edge/11.10586", | |
"Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36 Edge/14.0", | |
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; Xbox; Xbox One) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/24.16258", | |
"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/12.16258", | |
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/13.16258", | |
"Mozilla/5.0 (Windows NT 10.0; rv:1.9.2.3 ); AppleWebKit/537.36 Safari/533.20.27 Version/9.0.4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/25.16299", | |
"Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36 Edge/15.0", | |
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; Xbox; Xbox One) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/16.16258", | |
"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/23.16258", | |
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16258", | |
"Mozilla/5.0 (Windows NT 10.0; rv:1.9.2.3 ); AppleWebKit/537.36 Safari/533.20.27 Version/9.0.4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299", | |
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) YaBrowser/1.0.1084.5402 Chrome/19.0.1084.5402 Safari/536.5", | |
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.100 YaBrowser/16.11.0.2680 Yowser/2.5 Safari/537.36", | |
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.5 (KHTML, like Gecko) YaBrowser/18.0.1084.5402 Chrome/19.0.1084.5402 Safari/536.5", | |
"Mozilla/5.0 (Linux; Android 5.1.1; KT546AA-UUB SR5513HK Build/LMY48Z) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 YaBrowser/18.9.1.1409.01 (alpha) Safari/537.36", | |
"Mozilla/5.0 (iPad; CPU OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) YaBrowser/18.6.0.8865.11 Mobile/11D257 Safari/9537.53", | |
"Mozilla/5.0 (Linux; Android 5.1.1; HSG1351 Build/LMY48G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 YaBrowser/18.4.0.9404.01 Safari/537.36", | |
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) YaBrowser/17.0.1084.5402 Chrome/19.0.1084.5402 Safari/536.5", | |
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.100 YaBrowser/18.11.0.2680 Yowser/2.5 Safari/537.36", | |
"Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; en) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/51.0.1084.60 Mobile/9B206 Safari/7534.48.3", | |
"Mozilla/5.0 (iPad; U; CPU OS 5_1_1 like Mac OS X; en-us) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/51.0.1084.60 Mobile/9B206 Safari/7534.48.3", | |
"Mozilla/5.0 (iPad; CPU OS 10_2 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/55.0.2883.79 Mobile/14C92 Safari/602.1", | |
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/13.0.1025.45 Safari/535.19", | |
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2376.0 Safari/537.36 CriOS/31.0.1857.0", | |
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/14.0.154.53 Safari/525.19", | |
"Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/540.0 (KHTML,like Gecko) Chrome/28.1.0.0 Safari/540.0", | |
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/50.0.1055.1 Safari/535.24", | |
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/50.0.1090.0 Safari/536.6", | |
"Mozilla/5.0 (Linux; Android 4.0.4; SGH-I777 Build/Task650 & Ktoonsez AOKP) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/11.0.1025.166 Mobile Safari/535.19", | |
"Mozilla/5.0 (Linux; Android 4.1; Galaxy Nexus Build/JRN84D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/50.0.1025.166 Mobile Safari/535.19", | |
"Mozilla/5.0 (Linux; U; Android-4.0.3; en-us; Galaxy Nexus Build/IML74K) AppleWebKit/535.7 (KHTML, like Gecko) CrMo/51.0.912.75 Mobile Safari/535.7", | |
"Mozilla/5.0 (Linux; U; Android-4.0.3; en-us; Xoom Build/IML77) AppleWebKit/535.7 (KHTML, like Gecko) CrMo/51.0.912.75 Safari/535.7", | |
"Mozilla/5.0 (Linux; Android 4.0.4; SGH-I777 Build/Task650 & Ktoonsez AOKP) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/51.0.1025.166 Mobile Safari/535.19", | |
"Mozilla/5.0 (Linux; Android 4.1; Galaxy Nexus Build/JRN84D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/51.0.1025.166 Mobile Safari/535.19", | |
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/51.0.154.53 Safari/525.19", | |
"Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/540.0 (KHTML,like Gecko) Chrome/51.1.0.0 Safari/540.0", | |
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/51.0.1055.1 Safari/535.24", | |
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/51.0.1090.0 Safari/536.6", | |
"Mozilla/5.0 (Linux; Android 4.4.2; VS880 Build/KOT49I.VS88012A) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/51.0.0.0 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/28.0.0.20.16;]", | |
"Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/51.0.2357.121 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/35.0.0.48.273;]", | |
"Mozilla/5.0 (Linux; Android 4.4; Nexus 5 Build/_BuildID_) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/52.0.0.0 Mobile Safari/537.36", | |
"Mozilla/5.0 (Linux; Android 5.1.1; Nexus 5 Build/LMY48B; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/52.0.2357.65 Mobile Safari/537.36", | |
"8900a/1.2 Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.6)", | |
"HTC_P4550/TYTN_II Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11)", | |
"Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11) 320x240; VZW; Motorola-Q9c; Windows Mobile 6.1 Standard", | |
"Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0)", | |
"Mozilla/5.0 (Windows Phone 8.1; ARM; Trident/7.0; Touch IEMobile/11.0; HTC; Windows Phone 8S by HTC) like Gecko", | |
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Windows Phone 6.5.3.5)", | |
"Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 520)", | |
"Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; Microsoft; RM-1074) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537", | |
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0; .NET CLR 2.0.50727)", | |
"Mozilla/4.0 (compatible; MSIE 5.23; Mac_PowerPC)", | |
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 1.1.4322; InfoPath.2; .NET CLR 3.5.21022; .NET CLR 3.5.30729; MS-RTC LM 8; OfficeLiveConnector.1.4; OfficeLivePatch.1.3; .NET CLR 3.0.30729)", | |
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; Media Center PC 6.0; InfoPath.3; MS-RTC LM 8; Zune 4.7)", | |
"Mozilla/5.0 (IE 11.0; Windows NT 6.3; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko", | |
"Mozilla/5.0 (IE 11.0; Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko", | |
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.5 (KHTML, like Gecko) YaBrowser/17.0.1084.5402 Chrome/19.0.1084.5402 Safari/536.5", | |
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3) Gecko/20090305 Firefox/37.1b3 GTB5", | |
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; ko; rv:1.9.1b2) Gecko/20081201 Firefox/37.1b2", | |
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:25.0) Gecko/20100101 Firefox/37.0", | |
"Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5", | |
"Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53", | |
"Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7", | |
"Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10A5376e", | |
"Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) GSA/4.2.1.37597 Mobile/11D25", | |
"Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) GSA/4.2.2.38484 Mobile/12B411 Safari/9537.53", | |
"Mozilla/5.0 (iPad; CPU OS 8_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) GSA/5.2.43972 Mobile/12D508 Safari/600.1.4", | |
"NokiaC3-00/5.0 (04.60) Profile/MIDP-2.1 Configuration/CLDC-1.1 Mozilla/5.0 AppleWebKit/420+ (KHTML, like Gecko) Safari/420+", | |
"MobileSafari/9537.53 CFNetwork/672.0.8 Darwin/14.0.0", | |
"Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fi-fi) AppleWebKit/420+ (KHTML, like Gecko) Safari/419.3", | |
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", | |
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11) AppleWebKit/601.1.39 (KHTML, like Gecko) Version/9.0 Safari/601.1.39" | |
}) | |
public static String userAgent; | |
} | |
@Benchmark | |
@BenchmarkMode(Mode.AverageTime) | |
@OutputTimeUnit(TimeUnit.MILLISECONDS) | |
public void testMethod(Blackhole blackhole) { | |
// blackhole.consume(supportsViewabilityDetection(USER_AGENT)); | |
blackhole.consume(detectBrowser(MyState.userAgent)); | |
} | |
private static class UserAgentRule { | |
private final List<String> myUaParts; | |
private final String myVersionMarker; | |
private final Range<Integer> myVersionRange; | |
private final MyState.Browser myBrowser; | |
UserAgentRule(List<String> uaParts, String versionMarker, int minVersion, int maxVersion, MyState.Browser browser) { | |
myUaParts = uaParts.stream().map(String::toLowerCase).collect(Collectors.toList()); | |
myVersionMarker = versionMarker; | |
myVersionRange = Range.closedOpen(minVersion, maxVersion); | |
myBrowser = browser; | |
} | |
UserAgentRule(List<String> uaParts, MyState.Browser browser) { | |
myUaParts = uaParts.stream().map(String::toLowerCase).collect(Collectors.toList()); | |
myVersionMarker = null; | |
myVersionRange = Range.singleton(0); | |
myBrowser = browser; | |
} | |
MyState.ViewabilitySupport matches(String userAgent) { | |
String uaLowercased = userAgent.toLowerCase(); | |
if (!myUaParts.stream().allMatch(uaLowercased::contains)) { | |
return MyState.ViewabilitySupport.UNKNOWN; | |
} | |
else if (myVersionMarker == null || !matchVersion(userAgent)) { | |
return MyState.ViewabilitySupport.NOT_SUPPORTED; | |
} | |
return MyState.ViewabilitySupport.SUPPORTED; | |
} | |
MyState.Browser getBrowser(String userAgent) { | |
String uaLowercased = userAgent.toLowerCase(); | |
if (!myUaParts.stream().allMatch(uaLowercased::contains)) { | |
return MyState.Browser.UNKNOWN; | |
} | |
return myBrowser; | |
} | |
private boolean matchVersion(String userAgent) { | |
if (myVersionMarker == null || !userAgent.contains(myVersionMarker)) { | |
return false; | |
} | |
// extract "20.0.1090.0 Safari/536.6" from Mozilla/5.0 (Windows NT 6.2) Chrome/20.0.1090.0 Safari/536.6 | |
int versionIndex = userAgent.lastIndexOf(myVersionMarker) + myVersionMarker.length(); | |
// extract 20 from "20.0.1090.0 Safari/536.6", 534 from "534.30" or 20 from "20 Safari/536.6" | |
String versionNumber = userAgent.substring(versionIndex).split("\\s")[0].split("\\.")[0]; | |
return StringUtils.isNumeric(versionNumber) && myVersionRange.contains(Integer.parseInt(versionNumber)); | |
} | |
} | |
public static boolean supportsViewabilityDetection(String userAgent) { | |
if (userAgent == null) { | |
return false; | |
} | |
MyState.ViewabilitySupport result = MyState.ViewabilitySupport.UNKNOWN; | |
int i = 0; | |
while (i < USER_AGENT_RULES.size() && result == MyState.ViewabilitySupport.UNKNOWN) { | |
result = USER_AGENT_RULES.get(i).matches(userAgent); | |
i++; | |
} | |
return result == MyState.ViewabilitySupport.SUPPORTED; | |
} | |
public static MyState.Browser detectBrowser(String userAgent) { | |
if (userAgent == null) { | |
return MyState.Browser.UNKNOWN; | |
} | |
return USER_AGENT_RULES.stream().map(rule -> rule.getBrowser(userAgent)) | |
.filter(browser -> browser != MyState.Browser.UNKNOWN) | |
.findFirst() | |
.orElse(MyState.Browser.UNKNOWN); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment