browser 1.0.1 → 1.1.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.
- checksums.yaml +4 -4
- data/README.md +12 -4
- data/Rakefile +1 -1
- data/bots.yml +79 -22
- data/browser.gemspec +5 -0
- data/languages.yml +0 -1
- data/lib/browser.rb +37 -7
- data/lib/browser/meta/proxy.rb +9 -0
- data/lib/browser/methods/blackberry.rb +51 -0
- data/lib/browser/methods/ie.rb +14 -8
- data/lib/browser/methods/mobile.rb +5 -5
- data/lib/browser/methods/platform.rb +39 -33
- data/lib/browser/methods/proxy.rb +8 -0
- data/lib/browser/methods/tv.rb +1 -1
- data/lib/browser/version.rb +2 -2
- data/test/browser_test.rb +248 -0
- data/test/{middleware_spec.rb → middleware_test.rb} +8 -8
- data/test/sample_app.rb +3 -3
- data/test/test_helper.rb +20 -0
- data/test/ua.yml +35 -10
- data/test/unit/adobe_air_test.rb +17 -0
- data/test/unit/android_test.rb +97 -0
- data/test/unit/blackberry_test.rb +106 -0
- data/test/unit/bots_test.rb +121 -0
- data/test/unit/chrome_test.rb +60 -0
- data/test/unit/console_test.rb +71 -0
- data/test/unit/firefox_test.rb +41 -0
- data/test/unit/ie_test.rb +379 -0
- data/test/unit/ios_app_test.rb +17 -0
- data/test/unit/ios_test.rb +143 -0
- data/test/unit/kindle_test.rb +41 -0
- data/test/unit/nokia_test.rb +13 -0
- data/test/unit/opera_test.rb +46 -0
- data/test/unit/proxy_test.rb +18 -0
- data/test/unit/uc_browser_test.rb +13 -0
- data/test/unit/windows_phone_test.rb +54 -0
- data/test/unit/windows_test.rb +64 -0
- metadata +77 -9
- data/test/browser_spec.rb +0 -1141
- data/test/spec_helper.rb +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 75600634f8811452d7529a87b2ec72a2db30bc06
|
4
|
+
data.tar.gz: ce2d4b9e533326ec90643ab3d5dc72bb3b9ad07c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ea36b6d309a509c4958fe71c5a2f4f737a6f492cfcfa8cc7ddd5a646bdb319c2866f7dac0cce50ce498e4ff92408c4220d03424e190edfff35ce2b1d10917e51
|
7
|
+
data.tar.gz: 7a76ff7c859256f547cdb19733fa59d71ad8a49d9cfa615f0906d4845a9b996bbe44156399aa3747b5ddbc159581c99155f5778982aaaf5b33b1b4b8807278fe
|
data/README.md
CHANGED
@@ -23,6 +23,8 @@ browser.name # readable browser name
|
|
23
23
|
browser.version # major version number
|
24
24
|
browser.full_version
|
25
25
|
browser.safari?
|
26
|
+
browser.ios?
|
27
|
+
browser.app? # request performed by ios' app webview
|
26
28
|
browser.opera?
|
27
29
|
browser.chrome?
|
28
30
|
browser.chrome_os?
|
@@ -31,27 +33,32 @@ browser.tablet?
|
|
31
33
|
browser.console?
|
32
34
|
browser.firefox?
|
33
35
|
browser.ie?
|
34
|
-
browser.
|
36
|
+
browser.ie?(6) # detect specific IE version
|
35
37
|
browser.edge? # Newest MS browser
|
36
38
|
browser.modern? # Webkit, Firefox 17+, IE 9+ and Opera 12+
|
37
39
|
browser.platform # return :mac, :windows, :linux or :other
|
40
|
+
browser.ios? # detect iOS
|
41
|
+
browser.ios?(9) # detect specific iOS version
|
38
42
|
browser.mac?
|
39
43
|
browser.windows?
|
40
44
|
browser.windows_x64?
|
41
45
|
browser.linux?
|
42
46
|
browser.blackberry?
|
47
|
+
browser.blackberry?(10) # detect specific BlackBerry version
|
43
48
|
browser.bot?
|
44
49
|
browser.search_engine?
|
45
50
|
browser.phantom_js?
|
46
51
|
browser.quicktime?
|
47
52
|
browser.core_media?
|
48
53
|
browser.silk?
|
54
|
+
browser.android?
|
55
|
+
browser.android?(4.2) # detect Android Jelly Bean 4.2
|
49
56
|
browser.known? # has the browser been successfully detected?
|
50
57
|
browser.meta # an array with several attributes
|
51
58
|
browser.to_s # the meta info joined by space
|
52
59
|
```
|
53
60
|
|
54
|
-
See the [tests](https://github.com/fnando/browser/blob/master/test/
|
61
|
+
See the [tests](https://github.com/fnando/browser/blob/master/test/browser_test.rb) and [implementation](https://github.com/fnando/browser/blob/master/lib/browser.rb) for more examples.
|
55
62
|
|
56
63
|
### What defines a modern browser?
|
57
64
|
|
@@ -59,6 +66,7 @@ The current rules that define a modern browser are pretty loose:
|
|
59
66
|
|
60
67
|
* Webkit
|
61
68
|
* IE9+
|
69
|
+
* Microsoft Edge
|
62
70
|
* Firefox 17+
|
63
71
|
* Firefox Tablet 14+
|
64
72
|
* Opera 12+
|
@@ -68,7 +76,7 @@ You can define your own rules. A rule must be a proc/lambda or any object that i
|
|
68
76
|
```ruby
|
69
77
|
# Only Chrome Canary is considered modern.
|
70
78
|
Browser.modern_rules.clear
|
71
|
-
Browser.modern_rules << -> b { b.chrome? && b.version >=
|
79
|
+
Browser.modern_rules << -> b { b.chrome? && b.version.to_i >= 37 }
|
72
80
|
```
|
73
81
|
|
74
82
|
### Rails integration
|
@@ -82,7 +90,7 @@ gem "browser"
|
|
82
90
|
This adds a helper method called `browser`, that inspects your current user agent.
|
83
91
|
|
84
92
|
```erb
|
85
|
-
<% if browser.
|
93
|
+
<% if browser.ie?(6) %>
|
86
94
|
<p class="disclaimer">You're running an older IE version. Please update it!</p>
|
87
95
|
<% end %>
|
88
96
|
```
|
data/Rakefile
CHANGED
data/bots.yml
CHANGED
@@ -1,39 +1,57 @@
|
|
1
|
+
200PleaseBot: "200PleaseBot (200please.com/bot)"
|
1
2
|
360Spider: "360Spider"
|
3
|
+
abot: "CrawlDaddy, abot (code.google.com/p/abot)"
|
2
4
|
AddThis: "AddThis"
|
3
5
|
ADmantX: "ADmantX Platform Semantic Analyzer"
|
4
6
|
AdsBot-Google: "Google Adwords"
|
7
|
+
AdvBot: "AdvBot (advbot.net/bot.htmlm, advbot.org/bot.html)"
|
5
8
|
AhrefsBot: "Ahrefs backlinks research tool"
|
6
9
|
alexa: "Alexa Crawler"
|
7
10
|
Apache-HttpClient: "Java http library"
|
8
11
|
ApacheBench: "ApacheBench (ab)"
|
9
12
|
AppEngine-Google: "Google App Engine"
|
10
13
|
Applebot: "Apple Bot"
|
14
|
+
archive.org_bot: "Internet Archive (archive.org)"
|
11
15
|
Ask Jeeves: "Ask Jeeves"
|
12
16
|
AsyncHttpClient: "Java http and WebSocket client library"
|
13
17
|
awe.sm: "Awe.sm URL expander"
|
14
18
|
Baidu: "baidu"
|
15
19
|
Baiduspider: "Chinese search engine"
|
20
|
+
BDCbot: "Big Data Corp (ecommerce.bigdatacorp.com.br/faq.aspx)"
|
16
21
|
bingbot: "Microsoft bing bot"
|
17
22
|
bitlybot: "bit.ly bot"
|
23
|
+
Blekkobot: "Blekkobot (blekko.com/about/blekkobot)"
|
18
24
|
BLEXBot: "webmeup-crawler.com"
|
19
25
|
bot@linkfluence.net: "Linkfluence bot"
|
26
|
+
BufferBot: "BufferBot"
|
20
27
|
BuiBui-CheckBot: "email: buibui[at]dadapro[dot]com"
|
21
28
|
Butterfly: "Topsy Labs"
|
22
29
|
buzztalk: "buzztalk"
|
30
|
+
CatchBot: "CatchBot (catchbot.com)"
|
23
31
|
check_http: "Nagios monitor"
|
32
|
+
Cliqzbot: "Cliqzbot (cliqz.com/company/cliqzbot)"
|
24
33
|
CMRadar/0.1: "CMRadar/0.1"
|
25
34
|
ColdFusion: "ColdFusion http library"
|
35
|
+
Comodo-Webinspector-Crawler: "Comodo (comodorobot.com)"
|
26
36
|
Crowsnest: "Crowsnest"
|
27
|
-
|
37
|
+
curabot: "cura.yt"
|
28
38
|
curl: "curl unix CLI http client"
|
29
39
|
DAP/NetHTTP: "DAP/NetHTTP"
|
40
|
+
datagnionbot: "datagnion.com/bot.html"
|
41
|
+
Daumoa: "Korean portal and search engine indexing bot"
|
30
42
|
developers.google.com/+/web/snippet/: "Google Plus"
|
43
|
+
diffbot: "Diffbot (diffbot.com)"
|
31
44
|
DigitalPersona Fingerprint Software: "HP Fingerprint scanner"
|
45
|
+
Domain Re-Animator Bot: "Domain Re-Animator Bot (http://domainreanimator.com) - support@domainreanimator.com"
|
46
|
+
domainsbot: "DomainsBot (domainsbot.com)"
|
47
|
+
DomainTunoCrawler: "DomainTuno (domaintuno.com/robot)"
|
32
48
|
DotBot: "Dot Bot"
|
33
49
|
DuckDuckBot: "Duck Duck Go"
|
50
|
+
DuckDuckGo: "Duck Duck Go"
|
34
51
|
Embedly: "Embedly"
|
35
52
|
EOAAgent: "EOAAgent"
|
36
53
|
EventMachine HttpClient: "Ruby http library"
|
54
|
+
EveryoneSocialBot: "EveryoneSocial (everyonesocial.com)"
|
37
55
|
EvriNid: "Evri bot"
|
38
56
|
Exabot: "Exalead's bot"
|
39
57
|
ExaleadCloudView: "ExaleadCloudView"
|
@@ -41,41 +59,50 @@ facebookexternalhit: "Facebook Bot"
|
|
41
59
|
Facebot: "Facebook Bot"
|
42
60
|
FeedBurner: "RSS bot"
|
43
61
|
Feedfetcher-Google: "Google Feedfetcher"
|
62
|
+
Findxbot: "Findxbot (http://www.findxbot.com)"
|
44
63
|
FlipboardProxy: "FlipboardProxy"
|
64
|
+
FriendFeedBot: "FriendFeed (friendfeed.com/about/bot)"
|
45
65
|
Genieo: "Genieo Web filter bot"
|
46
66
|
getprismatic.com: "getprismatic.com"
|
47
67
|
Gigabot: "Gigabot spider"
|
68
|
+
Gimme60bot: "Gimme60 (gimme60.com)"
|
69
|
+
gimme60bot: "Gimme60 (gimme60.com)"
|
70
|
+
GimmeUSAbot: "Gimme60 (gimme60.com)"
|
48
71
|
Go http package: "Go http library"
|
49
|
-
Google Web Preview: "Google Instant Previews crawler"
|
50
72
|
Google Page Speed Insights: "Google Page Speed Insights"
|
73
|
+
Google Web Preview: "Google Instant Previews crawler"
|
51
74
|
Googlebot: "Google spider"
|
75
|
+
GrapeshotCrawler: "Mozilla/5.0 (compatible; GrapeshotCrawler/2.0; +http://www.grapeshot.co.uk/crawler.php)"
|
76
|
+
Gravitybot: "Gravitybot (gravity.com)"
|
52
77
|
Hatena::Bookmark: "Hatena::Bookmark"
|
53
78
|
heritrix: "heritrix"
|
54
79
|
HTMLParser: "HTMLParser"
|
80
|
+
HTTP_Request2: "HTTP_Request2"
|
55
81
|
HTTPClient: "HTTPClient"
|
56
82
|
https://developers.google.com/+/web/snippet: "Google+ Snippet Fetcher"
|
57
|
-
|
58
|
-
|
59
|
-
ia_archiver(OS-Wayback): "ia_archiver(OS-Wayback)"
|
83
|
+
HubSpot: "HubSpot"
|
84
|
+
ia_archiver: "Internet Archive (WayBackMachine)"
|
60
85
|
iCoreService: "iCoreService"
|
86
|
+
idmarch: "idmarch.org/bot.html"
|
61
87
|
InAGist: "URL resolver"
|
62
|
-
Insieve
|
63
|
-
InsieveBot: "InsieveBot"
|
64
|
-
Instapaper: "Instapaper"
|
88
|
+
Insieve: "Insieve Bot"
|
65
89
|
Insitesbot: "Insitesbot"
|
90
|
+
Instapaper: "Instapaper"
|
66
91
|
IstellaBot: "IstellaBot"
|
67
92
|
jack: "jack"
|
68
|
-
Jakarta Commons-HttpClient: "Jakarta Commons-HttpClient"
|
69
93
|
Jakarta Commons: "Jakarta Commons HttpClient"
|
70
94
|
Java: "Generic Java http library"
|
71
95
|
Jetslide: "Jetslide"
|
72
96
|
JS-Kit: "URL resolver"
|
73
|
-
|
74
|
-
Kimengi: "nineconnections.com bot"
|
97
|
+
Kemvibot: "Kemvi (kemvi.com)"
|
98
|
+
Kimengi: "Kimengi/nineconnections.com bot"
|
75
99
|
knows.is: "knows.is"
|
100
|
+
Kojitsubot: "Kojitsubot"
|
101
|
+
KomodiaBot: "KomodiaBot"
|
76
102
|
kraken: "kraken"
|
77
103
|
Laconica: "Laconica"
|
78
104
|
libwww-perl: "Perl client-server library loved by script kids"
|
105
|
+
Lijit Crawler: "Lijit (lijit.com/robot/crawler)"
|
79
106
|
linkdexbot: "Linkdex Bot"
|
80
107
|
LinkedInBot: "LinkedIn"
|
81
108
|
LinksCrawler: "LinksCrawler"
|
@@ -88,62 +115,84 @@ Lumibot: "Lumibot"
|
|
88
115
|
lwp-trivial: "Another Perl library loved by script kids"
|
89
116
|
magpie-crawler: "magpie-crawler"
|
90
117
|
Mail.RU_Bot: "Mail.ru Bot"
|
118
|
+
meanpathbot: "meanpath (meanpath.com)"
|
91
119
|
Mediapartners-Google: "Google Adsense bot"
|
92
120
|
MegaIndex.ru: "Mozilla/5.0 (compatible; MegaIndex.ru/2.0; +https://www.megaindex.ru/?tab=linkAnalyze)"
|
121
|
+
memoryBot: "mignify.com/bot.html"
|
122
|
+
memorybot: "mignify.com/bot.html"
|
93
123
|
MetaURI: "MetaURI"
|
94
|
-
MetaURI: "URI meta information extractor bot"
|
95
124
|
MFE_expand: "Mcafee spider"
|
125
|
+
MIR web crawler: "MIR web crawler (mirproject15@gmail.com)"
|
96
126
|
MJ12bot: "Majestic-12 spider"
|
97
127
|
MojeekBot: "Mojeek UK search crawler"
|
128
|
+
MS Search 6.0 Robot: "MS Search 6.0 Robot"
|
98
129
|
msnbot: "Microsoft bot"
|
130
|
+
NerdyBot: "NerdyBot"
|
99
131
|
netState: "netEstate NE Crawler"
|
100
132
|
Netvibes: "Personalized dashboard bot"
|
133
|
+
NetzCheckBot: "bot@netzcheck.com"
|
101
134
|
NewRelicPinger: "NewRelic monitor"
|
102
|
-
newsme: "Link analyzer"
|
103
135
|
newsme: "newsme"
|
136
|
+
niki-bot: "niki-bot"
|
104
137
|
NING: "NING - Yet Another Twitter Swarmer"
|
105
138
|
Nutch: "Apache search spider"
|
139
|
+
OpenHoseBot: "OpenHoseBot (http://www.openhose.org/bot.html)"
|
140
|
+
OrangeBot: "OrangeBot (support.orangebot@orange.com)"
|
141
|
+
PagesInventory: "pagesinventory.com"
|
106
142
|
Panopta: "Monitoring service"
|
107
|
-
PaperLiBot: "PaperLi content curation service"
|
108
143
|
PaperLiBot: "PaperLi is another content curation service"
|
109
144
|
peerindex: "peerindex"
|
110
145
|
PercolateCrawler: "PercolateCrawler"
|
146
|
+
PerfectMarketKWTbot: "PerfectMarket (perfectmarket.com)"
|
111
147
|
PhantomJS: "PhantomJS"
|
112
148
|
Pingdom: "Pingdom monitoring"
|
113
149
|
Pinterest: "Pinterest"
|
150
|
+
Plukkie: "botje.com/plukkie.htm"
|
151
|
+
psbot-page: "picsearch.com/bot.html"
|
114
152
|
publiclibraryarchive.org: "publiclibraryarchive.org"
|
115
153
|
PycURL: "Python http library"
|
116
154
|
Python-httplib2: "Python-httplib2"
|
117
155
|
python-requests: "Python http library"
|
118
|
-
python-requests: "python-requests"
|
119
156
|
Python-urllib: "Python http library"
|
120
157
|
QuerySeeker: "QuerySeekerSpider ( http://queryseeker.com/bot.html )"
|
121
158
|
QuickLook: "QuickLook"
|
159
|
+
Re-Animator: "Domain Re-Animator Bot (http://domainreanimator.com)"
|
122
160
|
Readability: "Readability"
|
123
161
|
RebelMouse: "RebelMouse"
|
124
162
|
redditbot: "Reddit Bot"
|
125
163
|
RelateIQ: "RelateIQ"
|
126
164
|
Riddler: "Riddler Bot"
|
127
165
|
rogerbot: "SeoMoz spider"
|
128
|
-
|
166
|
+
RSSMicro: "RSS/Atom Feed Robot (rssmicro.com)"
|
129
167
|
Ruby: "Ruby"
|
130
168
|
Scrapy: "Scrapy"
|
169
|
+
Screaming Frog SEO Spider: Screaming Frog SEO Spider
|
170
|
+
SearchmetricsBot: "SearchmetricsBot"
|
131
171
|
SemrushBot: "SEO analysis bot"
|
172
|
+
SEOkicks-Robot: "SEOKicks (seokicks.de/robot.html)"
|
132
173
|
SeznamBot: "SeznamBot"
|
133
174
|
ShopWiki: "ShopWiki"
|
134
175
|
ShortLinkTranslate: "Link shortener"
|
135
176
|
ShowyouBot: "Showyou iOS app spider"
|
136
177
|
Siege: "Joe Dog Siege"
|
178
|
+
SISTRIX: "Mozilla/5.0 (compatible; SISTRIX Crawler; http://crawler.sistrix.net/)"
|
137
179
|
SiteUptime: "Site monitoring services"
|
138
180
|
Slack: "Slackbot-LinkExpanding"
|
181
|
+
Slackbot: "api.slack.com/robots"
|
139
182
|
Slurp: "Yahoo spider"
|
183
|
+
SMTBot: "SimilarTech (http://www.similartech.com/smtbot)"
|
140
184
|
Sogou: "Chinese search engine"
|
185
|
+
spbot: "OpenLinkProfiler (http://openlinkprofiler.org/bot)"
|
141
186
|
spider: "generic web spider"
|
142
187
|
Spinn3r: "Spinn3r aggregator"
|
188
|
+
SputnikBot: "SputnikBot (http://corp.sputnik.ru/webmaster)"
|
143
189
|
StatusCake: "StatusCake"
|
190
|
+
StructuredDataTestingTool: 'Google-StructuredDataTestingTool'
|
144
191
|
Test Certificate Info: "C http library?"
|
192
|
+
TinEye: "TinEye-bot/0.51 (see http://www.tineye.com/crawler.html)"
|
145
193
|
trendictionbot: "trendiction search"
|
146
194
|
TurnitinBot: "TurnitinBot"
|
195
|
+
tweetedtimes: "The Tweeted Times"
|
147
196
|
TweetmemeBot: "TweetMeMe Crawler"
|
148
197
|
Twikle: "Social web search bot"
|
149
198
|
TwitJobSearch: "TwitJobSearch"
|
@@ -151,23 +200,31 @@ Twitmunin: "Twitmunin"
|
|
151
200
|
Twitterbot: "Twitter URL expander"
|
152
201
|
Twurly: "Twurly"
|
153
202
|
Typhoeus: "Typhoeus"
|
154
|
-
|
155
|
-
|
203
|
+
uMBot: "uberMetrics"
|
204
|
+
UnwindFetch: "Gnip"
|
205
|
+
UptimeRobot: "Uptime Robot"
|
156
206
|
Vagabondo: "Vagabondo"
|
157
207
|
VB Project: "Visual Basic"
|
208
|
+
Vigil: "Vigil (vigil-app.com/bot.html)"
|
158
209
|
vkShare: "VKontake Sharer"
|
159
210
|
VoilaBot: "VoilaBot"
|
211
|
+
VRCrawler: "ventureradar.com/crawler"
|
212
|
+
WASALive-Bot: "blog.wasalive.com/wasalive-bots"
|
213
|
+
WBSearchBot: "Ware Bay Best Buys (http://www.warebay.com/bot.html)"
|
160
214
|
Webscout: "Webscout"
|
215
|
+
WeSEE: "WeSEE (www.wesee.com/bot)"
|
161
216
|
Wget: "wget unix CLI http client"
|
217
|
+
wget: "wget unix CLI http client"
|
162
218
|
WordPress: "WordPress spider"
|
163
219
|
Wormly: "WormlyBot"
|
220
|
+
Wotbox: "Wotbox (http://www.wotbox.com/bot)"
|
164
221
|
Xenu Link Sleuth: "Xenu Link Sleuth"
|
165
222
|
XoviBot: "XoviBot"
|
166
|
-
|
167
|
-
|
168
|
-
|
223
|
+
yacybot: "YaCy (yacy.net)"
|
224
|
+
Yandex: "Yandex, Yandex Direct, Yandex Metrika, Yandex News (yandex.com)"
|
225
|
+
Yeti: "Naver Corp (help.naver.com/robots)"
|
169
226
|
YOURLS: "YOURLS"
|
170
227
|
zelist.ro: "feed parser"
|
171
228
|
ZIBB: "ZIBB spider"
|
229
|
+
zitebot: "Zite"
|
172
230
|
ZyBorg: "Zyborg? Hmmm...."
|
173
|
-
StructuredDataTestingTool: 'Google-StructuredDataTestingTool'
|
data/browser.gemspec
CHANGED
@@ -26,6 +26,9 @@ Gem::Specification.new do |s|
|
|
26
26
|
"# If this is important for you, please read #" ,
|
27
27
|
"# https://github.com/fnando/browser#internet-explorer #" ,
|
28
28
|
"# #" ,
|
29
|
+
"# iOS webviews and web apps aren't detect as Safari #" ,
|
30
|
+
"# anymore, so be aware of that if that's your case. #" ,
|
31
|
+
"# #" ,
|
29
32
|
"###########################################################" ,
|
30
33
|
"\n"
|
31
34
|
].join("\n")
|
@@ -36,4 +39,6 @@ Gem::Specification.new do |s|
|
|
36
39
|
s.add_development_dependency "rack-test"
|
37
40
|
s.add_development_dependency "minitest"
|
38
41
|
s.add_development_dependency "minitest-utils"
|
42
|
+
s.add_development_dependency "pry-meta"
|
43
|
+
s.add_development_dependency "minitest-autotest"
|
39
44
|
end
|
data/languages.yml
CHANGED
data/lib/browser.rb
CHANGED
@@ -7,6 +7,7 @@ require "browser/middleware/context"
|
|
7
7
|
require "browser/rails" if defined?(::Rails)
|
8
8
|
|
9
9
|
require "browser/methods/ie"
|
10
|
+
require "browser/methods/blackberry"
|
10
11
|
require "browser/methods/platform"
|
11
12
|
require "browser/methods/mobile"
|
12
13
|
require "browser/methods/devices"
|
@@ -14,6 +15,7 @@ require "browser/methods/consoles"
|
|
14
15
|
require "browser/methods/language"
|
15
16
|
require "browser/methods/bots"
|
16
17
|
require "browser/methods/tv"
|
18
|
+
require "browser/methods/proxy"
|
17
19
|
|
18
20
|
require "browser/meta/base"
|
19
21
|
require "browser/meta/generic_browser"
|
@@ -23,11 +25,13 @@ require "browser/meta/ios"
|
|
23
25
|
require "browser/meta/mobile"
|
24
26
|
require "browser/meta/modern"
|
25
27
|
require "browser/meta/platform"
|
28
|
+
require "browser/meta/proxy"
|
26
29
|
require "browser/meta/safari"
|
27
30
|
require "browser/meta/webkit"
|
28
31
|
|
29
32
|
class Browser
|
30
33
|
include IE
|
34
|
+
include BlackBerry
|
31
35
|
include Platform
|
32
36
|
include Mobile
|
33
37
|
include Devices
|
@@ -35,6 +39,7 @@ class Browser
|
|
35
39
|
include Language
|
36
40
|
include Bots
|
37
41
|
include Tv
|
42
|
+
include Proxy
|
38
43
|
|
39
44
|
# Set browser's UA string.
|
40
45
|
attr_accessor :user_agent
|
@@ -46,12 +51,14 @@ class Browser
|
|
46
51
|
ie: "Internet Explorer", # Must come before android
|
47
52
|
chrome: "Chrome", # Must come before android
|
48
53
|
firefox: "Firefox", # Must come before android
|
54
|
+
uc_browser: "UC Browser", # Must come before android
|
49
55
|
android: "Android",
|
56
|
+
blackberry_running_safari: "Safari",
|
50
57
|
blackberry: "BlackBerry",
|
51
58
|
core_media: "Apple CoreMedia",
|
52
|
-
ipad: "iPad",
|
53
|
-
iphone: "iPhone",
|
54
|
-
ipod: "iPod Touch",
|
59
|
+
ipad: "iPad", # Must come before safari
|
60
|
+
iphone: "iPhone", # Must come before safari
|
61
|
+
ipod: "iPod Touch", # Must come before safari
|
55
62
|
nintendo: "Nintendo",
|
56
63
|
opera: "Opera",
|
57
64
|
phantom_js: "PhantomJS",
|
@@ -60,6 +67,7 @@ class Browser
|
|
60
67
|
quicktime: "QuickTime",
|
61
68
|
safari: "Safari",
|
62
69
|
xbox: "Xbox",
|
70
|
+
nokia: "Nokia S40 Ovi Browser",
|
63
71
|
|
64
72
|
# This must be last item, since Ruby 1.9+ has ordered keys.
|
65
73
|
other: "Other",
|
@@ -119,7 +127,7 @@ class Browser
|
|
119
127
|
# Get the browser identifier.
|
120
128
|
def id
|
121
129
|
NAMES.keys
|
122
|
-
.find {|id| respond_to?("#{id}?") ?
|
130
|
+
.find {|id| respond_to?("#{id}?", true) ? send("#{id}?") : id }
|
123
131
|
end
|
124
132
|
|
125
133
|
# Return major version.
|
@@ -168,11 +176,11 @@ class Browser
|
|
168
176
|
|
169
177
|
# Detect if browser is Safari.
|
170
178
|
def safari?
|
171
|
-
(ua =~ /Safari/
|
179
|
+
!!((ua =~ /Safari/) && ua !~ /Android|Chrome|CriOS|PhantomJS/)
|
172
180
|
end
|
173
181
|
|
174
182
|
def safari_webapp_mode?
|
175
|
-
(ipad? || iphone?) && ua =~ /AppleWebKit/
|
183
|
+
!!((ipad? || iphone?) && ua =~ /AppleWebKit/)
|
176
184
|
end
|
177
185
|
|
178
186
|
# Detect if browser is Firefox.
|
@@ -182,7 +190,7 @@ class Browser
|
|
182
190
|
|
183
191
|
# Detect if browser is Chrome.
|
184
192
|
def chrome?
|
185
|
-
ua =~ /Chrome|CriOS/ && !opera? && !edge?
|
193
|
+
!!(ua =~ /Chrome|CriOS/ && !opera? && !edge?)
|
186
194
|
end
|
187
195
|
|
188
196
|
# Detect if browser is Opera.
|
@@ -195,6 +203,16 @@ class Browser
|
|
195
203
|
!!(ua =~ /Silk/)
|
196
204
|
end
|
197
205
|
|
206
|
+
# Detect if browser is Yandex.
|
207
|
+
def yandex?
|
208
|
+
!!(ua =~ /YaBrowser/)
|
209
|
+
end
|
210
|
+
|
211
|
+
# Detect if browser is UCBrowser.
|
212
|
+
def uc_browser?
|
213
|
+
!!(ua =~ /UCBrowser/)
|
214
|
+
end
|
215
|
+
|
198
216
|
def known?
|
199
217
|
id != :other
|
200
218
|
end
|
@@ -213,4 +231,16 @@ class Browser
|
|
213
231
|
def to_s
|
214
232
|
meta.to_a.join(" ")
|
215
233
|
end
|
234
|
+
|
235
|
+
private
|
236
|
+
|
237
|
+
def detect_version?(actual_version, expected_version)
|
238
|
+
return true unless expected_version
|
239
|
+
actual_version.to_s.start_with?(expected_version.to_s)
|
240
|
+
end
|
241
|
+
|
242
|
+
def deprecate(message)
|
243
|
+
offender = caller[1].to_s[/^(.*?\.rb:\d+).*?$/, 1]
|
244
|
+
$stderr << "\n#{message} (called from #{offender})\n"
|
245
|
+
end
|
216
246
|
end
|