Skip to content

Instantly share code, notes, and snippets.

@Nimfadora
Last active March 21, 2018 12:29
Show Gist options
  • Save Nimfadora/7ff1b62455decb0ed17b103dd55749ac to your computer and use it in GitHub Desktop.
Save Nimfadora/7ff1b62455decb0ed17b103dd55749ac to your computer and use it in GitHub Desktop.
Benchmark viewability support analysis
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