browser2 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +5 -0
  3. data/.hound.yml +90 -0
  4. data/.rubocop.yml +90 -0
  5. data/.travis.yml +14 -0
  6. data/CONTRIBUTING.md +44 -0
  7. data/Gemfile +2 -0
  8. data/LICENSE +20 -0
  9. data/README.md +125 -0
  10. data/Rakefile +33 -0
  11. data/browser2.gemspec +42 -0
  12. data/config.ru +2 -0
  13. data/data/bots.json +176 -0
  14. data/data/languages.json +115 -0
  15. data/gemfiles/rails3.gemfile +4 -0
  16. data/lib/browser/action_controller.rb +20 -0
  17. data/lib/browser/data/bots.rb +5 -0
  18. data/lib/browser/data/languages.rb +5 -0
  19. data/lib/browser/data/search_engines.rb +14 -0
  20. data/lib/browser/meta/base.rb +20 -0
  21. data/lib/browser/meta/generic_browser.rb +15 -0
  22. data/lib/browser/meta/id.rb +9 -0
  23. data/lib/browser/meta/ie.rb +18 -0
  24. data/lib/browser/meta/ios.rb +9 -0
  25. data/lib/browser/meta/mobile.rb +9 -0
  26. data/lib/browser/meta/modern.rb +9 -0
  27. data/lib/browser/meta/platform.rb +9 -0
  28. data/lib/browser/meta/safari.rb +9 -0
  29. data/lib/browser/meta/webkit.rb +9 -0
  30. data/lib/browser/methods/blackberry.rb +51 -0
  31. data/lib/browser/methods/bots.rb +37 -0
  32. data/lib/browser/methods/consoles.rb +43 -0
  33. data/lib/browser/methods/devices.rb +41 -0
  34. data/lib/browser/methods/ie.rb +104 -0
  35. data/lib/browser/methods/language.rb +16 -0
  36. data/lib/browser/methods/mobile.rb +30 -0
  37. data/lib/browser/methods/platform.rb +142 -0
  38. data/lib/browser/methods/tv.rb +8 -0
  39. data/lib/browser/middleware/context/additions.rb +16 -0
  40. data/lib/browser/middleware/context/url_methods.rb +13 -0
  41. data/lib/browser/middleware/context.rb +20 -0
  42. data/lib/browser/middleware.rb +66 -0
  43. data/lib/browser/rails.rb +14 -0
  44. data/lib/browser/version.rb +8 -0
  45. data/lib/browser.rb +255 -0
  46. data/test/benchmark_test.rb +83 -0
  47. data/test/browser_test.rb +248 -0
  48. data/test/middleware_test.rb +50 -0
  49. data/test/sample_app.rb +31 -0
  50. data/test/test_helper.rb +20 -0
  51. data/test/ua.yml +122 -0
  52. data/test/unit/adobe_air_test.rb +13 -0
  53. data/test/unit/android_test.rb +93 -0
  54. data/test/unit/blackberry_test.rb +104 -0
  55. data/test/unit/bots_test.rb +116 -0
  56. data/test/unit/chrome_test.rb +56 -0
  57. data/test/unit/console_test.rb +67 -0
  58. data/test/unit/firefox_test.rb +37 -0
  59. data/test/unit/ie_test.rb +377 -0
  60. data/test/unit/ios_test.rb +139 -0
  61. data/test/unit/kindle_test.rb +37 -0
  62. data/test/unit/opera_test.rb +42 -0
  63. data/test/unit/windows_phone_test.rb +50 -0
  64. data/test/unit/windows_test.rb +60 -0
  65. metadata +240 -0
@@ -0,0 +1,248 @@
1
+ require "test_helper"
2
+
3
+ class BrowserTest < Minitest::Test
4
+ test "yields self when block is given" do
5
+ browser = nil
6
+ Browser.new(ua: 'Chrome') {|b| browser = b }
7
+ assert_kind_of Browser, browser
8
+ end
9
+
10
+ test "responds to ua methods" do
11
+ @browser = Browser.new ua: 'Chrome'
12
+ assert @browser.respond_to?(:ua)
13
+ end
14
+
15
+ test "delegates ua methods" do
16
+ @browser = Browser.new ua: 'Safari'
17
+ assert_equal 'Safari', @browser.ua
18
+
19
+ @browser = Browser.new ua: 'Mozilla'
20
+ assert_equal 'Mozilla', @browser.user_agent
21
+ end
22
+
23
+ test "sets accept language while instantiating object" do
24
+ @browser = Browser.new ua: 'Chrome', accept_language: "pt-br"
25
+ assert_equal ["pt-br"], @browser.accept_language
26
+ end
27
+
28
+ test "sets user agent while instantianting object" do
29
+ @browser = Browser.new(:ua => "Safari")
30
+ assert_equal "Safari", @browser.ua
31
+
32
+ @browser = Browser.new(:user_agent => "Chrome")
33
+ assert_equal "Chrome", @browser.ua
34
+ end
35
+
36
+ test "detects android" do
37
+ @browser = Browser.new ua: $ua["ANDROID"]
38
+
39
+ assert_equal "Android", @browser.name
40
+ assert @browser.android?
41
+ refute @browser.safari?
42
+ assert @browser.webkit?
43
+ assert @browser.mobile?
44
+ refute @browser.tablet?
45
+ assert @browser.modern?
46
+ assert_equal "3.1.2", @browser.full_version
47
+ assert_equal "3", @browser.version
48
+ end
49
+
50
+ test "detects android tablet" do
51
+ @browser = Browser.new ua: $ua["TABLOID"]
52
+
53
+ assert_equal "Android", @browser.name
54
+ assert @browser.android?
55
+ refute @browser.safari?
56
+ assert @browser.webkit?
57
+ refute @browser.mobile?
58
+ assert @browser.tablet?
59
+ assert @browser.modern?
60
+ assert_equal "4.0", @browser.full_version
61
+ assert_equal "4", @browser.version
62
+ end
63
+
64
+ test "detects surface tablet" do
65
+ @browser = Browser.new ua: $ua["SURFACE"]
66
+
67
+ assert_equal "Internet Explorer", @browser.name
68
+ assert @browser.surface?
69
+ assert @browser.ie?
70
+ refute @browser.mobile?
71
+ assert @browser.tablet?
72
+ assert @browser.modern?
73
+ assert_equal "10.0", @browser.full_version
74
+ assert_equal "10", @browser.version
75
+ end
76
+
77
+ test "detects quicktime" do
78
+ @browser = Browser.new ua: $ua["QUICKTIME"]
79
+
80
+ assert_equal "QuickTime", @browser.name
81
+ assert @browser.quicktime?
82
+ assert_equal "7.6.8", @browser.full_version
83
+ assert_equal "7", @browser.version
84
+ end
85
+
86
+ test "detects core media" do
87
+ @browser = Browser.new ua: $ua["COREMEDIA"]
88
+
89
+ assert_equal "Apple CoreMedia", @browser.name
90
+ assert @browser.core_media?
91
+ assert_equal "1.0.0.10F569", @browser.full_version
92
+ assert_equal "1", @browser.version
93
+ end
94
+
95
+ test "detects phantom.js" do
96
+ @browser = Browser.new ua: $ua["PHANTOM_JS"]
97
+
98
+ assert_equal "PhantomJS", @browser.name
99
+ assert @browser.phantom_js?
100
+ refute @browser.tablet?
101
+ refute @browser.mobile?
102
+ assert @browser.modern?
103
+ assert_equal "1.9.0", @browser.full_version
104
+ assert_equal "1", @browser.version
105
+ end
106
+
107
+ test "detects other mobiles" do
108
+ @browser = Browser.new ua: "Symbian OS"
109
+ assert @browser.mobile?
110
+ refute @browser.tablet?
111
+
112
+ @browser = Browser.new ua: "MIDP-2.0"
113
+ assert @browser.mobile?
114
+ refute @browser.tablet?
115
+ end
116
+
117
+ test "detects windows mobile" do
118
+ @browser = Browser.new ua: $ua["WINDOWS_MOBILE"]
119
+
120
+ assert @browser.mobile?
121
+ assert @browser.windows?
122
+ assert @browser.windows_mobile?
123
+ refute @browser.windows_phone?
124
+ refute @browser.tablet?
125
+ end
126
+
127
+ test "returns a zero version" do
128
+ @browser = Browser.new ua: "Bot"
129
+ assert_equal "0.0", @browser.full_version
130
+ assert_equal "0", @browser.version
131
+ end
132
+
133
+ test "sets meta" do
134
+ @browser = Browser.new ua: $ua["CHROME"]
135
+ assert_kind_of Array, @browser.meta
136
+ end
137
+
138
+ test "returns string representation" do
139
+ @browser = Browser.new ua: $ua["CHROME"]
140
+ meta = @browser.to_s
141
+
142
+ assert meta.include?("chrome")
143
+ assert meta.include?("webkit")
144
+ assert meta.include?("mac")
145
+ assert meta.include?("modern")
146
+ end
147
+
148
+ test "returns string representation for mobile" do
149
+ @browser = Browser.new ua: $ua["BLACKBERRY"]
150
+ meta = @browser.to_s
151
+
152
+ assert meta.include?("blackberry")
153
+ assert meta.include?("blackberry4")
154
+ assert meta.include?("other")
155
+ assert meta.include?("mobile")
156
+ end
157
+
158
+ test "detects unknown id" do
159
+ @browser = Browser.new ua: "Unknown"
160
+ assert_equal :other, @browser.id
161
+ end
162
+
163
+ test "detects unknown name" do
164
+ @browser = Browser.new ua: "Unknown"
165
+ assert_equal "Other", @browser.name
166
+ end
167
+
168
+ test "detects mac platform" do
169
+ @browser = Browser.new ua: "Mac OS X"
170
+ assert_equal :mac, @browser.platform
171
+ assert @browser.mac?
172
+ end
173
+
174
+ test "detects linux platform" do
175
+ @browser = Browser.new ua: "Linux"
176
+ assert_equal :linux, @browser.platform
177
+ assert @browser.linux?
178
+ end
179
+
180
+ test "detects unknown platform" do
181
+ @browser = Browser.new ua: "Unknown"
182
+ assert_equal :other, @browser.platform
183
+ end
184
+
185
+ test "returns all known languages" do
186
+ @browser = Browser.new(
187
+ ua: "Unknown",
188
+ accept_language: "en-us,en;q=0.8,pt-br;q=0.5,pt;q=0.3"
189
+ )
190
+
191
+ assert_equal ["en-us", "en", "pt-br", "pt"], @browser.accept_language
192
+ end
193
+
194
+ test "detects xoom" do
195
+ @browser = Browser.new ua: $ua["XOOM"]
196
+
197
+ assert @browser.android?
198
+ assert @browser.tablet?
199
+ refute @browser.mobile?
200
+ end
201
+
202
+ test "detects nexus tablet" do
203
+ @browser = Browser.new ua: $ua["NEXUS_TABLET"]
204
+
205
+ assert @browser.android?
206
+ assert @browser.tablet?
207
+ refute @browser.mobile?
208
+ end
209
+
210
+ test "detects nook" do
211
+ @browser = Browser.new ua: $ua["NOOK"]
212
+
213
+ assert @browser.tablet?
214
+ refute @browser.mobile?
215
+ end
216
+
217
+ test "detects samsung" do
218
+ @browser = Browser.new ua: $ua["SAMSUNG"]
219
+
220
+ assert @browser.tablet?
221
+ refute @browser.mobile?
222
+ end
223
+
224
+ test "removes duplicate items" do
225
+ @browser = Browser.new ua: $ua["SAFARI"]
226
+ assert_equal ["safari"], @browser.meta.select {|item| item == "safari" }
227
+ end
228
+
229
+ test "detects meta aliased as to_a" do
230
+ @browser = Browser.new ua: $ua["SAFARI"]
231
+ assert_equal @browser.meta, @browser.to_a
232
+ end
233
+
234
+ test "detects tv" do
235
+ @browser = Browser.new ua: $ua["SMART_TV"]
236
+ assert @browser.tv?
237
+ end
238
+
239
+ test "knows a supported browser" do
240
+ @browser = Browser.new ua: "Chrome"
241
+ assert @browser.known?
242
+ end
243
+
244
+ test "does not know an unsupported browser" do
245
+ @browser = Browser.new ua: "Fancy new browser"
246
+ refute @browser.known?
247
+ end
248
+ end
@@ -0,0 +1,50 @@
1
+ require "test_helper"
2
+ require "browser/rails"
3
+ require "sample_app"
4
+
5
+ class Browser::MiddlewareTest < Minitest::Test
6
+ include Rack::Test::Methods
7
+
8
+ def app
9
+ Rails.application
10
+ end
11
+
12
+ test "redirects with 302" do
13
+ get "/", {}, {"HTTP_USER_AGENT" => "MSIE 6", "HTTP_ACCEPT" => "text/html"}
14
+ assert_equal 302, last_response.status
15
+ end
16
+
17
+ test "redirects ie6 to upgrade path" do
18
+ get "/", {}, {"HTTP_USER_AGENT" => "MSIE 6", "HTTP_ACCEPT" => "text/html"}
19
+ follow_redirect!
20
+
21
+ assert_equal "UPGRADE: ie6", last_response.body
22
+ end
23
+
24
+ test "redirects ie7 to upgrade path" do
25
+ get "/", {}, {"HTTP_USER_AGENT" => "MSIE 7", "HTTP_ACCEPT" => "text/html"}
26
+ follow_redirect!
27
+
28
+ assert_equal "UPGRADE: ie7", last_response.body
29
+ end
30
+
31
+ test "redirects ie8 and returns 404" do
32
+ get "/", {}, {"HTTP_USER_AGENT" => "MSIE 8", "HTTP_ACCEPT" => "text/html"}
33
+ follow_redirect!
34
+
35
+ assert_equal 404, last_response.status
36
+ end
37
+
38
+ test "redirects ie8 with wildcard http accept" do
39
+ get "/", {}, {"HTTP_USER_AGENT" => "MSIE 8", "HTTP_ACCEPT" => "*/*"}
40
+ follow_redirect!
41
+
42
+ assert_equal 404, last_response.status
43
+ end
44
+
45
+ test "ignores non-html requests" do
46
+ get "/", {}, {"HTTP_USER_AGENT" => "MSIE 6", "HTTP_ACCEPT" => "image/png"}
47
+
48
+ assert_equal 200, last_response.status
49
+ end
50
+ end
@@ -0,0 +1,31 @@
1
+ require "rails"
2
+ require "browser"
3
+
4
+ class SampleApp < Rails::Application
5
+ config.secret_token = "99f19f08db7a37bdcb9d6701f54dca"
6
+ config.secret_key_base = "99f19f08db7a37bdcb9d6701f54dca"
7
+ config.eager_load = true
8
+ config.active_support.deprecation = :log
9
+
10
+ routes.append do
11
+ default_headers = {"Content-Type" => "text/html"}
12
+
13
+ root to: -> env { [200, default_headers, ["ROOT"]] }
14
+ get "upgrade", to: -> env {
15
+ browser = Rack::Request.new(env).params["browser"]
16
+ [200, default_headers, ["UPGRADE: #{browser}"]]
17
+ }, as: "upgrade"
18
+
19
+ get "/asset", to: -> env {
20
+ [200, {"Content-Type" => "image/png"}, []]
21
+ }
22
+ end
23
+
24
+ config.middleware.use Browser::Middleware do
25
+ redirect_to upgrade_path(browser: "ie6") if browser.ie?(6)
26
+ redirect_to upgrade_path(browser: "ie7") if browser.ie?(7)
27
+ redirect_to "/invalid" if browser.ie?(8)
28
+ end
29
+ end
30
+
31
+ SampleApp.initialize!
@@ -0,0 +1,20 @@
1
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", __FILE__)
2
+ require "bundler/setup"
3
+ require "minitest/autorun"
4
+ require "minitest/utils"
5
+ require "browser"
6
+ require "yaml"
7
+
8
+ $ua = YAML.load_file("./test/ua.yml")
9
+
10
+ class Minitest::Test
11
+ setup do
12
+ Browser::Bots.instance_variable_set("@detect_empty_ua", false)
13
+ end
14
+
15
+ def assert_deprecated(message, file, line, &block)
16
+ message = "#{message} (called from #{file}:#{line})"
17
+ out, err = capture_io(&block)
18
+ assert_includes err, message
19
+ end
20
+ end
data/test/ua.yml ADDED
@@ -0,0 +1,122 @@
1
+ ADOBE_AIR: 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X; de) AppleWebKit/533.19.4 (KHTML, like Gecko) AdobeAIR/13.0'
2
+ ANDROID: 'Android SDK 1.5r3: Mozilla/5.0 (Linux; U; Android 1.5; de-; sdk Build/CUPCAKE) AppleWebkit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1'
3
+ ANDROID_CUPCAKE: Mozilla/5.0 (Linux; U; Android 1.5; en-gb; T-Mobile G1 Build/CRC1) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1
4
+ ANDROID_DONUT: Mozilla/5.0 (Linux; U; Android 1.6; ar-us; SonyEricssonX10i Build/R2BA026) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1
5
+ ANDROID_ECLAIR_21: Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17
6
+ ANDROID_FROYO: Mozilla/5.0 (Linux; U; Android 2.2; en-sa; HTC_DesireHD_A9191 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
7
+ ANDROID_GINGERBREAD: Mozilla/5.0 (Linux; U; Android 2.3.3; en-us; Sensation_4G Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/5.0 Safari/533.16
8
+ ANDROID_HONEYCOMB_30: Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13
9
+ ANDROID_ICECREAM: Mozilla/5.0 (Linux; U; Android 4.0.1; en-us; sdk Build/ICS_MR0) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
10
+ ANDROID_JELLYBEAN_41: Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; Nexus S Build/JRO03E) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
11
+ ANDROID_JELLYBEAN_42: Mozilla/5.0 (Linux; U; Android 4.2; en-us; Nexus 10 Build/JVP15I) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30
12
+ ANDROID_JELLYBEAN_43: Mozilla/5.0 (Linux; Android 4.3; Nexus 7 Build/JWR66D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.111 Safari/537.36
13
+ ANDROID_KITKAT: Mozilla/5.0 (Linux; Android 4.4; Nexus 7 Build/KOT24) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.105 Safari/537.36
14
+ ANDROID_LOLLIPOP_50: Mozilla/5.0 (Linux; Android 5.0; Nexus 5 Build/LPX13D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.102 Mobile Safari/537.36
15
+ ANDROID_LOLLIPOP_51: Mozilla/5.0 (Linux; Android 5.1; Nexus 5 Build/LMY47I) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.0.0 Mobile Safari/537.36; DailymotionEmbedSDK 1.0
16
+ ANDROID_NEXUS_PLAYER: Mozilla/5.0 (Linux; Android 5.0; Nexus Player Build/LRX21V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.0
17
+ ANDROID_TV: Mozilla/5.0 (Linux; Android 5.0; ADT-1 Build/LRW87K) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile Safari/537.36
18
+ ANDROID_WITH_SAFARI: 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; SCH-I535 Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'
19
+ APPLE_BOT: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/600.2.5 (KHTML, like Gecko) Version/8.0.2 Safari/600.2.5 (Applebot/0.1)'
20
+ ASK: 'Mozilla/2.0 (compatible; Ask Jeeves/Teoma; +http://sp.ask.com/docs/about/tech_crawling.html)'
21
+ BAIDU: 'Baiduspider+(+http://www.baidu.com/search/spider.htm)'
22
+ BINGBOT: 'Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)'
23
+ BLACKBERRY10: 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.1675 Mobile Safari/537.10+'
24
+ BLACKBERRY4: 'BlackBerry8100/4.2.1 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/103'
25
+ BLACKBERRY5: 'BlackBerry9000/5.0.0.93 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/179'
26
+ BLACKBERRY6: 'Mozilla/5.0 (BlackBerry; U; BlackBerry AAAA; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/6.0.0.141 Mobile Safari/534.11+'
27
+ BLACKBERRY7: 'Mozilla/5.0 (BlackBerry; U; BlackBerry AAAA; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.1 Mobile Safari/534.11+'
28
+ BLACKBERRY: 'BlackBerry7100i/4.1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/103'
29
+ CHROME: 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4'
30
+ CHROME_OS: 'Mozilla/5.0 (X11; CrOS x86_64 3701.81.0) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.57 Safari/537.31.'
31
+ COREMEDIA: 'Apple Mac OS X v10.6.4 CoreMedia v1.0.0.10F569'
32
+ DAUMOA: Mozilla/5.0 (compatible; MSIE or Firefox mutant; not on Windows server;) Daumoa 4.0
33
+ DOMAINAREANIMATOR: 'Domain Re-Animator Bot (http://domainreanimator.com) - support@domainreanimator.com'
34
+ DOT_BOT: 'Mozilla/5.0 (compatible; DotBot/1.1; http://www.opensiteexplorer.org/dotbot, help@moz.com)'
35
+ DUCKDUCKGO: 'DuckDuckBot/1.0; (+http://duckduckgo.com/duckduckbot.html)'
36
+ FACEBOOK_BOT: 'facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)'
37
+ FIREFOX: 'Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.2) Gecko/20121223 Ubuntu/9.25 (jaunty) Firefox/3.8'
38
+ FIREFOX_MODERN: 'Mozilla/5.0 (X11; Ubuntu; Linux armv7l; rv:17.0) Gecko/20100101 Firefox/17.0'
39
+ FIREFOX_TABLET: 'Mozilla/5.0 (Android; Tablet; rv:14.0) Gecko/14.0 Firefox/14.0'
40
+ GOOGLE_BOT: 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'
41
+ GOOGLE_PAGE_SPEED_INSIGHTS: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.4 (KHTML, like Gecko; Google Page Speed Insights) Chrome/22.0.1229 Safari/537.4'
42
+ GOOGLE_STRUCTURED_DATA_TESTING_TOOL: 'Mozilla/5.0 (compatible; X11; Linux x86_64; Google-StructuredDataTestingTool; +http://www.google.com/webmasters/tools/richsnippets)'
43
+ GRAPESHOT: 'Mozilla/5.0 (compatible; GrapeshotCrawler/2.0; +http://www.grapeshot.co.uk/crawler.php)'
44
+ IE10: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0; EIE10;ENUSMSN)'
45
+ IE10_COMPAT: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; EIE10;ENUSMSN)'
46
+ IE10_X64_WINX64: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)'
47
+ IE11: 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko'
48
+ IE11_COMPAT: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729)'
49
+ IE11_TOUCH_SCREEN: 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; Touch; rv:11.0) like Gecko'
50
+ IE6: 'Mozilla/5.0 (Windows; U; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)'
51
+ IE7: 'Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)'
52
+ IE8: 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.2; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)'
53
+ IE8_COMPAT: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0; SLCC1; Media Center PC 5.0; .NET CLR 3.5.21022)'
54
+ IE9: 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)'
55
+ IE9_COMPAT: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0)'
56
+ IE_WITHOUT_TRIDENT: Mozilla/4.0 (compatible; MSIE8.0; Windows NT 6.0) .NET CLR 2.0.50727)
57
+ IOS4: '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'
58
+ IOS5: 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3'
59
+ IOS6: 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25'
60
+ IOS7: 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53'
61
+ IOS8: 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A365 Safari/600.1.4'
62
+ IOS9: 'Mozilla/5.0 (iPad; CPU OS 9_0 like Mac OS X) AppleWebKit/601.1.17 (KHTML, like Gecko) Version/8.0 Mobile/13A175 Safari/600.1.4'
63
+ IPAD: 'Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B367 Safari/531.21.10'
64
+ IPHONE: 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/1A542a Safari/419.3'
65
+ IPOD: 'Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3A100a Safari/419.3'
66
+ KINDLE: 'Mozilla/5.0 (Linux; U; en-US) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) Version/4.0 Kindle/3.0 (screen 600×800; rotate)'
67
+ KINDLE_FIRE: 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Kindle Fire Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1'
68
+ KINDLE_FIRE_HD: 'Mozilla/5.0 (Linux; U; en-us; KFTT Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.4 Safari/535.19 Silk-Accelerated=true'
69
+ KINDLE_FIRE_HD_MOBILE: 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; KFTT Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.4 Mobile Safari/535.19 Silk-Accelerated=true'
70
+ LINKDEXBOT: 'Mozilla/5.0 (compatible; linkdexbot/2.0; +http://www.linkdex.com/bots/)'
71
+ LOAD_TIME_BOT: 'Mozilla/5.0 (compatible; LoadTimeBot/0.9; +http://www.loadtime.net/bot.html)'
72
+ LUMIA800: 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; XBLWP7; ZuneWP7'
73
+ MAIL_RU: 'Mozilla/5.0 (compatible; Linux x86_64; Mail.RU_Bot/2.0; +http://go.mail.ru/help/robots)'
74
+ MEGAINDEX_RU: 'Mozilla/5.0 (compatible; MegaIndex.ru/2.0; +https://www.megaindex.ru/?tab=linkAnalyze)'
75
+ MOBILE_CHROME: 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; en) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3'
76
+ MS_EDGE: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0'
77
+ MS_EDGE_COMPAT: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/8.0; .NET4.0C; .NET4.0E; Tablet PC 2.0; Microsoft Outlook 15.0.4433; ms-office; MSOffice 15)'
78
+ MS_EDGE_MOBILE: 'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; DEVICE INFO) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Mobile Safari/537.36 Edge/12.0'
79
+ MSN_BOT: 'msnbot-media/1.1 (+http://search.msn.com/msnbot.htm)'
80
+ NEXUS_TABLET: 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19'
81
+ NINTENDO_WII: 'Opera/9.00 (Nintendo Wii; U; ; 1309-9; en)'
82
+ NINTENDO_WIIU: 'Mozilla/5.0 (Nintendo WiiU) AppleWebKit/534.52 (KHTML, like Gecko) NX/2.1.0.8.23 NintendoBrowser/1.1.0.7579.EU'
83
+ NOOK: 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; NOOK BNTV250A Build/GINGERBREAD 1.4.3) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Safari/533.1'
84
+ OPERA: 'Opera/9.80 (Macintosh; Intel Mac OS X 10.7.4; U; en) Presto/2.10.229 Version/11.64'
85
+ OPERA_MINI: 'Opera/9.80 (Android; Opera Mini/7.029952/28.2359;u; fr) Presto/2.8.119 Version/11.10'
86
+ OPERA_MOBI: 'Opera/9.8 (Android 2.3.5; Linux; Opera Mobi/ADR-1205181138; U; en) Presto/2.10.254 Version/12.00'
87
+ OPERA_NEXT: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.37 Safari/537.36 OPR/15.0.1147.44 (Edition Next)'
88
+ PHANTOM_JS: 'Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.0 Safari/534.34'
89
+ PLAYBOOK: 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML, like Gecko) Version/7.2.1.0 Safari/536.2+'
90
+ PLAYSTATION3: 'Mozilla/5.0 (PLAYSTATION 3; 3.55)'
91
+ PLAYSTATION4: 'Mozilla/5.0 (PlayStation 4 1.020) AppleWebKit/536.26 (KHTML, like Gecko)'
92
+ PSP: 'Mozilla/4.0 (PSP (PlayStation Portable); 2.00)'
93
+ PSP_VITA: 'Mozilla/5.0 (Playstation Vita 1.61) AppleWebKit/531.22.8 (KHTML, like Gecko) Silk/3.2'
94
+ QUERYSEEKER: 'QuerySeekerSpider ( http://queryseeker.com/bot.html )'
95
+ QUICKTIME: 'QuickTime/7.6.8 (qtver=7.6.8;os=Windows NT 5.1Service Pack 3)'
96
+ SAFARI: 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-us) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8'
97
+ SAFARI_IPAD_WEBAPP_MODE: 'Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405'
98
+ SAFARI_IPHONE_WEBAPP_MODE: 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.20 (KHTML, like Gecko) Mobile/7B298g'
99
+ SAMSUNG: 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; SAMSUNG-SGH-I497 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30'
100
+ SAMSUNG_CHROME: 'Mozilla/5.0 (Linux; Android 4.4.2; en-gb; SAMSUNG GT-I9195/I9195XXUCNEA Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Mobile Safari/537.36'
101
+ SCRAPY: 'Scrapy/0.18.4 (+http://scrapy.org)'
102
+ SMART_TV: 'Mozilla/5.0 (SmartHub; SMART-TV; U; Linux/SmartTV) AppleWebKit/531.2+ (KHTML, like Gecko) WebBrowser/1.0 SmartTV Safari/531.2+'
103
+ SURFACE: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch)'
104
+ TABLOID: 'Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13'
105
+ TINEYE: 'TinEye-bot/0.51 (see http://www.tineye.com/crawler.html)'
106
+ WINDOWS7: 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) chromeframe/10.0.648.205'
107
+ WINDOWS81: 'Mozilla/5.0 (IE 11.0; Windows NT 6.3; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko'
108
+ WINDOWS8: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)'
109
+ WINDOWS_MOBILE: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 6.12)'
110
+ WINDOWS_PHONE8: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920)'
111
+ WINDOWS_PHONE: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0; DELL; Venue Pro)'
112
+ WINDOWS_PHONE_81: 'Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 929) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537'
113
+ WINDOWS_VISTA: 'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)'
114
+ WINDOWS_WOW64: "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko"
115
+ WINDOWS_XP: 'Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; FDM; .NET CLR 1.1.4322)'
116
+ XBOX360: 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; Xbox), or Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Xbox)'
117
+ XBOXONE: 'Mozilla/5.0 (Compatible; MSIE 10.0; Windows NT 6.2; Trident /6.0; Xbox; Xbox One)'
118
+ XOOM: 'Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13'
119
+ YAHOO_SLURP: 'Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)'
120
+ YANDEX_BROWSER: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 YaBrowser/15.4.2272.3909 (beta) Yowser/2.0 Safari/537.36'
121
+ YANDEX_DIRECT: 'Mozilla/5.0 (compatible; YandexDirect/3.0; +http://yandex.com/bots)'
122
+ YANDEX_METRIKA: 'Mozilla/5.0 (compatible; YandexMetrika/3.0; +http://yandex.com/bots)'
@@ -0,0 +1,13 @@
1
+ require "test_helper"
2
+
3
+ class AdobeAirTest < Minitest::Test
4
+ test "detects adobe air" do
5
+ @browser = Browser.new ua: $ua["ADOBE_AIR"]
6
+
7
+ assert @browser.adobe_air?
8
+ assert @browser.webkit?
9
+ assert_equal @browser.version, "13"
10
+ assert_equal @browser.full_version, "13.0"
11
+ assert_equal @browser.name, "Other"
12
+ end
13
+ end
@@ -0,0 +1,93 @@
1
+ require "test_helper"
2
+
3
+ class AndroidTest < Minitest::Test
4
+ test "detect android cupcake (1.5)" do
5
+ @browser = Browser.new ua: $ua['ANDROID_CUPCAKE']
6
+ assert @browser.android?
7
+ assert @browser.android?(1.5)
8
+ end
9
+
10
+ test "detect android donut (1.6)" do
11
+ @browser = Browser.new ua: $ua['ANDROID_DONUT']
12
+ assert @browser.android?
13
+ assert @browser.android?(1.6)
14
+ end
15
+
16
+ test "detect android eclair (2.1)" do
17
+ @browser = Browser.new ua: $ua['ANDROID_ECLAIR_21']
18
+ assert @browser.android?
19
+ assert @browser.android?(2.1)
20
+ end
21
+
22
+ test "detect android froyo (2.2)" do
23
+ @browser = Browser.new ua: $ua['ANDROID_FROYO']
24
+ assert @browser.android?
25
+ assert @browser.android?(2.2)
26
+ end
27
+
28
+ test "detect android gingerbread (2.3)" do
29
+ @browser = Browser.new ua: $ua['ANDROID_GINGERBREAD']
30
+ assert @browser.android?
31
+ assert @browser.android?(2.3)
32
+ end
33
+
34
+ test "detect android honeycomb (3.0)" do
35
+ @browser = Browser.new ua: $ua['ANDROID_HONEYCOMB_30']
36
+ assert @browser.android?
37
+ assert @browser.android?(3.0)
38
+ end
39
+
40
+ test "detect android ice cream sandwich (4.0)" do
41
+ @browser = Browser.new ua: $ua['ANDROID_ICECREAM']
42
+ assert @browser.android?
43
+ assert @browser.android?(4.0)
44
+ end
45
+
46
+ test "detect android jellybean (4.1)" do
47
+ @browser = Browser.new ua: $ua['ANDROID_JELLYBEAN_41']
48
+ assert @browser.android?
49
+ assert @browser.android?(4.1)
50
+ end
51
+
52
+ test "detect android jellybean (4.2)" do
53
+ @browser = Browser.new ua: $ua['ANDROID_JELLYBEAN_42']
54
+ assert @browser.android?
55
+ assert @browser.android?(4.2)
56
+ end
57
+
58
+ test "detect android jellybean (4.3)" do
59
+ @browser = Browser.new ua: $ua['ANDROID_JELLYBEAN_43']
60
+ assert @browser.android?
61
+ assert @browser.android?(4.3)
62
+ end
63
+
64
+ test "detect android kitkat (4.4)" do
65
+ @browser = Browser.new ua: $ua['ANDROID_KITKAT']
66
+ assert @browser.android?
67
+ assert @browser.android?(4.4)
68
+ end
69
+
70
+ test "detect android lollipop (5.0)" do
71
+ @browser = Browser.new ua: $ua['ANDROID_LOLLIPOP_50']
72
+ assert @browser.android?
73
+ assert @browser.android?(5.0)
74
+ end
75
+
76
+ test "detect android lollipop (5.1)" do
77
+ @browser = Browser.new ua: $ua['ANDROID_LOLLIPOP_51']
78
+ assert @browser.android?
79
+ assert @browser.android?(5.1)
80
+ end
81
+
82
+ test "detect android tv" do
83
+ @browser = Browser.new ua: $ua['ANDROID_TV']
84
+ assert @browser.android?
85
+ assert @browser.tv?
86
+ end
87
+
88
+ test "detect nexus player" do
89
+ @browser = Browser.new ua: $ua['ANDROID_NEXUS_PLAYER']
90
+ assert @browser.android?
91
+ assert @browser.tv?
92
+ end
93
+ end